Merge branch 'develop' of https://github.com/MediaBrowser/Emby.Kodi into develop

This commit is contained in:
tomkat83 2016-08-29 18:44:27 +02:00
commit 6aab9df054
25 changed files with 2720 additions and 378 deletions

View file

@ -1,7 +1,8 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
############################################################################### #################################################################################################
import logging
import os import os
import sys import sys
import urlparse import urlparse
@ -10,166 +11,165 @@ import xbmc
import xbmcaddon import xbmcaddon
import xbmcgui import xbmcgui
#################################################################################################
_addon = xbmcaddon.Addon(id='plugin.video.plexkodiconnect') _addon = xbmcaddon.Addon(id='plugin.video.emby')
try: _addon_path = _addon.getAddonInfo('path').decode('utf-8')
addon_path = _addon.getAddonInfo('path').decode('utf-8') _base_resource = xbmc.translatePath(os.path.join(_addon_path, 'resources', 'lib')).decode('utf-8')
except TypeError: sys.path.append(_base_resource)
addon_path = _addon.getAddonInfo('path').decode()
try:
base_resource = xbmc.translatePath(os.path.join(
addon_path,
'resources',
'lib')).decode('utf-8')
except TypeError:
base_resource = xbmc.translatePath(os.path.join(
addon_path,
'resources',
'lib')).decode()
sys.path.append(base_resource)
import utils #################################################################################################
import api
import artwork import artwork
import clientinfo
import downloadutils import downloadutils
import librarysync import librarysync
import read_embyserver as embyserver import read_embyserver as embyserver
import embydb_functions as embydb import embydb_functions as embydb
import kodidb_functions as kodidb import kodidb_functions as kodidb
import musicutils as musicutils import musicutils as musicutils
from utils import settings, language as lang, kodiSQL
import PlexFunctions as PF #################################################################################################
import PlexAPI
import loghandler
def logMsg(msg, lvl=1): loghandler.config()
utils.logMsg("%s %s" % ("PlexKodiConnect", "Contextmenu"), msg, lvl) log = logging.getLogger("EMBY.contextmenu")
#################################################################################################
# Kodi contextmenu item to configure the emby settings # Kodi contextmenu item to configure the emby settings
#for now used to set ratings but can later be used to sync individual items etc.
if __name__ == '__main__': if __name__ == '__main__':
itemid = utils.tryDecode(xbmc.getInfoLabel("ListItem.DBID"))
itemtype = utils.tryDecode(xbmc.getInfoLabel("ListItem.DBTYPE")) kodiId = xbmc.getInfoLabel('ListItem.DBID').decode('utf-8')
itemType = xbmc.getInfoLabel('ListItem.DBTYPE').decode('utf-8')
itemId = ""
if not itemType:
if xbmc.getCondVisibility("Container.Content(albums)"):
itemType = "album"
elif xbmc.getCondVisibility("Container.Content(artists)"):
itemType = "artist"
elif xbmc.getCondVisibility("Container.Content(songs)"):
itemType = "song"
elif xbmc.getCondVisibility("Container.Content(pictures)"):
itemType = "picture"
else:
log.info("ItemType is unknown.")
if (not kodiId or kodiId == "-1") and xbmc.getInfoLabel("ListItem.Property(embyid)"):
itemId = xbmc.getInfoLabel("ListItem.Property(embyid)")
elif kodiId and itemType:
embyconn = kodiSQL('emby')
embycursor = embyconn.cursor()
emby_db = embydb.Embydb_Functions(embycursor)
item = emby_db.getItem_byKodiId(kodiId, itemType)
embycursor.close()
try:
itemId = item[0]
except TypeError:
pass
log.info("Found ItemId: %s ItemType: %s" % (itemId, itemType))
if itemId:
dialog = xbmcgui.Dialog()
emby = embyserver.Read_EmbyServer() emby = embyserver.Read_EmbyServer()
item = emby.getItem(itemId)
plexid = "" API = api.API(item)
if not itemtype and xbmc.getCondVisibility("Container.Content(albums)"): itemtype = "album"
if not itemtype and xbmc.getCondVisibility("Container.Content(artists)"): itemtype = "artist"
if not itemtype and xbmc.getCondVisibility("Container.Content(songs)"): itemtype = "song"
if not itemtype and xbmc.getCondVisibility("Container.Content(pictures)"): itemtype = "picture"
if (not itemid or itemid == "-1") and xbmc.getInfoLabel("ListItem.Property(plexid)"):
plexid = xbmc.getInfoLabel("ListItem.Property(plexid)")
else:
with embydb.GetEmbyDB() as emby_db:
item = emby_db.getItem_byKodiId(itemid, itemtype)
if item:
plexid = item[0]
logMsg("Contextmenu opened for plexid: %s - itemtype: %s" %(plexid,itemtype))
if plexid:
item = PF.GetPlexMetadata(plexid)
if item is None or item == 401:
logMsg('Could not get item metadata for item %s' % plexid, -1)
return
API = PlexAPI.API(item[0])
userdata = API.getUserData() userdata = API.getUserData()
likes = userdata['Likes'] likes = userdata['Likes']
favourite = userdata['Favorite'] favourite = userdata['Favorite']
options = [] options = []
if likes == True:
#clear like for the item if favourite:
options.append(utils.language(30402))
if likes == False or likes == None:
#Like the item
options.append(utils.language(30403))
if likes == True or likes == None:
#Dislike the item
options.append(utils.language(30404))
if favourite == False:
#Add to emby favourites
options.append(utils.language(30405))
if favourite == True:
# Remove from emby favourites # Remove from emby favourites
options.append(utils.language(30406)) options.append(lang(30406))
if itemtype == "song": else:
# Add to emby favourites
options.append(lang(30405))
if itemType == "song":
# Set custom song rating # Set custom song rating
options.append(utils.language(30407)) options.append(lang(30407))
#delete item # Refresh item
options.append(utils.language(30409)) options.append(lang(30410))
# Delete item
options.append(lang(30409))
# Addon settings
options.append(lang(30408))
#addon settings # Display select dialog and process results
options.append(utils.language(30408)) resp = xbmcgui.Dialog().select(lang(30401), options)
if resp > -1:
selected = options[resp]
#display select dialog and process results if selected == lang(30410):
header = utils.language(30401) # Refresh item
ret = xbmcgui.Dialog().select(header, options) emby.refreshItem(itemId)
if ret != -1: elif selected == lang(30405):
if options[ret] == utils.language(30402): # Add favourite
emby.updateUserRating(plexid, deletelike=True) emby.updateUserRating(itemId, favourite=True)
if options[ret] == utils.language(30403): elif selected == lang(30406):
emby.updateUserRating(plexid, like=True) # Delete favourite
if options[ret] == utils.language(30404): emby.updateUserRating(itemId, favourite=False)
emby.updateUserRating(plexid, like=False) elif selected == lang(30407):
if options[ret] == utils.language(30405): # Update song rating
emby.updateUserRating(plexid, favourite=True) kodiconn = kodiSQL('music')
if options[ret] == utils.language(30406):
emby.updateUserRating(plexid, favourite=False)
if options[ret] == utils.language(30407):
kodiconn = utils.kodiSQL('music')
kodicursor = kodiconn.cursor() kodicursor = kodiconn.cursor()
query = ' '.join(("SELECT rating", "FROM song", "WHERE idSong = ?" )) query = "SELECT rating FROM song WHERE idSong = ?"
kodicursor.execute(query, (itemid,)) kodicursor.execute(query, (kodiId,))
currentvalue = int(round(float(kodicursor.fetchone()[0]),0)) try:
newvalue = xbmcgui.Dialog().numeric(0, "Set custom song rating (0-5)", str(currentvalue)) value = kodicursor.fetchone()[0]
if newvalue: current_value = int(round(float(value),0))
newvalue = int(newvalue) except TypeError:
if newvalue > 5: newvalue = "5" pass
if utils.settings('enableUpdateSongRating') == "true": else:
musicutils.updateRatingToFile(newvalue, API.getFilePath()) new_value = dialog.numeric(0, lang(30411), str(current_value))
if utils.settings('enableExportSongRating') == "true": if new_value > -1:
like, favourite, deletelike = musicutils.getEmbyRatingFromKodiRating(newvalue)
emby.updateUserRating(plexid, like, favourite, deletelike) new_value = int(new_value)
query = ' '.join(( "UPDATE song","SET rating = ?", "WHERE idSong = ?" )) if new_value > 5:
kodicursor.execute(query, (newvalue,itemid,)) new_value = 5
if settings('enableUpdateSongRating') == "true":
musicutils.updateRatingToFile(new_value, API.getFilePath())
query = "UPDATE song SET rating = ? WHERE idSong = ?"
kodicursor.execute(query, (new_value, kodiId,))
kodiconn.commit() kodiconn.commit()
if options[ret] == utils.language(30408): '''if settings('enableExportSongRating') == "true":
#Open addon settings like, favourite, deletelike = musicutils.getEmbyRatingFromKodiRating(new_value)
xbmc.executebuiltin("Addon.OpenSettings(plugin.video.plexkodiconnect)") emby.updateUserRating(itemId, like, favourite, deletelike)'''
finally:
kodicursor.close()
if options[ret] == utils.language(30409): elif selected == lang(30408):
# Open addon settings
xbmc.executebuiltin("Addon.OpenSettings(plugin.video.emby)")
elif selected == lang(30409):
# delete item from the server # delete item from the server
delete = True delete = True
if utils.settings('skipContextMenu') != "true": if settings('skipContextMenu') != "true":
resp = xbmcgui.Dialog().yesno( resp = dialog.yesno(
heading="Confirm delete", heading=lang(29999),
line1=("Delete file from Emby Server? This will " line1=lang(33041))
"also delete the file(s) from disk!"))
if not resp: if not resp:
logMsg("User skipped deletion for: %s." % plexid, 1) log.info("User skipped deletion for: %s." % itemId)
delete = False delete = False
if delete: if delete:
import downloadutils log.info("Deleting request: %s" % itemId)
doUtils = downloadutils.DownloadUtils() emby.deleteItem(itemId)
url = "{server}/emby/Items/%s?format=json" % plexid
logMsg("Deleting request: %s" % plexid, 0)
doUtils.downloadUrl(url, action_type="DELETE")
'''if utils.settings('skipContextMenu') != "true":
if xbmcgui.Dialog().yesno(
heading="Confirm delete",
line1=("Delete file on Emby Server? This will "
"also delete the file(s) from disk!")):
import downloadutils
doUtils = downloadutils.DownloadUtils()
doUtils.downloadUrl("{server}/emby/Items/%s?format=json" % plexid, action_type="DELETE")'''
xbmc.sleep(500) xbmc.sleep(500)
xbmc.executebuiltin("Container.Update") xbmc.executebuiltin('Container.Refresh')

View file

@ -2,6 +2,7 @@
############################################################################### ###############################################################################
import logging
import os import os
import sys import sys
import urlparse import urlparse
@ -11,7 +12,10 @@ import xbmcaddon
import xbmcgui import xbmcgui
############################################################################### _addon = xbmcaddon.Addon(id='plugin.video.emby')
_addon_path = _addon.getAddonInfo('path').decode('utf-8')
_base_resource = xbmc.translatePath(os.path.join(_addon_path, 'resources', 'lib')).decode('utf-8')
sys.path.append(_base_resource)
_addon = xbmcaddon.Addon(id='plugin.video.plexkodiconnect') _addon = xbmcaddon.Addon(id='plugin.video.plexkodiconnect')
try: try:
@ -28,26 +32,33 @@ except TypeError:
addon_path, addon_path,
'resources', 'resources',
'lib')).decode() 'lib')).decode()
sys.path.append(base_resource)
############################################################################### ###############################################################################
import entrypoint import entrypoint
import utils import utils
from utils import window, language as lang
############################################################################### ###############################################################################
enableProfiling = False import loghandler
loghandler.config()
log = logging.getLogger("EMBY.default")
#################################################################################################
class Main: class Main():
# MAIN ENTRY POINT # MAIN ENTRY POINT
#@utils.profiling()
def __init__(self): def __init__(self):
# Parse parameters # Parse parameters
xbmc.log("PlexKodiConnect - Full sys.argv received: %s" % sys.argv) xbmc.log("PlexKodiConnect - Full sys.argv received: %s" % sys.argv)
base_url = sys.argv[0] base_url = sys.argv[0]
params = urlparse.parse_qs(sys.argv[2][1:]) params = urlparse.parse_qs(sys.argv[2][1:])
log.warn("Parameter string: %s" % sys.argv[2])
try: try:
mode = params['mode'][0] mode = params['mode'][0]
itemid = params.get('id', '') itemid = params.get('id', '')
@ -93,6 +104,8 @@ class Main:
plexpath = sys.argv[2][1:] plexpath = sys.argv[2][1:]
plexid = params.get('id', [""])[0] plexid = params.get('id', [""])[0]
entrypoint.getExtraFanArt(plexid, plexpath) entrypoint.getExtraFanArt(plexid, plexpath)
entrypoint.getVideoFiles(embyid, embypath)
return
# Called by e.g. 3rd party plugin video extras # Called by e.g. 3rd party plugin video extras
if ("/Extras" in sys.argv[0] or "/VideoFiles" in sys.argv[0] or if ("/Extras" in sys.argv[0] or "/VideoFiles" in sys.argv[0] or
@ -111,7 +124,7 @@ class Main:
limit = int(params['limit'][0]) limit = int(params['limit'][0])
modes[mode](itemid, limit) modes[mode](itemid, limit)
elif mode in ["channels","getsubfolders"]: elif mode in ("channels","getsubfolders"):
modes[mode](itemid) modes[mode](itemid)
elif mode == "browsecontent": elif mode == "browsecontent":
@ -164,7 +177,8 @@ class Main:
elif mode == "texturecache": elif mode == "texturecache":
import artwork import artwork
artwork.Artwork().FullTextureCacheSync() artwork.Artwork().fullTextureCacheSync()
else: else:
entrypoint.doMainListing() entrypoint.doMainListing()
@ -192,3 +206,8 @@ if ( __name__ == "__main__" ):
Main() Main()
xbmc.log('plugin.video.plexkodiconnect stopped') xbmc.log('plugin.video.plexkodiconnect stopped')
if __name__ == "__main__":
log.info('plugin.video.emby started')
Main()
log.info('plugin.video.emby stopped')

View file

@ -0,0 +1,305 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<strings>
<!-- Add-on settings -->
<string id="29999">Emby voor Kodi</string>
<string id="30000">Primaire server adres</string>
<string id="30002">Afspelen vanaf HTTP in plaats van SMB</string>
<string id="30004">Log niveau</string>
<string id="30016">Apparaatnaam</string>
<string id="30022">Geavanceerd</string>
<string id="30024">Gebruikersnaam</string>
<string id="30030">Poortnummer</string>
<string id="30035">Aantal recente muziekalbums die getoond worden:</string>
<string id="30036">Aantal recente films die getoond worden:</string>
<string id="30037">Aantal recente TV-series die getoond worden:</string>
<string id="30042">Vernieuwen</string>
<string id="30043">Wissen</string>
<string id="30044">Ongeldige gebruikersnaam/wachtwoord</string>
<string id="30045">Gebruikersnaam niet gevonden</string>
<string id="30052">Wissen...</string>
<string id="30053">Wacht op server voor wissen</string>
<string id="30068">Sorteer op</string>
<string id="30069">Geen</string>
<string id="30070">Actie</string>
<string id="30071">Avontuur</string>
<string id="30072">Animatie</string>
<string id="30073">Misdaad</string>
<string id="30074">Comedy</string>
<string id="30075">Documentaire</string>
<string id="30076">Drama</string>
<string id="30077">Fantasie</string>
<string id="30078">Vreemdtalig</string>
<string id="30079">Geschiedenis</string>
<string id="30080">Horror</string>
<string id="30081">Muziek</string>
<string id="30082">Musical</string>
<string id="30083">Mysterie</string>
<string id="30084">Romantiek</string>
<string id="30085">Science Fiction</string>
<string id="30086">Kort</string>
<string id="30087">Spanning</string>
<string id="30088">Thriller</string>
<string id="30089">Western</string>
<string id="30090">Genre Filter</string>
<string id="30091">Bevestig bestandsverwijdering</string>
<string id="30093">Bekeken markeren</string>
<string id="30094">Onbekeken markeren</string>
<string id="30097">Sorteer op</string>
<string id="30098">Sorteer oplopend</string>
<string id="30099">Sorteer aflopend</string>
<!-- resume dialog -->
<string id="30105">Hervatten</string>
<string id="30106">Hervatten vanaf</string>
<string id="30107">Start vanaf begin</string>
<string id="30114">Toon verwijder mogelijkheid na het afspelen</string>
<string id="30115">Voor Afleveringen</string>
<string id="30116">Voor Films</string>
<string id="30118">Hervat-percentage toevoegen</string>
<string id="30119">Afleveringnummer toevoegen</string>
<string id="30120">Toon voortgang</string>
<string id="30121">Laden van content</string>
<string id="30122">Ontvang Data</string>
<string id="30125">Gereed</string>
<string id="30132">Waarschuwing</string>
<string id="30135">Fout</string>
<string id="30138">Zoeken</string>
<string id="30157">Activeer speciale afbeeldingen (bijv. CoverArt)</string>
<string id="30158">Metadata</string>
<string id="30159">Afbeeldingen</string>
<string id="30160">Video kwaliteit</string>
<string id="30165">Direct Afspelen</string>
<string id="30166">Transcoderen</string>
<string id="30167">Server Detectie Geslaagd</string>
<string id="30168">Gevonden server</string>
<string id="30169">Adres:</string>
<!-- Video nodes -->
<string id="30170">Onlangs toegevoegde TV-series</string>
<string id="30171">Niet afgekeken TV-series</string>
<string id="30172">Alle Muziek</string>
<string id="30173">Kanalen</string>
<string id="30174">Onlangs toegevoegde films</string>
<string id="30175">Onlangs toegevoegde afleveringen</string>
<string id="30176">Onlangs toegevoegde albums</string>
<string id="30177">Niet afgekeken films</string>
<string id="30178">Niet afgekeken afleveringen</string>
<string id="30179">Volgende (NextUp) afleveringen</string>
<string id="30180">Favoriete films</string>
<string id="30181">Favoriete TV-series</string>
<string id="30182">Favoriete afleveringen</string>
<string id="30183">Vaak afgespeelde albums</string>
<string id="30184">Binnenkort op TV</string>
<string id="30185">BoxSets</string>
<string id="30186">Trailers</string>
<string id="30187">Muziek video's</string>
<string id="30188">Foto's</string>
<string id="30189">Onbekeken films</string>
<string id="30190">Film Genres</string>
<string id="30191">Film Studio's</string>
<string id="30192">Film Acteurs</string>
<string id="30193">Onbekeken afleveringen</string>
<string id="30194">TV Genres</string>
<string id="30195">TV Netwerken</string>
<string id="30196">TV Acteurs</string>
<string id="30197">Afspeellijsten</string>
<string id="30199">Weergaven instellen</string>
<string id="30200">Selecteer gebruiker</string>
<string id="30204">Kan niet verbinden met server</string>
<string id="30207">Nummers</string>
<string id="30208">Albums</string>
<string id="30209">Album artiesten</string>
<string id="30210">Artiesten</string>
<string id="30211">Muziek Genres</string>
<string id="30220">Laatste</string>
<string id="30221">Bezig</string>
<string id="30222">Volgende (NextUp)</string>
<string id="30223">Gebruikersweergaven</string>
<string id="30224">Rapporteer Metrics</string>
<string id="30227">Willekeurige Films</string>
<string id="30228">Willekeurige Afleveringen</string>
<string id="30229">Willekeurige Items</string>
<string id="30230">Aanbevolen Items</string>
<string id="30235">Extra's</string>
<string id="30236">Synchroniseer Thema Muziek</string>
<string id="30237">Synchroniseer Extra Fanart</string>
<string id="30238">Synchroniseer Film Boxsets</string>
<string id="30239">Lokale Kodi database opnieuw instellen</string>
<string id="30243">Activeer HTTPS</string>
<string id="30245">Forceer Transcoderen van Codecs</string>
<string id="30249">Activeer server verbindings melding bij het opstarten</string>
<string id="30251">Onlangs bekeken Thuis Video's</string>
<string id="30252">Onlangs toegevoegde Foto's</string>
<string id="30253">Favoriete Home Video's</string>
<string id="30254">Favoriete Foto's</string>
<string id="30255">Favoriete Albums</string>
<string id="30256">Onlangs toegevoegde Muziek Video's</string>
<string id="30257">Niet afgekeken Muziek Video's</string>
<string id="30258">Onbekeken Muziek Video's</string>
<!-- Default views -->
<string id="30300">Actief</string>
<string id="30301">Herstel naar standaard</string>
<string id="30302">Films</string>
<string id="30303">BoxSets</string>
<string id="30304">Trailers</string>
<string id="30305">TV-series</string>
<string id="30306">Seizoenen</string>
<string id="30307">Afleveringen</string>
<string id="30308">Muziek - artiesten</string>
<string id="30309">Muziek - albums</string>
<string id="30310">Muziek Video's</string>
<string id="30311">Muziek - nummers</string>
<string id="30312">Kanalen</string>
<!-- contextmenu -->
<string id="30401">Emby opties</string>
<string id="30405">Toevoegen aan Emby favorieten</string>
<string id="30406">Verwijderen uit Emby favorieten</string>
<string id="30407">Instellen aangepaste waardering nummers</string>
<string id="30408">Emby addon instellingen</string>
<string id="30409">Verwijder item van de server</string>
<string id="30410">Dit item vernieuwen</string>
<string id="30411">Instellen aangepaste waardering voor nummers (0-5)</string>
<!-- add-on settings -->
<string id="30500">Controleer Host SSL Certificaat</string>
<string id="30501">Client SSL Certificaat</string>
<string id="30502">Gebruik alternatief adres</string>
<string id="30503">Alternatief Serveradres</string>
<string id="30504">Gebruik alternatieve apparaatnaam</string>
<string id="30505">[COLOR yellow]Probeer opnieuw in te loggen[/COLOR]</string>
<string id="30506">Synchronisatie Opties</string>
<string id="30507">Toon synchronisatie voortgang</string>
<string id="30508">Synchroniseer lege TV-series</string>
<string id="30509">Activeer Muziekbibliotheek</string>
<string id="30510">Direct Stream muziekbibliotheek</string>
<string id="30511">Afspeelmodus</string>
<string id="30512">Forceer afbeelding caching</string>
<string id="30513">Limiteer afbeelding cache threads (aanbevolen voor rpi)</string>
<string id="30514">Activeer \"fast startup\" (vereist server plugin)</string>
<string id="30515">Maximaal aantal items om tegelijk van de server op te vragen</string>
<string id="30516">Afspelen</string>
<string id="30517">Netwerkreferenties</string>
<string id="30518">Activeer Emby bioscoopmodus</string>
<string id="30519">Vragen om trailers af te spelen</string>
<string id="30520">Sla Emby verwijderings bevestiging over voor het contextmenu (Gebruik op eigen risico)</string>
<string id="30521">Spring terug op hervatten (in seconden)</string>
<string id="30522">Forceer transcoderen H265</string>
<string id="30523">Muziek metadata opties (niet compatibel met direct stream)</string>
<string id="30524">Importeer muziek lied waardering direct uit bestanden</string>
<string id="30525">Converteer muziek lied waardering naar Emby waardering</string>
<string id="30526">Toestaan dat waardeing in muziekbestanden worden bijgewerkt</string>
<string id="30527">Negeer specials in de volgende afleveringen</string>
<string id="30528">Gebruikers permanent toevoegen aan de sessie</string>
<string id="30529">Opstart vertraging (in seconden)</string>
<string id="30530">Activeer server herstart bericht</string>
<string id="30531">Activeer nieuwe inhoud notificatie</string>
<string id="30532">Duur van de videobibliotheek pop-up (in seconden)</string>
<string id="30533">Duur van de muziekbibliotheek pop-up (in seconden)</string>
<string id="30534">Server berichten</string>
<string id="30535">Genereer een nieuw apparaat Id</string>
<string id="30536">Sync als screensaver is uitgeschakeld</string>
<string id="30537">Forceer Transcoderen Hi10P</string>
<string id="30538">Uitgeschakeld</string>
<!-- service add-on -->
<string id="33000">Welkom</string>
<string id="33001">Fout bij maken van verbinding</string>
<string id="33002">De server is onbereikbaar</string>
<string id="33003">Server is online</string>
<string id="33004">items toegevoegd aan afspeellijst</string>
<string id="33005">items in de wachtrij voor afspeellijst</string>
<string id="33006">Server is opnieuw aan het opstarten</string>
<string id="33007">Toegang is ingeschakeld</string>
<string id="33008">Voer het wachtwoord in voor de gebruiker:</string>
<string id="33009">Foutieve gebruikersnaam of wachtwoord</string>
<string id="33010">Niet te vaak te authenticeren</string>
<string id="33011">Niet in staat om direct af te spelen</string>
<string id="33012">Direct afspelen is 3x mislukt. Afspelen vanaf HTTP Ingeschakeld.</string>
<string id="33013">Kies het audiokanaal</string>
<string id="33014">Kies de ondertiteling</string>
<string id="33015">Verwijder bestand van Emby server?</string>
<string id="33016">Trailers afspelen?</string>
<string id="33017">Verzamelen films van:</string>
<string id="33018">verzamelen boxsets</string>
<string id="33019">Verzamelen muziek-video's van:</string>
<string id="33020">Verzamelen TV-series van:</string>
<string id="33021">Verzamelen:</string>
<string id="33022">Gedetecteerd dat de database moet worden vernieuwd voor deze versie van Emby voor Kodi. Doorgaan?</string>
<string id="33023">Emby voor Kodi kan mogelijk niet correct werken tot de database is teruggezet.</string>
<string id="33024">Database synchronisatie proces geannuleerd. De huidige Kodi versie wordt niet ondersteund.</string>
<string id="33025">voltooid in:</string>
<string id="33026">Vergelijken van films uit:</string>
<string id="33027">Vergelijken van boxsets</string>
<string id="33028">Vergelijken van muziek-video's uit:</string>
<string id="33029">Vergelijken van TV-series uit:</string>
<string id="33030">Vergelijken van afleveringen uit:</string>
<string id="33031">Vergelijken:</string>
<string id="33032">Mislukt een nieuw apparaat Id te genereren. Zie je logs voor meer informatie.</string>
<string id="33033">Er is een nieuw apparaat Id gegenereerd. Kodi zal nu opnieuw opstarten.</string>
<string id="33034">Verder gaan met de volgende server?</string>
<string id="33035">LET OP! Als u de modus Native kiest, zullen bepaalde Emby functies ontbreken, zoals: Emby bioscoop-modus, directe afspeel/transcodeer opties en ouderlijk-toezicht planner.</string>
<string id="33036">Addon (Standaard)</string>
<string id="33037">Native (Directe paden)</string>
<string id="33038">Voeg netwerkreferenties toe aan Kodi om toegang tot uw content toe te staan? Belangrijk: Kodi moet opnieuw worden opgestart om de referenties te zien. Zij kunnen ook later worden toegevoegd.</string>
<string id="33039">Emby muziekbibliotheek uitschakelen?</string>
<string id="33040">Direct Stream de muziekbibliotheek? Selecteer deze optie als de muziekbibliotheek op afstand worden benaderd.</string>
<string id="33041">Bestand(en) van de Emby Server verwijderen? Dit zal de bestanden ook van de schijf verwijderen!</string>
<string id="33042">Het uitvoeren van de caching proces kan enige tijd duren. Toch verder gaan?</string>
<string id="33043">Afbeeldingen cache sync</string>
<string id="33044">Herstel bestaande afbeeldingen cache?</string>
<string id="33045">Bijwerken afbeeldingen cache:</string>
<string id="33046">Wachten op alle taken om af te sluiten:</string>
<string id="33047">Kodi kan bestand niet vinden:</string>
<string id="33048">Het kan nodig zijn om uw netwerkreferenties te controleren in de add-on-instellingen of gebruik de Emby padvervanging om je pad correct op te geven (Emby dashboard&gt; Bibliotheek). Stop synchroniseren?</string>
<string id="33049">Toegevoegd:</string>
<string id="33050">Wanneer u zich te vaak foutief aanmeld, zal de Emby Server uw account blokkeren. Toch doorgaan?</string>
<string id="33051">Live TV-kanalen (experimenteel)</string>
<string id="33052">Live TV-opnames (experimenteel)</string>
<string id="33053">Instellingen</string>
<string id="33054">Gebruiker toevoegen aan sessie</string>
<string id="33055">Vernieuw Emby afspeellijsen/Video knooppunten</string>
<string id="33056">Handmatig synchroniseren</string>
<string id="33057">Reparatie lokale database (forceer-bijwerken van alle inhoud)</string>
<string id="33058">Lokale database herstellen</string>
<string id="33059">Cache alle afbeeldingen</string>
<string id="33060">Sync Emby Thema Media naar Kodi</string>
<string id="33061">Gebruiker toevoegen/verwijderen van de sessie</string>
<string id="33062">Gebruiker toevoegen</string>
<string id="33063">Gebruiker verwijderen</string>
<string id="33064">Gebruiker verwijderen van de sessie</string>
<string id="33065">Geslaagd!</string>
<string id="33066">Verwijderd uit de bekijken sessie:</string>
<string id="33067">Toegevoegd aan de bekijken sessie:</string>
<string id="33068">Niet in staat om gebruiker toe te voegen/verwijderen uit de sessie.</string>
<string id="33069">De taak is geslaagd</string>
<string id="33070">De taak is mislukt</string>
<string id="33071">Direct Stream</string>
<string id="33072">Afspeel methode voor uw thema's</string>
<string id="33073">Het instellingenbestand bestaat niet in TV-Tunes. Wijzig een instelling en voer de taak opnieuw uit.</string>
<string id="33074">Weet u zeker dat u uw lokale Kodi database opnieuw wilt instellen?</string>
<string id="33075">Wijzig/verwijder netwerkreferenties</string>
<string id="33076">Wijzig</string>
<string id="33077">Verwijder</string>
<string id="33078">Verwijderd:</string>
<string id="33079">Geef netwerk gebruikersnaam op:</string>
<string id="33080">Geeft netwerk wachtwoord op:</string>
<string id="33081">Netwerkreferenties toegevoegd voor:</string>
<string id="33082">Voer de servernaam of het IP-adres in, zoals aangegeven in uw Emby bibliotheek paden. Bijvoorbeeld, de naam van de server: \\\\SERVER-PC\\pad\\ is \"SERVER-PC\"</string>
<string id="33083">Wijzig de servernaam of IP-adres</string>
<string id="33084">Geef de servernaam of het IP-adres op</string>
<string id="33085">Kon de database niet opnieuw instellen. Probeer het nog eens.</string>
<string id="33086">Verwijder al gecachte afbeeldingen?</string>
<string id="33087">Alle Emby add-on-instellingen opnieuw instellen?</string>
<string id="33088">Database opnieuw instellen is voltooid, Kodi zal nu opnieuw opstarten om de wijzigingen toe te passen.</string>
</strings>

View file

@ -0,0 +1,329 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<strings>
<!-- Add-on settings -->
<string id="29999">Emby pour Kodi</string>
<string id="30000">Adresse principale du serveur</string>
<!-- Verified -->
<string id="30002">Lire avec HTTP à la place de SMB</string>
<!-- Verified -->
<string id="30004">Niveau de journalisation</string>
<!-- Verified -->
<string id="30016">Nom de l'appareil</string>
<!-- Verified -->
<string id="30022">Avancé</string>
<string id="30024">Nom d'utilisateur</string>
<!-- Verified -->
<string id="30030">Numéro de port</string>
<!-- Verified -->
<string id="30035">Nombre d'album de musique récents à afficher:</string>
<string id="30036">Nombre de films récents à afficher:</string>
<string id="30037">Nombre d'épisodes télévisés récents à afficher:</string>
<string id="30042">Actualiser</string>
<string id="30043">Supprimer</string>
<string id="30044">Nom d'utilisateur/Mot de passe incorrect</string>
<string id="30045">Nom d'utilisateur introuvable</string>
<string id="30052">Suppression</string>
<string id="30053">En attente du serveur pour la suppression</string>
<string id="30068">Trier par</string>
<string id="30069">Aucun</string>
<string id="30070">Action</string>
<string id="30071">Aventure</string>
<string id="30072">Animation</string>
<string id="30073">Crime</string>
<string id="30074">Comédie</string>
<string id="30075">Documentaire</string>
<string id="30076">Drame</string>
<string id="30077">Fantaisie</string>
<string id="30078">Étranger</string>
<string id="30079">Historique</string>
<string id="30080">Horreur</string>
<string id="30081">Musique</string>
<string id="30082">Musical</string>
<string id="30083">Mystère</string>
<string id="30084">Romance</string>
<string id="30085">Science Fiction</string>
<string id="30086">Court</string>
<string id="30087">Suspense</string>
<string id="30088">Thriller</string>
<string id="30089">Western</string>
<string id="30090">Filtre de Genre</string>
<string id="30091">Confirmer la suppression du fichier</string>
<!-- Verified -->
<string id="30093">Marquer comme lu</string>
<string id="30094">Marquer comme non vu</string>
<string id="30097">Trier par</string>
<string id="30098">Ordre de Trie décroissant</string>
<string id="30099">Ordre de Trie croissant</string>
<!-- resume dialog -->
<string id="30105">Reprendre</string>
<string id="30106">Reprendre à partir de</string>
<string id="30107">Lire depuis le début</string>
<string id="30114">Offrir la possibilité de supprimer après la lecture</string>
<!-- Verified -->
<string id="30115">Pour Épisodes</string>
<!-- Verified -->
<string id="30116">Pour Films</string>
<!-- Verified -->
<string id="30118">Ajouter un pourcentage de reprise</string>
<string id="30119">Ajouter Numéro Épisode</string>
<string id="30120">Afficher la progression du chargement</string>
<string id="30121">Chargement du contenu</string>
<string id="30122">Récupération des données</string>
<string id="30125">Fait</string>
<string id="30132">Avertissement</string>
<!-- Verified -->
<string id="30135">Erreur</string>
<string id="30138">Rechercher</string>
<string id="30157">Activer les images améliorées (eg Coverart)</string>
<!-- Verified -->
<string id="30158">Métadonnées</string>
<string id="30159">Artwork</string>
<string id="30160">Qualité vidéo</string>
<!-- Verified -->
<string id="30165">Lecture directe</string>
<!-- Verified -->
<string id="30166">Transcodage</string>
<string id="30167">Détection du serveur Réussi</string>
<string id="30168">Serveur trouvé</string>
<string id="30169">Addresse:</string>
<!-- Video nodes -->
<string id="30170">Séries TV Récemment Ajouté</string>
<!-- Verified -->
<string id="30171">Séries TV En cours</string>
<!-- Verified -->
<string id="30172">Toute la musique</string>
<string id="30173">Chaînes</string>
<!-- Verified -->
<string id="30174">Films récemment ajoutés</string>
<!-- Verified -->
<string id="30175">Épisodes récemment ajoutés</string>
<!-- Verified -->
<string id="30176">Albums récemment ajoutés</string>
<string id="30177">Films en Cours</string>
<!-- Verified -->
<string id="30178">Épisodes en Cours</string>
<!-- Verified -->
<string id="30179">Prochain Épisodes</string>
<!-- Verified -->
<string id="30180">Films Favoris</string>
<!-- Verified -->
<string id="30181">Séries Favorites</string>
<!-- Verified -->
<string id="30182">Épisodes Favoris</string>
<string id="30183">Albums fréquemment joués</string>
<string id="30184">TV à venir</string>
<string id="30185">Collections</string>
<string id="30186">Bandes-annonces</string>
<string id="30187">Vidéo Clips</string>
<string id="30188">Photos</string>
<string id="30189">Films Non vu</string>
<!-- Verified -->
<string id="30190">Film Genres</string>
<string id="30191">Film Studios</string>
<string id="30192">Film Acteurs</string>
<string id="30193">Épisodes Non vu</string>
<string id="30194">TV Genres</string>
<string id="30195">TV Réseaux</string>
<string id="30196">TV Acteurs</string>
<string id="30197">Listes de lecture</string>
<string id="30199">Définir Vues</string>
<string id="30200">Sélectionner l'utilisateur</string>
<!-- Verified -->
<string id="30204">Impossible de se connecter au serveur</string>
<string id="30207">Chansons</string>
<string id="30208">Albums</string>
<string id="30209">Artiste de l'album</string>
<string id="30210">Artistes</string>
<string id="30211">Music Genres</string>
<string id="30220">Derniers</string>
<string id="30221">En cours</string>
<string id="30222">Prochain</string>
<string id="30223">Vues de l'utilisateur</string>
<string id="30224">Rapport Metrics</string>
<string id="30227">Films aléatoire</string>
<string id="30228">Épisodes aléatoire</string>
<string id="30229">Objets aléatoire</string>
<!-- Verified -->
<string id="30230">Élements recommandés</string>
<!-- Verified -->
<string id="30235">Extras</string>
<!-- Verified -->
<string id="30236">Sync Thème Musique</string>
<string id="30237">Sync Extra Fanart</string>
<string id="30238">Sync Saga Films</string>
<string id="30239">Réinitialiser la base de données locale de Kodi</string>
<!-- Verified -->
<string id="30243">Activer HTTPS</string>
<!-- Verified -->
<string id="30245">Forcer le transcodage Codecs</string>
<string id="30249">Activer le message de connexion au serveur pendant le démarrage</string>
<!-- Verified -->
<string id="30251">Vidéos personnel récemment ajoutés</string>
<!-- Verified -->
<string id="30252">Photos récemment ajoutés</string>
<!-- Verified -->
<string id="30253">Vidéos personnelles favorites</string>
<!-- Verified -->
<string id="30254">Photos favorites</string>
<!-- Verified -->
<string id="30255">Albums favoris</string>
<string id="30256">Vidéo Clips récemment ajoutés</string>
<!-- Verified -->
<string id="30257">Vidéo Clips en cours</string>
<!-- Verified -->
<string id="30258">Vidéo Clips non vu</string>
<!-- Verified -->
<!-- Default views -->
<string id="30300">Actif</string>
<string id="30301">Effacer les Paramètres</string>
<string id="30302">Films</string>
<string id="30303">Collections</string>
<string id="30304">Bandes-annonces</string>
<string id="30305">Séries</string>
<string id="30306">Saisons</string>
<string id="30307">Épisodes</string>
<string id="30308">Artistes musicaux</string>
<string id="30309">Albums de musique</string>
<string id="30310">Vidéo Clips</string>
<string id="30311">Pistes Musicales</string>
<string id="30312">Chaînes</string>
<!-- contextmenu -->
<string id="30401">Emby options</string>
<string id="30405">Ajouter aux favoris Emby</string>
<string id="30406">Supprimer des favoris Emby</string>
<string id="30407">Définir une note personnalisée de la chanson</string>
<string id="30408">Paramètres addon Emby</string>
<string id="30409">Supprimer un élément du serveur</string>
<string id="30410">Actualiser cet article</string>
<string id="30411">Définir une note personnalisée de la chanson (0-5)</string>
<!-- add-on settings -->
<string id="30500">Vérifier certificat SSL</string>
<string id="30501">Certificat SSL client</string>
<string id="30502">Utiliser une adresse alternative</string>
<string id="30503">Adresse du serveur alternatif</string>
<string id="30504">Utiliser un nom alternatif de périphérique</string>
<string id="30505">[COLOR yellow]Relancez la connexion[/COLOR]</string>
<string id="30506">Options de synchronisation</string>
<string id="30507">Afficher l'avancement de la synchro</string>
<string id="30508">Sync Séries TV vides</string>
<string id="30509">Activer la bibliothèque musicale</string>
<string id="30510">Direct stream bibliothèque musicale</string>
<string id="30511">Mode de lecture</string>
<string id="30512">Force mise en cache d'artwork</string>
<string id="30513">Limiter artwork en cache (recommandé pour rpi)</string>
<string id="30514">Activer le démarrage rapide (nécessite le plugin du serveur)</string>
<string id="30515">Nombre maximum d'éléments à demander à partir du serveur en une seule fois</string>
<string id="30516">Lecture</string>
<string id="30517">Identifiants réseau</string>
<string id="30518">Activer le mode cinéma</string>
<string id="30519">Demander à jouer des bandes annonces</string>
<string id="30520">Ne pas demander de confirmation de suppression pour le menu contextuel (utiliser à vos risques et périls)</string>
<string id="30521">Aller en arrière à la reprise (en secondes)</string>
<string id="30522">Force transcode H265</string>
<string id="30523">Options métadonnées musique (non compatibles avec direct stream)</string>
<string id="30524">Importation de la note de la chanson directement à partir des fichiers</string>
<string id="30525">Convertir la note du morceau pour Emby note</string>
<string id="30526">Autoriser les notes dans les fichiers des chansons à être mis à jour</string>
<string id="30527">Ignorer les spéciaux dans les épisodes suivants</string>
<string id="30528">Utilisateurs permanents à ajouter à la session</string>
<string id="30529">Délai de démarrage (en secondes)</string>
<string id="30530">Activer le message redémarrage du serveur</string>
<string id="30531">Activer une notification nouveau contenu</string>
<string id="30532">Durée de la fenêtre de la bibliothèque vidéo (en secondes)</string>
<string id="30533">Durée de la fenêtre de la bibliothèque musical (en secondes)</string>
<string id="30534">Messages du serveur</string>
<string id="30535">Générer un nouveau Id d'appareil</string>
<string id="30536">Sync si l'écran est désactivé</string>
<string id="30537">Force Transcode Hi10P</string>
<string id="30538">Désactivé</string>
<!-- service add-on -->
<string id="33000">Bienvenue</string>
<string id="33001">Erreur de connexion</string>
<string id="33002">Le Serveur est inaccessible</string>
<string id="33003">Le Serveur est en ligne</string>
<string id="33004">Éléments ajoutés à la liste de lecture</string>
<string id="33005">Éléments en file d'attente à la liste de lecture</string>
<string id="33006">Le serveur redémarre</string>
<string id="33007">L'accès est activé</string>
<string id="33008">Entrer le mot de passe pour l'utilisateur:</string>
<string id="33009">Utilisateur ou mot de passe invalide</string>
<string id="33010">Échec de l'authentification de trop nombreuses fois</string>
<string id="33011">Lecture directe impossible</string>
<string id="33012">Lecture directe a échoué 3 fois. Activer la lecture a partir de HTTP.</string>
<string id="33013">Choisissez le flux audio</string>
<string id="33014">Choisissez le flux de sous-titres</string>
<string id="33015">Supprimer le fichier de votre serveur Emby?</string>
<string id="33016">Lire bande-annonces ?</string>
<string id="33017">Récupération des films à partir de:</string>
<string id="33018">Récupération collections</string>
<string id="33019">Récupération des vidéo clips à partir de:</string>
<string id="33020">Récupération des séries Tv à partir de:</string>
<string id="33021">Récupération:</string>
<string id="33022">La base de données doit être créé pour cette version de Emby pour Kodi. Procéder ?</string>
<string id="33023">Emby pour Kodi peut ne pas fonctionner correctement jusqu'à ce que la base de données soit remise à zéro.</string>
<string id="33024">Annulation du processus de synchronisation de la base de données. La version actuelle de Kodi nest pas prise en charge.</string>
<string id="33025">complété en:</string>
<string id="33026">Comparaison des films à partir de:</string>
<string id="33027">Comparaison des collections</string>
<string id="33028">Comparaison des vidéo clips à partir de:</string>
<string id="33029">Comparaison des séries tv à partir de:</string>
<string id="33030">Comparaison des épisodes à partir de:</string>
<string id="33031">Comparaison:</string>
<string id="33032">Impossible de générer un nouvel ID de périphérique. Consultez les fichiers journaux pour plus d'informations.</string>
<string id="33033">Un nouvel Id de périphérique a été généré. Kodi va redémarrer maintenant.</string>
<string id="33034">Procédez avec le serveur suivant ?</string>
<string id="33035">Avertissement ! Si vous choisissez le mode natif, certaines fonctionnalités de Emby seront manquantes, tels que: Emby mode cinéma, direct stream/transcode et planification d'accès parental.</string>
<string id="33036">Addon (Par défaut)</string>
<string id="33037">Natif (Chemins directs)</string>
<string id="33038">Ajouter les informations d'identification du réseau pour permettre l'accès à votre contenu Kodi ? Important: Kodi devra être redémarré pour voir les informations d'identification. Elles peuvent également être ajoutés à un moment ultérieur.</string>
<string id="33039">Désactiver bibliothèque musicale Emby?</string>
<string id="33040">Direct stream la bibliothèque musicale ? Sélectionnez cette option si la bibliothèque musicale sera accessible à distance.</string>
<string id="33041">Supprimer les fichiers de Emby Server ? Cela permettra également de supprimer les fichiers du disque !</string>
<string id="33042">L'exécution du processus de mise en cache peut prendre un certain temps.</string>
<string id="33043">Artwork cache sync</string>
<string id="33044">Réinitialiser le cache des artwork existant ?</string>
<string id="33045">Mise à jour du cache des artwork :</string>
<string id="33046">Attendre que tous les sujets aient quitter :</string>
<string id="33047">Kodi ne peut pas localiser le fichier:</string>
<string id="33048">Vous devrez peut-être vérifier vos informations d'identification de réseau dans les paramètres add-on ou utiliser la substitution de chemin Emby pour formater votre chemin correctement (Emby tableau de bord&gt; bibliothèque). Arrêter la synchronisation ?</string>
<string id="33049">Ajoutée:</string>
<string id="33050">Si vous ne parvenez pas à vous connecter de trop nombreuses fois, le serveur Emby peut verrouiller votre compte. Continuer quand même ?</string>
<string id="33051">Chaînes TV en direct (expérimental)</string>
<string id="33052">Enregistrements TV en direct (expérimental)</string>
<string id="33053">Paramètres</string>
<string id="33054">Ajouter l'utilisateur à la session</string>
<string id="33055">Actualiser listes de lecture/nœuds vidéo d'Emby</string>
<string id="33056">Effectuer une sync manuelle</string>
<string id="33057">Réparer la base de données locale (force la mise à jour de tout le contenu)</string>
<string id="33058">Effectuer une réinitialisation de la base de données locale</string>
<string id="33059">Mettre en cache tout les artwork</string>
<string id="33060">Sync Emby Thème Media pour Kodi</string>
<string id="33061">Ajouter/Supprimer l'utilisateur de la session</string>
<string id="33062">Ajouter un utilisateur</string>
<string id="33063">Supprimer un utilisateur</string>
<string id="33064">Supprimer l'utilisateur de la session</string>
<string id="33065">Réussi !</string>
<string id="33066">Suppression de la session de visualisation:</string>
<string id="33067">Ajouté à la session de visualisation:</string>
<string id="33068">Impossible d'ajouter/supprimer l'utilisateur de la session.</string>
<string id="33069">La tâche a réussi</string>
<string id="33070">La tâche a échoué</string>
<string id="33071">Direct Stream</string>
<string id="33072">Méthode de lecture pour votre thèmes</string>
<string id="33073">Le fichier de paramètres n'existe pas dans Tunes TV. Modifier un paramètre et exécutez à nouveau la tâche.</string>
<string id="33074">Êtes-vous sûr de vouloir réinitialiser votre base de données locale Kodi ?</string>
<string id="33075">Modifier/Supprimer les informations d'identification du réseau</string>
<string id="33076">Modifier</string>
<string id="33077">Supprimer</string>
<string id="33078">Supprimé:</string>
<string id="33079">Entrer le nom d'utilisateur réseau</string>
<string id="33080">Entrer le mot de passe réseau</string>
<string id="33081">Ajouter des informations d'identification de réseau pour:</string>
<string id="33082">Entrez le nom du serveur ou l'adresse IP comme indiqué dans vos chemins de bibliothèque de Emby. Par exemple, le nom du serveur: \\\\SERVEUR-PC\\chemin\\ est \"SERVEUR-PC\"</string>
<string id="33083">Modifier le nom du serveur ou l'adresse IP</string>
<string id="33084">Entrer le nom du serveur ou l'adresse IP</string>
<string id="33085">Impossible de réinitialiser la base de données. Réessayer.</string>
<string id="33086">Supprimer toutes les artwork en cache?</string>
<string id="33087">Réinitialiser tous les réglages de l'addon Emby?</string>
<string id="33088">La réinitialisation de la base de données est terminée, Kodi va maintenant redémarrer pour appliquer les modifications.</string>
</strings>

View file

@ -0,0 +1,329 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<strings>
<!-- Add-on settings -->
<string id="29999">Emby for Kodi</string>
<string id="30000">Endereço do Servidor Primário</string>
<!-- Verified -->
<string id="30002">Reproduzir por HTTP ao invés de SMB</string>
<!-- Verified -->
<string id="30004">Nível do log</string>
<!-- Verified -->
<string id="30016">Nome do Dispositivo</string>
<!-- Verified -->
<string id="30022">Avançado</string>
<string id="30024">Nome do usuário</string>
<!-- Verified -->
<string id="30030">Número da Porta</string>
<!-- Verified -->
<string id="30035">Número de Álbuns de Música recentes a exibir:</string>
<string id="30036">Número de Filmes recentes a exibir:</string>
<string id="30037">Número de episódios de TV recentes a exibir:</string>
<string id="30042">Atualizar</string>
<string id="30043">Excluir</string>
<string id="30044">Nome de usuário/Senha incorretos</string>
<string id="30045">Nome de usuário não encontrado</string>
<string id="30052">Excluindo</string>
<string id="30053">Aguardando pelo servidor para excluir</string>
<string id="30068">Classificar por</string>
<string id="30069">Nenhum</string>
<string id="30070">Ação</string>
<string id="30071">Aventura</string>
<string id="30072">Animação</string>
<string id="30073">Crime</string>
<string id="30074">Comédia</string>
<string id="30075">Documentário</string>
<string id="30076">Drama</string>
<string id="30077">Fantasia</string>
<string id="30078">Estrangeiro</string>
<string id="30079">História</string>
<string id="30080">Terror</string>
<string id="30081">Música</string>
<string id="30082">Musical</string>
<string id="30083">Mistério</string>
<string id="30084">Romance</string>
<string id="30085">Ficção Científica</string>
<string id="30086">Curta Metragem</string>
<string id="30087">Suspense</string>
<string id="30088">Suspense</string>
<string id="30089">Western</string>
<string id="30090">Filtro do Gênero</string>
<string id="30091">Confirmar exclusão do arquivo</string>
<!-- Verified -->
<string id="30093">Marcar como assistido</string>
<string id="30094">Marcar como não-assistido</string>
<string id="30097">Classificar por</string>
<string id="30098">Classificar em Ordem Descendente</string>
<string id="30099">Classificar em Ordem Ascendente</string>
<!-- resume dialog -->
<string id="30105">Retomar</string>
<string id="30106">Retomar a partir de</string>
<string id="30107">Iniciar do começo</string>
<string id="30114">Disponibilizar exclusão depois da reprodução</string>
<!-- Verified -->
<string id="30115">Para Episódios</string>
<!-- Verified -->
<string id="30116">Para Filmes</string>
<!-- Verified -->
<string id="30118">Adicionar a Porcentagem para Retomar</string>
<string id="30119">Adicionar o Número do Episódio</string>
<string id="30120">Exibir Progresso do Carregamento</string>
<string id="30121">Carregando Conteúdo</string>
<string id="30122">Recuperando Dados</string>
<string id="30125">Feito</string>
<string id="30132">Aviso</string>
<!-- Verified -->
<string id="30135">Erro</string>
<string id="30138">Busca</string>
<string id="30157">Ativar Imagens Melhoradas (ex. Capa)</string>
<!-- Verified -->
<string id="30158">Metadados</string>
<string id="30159">Artwork</string>
<string id="30160">Qualidade do Vídeo</string>
<!-- Verified -->
<string id="30165">Reprodução Direta</string>
<!-- Verified -->
<string id="30166">Transcodificação</string>
<string id="30167">Sucesso na Detecção do Servidor</string>
<string id="30168">Servidor Encontrado</string>
<string id="30169">Endereço:</string>
<!-- Video nodes -->
<string id="30170">Séries Recentemente Adicionadas</string>
<!-- Verified -->
<string id="30171">Séries em Reprodução</string>
<!-- Verified -->
<string id="30172">Todas as Músicas</string>
<string id="30173">Canais</string>
<!-- Verified -->
<string id="30174">Filmes Recentemente Adicionados</string>
<!-- Verified -->
<string id="30175">Episódios Recentemente Adicionados</string>
<!-- Verified -->
<string id="30176">Álbuns Recentemente Adicionados</string>
<string id="30177">Filmes em Reprodução</string>
<!-- Verified -->
<string id="30178">Episódios em Reprodução</string>
<!-- Verified -->
<string id="30179">Próximos Episódios</string>
<!-- Verified -->
<string id="30180">Filmes Favoritos</string>
<!-- Verified -->
<string id="30181">Séries Favoritas</string>
<!-- Verified -->
<string id="30182">Episódios Favoritos</string>
<string id="30183">Álbuns Mais Reproduzidos</string>
<string id="30184">Séries a Estrear</string>
<string id="30185">BoxSets</string>
<string id="30186">Trailers</string>
<string id="30187">Vídeos de Música</string>
<string id="30188">Fotos</string>
<string id="30189">Filmes Não-Assistidos</string>
<!-- Verified -->
<string id="30190">Gêneros do Filme</string>
<string id="30191">Estúdios do Filme</string>
<string id="30192">Atores do Filme</string>
<string id="30193">Episódios Não-Assistidos</string>
<string id="30194">Gêneros da Série</string>
<string id="30195">Redes de TV</string>
<string id="30196">Atores da Série</string>
<string id="30197">Listas de Reprodução</string>
<string id="30199">Definir Visualizações</string>
<string id="30200">Selecionar Usuário</string>
<!-- Verified -->
<string id="30204">Não foi possível conectar ao servidor</string>
<string id="30207">Músicas</string>
<string id="30208">Álbuns</string>
<string id="30209">Artistas do Álbum</string>
<string id="30210">Artistas</string>
<string id="30211">Gêneros da Música</string>
<string id="30220">Mais Recentes</string>
<string id="30221">Em Reprodução</string>
<string id="30222">Próxima</string>
<string id="30223">Visualizações do Usuário</string>
<string id="30224">Métricas do Relatório</string>
<string id="30227">Filmes Aleatórios</string>
<string id="30228">Episódios Aleatórios</string>
<string id="30229">Itens Aleatórios</string>
<!-- Verified -->
<string id="30230">Itens Recomendados</string>
<!-- Verified -->
<string id="30235">Extras</string>
<!-- Verified -->
<string id="30236">Sincronizar Música-Tema</string>
<string id="30237">Sincronizar Extra Fanart</string>
<string id="30238">Sincronizar Imagens de Coletâneas</string>
<string id="30239">Repor base de dados local do Kodi</string>
<!-- Verified -->
<string id="30243">Ativar HTTPS</string>
<!-- Verified -->
<string id="30245">Forçar Codecs de Transcodificação</string>
<string id="30249">Ativar mensagem de conexão do servidor ao iniciar</string>
<!-- Verified -->
<string id="30251">Vídeos Caseiros adicionados recentemente</string>
<!-- Verified -->
<string id="30252">Fotos adicionadas recentemente</string>
<!-- Verified -->
<string id="30253">Vídeos Caseiros Favoritos</string>
<!-- Verified -->
<string id="30254">Fotos Favoritas</string>
<!-- Verified -->
<string id="30255">Álbuns Favoritos</string>
<string id="30256">Vídeos de Música adicionados recentemente</string>
<!-- Verified -->
<string id="30257">Vídeos de Música em Reprodução</string>
<!-- Verified -->
<string id="30258">Vídeos de Música não-assistidos</string>
<!-- Verified -->
<!-- Default views -->
<string id="30300">Ativo</string>
<string id="30301">Limpar Definições</string>
<string id="30302">Filmes</string>
<string id="30303">BoxSets</string>
<string id="30304">Trailers</string>
<string id="30305">Séries</string>
<string id="30306">Temporadas</string>
<string id="30307">Episódios</string>
<string id="30308">Artistas da Música</string>
<string id="30309">Álbuns de Música</string>
<string id="30310">Vídeos de Música</string>
<string id="30311">Trilhas de Música</string>
<string id="30312">Canais</string>
<!-- contextmenu -->
<string id="30401">Opções do Emby</string>
<string id="30405">Adicionar aos favoritos do Emby</string>
<string id="30406">Remover dos Favoritos do Emby</string>
<string id="30407">Definir a avaliação personalizada da música</string>
<string id="30408">Ajustes do addon do Emby</string>
<string id="30409">Excluir o item do servidor</string>
<string id="30410">Atualizar este item</string>
<string id="30411">Definir a avaliação personalizada da música (0-5)</string>
<!-- add-on settings -->
<string id="30500">Verificar o Certificado SSL do Servidor</string>
<string id="30501">Certificado SSL do cliente</string>
<string id="30502">Usar endereço alternativo</string>
<string id="30503">Endereço Alternativo do Servidor</string>
<string id="30504">Usar Nome alternativo do dispositivo</string>
<string id="30505">[COLOR yellow]Tentar Login Novamente[/COLOR]</string>
<string id="30506">Opções de Sincronização</string>
<string id="30507">Exibir progresso de sincronização</string>
<string id="30508">Sincronizar Séries de TV vazias</string>
<string id="30509">Ativar Biblioteca de Música</string>
<string id="30510">Stream direto da biblioteca de música</string>
<string id="30511">Modo de Reprodução</string>
<string id="30512">Forçar o caching de artwork</string>
<string id="30513">Limitar as threads de cache de artwork (recomendado para rpi)</string>
<string id="30514">Ativar inicialização rápida (é necessário o plugin do servidor)</string>
<string id="30515">Máximo de itens para solicitar ao servidor de uma única vez</string>
<string id="30516">Reprodução</string>
<string id="30517">Credenciais de rede</string>
<string id="30518">Ativar cinema mode do Emby</string>
<string id="30519">Confirmar a reprodução de trailers</string>
<string id="30520">Ignorar a confirmação de exclusão no Emby para o menú de contexto (use sob seu próprio risco)</string>
<string id="30521">intervalo para voltar na função retomar (em segundos)</string>
<string id="30522">Foçar transcodificação H265</string>
<string id="30523">Opções de metadados de música (não compatível com stream direto)</string>
<string id="30524">Importar avaliação da música diretamente dos arquivos</string>
<string id="30525">Converter a avaliação da música para a avaliação Emby.</string>
<string id="30526">Permitir que as avaliações nos arquivos de música sejam atualizadas</string>
<string id="30527">Ignorar especiais nos próximos episódios</string>
<string id="30528">Usuários permanentes para adicionar à sessão</string>
<string id="30529">Atraso na inicialização (em segundos)</string>
<string id="30530">Ativar mensagem de reinicialização do servidor</string>
<string id="30531">Ativar notificação de novo conteúdo</string>
<string id="30532">Duração do janela da biblioteca de vídeo (em segundos)</string>
<string id="30533">Duração da janela da biblioteca de música (em segundos)</string>
<string id="30534">Mensagens do servidor</string>
<string id="30535">Gerar um novo id do dispositivo</string>
<string id="30536">Sincronizar quando o protetor de tela está desativado</string>
<string id="30537">Forçar Transcodificação Hi10P</string>
<string id="30538">Desativado</string>
<!-- service add-on -->
<string id="33000">Bem vindo</string>
<string id="33001">Erro na conexão</string>
<string id="33002">Servidor não pode ser encontrado</string>
<string id="33003">Servidor está ativo</string>
<string id="33004">Itens adicionados à lista de reprodução</string>
<string id="33005">Itens enfileirados na lista de reprodução</string>
<string id="33006">Servidor está reiniciando</string>
<string id="33007">O acesso está ativo</string>
<string id="33008">Digite a senha do usuário:</string>
<string id="33009">Nome de usuário ou senha inválidos</string>
<string id="33010">Falha ao autenticar inúmeras vezes</string>
<string id="33011">Não é possível a reprodução direta</string>
<string id="33012">A reprodução direta falhou 3 vezes. Ative a reprodução por HTTP.</string>
<string id="33013">Escolha o stream de áudio</string>
<string id="33014">Escolha o stream de legendas</string>
<string id="33015">Excluir arquivo de seu Servidor Emby?</string>
<string id="33016">Reproduzir trailers?</string>
<string id="33017">Coletando filmes de:</string>
<string id="33018">Coletando boxsets</string>
<string id="33019">Coletando vídeos de música de:</string>
<string id="33020">Coletando séries de:</string>
<string id="33021">Coletando:</string>
<string id="33022">Foi detectado que a base de dados necessita ser recriada para esta versão do Emby for Kodi. Prosseguir?</string>
<string id="33023">O Emby for Kodi pode não funcionar corretamente até que a base de dados seja atualizada.</string>
<string id="33024">Cancelando o processo de sincronização da base de dados. A versão atual do Kodi não é suportada.</string>
<string id="33025">completa em:</string>
<string id="33026">Comparando filmes de:</string>
<string id="33027">Comparando coletâneas</string>
<string id="33028">Comparando vídeos clipes de:</string>
<string id="33029">Comparando séries de tv de:</string>
<string id="33030">Comparando episódios de:</string>
<string id="33031">Comparando:</string>
<string id="33032">Falha ao gerar um novo Id de dispositivo. Veja seus logs para mais informações.</string>
<string id="33033">Um novo Id de dispositivo foi gerado. Kodi irá reiniciar.</string>
<string id="33034">Prosseguir com o seguinte servidor?</string>
<string id="33035">Cuidado! Se escolher modo Nativo, certas funções do Emby serão perdidas, como: Emby cinema mode, opções de stream/transcodificação direta e agendamento de acesso pelos pais.</string>
<string id="33036">Addon (Padrão)</string>
<string id="33037">Nativo (Locais Diretos)</string>
<string id="33038">Adicionar credenciais de rede para permitir que o Kodi acesse seu conteúdo? Importante: Kodi precisará ser reiniciado para ver as credenciais. Elas também podem ser adicionadas mais tarde.</string>
<string id="33039">Desativar biblioteca de músicas do Emby?</string>
<string id="33040">Fazer stream direto da biblioteca de músicas? Selecione esta opção se a biblioteca de músicas for acessada remotamente.</string>
<string id="33041">Excluir arquivo(s) do Servidor Emby? Esta opção também excluirá o(s) arquivo(s) do disco!</string>
<string id="33042">Executar o processo de caching pode levar bastante tempo. Continuar assim mesmo?</string>
<string id="33043">Sincronização do cache de artwork</string>
<string id="33044">Limpar cache de artwork atual?</string>
<string id="33045">Atualizando o cache de artwork:</string>
<string id="33046">Aguardando que todos os processos terminem:</string>
<string id="33047">Kodi não pode localizar o arquivo:</string>
<string id="33048">Você precisa verificar suas credenciais de rede nos ajustes de add-on ou usar substituição de locais no Emby para formatar seu local corretamente (Painel Emby &gt; biblioteca). Parar de sincronizar?</string>
<string id="33049">Adicionado:</string>
<string id="33050">Se falhar para entrar diversas vezes, o servidor Emby pode bloquear sua conta, Deseja prosseguir?</string>
<string id="33051">Canais de TV ao Vivo (experimental)</string>
<string id="33052">Gravações de TV ao Vivo (experimental)</string>
<string id="33053">Ajustes</string>
<string id="33054">Adicionar usuário à sessão</string>
<string id="33055">Atualizar nós de listas de reprodução/Vídeo</string>
<string id="33056">Executar sincronização manual</string>
<string id="33057">Reparar base de dados local (forçar atualização para todo o conteúdo)</string>
<string id="33058">Executar reset da base de dados local</string>
<string id="33059">Colocar toda artwork no cache</string>
<string id="33060">Sincronizar Mídia de Tema do Emby para o Kodi</string>
<string id="33061">Adicionar/Remover usuário da sessão</string>
<string id="33062">Adicionar usuário</string>
<string id="33063">Remover usuário</string>
<string id="33064">Remover usuário da sessão</string>
<string id="33065">Sucesso!</string>
<string id="33066">Removido da seguinte sessão:</string>
<string id="33067">Adicionado à seguinte sessão:</string>
<string id="33068">Não foi possível adicionar/remover usuário da sessão.</string>
<string id="33069">Sucesso na tarefa</string>
<string id="33070">Falha na tarefa</string>
<string id="33071">Stream Direto</string>
<string id="33072">Método de reprodução para seus temas</string>
<string id="33073">O arquivo de ajustes não existe na TV Tunes. Altere o ajuste e execute a tarefa novamente.</string>
<string id="33074">Deseja realmente resetar a base de dados local do Kodi?</string>
<string id="33075">Modificar/Remover as credenciais de rede</string>
<string id="33076">Modificar</string>
<string id="33077">Remover</string>
<string id="33078">Removido:</string>
<string id="33079">Digite o nome de usuário da rede</string>
<string id="33080">Digite a senha da rede</string>
<string id="33081">Credenciais de rede adicionadas para:</string>
<string id="33082">Digite o nome do servidor ou endereço IP como indicado nos locais de sua biblioteca do emby. Por exemplo, o nome do servidor \\\\SERVIDOR-PC\\local\\ é \"SERVIDOR-PC\"</string>
<string id="33083">Modificar o nome do servidor ou endereço IP</string>
<string id="33084">Digite o nome do servidor ou endereço IP</string>
<string id="33085">Não é possível resetar a base de dados. Tente novamente.</string>
<string id="33086">Remover toda artwork do cache?</string>
<string id="33087">Resetar todos os ajustes do add-on Emby?</string>
<string id="33088">O reset da base de dados foi concluída, Kodi irá reiniciar para aplicar as alterações.</string>
</strings>

View file

@ -0,0 +1,329 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<strings>
<!-- Add-on settings -->
<string id="29999">Emby для Kodi</string>
<string id="30000">Основной адрес сервера</string>
<!-- Verified -->
<string id="30002">Воспроизводить по HTTP вместо SMB</string>
<!-- Verified -->
<string id="30004">Уровень журналирования</string>
<!-- Verified -->
<string id="30016">Название устройства</string>
<!-- Verified -->
<string id="30022">Расширенное</string>
<string id="30024">Имя пользователя</string>
<!-- Verified -->
<string id="30030">Номер порта</string>
<!-- Verified -->
<string id="30035">Число последних музыкальных альбомов для просмотра:</string>
<string id="30036">Число последних фильмов для просмотра:</string>
<string id="30037">Число последних ТВ-эпизодов для просмотра:</string>
<string id="30042">Подновить</string>
<string id="30043">Удалить</string>
<string id="30044">Неверное Имя пользователя/Пароль</string>
<string id="30045">Имя пользователя не найдено</string>
<string id="30052">Удаляется</string>
<string id="30053">В ожидании удаления с сервера</string>
<string id="30068">Сортировать по</string>
<string id="30069">Никакой</string>
<string id="30070">Действие</string>
<string id="30071">Приключения</string>
<string id="30072">Анимация</string>
<string id="30073">Криминал</string>
<string id="30074">Комедия</string>
<string id="30075">Документалистика</string>
<string id="30076">Драма</string>
<string id="30077">Фэнтези</string>
<string id="30078">Иностранное</string>
<string id="30079">История</string>
<string id="30080">Ужасы</string>
<string id="30081">Музыка</string>
<string id="30082">Мюзикл</string>
<string id="30083">Детектив</string>
<string id="30084">Мелодрама</string>
<string id="30085">Научная фантастика</string>
<string id="30086">Короткометражное</string>
<string id="30087">Саспенс</string>
<string id="30088">Триллер</string>
<string id="30089">Вестерн</string>
<string id="30090">Фильтровать по жанрам</string>
<string id="30091">Подтверить удаление файла</string>
<!-- Verified -->
<string id="30093">Отметить как просмотренное</string>
<string id="30094">Отметить как непросмотренное</string>
<string id="30097">Сортировать по</string>
<string id="30098">Порядок сортировки по убыванию</string>
<string id="30099">Порядок сортировки по возрастанию</string>
<!-- resume dialog -->
<string id="30105">Возобновить</string>
<string id="30106">Возобн. с</string>
<string id="30107">Начать. с начала</string>
<string id="30114">Предлагать удаление после воспроизведения</string>
<!-- Verified -->
<string id="30115">Для эпизодов</string>
<!-- Verified -->
<string id="30116">Для фильмов</string>
<!-- Verified -->
<string id="30118">Добавить соотношение для возобновления</string>
<string id="30119">Добавить номер эпизода</string>
<string id="30120">Показывать индикатор загрузки</string>
<string id="30121">Загружается содержание</string>
<string id="30122">Получение данных</string>
<string id="30125">Готово</string>
<string id="30132">Предупреждение</string>
<!-- Verified -->
<string id="30135">Ошибка</string>
<string id="30138">Поиск</string>
<string id="30157">Включить улучшенные рисунки (нп., CoverArt)</string>
<!-- Verified -->
<string id="30158">Метаданные</string>
<string id="30159">Иллюстрация</string>
<string id="30160">Качество видео</string>
<!-- Verified -->
<string id="30165">Прямое воспроизведение</string>
<!-- Verified -->
<string id="30166">Перекодировка</string>
<string id="30167">Успешно обнаружен сервер</string>
<string id="30168">Найден сервер</string>
<string id="30169">Адрес:</string>
<!-- Video nodes -->
<string id="30170">Недавно добавленные ТВ-программы</string>
<!-- Verified -->
<string id="30171">ТВ-программы в процессе</string>
<!-- Verified -->
<string id="30172">Вся музыка</string>
<string id="30173">Каналы</string>
<!-- Verified -->
<string id="30174">Недавно добавленные фильмы</string>
<!-- Verified -->
<string id="30175">Недавно добавленные эпизоды</string>
<!-- Verified -->
<string id="30176">Недавно добавленные альбомы</string>
<string id="30177">Фильмы в процессе</string>
<!-- Verified -->
<string id="30178">Эпизоды в процессе</string>
<!-- Verified -->
<string id="30179">Следующие эпизоды</string>
<!-- Verified -->
<string id="30180">Избранные фильмы</string>
<!-- Verified -->
<string id="30181">Избранные ТВ-программы</string>
<!-- Verified -->
<string id="30182">Избранные эпизоды</string>
<string id="30183">Часто воспроизводимые альбомы</string>
<string id="30184">Ожидаемое</string>
<string id="30185">Коллекции</string>
<string id="30186">Трейлеры</string>
<string id="30187">Муз-ые видео</string>
<string id="30188">Фотографии</string>
<string id="30189">Непросмотренные фильмы</string>
<!-- Verified -->
<string id="30190">Киножанры</string>
<string id="30191">Киностудии</string>
<string id="30192">Киноактёры</string>
<string id="30193">Непросмотренные эпизоды</string>
<string id="30194">Тележанры</string>
<string id="30195">Телесети</string>
<string id="30196">Телеактёры</string>
<string id="30197">Плей-листы</string>
<string id="30199">Назначить виды</string>
<string id="30200">Выбрать пользователя</string>
<!-- Verified -->
<string id="30204">Не удалось подсоединиться к серверу</string>
<string id="30207">Композиции</string>
<string id="30208">Альбомы</string>
<string id="30209">Исполнители альбома</string>
<string id="30210">Исполнители</string>
<string id="30211">Музыкальные жанры</string>
<string id="30220">Последнее</string>
<string id="30221">Выполняется</string>
<string id="30222">Следующее</string>
<string id="30223">Пользовательские виды</string>
<string id="30224">Отчёт метрики</string>
<string id="30227">Случайные фильмы</string>
<string id="30228">Случайные эпизоды</string>
<string id="30229">Случайные элементы</string>
<!-- Verified -->
<string id="30230">Предлагаемые элементы</string>
<!-- Verified -->
<string id="30235">Допматериалы</string>
<!-- Verified -->
<string id="30236">Синхронизировать тематическую музыку</string>
<string id="30237">Синхронизировать дополнительные иллюстрации</string>
<string id="30238">Синхронизировать коллекции фильмов</string>
<string id="30239">Сбросить локальную базу данных Kodi</string>
<!-- Verified -->
<string id="30243">Включить HTTPS</string>
<!-- Verified -->
<string id="30245">Принудительно включить кодеки для перекодировки</string>
<string id="30249">Включать сообщение о подсоединении сервера при запуске</string>
<!-- Verified -->
<string id="30251">Недавно добавленные домашние видео</string>
<!-- Verified -->
<string id="30252">Недавно добавленные фотографии</string>
<!-- Verified -->
<string id="30253">Избранные домашние видео</string>
<!-- Verified -->
<string id="30254">Избранные фотографии</string>
<!-- Verified -->
<string id="30255">Избранные альбомы</string>
<string id="30256">Недавно добавленные музыкальные видео</string>
<!-- Verified -->
<string id="30257">Музыкальные видео в процессе</string>
<!-- Verified -->
<string id="30258">Непросмотренные домашние видео</string>
<!-- Verified -->
<!-- Default views -->
<string id="30300">Активно</string>
<string id="30301">Очистить параметры</string>
<string id="30302">Фильмы</string>
<string id="30303">Коллекции</string>
<string id="30304">Трейлеры</string>
<string id="30305">Сериалы</string>
<string id="30306">Сезоны</string>
<string id="30307">Эпизоды</string>
<string id="30308">Исп-ли музыки</string>
<string id="30309">Муз-ые альбомы</string>
<string id="30310">Муз-ые видео</string>
<string id="30311">Музыкальные дорожки</string>
<string id="30312">Каналы</string>
<!-- contextmenu -->
<string id="30401">Параметры Emby</string>
<string id="30405">Добавить в Избранное Emby</string>
<string id="30406">Изъять из Избранного Emby</string>
<string id="30407">Назначить произвольную возрастную категорию композиции</string>
<string id="30408">Параметры дополнения для Emby</string>
<string id="30409">Удалить элемент с сервера</string>
<string id="30410">Подновить данный элемент</string>
<string id="30411">Назначить произвольную возрастную категорию композиции (0-5)</string>
<!-- add-on settings -->
<string id="30500">Удостоверить SSL-сертификат хоста</string>
<string id="30501">SSL-сертификат клиента</string>
<string id="30502">Использовать альтернативный адрес</string>
<string id="30503">Альтернативный адрес сервера</string>
<string id="30504">Использовать альтернативное имя устройства</string>
<string id="30505">[COLOR yellow]Войти повторно[/COLOR]</string>
<string id="30506">Параметры синхронизации</string>
<string id="30507">Показать прогресс синхронизации</string>
<string id="30508">Синхронизировать пустые ТВ-программы</string>
<string id="30509">Включить медиатеку музыки</string>
<string id="30510">Прямая трансляция медиатеки музыки</string>
<string id="30511">Режим воспроизведения</string>
<string id="30512">Принудительно кэшировать иллюстрации</string>
<string id="30513">Предел ветвей кэша иллюстраций (рекомендуется для rpi)</string>
<string id="30514">Включить быстрый запуск (требуется плагин сервера)</string>
<string id="30515">Максимальное число элементов для запроса с сервера за раз</string>
<string id="30516">Воспроизведение</string>
<string id="30517">Сетевые учётные данные</string>
<string id="30518">Включить режим кинотеатра Emby</string>
<string id="30519">Запрашивать для воспроизведения трейлеров</string>
<string id="30520">Пропускать подтверждение удаления в Emby для контекстного меню (используйте на свой страх и риск)</string>
<string id="30521">Переход назад при возобновлении, с</string>
<string id="30522">Принудительно перекодировать H265</string>
<string id="30523">Параметры метаданных музыки (несовместимо с прямой трансляцией)</string>
<string id="30524">Импортировать оценку музыкальной композиции из файла</string>
<string id="30525">Преобразовать оценку музыкальной композиции в оценку Emby</string>
<string id="30526">Разрешить обновление оценки в файлах композиций</string>
<string id="30527">Игнорировать спецэпизоды среди следующих эпизодов</string>
<string id="30528">Постоянные пользователи для добавления в сессию</string>
<string id="30529">Задержка запуска, с</string>
<string id="30530">Включить сообщение о перезапуске сервера</string>
<string id="30531">Включить уведомление о новом содержании</string>
<string id="30532">Длительность показа всплывающего окна медиатеки видео, с</string>
<string id="30533">Длительность показа всплывающего окна медиатеки музыки, с</string>
<string id="30534">Сообщения сервера</string>
<string id="30535">Генерировать Id нового устройства</string>
<string id="30536">Синхронизировать, когда отключен хранитель экрана</string>
<string id="30537">Принудительно перекодировать Hi10P</string>
<string id="30538">Выключено</string>
<!-- service add-on -->
<string id="33000">Начало работы</string>
<string id="33001">Ошибка соединения</string>
<string id="33002">Сервер недостижим</string>
<string id="33003">Сервер в сети</string>
<string id="33004">Элементы, добавленные в плей-лист</string>
<string id="33005">Элементы в очереди в плей-листе</string>
<string id="33006">Сервер перезапускается</string>
<string id="33007">Доступ включён</string>
<string id="33008">Ввести пароль для пользователя:</string>
<string id="33009">Недопустимое имя пользователя или пароль.</string>
<string id="33010">Не удалось проверить подлинность слишком много раз</string>
<string id="33011">Прямое воспроизведение невозможно</string>
<string id="33012">Прямое воспроизведение не удалось 3 раза. Включено воспроизведение с HTTP.</string>
<string id="33013">Выбрать поток аудио</string>
<string id="33014">Выбрать поток субтитров</string>
<string id="33015">Удалить файл с вашего Emby Server?</string>
<string id="33016">Воспроизвести трейлеры?</string>
<string id="33017">Сбор фильмов с:</string>
<string id="33018">Сбор коллекций</string>
<string id="33019">Сбор музыкальных видео с:</string>
<string id="33020">Сбор ТВ-передач с:</string>
<string id="33021">Сбор:</string>
<string id="33022">Обнаружено, что базу данных необходимо пересоздать для данной версии Emby для Kodi. Приступить?</string>
<string id="33023">Emby для Kodi возможно не будет корректно работать до тех пор, пока базу данных не сбросят.</string>
<string id="33024">Процесс синхронизации базы данных отменён. Текущая версия Kodi не поддерживается.</string>
<string id="33025">выполнено в:</string>
<string id="33026">Сравниваются фильмы с:</string>
<string id="33027">Сравниваются коллекции</string>
<string id="33028">Сравниваются музыкальные видео с:</string>
<string id="33029">Сравниваются ТВ-передачи с:</string>
<string id="33030">Сравниваются ТВ-эпизоды с:</string>
<string id="33031">Сравниваются:</string>
<string id="33032">Генерирование Id нового устройства не удалось. Просмотрите ваши журналы для более подробной информации.</string>
<string id="33033">Было сгенерирован Id нового устройства. Kodi теперь перезапустится.</string>
<string id="33034">Приступить к следующему серверу?</string>
<string id="33035">Осторожно! Если вы выбрали режим Собственный, некоторые функции Emby будут отсутствовать, например, режим кинотеатра Emby, прямой трансляция / варианты перекодировки и расписание доступа.</string>
<string id="33036">Надстройка (по умолчанию)</string>
<string id="33037">Собственный (непосредственные пути)</string>
<string id="33038">Добавить сетевые учётные данные, чтобы разрешить доступ для Kodi к вашему содержанию? Важно: Чтобы увидеть учётные данные, необходимо перезапустить Kodi. Также они могут быть добавлены позднее.</string>
<string id="33039">Отключить музыкальную медиатеку Emby?</string>
<string id="33040">Транслировать напрямую музыкальную медиатеку? Выберите данный вариант, если будет удалённый доступ к музыкальной медиатеке.</string>
<string id="33041">Удалить файл(ы) с Emby Server? Файл(ы) будут удалены также с диска!</string>
<string id="33042">Работающий процесс кэширования может занять некоторое время. Продолжить по-любому?</string>
<string id="33043">Синхронизировать кэш иллюстраций</string>
<string id="33044">Сбросить кэш существующих иллюстраций?</string>
<string id="33045">Обновить кэш иллюстраций:</string>
<string id="33046">В ожидании для всех потоков, чтобы выйти:</string>
<string id="33047">Kodi не может обнаружить файл:</string>
<string id="33048">Вам может понадобиться проверить сетевые учётные данныев настройках надстройки или использовать подстановку путей в Emby, чтобы правильно форматировать свой путь (Инфопанель Emby &gt; Медиатека). Остановить синхронизацию?</string>
<string id="33049">Добавлено:</string>
<string id="33050">Если вам не удалось войти слишком много раз, Emby server может заблокировать вашу учётную запись. Приступить по-любому?</string>
<string id="33051">Эфирные каналы (экспериментально)</string>
<string id="33052">Эфирные записи (экспериментально)</string>
<string id="33053">Параметры</string>
<string id="33054">Добавить пользователя к сеансу</string>
<string id="33055">Подновить узлы плей-листов/видео Emby</string>
<string id="33056">Выполнить ручную синхронизацию</string>
<string id="33057">Исправить локальную базу данных (принудительно обновить всё содержание)</string>
<string id="33058">Выполнить сброс локальной базы данных</string>
<string id="33059">Кэшировать все иллюстрации</string>
<string id="33060">Синхронизировать медиаданные темы Emby с Kodi</string>
<string id="33061">Добавить/Изъять пользователя из сеанса</string>
<string id="33062">Добавить пользователя</string>
<string id="33063">Изъять пользователя</string>
<string id="33064">Изъять пользователя из сеанса</string>
<string id="33065">Успешно!</string>
<string id="33066">Изъято из просматриваемого сеанса:</string>
<string id="33067">Добавлено в просматриваемый сеанс:</string>
<string id="33068">Невозможно добавить/изъять пользователя из сеанса.</string>
<string id="33069">Задача успешно выполнена</string>
<string id="33070">Задачу выполнить не удалось</string>
<string id="33071">Прямая трансляция</string>
<string id="33072">Метод воспроизведения для вашим тем</string>
<string id="33073">Файл параметров отсутствует в TV Tunes. Измените параметр и запустите задачу снова.</string>
<string id="33074">Вы действительно хотите выполнить сброс вашей локальной базы данных Kodi?</string>
<string id="33075">Изменить/Изъять сетевые учётные данные</string>
<string id="33076">Изменить</string>
<string id="33077">Изъять</string>
<string id="33078">Изъято:</string>
<string id="33079">Ввести сетевое имя пользователя</string>
<string id="33080">Ввести сетевой пароль</string>
<string id="33081">Добавлены сетевые учётные данные для:</string>
<string id="33082">Введите имя сервера или IP-адрес, как обозначено в путях в вашей медиатеке Emby. К примеру, имя сервера: \\\\SERVER-PC\\путь\\ является \"SERVER-PC\"</string>
<string id="33083">Изменить имя сервера или IP-адрес</string>
<string id="33084">Ввести имя сервера или IP-адрес</string>
<string id="33085">Не удалось сбросить базу данных. Повторите попытку.</string>
<string id="33086">Удалить все кэшированные иллюстрации?</string>
<string id="33087">Сбросить все параметры надстройки Emby?</string>
<string id="33088">Сброс базы данных завершён, Kodi теперь перезапустится, чтобы применить изменения.</string>
</strings>

View file

@ -0,0 +1,329 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<strings>
<!-- Add-on settings -->
<string id="29999">Emby para Kodi</string>
<string id="30000">Dirección Primaria del Servidor</string>
<!-- Verified -->
<string id="30002">Reproducir desde HTTP en vez de desde SMB</string>
<!-- Verified -->
<string id="30004">Nivel de bitácora</string>
<!-- Verified -->
<string id="30016">Nombre de Dispositivo</string>
<!-- Verified -->
<string id="30022">Avanzado</string>
<string id="30024">Usuario</string>
<!-- Verified -->
<string id="30030">Puerto</string>
<!-- Verified -->
<string id="30035">Cantidad de Álbumes recientes a mostrar:</string>
<string id="30036">Cantidad de Películas recientes a mostrar:</string>
<string id="30037">Cantidad de Episodios recientes a mostrar:</string>
<string id="30042">Refrescar</string>
<string id="30043">Eliminar</string>
<string id="30044">Usuario/Contraseña incorrectos</string>
<string id="30045">Usuario no encontrado</string>
<string id="30052">Eliminando</string>
<string id="30053">Esperando a eliminación en servidor</string>
<string id="30068">Clasificar por</string>
<string id="30069">Ninguno</string>
<string id="30070">Acción</string>
<string id="30071">Aventuras</string>
<string id="30072">Animación</string>
<string id="30073">Crimen</string>
<string id="30074">Comedia</string>
<string id="30075">Documental</string>
<string id="30076">Drama</string>
<string id="30077">Fantasía</string>
<string id="30078">Extranjera</string>
<string id="30079">Historia</string>
<string id="30080">Horror</string>
<string id="30081">Música</string>
<string id="30082">Musical</string>
<string id="30083">Misterio</string>
<string id="30084">Romance</string>
<string id="30085">Ciencia Ficción</string>
<string id="30086">Corto</string>
<string id="30087">Suspenso</string>
<string id="30088">Thriller</string>
<string id="30089">Oeste</string>
<string id="30090">Filtro por Género</string>
<string id="30091">Confirmar eliminación de archivo</string>
<!-- Verified -->
<string id="30093">Marcar como visto</string>
<string id="30094">Marcar como no visto</string>
<string id="30097">Clasificar por</string>
<string id="30098">Orden de clasificación Descendente</string>
<string id="30099">Orden de clasificación Ascendente</string>
<!-- resume dialog -->
<string id="30105">Reanudar</string>
<string id="30106">Reanudar desde</string>
<string id="30107">Iniciar desde el principio</string>
<string id="30114">Ofrecer eliminar luego de reproducción</string>
<!-- Verified -->
<string id="30115">Para Episodios</string>
<!-- Verified -->
<string id="30116">Para Películas</string>
<!-- Verified -->
<string id="30118">Añadir porcentaje de reanudar</string>
<string id="30119">Añadir Número de Episodio</string>
<string id="30120">Mostrar Progreso de Carga</string>
<string id="30121">Cargando Contenido</string>
<string id="30122">Obteniendo Datos</string>
<string id="30125">Completado</string>
<string id="30132">Advertencia</string>
<!-- Verified -->
<string id="30135">Error</string>
<string id="30138">Buscar</string>
<string id="30157">Activar Imágenes Avanzadas (como CoverArt)</string>
<!-- Verified -->
<string id="30158">Metadatos</string>
<string id="30159">Arte</string>
<string id="30160">Calidad de Vídeo</string>
<!-- Verified -->
<string id="30165">Reproducción Directa</string>
<!-- Verified -->
<string id="30166">Transcodificando</string>
<string id="30167">Detección de Servidor Exitosa</string>
<string id="30168">Servidor Encontrado</string>
<string id="30169">Dirección:</string>
<!-- Video nodes -->
<string id="30170">Series de TV Añadidos Recientemente</string>
<!-- Verified -->
<string id="30171">Series de TV En Progreso</string>
<!-- Verified -->
<string id="30172">Toda la Música</string>
<string id="30173">Canales</string>
<!-- Verified -->
<string id="30174">Películas Añadidas Recientemente</string>
<!-- Verified -->
<string id="30175">Episodios Añadidos Recientemente</string>
<!-- Verified -->
<string id="30176">Álbumes Añadidos Recientemente</string>
<string id="30177">Películas En Progreso</string>
<!-- Verified -->
<string id="30178">Episodios En Progreso</string>
<!-- Verified -->
<string id="30179">Próximos Episodios</string>
<!-- Verified -->
<string id="30180">Películas Favoritas</string>
<!-- Verified -->
<string id="30181">Series de TV Favoritas</string>
<!-- Verified -->
<string id="30182">Episodios Favoritos</string>
<string id="30183">Álbumes Reproducidos Frecuentemente</string>
<string id="30184">Series a Estrenar Próximamente</string>
<string id="30185">Sagas</string>
<string id="30186">Tráilers</string>
<string id="30187">Videoclips</string>
<string id="30188">Fotos</string>
<string id="30189">Películas No Vistas</string>
<!-- Verified -->
<string id="30190">Géneros de Películas</string>
<string id="30191">Estudios de Películas</string>
<string id="30192">Actores de Películas</string>
<string id="30193">Episodios No Vistos</string>
<string id="30194">Géneros de Series de TV</string>
<string id="30195">Cadenas de TV</string>
<string id="30196">Actores de Series</string>
<string id="30197">Listas de Reproducción</string>
<string id="30199">Establecer Vistas</string>
<string id="30200">Seleccionar Usuario</string>
<!-- Verified -->
<string id="30204">No se puede conectar con servidor</string>
<string id="30207">Canciones</string>
<string id="30208">Álbumes</string>
<string id="30209">Artistas de Álbumes</string>
<string id="30210">Artistas</string>
<string id="30211">Géneros Musicales</string>
<string id="30220">Últimos</string>
<string id="30221">En Progreso</string>
<string id="30222">NextUp</string>
<string id="30223">Vistas de Usuario</string>
<string id="30224">Reportar Métricas</string>
<string id="30227">Películas Aleatorias</string>
<string id="30228">Episodios Aleatorios</string>
<string id="30229">Ítems Aleatorios</string>
<!-- Verified -->
<string id="30230">Ítems Recomendados</string>
<!-- Verified -->
<string id="30235">Extras</string>
<!-- Verified -->
<string id="30236">Sincronizar Música de Tema</string>
<string id="30237">Sincronizar Extra Fanart</string>
<string id="30238">Sincronizar Sagas</string>
<string id="30239">Restablecer Base de datos local de Kodi</string>
<!-- Verified -->
<string id="30243">Activar HTTPS</string>
<!-- Verified -->
<string id="30245">Forzar Transcodificación de Códecs</string>
<string id="30249">Activar mensaje de conexión con servidor al inicio</string>
<!-- Verified -->
<string id="30251">Vídeos Caseros Añadidos Recientemente</string>
<!-- Verified -->
<string id="30252">Fotos Añadidas Recientemente</string>
<!-- Verified -->
<string id="30253">Vídeos Caseros Favoritos</string>
<!-- Verified -->
<string id="30254">Fotos Favoritas</string>
<!-- Verified -->
<string id="30255">Álbumes Favoritos</string>
<string id="30256">Videoclips Añadidos Recientemente</string>
<!-- Verified -->
<string id="30257">Videoclips En Progreso</string>
<!-- Verified -->
<string id="30258">Videoclips No Vistos</string>
<!-- Verified -->
<!-- Default views -->
<string id="30300">Activo</string>
<string id="30301">Limpiar Configuración</string>
<string id="30302">Películas</string>
<string id="30303">Sagas</string>
<string id="30304">Tráilers</string>
<string id="30305">Series de TV</string>
<string id="30306">Temporadas</string>
<string id="30307">Episodios</string>
<string id="30308">Artistas de Música</string>
<string id="30309">Álbumes</string>
<string id="30310">Videoclips</string>
<string id="30311">Canciones</string>
<string id="30312">Canales</string>
<!-- contextmenu -->
<string id="30401">Opciones Emby</string>
<string id="30405">Añadir a favoritos de Emby</string>
<string id="30406">Eliminar de favoritos de Emby</string>
<string id="30407">Establecer valoración personalizada para canción</string>
<string id="30408">Ajustes de complemento Emby</string>
<string id="30409">Eliminar ítem del servidor</string>
<string id="30410">Refrescar este ítem</string>
<string id="30411">Establecer valoración personalizada de canción (0-5)</string>
<!-- add-on settings -->
<string id="30500">Verifica Certificado SSL del Host</string>
<string id="30501">Certificado SSL del Cliente</string>
<string id="30502">Usar dirección alterna</string>
<string id="30503">Dirección Alterna de Servidor</string>
<string id="30504">Usar Nombre alterno de dispositivo</string>
<string id="30505">[COLOR yellow]Reintentar acceso[/COLOR]</string>
<string id="30506">Opciones de Sincronización</string>
<string id="30507">Mostrar Progreso de sincronización</string>
<string id="30508">Sincronizar Series de TV vacías</string>
<string id="30509">Activar Discoteca</string>
<string id="30510">Transmitir directo la discoteca</string>
<string id="30511">Modo de Reproducción</string>
<string id="30512">Forzar Guardado local (caché) de Arte</string>
<string id="30513">Limitar hilos de guardado local de arte (recomendado para rpi)</string>
<string id="30514">Activar inicio rápido (requiere plugin en el servidor)</string>
<string id="30515">Cantidad máxima de ítems a solicitar al servidor al mismo tiempo</string>
<string id="30516">Reproducción</string>
<string id="30517">Credenciales de Red</string>
<string id="30518">Activar modo Emby cinema</string>
<string id="30519">Preguntar si reproducir tráilers</string>
<string id="30520">Obviar confirmación de eliminación de Emby en menú de contexto (usar a su propio riesgo)</string>
<string id="30521">Intervalo de Salto atrás al reanudar (en segundos)</string>
<string id="30522">Forzar transcodificar H.265</string>
<string id="30523">Opciones de metadatos de Música (no compatible con transmisión directa)</string>
<string id="30524">Importar valoración de canciones directamente desde archivos</string>
<string id="30525">Convertir valoración de canciones a valoración Emby</string>
<string id="30526">Permitir actualización de valoración de canciones en los archivos</string>
<string id="30527">Ignorar especiales en próximos episodios</string>
<string id="30528">Usuarios permanentes a incluir en la sesión</string>
<string id="30529">Retraso en Inicio (en segundos)</string>
<string id="30530">Activar mensaje de reinicio del servidor</string>
<string id="30531">Activar notificación de nuevo contenido</string>
<string id="30532">Duración del popup para la videoteca (en segundos)</string>
<string id="30533">Duración del popup para la discoteca (en segundos)</string>
<string id="30534">Mensajes del Servidor</string>
<string id="30535">Generar un nuevo Id de dispositivo</string>
<string id="30536">Sincronizar cuando salvapantallas esté desactivado</string>
<string id="30537">Forzar Transcodificación de Hi10P</string>
<string id="30538">Desactivado</string>
<!-- service add-on -->
<string id="33000">Bienvenido(a)</string>
<string id="33001">Error de conexión</string>
<string id="33002">Servidor no disponible</string>
<string id="33003">Servidor está en línea</string>
<string id="33004">Ítems añadidos a lista de reproducción</string>
<string id="33005">Ítems encolados a lista de reproducción</string>
<string id="33006">El servidor está reiniciando</string>
<string id="33007">Acceso está activo</string>
<string id="33008">Introduzca contraseña para usuario:</string>
<string id="33009">Usuario o contraseña inválidos</string>
<string id="33010">Demasiados fallos de autenticación</string>
<string id="33011">No es posible reproducción directa</string>
<string id="33012">Reproducción directa falló 3 veces. Activando reproducción desde HTTP.</string>
<string id="33013">Elegir pista de audio</string>
<string id="33014">Elegir pista de subtítulos</string>
<string id="33015">¿Elimiar archivo de sus servidor de Emby?</string>
<string id="33016">¿Reproducir tráilers?</string>
<string id="33017">Obteniendo películas desde:</string>
<string id="33018">Obteniendo sagas</string>
<string id="33019">Obteniendo videoclips desde:</string>
<string id="33020">Obteniendo series de tv desde:</string>
<string id="33021">Obteniendo:</string>
<string id="33022">Se detectó que la base de datos debe ser re-creada para esta versión de Emby para Kodi. ¿Proceder?</string>
<string id="33023">Emby para Kodi podría funcionar incorrectamente hasta que la base de datos sea restablecida.</string>
<string id="33024">Cancelando el proceso de sincronización de la base de datos. La versión actual de Kodi no está soportada.</string>
<string id="33025">completado en:</string>
<string id="33026">Comparando películas desde:</string>
<string id="33027">Comparando sagas</string>
<string id="33028">Comparando videoclips desde:</string>
<string id="33029">Comparando series de tv desde:</string>
<string id="33030">Comparando episodios desde:</string>
<string id="33031">Comparando:</string>
<string id="33032">Falló la generación de un nuevo Id de dispositivo. Ver sus bitácoras para más información.</string>
<string id="33033">Se ha generado un nuevo Id de dispositivo. Kodi reinicará ahora.</string>
<string id="33034">¿Proceder con el servidor a continuación?</string>
<string id="33035">¡Cuidado! Si selecciona modo Nativo, algunas funciones de Emby no estarán presentes, tales como: modo Emby cinema, opciones de reproducción directa/transcodificación y calendario de acceso parental.</string>
<string id="33036">Complemento (Predeterminado)</string>
<string id="33037">Nativo (Rutas Directas)</string>
<string id="33038">¿Añadir credenciales de red para permitir a Kodi acceder a su contenido? Importante: Kodi necesitará ser reiniciado para ver las credenciales. Las mismas también pueden añadirse en otro momento.</string>
<string id="33039">¿Desactivar la discoteca Emby?</string>
<string id="33040">¿Transmisión Directa de la discoteca? Seleccione esta opción si habrá acceso remoto a la discoteca.</string>
<string id="33041">¿Eliminar archivo(s) del servidor Emby? ¡Esto también eliminará el(los) archivo(s) de su disco!</string>
<string id="33042">La ejecución del proceso de guardado local en caché pueder tomar un tiempo. ¿Continuar?</string>
<string id="33043">Sincronización de caché de Arte</string>
<string id="33044">¿Restablecer caché de Arte existente?</string>
<string id="33045">Actualizando caché de arte:</string>
<string id="33046">Esperando a que todos los hilos terminen:</string>
<string id="33047">Kodi no puede localizar el archivo:</string>
<string id="33048">Puede que necesite verificar sus credenciales de red en los ajustes del complemento, o utilizar la sustitución de rutas Emby para formatear correctamente su ruta (Cuadro de Mando Emby &gt; Biblioteca). ¿Detener la sincronización?</string>
<string id="33049">Añadido:</string>
<string id="33050">Si falla demasiadas veces en iniciar la sesión, el servidor Emby puede bloquear su cuenta. ¿Proceder de todos modos?</string>
<string id="33051">Canales de TV En Vivo (experimental)</string>
<string id="33052">Grabaciones de TV En Vivo (experimental)</string>
<string id="33053">Ajustes</string>
<string id="33054">Incluir usuario en la sesión</string>
<string id="33055">Refrescar listas de reproducción/nodos de Vídeo Emby</string>
<string id="33056">Realizar sincronización manual</string>
<string id="33057">Reparar la abse de datos local (forzar la actualización de todo el contenido)</string>
<string id="33058">Realizar restablecimiento de base de datos local</string>
<string id="33059">Guardar localmente en caché todo el arte</string>
<string id="33060">Sincronizar Media de temas Emby con Kodi</string>
<string id="33061">Incluir/Eliminar usuarios de la sesión</string>
<string id="33062">Incluir usuario</string>
<string id="33063">Eliminar usuario</string>
<string id="33064">Eliminar usuario de la sesión</string>
<string id="33065">¡Éxito!</string>
<string id="33066">Eliminado de la sesión:</string>
<string id="33067">Incluido en la sesión:</string>
<string id="33068">No fue posible incluir/eliminar usuario de la sesión</string>
<string id="33069">La tarea completó exitosamente</string>
<string id="33070">La tarea falló</string>
<string id="33071">Transmisión Directa</string>
<string id="33072">Método de reproducción para sus temas</string>
<string id="33073">El archivo de configuración no existe en TV Tunes. Cambie un ajuste y ejecute la tarea de nuevo.</string>
<string id="33074">¿Está seguro(a) que quiere restablecer su base de datos local de Kodi?</string>
<string id="33075">Modificar/Eliminar credenciales de red</string>
<string id="33076">Modificar</string>
<string id="33077">Eliminar</string>
<string id="33078">Eliminadas:</string>
<string id="33079">Introduzca el usuario de red</string>
<string id="33080">Introduzca la contraseña de red</string>
<string id="33081">Se añadieron credenciales de red para:</string>
<string id="33082">Introduzca el nombre del servidor o la dirección IP según se indica en sus rutas de biblioteca Emby. Por ejemplo, el nombre de servidor en la ruta \\\\SERVER-PC\\path\\ es \"SERVER-PC\"</string>
<string id="33083">Modificar el nombre de servidor o la dirección IP</string>
<string id="33084">Introduzca el nombre del servidor o la dirección IP</string>
<string id="33085">No pudo restablecerse la base de datos. Intente nuevamente.</string>
<string id="33086">¿Remover todo el arte del caché?</string>
<string id="33087">¿Restablecer todos los ajustes del complemento Emby?</string>
<string id="33088">Restablecimiento de la base de datos completado. Kodi reiniciará ahora para aplicar los cambios.</string>
</strings>

View file

@ -0,0 +1,330 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<strings>
<!-- Add-on settings -->
<string id="29999">Emby för Kodi</string>
<string id="30000">Primär serveradress</string>
<!-- Verified -->
<string id="30002">Spela upp ifrån HTTP istället för SMB</string>
<!-- Verified -->
<string id="30004">Lognivå</string>
<!-- Verified -->
<string id="30016">Enhetsnamn</string>
<!-- Verified -->
<string id="30022">Avancerat</string>
<string id="30024">Användarnamn</string>
<!-- Verified -->
<string id="30030">Portnummer</string>
<!-- Verified -->
<string id="30035">Antal nya album som ska visas:</string>
<string id="30036">Antal nya filmer som ska visas:</string>
<string id="30037">Antal nya TV-avsnitt som ska visas:</string>
<string id="30042">Uppdatera</string>
<string id="30043">Ta bort</string>
<string id="30044">Ogiltigt Användarnamn/Lösenord</string>
<string id="30045">Användarnamn kunde inte hittas</string>
<string id="30052">Tar bort</string>
<string id="30053">Väntar på server för borttagning</string>
<string id="30068">Sortera efter</string>
<string id="30069">Ingen</string>
<string id="30070">Action</string>
<string id="30071">Äventyr</string>
<string id="30072">Animaterat</string>
<string id="30073">Brott</string>
<string id="30074">Komedi</string>
<string id="30075">Dokumentär</string>
<string id="30076">Drama</string>
<string id="30077">Fantasi</string>
<string id="30078">Internationell</string>
<string id="30079">Historia</string>
<string id="30080">Skräck</string>
<string id="30081">Musik</string>
<string id="30082">Musikal</string>
<string id="30083">Mystisk</string>
<string id="30084">Romantik</string>
<string id="30085">Science Fiction</string>
<string id="30086">Kort</string>
<string id="30087">Spänning</string>
<string id="30088">Thriller</string>
<string id="30089">Västern</string>
<string id="30090">Genrefilter</string>
<string id="30091">Bekräfta borttagning utav fil?</string>
<!-- Verified -->
<string id="30093">Markera som visad</string>
<string id="30094">Markera som ej visad</string>
<string id="30097">Sortera efter</string>
<string id="30098">Fallande sortering</string>
<string id="30099">Stigande sortering</string>
<!-- resume dialog -->
<string id="30105">Fortsätt</string>
<string id="30106">Fortsätt från</string>
<string id="30107">Starta från början</string>
<string id="30114">Erbjud borttagning efter uppspelning</string>
<!-- Verified -->
<string id="30115">För avsnitt</string>
<!-- Verified -->
<string id="30116">För filmer</string>
<!-- Verified -->
<string id="30118">Lägg till fortsättningsprocent</string>
<string id="30119">Lägg till avsnittsnummer</string>
<string id="30120">Visa förloppsmätare</string>
<string id="30121">Laddar innehåll</string>
<string id="30122">Hämtar data</string>
<string id="30125">Klart</string>
<string id="30132">Varning</string>
<!-- Verified -->
<string id="30135">Fel</string>
<string id="30138">Sök</string>
<string id="30157">Aktivera förbättrade bilder (t.ex CoverArt)</string>
<!-- Verified -->
<string id="30158">Metadata</string>
<string id="30159">Bilder</string>
<string id="30160">Videokvalitet</string>
<!-- Verified -->
<string id="30165">Direktuppspelning</string>
<!-- Verified -->
<string id="30166">Omkodning</string>
<string id="30167">Serversökning lyckades</string>
<string id="30168">Hittade server</string>
<string id="30169">Adress:</string>
<!-- Video nodes -->
<string id="30170">Nyligen tillagda serier</string>
<!-- Verified -->
<string id="30171">Pågående serier</string>
<!-- Verified -->
<string id="30172">All musik</string>
<string id="30173">Kanaler</string>
<!-- Verified -->
<string id="30174">Nyligen tillagda filmer</string>
<!-- Verified -->
<string id="30175">Nyligen tillagda avsnitt</string>
<!-- Verified -->
<string id="30176">Nyligen tillagda album</string>
<string id="30177">Pågående filmer</string>
<!-- Verified -->
<string id="30178">Pågående avsnitt</string>
<!-- Verified -->
<string id="30179">Nästa avsnitt</string>
<!-- Verified -->
<string id="30180">Favoritfilmer</string>
<!-- Verified -->
<string id="30181">Favoritserier</string>
<!-- Verified -->
<string id="30182">Favoritavsnitt</string>
<string id="30183">Ofta spelade album</string>
<string id="30184">Kommande TV</string>
<string id="30185">Samlingar</string>
<string id="30186">Trailers</string>
<string id="30187">Musikvideor</string>
<string id="30188">Foton</string>
<string id="30189">Osedda filmer</string>
<!-- Verified -->
<string id="30190">Filmgenrer</string>
<string id="30191">Filmstudior</string>
<string id="30192">Filmskådespelare</string>
<string id="30193">Osedda avsnitt</string>
<string id="30194">TV-genrer</string>
<string id="30195">TV-bolag</string>
<string id="30196">TV-skådespelare</string>
<string id="30197">Spellistor</string>
<string id="30199">Ställ in Vyer</string>
<string id="30200">Välj användare</string>
<!-- Verified -->
<string id="30204">Kan inte koppla till servern</string>
<string id="30207">Låtar</string>
<string id="30208">Album</string>
<string id="30209">Albumartister</string>
<string id="30210">Artister</string>
<string id="30211">Musikgenrer</string>
<string id="30220">Senaste</string>
<string id="30221">Pågående</string>
<string id="30222">Nästa</string>
<string id="30223">Användarvyer</string>
<string id="30224">Rapportera Statistik</string>
<string id="30227">Slumpade filmer</string>
<string id="30228">Slumpade avsnitt</string>
<string id="30229">Slumpade objekt</string>
<!-- Verified -->
<string id="30230">Rekommenderade objekt</string>
<!-- Verified -->
<string id="30235">Extramaterial</string>
<!-- Verified -->
<string id="30236">Synkronisera musiktema</string>
<string id="30237">Synkronisera extra fanart</string>
<string id="30238">Synkronisera filmsamlingar</string>
<string id="30239">Återställ lokal Kodi-databas</string>
<!-- Verified -->
<string id="30243">Aktivera HTTPS</string>
<!-- Verified -->
<string id="30245">Tvinga Omkodingskodecs</string>
<string id="30249">Emby Server uppkopplingsmeddelande vid uppstart</string>
<!-- Verified -->
<string id="30251">Nyligen tillagda hemvideor</string>
<!-- Verified -->
<string id="30252">Nyligen tillagda foton</string>
<!-- Verified -->
<string id="30253">Favorithemvideor</string>
<!-- Verified -->
<string id="30254">Favoritfoton</string>
<!-- Verified -->
<string id="30255">Favoritalbum</string>
<string id="30256">Nyligen tillagda musikvideor</string>
<!-- Verified -->
<string id="30257">Pågående musikvideor</string>
<!-- Verified -->
<string id="30258">Osedda musikvideor</string>
<!-- Verified -->
<!-- Default views -->
<string id="30300">Aktiv</string>
<string id="30301">Återställ inställningar</string>
<string id="30302">Filmer</string>
<string id="30303">Samlingar</string>
<string id="30304">Trailers</string>
<string id="30305">Serier</string>
<string id="30306">Säsonger</string>
<string id="30307">Avsnitt</string>
<string id="30308">Musikartister</string>
<string id="30309">Musikalbum</string>
<string id="30310">Musikvideor</string>
<string id="30311">Låtar</string>
<string id="30312">Kanaler</string>
<!-- contextmenu -->
<string id="30401">Emby-inställningar</string>
<string id="30405">Lägg till Emby-favoriter</string>
<string id="30406">Ta bort från Emby-favoriter</string>
<string id="30407">Sätt anpassat betyg för låt</string>
<string id="30408">Emby tilläggsinställningar</string>
<string id="30409">Ta bort objekt från servern</string>
<string id="30410">Uppdatera detta objekt</string>
<string id="30411">Sätt betyg på låt (0-5)</string>
<!-- add-on settings -->
<string id="30500">Kontrollera värdens ssl-certifikat</string>
<string id="30501">Klientens ssl-certifikat</string>
<string id="30502">Använd alternativ adress</string>
<string id="30503">Alternativ serveraddress</string>
<string id="30504">Använd alternativt enhetsnamn</string>
<string id="30505">[COLOR yellow]Försök logga in igen[/COLOR]</string>
<string id="30506">Synkroniseringsalternativ</string>
<string id="30507">Visa förloppsmätare vid synkronisering</string>
<string id="30508">Synkronisera tomma serier</string>
<string id="30509">Aktivera musikbibliotek</string>
<string id="30510">Direktströmma musikbibliotek</string>
<string id="30511">Uppspelningsläge</string>
<string id="30512">Tvinga cachning av bilder</string>
<string id="30513">Begränsa bild cache trådar (rekommenderas för rpi)</string>
<string id="30514">Aktivera snabb upstart (kräver servertillägg)</string>
<string id="30515">Masximalt antal objekt att begära från servern samtidigt</string>
<string id="30516">Uppspelning</string>
<string id="30517">Nätverks inlogg</string>
<string id="30518">Aktivera Emby biografläge</string>
<string id="30519">Fråga för att spela upp trailers</string>
<string id="30520">Dölj Embys borttagningsbekräftelse i kontextmenyn(använd på egen risk)</string>
<string id="30521">Gå tillbaka vid återupptagen uppspelning (sekunder)</string>
<string id="30522">Tvinga omkodning av H265</string>
<string id="30523">Musik metadata alternativ (ej kompatibel med direktströmning)</string>
<string id="30524">Importera låtbetyg direkt från filer</string>
<string id="30525">Konvertera låtbetyg till Emby-betyg</string>
<string id="30526">Tillåt uppdatering av låtbetyg i filer</string>
<string id="30527">Ignorera specialavsnitt i nästa avsnitt</string>
<string id="30528">Permanenta användare att lägga till sessionen</string>
<string id="30529">Uppstartsfördröjning (sekunder)</string>
<string id="30530">Aktivera meddelande vid omstart av servern</string>
<string id="30531">Aktivera meddelande vid nytt innehåll</string>
<string id="30532">Fördröjning av pop-up för videobiblioteket (i sekunder)</string>
<string id="30533">Fördröjning av pop-up för musikbiblioteket (i sekunder)</string>
<string id="30534">Servermeddelanden</string>
<string id="30535">Generera nytt enhetsID</string>
<string id="30536">"Synka när skärmsläckare är inaktiverad
"</string>
<string id="30537">Tvinga omkodning av Hi10P</string>
<string id="30538">Inaktiverad</string>
<!-- service add-on -->
<string id="33000">Välkommen</string>
<string id="33001">Fel vid uppkoppling</string>
<string id="33002">Kan inte nå servern</string>
<string id="33003">Servern är uppkopplad</string>
<string id="33004">objekt tillagda till spellista</string>
<string id="33005">objekt köade till spellista</string>
<string id="33006">Serverns startar om</string>
<string id="33007">Åtkomst är aktiverad</string>
<string id="33008">Skriv in lösenord för användare:</string>
<string id="33009">Ogiltigt användarnamn eller lösenord</string>
<string id="33010">Misslyckades att autentisera för många gånger</string>
<string id="33011">Kan inte direktspela</string>
<string id="33012">Direktspelning misslyckades tre gånger. Spelar upp från HTTP.</string>
<string id="33013">Välj ljudspår</string>
<string id="33014">Välj ström för undertext</string>
<string id="33015">Ta bort filen från din Emby server?</string>
<string id="33016">Spela trailers?</string>
<string id="33017">Hämtar filmer från:</string>
<string id="33018">Hämtar samlingar</string>
<string id="33019">Hämtar musikvideos från:</string>
<string id="33020">Hämtar TV-serier från:</string>
<string id="33021">Hämtar:</string>
<string id="33022">Databasen behöver återskapas för den här versionen av Emby för Kodi. Fortsätt?</string>
<string id="33023">Emby för Kodi kan tappa funktion tills databasen har återställts.</string>
<string id="33024">Avbryter synkroniseringen av databasen. Nuvarande versionen av Kodi stöds inte.</string>
<string id="33025">färdig på:</string>
<string id="33026">Jämför filmer från:</string>
<string id="33027">Jämför samlingar</string>
<string id="33028">Jämför musikvideor från:</string>
<string id="33029">Jämför TV-serier från:</string>
<string id="33030">Jämför avsnitt från:</string>
<string id="33031">Jämför:</string>
<string id="33032">Kunde inte generera ett nytt enhetsID. Se i loggarna för mer information.</string>
<string id="33033">Ett nytt enhetsID har genererats. Kodi kommer nu starta om.</string>
<string id="33034">Fortsätt med följande server?</string>
<string id="33035">OBS! Om du väljer 'Native'-läget så tappar du vissa funktioner i Emby, som; Emby bioläge, direktströmning/omkodning och schema för föräldralås.</string>
<string id="33036">Tillägg (Standard)</string>
<string id="33037">Native (Direkta Sökvägar)</string>
<string id="33038">Lägg till nätverksuppgifter för att ge Kodi åtkomst till ditt innehåll? Viktigt: Kodi kommer behöva startas om för att se uppgifterna. Dom kan också läggas till vid ett senare tillfälle.</string>
<string id="33039">Inaktivera Emby musikbibliotek?</string>
<string id="33040">Direktströmma musikbiblioteket? Välj det här alternativet om musikbiblioteket inte finns tillgängligt lokalt.</string>
<string id="33041">Ta bort fil(er) från Emby Server? Det här tar också bort ifrån disk!</string>
<string id="33042">Caching processen kan ta lite tid. Fortsätt ändå?</string>
<string id="33043">Cachesynk för bilder</string>
<string id="33044">Återställ nuvarande bildcache</string>
<string id="33045">Uppdaterar bildcache:</string>
<string id="33046">Väntar på alla trådar att avslutas:</string>
<string id="33047">Kodi kan inte hitta filen:</string>
<string id="33048">Du kan behöva verifiera dina nätverksuppgifter i addon-inställningarna eller använda Emby sökvägsersättning för att formatera din sökväg korrekt(Emby dashboard &gt; bibliotek). Stoppa synkronisering?</string>
<string id="33049">Tillagd:</string>
<string id="33050">Om du misslyckas att logga in för många gånger, kan Emby server låsa ner ditt konto. Fortsätt ändå?</string>
<string id="33051">Live TV Kanaler (experimentellt)</string>
<string id="33052">Live TV Inspelningar (experimentellt)</string>
<string id="33053">Inställningar</string>
<string id="33054">Lägg till användare för sessionen</string>
<string id="33055">Uppdatera Emby spellistor/Videonoder</string>
<string id="33056">Kör manuell synk</string>
<string id="33057">Reparera lokala databasen (tvinga uppdatering av allt innehåll)</string>
<string id="33058">Återställ lokala databasen</string>
<string id="33059">Förlagra alla bilder</string>
<string id="33060">Synka Emby Tema till Kodi</string>
<string id="33061">Lägg till/Ta bort användare från sessionen</string>
<string id="33062">Lägg till användare</string>
<string id="33063">Ta bort användare</string>
<string id="33064">Ta bort användare från sessionen</string>
<string id="33065">Lyckades!</string>
<string id="33066">Borttagen från sessionen:</string>
<string id="33067">Tillagd till sessionen:</string>
<string id="33068">Kan inte lägga till/ta bort användaren från sessionen</string>
<string id="33069">Uppgiften lyckades</string>
<string id="33070">Uppgiften misslyckades</string>
<string id="33071">Direktströmma</string>
<string id="33072">Uppspelningsmetod för dina teman</string>
<string id="33073">Inställningsfilen finns inte i TVTunes. Ändra en inställning och kör sen uppgiften igen.</string>
<string id="33074">Är du säker på att du vill återställa din lokala Kodi databas?</string>
<string id="33075">Ändra/Ta bort nätverksuppgifter</string>
<string id="33076">Ändra</string>
<string id="33077">Ta bort</string>
<string id="33078">Borttagen:</string>
<string id="33079">Ange användarnamn för nätverk</string>
<string id="33080">Ange nätverkslösenordet</string>
<string id="33081">Lade till nätverksinlogg för:</string>
<string id="33082">Ange servernamn eller IP-adress efter din emby bibliotekssökvägar. T.ex. servernamnet: \\\\SERVER-PC\\sökväg blir \"SERVER-PC\"</string>
<string id="33083">Ändra servernamnet eller IP-adressen</string>
<string id="33084">Ange servernamnet eller IP-adressen</string>
<string id="33085">Kunde inte återställa databasen. Försök igen.</string>
<string id="33086">Ta bort alla förlagrade bilder?</string>
<string id="33087">Återställ alla Emby tilläggsinställningar?</string>
<string id="33088">Databasen har återställts, Kodi kommer nu att starta om för att verkställa ändringarna.</string>
</strings>

View file

@ -3,6 +3,7 @@
############################################################################### ###############################################################################
import json import json
import logging
import requests import requests
import os import os
import urllib import urllib
@ -12,14 +13,18 @@ import xbmc
import xbmcgui import xbmcgui
import xbmcvfs import xbmcvfs
import utils
import image_cache_thread import image_cache_thread
from utils import window, settings, language as lang, kodiSQL
# Disable annoying requests warnings # Disable annoying requests warnings
import requests.packages.urllib3 import requests.packages.urllib3
requests.packages.urllib3.disable_warnings() requests.packages.urllib3.disable_warnings()
##################################################################################################
log = logging.getLogger("EMBY."+__name__)
############################################################################### ###############################################################################
##################################################################################################
@utils.logging @utils.logging
@ -32,12 +37,13 @@ class Artwork():
imageCacheThreads = [] imageCacheThreads = []
imageCacheLimitThreads = 0 imageCacheLimitThreads = 0
def __init__(self): def __init__(self):
self.enableTextureCache = utils.settings('enableTextureCache') == "true" self.enableTextureCache = settings('enableTextureCache') == "true"
self.imageCacheLimitThreads = int(utils.settings("imageCacheLimit")) self.imageCacheLimitThreads = int(settings('imageCacheLimit'))
self.imageCacheLimitThreads = int(self.imageCacheLimitThreads * 5) self.imageCacheLimitThreads = int(self.imageCacheLimitThreads * 5)
utils.logMsg("Using Image Cache Thread Count: " + str(self.imageCacheLimitThreads), 1) log.info("Using Image Cache Thread Count: %s" % self.imageCacheLimitThreads)
if not self.xbmc_port and self.enableTextureCache: if not self.xbmc_port and self.enableTextureCache:
self.setKodiWebServerDetails() self.setKodiWebServerDetails()
@ -123,7 +129,7 @@ class Artwork():
result = json.loads(result) result = json.loads(result)
try: try:
self.xbmc_port = result['result']['value'] self.xbmc_port = result['result']['value']
except TypeError: except (TypeError, KeyError):
pass pass
web_user = { web_user = {
@ -160,7 +166,7 @@ class Artwork():
except TypeError: except TypeError:
pass pass
def FullTextureCacheSync(self): def fullTextureCacheSync(self):
# This method will sync all Kodi artwork to textures13.db # This method will sync all Kodi artwork to textures13.db
# and cache them locally. This takes diskspace! # and cache them locally. This takes diskspace!
import xbmcaddon import xbmcaddon
@ -170,7 +176,7 @@ class Artwork():
"Image Texture Cache", string(39250)): "Image Texture Cache", string(39250)):
return return
self.logMsg("Doing Image Cache Sync", 1) log.info("Doing Image Cache Sync")
dialog = xbmcgui.DialogProgress() dialog = xbmcgui.DialogProgress()
dialog.create("PlexKodiConnect", "Image Cache Sync") dialog.create("PlexKodiConnect", "Image Cache Sync")
@ -196,100 +202,107 @@ class Artwork():
file)) file))
# remove all existing data from texture DB # remove all existing data from texture DB
textureconnection = utils.kodiSQL('texture') connection = kodiSQL('texture')
texturecursor = textureconnection.cursor() cursor = connection.cursor()
texturecursor.execute('SELECT tbl_name FROM sqlite_master WHERE type="table"') cursor.execute('SELECT tbl_name FROM sqlite_master WHERE type="table"')
rows = texturecursor.fetchall() rows = cursor.fetchall()
for row in rows: for row in rows:
tableName = row[0] tableName = row[0]
if(tableName != "version"): if tableName != "version":
texturecursor.execute("DELETE FROM " + tableName) cursor.execute("DELETE FROM " + tableName)
textureconnection.commit() connection.commit()
texturecursor.close() cursor.close()
# Cache all entries in video DB # Cache all entries in video DB
connection = utils.kodiSQL('video') connection = kodiSQL('video')
cursor = connection.cursor() cursor = connection.cursor()
cursor.execute("SELECT url FROM art WHERE media_type != 'actor'") # dont include actors cursor.execute("SELECT url FROM art WHERE media_type != 'actor'") # dont include actors
result = cursor.fetchall() result = cursor.fetchall()
total = len(result) total = len(result)
count = 1 log.info("Image cache sync about to process %s images" % total)
percentage = 0
self.logMsg("Image cache sync about to process " + str(total) + " images", 1)
for url in result:
if dialog.iscanceled():
break
percentage = int((float(count) / float(total))*100)
textMessage = str(count) + " of " + str(total) + " (" + str(len(self.imageCacheThreads)) + ")"
dialog.update(percentage, "Updating Image Cache: " + textMessage)
self.CacheTexture(url[0])
count += 1
cursor.close() cursor.close()
count = 0
for url in result:
if pdialog.iscanceled():
break
percentage = int((float(count) / float(total))*100)
message = "%s of %s (%s)" % (count, total, self.imageCacheThreads)
pdialog.update(percentage, "%s %s" % (lang(33045), message))
self.cacheTexture(url[0])
count += 1
# Cache all entries in music DB # Cache all entries in music DB
connection = utils.kodiSQL('music') connection = kodiSQL('music')
cursor = connection.cursor() cursor = connection.cursor()
cursor.execute("SELECT url FROM art") cursor.execute("SELECT url FROM art")
result = cursor.fetchall() result = cursor.fetchall()
total = len(result) total = len(result)
count = 1 log.info("Image cache sync about to process %s images" % total)
percentage = 0
self.logMsg("Image cache sync about to process " + str(total) + " images", 1)
for url in result:
if dialog.iscanceled():
break
percentage = int((float(count) / float(total))*100)
textMessage = str(count) + " of " + str(total)
dialog.update(percentage, "Updating Image Cache: " + textMessage)
self.CacheTexture(url[0])
count += 1
cursor.close() cursor.close()
dialog.update(100, "Waiting for all threads to exit: " + str(len(self.imageCacheThreads))) count = 0
self.logMsg("Waiting for all threads to exit", 1) for url in result:
while len(self.imageCacheThreads) > 0:
if pdialog.iscanceled():
break
percentage = int((float(count) / float(total))*100)
message = "%s of %s" % (count, total)
pdialog.update(percentage, "%s %s" % (lang(33045), message))
self.cacheTexture(url[0])
count += 1
pdialog.update(100, "%s %s" % (lang(33046), len(self.imageCacheThreads)))
log.info("Waiting for all threads to exit")
while len(self.imageCacheThreads):
for thread in self.imageCacheThreads: for thread in self.imageCacheThreads:
if thread.isFinished: if thread.is_finished:
self.imageCacheThreads.remove(thread) self.imageCacheThreads.remove(thread)
dialog.update(100, "Waiting for all threads to exit: " + str(len(self.imageCacheThreads))) pdialog.update(100, "%s %s" % (lang(33046), len(self.imageCacheThreads)))
self.logMsg("Waiting for all threads to exit: " + str(len(self.imageCacheThreads)), 1) log.info("Waiting for all threads to exit: %s" % len(self.imageCacheThreads))
xbmc.sleep(500) xbmc.sleep(500)
dialog.close() pdialog.close()
def addWorkerImageCacheThread(self, urlToAdd): def addWorkerImageCacheThread(self, url):
while(True): while True:
# removed finished # removed finished
for thread in self.imageCacheThreads: for thread in self.imageCacheThreads:
if thread.isFinished: if thread.is_finished:
self.imageCacheThreads.remove(thread) self.imageCacheThreads.remove(thread)
# add a new thread or wait and retry if we hit our limit # add a new thread or wait and retry if we hit our limit
if(len(self.imageCacheThreads) < self.imageCacheLimitThreads): if len(self.imageCacheThreads) < self.imageCacheLimitThreads:
newThread = image_cache_thread.image_cache_thread() newThread = image_cache_thread.ImageCacheThread()
newThread.setUrl(self.double_urlencode(urlToAdd)) newThread.set_url(self.double_urlencode(url))
newThread.setHost(self.xbmc_host, self.xbmc_port) newThread.set_host(self.xbmc_host, self.xbmc_port)
newThread.setAuth(self.xbmc_username, self.xbmc_password) newThread.set_auth(self.xbmc_username, self.xbmc_password)
newThread.start() newThread.start()
self.imageCacheThreads.append(newThread) self.imageCacheThreads.append(newThread)
return return
else: else:
self.logMsg("Waiting for empty queue spot: " + str(len(self.imageCacheThreads)), 2) log.info("Waiting for empty queue spot: %s" % len(self.imageCacheThreads))
xbmc.sleep(50) xbmc.sleep(50)
def cacheTexture(self, url):
def CacheTexture(self, url):
# Cache a single image url to the texture cache # Cache a single image url to the texture cache
if url and self.enableTextureCache: if url and self.enableTextureCache:
if(self.imageCacheLimitThreads == 0 or self.imageCacheLimitThreads == None): self.logMsg("Processing: %s" % url, 2)
log.debug("Processing: %s" % url)
if not self.imageCacheLimitThreads:
# Add image to texture cache by simply calling it at the http endpoint # Add image to texture cache by simply calling it at the http endpoint
url = self.double_urlencode(url) url = self.double_urlencode(url)
try: # Extreme short timeouts so we will have a exception. try: # Extreme short timeouts so we will have a exception.
response = requests.head( response = requests.head(
url=( url=("http://%s:%s/image/image://%s"
"http://%s:%s/image/image://%s"
% (self.xbmc_host, self.xbmc_port, url)), % (self.xbmc_host, self.xbmc_port, url)),
auth=(self.xbmc_username, self.xbmc_password), auth=(self.xbmc_username, self.xbmc_password),
timeout=(0.01, 0.01)) timeout=(0.01, 0.01))
@ -398,7 +411,7 @@ class Artwork():
except TypeError: # Add the artwork except TypeError: # Add the artwork
cacheimage = True cacheimage = True
self.logMsg("Adding Art Link for kodiId: %s (%s)" % (kodiId, imageUrl), 2) log.debug("Adding Art Link for kodiId: %s (%s)" % (kodiId, imageUrl))
query = ( query = (
''' '''
@ -419,9 +432,8 @@ class Artwork():
# Delete current entry before updating with the new one # Delete current entry before updating with the new one
self.deleteCachedArtwork(url) self.deleteCachedArtwork(url)
self.logMsg( log.info("Updating Art url for %s kodiId: %s (%s) -> (%s)"
"Updating Art url for %s kodiId: %s (%s) -> (%s)" % (imageType, kodiId, url, imageUrl))
% (imageType, kodiId, url, imageUrl), 1)
query = ' '.join(( query = ' '.join((
@ -435,9 +447,9 @@ class Artwork():
# Cache fanart and poster in Kodi texture cache # Cache fanart and poster in Kodi texture cache
if cacheimage: if cacheimage:
self.CacheTexture(imageUrl) self.cacheTexture(imageUrl)
def deleteArtwork(self, kodiid, mediatype, cursor): def deleteArtwork(self, kodiId, mediaType, cursor):
query = ' '.join(( query = ' '.join((
@ -446,18 +458,18 @@ class Artwork():
"WHERE media_id = ?", "WHERE media_id = ?",
"AND media_type = ?" "AND media_type = ?"
)) ))
cursor.execute(query, (kodiid, mediatype,)) cursor.execute(query, (kodiId, mediaType,))
rows = cursor.fetchall() rows = cursor.fetchall()
for row in rows: for row in rows:
url = row[0] url = row[0]
imagetype = row[1] imageType = row[1]
if imagetype in ("poster", "fanart"): if imageType in ("poster", "fanart"):
self.deleteCachedArtwork(url) self.deleteCachedArtwork(url)
def deleteCachedArtwork(self, url): def deleteCachedArtwork(self, url):
# Only necessary to remove and apply a new backdrop or poster # Only necessary to remove and apply a new backdrop or poster
connection = utils.kodiSQL('texture') connection = kodiSQL('texture')
cursor = connection.cursor() cursor = connection.cursor()
try: try:
@ -465,22 +477,22 @@ class Artwork():
cachedurl = cursor.fetchone()[0] cachedurl = cursor.fetchone()[0]
except TypeError: except TypeError:
self.logMsg("Could not find cached url.", 1) log.info("Could not find cached url.")
except OperationalError: except OperationalError:
self.logMsg("Database is locked. Skip deletion process.", 1) log.info("Database is locked. Skip deletion process.")
else: # Delete thumbnail as well as the entry else: # Delete thumbnail as well as the entry
thumbnails = utils.tryDecode( thumbnails = utils.tryDecode(
xbmc.translatePath("special://thumbnails/%s" % cachedurl)) xbmc.translatePath("special://thumbnails/%s" % cachedurl))
self.logMsg("Deleting cached thumbnail: %s" % thumbnails, 1) log.info("Deleting cached thumbnail: %s" % thumbnails)
xbmcvfs.delete(thumbnails) xbmcvfs.delete(thumbnails)
try: try:
cursor.execute("DELETE FROM texture WHERE url = ?", (url,)) cursor.execute("DELETE FROM texture WHERE url = ?", (url,))
connection.commit() connection.commit()
except OperationalError: except OperationalError:
self.logMsg("Issue deleting url from cache. Skipping.", 2) log.debug("Issue deleting url from cache. Skipping.")
finally: finally:
cursor.close() cursor.close()
@ -503,10 +515,10 @@ class Artwork():
return people return people
def getUserArtwork(self, itemid, itemtype): def getUserArtwork(self, itemId, itemType):
# Load user information set by UserClient # Load user information set by UserClient
image = ("%s/emby/Users/%s/Images/%s?Format=original" image = ("%s/emby/Users/%s/Images/%s?Format=original"
% (self.server, itemid, itemtype)) % (self.server, itemId, itemType))
return image return image

View file

@ -2,6 +2,8 @@
############################################################################### ###############################################################################
import logging
import os
from uuid import uuid4 from uuid import uuid4
import xbmc import xbmc

View file

@ -6,8 +6,8 @@ import json
import requests import requests
import logging import logging
import utils
import clientinfo import clientinfo
from utils import window
################################################################################################## ##################################################################################################
@ -15,7 +15,8 @@ import clientinfo
from requests.packages.urllib3.exceptions import InsecureRequestWarning, InsecurePlatformWarning from requests.packages.urllib3.exceptions import InsecureRequestWarning, InsecurePlatformWarning
requests.packages.urllib3.disable_warnings(InsecureRequestWarning) requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
requests.packages.urllib3.disable_warnings(InsecurePlatformWarning) requests.packages.urllib3.disable_warnings(InsecurePlatformWarning)
#logging.getLogger('requests').setLevel(logging.WARNING)
log = logging.getLogger("EMBY."+__name__)
################################################################################################## ##################################################################################################
@ -25,7 +26,6 @@ class ConnectUtils():
# Borg - multiple instances, shared state # Borg - multiple instances, shared state
_shared_state = {} _shared_state = {}
clientInfo = clientinfo.ClientInfo() clientInfo = clientinfo.ClientInfo()
addonName = clientInfo.getAddonName()
# Requests session # Requests session
c = None c = None
@ -36,26 +36,21 @@ class ConnectUtils():
self.__dict__ = self._shared_state self.__dict__ = self._shared_state
def logMsg(self, msg, lvl=1):
className = self.__class__.__name__
utils.logMsg("%s %s" % (self.addonName, className), msg, lvl)
def setUserId(self, userId): def setUserId(self, userId):
# Reserved for userclient only # Reserved for userclient only
self.userId = userId self.userId = userId
self.logMsg("Set connect userId: %s" % userId, 2) log.debug("Set connect userId: %s" % userId)
def setServer(self, server): def setServer(self, server):
# Reserved for userclient only # Reserved for userclient only
self.server = server self.server = server
self.logMsg("Set connect server: %s" % server, 2) log.debug("Set connect server: %s" % server)
def setToken(self, token): def setToken(self, token):
# Reserved for userclient only # Reserved for userclient only
self.token = token self.token = token
self.logMsg("Set connect token: %s" % token, 2) log.debug("Set connect token: %s" % token)
def startSession(self): def startSession(self):
@ -73,7 +68,7 @@ class ConnectUtils():
if self.sslclient is not None: if self.sslclient is not None:
verify = self.sslclient verify = self.sslclient
except: except:
self.logMsg("Could not load SSL settings.", 1) log.info("Could not load SSL settings.")
# Start session # Start session
self.c = requests.Session() self.c = requests.Session()
@ -83,13 +78,13 @@ class ConnectUtils():
self.c.mount("http://", requests.adapters.HTTPAdapter(max_retries=1)) self.c.mount("http://", requests.adapters.HTTPAdapter(max_retries=1))
self.c.mount("https://", requests.adapters.HTTPAdapter(max_retries=1)) self.c.mount("https://", requests.adapters.HTTPAdapter(max_retries=1))
self.logMsg("Requests session started on: %s" % self.server, 1) log.info("Requests session started on: %s" % self.server)
def stopSession(self): def stopSession(self):
try: try:
self.c.close() self.c.close()
except Exception as e: except Exception:
self.logMsg("Requests session could not be terminated: %s" % e, 1) log.warn("Requests session could not be terminated")
def getHeader(self, authenticate=True): def getHeader(self, authenticate=True):
@ -103,7 +98,7 @@ class ConnectUtils():
'Content-type': 'application/x-www-form-urlencoded; charset=UTF-8', 'Content-type': 'application/x-www-form-urlencoded; charset=UTF-8',
'Accept': "application/json" 'Accept': "application/json"
} }
self.logMsg("Header: %s" % header, 1) log.info("Header: %s" % header)
else: else:
token = self.token token = self.token
@ -115,17 +110,17 @@ class ConnectUtils():
'X-Application': "Kodi/%s" % version, 'X-Application': "Kodi/%s" % version,
'X-Connect-UserToken': token 'X-Connect-UserToken': token
} }
self.logMsg("Header: %s" % header, 1) log.info("Header: %s" % header)
return header return header
def doUrl(self, url, data=None, postBody=None, rtype="GET", def doUrl(self, url, data=None, postBody=None, rtype="GET",
parameters=None, authenticate=True, timeout=None): parameters=None, authenticate=True, timeout=None):
window = utils.window log.debug("=== ENTER connectUrl ===")
self.logMsg("=== ENTER connectUrl ===", 2)
default_link = "" default_link = ""
if timeout is None: if timeout is None:
timeout = self.timeout timeout = self.timeout
@ -209,25 +204,25 @@ class ConnectUtils():
verify=verifyssl) verify=verifyssl)
##### THE RESPONSE ##### ##### THE RESPONSE #####
self.logMsg(r.url, 1) log.info(r.url)
self.logMsg(r, 1) log.info(r)
if r.status_code == 204: if r.status_code == 204:
# No body in the response # No body in the response
self.logMsg("====== 204 Success ======", 1) log.info("====== 204 Success ======")
elif r.status_code == requests.codes.ok: elif r.status_code == requests.codes.ok:
try: try:
# UNICODE - JSON object # UNICODE - JSON object
r = r.json() r = r.json()
self.logMsg("====== 200 Success ======", 1) log.info("====== 200 Success ======")
self.logMsg("Response: %s" % r, 1) log.info("Response: %s" % r)
return r return r
except: except:
if r.headers.get('content-type') != "text/html": if r.headers.get('content-type') != "text/html":
self.logMsg("Unable to convert the response for: %s" % url, 1) log.info("Unable to convert the response for: %s" % url)
else: else:
r.raise_for_status() r.raise_for_status()
@ -238,8 +233,7 @@ class ConnectUtils():
pass pass
except requests.exceptions.ConnectTimeout as e: except requests.exceptions.ConnectTimeout as e:
self.logMsg("Server timeout at: %s" % url, 0) log.warn("Server timeout at: %s" % url)
self.logMsg(e, 1)
except requests.exceptions.HTTPError as e: except requests.exceptions.HTTPError as e:
@ -255,11 +249,9 @@ class ConnectUtils():
pass pass
except requests.exceptions.SSLError as e: except requests.exceptions.SSLError as e:
self.logMsg("Invalid SSL certificate for: %s" % url, 0) log.warn("Invalid SSL certificate for: %s" % url)
self.logMsg(e, 1)
except requests.exceptions.RequestException as e: except requests.exceptions.RequestException as e:
self.logMsg("Unknown error connecting to: %s" % url, 0) log.warn("Unknown error connecting to: %s" % url)
self.logMsg(e, 1)
return default_link return default_link

View file

@ -0,0 +1 @@
# Dummy file to make this directory a package.

View file

@ -0,0 +1,76 @@
# -*- coding: utf-8 -*-
##################################################################################################
import os
import xbmcgui
import xbmcaddon
##################################################################################################
addon = xbmcaddon.Addon('plugin.video.emby')
ACTION_BACK = 92
SIGN_IN = 200
REMIND_LATER = 201
class LoginConnect(xbmcgui.WindowXMLDialog):
def __init__(self, *args, **kwargs):
xbmcgui.WindowXMLDialog.__init__(self, *args, **kwargs)
def __add_editcontrol(self, x, y, height, width, password=0):
media = os.path.join(addon.getAddonInfo('path'), 'resources', 'skins', 'default', 'media')
control = xbmcgui.ControlEdit(0,0,0,0,
label="User",
font="font10",
textColor="ff464646",
focusTexture=os.path.join(media, "button-focus.png"),
noFocusTexture=os.path.join(media, "button-focus.png"),
isPassword=password)
control.setPosition(x,y)
control.setHeight(height)
control.setWidth(width)
self.addControl(control)
return control
def onInit(self):
self.user_field = self.__add_editcontrol(685,385,40,500)
self.setFocus(self.user_field)
self.password_field = self.__add_editcontrol(685,470,40,500, password=1)
self.signin_button = self.getControl(SIGN_IN)
self.remind_button = self.getControl(REMIND_LATER)
self.user_field.controlUp(self.remind_button)
self.user_field.controlDown(self.password_field)
self.password_field.controlUp(self.user_field)
self.password_field.controlDown(self.signin_button)
self.signin_button.controlUp(self.password_field)
self.remind_button.controlDown(self.user_field)
def onClick(self, control):
if control == SIGN_IN:
# Sign in to emby connect
self.user = self.user_field.getText()
__password = self.password_field.getText()
### REVIEW ONCE CONNECT MODULE IS MADE
self.close()
elif control == REMIND_LATER:
# Remind me later
self.close()
def onAction(self, action):
if action == ACTION_BACK:
self.close()

View file

@ -3,6 +3,12 @@
############################################################################### ###############################################################################
from utils import logging, kodiSQL from utils import logging, kodiSQL
import logging
from sqlite3 import OperationalError
##################################################################################################
log = logging.getLogger("EMBY."+__name__)
############################################################################### ###############################################################################

View file

@ -1,42 +1,55 @@
# -*- coding: utf-8 -*-
#################################################################################################
import logging
import threading import threading
import utils
import xbmc
import requests import requests
# Disable annoying requests warnings # Disable annoying requests warnings
import requests.packages.urllib3 import requests.packages.urllib3
requests.packages.urllib3.disable_warnings() requests.packages.urllib3.disable_warnings()
#################################################################################################
log = logging.getLogger("EMBY."+__name__)
#################################################################################################
@utils.logging @utils.logging
class image_cache_thread(threading.Thread): class ImageCacheThread(threading.Thread):
urlToProcess = None url_to_process = None
isFinished = False is_finished = False
xbmc_host = "" xbmc_host = ""
xbmc_port = "" xbmc_port = ""
xbmc_username = "" xbmc_username = ""
xbmc_password = "" xbmc_password = ""
def __init__(self): def __init__(self):
self.monitor = xbmc.Monitor()
threading.Thread.__init__(self) threading.Thread.__init__(self)
def setUrl(self, url):
self.urlToProcess = url
def setHost(self, host, port): def set_url(self, url):
self.url_to_process = url
def set_host(self, host, port):
self.xbmc_host = host self.xbmc_host = host
self.xbmc_port = port self.xbmc_port = port
def setAuth(self, user, pwd): def set_auth(self, username, password):
self.xbmc_username = user
self.xbmc_password = pwd self.xbmc_username = username
self.xbmc_password = password
def run(self): def run(self):
self.logMsg("Image Caching Thread Processing : " + self.urlToProcess, 2) log.debug("Image Caching Thread Processing: %s", self.url_to_process)
try: try:
response = requests.head( response = requests.head(
@ -46,9 +59,8 @@ class image_cache_thread(threading.Thread):
auth=(self.xbmc_username, self.xbmc_password), auth=(self.xbmc_username, self.xbmc_password),
timeout=(5, 5)) timeout=(5, 5))
# We don't need the result # We don't need the result
except: pass except Exception:
pass
self.logMsg("Image Caching Thread Exited", 2)
self.isFinished = True
log.debug("Image Caching Thread Exited")
self.is_finished = True

View file

@ -2,6 +2,8 @@
############################################################################### ###############################################################################
import logging
import xbmc import xbmc
from ntpath import dirname from ntpath import dirname
@ -31,11 +33,13 @@ class GetKodiDB():
self.kodiconn = kodiSQL(self.itemType) self.kodiconn = kodiSQL(self.itemType)
self.emby_db = Kodidb_Functions(self.kodiconn.cursor()) self.emby_db = Kodidb_Functions(self.kodiconn.cursor())
return self.emby_db return self.emby_db
#################################################################################################
def __exit__(self, type, value, traceback): def __exit__(self, type, value, traceback):
self.kodiconn.commit() self.kodiconn.commit()
self.kodiconn.close() self.kodiconn.close()
#################################################################################################
@logging @logging
class Kodidb_Functions(): class Kodidb_Functions():
@ -48,7 +52,6 @@ class Kodidb_Functions():
self.clientInfo = clientinfo.ClientInfo() self.clientInfo = clientinfo.ClientInfo()
self.artwork = artwork.Artwork() self.artwork = artwork.Artwork()
def pathHack(self): def pathHack(self):
""" """
Use with Kodi video DB Use with Kodi video DB
@ -232,7 +235,7 @@ class Kodidb_Functions():
query = "INSERT INTO country(country_id, name) values(?, ?)" query = "INSERT INTO country(country_id, name) values(?, ?)"
self.cursor.execute(query, (country_id, country)) self.cursor.execute(query, (country_id, country))
self.logMsg("Add country to media, processing: %s" % country, 2) log.debug("Add country to media, processing: %s" % country)
finally: # Assign country to content finally: # Assign country to content
query = ( query = (
@ -266,7 +269,7 @@ class Kodidb_Functions():
query = "INSERT INTO country(idCountry, strCountry) values(?, ?)" query = "INSERT INTO country(idCountry, strCountry) values(?, ?)"
self.cursor.execute(query, (idCountry, country)) self.cursor.execute(query, (idCountry, country))
self.logMsg("Add country to media, processing: %s" % country, 2) log.debug("Add country to media, processing: %s" % country)
finally: finally:
# Only movies have a country field # Only movies have a country field
@ -311,7 +314,7 @@ class Kodidb_Functions():
query = "INSERT INTO actor(actor_id, name) values(?, ?)" query = "INSERT INTO actor(actor_id, name) values(?, ?)"
self.cursor.execute(query, (actorid, name)) self.cursor.execute(query, (actorid, name))
self.logMsg("Add people to media, processing: %s" % name, 2) log.debug("Add people to media, processing: %s" % name)
finally: finally:
# Link person to content # Link person to content
@ -381,7 +384,7 @@ class Kodidb_Functions():
query = "INSERT INTO actors(idActor, strActor) values(?, ?)" query = "INSERT INTO actors(idActor, strActor) values(?, ?)"
self.cursor.execute(query, (actorid, name)) self.cursor.execute(query, (actorid, name))
self.logMsg("Add people to media, processing: %s" % name, 2) log.debug("Add people to media, processing: %s" % name)
finally: finally:
# Link person to content # Link person to content
@ -541,7 +544,7 @@ class Kodidb_Functions():
query = "INSERT INTO genre(genre_id, name) values(?, ?)" query = "INSERT INTO genre(genre_id, name) values(?, ?)"
self.cursor.execute(query, (genre_id, genre)) self.cursor.execute(query, (genre_id, genre))
self.logMsg("Add Genres to media, processing: %s" % genre, 2) log.debug("Add Genres to media, processing: %s" % genre)
finally: finally:
# Assign genre to item # Assign genre to item
@ -586,7 +589,7 @@ class Kodidb_Functions():
query = "INSERT INTO genre(idGenre, strGenre) values(?, ?)" query = "INSERT INTO genre(idGenre, strGenre) values(?, ?)"
self.cursor.execute(query, (idGenre, genre)) self.cursor.execute(query, (idGenre, genre))
self.logMsg("Add Genres to media, processing: %s" % genre, 2) log.debug("Add Genres to media, processing: %s" % genre)
finally: finally:
# Assign genre to item # Assign genre to item
@ -645,7 +648,7 @@ class Kodidb_Functions():
query = "INSERT INTO studio(studio_id, name) values(?, ?)" query = "INSERT INTO studio(studio_id, name) values(?, ?)"
self.cursor.execute(query, (studioid, studio)) self.cursor.execute(query, (studioid, studio))
self.logMsg("Add Studios to media, processing: %s" % studio, 2) log.debug("Add Studios to media, processing: %s" % studio)
finally: # Assign studio to item finally: # Assign studio to item
query = ( query = (
@ -676,7 +679,7 @@ class Kodidb_Functions():
query = "INSERT INTO studio(idstudio, strstudio) values(?, ?)" query = "INSERT INTO studio(idstudio, strstudio) values(?, ?)"
self.cursor.execute(query, (studioid, studio)) self.cursor.execute(query, (studioid, studio))
self.logMsg("Add Studios to media, processing: %s" % studio, 2) log.debug("Add Studios to media, processing: %s" % studio)
finally: # Assign studio to item finally: # Assign studio to item
if "movie" in mediatype: if "movie" in mediatype:
@ -966,7 +969,7 @@ class Kodidb_Functions():
self.cursor.execute(query, (kodiid, mediatype)) self.cursor.execute(query, (kodiid, mediatype))
# Add tags # Add tags
self.logMsg("Adding Tags: %s" % tags, 2) log.debug("Adding Tags: %s" % tags)
for tag in tags: for tag in tags:
self.addTag(kodiid, tag, mediatype) self.addTag(kodiid, tag, mediatype)
@ -988,7 +991,7 @@ class Kodidb_Functions():
except TypeError: except TypeError:
# Create the tag, because it does not exist # Create the tag, because it does not exist
tag_id = self.createTag(tag) tag_id = self.createTag(tag)
self.logMsg("Adding tag: %s" % tag, 2) log.debug("Adding tag: %s" % tag)
finally: finally:
# Assign tag to item # Assign tag to item
@ -1017,7 +1020,7 @@ class Kodidb_Functions():
except TypeError: except TypeError:
# Create the tag # Create the tag
tag_id = self.createTag(tag) tag_id = self.createTag(tag)
self.logMsg("Adding tag: %s" % tag, 2) log.debug("Adding tag: %s" % tag)
finally: finally:
# Assign tag to item # Assign tag to item
@ -1053,7 +1056,7 @@ class Kodidb_Functions():
query = "INSERT INTO tag(tag_id, name) values(?, ?)" query = "INSERT INTO tag(tag_id, name) values(?, ?)"
self.cursor.execute(query, (tag_id, name)) self.cursor.execute(query, (tag_id, name))
self.logMsg("Create tag_id: %s name: %s" % (tag_id, name), 2) log.debug("Create tag_id: %s name: %s" % (tag_id, name))
else: else:
# Kodi Helix # Kodi Helix
query = ' '.join(( query = ' '.join((
@ -1073,13 +1076,13 @@ class Kodidb_Functions():
query = "INSERT INTO tag(idTag, strTag) values(?, ?)" query = "INSERT INTO tag(idTag, strTag) values(?, ?)"
self.cursor.execute(query, (tag_id, name)) self.cursor.execute(query, (tag_id, name))
self.logMsg("Create idTag: %s name: %s" % (tag_id, name), 2) log.debug("Create idTag: %s name: %s" % (tag_id, name))
return tag_id return tag_id
def updateTag(self, oldtag, newtag, kodiid, mediatype): def updateTag(self, oldtag, newtag, kodiid, mediatype):
self.logMsg("Updating: %s with %s for %s: %s" % (oldtag, newtag, mediatype, kodiid), 2) log.debug("Updating: %s with %s for %s: %s" % (oldtag, newtag, mediatype, kodiid))
if self.kodiversion in (15, 16, 17): if self.kodiversion in (15, 16, 17):
# Kodi Isengard, Jarvis, Krypton # Kodi Isengard, Jarvis, Krypton
@ -1096,7 +1099,6 @@ class Kodidb_Functions():
except Exception as e: except Exception as e:
# The new tag we are going to apply already exists for this item # The new tag we are going to apply already exists for this item
# delete current tag instead # delete current tag instead
self.logMsg("Exception: %s" % e, 1)
query = ' '.join(( query = ' '.join((
"DELETE FROM tag_link", "DELETE FROM tag_link",
@ -1120,7 +1122,6 @@ class Kodidb_Functions():
except Exception as e: except Exception as e:
# The new tag we are going to apply already exists for this item # The new tag we are going to apply already exists for this item
# delete current tag instead # delete current tag instead
self.logMsg("Exception: %s" % e, 1)
query = ' '.join(( query = ' '.join((
"DELETE FROM taglinks", "DELETE FROM taglinks",
@ -1192,7 +1193,7 @@ class Kodidb_Functions():
def createBoxset(self, boxsetname): def createBoxset(self, boxsetname):
self.logMsg("Adding boxset: %s" % boxsetname, 2) log.debug("Adding boxset: %s" % boxsetname)
query = ' '.join(( query = ' '.join((
"SELECT idSet", "SELECT idSet",

View file

@ -0,0 +1,74 @@
# -*- coding: utf-8 -*-
##################################################################################################
import logging
import xbmc
from utils import window
##################################################################################################
def config():
logger = logging.getLogger('EMBY')
logger.addHandler(LogHandler())
logger.setLevel(logging.DEBUG)
class LogHandler(logging.StreamHandler):
def __init__(self):
logging.StreamHandler.__init__(self)
self.setFormatter(MyFormatter())
def emit(self, record):
if self._get_log_level(record.levelno):
try:
xbmc.log(self.format(record), level=xbmc.LOGNOTICE)
except UnicodeEncodeError:
xbmc.log(self.format(record).encode('utf-8'), level=xbmc.LOGNOTICE)
@classmethod
def _get_log_level(cls, level):
levels = {
logging.ERROR: 0,
logging.WARNING: 0,
logging.INFO: 1,
logging.DEBUG: 2
}
try:
log_level = int(window('emby_logLevel'))
except ValueError:
log_level = 0
return log_level >= levels[level]
class MyFormatter(logging.Formatter):
def __init__(self, fmt="%(name)s -> %(message)s"):
logging.Formatter.__init__(self, fmt)
def format(self, record):
# Save the original format configured by the user
# when the logger formatter was instantiated
format_orig = self._fmt
# Replace the original format with one customized by logging level
if record.levelno in (logging.DEBUG, logging.ERROR):
self._fmt = '%(name)s -> %(levelname)s:: %(message)s'
# Call the original formatter class to do the grunt work
result = logging.Formatter.format(self, record)
# Restore the original format configured by the user
self._fmt = format_orig
return result

View file

@ -2,6 +2,7 @@
################################################################################################# #################################################################################################
import logging
import os import os
import xbmc import xbmc
@ -12,20 +13,21 @@ from mutagen.id3 import ID3
from mutagen import id3 from mutagen import id3
import read_embyserver as embyserver import read_embyserver as embyserver
import utils from utils import window
#################################################################################################
log = logging.getLogger("EMBY."+__name__)
################################################################################################# #################################################################################################
# Helper for the music library, intended to fix missing song ID3 tags on Emby # Helper for the music library, intended to fix missing song ID3 tags on Emby
def logMsg(msg, lvl=1):
utils.logMsg("%s %s" % ("Emby", "musictools"), msg, lvl)
def getRealFileName(filename, isTemp=False): def getRealFileName(filename, isTemp=False):
#get the filename path accessible by python if possible... #get the filename path accessible by python if possible...
if not xbmcvfs.exists(filename): if not xbmcvfs.exists(filename):
logMsg( "File does not exist! %s" %(filename), 0) log.warn("File does not exist! %s" % filename)
return (False, "") return (False, "")
#if we use os.path method on older python versions (sunch as some android builds), we need to pass arguments as string #if we use os.path method on older python versions (sunch as some android builds), we need to pass arguments as string
@ -181,7 +183,7 @@ def getSongTags(file):
hasEmbeddedCover = False hasEmbeddedCover = False
isTemp,filename = getRealFileName(file) isTemp,filename = getRealFileName(file)
logMsg( "getting song ID3 tags for " + filename) log.info( "getting song ID3 tags for " + filename)
try: try:
###### FLAC FILES ############# ###### FLAC FILES #############
@ -215,14 +217,14 @@ def getSongTags(file):
#POPM rating is 0-255 and needs to be converted to 0-5 range #POPM rating is 0-255 and needs to be converted to 0-5 range
if rating > 5: rating = (rating / 255) * 5 if rating > 5: rating = (rating / 255) * 5
else: else:
logMsg( "Not supported fileformat or unable to access file: %s" %(filename)) log.info( "Not supported fileformat or unable to access file: %s" %(filename))
#the rating must be a round value #the rating must be a round value
rating = int(round(rating,0)) rating = int(round(rating,0))
except Exception as e: except Exception as e:
#file in use ? #file in use ?
utils.logMsg("Exception in getSongTags", str(e),0) log.error("Exception in getSongTags %s" % e)
rating = None rating = None
#remove tempfile if needed.... #remove tempfile if needed....
@ -244,7 +246,7 @@ def updateRatingToFile(rating, file):
xbmcvfs.copy(file, tempfile) xbmcvfs.copy(file, tempfile)
tempfile = utils.tryDecode(xbmc.translatePath(tempfile)) tempfile = utils.tryDecode(xbmc.translatePath(tempfile))
logMsg( "setting song rating: %s for filename: %s - using tempfile: %s" %(rating,file,tempfile)) log.info( "setting song rating: %s for filename: %s - using tempfile: %s" %(rating,file,tempfile))
if not tempfile: if not tempfile:
return return
@ -261,7 +263,7 @@ def updateRatingToFile(rating, file):
audio.add(id3.POPM(email="Windows Media Player 9 Series", rating=calcrating, count=1)) audio.add(id3.POPM(email="Windows Media Player 9 Series", rating=calcrating, count=1))
audio.save() audio.save()
else: else:
logMsg( "Not supported fileformat: %s" %(tempfile)) log.info( "Not supported fileformat: %s" %(tempfile))
#once we have succesfully written the flags we move the temp file to destination, otherwise not proceeding and just delete the temp #once we have succesfully written the flags we move the temp file to destination, otherwise not proceeding and just delete the temp
#safety check: we check the file size of the temp file before proceeding with overwite of original file #safety check: we check the file size of the temp file before proceeding with overwite of original file
@ -272,14 +274,14 @@ def updateRatingToFile(rating, file):
xbmcvfs.delete(file) xbmcvfs.delete(file)
xbmcvfs.copy(tempfile,file) xbmcvfs.copy(tempfile,file)
else: else:
logMsg( "Checksum mismatch for filename: %s - using tempfile: %s - not proceeding with file overwite!" %(rating,file,tempfile)) log.info( "Checksum mismatch for filename: %s - using tempfile: %s - not proceeding with file overwite!" %(rating,file,tempfile))
#always delete the tempfile #always delete the tempfile
xbmcvfs.delete(tempfile) xbmcvfs.delete(tempfile)
except Exception as e: except Exception as e:
#file in use ? #file in use ?
logMsg("Exception in updateRatingToFile %s" %e,0) log.error("Exception in updateRatingToFile %s" % e)

View file

@ -2,13 +2,17 @@
################################################################################################# #################################################################################################
import logging
import xbmc import xbmc
import utils import utils
import downloadutils import downloadutils
from utils import window, settings, kodiSQL
################################################################################################# #################################################################################################
log = logging.getLogger("EMBY."+__name__)
@utils.logging @utils.logging
class Read_EmbyServer(): class Read_EmbyServer():
@ -26,7 +30,6 @@ class Read_EmbyServer():
# Split up list in pieces of size. Will generate a list of lists # 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)] return [itemlist[i:i+size] for i in range(0, len(itemlist), size)]
def getItem(self, itemid): def getItem(self, itemid):
# This will return the full item # This will return the full item
item = {} item = {}
@ -49,7 +52,8 @@ class Read_EmbyServer():
'Ids': ",".join(itemlist), 'Ids': ",".join(itemlist),
'Fields': "Etag" 'Fields': "Etag"
} }
result = self.doUtils("{server}/emby/Users/{UserId}/Items?&format=json", parameters=params) url = "{server}/emby/Users/{UserId}/Items?&format=json"
result = self.doUtils(url, parameters=params)
if result: if result:
items.extend(result['Items']) items.extend(result['Items'])
@ -75,7 +79,8 @@ class Read_EmbyServer():
"MediaSources,VoteCount" "MediaSources,VoteCount"
) )
} }
result = self.doUtils("{server}/emby/Users/{UserId}/Items?format=json", parameters=params) url = "{server}/emby/Users/{UserId}/Items?format=json"
result = self.doUtils(url, parameters=params)
if result: if result:
items.extend(result['Items']) items.extend(result['Items'])
@ -85,14 +90,15 @@ class Read_EmbyServer():
# Returns ancestors using plexid # Returns ancestors using plexid
viewId = None viewId = None
for view in self.doUtils("{server}/emby/Items/%s/Ancestors?UserId={UserId}&format=json" % itemid): url = "{server}/emby/Items/%s/Ancestors?UserId={UserId}&format=json" % itemid
for view in self.doUtils(url):
if view['Type'] == "CollectionFolder": if view['Type'] == "CollectionFolder":
# Found view # Found view
viewId = view['Id'] viewId = view['Id']
# Compare to view table in emby database # Compare to view table in emby database
emby = utils.kodiSQL('emby') emby = kodiSQL('emby')
cursor_emby = emby.cursor() cursor_emby = emby.cursor()
query = ' '.join(( query = ' '.join((
@ -113,7 +119,8 @@ class Read_EmbyServer():
return [viewName, viewId, mediatype] return [viewName, viewId, mediatype]
def getFilteredSection(self, parentid, itemtype=None, sortby="SortName", recursive=True, limit=None, sortorder="Ascending", filter=""): def getFilteredSection(self, parentid, itemtype=None, sortby="SortName", recursive=True,
limit=None, sortorder="Ascending", filter_type=""):
params = { params = {
'ParentId': parentid, 'ParentId': parentid,
@ -126,39 +133,54 @@ class Read_EmbyServer():
'SortBy': sortby, 'SortBy': sortby,
'SortOrder': sortorder, 'SortOrder': sortorder,
'Filters': filter, 'Filters': filter,
'Fields': ( "Path,Genres,SortName,Studios,Writer,ProductionYear,Taglines," 'Fields': (
"Path,Genres,SortName,Studios,Writer,ProductionYear,Taglines,"
"CommunityRating,OfficialRating,CumulativeRunTimeTicks," "CommunityRating,OfficialRating,CumulativeRunTimeTicks,"
"Metascore,AirTime,DateCreated,MediaStreams,People,Overview," "Metascore,AirTime,DateCreated,MediaStreams,People,Overview,"
"CriticRating,CriticRatingSummary,Etag,ShortOverview,ProductionLocations," "CriticRating,CriticRatingSummary,Etag,ShortOverview,ProductionLocations,"
"Tags,ProviderIds,ParentId,RemoteTrailers,SpecialEpisodeNumbers") "Tags,ProviderIds,ParentId,RemoteTrailers,SpecialEpisodeNumbers"
)
} }
return self.doUtils("{server}/emby/Users/{UserId}/Items?format=json", parameters=params) return self.doUtils("{server}/emby/Users/{UserId}/Items?format=json", parameters=params)
def getTvChannels(self): def getTvChannels(self):
params = { params = {
'EnableImages': True, 'EnableImages': True,
'Fields': ( "Path,Genres,SortName,Studios,Writer,ProductionYear,Taglines," 'Fields': (
"Path,Genres,SortName,Studios,Writer,ProductionYear,Taglines,"
"CommunityRating,OfficialRating,CumulativeRunTimeTicks," "CommunityRating,OfficialRating,CumulativeRunTimeTicks,"
"Metascore,AirTime,DateCreated,MediaStreams,People,Overview," "Metascore,AirTime,DateCreated,MediaStreams,People,Overview,"
"CriticRating,CriticRatingSummary,Etag,ShortOverview,ProductionLocations," "CriticRating,CriticRatingSummary,Etag,ShortOverview,ProductionLocations,"
"Tags,ProviderIds,ParentId,RemoteTrailers,SpecialEpisodeNumbers") "Tags,ProviderIds,ParentId,RemoteTrailers,SpecialEpisodeNumbers"
)
} }
return self.doUtils("{server}/emby/LiveTv/Channels/?userid={UserId}&format=json", parameters=params) url = "{server}/emby/LiveTv/Channels/?userid={UserId}&format=json"
return self.doUtils(url, parameters=params)
def getTvRecordings(self, groupid): def getTvRecordings(self, groupid):
if groupid == "root": groupid = ""
if groupid == "root":
groupid = ""
params = { params = {
'GroupId': groupid, 'GroupId': groupid,
'EnableImages': True, 'EnableImages': True,
'Fields': ( "Path,Genres,SortName,Studios,Writer,ProductionYear,Taglines," 'Fields': (
"Path,Genres,SortName,Studios,Writer,ProductionYear,Taglines,"
"CommunityRating,OfficialRating,CumulativeRunTimeTicks," "CommunityRating,OfficialRating,CumulativeRunTimeTicks,"
"Metascore,AirTime,DateCreated,MediaStreams,People,Overview," "Metascore,AirTime,DateCreated,MediaStreams,People,Overview,"
"CriticRating,CriticRatingSummary,Etag,ShortOverview,ProductionLocations," "CriticRating,CriticRatingSummary,Etag,ShortOverview,ProductionLocations,"
"Tags,ProviderIds,ParentId,RemoteTrailers,SpecialEpisodeNumbers") "Tags,ProviderIds,ParentId,RemoteTrailers,SpecialEpisodeNumbers"
)
} }
return self.doUtils("{server}/emby/LiveTv/Recordings/?userid={UserId}&format=json", parameters=params) url = "{server}/emby/LiveTv/Recordings/?userid={UserId}&format=json"
return self.doUtils(url, parameters=params)
def getSection(self, parentid, itemtype=None, sortby="SortName", basic=False, dialog=None): def getSection(self, parentid, itemtype=None, sortby="SortName", basic=False, dialog=None):
@ -186,7 +208,7 @@ class Read_EmbyServer():
items['TotalRecordCount'] = total items['TotalRecordCount'] = total
except TypeError: # Failed to retrieve except TypeError: # Failed to retrieve
self.logMsg("%s:%s Failed to retrieve the server response." % (url, params), 2) log.debug("%s:%s Failed to retrieve the server response." % (url, params))
else: else:
index = 0 index = 0
@ -228,27 +250,27 @@ class Read_EmbyServer():
# Something happened to the connection # Something happened to the connection
if not throttled: if not throttled:
throttled = True throttled = True
self.logMsg("Throttle activated.", 1) log.info("Throttle activated.")
if jump == highestjump: if jump == highestjump:
# We already tried with the highestjump, but it failed. Reset value. # We already tried with the highestjump, but it failed. Reset value.
self.logMsg("Reset highest value.", 1) log.info("Reset highest value.")
highestjump = 0 highestjump = 0
# Lower the number by half # Lower the number by half
if highestjump: if highestjump:
throttled = False throttled = False
jump = highestjump jump = highestjump
self.logMsg("Throttle deactivated.", 1) log.info("Throttle deactivated.")
else: else:
jump = int(jump/4) jump = int(jump/4)
self.logMsg("Set jump limit to recover: %s" % jump, 2) log.debug("Set jump limit to recover: %s" % jump)
retry = 0 retry = 0
while utils.window('plex_online') != "true": while utils.window('plex_online') != "true":
# Wait server to come back online # Wait server to come back online
if retry == 5: if retry == 5:
self.logMsg("Unable to reconnect to server. Abort process.", 1) log.info("Unable to reconnect to server. Abort process.")
return items return items
retry += 1 retry += 1
@ -276,7 +298,7 @@ class Read_EmbyServer():
increment = 10 increment = 10
jump += increment jump += increment
self.logMsg("Increase jump limit to: %s" % jump, 1) log.info("Increase jump limit to: %s" % jump)
return items return items
def getViews(self, mediatype="", root=False, sortedlist=False): def getViews(self, mediatype="", root=False, sortedlist=False):
@ -293,7 +315,7 @@ class Read_EmbyServer():
try: try:
items = result['Items'] items = result['Items']
except TypeError: except TypeError:
self.logMsg("Error retrieving views for type: %s" % mediatype, 2) log.debug("Error retrieving views for type: %s" % mediatype)
else: else:
for item in items: for item in items:
@ -362,15 +384,18 @@ class Read_EmbyServer():
return belongs return belongs
def getMovies(self, parentId, basic=False, dialog=None): def getMovies(self, parentId, basic=False, dialog=None):
return self.getSection(parentId, "Movie", basic=basic, dialog=dialog) return self.getSection(parentId, "Movie", basic=basic, dialog=dialog)
def getBoxset(self, dialog=None): def getBoxset(self, dialog=None):
return self.getSection(None, "BoxSet", dialog=dialog) return self.getSection(None, "BoxSet", dialog=dialog)
def getMovies_byBoxset(self, boxsetid): def getMovies_byBoxset(self, boxsetid):
return self.getSection(boxsetid, "Movie") return self.getSection(boxsetid, "Movie")
def getMusicVideos(self, parentId, basic=False, dialog=None): def getMusicVideos(self, parentId, basic=False, dialog=None):
return self.getSection(parentId, "MusicVideo", basic=basic, dialog=dialog) return self.getSection(parentId, "MusicVideo", basic=basic, dialog=dialog)
def getHomeVideos(self, parentId): def getHomeVideos(self, parentId):
@ -378,6 +403,7 @@ class Read_EmbyServer():
return self.getSection(parentId, "Video") return self.getSection(parentId, "Video")
def getShows(self, parentId, basic=False, dialog=None): def getShows(self, parentId, basic=False, dialog=None):
return self.getSection(parentId, "Series", basic=basic, dialog=dialog) return self.getSection(parentId, "Series", basic=basic, dialog=dialog)
def getSeasons(self, showId): def getSeasons(self, showId):
@ -393,7 +419,8 @@ class Read_EmbyServer():
'IsVirtualUnaired': False, 'IsVirtualUnaired': False,
'Fields': "Etag" 'Fields': "Etag"
} }
result = self.doUtils("{server}/emby/Shows/%s/Seasons?UserId={UserId}&format=json" % showId, parameters=params) url = "{server}/emby/Shows/%s/Seasons?UserId={UserId}&format=json" % showId
result = self.doUtils(url, parameters=params)
if result: if result:
items = result items = result
@ -411,7 +438,6 @@ class Read_EmbyServer():
return self.getSection(seasonId, "Episode") return self.getSection(seasonId, "Episode")
def getArtists(self, dialog=None): def getArtists(self, dialog=None):
items = { items = {
@ -433,7 +459,7 @@ class Read_EmbyServer():
items['TotalRecordCount'] = total items['TotalRecordCount'] = total
except TypeError: # Failed to retrieve except TypeError: # Failed to retrieve
self.logMsg("%s:%s Failed to retrieve the server response." % (url, params), 2) log.debug("%s:%s Failed to retrieve the server response." % (url, params))
else: else:
index = 1 index = 1
@ -467,17 +493,20 @@ class Read_EmbyServer():
return items return items
def getAlbums(self, basic=False, dialog=None): def getAlbums(self, basic=False, dialog=None):
return self.getSection(None, "MusicAlbum", sortby="DateCreated", basic=basic, dialog=dialog) return self.getSection(None, "MusicAlbum", sortby="DateCreated", basic=basic, dialog=dialog)
def getAlbumsbyArtist(self, artistId): def getAlbumsbyArtist(self, artistId):
return self.getSection(artistId, "MusicAlbum", sortby="DateCreated") return self.getSection(artistId, "MusicAlbum", sortby="DateCreated")
def getSongs(self, basic=False, dialog=None): def getSongs(self, basic=False, dialog=None):
return self.getSection(None, "Audio", basic=basic, dialog=dialog) return self.getSection(None, "Audio", basic=basic, dialog=dialog)
def getSongsbyAlbum(self, albumId): def getSongsbyAlbum(self, albumId):
return self.getSection(albumId, "Audio")
return self.getSection(albumId, "Audio")
def getAdditionalParts(self, itemId): def getAdditionalParts(self, itemId):
@ -486,8 +515,8 @@ class Read_EmbyServer():
'Items': [], 'Items': [],
'TotalRecordCount': 0 'TotalRecordCount': 0
} }
url = "{server}/emby/Videos/%s/AdditionalParts?UserId={UserId}&format=json" % itemId
result = self.doUtils("{server}/emby/Videos/%s/AdditionalParts?UserId={UserId}&format=json" % itemId) result = self.doUtils(url)
if result: if result:
items = result items = result
@ -507,23 +536,36 @@ class Read_EmbyServer():
return sorted_items return sorted_items
def updateUserRating(self, itemid, like=None, favourite=None, deletelike=False): def updateUserRating(self, itemid, favourite=None):
# Updates the user rating to Emby # Updates the user rating to Emby
doUtils = self.doUtils
if favourite: if favourite:
self.doUtils("{server}/emby/Users/{UserId}/FavoriteItems/%s?format=json" % itemid, action_type="POST") url = "{server}/emby/Users/{UserId}/FavoriteItems/%s?format=json" % itemid
elif favourite == False: doUtils(url, action_type="POST")
self.doUtils("{server}/emby/Users/{UserId}/FavoriteItems/%s?format=json" % itemid, action_type="DELETE") elif not favourite:
url = "{server}/emby/Users/{UserId}/FavoriteItems/%s?format=json" % itemid
if not deletelike and like: doUtils(url, action_type="DELETE")
self.doUtils("{server}/emby/Users/{UserId}/Items/%s/Rating?Likes=true&format=json" % itemid, action_type="POST")
elif not deletelike and like is False:
self.doUtils("{server}/emby/Users/{UserId}/Items/%s/Rating?Likes=false&format=json" % itemid, action_type="POST")
elif deletelike:
self.doUtils("{server}/emby/Users/{UserId}/Items/%s/Rating?format=json" % itemid, action_type="DELETE")
else: else:
self.logMsg("Error processing user rating.", 1) log.info("Error processing user rating.")
self.logMsg("Update user rating to emby for itemid: %s " log.info("Update user rating to emby for itemid: %s | favourite: %s" % (itemid, favourite))
"| like: %s | favourite: %s | deletelike: %s"
% (itemid, like, favourite, deletelike), 1) def refreshItem(self, itemid):
url = "{server}/emby/Items/%s/Refresh?format=json" % itemid
params = {
'Recursive': True,
'ImageRefreshMode': "FullRefresh",
'MetadataRefreshMode': "FullRefresh",
'ReplaceAllImages': False,
'ReplaceAllMetadata': True
}
self.doUtils(url, postBody=params, action_type="POST")
def deleteItem(self, itemid):
url = "{server}/emby/Items/%s?format=json" % itemid
self.doUtils(url, action_type="DELETE")

View file

@ -2,6 +2,7 @@
############################################################################### ###############################################################################
import logging
import shutil import shutil
import xml.etree.ElementTree as etree import xml.etree.ElementTree as etree
@ -9,8 +10,13 @@ import xbmc
import xbmcvfs import xbmcvfs
import utils import utils
from utils import window, language as lang
############################################################################### #################################################################################################
log = logging.getLogger("EMBY."+__name__)
#################################################################################################
@utils.logging @utils.logging
@ -53,8 +59,6 @@ class VideoNodes(object):
} }
mediatype = mediatypes[mediatype] mediatype = mediatypes[mediatype]
window = utils.window
if viewtype == "mixed": if viewtype == "mixed":
dirname = "%s-%s" % (viewid, mediatype) dirname = "%s-%s" % (viewid, mediatype)
else: else:
@ -88,8 +92,7 @@ class VideoNodes(object):
xbmcvfs.delete(utils.tryEncode( xbmcvfs.delete(utils.tryEncode(
(nodepath + utils.tryDecode(file)))) (nodepath + utils.tryDecode(file))))
self.logMsg("Sucessfully removed videonode: %s." log.info("Sucessfully removed videonode: %s." % tagname)
% tagname, 1)
return return
# Create index entry # Create index entry
@ -210,7 +213,7 @@ class VideoNodes(object):
# Get label # Get label
stringid = nodes[node] stringid = nodes[node]
if node != "1": if node != "1":
label = utils.language(stringid) label = lang(stringid)
if not label: if not label:
label = xbmc.getLocalizedString(stringid) label = xbmc.getLocalizedString(stringid)
else: else:
@ -366,8 +369,6 @@ class VideoNodes(object):
def singleNode(self, indexnumber, tagname, mediatype, itemtype): def singleNode(self, indexnumber, tagname, mediatype, itemtype):
window = utils.window
tagname = utils.tryEncode(tagname) tagname = utils.tryEncode(tagname)
cleantagname = utils.normalize_nodes(tagname) cleantagname = utils.normalize_nodes(tagname)
nodepath = utils.tryDecode(xbmc.translatePath( nodepath = utils.tryDecode(xbmc.translatePath(
@ -396,7 +397,7 @@ class VideoNodes(object):
'Favorite tvshows': 30181, 'Favorite tvshows': 30181,
'channels': 30173 'channels': 30173
} }
label = utils.language(labels[tagname]) label = lang(labels[tagname])
embynode = "Plex.nodes.%s" % indexnumber embynode = "Plex.nodes.%s" % indexnumber
window('%s.title' % embynode, value=label) window('%s.title' % embynode, value=label)
window('%s.path' % embynode, value=windowpath) window('%s.path' % embynode, value=windowpath)
@ -423,9 +424,7 @@ class VideoNodes(object):
def clearProperties(self): def clearProperties(self):
window = utils.window log.info("Clearing nodes properties.")
self.logMsg("Clearing nodes properties.", 1)
plexprops = window('Plex.nodes.total') plexprops = window('Plex.nodes.total')
propnames = [ propnames = [

View file

@ -0,0 +1,153 @@
<?xml version="1.0" encoding="UTF-8"?>
<window>
<defaultcontrol always="false">200</defaultcontrol>
<zorder>0</zorder>
<include>dialogeffect</include>
<controls>
<control type="image">
<description>Background fade</description>
<width>100%</width>
<height>100%</height>
<texture>emby-bg-fade.png</texture>
</control>
<control type="group">
<width>600</width>
<left>33%</left>
<top>15%</top>
<control type="image">
<description>Background box</description>
<texture border="6" colordiffuse="ff111111">box.png</texture>
<width>600</width>
<height>700</height>
</control>
<control type="image">
<description>Emby logo</description>
<texture>logo-white.png</texture>
<width>160</width>
<height>49</height>
<top>20</top>
<left>25</left>
</control>
<control type="group">
<width>500</width>
<left>50</left>
<control type="label">
<description>Sign in emby connect</description>
<label>$ADDON[plugin.video.emby 30600]</label>
<textcolor>white</textcolor>
<font>font12</font>
<aligny>top</aligny>
<top>115</top>
</control>
<control type="group">
<top>190</top>
<control type="label">
<description>Username email</description>
<label>$ADDON[plugin.video.emby 30601]</label>
<textcolor>ffa6a6a6</textcolor>
<font>font10</font>
<aligny>top</aligny>
</control>
<control type="image">
<description>separator</description>
<width>102%</width>
<height>0.5</height>
<top>66</top>
<left>-10</left>
<texture colordiffuse="ff222222" border="90,3,90,3">separator.png</texture>
</control>
</control>
<control type="group">
<description>Password</description>
<top>275</top>
<control type="label">
<description>Password label</description>
<label>$ADDON[plugin.video.emby 30602]</label>
<textcolor>ffa6a6a6</textcolor>
<font>font10</font>
<aligny>top</aligny>
</control>
<control type="image">
<description>separator</description>
<width>102%</width>
<height>0.5</height>
<top>66</top>
<left>-10</left>
<texture colordiffuse="ff222222" border="90,3,90,3">separator.png</texture>
</control>
</control>
<control type="group">
<description>Buttons</description>
<top>385</top>
<control type="button" id="200">
<description>Sign in</description>
<texturenofocus border="5" colordiffuse="green">box.png</texturenofocus>
<texturefocus border="5" colordiffuse="green">box.png</texturefocus>
<label>[UPPERCASE][B]$ADDON[plugin.video.emby 30605][/B][/UPPERCASE]</label>
<font>font10</font>
<align>center</align>
<width>100%</width>
<height>50</height>
<ondown>201</ondown>
</control>
<control type="button" id="201">
<description>Later</description>
<texturenofocus border="5" colordiffuse="ff464646">box.png</texturenofocus>
<texturefocus border="5" colordiffuse="ff464646">box.png</texturefocus>
<label>[UPPERCASE][B]$ADDON[plugin.video.emby 30606][/B][/UPPERCASE]</label>
<font>font10</font>
<align>center</align>
<width>100%</width>
<height>50</height>
<top>55</top>
<onup>200</onup>
</control>
</control>
<control type="group">
<description>Disclaimer</description>
<top>510</top>
<control type="label">
<description>Disclaimer label</description>
<label>$ADDON[plugin.video.emby 30603]</label>
<font>font10</font>
<textcolor>ff464646</textcolor>
<wrapmultiline>true</wrapmultiline>
<aligny>top</aligny>
<width>340</width>
</control>
<control type="image">
<description>qrcode</description>
<texture>qrcode_disclaimer.png</texture>
<width>140</width>
<height>140</height>
<top>10</top>
<left>360</left>
</control>
<control type="label">
<description>Scan me</description>
<label>[UPPERCASE]$ADDON[plugin.video.emby 30604][/UPPERCASE]</label>
<font>font12</font>
<textcolor>green</textcolor>
<align>right</align>
<aligny>top</aligny>
<top>120</top>
<right>160</right>
</control>
</control>
</control>
</control>
</controls>
</window>

Binary file not shown.

After

Width:  |  Height:  |  Size: 1,023 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 194 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.5 KiB