XBMC Metadata base
This commit is contained in:
@@ -68,6 +68,18 @@ config = [{
|
||||
'label': 'Url Base',
|
||||
'description': 'When using mod_proxy use this to append the url with this.',
|
||||
},
|
||||
{
|
||||
'name': 'permission_folder',
|
||||
'default': 0755,
|
||||
'label': 'Folder CHMOD',
|
||||
'description': 'Permission for creating/copying folders',
|
||||
},
|
||||
{
|
||||
'name': 'permission_file',
|
||||
'default': 0755,
|
||||
'label': 'File CHMOD',
|
||||
'description': 'Permission for creating/copying files',
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
|
||||
@@ -1,15 +1,20 @@
|
||||
from couchpotato import addView
|
||||
from couchpotato.core.event import fireEvent
|
||||
from couchpotato.core.helpers.variable import getExt
|
||||
from couchpotato.core.logger import CPLog
|
||||
from couchpotato.environment import Env
|
||||
from flask.helpers import send_from_directory
|
||||
import glob
|
||||
import os.path
|
||||
import re
|
||||
|
||||
log = CPLog(__name__)
|
||||
|
||||
|
||||
class Plugin(object):
|
||||
|
||||
enabled_option = 'enabled'
|
||||
|
||||
def conf(self, attr, default = None):
|
||||
return Env.setting(attr, self.getName().lower(), default = default)
|
||||
|
||||
@@ -36,8 +41,26 @@ class Plugin(object):
|
||||
dir = os.path.join(self.plugin_path, 'static')
|
||||
return send_from_directory(dir, file)
|
||||
|
||||
def createFile(self, path, content):
|
||||
|
||||
self.makeDir(os.path.dirname(path))
|
||||
|
||||
try:
|
||||
file = open(path, 'w')
|
||||
file.write(content)
|
||||
file.close()
|
||||
except Exception, e:
|
||||
log.error('Unable writing to file "%s": %s' % (path, e))
|
||||
|
||||
def makeDir(self, path):
|
||||
try:
|
||||
if not os.path.isdir(path):
|
||||
os.makedirs(path, Env.getPermission('folder'))
|
||||
except Exception, e:
|
||||
log.error('Unable to create folder "%s": %s' % (path, e))
|
||||
|
||||
def isDisabled(self):
|
||||
return not self.isEnabled()
|
||||
|
||||
def isEnabled(self):
|
||||
return self.conf('enabled') or self.conf('enabled') == None
|
||||
return self.conf(self.enabled_option) or self.conf(self.enabled_option) == None
|
||||
|
||||
@@ -12,11 +12,9 @@ class MetaData(Plugin):
|
||||
|
||||
self.registerStatic(__file__)
|
||||
|
||||
def test():
|
||||
fireEvent('metadata.create')
|
||||
|
||||
addEvent('app.load', test)
|
||||
addEvent('app.load', self.add)
|
||||
|
||||
def add(self, data = {}):
|
||||
log.info('Getting meta data')
|
||||
|
||||
fireEvent('metadata.create', data)
|
||||
|
||||
@@ -105,6 +105,7 @@ class Renamer(Plugin):
|
||||
|
||||
# Original filename
|
||||
replacements['original'] = os.path.basename(file)
|
||||
replacements['original_folder'] = os.path.basename(os.path.dirname(file))
|
||||
|
||||
# Extension
|
||||
replacements['ext'] = getExt(file)
|
||||
@@ -122,7 +123,7 @@ class Renamer(Plugin):
|
||||
if file_type is 'trailer':
|
||||
final_file_name = self.doReplace(trailer_name, replacements)
|
||||
elif file_type is 'nfo':
|
||||
final_file_name = self.doReplace(nfo_name, replacements)
|
||||
final_file_name = self.doReplace(nfo_name, replacements) + '-orig'
|
||||
elif file_type is 'backdrop':
|
||||
final_file_name = self.doReplace(backdrop_name, replacements)
|
||||
|
||||
@@ -131,7 +132,6 @@ class Renamer(Plugin):
|
||||
final_file_name = final_file_name.replace(' ', separator)
|
||||
|
||||
# Main file
|
||||
group['destination_dir'] = os.path.join(destination, final_folder_name)
|
||||
rename_files[file] = os.path.join(destination, final_folder_name, final_file_name)
|
||||
|
||||
# Check for extra subtitle files
|
||||
@@ -147,12 +147,16 @@ class Renamer(Plugin):
|
||||
final_file_name = self.doReplace(file_name, replacements)
|
||||
rename_files[subtitle_extra] = os.path.join(destination, final_folder_name, final_file_name)
|
||||
|
||||
# Filename without cd etc
|
||||
if file_type is 'movie':
|
||||
group['destination_dir'] = os.path.join(destination, final_folder_name)
|
||||
|
||||
if multiple:
|
||||
cd += 1
|
||||
|
||||
# Notify on download
|
||||
download_message = 'Download of %s (%s) successful.' % (group['library']['titles'][0]['title'], replacements['quality'])
|
||||
fireEvent('notify', type = 'movie.downloaded', message = download_message, data = replacements)
|
||||
fireEvent('notify', type = 'movie.downloaded', message = download_message, data = group)
|
||||
|
||||
# Before renaming, remove the lower quality files
|
||||
db = get_session()
|
||||
|
||||
@@ -1,26 +1,59 @@
|
||||
from couchpotato.core.event import addEvent
|
||||
from couchpotato.core.logger import CPLog
|
||||
from couchpotato.core.plugins.base import Plugin
|
||||
from couchpotato.environment import Env
|
||||
import os
|
||||
|
||||
log = CPLog(__name__)
|
||||
|
||||
|
||||
class MetaDataBase(Plugin):
|
||||
|
||||
enabled_option = 'meta_enabled'
|
||||
|
||||
def __init__(self):
|
||||
addEvent('metadata.create', self.create)
|
||||
|
||||
def create(self):
|
||||
print 'create metadata %s' % __name__
|
||||
def create(self, release):
|
||||
if self.isDisabled(): return
|
||||
|
||||
def getFanartName(self):
|
||||
log.info('Creating %s metadata.' % self.getName())
|
||||
|
||||
root = self.getRootName()
|
||||
|
||||
for type in ['nfo', 'thumbnail', 'fanart']:
|
||||
try:
|
||||
# Get file path
|
||||
name = getattr(self, 'get' + type.capitalize() + 'Name')(root)
|
||||
|
||||
if name and self.conf('meta_' + type):
|
||||
|
||||
# Get file content
|
||||
content = getattr(self, 'get' + type.capitalize())(release)
|
||||
if content:
|
||||
log.debug('Creating %s file: %s' % (type, name))
|
||||
self.createFile(name, content)
|
||||
|
||||
except Exception, e:
|
||||
log.error('Unable to create %s file: %s' % (type, e))
|
||||
|
||||
def getRootName(self, data):
|
||||
return
|
||||
|
||||
def getThumbnailName(self):
|
||||
def getFanartName(self, root):
|
||||
return
|
||||
|
||||
def getNfoName(self):
|
||||
def getThumbnailName(self, root):
|
||||
return
|
||||
|
||||
def getNfo(self):
|
||||
def getNfoName(self, root):
|
||||
return
|
||||
|
||||
def getNfo(self, data):
|
||||
return
|
||||
|
||||
def getThumbnail(self, data):
|
||||
return
|
||||
|
||||
def getFanart(self, data):
|
||||
return
|
||||
|
||||
@@ -3,4 +3,36 @@ from .main import MediaBrowser
|
||||
def start():
|
||||
return MediaBrowser()
|
||||
|
||||
config = []
|
||||
config = [{
|
||||
'name': 'mediabrowser',
|
||||
'groups': [
|
||||
{
|
||||
'tab': 'renamer',
|
||||
'name': 'metadata',
|
||||
'label': 'MediaBrowser',
|
||||
'description': 'Enable metadata MediaBrowser can understand',
|
||||
'options': [
|
||||
{
|
||||
'name': 'meta_enabled',
|
||||
'default': False,
|
||||
'type': 'enabler',
|
||||
},
|
||||
{
|
||||
'name': 'meta_nfo',
|
||||
'default': True,
|
||||
'type': 'bool',
|
||||
},
|
||||
{
|
||||
'name': 'meta_fanart',
|
||||
'default': True,
|
||||
'type': 'bool',
|
||||
},
|
||||
{
|
||||
'name': 'meta_thumbnail',
|
||||
'default': True,
|
||||
'type': 'bool',
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
}]
|
||||
|
||||
@@ -3,4 +3,26 @@ from .main import SonyPS3
|
||||
def start():
|
||||
return SonyPS3()
|
||||
|
||||
config = []
|
||||
config = [{
|
||||
'name': 'sonyps3',
|
||||
'groups': [
|
||||
{
|
||||
'tab': 'renamer',
|
||||
'name': 'metadata',
|
||||
'label': 'Sony PS3',
|
||||
'description': 'Enable metadata your Playstation 3 can understand',
|
||||
'options': [
|
||||
{
|
||||
'name': 'meta_enabled',
|
||||
'default': False,
|
||||
'type': 'enabler',
|
||||
},
|
||||
{
|
||||
'name': 'meta_thumbnail',
|
||||
'default': True,
|
||||
'type': 'bool',
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
}]
|
||||
|
||||
@@ -3,4 +3,26 @@ from .main import WDTV
|
||||
def start():
|
||||
return WDTV()
|
||||
|
||||
config = []
|
||||
config = [{
|
||||
'name': 'wdtv',
|
||||
'groups': [
|
||||
{
|
||||
'tab': 'renamer',
|
||||
'name': 'metadata',
|
||||
'label': 'WDTV',
|
||||
'description': 'Enable metadata WDTV can understand',
|
||||
'options': [
|
||||
{
|
||||
'name': 'meta_enabled',
|
||||
'default': False,
|
||||
'type': 'enabler',
|
||||
},
|
||||
{
|
||||
'name': 'meta_thumbnail',
|
||||
'default': True,
|
||||
'type': 'bool',
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
}]
|
||||
|
||||
@@ -3,4 +3,36 @@ from .main import XBMC
|
||||
def start():
|
||||
return XBMC()
|
||||
|
||||
config = []
|
||||
config = [{
|
||||
'name': 'xbmc',
|
||||
'groups': [
|
||||
{
|
||||
'tab': 'renamer',
|
||||
'name': 'metadata',
|
||||
'label': 'XBMC',
|
||||
'description': 'Enable metadata XBMC can understand',
|
||||
'options': [
|
||||
{
|
||||
'name': 'meta_enabled',
|
||||
'default': False,
|
||||
'type': 'enabler',
|
||||
},
|
||||
{
|
||||
'name': 'meta_nfo',
|
||||
'default': True,
|
||||
'type': 'bool',
|
||||
},
|
||||
{
|
||||
'name': 'meta_fanart',
|
||||
'default': True,
|
||||
'type': 'bool',
|
||||
},
|
||||
{
|
||||
'name': 'meta_thumbnail',
|
||||
'default': True,
|
||||
'type': 'bool',
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
}]
|
||||
|
||||
@@ -1,9 +1,16 @@
|
||||
from couchpotato.core.providers.metadata.base import MetaDataBase
|
||||
from xml.etree.ElementTree import Element, SubElement, Comment, tostring
|
||||
from xml.etree.ElementTree import Element, SubElement, tostring
|
||||
import re
|
||||
import xml.dom.minidom
|
||||
|
||||
class XBMC(MetaDataBase):
|
||||
|
||||
def getRootName(self, data = {}):
|
||||
|
||||
|
||||
|
||||
return '/Users/ruud/Downloads/Test/Transformers'
|
||||
|
||||
def getFanartName(self, root):
|
||||
return '%s-fanart.jpg' % root
|
||||
|
||||
@@ -13,92 +20,31 @@ class XBMC(MetaDataBase):
|
||||
def getNfoName(self, root):
|
||||
return '%s.nfo' % root
|
||||
|
||||
def getNfo(self):
|
||||
pass
|
||||
|
||||
|
||||
"""
|
||||
def write_nfo(self, path, url = True, xml = True):
|
||||
|
||||
self.out_string = ''
|
||||
|
||||
if xml:
|
||||
self.out_string = self._generate_nfo_xml()
|
||||
|
||||
if url:
|
||||
self.out_string = self.out_string + self.nfo_string
|
||||
|
||||
try:
|
||||
f = open(path, 'w')
|
||||
f.write(self.out_string)
|
||||
f.close()
|
||||
except:
|
||||
raise NfoError("Couldn't write nfo")
|
||||
|
||||
def _generate_nfo_xml(self):
|
||||
def getNfo(self, data):
|
||||
nfoxml = Element('movie')
|
||||
|
||||
try:
|
||||
title = SubElement(nfoxml, 'title')
|
||||
title.text = self.tmdb_data['name']
|
||||
except:
|
||||
pass
|
||||
types = ['title', 'rating', 'year', 'votes', 'rating', 'mpaa', 'originaltitle:original_title', 'outline:overview', 'premiered:released', 'id:imdb_id']
|
||||
|
||||
try:
|
||||
originaltitle = SubElement(nfoxml, 'originaltitel')
|
||||
originaltitle.text = self.tmdb_data['original_name']
|
||||
except:
|
||||
pass
|
||||
for type in types:
|
||||
|
||||
try:
|
||||
rating = SubElement(nfoxml, 'rating')
|
||||
rating.text = str(self.tmdb_data['rating'])
|
||||
except:
|
||||
pass
|
||||
if ':' in type:
|
||||
name, type = type.split(':')
|
||||
else:
|
||||
name = type
|
||||
|
||||
try:
|
||||
year = SubElement(nfoxml, 'year')
|
||||
year.text = self.tmdb_data['released'][:4]
|
||||
except:
|
||||
pass
|
||||
try:
|
||||
el = SubElement(nfoxml, name)
|
||||
el.text = data.get(type, '')
|
||||
except:
|
||||
pass
|
||||
|
||||
try:
|
||||
votes = SubElement(nfoxml, 'votes')
|
||||
votes.text = str(self.tmdb_data['votes'])
|
||||
except:
|
||||
pass
|
||||
|
||||
try:
|
||||
plot = SubElement(nfoxml, 'outline')
|
||||
plot.text = self.tmdb_data['overview']
|
||||
except:
|
||||
pass
|
||||
|
||||
for genre in self.tmdb_data['genres']:
|
||||
genres = SubElement(nfoxml, 'genre')
|
||||
genres.text = genre['name']
|
||||
#for genre in self.get('genres'):
|
||||
# genres = SubElement(nfoxml, 'genre')
|
||||
# genres.text = genre
|
||||
|
||||
try:
|
||||
runtime = SubElement(nfoxml, 'runtime')
|
||||
runtime.text = str(self.tmdb_data['runtime']) + " min"
|
||||
except:
|
||||
pass
|
||||
|
||||
try:
|
||||
premiered = SubElement(nfoxml, 'premiered')
|
||||
premiered.text = self.tmdb_data['released']
|
||||
except:
|
||||
pass
|
||||
|
||||
try:
|
||||
mpaa = SubElement(nfoxml, 'mpaa')
|
||||
mpaa.text = self.tmdb_data['certification']
|
||||
except:
|
||||
pass
|
||||
|
||||
try:
|
||||
id = SubElement(nfoxml, 'id')
|
||||
id.text = self.tmdb_data['imdb_id']
|
||||
runtime.text = data.get('runtime') + " min"
|
||||
except:
|
||||
pass
|
||||
|
||||
@@ -109,7 +55,7 @@ class XBMC(MetaDataBase):
|
||||
xml_string = text_re.sub('>\g<1></', xml_string)
|
||||
|
||||
return xml_string.encode('utf-8')
|
||||
|
||||
"""
|
||||
def _get_fanart(self, min_height, min_width):
|
||||
''' Fetches the fanart for the specified imdb_id and saves it to dir.
|
||||
Arguments
|
||||
|
||||
@@ -45,3 +45,7 @@ class Env:
|
||||
s = Env.get('settings')
|
||||
s.set(section, attr, value)
|
||||
return s
|
||||
|
||||
@staticmethod
|
||||
def getPermission(type):
|
||||
return int(Env.get('settings').get('permission_%s' % type, default = 0777))
|
||||
|
||||
Reference in New Issue
Block a user