diff --git a/couchpotato/core/_base/_core/__init__.py b/couchpotato/core/_base/_core/__init__.py index 98d081c..87cd5af 100644 --- a/couchpotato/core/_base/_core/__init__.py +++ b/couchpotato/core/_base/_core/__init__.py @@ -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', + }, ], }, ], diff --git a/couchpotato/core/plugins/base.py b/couchpotato/core/plugins/base.py index 94b1639..e704159 100644 --- a/couchpotato/core/plugins/base.py +++ b/couchpotato/core/plugins/base.py @@ -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 diff --git a/couchpotato/core/plugins/metadata/main.py b/couchpotato/core/plugins/metadata/main.py index 29695d0..4bb3ab0 100644 --- a/couchpotato/core/plugins/metadata/main.py +++ b/couchpotato/core/plugins/metadata/main.py @@ -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) diff --git a/couchpotato/core/plugins/renamer/main.py b/couchpotato/core/plugins/renamer/main.py index 17ba89b..e52b68c 100644 --- a/couchpotato/core/plugins/renamer/main.py +++ b/couchpotato/core/plugins/renamer/main.py @@ -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() diff --git a/couchpotato/core/providers/metadata/base.py b/couchpotato/core/providers/metadata/base.py index d500229..c577583 100644 --- a/couchpotato/core/providers/metadata/base.py +++ b/couchpotato/core/providers/metadata/base.py @@ -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 + + 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 getFanartName(self, root): + return + + def getThumbnailName(self, root): + return - def getFanartName(self): + def getNfoName(self, root): return - def getThumbnailName(self): + def getNfo(self, data): return - def getNfoName(self): + def getThumbnail(self, data): return - def getNfo(self): + def getFanart(self, data): return diff --git a/couchpotato/core/providers/metadata/mediabrowser/__init__.py b/couchpotato/core/providers/metadata/mediabrowser/__init__.py index e36a7ec..3ead271 100644 --- a/couchpotato/core/providers/metadata/mediabrowser/__init__.py +++ b/couchpotato/core/providers/metadata/mediabrowser/__init__.py @@ -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', + }, + ], + }, + ], +}] diff --git a/couchpotato/core/providers/metadata/sonyps3/__init__.py b/couchpotato/core/providers/metadata/sonyps3/__init__.py index 7377650..246c06c 100644 --- a/couchpotato/core/providers/metadata/sonyps3/__init__.py +++ b/couchpotato/core/providers/metadata/sonyps3/__init__.py @@ -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', + }, + ], + }, + ], +}] diff --git a/couchpotato/core/providers/metadata/wdtv/__init__.py b/couchpotato/core/providers/metadata/wdtv/__init__.py index bd2d8a1..26c49ab 100644 --- a/couchpotato/core/providers/metadata/wdtv/__init__.py +++ b/couchpotato/core/providers/metadata/wdtv/__init__.py @@ -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', + }, + ], + }, + ], +}] diff --git a/couchpotato/core/providers/metadata/xbmc/__init__.py b/couchpotato/core/providers/metadata/xbmc/__init__.py index 223571c..3c197a3 100644 --- a/couchpotato/core/providers/metadata/xbmc/__init__.py +++ b/couchpotato/core/providers/metadata/xbmc/__init__.py @@ -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', + }, + ], + }, + ], +}] diff --git a/couchpotato/core/providers/metadata/xbmc/main.py b/couchpotato/core/providers/metadata/xbmc/main.py index f0af4ae..2a7e90b 100644 --- a/couchpotato/core/providers/metadata/xbmc/main.py +++ b/couchpotato/core/providers/metadata/xbmc/main.py @@ -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 - - try: - originaltitle = SubElement(nfoxml, 'originaltitel') - originaltitle.text = self.tmdb_data['original_name'] - except: - pass - - try: - rating = SubElement(nfoxml, 'rating') - rating.text = str(self.tmdb_data['rating']) - except: - pass + types = ['title', 'rating', 'year', 'votes', 'rating', 'mpaa', 'originaltitle:original_title', 'outline:overview', 'premiered:released', 'id:imdb_id'] - try: - year = SubElement(nfoxml, 'year') - year.text = self.tmdb_data['released'][:4] - except: - pass + for type in types: - try: - votes = SubElement(nfoxml, 'votes') - votes.text = str(self.tmdb_data['votes']) - except: - pass + if ':' in type: + name, type = type.split(':') + else: + name = type - try: - plot = SubElement(nfoxml, 'outline') - plot.text = self.tmdb_data['overview'] - except: - pass + try: + el = SubElement(nfoxml, name) + el.text = data.get(type, '') + 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>