Merge pull request #104 from oddstr13/pr-flake8-1

Most flake8 warnings corrected
This commit is contained in:
mcarlton00 2019-10-04 16:39:02 -04:00 committed by GitHub
commit 739c7efb45
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
65 changed files with 1377 additions and 1359 deletions

View file

@ -18,7 +18,7 @@ sys.path.insert(0, __base__)
#################################################################################################
from entrypoint import Context
from entrypoint import Context # noqa: F402
#################################################################################################

View file

@ -18,7 +18,7 @@ sys.path.insert(0, __base__)
#################################################################################################
from entrypoint import Context
from entrypoint import Context # noqa: F402
#################################################################################################

View file

@ -18,7 +18,7 @@ sys.path.insert(0, __base__)
#################################################################################################
from entrypoint import Events
from entrypoint import Events # noqa: F402
#################################################################################################

View file

@ -2,7 +2,6 @@
#################################################################################################
import json
import logging
import os
@ -19,15 +18,18 @@ LOG = logging.getLogger("JELLYFIN."+__name__)
##################################################################################################
def get_addon_name():
''' Used for logging.
'''
return xbmcaddon.Addon(addon_id()).getAddonInfo('name').upper()
def get_version():
return xbmcaddon.Addon(addon_id()).getAddonInfo('version')
def get_platform():
if xbmc.getCondVisibility('system.platform.osx'):
@ -53,6 +55,7 @@ def get_platform():
else:
return "Unknown"
def get_device_name():
''' Detect the device name. If deviceNameOpt, then
@ -68,6 +71,7 @@ def get_device_name():
return device_name
def get_device_id(reset=False):
''' Return the device_id if already loaded.
@ -105,6 +109,7 @@ def get_device_id(reset=False):
return client_id
def reset_device_id():
window('jellyfin_deviceId', clear=True)
@ -112,6 +117,7 @@ def reset_device_id():
dialog("ok", heading="{jellyfin}", line1=_(33033))
xbmc.executebuiltin('RestartApp')
def get_info():
return {
'DeviceName': get_device_name(),

View file

@ -2,20 +2,17 @@
##################################################################################################
import json
import logging
import os
import xbmc
import xbmcaddon
import xbmcvfs
import client
from database import get_credentials, save_credentials
from dialogs import ServerConnect, UsersConnect, LoginManual, ServerManual
from helper import _, settings, addon_id, event, api, dialog, window
from helper import settings, addon_id, event, api, window
from jellyfin import Jellyfin
from jellyfin.core.connection_manager import get_server_address, CONNECTION_STATE
from jellyfin.core.connection_manager import CONNECTION_STATE
from jellyfin.core.exceptions import HTTPException
##################################################################################################
@ -115,8 +112,7 @@ class Connect(object):
return state['Credentials']
elif (server_selection or state['State'] == CONNECTION_STATE['ServerSelection'] or
state['State'] == CONNECTION_STATE['Unavailable'] and not settings('SyncInstallRunDone.bool')):
elif (server_selection or state['State'] == CONNECTION_STATE['ServerSelection'] or state['State'] == CONNECTION_STATE['Unavailable'] and not settings('SyncInstallRunDone.bool')):
self.select_servers(state)
@ -143,7 +139,6 @@ class Connect(object):
return client.get_credentials()
def get_user(self, client):
''' Save user info.
@ -178,7 +173,8 @@ class Connect(object):
LOG.debug("Adding manual server")
try:
self.manual_server()
except RuntimeError: pass
except RuntimeError:
pass
else:
raise RuntimeError("No server selected")
@ -237,14 +233,16 @@ class Connect(object):
LOG.debug("User has password, present manual login")
try:
return self.login_manual(username)
except RuntimeError: pass
except RuntimeError:
pass
else:
return self.connect_manager.login(server, username)
elif dialog.is_manual_login():
try:
return self.login_manual()
except RuntimeError: pass
except RuntimeError:
pass
else:
raise RuntimeError("No user selected")
@ -294,4 +292,3 @@ class Connect(object):
save_credentials(credentials)
LOG.info("[ remove server ] %s", server_id)

View file

@ -105,8 +105,7 @@ class Database(object):
for file in reversed(files):
if (file.startswith(database) and not file.endswith('-wal') and
not file.endswith('-shm') and not file.endswith('db-journal')):
if (file.startswith(database) and not file.endswith('-wal') and not file.endswith('-shm') and not file.endswith('db-journal')):
st = xbmcvfs.Stat(databases + file.decode('utf-8'))
modified_int = st.st_mtime()
@ -184,6 +183,7 @@ class Database(object):
self.cursor.close()
self.conn.close()
def jellyfin_tables(cursor):
''' Create the tables for the jellyfin database.
@ -205,6 +205,7 @@ def jellyfin_tables(cursor):
LOG.info("Add missing column jellyfin_parent_id")
cursor.execute("ALTER TABLE jellyfin ADD COLUMN jellyfin_parent_id 'TEXT'")
def reset():
''' Reset both the jellyfin database and the kodi database.
@ -257,6 +258,7 @@ def reset():
dialog("ok", heading="{jellyfin}", line1=_(33088))
xbmc.executebuiltin('RestartApp')
def reset_kodi():
with Database() as videodb:
@ -281,6 +283,7 @@ def reset_kodi():
LOG.info("[ reset kodi ]")
def reset_jellyfin():
with Database('jellyfin') as jellyfindb:
@ -298,6 +301,7 @@ def reset_jellyfin():
LOG.info("[ reset jellyfin ]")
def reset_artwork():
''' Remove all existing texture.
@ -325,6 +329,7 @@ def reset_artwork():
LOG.info("[ reset artwork ]")
def get_sync():
path = xbmc.translatePath("special://profile/addon_data/plugin.video.jellyfin/").decode('utf-8')
@ -345,6 +350,7 @@ def get_sync():
return sync
def save_sync(sync):
path = xbmc.translatePath("special://profile/addon_data/plugin.video.jellyfin/").decode('utf-8')
@ -358,6 +364,7 @@ def save_sync(sync):
data = json.dumps(sync, sort_keys=True, indent=4, ensure_ascii=False)
outfile.write(unicode(data))
def get_credentials():
path = xbmc.translatePath("special://profile/addon_data/plugin.video.jellyfin/").decode('utf-8')
@ -383,6 +390,7 @@ def get_credentials():
return credentials
def save_credentials(credentials):
credentials = credentials or {}
path = xbmc.translatePath("special://profile/addon_data/plugin.video.jellyfin/").decode('utf-8')
@ -396,6 +404,7 @@ def save_credentials(credentials):
except Exception as e:
LOG.error("Failed to save credentials: {}".format(e))
def get_item(kodi_id, media):
''' Get jellyfin item based on kodi id and media.
@ -409,4 +418,3 @@ def get_item(kodi_id, media):
return
return item

View file

@ -1,182 +1,169 @@
get_item = """ SELECT kodi_id, kodi_fileid, kodi_pathid, parent_id, media_type,
get_item = """
SELECT kodi_id, kodi_fileid, kodi_pathid, parent_id, media_type,
jellyfin_type, media_folder, jellyfin_parent_id
FROM jellyfin
WHERE jellyfin_id = ?
"""
get_item_obj = [ "{Id}"
]
get_item_series_obj = [ "{SeriesId}"
]
get_item_song_obj = [ "{SongAlbumId}"
]
get_item_id_by_parent = """ SELECT jellyfin_id, kodi_id
get_item_obj = ["{Id}"]
get_item_series_obj = ["{SeriesId}"]
get_item_song_obj = ["{SongAlbumId}"]
get_item_id_by_parent = """
SELECT jellyfin_id, kodi_id
FROM jellyfin
WHERE parent_id = ?
AND media_type = ?
"""
get_item_id_by_parent_boxset_obj = [ "{SetId}","movie"
]
get_item_by_parent = """ SELECT jellyfin_id, kodi_id, kodi_fileid
get_item_id_by_parent_boxset_obj = ["{SetId}", "movie"]
get_item_by_parent = """
SELECT jellyfin_id, kodi_id, kodi_fileid
FROM jellyfin
WHERE parent_id = ?
AND media_type = ?
"""
get_item_by_media_folder = """ SELECT jellyfin_id, jellyfin_type
get_item_by_media_folder = """
SELECT jellyfin_id, jellyfin_type
FROM jellyfin
WHERE media_folder = ?
"""
get_item_by_parent_movie_obj = [ "{KodiId}","movie"
]
get_item_by_parent_tvshow_obj = [ "{ParentId}","tvshow"
]
get_item_by_parent_season_obj = [ "{ParentId}","season"
]
get_item_by_parent_episode_obj = [ "{ParentId}","episode"
]
get_item_by_parent_album_obj = [ "{ParentId}","album"
]
get_item_by_parent_song_obj = [ "{ParentId}","song"
]
get_item_by_wild = """ SELECT kodi_id, media_type
get_item_by_parent_movie_obj = ["{KodiId}", "movie"]
get_item_by_parent_tvshow_obj = ["{ParentId}", "tvshow"]
get_item_by_parent_season_obj = ["{ParentId}", "season"]
get_item_by_parent_episode_obj = ["{ParentId}", "episode"]
get_item_by_parent_album_obj = ["{ParentId}", "album"]
get_item_by_parent_song_obj = ["{ParentId}", "song"]
get_item_by_wild = """
SELECT kodi_id, media_type
FROM jellyfin
WHERE jellyfin_id LIKE ?
"""
get_item_by_wild_obj = [ "{Id}"
]
get_item_by_kodi = """ SELECT jellyfin_id, parent_id, media_folder, jellyfin_type, checksum
get_item_by_wild_obj = ["{Id}"]
get_item_by_kodi = """
SELECT jellyfin_id, parent_id, media_folder, jellyfin_type, checksum
FROM jellyfin
WHERE kodi_id = ?
AND media_type = ?
"""
get_checksum = """ SELECT jellyfin_id, checksum
get_checksum = """
SELECT jellyfin_id, checksum
FROM jellyfin
WHERE jellyfin_type = ?
"""
get_view_name = """ SELECT view_name
get_view_name = """
SELECT view_name
FROM view
WHERE view_id = ?
"""
get_media_by_id = """ SELECT jellyfin_type
get_media_by_id = """
SELECT jellyfin_type
FROM jellyfin
WHERE jellyfin_id = ?
"""
get_media_by_parent_id = """ SELECT jellyfin_id, jellyfin_type, kodi_id, kodi_fileid
get_media_by_parent_id = """
SELECT jellyfin_id, jellyfin_type, kodi_id, kodi_fileid
FROM jellyfin
WHERE jellyfin_parent_id = ?
"""
get_view = """ SELECT view_name, media_type
get_view = """
SELECT view_name, media_type
FROM view
WHERE view_id = ?
"""
get_views = """ SELECT *
get_views = """
SELECT *
FROM view
"""
get_views_by_media = """ SELECT *
get_views_by_media = """
SELECT *
FROM view
WHERE media_type = ?
"""
get_items_by_media = """ SELECT jellyfin_id
get_items_by_media = """
SELECT jellyfin_id
FROM jellyfin
WHERE media_type = ?
"""
get_version = """ SELECT idVersion
get_version = """
SELECT idVersion
FROM version
"""
add_reference = """ INSERT OR REPLACE INTO jellyfin(jellyfin_id, kodi_id, kodi_fileid, kodi_pathid, jellyfin_type,
add_reference = """
INSERT OR REPLACE INTO jellyfin(jellyfin_id, kodi_id, kodi_fileid, kodi_pathid, jellyfin_type,
media_type, parent_id, checksum, media_folder, jellyfin_parent_id)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
"""
add_reference_movie_obj = [ "{Id}","{MovieId}","{FileId}","{PathId}","Movie","movie", None,"{Checksum}","{LibraryId}",
"{JellyfinParentId}"
]
add_reference_boxset_obj = [ "{Id}","{SetId}",None,None,"BoxSet","set",None,"{Checksum}",None,None
]
add_reference_tvshow_obj = [ "{Id}","{ShowId}",None,"{PathId}","Series","tvshow",None,"{Checksum}","{LibraryId}",
"{JellyfinParentId}"
]
add_reference_season_obj = [ "{Id}","{SeasonId}",None,None,"Season","season","{ShowId}",None,None,None
]
add_reference_pool_obj = [ "{SeriesId}","{ShowId}",None,"{PathId}","Series","tvshow",None,"{Checksum}","{LibraryId}",None
]
add_reference_episode_obj = [ "{Id}","{EpisodeId}","{FileId}","{PathId}","Episode","episode","{SeasonId}","{Checksum}",
None,"{JellyfinParentId}"
]
add_reference_mvideo_obj = [ "{Id}","{MvideoId}","{FileId}","{PathId}","MusicVideo","musicvideo",None,"{Checksum}",
"{LibraryId}","{JellyfinParentId}"
]
add_reference_artist_obj = [ "{Id}","{ArtistId}",None,None,"{ArtistType}","artist",None,"{Checksum}","{LibraryId}",
"{JellyfinParentId}"
]
add_reference_album_obj = [ "{Id}","{AlbumId}",None,None,"MusicAlbum","album",None,"{Checksum}",None,"{JellyfinParentId}"
]
add_reference_song_obj = [ "{Id}","{SongId}",None,"{PathId}","Audio","song","{AlbumId}","{Checksum}",
None,"{JellyfinParentId}"
]
add_view = """ INSERT OR REPLACE INTO view(view_id, view_name, media_type)
add_reference_movie_obj = ["{Id}", "{MovieId}", "{FileId}", "{PathId}", "Movie", "movie", None, "{Checksum}", "{LibraryId}", "{JellyfinParentId}"]
add_reference_boxset_obj = ["{Id}", "{SetId}", None, None, "BoxSet", "set", None, "{Checksum}", None, None]
add_reference_tvshow_obj = ["{Id}", "{ShowId}", None, "{PathId}", "Series", "tvshow", None, "{Checksum}", "{LibraryId}", "{JellyfinParentId}"]
add_reference_season_obj = ["{Id}", "{SeasonId}", None, None, "Season", "season", "{ShowId}", None, None, None]
add_reference_pool_obj = ["{SeriesId}", "{ShowId}", None, "{PathId}", "Series", "tvshow", None, "{Checksum}", "{LibraryId}", None]
add_reference_episode_obj = ["{Id}", "{EpisodeId}", "{FileId}", "{PathId}", "Episode", "episode", "{SeasonId}", "{Checksum}", None, "{JellyfinParentId}"]
add_reference_mvideo_obj = ["{Id}", "{MvideoId}", "{FileId}", "{PathId}", "MusicVideo", "musicvideo", None, "{Checksum}", "{LibraryId}", "{JellyfinParentId}"]
add_reference_artist_obj = ["{Id}", "{ArtistId}", None, None, "{ArtistType}", "artist", None, "{Checksum}", "{LibraryId}", "{JellyfinParentId}"]
add_reference_album_obj = ["{Id}", "{AlbumId}", None, None, "MusicAlbum", "album", None, "{Checksum}", None, "{JellyfinParentId}"]
add_reference_song_obj = ["{Id}", "{SongId}", None, "{PathId}", "Audio", "song", "{AlbumId}", "{Checksum}", None, "{JellyfinParentId}"]
add_view = """
INSERT OR REPLACE INTO view(view_id, view_name, media_type)
VALUES (?, ?, ?)
"""
add_version = """ INSERT OR REPLACE INTO version(idVersion)
add_version = """
INSERT OR REPLACE INTO version(idVersion)
VALUES (?)
"""
update_reference = """ UPDATE jellyfin
update_reference = """
UPDATE jellyfin
SET checksum = ?
WHERE jellyfin_id = ?
"""
update_reference_obj = [ "{Checksum}", "{Id}"
]
update_parent = """ UPDATE jellyfin
update_reference_obj = ["{Checksum}", "{Id}"]
update_parent = """
UPDATE jellyfin
SET parent_id = ?
WHERE jellyfin_id = ?
"""
update_parent_movie_obj = [ "{SetId}","{Id}"
]
update_parent_episode_obj = [ "{SeasonId}","{Id}"
]
update_parent_movie_obj = ["{SetId}", "{Id}"]
update_parent_episode_obj = ["{SeasonId}", "{Id}"]
update_parent_album_obj = ["{ArtistId}", "{AlbumId}"]
delete_item = """ DELETE FROM jellyfin
delete_item = """
DELETE FROM jellyfin
WHERE jellyfin_id = ?
"""
delete_item_obj = [ "{Id}"
]
delete_item_by_parent = """ DELETE FROM jellyfin
delete_item_obj = ["{Id}"]
delete_item_by_parent = """
DELETE FROM jellyfin
WHERE parent_id = ?
AND media_type = ?
"""
delete_item_by_parent_tvshow_obj = [ "{ParentId}","tvshow"
]
delete_item_by_parent_season_obj = [ "{ParentId}","season"
]
delete_item_by_parent_episode_obj = [ "{ParentId}","episode"
]
delete_item_by_parent_song_obj = [ "{ParentId}","song"
]
delete_item_by_parent_artist_obj = [ "{ParentId}","artist"
]
delete_item_by_parent_album_obj = [ "{KodiId}","album"
]
delete_item_by_kodi = """ DELETE FROM jellyfin
delete_item_by_parent_tvshow_obj = ["{ParentId}", "tvshow"]
delete_item_by_parent_season_obj = ["{ParentId}", "season"]
delete_item_by_parent_episode_obj = ["{ParentId}", "episode"]
delete_item_by_parent_song_obj = ["{ParentId}", "song"]
delete_item_by_parent_artist_obj = ["{ParentId}", "artist"]
delete_item_by_parent_album_obj = ["{KodiId}", "album"]
delete_item_by_kodi = """
DELETE FROM jellyfin
WHERE kodi_id = ?
AND media_type = ?
"""
delete_item_by_wild = """ DELETE FROM jellyfin
delete_item_by_wild = """
DELETE FROM jellyfin
WHERE jellyfin_id LIKE ?
"""
delete_view = """ DELETE FROM view
delete_view = """
DELETE FROM view
WHERE view_id = ?
"""
delete_parent_boxset_obj = [ None, "{Movie}"
]
delete_media_by_parent_id = """ DELETE FROM jellyfin
delete_parent_boxset_obj = [None, "{Movie}"]
delete_media_by_parent_id = """
DELETE FROM jellyfin
WHERE jellyfin_parent_id = ?
"""
delete_version = """ DELETE FROM version
delete_version = """
DELETE FROM version
"""

View file

@ -29,7 +29,6 @@ class ContextMenu(xbmcgui.WindowXMLDialog):
_options = []
selected_option = None
def __init__(self, *args, **kwargs):
xbmcgui.WindowXMLDialog.__init__(self, *args, **kwargs)
@ -48,7 +47,6 @@ class ContextMenu(xbmcgui.WindowXMLDialog):
if window('JellyfinUserImage'):
self.getControl(USER_IMAGE).setImage(window('JellyfinUserImage'))
height = 479 + (len(self._options) * 55)
LOG.info("options: %s", self._options)
self.list_ = self.getControl(LIST)

View file

@ -31,7 +31,6 @@ class LoginManual(xbmcgui.WindowXMLDialog):
error = None
username = None
def __init__(self, *args, **kwargs):
xbmcgui.WindowXMLDialog.__init__(self, *args, **kwargs)
@ -118,7 +117,6 @@ class LoginManual(xbmcgui.WindowXMLDialog):
def _login(self, username, password):
mode = self.connect_manager.get_server_info(self.connect_manager.server_id)['LastConnectionMode']
server_data = self.connect_manager.get_server_info(self.connect_manager.server_id)
server = self.connect_manager.get_server_address(server_data, server_data['LastConnectionMode'])
result = self.connect_manager.login(server, username, password)

View file

@ -6,7 +6,6 @@ import logging
import xbmc
import xbmcgui
import xbmcaddon
##################################################################################################

View file

@ -38,7 +38,6 @@ class ServerConnect(xbmcgui.WindowXMLDialog):
_connect_login = False
_manual_server = False
def __init__(self, *args, **kwargs):
xbmcgui.WindowXMLDialog.__init__(self, *args, **kwargs)

View file

@ -34,7 +34,6 @@ class ServerManual(xbmcgui.WindowXMLDialog):
_server = None
error = None
def __init__(self, *args, **kwargs):
xbmcgui.WindowXMLDialog.__init__(self, *args, **kwargs)

View file

@ -27,7 +27,6 @@ class UsersConnect(xbmcgui.WindowXMLDialog):
_user = None
_manual_login = False
def __init__(self, *args, **kwargs):
self.kodi_version = int(xbmc.getInfoLabel('System.BuildVersion')[:2])

View file

@ -42,6 +42,7 @@ def _http(action, url, request={}, server_id=None):
request.update({'url': url, 'type': action})
return Jellyfin(server_id).http.request(request)
def _get(handler, params=None, server_id=None):
return _http("GET", get_jellyfinserver_url(handler), {'params': params}, server_id)

View file

@ -10,6 +10,10 @@ import xbmcvfs
from helper import loghandler
from jellyfin import Jellyfin
from .default import Events
from .service import Service
from .context import Context
#################################################################################################
Jellyfin.set_loghandler(loghandler.LogHandler, logging.DEBUG)
@ -18,7 +22,3 @@ loghandler.config()
LOG = logging.getLogger('JELLYFIN.entrypoint')
#################################################################################################
from default import Events
from service import Service
from context import Context

View file

@ -13,7 +13,6 @@ import database
from dialogs import context
from helper import _, settings, dialog
from downloader import TheVoid
from objects import Actions
#################################################################################################

View file

@ -8,7 +8,6 @@ import sys
import urlparse
import urllib
import os
import sys
import xbmc
import xbmcvfs
@ -31,7 +30,6 @@ LOG = logging.getLogger("JELLYFIN."+__name__)
class Events(object):
def __init__(self):
''' Parse the parameters. Reroute to our service.py
@ -180,7 +178,6 @@ def listing():
else:
directory(server['Name'], "plugin://plugin.video.jellyfin/?mode=browse&server=%s" % server['Id'], context=context)
directory(_(33194), "plugin://plugin.video.jellyfin/?mode=managelibs", True)
directory(_(33134), "plugin://plugin.video.jellyfin/?mode=addserver", False)
directory(_(33054), "plugin://plugin.video.jellyfin/?mode=adduser", False)
@ -194,6 +191,7 @@ def listing():
xbmcplugin.setContent(int(sys.argv[1]), 'files')
xbmcplugin.endOfDirectory(int(sys.argv[1]))
def directory(label, path, folder=True, artwork=None, fanart=None, context=None):
''' Add directory listitem. context should be a list of tuples [(label, action)*]
@ -207,6 +205,7 @@ def directory(label, path, folder=True, artwork=None, fanart=None, context=None)
return li
def dir_listitem(label, path, artwork=None, fanart=None):
''' Gets the icon paths for default node listings
@ -218,6 +217,7 @@ def dir_listitem(label, path, artwork=None, fanart=None):
return li
def manage_libraries():
directory(_(33098), "plugin://plugin.video.jellyfin/?mode=refreshboxsets", False)
@ -230,6 +230,7 @@ def manage_libraries():
xbmcplugin.setContent(int(sys.argv[1]), 'files')
xbmcplugin.endOfDirectory(int(sys.argv[1]))
def browse(media, view_id=None, folder=None, server_id=None):
''' Browse content dynamically.
@ -274,7 +275,6 @@ def browse(media, view_id=None, folder=None, server_id=None):
elif media == 'music':
content_type = "artists"
if folder == 'recentlyadded':
listing = TheVoid('RecentlyAdded', {'Id': view_id, 'ServerId': server_id}).get()
elif folder == 'genres':
@ -316,7 +316,6 @@ def browse(media, view_id=None, folder=None, server_id=None):
else:
listing = TheVoid('Browse', {'Id': folder or view_id, 'ServerId': server_id, 'Recursive': False}).get()
if listing:
actions = Actions(server_id)
@ -396,6 +395,7 @@ def browse(media, view_id=None, folder=None, server_id=None):
xbmcplugin.setContent(int(sys.argv[1]), content_type)
xbmcplugin.endOfDirectory(int(sys.argv[1]))
def browse_subfolders(media, view_id, server_id=None):
''' Display submenus for jellyfin views.
@ -421,6 +421,7 @@ def browse_subfolders(media, view_id, server_id=None):
xbmcplugin.setContent(int(sys.argv[1]), 'files')
xbmcplugin.endOfDirectory(int(sys.argv[1]))
def browse_letters(media, view_id, server_id=None):
''' Display letters as options.
@ -445,6 +446,7 @@ def browse_letters(media, view_id, server_id=None):
xbmcplugin.setContent(int(sys.argv[1]), 'files')
xbmcplugin.endOfDirectory(int(sys.argv[1]))
def get_folder_type(item, content_type=None):
media = item['Type']
@ -480,6 +482,7 @@ def get_media_type(media):
elif media == 'music':
return "MusicArtist,MusicAlbum,Audio"
def get_fanart(item_id, path, server_id=None):
''' Get extra fanart for listitems. This is called by skinhelper.
@ -524,6 +527,7 @@ def get_fanart(item_id, path, server_id=None):
xbmcplugin.addDirectoryItems(int(sys.argv[1]), list_li, len(list_li))
xbmcplugin.endOfDirectory(int(sys.argv[1]))
def get_video_extras(item_id, path, server_id=None):
''' Returns the video files for the item as plugin listing, can be used
@ -565,6 +569,7 @@ def get_video_extras(item_id, path, server_id=None):
#xbmcplugin.endOfDirectory(int(sys.argv[1]))
"""
def get_next_episodes(item_id, limit):
''' Only for synced content.
@ -645,6 +650,7 @@ def get_next_episodes(item_id, limit):
xbmcplugin.setContent(int(sys.argv[1]), 'episodes')
xbmcplugin.endOfDirectory(int(sys.argv[1]))
def create_listitem(item):
''' Listitem based on jsonrpc items.
@ -722,6 +728,7 @@ def create_listitem(item):
return li
def add_user():
''' Add or remove users from the default server session.
@ -756,6 +763,7 @@ def add_user():
user = current[resp]
event('AddUser', {'Id': user['UserId'], 'Add': False})
def get_themes():
''' Add theme media locally, via strm. This is only for tv tunes.
@ -786,7 +794,6 @@ def get_themes():
all_views = jellyfin_db.JellyfinDatabase(jellyfindb.cursor).get_views()
views = [x[0] for x in all_views if x[2] in ('movies', 'tvshows', 'mixed')]
items = {}
server = TheVoid('GetServerAddress', {'ServerId': None}).get()
token = TheVoid('GetToken', {'ServerId': None}).get()
@ -829,6 +836,7 @@ def get_themes():
dialog("notification", heading="{jellyfin}", message=_(33153), icon="{jellyfin}", time=1000, sound=False)
def delete_item():
''' Delete keymap action.
@ -837,6 +845,7 @@ def delete_item():
context.Context(delete=True)
def backup():
''' Jellyfin backup.

View file

@ -2,12 +2,13 @@
#################################################################################################
import _strptime # Workaround for threads using datetime: _striptime is locked
import json
import logging
import sys
from datetime import datetime
# Workaround for threads using datetime: _striptime is locked
import _strptime # noqa:F401
import xbmc
import xbmcgui
@ -38,7 +39,6 @@ class Service(xbmc.Monitor):
warn = True
settings = {'last_progress': datetime.today(), 'last_progress_report': datetime.today()}
def __init__(self):
window('jellyfin_should_stop', clear=True)

View file

@ -3,19 +3,15 @@
##################################################################################################
import datetime
import json
import logging
import os
import xbmc
import xbmcvfs
import downloader as server
import helper.xmls as xmls
from database import Database, get_sync, save_sync, jellyfin_db
from helper import _, settings, window, progress, dialog, LibraryException
from helper.utils import get_screensaver, set_screensaver
from views import Views
##################################################################################################
@ -36,7 +32,6 @@ class FullSync(object):
running = False
screensaver = None
def __init__(self, library, server):
''' You can call all big syncing methods here.
@ -69,7 +64,6 @@ class FullSync(object):
return self
def libraries(self, library_id=None, update=False):
''' Map the syncing process and start the sync. Ensure only one sync is running.
@ -179,7 +173,6 @@ class FullSync(object):
return [libraries[x - 1] for x in selection]
def start(self):
''' Main sync process.
@ -322,7 +315,7 @@ class FullSync(object):
message = show['Name']
dialog.update(percent, heading="%s: %s" % (_('addon_name'), library['Name']), message=message)
if obj.tvshow(show, library=library) != False:
if obj.tvshow(show, library=library) is not False:
for episodes in server.get_episode_by_show(show['Id']):
for episode in episodes['Items']:
@ -431,7 +424,6 @@ class FullSync(object):
dialog.update(percent, message="%s/%s" % (message, song['Name']))
obj.song(song)
if self.update_library:
self.music_compare(library, obj, jellyfindb)
@ -560,7 +552,6 @@ class FullSync(object):
save_sync(self.sync)
def __exit__(self, exc_type, exc_val, exc_tb):
''' Exiting sync

View file

@ -2,9 +2,8 @@
#################################################################################################
class LibraryException(Exception):
# Jellyfin library sync exception
def __init__(self, status):
self.status = status

View file

@ -2,22 +2,21 @@
#################################################################################################
import json
import logging
import os
from uuid import uuid4
import collections
import xbmc
import xbmcvfs
import api
import database
import client
import collections
import requests
from . import _, settings, window, dialog
from downloader import TheVoid
from . import _, settings, window, dialog
#################################################################################################
LOG = logging.getLogger("JELLYFIN." + __name__)
@ -52,8 +51,8 @@ def set_properties(item, method, server_id=None):
window('jellyfin_play.json', current)
class PlayUtils(object):
class PlayUtils(object):
def __init__(self, item, force_transcode=False, server_id=None, server=None, token=None):
@ -236,7 +235,7 @@ class PlayUtils(object):
def transcode(self, source, audio=None, subtitle=None):
if not 'TranscodingUrl' in source:
if 'TranscodingUrl' not in source:
raise Exception("use get_sources to get transcoding url")
self.info['Method'] = "Transcode"
@ -275,13 +274,19 @@ class PlayUtils(object):
self.info['Method'] = "DirectStream"
if self.item['Type'] == "Audio":
self.info['Path'] = ("%s/emby/Audio/%s/stream.%s?static=true&api_key=%s" %
(self.info['ServerAddress'], self.item['Id'],
self.info['Path'] = "%s/emby/Audio/%s/stream.%s?static=true&api_key=%s" % (
self.info['ServerAddress'],
self.item['Id'],
source.get('Container', "mp4").split(',')[0],
self.info['Token']))
self.info['Token']
)
else:
self.info['Path'] = ("%s/emby/Videos/%s/stream?static=true&MediaSourceId=%s&api_key=%s" %
(self.info['ServerAddress'], self.item['Id'], source['Id'], self.info['Token']))
self.info['Path'] = "%s/emby/Videos/%s/stream?static=true&MediaSourceId=%s&api_key=%s" % (
self.info['ServerAddress'],
self.item['Id'],
source['Id'],
self.info['Token']
)
return self.info['Path']
@ -495,7 +500,6 @@ class PlayUtils(object):
listitem.setSubtitles(subs)
self.item['PlaybackInfo']['Subtitles'] = mapping
@classmethod
def download_external_subs(cls, src, filename):
@ -628,7 +632,13 @@ class PlayUtils(object):
if stream['IsTextSubtitleStream'] and 'DeliveryUrl' in stream and stream['DeliveryUrl'].lower().startswith('/videos'):
url = "%s/emby%s" % (self.info['ServerAddress'], stream['DeliveryUrl'])
else:
url = ("%s/emby/Videos/%s/%s/Subtitles/%s/Stream.%s?api_key=%s" %
(self.info['ServerAddress'], self.item['Id'], source['Id'], index, stream['Codec'], self.info['Token']))
url = "%s/emby/Videos/%s/%s/Subtitles/%s/Stream.%s?api_key=%s" % (
self.info['ServerAddress'],
self.item['Id'],
source['Id'],
index,
stream['Codec'],
self.info['Token']
)
return url

View file

@ -2,9 +2,7 @@
##################################################################################################
import json
import logging
import os
import xbmc
import xbmcaddon
@ -15,6 +13,7 @@ LOG = logging.getLogger('JELLYFIN.'+__name__)
##################################################################################################
def _(string):
''' Get add-on string. Returns in unicode.

View file

@ -12,13 +12,14 @@ import urllib
from uuid import uuid4
from distutils.version import LooseVersion
from dateutil import tz, parser
import xbmc
import xbmcaddon
import xbmcgui
import xbmcvfs
from . import _
from dateutil import tz, parser
from .translate import _
#################################################################################################
@ -26,12 +27,15 @@ LOG = logging.getLogger("JELLYFIN."+__name__)
#################################################################################################
def addon_id():
return "plugin.video.jellyfin"
def kodi_version():
return xbmc.getInfoLabel('System.BuildVersion')[:2]
def window(key, value=None, clear=False, window_id=10000):
''' Get or set window properties.
@ -65,6 +69,7 @@ def window(key, value=None, clear=False, window_id=10000):
return result
def settings(setting, value=None):
''' Get or add add-on settings.
@ -87,9 +92,11 @@ def settings(setting, value=None):
return result
def create_id():
return uuid4()
def compare_version(a, b):
''' -1 a is smaller
@ -107,6 +114,7 @@ def compare_version(a, b):
return 0
def find(dict, item):
''' Find value in dictionary.
@ -119,6 +127,7 @@ def find(dict, item):
if re.match(key, item, re.I):
return dict[key]
def event(method, data=None, sender=None, hexlify=False):
''' Data is a dictionary.
@ -134,13 +143,16 @@ def event(method, data=None, sender=None, hexlify=False):
xbmc.executebuiltin('NotifyAll(%s, %s, %s)' % (sender, method, data))
LOG.debug("---[ event: %s/%s ] %s", sender, method, data)
def dialog(dialog_type, *args, **kwargs):
d = xbmcgui.Dialog()
if "icon" in kwargs:
kwargs['icon'] = kwargs['icon'].replace("{jellyfin}",
"special://home/addons/plugin.video.jellyfin/resources/icon.png")
kwargs['icon'] = kwargs['icon'].replace(
"{jellyfin}",
"special://home/addons/plugin.video.jellyfin/resources/icon.png"
)
if "heading" in kwargs:
kwargs['heading'] = kwargs['heading'].replace("{jellyfin}", _('addon_name'))
@ -155,6 +167,7 @@ def dialog(dialog_type, *args, **kwargs):
}
return types[dialog_type](*args, **kwargs)
def should_stop():
''' Checkpoint during the sync process.
@ -171,6 +184,7 @@ def should_stop():
return False
def get_screensaver():
''' Get the current screensaver value.
@ -181,6 +195,7 @@ def get_screensaver():
except KeyError:
return ""
def set_screensaver(value):
''' Toggle the screensaver
@ -192,6 +207,7 @@ def set_screensaver(value):
result = JSONRPC('Settings.setSettingValue').execute(params)
LOG.info("---[ screensaver/%s ] %s", value, result)
class JSONRPC(object):
version = 1
@ -221,6 +237,7 @@ class JSONRPC(object):
self.params = params
return json.loads(xbmc.executeJSONRPC(self._query()))
def validate(path):
''' Verify if path is accessible.
@ -241,6 +258,7 @@ def validate(path):
return True
def values(item, keys):
''' Grab the values in the item for a list of keys {key},{key1}....
@ -248,6 +266,7 @@ def values(item, keys):
'''
return (item[key.replace('{', "").replace('}', "")] if type(key) == str and key.startswith('{') else key for key in keys)
def indent(elem, level=0):
''' Prettify xml docs.
@ -270,6 +289,7 @@ def indent(elem, level=0):
LOG.exception(error)
return
def write_xml(content, file):
with open(file, 'w') as infile:
@ -332,6 +352,7 @@ def unzip(path, dest, folder=None):
LOG.info("Unzipped %s", path)
def unzip_recursive(path, dirs, dest):
for directory in dirs:
@ -348,6 +369,7 @@ def unzip_recursive(path, dirs, dest):
for file in files:
unzip_file(os.path.join(dirs_dir, file.decode('utf-8')), os.path.join(dest_dir, file.decode('utf-8')))
def unzip_file(path, dest):
''' Unzip specific file. Path should start with zip://
@ -355,6 +377,7 @@ def unzip_file(path, dest):
xbmcvfs.copy(path, dest)
LOG.debug("unzip: %s to %s", path, dest)
def get_zip_directory(path, folder):
dirs, files = xbmcvfs.listdir(path)
@ -367,6 +390,7 @@ def get_zip_directory(path, folder):
if result:
return result
def copytree(path, dest):
''' Copy folder content from one to another.
@ -384,6 +408,7 @@ def copytree(path, dest):
LOG.info("Copied %s", path)
def copy_recursive(path, dirs, dest):
for directory in dirs:
@ -400,6 +425,7 @@ def copy_recursive(path, dirs, dest):
for file in files:
copy_file(os.path.join(dirs_dir, file.decode('utf-8')), os.path.join(dest_dir, file.decode('utf-8')))
def copy_file(path, dest):
''' Copy specific file.
@ -410,6 +436,7 @@ def copy_file(path, dest):
xbmcvfs.copy(path, dest)
LOG.debug("copy: %s to %s", path, dest)
def normalize_string(text):
''' For theme media, do not modify unless modified in TV Tunes.
@ -431,12 +458,14 @@ def normalize_string(text):
return text
def split_list(itemlist, size):
''' Split up list in pieces of size. Will generate a list of lists
'''
return [itemlist[i:i + size] for i in range(0, len(itemlist), size)]
def convert_to_local(date):
''' Convert the local datetime to local.

View file

@ -6,8 +6,9 @@ import logging
import xbmcgui
from . import _, LibraryException
from utils import should_stop
from .utils import should_stop
from .exceptions import LibraryException
from .translate import _
#################################################################################################
@ -15,6 +16,7 @@ LOG = logging.getLogger("JELLYFIN."+__name__)
#################################################################################################
def progress(message=None):
''' Will start and close the progress dialog.
@ -61,6 +63,7 @@ def catch(errors=(Exception,)):
return wrapper
return decorator
def silent_catch(errors=(Exception,)):
''' Wrapper to catch exceptions and ignore them
@ -76,6 +79,7 @@ def silent_catch(errors=(Exception,)):
return wrapper
return decorator
def stop(default=None):
''' Wrapper to catch exceptions and return using catch
@ -100,6 +104,7 @@ def stop(default=None):
return wrapper
return decorator
def jellyfin_item():
''' Wrapper to retrieve the jellyfin_db item.
@ -113,6 +118,7 @@ def jellyfin_item():
return wrapper
return decorator
def library_check():
''' Wrapper to retrieve the library

View file

@ -2,7 +2,6 @@
#################################################################################################
import json
import logging
import os
import xml.etree.ElementTree as etree
@ -17,6 +16,7 @@ LOG = logging.getLogger("JELLYFIN."+__name__)
#################################################################################################
def sources():
''' Create master lock compatible sources.
@ -77,6 +77,7 @@ def sources():
indent(xml)
write_xml(etree.tostring(xml, 'UTF-8'), file)
def tvtunes_nfo(path, urls):
''' Create tvtunes.nfo
@ -96,6 +97,7 @@ def tvtunes_nfo(path, urls):
indent(xml)
write_xml(etree.tostring(xml, 'UTF-8'), path)
def advanced_settings():
''' Track the existence of <cleanonupdate>true</cleanonupdate>

View file

@ -9,21 +9,25 @@ from helpers import has_attribute
#################################################################################################
class NullHandler(logging.Handler):
def emit(self, record):
print(self.format(record))
loghandler = NullHandler
LOG = logging.getLogger('Jellyfin')
#################################################################################################
def config(level=logging.INFO):
logger = logging.getLogger('Jellyfin')
logger.addHandler(Jellyfin.loghandler())
logger.setLevel(level)
def ensure_client():
def decorator(func):

View file

@ -16,6 +16,7 @@ LOG = logging.getLogger('JELLYFIN.'+__name__)
#################################################################################################
def callback(message, data):
''' Callback function should received message, data

View file

@ -1 +0,0 @@

View file

@ -12,7 +12,7 @@ from distutils.version import LooseVersion
import urllib3
from credentials import Credentials
from http import HTTP
from http import HTTP # noqa: I201,I100
#################################################################################################
@ -31,6 +31,7 @@ CONNECTION_MODE = {
#################################################################################################
def get_server_address(server, mode):
modes = {
@ -239,8 +240,10 @@ class ConnectionManager(object):
request.pop('dataType')
headers['X-Application'] = self._add_app_info()
headers['Content-type'] = request.get('contentType',
'application/x-www-form-urlencoded; charset=UTF-8')
headers['Content-type'] = request.get(
'contentType',
'application/x-www-form-urlencoded; charset=UTF-8'
)
def _connect_to_servers(self, servers, options):
@ -496,7 +499,7 @@ class ConnectionManager(object):
def _after_connect_validated(self, server, credentials, system_info, connection_mode, verify_authentication, options):
if options.get('enableAutoLogin') == False:
if options.get('enableAutoLogin') is False:
self.config.data['auth.user_id'] = server.pop('UserId', None)
self.config.data['auth.token'] = server.pop('AccessToken', None)
@ -581,7 +584,8 @@ class ConnectionManager(object):
if server['Id'] == result['ServerId']:
found_server = server
break
else: return # No server found
else:
return # No server found
if options.get('updateDateLastAccessed') is not False:
found_server['DateLastAccessed'] = datetime.now().strftime('%Y-%m-%dT%H:%M:%SZ')

View file

@ -2,9 +2,7 @@
#################################################################################################
import json
import logging
import os
import time
from datetime import datetime
@ -14,6 +12,7 @@ LOG = logging.getLogger('JELLYFIN.'+__name__)
#################################################################################################
class Credentials(object):
credentials = None

View file

@ -2,10 +2,9 @@
#################################################################################################
class HTTPException(Exception):
# Jellyfin HTTP exception
def __init__(self, status, message):
self.status = status
self.message = message

View file

@ -5,7 +5,6 @@
import json
import logging
import threading
import time
import xbmc

View file

@ -11,5 +11,6 @@ LOG = logging.getLogger('JELLYFIN.'+__name__)
#################################################################################################
def generate_client_id():
return str("%012X" % uuid4())

View file

@ -43,8 +43,6 @@ import base64
import threading
import time
import logging
import traceback
import sys
"""
websocket python client.
@ -89,12 +87,14 @@ class WebSocketConnectionClosedException(WebSocketException):
"""
pass
class WebSocketTimeoutException(WebSocketException):
"""
WebSocketTimeoutException will be raised at socket timeout during read/write data.
"""
pass
default_timeout = None
traceEnabled = False
@ -135,8 +135,10 @@ def _wrap_sni_socket(sock, sslopt, hostname):
if sslopt.get('cert_reqs', ssl.CERT_NONE) != ssl.CERT_NONE:
capath = ssl.get_default_verify_paths().capath
context.load_verify_locations(cafile=sslopt.get('ca_certs', None),
capath=sslopt.get('ca_cert_path', capath))
context.load_verify_locations(
cafile=sslopt.get('ca_certs', None),
capath=sslopt.get('ca_cert_path', capath)
)
return context.wrap_socket(
sock,
@ -217,6 +219,7 @@ def create_connection(url, timeout=None, **options):
websock.connect(url, **options)
return websock
_MAX_INTEGER = (1 << 32) - 1
_AVAILABLE_KEY_CHARS = range(0x21, 0x2f + 1) + range(0x3a, 0x7e + 1)
_MAX_CHAR_BYTE = (1 << 8) - 1
@ -318,9 +321,7 @@ class ABNF(object):
if length >= ABNF.LENGTH_63:
raise ValueError("data is too long")
frame_header = chr(self.fin << 7
| self.rsv1 << 6 | self.rsv2 << 5 | self.rsv3 << 4
| self.opcode)
frame_header = chr(self.fin << 7 | self.rsv1 << 6 | self.rsv2 << 5 | self.rsv3 << 4 | self.opcode)
if length < ABNF.LENGTH_7:
frame_header += chr(self.mask << 7 | length)
elif length < ABNF.LENGTH_16:
@ -582,8 +583,7 @@ class WebSocket(object):
if traceEnabled:
logger.debug("send: " + repr(data))
while data:
l = self._send(data)
data = data[l:]
data = data[self._send(data):]
return length
def send_binary(self, payload):
@ -685,7 +685,6 @@ class WebSocket(object):
self._frame_mask = None
return ABNF(fin, rsv1, rsv2, rsv3, opcode, has_mask, payload)
def send_close(self, status=STATUS_NORMAL, reason=""):
"""
send close data to the server.
@ -709,7 +708,7 @@ class WebSocket(object):
try:
self.sock.shutdown(socket.SHUT_RDWR)
except:
except: # noqa: E722
pass
'''
@ -766,7 +765,6 @@ class WebSocket(object):
raise WebSocketConnectionClosedException()
return bytes
def _recv_strict(self, bufsize):
shortage = bufsize - sum(len(x) for x in self._recv_buffer)
while shortage > 0:
@ -781,7 +779,6 @@ class WebSocket(object):
self._recv_buffer = [unified[bufsize:]]
return unified[:bufsize]
def _recv_line(self):
line = []
while True:
@ -844,7 +841,7 @@ class WebSocketApp(object):
close websocket connection.
"""
self.keep_running = False
if(self.sock != None):
if self.sock is not None:
self.sock.close()
def _send_ping(self, interval):
@ -890,7 +887,7 @@ class WebSocketApp(object):
try:
data = self.sock.recv()
if data is None or self.keep_running == False:
if data is None or self.keep_running is False:
break
self._callback(self.on_message, data)

View file

@ -5,7 +5,6 @@
import logging
import Queue
import threading
import sys
from datetime import datetime, timedelta
import xbmc
@ -16,7 +15,7 @@ from database import Database, jellyfin_db, get_sync, save_sync
from full_sync import FullSync
from views import Views
from downloader import GetItemWorker
from helper import _, api, stop, settings, window, dialog, event, progress, LibraryException
from helper import _, api, stop, settings, window, dialog, event, LibraryException
from helper.utils import split_list, set_screensaver, get_screensaver
from jellyfin import Jellyfin
@ -41,7 +40,6 @@ MEDIA = {
##################################################################################################
class Library(threading.Thread):
started = False
@ -52,7 +50,6 @@ class Library(threading.Thread):
progress_updates = None
total_updates = 0
def __init__(self, monitor):
self.media = {'Movies': Movies, 'TVShows': TVShows, 'MusicVideos': MusicVideos, 'Music': Music}
@ -171,8 +168,7 @@ class Library(threading.Thread):
self.screensaver = get_screensaver()
set_screensaver(value="")
if (self.pending_refresh and not self.download_threads and not self.writer_threads['updated'] and
not self.writer_threads['userdata'] and not self.writer_threads['removed']):
if (self.pending_refresh and not self.download_threads and not self.writer_threads['updated'] and not self.writer_threads['userdata'] and not self.writer_threads['removed']):
self.pending_refresh = False
self.save_last_sync()
self.total_updates = 0
@ -313,7 +309,6 @@ class Library(threading.Thread):
LOG.info("-->[ q:notify/%s ]", id(new_thread))
self.notify_threads.append(new_thread)
def startup(self):
''' Run at startup.
@ -546,7 +541,6 @@ class Library(threading.Thread):
return True
def userdata(self, data):
''' Add item_id to userdata queue.
@ -654,6 +648,7 @@ class UpdatedWorker(threading.Thread):
LOG.info("--<[ q:updated/%s ]", id(self))
self.is_done = True
class UserDataWorker(threading.Thread):
is_done = False
@ -697,6 +692,7 @@ class UserDataWorker(threading.Thread):
LOG.info("--<[ q:userdata/%s ]", id(self))
self.is_done = True
class SortWorker(threading.Thread):
is_done = False
@ -742,6 +738,7 @@ class SortWorker(threading.Thread):
LOG.info("--<[ q:sort/%s ]", id(self))
self.is_done = True
class RemovedWorker(threading.Thread):
is_done = False
@ -789,6 +786,7 @@ class RemovedWorker(threading.Thread):
LOG.info("--<[ q:removed/%s ]", id(self))
self.is_done = True
class NotifyWorker(threading.Thread):
is_done = False

View file

@ -6,17 +6,15 @@ import binascii
import json
import logging
import threading
import sys
import xbmc
import xbmcgui
import connect
import downloader
import player
from client import get_device_id
from objects import Actions, PlaylistWorker, on_play, on_update, special_listener
from helper import _, settings, window, dialog, event, api, JSONRPC
from objects import PlaylistWorker, on_play, on_update, special_listener
from helper import _, settings, window, dialog, api, JSONRPC
from jellyfin import Jellyfin
from webservice import WebService

View file

@ -1,5 +1,3 @@
version = "171076031"
from movies import Movies
from musicvideos import MusicVideos
from tvshows import TVShows

View file

@ -2,7 +2,6 @@
#################################################################################################
import json
import logging
import threading
import sys
@ -16,7 +15,7 @@ import xbmcaddon
import database
from downloader import TheVoid
from obj import Objects
from helper import _, playutils, api, window, settings, dialog, JSONRPC
from helper import _, playutils, api, window, settings, dialog
from dialogs import resume
from utils import get_play_action
@ -79,7 +78,8 @@ class Actions(object):
index += 1
if force_play:
if len(sys.argv) > 1: xbmcplugin.setResolvedUrl(int(sys.argv[1]), False, self.stack[0][1])
if len(sys.argv) > 1:
xbmcplugin.setResolvedUrl(int(sys.argv[1]), False, self.stack[0][1])
xbmc.Player().play(kodi_playlist, windowed=False)
def set_playlist(self, item, listitem, db_id=None, transcode=False):
@ -316,8 +316,8 @@ class Actions(object):
else:
obj['Artwork']['Primary'] = obj['Artwork']['Primary'] \
or obj['Artwork']['Thumb'] \
or (obj['Artwork']['Backdrop'][0] \
if len(obj['Artwork']['Backdrop']) \
or (obj['Artwork']['Backdrop'][0]
if len(obj['Artwork']['Backdrop'])
else "special://home/addons/plugin.video.jellyfin/resources/fanart.png")
obj['Artwork']['Primary'] += "&KodiTrailer=true" \
if obj['Type'] == 'Trailer' else "&KodiCinemaMode=true"
@ -442,7 +442,7 @@ class Actions(object):
listitem.setProperty('IsPlayable', 'true')
listitem.setProperty('IsFolder', 'false')
if obj['Resume'] and seektime != False:
if obj['Resume'] and seektime is not False:
listitem.setProperty('resumetime', str(obj['Resume']))
listitem.setProperty('StartPercent', str(((obj['Resume'] / obj['Runtime']) * 100) - 0.40))
else:
@ -688,9 +688,7 @@ class Actions(object):
return False
if (not xbmc.getCondVisibility('Window.IsMedia') and
((item['Type'] == 'Audio' and not xbmc.getCondVisibility('Integer.IsGreater(Playlist.Length(music),1)')) or
not xbmc.getCondVisibility('Integer.IsGreater(Playlist.Length(video),1)'))):
if (not xbmc.getCondVisibility('Window.IsMedia') and ((item['Type'] == 'Audio' and not xbmc.getCondVisibility('Integer.IsGreater(Playlist.Length(music),1)')) or not xbmc.getCondVisibility('Integer.IsGreater(Playlist.Length(video),1)'))):
return True
@ -733,6 +731,7 @@ def on_update(data, server):
window('jellyfin.skip.%s' % item[0], clear=True)
def on_play(data, server):
''' Setup progress for jellyfin playback.
@ -781,6 +780,7 @@ def on_play(data, server):
item['PlaybackInfo'] = {'Path': file}
playutils.set_properties(item, 'DirectStream' if settings('useDirectPaths') == '0' else 'DirectPlay')
def special_listener():
''' Corner cases that needs to be listened to.
@ -790,8 +790,7 @@ def special_listener():
isPlaying = player.isPlaying()
count = int(window('jellyfin.external_count') or 0)
if (not isPlaying and xbmc.getCondVisibility('Window.IsVisible(DialogContextMenu.xml)') and
xbmc.getInfoLabel('Control.GetLabel(1002)') == xbmc.getLocalizedString(12021)):
if (not isPlaying and xbmc.getCondVisibility('Window.IsVisible(DialogContextMenu.xml)') and xbmc.getInfoLabel('Control.GetLabel(1002)') == xbmc.getLocalizedString(12021)):
control = int(xbmcgui.Window(10106).getFocusId())

View file

@ -12,7 +12,7 @@ import xbmcvfs
import queries as QU
import queries_texture as QUTEX
from helper import window, settings
from helper import settings
import requests
##################################################################################################
@ -37,7 +37,6 @@ class Artwork(object):
'port': settings('webServerPort')
}
def update(self, image_url, kodi_id, media, image):
''' Update artwork in the video database.
@ -220,8 +219,6 @@ class GetArtworkWorker(threading.Thread):
break
"""
# -*- coding: utf-8 -*-
@ -381,4 +378,3 @@ class Artwork(object):
count += 1
"""

View file

@ -4,8 +4,6 @@
import logging
import xbmc
import artwork
import queries as QU
from helper import values
@ -19,7 +17,6 @@ LOG = logging.getLogger("JELLYFIN."+__name__)
class Kodi(object):
def __init__(self):
self.artwork = artwork.Artwork(self.cursor)

View file

@ -16,7 +16,6 @@ LOG = logging.getLogger("JELLYFIN."+__name__)
class Movies(Kodi):
def __init__(self, cursor):
self.cursor = cursor

View file

@ -16,7 +16,6 @@ log = logging.getLogger("JELLYFIN."+__name__)
class MusicVideos(Kodi):
def __init__(self, cursor):
self.cursor = cursor

View file

@ -3,393 +3,407 @@
Some functions require additional information, therefore obj do not always reflect
the Kodi database query values.
'''
create_path = """ SELECT coalesce(max(idPath), 0)
create_path = """
SELECT coalesce(max(idPath), 0)
FROM path
"""
create_file = """ SELECT coalesce(max(idFile), 0)
create_file = """
SELECT coalesce(max(idFile), 0)
FROM files
"""
create_person = """ SELECT coalesce(max(actor_id), 0)
create_person = """
SELECT coalesce(max(actor_id), 0)
FROM actor
"""
create_genre = """ SELECT coalesce(max(genre_id), 0)
create_genre = """
SELECT coalesce(max(genre_id), 0)
FROM genre
"""
create_studio = """ SELECT coalesce(max(studio_id), 0)
create_studio = """
SELECT coalesce(max(studio_id), 0)
FROM studio
"""
create_bookmark = """ SELECT coalesce(max(idBookmark), 0)
create_bookmark = """
SELECT coalesce(max(idBookmark), 0)
FROM bookmark
"""
create_tag = """ SELECT coalesce(max(tag_id), 0)
create_tag = """
SELECT coalesce(max(tag_id), 0)
FROM tag
"""
create_unique_id = """ SELECT coalesce(max(uniqueid_id), 0)
create_unique_id = """
SELECT coalesce(max(uniqueid_id), 0)
FROM uniqueid
"""
create_rating = """ SELECT coalesce(max(rating_id), 0)
create_rating = """
SELECT coalesce(max(rating_id), 0)
FROM rating
"""
create_movie = """ SELECT coalesce(max(idMovie), 0)
create_movie = """
SELECT coalesce(max(idMovie), 0)
FROM movie
"""
create_set = """ SELECT coalesce(max(idSet), 0)
create_set = """
SELECT coalesce(max(idSet), 0)
FROM sets
"""
create_country = """ SELECT coalesce(max(country_id), 0)
create_country = """
SELECT coalesce(max(country_id), 0)
FROM country
"""
create_musicvideo = """ SELECT coalesce(max(idMVideo), 0)
create_musicvideo = """
SELECT coalesce(max(idMVideo), 0)
FROM musicvideo
"""
create_tvshow = """ SELECT coalesce(max(idShow), 0)
create_tvshow = """
SELECT coalesce(max(idShow), 0)
FROM tvshow
"""
create_season = """ SELECT coalesce(max(idSeason), 0)
create_season = """
SELECT coalesce(max(idSeason), 0)
FROM seasons
"""
create_episode = """ SELECT coalesce(max(idEpisode), 0)
create_episode = """
SELECT coalesce(max(idEpisode), 0)
FROM episode
"""
get_path = """ SELECT idPath
get_path = """
SELECT idPath
FROM path
WHERE strPath = ?
"""
get_path_obj = [ "{Path}"
]
get_file = """ SELECT idFile
get_path_obj = ["{Path}"]
get_file = """
SELECT idFile
FROM files
WHERE idPath = ?
AND strFilename = ?
"""
get_file_obj = [ "{FileId}"
]
get_filename = """ SELECT strFilename
get_file_obj = ["{FileId}"]
get_filename = """
SELECT strFilename
FROM files
WHERE idFile = ?
"""
get_person = """ SELECT actor_id
get_person = """
SELECT actor_id
FROM actor
WHERE name = ?
COLLATE NOCASE
"""
get_genre = """ SELECT genre_id
get_genre = """
SELECT genre_id
FROM genre
WHERE name = ?
COLLATE NOCASE
"""
get_studio = """ SELECT studio_id
get_studio = """
SELECT studio_id
FROM studio
WHERE name = ?
COLLATE NOCASE
"""
get_tag = """ SELECT tag_id
get_tag = """
SELECT tag_id
FROM tag
WHERE name = ?
COLLATE NOCASE
"""
get_tag_movie_obj = [ "Favorite movies","{MovieId}","movie"
]
get_tag_mvideo_obj = [ "Favorite musicvideos","{MvideoId}","musicvideo"
]
get_tag_episode_obj = [ "Favorite tvshows","{KodiId}","tvshow"
]
get_art = """ SELECT url
get_tag_movie_obj = ["Favorite movies", "{MovieId}", "movie"]
get_tag_mvideo_obj = ["Favorite musicvideos", "{MvideoId}", "musicvideo"]
get_tag_episode_obj = ["Favorite tvshows", "{KodiId}", "tvshow"]
get_art = """
SELECT url
FROM art
WHERE media_id = ?
AND media_type = ?
AND type = ?
"""
get_movie = """ SELECT *
get_movie = """
SELECT *
FROM movie
WHERE idMovie = ?
"""
get_movie_obj = [ "{MovieId}"
]
get_rating = """ SELECT rating_id
get_movie_obj = ["{MovieId}"]
get_rating = """
SELECT rating_id
FROM rating
WHERE media_type = ?
AND media_id = ?
"""
get_rating_movie_obj = [ "movie","{MovieId}"
]
get_rating_episode_obj = [ "episode","{EpisodeId}"
]
get_unique_id = """ SELECT uniqueid_id
get_rating_movie_obj = ["movie", "{MovieId}"]
get_rating_episode_obj = ["episode", "{EpisodeId}"]
get_unique_id = """
SELECT uniqueid_id
FROM uniqueid
WHERE media_type = ?
AND media_id = ?
"""
get_unique_id_movie_obj = [ "movie","{MovieId}"
]
get_unique_id_tvshow_obj = [ "tvshow","{ShowId}"
]
get_unique_id_episode_obj = [ "episode","{EpisodeId}"
]
get_country = """ SELECT country_id
get_unique_id_movie_obj = ["movie", "{MovieId}"]
get_unique_id_tvshow_obj = ["tvshow", "{ShowId}"]
get_unique_id_episode_obj = ["episode", "{EpisodeId}"]
get_country = """
SELECT country_id
FROM country
WHERE name = ?
COLLATE NOCASE
"""
get_set = """ SELECT idSet
get_set = """
SELECT idSet
FROM sets
WHERE strSet = ?
COLLATE NOCASE
"""
get_musicvideo = """ SELECT *
get_musicvideo = """
SELECT *
FROM musicvideo
WHERE idMVideo = ?
"""
get_musicvideo_obj = [ "{MvideoId}"
]
get_tvshow = """ SELECT *
get_musicvideo_obj = ["{MvideoId}"]
get_tvshow = """
SELECT *
FROM tvshow
WHERE idShow = ?
"""
get_tvshow_obj = [ "{ShowId}"
]
get_episode = """ SELECT *
get_tvshow_obj = ["{ShowId}"]
get_episode = """
SELECT *
FROM episode
WHERE idEpisode = ?
"""
get_episode_obj = [ "{EpisodeId}"
]
get_season = """ SELECT idSeason
get_episode_obj = ["{EpisodeId}"]
get_season = """
SELECT idSeason
FROM seasons
WHERE idShow = ?
AND season = ?
"""
get_season_obj = [ "{Title}","{ShowId}","{Index}"
]
get_season_special_obj = [ None,"{ShowId}",-1
]
get_season_episode_obj = [ None,"{ShowId}","{Season}"
]
get_backdrops = """ SELECT url
get_season_obj = ["{Title}", "{ShowId}", "{Index}"]
get_season_special_obj = [None, "{ShowId}", -1]
get_season_episode_obj = [None, "{ShowId}", "{Season}"]
get_backdrops = """
SELECT url
FROM art
WHERE media_id = ?
AND media_type = ?
AND type LIKE ?
"""
get_art = """ SELECT url
get_art = """
SELECT url
FROM art
WHERE media_id = ?
AND media_type = ?
AND type = ?
"""
get_art_url = """ SELECT url, type
get_art_url = """
SELECT url, type
FROM art
WHERE media_id = ?
AND media_type = ?
"""
get_show_by_unique_id = """ SELECT idShow
get_show_by_unique_id = """
SELECT idShow
FROM tvshow_view
WHERE uniqueid_value = ?
"""
get_total_episodes = """ SELECT totalCount
get_total_episodes = """
SELECT totalCount
FROM tvshowcounts
WHERE idShow = ?
"""
get_total_episodes_obj = [ "{ParentId}"
]
get_total_episodes_obj = ["{ParentId}"]
add_path = """ INSERT INTO path(idPath, strPath)
add_path = """
INSERT INTO path(idPath, strPath)
VALUES (?, ?)
"""
add_path_obj = [ "{Path}"
]
add_file = """ INSERT INTO files(idFile, idPath, strFilename)
add_path_obj = ["{Path}"]
add_file = """
INSERT INTO files(idFile, idPath, strFilename)
VALUES (?, ?, ?)
"""
add_file_obj = [ "{PathId}","{Filename}"
]
add_person = """ INSERT INTO actor(actor_id, name)
add_file_obj = ["{PathId}", "{Filename}"]
add_person = """
INSERT INTO actor(actor_id, name)
VALUES (?, ?)
"""
add_people_movie_obj = [ "{People}","{MovieId}","movie"
]
add_people_mvideo_obj = [ "{People}","{MvideoId}","musicvideo"
]
add_people_tvshow_obj = [ "{People}","{ShowId}","tvshow"
]
add_people_episode_obj = [ "{People}","{EpisodeId}","episode"
]
add_actor_link = """ INSERT INTO actor_link(actor_id, media_id, media_type, role, cast_order)
add_people_movie_obj = ["{People}", "{MovieId}", "movie"]
add_people_mvideo_obj = ["{People}", "{MvideoId}", "musicvideo"]
add_people_tvshow_obj = ["{People}", "{ShowId}", "tvshow"]
add_people_episode_obj = ["{People}", "{EpisodeId}", "episode"]
add_actor_link = """
INSERT INTO actor_link(actor_id, media_id, media_type, role, cast_order)
VALUES (?, ?, ?, ?, ?)
"""
add_link = """ INSERT INTO {LinkType}(actor_id, media_id, media_type)
add_link = """
INSERT INTO {LinkType}(actor_id, media_id, media_type)
VALUES (?, ?, ?)
"""
add_genre = """ INSERT INTO genre(genre_id, name)
add_genre = """
INSERT INTO genre(genre_id, name)
VALUES (?, ?)
"""
add_genres_movie_obj = [ "{Genres}","{MovieId}","movie"
]
add_genres_mvideo_obj = [ "{Genres}","{MvideoId}","musicvideo"
]
add_genres_tvshow_obj = [ "{Genres}","{ShowId}","tvshow"
]
add_studio = """ INSERT INTO studio(studio_id, name)
add_genres_movie_obj = ["{Genres}", "{MovieId}", "movie"]
add_genres_mvideo_obj = ["{Genres}", "{MvideoId}", "musicvideo"]
add_genres_tvshow_obj = ["{Genres}", "{ShowId}", "tvshow"]
add_studio = """
INSERT INTO studio(studio_id, name)
VALUES (?, ?)
"""
add_studios_movie_obj = [ "{Studios}","{MovieId}","movie"
]
add_studios_mvideo_obj = [ "{Studios}","{MvideoId}","musicvideo"
]
add_studios_tvshow_obj = [ "{Studios}","{ShowId}","tvshow"
]
add_bookmark = """ INSERT INTO bookmark(idBookmark, idFile, timeInSeconds, totalTimeInSeconds, player, type)
add_studios_movie_obj = ["{Studios}", "{MovieId}", "movie"]
add_studios_mvideo_obj = ["{Studios}", "{MvideoId}", "musicvideo"]
add_studios_tvshow_obj = ["{Studios}", "{ShowId}", "tvshow"]
add_bookmark = """
INSERT INTO bookmark(idBookmark, idFile, timeInSeconds, totalTimeInSeconds, player, type)
VALUES (?, ?, ?, ?, ?, ?)
"""
add_bookmark_obj = [ "{FileId}","{PlayCount}","{DatePlayed}","{Resume}","{Runtime}","DVDPlayer",1
]
add_streams_obj = [ "{FileId}","{Streams}","{Runtime}"
]
add_stream_video = """ INSERT INTO streamdetails(idFile, iStreamType, strVideoCodec, fVideoAspect, iVideoWidth,
add_bookmark_obj = ["{FileId}", "{PlayCount}", "{DatePlayed}", "{Resume}", "{Runtime}", "DVDPlayer", 1]
add_streams_obj = ["{FileId}", "{Streams}", "{Runtime}"]
add_stream_video = """
INSERT INTO streamdetails(idFile, iStreamType, strVideoCodec, fVideoAspect, iVideoWidth,
iVideoHeight, iVideoDuration, strStereoMode)
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
"""
add_stream_video_obj = [ "{FileId}",0,"{codec}","{aspect}","{width}","{height}","{Runtime}","{3d}"
]
add_stream_audio = """ INSERT INTO streamdetails(idFile, iStreamType, strAudioCodec, iAudioChannels, strAudioLanguage)
add_stream_video_obj = ["{FileId}", 0, "{codec}", "{aspect}", "{width}", "{height}", "{Runtime}", "{3d}"]
add_stream_audio = """
INSERT INTO streamdetails(idFile, iStreamType, strAudioCodec, iAudioChannels, strAudioLanguage)
VALUES (?, ?, ?, ?, ?)
"""
add_stream_audio_obj = [ "{FileId}",1,"{codec}","{channels}","{language}"
]
add_stream_sub = """ INSERT INTO streamdetails(idFile, iStreamType, strSubtitleLanguage)
add_stream_audio_obj = ["{FileId}", 1, "{codec}", "{channels}", "{language}"]
add_stream_sub = """
INSERT INTO streamdetails(idFile, iStreamType, strSubtitleLanguage)
VALUES (?, ?, ?)
"""
add_stream_sub_obj = [ "{FileId}",2,"{language}"
]
add_tag = """ INSERT INTO tag(tag_id, name)
add_stream_sub_obj = ["{FileId}", 2, "{language}"]
add_tag = """
INSERT INTO tag(tag_id, name)
VALUES (?, ?)
"""
add_tags_movie_obj = [ "{Tags}","{MovieId}","movie"
]
add_tags_mvideo_obj = [ "{Tags}","{MvideoId}","musicvideo"
]
add_tags_tvshow_obj = [ "{Tags}","{ShowId}","tvshow"
]
add_art = """ INSERT INTO art(media_id, media_type, type, url)
add_tags_movie_obj = ["{Tags}", "{MovieId}", "movie"]
add_tags_mvideo_obj = ["{Tags}", "{MvideoId}", "musicvideo"]
add_tags_tvshow_obj = ["{Tags}", "{ShowId}", "tvshow"]
add_art = """
INSERT INTO art(media_id, media_type, type, url)
VALUES (?, ?, ?, ?)
"""
add_movie = """ INSERT INTO movie(idMovie, idFile, c00, c01, c02, c03, c04, c05, c06, c07,
add_movie = """
INSERT INTO movie(idMovie, idFile, c00, c01, c02, c03, c04, c05, c06, c07,
c09, c10, c11, c12, c14, c15, c16, c18, c19, c21, userrating, premiered)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
"""
add_movie_obj = ["{MovieId}", "{FileId}", "{Title}", "{Plot}", "{ShortPlot}", "{Tagline}",
"{Votes}", "{RatingId}", "{Writers}", "{Year}", "{Unique}", "{SortTitle}",
"{Runtime}", "{Mpaa}", "{Genre}", "{Directors}", "{Title}", "{Studio}",
"{Trailer}","{Country}","{CriticRating}","{Year}"
]
add_rating = """ INSERT INTO rating(rating_id, media_id, media_type, rating_type, rating, votes)
"{Trailer}", "{Country}", "{CriticRating}", "{Year}"]
add_rating = """
INSERT INTO rating(rating_id, media_id, media_type, rating_type, rating, votes)
VALUES (?, ?, ?, ?, ?, ?)
"""
add_rating_movie_obj = [ "{RatingId}","{MovieId}","movie","default","{Rating}","{Votes}"
]
add_rating_tvshow_obj = [ "{RatingId}","{ShowId}","tvshow","default","{Rating}","{Votes}"
]
add_rating_episode_obj = [ "{RatingId}","{EpisodeId}","episode","default","{Rating}","{Votes}"
]
add_unique_id = """ INSERT INTO uniqueid(uniqueid_id, media_id, media_type, value, type)
add_rating_movie_obj = ["{RatingId}", "{MovieId}", "movie", "default", "{Rating}", "{Votes}"]
add_rating_tvshow_obj = ["{RatingId}", "{ShowId}", "tvshow", "default", "{Rating}", "{Votes}"]
add_rating_episode_obj = ["{RatingId}", "{EpisodeId}", "episode", "default", "{Rating}", "{Votes}"]
add_unique_id = """
INSERT INTO uniqueid(uniqueid_id, media_id, media_type, value, type)
VALUES (?, ?, ?, ?, ?)
"""
add_unique_id_movie_obj = [ "{Unique}","{MovieId}","movie","{UniqueId}","{ProviderName}"
]
add_unique_id_tvshow_obj = [ "{Unique}","{ShowId}","tvshow","{UniqueId}","{ProviderName}"
]
add_unique_id_episode_obj = [ "{Unique}","{EpisodeId}","episode","{UniqueId}","{ProviderName}"
]
add_country = """ INSERT INTO country(country_id, name)
add_unique_id_movie_obj = ["{Unique}", "{MovieId}", "movie", "{UniqueId}", "{ProviderName}"]
add_unique_id_tvshow_obj = ["{Unique}", "{ShowId}", "tvshow", "{UniqueId}", "{ProviderName}"]
add_unique_id_episode_obj = ["{Unique}", "{EpisodeId}", "episode", "{UniqueId}", "{ProviderName}"]
add_country = """
INSERT INTO country(country_id, name)
VALUES (?, ?)
"""
add_set = """ INSERT INTO sets(idSet, strSet, strOverview)
add_set = """
INSERT INTO sets(idSet, strSet, strOverview)
VALUES (?, ?, ?)
"""
add_set_obj = [ "{Title}","{Overview}"
]
add_musicvideo = """ INSERT INTO musicvideo(idMVideo,idFile, c00, c04, c05, c06, c07, c08, c09, c10,
add_set_obj = ["{Title}", "{Overview}"]
add_musicvideo = """
INSERT INTO musicvideo(idMVideo, idFile, c00, c04, c05, c06, c07, c08, c09, c10,
c11, c12, premiered)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
"""
add_musicvideo_obj = ["{MvideoId}", "{FileId}", "{Title}", "{Runtime}", "{Directors}", "{Studio}", "{Year}",
"{Plot}","{Album}","{Artists}","{Genre}","{Index}","{Premiere}"
]
add_tvshow = """ INSERT INTO tvshow(idShow, c00, c01, c02, c04, c05, c08, c09, c10, c12, c13, c14, c15)
"{Plot}", "{Album}", "{Artists}", "{Genre}", "{Index}", "{Premiere}"]
add_tvshow = """
INSERT INTO tvshow(idShow, c00, c01, c02, c04, c05, c08, c09, c10, c12, c13, c14, c15)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
"""
add_tvshow_obj = ["{ShowId}", "{Title}", "{Plot}", "{Status}", "{RatingId}", "{Premiere}", "{Genre}", "{Title}",
"disintegrate browse bug", "{Unique}","{Mpaa}","{Studio}","{SortTitle}"
]
add_season = """ INSERT INTO seasons(idSeason, idShow, season)
"disintegrate browse bug", "{Unique}", "{Mpaa}", "{Studio}", "{SortTitle}"]
add_season = """
INSERT INTO seasons(idSeason, idShow, season)
VALUES (?, ?, ?)
"""
add_episode = """ INSERT INTO episode(idEpisode, idFile, c00, c01, c03, c04, c05, c09, c10, c12, c13, c14,
add_episode = """
INSERT INTO episode(idEpisode, idFile, c00, c01, c03, c04, c05, c09, c10, c12, c13, c14,
idShow, c15, c16, idSeason)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
"""
add_episode_obj = ["{EpisodeId}", "{FileId}", "{Title}", "{Plot}", "{RatingId}", "{Writers}", "{Premiere}", "{Runtime}",
"{Directors}", "{Season}", "{Index}", "{Title}", "{ShowId}", "{AirsBeforeSeason}",
"{AirsBeforeEpisode}","{SeasonId}"
]
add_art = """ INSERT INTO art(media_id, media_type, type, url)
"{AirsBeforeEpisode}", "{SeasonId}"]
add_art = """
INSERT INTO art(media_id, media_type, type, url)
VALUES (?, ?, ?, ?)
"""
update_path = """ UPDATE path
update_path = """
UPDATE path
SET strPath = ?, strContent = ?, strScraper = ?, noUpdate = ?
WHERE idPath = ?
"""
update_path_movie_obj = [ "{Path}","movies","metadata.local",1,"{PathId}"
]
update_path_toptvshow_obj = [ "{TopLevel}","tvshows","metadata.local",1,"{TopPathId}"
]
update_path_tvshow_obj = [ "{Path}",None,None,1,"{PathId}"
]
update_path_episode_obj = [ "{Path}",None,None,1,"{PathId}"
]
update_path_mvideo_obj = [ "{Path}","musicvideos",None,1,"{PathId}"
]
update_file = """ UPDATE files
update_path_movie_obj = ["{Path}", "movies", "metadata.local", 1, "{PathId}"]
update_path_toptvshow_obj = ["{TopLevel}", "tvshows", "metadata.local", 1, "{TopPathId}"]
update_path_tvshow_obj = ["{Path}", None, None, 1, "{PathId}"]
update_path_episode_obj = ["{Path}", None, None, 1, "{PathId}"]
update_path_mvideo_obj = ["{Path}", "musicvideos", None, 1, "{PathId}"]
update_file = """
UPDATE files
SET idPath = ?, strFilename = ?, dateAdded = ?
WHERE idFile = ?
"""
update_file_obj = [ "{PathId}","{Filename}","{DateAdded}","{FileId}"
]
update_genres = """ INSERT OR REPLACE INTO genre_link(genre_id, media_id, media_type)
update_file_obj = ["{PathId}", "{Filename}", "{DateAdded}", "{FileId}"]
update_genres = """
INSERT OR REPLACE INTO genre_link(genre_id, media_id, media_type)
VALUES (?, ?, ?)
"""
update_studios = """ INSERT OR REPLACE INTO studio_link(studio_id, media_id, media_type)
update_studios = """
INSERT OR REPLACE INTO studio_link(studio_id, media_id, media_type)
VALUES (?, ?, ?)
"""
update_playcount = """ UPDATE files
update_playcount = """
UPDATE files
SET playCount = ?, lastPlayed = ?
WHERE idFile = ?
"""
update_tag = """ INSERT OR REPLACE INTO tag_link(tag_id, media_id, media_type)
update_tag = """
INSERT OR REPLACE INTO tag_link(tag_id, media_id, media_type)
VALUES (?, ?, ?)
"""
update_art = """ UPDATE art
update_art = """
UPDATE art
SET url = ?
WHERE media_id = ?
AND media_type = ?
AND type = ?
"""
update_actor = """ INSERT OR REPLACE INTO actor_link(actor_id, media_id, media_type, role, cast_order)
update_actor = """
INSERT OR REPLACE INTO actor_link(actor_id, media_id, media_type, role, cast_order)
VALUES (?, ?, ?, ?, ?)
"""
update_link = """ INSERT OR REPLACE INTO {LinkType}(actor_id, media_id, media_type)
update_link = """
INSERT OR REPLACE INTO {LinkType}(actor_id, media_id, media_type)
VALUES (?, ?, ?)
"""
update_movie = """ UPDATE movie
update_movie = """
UPDATE movie
SET c00 = ?, c01 = ?, c02 = ?, c03 = ?, c04 = ?, c05 = ?, c06 = ?,
c07 = ?, c09 = ?, c10 = ?, c11 = ?, c12 = ?, c14 = ?, c15 = ?,
c16 = ?, c18 = ?, c19 = ?, c21 = ?, userrating = ?, premiered = ?
@ -398,152 +412,154 @@ update_movie = """ UPDATE movie
update_movie_obj = ["{Title}", "{Plot}", "{ShortPlot}", "{Tagline}", "{Votes}", "{RatingId}",
"{Writers}", "{Year}", "{Unique}", "{SortTitle}", "{Runtime}",
"{Mpaa}", "{Genre}", "{Directors}", "{Title}", "{Studio}", "{Trailer}",
"{Country}","{CriticRating}","{Year}","{MovieId}"
]
update_rating = """ UPDATE rating
"{Country}", "{CriticRating}", "{Year}", "{MovieId}"]
update_rating = """
UPDATE rating
SET media_id = ?, media_type = ?, rating_type = ?, rating = ?, votes = ?
WHERE rating_id = ?
"""
update_rating_movie_obj = [ "{MovieId}","movie","default","{Rating}","{Votes}","{RatingId}"
]
update_rating_tvshow_obj = [ "{ShowId}","tvshow","default","{Rating}","{Votes}","{RatingId}"
]
update_rating_episode_obj = [ "{EpisodeId}","episode","default","{Rating}","{Votes}","{RatingId}"
]
update_unique_id = """ UPDATE uniqueid
update_rating_movie_obj = ["{MovieId}", "movie", "default", "{Rating}", "{Votes}", "{RatingId}"]
update_rating_tvshow_obj = ["{ShowId}", "tvshow", "default", "{Rating}", "{Votes}", "{RatingId}"]
update_rating_episode_obj = ["{EpisodeId}", "episode", "default", "{Rating}", "{Votes}", "{RatingId}"]
update_unique_id = """
UPDATE uniqueid
SET media_id = ?, media_type = ?, value = ?, type = ?
WHERE uniqueid_id = ?
"""
update_unique_id_movie_obj = [ "{MovieId}","movie","{UniqueId}","{ProviderName}","{Unique}"
]
update_unique_id_tvshow_obj = [ "{ShowId}","tvshow","{UniqueId}","{ProviderName}","{Unique}"
]
update_unique_id_episode_obj = [ "{EpisodeId}","episode","{UniqueId}","{ProviderName}","{Unique}"
]
update_country = """ INSERT OR REPLACE INTO country_link(country_id, media_id, media_type)
update_unique_id_movie_obj = ["{MovieId}", "movie", "{UniqueId}", "{ProviderName}", "{Unique}"]
update_unique_id_tvshow_obj = ["{ShowId}", "tvshow", "{UniqueId}", "{ProviderName}", "{Unique}"]
update_unique_id_episode_obj = ["{EpisodeId}", "episode", "{UniqueId}", "{ProviderName}", "{Unique}"]
update_country = """
INSERT OR REPLACE INTO country_link(country_id, media_id, media_type)
VALUES (?, ?, ?)
"""
update_country_obj = [ "{Countries}","{MovieId}","movie"
]
update_set = """ UPDATE sets
update_country_obj = ["{Countries}", "{MovieId}", "movie"]
update_set = """
UPDATE sets
SET strSet = ?, strOverview = ?
WHERE idSet = ?
"""
update_set_obj = [ "{Title}", "{Overview}", "{SetId}"
]
update_movie_set = """ UPDATE movie
update_set_obj = ["{Title}", "{Overview}", "{SetId}"]
update_movie_set = """
UPDATE movie
SET idSet = ?
WHERE idMovie = ?
"""
update_movie_set_obj = [ "{SetId}","{MovieId}"
]
update_musicvideo = """ UPDATE musicvideo
update_movie_set_obj = ["{SetId}", "{MovieId}"]
update_musicvideo = """
UPDATE musicvideo
SET c00 = ?, c04 = ?, c05 = ?, c06 = ?, c07 = ?, c08 = ?, c09 = ?, c10 = ?,
c11 = ?, c12 = ?, premiered = ?
WHERE idMVideo = ?
"""
update_musicvideo_obj = ["{Title}", "{Runtime}", "{Directors}", "{Studio}", "{Year}", "{Plot}", "{Album}",
"{Artists}","{Genre}","{Index}","{Premiere}","{MvideoId}"
]
update_tvshow = """ UPDATE tvshow
"{Artists}", "{Genre}", "{Index}", "{Premiere}", "{MvideoId}"]
update_tvshow = """
UPDATE tvshow
SET c00 = ?, c01 = ?, c02 = ?, c04 = ?, c05 = ?, c08 = ?, c09 = ?, c10 = ?,
c12 = ?, c13 = ?, c14 = ?, c15 = ?
WHERE idShow = ?
"""
update_tvshow_obj = ["{Title}", "{Plot}", "{Status}", "{RatingId}", "{Premiere}", "{Genre}", "{Title}",
"disintegrate browse bug","{Unique}","{Mpaa}","{Studio}","{SortTitle}","{ShowId}"
]
update_tvshow_link = """ INSERT OR REPLACE INTO tvshowlinkpath(idShow, idPath)
"disintegrate browse bug", "{Unique}", "{Mpaa}", "{Studio}", "{SortTitle}", "{ShowId}"]
update_tvshow_link = """
INSERT OR REPLACE INTO tvshowlinkpath(idShow, idPath)
VALUES (?, ?)
"""
update_tvshow_link_obj = [ "{ShowId}","{PathId}"
]
update_season = """ UPDATE seasons
update_tvshow_link_obj = ["{ShowId}", "{PathId}"]
update_season = """
UPDATE seasons
SET name = ?
WHERE idSeason = ?
"""
update_episode = """ UPDATE episode
update_episode = """
UPDATE episode
SET c00 = ?, c01 = ?, c03 = ?, c04 = ?, c05 = ?, c09 = ?, c10 = ?,
c12 = ?, c13 = ?, c14 = ?, c15 = ?, c16 = ?, idSeason = ?, idShow = ?
WHERE idEpisode = ?
"""
update_episode_obj = ["{Title}", "{Plot}", "{RatingId}", "{Writers}", "{Premiere}", "{Runtime}", "{Directors}",
"{Season}", "{Index}", "{Title}", "{AirsBeforeSeason}", "{AirsBeforeEpisode}", "{SeasonId}",
"{ShowId}","{EpisodeId}"
]
"{ShowId}", "{EpisodeId}"]
delete_path = """ DELETE FROM path
delete_path = """
DELETE FROM path
WHERE idPath = ?
"""
delete_path_obj = [ "{PathId}"
]
delete_file = """ DELETE FROM files
delete_path_obj = ["{PathId}"]
delete_file = """
DELETE FROM files
WHERE idFile = ?
"""
delete_file_obj = [ "{Path}","{Filename}"
]
delete_file_by_path = """ DELETE FROM files
delete_file_obj = ["{Path}", "{Filename}"]
delete_file_by_path = """
DELETE FROM files
WHERE idPath = ?
AND strFileName = ?
"""
delete_genres = """ DELETE FROM genre_link
delete_genres = """
DELETE FROM genre_link
WHERE media_id = ?
AND media_type = ?
"""
delete_bookmark = """ DELETE FROM bookmark
delete_bookmark = """
DELETE FROM bookmark
WHERE idFile = ?
"""
delete_streams = """ DELETE FROM streamdetails
delete_streams = """
DELETE FROM streamdetails
WHERE idFile = ?
"""
delete_tags = """ DELETE FROM tag_link
delete_tags = """
DELETE FROM tag_link
WHERE media_id = ?
AND media_type = ?
"""
delete_tag = """ DELETE FROM tag_link
delete_tag = """
DELETE FROM tag_link
WHERE tag_id = ?
AND media_id = ?
AND media_type = ?
"""
delete_tag_movie_obj = [ "Favorite movies","{MovieId}","movie"
]
delete_tag_mvideo_obj = [ "Favorite musicvideos","{MvideoId}","musicvideo"
]
delete_tag_episode_obj = [ "Favorite tvshows","{KodiId}","tvshow"
]
delete_movie = """ DELETE FROM movie
delete_tag_movie_obj = ["Favorite movies", "{MovieId}", "movie"]
delete_tag_mvideo_obj = ["Favorite musicvideos", "{MvideoId}", "musicvideo"]
delete_tag_episode_obj = ["Favorite tvshows", "{KodiId}", "tvshow"]
delete_movie = """
DELETE FROM movie
WHERE idMovie = ?
"""
delete_movie_obj = [ "{KodiId}","{FileId}"
]
delete_set = """ DELETE FROM sets
delete_movie_obj = ["{KodiId}", "{FileId}"]
delete_set = """
DELETE FROM sets
WHERE idSet = ?
"""
delete_set_obj = [ "{KodiId}"
]
delete_movie_set = """ UPDATE movie
delete_set_obj = ["{KodiId}"]
delete_movie_set = """
UPDATE movie
SET idSet = null
WHERE idMovie = ?
"""
delete_movie_set_obj = [ "{MovieId}"
]
delete_musicvideo = """ DELETE FROM musicvideo
delete_movie_set_obj = ["{MovieId}"]
delete_musicvideo = """
DELETE FROM musicvideo
WHERE idMVideo = ?
"""
delete_musicvideo_obj = [ "{MvideoId}", "{FileId}"
]
delete_tvshow = """ DELETE FROM tvshow
delete_musicvideo_obj = ["{MvideoId}", "{FileId}"]
delete_tvshow = """
DELETE FROM tvshow
WHERE idShow = ?
"""
delete_season = """ DELETE FROM seasons
delete_season = """
DELETE FROM seasons
WHERE idSeason = ?
"""
delete_episode = """ DELETE FROM episode
delete_episode = """
DELETE FROM episode
WHERE idEpisode = ?
"""
delete_backdrops = """ DELETE FROM art
delete_backdrops = """
DELETE FROM art
WHERE media_id = ?
AND media_type = ?
AND type LIKE ?

View file

@ -1,180 +1,195 @@
create_artist = """ SELECT coalesce(max(idArtist), 1)
create_artist = """
SELECT coalesce(max(idArtist), 1)
FROM artist
"""
create_album = """ SELECT coalesce(max(idAlbum), 0)
create_album = """
SELECT coalesce(max(idAlbum), 0)
FROM album
"""
create_song = """ SELECT coalesce(max(idSong), 0)
create_song = """
SELECT coalesce(max(idSong), 0)
FROM song
"""
create_genre = """ SELECT coalesce(max(idGenre), 0)
create_genre = """
SELECT coalesce(max(idGenre), 0)
FROM genre
"""
get_artist = """ SELECT idArtist, strArtist
get_artist = """
SELECT idArtist, strArtist
FROM artist
WHERE strMusicBrainzArtistID = ?
"""
get_artist_obj = [ "{ArtistId}","{Name}","{UniqueId}"
]
get_artist_by_name = """ SELECT idArtist
get_artist_obj = ["{ArtistId}", "{Name}", "{UniqueId}"]
get_artist_by_name = """
SELECT idArtist
FROM artist
WHERE strArtist = ?
COLLATE NOCASE
"""
get_artist_by_id = """ SELECT *
get_artist_by_id = """
SELECT *
FROM artist
WHERE idArtist = ?
"""
get_artist_by_id_obj = [ "{ArtistId}"
]
get_album_by_id = """ SELECT *
get_artist_by_id_obj = ["{ArtistId}"]
get_album_by_id = """
SELECT *
FROM album
WHERE idAlbum = ?
"""
get_album_by_id_obj = [ "{AlbumId}"
]
get_song_by_id = """ SELECT *
get_album_by_id_obj = ["{AlbumId}"]
get_song_by_id = """
SELECT *
FROM song
WHERE idSong = ?
"""
get_song_by_id_obj = [ "{SongId}"
]
get_album = """ SELECT idAlbum
get_song_by_id_obj = ["{SongId}"]
get_album = """
SELECT idAlbum
FROM album
WHERE strMusicBrainzAlbumID = ?
"""
get_album_obj = [ "{AlbumId}","{Title}","{UniqueId}","{Artists}","album"
]
get_album_by_name = """ SELECT idAlbum, strArtists
get_album_obj = ["{AlbumId}", "{Title}", "{UniqueId}", "{Artists}", "album"]
get_album_by_name = """
SELECT idAlbum, strArtists
FROM album
WHERE strAlbum = ?
"""
get_album_by_name72 = """ SELECT idAlbum, strArtistDisp
get_album_by_name72 = """
SELECT idAlbum, strArtistDisp
FROM album
WHERE strAlbum = ?
"""
get_album_artist = """ SELECT strArtists
get_album_artist = """
SELECT strArtists
FROM album
WHERE idAlbum = ?
"""
get_album_artist72 = """ SELECT strArtistDisp
get_album_artist72 = """
SELECT strArtistDisp
FROM album
WHERE idAlbum = ?
"""
get_album_artist_obj = [ "{AlbumId}","{strAlbumArtists}"
]
get_genre = """ SELECT idGenre
get_album_artist_obj = ["{AlbumId}", "{strAlbumArtists}"]
get_genre = """
SELECT idGenre
FROM genre
WHERE strGenre = ?
COLLATE NOCASE
"""
get_total_episodes = """ SELECT totalCount
get_total_episodes = """
SELECT totalCount
FROM tvshowcounts
WHERE idShow = ?
"""
add_artist = """ INSERT INTO artist(idArtist, strArtist, strMusicBrainzArtistID)
add_artist = """
INSERT INTO artist(idArtist, strArtist, strMusicBrainzArtistID)
VALUES (?, ?, ?)
"""
add_album = """ INSERT INTO album(idAlbum, strAlbum, strMusicBrainzAlbumID, strReleaseType)
add_album = """
INSERT INTO album(idAlbum, strAlbum, strMusicBrainzAlbumID, strReleaseType)
VALUES (?, ?, ?, ?)
"""
add_album72 = """ INSERT INTO album(idAlbum, strAlbum, strMusicBrainzAlbumID, strReleaseType, bScrapedMBID)
add_album72 = """
INSERT INTO album(idAlbum, strAlbum, strMusicBrainzAlbumID, strReleaseType, bScrapedMBID)
VALUES (?, ?, ?, ?, 1)
"""
add_single = """ INSERT INTO album(idAlbum, strGenres, iYear, strReleaseType)
add_single = """
INSERT INTO album(idAlbum, strGenres, iYear, strReleaseType)
VALUES (?, ?, ?, ?)
"""
add_single_obj = [ "{AlbumId}","{Genre}","{Year}","single"
]
add_song = """ INSERT INTO song(idSong, idAlbum, idPath, strArtists, strGenres, strTitle, iTrack,
add_single_obj = ["{AlbumId}", "{Genre}", "{Year}", "single"]
add_song = """
INSERT INTO song(idSong, idAlbum, idPath, strArtists, strGenres, strTitle, iTrack,
iDuration, iYear, strFileName, strMusicBrainzTrackID, iTimesPlayed, lastplayed,
rating, comment, dateAdded)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
"""
add_song72 = """ INSERT INTO song(idSong, idAlbum, idPath, strArtistDisp, strGenres, strTitle, iTrack,
add_song72 = """
INSERT INTO song(idSong, idAlbum, idPath, strArtistDisp, strGenres, strTitle, iTrack,
iDuration, iYear, strFileName, strMusicBrainzTrackID, iTimesPlayed, lastplayed,
rating, comment, dateAdded)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
"""
add_song_obj = ["{SongId}", "{AlbumId}", "{PathId}", "{Artists}", "{Genre}", "{Title}", "{Index}",
"{Runtime}", "{Year}", "{Filename}", "{UniqueId}", "{PlayCount}", "{DatePlayed}", "{Rating}",
"{Comment}","{DateAdded}"
]
add_genre = """ INSERT INTO genre(idGenre, strGenre)
"{Comment}", "{DateAdded}"]
add_genre = """
INSERT INTO genre(idGenre, strGenre)
VALUES (?, ?)
"""
add_genres_obj = [ "{AlbumId}","{Genres}","album"
]
add_genres_obj = ["{AlbumId}", "{Genres}", "album"]
update_path = """ UPDATE path
update_path = """
UPDATE path
SET strPath = ?
WHERE idPath = ?
"""
update_path_obj = [ "{Path}","{PathId}"
]
update_role = """ INSERT OR REPLACE INTO role(idRole, strRole)
update_path_obj = ["{Path}", "{PathId}"]
update_role = """
INSERT OR REPLACE INTO role(idRole, strRole)
VALUES (?, ?)
"""
update_role_obj = [ 1,"Composer"
]
update_artist_name = """ UPDATE artist
update_role_obj = [1, "Composer"]
update_artist_name = """
UPDATE artist
SET strArtist = ?
WHERE idArtist = ?
"""
update_artist_name_obj = [ "{Name}","{ArtistId}"
]
update_artist = """ UPDATE artist
update_artist_name_obj = ["{Name}", "{ArtistId}"]
update_artist = """
UPDATE artist
SET strGenres = ?, strBiography = ?, strImage = ?, strFanart = ?, lastScraped = ?
WHERE idArtist = ?
"""
update_link = """ INSERT OR REPLACE INTO album_artist(idArtist, idAlbum, strArtist)
update_link = """
INSERT OR REPLACE INTO album_artist(idArtist, idAlbum, strArtist)
VALUES (?, ?, ?)
"""
update_link_obj = [ "{ArtistId}","{AlbumId}","{Name}"
]
update_discography = """ INSERT OR REPLACE INTO discography(idArtist, strAlbum, strYear)
update_link_obj = ["{ArtistId}", "{AlbumId}", "{Name}"]
update_discography = """
INSERT OR REPLACE INTO discography(idArtist, strAlbum, strYear)
VALUES (?, ?, ?)
"""
update_discography_obj = [ "{ArtistId}","{Title}","{Year}"
]
update_album = """ UPDATE album
update_discography_obj = ["{ArtistId}", "{Title}", "{Year}"]
update_album = """
UPDATE album
SET strArtists = ?, iYear = ?, strGenres = ?, strReview = ?, strImage = ?,
iUserrating = ?, lastScraped = ?, strReleaseType = ?
WHERE idAlbum = ?
"""
update_album72 = """ UPDATE album
update_album72 = """
UPDATE album
SET strArtistDisp = ?, iYear = ?, strGenres = ?, strReview = ?, strImage = ?,
iUserrating = ?, lastScraped = ?, bScrapedMBID = 1, strReleaseType = ?
WHERE idAlbum = ?
"""
update_album_obj = [ "{Artists}","{Year}","{Genre}","{Bio}","{Thumb}","{Rating}","{LastScraped}",
"album","{AlbumId}"
]
update_album_artist = """ UPDATE album
update_album_obj = ["{Artists}", "{Year}", "{Genre}", "{Bio}", "{Thumb}", "{Rating}", "{LastScraped}", "album", "{AlbumId}"]
update_album_artist = """
UPDATE album
SET strArtists = ?
WHERE idAlbum = ?
"""
update_album_artist72 = """ UPDATE album
update_album_artist72 = """
UPDATE album
SET strArtistDisp = ?
WHERE idAlbum = ?
"""
update_song = """ UPDATE song
update_song = """
UPDATE song
SET idAlbum = ?, strArtists = ?, strGenres = ?, strTitle = ?, iTrack = ?,
iDuration = ?, iYear = ?, strFilename = ?, iTimesPlayed = ?, lastplayed = ?,
rating = ?, comment = ?, dateAdded = ?
WHERE idSong = ?
"""
update_song72 = """ UPDATE song
update_song72 = """
UPDATE song
SET idAlbum = ?, strArtistDisp = ?, strGenres = ?, strTitle = ?, iTrack = ?,
iDuration = ?, iYear = ?, strFilename = ?, iTimesPlayed = ?, lastplayed = ?,
rating = ?, comment = ?, dateAdded = ?
@ -182,57 +197,64 @@ update_song72 = """ UPDATE song
"""
update_song_obj = ["{AlbumId}", "{Artists}", "{Genre}", "{Title}", "{Index}", "{Runtime}", "{Year}",
"{Filename}", "{PlayCount}", "{DatePlayed}", "{Rating}", "{Comment}",
"{DateAdded}","{SongId}"
]
update_song_artist = """ INSERT OR REPLACE INTO song_artist(idArtist, idSong, idRole, iOrder, strArtist)
"{DateAdded}", "{SongId}"]
update_song_artist = """
INSERT OR REPLACE INTO song_artist(idArtist, idSong, idRole, iOrder, strArtist)
VALUES (?, ?, ?, ?, ?)
"""
update_song_artist_obj = [ "{ArtistId}","{SongId}",1,"{Index}","{Name}"
]
update_song_album = """ INSERT OR REPLACE INTO albuminfosong(idAlbumInfoSong, idAlbumInfo, iTrack,
update_song_artist_obj = ["{ArtistId}", "{SongId}", 1, "{Index}", "{Name}"]
update_song_album = """
INSERT OR REPLACE INTO albuminfosong(idAlbumInfoSong, idAlbumInfo, iTrack,
strTitle, iDuration)
VALUES (?, ?, ?, ?, ?)
"""
update_song_album_obj = [ "{SongId}","{AlbumId}","{Index}","{Title}","{Runtime}"
]
update_song_rating = """ UPDATE song
update_song_album_obj = ["{SongId}", "{AlbumId}", "{Index}", "{Title}", "{Runtime}"]
update_song_rating = """
UPDATE song
SET iTimesPlayed = ?, lastplayed = ?, rating = ?
WHERE idSong = ?
"""
update_song_rating_obj = [ "{PlayCount}","{DatePlayed}","{Rating}","{KodiId}"
]
update_genre_album = """ INSERT OR REPLACE INTO album_genre(idGenre, idAlbum)
update_song_rating_obj = ["{PlayCount}", "{DatePlayed}", "{Rating}", "{KodiId}"]
update_genre_album = """
INSERT OR REPLACE INTO album_genre(idGenre, idAlbum)
VALUES (?, ?)
"""
update_genre_song = """ INSERT OR REPLACE INTO song_genre(idGenre, idSong)
update_genre_song = """
INSERT OR REPLACE INTO song_genre(idGenre, idSong)
VALUES (?, ?)
"""
update_genre_song_obj = [ "{SongId}","{Genres}","song"
]
update_genre_song_obj = ["{SongId}", "{Genres}", "song"]
delete_genres_album = """ DELETE FROM album_genre
delete_genres_album = """
DELETE FROM album_genre
WHERE idAlbum = ?
"""
delete_genres_song = """ DELETE FROM song_genre
delete_genres_song = """
DELETE FROM song_genre
WHERE idSong = ?
"""
delete_artist = """ DELETE FROM artist
delete_artist = """
DELETE FROM artist
WHERE idArtist = ?
"""
delete_album = """ DELETE FROM album
delete_album = """
DELETE FROM album
WHERE idAlbum = ?
"""
delete_song = """ DELETE FROM song
delete_song = """
DELETE FROM song
WHERE idSong = ?
"""
get_version = """ SELECT idVersion
get_version = """
SELECT idVersion
FROM version
"""
update_versiontag = """ INSERT OR REPLACE INTO versiontagscan(idVersion, iNeedsScan)
update_versiontag = """
INSERT OR REPLACE INTO versiontagscan(idVersion, iNeedsScan)
VALUES (?, 0)
"""
get_versiontagcount = """ SELECT COUNT(*)
get_versiontagcount = """
SELECT COUNT (*)
FROM versiontagscan
"""

View file

@ -1,11 +1,12 @@
get_cache = """ SELECT cachedurl
get_cache = """
SELECT cachedurl
FROM texture
WHERE url = ?
"""
delete_cache = """ DELETE FROM texture
delete_cache = """
DELETE FROM texture
WHERE url = ?
"""

View file

@ -16,7 +16,6 @@ LOG = logging.getLogger("JELLYFIN."+__name__)
class TVShows(Kodi):
def __init__(self, cursor):
self.cursor = cursor

View file

@ -2,7 +2,6 @@
##################################################################################################
import json
import logging
import urllib
@ -10,7 +9,7 @@ import downloader as server
from obj import Objects
from kodi import Movies as KodiDb, queries as QU
from database import jellyfin_db, queries as QUEM
from helper import api, catch, stop, validate, jellyfin_item, library_check, values, settings, Local
from helper import api, stop, validate, jellyfin_item, library_check, values, settings, Local
##################################################################################################
@ -52,8 +51,7 @@ class Movies(KodiDb):
obj['MovieId'] = e_item[0]
obj['FileId'] = e_item[1]
obj['PathId'] = e_item[2]
except TypeError as error:
except TypeError:
update = False
LOG.debug("MovieId %s not found", obj['Id'])
obj['MovieId'] = self.create_entry()
@ -103,13 +101,11 @@ class Movies(KodiDb):
obj['Tags'] = tags
if update:
self.movie_update(obj)
else:
self.movie_add(obj)
self.update_path(*values(obj, QU.update_path_movie_obj))
self.update_file(*values(obj, QU.update_file_obj))
self.add_tags(*values(obj, QU.add_tags_movie_obj))
@ -192,7 +188,6 @@ class Movies(KodiDb):
}
obj['Filename'] = "%s?%s" % (obj['Path'], urllib.urlencode(params))
@stop()
@jellyfin_item()
def boxset(self, item, e_item):
@ -213,8 +208,7 @@ class Movies(KodiDb):
try:
obj['SetId'] = e_item[0]
self.update_boxset(*values(obj, QU.update_set_obj))
except TypeError as error:
except TypeError:
LOG.debug("SetId %s not found", obj['Id'])
obj['SetId'] = self.add_boxset(*values(obj, QU.add_set_obj))

View file

@ -2,15 +2,13 @@
##################################################################################################
import json
import datetime
import logging
import urllib
from obj import Objects
from kodi import Music as KodiDb, queries_music as QU
from database import jellyfin_db, queries as QUEM
from helper import api, catch, stop, validate, jellyfin_item, values, library_check, settings, Local
from helper import api, stop, validate, jellyfin_item, values, library_check, Local
##################################################################################################
@ -50,8 +48,7 @@ class Music(KodiDb):
try:
obj['ArtistId'] = e_item[0]
except TypeError as error:
except TypeError:
update = False
obj['ArtistId'] = None
LOG.debug("ArtistId %s not found", obj['Id'])
@ -77,13 +74,11 @@ class Music(KodiDb):
if obj['Backdrops']:
obj['Backdrops'] = "<fanart>%s</fanart>" % obj['Backdrops'][0]
if update:
self.artist_update(obj)
else:
self.artist_add(obj)
self.update(obj['Genre'], obj['Bio'], obj['Thumb'], obj['Backdrops'], obj['LastScraped'], obj['ArtistId'])
self.artwork.add(obj['Artwork'], obj['ArtistId'], "artist")
self.item_ids.append(obj['Id'])
@ -106,7 +101,6 @@ class Music(KodiDb):
self.jellyfin_db.update_reference(*values(obj, QUEM.update_reference_obj))
LOG.info("UPDATE artist [%s] %s: %s", obj['ArtistId'], obj['Name'], obj['Id'])
@stop()
@jellyfin_item()
def album(self, item, e_item):
@ -121,8 +115,7 @@ class Music(KodiDb):
try:
obj['AlbumId'] = e_item[0]
except TypeError as error:
except TypeError:
update = False
obj['AlbumId'] = None
LOG.debug("AlbumId %s not found", obj['Id'])
@ -144,13 +137,11 @@ class Music(KodiDb):
if obj['Thumb']:
obj['Thumb'] = "<thumb>%s</thumb>" % obj['Thumb']
if update:
self.album_update(obj)
else:
self.album_add(obj)
self.artist_link(obj)
self.artist_discography(obj)
self.update_album(*values(obj, QU.update_album_obj))
@ -217,7 +208,6 @@ class Music(KodiDb):
self.link(*values(temp_obj, QU.update_link_obj))
self.item_ids.append(temp_obj['Id'])
@stop()
@jellyfin_item()
def song(self, item, e_item):
@ -234,8 +224,7 @@ class Music(KodiDb):
obj['SongId'] = e_item[0]
obj['PathId'] = e_item[2]
obj['AlbumId'] = e_item[3]
except TypeError as error:
except TypeError:
update = False
obj['SongId'] = self.create_entry_song()
LOG.debug("SongId %s not found", obj['Id'])
@ -269,13 +258,11 @@ class Music(KodiDb):
if obj['Disc'] != 1:
obj['Index'] = obj['Disc'] * 2 ** 16 + obj['Index']
if update:
self.song_update(obj)
else:
self.song_add(obj)
self.link_song_album(*values(obj, QU.update_song_album_obj))
self.add_role(*values(obj, QU.update_role_obj)) # defaultt role
self.song_artist_link(obj)
@ -415,7 +402,6 @@ class Music(KodiDb):
obj['AlbumId'] = self.create_entry_album()
self.add_single(*values(obj, QU.add_single_obj))
@stop()
@jellyfin_item()
def userdata(self, item, e_item):

View file

@ -10,7 +10,7 @@ import urllib
from obj import Objects
from kodi import MusicVideos as KodiDb, queries as QU
from database import jellyfin_db, queries as QUEM
from helper import api, catch, stop, validate, library_check, jellyfin_item, values, Local
from helper import api, stop, validate, library_check, jellyfin_item, values, Local
##################################################################################################
@ -55,8 +55,7 @@ class MusicVideos(KodiDb):
obj['MvideoId'] = e_item[0]
obj['FileId'] = e_item[1]
obj['PathId'] = e_item[2]
except TypeError as error:
except TypeError:
update = False
LOG.debug("MvideoId for %s not found", obj['Id'])
obj['MvideoId'] = self.create_entry()
@ -114,13 +113,11 @@ class MusicVideos(KodiDb):
obj['Tags'] = tags
if update:
self.musicvideo_update(obj)
else:
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))
@ -176,7 +173,6 @@ class MusicVideos(KodiDb):
}
obj['Filename'] = "%s?%s" % (obj['Path'], urllib.urlencode(params))
@stop()
@jellyfin_item()
def userdata(self, item, e_item):

View file

@ -2,7 +2,6 @@
##################################################################################################
import json
import logging
import sqlite3
import urllib
@ -12,7 +11,7 @@ from obj import Objects
from kodi import TVShows as KodiDb, queries as QU
import downloader as server
from database import jellyfin_db, queries as QUEM
from helper import api, catch, stop, validate, jellyfin_item, library_check, settings, values, Local
from helper import api, stop, validate, jellyfin_item, library_check, settings, values, Local
##################################################################################################
@ -65,8 +64,7 @@ class TVShows(KodiDb):
try:
obj['ShowId'] = e_item[0]
obj['PathId'] = e_item[2]
except TypeError as error:
except TypeError:
update = False
LOG.debug("ShowId %s not found", obj['Id'])
obj['ShowId'] = self.create_entry()
@ -76,7 +74,6 @@ class TVShows(KodiDb):
update = False
LOG.info("ShowId %s missing from kodi. repairing the entry.", obj['ShowId'])
obj['Path'] = API.get_file_path(obj['Path'])
obj['LibraryId'] = library['Id']
obj['LibraryName'] = library['Name']
@ -107,13 +104,11 @@ class TVShows(KodiDb):
obj['Tags'] = tags
if update:
self.tvshow_update(obj)
else:
self.tvshow_add(obj)
self.link(*values(obj, QU.update_tvshow_link_obj))
self.update_path(*values(obj, QU.update_path_tvshow_obj))
self.add_tags(*values(obj, QU.add_tags_tvshow_obj))
@ -209,7 +204,6 @@ class TVShows(KodiDb):
obj['TopLevel'] = "plugin://plugin.video.jellyfin/"
obj['Path'] = "%s%s/" % (obj['TopLevel'], obj['Id'])
@stop()
def season(self, item, show_id=None):
@ -244,7 +238,6 @@ class TVShows(KodiDb):
self.artwork.add(obj['Artwork'], obj['SeasonId'], "season")
LOG.info("UPDATE season [%s/%s] %s: %s", obj['ShowId'], obj['SeasonId'], obj['Title'] or obj['Index'], obj['Id'])
@stop()
@jellyfin_item()
def episode(self, item, e_item):
@ -275,8 +268,7 @@ class TVShows(KodiDb):
obj['EpisodeId'] = e_item[0]
obj['FileId'] = e_item[1]
obj['PathId'] = e_item[2]
except TypeError as error:
except TypeError:
update = False
LOG.debug("EpisodeId %s not found", obj['Id'])
obj['EpisodeId'] = self.create_entry_episode()
@ -286,7 +278,6 @@ class TVShows(KodiDb):
update = False
LOG.info("EpisodeId %s missing from kodi. repairing the entry.", obj['EpisodeId'])
obj['Path'] = API.get_file_path(obj['Path'])
obj['Index'] = obj['Index'] or -1
obj['Writers'] = " / ".join(obj['Writers'] or [])
@ -329,13 +320,11 @@ class TVShows(KodiDb):
obj['SeasonId'] = self.get_season(*values(obj, QU.get_season_episode_obj))
if update:
self.episode_update(obj)
else:
self.episode_add(obj)
self.update_path(*values(obj, QU.update_path_episode_obj))
self.update_file(*values(obj, QU.update_file_obj))
self.add_people(*values(obj, QU.add_people_episode_obj))
@ -370,8 +359,7 @@ class TVShows(KodiDb):
try:
self.add_episode(*values(obj, QU.add_episode_obj))
except sqlite3.IntegrityError as error:
except sqlite3.IntegrityError:
LOG.error("IntegrityError for %s", obj)
obj['EpisodeId'] = self.create_entry_episode()
@ -440,7 +428,6 @@ class TVShows(KodiDb):
return True
@stop()
@jellyfin_item()
def userdata(self, item, e_item):

View file

@ -2,7 +2,6 @@
#################################################################################################
import json
import logging
import os
@ -338,7 +337,6 @@ class Player(xbmc.Player):
return
result = JSONRPC('Application.GetProperties').execute({'properties': ["volume", "muted"]})
result = result.get('result', {})
item['Volume'] = result.get('volume')
@ -415,7 +413,6 @@ class Player(xbmc.Player):
LOG.info("<[ transcode/%s ]", item['Id'])
item['Server'].jellyfin.close_transcode(item['DeviceId'])
path = xbmc.translatePath("special://profile/addon_data/plugin.video.jellyfin/temp/").decode('utf-8')
if xbmcvfs.exists(path):

View file

@ -4,9 +4,7 @@
import logging
import xbmc
from helper import _, settings, dialog, JSONRPC, compare_version
from helper import _, settings, dialog, JSONRPC
#################################################################################################

View file

@ -11,9 +11,7 @@ import xml.etree.ElementTree as etree
import xbmc
import xbmcvfs
import downloader as server
from database import Database, jellyfin_db, get_sync, save_sync
from objects.kodi import kodi
from helper import _, api, indent, write_xml, window, event
from jellyfin import Jellyfin
@ -136,6 +134,7 @@ def verify_kodi_defaults():
if not xbmcvfs.exists(playlist_path):
xbmcvfs.mkdirs(playlist_path)
class Views(object):
sync = None
@ -421,7 +420,6 @@ class Views(object):
etree.SubElement(xml, 'match')
etree.SubElement(xml, 'content')
label = xml.find('label')
label.text = str(name) if type(name) == int else name
@ -661,7 +659,6 @@ class Views(object):
else:
etree.SubElement(root, 'content').text = "episodes"
def order_media_folders(self, folders):
''' Returns a list of sorted media folders based on the Jellyfin views.

View file

@ -17,6 +17,7 @@ LOG = logging.getLogger("JELLYFIN."+__name__)
#################################################################################################
class WebService(threading.Thread):
''' Run a webservice to trigger playback.
@ -142,4 +143,3 @@ class requestHandler(BaseHTTPServer.BaseHTTPRequestHandler):
self.send_error(500, "Exception occurred: %s" % error)
return

View file

@ -19,8 +19,8 @@ sys.path.insert(0, __base__)
#################################################################################################
from entrypoint import Service
from helper import settings
from entrypoint import Service # noqa: F402
from helper import settings # noqa: F402
#################################################################################################

View file

@ -2,3 +2,7 @@
max-line-length = 9999
import-order-style = pep8
exclude = ./.git,./.vscode,./libraries
extend-ignore =
I202
per-file-ignores =
*/__init__.py: F401