XBMC Metadata base
This commit is contained in:
1 parent
2a3d1fc8a3
commit
9734521178
11 files changed
+225
-97
No files matched your search
@@ -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',
|
||||||
|
},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -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)
|
||||||
@@ -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()
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
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
|
return
|
||||||
|
|
||||||
def getThumbnailName(self):
|
def getFanartName(self, root):
|
||||||
return
|
return
|
||||||
|
|
||||||
def getNfoName(self):
|
def getThumbnailName(self, root):
|
||||||
return
|
return
|
||||||
|
|
||||||
def getNfo(self):
|
def getNfoName(self, root):
|
||||||
|
return
|
||||||
|
|
||||||
|
def getNfo(self, data):
|
||||||
|
return
|
||||||
|
|
||||||
|
def getThumbnail(self, data):
|
||||||
|
return
|
||||||
|
|
||||||
|
def getFanart(self, data):
|
||||||
return
|
return
|
||||||
@@ -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',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
}]
|
||||||
@@ -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',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
}]
|
||||||
@@ -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',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
}]
|
||||||
@@ -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',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
}]
|
||||||
@@ -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:
|
for type in types:
|
||||||
originaltitle = SubElement(nfoxml, 'originaltitel')
|
|
||||||
originaltitle.text = self.tmdb_data['original_name']
|
|
||||||
except:
|
|
||||||
pass
|
|
||||||
|
|
||||||
try:
|
if ':' in type:
|
||||||
rating = SubElement(nfoxml, 'rating')
|
name, type = type.split(':')
|
||||||
rating.text = str(self.tmdb_data['rating'])
|
else:
|
||||||
except:
|
name = type
|
||||||
pass
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
year = SubElement(nfoxml, 'year')
|
el = SubElement(nfoxml, name)
|
||||||
year.text = self.tmdb_data['released'][:4]
|
el.text = data.get(type, '')
|
||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
try:
|
#for genre in self.get('genres'):
|
||||||
votes = SubElement(nfoxml, 'votes')
|
# genres = SubElement(nfoxml, 'genre')
|
||||||
votes.text = str(self.tmdb_data['votes'])
|
# genres.text = genre
|
||||||
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']
|
|
||||||
|
|
||||||
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
|
||||||
|
|||||||
@@ -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))
|
||||||
Reference in new issue
Block a user