Browse Source

XBMC Metadata base

pull/51/merge
Ruud 14 years ago
parent
commit
9734521178
  1. 12
      couchpotato/core/_base/_core/__init__.py
  2. 25
      couchpotato/core/plugins/base.py
  3. 6
      couchpotato/core/plugins/metadata/main.py
  4. 10
      couchpotato/core/plugins/renamer/main.py
  5. 45
      couchpotato/core/providers/metadata/base.py
  6. 34
      couchpotato/core/providers/metadata/mediabrowser/__init__.py
  7. 24
      couchpotato/core/providers/metadata/sonyps3/__init__.py
  8. 24
      couchpotato/core/providers/metadata/wdtv/__init__.py
  9. 34
      couchpotato/core/providers/metadata/xbmc/__init__.py
  10. 104
      couchpotato/core/providers/metadata/xbmc/main.py
  11. 4
      couchpotato/environment.py

12
couchpotato/core/_base/_core/__init__.py

@ -68,6 +68,18 @@ config = [{
'label': 'Url Base', 'label': 'Url Base',
'description': 'When using mod_proxy use this to append the url with this.', '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',
},
], ],
}, },
], ],

25
couchpotato/core/plugins/base.py

@ -1,15 +1,20 @@
from couchpotato import addView from couchpotato import addView
from couchpotato.core.event import fireEvent from couchpotato.core.event import fireEvent
from couchpotato.core.helpers.variable import getExt from couchpotato.core.helpers.variable import getExt
from couchpotato.core.logger import CPLog
from couchpotato.environment import Env from couchpotato.environment import Env
from flask.helpers import send_from_directory from flask.helpers import send_from_directory
import glob import glob
import os.path import os.path
import re import re
log = CPLog(__name__)
class Plugin(object): class Plugin(object):
enabled_option = 'enabled'
def conf(self, attr, default = None): def conf(self, attr, default = None):
return Env.setting(attr, self.getName().lower(), default = default) return Env.setting(attr, self.getName().lower(), default = default)
@ -36,8 +41,26 @@ class Plugin(object):
dir = os.path.join(self.plugin_path, 'static') dir = os.path.join(self.plugin_path, 'static')
return send_from_directory(dir, file) 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): def isDisabled(self):
return not self.isEnabled() return not self.isEnabled()
def isEnabled(self): 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

6
couchpotato/core/plugins/metadata/main.py

@ -12,11 +12,9 @@ class MetaData(Plugin):
self.registerStatic(__file__) self.registerStatic(__file__)
def test(): addEvent('app.load', self.add)
fireEvent('metadata.create')
addEvent('app.load', test)
def add(self, data = {}): def add(self, data = {}):
log.info('Getting meta data') log.info('Getting meta data')
fireEvent('metadata.create', data)

10
couchpotato/core/plugins/renamer/main.py

@ -105,6 +105,7 @@ class Renamer(Plugin):
# Original filename # Original filename
replacements['original'] = os.path.basename(file) replacements['original'] = os.path.basename(file)
replacements['original_folder'] = os.path.basename(os.path.dirname(file))
# Extension # Extension
replacements['ext'] = getExt(file) replacements['ext'] = getExt(file)
@ -122,7 +123,7 @@ class Renamer(Plugin):
if file_type is 'trailer': if file_type is 'trailer':
final_file_name = self.doReplace(trailer_name, replacements) final_file_name = self.doReplace(trailer_name, replacements)
elif file_type is 'nfo': 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': elif file_type is 'backdrop':
final_file_name = self.doReplace(backdrop_name, replacements) final_file_name = self.doReplace(backdrop_name, replacements)
@ -131,7 +132,6 @@ class Renamer(Plugin):
final_file_name = final_file_name.replace(' ', separator) final_file_name = final_file_name.replace(' ', separator)
# Main file # 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) rename_files[file] = os.path.join(destination, final_folder_name, final_file_name)
# Check for extra subtitle files # Check for extra subtitle files
@ -147,12 +147,16 @@ class Renamer(Plugin):
final_file_name = self.doReplace(file_name, replacements) final_file_name = self.doReplace(file_name, replacements)
rename_files[subtitle_extra] = os.path.join(destination, final_folder_name, final_file_name) 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: if multiple:
cd += 1 cd += 1
# Notify on download # Notify on download
download_message = 'Download of %s (%s) successful.' % (group['library']['titles'][0]['title'], replacements['quality']) 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 # Before renaming, remove the lower quality files
db = get_session() db = get_session()

45
couchpotato/core/providers/metadata/base.py

@ -1,26 +1,59 @@
from couchpotato.core.event import addEvent from couchpotato.core.event import addEvent
from couchpotato.core.logger import CPLog from couchpotato.core.logger import CPLog
from couchpotato.core.plugins.base import Plugin from couchpotato.core.plugins.base import Plugin
from couchpotato.environment import Env
import os
log = CPLog(__name__) log = CPLog(__name__)
class MetaDataBase(Plugin): class MetaDataBase(Plugin):
enabled_option = 'meta_enabled'
def __init__(self): def __init__(self):
addEvent('metadata.create', self.create) addEvent('metadata.create', self.create)
def create(self): def create(self, release):
print 'create metadata %s' % __name__ 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 return
def getThumbnailName(self): def getNfo(self, data):
return return
def getNfoName(self): def getThumbnail(self, data):
return return
def getNfo(self): def getFanart(self, data):
return return

34
couchpotato/core/providers/metadata/mediabrowser/__init__.py

@ -3,4 +3,36 @@ from .main import MediaBrowser
def start(): def start():
return MediaBrowser() 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',
},
],
},
],
}]

24
couchpotato/core/providers/metadata/sonyps3/__init__.py

@ -3,4 +3,26 @@ from .main import SonyPS3
def start(): def start():
return SonyPS3() 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',
},
],
},
],
}]

24
couchpotato/core/providers/metadata/wdtv/__init__.py

@ -3,4 +3,26 @@ from .main import WDTV
def start(): def start():
return WDTV() 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',
},
],
},
],
}]

34
couchpotato/core/providers/metadata/xbmc/__init__.py

@ -3,4 +3,36 @@ from .main import XBMC
def start(): def start():
return XBMC() 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',
},
],
},
],
}]

104
couchpotato/core/providers/metadata/xbmc/main.py

@ -1,9 +1,16 @@
from couchpotato.core.providers.metadata.base import MetaDataBase 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 import xml.dom.minidom
class XBMC(MetaDataBase): class XBMC(MetaDataBase):
def getRootName(self, data = {}):
return '/Users/ruud/Downloads/Test/Transformers'
def getFanartName(self, root): def getFanartName(self, root):
return '%s-fanart.jpg' % root return '%s-fanart.jpg' % root
@ -13,92 +20,31 @@ class XBMC(MetaDataBase):
def getNfoName(self, root): def getNfoName(self, root):
return '%s.nfo' % root return '%s.nfo' % root
def getNfo(self): def getNfo(self, data):
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):
nfoxml = Element('movie') nfoxml = Element('movie')
try: types = ['title', 'rating', 'year', 'votes', 'rating', 'mpaa', 'originaltitle:original_title', 'outline:overview', 'premiered:released', 'id:imdb_id']
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
try: for type in types:
year = SubElement(nfoxml, 'year')
year.text = self.tmdb_data['released'][:4]
except:
pass
try: if ':' in type:
votes = SubElement(nfoxml, 'votes') name, type = type.split(':')
votes.text = str(self.tmdb_data['votes']) else:
except: name = type
pass
try: try:
plot = SubElement(nfoxml, 'outline') el = SubElement(nfoxml, name)
plot.text = self.tmdb_data['overview'] el.text = data.get(type, '')
except: except:
pass pass
for genre in self.tmdb_data['genres']: #for genre in self.get('genres'):
genres = SubElement(nfoxml, 'genre') # genres = SubElement(nfoxml, 'genre')
genres.text = genre['name'] # genres.text = genre
try: try:
runtime = SubElement(nfoxml, 'runtime') runtime = SubElement(nfoxml, 'runtime')
runtime.text = str(self.tmdb_data['runtime']) + " min" runtime.text = data.get('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']
except: except:
pass pass
@ -109,7 +55,7 @@ class XBMC(MetaDataBase):
xml_string = text_re.sub('>\g<1></', xml_string) xml_string = text_re.sub('>\g<1></', xml_string)
return xml_string.encode('utf-8') return xml_string.encode('utf-8')
"""
def _get_fanart(self, min_height, min_width): def _get_fanart(self, min_height, min_width):
''' Fetches the fanart for the specified imdb_id and saves it to dir. ''' Fetches the fanart for the specified imdb_id and saves it to dir.
Arguments Arguments

4
couchpotato/environment.py

@ -45,3 +45,7 @@ class Env:
s = Env.get('settings') s = Env.get('settings')
s.set(section, attr, value) s.set(section, attr, value)
return s return s
@staticmethod
def getPermission(type):
return int(Env.get('settings').get('permission_%s' % type, default = 0777))

Loading…
Cancel
Save