Merge branch 'hotfixes' into playlists

This commit is contained in:
croneter 2018-06-02 16:12:47 +02:00
commit bd73c03078
63 changed files with 1212 additions and 2273 deletions

View file

@ -1,5 +1,5 @@
[![stable version](https://img.shields.io/badge/stable_version-1.8.18-blue.svg?maxAge=60&style=flat) ](https://github.com/croneter/binary_repo/raw/master/stable/repository.plexkodiconnect/repository.plexkodiconnect-1.0.2.zip) [![stable version](https://img.shields.io/badge/stable_version-1.8.18-blue.svg?maxAge=60&style=flat) ](https://github.com/croneter/binary_repo/raw/master/stable/repository.plexkodiconnect/repository.plexkodiconnect-1.0.2.zip)
[![beta version](https://img.shields.io/badge/beta_version-2.0.22-red.svg?maxAge=60&style=flat) ](https://github.com/croneter/binary_repo/raw/master/beta/repository.plexkodiconnectbeta/repository.plexkodiconnectbeta-1.0.2.zip) [![beta version](https://img.shields.io/badge/beta_version-2.0.28-red.svg?maxAge=60&style=flat) ](https://github.com/croneter/binary_repo/raw/master/beta/repository.plexkodiconnectbeta/repository.plexkodiconnectbeta-1.0.2.zip)
[![Installation](https://img.shields.io/badge/wiki-installation-brightgreen.svg?maxAge=60&style=flat)](https://github.com/croneter/PlexKodiConnect/wiki/Installation) [![Installation](https://img.shields.io/badge/wiki-installation-brightgreen.svg?maxAge=60&style=flat)](https://github.com/croneter/PlexKodiConnect/wiki/Installation)
[![FAQ](https://img.shields.io/badge/wiki-FAQ-brightgreen.svg?maxAge=60&style=flat)](https://github.com/croneter/PlexKodiConnect/wiki/faq) [![FAQ](https://img.shields.io/badge/wiki-FAQ-brightgreen.svg?maxAge=60&style=flat)](https://github.com/croneter/PlexKodiConnect/wiki/faq)
@ -55,6 +55,7 @@ Some people argue that PKC is 'hacky' because of the way it directly accesses th
- Support of Kodi 18 Leia (and Kodi 17 Krypton) - Support of Kodi 18 Leia (and Kodi 17 Krypton)
- [Amazon Alexa voice recognition](https://www.plex.tv/apps/streaming-devices/amazon-alexa) - [Amazon Alexa voice recognition](https://www.plex.tv/apps/streaming-devices/amazon-alexa)
- [Cinema Trailers & Extras](https://support.plex.tv/articles/202934883-cinema-trailers-extras/)
- [Plex Watch Later / Plex It!](https://support.plex.tv/hc/en-us/sections/200211783-Plex-It-) - [Plex Watch Later / Plex It!](https://support.plex.tv/hc/en-us/sections/200211783-Plex-It-)
- [Plex Companion](https://support.plex.tv/hc/en-us/sections/200276908-Plex-Companion): fling Plex media (or anything else) from other Plex devices to PlexKodiConnect - [Plex Companion](https://support.plex.tv/hc/en-us/sections/200276908-Plex-Companion): fling Plex media (or anything else) from other Plex devices to PlexKodiConnect
- [Plex Transcoding](https://support.plex.tv/hc/en-us/articles/200250377-Transcoding-Media) - [Plex Transcoding](https://support.plex.tv/hc/en-us/articles/200250377-Transcoding-Media)

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<addon id="plugin.video.plexkodiconnect" name="PlexKodiConnect" version="2.0.22" provider-name="croneter"> <addon id="plugin.video.plexkodiconnect" name="PlexKodiConnect" version="2.0.28" provider-name="croneter">
<requires> <requires>
<import addon="xbmc.python" version="2.1.0"/> <import addon="xbmc.python" version="2.1.0"/>
<import addon="script.module.requests" version="2.9.1" /> <import addon="script.module.requests" version="2.9.1" />
@ -67,7 +67,59 @@
<summary lang="ru_RU">Нативная интеграция сервера Plex в Kodi</summary> <summary lang="ru_RU">Нативная интеграция сервера Plex в Kodi</summary>
<description lang="ru_RU">Подключите Kodi к своему серверу Plex. Плагин предполагает что вы управляете своими видео с помощью Plex (а не в Kodi). Вы можете потерять текущие базы данных музыки и видео в Kodi (так как плагин напрямую их изменяет). Используйте на свой страх и риск</description> <description lang="ru_RU">Подключите Kodi к своему серверу Plex. Плагин предполагает что вы управляете своими видео с помощью Plex (а не в Kodi). Вы можете потерять текущие базы данных музыки и видео в Kodi (так как плагин напрямую их изменяет). Используйте на свой страх и риск</description>
<disclaimer lang="ru_RU">Используйте на свой страх и риск</disclaimer> <disclaimer lang="ru_RU">Используйте на свой страх и риск</disclaimer>
<news>version 2.0.22 (beta only): <news>version 2.0.28 (beta only):
- Fix endless reboots if Plex music library missing
- Fix Plex Companion failing leading to PMS connection loss
- Fix PKC add-on setting user changes not saving
- Fix playback of last item not starting up
- Update Czech translation
- Declare PMS connection dead on first failed connection
- Fix KeyErrors if Kodi player does not return position
- Fix AttributeError
- Fix logging
- Use float for resume and runtime instead of int
version 2.0.27 (beta only):
- WARNING: You will need to reset the Kodi database! Sorry for that...
- Fix PKC not connecting: Fix ValueError if plex.tv returns Plex Cloud URIs
- Fix episode widget resume not working (add-on paths)
- Speed up PKC start-up
- Speed up checking of PMS connection, e.g. on startup
- Improve collection lookup; fix PKC caching wrong url
- Revert "Default to not show image caching notifications"
version 2.0.26 (beta only):
- Reduce CPU strain for artwork caching progress
- Fallback connection if plex.direct does not resolve
- Prettify Plex context menu, thanks @dazedcrazy
- Update translations
- Default to not show image caching notifications
version 2.0.25 (beta only):
- Fix migration not working correctly for re-connecting PMS
- Fix PMS showing up twice
- Improve artwork caching counter in PKC settings
version 2.0.24 (beta only):
- WARNING: You will need to reset the Kodi database! Sorry for that...
- PKC will force you to re-connect with your PMS
- Use plex.direct url instead of local ip to use correct SSL certificate; thus fix artwork caching
- Revert "Increase timeout between syncing images"
- Don't ask user for DB reset if forced by PKC
- Ensure movies and tv shows are synced before music
- Ensure a later migration if user downgraded PKC
version 2.0.23 (beta only):
- WARNING: You will need to reset the Kodi database!
- Finally support for Extras!
- Fix context menu not working for shows in library view
- Fix Plex Companion music playstate status for iOS
- Show caching progress and FanartTV lookup progress in PKC settings
- Fix rare library sync errors
- Fix ValueError for third party add-ons calling PKC
- Tweak PKC settings
version 2.0.22 (beta only):
- Fix Recently Added for tv shows not working - Fix Recently Added for tv shows not working
- Fix PKC crashing on startup - Fix PKC crashing on startup

View file

@ -1,3 +1,55 @@
version 2.0.28 (beta only):
- Fix endless reboots if Plex music library missing
- Fix Plex Companion failing leading to PMS connection loss
- Fix PKC add-on setting user changes not saving
- Fix playback of last item not starting up
- Update Czech translation
- Declare PMS connection dead on first failed connection
- Fix KeyErrors if Kodi player does not return position
- Fix AttributeError
- Fix logging
- Use float for resume and runtime instead of int
version 2.0.27 (beta only):
- WARNING: You will need to reset the Kodi database! Sorry for that...
- Fix PKC not connecting: Fix ValueError if plex.tv returns Plex Cloud URIs
- Fix episode widget resume not working (add-on paths)
- Speed up PKC start-up
- Speed up checking of PMS connection, e.g. on startup
- Improve collection lookup; fix PKC caching wrong url
- Revert "Default to not show image caching notifications"
version 2.0.26 (beta only):
- Reduce CPU strain for artwork caching progress
- Fallback connection if plex.direct does not resolve
- Prettify Plex context menu, thanks @dazedcrazy
- Update translations
- Default to not show image caching notifications
version 2.0.25 (beta only):
- Fix migration not working correctly for re-connecting PMS
- Fix PMS showing up twice
- Improve artwork caching counter in PKC settings
version 2.0.24 (beta only):
- WARNING: You will need to reset the Kodi database! Sorry for that...
- PKC will force you to re-connect with your PMS
- Use plex.direct url instead of local ip to use correct SSL certificate; thus fix artwork caching
- Revert "Increase timeout between syncing images"
- Don't ask user for DB reset if forced by PKC
- Ensure movies and tv shows are synced before music
- Ensure a later migration if user downgraded PKC
version 2.0.23 (beta only):
- WARNING: You will need to reset the Kodi database!
- Finally support for Extras!
- Fix context menu not working for shows in library view
- Fix Plex Companion music playstate status for iOS
- Show caching progress and FanartTV lookup progress in PKC settings
- Fix rare library sync errors
- Fix ValueError for third party add-ons calling PKC
- Tweak PKC settings
version 2.0.22 (beta only): version 2.0.22 (beta only):
- Fix Recently Added for tv shows not working - Fix Recently Added for tv shows not working
- Fix PKC crashing on startup - Fix PKC crashing on startup

View file

@ -14,7 +14,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Language: cs_CZ\n" "Language: cs_CZ\n"
"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" "Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n <= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;\n"
# Add-on settings # Add-on settings
msgctxt "#29999" msgctxt "#29999"
@ -50,23 +50,34 @@ msgstr "Uživ. jméno: "
# Sync notification displayed if there is still artwork to be cached to Kodi # Sync notification displayed if there is still artwork to be cached to Kodi
msgctxt "#30006" msgctxt "#30006"
msgid "Caching %s images" msgid "Caching %s Plex images"
msgstr "" msgstr "Ukládám %s obrázků z Plexu"
# Sync notification displayed if syncing of major artwork is done # Sync notification displayed if syncing of major artwork is done
msgctxt "#30007" msgctxt "#30007"
msgid "Major image caching done" msgid "Plex image caching done"
msgstr "" msgstr "Ukládání obrázků do mezipaměti dokončeno."
# PKC settings artwork: Enable notifications for artwork image sync # PKC settings artwork: Enable notifications for artwork image sync
msgctxt "#30008" msgctxt "#30008"
msgid "Enable notifications for image caching" msgid "Enable notifications for image caching"
msgstr "" msgstr "Povolit upozornění na ukládání obrázků do mezipaměti"
# PKC settings artwork: Enable image caching during Kodi playback # PKC settings artwork: Enable image caching during Kodi playback
msgctxt "#30009" msgctxt "#30009"
msgid "Enable image caching during Kodi playback (restart Kodi!)" msgid "Enable image caching during Kodi playback (restart Kodi!)"
msgstr "" msgstr ""
"Povolit ukládání obrázků do mezipaměti při přehrávání (restartujte Kodi!)"
# PKC settings - Artwork
msgctxt "#30010"
msgid "Approximate progress"
msgstr "Odhad průběhu"
# PKC settings - Artwork
msgctxt "#30011"
msgid "Artwork left to cache:"
msgstr "Obrázků k uložení do mezipaměti:"
# Button text # Button text
msgctxt "#30012" msgctxt "#30012"
@ -82,6 +93,11 @@ msgctxt "#30014"
msgid "Connection" msgid "Connection"
msgstr "Připojení" msgstr "Připojení"
# PKC settings - Artwork
msgctxt "#30015"
msgid "Movie and show FanartTV lookups left to do:"
msgstr "Filmů a seriálů k vyhledání na FanartTV:"
msgctxt "#30016" msgctxt "#30016"
msgid "Device Name" msgid "Device Name"
msgstr "Název zařízení" msgstr "Název zařízení"
@ -91,6 +107,16 @@ msgctxt "#30017"
msgid "Unauthorized for PMS" msgid "Unauthorized for PMS"
msgstr "Neověřeno u PMS" msgstr "Neověřeno u PMS"
# Sync notification displayed for the number of fanart.tv lookups left
msgctxt "#30018"
msgid "Checking FanartTV for %s items"
msgstr "Vyhledávám %s položek na FanartTV"
# Sync notification displayed when FanartTV lookup is completed
msgctxt "#30019"
msgid "FanartTV lookup completed"
msgstr "Vyhledávání na FanartTV dokončeno"
# PKC settings category # PKC settings category
msgctxt "#30022" msgctxt "#30022"
msgid "Advanced" msgid "Advanced"
@ -418,8 +444,8 @@ msgstr "Režim přehrávání"
# PKC Settings - Artwork # PKC Settings - Artwork
msgctxt "#30512" msgctxt "#30512"
msgid "Force artwork caching" msgid "Cache all artwork for a smooth Kodi experience"
msgstr "Vynutit ukládání obrázků do mezipaměti" msgstr "Ukládat všechny obrázky do mezipaměti pro hladší běh Kodi"
# PKC Settings - Artwork # PKC Settings - Artwork
msgctxt "#30513" msgctxt "#30513"
@ -498,12 +524,10 @@ msgstr "Zprávy serveru"
# PKC Settings - Advanced # PKC Settings - Advanced
msgctxt "#30535" msgctxt "#30535"
msgid "" msgid "Generate a new unique Plex device Id (e.g. to clone Kodi)"
"[COLOR yellow]Generate a new unique device Id (e.g. when cloning "
"Kodi)[/COLOR]"
msgstr "" msgstr ""
"[COLOR yellow]Vygenerovat nový unikátní identifikátor zařízení (např. při " "Vygenerovat nový unikátní identifikátor zařízení Plexu (např. při kopii "
"kopii Kodi)[/COLOR]" "Kodi)"
# PKC Settings - Connection # PKC Settings - Connection
msgctxt "#30536" msgctxt "#30536"
@ -517,8 +541,8 @@ msgstr "PŘI KAŽDÉ ZMĚNĚ MUSÍTE RESTARTOVAT KODI"
# PKC Settings warning # PKC Settings warning
msgctxt "#30538" msgctxt "#30538"
msgid "Complete Re-Sync necessary" msgid "Manual complete reset of Kodi database necessary, see \"Advanced\""
msgstr "Je vyžadována kompletní resynchronizace" msgstr "Je vyžadován ruční reset databaze. Viz \"rozšířené\""
# PKC Settings - Artwork # PKC Settings - Artwork
msgctxt "#30539" msgctxt "#30539"
@ -631,8 +655,8 @@ msgstr "Velikost vpálených titulků"
# PKC Settings - Sync # PKC Settings - Sync
msgctxt "#39003" msgctxt "#39003"
msgid "Limit download sync threads (rec. for rpi: 1)" msgid "Number of simultaneous download threads"
msgstr "Omezit synchronizační vlákna (doporučené pro rpi: 1)" msgstr "Počet souběžných vláken stahování"
# PKC Settings - Plex # PKC Settings - Plex
msgctxt "#39004" msgctxt "#39004"
@ -704,15 +728,13 @@ msgstr ""
# PKC Settings - Advanced # PKC Settings - Advanced
msgctxt "#39018" msgctxt "#39018"
msgid "[COLOR yellow]Repair local database (force update all content)[/COLOR]" msgid "Repair the Kodi database (force update all content)"
msgstr "" msgstr "Opravit databázi Kodi (vynutit aktualizaci všeho obsahu)"
"[COLOR yellow]Opravit místní databázi (vynutit aktualizaci všeho "
"obsahu)[/COLOR]"
# PKC Settings - Advanced # PKC Settings - Advanced
msgctxt "#39019" msgctxt "#39019"
msgid "[COLOR red]Partial or full reset of Database and PKC[/COLOR]" msgid "Reset the Kodi database and optionally reset PlexKodiConnect"
msgstr "[COLOR red]Částečný nebo plný reset databáze a PKC[/COLOR]" msgstr "Vyresetovat databázi Kodi a případně i nastavení PlexKodiConnect"
# PKC Settings - Artwork # PKC Settings - Artwork
msgctxt "#39020" msgctxt "#39020"

View file

@ -47,12 +47,12 @@ msgstr "Brugernavn: "
# Sync notification displayed if there is still artwork to be cached to Kodi # Sync notification displayed if there is still artwork to be cached to Kodi
msgctxt "#30006" msgctxt "#30006"
msgid "Caching %s images" msgid "Caching %s Plex images"
msgstr "" msgstr ""
# Sync notification displayed if syncing of major artwork is done # Sync notification displayed if syncing of major artwork is done
msgctxt "#30007" msgctxt "#30007"
msgid "Major image caching done" msgid "Plex image caching done"
msgstr "" msgstr ""
# PKC settings artwork: Enable notifications for artwork image sync # PKC settings artwork: Enable notifications for artwork image sync
@ -65,6 +65,16 @@ msgctxt "#30009"
msgid "Enable image caching during Kodi playback (restart Kodi!)" msgid "Enable image caching during Kodi playback (restart Kodi!)"
msgstr "" msgstr ""
# PKC settings - Artwork
msgctxt "#30010"
msgid "Approximate progress"
msgstr ""
# PKC settings - Artwork
msgctxt "#30011"
msgid "Artwork left to cache:"
msgstr ""
# Button text # Button text
msgctxt "#30012" msgctxt "#30012"
msgid "OK" msgid "OK"
@ -79,6 +89,11 @@ msgctxt "#30014"
msgid "Connection" msgid "Connection"
msgstr "Forbindelser" msgstr "Forbindelser"
# PKC settings - Artwork
msgctxt "#30015"
msgid "Movie and show FanartTV lookups left to do:"
msgstr ""
msgctxt "#30016" msgctxt "#30016"
msgid "Device Name" msgid "Device Name"
msgstr "Enhedens navn" msgstr "Enhedens navn"
@ -88,6 +103,16 @@ msgctxt "#30017"
msgid "Unauthorized for PMS" msgid "Unauthorized for PMS"
msgstr "Uautoriseret for PMS" msgstr "Uautoriseret for PMS"
# Sync notification displayed for the number of fanart.tv lookups left
msgctxt "#30018"
msgid "Checking FanartTV for %s items"
msgstr ""
# Sync notification displayed when FanartTV lookup is completed
msgctxt "#30019"
msgid "FanartTV lookup completed"
msgstr ""
# PKC settings category # PKC settings category
msgctxt "#30022" msgctxt "#30022"
msgid "Advanced" msgid "Advanced"
@ -414,8 +439,8 @@ msgstr "Afspilningstilstand"
# PKC Settings - Artwork # PKC Settings - Artwork
msgctxt "#30512" msgctxt "#30512"
msgid "Force artwork caching" msgid "Cache all artwork for a smooth Kodi experience"
msgstr "Tvinge illustrationer cachelagring" msgstr ""
# PKC Settings - Artwork # PKC Settings - Artwork
msgctxt "#30513" msgctxt "#30513"
@ -494,12 +519,8 @@ msgstr "Server beskeder"
# PKC Settings - Advanced # PKC Settings - Advanced
msgctxt "#30535" msgctxt "#30535"
msgid "" msgid "Generate a new unique Plex device Id (e.g. to clone Kodi)"
"[COLOR yellow]Generate a new unique device Id (e.g. when cloning "
"Kodi)[/COLOR]"
msgstr "" msgstr ""
"[COLOR yellow] Generere en ny unik enheds Id (f.eks. Når kloning "
"Kodi)[/COLOR]"
# PKC Settings - Connection # PKC Settings - Connection
msgctxt "#30536" msgctxt "#30536"
@ -513,8 +534,8 @@ msgstr "GENSTART KODI, HVIS DU FORETAGER ÆNDRINGER"
# PKC Settings warning # PKC Settings warning
msgctxt "#30538" msgctxt "#30538"
msgid "Complete Re-Sync necessary" msgid "Manual complete reset of Kodi database necessary, see \"Advanced\""
msgstr "Komplet re-synkronisere nødvendigt" msgstr ""
# PKC Settings - Artwork # PKC Settings - Artwork
msgctxt "#30539" msgctxt "#30539"
@ -628,8 +649,8 @@ msgstr "Undertekst størrelse"
# PKC Settings - Sync # PKC Settings - Sync
msgctxt "#39003" msgctxt "#39003"
msgid "Limit download sync threads (rec. for rpi: 1)" msgid "Number of simultaneous download threads"
msgstr "Begrænse download sync tråde (rec. for rpi: 1)" msgstr ""
# PKC Settings - Plex # PKC Settings - Plex
msgctxt "#39004" msgctxt "#39004"
@ -702,14 +723,13 @@ msgstr ""
# PKC Settings - Advanced # PKC Settings - Advanced
msgctxt "#39018" msgctxt "#39018"
msgid "[COLOR yellow]Repair local database (force update all content)[/COLOR]" msgid "Repair the Kodi database (force update all content)"
msgstr "" msgstr ""
"[COLOR yellow] Reparere lokale database (opdatere alt indhold)[/COLOR]"
# PKC Settings - Advanced # PKC Settings - Advanced
msgctxt "#39019" msgctxt "#39019"
msgid "[COLOR red]Partial or full reset of Database and PKC[/COLOR]" msgid "Reset the Kodi database and optionally reset PlexKodiConnect"
msgstr "[COLOR red] Fuld eller delvis nulstilling af Database og PKC[/COLOR]" msgstr ""
# PKC Settings - Artwork # PKC Settings - Artwork
msgctxt "#39020" msgctxt "#39020"

View file

@ -49,13 +49,13 @@ msgstr "Benutzername: "
# Sync notification displayed if there is still artwork to be cached to Kodi # Sync notification displayed if there is still artwork to be cached to Kodi
msgctxt "#30006" msgctxt "#30006"
msgid "Caching %s images" msgid "Caching %s Plex images"
msgstr "Cache %s Bilder" msgstr "Cache %s Plex Bilder"
# Sync notification displayed if syncing of major artwork is done # Sync notification displayed if syncing of major artwork is done
msgctxt "#30007" msgctxt "#30007"
msgid "Major image caching done" msgid "Plex image caching done"
msgstr "Cachen wichtigster Bilder beendet" msgstr "Plex Bilder-Caching beendet"
# PKC settings artwork: Enable notifications for artwork image sync # PKC settings artwork: Enable notifications for artwork image sync
msgctxt "#30008" msgctxt "#30008"
@ -67,6 +67,16 @@ msgctxt "#30009"
msgid "Enable image caching during Kodi playback (restart Kodi!)" msgid "Enable image caching during Kodi playback (restart Kodi!)"
msgstr "Cachen von Bildern während Wiedergabe aktivieren (Kodi neu starten!)" msgstr "Cachen von Bildern während Wiedergabe aktivieren (Kodi neu starten!)"
# PKC settings - Artwork
msgctxt "#30010"
msgid "Approximate progress"
msgstr "Ungefährer Stand"
# PKC settings - Artwork
msgctxt "#30011"
msgid "Artwork left to cache:"
msgstr "Noch zu cachende Bilder:"
# Button text # Button text
msgctxt "#30012" msgctxt "#30012"
msgid "OK" msgid "OK"
@ -81,6 +91,11 @@ msgctxt "#30014"
msgid "Connection" msgid "Connection"
msgstr "Verbindung" msgstr "Verbindung"
# PKC settings - Artwork
msgctxt "#30015"
msgid "Movie and show FanartTV lookups left to do:"
msgstr "Filme und Serien noch bei FanartTV nachzuschlagen:"
msgctxt "#30016" msgctxt "#30016"
msgid "Device Name" msgid "Device Name"
msgstr "Gerätename" msgstr "Gerätename"
@ -90,6 +105,16 @@ msgctxt "#30017"
msgid "Unauthorized for PMS" msgid "Unauthorized for PMS"
msgstr "Nicht autorisiert für PMS" msgstr "Nicht autorisiert für PMS"
# Sync notification displayed for the number of fanart.tv lookups left
msgctxt "#30018"
msgid "Checking FanartTV for %s items"
msgstr "%s Nachforschungen bei FanartTV"
# Sync notification displayed when FanartTV lookup is completed
msgctxt "#30019"
msgid "FanartTV lookup completed"
msgstr "FanartTV Nachforschungen beendet"
# PKC settings category # PKC settings category
msgctxt "#30022" msgctxt "#30022"
msgid "Advanced" msgid "Advanced"
@ -417,8 +442,8 @@ msgstr "Wiedergabemodus"
# PKC Settings - Artwork # PKC Settings - Artwork
msgctxt "#30512" msgctxt "#30512"
msgid "Force artwork caching" msgid "Cache all artwork for a smooth Kodi experience"
msgstr "Zwischenspeichern von PMS Bildern erzwingen" msgstr "Bilder zwischenspeichern (\"cachen\") für ein besseres Kodi-Erlebnis"
# PKC Settings - Artwork # PKC Settings - Artwork
msgctxt "#30513" msgctxt "#30513"
@ -498,12 +523,8 @@ msgstr "Server-Meldungen"
# PKC Settings - Advanced # PKC Settings - Advanced
msgctxt "#30535" msgctxt "#30535"
msgid "" msgid "Generate a new unique Plex device Id (e.g. to clone Kodi)"
"[COLOR yellow]Generate a new unique device Id (e.g. when cloning " msgstr "Neue einzigartige Plex-ID generieren (z.B. wenn Kodi geklont wurde)"
"Kodi)[/COLOR]"
msgstr ""
"[COLOR yellow]Neue einzigartige Geräte-ID generieren (z.B. wenn Kodi geklont"
" wurde)[/COLOR]"
# PKC Settings - Connection # PKC Settings - Connection
msgctxt "#30536" msgctxt "#30536"
@ -517,8 +538,9 @@ msgstr "BEI ÄNDERUNGEN KODI NEU STARTEN"
# PKC Settings warning # PKC Settings warning
msgctxt "#30538" msgctxt "#30538"
msgid "Complete Re-Sync necessary" msgid "Manual complete reset of Kodi database necessary, see \"Advanced\""
msgstr "Komplette Neu-Synchronisierung nötig" msgstr ""
"Manuelles Zurücksetzen der Kodi Datenbank nötig, siehe \"Fortgeschritten\""
# PKC Settings - Artwork # PKC Settings - Artwork
msgctxt "#30539" msgctxt "#30539"
@ -634,8 +656,8 @@ msgstr "Größe der eingebrannten Untertitel"
# PKC Settings - Sync # PKC Settings - Sync
msgctxt "#39003" msgctxt "#39003"
msgid "Limit download sync threads (rec. for rpi: 1)" msgid "Number of simultaneous download threads"
msgstr "Anzahl Download Sync Threads beschränken (Empfehlung RPI: 1)" msgstr "Anzahl gleichzeitiger Download-Threads"
# PKC Settings - Plex # PKC Settings - Plex
msgctxt "#39004" msgctxt "#39004"
@ -712,15 +734,13 @@ msgstr ""
# PKC Settings - Advanced # PKC Settings - Advanced
msgctxt "#39018" msgctxt "#39018"
msgid "[COLOR yellow]Repair local database (force update all content)[/COLOR]" msgid "Repair the Kodi database (force update all content)"
msgstr "" msgstr "Kodi Datenbank reparieren (alle Einträge aktualisieren)"
"[COLOR yellow]Lokale Datenbank reparieren (alle Einträge "
"aktualisieren)[/COLOR]"
# PKC Settings - Advanced # PKC Settings - Advanced
msgctxt "#39019" msgctxt "#39019"
msgid "[COLOR red]Partial or full reset of Database and PKC[/COLOR]" msgid "Reset the Kodi database and optionally reset PlexKodiConnect"
msgstr "[COLOR red]Datenbank und auf Wunsch PKC zurücksetzen[/COLOR]" msgstr "Kodi Datenbank und optional PlexKodiConnect zurücksetzen"
# PKC Settings - Artwork # PKC Settings - Artwork
msgctxt "#39020" msgctxt "#39020"

View file

@ -15,7 +15,6 @@ msgstr ""
# Add-on settings # Add-on settings
msgctxt "#29999" msgctxt "#29999"
msgid "PlexKodiConnect" msgid "PlexKodiConnect"
msgstr "" msgstr ""
@ -43,12 +42,12 @@ msgstr ""
# Sync notification displayed if there is still artwork to be cached to Kodi # Sync notification displayed if there is still artwork to be cached to Kodi
msgctxt "#30006" msgctxt "#30006"
msgid "Caching %s images" msgid "Caching %s Plex images"
msgstr "" msgstr ""
# Sync notification displayed if syncing of major artwork is done # Sync notification displayed if syncing of major artwork is done
msgctxt "#30007" msgctxt "#30007"
msgid "Major image caching done" msgid "Plex image caching done"
msgstr "" msgstr ""
# PKC settings artwork: Enable notifications for artwork image sync # PKC settings artwork: Enable notifications for artwork image sync
@ -61,9 +60,14 @@ msgctxt "#30009"
msgid "Enable image caching during Kodi playback (restart Kodi!)" msgid "Enable image caching during Kodi playback (restart Kodi!)"
msgstr "" msgstr ""
# PKC settings sync options # PKC settings - Artwork
msgctxt "#30010" msgctxt "#30010"
msgid "Sync Plex playlists" msgid "Approximate progress"
msgstr ""
# PKC settings - Artwork
msgctxt "#30011"
msgid "Artwork left to cache:"
msgstr "" msgstr ""
# Button text # Button text
@ -80,6 +84,11 @@ msgctxt "#30014"
msgid "Connection" msgid "Connection"
msgstr "" msgstr ""
# PKC settings - Artwork
msgctxt "#30015"
msgid "Movie and show FanartTV lookups left to do:"
msgstr ""
msgctxt "#30016" msgctxt "#30016"
msgid "Device Name" msgid "Device Name"
msgstr "" msgstr ""
@ -89,6 +98,21 @@ msgctxt "#30017"
msgid "Unauthorized for PMS" msgid "Unauthorized for PMS"
msgstr "" msgstr ""
# Sync notification displayed for the number of fanart.tv lookups left
msgctxt "#30018"
msgid "Checking FanartTV for %s items"
msgstr ""
# Sync notification displayed when FanartTV lookup is completed
msgctxt "#30019"
msgid "FanartTV lookup completed"
msgstr ""
# PKC settings sync options
msgctxt "#30020"
msgid "Sync Plex playlists"
msgstr ""
# PKC settings category # PKC settings category
msgctxt "#30022" msgctxt "#30022"
msgid "Advanced" msgid "Advanced"
@ -412,7 +436,7 @@ msgstr ""
# PKC Settings - Artwork # PKC Settings - Artwork
msgctxt "#30512" msgctxt "#30512"
msgid "Force artwork caching" msgid "Cache all artwork for a smooth Kodi experience"
msgstr "" msgstr ""
# PKC Settings - Artwork # PKC Settings - Artwork
@ -492,7 +516,7 @@ msgstr ""
# PKC Settings - Advanced # PKC Settings - Advanced
msgctxt "#30535" msgctxt "#30535"
msgid "[COLOR yellow]Generate a new unique device Id (e.g. when cloning Kodi)[/COLOR]" msgid "Generate a new unique Plex device Id (e.g. to clone Kodi)"
msgstr "" msgstr ""
# PKC Settings - Connection # PKC Settings - Connection
@ -507,7 +531,7 @@ msgstr ""
# PKC Settings warning # PKC Settings warning
msgctxt "#30538" msgctxt "#30538"
msgid "Complete Re-Sync necessary" msgid "Manual complete reset of Kodi database necessary, see \"Advanced\""
msgstr "" msgstr ""
# PKC Settings - Artwork # PKC Settings - Artwork
@ -615,7 +639,7 @@ msgstr ""
# PKC Settings - Sync # PKC Settings - Sync
msgctxt "#39003" msgctxt "#39003"
msgid "Limit download sync threads (rec. for rpi: 1)" msgid "Number of simultaneous download threads"
msgstr "" msgstr ""
# PKC Settings - Plex # PKC Settings - Plex
@ -680,12 +704,12 @@ msgstr ""
# PKC Settings - Advanced # PKC Settings - Advanced
msgctxt "#39018" msgctxt "#39018"
msgid "[COLOR yellow]Repair local database (force update all content)[/COLOR]" msgid "Repair the Kodi database (force update all content)"
msgstr "" msgstr ""
# PKC Settings - Advanced # PKC Settings - Advanced
msgctxt "#39019" msgctxt "#39019"
msgid "[COLOR red]Partial or full reset of Database and PKC[/COLOR]" msgid "Reset the Kodi database and optionally reset PlexKodiConnect"
msgstr "" msgstr ""
# PKC Settings - Artwork # PKC Settings - Artwork

View file

@ -47,12 +47,12 @@ msgstr "Usuario: "
# Sync notification displayed if there is still artwork to be cached to Kodi # Sync notification displayed if there is still artwork to be cached to Kodi
msgctxt "#30006" msgctxt "#30006"
msgid "Caching %s images" msgid "Caching %s Plex images"
msgstr "" msgstr ""
# Sync notification displayed if syncing of major artwork is done # Sync notification displayed if syncing of major artwork is done
msgctxt "#30007" msgctxt "#30007"
msgid "Major image caching done" msgid "Plex image caching done"
msgstr "" msgstr ""
# PKC settings artwork: Enable notifications for artwork image sync # PKC settings artwork: Enable notifications for artwork image sync
@ -65,6 +65,16 @@ msgctxt "#30009"
msgid "Enable image caching during Kodi playback (restart Kodi!)" msgid "Enable image caching during Kodi playback (restart Kodi!)"
msgstr "" msgstr ""
# PKC settings - Artwork
msgctxt "#30010"
msgid "Approximate progress"
msgstr ""
# PKC settings - Artwork
msgctxt "#30011"
msgid "Artwork left to cache:"
msgstr ""
# Button text # Button text
msgctxt "#30012" msgctxt "#30012"
msgid "OK" msgid "OK"
@ -79,6 +89,11 @@ msgctxt "#30014"
msgid "Connection" msgid "Connection"
msgstr "Conexión" msgstr "Conexión"
# PKC settings - Artwork
msgctxt "#30015"
msgid "Movie and show FanartTV lookups left to do:"
msgstr ""
msgctxt "#30016" msgctxt "#30016"
msgid "Device Name" msgid "Device Name"
msgstr "Nombre del Dispositivo" msgstr "Nombre del Dispositivo"
@ -88,6 +103,16 @@ msgctxt "#30017"
msgid "Unauthorized for PMS" msgid "Unauthorized for PMS"
msgstr "No autorizado para PMS" msgstr "No autorizado para PMS"
# Sync notification displayed for the number of fanart.tv lookups left
msgctxt "#30018"
msgid "Checking FanartTV for %s items"
msgstr ""
# Sync notification displayed when FanartTV lookup is completed
msgctxt "#30019"
msgid "FanartTV lookup completed"
msgstr ""
# PKC settings category # PKC settings category
msgctxt "#30022" msgctxt "#30022"
msgid "Advanced" msgid "Advanced"
@ -415,8 +440,8 @@ msgstr "Modo de reproducción"
# PKC Settings - Artwork # PKC Settings - Artwork
msgctxt "#30512" msgctxt "#30512"
msgid "Force artwork caching" msgid "Cache all artwork for a smooth Kodi experience"
msgstr "Obligar caché de arte" msgstr ""
# PKC Settings - Artwork # PKC Settings - Artwork
msgctxt "#30513" msgctxt "#30513"
@ -495,12 +520,8 @@ msgstr "Mensajes del servidor"
# PKC Settings - Advanced # PKC Settings - Advanced
msgctxt "#30535" msgctxt "#30535"
msgid "" msgid "Generate a new unique Plex device Id (e.g. to clone Kodi)"
"[COLOR yellow]Generate a new unique device Id (e.g. when cloning "
"Kodi)[/COLOR]"
msgstr "" msgstr ""
"[COLOR yellow] Generar un nuevo id único de dispositivo (por ejemplo, al "
"clonar Kodi)[/COLOR]"
# PKC Settings - Connection # PKC Settings - Connection
msgctxt "#30536" msgctxt "#30536"
@ -514,8 +535,8 @@ msgstr "REINICIAR KODI SI HACE CAMBIOS"
# PKC Settings warning # PKC Settings warning
msgctxt "#30538" msgctxt "#30538"
msgid "Complete Re-Sync necessary" msgid "Manual complete reset of Kodi database necessary, see \"Advanced\""
msgstr "Es necesaria una Re-Sincronización Completa" msgstr ""
# PKC Settings - Artwork # PKC Settings - Artwork
msgctxt "#30539" msgctxt "#30539"
@ -630,9 +651,8 @@ msgstr "Tamaño de subtítulos incrustados"
# PKC Settings - Sync # PKC Settings - Sync
msgctxt "#39003" msgctxt "#39003"
msgid "Limit download sync threads (rec. for rpi: 1)" msgid "Number of simultaneous download threads"
msgstr "" msgstr ""
"Limitar los hilos de sincronización de descarga (recomendado para rpi: 1)"
# PKC Settings - Plex # PKC Settings - Plex
msgctxt "#39004" msgctxt "#39004"
@ -706,17 +726,13 @@ msgstr ""
# PKC Settings - Advanced # PKC Settings - Advanced
msgctxt "#39018" msgctxt "#39018"
msgid "[COLOR yellow]Repair local database (force update all content)[/COLOR]" msgid "Repair the Kodi database (force update all content)"
msgstr "" msgstr ""
"[COLOR yellow] Reparar base de datos local (todo el contenido será "
"actualizado)[/COLOR]"
# PKC Settings - Advanced # PKC Settings - Advanced
msgctxt "#39019" msgctxt "#39019"
msgid "[COLOR red]Partial or full reset of Database and PKC[/COLOR]" msgid "Reset the Kodi database and optionally reset PlexKodiConnect"
msgstr "" msgstr ""
"[COLOR Red] Restablecimiento parcial o total de la base de datos y "
"PKC[/COLOR]"
# PKC Settings - Artwork # PKC Settings - Artwork
msgctxt "#39020" msgctxt "#39020"

View file

@ -47,12 +47,12 @@ msgstr "Usuario: "
# Sync notification displayed if there is still artwork to be cached to Kodi # Sync notification displayed if there is still artwork to be cached to Kodi
msgctxt "#30006" msgctxt "#30006"
msgid "Caching %s images" msgid "Caching %s Plex images"
msgstr "" msgstr ""
# Sync notification displayed if syncing of major artwork is done # Sync notification displayed if syncing of major artwork is done
msgctxt "#30007" msgctxt "#30007"
msgid "Major image caching done" msgid "Plex image caching done"
msgstr "" msgstr ""
# PKC settings artwork: Enable notifications for artwork image sync # PKC settings artwork: Enable notifications for artwork image sync
@ -65,6 +65,16 @@ msgctxt "#30009"
msgid "Enable image caching during Kodi playback (restart Kodi!)" msgid "Enable image caching during Kodi playback (restart Kodi!)"
msgstr "" msgstr ""
# PKC settings - Artwork
msgctxt "#30010"
msgid "Approximate progress"
msgstr ""
# PKC settings - Artwork
msgctxt "#30011"
msgid "Artwork left to cache:"
msgstr ""
# Button text # Button text
msgctxt "#30012" msgctxt "#30012"
msgid "OK" msgid "OK"
@ -79,6 +89,11 @@ msgctxt "#30014"
msgid "Connection" msgid "Connection"
msgstr "Conexión" msgstr "Conexión"
# PKC settings - Artwork
msgctxt "#30015"
msgid "Movie and show FanartTV lookups left to do:"
msgstr ""
msgctxt "#30016" msgctxt "#30016"
msgid "Device Name" msgid "Device Name"
msgstr "Nombre del Dispositivo" msgstr "Nombre del Dispositivo"
@ -88,6 +103,16 @@ msgctxt "#30017"
msgid "Unauthorized for PMS" msgid "Unauthorized for PMS"
msgstr "No autorizado para PMS" msgstr "No autorizado para PMS"
# Sync notification displayed for the number of fanart.tv lookups left
msgctxt "#30018"
msgid "Checking FanartTV for %s items"
msgstr ""
# Sync notification displayed when FanartTV lookup is completed
msgctxt "#30019"
msgid "FanartTV lookup completed"
msgstr ""
# PKC settings category # PKC settings category
msgctxt "#30022" msgctxt "#30022"
msgid "Advanced" msgid "Advanced"
@ -415,8 +440,8 @@ msgstr "Modo de reproducción"
# PKC Settings - Artwork # PKC Settings - Artwork
msgctxt "#30512" msgctxt "#30512"
msgid "Force artwork caching" msgid "Cache all artwork for a smooth Kodi experience"
msgstr "Obligar caché de arte" msgstr ""
# PKC Settings - Artwork # PKC Settings - Artwork
msgctxt "#30513" msgctxt "#30513"
@ -495,12 +520,8 @@ msgstr "Mensajes del servidor"
# PKC Settings - Advanced # PKC Settings - Advanced
msgctxt "#30535" msgctxt "#30535"
msgid "" msgid "Generate a new unique Plex device Id (e.g. to clone Kodi)"
"[COLOR yellow]Generate a new unique device Id (e.g. when cloning "
"Kodi)[/COLOR]"
msgstr "" msgstr ""
"[COLOR yellow] Generar un nuevo id único de dispositivo (por ejemplo, al "
"clonar Kodi)[/COLOR]"
# PKC Settings - Connection # PKC Settings - Connection
msgctxt "#30536" msgctxt "#30536"
@ -514,8 +535,8 @@ msgstr "REINICIAR KODI SI HACE CAMBIOS"
# PKC Settings warning # PKC Settings warning
msgctxt "#30538" msgctxt "#30538"
msgid "Complete Re-Sync necessary" msgid "Manual complete reset of Kodi database necessary, see \"Advanced\""
msgstr "Es necesaria una Re-Sincronización Completa" msgstr ""
# PKC Settings - Artwork # PKC Settings - Artwork
msgctxt "#30539" msgctxt "#30539"
@ -630,9 +651,8 @@ msgstr "Tamaño de subtítulos incrustados"
# PKC Settings - Sync # PKC Settings - Sync
msgctxt "#39003" msgctxt "#39003"
msgid "Limit download sync threads (rec. for rpi: 1)" msgid "Number of simultaneous download threads"
msgstr "" msgstr ""
"Limitar los hilos de sincronización de descarga (recomendado para rpi: 1)"
# PKC Settings - Plex # PKC Settings - Plex
msgctxt "#39004" msgctxt "#39004"
@ -706,17 +726,13 @@ msgstr ""
# PKC Settings - Advanced # PKC Settings - Advanced
msgctxt "#39018" msgctxt "#39018"
msgid "[COLOR yellow]Repair local database (force update all content)[/COLOR]" msgid "Repair the Kodi database (force update all content)"
msgstr "" msgstr ""
"[COLOR yellow] Reparar base de datos local (todo el contenido será "
"actualizado)[/COLOR]"
# PKC Settings - Advanced # PKC Settings - Advanced
msgctxt "#39019" msgctxt "#39019"
msgid "[COLOR red]Partial or full reset of Database and PKC[/COLOR]" msgid "Reset the Kodi database and optionally reset PlexKodiConnect"
msgstr "" msgstr ""
"[COLOR Red] Restablecimiento parcial o total de la base de datos y "
"PKC[/COLOR]"
# PKC Settings - Artwork # PKC Settings - Artwork
msgctxt "#39020" msgctxt "#39020"

View file

@ -47,12 +47,12 @@ msgstr "Usuario: "
# Sync notification displayed if there is still artwork to be cached to Kodi # Sync notification displayed if there is still artwork to be cached to Kodi
msgctxt "#30006" msgctxt "#30006"
msgid "Caching %s images" msgid "Caching %s Plex images"
msgstr "" msgstr ""
# Sync notification displayed if syncing of major artwork is done # Sync notification displayed if syncing of major artwork is done
msgctxt "#30007" msgctxt "#30007"
msgid "Major image caching done" msgid "Plex image caching done"
msgstr "" msgstr ""
# PKC settings artwork: Enable notifications for artwork image sync # PKC settings artwork: Enable notifications for artwork image sync
@ -65,6 +65,16 @@ msgctxt "#30009"
msgid "Enable image caching during Kodi playback (restart Kodi!)" msgid "Enable image caching during Kodi playback (restart Kodi!)"
msgstr "" msgstr ""
# PKC settings - Artwork
msgctxt "#30010"
msgid "Approximate progress"
msgstr ""
# PKC settings - Artwork
msgctxt "#30011"
msgid "Artwork left to cache:"
msgstr ""
# Button text # Button text
msgctxt "#30012" msgctxt "#30012"
msgid "OK" msgid "OK"
@ -79,6 +89,11 @@ msgctxt "#30014"
msgid "Connection" msgid "Connection"
msgstr "Conexión" msgstr "Conexión"
# PKC settings - Artwork
msgctxt "#30015"
msgid "Movie and show FanartTV lookups left to do:"
msgstr ""
msgctxt "#30016" msgctxt "#30016"
msgid "Device Name" msgid "Device Name"
msgstr "Nombre del Dispositivo" msgstr "Nombre del Dispositivo"
@ -88,6 +103,16 @@ msgctxt "#30017"
msgid "Unauthorized for PMS" msgid "Unauthorized for PMS"
msgstr "No autorizado para PMS" msgstr "No autorizado para PMS"
# Sync notification displayed for the number of fanart.tv lookups left
msgctxt "#30018"
msgid "Checking FanartTV for %s items"
msgstr ""
# Sync notification displayed when FanartTV lookup is completed
msgctxt "#30019"
msgid "FanartTV lookup completed"
msgstr ""
# PKC settings category # PKC settings category
msgctxt "#30022" msgctxt "#30022"
msgid "Advanced" msgid "Advanced"
@ -415,8 +440,8 @@ msgstr "Modo de reproducción"
# PKC Settings - Artwork # PKC Settings - Artwork
msgctxt "#30512" msgctxt "#30512"
msgid "Force artwork caching" msgid "Cache all artwork for a smooth Kodi experience"
msgstr "Obligar caché de arte" msgstr ""
# PKC Settings - Artwork # PKC Settings - Artwork
msgctxt "#30513" msgctxt "#30513"
@ -495,12 +520,8 @@ msgstr "Mensajes del servidor"
# PKC Settings - Advanced # PKC Settings - Advanced
msgctxt "#30535" msgctxt "#30535"
msgid "" msgid "Generate a new unique Plex device Id (e.g. to clone Kodi)"
"[COLOR yellow]Generate a new unique device Id (e.g. when cloning "
"Kodi)[/COLOR]"
msgstr "" msgstr ""
"[COLOR yellow] Generar un nuevo id único de dispositivo (por ejemplo, al "
"clonar Kodi)[/COLOR]"
# PKC Settings - Connection # PKC Settings - Connection
msgctxt "#30536" msgctxt "#30536"
@ -514,8 +535,8 @@ msgstr "REINICIAR KODI SI HACE CAMBIOS"
# PKC Settings warning # PKC Settings warning
msgctxt "#30538" msgctxt "#30538"
msgid "Complete Re-Sync necessary" msgid "Manual complete reset of Kodi database necessary, see \"Advanced\""
msgstr "Es necesaria una Re-Sincronización Completa" msgstr ""
# PKC Settings - Artwork # PKC Settings - Artwork
msgctxt "#30539" msgctxt "#30539"
@ -630,9 +651,8 @@ msgstr "Tamaño de subtítulos incrustados"
# PKC Settings - Sync # PKC Settings - Sync
msgctxt "#39003" msgctxt "#39003"
msgid "Limit download sync threads (rec. for rpi: 1)" msgid "Number of simultaneous download threads"
msgstr "" msgstr ""
"Limitar los hilos de sincronización de descarga (recomendado para rpi: 1)"
# PKC Settings - Plex # PKC Settings - Plex
msgctxt "#39004" msgctxt "#39004"
@ -706,17 +726,13 @@ msgstr ""
# PKC Settings - Advanced # PKC Settings - Advanced
msgctxt "#39018" msgctxt "#39018"
msgid "[COLOR yellow]Repair local database (force update all content)[/COLOR]" msgid "Repair the Kodi database (force update all content)"
msgstr "" msgstr ""
"[COLOR yellow] Reparar base de datos local (todo el contenido será "
"actualizado)[/COLOR]"
# PKC Settings - Advanced # PKC Settings - Advanced
msgctxt "#39019" msgctxt "#39019"
msgid "[COLOR red]Partial or full reset of Database and PKC[/COLOR]" msgid "Reset the Kodi database and optionally reset PlexKodiConnect"
msgstr "" msgstr ""
"[COLOR Red] Restablecimiento parcial o total de la base de datos y "
"PKC[/COLOR]"
# PKC Settings - Artwork # PKC Settings - Artwork
msgctxt "#39020" msgctxt "#39020"

View file

@ -50,12 +50,12 @@ msgstr "Identifiant : "
# Sync notification displayed if there is still artwork to be cached to Kodi # Sync notification displayed if there is still artwork to be cached to Kodi
msgctxt "#30006" msgctxt "#30006"
msgid "Caching %s images" msgid "Caching %s Plex images"
msgstr "" msgstr ""
# Sync notification displayed if syncing of major artwork is done # Sync notification displayed if syncing of major artwork is done
msgctxt "#30007" msgctxt "#30007"
msgid "Major image caching done" msgid "Plex image caching done"
msgstr "" msgstr ""
# PKC settings artwork: Enable notifications for artwork image sync # PKC settings artwork: Enable notifications for artwork image sync
@ -68,6 +68,16 @@ msgctxt "#30009"
msgid "Enable image caching during Kodi playback (restart Kodi!)" msgid "Enable image caching during Kodi playback (restart Kodi!)"
msgstr "" msgstr ""
# PKC settings - Artwork
msgctxt "#30010"
msgid "Approximate progress"
msgstr ""
# PKC settings - Artwork
msgctxt "#30011"
msgid "Artwork left to cache:"
msgstr ""
# Button text # Button text
msgctxt "#30012" msgctxt "#30012"
msgid "OK" msgid "OK"
@ -82,6 +92,11 @@ msgctxt "#30014"
msgid "Connection" msgid "Connection"
msgstr "Connexion" msgstr "Connexion"
# PKC settings - Artwork
msgctxt "#30015"
msgid "Movie and show FanartTV lookups left to do:"
msgstr ""
msgctxt "#30016" msgctxt "#30016"
msgid "Device Name" msgid "Device Name"
msgstr "Nom de l'appareil" msgstr "Nom de l'appareil"
@ -91,6 +106,16 @@ msgctxt "#30017"
msgid "Unauthorized for PMS" msgid "Unauthorized for PMS"
msgstr "Non autorisé pour le PMS" msgstr "Non autorisé pour le PMS"
# Sync notification displayed for the number of fanart.tv lookups left
msgctxt "#30018"
msgid "Checking FanartTV for %s items"
msgstr ""
# Sync notification displayed when FanartTV lookup is completed
msgctxt "#30019"
msgid "FanartTV lookup completed"
msgstr ""
# PKC settings category # PKC settings category
msgctxt "#30022" msgctxt "#30022"
msgid "Advanced" msgid "Advanced"
@ -418,8 +443,8 @@ msgstr "Mode de lecture"
# PKC Settings - Artwork # PKC Settings - Artwork
msgctxt "#30512" msgctxt "#30512"
msgid "Force artwork caching" msgid "Cache all artwork for a smooth Kodi experience"
msgstr "Forcer la mise en cache du contenu graphique" msgstr ""
# PKC Settings - Artwork # PKC Settings - Artwork
msgctxt "#30513" msgctxt "#30513"
@ -500,12 +525,8 @@ msgstr "Messages du serveur"
# PKC Settings - Advanced # PKC Settings - Advanced
msgctxt "#30535" msgctxt "#30535"
msgid "" msgid "Generate a new unique Plex device Id (e.g. to clone Kodi)"
"[COLOR yellow]Generate a new unique device Id (e.g. when cloning "
"Kodi)[/COLOR]"
msgstr "" msgstr ""
"[COLOR yellow]Générer un nouvel ID (unique) (Ex: lors du clonage de "
"Kodi)[/COLOR]"
# PKC Settings - Connection # PKC Settings - Connection
msgctxt "#30536" msgctxt "#30536"
@ -519,8 +540,8 @@ msgstr "REDÉMARREZ KODI SI VOUS APPORTEZ DES MODIFICATIONS"
# PKC Settings warning # PKC Settings warning
msgctxt "#30538" msgctxt "#30538"
msgid "Complete Re-Sync necessary" msgid "Manual complete reset of Kodi database necessary, see \"Advanced\""
msgstr "Re-synchronisation complète nécessaire" msgstr ""
# PKC Settings - Artwork # PKC Settings - Artwork
msgctxt "#30539" msgctxt "#30539"
@ -634,8 +655,8 @@ msgstr "Taille des sous-titres incorporés"
# PKC Settings - Sync # PKC Settings - Sync
msgctxt "#39003" msgctxt "#39003"
msgid "Limit download sync threads (rec. for rpi: 1)" msgid "Number of simultaneous download threads"
msgstr "Limit download sync threads (rec. for rpi: 1)" msgstr ""
# PKC Settings - Plex # PKC Settings - Plex
msgctxt "#39004" msgctxt "#39004"
@ -708,17 +729,13 @@ msgstr ""
# PKC Settings - Advanced # PKC Settings - Advanced
msgctxt "#39018" msgctxt "#39018"
msgid "[COLOR yellow]Repair local database (force update all content)[/COLOR]" msgid "Repair the Kodi database (force update all content)"
msgstr "" msgstr ""
"[COLOR yellow]Répération de la base de données locale (Mise à jour forcée de"
" tout le contenu)[/COLOR]"
# PKC Settings - Advanced # PKC Settings - Advanced
msgctxt "#39019" msgctxt "#39019"
msgid "[COLOR red]Partial or full reset of Database and PKC[/COLOR]" msgid "Reset the Kodi database and optionally reset PlexKodiConnect"
msgstr "" msgstr ""
"[COLOR red] Remise à zéro partielle ou complète de la base de données et "
"PKC[/COLOR]"
# PKC Settings - Artwork # PKC Settings - Artwork
msgctxt "#39020" msgctxt "#39020"

View file

@ -52,12 +52,12 @@ msgstr "Identifiant : "
# Sync notification displayed if there is still artwork to be cached to Kodi # Sync notification displayed if there is still artwork to be cached to Kodi
msgctxt "#30006" msgctxt "#30006"
msgid "Caching %s images" msgid "Caching %s Plex images"
msgstr "" msgstr ""
# Sync notification displayed if syncing of major artwork is done # Sync notification displayed if syncing of major artwork is done
msgctxt "#30007" msgctxt "#30007"
msgid "Major image caching done" msgid "Plex image caching done"
msgstr "" msgstr ""
# PKC settings artwork: Enable notifications for artwork image sync # PKC settings artwork: Enable notifications for artwork image sync
@ -70,6 +70,16 @@ msgctxt "#30009"
msgid "Enable image caching during Kodi playback (restart Kodi!)" msgid "Enable image caching during Kodi playback (restart Kodi!)"
msgstr "" msgstr ""
# PKC settings - Artwork
msgctxt "#30010"
msgid "Approximate progress"
msgstr ""
# PKC settings - Artwork
msgctxt "#30011"
msgid "Artwork left to cache:"
msgstr ""
# Button text # Button text
msgctxt "#30012" msgctxt "#30012"
msgid "OK" msgid "OK"
@ -84,6 +94,11 @@ msgctxt "#30014"
msgid "Connection" msgid "Connection"
msgstr "Connexion" msgstr "Connexion"
# PKC settings - Artwork
msgctxt "#30015"
msgid "Movie and show FanartTV lookups left to do:"
msgstr ""
msgctxt "#30016" msgctxt "#30016"
msgid "Device Name" msgid "Device Name"
msgstr "Nom de l'appareil" msgstr "Nom de l'appareil"
@ -93,6 +108,16 @@ msgctxt "#30017"
msgid "Unauthorized for PMS" msgid "Unauthorized for PMS"
msgstr "Non autorisé pour le PMS" msgstr "Non autorisé pour le PMS"
# Sync notification displayed for the number of fanart.tv lookups left
msgctxt "#30018"
msgid "Checking FanartTV for %s items"
msgstr ""
# Sync notification displayed when FanartTV lookup is completed
msgctxt "#30019"
msgid "FanartTV lookup completed"
msgstr ""
# PKC settings category # PKC settings category
msgctxt "#30022" msgctxt "#30022"
msgid "Advanced" msgid "Advanced"
@ -420,8 +445,8 @@ msgstr "Mode de lecture"
# PKC Settings - Artwork # PKC Settings - Artwork
msgctxt "#30512" msgctxt "#30512"
msgid "Force artwork caching" msgid "Cache all artwork for a smooth Kodi experience"
msgstr "Forcer la mise en cache du contenu graphique" msgstr ""
# PKC Settings - Artwork # PKC Settings - Artwork
msgctxt "#30513" msgctxt "#30513"
@ -502,12 +527,8 @@ msgstr "Messages du serveur"
# PKC Settings - Advanced # PKC Settings - Advanced
msgctxt "#30535" msgctxt "#30535"
msgid "" msgid "Generate a new unique Plex device Id (e.g. to clone Kodi)"
"[COLOR yellow]Generate a new unique device Id (e.g. when cloning "
"Kodi)[/COLOR]"
msgstr "" msgstr ""
"[COLOR yellow]Générer un nouvel ID (unique) (Ex: lors du clonage de "
"Kodi)[/COLOR]"
# PKC Settings - Connection # PKC Settings - Connection
msgctxt "#30536" msgctxt "#30536"
@ -521,8 +542,8 @@ msgstr "REDÉMARREZ KODI SI VOUS APPORTEZ DES MODIFICATIONS"
# PKC Settings warning # PKC Settings warning
msgctxt "#30538" msgctxt "#30538"
msgid "Complete Re-Sync necessary" msgid "Manual complete reset of Kodi database necessary, see \"Advanced\""
msgstr "Re-synchronisation complète nécessaire" msgstr ""
# PKC Settings - Artwork # PKC Settings - Artwork
msgctxt "#30539" msgctxt "#30539"
@ -636,8 +657,8 @@ msgstr "Taille des sous-titres incorporés"
# PKC Settings - Sync # PKC Settings - Sync
msgctxt "#39003" msgctxt "#39003"
msgid "Limit download sync threads (rec. for rpi: 1)" msgid "Number of simultaneous download threads"
msgstr "Limit download sync threads (rec. for rpi: 1)" msgstr ""
# PKC Settings - Plex # PKC Settings - Plex
msgctxt "#39004" msgctxt "#39004"
@ -710,17 +731,13 @@ msgstr ""
# PKC Settings - Advanced # PKC Settings - Advanced
msgctxt "#39018" msgctxt "#39018"
msgid "[COLOR yellow]Repair local database (force update all content)[/COLOR]" msgid "Repair the Kodi database (force update all content)"
msgstr "" msgstr ""
"[COLOR yellow]Répération de la base de données locale (Mise à jour forcée de"
" tout le contenu)[/COLOR]"
# PKC Settings - Advanced # PKC Settings - Advanced
msgctxt "#39019" msgctxt "#39019"
msgid "[COLOR red]Partial or full reset of Database and PKC[/COLOR]" msgid "Reset the Kodi database and optionally reset PlexKodiConnect"
msgstr "" msgstr ""
"[COLOR red] Remise à zéro partielle ou complète de la base de données et "
"PKC[/COLOR]"
# PKC Settings - Artwork # PKC Settings - Artwork
msgctxt "#39020" msgctxt "#39020"

View file

@ -49,12 +49,12 @@ msgstr "Felhasználónév: "
# Sync notification displayed if there is still artwork to be cached to Kodi # Sync notification displayed if there is still artwork to be cached to Kodi
msgctxt "#30006" msgctxt "#30006"
msgid "Caching %s images" msgid "Caching %s Plex images"
msgstr "" msgstr ""
# Sync notification displayed if syncing of major artwork is done # Sync notification displayed if syncing of major artwork is done
msgctxt "#30007" msgctxt "#30007"
msgid "Major image caching done" msgid "Plex image caching done"
msgstr "" msgstr ""
# PKC settings artwork: Enable notifications for artwork image sync # PKC settings artwork: Enable notifications for artwork image sync
@ -67,6 +67,16 @@ msgctxt "#30009"
msgid "Enable image caching during Kodi playback (restart Kodi!)" msgid "Enable image caching during Kodi playback (restart Kodi!)"
msgstr "" msgstr ""
# PKC settings - Artwork
msgctxt "#30010"
msgid "Approximate progress"
msgstr ""
# PKC settings - Artwork
msgctxt "#30011"
msgid "Artwork left to cache:"
msgstr ""
# Button text # Button text
msgctxt "#30012" msgctxt "#30012"
msgid "OK" msgid "OK"
@ -81,6 +91,11 @@ msgctxt "#30014"
msgid "Connection" msgid "Connection"
msgstr "Kapcsolat" msgstr "Kapcsolat"
# PKC settings - Artwork
msgctxt "#30015"
msgid "Movie and show FanartTV lookups left to do:"
msgstr ""
msgctxt "#30016" msgctxt "#30016"
msgid "Device Name" msgid "Device Name"
msgstr "Eszköz neve" msgstr "Eszköz neve"
@ -90,6 +105,16 @@ msgctxt "#30017"
msgid "Unauthorized for PMS" msgid "Unauthorized for PMS"
msgstr "PMS hitelesítés sikertelen" msgstr "PMS hitelesítés sikertelen"
# Sync notification displayed for the number of fanart.tv lookups left
msgctxt "#30018"
msgid "Checking FanartTV for %s items"
msgstr ""
# Sync notification displayed when FanartTV lookup is completed
msgctxt "#30019"
msgid "FanartTV lookup completed"
msgstr ""
# PKC settings category # PKC settings category
msgctxt "#30022" msgctxt "#30022"
msgid "Advanced" msgid "Advanced"
@ -417,8 +442,8 @@ msgstr "Lejátszási mód"
# PKC Settings - Artwork # PKC Settings - Artwork
msgctxt "#30512" msgctxt "#30512"
msgid "Force artwork caching" msgid "Cache all artwork for a smooth Kodi experience"
msgstr "Képek gyorsítótárazásának kényszerítése" msgstr ""
# PKC Settings - Artwork # PKC Settings - Artwork
msgctxt "#30513" msgctxt "#30513"
@ -499,12 +524,8 @@ msgstr "Szerverüzenetek"
# PKC Settings - Advanced # PKC Settings - Advanced
msgctxt "#30535" msgctxt "#30535"
msgid "" msgid "Generate a new unique Plex device Id (e.g. to clone Kodi)"
"[COLOR yellow]Generate a new unique device Id (e.g. when cloning "
"Kodi)[/COLOR]"
msgstr "" msgstr ""
"[COLOR yellow]Új egyedi eszközazonosító létrehozása (pl. Kodi "
"klónozásakor)[/COLOR]"
# PKC Settings - Connection # PKC Settings - Connection
msgctxt "#30536" msgctxt "#30536"
@ -520,8 +541,8 @@ msgstr "INDÍTSA ÚJRA A KODI-T HA BÁRMIT ÁTÁLLÍT"
# PKC Settings warning # PKC Settings warning
msgctxt "#30538" msgctxt "#30538"
msgid "Complete Re-Sync necessary" msgid "Manual complete reset of Kodi database necessary, see \"Advanced\""
msgstr "Teljes újraszinkronizálás szükséges" msgstr ""
# PKC Settings - Artwork # PKC Settings - Artwork
msgctxt "#30539" msgctxt "#30539"
@ -636,8 +657,8 @@ msgstr "Égetett felirat mérete"
# PKC Settings - Sync # PKC Settings - Sync
msgctxt "#39003" msgctxt "#39003"
msgid "Limit download sync threads (rec. for rpi: 1)" msgid "Number of simultaneous download threads"
msgstr "Szinkronizálási szálak korlátozása (RPi esetén ajánlott: 1)" msgstr ""
# PKC Settings - Plex # PKC Settings - Plex
msgctxt "#39004" msgctxt "#39004"
@ -712,17 +733,13 @@ msgstr ""
# PKC Settings - Advanced # PKC Settings - Advanced
msgctxt "#39018" msgctxt "#39018"
msgid "[COLOR yellow]Repair local database (force update all content)[/COLOR]" msgid "Repair the Kodi database (force update all content)"
msgstr "" msgstr ""
"[COLOR yellow]Helyi adatbázis helyreállítása (minden tartalom frissítésének "
"kényszerítése)[/COLOR]"
# PKC Settings - Advanced # PKC Settings - Advanced
msgctxt "#39019" msgctxt "#39019"
msgid "[COLOR red]Partial or full reset of Database and PKC[/COLOR]" msgid "Reset the Kodi database and optionally reset PlexKodiConnect"
msgstr "" msgstr ""
"[COLOR red]Az adatbázis és a PKC részleges vagy teljes "
"visszaállítása[/COLOR]"
# PKC Settings - Artwork # PKC Settings - Artwork
msgctxt "#39020" msgctxt "#39020"

View file

@ -1,13 +1,14 @@
# XBMC Media Center language file # XBMC Media Center language file
# Translators: # Translators:
# Croneter None <croneter@gmail.com>, 2017 # Croneter None <croneter@gmail.com>, 2017
# Angela Calò <angycalo@libero.it>, 2018
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PlexKodiConnect\n" "Project-Id-Version: PlexKodiConnect\n"
"Report-Msgid-Bugs-To: croneter@gmail.com\n" "Report-Msgid-Bugs-To: croneter@gmail.com\n"
"POT-Creation-Date: 2017-04-15 13:13+0000\n" "POT-Creation-Date: 2017-04-15 13:13+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: Croneter None <croneter@gmail.com>, 2017\n" "Last-Translator: Angela Calò <angycalo@libero.it>, 2018\n"
"Language-Team: Italian (Italy) (https://www.transifex.com/croneter/teams/73837/it_IT/)\n" "Language-Team: Italian (Italy) (https://www.transifex.com/croneter/teams/73837/it_IT/)\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
@ -18,7 +19,7 @@ msgstr ""
# Add-on settings # Add-on settings
msgctxt "#29999" msgctxt "#29999"
msgid "PlexKodiConnect" msgid "PlexKodiConnect"
msgstr "" msgstr "PlexKodiConnect"
msgctxt "#30000" msgctxt "#30000"
msgid "Server Address (IP)" msgid "Server Address (IP)"
@ -26,7 +27,7 @@ msgstr "Indirizzo Server (IP)"
msgctxt "#30001" msgctxt "#30001"
msgid "Searching for PMS" msgid "Searching for PMS"
msgstr "" msgstr "Cercando per PMS"
msgctxt "#30002" msgctxt "#30002"
msgid "Preferred playback method" msgid "Preferred playback method"
@ -40,35 +41,49 @@ msgid ""
"Warning: Kodi setting \"Play next video automatically\" is enabled. This " "Warning: Kodi setting \"Play next video automatically\" is enabled. This "
"could break PKC. Deactivate?" "could break PKC. Deactivate?"
msgstr "" msgstr ""
"Attenzione: l'impostazione Kodi \"Avvia il video successivo "
"automaticamente\" è attivata. Questo può interrompere PKC. Disattivare?"
msgctxt "#30005" msgctxt "#30005"
msgid "Username: " msgid "Username: "
msgstr "" msgstr "Nome utente:"
# Sync notification displayed if there is still artwork to be cached to Kodi # Sync notification displayed if there is still artwork to be cached to Kodi
msgctxt "#30006" msgctxt "#30006"
msgid "Caching %s images" msgid "Caching %s Plex images"
msgstr "" msgstr "Sto salvando %s delle immagini Plex "
# Sync notification displayed if syncing of major artwork is done # Sync notification displayed if syncing of major artwork is done
msgctxt "#30007" msgctxt "#30007"
msgid "Major image caching done" msgid "Plex image caching done"
msgstr "" msgstr "Salvataggio dell'immagine Plex completato"
# PKC settings artwork: Enable notifications for artwork image sync # PKC settings artwork: Enable notifications for artwork image sync
msgctxt "#30008" msgctxt "#30008"
msgid "Enable notifications for image caching" msgid "Enable notifications for image caching"
msgstr "" msgstr "Abilita le notifiche per il salvataggio dell'immagine"
# PKC settings artwork: Enable image caching during Kodi playback # PKC settings artwork: Enable image caching during Kodi playback
msgctxt "#30009" msgctxt "#30009"
msgid "Enable image caching during Kodi playback (restart Kodi!)" msgid "Enable image caching during Kodi playback (restart Kodi!)"
msgstr "" msgstr ""
"Abilita il salvataggio dell'immagine durante il playback Kodi (riavvia "
"Kodi!)"
# PKC settings - Artwork
msgctxt "#30010"
msgid "Approximate progress"
msgstr ""
# PKC settings - Artwork
msgctxt "#30011"
msgid "Artwork left to cache:"
msgstr ""
# Button text # Button text
msgctxt "#30012" msgctxt "#30012"
msgid "OK" msgid "OK"
msgstr "" msgstr "OK"
msgctxt "#30013" msgctxt "#30013"
msgid "Never show" msgid "Never show"
@ -79,6 +94,11 @@ msgctxt "#30014"
msgid "Connection" msgid "Connection"
msgstr "Connessione" msgstr "Connessione"
# PKC settings - Artwork
msgctxt "#30015"
msgid "Movie and show FanartTV lookups left to do:"
msgstr ""
msgctxt "#30016" msgctxt "#30016"
msgid "Device Name" msgid "Device Name"
msgstr "Nome del dispositivo" msgstr "Nome del dispositivo"
@ -88,6 +108,16 @@ msgctxt "#30017"
msgid "Unauthorized for PMS" msgid "Unauthorized for PMS"
msgstr "Non autorizzato per PMS" msgstr "Non autorizzato per PMS"
# Sync notification displayed for the number of fanart.tv lookups left
msgctxt "#30018"
msgid "Checking FanartTV for %s items"
msgstr ""
# Sync notification displayed when FanartTV lookup is completed
msgctxt "#30019"
msgid "FanartTV lookup completed"
msgstr ""
# PKC settings category # PKC settings category
msgctxt "#30022" msgctxt "#30022"
msgid "Advanced" msgid "Advanced"
@ -415,8 +445,8 @@ msgstr "Modalità di riproduzione"
# PKC Settings - Artwork # PKC Settings - Artwork
msgctxt "#30512" msgctxt "#30512"
msgid "Force artwork caching" msgid "Cache all artwork for a smooth Kodi experience"
msgstr "Forza caching delle artwork" msgstr ""
# PKC Settings - Artwork # PKC Settings - Artwork
msgctxt "#30513" msgctxt "#30513"
@ -495,12 +525,8 @@ msgstr "Messaggi del server"
# PKC Settings - Advanced # PKC Settings - Advanced
msgctxt "#30535" msgctxt "#30535"
msgid "" msgid "Generate a new unique Plex device Id (e.g. to clone Kodi)"
"[COLOR yellow]Generate a new unique device Id (e.g. when cloning "
"Kodi)[/COLOR]"
msgstr "" msgstr ""
"[COLOR yellow]Genera un nuovo ID dispositivo (es. quando viene clonato "
"Kodi)[/COLOR]"
# PKC Settings - Connection # PKC Settings - Connection
msgctxt "#30536" msgctxt "#30536"
@ -514,8 +540,8 @@ msgstr "RIAVVIA KODI SE FAI DELLE MODIFICHE"
# PKC Settings warning # PKC Settings warning
msgctxt "#30538" msgctxt "#30538"
msgid "Complete Re-Sync necessary" msgid "Manual complete reset of Kodi database necessary, see \"Advanced\""
msgstr "Ri-sincronizzazione completa necessaria" msgstr ""
# PKC Settings - Artwork # PKC Settings - Artwork
msgctxt "#30539" msgctxt "#30539"
@ -630,8 +656,8 @@ msgstr "Dimensione sottotitoli in sovraimpressione"
# PKC Settings - Sync # PKC Settings - Sync
msgctxt "#39003" msgctxt "#39003"
msgid "Limit download sync threads (rec. for rpi: 1)" msgid "Number of simultaneous download threads"
msgstr "Limita thread di download per la sincronizzazione (racc. per rpi: 1)" msgstr ""
# PKC Settings - Plex # PKC Settings - Plex
msgctxt "#39004" msgctxt "#39004"
@ -707,15 +733,13 @@ msgstr ""
# PKC Settings - Advanced # PKC Settings - Advanced
msgctxt "#39018" msgctxt "#39018"
msgid "[COLOR yellow]Repair local database (force update all content)[/COLOR]" msgid "Repair the Kodi database (force update all content)"
msgstr "" msgstr ""
"[COLOR yellow]Ripara database locale (forza l'aggiornamento dei "
"contenuti)[/COLOR]"
# PKC Settings - Advanced # PKC Settings - Advanced
msgctxt "#39019" msgctxt "#39019"
msgid "[COLOR red]Partial or full reset of Database and PKC[/COLOR]" msgid "Reset the Kodi database and optionally reset PlexKodiConnect"
msgstr "[COLOR red]Reset parziale o completo di database e PKC[/COLOR]" msgstr ""
# PKC Settings - Artwork # PKC Settings - Artwork
msgctxt "#39020" msgctxt "#39020"

View file

@ -50,12 +50,12 @@ msgstr "Gebruikersnaam: "
# Sync notification displayed if there is still artwork to be cached to Kodi # Sync notification displayed if there is still artwork to be cached to Kodi
msgctxt "#30006" msgctxt "#30006"
msgid "Caching %s images" msgid "Caching %s Plex images"
msgstr "" msgstr ""
# Sync notification displayed if syncing of major artwork is done # Sync notification displayed if syncing of major artwork is done
msgctxt "#30007" msgctxt "#30007"
msgid "Major image caching done" msgid "Plex image caching done"
msgstr "" msgstr ""
# PKC settings artwork: Enable notifications for artwork image sync # PKC settings artwork: Enable notifications for artwork image sync
@ -68,6 +68,16 @@ msgctxt "#30009"
msgid "Enable image caching during Kodi playback (restart Kodi!)" msgid "Enable image caching during Kodi playback (restart Kodi!)"
msgstr "" msgstr ""
# PKC settings - Artwork
msgctxt "#30010"
msgid "Approximate progress"
msgstr ""
# PKC settings - Artwork
msgctxt "#30011"
msgid "Artwork left to cache:"
msgstr ""
# Button text # Button text
msgctxt "#30012" msgctxt "#30012"
msgid "OK" msgid "OK"
@ -82,6 +92,11 @@ msgctxt "#30014"
msgid "Connection" msgid "Connection"
msgstr "Verbinding" msgstr "Verbinding"
# PKC settings - Artwork
msgctxt "#30015"
msgid "Movie and show FanartTV lookups left to do:"
msgstr ""
msgctxt "#30016" msgctxt "#30016"
msgid "Device Name" msgid "Device Name"
msgstr "Apparaatnaam" msgstr "Apparaatnaam"
@ -91,6 +106,16 @@ msgctxt "#30017"
msgid "Unauthorized for PMS" msgid "Unauthorized for PMS"
msgstr "Onbevoegd voor PMS" msgstr "Onbevoegd voor PMS"
# Sync notification displayed for the number of fanart.tv lookups left
msgctxt "#30018"
msgid "Checking FanartTV for %s items"
msgstr ""
# Sync notification displayed when FanartTV lookup is completed
msgctxt "#30019"
msgid "FanartTV lookup completed"
msgstr ""
# PKC settings category # PKC settings category
msgctxt "#30022" msgctxt "#30022"
msgid "Advanced" msgid "Advanced"
@ -418,8 +443,8 @@ msgstr "Afspeelmodus"
# PKC Settings - Artwork # PKC Settings - Artwork
msgctxt "#30512" msgctxt "#30512"
msgid "Force artwork caching" msgid "Cache all artwork for a smooth Kodi experience"
msgstr "Forceer artwork caching" msgstr ""
# PKC Settings - Artwork # PKC Settings - Artwork
msgctxt "#30513" msgctxt "#30513"
@ -499,12 +524,8 @@ msgstr "Serverberichten"
# PKC Settings - Advanced # PKC Settings - Advanced
msgctxt "#30535" msgctxt "#30535"
msgid "" msgid "Generate a new unique Plex device Id (e.g. to clone Kodi)"
"[COLOR yellow]Generate a new unique device Id (e.g. when cloning "
"Kodi)[/COLOR]"
msgstr "" msgstr ""
"[COLOR yellow]Genereer nieuw uniek apparaat ID (bijvoorbeeld bij het klonen "
"van Kodi)[/COLOR]"
# PKC Settings - Connection # PKC Settings - Connection
msgctxt "#30536" msgctxt "#30536"
@ -518,8 +539,8 @@ msgstr "BIJ AANPASSINGEN KODI HERSTARTEN"
# PKC Settings warning # PKC Settings warning
msgctxt "#30538" msgctxt "#30538"
msgid "Complete Re-Sync necessary" msgid "Manual complete reset of Kodi database necessary, see \"Advanced\""
msgstr "Volledige re-sync nodig" msgstr ""
# PKC Settings - Artwork # PKC Settings - Artwork
msgctxt "#30539" msgctxt "#30539"
@ -632,8 +653,8 @@ msgstr "Ondertitel grootte"
# PKC Settings - Sync # PKC Settings - Sync
msgctxt "#39003" msgctxt "#39003"
msgid "Limit download sync threads (rec. for rpi: 1)" msgid "Number of simultaneous download threads"
msgstr "Beperk aantal download threads (voor rpi: 1)" msgstr ""
# PKC Settings - Plex # PKC Settings - Plex
msgctxt "#39004" msgctxt "#39004"
@ -705,16 +726,13 @@ msgstr "PKC plugin instellingen aanpassen? Kodi moet hierna herstart worden!"
# PKC Settings - Advanced # PKC Settings - Advanced
msgctxt "#39018" msgctxt "#39018"
msgid "[COLOR yellow]Repair local database (force update all content)[/COLOR]" msgid "Repair the Kodi database (force update all content)"
msgstr "" msgstr ""
"[COLOR yellow]Lokale database herstellen (forceer verversen van alle "
"inhoud)[/COLOR]"
# PKC Settings - Advanced # PKC Settings - Advanced
msgctxt "#39019" msgctxt "#39019"
msgid "[COLOR red]Partial or full reset of Database and PKC[/COLOR]" msgid "Reset the Kodi database and optionally reset PlexKodiConnect"
msgstr "" msgstr ""
"[COLOR red]Gedeeltelijke of volledige reset van database en PKC[/COLOR]"
# PKC Settings - Artwork # PKC Settings - Artwork
msgctxt "#39020" msgctxt "#39020"

View file

@ -48,12 +48,12 @@ msgstr "Brukernavn:"
# Sync notification displayed if there is still artwork to be cached to Kodi # Sync notification displayed if there is still artwork to be cached to Kodi
msgctxt "#30006" msgctxt "#30006"
msgid "Caching %s images" msgid "Caching %s Plex images"
msgstr "" msgstr ""
# Sync notification displayed if syncing of major artwork is done # Sync notification displayed if syncing of major artwork is done
msgctxt "#30007" msgctxt "#30007"
msgid "Major image caching done" msgid "Plex image caching done"
msgstr "" msgstr ""
# PKC settings artwork: Enable notifications for artwork image sync # PKC settings artwork: Enable notifications for artwork image sync
@ -66,6 +66,16 @@ msgctxt "#30009"
msgid "Enable image caching during Kodi playback (restart Kodi!)" msgid "Enable image caching during Kodi playback (restart Kodi!)"
msgstr "" msgstr ""
# PKC settings - Artwork
msgctxt "#30010"
msgid "Approximate progress"
msgstr ""
# PKC settings - Artwork
msgctxt "#30011"
msgid "Artwork left to cache:"
msgstr ""
# Button text # Button text
msgctxt "#30012" msgctxt "#30012"
msgid "OK" msgid "OK"
@ -80,6 +90,11 @@ msgctxt "#30014"
msgid "Connection" msgid "Connection"
msgstr "Tilkobling" msgstr "Tilkobling"
# PKC settings - Artwork
msgctxt "#30015"
msgid "Movie and show FanartTV lookups left to do:"
msgstr ""
msgctxt "#30016" msgctxt "#30016"
msgid "Device Name" msgid "Device Name"
msgstr "Enhetsnavn" msgstr "Enhetsnavn"
@ -89,6 +104,16 @@ msgctxt "#30017"
msgid "Unauthorized for PMS" msgid "Unauthorized for PMS"
msgstr "Uautorisert for tilkobling til PMS" msgstr "Uautorisert for tilkobling til PMS"
# Sync notification displayed for the number of fanart.tv lookups left
msgctxt "#30018"
msgid "Checking FanartTV for %s items"
msgstr ""
# Sync notification displayed when FanartTV lookup is completed
msgctxt "#30019"
msgid "FanartTV lookup completed"
msgstr ""
# PKC settings category # PKC settings category
msgctxt "#30022" msgctxt "#30022"
msgid "Advanced" msgid "Advanced"
@ -415,8 +440,8 @@ msgstr "Avspillingsmetode"
# PKC Settings - Artwork # PKC Settings - Artwork
msgctxt "#30512" msgctxt "#30512"
msgid "Force artwork caching" msgid "Cache all artwork for a smooth Kodi experience"
msgstr "Tving artwork caching" msgstr ""
# PKC Settings - Artwork # PKC Settings - Artwork
msgctxt "#30513" msgctxt "#30513"
@ -495,12 +520,8 @@ msgstr "Servermeldinger"
# PKC Settings - Advanced # PKC Settings - Advanced
msgctxt "#30535" msgctxt "#30535"
msgid "" msgid "Generate a new unique Plex device Id (e.g. to clone Kodi)"
"[COLOR yellow]Generate a new unique device Id (e.g. when cloning "
"Kodi)[/COLOR]"
msgstr "" msgstr ""
"[COLOR yellow]Generer en ny unik enhets ID (f. eks. ved kloning av "
"Kodi)[/COLOR]"
# PKC Settings - Connection # PKC Settings - Connection
msgctxt "#30536" msgctxt "#30536"
@ -514,8 +535,8 @@ msgstr "START KODI PÅ NYTT HVIS DU GJØR FORANDRINGER"
# PKC Settings warning # PKC Settings warning
msgctxt "#30538" msgctxt "#30538"
msgid "Complete Re-Sync necessary" msgid "Manual complete reset of Kodi database necessary, see \"Advanced\""
msgstr "Fullstending resynk nødvendig" msgstr ""
# PKC Settings - Artwork # PKC Settings - Artwork
msgctxt "#30539" msgctxt "#30539"
@ -627,8 +648,8 @@ msgstr "Størrelse på integrert undertekst"
# PKC Settings - Sync # PKC Settings - Sync
msgctxt "#39003" msgctxt "#39003"
msgid "Limit download sync threads (rec. for rpi: 1)" msgid "Number of simultaneous download threads"
msgstr "Begrens antall nedlastingsprosesser (anbefalt for rpi: 1)" msgstr ""
# PKC Settings - Plex # PKC Settings - Plex
msgctxt "#39004" msgctxt "#39004"
@ -701,14 +722,12 @@ msgstr ""
# PKC Settings - Advanced # PKC Settings - Advanced
msgctxt "#39018" msgctxt "#39018"
msgid "[COLOR yellow]Repair local database (force update all content)[/COLOR]" msgid "Repair the Kodi database (force update all content)"
msgstr "" msgstr ""
" [COLOR yellow]Reparer lokal database (tving oppdatering av alt "
"innhold)[/COLOR]"
# PKC Settings - Advanced # PKC Settings - Advanced
msgctxt "#39019" msgctxt "#39019"
msgid "[COLOR red]Partial or full reset of Database and PKC[/COLOR]" msgid "Reset the Kodi database and optionally reset PlexKodiConnect"
msgstr "" msgstr ""
# PKC Settings - Artwork # PKC Settings - Artwork

View file

@ -47,12 +47,12 @@ msgstr "Utilizador: "
# Sync notification displayed if there is still artwork to be cached to Kodi # Sync notification displayed if there is still artwork to be cached to Kodi
msgctxt "#30006" msgctxt "#30006"
msgid "Caching %s images" msgid "Caching %s Plex images"
msgstr "" msgstr ""
# Sync notification displayed if syncing of major artwork is done # Sync notification displayed if syncing of major artwork is done
msgctxt "#30007" msgctxt "#30007"
msgid "Major image caching done" msgid "Plex image caching done"
msgstr "" msgstr ""
# PKC settings artwork: Enable notifications for artwork image sync # PKC settings artwork: Enable notifications for artwork image sync
@ -65,6 +65,16 @@ msgctxt "#30009"
msgid "Enable image caching during Kodi playback (restart Kodi!)" msgid "Enable image caching during Kodi playback (restart Kodi!)"
msgstr "" msgstr ""
# PKC settings - Artwork
msgctxt "#30010"
msgid "Approximate progress"
msgstr ""
# PKC settings - Artwork
msgctxt "#30011"
msgid "Artwork left to cache:"
msgstr ""
# Button text # Button text
msgctxt "#30012" msgctxt "#30012"
msgid "OK" msgid "OK"
@ -79,6 +89,11 @@ msgctxt "#30014"
msgid "Connection" msgid "Connection"
msgstr "Ligação" msgstr "Ligação"
# PKC settings - Artwork
msgctxt "#30015"
msgid "Movie and show FanartTV lookups left to do:"
msgstr ""
msgctxt "#30016" msgctxt "#30016"
msgid "Device Name" msgid "Device Name"
msgstr "Nome do Dispositivo" msgstr "Nome do Dispositivo"
@ -88,6 +103,16 @@ msgctxt "#30017"
msgid "Unauthorized for PMS" msgid "Unauthorized for PMS"
msgstr "Não autorizado para o PMS" msgstr "Não autorizado para o PMS"
# Sync notification displayed for the number of fanart.tv lookups left
msgctxt "#30018"
msgid "Checking FanartTV for %s items"
msgstr ""
# Sync notification displayed when FanartTV lookup is completed
msgctxt "#30019"
msgid "FanartTV lookup completed"
msgstr ""
# PKC settings category # PKC settings category
msgctxt "#30022" msgctxt "#30022"
msgid "Advanced" msgid "Advanced"
@ -415,8 +440,8 @@ msgstr "Modo de Reprodução"
# PKC Settings - Artwork # PKC Settings - Artwork
msgctxt "#30512" msgctxt "#30512"
msgid "Force artwork caching" msgid "Cache all artwork for a smooth Kodi experience"
msgstr "Forçar o armazenamento em cache das ilustrações" msgstr ""
# PKC Settings - Artwork # PKC Settings - Artwork
msgctxt "#30513" msgctxt "#30513"
@ -495,12 +520,8 @@ msgstr "Mensagens do servidor"
# PKC Settings - Advanced # PKC Settings - Advanced
msgctxt "#30535" msgctxt "#30535"
msgid "" msgid "Generate a new unique Plex device Id (e.g. to clone Kodi)"
"[COLOR yellow]Generate a new unique device Id (e.g. when cloning "
"Kodi)[/COLOR]"
msgstr "" msgstr ""
"[COLOR yellow]Criar uma nova identidade única do dispositivo (e.x. ao clonar"
" Kodi)[/COLOR]"
# PKC Settings - Connection # PKC Settings - Connection
msgctxt "#30536" msgctxt "#30536"
@ -514,8 +535,8 @@ msgstr "REINICIE O KODI SE FIZER MUDANÇAS"
# PKC Settings warning # PKC Settings warning
msgctxt "#30538" msgctxt "#30538"
msgid "Complete Re-Sync necessary" msgid "Manual complete reset of Kodi database necessary, see \"Advanced\""
msgstr "Ressincronização Completa necessária" msgstr ""
# PKC Settings - Artwork # PKC Settings - Artwork
msgctxt "#30539" msgctxt "#30539"
@ -629,9 +650,8 @@ msgstr "Tamanho de legendas permanentes"
# PKC Settings - Sync # PKC Settings - Sync
msgctxt "#39003" msgctxt "#39003"
msgid "Limit download sync threads (rec. for rpi: 1)" msgid "Number of simultaneous download threads"
msgstr "" msgstr ""
"Limitar as operaçoes de descarregamento sincronizado (rec. para rpi: 1)"
# PKC Settings - Plex # PKC Settings - Plex
msgctxt "#39004" msgctxt "#39004"
@ -707,15 +727,13 @@ msgstr ""
# PKC Settings - Advanced # PKC Settings - Advanced
msgctxt "#39018" msgctxt "#39018"
msgid "[COLOR yellow]Repair local database (force update all content)[/COLOR]" msgid "Repair the Kodi database (force update all content)"
msgstr "" msgstr ""
"[COLOR yellow]Reparar base de dados local (forçar actualização de todo o "
"conteúdo)[/COLOR]"
# PKC Settings - Advanced # PKC Settings - Advanced
msgctxt "#39019" msgctxt "#39019"
msgid "[COLOR red]Partial or full reset of Database and PKC[/COLOR]" msgid "Reset the Kodi database and optionally reset PlexKodiConnect"
msgstr "[COLOR red]Reposiçao partial ou total da base de dados e PKC[/COLOR]" msgstr ""
# PKC Settings - Artwork # PKC Settings - Artwork
msgctxt "#39020" msgctxt "#39020"

View file

@ -49,12 +49,12 @@ msgstr "Utilizador: "
# Sync notification displayed if there is still artwork to be cached to Kodi # Sync notification displayed if there is still artwork to be cached to Kodi
msgctxt "#30006" msgctxt "#30006"
msgid "Caching %s images" msgid "Caching %s Plex images"
msgstr "" msgstr ""
# Sync notification displayed if syncing of major artwork is done # Sync notification displayed if syncing of major artwork is done
msgctxt "#30007" msgctxt "#30007"
msgid "Major image caching done" msgid "Plex image caching done"
msgstr "" msgstr ""
# PKC settings artwork: Enable notifications for artwork image sync # PKC settings artwork: Enable notifications for artwork image sync
@ -67,6 +67,16 @@ msgctxt "#30009"
msgid "Enable image caching during Kodi playback (restart Kodi!)" msgid "Enable image caching during Kodi playback (restart Kodi!)"
msgstr "" msgstr ""
# PKC settings - Artwork
msgctxt "#30010"
msgid "Approximate progress"
msgstr ""
# PKC settings - Artwork
msgctxt "#30011"
msgid "Artwork left to cache:"
msgstr ""
# Button text # Button text
msgctxt "#30012" msgctxt "#30012"
msgid "OK" msgid "OK"
@ -81,6 +91,11 @@ msgctxt "#30014"
msgid "Connection" msgid "Connection"
msgstr "Ligação" msgstr "Ligação"
# PKC settings - Artwork
msgctxt "#30015"
msgid "Movie and show FanartTV lookups left to do:"
msgstr ""
msgctxt "#30016" msgctxt "#30016"
msgid "Device Name" msgid "Device Name"
msgstr "Nome do Dispositivo" msgstr "Nome do Dispositivo"
@ -90,6 +105,16 @@ msgctxt "#30017"
msgid "Unauthorized for PMS" msgid "Unauthorized for PMS"
msgstr "Não autorizado para o PMS" msgstr "Não autorizado para o PMS"
# Sync notification displayed for the number of fanart.tv lookups left
msgctxt "#30018"
msgid "Checking FanartTV for %s items"
msgstr ""
# Sync notification displayed when FanartTV lookup is completed
msgctxt "#30019"
msgid "FanartTV lookup completed"
msgstr ""
# PKC settings category # PKC settings category
msgctxt "#30022" msgctxt "#30022"
msgid "Advanced" msgid "Advanced"
@ -417,8 +442,8 @@ msgstr "Modo de Reprodução"
# PKC Settings - Artwork # PKC Settings - Artwork
msgctxt "#30512" msgctxt "#30512"
msgid "Force artwork caching" msgid "Cache all artwork for a smooth Kodi experience"
msgstr "Forçar o armazenamento em cache das ilustrações" msgstr ""
# PKC Settings - Artwork # PKC Settings - Artwork
msgctxt "#30513" msgctxt "#30513"
@ -497,12 +522,8 @@ msgstr "Mensagens do servidor"
# PKC Settings - Advanced # PKC Settings - Advanced
msgctxt "#30535" msgctxt "#30535"
msgid "" msgid "Generate a new unique Plex device Id (e.g. to clone Kodi)"
"[COLOR yellow]Generate a new unique device Id (e.g. when cloning "
"Kodi)[/COLOR]"
msgstr "" msgstr ""
"[COLOR yellow]Criar uma nova identidade única do dispositivo (e.x. ao clonar"
" Kodi)[/COLOR]"
# PKC Settings - Connection # PKC Settings - Connection
msgctxt "#30536" msgctxt "#30536"
@ -516,8 +537,8 @@ msgstr "REINICIE O KODI SE FIZER MUDANÇAS"
# PKC Settings warning # PKC Settings warning
msgctxt "#30538" msgctxt "#30538"
msgid "Complete Re-Sync necessary" msgid "Manual complete reset of Kodi database necessary, see \"Advanced\""
msgstr "Ressincronização Completa necessária" msgstr ""
# PKC Settings - Artwork # PKC Settings - Artwork
msgctxt "#30539" msgctxt "#30539"
@ -631,9 +652,8 @@ msgstr "Tamanho de legendas permanentes"
# PKC Settings - Sync # PKC Settings - Sync
msgctxt "#39003" msgctxt "#39003"
msgid "Limit download sync threads (rec. for rpi: 1)" msgid "Number of simultaneous download threads"
msgstr "" msgstr ""
"Limitar as operaçoes de descarregamento sincronizado (rec. para rpi: 1)"
# PKC Settings - Plex # PKC Settings - Plex
msgctxt "#39004" msgctxt "#39004"
@ -709,15 +729,13 @@ msgstr ""
# PKC Settings - Advanced # PKC Settings - Advanced
msgctxt "#39018" msgctxt "#39018"
msgid "[COLOR yellow]Repair local database (force update all content)[/COLOR]" msgid "Repair the Kodi database (force update all content)"
msgstr "" msgstr ""
"[COLOR yellow]Reparar base de dados local (forçar actualização de todo o "
"conteúdo)[/COLOR]"
# PKC Settings - Advanced # PKC Settings - Advanced
msgctxt "#39019" msgctxt "#39019"
msgid "[COLOR red]Partial or full reset of Database and PKC[/COLOR]" msgid "Reset the Kodi database and optionally reset PlexKodiConnect"
msgstr "[COLOR red]Reposiçao partial ou total da base de dados e PKC[/COLOR]" msgstr ""
# PKC Settings - Artwork # PKC Settings - Artwork
msgctxt "#39020" msgctxt "#39020"

View file

@ -53,23 +53,35 @@ msgstr "Имя пользователя: "
# Sync notification displayed if there is still artwork to be cached to Kodi # Sync notification displayed if there is still artwork to be cached to Kodi
msgctxt "#30006" msgctxt "#30006"
msgid "Caching %s images" msgid "Caching %s Plex images"
msgstr "" msgstr "Кэширование %s изображений Plex"
# Sync notification displayed if syncing of major artwork is done # Sync notification displayed if syncing of major artwork is done
msgctxt "#30007" msgctxt "#30007"
msgid "Major image caching done" msgid "Plex image caching done"
msgstr "" msgstr "Кэширование изображений Plex завершено"
# PKC settings artwork: Enable notifications for artwork image sync # PKC settings artwork: Enable notifications for artwork image sync
msgctxt "#30008" msgctxt "#30008"
msgid "Enable notifications for image caching" msgid "Enable notifications for image caching"
msgstr "" msgstr "Включить уведомления для кэширования изображений"
# PKC settings artwork: Enable image caching during Kodi playback # PKC settings artwork: Enable image caching during Kodi playback
msgctxt "#30009" msgctxt "#30009"
msgid "Enable image caching during Kodi playback (restart Kodi!)" msgid "Enable image caching during Kodi playback (restart Kodi!)"
msgstr "" msgstr ""
"Включить кэширование изображений во время воспроизведения Kodi "
"(перезапустите Kodi!)"
# PKC settings - Artwork
msgctxt "#30010"
msgid "Approximate progress"
msgstr "Приблизительный прогресс"
# PKC settings - Artwork
msgctxt "#30011"
msgid "Artwork left to cache:"
msgstr ""
# Button text # Button text
msgctxt "#30012" msgctxt "#30012"
@ -85,6 +97,11 @@ msgctxt "#30014"
msgid "Connection" msgid "Connection"
msgstr "Подключение" msgstr "Подключение"
# PKC settings - Artwork
msgctxt "#30015"
msgid "Movie and show FanartTV lookups left to do:"
msgstr "Осталось просмотреть FanartTV для фильмов и сериалов:"
msgctxt "#30016" msgctxt "#30016"
msgid "Device Name" msgid "Device Name"
msgstr "Имя устройства" msgstr "Имя устройства"
@ -94,6 +111,16 @@ msgctxt "#30017"
msgid "Unauthorized for PMS" msgid "Unauthorized for PMS"
msgstr "Не авторизован на сервере Plex" msgstr "Не авторизован на сервере Plex"
# Sync notification displayed for the number of fanart.tv lookups left
msgctxt "#30018"
msgid "Checking FanartTV for %s items"
msgstr "FanartTV осталось проверить %s"
# Sync notification displayed when FanartTV lookup is completed
msgctxt "#30019"
msgid "FanartTV lookup completed"
msgstr "Поиск FanartTV завершен"
# PKC settings category # PKC settings category
msgctxt "#30022" msgctxt "#30022"
msgid "Advanced" msgid "Advanced"
@ -419,8 +446,8 @@ msgstr "Режим воспроизведения"
# PKC Settings - Artwork # PKC Settings - Artwork
msgctxt "#30512" msgctxt "#30512"
msgid "Force artwork caching" msgid "Cache all artwork for a smooth Kodi experience"
msgstr "Принудительное кеширование иллюстраций" msgstr "Кэш всех изображений для плавной работы Kodi"
# PKC Settings - Artwork # PKC Settings - Artwork
msgctxt "#30513" msgctxt "#30513"
@ -501,12 +528,9 @@ msgstr "Сообщения сервера"
# PKC Settings - Advanced # PKC Settings - Advanced
msgctxt "#30535" msgctxt "#30535"
msgid "" msgid "Generate a new unique Plex device Id (e.g. to clone Kodi)"
"[COLOR yellow]Generate a new unique device Id (e.g. when cloning "
"Kodi)[/COLOR]"
msgstr "" msgstr ""
"[COLOR yellow]Сгенерировать новый ID (например если вы скопировали Kodi на " "Генерировать новый ID устройства Plex (например, при клонировании Kodi)"
"новое устройство)[/COLOR]"
# PKC Settings - Connection # PKC Settings - Connection
msgctxt "#30536" msgctxt "#30536"
@ -520,8 +544,9 @@ msgstr "ПЕРЕЗАПУСТИТЕ KODI, ЕСЛИ ВНОСИЛИ КАКИЕ-ТО
# PKC Settings warning # PKC Settings warning
msgctxt "#30538" msgctxt "#30538"
msgid "Complete Re-Sync necessary" msgid "Manual complete reset of Kodi database necessary, see \"Advanced\""
msgstr "Необходима полная пересинхронизация" msgstr ""
"Необходим ручной полный сброс базы данных Kodi, см. Раздел \"Дополнительно\""
# PKC Settings - Artwork # PKC Settings - Artwork
msgctxt "#30539" msgctxt "#30539"
@ -632,8 +657,8 @@ msgstr "Размер субтитров внедряемых в видео"
# PKC Settings - Sync # PKC Settings - Sync
msgctxt "#39003" msgctxt "#39003"
msgid "Limit download sync threads (rec. for rpi: 1)" msgid "Number of simultaneous download threads"
msgstr "Количество потоков синхронизации(для RPi:1)" msgstr "Количество одновременных тем для загрузки"
# PKC Settings - Plex # PKC Settings - Plex
msgctxt "#39004" msgctxt "#39004"
@ -706,15 +731,15 @@ msgstr ""
# PKC Settings - Advanced # PKC Settings - Advanced
msgctxt "#39018" msgctxt "#39018"
msgid "[COLOR yellow]Repair local database (force update all content)[/COLOR]" msgid "Repair the Kodi database (force update all content)"
msgstr "" msgstr ""
"[COLOR yellow]Исправить базу данных (принудительно обновить весь " "Восстановление базы данных Kodi (принудительное обновление всего "
"контент)[/COLOR]" "содержимого)"
# PKC Settings - Advanced # PKC Settings - Advanced
msgctxt "#39019" msgctxt "#39019"
msgid "[COLOR red]Partial or full reset of Database and PKC[/COLOR]" msgid "Reset the Kodi database and optionally reset PlexKodiConnect"
msgstr "[COLOR red]Частичный или полный сброс базы данных и PKC[/COLOR]" msgstr "Сброс базы данных Kodi и возможная перезагрузка PlexKodiConnect"
# PKC Settings - Artwork # PKC Settings - Artwork
msgctxt "#39020" msgctxt "#39020"

View file

@ -48,12 +48,12 @@ msgstr "用户名 "
# Sync notification displayed if there is still artwork to be cached to Kodi # Sync notification displayed if there is still artwork to be cached to Kodi
msgctxt "#30006" msgctxt "#30006"
msgid "Caching %s images" msgid "Caching %s Plex images"
msgstr "" msgstr ""
# Sync notification displayed if syncing of major artwork is done # Sync notification displayed if syncing of major artwork is done
msgctxt "#30007" msgctxt "#30007"
msgid "Major image caching done" msgid "Plex image caching done"
msgstr "" msgstr ""
# PKC settings artwork: Enable notifications for artwork image sync # PKC settings artwork: Enable notifications for artwork image sync
@ -66,6 +66,16 @@ msgctxt "#30009"
msgid "Enable image caching during Kodi playback (restart Kodi!)" msgid "Enable image caching during Kodi playback (restart Kodi!)"
msgstr "" msgstr ""
# PKC settings - Artwork
msgctxt "#30010"
msgid "Approximate progress"
msgstr ""
# PKC settings - Artwork
msgctxt "#30011"
msgid "Artwork left to cache:"
msgstr ""
# Button text # Button text
msgctxt "#30012" msgctxt "#30012"
msgid "OK" msgid "OK"
@ -80,6 +90,11 @@ msgctxt "#30014"
msgid "Connection" msgid "Connection"
msgstr "连接" msgstr "连接"
# PKC settings - Artwork
msgctxt "#30015"
msgid "Movie and show FanartTV lookups left to do:"
msgstr ""
msgctxt "#30016" msgctxt "#30016"
msgid "Device Name" msgid "Device Name"
msgstr "设备名" msgstr "设备名"
@ -89,6 +104,16 @@ msgctxt "#30017"
msgid "Unauthorized for PMS" msgid "Unauthorized for PMS"
msgstr "Plex媒体服务器未授权" msgstr "Plex媒体服务器未授权"
# Sync notification displayed for the number of fanart.tv lookups left
msgctxt "#30018"
msgid "Checking FanartTV for %s items"
msgstr ""
# Sync notification displayed when FanartTV lookup is completed
msgctxt "#30019"
msgid "FanartTV lookup completed"
msgstr ""
# PKC settings category # PKC settings category
msgctxt "#30022" msgctxt "#30022"
msgid "Advanced" msgid "Advanced"
@ -414,8 +439,8 @@ msgstr "播放模式"
# PKC Settings - Artwork # PKC Settings - Artwork
msgctxt "#30512" msgctxt "#30512"
msgid "Force artwork caching" msgid "Cache all artwork for a smooth Kodi experience"
msgstr "强制缓存插图" msgstr ""
# PKC Settings - Artwork # PKC Settings - Artwork
msgctxt "#30513" msgctxt "#30513"
@ -494,10 +519,8 @@ msgstr "服务器消息"
# PKC Settings - Advanced # PKC Settings - Advanced
msgctxt "#30535" msgctxt "#30535"
msgid "" msgid "Generate a new unique Plex device Id (e.g. to clone Kodi)"
"[COLOR yellow]Generate a new unique device Id (e.g. when cloning " msgstr ""
"Kodi)[/COLOR]"
msgstr "[黄色]生成新的唯一设备ID(e.g. 当克隆Kodi时)[/COLOR]"
# PKC Settings - Connection # PKC Settings - Connection
msgctxt "#30536" msgctxt "#30536"
@ -511,8 +534,8 @@ msgstr "如有任何更改请重启KODI"
# PKC Settings warning # PKC Settings warning
msgctxt "#30538" msgctxt "#30538"
msgid "Complete Re-Sync necessary" msgid "Manual complete reset of Kodi database necessary, see \"Advanced\""
msgstr "必须完整重新同步" msgstr ""
# PKC Settings - Artwork # PKC Settings - Artwork
msgctxt "#30539" msgctxt "#30539"
@ -622,8 +645,8 @@ msgstr "压制字幕尺寸"
# PKC Settings - Sync # PKC Settings - Sync
msgctxt "#39003" msgctxt "#39003"
msgid "Limit download sync threads (rec. for rpi: 1)" msgid "Number of simultaneous download threads"
msgstr "限制下载同步线程(reg. for rpi: 1)" msgstr ""
# PKC Settings - Plex # PKC Settings - Plex
msgctxt "#39004" msgctxt "#39004"
@ -691,13 +714,13 @@ msgstr "您想现在转入插件设置以调整PKC吗您将需要重启Kodi
# PKC Settings - Advanced # PKC Settings - Advanced
msgctxt "#39018" msgctxt "#39018"
msgid "[COLOR yellow]Repair local database (force update all content)[/COLOR]" msgid "Repair the Kodi database (force update all content)"
msgstr "[黄色]修复本地数据库 (强制更新所有内容)[/COLOR]" msgstr ""
# PKC Settings - Advanced # PKC Settings - Advanced
msgctxt "#39019" msgctxt "#39019"
msgid "[COLOR red]Partial or full reset of Database and PKC[/COLOR]" msgid "Reset the Kodi database and optionally reset PlexKodiConnect"
msgstr "[红色]部分或全部重置数据库和PKC[/COLOR]" msgstr ""
# PKC Settings - Artwork # PKC Settings - Artwork
msgctxt "#39020" msgctxt "#39020"

View file

@ -47,12 +47,12 @@ msgstr "使用者: "
# Sync notification displayed if there is still artwork to be cached to Kodi # Sync notification displayed if there is still artwork to be cached to Kodi
msgctxt "#30006" msgctxt "#30006"
msgid "Caching %s images" msgid "Caching %s Plex images"
msgstr "" msgstr ""
# Sync notification displayed if syncing of major artwork is done # Sync notification displayed if syncing of major artwork is done
msgctxt "#30007" msgctxt "#30007"
msgid "Major image caching done" msgid "Plex image caching done"
msgstr "" msgstr ""
# PKC settings artwork: Enable notifications for artwork image sync # PKC settings artwork: Enable notifications for artwork image sync
@ -65,6 +65,16 @@ msgctxt "#30009"
msgid "Enable image caching during Kodi playback (restart Kodi!)" msgid "Enable image caching during Kodi playback (restart Kodi!)"
msgstr "" msgstr ""
# PKC settings - Artwork
msgctxt "#30010"
msgid "Approximate progress"
msgstr ""
# PKC settings - Artwork
msgctxt "#30011"
msgid "Artwork left to cache:"
msgstr ""
# Button text # Button text
msgctxt "#30012" msgctxt "#30012"
msgid "OK" msgid "OK"
@ -79,6 +89,11 @@ msgctxt "#30014"
msgid "Connection" msgid "Connection"
msgstr "連結" msgstr "連結"
# PKC settings - Artwork
msgctxt "#30015"
msgid "Movie and show FanartTV lookups left to do:"
msgstr ""
msgctxt "#30016" msgctxt "#30016"
msgid "Device Name" msgid "Device Name"
msgstr "裝置名稱" msgstr "裝置名稱"
@ -88,6 +103,16 @@ msgctxt "#30017"
msgid "Unauthorized for PMS" msgid "Unauthorized for PMS"
msgstr "Plex伺服器未被授權" msgstr "Plex伺服器未被授權"
# Sync notification displayed for the number of fanart.tv lookups left
msgctxt "#30018"
msgid "Checking FanartTV for %s items"
msgstr ""
# Sync notification displayed when FanartTV lookup is completed
msgctxt "#30019"
msgid "FanartTV lookup completed"
msgstr ""
# PKC settings category # PKC settings category
msgctxt "#30022" msgctxt "#30022"
msgid "Advanced" msgid "Advanced"
@ -413,8 +438,8 @@ msgstr "播放模式"
# PKC Settings - Artwork # PKC Settings - Artwork
msgctxt "#30512" msgctxt "#30512"
msgid "Force artwork caching" msgid "Cache all artwork for a smooth Kodi experience"
msgstr "強制暫存背景海報" msgstr ""
# PKC Settings - Artwork # PKC Settings - Artwork
msgctxt "#30513" msgctxt "#30513"
@ -493,10 +518,8 @@ msgstr "伺服器訊息:"
# PKC Settings - Advanced # PKC Settings - Advanced
msgctxt "#30535" msgctxt "#30535"
msgid "" msgid "Generate a new unique Plex device Id (e.g. to clone Kodi)"
"[COLOR yellow]Generate a new unique device Id (e.g. when cloning " msgstr ""
"Kodi)[/COLOR]"
msgstr "[COLOR yellow]產生新的唯一的設備辨識碼(例如當複製Kodi時)[/COLOR]"
# PKC Settings - Connection # PKC Settings - Connection
msgctxt "#30536" msgctxt "#30536"
@ -510,8 +533,8 @@ msgstr "如果您進行任何更改請重開Kodi"
# PKC Settings warning # PKC Settings warning
msgctxt "#30538" msgctxt "#30538"
msgid "Complete Re-Sync necessary" msgid "Manual complete reset of Kodi database necessary, see \"Advanced\""
msgstr "必需完全重新同步" msgstr ""
# PKC Settings - Artwork # PKC Settings - Artwork
msgctxt "#30539" msgctxt "#30539"
@ -621,8 +644,8 @@ msgstr "設定字幕大小"
# PKC Settings - Sync # PKC Settings - Sync
msgctxt "#39003" msgctxt "#39003"
msgid "Limit download sync threads (rec. for rpi: 1)" msgid "Number of simultaneous download threads"
msgstr "限制下載同步執行緒 (rpi 的建議︰ 1)" msgstr ""
# PKC Settings - Plex # PKC Settings - Plex
msgctxt "#39004" msgctxt "#39004"
@ -690,13 +713,13 @@ msgstr "你現在想轉到外掛程式的設置進行微調 PKC 嗎?您將需
# PKC Settings - Advanced # PKC Settings - Advanced
msgctxt "#39018" msgctxt "#39018"
msgid "[COLOR yellow]Repair local database (force update all content)[/COLOR]" msgid "Repair the Kodi database (force update all content)"
msgstr "[COLOR yellow]修復本機資料庫 (強制更新所有內容)[/COLOR]" msgstr ""
# PKC Settings - Advanced # PKC Settings - Advanced
msgctxt "#39019" msgctxt "#39019"
msgid "[COLOR red]Partial or full reset of Database and PKC[/COLOR]" msgid "Reset the Kodi database and optionally reset PlexKodiConnect"
msgstr "[COLOR red]部分或全部重置資料庫和PKC[/COLOR]" msgstr ""
# PKC Settings - Artwork # PKC Settings - Artwork
msgctxt "#39020" msgctxt "#39020"

View file

@ -112,14 +112,15 @@ class API(object):
""" """
return self.item.get('ratingKey') return self.item.get('ratingKey')
def path(self, force_first_media=True): def path(self, force_first_media=True, force_addon=False):
""" """
Returns a "fully qualified path": add-on paths or direct paths Returns a "fully qualified path": add-on paths or direct paths
depending on the current settings. Will NOT valide the playurl depending on the current settings. Will NOT valide the playurl
Returns unicode or None if something went wrong. Returns unicode or None if something went wrong.
""" """
filename = self.file_path(force_first_media=force_first_media) filename = self.file_path(force_first_media=force_first_media)
if not state.DIRECT_PATHS or self.plex_type() == v.PLEX_TYPE_CLIP: if (not state.DIRECT_PATHS or force_addon
or self.plex_type() == v.PLEX_TYPE_CLIP):
if filename and '/' in filename: if filename and '/' in filename:
filename = filename.rsplit('/', 1) filename = filename.rsplit('/', 1)
elif filename: elif filename:
@ -129,11 +130,14 @@ class API(object):
except (TypeError, IndexError): except (TypeError, IndexError):
filename = None filename = None
# Set plugin path and media flags using real filename # Set plugin path and media flags using real filename
path = ('plugin://%s/?plex_id=%s&plex_type=%s&mode=play&filename=%s' if self.plex_type() == v.PLEX_TYPE_EPISODE:
% (v.ADDON_TYPE[self.plex_type()], # need to include the plex show id in the path
self.plex_id(), path = ('plugin://plugin.video.plexkodiconnect.tvshows/%s/'
self.plex_type(), % self.grandparent_id())
filename)) else:
path = 'plugin://%s/' % v.ADDON_TYPE[self.plex_type()]
path = ('%s?plex_id=%s&plex_type=%s&mode=play&filename=%s'
% (path, self.plex_id(), self.plex_type(), filename))
else: else:
# Direct paths is set the Kodi way # Direct paths is set the Kodi way
path = self.validate_playurl(filename, path = self.validate_playurl(filename,
@ -500,7 +504,7 @@ class API(object):
resume = float(self.item.attrib['viewOffset']) resume = float(self.item.attrib['viewOffset'])
except (KeyError, ValueError): except (KeyError, ValueError):
resume = 0.0 resume = 0.0
return int(resume * v.PLEX_TO_KODI_TIMEFACTOR) return resume * v.PLEX_TO_KODI_TIMEFACTOR
def runtime(self): def runtime(self):
""" """
@ -529,8 +533,8 @@ class API(object):
resume = float(self.item.attrib['viewOffset']) resume = float(self.item.attrib['viewOffset'])
except (KeyError, ValueError): except (KeyError, ValueError):
resume = 0.0 resume = 0.0
runtime = int(runtime * v.PLEX_TO_KODI_TIMEFACTOR) runtime = runtime * v.PLEX_TO_KODI_TIMEFACTOR
resume = int(resume * v.PLEX_TO_KODI_TIMEFACTOR) resume = resume * v.PLEX_TO_KODI_TIMEFACTOR
return resume, runtime return resume, runtime
def content_rating(self): def content_rating(self):
@ -977,9 +981,9 @@ class API(object):
try: try:
data.get('test') data.get('test')
except AttributeError: except AttributeError:
LOG.error('Could not download data from FanartTV') LOG.warning('Could not download data from FanartTV')
return return
if data.get('results') is None: if not data.get('results'):
LOG.info('No match found on themoviedb for type: %s, title: %s', LOG.info('No match found on themoviedb for type: %s, title: %s',
media_type, title) media_type, title)
return return
@ -987,12 +991,12 @@ class API(object):
year = item.get('year') year = item.get('year')
match_found = None match_found = None
# find year match # find year match
if year is not None: if year:
for entry in data["results"]: for entry in data['results']:
if year in entry.get("first_air_date", ""): if year in entry.get('first_air_date', ''):
match_found = entry match_found = entry
break break
elif year in entry.get("release_date", ""): elif year in entry.get('release_date', ''):
match_found = entry match_found = entry
break break
# find exact match based on title, if we haven't found a year match # find exact match based on title, if we haven't found a year match
@ -1006,9 +1010,9 @@ class API(object):
':', ':',
';' ';'
) )
for entry in data["results"]: for entry in data['results']:
name = entry.get("name", entry.get("title", "")) name = entry.get('name', entry.get('title', ''))
original_name = entry.get("original_name", "") original_name = entry.get('original_name', '')
title_alt = title.lower() title_alt = title.lower()
name_alt = name.lower() name_alt = name.lower()
org_name_alt = original_name.lower() org_name_alt = original_name.lower()
@ -1020,16 +1024,16 @@ class API(object):
# match found for exact title name # match found for exact title name
match_found = entry match_found = entry
break break
elif (name.split(" (")[0] == title or title_alt == name_alt elif (name.split(' (')[0] == title or title_alt == name_alt
or title_alt == org_name_alt): or title_alt == org_name_alt):
# match found with substituting some stuff # match found with substituting some stuff
match_found = entry match_found = entry
break break
# if a match was not found, we accept the closest match from TMDB # if a match was not found, we accept the closest match from TMDB
if match_found is None and data.get("results"): if match_found is None and data.get('results'):
LOG.info('Using very first match from themoviedb') LOG.info('Using very first match from themoviedb')
match_found = entry = data.get("results")[0] match_found = entry = data.get('results')[0]
if match_found is None: if match_found is None:
LOG.info('Still no themoviedb match for type: %s, title: %s, ' LOG.info('Still no themoviedb match for type: %s, title: %s, '
@ -1040,25 +1044,25 @@ class API(object):
LOG.info('Found themoviedb match for %s: %s', LOG.info('Found themoviedb match for %s: %s',
item.get('title'), match_found) item.get('title'), match_found)
tmdb_id = str(entry.get("id", "")) tmdb_id = str(entry.get('id', ''))
if tmdb_id == '': if tmdb_id == '':
LOG.error('No themoviedb ID found, aborting') LOG.error('No themoviedb ID found, aborting')
return return
if media_type == "multi" and entry.get("media_type"): if media_type == 'multi' and entry.get('media_type'):
media_type = entry.get("media_type") media_type = entry.get('media_type')
name = entry.get("name", entry.get("title")) name = entry.get('name', entry.get('title'))
# lookup external tmdb_id and perform artwork lookup on fanart.tv # lookup external tmdb_id and perform artwork lookup on fanart.tv
parameters = {'api_key': api_key} parameters = {'api_key': api_key}
media_id, poster, background = None, None, None if media_type == 'movie':
for language in [v.KODILANGUAGE, "en"]:
parameters['language'] = language
if media_type == "movie":
url = 'https://api.themoviedb.org/3/movie/%s' % tmdb_id url = 'https://api.themoviedb.org/3/movie/%s' % tmdb_id
parameters['append_to_response'] = 'videos' parameters['append_to_response'] = 'videos'
elif media_type == "tv": elif media_type == 'tv':
url = 'https://api.themoviedb.org/3/tv/%s' % tmdb_id url = 'https://api.themoviedb.org/3/tv/%s' % tmdb_id
parameters['append_to_response'] = 'external_ids,videos' parameters['append_to_response'] = 'external_ids,videos'
media_id, poster, background = None, None, None
for language in [v.KODILANGUAGE, 'en']:
parameters['language'] = language
data = DU().downloadUrl(url, data = DU().downloadUrl(url,
authenticate=False, authenticate=False,
parameters=parameters, parameters=parameters,
@ -1066,20 +1070,24 @@ class API(object):
try: try:
data.get('test') data.get('test')
except AttributeError: except AttributeError:
LOG.error('Could not download %s with parameters %s', LOG.warning('Could not download %s with parameters %s',
url, parameters) url, parameters)
continue continue
if collection is False: if collection is False:
if data.get("imdb_id") is not None: if data.get('imdb_id'):
media_id = str(data.get("imdb_id")) media_id = str(data.get('imdb_id'))
break break
if data.get("external_ids") is not None: if (data.get('external_ids') and
media_id = str(data["external_ids"].get("tvdb_id")) data['external_ids'].get('tvdb_id')):
media_id = str(data['external_ids']['tvdb_id'])
break break
else: else:
if data.get("belongs_to_collection") is None: if not data.get('belongs_to_collection'):
continue continue
media_id = str(data.get("belongs_to_collection").get("id")) media_id = data.get('belongs_to_collection').get('id')
if not media_id:
continue
media_id = str(media_id)
LOG.debug('Retrieved collections tmdb id %s for %s', LOG.debug('Retrieved collections tmdb id %s for %s',
media_id, title) media_id, title)
url = 'https://api.themoviedb.org/3/collection/%s' % media_id url = 'https://api.themoviedb.org/3/collection/%s' % media_id
@ -1090,18 +1098,18 @@ class API(object):
try: try:
data.get('poster_path') data.get('poster_path')
except AttributeError: except AttributeError:
LOG.info('Could not find TheMovieDB poster paths for %s in ' LOG.debug('Could not find TheMovieDB poster paths for %s in '
'the language %s', title, language) 'the language %s', title, language)
continue continue
else: if not poster and data.get('poster_path'):
poster = ('https://image.tmdb.org/t/p/original%s' % poster = ('https://image.tmdb.org/t/p/original%s' %
data.get('poster_path')) data.get('poster_path'))
if not background and data.get('backdrop_path'):
background = ('https://image.tmdb.org/t/p/original%s' % background = ('https://image.tmdb.org/t/p/original%s' %
data.get('backdrop_path')) data.get('backdrop_path'))
break
return media_id, poster, background return media_id, poster, background
def lookup_fanart_tv(self, media_id, artworks, set_info=False): def lookup_fanart_tv(self, media_id, artworks):
""" """
perform artwork lookup on fanart.tv perform artwork lookup on fanart.tv
@ -1198,9 +1206,7 @@ class API(object):
artworks['poster'] = poster artworks['poster'] = poster
if background is not None: if background is not None:
artworks['fanart'] = background artworks['fanart'] = background
artworks = self.lookup_fanart_tv(external_id, artworks = self.lookup_fanart_tv(external_id, artworks)
artworks,
set_info=True)
else: else:
LOG.info('Did not find a set/collection ID on TheMovieDB using %s.' LOG.info('Did not find a set/collection ID on TheMovieDB using %s.'
' Artwork will be missing.', self.titles()[0]) ' Artwork will be missing.', self.titles()[0])

View file

@ -195,7 +195,10 @@ class PlexCompanion(Thread):
elif task['action'] == 'refreshPlayQueue': elif task['action'] == 'refreshPlayQueue':
self._process_refresh(data) self._process_refresh(data)
elif task['action'] == 'setStreams': elif task['action'] == 'setStreams':
try:
self._process_streams(data) self._process_streams(data)
except KeyError:
pass
def run(self): def run(self):
""" """

View file

@ -20,6 +20,7 @@ LOG = getLogger("PLEX." + __name__)
CONTAINERSIZE = int(settings('limitindex')) CONTAINERSIZE = int(settings('limitindex'))
REGEX_PLEX_KEY = re_compile(r'''/(.+)/(\d+)$''') REGEX_PLEX_KEY = re_compile(r'''/(.+)/(\d+)$''')
REGEX_PLEX_DIRECT = re_compile(r'''\.plex\.direct:\d+$''')
# For discovery of PMS in the local LAN # For discovery of PMS in the local LAN
PLEX_GDM_IP = '239.0.0.250' # multicast to PMS PLEX_GDM_IP = '239.0.0.250' # multicast to PMS
@ -142,8 +143,6 @@ def check_connection(url, token=None, verifySSL=None):
verifySSL = None if settings('sslverify') == 'true' else False verifySSL = None if settings('sslverify') == 'true' else False
if 'plex.tv' in url: if 'plex.tv' in url:
url = 'https://plex.tv/api/home/users' url = 'https://plex.tv/api/home/users'
else:
url = url + '/library/onDeck'
LOG.debug("Checking connection to server %s with verifySSL=%s", LOG.debug("Checking connection to server %s with verifySSL=%s",
url, verifySSL) url, verifySSL)
answer = DU().downloadUrl(url, answer = DU().downloadUrl(url,
@ -207,43 +206,41 @@ def discover_pms(token=None):
if token: if token:
LOG.info('Checking with plex.tv for more PMS to connect to') LOG.info('Checking with plex.tv for more PMS to connect to')
plex_pms_list = _pms_list_from_plex_tv(token) plex_pms_list = _pms_list_from_plex_tv(token)
LOG.debug('PMS found on plex.tv: %s', plex_pms_list) _log_pms(plex_pms_list)
else: else:
LOG.info('No plex token supplied, only checked LAN for available PMS') LOG.info('No plex token supplied, only checked LAN for available PMS')
plex_pms_list = [] plex_pms_list = []
# See if we found a PMS both locally and using plex.tv. If so, use local # Add PMS found only in the LAN to the Plex.tv PMS list
# connection data
all_pms = []
for pms in local_pms_list: for pms in local_pms_list:
for i, plex_pms in enumerate(plex_pms_list): for plex_pms in plex_pms_list:
if pms['machineIdentifier'] == plex_pms['machineIdentifier']: if pms['machineIdentifier'] == plex_pms['machineIdentifier']:
# Update with GDM data - potentially more reliable than plex.tv
LOG.debug('Found this PMS also in the LAN: %s', plex_pms)
plex_pms['ip'] = pms['ip']
plex_pms['port'] = pms['port']
plex_pms['local'] = True
# Use all the other data we know from plex.tv
pms = plex_pms
# Remove this particular pms since we already know it
plex_pms_list.pop(i)
break break
else:
# Only found PMS using GDM - add it to the PMS from plex.tv
https = _pms_https_enabled('%s:%s' % (pms['ip'], pms['port'])) https = _pms_https_enabled('%s:%s' % (pms['ip'], pms['port']))
if https is None: if https is None:
# Error contacting url. Skip and ignore this PMS for now # Error contacting url. Skip and ignore this PMS for now
LOG.error('Could not contact PMS %s but we should have', pms)
continue continue
elif https is True: elif https is True:
pms['scheme'] = 'https' pms['scheme'] = 'https'
pms['baseURL'] = 'https://%s:%s' % (pms['ip'], pms['port'])
else: else:
pms['scheme'] = 'http' pms['scheme'] = 'http'
pms['baseURL'] = 'http://%s:%s' % (pms['ip'], pms['port']) pms['baseURL'] = '%s://%s:%s' % (pms['scheme'],
all_pms.append(pms) pms['ip'],
# Now add the remaining PMS from plex.tv (where we already checked connect.) pms['port'])
for plex_pms in plex_pms_list: plex_pms_list.append(pms)
all_pms.append(plex_pms) _log_pms(plex_pms_list)
LOG.debug('Found the following PMS in total: %s', all_pms) return plex_pms_list
return all_pms
def _log_pms(pms_list):
log_list = deepcopy(pms_list)
for pms in log_list:
if pms.get('token') is not None:
pms['token'] = '%s...' % pms['token'][:5]
LOG.debug('Found the following PMS: %s', log_list)
def _plex_gdm(): def _plex_gdm():
@ -414,16 +411,23 @@ def _pms_list_from_plex_tv(token):
def _poke_pms(pms, queue): def _poke_pms(pms, queue):
data = pms['connections'][0].attrib data = pms['connections'][0].attrib
if data['local'] == '1':
protocol = data['protocol']
address = data['address']
port = data['port']
url = '%s://%s:%s' % (protocol, address, port)
else:
url = data['uri'] url = data['uri']
if url.count(':') == 1: if data['local'] == '1' and REGEX_PLEX_DIRECT.findall(url):
url = '%s:%s' % (url, data['port']) # In case DNS resolve of plex.direct does not work, append a new
# connection that will directly access the local IP (e.g. internet down)
conn = deepcopy(pms['connections'][0])
# Overwrite plex.direct
conn.attrib['uri'] = '%s://%s:%s' % (data['protocol'],
data['address'],
data['port'])
pms['connections'].insert(1, conn)
try:
protocol, address, port = url.split(':', 2) protocol, address, port = url.split(':', 2)
except ValueError:
# e.g. .ork.plex.services uri, thanks Plex
protocol, address = url.split(':', 1)
port = data['port']
url = '%s:%s' % (url, port)
address = address.replace('/', '') address = address.replace('/', '')
xml = DU().downloadUrl('%s/identity' % url, xml = DU().downloadUrl('%s/identity' % url,
authenticate=False, authenticate=False,

View file

@ -9,7 +9,7 @@ from threading import Thread
from os import makedirs from os import makedirs
import requests import requests
from xbmc import sleep, translatePath import xbmc
from xbmcvfs import exists from xbmcvfs import exists
from utils import settings, language as lang, kodi_sql, try_encode, try_decode,\ from utils import settings, language as lang, kodi_sql, try_encode, try_decode,\
@ -39,7 +39,7 @@ def double_urldecode(text):
@thread_methods(add_suspends=IMAGE_CACHING_SUSPENDS) @thread_methods(add_suspends=IMAGE_CACHING_SUSPENDS)
class Image_Cache_Thread(Thread): class Image_Cache_Thread(Thread):
sleep_between = 200 sleep_between = 50
# Potentially issues with limited number of threads # Potentially issues with limited number of threads
# Hence let Kodi wait till download is successful # Hence let Kodi wait till download is successful
timeout = (35.1, 35.1) timeout = (35.1, 35.1)
@ -54,6 +54,8 @@ class Image_Cache_Thread(Thread):
suspended = self.suspended suspended = self.suspended
queue = self.queue queue = self.queue
sleep_between = self.sleep_between sleep_between = self.sleep_between
counter = 0
set_zero = False
while not stopped(): while not stopped():
# In the event the server goes offline # In the event the server goes offline
while suspended(): while suspended():
@ -62,12 +64,19 @@ class Image_Cache_Thread(Thread):
# Abort was requested while waiting. We should exit # Abort was requested while waiting. We should exit
LOG.info("---===### Stopped Image_Cache_Thread ###===---") LOG.info("---===### Stopped Image_Cache_Thread ###===---")
return return
sleep(1000) xbmc.sleep(1000)
try: try:
url = queue.get(block=False) url = queue.get(block=False)
except Empty: except Empty:
sleep(1000) if not set_zero and not xbmc.getCondVisibility(
'Window.IsVisible(DialogAddonSettings.xml)'):
# Avoid saving '0' all the time
set_zero = True
settings('caching_artwork_count', value='0')
xbmc.sleep(1000)
continue continue
set_zero = False
if isinstance(url, ArtworkSyncMessage): if isinstance(url, ArtworkSyncMessage):
if state.IMAGE_SYNC_NOTIFICATIONS: if state.IMAGE_SYNC_NOTIFICATIONS:
dialog('notification', dialog('notification',
@ -107,20 +116,26 @@ class Image_Cache_Thread(Thread):
'over-loaded. Sleep %s seconds before trying ' 'over-loaded. Sleep %s seconds before trying '
'again to download %s', 'again to download %s',
2**sleeptime, double_urldecode(url)) 2**sleeptime, double_urldecode(url))
sleep((2**sleeptime) * 1000) xbmc.sleep((2**sleeptime) * 1000)
sleeptime += 1 sleeptime += 1
continue continue
except Exception as e: except Exception as err:
LOG.error('Unknown exception for url %s: %s'. LOG.error('Unknown exception for url %s: %s'.
double_urldecode(url), e) double_urldecode(url), err)
import traceback import traceback
LOG.error("Traceback:\n%s", traceback.format_exc()) LOG.error("Traceback:\n%s", traceback.format_exc())
break break
# We did not even get a timeout # We did not even get a timeout
break break
queue.task_done() queue.task_done()
# Update the caching state in the PKC settings.
counter += 1
if (counter > 20 and not xbmc.getCondVisibility(
'Window.IsVisible(DialogAddonSettings.xml)')):
counter = 0
settings('caching_artwork_count', value=str(queue.qsize()))
# Sleep for a bit to reduce CPU strain # Sleep for a bit to reduce CPU strain
sleep(sleep_between) xbmc.sleep(sleep_between)
LOG.info("---===### Stopped Image_Cache_Thread ###===---") LOG.info("---===### Stopped Image_Cache_Thread ###===---")
@ -159,14 +174,18 @@ class Artwork():
connection.close() connection.close()
if not artworks_to_cache: if not artworks_to_cache:
LOG.info('Caching of major images to Kodi texture cache done') LOG.info('Caching of major images to Kodi texture cache done')
# Set to "None"
settings('caching_artwork_count', value=lang(30069))
return return
length = len(artworks_to_cache)
LOG.info('Caching has not been completed - caching %s major images', LOG.info('Caching has not been completed - caching %s major images',
len(artworks_to_cache)) length)
# Caching %s images settings('caching_artwork_count', value=str(length))
self.queue.put(ArtworkSyncMessage(lang(30006) % len(artworks_to_cache))) # Caching %s Plex images
for url in artworks_to_cache: self.queue.put(ArtworkSyncMessage(lang(30006) % length))
for i, url in enumerate(artworks_to_cache):
self.queue.put(url[0]) self.queue.put(url[0])
# Major image caching done # Plex image caching done
self.queue.put(ArtworkSyncMessage(lang(30007))) self.queue.put(ArtworkSyncMessage(lang(30007)))
def fullTextureCacheSync(self): def fullTextureCacheSync(self):
@ -183,7 +202,7 @@ class Artwork():
if dialog('yesno', "Image Texture Cache", lang(39251)): if dialog('yesno', "Image Texture Cache", lang(39251)):
LOG.info("Resetting all cache data first") LOG.info("Resetting all cache data first")
# Remove all existing textures first # Remove all existing textures first
path = try_decode(translatePath("special://thumbnails/")) path = try_decode(xbmc.translatePath("special://thumbnails/"))
if exists_dir(path): if exists_dir(path):
rmtree(path, ignore_errors=True) rmtree(path, ignore_errors=True)
self.restore_cache_directories() self.restore_cache_directories()
@ -301,7 +320,7 @@ class Artwork():
pass pass
else: else:
# Delete thumbnail as well as the entry # Delete thumbnail as well as the entry
path = translatePath("special://thumbnails/%s" % cachedurl) path = xbmc.translatePath("special://thumbnails/%s" % cachedurl)
LOG.debug("Deleting cached thumbnail: %s", path) LOG.debug("Deleting cached thumbnail: %s", path)
if exists(path): if exists(path):
rmtree(try_decode(path), ignore_errors=True) rmtree(try_decode(path), ignore_errors=True)
@ -317,7 +336,7 @@ class Artwork():
"a", "b", "c", "d", "e", "f", "a", "b", "c", "d", "e", "f",
"Video", "plex") "Video", "plex")
for path in paths: for path in paths:
makedirs(try_decode(translatePath("special://thumbnails/%s" makedirs(try_decode(xbmc.translatePath("special://thumbnails/%s"
% path))) % path)))

View file

@ -6,10 +6,10 @@ from xbmcaddon import Addon
import xbmc import xbmc
import xbmcplugin import xbmcplugin
import xbmcgui import xbmcgui
import context
import plexdb_functions as plexdb import plexdb_functions as plexdb
from utils import window, settings, dialog, language as lang from utils import window, settings, dialog, language as lang
from dialogs import context
import PlexFunctions as PF import PlexFunctions as PF
from PlexAPI import API from PlexAPI import API
import playqueue as PQ import playqueue as PQ
@ -96,18 +96,7 @@ class ContextMenu(object):
options.append(OPTIONS['PMS_Play']) options.append(OPTIONS['PMS_Play'])
if self.kodi_type in v.KODI_VIDEOTYPES: if self.kodi_type in v.KODI_VIDEOTYPES:
options.append(OPTIONS['Transcode']) options.append(OPTIONS['Transcode'])
# userdata = self.api.userdata()
# if userdata['Favorite']:
# # Remove from emby favourites
# options.append(OPTIONS['RemoveFav'])
# else:
# # Add to emby favourites
# options.append(OPTIONS['AddFav'])
# if self.kodi_type == "song":
# # Set custom song rating
# options.append(OPTIONS['RateSong'])
# Refresh item
# options.append(OPTIONS['Refresh'])
# Delete item, only if the Plex Home main user is logged in # Delete item, only if the Plex Home main user is logged in
if (window('plex_restricteduser') != 'true' and if (window('plex_restricteduser') != 'true' and
window('plex_allows_mediaDeletion') == 'true'): window('plex_allows_mediaDeletion') == 'true'):
@ -115,7 +104,7 @@ class ContextMenu(object):
# Addon settings # Addon settings
options.append(OPTIONS['Addon']) options.append(OPTIONS['Addon'])
context_menu = context.ContextMenu( context_menu = context.ContextMenu(
"script-emby-context.xml", "script-plex-context.xml",
Addon('plugin.video.plexkodiconnect').getAddonInfo('path'), Addon('plugin.video.plexkodiconnect').getAddonInfo('path'),
"default", "default",
"1080i") "1080i")
@ -137,14 +126,7 @@ class ContextMenu(object):
self._PMS_play() self._PMS_play()
elif selected == OPTIONS['Extras']: elif selected == OPTIONS['Extras']:
self._extras() self._extras()
# elif selected == OPTIONS['Refresh']:
# self.emby.refreshItem(self.item_id)
# elif selected == OPTIONS['AddFav']:
# self.emby.updateUserRating(self.item_id, favourite=True)
# elif selected == OPTIONS['RemoveFav']:
# self.emby.updateUserRating(self.item_id, favourite=False)
# elif selected == OPTIONS['RateSong']:
# self._rate_song()
elif selected == OPTIONS['Addon']: elif selected == OPTIONS['Addon']:
xbmc.executebuiltin( xbmc.executebuiltin(
'Addon.OpenSettings(plugin.video.plexkodiconnect)') 'Addon.OpenSettings(plugin.video.plexkodiconnect)')
@ -173,10 +155,7 @@ class ContextMenu(object):
v.KODI_PLAYLIST_TYPE_FROM_KODI_TYPE[self.kodi_type]) v.KODI_PLAYLIST_TYPE_FROM_KODI_TYPE[self.kodi_type])
playqueue.clear() playqueue.clear()
state.CONTEXT_MENU_PLAY = True state.CONTEXT_MENU_PLAY = True
handle = ('plugin://%s/?plex_id=%s&plex_type=%s&mode=play' handle = self.api.path(force_first_media=False, force_addon=True)
% (v.ADDON_TYPE[self.plex_type],
self.plex_id,
self.plex_type))
xbmc.executebuiltin('RunPlugin(%s)' % handle) xbmc.executebuiltin('RunPlugin(%s)' % handle)
def _extras(self): def _extras(self):

View file

@ -1,6 +0,0 @@
# Dummy file to make this directory a package.
# from serverconnect import ServerConnect
# from usersconnect import UsersConnect
# from loginconnect import LoginConnect
# from loginmanual import LoginManual
# from servermanual import ServerManual

View file

@ -1,136 +0,0 @@
# -*- coding: utf-8 -*-
##################################################################################################
import logging
import os
import xbmcgui
import xbmcaddon
from utils import language as lang
##################################################################################################
log = logging.getLogger("EMBY."+__name__)
addon = xbmcaddon.Addon('plugin.video.emby')
ACTION_PARENT_DIR = 9
ACTION_PREVIOUS_MENU = 10
ACTION_BACK = 92
SIGN_IN = 200
CANCEL = 201
ERROR_TOGGLE = 202
ERROR_MSG = 203
ERROR = {
'Invalid': 1,
'Empty': 2
}
##################################################################################################
class LoginConnect(xbmcgui.WindowXMLDialog):
_user = None
error = None
def __init__(self, *args, **kwargs):
xbmcgui.WindowXMLDialog.__init__(self, *args, **kwargs)
def set_connect_manager(self, connect_manager):
self.connect_manager = connect_manager
def is_logged_in(self):
return True if self._user else False
def get_user(self):
return self._user
def onInit(self):
self.user_field = self._add_editcontrol(725, 385, 40, 500)
self.setFocus(self.user_field)
self.password_field = self._add_editcontrol(725, 470, 40, 500, password=1)
self.signin_button = self.getControl(SIGN_IN)
self.remind_button = self.getControl(CANCEL)
self.error_toggle = self.getControl(ERROR_TOGGLE)
self.error_msg = self.getControl(ERROR_MSG)
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._disable_error()
user = self.user_field.getText()
password = self.password_field.getText()
if not user or not password:
# Display error
self._error(ERROR['Empty'], lang(30608))
log.error("Username or password cannot be null")
elif self._login(user, password):
self.close()
elif control == CANCEL:
# Remind me later
self.close()
def onAction(self, action):
if (self.error == ERROR['Empty']
and self.user_field.getText() and self.password_field.getText()):
self._disable_error()
if action in (ACTION_BACK, ACTION_PARENT_DIR, ACTION_PREVIOUS_MENU):
self.close()
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="ff525252",
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 _login(self, username, password):
result = self.connect_manager.loginToConnect(username, password)
if result is False:
self._error(ERROR['Invalid'], lang(33009))
return False
else:
self._user = result
return True
def _error(self, state, message):
self.error = state
self.error_msg.setLabel(message)
self.error_toggle.setVisibleCondition('True')
def _disable_error(self):
self.error = None
self.error_toggle.setVisibleCondition('False')

View file

@ -1,145 +0,0 @@
# -*- coding: utf-8 -*-
##################################################################################################
import logging
import os
import xbmcgui
import xbmcaddon
import read_embyserver as embyserver
from utils import language as lang
##################################################################################################
log = logging.getLogger("EMBY."+__name__)
addon = xbmcaddon.Addon('plugin.video.emby')
ACTION_PARENT_DIR = 9
ACTION_PREVIOUS_MENU = 10
ACTION_BACK = 92
SIGN_IN = 200
CANCEL = 201
ERROR_TOGGLE = 202
ERROR_MSG = 203
ERROR = {
'Invalid': 1,
'Empty': 2
}
##################################################################################################
class LoginManual(xbmcgui.WindowXMLDialog):
_user = None
error = None
username = None
def __init__(self, *args, **kwargs):
self.emby = embyserver.Read_EmbyServer()
xbmcgui.WindowXMLDialog.__init__(self, *args, **kwargs)
def is_logged_in(self):
return True if self._user else False
def set_server(self, server):
self.server = server
def set_user(self, user):
self.username = user or {}
def get_user(self):
return self._user
def onInit(self):
self.signin_button = self.getControl(SIGN_IN)
self.cancel_button = self.getControl(CANCEL)
self.error_toggle = self.getControl(ERROR_TOGGLE)
self.error_msg = self.getControl(ERROR_MSG)
self.user_field = self._add_editcontrol(725, 400, 40, 500)
self.password_field = self._add_editcontrol(725, 475, 40, 500, password=1)
if self.username:
self.user_field.setText(self.username)
self.setFocus(self.password_field)
else:
self.setFocus(self.user_field)
self.user_field.controlUp(self.cancel_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.cancel_button.controlDown(self.user_field)
def onClick(self, control):
if control == SIGN_IN:
# Sign in to emby connect
self._disable_error()
user = self.user_field.getText()
password = self.password_field.getText()
if not user:
# Display error
self._error(ERROR['Empty'], lang(30613))
log.error("Username cannot be null")
elif self._login(user, password):
self.close()
elif control == CANCEL:
# Remind me later
self.close()
def onAction(self, action):
if self.error == ERROR['Empty'] and self.user_field.getText():
self._disable_error()
if action in (ACTION_BACK, ACTION_PARENT_DIR, ACTION_PREVIOUS_MENU):
self.close()
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="ff525252",
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 _login(self, username, password):
result = self.emby.loginUser(self.server, username, password)
if not result:
self._error(ERROR['Invalid'], lang(33009))
return False
else:
self._user = result
return True
def _error(self, state, message):
self.error = state
self.error_msg.setLabel(message)
self.error_toggle.setVisibleCondition('True')
def _disable_error(self):
self.error = None
self.error_toggle.setVisibleCondition('False')

View file

@ -1,145 +0,0 @@
# -*- coding: utf-8 -*-
##################################################################################################
import logging
import xbmc
import xbmcgui
import connect.connectionmanager as connectionmanager
from utils import language as lang
##################################################################################################
log = logging.getLogger("EMBY."+__name__)
CONN_STATE = connectionmanager.ConnectionState
ACTION_PARENT_DIR = 9
ACTION_PREVIOUS_MENU = 10
ACTION_BACK = 92
ACTION_SELECT_ITEM = 7
ACTION_MOUSE_LEFT_CLICK = 100
USER_IMAGE = 150
USER_NAME = 151
LIST = 155
CANCEL = 201
MESSAGE_BOX = 202
MESSAGE = 203
BUSY = 204
EMBY_CONNECT = 205
MANUAL_SERVER = 206
##################################################################################################
class ServerConnect(xbmcgui.WindowXMLDialog):
username = ""
user_image = None
servers = []
_selected_server = None
_connect_login = False
_manual_server = False
def __init__(self, *args, **kwargs):
xbmcgui.WindowXMLDialog.__init__(self, *args, **kwargs)
def set_args(self, **kwargs):
# connect_manager, username, user_image, servers, emby_connect
for key, value in kwargs.iteritems():
setattr(self, key, value)
def is_server_selected(self):
return True if self._selected_server else False
def get_server(self):
return self._selected_server
def is_connect_login(self):
return self._connect_login
def is_manual_server(self):
return self._manual_server
def onInit(self):
self.message = self.getControl(MESSAGE)
self.message_box = self.getControl(MESSAGE_BOX)
self.busy = self.getControl(BUSY)
self.list_ = self.getControl(LIST)
for server in self.servers:
server_type = "wifi" if server.get('ExchangeToken') else "network"
self.list_.addItem(self._add_listitem(server['Name'], server['Id'], server_type))
self.getControl(USER_NAME).setLabel("%s %s" % (lang(33000), self.username.decode('utf-8')))
if self.user_image is not None:
self.getControl(USER_IMAGE).setImage(self.user_image)
if not self.emby_connect: # Change connect user
self.getControl(EMBY_CONNECT).setLabel("[UPPERCASE][B]"+lang(30618)+"[/B][/UPPERCASE]")
if self.servers:
self.setFocus(self.list_)
@classmethod
def _add_listitem(cls, label, server_id, server_type):
item = xbmcgui.ListItem(label)
item.setProperty('id', server_id)
item.setProperty('server_type', server_type)
return item
def onAction(self, action):
if action in (ACTION_BACK, ACTION_PREVIOUS_MENU, ACTION_PARENT_DIR):
self.close()
if action in (ACTION_SELECT_ITEM, ACTION_MOUSE_LEFT_CLICK):
if self.getFocusId() == LIST:
server = self.list_.getSelectedItem()
selected_id = server.getProperty('id')
log.info('Server Id selected: %s', selected_id)
if self._connect_server(selected_id):
self.message_box.setVisibleCondition('False')
self.close()
def onClick(self, control):
if control == EMBY_CONNECT:
self.connect_manager.clearData()
self._connect_login = True
self.close()
elif control == MANUAL_SERVER:
self._manual_server = True
self.close()
elif control == CANCEL:
self.close()
def _connect_server(self, server_id):
server = self.connect_manager.getServerInfo(server_id)
self.message.setLabel("%s %s..." % (lang(30610), server['Name']))
self.message_box.setVisibleCondition('True')
self.busy.setVisibleCondition('True')
result = self.connect_manager.connectToServer(server)
if result['State'] == CONN_STATE['Unavailable']:
self.busy.setVisibleCondition('False')
self.message.setLabel(lang(30609))
return False
else:
xbmc.sleep(1000)
self._selected_server = result['Servers'][0]
return True

View file

@ -1,145 +0,0 @@
# -*- coding: utf-8 -*-
##################################################################################################
import logging
import os
import xbmcgui
import xbmcaddon
import connect.connectionmanager as connectionmanager
from utils import language as lang
##################################################################################################
log = logging.getLogger("EMBY."+__name__)
addon = xbmcaddon.Addon('plugin.video.emby')
CONN_STATE = connectionmanager.ConnectionState
ACTION_PARENT_DIR = 9
ACTION_PREVIOUS_MENU = 10
ACTION_BACK = 92
CONNECT = 200
CANCEL = 201
ERROR_TOGGLE = 202
ERROR_MSG = 203
ERROR = {
'Invalid': 1,
'Empty': 2
}
##################################################################################################
class ServerManual(xbmcgui.WindowXMLDialog):
_server = None
error = None
def __init__(self, *args, **kwargs):
xbmcgui.WindowXMLDialog.__init__(self, *args, **kwargs)
def set_connect_manager(self, connect_manager):
self.connect_manager = connect_manager
def is_connected(self):
return True if self._server else False
def get_server(self):
return self._server
def onInit(self):
self.connect_button = self.getControl(CONNECT)
self.cancel_button = self.getControl(CANCEL)
self.error_toggle = self.getControl(ERROR_TOGGLE)
self.error_msg = self.getControl(ERROR_MSG)
self.host_field = self._add_editcontrol(725, 400, 40, 500)
self.port_field = self._add_editcontrol(725, 525, 40, 500)
self.port_field.setText('8096')
self.setFocus(self.host_field)
self.host_field.controlUp(self.cancel_button)
self.host_field.controlDown(self.port_field)
self.port_field.controlUp(self.host_field)
self.port_field.controlDown(self.connect_button)
self.connect_button.controlUp(self.port_field)
self.cancel_button.controlDown(self.host_field)
def onClick(self, control):
if control == CONNECT:
# Sign in to emby connect
self._disable_error()
server = self.host_field.getText()
port = self.port_field.getText()
if not server or not port:
# Display error
self._error(ERROR['Empty'], lang(30617))
log.error("Server or port cannot be null")
elif self._connect_to_server(server, port):
self.close()
elif control == CANCEL:
# Remind me later
self.close()
def onAction(self, action):
if self.error == ERROR['Empty'] and self.host_field.getText() and self.port_field.getText():
self._disable_error()
if action in (ACTION_BACK, ACTION_PARENT_DIR, ACTION_PREVIOUS_MENU):
self.close()
def _add_editcontrol(self, x, y, height, width):
media = os.path.join(addon.getAddonInfo('path'), 'resources', 'skins', 'default', 'media')
control = xbmcgui.ControlEdit(0, 0, 0, 0,
label="User",
font="font10",
textColor="ffc2c2c2",
focusTexture=os.path.join(media, "button-focus.png"),
noFocusTexture=os.path.join(media, "button-focus.png"))
control.setPosition(x, y)
control.setHeight(height)
control.setWidth(width)
self.addControl(control)
return control
def _connect_to_server(self, server, port):
server_address = "%s:%s" % (server, port)
self._message("%s %s..." % (lang(30610), server_address))
result = self.connect_manager.connectToAddress(server_address)
if result['State'] == CONN_STATE['Unavailable']:
self._message(lang(30609))
return False
else:
self._server = result['Servers'][0]
return True
def _message(self, message):
self.error_msg.setLabel(message)
self.error_toggle.setVisibleCondition('True')
def _error(self, state, message):
self.error = state
self.error_msg.setLabel(message)
self.error_toggle.setVisibleCondition('True')
def _disable_error(self):
self.error = None
self.error_toggle.setVisibleCondition('False')

View file

@ -1,104 +0,0 @@
# -*- coding: utf-8 -*-
##################################################################################################
import logging
import xbmc
import xbmcgui
##################################################################################################
log = logging.getLogger("EMBY."+__name__)
ACTION_PARENT_DIR = 9
ACTION_PREVIOUS_MENU = 10
ACTION_BACK = 92
ACTION_SELECT_ITEM = 7
ACTION_MOUSE_LEFT_CLICK = 100
LIST = 155
MANUAL = 200
CANCEL = 201
##################################################################################################
class UsersConnect(xbmcgui.WindowXMLDialog):
_user = None
_manual_login = False
def __init__(self, *args, **kwargs):
self.kodi_version = int(xbmc.getInfoLabel('System.BuildVersion')[:2])
xbmcgui.WindowXMLDialog.__init__(self, *args, **kwargs)
def set_server(self, server):
self.server = server
def set_users(self, users):
self.users = users
def is_user_selected(self):
return True if self._user else False
def get_user(self):
return self._user
def is_manual_login(self):
return self._manual_login
def onInit(self):
self.list_ = self.getControl(LIST)
for user in self.users:
user_image = ("userflyoutdefault2.png" if 'PrimaryImageTag' not in user
else self._get_user_artwork(user['Id'], 'Primary'))
self.list_.addItem(self._add_listitem(user['Name'], user['Id'], user_image))
self.setFocus(self.list_)
def _add_listitem(self, label, user_id, user_image):
item = xbmcgui.ListItem(label)
item.setProperty('id', user_id)
if self.kodi_version > 15:
item.setArt({'Icon': user_image})
else:
item.setArt({'icon': user_image})
return item
def onAction(self, action):
if action in (ACTION_BACK, ACTION_PREVIOUS_MENU, ACTION_PARENT_DIR):
self.close()
if action in (ACTION_SELECT_ITEM, ACTION_MOUSE_LEFT_CLICK):
if self.getFocusId() == LIST:
user = self.list_.getSelectedItem()
selected_id = user.getProperty('id')
log.info('User Id selected: %s', selected_id)
for user in self.users:
if user['Id'] == selected_id:
self._user = user
break
self.close()
def onClick(self, control):
if control == MANUAL:
self._manual_login = True
self.close()
elif control == CANCEL:
self.close()
def _get_user_artwork(self, user_id, item_type):
# Load user information set by UserClient
return "%s/emby/Users/%s/Images/%s?Format=original" % (self.server, user_id, item_type)

View file

@ -32,7 +32,7 @@ class DownloadUtils():
_shared_state = {} _shared_state = {}
# How many failed attempts before declaring PMS dead? # How many failed attempts before declaring PMS dead?
connectionAttempts = 2 connectionAttempts = 1
# How many 401 returns before declaring unauthorized? # How many 401 returns before declaring unauthorized?
unauthorizedAttempts = 2 unauthorizedAttempts = 2
# How long should we wait for an answer from the # How long should we wait for an answer from the
@ -318,7 +318,7 @@ class DownloadUtils():
LOG.warn('Failed to connect to %s too many times. ' LOG.warn('Failed to connect to %s too many times. '
'Declare PMS dead', url) 'Declare PMS dead', url)
window('plex_online', value="false") window('plex_online', value="false")
except: except ValueError:
# 'countError' not yet set # 'countError' not yet set
pass pass
return None return None

View file

@ -552,16 +552,7 @@ def getOnDeck(viewid, mediatype, tagname, limit):
listitem = api.create_listitem( listitem = api.create_listitem(
append_show_title=append_show_title, append_show_title=append_show_title,
append_sxxexx=append_sxxexx) append_sxxexx=append_sxxexx)
if directpaths: url = api.path()
url = api.file_path(force_first_media=True)
else:
url = ('plugin://%s.tvshows/?plex_id=%s&plex_type=%s&mode=play&filename=%s'
% (v.ADDON_ID,
api.plex_id(),
api.plex_type(),
api.file_name(force_first_media=True)))
if api.resume_point():
listitem.setProperty('resumetime', str(api.resume_point()))
xbmcplugin.addDirectoryItem( xbmcplugin.addDirectoryItem(
handle=HANDLE, handle=HANDLE,
url=url, url=url,
@ -829,11 +820,7 @@ def __build_item(xml_element):
elif api.plex_type() == v.PLEX_TYPE_PHOTO: elif api.plex_type() == v.PLEX_TYPE_PHOTO:
url = api.get_picture_path() url = api.get_picture_path()
else: else:
url = 'plugin://%s/?plex_id=%s&plex_type=%s&mode=play&filename=%s' \ url = api.path()
% (v.ADDON_TYPE[api.plex_type()],
api.plex_id(),
api.plex_type(),
api.file_name(force_first_media=True))
if api.resume_point(): if api.resume_point():
listitem.setProperty('resumetime', str(api.resume_point())) listitem.setProperty('resumetime', str(api.resume_point()))
xbmcplugin.addDirectoryItem(handle=HANDLE, xbmcplugin.addDirectoryItem(handle=HANDLE,

View file

@ -528,6 +528,8 @@ class InitialSetup(object):
# Do we need to migrate stuff? # Do we need to migrate stuff?
check_migration() check_migration()
# Reload the server IP cause we might've deleted it during migration
self.server = UserClient().get_server()
# Display a warning if Kodi puts ALL movies into the queue, basically # Display a warning if Kodi puts ALL movies into the queue, basically
# breaking playback reporting for PKC # breaking playback reporting for PKC

View file

@ -147,21 +147,22 @@ class Items(object):
userdata['Resume'], userdata['Resume'],
userdata['Runtime'], userdata['Runtime'],
userdata['PlayCount'], userdata['PlayCount'],
userdata['LastPlayedDate']) userdata['LastPlayedDate'],
api.plex_type())
if v.KODIVERSION >= 17: if v.KODIVERSION >= 17:
self.kodi_db.update_userrating(db_item[0], self.kodi_db.update_userrating(db_item[0],
db_item[4], db_item[4],
userdata['UserRating']) userdata['UserRating'])
def updatePlaystate(self, mark_played, view_count, resume, duration, def updatePlaystate(self, mark_played, view_count, resume, duration,
file_id, lastViewedAt): file_id, lastViewedAt, plex_type):
""" """
Use with websockets, not xml Use with websockets, not xml
""" """
# If the playback was stopped, check whether we need to increment the # If the playback was stopped, check whether we need to increment the
# playcount. PMS won't tell us the playcount via websockets # playcount. PMS won't tell us the playcount via websockets
LOG.debug('Set playstate for file_id %s: viewcount: %s, resume: %s', LOG.debug('Playstate file_id %s: viewcount: %s, resume: %s, type: %s',
file_id, view_count, resume) file_id, view_count, resume, plex_type)
if mark_played: if mark_played:
LOG.info('Marking as completely watched in Kodi') LOG.info('Marking as completely watched in Kodi')
try: try:
@ -174,7 +175,8 @@ class Items(object):
resume, resume,
duration, duration,
view_count, view_count,
lastViewedAt) lastViewedAt,
plex_type)
class Movies(Items): class Movies(Items):
@ -448,7 +450,12 @@ class Movies(Items):
# Add any sets from Plex collection tags # Add any sets from Plex collection tags
self.kodi_db.addSets(movieid, collections, kodicursor) self.kodi_db.addSets(movieid, collections, kodicursor)
# Process playstates # Process playstates
self.kodi_db.addPlaystate(fileid, resume, runtime, playcount, dateplayed) self.kodi_db.addPlaystate(fileid,
resume,
runtime,
playcount,
dateplayed,
v.PLEX_TYPE_MOVIE)
def remove(self, plex_id): def remove(self, plex_id):
""" """
@ -584,7 +591,8 @@ class TVShows(Items):
# Set plugin path # Set plugin path
toplevelpath = "plugin://%s.tvshows/" % v.ADDON_ID toplevelpath = "plugin://%s.tvshows/" % v.ADDON_ID
path = "%s%s/" % (toplevelpath, itemid) path = "%s%s/" % (toplevelpath, itemid)
toppathid = self.kodi_db.get_path(toplevelpath) # Do NOT set a parent id because addon-path cannot be "stacked"
toppathid = None
pathid = self.kodi_db.add_video_path(path, pathid = self.kodi_db.add_video_path(path,
date_added=api.date_created(), date_added=api.date_created(),
@ -852,7 +860,7 @@ class TVShows(Items):
# Set plugin path - do NOT use "intermediate" paths for the show # Set plugin path - do NOT use "intermediate" paths for the show
# as with direct paths! # as with direct paths!
filename = api.file_name(force_first_media=True) filename = api.file_name(force_first_media=True)
path = 'plugin://%s.tvshows/' % v.ADDON_ID path = 'plugin://%s.tvshows/%s/' % (v.ADDON_ID, series_id)
filename = ('%s?plex_id=%s&plex_type=%s&mode=play&filename=%s' filename = ('%s?plex_id=%s&plex_type=%s&mode=play&filename=%s'
% (path, itemid, v.PLEX_TYPE_EPISODE, filename)) % (path, itemid, v.PLEX_TYPE_EPISODE, filename))
playurl = filename playurl = filename
@ -989,7 +997,24 @@ class TVShows(Items):
resume, resume,
runtime, runtime,
playcount, playcount,
dateplayed) dateplayed,
None) # Do send None, we check here
if not state.DIRECT_PATHS:
# need to set a SECOND file entry for a path without plex show id
filename = api.file_name(force_first_media=True)
path = 'plugin://%s.tvshows/' % v.ADDON_ID
# Filename is exactly the same, WITH plex show id!
filename = ('%s%s/?plex_id=%s&plex_type=%s&mode=play&filename=%s'
% (path, series_id, itemid, v.PLEX_TYPE_EPISODE,
filename))
pathid = self.kodi_db.add_video_path(path)
fileid = self.kodi_db.add_file(filename, pathid, dateadded)
self.kodi_db.addPlaystate(fileid,
resume,
runtime,
playcount,
dateplayed,
None) # Do send None - 2nd entry
@catch_exceptions(warnuser=True) @catch_exceptions(warnuser=True)
def remove(self, plex_id): def remove(self, plex_id):
@ -1093,7 +1118,7 @@ class TVShows(Items):
Remove an episode, and episode only from the Kodi DB (not Plex DB) Remove an episode, and episode only from the Kodi DB (not Plex DB)
""" """
self.kodi_db.modify_people(kodi_id, v.KODI_TYPE_EPISODE) self.kodi_db.modify_people(kodi_id, v.KODI_TYPE_EPISODE)
self.kodi_db.remove_file(file_id) self.kodi_db.remove_file(file_id, plex_type=v.PLEX_TYPE_EPISODE)
self.artwork.delete_artwork(kodi_id, self.artwork.delete_artwork(kodi_id,
v.KODI_TYPE_EPISODE, v.KODI_TYPE_EPISODE,
self.kodicursor) self.kodicursor)

View file

@ -8,6 +8,7 @@ from sqlite3 import IntegrityError
import artwork import artwork
from utils import kodi_sql, try_decode, unix_timestamp, unix_date_to_kodi from utils import kodi_sql, try_decode, unix_timestamp, unix_date_to_kodi
import variables as v import variables as v
import state
############################################################################### ###############################################################################
@ -237,13 +238,31 @@ class KodiDBMethods(object):
show_id = None show_id = None
return show_id return show_id
def remove_file(self, file_id, remove_orphans=True): def remove_file(self, file_id, remove_orphans=True, plex_type=None):
""" """
Removes the entry for file_id from the files table. Will also delete Removes the entry for file_id from the files table. Will also delete
entries from the associated tables: bookmark, settings, streamdetails. entries from the associated tables: bookmark, settings, streamdetails.
If remove_orphans is true, this method will delete any orphaned path If remove_orphans is true, this method will delete any orphaned path
entries in the Kodi path table entries in the Kodi path table
Passing plex_type = v.PLEX_TYPE_EPISODE deletes any secondary files for
add-on paths
""" """
if not state.DIRECT_PATHS and plex_type == v.PLEX_TYPE_EPISODE:
# Hack for the 2 entries for episodes for addon paths
query = 'SELECT strFilename FROM files WHERE idFile = ? LIMIT 1'
self.cursor.execute(query, (file_id, ))
filename = self.cursor.fetchone()
if not filename:
LOG.error('Could not find file_id %s', file_id)
return
query = 'SELECT idFile FROM files WHERE strFilename = ? LIMIT 2'
self.cursor.execute(query, (filename[0], ))
file_ids = self.cursor.fetchall()
for new_id in file_ids:
self.remove_file(new_id[0], remove_orphans=remove_orphans)
return
self.cursor.execute('SELECT idPath FROM files WHERE idFile = ? LIMIT 1', self.cursor.execute('SELECT idPath FROM files WHERE idFile = ? LIMIT 1',
(file_id,)) (file_id,))
try: try:
@ -303,7 +322,11 @@ class KodiDBMethods(object):
# Add all new entries that haven't already been added # Add all new entries that haven't already been added
query = 'INSERT INTO %s VALUES (?, ?, ?)' % link_table query = 'INSERT INTO %s VALUES (?, ?, ?)' % link_table
for entry_id in entry_ids: for entry_id in entry_ids:
try:
self.cursor.execute(query, (entry_id, kodi_id, kodi_type)) self.cursor.execute(query, (entry_id, kodi_id, kodi_type))
except IntegrityError:
LOG.info('IntegrityError: skipping entry %s for table %s',
entry_id, link_table)
# Delete all outdated references in the link table. Also check whether # Delete all outdated references in the link table. Also check whether
# we need to delete orphaned entries in the master table # we need to delete orphaned entries in the master table
query = ''' query = '''
@ -704,7 +727,29 @@ class KodiDBMethods(object):
return answ return answ
def addPlaystate(self, file_id, resume_seconds, total_seconds, playcount, def addPlaystate(self, file_id, resume_seconds, total_seconds, playcount,
dateplayed): dateplayed, plex_type):
if not state.DIRECT_PATHS and plex_type == v.PLEX_TYPE_EPISODE:
# Need to make sure to set a SECOND bookmark entry for another,
# second file_id that points to the path .tvshows instead of
# .tvshows/<plex show id/!
query = 'SELECT strFilename FROM files WHERE idFile = ? LIMIT 1'
self.cursor.execute(query, (file_id, ))
filename = self.cursor.fetchone()
if not filename:
LOG.error('Could not find fileid %s in Kodi DB', file_id)
raise RuntimeError
query = 'SELECT idFile FROM files WHERE strFilename = ? LIMIT 2'
self.cursor.execute(query, (filename[0], ))
file_ids = self.cursor.fetchall()
if len(file_ids) != 2:
LOG.error('Expected to find 2 file ids but found %s',
len(file_ids))
raise RuntimeError
for new_id in file_ids:
self.addPlaystate(new_id[0], resume_seconds, total_seconds,
playcount, dateplayed, None)
return
# Delete existing resume point # Delete existing resume point
self.cursor.execute('DELETE FROM bookmark WHERE idFile = ?', (file_id,)) self.cursor.execute('DELETE FROM bookmark WHERE idFile = ?', (file_id,))
# Set watched count # Set watched count

View file

@ -406,7 +406,7 @@ class KodiMonitor(xbmc.Monitor):
else: else:
container_key = '/library/metadata/%s' % plex_id container_key = '/library/metadata/%s' % plex_id
# Remember that this player has been active # Remember that this player has been active
state.ACTIVE_PLAYERS.append(playerid) state.ACTIVE_PLAYERS.add(playerid)
status.update(info) status.update(info)
LOG.debug('Set the Plex container_key to: %s', container_key) LOG.debug('Set the Plex container_key to: %s', container_key)
status['container_key'] = container_key status['container_key'] = container_key
@ -481,7 +481,7 @@ def _playback_cleanup(ended=False):
# Reset the player's status # Reset the player's status
state.PLAYER_STATES[playerid] = copy.deepcopy(state.PLAYSTATE) state.PLAYER_STATES[playerid] = copy.deepcopy(state.PLAYSTATE)
# As all playback has halted, reset the players that have been active # As all playback has halted, reset the players that have been active
state.ACTIVE_PLAYERS = [] state.ACTIVE_PLAYERS = set()
LOG.debug('Finished PKC playback cleanup') LOG.debug('Finished PKC playback cleanup')
@ -531,7 +531,8 @@ def _record_playstate(status, ended):
time, time,
totaltime, totaltime,
playcount, playcount,
last_played) last_played,
status['plex_type'])
# Hack to force "in progress" widget to appear if it wasn't visible before # Hack to force "in progress" widget to appear if it wasn't visible before
if (state.FORCE_RELOAD_SKIN and if (state.FORCE_RELOAD_SKIN and
xbmc.getCondVisibility('Window.IsVisible(Home.xml)')): xbmc.getCondVisibility('Window.IsVisible(Home.xml)')):

View file

@ -3,12 +3,14 @@ from logging import getLogger
from threading import Thread from threading import Thread
from Queue import Empty from Queue import Empty
from xbmc import sleep import xbmc
from utils import thread_methods from utils import thread_methods, settings, language as lang, dialog
import plexdb_functions as plexdb import plexdb_functions as plexdb
import itemtypes import itemtypes
from artwork import ArtworkSyncMessage
import variables as v import variables as v
import state
############################################################################### ###############################################################################
@ -47,6 +49,8 @@ class ThreadedProcessFanart(Thread):
stopped = self.stopped stopped = self.stopped
suspended = self.suspended suspended = self.suspended
queue = self.queue queue = self.queue
counter = 0
set_zero = False
while not stopped(): while not stopped():
# In the event the server goes offline # In the event the server goes offline
while suspended(): while suspended():
@ -55,12 +59,27 @@ class ThreadedProcessFanart(Thread):
# Abort was requested while waiting. We should exit # Abort was requested while waiting. We should exit
LOG.info("---===### Stopped FanartSync ###===---") LOG.info("---===### Stopped FanartSync ###===---")
return return
sleep(1000) xbmc.sleep(1000)
# grabs Plex item from queue # grabs Plex item from queue
try: try:
item = queue.get(block=False) item = queue.get(block=False)
except Empty: except Empty:
sleep(200) if not set_zero and not xbmc.getCondVisibility(
'Window.IsVisible(DialogAddonSettings.xml)'):
# Avoid saving '0' all the time
set_zero = True
settings('fanarttv_lookups', value='0')
xbmc.sleep(200)
continue
set_zero = False
if isinstance(item, ArtworkSyncMessage):
if state.IMAGE_SYNC_NOTIFICATIONS:
dialog('notification',
heading=lang(29999),
message=item.message,
icon='{plex}',
sound=False)
queue.task_done()
continue continue
LOG.debug('Get additional fanart for Plex id %s', item['plex_id']) LOG.debug('Get additional fanart for Plex id %s', item['plex_id'])
@ -72,5 +91,11 @@ class ThreadedProcessFanart(Thread):
LOG.debug('Done getting fanart for Plex id %s', item['plex_id']) LOG.debug('Done getting fanart for Plex id %s', item['plex_id'])
with plexdb.Get_Plex_DB() as plex_db: with plexdb.Get_Plex_DB() as plex_db:
plex_db.set_fanart_synched(item['plex_id']) plex_db.set_fanart_synched(item['plex_id'])
# Update the caching state in the PKC settings. Avoid saving '0'
counter += 1
if (counter > 20 and not xbmc.getCondVisibility(
'Window.IsVisible(DialogAddonSettings.xml)')):
counter = 0
settings('fanarttv_lookups', value=str(queue.qsize()))
queue.task_done() queue.task_done()
LOG.debug("---===### Stopped FanartSync ###===---") LOG.debug("---===### Stopped FanartSync ###===---")

View file

@ -274,16 +274,13 @@ class LibrarySync(Thread):
return True return True
def _full_sync(self): def _full_sync(self):
process = { process = [self.plex_movies, self.plex_tv_show]
'movies': self.plex_movies,
'tvshows': self.plex_tv_show,
}
if state.ENABLE_MUSIC: if state.ENABLE_MUSIC:
process['music'] = self.plex_music process.append(self.plex_music)
# Do the processing # Do the processing
for itemtype in process: for kind in process:
if self.suspend_item_sync() or not process[itemtype](): if self.suspend_item_sync() or not kind():
return False return False
# Let kodi update the views in any case, since we're doing a full sync # Let kodi update the views in any case, since we're doing a full sync
@ -651,7 +648,6 @@ class LibrarySync(Thread):
self.updatelist self.updatelist
""" """
# Some logging, just in case. # Some logging, just in case.
LOG.debug("self.updatelist: %s", self.updatelist)
item_number = len(self.updatelist) item_number = len(self.updatelist)
if item_number == 0: if item_number == 0:
return return
@ -1378,12 +1374,14 @@ class LibrarySync(Thread):
item_fkt = getattr(itemtypes, item_fkt = getattr(itemtypes,
v.ITEMTYPE_FROM_KODITYPE[session['kodi_type']]) v.ITEMTYPE_FROM_KODITYPE[session['kodi_type']])
with item_fkt() as fkt: with item_fkt() as fkt:
plex_type = v.PLEX_TYPE_FROM_KODI_TYPE[session['kodi_type']]
fkt.updatePlaystate(mark_played, fkt.updatePlaystate(mark_played,
session['viewCount'], session['viewCount'],
resume, resume,
session['duration'], session['duration'],
session['file_id'], session['file_id'],
utils.unix_date_to_kodi(utils.unix_timestamp())) utils.unix_date_to_kodi(utils.unix_timestamp()),
plex_type)
def sync_fanart(self, missing_only=True, refresh=False): def sync_fanart(self, missing_only=True, refresh=False):
""" """
@ -1393,6 +1391,8 @@ class LibrarySync(Thread):
missing_only=True False will start look-up for EVERY item missing_only=True False will start look-up for EVERY item
refresh=False True will force refresh all external fanart refresh=False True will force refresh all external fanart
""" """
if settings('FanartTV') == 'false':
return
with plexdb.Get_Plex_DB() as plex_db: with plexdb.Get_Plex_DB() as plex_db:
if missing_only: if missing_only:
with plexdb.Get_Plex_DB() as plex_db: with plexdb.Get_Plex_DB() as plex_db:
@ -1404,14 +1404,20 @@ class LibrarySync(Thread):
items.extend(plex_db.itemsByType(plex_type)) items.extend(plex_db.itemsByType(plex_type))
LOG.info('Trying to get ALL additional fanart for %s items', LOG.info('Trying to get ALL additional fanart for %s items',
len(items)) len(items))
if not items:
return
# Shuffle the list to not always start out identically # Shuffle the list to not always start out identically
shuffle(items) shuffle(items)
for item in items: # Checking FanartTV for %s items
self.fanartqueue.put(artwork.ArtworkSyncMessage(lang(30018) % len(items)))
for i, item in enumerate(items):
self.fanartqueue.put({ self.fanartqueue.put({
'plex_id': item['plex_id'], 'plex_id': item['plex_id'],
'plex_type': item['plex_type'], 'plex_type': item['plex_type'],
'refresh': refresh 'refresh': refresh
}) })
# FanartTV lookup completed
self.fanartqueue.put(artwork.ArtworkSyncMessage(lang(30019)))
def triage_lib_scans(self): def triage_lib_scans(self):
""" """
@ -1499,6 +1505,7 @@ class LibrarySync(Thread):
kodi_db_version_checked = False kodi_db_version_checked = False
last_sync = 0 last_sync = 0
last_processing = 0 last_processing = 0
last_time_sync = 0
one_day_in_seconds = 60*60*24 one_day_in_seconds = 60*60*24
# Link to Websocket queue # Link to Websocket queue
queue = state.WEBSOCKET_QUEUE queue = state.WEBSOCKET_QUEUE
@ -1529,9 +1536,6 @@ class LibrarySync(Thread):
# Setup the paths for addon-paths (even when using direct paths) # Setup the paths for addon-paths (even when using direct paths)
with kodidb.GetKodiDB('video') as kodi_db: with kodidb.GetKodiDB('video') as kodi_db:
kodi_db.setup_path_table() kodi_db.setup_path_table()
# Initialize time offset Kodi - PMS
self.sync_pms_time()
last_time_sync = utils.unix_timestamp()
window('plex_dbScan', clear=True) window('plex_dbScan', clear=True)
state.DB_SCAN = False state.DB_SCAN = False
playlist_monitor = None playlist_monitor = None
@ -1549,6 +1553,9 @@ class LibrarySync(Thread):
# Very first sync upon installation or reset of Kodi DB # Very first sync upon installation or reset of Kodi DB
state.DB_SCAN = True state.DB_SCAN = True
window('plex_dbScan', value='true') window('plex_dbScan', value='true')
# Initialize time offset Kodi - PMS
self.sync_pms_time()
last_time_sync = utils.unix_timestamp()
LOG.info('Initial start-up full sync starting') LOG.info('Initial start-up full sync starting')
xbmc.executebuiltin('InhibitIdleShutdown(true)') xbmc.executebuiltin('InhibitIdleShutdown(true)')
if self.full_sync(): if self.full_sync():
@ -1560,6 +1567,7 @@ class LibrarySync(Thread):
initial_sync_done = True initial_sync_done = True
kodi_db_version_checked = True kodi_db_version_checked = True
last_sync = utils.unix_timestamp() last_sync = utils.unix_timestamp()
self.sync_fanart()
self.fanartthread.start() self.fanartthread.start()
if state.SYNC_PLAYLISTS and playlists.full_sync(): if state.SYNC_PLAYLISTS and playlists.full_sync():
playlist_monitor = playlists.kodi_playlist_monitor() playlist_monitor = playlists.kodi_playlist_monitor()
@ -1568,8 +1576,6 @@ class LibrarySync(Thread):
xbmc.executebuiltin('InhibitIdleShutdown(false)') xbmc.executebuiltin('InhibitIdleShutdown(false)')
window('plex_dbScan', clear=True) window('plex_dbScan', clear=True)
state.DB_SCAN = False state.DB_SCAN = False
if settings('FanartTV') == 'true':
self.sync_fanart()
elif not kodi_db_version_checked: elif not kodi_db_version_checked:
# Install sync was already done, don't force-show dialogs # Install sync was already done, don't force-show dialogs
@ -1590,7 +1596,7 @@ class LibrarySync(Thread):
heading='{plex}', heading='{plex}',
line1=lang(29999) + lang(39402)) line1=lang(29999) + lang(39402))
else: else:
utils.reset() utils.reset(ask_user=False)
break break
kodi_db_version_checked = True kodi_db_version_checked = True
@ -1603,10 +1609,9 @@ class LibrarySync(Thread):
if self.full_sync(): if self.full_sync():
initial_sync_done = True initial_sync_done = True
last_sync = utils.unix_timestamp() last_sync = utils.unix_timestamp()
if settings('FanartTV') == 'true':
self.sync_fanart()
LOG.info('Done initial sync on Kodi startup') LOG.info('Done initial sync on Kodi startup')
artwork.Artwork().cache_major_artwork() artwork.Artwork().cache_major_artwork()
self.sync_fanart()
self.fanartthread.start() self.fanartthread.start()
if state.SYNC_PLAYLISTS and playlists.full_sync(): if state.SYNC_PLAYLISTS and playlists.full_sync():
playlist_monitor = playlists.kodi_playlist_monitor() playlist_monitor = playlists.kodi_playlist_monitor()

View file

@ -11,14 +11,19 @@ def check_migration():
last_migration = settings('last_migrated_PKC_version') last_migration = settings('last_migrated_PKC_version')
if last_migration == v.ADDON_VERSION: if last_migration == v.ADDON_VERSION:
log.info('Already migrated to PKC version %s' % v.ADDON_VERSION) log.info('Already migrated to PKC version %s' % v.ADDON_VERSION)
# Ensure later migration if user downgraded PKC!
settings('last_migrated_PKC_version', value=v.ADDON_VERSION)
return return
if not last_migration:
log.info('Never migrated, so checking everything')
last_migration = '1.0.0'
if not compare_version(v.ADDON_VERSION, '1.8.2'): if not compare_version(v.ADDON_VERSION, '1.8.2'):
log.info('Migrating to version 1.8.1') log.info('Migrating to version 1.8.1')
# Set the new PKC theMovieDB key # Set the new PKC theMovieDB key
settings('themoviedbAPIKey', value='19c90103adb9e98f2172c6a6a3d85dc4') settings('themoviedbAPIKey', value='19c90103adb9e98f2172c6a6a3d85dc4')
if not compare_version(v.ADDON_VERSION, '2.0.25'):
log.info('Migrating to version 2.0.24')
# Need to re-connect with PMS to pick up on plex.direct URIs
settings('ipaddress', value='')
settings('port', value='')
settings('last_migrated_PKC_version', value=v.ADDON_VERSION) settings('last_migrated_PKC_version', value=v.ADDON_VERSION)

View file

@ -31,6 +31,7 @@ def excludefromscan_music_folders():
return return
# Build paths # Build paths
paths = [] paths = []
reboot = False
api = API(item=None) api = API(item=None)
for library in xml: for library in xml:
if library.attrib['type'] != v.PLEX_TYPE_ARTIST: if library.attrib['type'] != v.PLEX_TYPE_ARTIST:
@ -56,9 +57,12 @@ def excludefromscan_music_folders():
LOG.info('New Plex music library detected: %s', path) LOG.info('New Plex music library detected: %s', path)
xml.set_setting(['audio', 'excludefromscan', 'regexp'], xml.set_setting(['audio', 'excludefromscan', 'regexp'],
value=path, append=True) value=path, append=True)
if paths:
# We only need to reboot if we ADD new paths! # We only need to reboot if we ADD new paths!
reboot = xml.write_xml reboot = xml.write_xml
# Delete obsolete entries # Delete obsolete entries
# Make sure we're not saving an empty audio-excludefromscan
xml.write_xml = reboot
for element in parent: for element in parent:
for path in paths: for path in paths:
if element.text == path: if element.text == path:
@ -67,6 +71,7 @@ def excludefromscan_music_folders():
LOG.info('Deleting music library from advancedsettings: %s', LOG.info('Deleting music library from advancedsettings: %s',
element.text) element.text)
parent.remove(element) parent.remove(element)
xml.write_xml = True
except (ParseError, IOError): except (ParseError, IOError):
LOG.error('Could not adjust advancedsettings.xml') LOG.error('Could not adjust advancedsettings.xml')
reboot = False reboot = False

View file

@ -62,7 +62,11 @@ def playback_triage(plex_id=None, plex_type=None, path=None, resolve=True):
return return
playqueue = PQ.get_playqueue_from_type( playqueue = PQ.get_playqueue_from_type(
v.KODI_PLAYLIST_TYPE_FROM_PLEX_TYPE[plex_type]) v.KODI_PLAYLIST_TYPE_FROM_PLEX_TYPE[plex_type])
try:
pos = js.get_position(playqueue.playlistid) pos = js.get_position(playqueue.playlistid)
except KeyError:
LOG.warning('No position returned from Kodi player! Assuming 0')
pos = 0
# Can return -1 (as in "no playlist") # Can return -1 (as in "no playlist")
pos = pos if pos != -1 else 0 pos = pos if pos != -1 else 0
LOG.debug('playQueue position %s for %s', pos, playqueue) LOG.debug('playQueue position %s for %s', pos, playqueue)
@ -206,6 +210,7 @@ def _init_existing_kodi_playlist(playqueue, pos):
LOG.debug('Kodi playlist size: %s', playqueue.kodi_pl.size()) LOG.debug('Kodi playlist size: %s', playqueue.kodi_pl.size())
kodi_items = js.playlist_get_items(playqueue.playlistid) kodi_items = js.playlist_get_items(playqueue.playlistid)
if not kodi_items: if not kodi_items:
LOG.error('No Kodi items returned')
raise PL.PlaylistError('No Kodi items returned') raise PL.PlaylistError('No Kodi items returned')
item = PL.init_plex_playqueue(playqueue, kodi_item=kodi_items[pos]) item = PL.init_plex_playqueue(playqueue, kodi_item=kodi_items[pos])
item.force_transcode = state.FORCE_TRANSCODE item.force_transcode = state.FORCE_TRANSCODE
@ -240,10 +245,7 @@ def _prep_playlist_stack(xml):
api.set_part_number(part) api.set_part_number(part)
if kodi_id is None: if kodi_id is None:
# Need to redirect again to PKC to conclude playback # Need to redirect again to PKC to conclude playback
path = ('plugin://%s/?plex_id=%s&plex_type=%s&mode=play' path = api.path()
% (v.ADDON_TYPE[api.plex_type()],
api.plex_id(),
api.plex_type()))
listitem = api.create_listitem() listitem = api.create_listitem()
listitem.setPath(try_encode(path)) listitem.setPath(try_encode(path))
else: else:

View file

@ -119,7 +119,7 @@ class SubscriptionMgr(object):
self.server = "" self.server = ""
self.protocol = "http" self.protocol = "http"
self.port = "" self.port = ""
self.isplaying = False self.location = 'navigation'
# In order to be able to signal a stop at the end # In order to be able to signal a stop at the end
self.last_params = {} self.last_params = {}
self.lastplayers = {} self.lastplayers = {}
@ -144,7 +144,7 @@ class SubscriptionMgr(object):
Returns a timeline xml as str Returns a timeline xml as str
(xml containing video, audio, photo player state) (xml containing video, audio, photo player state)
""" """
self.isplaying = False self.location = 'navigation'
answ = str(XML) answ = str(XML)
timelines = { timelines = {
v.PLEX_PLAYLIST_TYPE_VIDEO: None, v.PLEX_PLAYLIST_TYPE_VIDEO: None,
@ -163,8 +163,8 @@ class SubscriptionMgr(object):
v.KODI_PLAYLIST_TYPE_FROM_PLEX_PLAYLIST_TYPE[typus]], v.KODI_PLAYLIST_TYPE_FROM_PLEX_PLAYLIST_TYPE[typus]],
typus) typus)
timelines[typus] = self._dict_to_xml(timeline) timelines[typus] = self._dict_to_xml(timeline)
location = 'fullScreenVideo' if self.isplaying else 'navigation' timelines.update({'command_id': '{command_id}',
timelines.update({'command_id': '{command_id}', 'location': location}) 'location': self.location})
return answ.format(**timelines) return answ.format(**timelines)
@staticmethod @staticmethod
@ -191,7 +191,8 @@ class SubscriptionMgr(object):
'type': ptype, 'type': ptype,
'state': 'stopped' 'state': 'stopped'
} }
self.isplaying = True if ptype in (v.PLEX_PLAYLIST_TYPE_VIDEO, v.PLEX_PLAYLIST_TYPE_PHOTO):
self.location = 'fullScreenVideo'
self.stop_sent_to_web = False self.stop_sent_to_web = False
pbmc_server = window('pms_server') pbmc_server = window('pms_server')
if pbmc_server: if pbmc_server:
@ -202,7 +203,6 @@ class SubscriptionMgr(object):
shuffle = '1' if info['shuffled'] else '0' shuffle = '1' if info['shuffled'] else '0'
mute = '1' if info['muted'] is True else '0' mute = '1' if info['muted'] is True else '0'
answ = { answ = {
'location': 'fullScreenVideo',
'controllable': CONTROLLABLE[ptype], 'controllable': CONTROLLABLE[ptype],
'protocol': self.protocol, 'protocol': self.protocol,
'address': self.server, 'address': self.server,

View file

@ -99,7 +99,7 @@ COMMAND_PIPELINE_QUEUE = None
WEBSOCKET_QUEUE = None WEBSOCKET_QUEUE = None
# Which Kodi player is/has been active? (either int 1, 2 or 3) # Which Kodi player is/has been active? (either int 1, 2 or 3)
ACTIVE_PLAYERS = [] ACTIVE_PLAYERS = set()
# Failsafe for throwing an empty video back to Kodi's setResolvedUrl to set # Failsafe for throwing an empty video back to Kodi's setResolvedUrl to set
# up our own playlist from the very beginning # up our own playlist from the very beginning
PKC_CAUSED_STOP = False PKC_CAUSED_STOP = False

View file

@ -264,8 +264,10 @@ class UserClient(Thread):
Reset all user settings Reset all user settings
""" """
LOG.debug("Reset UserClient authentication.") LOG.debug("Reset UserClient authentication.")
try:
self.do_utils.stopSession() self.do_utils.stopSession()
except AttributeError:
pass
window('plex_authenticated', clear=True) window('plex_authenticated', clear=True)
state.AUTHENTICATED = False state.AUTHENTICATED = False
window('pms_token', clear=True) window('pms_token', clear=True)

View file

@ -486,18 +486,20 @@ def wipe_database():
cursor.execute("DELETE FROM %s" % table_name) cursor.execute("DELETE FROM %s" % table_name)
connection.commit() connection.commit()
cursor.close() cursor.close()
# Reset the artwork sync status in the PKC settings
settings('caching_artwork_count', value=language(39310))
settings('fanarttv_lookups', value=language(39310))
# reset the install run flag # reset the install run flag
settings('SyncInstallRunDone', value="false") settings('SyncInstallRunDone', value="false")
def reset(): def reset(ask_user=True):
""" """
User navigated to the PKC settings, Advanced, and wants to reset the Kodi User navigated to the PKC settings, Advanced, and wants to reset the Kodi
database and possibly PKC entirely database and possibly PKC entirely
""" """
# Are you sure you want to reset your local Kodi database? # Are you sure you want to reset your local Kodi database?
if not dialog('yesno', if ask_user and not dialog('yesno',
heading='{plex} %s ' % language(30132), heading='{plex} %s ' % language(30132),
line1=language(39600)): line1=language(39600)):
return return
@ -521,7 +523,7 @@ def reset():
# Reset all PlexKodiConnect Addon settings? (this is usually NOT # Reset all PlexKodiConnect Addon settings? (this is usually NOT
# recommended and unnecessary!) # recommended and unnecessary!)
if dialog('yesno', if ask_user and dialog('yesno',
heading='{plex} %s ' % language(30132), heading='{plex} %s ' % language(30132),
line1=language(39603)): line1=language(39603)):
# Delete the settings # Delete the settings

View file

@ -78,7 +78,7 @@ COMPANION_PORT = int(_ADDON.getSetting('companionPort'))
PKC_MACHINE_IDENTIFIER = None PKC_MACHINE_IDENTIFIER = None
# Minimal PKC version needed for the Kodi database - otherwise need to recreate # Minimal PKC version needed for the Kodi database - otherwise need to recreate
MIN_DB_VERSION = '2.0.11' MIN_DB_VERSION = '2.0.27'
# Database paths # Database paths
_DB_VIDEO_VERSION = { _DB_VIDEO_VERSION = {

View file

@ -57,7 +57,6 @@ class WebSocket(Thread):
LOG.info("----===## Starting %s ##===----", self.__class__.__name__) LOG.info("----===## Starting %s ##===----", self.__class__.__name__)
counter = 0 counter = 0
handshake_counter = 0
stopped = self.stopped stopped = self.stopped
suspended = self.suspended suspended = self.suspended
while not stopped(): while not stopped():
@ -94,9 +93,10 @@ class WebSocket(Thread):
LOG.info("%s: Error connecting", self.__class__.__name__) LOG.info("%s: Error connecting", self.__class__.__name__)
self.ws = None self.ws = None
counter += 1 counter += 1
if counter > 3: if counter >= 10:
counter = 0 LOG.info('%s: Repeated IOError detected. Stopping now',
self.IOError_response() self.__class__.__name__)
break
sleep(1000) sleep(1000)
except websocket.WebSocketTimeoutException: except websocket.WebSocketTimeoutException:
LOG.info("%s: Timeout while connecting, trying again", LOG.info("%s: Timeout while connecting, trying again",
@ -106,10 +106,10 @@ class WebSocket(Thread):
except websocket.WebSocketException as e: except websocket.WebSocketException as e:
LOG.info('%s: WebSocketException: %s', LOG.info('%s: WebSocketException: %s',
self.__class__.__name__, e) self.__class__.__name__, e)
if ('Handshake Status 401' in e.args if ('Handshake Status 401' in e.args or
or 'Handshake Status 403' in e.args): 'Handshake Status 403' in e.args):
handshake_counter += 1 counter += 1
if handshake_counter >= 5: if counter >= 5:
LOG.info('%s: Error in handshake detected. ' LOG.info('%s: Error in handshake detected. '
'Stopping now', self.__class__.__name__) 'Stopping now', self.__class__.__name__)
break break
@ -125,7 +125,6 @@ class WebSocket(Thread):
sleep(1000) sleep(1000)
else: else:
counter = 0 counter = 0
handshake_counter = 0
except Exception as e: except Exception as e:
LOG.error("%s: Unknown exception encountered: %s", LOG.error("%s: Unknown exception encountered: %s",
self.__class__.__name__, e) self.__class__.__name__, e)
@ -202,11 +201,6 @@ class PMS_Websocket(WebSocket):
# Put PMS message on queue and let libsync take care of it # Put PMS message on queue and let libsync take care of it
state.WEBSOCKET_QUEUE.put(message) state.WEBSOCKET_QUEUE.put(message)
def IOError_response(self):
LOG.warn("Repeatedly could not connect to PMS, "
"declaring the connection dead")
window('plex_online', value='false')
class Alexa_Websocket(WebSocket): class Alexa_Websocket(WebSocket):
""" """
@ -252,9 +246,6 @@ class Alexa_Websocket(WebSocket):
return return
process_command(message.attrib['path'][1:], message.attrib) process_command(message.attrib['path'][1:], message.attrib)
def IOError_response(self):
pass
# Path in thread_methods # Path in thread_methods
def stop(self): def stop(self):
self.thread_stopped = True self.thread_stopped = True

View file

@ -29,17 +29,16 @@
<setting id="plexhome" label="Plex home in use" type="bool" default="" visible="false" /> <setting id="plexhome" label="Plex home in use" type="bool" default="" visible="false" />
<setting id="plexToken" label="plexToken" type="text" default="" visible="false" /> <setting id="plexToken" label="plexToken" type="text" default="" visible="false" />
<setting id="plexHomeSize" type="number" default="1" visible="false" /> <setting id="plexHomeSize" type="number" default="1" visible="false" />
<setting type="sep" text=""/>
<setting type="lsep" label="39008" /> <setting type="lsep" label="39008" />
<setting id="plexCompanion" label="39004" type="bool" default="true" /> <setting id="plexCompanion" label="39004" type="bool" default="true" />
<setting id="deviceName" label="30016" type="text" visible="eq(-1,true)" default="PlexKodiConnect" subsetting="true" /> <setting id="deviceName" label="30016" type="text" visible="eq(-1,true)" default="PlexKodiConnect" subsetting="true" />
<setting id="companionPort" label="39005" type="number" default="3005" option="int" visible="eq(-2,true)" subsetting="true" /> <setting id="companionPort" label="39005" type="number" default="3005" option="int" visible="eq(-2,true)" subsetting="true" />
<setting id="companionUpdatePort" label="39078" type="number" default="32412" option="int" visible="eq(-3,true)" subsetting="true" /> <setting id="companionUpdatePort" label="39078" type="number" default="32412" option="int" visible="eq(-3,true)" subsetting="true" />
<setting type="sep" text=""/>
<setting type="lsep" label="39700" /> <setting type="lsep" label="39700" />
<setting id="enable_alexa" label="39701" type="bool" default="true"/> <setting id="enable_alexa" label="39701" type="bool" default="true"/>
<setting type="lsep" label="" />
<!-- Different settings that are not visible - to avoid warnings in the log --> <!-- Different settings that are not visible - to avoid warnings in the log -->
<setting id="skipContextMenu" type="bool" label="30520" default="false"/>
<setting id="plex_restricteduser" type="bool" default="false" visible="false"/> <setting id="plex_restricteduser" type="bool" default="false" visible="false"/>
<setting id="plex_allows_mediaDeletion" type="bool" default="true" visible="false"/> <setting id="plex_allows_mediaDeletion" type="bool" default="true" visible="false"/>
<setting id="companion_show_gdm_port_warning" type="bool" default="true" visible="false"/> <setting id="companion_show_gdm_port_warning" type="bool" default="true" visible="false"/>
@ -57,19 +56,19 @@
<category label="30506"><!-- Sync Options --> <category label="30506"><!-- Sync Options -->
<setting type="lsep" label="30537" /><!-- Restart if you make changes --> <setting type="lsep" label="30537" /><!-- Restart if you make changes -->
<setting id="syncEmptyShows" type="bool" label="30508" default="false" visible="false"/>
<setting id="enablePlaylistSync" type="bool" label="30010" default="true" visible="true"/><!-- Sync Plex playlists -->
<setting id="dbSyncIndicator" label="30507" type="bool" default="true" /><!-- show syncing progress -->
<setting type="sep" /> <setting type="sep" />
<setting id="syncThreadNumber" type="slider" label="39003" default="10" option="int" range="1,1,20"/><!-- Limit download sync threads (recommended for rpi: 1) --> <setting id="enablePlaylistSync" type="bool" label="30020" default="true" visible="true"/><!-- Sync Plex playlists -->
<setting id="fullSyncInterval" type="number" label="39053" default="60" option="int" />
<setting id="dbSyncScreensaver" type="bool" label="39062" default="false" /><!--Sync when screensaver is deactivated-->
<setting id="dbSyncIndicator" label="30507" type="bool" default="true" /><!-- show syncing progress -->
<setting id="syncThreadNumber" type="slider" label="39003" default="10" option="int" range="1,1,20"/><!-- Number of simultaneous download threads -->
<setting id="limitindex" type="number" label="30515" default="200" option="int" /><!-- Maximum items to request from the server at once --> <setting id="limitindex" type="number" label="30515" default="200" option="int" /><!-- Maximum items to request from the server at once -->
<setting type="sep" />
<setting type="lsep" label="39052" /><!-- Background Sync --> <setting type="lsep" label="39052" /><!-- Background Sync -->
<setting id="enableBackgroundSync" type="bool" label="39026" default="true" visible="true"/> <setting id="enableBackgroundSync" type="bool" label="39026" default="true" visible="true"/>
<setting id="backgroundsync_saftyMargin" type="slider" label="39051" default="5" option="int" range="5,1,300" visible="eq(-1,true)" subsetting="true" /> <setting id="backgroundsync_saftyMargin" type="slider" label="39051" default="5" option="int" range="5,1,300" visible="eq(-1,true)" subsetting="true" />
<setting id="fullSyncInterval" type="number" label="39053" default="60" option="int" /> <setting type="sep" />
<setting id="dbSyncScreensaver" type="bool" label="39062" default="false" /><!--Sync when screensaver is deactivated--> <setting type="lsep" label="30538" /><!-- Manual complete reset of Kodi database necessary, see "Advanced" -->
<setting type="lsep" label="30538" /><!-- Complete Re-Sync necessary -->
<setting id="indicate_media_versions" type="bool" label="39719" default="false" /><!-- Replace user ratings with number of versions --> <setting id="indicate_media_versions" type="bool" label="39719" default="false" /><!-- Replace user ratings with number of versions -->
<setting id="enableMusic" type="bool" label="30509" default="true" /> <setting id="enableMusic" type="bool" label="30509" default="true" />
<setting id="useDirectPaths" type="enum" label="30511" values="Addon(Default)|Native(Direct paths)" default="0" visible="true"/> <!-- Playback mode --> <setting id="useDirectPaths" type="enum" label="30511" values="Addon(Default)|Native(Direct paths)" default="0" visible="true"/> <!-- Playback mode -->
@ -78,6 +77,7 @@
<setting id="kodiplextimeoffset" type="number" label="Time difference in seconds (Koditime - Plextime)" default="0" visible="false" option="int" /> <setting id="kodiplextimeoffset" type="number" label="Time difference in seconds (Koditime - Plextime)" default="0" visible="false" option="int" />
<setting id="themoviedbAPIKey" type="text" default="19c90103adb9e98f2172c6a6a3d85dc4" visible="false"/> <setting id="themoviedbAPIKey" type="text" default="19c90103adb9e98f2172c6a6a3d85dc4" visible="false"/>
<setting id="FanArtTVAPIKey" type="text" default="639191cb0774661597f28a47e7e2bad5" visible="false"/> <setting id="FanArtTVAPIKey" type="text" default="639191cb0774661597f28a47e7e2bad5" visible="false"/>
<setting id="syncEmptyShows" type="bool" label="30508" default="false" visible="false"/>
</category> </category>
<category label="39057"><!-- Customize Paths --> <category label="39057"><!-- Customize Paths -->
@ -95,15 +95,11 @@
</category> </category>
<category label="30516"><!-- Playback --> <category label="30516"><!-- Playback -->
<setting type="sep" />
<setting id="enableCinema" type="bool" label="30518" default="false" /> <setting id="enableCinema" type="bool" label="30518" default="false" />
<setting id="askCinema" type="bool" label="30519" default="false" visible="eq(-1,true)" subsetting="true" /> <setting id="askCinema" type="bool" label="30519" default="false" visible="eq(-1,true)" subsetting="true" />
<setting id="trailerNumber" type="slider" label="39000" default="3" visible="eq(-2,true)" range="1,1,15" option="int" /> <setting id="trailerNumber" type="slider" label="39000" default="3" visible="eq(-2,true)" range="1,1,15" option="int" />
<setting id="pickPlexSubtitles" type="bool" label="39075" default="true" /> <setting id="pickPlexSubtitles" type="bool" label="39075" default="true" />
<setting id="ignoreSpecialsNextEpisodes" type="bool" label="30527" default="false" /> <setting id="ignoreSpecialsNextEpisodes" type="bool" label="30527" default="false" />
<setting id="offerDelete" type="bool" label="30114" default="false" visible="false"/>
<setting id="deleteTV" type="bool" label="30115" visible="eq(-1,true)" default="false" subsetting="true" />
<setting id="deleteMovies" type="bool" label="30116" visible="eq(-2,true)" default="false" subsetting="true" />
<setting id="resumeJumpBack" type="slider" label="30521" default="10" range="0,1,120" option="int" visible="false"/> <setting id="resumeJumpBack" type="slider" label="30521" default="10" range="0,1,120" option="int" visible="false"/>
<setting type="sep" /> <setting type="sep" />
<setting id="playType" type="enum" label="30002" values="Direct Play (default)|Direct Stream|Force Transcode" default="0" /> <setting id="playType" type="enum" label="30002" values="Direct Play (default)|Direct Stream|Force Transcode" default="0" />
@ -113,22 +109,31 @@
<setting id="transcodeHi10P" type="bool" label="39063" default="false"/> <setting id="transcodeHi10P" type="bool" label="39063" default="false"/>
<setting id="audioBoost" type="slider" label="39001" default="0" range="0,10,100" option="int"/> <setting id="audioBoost" type="slider" label="39001" default="0" range="0,10,100" option="int"/>
<setting id="subtitleSize" label="39002" type="slider" option="int" range="0,30,300" default="100" /> <setting id="subtitleSize" label="39002" type="slider" option="int" range="0,30,300" default="100" />
<setting id="failedCount" type="number" visible="false" default="0" /> <setting id="force_transcode_pix" type="bool" label="30545" default="false" />
<setting id="networkCreds" type="text" visible="false" default="" />
<setting id="bestQuality" type="bool" label="30541" default="false" /> <setting id="bestQuality" type="bool" label="30541" default="false" />
<setting id="bestTrailer" type="bool" label="30542" default="true" /> <setting id="bestTrailer" type="bool" label="30542" default="true" />
<setting id="force_transcode_pix" type="bool" label="30545" default="false" /> <setting type="sep" />
<setting id="offerDelete" type="bool" label="30114" default="false" visible="false"/>
<setting id="deleteTV" type="bool" label="30115" visible="eq(-1,true)" default="false" subsetting="true" />
<setting id="deleteMovies" type="bool" label="30116" visible="eq(-2,true)" default="false" subsetting="true" />
<setting id="skipContextMenu" type="bool" label="30520" default="false"/>
<setting id="kodi_video_cache" type="number" visible="false" default="20971520" /> <setting id="kodi_video_cache" type="number" visible="false" default="20971520" />
<setting id="warned_setting_videoplayer.autoplaynextitem" type="bool" visible="false" default="false" /> <setting id="warned_setting_videoplayer.autoplaynextitem" type="bool" visible="false" default="false" />
<setting id="failedCount" type="number" visible="false" default="0" />
<setting id="networkCreds" type="text" visible="false" default="" />
</category> </category>
<category label="30544"><!-- artwork --> <category label="30544"><!-- artwork -->
<setting id="enableTextureCache" label="30512" type="bool" default="true" /> <!-- Force Artwork Caching --> <setting id="enableTextureCache" label="30512" type="bool" default="true" /> <!-- Cache all artwork for a smooth Kodi experience -->
<setting id="FanartTV" label="30539" type="bool" default="false" /><!-- Download additional art from FanArtTV --> <setting id="FanartTV" label="30539" type="bool" default="false" /><!-- Download additional art from FanArtTV -->
<setting label="39222" type="action" action="RunPlugin(plugin://plugin.video.plexkodiconnect/?mode=fanart)" option="close" visible="eq(-1,true)" subsetting="true" /> <!-- Look for missing fanart on FanartTV now --> <setting label="39222" type="action" action="RunPlugin(plugin://plugin.video.plexkodiconnect/?mode=fanart)" option="close" visible="eq(-1,true)" subsetting="true" /> <!-- Look for missing fanart on FanartTV now -->
<setting id="imageSyncNotifications" label="30008" type="bool" default="true" /><!-- Enable notifications for image caching --> <setting id="imageSyncNotifications" label="30008" type="bool" default="true" /><!-- Enable notifications for image caching -->
<setting id="imageSyncDuringPlayback" label="30009" type="bool" default="true" /><!-- Enable image caching during Kodi playback (restart Kodi!) --> <setting id="imageSyncDuringPlayback" label="30009" type="bool" default="true" /><!-- Enable image caching during Kodi playback (restart Kodi!) -->
<setting label="39020" type="action" action="RunPlugin(plugin://plugin.video.plexkodiconnect/?mode=texturecache)" option="close" /> <!-- Cache all images to Kodi texture cache now --> <setting label="39020" type="action" action="RunPlugin(plugin://plugin.video.plexkodiconnect/?mode=texturecache)" option="close" /> <!-- Cache all images to Kodi texture cache now -->
<setting type="sep" />
<setting type="lsep" label="30010" /><!-- Approximate progress -->
<setting id="caching_artwork_count" label="30011" type="text" default="$ADDON[plugin.video.plexkodiconnect 39310]" enable="false" visible="eq(-8,true)"/><!-- Plex artwork (posters and backgrounds) left to cache: -->
<setting id="fanarttv_lookups" label="30015" type="text" default="$ADDON[plugin.video.plexkodiconnect 39310]" enable="false" visible="eq(-8,true)"/><!-- Movie and show FanartTV lookups left to do: -->
</category> </category>
<!-- <!--
<category label="30235" visible="false"> <category label="30235" visible="false">
@ -142,8 +147,8 @@
--> -->
<category label="39073"><!-- Appearance Tweaks --> <category label="39073"><!-- Appearance Tweaks -->
<setting id="fetch_pms_item_number" label="39077" type="number" default="25" option="int" /> <setting id="fetch_pms_item_number" label="39077" type="number" default="50" option="int" />
<setting id="forceReloadSkinOnPlaybackStop" type="bool" label="39065" default="false" /><!-- Force-refresh Kodi skin on stopping playback --> <setting type="sep" />
<setting type="lsep" label="39074" /><!-- TV Shows --> <setting type="lsep" label="39074" /><!-- TV Shows -->
<setting id="OnDeckTVextended" type="bool" label="39058" default="true" /><!-- Extend Plex TV Series "On Deck" view to all shows --> <setting id="OnDeckTVextended" type="bool" label="39058" default="true" /><!-- Extend Plex TV Series "On Deck" view to all shows -->
<setting id="OnDeckTvAppendShow" type="bool" label="39047" default="false" /><!--On Deck view: Append show title to episode--> <setting id="OnDeckTvAppendShow" type="bool" label="39047" default="false" /><!--On Deck view: Append show title to episode-->
@ -151,15 +156,20 @@
<setting id="TVShowWatched" type="bool" label="39064" default="true" /><!--Recently Added: Also show already watched episodes--> <setting id="TVShowWatched" type="bool" label="39064" default="true" /><!--Recently Added: Also show already watched episodes-->
<setting id="RecentTvAppendShow" type="bool" label="39059" default="false" /><!--Recently added: Append show title to episode--> <setting id="RecentTvAppendShow" type="bool" label="39059" default="false" /><!--Recently added: Append show title to episode-->
<setting id="RecentTvAppendSeason" type="bool" label="39060" default="false" /><!--Recently Added: Append season- and episode-number SxxExx--> <setting id="RecentTvAppendSeason" type="bool" label="39060" default="false" /><!--Recently Added: Append season- and episode-number SxxExx-->
<setting type="sep" />
<setting type="lsep" label="30302" /><!-- Movies --> <setting type="lsep" label="30302" /><!-- Movies -->
<setting id="MovieShowWatched" type="bool" label="39066" default="true" /><!--Recently Added: Also show already watched episodes--> <setting id="MovieShowWatched" type="bool" label="39066" default="true" /><!--Recently Added: Also show already watched episodes-->
<setting type="sep" />
<setting type="lsep" label="30022" /><!-- Advanced -->
<setting id="forceReloadSkinOnPlaybackStop" type="bool" label="39065" default="false" /><!-- Force-refresh Kodi skin on stopping playback -->
</category> </category>
<category label="30022"><!-- Advanced --> <category label="30022"><!-- Advanced -->
<setting id="startupDelay" type="number" label="30529" default="0" option="int" /> <setting id="startupDelay" type="number" label="30529" default="0" option="int" />
<setting label="39018" type="action" action="RunPlugin(plugin://plugin.video.plexkodiconnect/?mode=repair)" option="close" /> <!-- Repair local database (force update all content) --> <setting label="[COLOR yellow]$ADDON[plugin.video.plexkodiconnect 39018][/COLOR]" type="action" action="RunPlugin(plugin://plugin.video.plexkodiconnect/?mode=repair)" option="close" /> <!-- Repair the Kodi database (force update all content) -->
<setting label="30535" type="action" action="RunPlugin(plugin://plugin.video.plexkodiconnect?mode=deviceid)" /><!-- Reset device id uuid --> <setting label="[COLOR yellow]$ADDON[plugin.video.plexkodiconnect 30535][/COLOR]" type="action" action="RunPlugin(plugin://plugin.video.plexkodiconnect?mode=deviceid)" /><!-- Generate a new unique Plex device Id (e.g. to clone Kodi) -->
<setting type="sep" />
<setting type="lsep" label="39049" /><!-- Nothing works? Try a full reset --> <setting type="lsep" label="39049" /><!-- Nothing works? Try a full reset -->
<setting label="39019" type="action" action="RunPlugin(plugin://plugin.video.plexkodiconnect/?mode=reset)" option="close" /> <!-- Partial or full reset of Database and PKC --> <setting label="[COLOR red]$ADDON[plugin.video.plexkodiconnect 39019][/COLOR]" type="action" action="RunPlugin(plugin://plugin.video.plexkodiconnect/?mode=reset)" option="close" /> <!-- Reset the Kodi database and optionally reset PlexKodiConnect -->
</category> </category>
</settings> </settings>

View file

@ -1,145 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<window>
<defaultcontrol always="true">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>35%</left>
<top>20%</top>
<control type="image">
<description>Background box</description>
<texture colordiffuse="ff111111">white.png</texture>
<width>600</width>
<height>480</height>
</control>
<control type="group" id="202">
<top>485</top>
<visible>False</visible>
<control type="image">
<description>Error box</description>
<texture colordiffuse="ff222222">white.png</texture>
<width>100%</width>
<height>50</height>
</control>
<control type="label" id="203">
<description>Error message</description>
<textcolor>white</textcolor>
<font>font10</font>
<aligny>center</aligny>
<align>center</align>
<height>50</height>
</control>
</control>
<control type="image">
<description>Emby logo</description>
<texture>logo-white.png</texture>
<aspectratio>keep</aspectratio>
<width>120</width>
<height>49</height>
<top>30</top>
<left>25</left>
</control>
<control type="group">
<width>500</width>
<left>50</left>
<control type="label">
<description>Please sign in</description>
<label>$ADDON[plugin.video.emby 30612]</label>
<textcolor>white</textcolor>
<font>font12</font>
<aligny>top</aligny>
<align>center</align>
<width>100%</width>
<top>100</top>
</control>
<control type="group">
<top>150</top>
<control type="label">
<description>Username</description>
<label>$ADDON[plugin.video.emby 30024]</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="ff525252" border="90,3,90,3">emby-separator.png</texture>
</control>
</control>
<control type="group">
<description>Password</description>
<top>225</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="ff525252" border="90,3,90,3">emby-separator.png</texture>
</control>
</control>
<control type="group">
<description>Buttons</description>
<top>335</top>
<control type="button" id="200">
<description>Sign in</description>
<texturenofocus border="5" colordiffuse="ff0b8628">box.png</texturenofocus>
<texturefocus border="5" colordiffuse="ff13a134">box.png</texturefocus>
<label>[UPPERCASE][B]$ADDON[plugin.video.emby 30605][/B][/UPPERCASE]</label>
<font>font10</font>
<textcolor>ffa6a6a6</textcolor>
<focusedcolor>white</focusedcolor>
<align>center</align>
<width>100%</width>
<height>50</height>
<ondown>201</ondown>
</control>
<control type="button" id="201">
<description>Cancel</description>
<texturenofocus border="5" colordiffuse="ff464646">box.png</texturenofocus>
<texturefocus border="5" colordiffuse="ff525252">box.png</texturefocus>
<label>[UPPERCASE][B]$ADDON[plugin.video.emby 30606][/B][/UPPERCASE]</label>
<font>font10</font>
<textcolor>ffa6a6a6</textcolor>
<focusedcolor>white</focusedcolor>
<align>center</align>
<width>100%</width>
<height>50</height>
<top>55</top>
<onup>200</onup>
</control>
</control>
</control>
</control>
</controls>
</window>

View file

@ -1,179 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<window>
<defaultcontrol always="true">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>35%</left>
<top>15%</top>
<control type="image">
<description>Background box</description>
<texture colordiffuse="ff111111">white.png</texture>
<width>600</width>
<height>700</height>
</control>
<control type="group" id="202">
<top>705</top>
<visible>False</visible>
<control type="image">
<description>Error box</description>
<texture colordiffuse="ff222222">white.png</texture>
<width>100%</width>
<height>50</height>
</control>
<control type="label" id="203">
<description>Error message</description>
<textcolor>white</textcolor>
<font>font10</font>
<aligny>center</aligny>
<align>center</align>
<height>50</height>
</control>
</control>
<control type="image">
<description>Emby logo</description>
<texture>logo-white.png</texture>
<width>160</width>
<height>49</height>
<top>30</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 30543]</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="ff525252" border="90,3,90,3">emby-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="ff525252" border="90,3,90,3">emby-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="ff0b8628">box.png</texturenofocus>
<texturefocus border="5" colordiffuse="ff13a134">box.png</texturefocus>
<label>[UPPERCASE][B]$ADDON[plugin.video.emby 30605][/B][/UPPERCASE]</label>
<font>font10</font>
<textcolor>ffa6a6a6</textcolor>
<focusedcolor>white</focusedcolor>
<align>center</align>
<width>100%</width>
<height>50</height>
<ondown>201</ondown>
</control>
<control type="button" id="201">
<description>Cancel</description>
<texturenofocus border="5" colordiffuse="ff464646">box.png</texturenofocus>
<texturefocus border="5" colordiffuse="ff525252">box.png</texturefocus>
<label>[UPPERCASE][B]$ADDON[plugin.video.emby 30606][/B][/UPPERCASE]</label>
<font>font10</font>
<textcolor>ffa6a6a6</textcolor>
<focusedcolor>white</focusedcolor>
<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>
<height>100%</height>
</control>
<control type="group">
<control type="label">
<description>Scan me</description>
<label>[UPPERCASE]$ADDON[plugin.video.emby 30604][/UPPERCASE]</label>
<font>font12</font>
<textcolor>ff0b8628</textcolor>
<aligny>top</aligny>
<width>200</width>
<top>120</top>
<left>230</left>
</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>
</control>
</control>
</control>
</controls>
</window>

View file

@ -1,154 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<window>
<defaultcontrol always="true">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>35%</left>
<top>20%</top>
<control type="image">
<description>Background box</description>
<texture colordiffuse="ff111111">white.png</texture>
<width>600</width>
<height>525</height>
</control>
<control type="group" id="202">
<top>530</top>
<visible>False</visible>
<control type="image">
<description>Error box</description>
<texture colordiffuse="ff222222">white.png</texture>
<width>100%</width>
<height>50</height>
</control>
<control type="label" id="203">
<description>Error message</description>
<textcolor>white</textcolor>
<font>font10</font>
<aligny>center</aligny>
<align>center</align>
<height>50</height>
</control>
</control>
<control type="image">
<description>Emby logo</description>
<texture>logo-white.png</texture>
<aspectratio>keep</aspectratio>
<width>120</width>
<height>49</height>
<top>30</top>
<left>25</left>
</control>
<control type="group">
<width>500</width>
<left>50</left>
<control type="label">
<description>Connect to server</description>
<label>$ADDON[plugin.video.emby 30614]</label>
<textcolor>white</textcolor>
<font>font12</font>
<aligny>top</aligny>
<align>center</align>
<width>100%</width>
<top>100</top>
</control>
<control type="group">
<top>150</top>
<control type="label">
<description>Host</description>
<label>$ADDON[plugin.video.emby 30615]</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="ff525252" border="90,3,90,3">emby-separator.png</texture>
</control>
<control type="label">
<description>Host example</description>
<label>192.168.1.100 or https://myserver.com</label>
<textcolor>ff464646</textcolor>
<font>font10</font>
<aligny>top</aligny>
<top>70</top>
</control>
</control>
<control type="group">
<description>Port</description>
<top>275</top>
<control type="label">
<description>Port label</description>
<label>$ADDON[plugin.video.emby 30030]</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="ff525252" border="90,3,90,3">emby-separator.png</texture>
</control>
</control>
<control type="group">
<description>Buttons</description>
<top>380</top>
<control type="button" id="200">
<description>Connect</description>
<texturenofocus border="5" colordiffuse="ff0b8628">box.png</texturenofocus>
<texturefocus border="5" colordiffuse="ff13a134">box.png</texturefocus>
<label>[UPPERCASE][B]$ADDON[plugin.video.emby 30616][/B][/UPPERCASE]</label>
<font>font10</font>
<textcolor>ffa6a6a6</textcolor>
<focusedcolor>white</focusedcolor>
<align>center</align>
<width>100%</width>
<height>50</height>
<ondown>201</ondown>
</control>
<control type="button" id="201">
<description>Cancel</description>
<texturenofocus border="5" colordiffuse="ff464646">box.png</texturenofocus>
<texturefocus border="5" colordiffuse="ff525252">box.png</texturefocus>
<label>[UPPERCASE][B]$ADDON[plugin.video.emby 30606][/B][/UPPERCASE]</label>
<font>font10</font>
<textcolor>ffa6a6a6</textcolor>
<focusedcolor>white</focusedcolor>
<align>center</align>
<width>100%</width>
<height>50</height>
<top>55</top>
<onup>200</onup>
</control>
</control>
</control>
</control>
</controls>
</window>

View file

@ -1,280 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<window>
<defaultcontrol always="true">205</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>450</width>
<left>38%</left>
<top>15%</top>
<control type="image">
<description>Background box</description>
<texture colordiffuse="ff111111">white.png</texture>
<width>450</width>
<height>710</height>
</control>
<control type="image">
<description>Emby logo</description>
<texture>logo-white.png</texture>
<aspectratio>keep</aspectratio>
<width>120</width>
<height>49</height>
<top>30</top>
<left>25</left>
</control>
<control type="group">
<description>User info</description>
<top>70</top>
<width>350</width>
<left>50</left>
<control type="image" id="150">
<description>User image</description>
<texture diffuse="user_image.png">userflyoutdefault.png</texture>
<aspectratio>keep</aspectratio>
<align>center</align>
<width>100%</width>
<height>70</height>
<top>40</top>
</control>
<control type="image" id="204">
<description>Busy animation</description>
<align>center</align>
<top>23</top>
<width>100%</width>
<height>105</height>
<visible>False</visible>
<texture colordiffuse="ff13a134">fading_circle.png</texture>
<aspectratio>keep</aspectratio>
<animation effect="rotate" start="360" end="0" center="auto" time="2000" loop="true" condition="true">conditional</animation>
</control>
<control type="label" id="151">
<description>Welcome user</description>
<textcolor>white</textcolor>
<font>font12</font>
<align>center</align>
<aligny>top</aligny>
<top>120</top>
<width>100%</width>
<height>50</height>
</control>
<control type="image">
<description>separator</description>
<width>102%</width>
<height>0.5</height>
<top>165</top>
<left>-10</left>
<texture colordiffuse="ff525252" border="90,3,90,3">emby-separator.png</texture>
</control>
<control type="label">
<description>Select server</description>
<textcolor>ffa6a6a6</textcolor>
<label>$ADDON[plugin.video.emby 30607]</label>
<font>font10</font>
<align>center</align>
<aligny>top</aligny>
<top>170</top>
<width>100%</width>
<height>50</height>
</control>
</control>
<control type="group">
<top>290</top>
<width>100%</width>
<height>184</height>
<control type="list" id="155">
<description>Connect servers</description>
<focusposition>0</focusposition>
<width>100%</width>
<height>100%</height>
<top>10</top>
<left>55</left>
<onup>155</onup>
<ondown condition="Control.IsVisible(205)">205</ondown>
<ondown condition="!Control.IsVisible(205)">206</ondown>
<onleft condition="Control.IsVisible(205)">205</onleft>
<onleft condition="!Control.IsVisible(205)">206</onleft>
<onright>155</onright>
<pagecontrol>60</pagecontrol>
<scrolltime tween="sine" easing="out">250</scrolltime>
<itemlayout height="46">
<control type="group">
<width>45</width>
<height>45</height>
<control type="image">
<description>Network</description>
<aspectratio>keep</aspectratio>
<texture>network.png</texture>
<visible>StringCompare(ListItem.Property(server_type),network)</visible>
</control>
<control type="image">
<description>Wifi</description>
<aspectratio>keep</aspectratio>
<texture>wifi.png</texture>
<visible>StringCompare(ListItem.Property(server_type),wifi)</visible>
</control>
</control>
<control type="label">
<width>300</width>
<height>40</height>
<left>55</left>
<font>font10</font>
<aligny>center</aligny>
<textcolor>ff838383</textcolor>
<info>ListItem.Label</info>
</control>
</itemlayout>
<focusedlayout height="46">
<control type="group">
<width>45</width>
<height>45</height>
<control type="image">
<description>Network</description>
<aspectratio>keep</aspectratio>
<texture>network.png</texture>
<visible>StringCompare(ListItem.Property(server_type),network)</visible>
</control>
<control type="image">
<description>Wifi</description>
<aspectratio>keep</aspectratio>
<texture>wifi.png</texture>
<visible>StringCompare(ListItem.Property(server_type),wifi)</visible>
</control>
</control>
<control type="label">
<width>300</width>
<height>40</height>
<left>55</left>
<font>font10</font>
<aligny>center</aligny>
<textcolor>white</textcolor>
<info>ListItem.Label</info>
<visible>Control.HasFocus(155)</visible>
</control>
<control type="label">
<width>300</width>
<height>40</height>
<left>55</left>
<font>font10</font>
<aligny>center</aligny>
<textcolor>ff838383</textcolor>
<info>ListItem.Label</info>
<visible>!Control.HasFocus(155)</visible>
</control>
</focusedlayout>
</control>
<control type="scrollbar" id="60">
<left>395</left>
<top>10</top>
<width>5</width>
<height>100%</height>
<onleft>155</onleft>
<onup>60</onup>
<ondown>60</ondown>
<texturesliderbackground colordiffuse="ff000000" border="4">box.png</texturesliderbackground>
<texturesliderbar colordiffuse="ff222222" border="4">box.png</texturesliderbar>
<texturesliderbarfocus colordiffuse="ff222222" border="4">box.png</texturesliderbarfocus>
<showonepage>false</showonepage>
</control>
<control type="group">
<top>100%</top>
<height>220</height>
<control type="group">
<top>45</top>
<height>150</height>
<control type="button" id="205">
<visible>True</visible>
<description>Sign in Connect</description>
<texturenofocus border="5" colordiffuse="ff0b8628">box.png</texturenofocus>
<texturefocus border="5" colordiffuse="ff13a134">box.png</texturefocus>
<label>[UPPERCASE][B]$ADDON[plugin.video.emby 30600][/B][/UPPERCASE]</label>
<font>font10</font>
<textcolor>ffa6a6a6</textcolor>
<focusedcolor>white</focusedcolor>
<align>center</align>
<width>350</width>
<height>50</height>
<left>50</left>
<onup>155</onup>
<ondown>206</ondown>
</control>
<control type="button" id="206">
<description>Manually add server</description>
<texturenofocus border="5" colordiffuse="ff464646">box.png</texturenofocus>
<texturefocus border="5" colordiffuse="ff525252">box.png</texturefocus>
<label>[UPPERCASE][B]$ADDON[plugin.video.emby 30611][/B][/UPPERCASE]</label>
<font>font10</font>
<textcolor>ffa6a6a6</textcolor>
<focusedcolor>white</focusedcolor>
<align>center</align>
<top>55</top>
<width>350</width>
<height>50</height>
<left>50</left>
<onup condition="Control.IsVisible(205)">205</onup>
<onup condition="!Control.IsVisible(205)">155</onup>
<ondown>201</ondown>
</control>
<control type="button" id="201">
<description>Cancel</description>
<texturenofocus border="5" colordiffuse="ff464646">box.png</texturenofocus>
<texturefocus border="5" colordiffuse="ff525252">box.png</texturefocus>
<label>[UPPERCASE][B]$ADDON[plugin.video.emby 30606][/B][/UPPERCASE]</label>
<font>font10</font>
<textcolor>ffa6a6a6</textcolor>
<focusedcolor>white</focusedcolor>
<align>center</align>
<top>110</top>
<width>350</width>
<height>50</height>
<left>50</left>
<onup>206</onup>
</control>
</control>
<control type="group" id="202">
<top>100%</top>
<visible>False</visible>
<control type="image">
<description>Message box</description>
<texture colordiffuse="ff222222">white.png</texture>
<width>100%</width>
<height>50</height>
<top>20</top>
</control>
<control type="label" id="203">
<description>Message</description>
<textcolor>white</textcolor>
<font>font10</font>
<aligny>center</aligny>
<align>center</align>
<height>50</height>
<top>20</top>
</control>
</control>
</control>
</control>
</control>
</controls>
</window>

View file

@ -1,198 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<window>
<defaultcontrol always="true">155</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>715</width>
<left>32%</left>
<top>20%</top>
<control type="image">
<description>Background box</description>
<texture border="6" colordiffuse="ff111111">white.png</texture>
<width>100%</width>
<height>525</height>
</control>
<control type="image">
<description>Emby logo</description>
<texture>logo-white.png</texture>
<aspectratio>keep</aspectratio>
<width>120</width>
<height>49</height>
<top>30</top>
<left>25</left>
</control>
<control type="label">
<description>Please sign in</description>
<label>$ADDON[plugin.video.emby 30612]</label>
<textcolor>white</textcolor>
<font>font12</font>
<aligny>top</aligny>
<align>center</align>
<top>80</top>
<width>100%</width>
</control>
<control type="group">
<top>100</top>
<width>620</width>
<height>245</height>
<left>50</left>
<control type="list" id="155">
<description>Select User</description>
<focusposition>0</focusposition>
<width>100%</width>
<top>40</top>
<onleft>155</onleft>
<onright>155</onright>
<ondown>200</ondown>
<pagecontrol>60</pagecontrol>
<orientation>horizontal</orientation>
<scrolltime tween="sine" easing="out">250</scrolltime>
<itemlayout width="155">
<control type="group">
<width>150</width>
<control type="image">
<description>User image</description>
<colordiffuse>ff888888</colordiffuse>
<info>ListItem.Icon</info>
<aspectratio>keep</aspectratio>
<width>100%</width>
<height>150</height>
</control>
<control type="image">
<description>Background label</description>
<texture colordiffuse="ff222222">white.png</texture>
<width>100%</width>
<height>50</height>
<top>150</top>
</control>
<control type="label">
<width>100%</width>
<align>center</align>
<height>50</height>
<top>150</top>
<font>font10</font>
<textcolor>white</textcolor>
<info>ListItem.Label</info>
</control>
</control>
</itemlayout>
<focusedlayout width="155">
<control type="group">
<width>150</width>
<control type="image">
<description>User image</description>
<info>ListItem.Icon</info>
<aspectratio>keep</aspectratio>
<width>100%</width>
<height>150</height>
<visible>Control.HasFocus(155)</visible>
</control>
<control type="image">
<description>User image</description>
<colordiffuse>ff888888</colordiffuse>
<info>ListItem.Icon</info>
<aspectratio>keep</aspectratio>
<width>100%</width>
<height>150</height>
<visible>!Control.HasFocus(155)</visible>
</control>
<control type="image">
<description>Background label</description>
<texture colordiffuse="ff333333">white.png</texture>
<width>100%</width>
<height>50</height>
<top>150</top>
<visible>Control.HasFocus(155)</visible>
</control>
<control type="image">
<description>Background label</description>
<texture colordiffuse="ff222222">white.png</texture>
<width>100%</width>
<height>50</height>
<top>150</top>
<visible>!Control.HasFocus(155)</visible>
</control>
<control type="label">
<width>100%</width>
<align>center</align>
<height>50</height>
<top>150</top>
<font>font10</font>
<textcolor>white</textcolor>
<info>ListItem.Label</info>
</control>
</control>
</focusedlayout>
</control>
<control type="scrollbar" id="60">
<top>100%</top>
<width>615</width>
<height>5</height>
<onleft>155</onleft>
<onleft>60</onleft>
<onright>60</onright>
<texturesliderbackground colordiffuse="ff000000" border="4">box.png</texturesliderbackground>
<texturesliderbar colordiffuse="ff222222" border="4">box.png</texturesliderbar>
<texturesliderbarfocus colordiffuse="ff222222" border="4">box.png</texturesliderbarfocus>
<showonepage>false</showonepage>
<orientation>horizontal</orientation>
</control>
<control type="group">
<width>615</width>
<height>325</height>
<top>100%</top>
<control type="group">
<control type="button" id="200">
<description>Manual Login button</description>
<texturenofocus border="5" colordiffuse="ff464646">box.png</texturenofocus>
<texturefocus border="5" colordiffuse="ff585858">box.png</texturefocus>
<label>[UPPERCASE][B]$ADDON[plugin.video.emby 30540][/B][/UPPERCASE]</label>
<align>center</align>
<width>100%</width>
<height>50</height>
<top>35</top>
<font>font10</font>
<textcolor>ffa6a6a6</textcolor>
<focusedcolor>white</focusedcolor>
<ondown>201</ondown>
<onup>155</onup>
</control>
<control type="button" id="201">
<description>Cancel</description>
<texturenofocus border="5" colordiffuse="ff464646">box.png</texturenofocus>
<texturefocus border="5" colordiffuse="ff585858">box.png</texturefocus>
<label>[UPPERCASE][B]$ADDON[plugin.video.emby 30606][/B][/UPPERCASE]</label>
<font>font10</font>
<textcolor>ffa6a6a6</textcolor>
<focusedcolor>white</focusedcolor>
<align>center</align>
<width>100%</width>
<height>50</height>
<top>90</top>
<onup>200</onup>
</control>
</control>
</control>
</control>
</control>
</controls>
</window>

View file

@ -8,7 +8,7 @@
<description>Background fade</description> <description>Background fade</description>
<width>100%</width> <width>100%</width>
<height>100%</height> <height>100%</height>
<texture>emby-bg-fade.png</texture> <texture>bg-fade.png</texture>
</control> </control>
<control type="group"> <control type="group">
@ -22,12 +22,12 @@
</control> </control>
<control type="image"> <control type="image">
<description>Emby logo</description> <description>Plex logo</description>
<texture>emby-icon.png</texture> <texture>plex-logo.png</texture>
<aspectratio>keep</aspectratio> <aspectratio>keep</aspectratio>
<height>30</height> <height>34</height>
<top>20</top> <top>20</top>
<left>370</left> <left>-285</left>
</control> </control>
<control type="image" id="150"> <control type="image" id="150">
@ -36,7 +36,7 @@
<aspectratio>keep</aspectratio> <aspectratio>keep</aspectratio>
<height>34</height> <height>34</height>
<top>20</top> <top>20</top>
<left>285</left> <left>370</left>
</control> </control>
<control type="image"> <control type="image">
@ -45,7 +45,7 @@
<height>0.5</height> <height>0.5</height>
<top>70</top> <top>70</top>
<left>-5</left> <left>-5</left>
<texture colordiffuse="ff484848" border="90,3,90,3">emby-separator.png</texture> <texture colordiffuse="ff484848" border="90,3,90,3">separator.png</texture>
</control> </control>
<control type="group"> <control type="group">

View file

Before

Width:  |  Height:  |  Size: 194 B

After

Width:  |  Height:  |  Size: 194 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2 KiB

View file

Before

Width:  |  Height:  |  Size: 54 KiB

After

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.5 KiB

View file

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB