Strings - translation
This commit is contained in:
parent
924c3a4a05
commit
3e1aa94c78
10 changed files with 201 additions and 252 deletions
|
@ -130,7 +130,7 @@ class Main():
|
|||
|
||||
elif mode == "texturecache":
|
||||
import artwork
|
||||
artwork.Artwork().FullTextureCacheSync()
|
||||
artwork.Artwork().fullTextureCacheSync()
|
||||
|
||||
else:
|
||||
entrypoint.doMainListing()
|
||||
|
|
|
@ -6,56 +6,23 @@
|
|||
<string id="30000">Primary Server Address</string><!-- Verified -->
|
||||
<string id="30002">Play from HTTP instead of SMB</string><!-- Verified -->
|
||||
<string id="30004">Log level</string><!-- Verified -->
|
||||
<string id="30016">Device Name</string><!-- Verified -->
|
||||
<string id="30022">Advanced</string>
|
||||
<string id="30024">Username</string><!-- Verified -->
|
||||
<string id="30030">Port Number</string><!-- Verified -->
|
||||
|
||||
<string id="30035">Number of recent Music Albums to show:</string>
|
||||
<string id="30036">Number of recent Movies to show:</string>
|
||||
<string id="30037">Number of recent TV episodes to show:</string>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<!-- Add-on settings -->
|
||||
<string id="30007">Network Username: </string>
|
||||
<string id="30008">Network Password: </string>
|
||||
<string id="30009">Transcode: </string>
|
||||
|
||||
<string id="30014">Emby</string>
|
||||
<string id="30015">Network</string>
|
||||
<string id="30016">Device Name</string>
|
||||
|
||||
<string id="30022">Advanced</string>
|
||||
|
||||
<string id="30036">Number of recent Movies to show:</string>
|
||||
<string id="30037">Number of recent TV episodes to show:</string>
|
||||
<string id="30035">Number of recent Music Albums to show:</string>
|
||||
<string id="30038">Mark watched at start of playback:</string>
|
||||
<string id="30039">Set Season poster for episodes</string>
|
||||
|
||||
<string id="30040">Genre Filter ...</string>
|
||||
<string id="30041">Play All from Here</string>
|
||||
<string id="30042">Refresh</string>
|
||||
<string id="30043">Delete</string>
|
||||
<string id="30046">Add Movie to CouchPotato</string>
|
||||
|
||||
<string id="30044">Incorrect Username/Password</string>
|
||||
<string id="30045">Username not found</string>
|
||||
|
||||
<string id="30052">Deleting</string>
|
||||
<string id="30053">Waiting for server to delete</string>
|
||||
|
||||
<string id="30059">Server Default</string>
|
||||
<string id="30060">Title</string>
|
||||
<string id="30061">Year</string>
|
||||
<string id="30062">Premiere Date</string>
|
||||
<string id="30063">Date Created</string>
|
||||
<string id="30064">Critic Rating</string>
|
||||
<string id="30065">Community Rating</string>
|
||||
<string id="30066">Play Count</string>
|
||||
<string id="30067">Budget</string>
|
||||
<!-- Runtime added as 30226 below -->
|
||||
|
||||
<string id="30068">Sort By</string>
|
||||
|
||||
<string id="30069">None</string>
|
||||
<string id="30070">Action</string>
|
||||
<string id="30071">Adventure</string>
|
||||
|
@ -80,69 +47,40 @@
|
|||
|
||||
<string id="30090">Genre Filter</string>
|
||||
<string id="30091">Confirm file deletion</string><!-- Verified -->
|
||||
<string id="30092">Delete this item? This action will delete media and associated data files.</string>
|
||||
|
||||
<string id="30093">Mark Watched</string>
|
||||
<string id="30094">Mark Unwatched</string>
|
||||
<string id="30095">Add to Favorites</string>
|
||||
<string id="30096">Remove from Favorites</string>
|
||||
<string id="30097">Sort By ...</string>
|
||||
<string id="30093">Mark watched</string>
|
||||
<string id="30094">Mark unwatched</string>
|
||||
|
||||
<string id="30097">Sort by</string>
|
||||
<string id="30098">Sort Order Descending</string>
|
||||
<string id="30099">Sort Order Ascending</string>
|
||||
<string id="30100">Show People</string>
|
||||
|
||||
<!-- resume dialog -->
|
||||
<string id="30105">Resume</string>
|
||||
<string id="30106">Resume from</string>
|
||||
<string id="30107">Start from beginning</string>
|
||||
|
||||
<string id="30110">Interface</string>
|
||||
<string id="30111">Include Stream Info</string>
|
||||
<string id="30112">Include People</string>
|
||||
<string id="30113">Include Overview</string>
|
||||
<string id="30114">Offer delete after playback</string><!-- Verified -->
|
||||
<string id="30115">For Episodes</string><!-- Verified -->
|
||||
<string id="30116">For Movies</string><!-- Verified -->
|
||||
<string id="30117">Background Art Refresh Rate (seconds)</string>
|
||||
|
||||
<string id="30118">Add Resume Percent</string>
|
||||
<string id="30119">Add Episode Number</string>
|
||||
<string id="30120">Show Load Progress</string>
|
||||
<string id="30121">Loading Content</string>
|
||||
<string id="30122">Retrieving Data</string>
|
||||
|
||||
<string id="30125">Done</string>
|
||||
<string id="30126">Processing Item : </string>
|
||||
<string id="30128">Play Error</string>
|
||||
<string id="30129">This item is not playable</string>
|
||||
<string id="30130">Local path detected</string>
|
||||
<string id="30131">Your MB3 Server contains local paths. Please change server paths to UNC or change XBMB3C setting 'Play from Stream' to true. Path: </string>
|
||||
<string id="30132">Warning</string>
|
||||
<string id="30133">Debug logging enabled.</string>
|
||||
<string id="30134">This will affect performance.</string>
|
||||
<string id="30132">Warning</string><!-- Verified -->
|
||||
<string id="30135">Error</string>
|
||||
<string id="30136">Monitoring service is not running</string>
|
||||
<string id="30137">If you have just installed please restart Kodi</string>
|
||||
<string id="30138">Search</string>
|
||||
|
||||
<string id="30139">Enable Theme Music (Requires Restart)</string>
|
||||
<string id="30140"> - Loop Theme Music</string>
|
||||
<string id="30141">Enable Background Image (Requires Restart)</string>
|
||||
<string id="30142">Services</string>
|
||||
|
||||
<string id="30150">Skin does not support setting views</string>
|
||||
<string id="30151">Select item action (Requires Restart)</string>
|
||||
|
||||
<string id="30156">Sort NextUp by Show Title</string>
|
||||
<string id="30157">Enable Enhanced Images (eg CoverArt)</string><!-- Verified -->
|
||||
<string id="30158">Metadata</string>
|
||||
<string id="30159">Artwork</string>
|
||||
<string id="30160">Video Quality</string><!-- Verified -->
|
||||
|
||||
<string id="30161">Enable Suggested Loader (Requires Restart)</string>
|
||||
<string id="30162">Add Season Number</string>
|
||||
<string id="30163">Flatten Seasons</string>
|
||||
|
||||
<string id="30164">Direct Play - HTTP</string>
|
||||
<string id="30165">Direct Play</string>
|
||||
<string id="30165">Direct Play</string><!-- Verified -->
|
||||
<string id="30166">Transcoding</string>
|
||||
<string id="30167">Server Detection Succeeded</string>
|
||||
<string id="30168">Found server</string>
|
||||
|
@ -176,39 +114,24 @@
|
|||
<string id="30194">TV Genres</string>
|
||||
<string id="30195">TV Networks</string>
|
||||
<string id="30196">TV Actors</string>
|
||||
<string id="30197">Playlists</string>
|
||||
<string id="30198">Search</string>
|
||||
<string id="30199">Set Views</string>
|
||||
|
||||
<string id="30200">Select User</string><!-- Verified -->
|
||||
<string id="30197">Playlists</string>
|
||||
|
||||
<string id="30201">Profiling enabled.</string>
|
||||
<string id="30202">Please remember to turn off when finished testing.</string>
|
||||
<string id="30203">Error in ArtworkRotationThread</string>
|
||||
<string id="30199">Set Views</string>
|
||||
<string id="30200">Select User</string><!-- Verified -->
|
||||
<string id="30204">Unable to connect to server</string>
|
||||
<string id="30205">Error in LoadMenuOptionsThread</string>
|
||||
|
||||
<string id="30206">Enable Playlists Loader (Requires Restart)</string>
|
||||
|
||||
<string id="30207">Songs</string>
|
||||
<string id="30208">Albums</string>
|
||||
<string id="30209">Album Artists</string>
|
||||
<string id="30210">Artists</string>
|
||||
<string id="30211">Music Genres</string>
|
||||
|
||||
<string id="30212">Enable Theme Videos (Requires Restart)</string>
|
||||
<string id="30213"> - Loop Theme Videos</string>
|
||||
|
||||
<string id="30216">AutoPlay remaining episodes in a season</string>
|
||||
<string id="30218">Compress Artwork</string>
|
||||
<string id="30220">Latest </string>
|
||||
<string id="30221">In Progress </string>
|
||||
<string id="30222">NextUp </string>
|
||||
|
||||
<string id="30220">Latest</string>
|
||||
<string id="30221">In Progress</string>
|
||||
<string id="30222">NextUp</string>
|
||||
<string id="30223">User Views</string>
|
||||
<string id="30224">Report Metrics</string>
|
||||
<string id="30225">Use Kodi Sorting</string>
|
||||
<string id="30226">Runtime</string>
|
||||
|
||||
|
||||
<string id="30227">Random Movies</string>
|
||||
<string id="30228">Random Episodes</string>
|
||||
<string id="30229">Random Items</string><!-- Verified -->
|
||||
|
@ -220,15 +143,9 @@
|
|||
<string id="30238">Sync Movie BoxSets</string>
|
||||
|
||||
<string id="30239">Reset local Kodi database</string><!-- Verified -->
|
||||
<string id="30240">Enable watched/resume status sync</string>
|
||||
<string id="30241">DB Sync Indication:</string>
|
||||
<string id="30242">Play Count Sync Indication:</string>
|
||||
<string id="30243">Enable HTTPS</string><!-- Verified -->
|
||||
<string id="30245">Force Transcoding Codecs</string>
|
||||
|
||||
<string id="30246">Enable Netflix style next up notification</string>
|
||||
<string id="30247"> - The number of seconds before the end to show the notification</string>
|
||||
<string id="30248">Show Emby Info dialog on play/select action</string>
|
||||
<string id="30249">Enable server connection message on startup</string><!-- Verified -->
|
||||
|
||||
<string id="30251">Recently added Home Videos</string><!-- Verified -->
|
||||
|
@ -267,12 +184,6 @@
|
|||
<string id="30411">Set custom song rating (0-5)</string>
|
||||
|
||||
<!-- add-on settings -->
|
||||
<string id="30000">Primary Server Address</string><!-- Verified -->
|
||||
<string id="30002">Play from HTTP instead of SMB</string><!-- Verified -->
|
||||
<string id="30004">Log level</string><!-- Verified -->
|
||||
<string id="30024">Username</string><!-- Verified -->
|
||||
<string id="30030">Port Number</string><!-- Verified -->
|
||||
|
||||
<string id="30500">Verify Host SSL Certificate</string>
|
||||
<string id="30501">Client SSL certificate</string>
|
||||
<string id="30502">Use alternate address</string>
|
||||
|
@ -357,5 +268,52 @@
|
|||
<string id="33039">Disable Emby music library?</string>
|
||||
<string id="33040">Direct stream the music library? Select this option if the music library will be remotely accessed.</string>
|
||||
<string id="33041">Delete file(s) from Emby Server? This will also delete the file(s) from disk!</string>
|
||||
<string id="33042">Running the caching process may take some time. Continue anyway?</string>
|
||||
<string id="33043">Artwork cache sync</string>
|
||||
<string id="33044">Reset existing artwork cache?</string>
|
||||
<string id="33045">Updating artwork cache:</string>
|
||||
<string id="33046">Waiting for all threads to exit:</string>
|
||||
<string id="33047">Kodi can't locate file:</string>
|
||||
<string id="33048">You may need to verify your network credentials in the add-on settings or use the Emby path substitution to format your path correctly (Emby dashboard > library). Stop syncing?</string>
|
||||
<string id="33049">Added:</string>
|
||||
<string id="33050">If you fail to log in too many times, the Emby server might lock your account. Proceed anyway?</string>
|
||||
<string id="33051">Live TV Channels (experimental)</string>
|
||||
<string id="33052">Live TV Recordings (experimental)</string>
|
||||
<string id="33053">Settings</string>
|
||||
<string id="33054">Add user to session</string>
|
||||
<string id="33055">Refresh Emby playlists/Video nodes</string>
|
||||
<string id="33056">Perform manual sync</string>
|
||||
<string id="33057">Repair local database (force update all content)</string>
|
||||
<string id="33058">Perform local database reset</string>
|
||||
<string id="33059">Cache all artwork</string>
|
||||
<string id="33060">Sync Emby Theme Media to Kodi</string>
|
||||
<string id="33061">Add/Remove user from the session</string>
|
||||
<string id="33062">Add user</string>
|
||||
<string id="33063">Remove user</string>
|
||||
<string id="33064">Remove user from the session</string>
|
||||
<string id="33065">Success!</string>
|
||||
<string id="33066">Removed from viewing session:</string>
|
||||
<string id="33067">Added to viewing session:</string>
|
||||
<string id="33068">Unable to add/remove user from the session.</string>
|
||||
<string id="33069">The task succeeded</string>
|
||||
<string id="33070">The task failed</string>
|
||||
<string id="33071">Direct Stream</string>
|
||||
<string id="33072">Playback method for your themes</string>
|
||||
<string id="33073">The settings file does not exist in TV Tunes. Change a setting and run the task again.</string>
|
||||
<string id="33074">Are you sure you want to reset your local Kodi database?</string>
|
||||
<string id="33075">Modify/Remove network credentials</string>
|
||||
<string id="33076">Modify</string>
|
||||
<string id="33077">Remove</string>
|
||||
<string id="33078">Removed:</string>
|
||||
<string id="33079">Enter the network username</string>
|
||||
<string id="33080">Enter the network password</string>
|
||||
<string id="33081">Added network credentials for:</string>
|
||||
<string id="33082">Input the server name or IP address as indicated in your emby library paths. For example, the server name: \\\\SERVER-PC\\path\\ is "SERVER-PC"</string>
|
||||
<string id="33083">Modify the server name or IP address</string>
|
||||
<string id="33084">Enter the server name or IP address</string>
|
||||
<string id="33085">Could not reset the database. Try again.</string>
|
||||
<string id="33086">Remove all cached artwork?</string>
|
||||
<string id="33087">Reset all Emby add-on settings?</string>
|
||||
<string id="33088">Database reset has completed, Kodi will now restart to apply the changes.</string>
|
||||
|
||||
</strings>
|
||||
</strings>
|
|
@ -30,21 +30,19 @@ log = Logging('Entrypoint').log
|
|||
#################################################################################################
|
||||
|
||||
|
||||
def doPlayback(itemid, dbid):
|
||||
def doPlayback(itemId, dbId):
|
||||
|
||||
emby = embyserver.Read_EmbyServer()
|
||||
item = emby.getItem(itemid)
|
||||
pbutils.PlaybackUtils(item).play(itemid, dbid)
|
||||
item = emby.getItem(itemId)
|
||||
pbutils.PlaybackUtils(item).play(itemId, dbId)
|
||||
|
||||
##### DO RESET AUTH #####
|
||||
def resetAuth():
|
||||
# User tried login and failed too many times
|
||||
resp = xbmcgui.Dialog().yesno(
|
||||
heading="Warning",
|
||||
line1=(
|
||||
"Emby might lock your account if you fail to log in too many times. "
|
||||
"Proceed anyway?"))
|
||||
if resp == 1:
|
||||
heading=lang(30132),
|
||||
line1=lang(33050))
|
||||
if resp:
|
||||
log("Reset login attempts.", 1)
|
||||
window('emby_serverStatus', value="Auth")
|
||||
else:
|
||||
|
@ -58,6 +56,7 @@ def addDirectoryItem(label, path, folder=True):
|
|||
xbmcplugin.addDirectoryItem(handle=int(sys.argv[1]), url=path, listitem=li, isFolder=folder)
|
||||
|
||||
def doMainListing():
|
||||
|
||||
xbmcplugin.setContent(int(sys.argv[1]), 'files')
|
||||
# Get emby nodes from the window props
|
||||
embyprops = window('Emby.nodes.total')
|
||||
|
@ -68,39 +67,54 @@ def doMainListing():
|
|||
if not path:
|
||||
path = window('Emby.nodes.%s.content' % i)
|
||||
label = window('Emby.nodes.%s.title' % i)
|
||||
node_type = window('Emby.nodes.%s.type' % i)
|
||||
#because we do not use seperate entrypoints for each content type, we need to figure out which items to show in each listing.
|
||||
#for now we just only show picture nodes in the picture library video nodes in the video library and all nodes in any other window
|
||||
if path and xbmc.getCondVisibility("Window.IsActive(Pictures)") and node_type == "photos":
|
||||
addDirectoryItem(label, path)
|
||||
elif path and xbmc.getCondVisibility("Window.IsActive(VideoLibrary)") and node_type != "photos":
|
||||
addDirectoryItem(label, path)
|
||||
elif path and not xbmc.getCondVisibility("Window.IsActive(VideoLibrary) | Window.IsActive(Pictures) | Window.IsActive(MusicLibrary)"):
|
||||
addDirectoryItem(label, path)
|
||||
node = window('Emby.nodes.%s.type' % i)
|
||||
|
||||
''' because we do not use seperate entrypoints for each content type,
|
||||
we need to figure out which items to show in each listing.
|
||||
for now we just only show picture nodes in the picture library
|
||||
video nodes in the video library and all nodes in any other window '''
|
||||
|
||||
#experimental live tv nodes
|
||||
addDirectoryItem("Live Tv Channels (experimental)", "plugin://plugin.video.emby/?mode=browsecontent&type=tvchannels&folderid=root")
|
||||
addDirectoryItem("Live Tv Recordings (experimental)", "plugin://plugin.video.emby/?mode=browsecontent&type=recordings&folderid=root")
|
||||
'''if path and xbmc.getCondVisibility("Window.IsActive(Pictures)") and node == "photos":
|
||||
addDirectoryItem(label, path)
|
||||
elif path and xbmc.getCondVisibility("Window.IsActive(VideoLibrary)")
|
||||
and node != "photos":
|
||||
addDirectoryItem(label, path)
|
||||
elif path and not xbmc.getCondVisibility("Window.IsActive(VideoLibrary) |
|
||||
Window.IsActive(Pictures) | Window.IsActive(MusicLibrary)"):
|
||||
addDirectoryItem(label, path)'''
|
||||
|
||||
if path:
|
||||
if xbmc.getCondVisibility("Window.IsActive(Pictures)") and node == "photos":
|
||||
addDirectoryItem(label, path)
|
||||
elif xbmc.getCondVisibility("Window.IsActive(VideoLibrary)") and node != "photos":
|
||||
addDirectoryItem(label, path)
|
||||
else:
|
||||
addDirectoryItem(label, path)
|
||||
|
||||
# experimental live tv nodes
|
||||
if not xbmc.getCondVisibility("Window.IsActive(Pictures)"):
|
||||
addDirectoryItem(lang(33051),
|
||||
"plugin://plugin.video.emby/?mode=browsecontent&type=tvchannels&folderid=root")
|
||||
addDirectoryItem(lang(33052),
|
||||
"plugin://plugin.video.emby/?mode=browsecontent&type=recordings&folderid=root")
|
||||
|
||||
# some extra entries for settings and stuff. TODO --> localize the labels
|
||||
addDirectoryItem("Network credentials", "plugin://plugin.video.emby/?mode=passwords")
|
||||
addDirectoryItem("Settings", "plugin://plugin.video.emby/?mode=settings")
|
||||
addDirectoryItem("Add user to session", "plugin://plugin.video.emby/?mode=adduser")
|
||||
addDirectoryItem("Refresh Emby playlists/nodes", "plugin://plugin.video.emby/?mode=refreshplaylist")
|
||||
addDirectoryItem("Perform manual sync", "plugin://plugin.video.emby/?mode=manualsync")
|
||||
addDirectoryItem("Repair local database (force update all content)", "plugin://plugin.video.emby/?mode=repair")
|
||||
addDirectoryItem("Perform local database reset (full resync)", "plugin://plugin.video.emby/?mode=reset")
|
||||
addDirectoryItem("Cache all images to Kodi texture cache", "plugin://plugin.video.emby/?mode=texturecache")
|
||||
addDirectoryItem("Sync Emby Theme Media to Kodi", "plugin://plugin.video.emby/?mode=thememedia")
|
||||
addDirectoryItem(lang(30517), "plugin://plugin.video.emby/?mode=passwords")
|
||||
addDirectoryItem(lang(33053), "plugin://plugin.video.emby/?mode=settings")
|
||||
addDirectoryItem(lang(33054), "plugin://plugin.video.emby/?mode=adduser")
|
||||
addDirectoryItem(lang(33055), "plugin://plugin.video.emby/?mode=refreshplaylist")
|
||||
addDirectoryItem(lang(33056), "plugin://plugin.video.emby/?mode=manualsync")
|
||||
addDirectoryItem(lang(33057), "plugin://plugin.video.emby/?mode=repair")
|
||||
addDirectoryItem(lang(33058), "plugin://plugin.video.emby/?mode=reset")
|
||||
addDirectoryItem(lang(33059), "plugin://plugin.video.emby/?mode=texturecache")
|
||||
addDirectoryItem(lang(33060), "plugin://plugin.video.emby/?mode=thememedia")
|
||||
|
||||
xbmcplugin.endOfDirectory(int(sys.argv[1]))
|
||||
|
||||
|
||||
##### Generate a new deviceId
|
||||
def resetDeviceId():
|
||||
|
||||
dialog = xbmcgui.Dialog()
|
||||
language = utils.language
|
||||
|
||||
deviceId_old = window('emby_deviceId')
|
||||
try:
|
||||
|
@ -109,8 +123,8 @@ def resetDeviceId():
|
|||
except Exception as e:
|
||||
log("Failed to generate a new device Id: %s" % e, 1)
|
||||
dialog.ok(
|
||||
heading="Emby for Kodi",
|
||||
line1=language(33032))
|
||||
heading=lang(29999),
|
||||
line1=lang(33032))
|
||||
else:
|
||||
log("Successfully removed old deviceId: %s New deviceId: %s" % (deviceId_old, deviceId), 1)
|
||||
dialog.ok(
|
||||
|
@ -123,21 +137,21 @@ def deleteItem():
|
|||
|
||||
# Serves as a keymap action
|
||||
if xbmc.getInfoLabel('ListItem.Property(embyid)'): # If we already have the embyid
|
||||
embyid = xbmc.getInfoLabel('ListItem.Property(embyid)')
|
||||
itemId = xbmc.getInfoLabel('ListItem.Property(embyid)')
|
||||
else:
|
||||
dbid = xbmc.getInfoLabel('ListItem.DBID')
|
||||
itemtype = xbmc.getInfoLabel('ListItem.DBTYPE')
|
||||
dbId = xbmc.getInfoLabel('ListItem.DBID')
|
||||
itemType = xbmc.getInfoLabel('ListItem.DBTYPE')
|
||||
|
||||
if not itemtype:
|
||||
if not itemType:
|
||||
|
||||
if xbmc.getCondVisibility('Container.Content(albums)'):
|
||||
itemtype = "album"
|
||||
itemType = "album"
|
||||
elif xbmc.getCondVisibility('Container.Content(artists)'):
|
||||
itemtype = "artist"
|
||||
itemType = "artist"
|
||||
elif xbmc.getCondVisibility('Container.Content(songs)'):
|
||||
itemtype = "song"
|
||||
itemType = "song"
|
||||
elif xbmc.getCondVisibility('Container.Content(pictures)'):
|
||||
itemtype = "picture"
|
||||
itemType = "picture"
|
||||
else:
|
||||
log("Unknown type, unable to proceed.", 1)
|
||||
return
|
||||
|
@ -145,7 +159,7 @@ def deleteItem():
|
|||
embyconn = utils.kodiSQL('emby')
|
||||
embycursor = embyconn.cursor()
|
||||
emby_db = embydb.Embydb_Functions(embycursor)
|
||||
item = emby_db.getItem_byKodiId(dbid, itemtype)
|
||||
item = emby_db.getItem_byKodiId(dbId, itemType)
|
||||
embycursor.close()
|
||||
|
||||
try:
|
||||
|
@ -156,17 +170,13 @@ def deleteItem():
|
|||
|
||||
if settings('skipContextMenu') != "true":
|
||||
resp = xbmcgui.Dialog().yesno(
|
||||
heading="Confirm delete",
|
||||
line1=("Delete file from Emby Server? This will "
|
||||
"also delete the file(s) from disk!"))
|
||||
heading=lang(29999),
|
||||
line1=lang(33041))
|
||||
if not resp:
|
||||
log("User skipped deletion for: %s." % embyid, 1)
|
||||
log("User skipped deletion for: %s." % itemId, 1)
|
||||
return
|
||||
|
||||
doUtils = downloadutils.DownloadUtils()
|
||||
url = "{server}/emby/Items/%s?format=json" % embyid
|
||||
log("Deleting request: %s" % embyid, 0)
|
||||
doUtils.downloadUrl(url, action_type="DELETE")
|
||||
embyserver.Read_EmbyServer().deleteItem(itemId)
|
||||
|
||||
##### ADD ADDITIONAL USERS #####
|
||||
def addUser():
|
||||
|
@ -203,7 +213,7 @@ def addUser():
|
|||
# Display dialog if there's additional users
|
||||
if additionalUsers:
|
||||
|
||||
option = dialog.select("Add/Remove user from the session", ["Add user", "Remove user"])
|
||||
option = dialog.select(lang(33061), [lang(33062), lang(33063)])
|
||||
# Users currently in the session
|
||||
additionalUserlist = {}
|
||||
additionalUsername = []
|
||||
|
@ -216,15 +226,15 @@ def addUser():
|
|||
|
||||
if option == 1:
|
||||
# User selected Remove user
|
||||
resp = dialog.select("Remove user from the session", additionalUsername)
|
||||
resp = dialog.select(lang(33064), additionalUsername)
|
||||
if resp > -1:
|
||||
selected = additionalUsername[resp]
|
||||
selected_userId = additionalUserlist[selected]
|
||||
url = "{server}/emby/Sessions/%s/Users/%s" % (sessionId, selected_userId)
|
||||
doUtils.downloadUrl(url, postBody={}, action_type="DELETE")
|
||||
dialog.notification(
|
||||
heading="Success!",
|
||||
message="%s removed from viewing session" % selected,
|
||||
heading=lang(29999),
|
||||
message="%s %s" % (lang(33066), selected),
|
||||
icon="special://home/addons/plugin.video.emby/icon.png",
|
||||
time=1000)
|
||||
|
||||
|
@ -256,16 +266,16 @@ def addUser():
|
|||
url = "{server}/emby/Sessions/%s/Users/%s" % (sessionId, selected_userId)
|
||||
doUtils.downloadUrl(url, postBody={}, action_type="POST")
|
||||
dialog.notification(
|
||||
heading="Success!",
|
||||
message="%s added to viewing session" % selected,
|
||||
heading=lang(29999),
|
||||
message="%s %s" % (lang(33067), selected),
|
||||
icon="special://home/addons/plugin.video.emby/icon.png",
|
||||
time=1000)
|
||||
|
||||
except:
|
||||
log("Failed to add user to session.")
|
||||
dialog.notification(
|
||||
heading="Error",
|
||||
message="Unable to add/remove user from the session.",
|
||||
heading=lang(29999),
|
||||
message=lang(33068),
|
||||
icon=xbmcgui.NOTIFICATION_ERROR)
|
||||
|
||||
# Add additional user images
|
||||
|
@ -297,7 +307,7 @@ def getThemeMedia():
|
|||
playback = None
|
||||
|
||||
# Choose playback method
|
||||
resp = dialog.select("Playback method for your themes", ["Direct Play", "Direct Stream"])
|
||||
resp = dialog.select(lang(33072), [lang(30165), lang(33071)])
|
||||
if resp == 0:
|
||||
playback = "DirectPlay"
|
||||
elif resp == 1:
|
||||
|
@ -322,11 +332,7 @@ def getThemeMedia():
|
|||
else:
|
||||
# if it does not exist this will not work so warn user
|
||||
# often they need to edit the settings first for it to be created.
|
||||
dialog.ok(
|
||||
heading="Warning",
|
||||
line1=(
|
||||
"The settings file does not exist in tvtunes. ",
|
||||
"Go to the tvtunes addon and change a setting, then come back and re-run."))
|
||||
dialog.ok(heading=lang(29999), line1=lang(33073))0
|
||||
xbmc.executebuiltin('Addon.OpenSettings(script.tvtunes)')
|
||||
return
|
||||
|
||||
|
@ -442,8 +448,8 @@ def getThemeMedia():
|
|||
nfo_file.close()
|
||||
|
||||
dialog.notification(
|
||||
heading="Emby for Kodi",
|
||||
message="Themes added!",
|
||||
heading=lang(29999),
|
||||
message=lang(33069),
|
||||
icon="special://home/addons/plugin.video.emby/icon.png",
|
||||
time=1000,
|
||||
sound=False)
|
||||
|
@ -461,8 +467,8 @@ def refreshPlaylist():
|
|||
# Refresh views
|
||||
lib.refreshViews()
|
||||
dialog.notification(
|
||||
heading="Emby for Kodi",
|
||||
message="Emby playlists/nodes refreshed",
|
||||
heading=lang(29999),
|
||||
message=lang(33069),
|
||||
icon="special://home/addons/plugin.video.emby/icon.png",
|
||||
time=1000,
|
||||
sound=False)
|
||||
|
@ -470,8 +476,8 @@ def refreshPlaylist():
|
|||
except Exception as e:
|
||||
log("Refresh playlists/nodes failed: %s" % e, 1)
|
||||
dialog.notification(
|
||||
heading="Emby for Kodi",
|
||||
message="Emby playlists/nodes refresh failed",
|
||||
heading=lang(29999),
|
||||
message=lang(33070),
|
||||
icon=xbmcgui.NOTIFICATION_ERROR,
|
||||
time=1000,
|
||||
sound=False)
|
||||
|
|
|
@ -212,13 +212,8 @@ class Items(object):
|
|||
# Verify if direct path is accessible or not
|
||||
if window('emby_pathverified') != "true" and not xbmcvfs.exists(path):
|
||||
resp = xbmcgui.Dialog().yesno(
|
||||
heading="Can't validate path",
|
||||
line1=(
|
||||
"Kodi can't locate file: %s. "
|
||||
"You may need to verify your network credentials in the "
|
||||
"add-on settings or use the Emby path substitution "
|
||||
"to format your path correctly (Emby dashboard > library). "
|
||||
"Stop syncing?" % path))
|
||||
heading=lang(29999),
|
||||
line1="%s %s. %s" % (lang(33047), path, lang(33048)))
|
||||
if resp:
|
||||
window('emby_shouldStop', value="true")
|
||||
return False
|
||||
|
@ -230,8 +225,8 @@ class Items(object):
|
|||
if time:
|
||||
# It's possible for the time to be 0. It should be considered disabled in this case.
|
||||
xbmcgui.Dialog().notification(
|
||||
heading="Emby for Kodi",
|
||||
message="Added: %s" % name,
|
||||
heading=lang(29999),
|
||||
message="%s %s" % (lang(33049), name),
|
||||
icon="special://home/addons/plugin.video.emby/icon.png",
|
||||
time=time,
|
||||
sound=False)
|
||||
|
@ -571,9 +566,7 @@ class Movies(Items):
|
|||
try:
|
||||
movieid = emby_dbitem[0]
|
||||
fileid = emby_dbitem[1]
|
||||
log(
|
||||
"Update playstate for movie: %s fileid: %s"
|
||||
% (item['Name'], fileid), 1)
|
||||
log("Update playstate for movie: %s fileid: %s" % (item['Name'], fileid), 1)
|
||||
except TypeError:
|
||||
return
|
||||
|
||||
|
@ -2373,19 +2366,19 @@ class Music(Items):
|
|||
|
||||
log("Deleted %s: %s from kodi database" % (mediatype, itemid), 1)
|
||||
|
||||
def removeSong(self, kodiid):
|
||||
def removeSong(self, kodiId):
|
||||
|
||||
kodicursor = self.kodicursor
|
||||
|
||||
self.artwork.deleteArtwork(kodiid, "song", self.kodicursor)
|
||||
self.kodicursor.execute("DELETE FROM song WHERE idSong = ?", (kodiid,))
|
||||
self.artwork.deleteArtwork(kodiId, "song", self.kodicursor)
|
||||
self.kodicursor.execute("DELETE FROM song WHERE idSong = ?", (kodiId,))
|
||||
|
||||
def removeAlbum(self, kodiid):
|
||||
def removeAlbum(self, kodiId):
|
||||
|
||||
self.artwork.deleteArtwork(kodiid, "album", self.kodicursor)
|
||||
self.kodicursor.execute("DELETE FROM album WHERE idAlbum = ?", (kodiid,))
|
||||
self.artwork.deleteArtwork(kodiId, "album", self.kodicursor)
|
||||
self.kodicursor.execute("DELETE FROM album WHERE idAlbum = ?", (kodiId,))
|
||||
|
||||
def removeArtist(self, kodiid):
|
||||
def removeArtist(self, kodiId):
|
||||
|
||||
self.artwork.deleteArtwork(kodiid, "artist", self.kodicursor)
|
||||
self.kodicursor.execute("DELETE FROM artist WHERE idArtist = ?", (kodiid,))
|
||||
self.artwork.deleteArtwork(kodiId, "artist", self.kodicursor)
|
||||
self.kodicursor.execute("DELETE FROM artist WHERE idArtist = ?", (kodiId,))
|
|
@ -94,7 +94,7 @@ class KodiMonitor(xbmc.Monitor):
|
|||
try:
|
||||
itemid = emby_dbitem[0]
|
||||
except TypeError:
|
||||
log("No kodiid returned.", 1)
|
||||
log("No kodiId returned.", 1)
|
||||
else:
|
||||
url = "{server}/emby/Users/{UserId}/Items/%s?format=json" % itemid
|
||||
result = doUtils.downloadUrl(url)
|
||||
|
|
|
@ -320,7 +320,7 @@ class LibrarySync(threading.Thread):
|
|||
window('emby_initialScan', clear=True)
|
||||
if forceddialog:
|
||||
xbmcgui.Dialog().notification(
|
||||
heading="Emby for Kodi",
|
||||
heading=lang(29999),
|
||||
message="%s %s %s" %
|
||||
(message, lang(33025), str(elapsedtotal).split('.')[0]),
|
||||
icon="special://home/addons/plugin.video.emby/icon.png",
|
||||
|
@ -541,7 +541,7 @@ class LibrarySync(threading.Thread):
|
|||
self.vnodes.singleNode(totalnodes, "channels", "movies", "channels")
|
||||
totalnodes += 1
|
||||
# Save total
|
||||
utils.window('Emby.nodes.total', str(totalnodes))
|
||||
window('Emby.nodes.total', str(totalnodes))
|
||||
|
||||
# Remove any old referenced views
|
||||
log("Removing views: %s" % current_views, 1)
|
||||
|
@ -567,7 +567,7 @@ class LibrarySync(threading.Thread):
|
|||
# Get items per view
|
||||
if pdialog:
|
||||
pdialog.update(
|
||||
heading="Emby for Kodi",
|
||||
heading=lang(29999),
|
||||
message="%s %s..." % (lang(33017), view['name']))
|
||||
|
||||
# Initial or repair sync
|
||||
|
@ -596,7 +596,7 @@ class LibrarySync(threading.Thread):
|
|||
|
||||
##### PROCESS BOXSETS #####
|
||||
if pdialog:
|
||||
pdialog.update(heading="Emby for Kodi", message=lang(33018))
|
||||
pdialog.update(heading=lang(29999), message=lang(33018))
|
||||
|
||||
boxsets = self.emby.getBoxset(dialog=pdialog)
|
||||
total = boxsets['TotalRecordCount']
|
||||
|
@ -642,7 +642,7 @@ class LibrarySync(threading.Thread):
|
|||
|
||||
if pdialog:
|
||||
pdialog.update(
|
||||
heading="Emby for Kodi",
|
||||
heading=lang(29999),
|
||||
message="%s %s..." % (lang(33019), viewName))
|
||||
|
||||
# Initial or repair sync
|
||||
|
@ -688,7 +688,7 @@ class LibrarySync(threading.Thread):
|
|||
# Get items per view
|
||||
if pdialog:
|
||||
pdialog.update(
|
||||
heading="Emby for Kodi",
|
||||
heading=lang(29999),
|
||||
message="%s %s..." % (lang(33020), view['name']))
|
||||
|
||||
all_embytvshows = self.emby.getShows(view['id'], dialog=pdialog)
|
||||
|
@ -743,7 +743,7 @@ class LibrarySync(threading.Thread):
|
|||
|
||||
if pdialog:
|
||||
pdialog.update(
|
||||
heading="Emby for Kodi",
|
||||
heading=lang(29999),
|
||||
message="%s %s..." % (lang(33021), itemtype))
|
||||
|
||||
all_embyitems = process[itemtype][0](dialog=pdialog)
|
||||
|
@ -900,13 +900,13 @@ class LibrarySync(threading.Thread):
|
|||
except Exception as e:
|
||||
window('emby_dbScan', clear=True)
|
||||
xbmcgui.Dialog().ok(
|
||||
heading="Emby for Kodi",
|
||||
heading=lang(29999),
|
||||
line1=(
|
||||
"Library sync thread has exited! "
|
||||
"You should restart Kodi now. "
|
||||
"Please report this on the forum."))
|
||||
raise
|
||||
|
||||
@utils.profiling()
|
||||
def run_internal(self):
|
||||
|
||||
dialog = xbmcgui.Dialog()
|
||||
|
@ -934,10 +934,10 @@ class LibrarySync(threading.Thread):
|
|||
log("Database version out of date: %s minimum version required: %s"
|
||||
% (currentVersion, minVersion), 0)
|
||||
|
||||
resp = dialog.yesno("Emby for Kodi", lang(33022))
|
||||
resp = dialog.yesno(lang(29999), lang(33022))
|
||||
if not resp:
|
||||
log("Database version is out of date! USER IGNORED!", 0)
|
||||
dialog.ok("Emby for Kodi", lang(33023))
|
||||
dialog.ok(lang(29999), lang(33023))
|
||||
else:
|
||||
utils.reset()
|
||||
|
||||
|
@ -958,7 +958,7 @@ class LibrarySync(threading.Thread):
|
|||
"to know which Kodi versions are supported.", 0)
|
||||
|
||||
dialog.ok(
|
||||
heading="Emby for Kodi",
|
||||
heading=lang(29999),
|
||||
line1=lang(33024))
|
||||
break
|
||||
|
||||
|
@ -1060,7 +1060,7 @@ class ManualSync(LibrarySync):
|
|||
|
||||
if pdialog:
|
||||
pdialog.update(
|
||||
heading="Emby for Kodi",
|
||||
heading=lang(29999),
|
||||
message="%s %s..." % (lang(33026), viewName))
|
||||
|
||||
all_embymovies = self.emby.getMovies(viewId, basic=True, dialog=pdialog)
|
||||
|
@ -1104,7 +1104,7 @@ class ManualSync(LibrarySync):
|
|||
embyboxsets = []
|
||||
|
||||
if pdialog:
|
||||
pdialog.update(heading="Emby for Kodi", message=lang(33027))
|
||||
pdialog.update(heading=lang(29999), message=lang(33027))
|
||||
|
||||
for boxset in boxsets['Items']:
|
||||
|
||||
|
@ -1183,7 +1183,7 @@ class ManualSync(LibrarySync):
|
|||
|
||||
if pdialog:
|
||||
pdialog.update(
|
||||
heading="Emby for Kodi",
|
||||
heading=lang(29999),
|
||||
message="%s %s..." % (lang(33028), viewName))
|
||||
|
||||
all_embymvideos = self.emby.getMusicVideos(viewId, basic=True, dialog=pdialog)
|
||||
|
@ -1269,7 +1269,7 @@ class ManualSync(LibrarySync):
|
|||
|
||||
if pdialog:
|
||||
pdialog.update(
|
||||
heading="Emby for Kodi",
|
||||
heading=lang(29999),
|
||||
message="%s %s..." % (lang(33029), viewName))
|
||||
|
||||
all_embytvshows = self.emby.getShows(viewId, basic=True, dialog=pdialog)
|
||||
|
@ -1314,7 +1314,7 @@ class ManualSync(LibrarySync):
|
|||
# Get all episodes in view
|
||||
if pdialog:
|
||||
pdialog.update(
|
||||
heading="Emby for Kodi",
|
||||
heading=lang(29999),
|
||||
message="%s %s..." % (lang(33030), viewName))
|
||||
|
||||
all_embyepisodes = self.emby.getEpisodes(viewId, basic=True, dialog=pdialog)
|
||||
|
@ -1402,7 +1402,7 @@ class ManualSync(LibrarySync):
|
|||
for data_type in ['artists', 'albums', 'songs']:
|
||||
if pdialog:
|
||||
pdialog.update(
|
||||
heading="Emby for Kodi",
|
||||
heading=lang(29999),
|
||||
message="%s %s..." % (lang(33031), data_type))
|
||||
if data_type != "artists":
|
||||
all_embyitems = process[data_type][0](basic=True, dialog=pdialog)
|
||||
|
|
|
@ -135,7 +135,7 @@ class PlayUtils():
|
|||
# Let the user know that direct play failed
|
||||
settings('failCount', value=str(count+1))
|
||||
dialog.notification(
|
||||
heading="Emby for Kodi",
|
||||
heading=lang(29999),
|
||||
message=lang(33011),
|
||||
icon="special://home/addons/plugin.video.emby/icon.png",
|
||||
sound=False)
|
||||
|
@ -144,7 +144,7 @@ class PlayUtils():
|
|||
settings('playFromStream', value="true")
|
||||
settings('failCount', value="0")
|
||||
dialog.notification(
|
||||
heading="Emby for Kodi",
|
||||
heading=lang(29999),
|
||||
message=lang(33012),
|
||||
icon="special://home/addons/plugin.video.emby/icon.png",
|
||||
sound=False)
|
||||
|
|
|
@ -221,7 +221,7 @@ class UserClient(threading.Thread):
|
|||
log("Access is granted.", 1)
|
||||
self.HasAccess = True
|
||||
window('emby_serverStatus', clear=True)
|
||||
xbmcgui.Dialog().notification("Emby for Kodi", lang(33007))
|
||||
xbmcgui.Dialog().notification(lang(29999), lang(33007))
|
||||
|
||||
def loadCurrUser(self, authenticated=False):
|
||||
|
||||
|
@ -350,7 +350,7 @@ class UserClient(threading.Thread):
|
|||
|
||||
if accessToken is not None:
|
||||
self.currUser = username
|
||||
dialog.notification("Emby for Kodi",
|
||||
dialog.notification(lang(29999),
|
||||
"%s %s!" % (lang(33000), self.currUser.decode('utf-8')))
|
||||
settings('accessToken', value=accessToken)
|
||||
settings('userId%s' % username, value=result['User']['Id'])
|
||||
|
|
|
@ -260,7 +260,7 @@ def reset():
|
|||
|
||||
dialog = xbmcgui.Dialog()
|
||||
|
||||
if not dialog.yesno("Warning", "Are you sure you want to reset your local Kodi database?"):
|
||||
if not dialog.yesno(language(29999), language(33074)):
|
||||
return
|
||||
|
||||
# first stop any db sync
|
||||
|
@ -270,7 +270,7 @@ def reset():
|
|||
log("Sync is running, will retry: %s..." % count)
|
||||
count -= 1
|
||||
if count == 0:
|
||||
dialog.ok("Warning", "Could not stop the database from running. Try again.")
|
||||
dialog.ok(language(29999), language(33085))
|
||||
return
|
||||
xbmc.sleep(1000)
|
||||
|
||||
|
@ -322,7 +322,7 @@ def reset():
|
|||
cursor.close()
|
||||
|
||||
# Offer to wipe cached thumbnails
|
||||
resp = dialog.yesno("Warning", "Remove all cached artwork?")
|
||||
resp = dialog.yesno(language(29999), language(33086))
|
||||
if resp:
|
||||
log("Resetting all cached artwork.", 0)
|
||||
# Remove all existing textures first
|
||||
|
@ -353,7 +353,7 @@ def reset():
|
|||
settings('SyncInstallRunDone', value="false")
|
||||
|
||||
# Remove emby info
|
||||
resp = dialog.yesno("Warning", "Reset all Emby Addon settings?")
|
||||
resp = dialog.yesno(language(29999), language(33087))
|
||||
if resp:
|
||||
# Delete the settings
|
||||
addon = xbmcaddon.Addon()
|
||||
|
@ -362,9 +362,7 @@ def reset():
|
|||
xbmcvfs.delete(dataPath)
|
||||
log("Deleting: settings.xml", 1)
|
||||
|
||||
dialog.ok(
|
||||
heading="Emby for Kodi",
|
||||
line1="Database reset has completed, Kodi will now restart to apply the changes.")
|
||||
dialog.ok(heading=language(29999), line1=language(33088))
|
||||
xbmc.executebuiltin('RestartApp')
|
||||
|
||||
def sourcesXML():
|
||||
|
@ -424,7 +422,7 @@ def passwordsXML():
|
|||
credentials = settings('networkCreds')
|
||||
if credentials:
|
||||
# Present user with options
|
||||
option = dialog.select("Modify/Remove network credentials", ["Modify", "Remove"])
|
||||
option = dialog.select(language(33075), [language(33076), language(33077)])
|
||||
|
||||
if option < 0:
|
||||
# User cancelled dialog
|
||||
|
@ -444,8 +442,8 @@ def passwordsXML():
|
|||
|
||||
settings('networkCreds', value="")
|
||||
xbmcgui.Dialog().notification(
|
||||
heading="Emby for Kodi",
|
||||
message="%s removed from passwords.xml" % credentials,
|
||||
heading=language(29999),
|
||||
message="%s %s" % (language(33078), credentials),
|
||||
icon="special://home/addons/plugin.video.emby/icon.png",
|
||||
time=1000,
|
||||
sound=False)
|
||||
|
@ -453,28 +451,22 @@ def passwordsXML():
|
|||
|
||||
elif option == 0:
|
||||
# User selected to modify
|
||||
server = dialog.input("Modify the computer name or ip address", credentials)
|
||||
server = dialog.input(language(33083), credentials)
|
||||
if not server:
|
||||
return
|
||||
else:
|
||||
# No credentials added
|
||||
dialog.ok(
|
||||
heading="Network credentials",
|
||||
line1= (
|
||||
"Input the server name or IP address as indicated in your emby library paths. "
|
||||
'For example, the server name: \\\\SERVER-PC\\path\\ is "SERVER-PC".'))
|
||||
server = dialog.input("Enter the server name or IP address")
|
||||
dialog.ok(heading=language(29999), line1=language(33082))
|
||||
server = dialog.input(language(33084))
|
||||
if not server:
|
||||
return
|
||||
|
||||
# Network username
|
||||
user = dialog.input("Enter the network username")
|
||||
user = dialog.input(language(33079))
|
||||
if not user:
|
||||
return
|
||||
# Network password
|
||||
password = dialog.input(
|
||||
heading="Enter the network password",
|
||||
option=xbmcgui.ALPHANUM_HIDE_INPUT)
|
||||
password = dialog.input(heading=language(33080), option=xbmcgui.ALPHANUM_HIDE_INPUT)
|
||||
if not password:
|
||||
return
|
||||
|
||||
|
@ -503,8 +495,8 @@ def passwordsXML():
|
|||
etree.ElementTree(root).write(xmlpath)
|
||||
|
||||
dialog.notification(
|
||||
heading="Emby for Kodi",
|
||||
message="%s added to passwords.xml" % server,
|
||||
heading=language(29999),
|
||||
message="%s %s" % (language(33081), server),
|
||||
icon="special://home/addons/plugin.video.emby/icon.png",
|
||||
time=1000,
|
||||
sound=False)
|
||||
|
|
|
@ -80,7 +80,7 @@ class WebSocket_Client(threading.Thread):
|
|||
|
||||
if command == "PlayNow":
|
||||
dialog.notification(
|
||||
heading="Emby for Kodi",
|
||||
heading=lang(29999),
|
||||
message="%s %s" % (len(itemIds), lang(33004)),
|
||||
icon="special://home/addons/plugin.video.emby/icon.png",
|
||||
sound=False)
|
||||
|
@ -89,7 +89,7 @@ class WebSocket_Client(threading.Thread):
|
|||
|
||||
elif command == "PlayNext":
|
||||
dialog.notification(
|
||||
heading="Emby for Kodi",
|
||||
heading=lang(29999),
|
||||
message="%s %s" % (len(itemIds), lang(33005)),
|
||||
icon="special://home/addons/plugin.video.emby/icon.png",
|
||||
sound=False)
|
||||
|
@ -244,7 +244,7 @@ class WebSocket_Client(threading.Thread):
|
|||
elif messageType == "ServerRestarting":
|
||||
if settings('supressRestartMsg') == "true":
|
||||
dialog.notification(
|
||||
heading="Emby for Kodi",
|
||||
heading=lang(29999),
|
||||
message=lang(33006),
|
||||
icon="special://home/addons/plugin.video.emby/icon.png")
|
||||
|
||||
|
|
Loading…
Reference in a new issue