339 lines
20 KiB
Python
339 lines
20 KiB
Python
#!/usr/bin/python
|
|
# coding: utf-8
|
|
|
|
########################
|
|
|
|
from resources.lib.helper import *
|
|
from resources.lib.json_map import *
|
|
from resources.lib.functions import *
|
|
from resources.lib.database import *
|
|
from resources.lib.nfo_updater import *
|
|
|
|
########################
|
|
|
|
class EditDialog(object):
|
|
def __init__(self,dbid,dbtype):
|
|
winprop('SelectDialogPreselect', clear=True)
|
|
self.dbid = dbid
|
|
self.dbtype = dbtype
|
|
|
|
self.db = Database(dbid=self.dbid, dbtype=self.dbtype)
|
|
self.nfo_support = self.db.result().get('nfo')
|
|
self.status = None
|
|
self.get_details()
|
|
|
|
def get_details(self):
|
|
getattr(self.db, self.dbtype)()
|
|
self.details = self.db.result().get(self.dbtype)[0]
|
|
self.file = self.details.get('file') if self.nfo_support else False
|
|
|
|
def editor(self):
|
|
self.modeselect = []
|
|
self.keylist = []
|
|
self.presetlist = []
|
|
self.typelist = []
|
|
self.optionlist = []
|
|
self.generate_list()
|
|
self.dialog()
|
|
|
|
def set(self,key,type):
|
|
preset = self.details.get(key)
|
|
|
|
if isinstance(preset, list):
|
|
preset = get_joined_items(preset)
|
|
elif isinstance(preset, float):
|
|
preset = str(get_rounded_value(preset))
|
|
elif isinstance(preset, int):
|
|
preset = str(preset)
|
|
|
|
self._handle_dbitem(value_type=type,
|
|
key=key,
|
|
preset=preset
|
|
)
|
|
self.get_details()
|
|
self.quit()
|
|
|
|
def quit(self):
|
|
if self.file:
|
|
|
|
if self.status:
|
|
self.details['status'] = self.status
|
|
|
|
update_nfo(file=self.file,
|
|
dbtype=self.dbtype,
|
|
dbid=self.dbid,
|
|
details=self.details
|
|
)
|
|
|
|
reload_widgets()
|
|
|
|
def dialog(self):
|
|
preselect = winprop('SelectDialogPreselect')
|
|
if not preselect:
|
|
preselect = -1
|
|
|
|
if self.details.get('title'):
|
|
headline = ADDON.getLocalizedString(32040) + ' "' + self.details.get('title') + '"'
|
|
elif self.details.get('artist'):
|
|
headline = ADDON.getLocalizedString(32040) + ' "' + self.details.get('artist') + '"'
|
|
else:
|
|
headline = ADDON.getLocalizedString(32000)
|
|
|
|
self.editdialog = DIALOG.select(headline, self.modeselect, preselect=int(preselect), useDetails=True)
|
|
|
|
# Dialog closed -> write changes to nfo and exit
|
|
if self.editdialog == -1:
|
|
winprop('SelectDialogPreselect', clear=True)
|
|
self.quit()
|
|
|
|
else:
|
|
# Edit value based on the type
|
|
winprop('SelectDialogPreselect', str(self.editdialog))
|
|
|
|
self._handle_dbitem(value_type=self.typelist[self.editdialog],
|
|
key=self.keylist[self.editdialog],
|
|
preset=self.presetlist[self.editdialog],
|
|
option=self.optionlist[self.editdialog]
|
|
)
|
|
|
|
# Refetch updated data and return to entry_point to populate the changes in the dialog
|
|
self.get_details()
|
|
self.editor()
|
|
|
|
def generate_list(self):
|
|
details = self.details
|
|
uniqueid = details.get('uniqueid', {})
|
|
ratings = details.get('ratings')
|
|
votes = details.get('votes', 0)
|
|
|
|
if not votes or votes == -1:
|
|
votes = 0
|
|
|
|
# Fallback rule. Create own ratings dict if it's missing in the database.
|
|
if not ratings:
|
|
ratings = {'default': {'default': True,
|
|
'rating': details.get('rating', 0.0),
|
|
'votes': details.get('votes', 0)}
|
|
}
|
|
|
|
ratings_default = None
|
|
for item in ratings:
|
|
if ratings[item].get('default'):
|
|
ratings_value = str(get_rounded_value(ratings[item].get('rating', 0.0)))
|
|
votes_value = str(ratings[item].get('votes', '0'))
|
|
ratings_default = ratings_value + ' / ' + votes_value + ' (' + xbmc.getLocalizedString(21870) + ': ' + item + ')'
|
|
break
|
|
|
|
if not ratings_default and len(ratings) > 0:
|
|
ratings_default = ADDON.getLocalizedString(32047)
|
|
|
|
if self.dbtype == 'movie':
|
|
self._create_list(xbmc.getLocalizedString(369), 'title', value=details.get('title'), type='string')
|
|
self._create_list(xbmc.getLocalizedString(20376), 'originaltitle', value=details.get('originaltitle'), type='string')
|
|
self._create_list(xbmc.getLocalizedString(171), 'sorttitle', value=details.get('sorttitle'), type='string')
|
|
self._create_list(xbmc.getLocalizedString(345) + ' / ' + xbmc.getLocalizedString(172), 'premiered', value=details.get('premiered'), type='date')
|
|
self._create_list(xbmc.getLocalizedString(515), 'genre', value=get_joined_items(details.get('genre')), type='array')
|
|
self._create_list(xbmc.getLocalizedString(202), 'tagline', value=details.get('tagline'), type='string')
|
|
self._create_list(xbmc.getLocalizedString(207), 'plot', value=details.get('plot'), type='string')
|
|
self._create_list(xbmc.getLocalizedString(203), 'plotoutline', value=details.get('plotoutline'), type='string')
|
|
self._create_list(xbmc.getLocalizedString(20457), 'set', value=details.get('set'), type='movieset')
|
|
self._create_list(xbmc.getLocalizedString(563) + ' / ' + xbmc.getLocalizedString(205), 'ratings', value=ratings_default, type='ratings', option=ratings)
|
|
self._create_list(ADDON.getLocalizedString(32001), 'userrating', value=str(details.get('userrating')), type='userrating')
|
|
self._create_list(xbmc.getLocalizedString(20074), 'mpaa', value=details.get('mpaa'), type='string')
|
|
self._create_list(xbmc.getLocalizedString(20339), 'director', value=get_joined_items(details.get('director')), type='array')
|
|
self._create_list(xbmc.getLocalizedString(20417), 'writer', value=get_joined_items(details.get('writer')), type='array')
|
|
self._create_list(xbmc.getLocalizedString(21875), 'country', value=get_joined_items(details.get('country')), type='array')
|
|
self._create_list(xbmc.getLocalizedString(572), 'studio', value=get_joined_items(details.get('studio')), type='array')
|
|
self._create_list(xbmc.getLocalizedString(20459), 'tag', value=get_joined_items(details.get('tag')), type='array')
|
|
self._create_list(xbmc.getLocalizedString(20410), 'trailer', value=details.get('trailer'), type='string')
|
|
self._create_list('IMDb ID', 'uniqueid', value=uniqueid.get('imdb'), type='uniqueid', option={'type': 'imdb', 'uniqueids': uniqueid})
|
|
self._create_list('TMDb ID', 'uniqueid', value=uniqueid.get('tmdb'), type='uniqueid', option={'type': 'tmdb', 'uniqueids': uniqueid})
|
|
self._create_list(xbmc.getLocalizedString(13409), 'top250', value=str(details.get('top250')), type='integer')
|
|
self._create_list(xbmc.getLocalizedString(570), 'dateadded', value=details.get('dateadded'), type='datetime')
|
|
self._create_list(xbmc.getLocalizedString(568), 'lastplayed', value=details.get('lastplayed'), type='datetime')
|
|
self._create_list(xbmc.getLocalizedString(567), 'playcount', value=str(details.get('playcount', 0)), type='integer')
|
|
|
|
elif self.dbtype == 'tvshow':
|
|
if KODI_VERSION < 19:
|
|
status = ADDON.getLocalizedString(32022)
|
|
else:
|
|
status = details.get('status', '')
|
|
|
|
self._create_list(xbmc.getLocalizedString(369), 'title', value=details.get('title'), type='string')
|
|
self._create_list(xbmc.getLocalizedString(20376),'originaltitle', value=details.get('originaltitle'), type='string')
|
|
self._create_list(xbmc.getLocalizedString(171), 'sorttitle', value=details.get('sorttitle'), type='string')
|
|
self._create_list(xbmc.getLocalizedString(345) + ' / ' + xbmc.getLocalizedString(172), 'premiered', value=details.get('premiered'), type='date')
|
|
self._create_list(xbmc.getLocalizedString(515), 'genre', value=get_joined_items(details.get('genre')), type='array')
|
|
self._create_list(xbmc.getLocalizedString(207), 'plot', value=details.get('plot'), type='string')
|
|
self._create_list(xbmc.getLocalizedString(563) + ' / ' + xbmc.getLocalizedString(205), 'ratings', value=ratings_default, type='ratings', option=ratings)
|
|
self._create_list(ADDON.getLocalizedString(32001), 'userrating', value=str(details.get('userrating')), type='userrating')
|
|
self._create_list(xbmc.getLocalizedString(20074), 'mpaa', value=details.get('mpaa'), type='string')
|
|
self._create_list(xbmc.getLocalizedString(572), 'studio', value=get_joined_items(details.get('studio')), type='array')
|
|
self._create_list(xbmc.getLocalizedString(20459), 'tag', value=get_joined_items(details.get('tag')), type='array')
|
|
self._create_list(xbmc.getLocalizedString(126), 'status', value=status, type='status')
|
|
self._create_list('IMDb ID', 'uniqueid', value=uniqueid.get('imdb'), type='uniqueid', option={'type': 'imdb', 'uniqueids': uniqueid, 'episodeguide': details.get('episodeguide')})
|
|
self._create_list('TMDb ID', 'uniqueid', value=uniqueid.get('tmdb'), type='uniqueid', option={'type': 'tmdb', 'uniqueids': uniqueid, 'episodeguide': details.get('episodeguide')})
|
|
self._create_list('TVDb ID', 'uniqueid', value=uniqueid.get('tvdb'), type='uniqueid', option={'type': 'tvdb', 'uniqueids': uniqueid, 'episodeguide': details.get('episodeguide')})
|
|
self._create_list('aniDB ID', 'uniqueid', value=uniqueid.get('anidb'), type='uniqueid', option={'type': 'anidb', 'uniqueids': uniqueid, 'episodeguide': details.get('episodeguide')})
|
|
|
|
elif self.dbtype == 'episode':
|
|
self._create_list(xbmc.getLocalizedString(369), 'title', value=details.get('title'), type='string')
|
|
self._create_list(xbmc.getLocalizedString(20376), 'originaltitle', value=details.get('originaltitle'), type='string')
|
|
self._create_list(xbmc.getLocalizedString(20416), 'firstaired', value=details.get('firstaired'), type='date')
|
|
self._create_list(xbmc.getLocalizedString(207), 'plot', value=details.get('plot'), type='string')
|
|
self._create_list(xbmc.getLocalizedString(563) + ' / ' + xbmc.getLocalizedString(205), 'ratings', value=ratings_default, type='ratings', option=ratings)
|
|
self._create_list(ADDON.getLocalizedString(32001), 'userrating', value=str(details.get('userrating')), type='userrating')
|
|
self._create_list(xbmc.getLocalizedString(20339), 'director', value=get_joined_items(details.get('director')), type='array')
|
|
self._create_list(xbmc.getLocalizedString(20417), 'writer', value=get_joined_items(details.get('writer')), type='array')
|
|
self._create_list('IMDb ID', 'uniqueid', value=uniqueid.get('imdb'), type='uniqueid', option={'type': 'imdb', 'uniqueids': uniqueid})
|
|
self._create_list('TMDb ID', 'uniqueid', value=uniqueid.get('tmdb'), type='uniqueid', option={'type': 'tmdb', 'uniqueids': uniqueid})
|
|
self._create_list('TVDb ID', 'uniqueid', value=uniqueid.get('tvdb'), type='uniqueid', option={'type': 'tvdb', 'uniqueids': uniqueid})
|
|
self._create_list('aniDB ID', 'uniqueid', value=uniqueid.get('anidb'), type='uniqueid', option={'type': 'anidb', 'uniqueids': uniqueid})
|
|
self._create_list(xbmc.getLocalizedString(570), 'dateadded', value=details.get('dateadded'), type='datetime')
|
|
self._create_list(xbmc.getLocalizedString(568), 'lastplayed', value=details.get('lastplayed'), type='datetime')
|
|
self._create_list(xbmc.getLocalizedString(567), 'playcount', value=str(details.get('playcount', 0)), type='integer')
|
|
|
|
elif self.dbtype == 'set':
|
|
self._create_list(xbmc.getLocalizedString(369), 'title', value=details.get('title'), type='string')
|
|
self._create_list(xbmc.getLocalizedString(207), 'plot', value=details.get('plot'), type='string')
|
|
|
|
elif self.dbtype == 'musicvideo':
|
|
self._create_list(xbmc.getLocalizedString(369), 'title', value=details.get('title'), type='string')
|
|
self._create_list(xbmc.getLocalizedString(557), 'artist', value=get_joined_items(details.get('artist')), type='array')
|
|
self._create_list(xbmc.getLocalizedString(558), 'album', value=details.get('album'), type='string')
|
|
self._create_list(xbmc.getLocalizedString(345) + ' / ' + xbmc.getLocalizedString(172), 'premiered', value=details.get('premiered'), type='date')
|
|
self._create_list(xbmc.getLocalizedString(554), 'track', value=str(details.get('track')), type='integer')
|
|
self._create_list(xbmc.getLocalizedString(207), 'plot', value=details.get('plot'), type='string')
|
|
self._create_list(xbmc.getLocalizedString(515), 'genre', value=get_joined_items(details.get('genre')), type='array')
|
|
self._create_list(xbmc.getLocalizedString(20339), 'director', value=get_joined_items(details.get('director')), type='array')
|
|
self._create_list(xbmc.getLocalizedString(572), 'studio', value=get_joined_items(details.get('studio')), type='array')
|
|
# self._create_list(xbmc.getLocalizedString(563), 'rating', value=str(get_rounded_value(details.get('rating'))), type='integer') broken in kodi? cannot be set
|
|
self._create_list(ADDON.getLocalizedString(32001), 'userrating', value=str(details.get('userrating')), type='userrating')
|
|
self._create_list(xbmc.getLocalizedString(20459), 'tag', value=get_joined_items(details.get('tag')), type='array')
|
|
self._create_list(xbmc.getLocalizedString(570), 'dateadded', value=details.get('dateadded'), type='datetime')
|
|
self._create_list(xbmc.getLocalizedString(568), 'lastplayed', value=details.get('lastplayed'), type='datetime')
|
|
self._create_list(xbmc.getLocalizedString(567), 'playcount', value=str(details.get('playcount', 0)), type='integer')
|
|
|
|
elif self.dbtype == 'artist':
|
|
self._create_list(xbmc.getLocalizedString(515), 'genre', value=get_joined_items(details.get('genre')), type='array')
|
|
self._create_list(xbmc.getLocalizedString(21821), 'description', value=details.get('description'), type='string')
|
|
self._create_list(xbmc.getLocalizedString(39026), 'disambiguation', value=details.get('disambiguation'), type='string')
|
|
self._create_list(xbmc.getLocalizedString(736), 'style', value=get_joined_items(details.get('style')), type='array')
|
|
self._create_list(xbmc.getLocalizedString(175), 'mood', value=get_joined_items(details.get('mood')), type='array')
|
|
self._create_list(xbmc.getLocalizedString(21892), 'instrument', value=get_joined_items(details.get('instrument')), type='array')
|
|
self._create_list(xbmc.getLocalizedString(21893), 'born', value=details.get('born'), type='string')
|
|
self._create_list(xbmc.getLocalizedString(21897), 'died', value=details.get('died'), type='string')
|
|
self._create_list(xbmc.getLocalizedString(21894), 'formed', value=details.get('formed'), type='string')
|
|
self._create_list(xbmc.getLocalizedString(21896), 'disbanded', value=details.get('disbanded'), type='string')
|
|
self._create_list(xbmc.getLocalizedString(21898), 'yearsactive', value=get_joined_items(details.get('yearsactive')), type='array')
|
|
|
|
elif self.dbtype == 'album':
|
|
self._create_list(ADDON.getLocalizedString(32023), 'albumlabel', value=details.get('albumlabel'), type='string')
|
|
self._create_list(xbmc.getLocalizedString(21821), 'description', value=details.get('description'), type='string')
|
|
self._create_list(xbmc.getLocalizedString(345), 'year', value=str(details.get('year')), type='integer')
|
|
self._create_list(xbmc.getLocalizedString(467), 'type', value=details.get('type'), type='string')
|
|
self._create_list(xbmc.getLocalizedString(515), 'genre', value=get_joined_items(details.get('genre')), type='array')
|
|
self._create_list(xbmc.getLocalizedString(15111), 'theme', value=get_joined_items(details.get('theme')), type='array')
|
|
self._create_list(xbmc.getLocalizedString(175), 'mood', value=get_joined_items(details.get('mood')), type='array')
|
|
self._create_list(xbmc.getLocalizedString(736), 'style', value=get_joined_items(details.get('style')), type='array')
|
|
self._create_list(xbmc.getLocalizedString(563), 'rating', value=str(get_rounded_value(details.get('rating'))), type='float')
|
|
self._create_list(xbmc.getLocalizedString(205), 'votes', value=str(votes), type='integer')
|
|
self._create_list(ADDON.getLocalizedString(32001), 'userrating', value=str(details.get('userrating')), type='userrating')
|
|
|
|
elif self.dbtype == 'song':
|
|
self._create_list(xbmc.getLocalizedString(563), 'rating', value=str(get_rounded_value(details.get('rating'))), type='float')
|
|
#self._create_list(xbmc.getLocalizedString(205), 'votes', value=str(details.get('votes')), type='integer') not available in methods.json? DaveBlake will fix it.
|
|
self._create_list(ADDON.getLocalizedString(32001), 'userrating', value=str(details.get('userrating')), type='userrating')
|
|
self._create_list(xbmc.getLocalizedString(568), 'lastplayed', value=details.get('lastplayed'), type='datetime')
|
|
self._create_list(xbmc.getLocalizedString(567), 'playcount', value=str(details.get('playcount', 0)), type='integer')
|
|
|
|
def _create_list(self,label,key,type,value,option=None):
|
|
if type in ['uniqueid', 'status', 'movieset']:
|
|
icon = 'string'
|
|
elif type == ('userrating'):
|
|
icon = 'integer'
|
|
elif type.startswith('date'):
|
|
icon = 'date'
|
|
elif type.startswith('rating'):
|
|
icon = 'float'
|
|
else:
|
|
icon = type
|
|
|
|
li_item = xbmcgui.ListItem(label=label, label2='n/a' if not value else value)
|
|
li_item.setArt({'icon': 'special://home/addons/script.metadata.editor/resources/media/icon_%s.png' % icon})
|
|
|
|
self.modeselect.append(li_item)
|
|
self.keylist.append(key)
|
|
self.typelist.append(type)
|
|
self.optionlist.append(option)
|
|
self.presetlist.append('' if not value else value)
|
|
|
|
def _handle_dbitem(self,key,value_type,preset=None,option=None):
|
|
if preset:
|
|
preset = preset.replace('n/a','')
|
|
|
|
if value_type == 'array':
|
|
value = set_array(self.dbtype, key, preset)
|
|
|
|
elif value_type == 'select':
|
|
value = modify_array(self.dbtype, key, preset)
|
|
|
|
elif value_type == 'string':
|
|
value = set_string(preset)
|
|
|
|
elif value_type == 'integer':
|
|
value = set_integer(preset)
|
|
|
|
elif value_type == 'float':
|
|
value = set_float(preset)
|
|
|
|
elif value_type == 'date':
|
|
value = set_date(preset)
|
|
|
|
elif value_type == 'datetime':
|
|
preset = preset.split(' ') if preset else ['', '']
|
|
date = set_date(preset[0])
|
|
time = set_time(preset[1][:-3])
|
|
value = date + ' ' + time + ':00'
|
|
|
|
elif value_type == 'userrating':
|
|
value = set_integer_range(preset, 11)
|
|
|
|
elif value_type == 'ratings':
|
|
value = set_ratings(option)
|
|
|
|
elif value_type == 'status':
|
|
value = set_status(preset)
|
|
self.status = value
|
|
|
|
elif value_type == 'watchlist':
|
|
value = toggle_tag(preset)
|
|
|
|
elif value_type == 'movieset':
|
|
value = set_movieset(preset)
|
|
|
|
elif value_type == ('uniqueid'):
|
|
returned_value = set_string(preset)
|
|
returned_value_json = returned_value if returned_value else None
|
|
returned_value_str = returned_value if returned_value else ''
|
|
|
|
uniqueid_key = option.get('type')
|
|
uniqueids = option.get('uniqueids')
|
|
|
|
value = {uniqueid_key: returned_value_json}
|
|
|
|
# build nfo info
|
|
updated_dict = {}
|
|
for item in uniqueids:
|
|
if item == uniqueid_key:
|
|
updated_dict[item] = returned_value_json
|
|
else:
|
|
updated_dict[item] = uniqueids.get(item)
|
|
|
|
if uniqueid_key not in updated_dict:
|
|
updated_dict[uniqueid_key] = returned_value_str
|
|
|
|
nfo_value = [updated_dict, option.get('episodeguide')]
|
|
|
|
self.db.write(key=key, value=value)
|