jellyfin-kodi/resources/lib/objects/musicvideos.py

242 lines
8.6 KiB
Python
Raw Normal View History

2016-10-10 08:19:00 +00:00
# -*- coding: utf-8 -*-
##################################################################################################
import datetime
2018-09-06 08:36:32 +00:00
import logging
import re
2018-09-06 08:36:32 +00:00
import urllib
2016-10-10 08:19:00 +00:00
2018-09-06 08:36:32 +00:00
from obj import Objects
from kodi import MusicVideos as KodiDb, queries as QU
from database import emby_db, queries as QUEM
from helper import api, catch, stop, validate, library_check, emby_item, values
2016-10-10 08:19:00 +00:00
##################################################################################################
2018-09-06 08:36:32 +00:00
LOG = logging.getLogger("EMBY."+__name__)
2016-10-10 08:19:00 +00:00
##################################################################################################
2018-09-06 08:36:32 +00:00
class MusicVideos(KodiDb):
2016-10-10 11:14:10 +00:00
2018-09-06 08:36:32 +00:00
def __init__(self, server, embydb, videodb, direct_path):
2016-10-27 09:14:05 +00:00
2018-09-06 08:36:32 +00:00
self.server = server
self.emby = embydb
self.video = videodb
self.direct_path = direct_path
2016-10-10 08:19:00 +00:00
2018-09-06 08:36:32 +00:00
self.emby_db = emby_db.EmbyDatabase(embydb.cursor)
self.objects = Objects()
self.item_ids = []
2016-10-10 08:19:00 +00:00
2018-09-06 08:36:32 +00:00
KodiDb.__init__(self, videodb.cursor)
2016-10-10 08:19:00 +00:00
2018-09-06 08:36:32 +00:00
def __getitem__(self, key):
2016-10-10 08:19:00 +00:00
2018-09-06 08:36:32 +00:00
if key == 'MusicVideo':
return self.musicvideo
elif key == 'UserData':
return self.userdata
elif key in 'Removed':
return self.remove
2016-10-10 08:19:00 +00:00
2018-09-06 08:36:32 +00:00
@stop()
@emby_item()
@library_check()
def musicvideo(self, item, e_item, library):
2016-10-10 08:19:00 +00:00
2018-09-06 08:36:32 +00:00
''' If item does not exist, entry will be added.
If item exists, entry will be updated.
2016-10-10 08:19:00 +00:00
2018-09-06 08:36:32 +00:00
If we don't get the track number from Emby, see if we can infer it
from the sortname attribute.
'''
API = api.API(item, self.server['auth/server-address'])
obj = self.objects.map(item, 'MusicVideo')
update = True
2016-10-10 08:19:00 +00:00
2018-09-06 08:36:32 +00:00
try:
obj['MvideoId'] = e_item[0]
obj['FileId'] = e_item[1]
obj['PathId'] = e_item[2]
except TypeError as error:
update = False
LOG.debug("MvideoId for %s not found", obj['Id'])
obj['MvideoId'] = self.create_entry()
else:
if self.get(*values(obj, QU.get_musicvideo_obj)) is None:
update = False
LOG.info("MvideoId %s missing from kodi. repairing the entry.", obj['MvideoId'])
obj['Path'] = API.get_file_path(obj['Path'])
obj['LibraryId'] = library['Id']
obj['LibraryName'] = library['Name']
obj['Genres'] = obj['Genres'] or []
obj['ArtistItems'] = obj['ArtistItems'] or []
obj['Studios'] = [API.validate_studio(studio) for studio in (obj['Studios'] or [])]
obj['Plot'] = API.get_overview(obj['Plot'])
obj['DateAdded'] = obj['DateAdded'].split('.')[0].replace('T', " ")
2018-09-25 09:07:13 +00:00
obj['DatePlayed'] = None if not obj['DatePlayed'] else obj['DatePlayed'].split('.')[0].replace('T', " ")
2018-09-06 08:36:32 +00:00
obj['PlayCount'] = API.get_playcount(obj['Played'], obj['PlayCount'])
obj['Resume'] = API.adjust_resume((obj['Resume'] or 0) / 10000000.0)
obj['Runtime'] = round(float((obj['Runtime'] or 0) / 10000000.0), 6)
obj['Premiere'] = obj['Premiere'] or datetime.date(obj['Year'] or 2021, 1, 1)
obj['Genre'] = " / ".join(obj['Genres'])
obj['Studio'] = " / ".join(obj['Studios'])
obj['Artists'] = " / ".join(obj['Artists'] or [])
obj['Directors'] = " / ".join(obj['Directors'] or [])
obj['Video'] = API.video_streams(obj['Video'] or [], obj['Container'])
obj['Audio'] = API.audio_streams(obj['Audio'] or [])
obj['Streams'] = API.media_streams(obj['Video'], obj['Audio'], obj['Subtitles'])
obj['Artwork'] = API.get_all_artwork(self.objects.map(item, 'Artwork'))
self.get_path_filename(obj)
if obj['Premiere']:
obj['Premiere'] = str(obj['Premiere']).split('.')[0].replace('T', " ")
for artist in obj['ArtistItems']:
artist['Type'] = "Artist"
2016-10-10 08:19:00 +00:00
2018-09-06 08:36:32 +00:00
obj['People'] = obj['People'] or [] + obj['ArtistItems']
obj['People'] = API.get_people_artwork(obj['People'])
2016-10-10 08:19:00 +00:00
2018-09-06 08:36:32 +00:00
if obj['Index'] is None and obj['SortTitle'] is not None:
search = re.search(r'^\d+\s?', obj['SortTitle'])
2016-10-10 08:19:00 +00:00
2018-09-06 08:36:32 +00:00
if search:
obj['Index'] = search.group()
2016-10-18 08:17:33 +00:00
2018-09-06 08:36:32 +00:00
tags = []
tags.extend(obj['Tags'] or [])
tags.append(obj['LibraryName'])
2016-10-10 08:19:00 +00:00
2018-09-06 08:36:32 +00:00
if obj['Favorite']:
tags.append('Favorite musicvideos')
2016-10-10 08:19:00 +00:00
2018-09-06 08:36:32 +00:00
obj['Tags'] = tags
2016-10-10 11:14:10 +00:00
2016-10-10 08:19:00 +00:00
2018-09-06 08:36:32 +00:00
if update:
self.musicvideo_update(obj)
2016-10-10 08:19:00 +00:00
else:
2018-09-06 08:36:32 +00:00
self.musicvideo_add(obj)
self.update_path(*values(obj, QU.update_path_mvideo_obj))
self.update_file(*values(obj, QU.update_file_obj))
self.add_tags(*values(obj, QU.add_tags_mvideo_obj))
self.add_genres(*values(obj, QU.add_genres_mvideo_obj))
self.add_studios(*values(obj, QU.add_studios_mvideo_obj))
self.add_playstate(*values(obj, QU.add_bookmark_obj))
self.add_people(*values(obj, QU.add_people_mvideo_obj))
self.add_streams(*values(obj, QU.add_streams_obj))
self.artwork.add(obj['Artwork'], obj['MvideoId'], "musicvideo")
self.item_ids.append(obj['Id'])
2018-09-06 08:36:32 +00:00
2018-10-04 05:41:31 +00:00
return not update
2018-09-06 08:36:32 +00:00
def musicvideo_add(self, obj):
''' Add object to kodi.
'''
obj['PathId'] = self.add_path(*values(obj, QU.add_path_obj))
obj['FileId'] = self.add_file(*values(obj, QU.add_file_obj))
self.add(*values(obj, QU.add_musicvideo_obj))
self.emby_db.add_reference(*values(obj, QUEM.add_reference_mvideo_obj))
LOG.info("ADD mvideo [%s/%s/%s] %s: %s", obj['PathId'], obj['FileId'], obj['MvideoId'], obj['Id'], obj['Title'])
def musicvideo_update(self, obj):
''' Update object to kodi.
'''
self.update(*values(obj, QU.update_musicvideo_obj))
self.emby_db.update_reference(*values(obj, QUEM.update_reference_obj))
LOG.info("UPDATE mvideo [%s/%s/%s] %s: %s", obj['PathId'], obj['FileId'], obj['MvideoId'], obj['Id'], obj['Title'])
def get_path_filename(self, obj):
''' Get the path and filename and build it into protocol://path
'''
obj['Filename'] = obj['Path'].rsplit('\\', 1)[1] if '\\' in obj['Path'] else obj['Path'].rsplit('/', 1)[1]
2016-10-10 08:19:00 +00:00
if self.direct_path:
2016-10-10 11:14:10 +00:00
2018-09-06 08:36:32 +00:00
if not validate(obj['Path']):
raise Exception("Failed to validate path. User stopped.")
obj['Path'] = obj['Path'].replace(obj['Filename'], "")
2016-10-10 08:19:00 +00:00
else:
2018-09-06 08:36:32 +00:00
obj['Path'] = "plugin://plugin.video.emby.musicvideos/"
2016-10-10 08:19:00 +00:00
params = {
2018-09-06 08:36:32 +00:00
'filename': obj['Filename'].encode('utf-8'),
'id': obj['Id'],
'dbid': obj['MvideoId'],
2016-10-10 08:19:00 +00:00
'mode': "play"
}
2018-09-06 08:36:32 +00:00
obj['Filename'] = "%s?%s" % (obj['Path'], urllib.urlencode(params))
2016-10-10 08:19:00 +00:00
2018-09-06 08:36:32 +00:00
@stop()
@emby_item()
def userdata(self, item, e_item):
''' This updates: Favorite, LastPlayedDate, Playcount, PlaybackPositionTicks
Poster with progress bar
'''
API = api.API(item, self.server['auth/server-address'])
obj = self.objects.map(item, 'MusicVideoUserData')
2016-10-10 11:14:10 +00:00
2016-10-10 08:19:00 +00:00
try:
2018-09-06 08:36:32 +00:00
obj['MvideoId'] = e_item[0]
obj['FileId'] = e_item[1]
2016-10-10 08:19:00 +00:00
except TypeError:
return
2018-09-06 08:36:32 +00:00
obj['Resume'] = API.adjust_resume((obj['Resume'] or 0) / 10000000.0)
obj['Runtime'] = round(float((obj['Runtime'] or 0) / 10000000.0), 6)
obj['PlayCount'] = API.get_playcount(obj['Played'], obj['PlayCount'])
2018-09-25 09:07:13 +00:00
if obj['DatePlayed']:
2018-09-06 08:36:32 +00:00
obj['DatePlayed'] = obj['DatePlayed'].split('.')[0].replace('T', " ")
if obj['Favorite']:
self.get_tag(*values(obj, QU.get_tag_mvideo_obj))
2016-10-10 08:19:00 +00:00
else:
2018-09-06 08:36:32 +00:00
self.remove_tag(*values(obj, QU.delete_tag_mvideo_obj))
2016-10-10 08:19:00 +00:00
2018-09-06 08:36:32 +00:00
self.add_playstate(*values(obj, QU.add_bookmark_obj))
self.emby_db.update_reference(*values(obj, QUEM.update_reference_obj))
LOG.info("USERDATA mvideo [%s/%s] %s: %s", obj['FileId'], obj['MvideoId'], obj['Id'], obj['Title'])
2016-10-10 08:19:00 +00:00
2018-09-06 08:36:32 +00:00
@stop()
@emby_item()
def remove(self, item_id, e_item):
2016-10-10 08:19:00 +00:00
2018-09-06 08:36:32 +00:00
''' Remove mvideoid, fileid, pathid, emby reference.
'''
obj = {'Id': item_id}
2016-10-10 08:19:00 +00:00
try:
2018-09-06 08:36:32 +00:00
obj['MvideoId'] = e_item[0]
obj['FileId'] = e_item[1]
obj['PathId'] = e_item[2]
2016-10-10 08:19:00 +00:00
except TypeError:
return
2018-09-06 08:36:32 +00:00
self.artwork.delete(obj['MvideoId'], "musicvideo")
self.delete(*values(obj, QU.delete_musicvideo_obj))
2016-10-10 08:19:00 +00:00
if self.direct_path:
2018-09-06 08:36:32 +00:00
self.remove_path(*values(obj, QU.delete_path_obj))
2016-10-10 08:19:00 +00:00
2018-09-06 08:36:32 +00:00
self.emby_db.remove_item(*values(obj, QUEM.delete_item_obj))
LOG.info("DELETE musicvideo %s [%s/%s] %s", obj['MvideoId'], obj['PathId'], obj['FileId'], obj['Id'])