Updated kodi settings on Lenovo

This commit is contained in:
2026-03-22 22:28:43 +01:00
parent 725dfa7157
commit 32b5a81da6
10925 changed files with 575678 additions and 5511 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 217 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 217 KiB

View File

@@ -0,0 +1,325 @@
# Embuary Info language file
# Addon Name: Embuary Info
# Addon id: script.embuary.info
# Addon Provider: sualfred
# Translators:
# sualfred <su4lfred@gmail.com>, 2020
#
msgid ""
msgstr ""
"Project-Id-Version: Embuary Helper\n"
"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
"PO-Revision-Date: 2019-11-24 08:54+0000\n"
"Last-Translator: sualfred <su4lfred@gmail.com>, 2020\n"
"Language-Team: German (Germany) (https://www.transifex.com/sualfred/teams/80018/de_DE/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: de_DE\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
msgctxt "#32000"
msgid "Error"
msgstr "Fehler"
msgctxt "#32001"
msgid ""
"This is a tool to provide features to a skin and requires skin integration."
msgstr ""
"Dieses Tool stellt Features für Skins bereit und benötigt eine Skin-"
"Integration."
#: /resources/settings.xml
msgctxt "#32002"
msgid "(Get a free API key on www.omdbapi.com)"
msgstr "(Kostenfreier API Key ist auf www.omdbapi.com erhältlich)"
#: /resources/settings.xml
msgctxt "#32003"
msgid "Certification country"
msgstr "Ursprungsland der Bewertungen"
#: /resources/lib/tmdb.py
msgctxt "#32019"
msgid "No information found"
msgstr "Keine Informationen gefunden"
#: /resources/lib/utils.py
msgctxt "#32022"
msgid "Invalid TheMovieDB API key"
msgstr "Ungültiger TheMovieDB API Key"
#: /default.py
msgctxt "#32004"
msgid "Person"
msgstr "Person"
#: /default.py
msgctxt "#32005"
msgid "Search for"
msgstr "Suche nach"
#: /resources/skins/default/1080i/script-embuary-person.xml
msgctxt "#32006"
msgid "Age"
msgstr "Alter"
#: /resources/skins/default/1080i/script-embuary-person.xml
msgctxt "#32007"
msgid "Place of birth"
msgstr "Geburtsort"
#: /resources/skins/default/1080i/script-embuary-person.xml
msgctxt "#32008"
msgid "Facts"
msgstr "Fakten"
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32009"
msgid "Similar"
msgstr "Ähnliches"
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32010"
msgid "Images"
msgstr "Bilder"
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32011"
msgid "Premiered"
msgstr "Veröffentlichung"
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32012"
msgid "Retail"
msgstr "Retail"
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32013"
msgid "Budget"
msgstr "Budget"
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32014"
msgid "Revenue"
msgstr "Einnahmen"
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32015"
msgid "Awards"
msgstr "Awards"
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32016"
msgid "Seasons"
msgstr "Staffeln"
#: /resources/skins/default/1080i/script-embuary-person.xml
msgctxt "#32017"
msgid "Known for"
msgstr "Bekannt für"
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32018"
msgid "Crew"
msgstr "Crew"
#: /resources/settings.xml
msgctxt "#32023"
msgid "API key"
msgstr "API Key"
#: /resources/settings.xml
msgctxt "#32020"
msgid "Developer settings"
msgstr "Entwickler-Einstellungen"
#: /resources/settings.xml
msgctxt "#32021"
msgid "Enable caching (highly recommended - only turn off for debugging)"
msgstr ""
"Caching aktivieren (dringend empfohlen - nur zum Debuggen deaktivieren)"
#: /resources/settings.xml
msgctxt "#32024"
msgid "Default language"
msgstr "Standardsprache"
#: /resources/skins/default/1080i/script-embuary-person.xml
msgctxt "#32025"
msgid "items in your library"
msgstr "Einträge in der Datenbank"
#: /resources/settings.xml
msgctxt "#32026"
msgid "Misc."
msgstr "Sonstiges"
#: /resources/settings.xml
msgctxt "#32027"
msgid "Hide person appearances in reality/talk/news shows"
msgstr ""
"Personenauftritte in Reality- / Talk- / Nachrichtensendungen ausblenden"
#: /resources/settings.xml
msgctxt "#32028"
msgid ""
"Hide person appearances in specials/documentaries/behind the scenes movies"
msgstr ""
"Personenauftritte in Specials / Dokumentationen / Behind the Scenes-Filmen "
"ausblenden"
#: /resources/lib/listing.py
msgctxt "#32029"
msgid "Top rated movies"
msgstr "Bestbewertete Filme"
#: /resources/lib/listing.py
msgctxt "#32030"
msgid "Now playing movies"
msgstr "Aktuell laufende Filme"
#: /resources/lib/listing.py
msgctxt "#32031"
msgid "Upcoming movies"
msgstr "Kommende Filme"
#: /resources/lib/listing.py
msgctxt "#32032"
msgid "Popular movies"
msgstr "Beliebte Filme"
#: /resources/lib/listing.py
msgctxt "#32033"
msgid "Top rated TV shows"
msgstr "Bestbewertete Serien"
#: /resources/lib/listing.py
msgctxt "#32034"
msgid "Popular TV shows"
msgstr "Beliebte Serien"
#: /resources/lib/listing.py
msgctxt "#32035"
msgid "TV shows airing today"
msgstr "Heute laufende Serien"
#: /resources/lib/listing.py
msgctxt "#32036"
msgid "TV shows airing in the next 7 days"
msgstr "Serien-Ausstrahlungen der nächsten 7 Tage"
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32037"
msgid "Collection"
msgstr "Sammlung"
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32039"
msgid "Guest stars"
msgstr "Nebendarsteller"
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32040"
msgid "Season"
msgstr "Staffel"
#: /plugin.py
msgctxt "#32038"
msgid "Widgets"
msgstr "Widgets"
#: /resources/settings.xml
msgctxt "#32041"
msgid "Hide items from similar movies if they are part of the collection"
msgstr "Ähnliche Filme ausblenden, wenn sie Teil der Sammlung sind"
#: /resources/lib/widgets.py
msgctxt "#32042"
msgid "Trending movies"
msgstr "Filme im Trend"
#: /resources/lib/widgets.py
msgctxt "#32043"
msgid "Trending shows"
msgstr "Serien im Trend"
#: /resources/settings.xml
msgctxt "#32044"
msgid "Hide upcoming items"
msgstr "Verberge kommende Filme/Serien"
#: /resources/settings.xml
msgctxt "#32045"
msgid "Allow items of the next [n] days"
msgstr "Erlaube Einträge der nächsten [n] Tage"
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32046"
msgid "Watched episodes"
msgstr "Gesehene Episoden"
#: /resources/settings.xml
msgctxt "#32047"
msgid "Install context menu addon"
msgstr "Installiere Context Menü Addon"
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32048"
msgid "Next episode"
msgstr "Nächste Episode"
#: /resources/lib/widgets.py
msgctxt "#32049"
msgid "Discover"
msgstr "Entdecken"
#: /resources/lib/widgets.py
msgctxt "#32050"
msgid "Discover movies"
msgstr "Filme entdecken"
#: /resources/lib/widgets.py
msgctxt "#32051"
msgid "Discover TV shows"
msgstr "Serien entdecken"
#: /resources/lib/widgets.py
msgctxt "#32052"
msgid "Discover movies by year"
msgstr "Entdecke Filme anhand Jahr"
#: /resources/lib/widgets.py
msgctxt "#32053"
msgid "Discover movies by genre"
msgstr "Entdecke Filme anhand Genre"
#: /resources/lib/widgets.py
msgctxt "#32054"
msgid "Discover TV shows by year"
msgstr "Entdecke Serien anhand Jahr"
#: /resources/lib/widgets.py
msgctxt "#32055"
msgid "Discover TV shows by genre"
msgstr "Entdecke Serien anhand Genre"
#: /resources/lib/widgets.py
msgctxt "#32056"
msgid "Previous page"
msgstr "Vorherige Seite"
#: /resources/lib/widgets.py
msgctxt "#32057"
msgid "Discover people"
msgstr "Personen entdecken"
#: /resources/lib/widgets.py
msgctxt "#32058"
msgid "Next 7 days"
msgstr "Nächste 7 Tage"
#: /resources/lib/widgets.py
msgctxt "#32059"
msgid "Next airing episodes of your TV show library"
msgstr "Kommende Folgen deiner TV-Show-Bibliothek"

View File

@@ -0,0 +1,313 @@
# Embuary Info language file
# Addon Name: Embuary Info
# Addon id: script.embuary.info
# Addon Provider: sualfred
msgid ""
msgstr ""
"Project-Id-Version: Embuary Helper\n"
"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: en_GB\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
msgctxt "#32000"
msgid "Error"
msgstr ""
msgctxt "#32001"
msgid "This is a tool to provide features to a skin and requires skin integration."
msgstr ""
#: /resources/settings.xml
msgctxt "#32002"
msgid "(Get a free API key on www.omdbapi.com)"
msgstr ""
#: /resources/settings.xml
msgctxt "#32003"
msgid "Certification country"
msgstr ""
#: /resources/lib/tmdb.py
msgctxt "#32019"
msgid "No information found"
msgstr ""
#: /resources/lib/utils.py
msgctxt "#32022"
msgid "Invalid TheMovieDB API key"
msgstr ""
#: /default.py
msgctxt "#32004"
msgid "Person"
msgstr ""
#: /default.py
msgctxt "#32005"
msgid "Search for"
msgstr ""
#: /resources/skins/default/1080i/script-embuary-person.xml
msgctxt "#32006"
msgid "Age"
msgstr ""
#: /resources/skins/default/1080i/script-embuary-person.xml
msgctxt "#32007"
msgid "Place of birth"
msgstr ""
#: /resources/skins/default/1080i/script-embuary-person.xml
msgctxt "#32008"
msgid "Facts"
msgstr ""
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32009"
msgid "Similar"
msgstr ""
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32010"
msgid "Images"
msgstr ""
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32011"
msgid "Premiered"
msgstr ""
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32012"
msgid "Retail"
msgstr ""
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32013"
msgid "Budget"
msgstr ""
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32014"
msgid "Revenue"
msgstr ""
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32015"
msgid "Awards"
msgstr ""
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32016"
msgid "Seasons"
msgstr ""
#: /resources/skins/default/1080i/script-embuary-person.xml
msgctxt "#32017"
msgid "Known for"
msgstr ""
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32018"
msgid "Crew"
msgstr ""
#: /resources/settings.xml
msgctxt "#32023"
msgid "API key"
msgstr ""
#: /resources/settings.xml
msgctxt "#32020"
msgid "Developer settings"
msgstr ""
#: /resources/settings.xml
msgctxt "#32021"
msgid "Enable caching (highly recommended - only turn off for debugging)"
msgstr ""
#: /resources/settings.xml
msgctxt "#32024"
msgid "Default language"
msgstr ""
#: /resources/skins/default/1080i/script-embuary-person.xml
msgctxt "#32025"
msgid "items in your library"
msgstr ""
#: /resources/settings.xml
msgctxt "#32026"
msgid "Misc."
msgstr ""
#: /resources/settings.xml
msgctxt "#32027"
msgid "Hide person appearances in reality/talk/news shows"
msgstr ""
#: /resources/settings.xml
msgctxt "#32028"
msgid "Hide person appearances in specials/documentaries/behind the scenes movies"
msgstr ""
#: /resources/lib/listing.py
msgctxt "#32029"
msgid "Top rated movies"
msgstr ""
#: /resources/lib/listing.py
msgctxt "#32030"
msgid "Now playing movies"
msgstr ""
#: /resources/lib/listing.py
msgctxt "#32031"
msgid "Upcoming movies"
msgstr ""
#: /resources/lib/listing.py
msgctxt "#32032"
msgid "Popular movies"
msgstr ""
#: /resources/lib/listing.py
msgctxt "#32033"
msgid "Top rated TV shows"
msgstr ""
#: /resources/lib/listing.py
msgctxt "#32034"
msgid "Popular TV shows"
msgstr ""
#: /resources/lib/listing.py
msgctxt "#32035"
msgid "TV shows airing today"
msgstr ""
#: /resources/lib/listing.py
msgctxt "#32036"
msgid "TV shows airing in the next 7 days"
msgstr ""
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32037"
msgid "Collection"
msgstr ""
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32039"
msgid "Guest stars"
msgstr ""
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32040"
msgid "Season"
msgstr ""
#: /plugin.py
msgctxt "#32038"
msgid "Widgets"
msgstr ""
#: /resources/settings.xml
msgctxt "#32041"
msgid "Hide items from similar movies if they are part of the collection"
msgstr ""
#: /resources/lib/widgets.py
msgctxt "#32042"
msgid "Trending movies"
msgstr ""
#: /resources/lib/widgets.py
msgctxt "#32043"
msgid "Trending shows"
msgstr ""
#: /resources/settings.xml
msgctxt "#32044"
msgid "Hide upcoming items"
msgstr ""
#: /resources/settings.xml
msgctxt "#32045"
msgid "Allow items of the next [n] days"
msgstr ""
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32046"
msgid "Watched episodes"
msgstr ""
#: /resources/settings.xml
msgctxt "#32047"
msgid "Install context menu addon"
msgstr ""
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32048"
msgid "Next episode"
msgstr ""
#: /resources/lib/widgets.py
msgctxt "#32049"
msgid "Discover"
msgstr ""
#: /resources/lib/widgets.py
msgctxt "#32050"
msgid "Discover movies"
msgstr ""
#: /resources/lib/widgets.py
msgctxt "#32051"
msgid "Discover TV shows"
msgstr ""
#: /resources/lib/widgets.py
msgctxt "#32052"
msgid "Discover movies by year"
msgstr ""
#: /resources/lib/widgets.py
msgctxt "#32053"
msgid "Discover movies by genre"
msgstr ""
#: /resources/lib/widgets.py
msgctxt "#32054"
msgid "Discover TV shows by year"
msgstr ""
#: /resources/lib/widgets.py
msgctxt "#32055"
msgid "Discover TV shows by genre"
msgstr ""
#: /resources/lib/widgets.py
msgctxt "#32056"
msgid "Previous page"
msgstr ""
#: /resources/lib/widgets.py
msgctxt "#32057"
msgid "Discover people"
msgstr ""
#: /resources/lib/widgets.py
msgctxt "#32058"
msgid "Next 7 days"
msgstr ""
#: /resources/lib/widgets.py
msgctxt "#32059"
msgid "Next airing episodes of your TV show library"
msgstr ""

View File

@@ -0,0 +1,326 @@
# Embuary Info language file
# Addon Name: Embuary Info
# Addon id: script.embuary.info
# Addon Provider: sualfred
# Translators:
# sualfred <su4lfred@gmail.com>, 2019
# Rafa Oliveros <roliverosc@gmail.com>, 2020
#
msgid ""
msgstr ""
"Project-Id-Version: Embuary Helper\n"
"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
"PO-Revision-Date: 2019-11-24 08:54+0000\n"
"Last-Translator: Rafa Oliveros <roliverosc@gmail.com>, 2020\n"
"Language-Team: Spanish (Spain) (https://www.transifex.com/sualfred/teams/80018/es_ES/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: es_ES\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
msgctxt "#32000"
msgid "Error"
msgstr "Error"
msgctxt "#32001"
msgid ""
"This is a tool to provide features to a skin and requires skin integration."
msgstr ""
"Esta es una herramienta para proveer funcionalidades a un skin y require de "
"integración con un skin."
#: /resources/settings.xml
msgctxt "#32002"
msgid "(Get a free API key on www.omdbapi.com)"
msgstr "(Obtenga una clave API gratis en www.omdbapi.com)"
#: /resources/settings.xml
msgctxt "#32003"
msgid "Certification country"
msgstr "País de certificación"
#: /resources/lib/tmdb.py
msgctxt "#32019"
msgid "No information found"
msgstr "No se encontró información"
#: /resources/lib/utils.py
msgctxt "#32022"
msgid "Invalid TheMovieDB API key"
msgstr "Clave API de TheMovieDB inválida"
#: /default.py
msgctxt "#32004"
msgid "Person"
msgstr "Persona"
#: /default.py
msgctxt "#32005"
msgid "Search for"
msgstr "Buscar"
#: /resources/skins/default/1080i/script-embuary-person.xml
msgctxt "#32006"
msgid "Age"
msgstr "Edad"
#: /resources/skins/default/1080i/script-embuary-person.xml
msgctxt "#32007"
msgid "Place of birth"
msgstr "Lugar de nacimiento"
#: /resources/skins/default/1080i/script-embuary-person.xml
msgctxt "#32008"
msgid "Facts"
msgstr "Datos"
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32009"
msgid "Similar"
msgstr "Similares"
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32010"
msgid "Images"
msgstr "Imágenes"
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32011"
msgid "Premiered"
msgstr "Fecha de lanzamiento"
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32012"
msgid "Retail"
msgstr "Fecha de disponibilidad comercial"
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32013"
msgid "Budget"
msgstr "Presupuesto"
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32014"
msgid "Revenue"
msgstr "Recaudación"
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32015"
msgid "Awards"
msgstr "Premios"
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32016"
msgid "Seasons"
msgstr "Temporadas"
#: /resources/skins/default/1080i/script-embuary-person.xml
msgctxt "#32017"
msgid "Known for"
msgstr "Conocido(a) por"
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32018"
msgid "Crew"
msgstr "Equipo"
#: /resources/settings.xml
msgctxt "#32023"
msgid "API key"
msgstr "Clave API"
#: /resources/settings.xml
msgctxt "#32020"
msgid "Developer settings"
msgstr "Ajustes de desarrollador"
#: /resources/settings.xml
msgctxt "#32021"
msgid "Enable caching (highly recommended - only turn off for debugging)"
msgstr ""
"Activar almacenamiento en caché (muy recomendable, solo desactívelo para la "
"depuración)"
#: /resources/settings.xml
msgctxt "#32024"
msgid "Default language"
msgstr "Idioma por defecto"
#: /resources/skins/default/1080i/script-embuary-person.xml
msgctxt "#32025"
msgid "items in your library"
msgstr "elementos en su colección"
#: /resources/settings.xml
msgctxt "#32026"
msgid "Misc."
msgstr "Misc."
#: /resources/settings.xml
msgctxt "#32027"
msgid "Hide person appearances in reality/talk/news shows"
msgstr "Ocultar apariciones de personas en reality / talk / noticieros"
#: /resources/settings.xml
msgctxt "#32028"
msgid ""
"Hide person appearances in specials/documentaries/behind the scenes movies"
msgstr ""
"Ocultar apariciones de personas en películas especiales / documentales / "
"detrás de las cámaras"
#: /resources/lib/listing.py
msgctxt "#32029"
msgid "Top rated movies"
msgstr "Películas Mejor Valoradas"
#: /resources/lib/listing.py
msgctxt "#32030"
msgid "Now playing movies"
msgstr "Ahora en Cines"
#: /resources/lib/listing.py
msgctxt "#32031"
msgid "Upcoming movies"
msgstr "Próximos Estrenos"
#: /resources/lib/listing.py
msgctxt "#32032"
msgid "Popular movies"
msgstr "Películas Populares"
#: /resources/lib/listing.py
msgctxt "#32033"
msgid "Top rated TV shows"
msgstr "Series TV Mejor Valoradas"
#: /resources/lib/listing.py
msgctxt "#32034"
msgid "Popular TV shows"
msgstr "Series TV Populares"
#: /resources/lib/listing.py
msgctxt "#32035"
msgid "TV shows airing today"
msgstr "Series TV en Emisión Hoy"
#: /resources/lib/listing.py
msgctxt "#32036"
msgid "TV shows airing in the next 7 days"
msgstr "Series TV en emisión en los próximos 7 días"
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32037"
msgid "Collection"
msgstr "Colección"
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32039"
msgid "Guest stars"
msgstr "Estrellas invitadas"
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32040"
msgid "Season"
msgstr "Temporada"
#: /plugin.py
msgctxt "#32038"
msgid "Widgets"
msgstr "Widgets"
#: /resources/settings.xml
msgctxt "#32041"
msgid "Hide items from similar movies if they are part of the collection"
msgstr "Ocultar elementos de películas similares si son parte de la colección"
#: /resources/lib/widgets.py
msgctxt "#32042"
msgid "Trending movies"
msgstr "Películas en Tendencia"
#: /resources/lib/widgets.py
msgctxt "#32043"
msgid "Trending shows"
msgstr "Series TV en Tendencia"
#: /resources/settings.xml
msgctxt "#32044"
msgid "Hide upcoming items"
msgstr "Ocultar próximos elementos"
#: /resources/settings.xml
msgctxt "#32045"
msgid "Allow items of the next [n] days"
msgstr "Permitir elementos de los próximos [n] días"
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32046"
msgid "Watched episodes"
msgstr "Episodios vistos"
#: /resources/settings.xml
msgctxt "#32047"
msgid "Install context menu addon"
msgstr "Instalar addon de menú contextual"
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32048"
msgid "Next episode"
msgstr "Siguiente episodio"
#: /resources/lib/widgets.py
msgctxt "#32049"
msgid "Discover"
msgstr "Descubrir"
#: /resources/lib/widgets.py
msgctxt "#32050"
msgid "Discover movies"
msgstr "Descubrir películas"
#: /resources/lib/widgets.py
msgctxt "#32051"
msgid "Discover TV shows"
msgstr "Descubrir series TV"
#: /resources/lib/widgets.py
msgctxt "#32052"
msgid "Discover movies by year"
msgstr "Descubrir películas por año"
#: /resources/lib/widgets.py
msgctxt "#32053"
msgid "Discover movies by genre"
msgstr "Descubrir películas por género"
#: /resources/lib/widgets.py
msgctxt "#32054"
msgid "Discover TV shows by year"
msgstr "Descubrir series TV por año"
#: /resources/lib/widgets.py
msgctxt "#32055"
msgid "Discover TV shows by genre"
msgstr "Descubrir series TV por género"
#: /resources/lib/widgets.py
msgctxt "#32056"
msgid "Previous page"
msgstr "Página anterior"
#: /resources/lib/widgets.py
msgctxt "#32057"
msgid "Discover people"
msgstr "Descubrir personas"
#: /resources/lib/widgets.py
msgctxt "#32058"
msgid "Next 7 days"
msgstr "Próximos 7 días"
#: /resources/lib/widgets.py
msgctxt "#32059"
msgid "Next airing episodes of your TV show library"
msgstr "Próximos episodios en emisión de su biblioteca de series TV"

View File

@@ -0,0 +1,244 @@
# Embuary Info language file
# Addon Name: Embuary Info
# Addon id: script.embuary.info
# Addon Provider: sualfred
# Translators:
# sualfred <su4lfred@gmail.com>, 2019
# Attila Ilyés <ilyes3@gmail.com>, 2019
#
msgid ""
msgstr ""
"Project-Id-Version: Embuary Helper\n"
"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
"PO-Revision-Date: 2019-09-04 11:35+0000\n"
"Last-Translator: Attila Ilyés <ilyes3@gmail.com>, 2019\n"
"Language-Team: Hungarian (Hungary) (https://www.transifex.com/sualfred/teams/80018/hu_HU/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: hu_HU\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
msgctxt "#32000"
msgid "Error"
msgstr "Hiba"
msgctxt "#32001"
msgid ""
"This is a tool to provide features to a skin and requires skin integration."
msgstr ""
"Ez egy olyan eszköz, amely a felszín jellemzőit biztosítja, és a felszín "
"integrációját igényli."
#: /resources/settings.xml
msgctxt "#32002"
msgid "(Get a free API key on www.omdbapi.com)"
msgstr "(Ingyenes API kulcs beszerzése a www.omdbapi.com webhelyen)"
#: /resources/settings.xml
msgctxt "#32003"
msgid "Certification country"
msgstr "Tanúsító ország"
#: /resources/lib/tmdb.py
msgctxt "#32019"
msgid "No information found"
msgstr "Nincs információ"
#: /resources/lib/utils.py
msgctxt "#32022"
msgid "Invalid TheMovieDB API key"
msgstr "Érvénytelen TheMovieDB API kulcs"
#: /default.py
msgctxt "#32004"
msgid "Person"
msgstr "Személy"
#: /default.py
msgctxt "#32005"
msgid "Search for"
msgstr "Keresés"
#: /resources/skins/default/1080i/script-embuary-person.xml
msgctxt "#32006"
msgid "Age"
msgstr "Kor"
#: /resources/skins/default/1080i/script-embuary-person.xml
msgctxt "#32007"
msgid "Place of birth"
msgstr "Születési helye"
#: /resources/skins/default/1080i/script-embuary-person.xml
msgctxt "#32008"
msgid "Facts"
msgstr "Tények"
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32009"
msgid "Similar"
msgstr "Hasonló"
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32010"
msgid "Images"
msgstr "Képek"
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32011"
msgid "Premiered"
msgstr "Premierje"
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32012"
msgid "Retail"
msgstr "Kiskereskedelmi"
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32013"
msgid "Budget"
msgstr "Költség"
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32014"
msgid "Revenue"
msgstr "Bevétel"
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32015"
msgid "Awards"
msgstr "Díjak"
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32016"
msgid "Seasons"
msgstr "Évadok"
#: /resources/skins/default/1080i/script-embuary-person.xml
msgctxt "#32017"
msgid "Known for"
msgstr "Ismert"
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32018"
msgid "Crew"
msgstr "Stáb"
#: /resources/settings.xml
msgctxt "#32023"
msgid "API key"
msgstr "API kulcs"
#: /resources/settings.xml
msgctxt "#32020"
msgid "Caching"
msgstr "Gyorsítótárral"
#: /resources/settings.xml
msgctxt "#32021"
msgid "Enable caching of fetched data"
msgstr "A letöltött adatok gyorsítótárazásának engedélyezése"
#: /resources/settings.xml
msgctxt "#32024"
msgid "Default language"
msgstr "Alapértelmezett nyelv"
#: /resources/skins/default/1080i/script-embuary-person.xml
msgctxt "#32025"
msgid "items in your library"
msgstr "könyvtár tartalma"
#: /resources/settings.xml
msgctxt "#32026"
msgid "Misc."
msgstr "Vegyes"
#: /resources/settings.xml
msgctxt "#32027"
msgid "Hide person appearances in reality/talk/news shows"
msgstr "Személyek megjelenésének elrejtése a reality/talk/hír műsorokban"
#: /resources/settings.xml
msgctxt "#32028"
msgid ""
"Hide person appearances in specials/documentaries/behind the scenes movies"
msgstr ""
"Személyes megjelenések elrejtése speciális/dokumentum/kulisszatitkok "
"filmekben"
#: /resources/lib/listing.py
msgctxt "#32029"
msgid "Top rated movies"
msgstr "Legjobban értékelt filmek"
#: /resources/lib/listing.py
msgctxt "#32030"
msgid "Now playing movies"
msgstr "Most játszott filmek"
#: /resources/lib/listing.py
msgctxt "#32031"
msgid "Upcoming movies"
msgstr "Következő filmek"
#: /resources/lib/listing.py
msgctxt "#32032"
msgid "Popular movies"
msgstr "Népszerű filmek"
#: /resources/lib/listing.py
msgctxt "#32033"
msgid "Top rated TV shows"
msgstr "Legjobban értékelt TV-sorozatok"
#: /resources/lib/listing.py
msgctxt "#32034"
msgid "Popular TV shows"
msgstr "Népszerű TV-sorozatok"
#: /resources/lib/listing.py
msgctxt "#32035"
msgid "TV shows airing today"
msgstr "Ma bemutatandó TV-sorozatok"
#: /resources/lib/listing.py
msgctxt "#32036"
msgid "TV shows airing in the next 7 days"
msgstr "A következő 7 napban bemutatandó TV-sorozatok"
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32037"
msgid "Collection"
msgstr "Gyűjtemény"
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32039"
msgid "Guest stars"
msgstr "Vendég szereplők"
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32040"
msgid "Season"
msgstr "Évad"
#: /plugin.py
msgctxt "#32038"
msgid "Widgets"
msgstr "Widgetek"
#: /resources/settings.xml
msgctxt "#32041"
msgid "Hide items from similar movies if they are part of the collection"
msgstr "Filmek elrejtése, ha azok a gyűjtemény részét képezik"
#: /resources/lib/widgets.py
msgctxt "#32042"
msgid "Trending movies"
msgstr "Népszerű filmek"
#: /resources/lib/widgets.py
msgctxt "#32043"
msgid "Trending shows"
msgstr "Népszerű sorozatok"

View File

@@ -0,0 +1,252 @@
# Embuary Info language file
# Addon Name: Embuary Info
# Addon id: script.embuary.info
# Addon Provider: sualfred
# Translators:
# sualfred <su4lfred@gmail.com>, 2019
# EffeF, 2019
#
msgid ""
msgstr ""
"Project-Id-Version: Embuary Helper\n"
"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
"PO-Revision-Date: 2019-11-24 08:54+0000\n"
"Last-Translator: EffeF, 2019\n"
"Language-Team: Italian (Italy) (https://www.transifex.com/sualfred/teams/80018/it_IT/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: it_IT\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
msgctxt "#32000"
msgid "Error"
msgstr "Errore"
msgctxt "#32001"
msgid ""
"This is a tool to provide features to a skin and requires skin integration."
msgstr ""
"Questo oggetto offre funzionalità alla skin e richiede l'integrazione nella "
"skin"
#: /resources/settings.xml
msgctxt "#32002"
msgid "(Get a free API key on www.omdbapi.com)"
msgstr "(Ottieni una chiave API gratuita presso www.omdbapi.com)"
#: /resources/settings.xml
msgctxt "#32003"
msgid "Certification country"
msgstr "Nazione certificata"
#: /resources/lib/tmdb.py
msgctxt "#32019"
msgid "No information found"
msgstr "Nessuna informazione trovata"
#: /resources/lib/utils.py
msgctxt "#32022"
msgid "Invalid TheMovieDB API key"
msgstr "Chiave API TheMovieDB invalida"
#: /default.py
msgctxt "#32004"
msgid "Person"
msgstr "Persona"
#: /default.py
msgctxt "#32005"
msgid "Search for"
msgstr "Cerca per"
#: /resources/skins/default/1080i/script-embuary-person.xml
msgctxt "#32006"
msgid "Age"
msgstr "Età"
#: /resources/skins/default/1080i/script-embuary-person.xml
msgctxt "#32007"
msgid "Place of birth"
msgstr "Luogo di nascita"
#: /resources/skins/default/1080i/script-embuary-person.xml
msgctxt "#32008"
msgid "Facts"
msgstr "Fatti"
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32009"
msgid "Similar"
msgstr "Simili"
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32010"
msgid "Images"
msgstr "Immagini"
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32011"
msgid "Premiered"
msgstr "Prima"
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32012"
msgid "Retail"
msgstr "Pubblico"
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32013"
msgid "Budget"
msgstr "Budget"
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32014"
msgid "Revenue"
msgstr "Incassi"
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32015"
msgid "Awards"
msgstr "Riconoscimenti"
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32016"
msgid "Seasons"
msgstr "Stagioni"
#: /resources/skins/default/1080i/script-embuary-person.xml
msgctxt "#32017"
msgid "Known for"
msgstr "Conosciuto per"
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32018"
msgid "Crew"
msgstr "Troupe"
#: /resources/settings.xml
msgctxt "#32023"
msgid "API key"
msgstr "Chiave API"
#: /resources/settings.xml
msgctxt "#32020"
msgid "Caching"
msgstr "Caching"
#: /resources/settings.xml
msgctxt "#32021"
msgid "Enable caching of fetched data"
msgstr "Abilita caching informazioni acquisite"
#: /resources/settings.xml
msgctxt "#32024"
msgid "Default language"
msgstr "Lingua predefinita"
#: /resources/skins/default/1080i/script-embuary-person.xml
msgctxt "#32025"
msgid "items in your library"
msgstr "Oggetti libreria"
#: /resources/settings.xml
msgctxt "#32026"
msgid "Misc."
msgstr "Varie"
#: /resources/settings.xml
msgctxt "#32027"
msgid "Hide person appearances in reality/talk/news shows"
msgstr "Nasconde le persone apparse in reality/talk show/notiziari"
#: /resources/settings.xml
msgctxt "#32028"
msgid ""
"Hide person appearances in specials/documentaries/behind the scenes movies"
msgstr "Nasconde le persone apparse in speciali/documentari/dietro le quinte"
#: /resources/lib/listing.py
msgctxt "#32029"
msgid "Top rated movies"
msgstr "Film più votati"
#: /resources/lib/listing.py
msgctxt "#32030"
msgid "Now playing movies"
msgstr "Film ora in riproduzione"
#: /resources/lib/listing.py
msgctxt "#32031"
msgid "Upcoming movies"
msgstr "Film in arrivo"
#: /resources/lib/listing.py
msgctxt "#32032"
msgid "Popular movies"
msgstr "Film popolari"
#: /resources/lib/listing.py
msgctxt "#32033"
msgid "Top rated TV shows"
msgstr "Programmi TV più votati"
#: /resources/lib/listing.py
msgctxt "#32034"
msgid "Popular TV shows"
msgstr "Programmi TV popolari"
#: /resources/lib/listing.py
msgctxt "#32035"
msgid "TV shows airing today"
msgstr "Programmi TV in onda oggi"
#: /resources/lib/listing.py
msgctxt "#32036"
msgid "TV shows airing in the next 7 days"
msgstr "Programmi TV in onda nei prossimi 7 giorni"
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32037"
msgid "Collection"
msgstr "Collezione"
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32039"
msgid "Guest stars"
msgstr "Guest stars"
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32040"
msgid "Season"
msgstr "Stagione"
#: /plugin.py
msgctxt "#32038"
msgid "Widgets"
msgstr "Widgets"
#: /resources/settings.xml
msgctxt "#32041"
msgid "Hide items from similar movies if they are part of the collection"
msgstr "Nascondi elementi da film simili se fanno parte della raccolta"
#: /resources/lib/widgets.py
msgctxt "#32042"
msgid "Trending movies"
msgstr "Film di tendenza"
#: /resources/lib/widgets.py
msgctxt "#32043"
msgid "Trending shows"
msgstr "Programmi di tendenza"
#: /resources/settings.xml
msgctxt "#32044"
msgid "Hide upcoming items"
msgstr "Nascondi elementi in arrivo"
#: /resources/settings.xml
msgctxt "#32045"
msgid "Allow items of the next [n] days"
msgstr "Consenti gli elementi dei prossimi [n] giorni"

View File

@@ -0,0 +1,256 @@
# Embuary Info language file
# Addon Name: Embuary Info
# Addon id: script.embuary.info
# Addon Provider: sualfred
# Translators:
# sualfred <su4lfred@gmail.com>, 2019
# David Claes <d3claes@gmail.com>, 2019
#
msgid ""
msgstr ""
"Project-Id-Version: Embuary Helper\n"
"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
"PO-Revision-Date: 2019-11-24 08:54+0000\n"
"Last-Translator: David Claes <d3claes@gmail.com>, 2019\n"
"Language-Team: Dutch (Netherlands) (https://www.transifex.com/sualfred/teams/80018/nl_NL/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: nl_NL\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
msgctxt "#32000"
msgid "Error"
msgstr "Fout"
msgctxt "#32001"
msgid ""
"This is a tool to provide features to a skin and requires skin integration."
msgstr ""
"Dit is een hulpmiddel om functies aan een skin te voorzien en vereist "
"skinintegratie."
#: /resources/settings.xml
msgctxt "#32002"
msgid "(Get a free API key on www.omdbapi.com)"
msgstr "(Krijg een gratis API-key op www.omdbapi.com)"
#: /resources/settings.xml
msgctxt "#32003"
msgid "Certification country"
msgstr "Certificeringsland"
#: /resources/lib/tmdb.py
msgctxt "#32019"
msgid "No information found"
msgstr "Geen informatie gevonden"
#: /resources/lib/utils.py
msgctxt "#32022"
msgid "Invalid TheMovieDB API key"
msgstr "Ongeldige TheMovieDB API key"
#: /default.py
msgctxt "#32004"
msgid "Person"
msgstr "Persoon"
#: /default.py
msgctxt "#32005"
msgid "Search for"
msgstr "Zoeken naar"
#: /resources/skins/default/1080i/script-embuary-person.xml
msgctxt "#32006"
msgid "Age"
msgstr "Leeftijd"
#: /resources/skins/default/1080i/script-embuary-person.xml
msgctxt "#32007"
msgid "Place of birth"
msgstr "Geboorteplaats"
#: /resources/skins/default/1080i/script-embuary-person.xml
msgctxt "#32008"
msgid "Facts"
msgstr "Feiten"
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32009"
msgid "Similar"
msgstr "Gelijkaardig"
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32010"
msgid "Images"
msgstr "Afbeeldingen"
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32011"
msgid "Premiered"
msgstr "In première"
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32012"
msgid "Retail"
msgstr "In detailhandel"
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32013"
msgid "Budget"
msgstr "Budget"
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32014"
msgid "Revenue"
msgstr "Opbrengsten"
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32015"
msgid "Awards"
msgstr "Prijzen"
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32016"
msgid "Seasons"
msgstr "Seizoenen"
#: /resources/skins/default/1080i/script-embuary-person.xml
msgctxt "#32017"
msgid "Known for"
msgstr "Gekend van"
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32018"
msgid "Crew"
msgstr "Crew"
#: /resources/settings.xml
msgctxt "#32023"
msgid "API key"
msgstr "API key"
#: /resources/settings.xml
msgctxt "#32020"
msgid "Caching"
msgstr "Caching"
#: /resources/settings.xml
msgctxt "#32021"
msgid "Enable caching of fetched data"
msgstr "Schakel caching van opgehaalde gegevens in"
#: /resources/settings.xml
msgctxt "#32024"
msgid "Default language"
msgstr "Standaardtaal"
#: /resources/skins/default/1080i/script-embuary-person.xml
msgctxt "#32025"
msgid "items in your library"
msgstr "Items in jouw bibliotheek"
#: /resources/settings.xml
msgctxt "#32026"
msgid "Misc."
msgstr "Div."
#: /resources/settings.xml
msgctxt "#32027"
msgid "Hide person appearances in reality/talk/news shows"
msgstr "Persoonsverschijningen in reality-, talk- en nieuwsshows verbergen"
#: /resources/settings.xml
msgctxt "#32028"
msgid ""
"Hide person appearances in specials/documentaries/behind the scenes movies"
msgstr ""
"Persoonsverschijningen in specials, documentaires en films 'achter de "
"schermen' verbergen"
#: /resources/lib/listing.py
msgctxt "#32029"
msgid "Top rated movies"
msgstr "Best beoordeelde films"
#: /resources/lib/listing.py
msgctxt "#32030"
msgid "Now playing movies"
msgstr "Films die nu spelen"
#: /resources/lib/listing.py
msgctxt "#32031"
msgid "Upcoming movies"
msgstr "Aankomende films"
#: /resources/lib/listing.py
msgctxt "#32032"
msgid "Popular movies"
msgstr "Populaire films"
#: /resources/lib/listing.py
msgctxt "#32033"
msgid "Top rated TV shows"
msgstr "Best beoordeelde TV-series"
#: /resources/lib/listing.py
msgctxt "#32034"
msgid "Popular TV shows"
msgstr "Populaire TV-series"
#: /resources/lib/listing.py
msgctxt "#32035"
msgid "TV shows airing today"
msgstr "Tv-series die vandaag worden uitgezonden"
#: /resources/lib/listing.py
msgctxt "#32036"
msgid "TV shows airing in the next 7 days"
msgstr "Tv-series die in de volgende 7 dagen worden uitgezonden"
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32037"
msgid "Collection"
msgstr "Verzameling"
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32039"
msgid "Guest stars"
msgstr "Gastrollen"
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32040"
msgid "Season"
msgstr "Seizoen"
#: /plugin.py
msgctxt "#32038"
msgid "Widgets"
msgstr "Widgets"
#: /resources/settings.xml
msgctxt "#32041"
msgid "Hide items from similar movies if they are part of the collection"
msgstr ""
"Verberg items van vergelijkbare films als ze deel uitmaken van de "
"verzameling"
#: /resources/lib/widgets.py
msgctxt "#32042"
msgid "Trending movies"
msgstr "Trending films"
#: /resources/lib/widgets.py
msgctxt "#32043"
msgid "Trending shows"
msgstr "Trending series"
#: /resources/settings.xml
msgctxt "#32044"
msgid "Hide upcoming items"
msgstr "Nakende items verbergen"
#: /resources/settings.xml
msgctxt "#32045"
msgid "Allow items of the next [n] days"
msgstr "Items van de volgende [n] dagen toestaan"

View File

@@ -0,0 +1,244 @@
# Embuary Info language file
# Addon Name: Embuary Info
# Addon id: script.embuary.info
# Addon Provider: sualfred
# Translators:
# Edjalmo Bf <edjalmo.bf@hotmail.com>, 2019
#
msgid ""
msgstr ""
"Project-Id-Version: Embuary Helper\n"
"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
"PO-Revision-Date: 2019-09-04 11:35+0000\n"
"Last-Translator: Edjalmo Bf <edjalmo.bf@hotmail.com>, 2019\n"
"Language-Team: Portuguese (Brazil) (https://www.transifex.com/sualfred/teams/80018/pt_BR/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: pt_BR\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
msgctxt "#32000"
msgid "Error"
msgstr "Erro"
msgctxt "#32001"
msgid ""
"This is a tool to provide features to a skin and requires skin integration."
msgstr ""
"Essa é uma ferramenta para fornecer recursos a uma skin, e requer uma "
"integração com a skin."
#: /resources/settings.xml
msgctxt "#32002"
msgid "(Get a free API key on www.omdbapi.com)"
msgstr "(Consiga uma API key de graça em www.omdbapi.com)"
#: /resources/settings.xml
msgctxt "#32003"
msgid "Certification country"
msgstr "País da classificação indicativa"
#: /resources/lib/tmdb.py
msgctxt "#32019"
msgid "No information found"
msgstr "Nenhuma informação encontrada"
#: /resources/lib/utils.py
msgctxt "#32022"
msgid "Invalid TheMovieDB API key"
msgstr "TheMovieDB API key inválida"
#: /default.py
msgctxt "#32004"
msgid "Person"
msgstr "Pessoa"
#: /default.py
msgctxt "#32005"
msgid "Search for"
msgstr "Procurar por"
#: /resources/skins/default/1080i/script-embuary-person.xml
msgctxt "#32006"
msgid "Age"
msgstr "Idade"
#: /resources/skins/default/1080i/script-embuary-person.xml
msgctxt "#32007"
msgid "Place of birth"
msgstr "Local de nascimento"
#: /resources/skins/default/1080i/script-embuary-person.xml
msgctxt "#32008"
msgid "Facts"
msgstr "Fatos"
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32009"
msgid "Similar"
msgstr "Semelhantes"
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32010"
msgid "Images"
msgstr "Imagens"
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32011"
msgid "Premiered"
msgstr "Estreia"
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32012"
msgid "Retail"
msgstr "Comercial"
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32013"
msgid "Budget"
msgstr "Orçamento"
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32014"
msgid "Revenue"
msgstr "Receita"
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32015"
msgid "Awards"
msgstr "Prêmios"
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32016"
msgid "Seasons"
msgstr "Temporadas"
#: /resources/skins/default/1080i/script-embuary-person.xml
msgctxt "#32017"
msgid "Known for"
msgstr "Conhecido por"
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32018"
msgid "Crew"
msgstr "Equipe"
#: /resources/settings.xml
msgctxt "#32023"
msgid "API key"
msgstr "API key"
#: /resources/settings.xml
msgctxt "#32020"
msgid "Caching"
msgstr "Armazenamento em cache"
#: /resources/settings.xml
msgctxt "#32021"
msgid "Enable caching of fetched data"
msgstr "Ativar armazenamento em cache dos dados buscados"
#: /resources/settings.xml
msgctxt "#32024"
msgid "Default language"
msgstr "Idioma principal"
#: /resources/skins/default/1080i/script-embuary-person.xml
msgctxt "#32025"
msgid "items in your library"
msgstr "itens na sua biblioteca"
#: /resources/settings.xml
msgctxt "#32026"
msgid "Misc."
msgstr "Diversos"
#: /resources/settings.xml
msgctxt "#32027"
msgid "Hide person appearances in reality/talk/news shows"
msgstr ""
"Ocultar participação de pessoas em reality shows, talk shows e notícias"
#: /resources/settings.xml
msgctxt "#32028"
msgid ""
"Hide person appearances in specials/documentaries/behind the scenes movies"
msgstr ""
"Ocultar participação de pessoas em especiais, documentários e making-of de "
"filmes"
#: /resources/lib/listing.py
msgctxt "#32029"
msgid "Top rated movies"
msgstr "Filmes mais bem avaliados"
#: /resources/lib/listing.py
msgctxt "#32030"
msgid "Now playing movies"
msgstr "Filmes em reprodução"
#: /resources/lib/listing.py
msgctxt "#32031"
msgid "Upcoming movies"
msgstr "Próximos filmes"
#: /resources/lib/listing.py
msgctxt "#32032"
msgid "Popular movies"
msgstr "Filmes populares"
#: /resources/lib/listing.py
msgctxt "#32033"
msgid "Top rated TV shows"
msgstr "Seriados mais bem avaliados"
#: /resources/lib/listing.py
msgctxt "#32034"
msgid "Popular TV shows"
msgstr "Seriados populares"
#: /resources/lib/listing.py
msgctxt "#32035"
msgid "TV shows airing today"
msgstr "Seriados com exibição hoje"
#: /resources/lib/listing.py
msgctxt "#32036"
msgid "TV shows airing in the next 7 days"
msgstr "Seriados com exibição nos próximos 7 dias"
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32037"
msgid "Collection"
msgstr "Coleção"
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32039"
msgid "Guest stars"
msgstr "Participações especiais"
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32040"
msgid "Season"
msgstr "Temporadas"
#: /plugin.py
msgctxt "#32038"
msgid "Widgets"
msgstr "Widgets"
#: /resources/settings.xml
msgctxt "#32041"
msgid "Hide items from similar movies if they are part of the collection"
msgstr "Ocultar itens em filmes semelhantes se eles fizerem parte da coleção"
#: /resources/lib/widgets.py
msgctxt "#32042"
msgid "Trending movies"
msgstr "Filmes em tendência"
#: /resources/lib/widgets.py
msgctxt "#32043"
msgid "Trending shows"
msgstr "Seriados em tendência"

View File

@@ -0,0 +1,170 @@
# Embuary Info language file
# Addon Name: Embuary Info
# Addon id: script.embuary.info
# Addon Provider: sualfred
# Translators:
# sualfred <su4lfred@gmail.com>, 2019
# Art Querido <aquerido@live.com.pt>, 2019
#
msgid ""
msgstr ""
"Project-Id-Version: Embuary Helper\n"
"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
"PO-Revision-Date: 2019-09-04 11:35+0000\n"
"Last-Translator: Art Querido <aquerido@live.com.pt>, 2019\n"
"Language-Team: Portuguese (Portugal) (https://www.transifex.com/sualfred/teams/80018/pt_PT/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: pt_PT\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
msgctxt "#32000"
msgid "Error"
msgstr "Erro"
msgctxt "#32001"
msgid ""
"This is a tool to provide features to a skin and requires skin integration."
msgstr ""
"Esta é uma ferramenta que adiciona funcionalidades a um tema e requer "
"integração no mesmo."
#: /resources/settings.xml
msgctxt "#32002"
msgid "(Get a free API key on www.omdbapi.com)"
msgstr "(Obtenha uma chave API gratuita em www.omdbapi.com)"
#: /resources/settings.xml
msgctxt "#32003"
msgid "Certification country"
msgstr "País de certificação"
#: /resources/lib/tmdb.py
msgctxt "#32019"
msgid "No information found"
msgstr "Não foi encontrada informação"
#: /resources/lib/utils.py
msgctxt "#32022"
msgid "Invalid TheMovieDB API key"
msgstr "Chave API TheMovieDB inválida"
#: /default.py
msgctxt "#32004"
msgid "Person"
msgstr "Pessoa"
#: /default.py
msgctxt "#32005"
msgid "Search for"
msgstr "Procurar por"
#: /resources/skins/default/1080i/script-embuary-person.xml
msgctxt "#32006"
msgid "Age"
msgstr "Idade"
#: /resources/skins/default/1080i/script-embuary-person.xml
msgctxt "#32007"
msgid "Place of birth"
msgstr "Local de nascimento"
#: /resources/skins/default/1080i/script-embuary-person.xml
msgctxt "#32008"
msgid "Facts"
msgstr "Fatos"
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32009"
msgid "Similar"
msgstr "Similar"
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32010"
msgid "Images"
msgstr "Imagens"
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32011"
msgid "Premiered"
msgstr "Estreou em"
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32012"
msgid "Retail"
msgstr "Comercial"
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32013"
msgid "Budget"
msgstr "Orçamento"
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32014"
msgid "Revenue"
msgstr "Receita"
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32015"
msgid "Awards"
msgstr "Prémios"
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32016"
msgid "Seasons"
msgstr "Temporadas"
#: /resources/skins/default/1080i/script-embuary-person.xml
msgctxt "#32017"
msgid "Known for"
msgstr "Conhecido por"
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32018"
msgid "Crew"
msgstr "Equipa"
#: /resources/settings.xml
msgctxt "#32023"
msgid "API key"
msgstr "Chave API"
#: /resources/settings.xml
msgctxt "#32020"
msgid "Caching"
msgstr "Obtenção"
#: /resources/settings.xml
msgctxt "#32021"
msgid "Enable caching of fetched data"
msgstr "Ativar obtenção de dados recolhidos"
#: /resources/settings.xml
msgctxt "#32024"
msgid "Default language"
msgstr "Idioma padrão"
#: /resources/skins/default/1080i/script-embuary-person.xml
msgctxt "#32025"
msgid "items in your library"
msgstr "Itens na sua coleção"
#: /resources/settings.xml
msgctxt "#32026"
msgid "Misc."
msgstr "Misc."
#: /resources/settings.xml
msgctxt "#32027"
msgid "Hide person appearances in reality/talk/news shows"
msgstr ""
"Ocultar presença desta pessoa em reality shows, talk shows ou notícias"
#: /resources/settings.xml
msgctxt "#32028"
msgid ""
"Hide person appearances in specials/documentaries/behind the scenes movies"
msgstr ""
"Ocultar presença desta pessoa em filmes especiais/documentários/atrás das "
"cenas"

View File

@@ -0,0 +1,323 @@
# Embuary Info language file
# Addon Name: Embuary Info
# Addon id: script.embuary.info
# Addon Provider: sualfred
# Translators:
# Ivan Poletsky <wiperus55@gmail.com>, 2019
# Эдуард Приутеса <eduardpriutesa@gmail.com>, 2020
#
msgid ""
msgstr ""
"Project-Id-Version: Embuary Helper\n"
"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
"PO-Revision-Date: 2019-11-24 08:54+0000\n"
"Last-Translator: Эдуард Приутеса <eduardpriutesa@gmail.com>, 2020\n"
"Language-Team: Russian (Russia) (https://www.transifex.com/sualfred/teams/80018/ru_RU/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: ru_RU\n"
"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n"
msgctxt "#32000"
msgid "Error"
msgstr "Ошибка"
msgctxt "#32001"
msgid ""
"This is a tool to provide features to a skin and requires skin integration."
msgstr ""
"Это инструмент для обеспечения функций для обложки и требует интеграции "
"обложки."
#: /resources/settings.xml
msgctxt "#32002"
msgid "(Get a free API key on www.omdbapi.com)"
msgstr "(Получите бесплатный ключ API на www.omdbapi.com)"
#: /resources/settings.xml
msgctxt "#32003"
msgid "Certification country"
msgstr "Страна сертификации"
#: /resources/lib/tmdb.py
msgctxt "#32019"
msgid "No information found"
msgstr "Информация не найдена"
#: /resources/lib/utils.py
msgctxt "#32022"
msgid "Invalid TheMovieDB API key"
msgstr "Неверный ключ API TheMovieDB"
#: /default.py
msgctxt "#32004"
msgid "Person"
msgstr "Человек"
#: /default.py
msgctxt "#32005"
msgid "Search for"
msgstr "Поиск"
#: /resources/skins/default/1080i/script-embuary-person.xml
msgctxt "#32006"
msgid "Age"
msgstr "Возраст"
#: /resources/skins/default/1080i/script-embuary-person.xml
msgctxt "#32007"
msgid "Place of birth"
msgstr "Место рождения"
#: /resources/skins/default/1080i/script-embuary-person.xml
msgctxt "#32008"
msgid "Facts"
msgstr "Факты"
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32009"
msgid "Similar"
msgstr "Похожее"
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32010"
msgid "Images"
msgstr "Изображения"
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32011"
msgid "Premiered"
msgstr "Премьера"
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32012"
msgid "Retail"
msgstr "Ритейл"
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32013"
msgid "Budget"
msgstr "Бюджет"
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32014"
msgid "Revenue"
msgstr "Кассовые сборы"
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32015"
msgid "Awards"
msgstr "Награды"
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32016"
msgid "Seasons"
msgstr "Сезоны"
#: /resources/skins/default/1080i/script-embuary-person.xml
msgctxt "#32017"
msgid "Known for"
msgstr "Известность за"
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32018"
msgid "Crew"
msgstr "Съёмочный состав"
#: /resources/settings.xml
msgctxt "#32023"
msgid "API key"
msgstr "Ключ API"
#: /resources/settings.xml
msgctxt "#32020"
msgid "Developer settings"
msgstr "Настройки разработчика"
#: /resources/settings.xml
msgctxt "#32021"
msgid "Enable caching (highly recommended - only turn off for debugging)"
msgstr "Включить кэширование (рекомендуется - только выключить для отладки)"
#: /resources/settings.xml
msgctxt "#32024"
msgid "Default language"
msgstr "Язык по умолчанию"
#: /resources/skins/default/1080i/script-embuary-person.xml
msgctxt "#32025"
msgid "items in your library"
msgstr "в вашей библиотеке"
#: /resources/settings.xml
msgctxt "#32026"
msgid "Misc."
msgstr "Разное"
#: /resources/settings.xml
msgctxt "#32027"
msgid "Hide person appearances in reality/talk/news shows"
msgstr "Скрыть появления человека в реалити/разговорных/новостных шоу"
#: /resources/settings.xml
msgctxt "#32028"
msgid ""
"Hide person appearances in specials/documentaries/behind the scenes movies"
msgstr ""
"Скрыть появления человека в спешлах/бекстейджах/документальных фильмах"
#: /resources/lib/listing.py
msgctxt "#32029"
msgid "Top rated movies"
msgstr "Лучшие фильмы"
#: /resources/lib/listing.py
msgctxt "#32030"
msgid "Now playing movies"
msgstr "Новинки кино"
#: /resources/lib/listing.py
msgctxt "#32031"
msgid "Upcoming movies"
msgstr "Предстоящие фильмы"
#: /resources/lib/listing.py
msgctxt "#32032"
msgid "Popular movies"
msgstr "Популярные фильмы"
#: /resources/lib/listing.py
msgctxt "#32033"
msgid "Top rated TV shows"
msgstr "Лучшие сериалы"
#: /resources/lib/listing.py
msgctxt "#32034"
msgid "Popular TV shows"
msgstr "Популярные фильмы"
#: /resources/lib/listing.py
msgctxt "#32035"
msgid "TV shows airing today"
msgstr "Сериалы, выходящие сегодня"
#: /resources/lib/listing.py
msgctxt "#32036"
msgid "TV shows airing in the next 7 days"
msgstr "Сериалы, выходящие в течение 7 дней"
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32037"
msgid "Collection"
msgstr "Коллекция"
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32039"
msgid "Guest stars"
msgstr "Приглашенные звезды"
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32040"
msgid "Season"
msgstr "Сезон"
#: /plugin.py
msgctxt "#32038"
msgid "Widgets"
msgstr "Виджеты"
#: /resources/settings.xml
msgctxt "#32041"
msgid "Hide items from similar movies if they are part of the collection"
msgstr "Скрывать похожие фильмы, если они часть коллекции"
#: /resources/lib/widgets.py
msgctxt "#32042"
msgid "Trending movies"
msgstr "Популярные фильмы"
#: /resources/lib/widgets.py
msgctxt "#32043"
msgid "Trending shows"
msgstr "Популярные сериалы"
#: /resources/settings.xml
msgctxt "#32044"
msgid "Hide upcoming items"
msgstr "Скрыть предстоящие предметы"
#: /resources/settings.xml
msgctxt "#32045"
msgid "Allow items of the next [n] days"
msgstr "Разрешить элементы следующих [n] дней"
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32046"
msgid "Watched episodes"
msgstr "Просмотренные эпизоды"
#: /resources/settings.xml
msgctxt "#32047"
msgid "Install context menu addon"
msgstr "Установка аддона контекстного меню"
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32048"
msgid "Next episode"
msgstr "Следующий эпизод"
#: /resources/lib/widgets.py
msgctxt "#32049"
msgid "Discover"
msgstr "Обнаружить"
#: /resources/lib/widgets.py
msgctxt "#32050"
msgid "Discover movies"
msgstr "Откройте для себя фильмы"
#: /resources/lib/widgets.py
msgctxt "#32051"
msgid "Discover TV shows"
msgstr "Откройте для себя сериалы"
#: /resources/lib/widgets.py
msgctxt "#32052"
msgid "Discover movies by year"
msgstr "Откройте для себя фильмы по годам"
#: /resources/lib/widgets.py
msgctxt "#32053"
msgid "Discover movies by genre"
msgstr "Откройте для себя фильмы по жанрам"
#: /resources/lib/widgets.py
msgctxt "#32054"
msgid "Discover TV shows by year"
msgstr "Откройте для себя сериалы по годам"
#: /resources/lib/widgets.py
msgctxt "#32055"
msgid "Discover TV shows by genre"
msgstr "Откройте для себя сериалы по жанрам"
#: /resources/lib/widgets.py
msgctxt "#32056"
msgid "Previous page"
msgstr "Предыдущая страница"
#: /resources/lib/widgets.py
msgctxt "#32057"
msgid "Discover people"
msgstr "Откройте для себя людей"
#: /resources/lib/widgets.py
msgctxt "#32058"
msgid "Next 7 days"
msgstr "Следующие 7 дней"
#: /resources/lib/widgets.py
msgctxt "#32059"
msgid "Next airing episodes of your TV show library"
msgstr "Следующие трансляции вашей библиотеки сериалов"

View File

@@ -0,0 +1,253 @@
# Embuary Info language file
# Addon Name: Embuary Info
# Addon id: script.embuary.info
# Addon Provider: sualfred
# Translators:
# sualfred <su4lfred@gmail.com>, 2019
# Miro Valko <mvalec@atlas.sk>, 2019
#
msgid ""
msgstr ""
"Project-Id-Version: Embuary Helper\n"
"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
"PO-Revision-Date: 2019-11-24 08:54+0000\n"
"Last-Translator: Miro Valko <mvalec@atlas.sk>, 2019\n"
"Language-Team: Slovak (Slovakia) (https://www.transifex.com/sualfred/teams/80018/sk_SK/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: sk_SK\n"
"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n == 1 ? 0 : n % 1 == 0 && n >= 2 && n <= 4 ? 1 : n % 1 != 0 ? 2: 3);\n"
msgctxt "#32000"
msgid "Error"
msgstr "Chyba"
msgctxt "#32001"
msgid ""
"This is a tool to provide features to a skin and requires skin integration."
msgstr ""
"Toto je nástroj na poskytovanie služieb pre vzhľad a vyžaduje integráciu vo "
"vzhľade."
#: /resources/settings.xml
msgctxt "#32002"
msgid "(Get a free API key on www.omdbapi.com)"
msgstr "(Získajte voľný API kľúč na www.omdbapi.com)"
#: /resources/settings.xml
msgctxt "#32003"
msgid "Certification country"
msgstr "Krajina certifikácie"
#: /resources/lib/tmdb.py
msgctxt "#32019"
msgid "No information found"
msgstr "Žiadne informácie neboli nájdené"
#: /resources/lib/utils.py
msgctxt "#32022"
msgid "Invalid TheMovieDB API key"
msgstr "Neplatný API kľúč k TheMovieDB"
#: /default.py
msgctxt "#32004"
msgid "Person"
msgstr "Osoba"
#: /default.py
msgctxt "#32005"
msgid "Search for"
msgstr "Vyhľadať"
#: /resources/skins/default/1080i/script-embuary-person.xml
msgctxt "#32006"
msgid "Age"
msgstr "Vek"
#: /resources/skins/default/1080i/script-embuary-person.xml
msgctxt "#32007"
msgid "Place of birth"
msgstr "Miesto narodenia"
#: /resources/skins/default/1080i/script-embuary-person.xml
msgctxt "#32008"
msgid "Facts"
msgstr "Fakty"
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32009"
msgid "Similar"
msgstr "Podobné"
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32010"
msgid "Images"
msgstr "Obrázky"
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32011"
msgid "Premiered"
msgstr "Premiéra"
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32012"
msgid "Retail"
msgstr "Retail"
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32013"
msgid "Budget"
msgstr "Rozpočet"
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32014"
msgid "Revenue"
msgstr "Tržby"
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32015"
msgid "Awards"
msgstr "Ocenenia"
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32016"
msgid "Seasons"
msgstr "Série"
#: /resources/skins/default/1080i/script-embuary-person.xml
msgctxt "#32017"
msgid "Known for"
msgstr "Známa(y) pre"
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32018"
msgid "Crew"
msgstr "Obsadenie"
#: /resources/settings.xml
msgctxt "#32023"
msgid "API key"
msgstr "API kľúč"
#: /resources/settings.xml
msgctxt "#32020"
msgid "Caching"
msgstr "Vyrovnávacia pamäť"
#: /resources/settings.xml
msgctxt "#32021"
msgid "Enable caching of fetched data"
msgstr "Ukladať stiahnuté údaje do vyrovnávacej pamäte"
#: /resources/settings.xml
msgctxt "#32024"
msgid "Default language"
msgstr "Predvolený jazyk"
#: /resources/skins/default/1080i/script-embuary-person.xml
msgctxt "#32025"
msgid "items in your library"
msgstr "položky vo vašej knižnici"
#: /resources/settings.xml
msgctxt "#32026"
msgid "Misc."
msgstr "Rôzne"
#: /resources/settings.xml
msgctxt "#32027"
msgid "Hide person appearances in reality/talk/news shows"
msgstr "Nezobrazovať účinkovanie osoby v rôznych šou "
#: /resources/settings.xml
msgctxt "#32028"
msgid ""
"Hide person appearances in specials/documentaries/behind the scenes movies"
msgstr "Nezobrazovať účinkovanie osoby v dokumentoch a špeciáloch o filmoch"
#: /resources/lib/listing.py
msgctxt "#32029"
msgid "Top rated movies"
msgstr "Najlepšie hodnotené filmy"
#: /resources/lib/listing.py
msgctxt "#32030"
msgid "Now playing movies"
msgstr "Práve prehrávané filmy"
#: /resources/lib/listing.py
msgctxt "#32031"
msgid "Upcoming movies"
msgstr "Prichádzajúce filmy"
#: /resources/lib/listing.py
msgctxt "#32032"
msgid "Popular movies"
msgstr "Populárne filmy"
#: /resources/lib/listing.py
msgctxt "#32033"
msgid "Top rated TV shows"
msgstr "Najlepšie hodnotené seriály"
#: /resources/lib/listing.py
msgctxt "#32034"
msgid "Popular TV shows"
msgstr "Populárne seriály"
#: /resources/lib/listing.py
msgctxt "#32035"
msgid "TV shows airing today"
msgstr "Dnes vysielané seriály"
#: /resources/lib/listing.py
msgctxt "#32036"
msgid "TV shows airing in the next 7 days"
msgstr "Seriály vysielané v najbližších 7 dňoch"
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32037"
msgid "Collection"
msgstr "Kolekcia"
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32039"
msgid "Guest stars"
msgstr "Hosťujúce hviezdy"
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32040"
msgid "Season"
msgstr "Séria"
#: /plugin.py
msgctxt "#32038"
msgid "Widgets"
msgstr "Miniaplikácie"
#: /resources/settings.xml
msgctxt "#32041"
msgid "Hide items from similar movies if they are part of the collection"
msgstr ""
"Nezobrazovať položky z podobných filmov, ak sú súčasťou jednej kolekcie"
#: /resources/lib/widgets.py
msgctxt "#32042"
msgid "Trending movies"
msgstr "Filmy v trende"
#: /resources/lib/widgets.py
msgctxt "#32043"
msgid "Trending shows"
msgstr "Seriály v trende"
#: /resources/settings.xml
msgctxt "#32044"
msgid "Hide upcoming items"
msgstr "Skryť pripravované položky"
#: /resources/settings.xml
msgctxt "#32045"
msgid "Allow items of the next [n] days"
msgstr "Povoliť tie, ktoré výjdu v týchto najbližších dňoch"

View File

@@ -0,0 +1,239 @@
# Embuary Info language file
# Addon Name: Embuary Info
# Addon id: script.embuary.info
# Addon Provider: sualfred
# Translators:
# Noisy✘ <164980316@qq.com>, 2019
#
msgid ""
msgstr ""
"Project-Id-Version: Embuary Helper\n"
"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
"PO-Revision-Date: 2019-09-04 11:35+0000\n"
"Last-Translator: Noisy✘ <164980316@qq.com>, 2019\n"
"Language-Team: Chinese (China) (https://www.transifex.com/sualfred/teams/80018/zh_CN/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: zh_CN\n"
"Plural-Forms: nplurals=1; plural=0;\n"
msgctxt "#32000"
msgid "Error"
msgstr "错误"
msgctxt "#32001"
msgid ""
"This is a tool to provide features to a skin and requires skin integration."
msgstr "这是一个为皮肤提供特性的插件,需要皮肤集成。"
#: /resources/settings.xml
msgctxt "#32002"
msgid "(Get a free API key on www.omdbapi.com)"
msgstr "在www.omdbapi.com上获取免费的api密钥"
#: /resources/settings.xml
msgctxt "#32003"
msgid "Certification country"
msgstr "认证的国家"
#: /resources/lib/tmdb.py
msgctxt "#32019"
msgid "No information found"
msgstr "未找到任何信息"
#: /resources/lib/utils.py
msgctxt "#32022"
msgid "Invalid TheMovieDB API key"
msgstr "无效的TheMovieDB API密钥"
#: /default.py
msgctxt "#32004"
msgid "Person"
msgstr "人物"
#: /default.py
msgctxt "#32005"
msgid "Search for"
msgstr "搜索"
#: /resources/skins/default/1080i/script-embuary-person.xml
msgctxt "#32006"
msgid "Age"
msgstr "年龄"
#: /resources/skins/default/1080i/script-embuary-person.xml
msgctxt "#32007"
msgid "Place of birth"
msgstr "出生地"
#: /resources/skins/default/1080i/script-embuary-person.xml
msgctxt "#32008"
msgid "Facts"
msgstr "事实"
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32009"
msgid "Similar"
msgstr "类似"
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32010"
msgid "Images"
msgstr "图像"
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32011"
msgid "Premiered"
msgstr "首映"
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32012"
msgid "Retail"
msgstr "零售"
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32013"
msgid "Budget"
msgstr "预算"
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32014"
msgid "Revenue"
msgstr "票房"
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32015"
msgid "Awards"
msgstr "获得奖项"
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32016"
msgid "Seasons"
msgstr "季"
#: /resources/skins/default/1080i/script-embuary-person.xml
msgctxt "#32017"
msgid "Known for"
msgstr "以"
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32018"
msgid "Crew"
msgstr "剧组人员"
#: /resources/settings.xml
msgctxt "#32023"
msgid "API key"
msgstr "API密钥"
#: /resources/settings.xml
msgctxt "#32020"
msgid "Caching"
msgstr "缓存"
#: /resources/settings.xml
msgctxt "#32021"
msgid "Enable caching of fetched data"
msgstr "启用获取数据的缓存"
#: /resources/settings.xml
msgctxt "#32024"
msgid "Default language"
msgstr "默认语言"
#: /resources/skins/default/1080i/script-embuary-person.xml
msgctxt "#32025"
msgid "items in your library"
msgstr "库中的项目"
#: /resources/settings.xml
msgctxt "#32026"
msgid "Misc."
msgstr "杂项"
#: /resources/settings.xml
msgctxt "#32027"
msgid "Hide person appearances in reality/talk/news shows"
msgstr "隐藏真人秀/谈话/新闻节目的演职人员"
#: /resources/settings.xml
msgctxt "#32028"
msgid ""
"Hide person appearances in specials/documentaries/behind the scenes movies"
msgstr "在特辑/纪录片/幕后电影中隐藏人物形象"
#: /resources/lib/listing.py
msgctxt "#32029"
msgid "Top rated movies"
msgstr "最高评分电影"
#: /resources/lib/listing.py
msgctxt "#32030"
msgid "Now playing movies"
msgstr "正在播放的电影"
#: /resources/lib/listing.py
msgctxt "#32031"
msgid "Upcoming movies"
msgstr "即将上映的电影"
#: /resources/lib/listing.py
msgctxt "#32032"
msgid "Popular movies"
msgstr "热门电影"
#: /resources/lib/listing.py
msgctxt "#32033"
msgid "Top rated TV shows"
msgstr "收视率最高的电视节目"
#: /resources/lib/listing.py
msgctxt "#32034"
msgid "Popular TV shows"
msgstr "热门电视节目"
#: /resources/lib/listing.py
msgctxt "#32035"
msgid "TV shows airing today"
msgstr "今天播出的电视节目"
#: /resources/lib/listing.py
msgctxt "#32036"
msgid "TV shows airing in the next 7 days"
msgstr "未来7天播出的电视节目"
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32037"
msgid "Collection"
msgstr "合集"
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32039"
msgid "Guest stars"
msgstr "客串明星"
#: /resources/skins/default/1080i/script-embuary-video.xml
msgctxt "#32040"
msgid "Season"
msgstr "季"
#: /plugin.py
msgctxt "#32038"
msgid "Widgets"
msgstr "小部件"
#: /resources/settings.xml
msgctxt "#32041"
msgid "Hide items from similar movies if they are part of the collection"
msgstr "隐藏类似影片中的项目(如果这些项目是合集的一部分)"
#: /resources/lib/widgets.py
msgctxt "#32042"
msgid "Trending movies"
msgstr "热门电影"
#: /resources/lib/widgets.py
msgctxt "#32043"
msgid "Trending shows"
msgstr "热门节目"

View File

@@ -0,0 +1,310 @@
#!/usr/bin/python
# coding: utf-8
########################
import xbmc
import xbmcaddon
import xbmcgui
import xbmcplugin
import json
import time
import datetime
import os
import operator
import arrow
import sys
import simplecache
import hashlib
########################
ADDON = xbmcaddon.Addon()
ADDON_ID = ADDON.getAddonInfo('id')
ADDON_VERSION = ADDON.getAddonInfo('version')
ADDON_PATH = ADDON.getAddonInfo('path')
INFO = xbmc.LOGINFO
WARNING = xbmc.LOGWARNING
DEBUG = xbmc.LOGDEBUG
ERROR = xbmc.LOGERROR
DIALOG = xbmcgui.Dialog()
COUNTRY_CODE = ADDON.getSettingString('country_code')
DEFAULT_LANGUAGE = ADDON.getSettingString('language_code')
FALLBACK_LANGUAGE = 'en'
CACHE = simplecache.SimpleCache()
CACHE.enable_mem_cache = False
CACHE.data_is_json = True
CACHE_ENABLED = ADDON.getSettingBool('cache_enabled')
CACHE_PREFIX = ADDON_ID + '_' + ADDON_VERSION + '_' + DEFAULT_LANGUAGE + COUNTRY_CODE + '_'
#TIMEZONE = 'US/Alaska'
TIMEZONE = 'local'
########################
def log(txt,loglevel=DEBUG,json=False,force=False):
if force:
loglevel = INFO
if json:
txt = json_prettyprint(txt)
message = u'[ %s ] %s' % (ADDON_ID,txt)
xbmc.log(msg=message, level=loglevel)
def get_cache(key):
if CACHE_ENABLED:
return CACHE.get(CACHE_PREFIX + key)
def write_cache(key,data,cache_time=336):
if data:
CACHE.set(CACHE_PREFIX + key, data, expiration=datetime.timedelta(hours=cache_time))
def format_currency(integer):
try:
integer = int(integer)
if integer < 1:
raise Exception
return '{:,.0f}'.format(integer)
except Exception:
return ''
def sort_dict(items,key,reverse=False):
''' Dummy date to always add planned or rumored items at the end of the list
if no release date is available yet.
'''
for item in items:
if not item.get(key):
if not reverse:
item[key] = '2999-01-01'
else:
item[key] = '1900-01-01'
return sorted(items, key=operator.itemgetter(key),reverse=reverse)
def remove_quotes(label):
if not label:
return ''
if label.startswith("'") and label.endswith("'") and len(label) > 2:
label = label[1:-1]
if label.startswith('"') and label.endswith('"') and len(label) > 2:
label = label[1:-1]
return label
def get_date(date_time):
date_time_obj = datetime.datetime.strptime(date_time, '%Y-%m-%d %H:%M:%S')
date_obj = date_time_obj.date()
return date_obj
def execute(cmd):
xbmc.executebuiltin(cmd)
def condition(condition):
return xbmc.getCondVisibility(condition)
def busydialog(close=False):
if not close and not condition('Window.IsVisible(busydialognocancel)'):
execute('ActivateWindow(busydialognocancel)')
elif close:
execute('Dialog.Close(busydialognocancel)')
def textviewer(params):
DIALOG.textviewer(remove_quotes(params.get('header', '')), remove_quotes(params.get('message', '')))
def winprop(key,value=None,clear=False,window_id=10000):
window = xbmcgui.Window(window_id)
if clear:
window.clearProperty(key.replace('.json', '').replace('.bool', ''))
elif value is not None:
if key.endswith('.json'):
key = key.replace('.json', '')
value = json.dumps(value)
elif key.endswith('.bool'):
key = key.replace('.bool', '')
value = 'true' if value else 'false'
window.setProperty(key, value)
else:
result = window.getProperty(key.replace('.json', '').replace('.bool', ''))
if result:
if key.endswith('.json'):
result = json.loads(result)
elif key.endswith('.bool'):
result = result in ('true', '1')
return result
def date_year(value):
if not value:
return value
try:
year = str(arrow.get(value).year)
except Exception:
pass
return year
def date_format(value,date='short'):
if not value:
return value
try:
date_time = arrow.get(value)
value = date_time.strftime(xbmc.getRegion('date%s' % date))
except Exception:
pass
return value
def date_delta(date):
date = arrow.get(date, 'YYYY-MM-DD').date()
return date - datetime.date.today()
def date_weekday(date=None):
if not date:
utc = arrow.utcnow()
date = utc.to(TIMEZONE).date()
try:
weekdays = (xbmc.getLocalizedString(11), xbmc.getLocalizedString(12), xbmc.getLocalizedString(13), xbmc.getLocalizedString(14), xbmc.getLocalizedString(15), xbmc.getLocalizedString(16), xbmc.getLocalizedString(17))
date = arrow.get(date).date()
weekday = date.weekday()
return weekdays[weekday], weekday
except Exception:
return '', ''
def utc_to_local(value):
conv_date = arrow.get(value).to(TIMEZONE)
conv_date_str = conv_date.strftime('%Y-%m-%d')
if xbmc.getRegion('time').startswith('%I'):
conv_time_str = conv_date.strftime('%I:%M %p')
else:
conv_time_str = conv_date.strftime('%H:%M')
return conv_date_str, conv_time_str
def get_bool(value,string='true'):
try:
if value.lower() == string:
return True
raise Exception
except Exception:
return False
def get_joined_items(item):
if len(item) > 0:
item = ' / '.join(item)
else:
item = ''
return item
def get_first_item(item):
if len(item) > 0:
item = item[0]
else:
item = ''
return item
def json_call(method,properties=None,sort=None,query_filter=None,limit=None,params=None,item=None,options=None,limits=None):
json_string = {'jsonrpc': '2.0', 'id': 1, 'method': method, 'params': {}}
if properties is not None:
json_string['params']['properties'] = properties
if limit is not None:
json_string['params']['limits'] = {'start': 0, 'end': int(limit)}
if sort is not None:
json_string['params']['sort'] = sort
if query_filter is not None:
json_string['params']['filter'] = query_filter
if options is not None:
json_string['params']['options'] = options
if limits is not None:
json_string['params']['limits'] = limits
if item is not None:
json_string['params']['item'] = item
if params is not None:
json_string['params'].update(params)
json_string = json.dumps(json_string)
result = xbmc.executeJSONRPC(json_string)
''' Python 2 compatibility
'''
try:
result = unicode(result, 'utf-8', errors='ignore')
except NameError:
pass
return json.loads(result)
def set_plugincontent(content=None,category=None):
if category:
xbmcplugin.setPluginCategory(int(sys.argv[1]), category)
if content:
xbmcplugin.setContent(int(sys.argv[1]), content)
def json_prettyprint(string):
return json.dumps(string, sort_keys=True, indent=4, separators=(',', ': '))
def urljoin(*args):
''' Joins given arguments into an url. Trailing but not leading slashes are
stripped for each argument.
'''
arglist = [arg for arg in args if arg is not None]
return '/'.join(map(lambda x: str(x).rstrip('/'), arglist))
def md5hash(value):
value = str(value).encode()
return hashlib.md5(value).hexdigest()

View File

@@ -0,0 +1,58 @@
#!/usr/bin/python
# coding: utf-8
########################
import json
import sys
import requests
from resources.lib.helper import *
########################
def get_local_media(force=False):
local_media = get_cache('local_db')
if not local_media or force:
local_media = {}
local_media['shows'] = query_local_media('tvshow',
get='VideoLibrary.GetTVShows',
properties=['title', 'originaltitle', 'year', 'playcount', 'episode', 'watchedepisodes', 'uniqueid', 'art']
)
local_media['movies'] = query_local_media('movie',
get='VideoLibrary.GetMovies',
properties=['title', 'originaltitle', 'year', 'uniqueid', 'playcount', 'file', 'art']
)
if local_media:
write_cache('local_db', local_media, 24)
return local_media
def query_local_media(dbtype,get,properties):
items = json_call(get,properties,sort={'order': 'descending', 'method': 'year'})
try:
items = items['result']['%ss' % dbtype]
except Exception:
return
local_items = []
for item in items:
local_items.append({'title': item.get('title', ''),
'originaltitle': item.get('originaltitle', ''),
'imdbnumber': item.get('uniqueid', {}).get('imdb', ''),
'tmdbid': item.get('uniqueid', {}).get('tmdb', ''),
'tvdbid': item.get('uniqueid', {}).get('tvdb', ''),
'year': item.get('year', ''),
'dbid': item.get('%sid' % dbtype, ''),
'playcount': item.get('playcount', ''),
'episodes': item.get('episode', ''),
'watchedepisodes': item.get('watchedepisodes', ''),
'file': item.get('file', ''),
'art': item.get('art', {})}
)
return local_items

View File

@@ -0,0 +1,563 @@
#!/usr/bin/python
# coding: utf-8
########################
import sys
import xbmc
import xbmcgui
from resources.lib.helper import *
from resources.lib.tmdb import *
from resources.lib.person import *
from resources.lib.video import *
from resources.lib.season import *
from resources.lib.localdb import *
########################
class TheMovieDB(object):
def __init__(self,call,params):
self.monitor = xbmc.Monitor()
self.window_stack = []
self.dialog_cache = {}
self.call = call
self.tmdb_id = params.get('tmdb_id')
self.season = params.get('season')
self.query = remove_quotes(params.get('query'))
self.query_year = params.get('year')
self.exact_search = True if params.get('exact') == 'true' else False
self.external_id = params.get('external_id')
self.dbid = params.get('dbid')
if self.call == 'tv':
self.dbtype = 'tvshow'
elif self.call == 'movie':
self.dbtype = 'movie'
winprop('script.embuary.info-language_code', DEFAULT_LANGUAGE)
winprop('script.embuary.info-country_code', COUNTRY_CODE)
busydialog()
if self.dbid and self.dbtype:
self.tmdb_id = self.find_id(method='dbid')
elif self.external_id:
self.tmdb_id = self.find_id(method='external_id')
elif self.query:
self.tmdb_id = self.find_id(method='query')
if self.tmdb_id:
self.call_params = {}
local_media = get_local_media()
self.call_params['local_shows'] = local_media['shows']
self.call_params['local_movies'] = local_media['movies']
self.entry_point()
busydialog(close=True)
''' Search for tmdb_id based one a query string or external ID (IMDb or TVDb)
'''
def find_id(self,method):
if method == 'dbid':
method_details = 'VideoLibrary.Get%sDetails' % self.dbtype
param = '%sid' % self.dbtype
key_details = '%sdetails' % self.dbtype
dbinfo = json_call(method_details,
properties=['uniqueid', 'year', 'title'],
params={param: int(self.dbid)}
)
try:
dbinfo = dbinfo['result'][key_details]
except KeyError:
return
uniqueid = dbinfo.get('uniqueid', {})
result = None
for item in uniqueid:
if uniqueid[item].startswith('tt'):
result = tmdb_find(self.call, uniqueid[item])
break
elif self.dbtype == 'tvshow' and item.lower() == 'tvdb' and uniqueid[item]:
result = tmdb_find(self.call, uniqueid[item])
break
if not result:
self.query = dbinfo.get('title')
self.query_year = dbinfo.get('year', '')
tmdb_id = self.find_id(method='query')
return tmdb_id
elif method == 'external_id':
result = tmdb_find(self.call, self.external_id)
if not result and self.query:
self.find_id(method='query')
elif method == 'query':
if ' / ' in self.query:
query_values = self.query.split(' / ')
position = tmdb_select_dialog_small(query_values)
if position < 0:
return ''
else:
self.query = query_values[position]
result = tmdb_search(self.call, self.query, self.query_year)
if self.exact_search:
exact_results = []
for item in result:
title = item.get('title') or item.get('name') or ''
original_title = item.get('original_title') or item.get('original_name') or ''
if title.lower() == self.query.lower() or original_title.lower() == self.query.lower():
if self.query_year:
premiered = item.get('first_air_date', '') if self.call == 'tv' else item.get('release_date', '')
if self.query_year == premiered[:-6]:
exact_results.append(item)
else:
exact_results.append(item)
if exact_results:
result = exact_results
else:
return ''
try:
if len(result) > 1:
position = tmdb_select_dialog(result, self.call)
if position < 0:
raise Exception
else:
position = 0
tmdb_id = result[position]['id']
except Exception:
return ''
return tmdb_id
''' Collect all data by the tmdb_id and build the dialogs.
'''
def entry_point(self):
self.call_params['call'] = self.call
self.call_params['tmdb_id'] = self.tmdb_id
self.call_params['season'] = self.season
self.request = self.call + str(self.tmdb_id)
busydialog()
if self.call == 'person':
dialog = self.fetch_person()
elif self.call == 'tv' and self.season:
dialog = self.fetch_season()
elif self.call == 'movie' or self.call == 'tv':
dialog = self.fetch_video()
busydialog(close=True)
''' Open next dialog if information has been found. If not open the previous dialog again.
'''
if dialog:
self.dialog_cache[self.request] = dialog
self.dialog_manager(dialog)
elif self.window_stack:
self.dialog_history()
else:
self.quit()
def fetch_person(self):
data = TMDBPersons(self.call_params)
if not data['person']:
return
dialog = DialogPerson('script-embuary-person.xml', ADDON_PATH, 'default', '1080i',
person=data['person'],
movies=data['movies'],
tvshows=data['tvshows'],
combined=data['combined'],
images=data['images'],
tmdb_id=self.tmdb_id
)
return dialog
def fetch_video(self):
data = TMDBVideos(self.call_params)
if not data['details']:
return
dialog = DialogVideo('script-embuary-video.xml', ADDON_PATH, 'default', '1080i',
details=data['details'],
cast=data['cast'],
crew=data['crew'],
similar=data['similar'],
youtube=data['youtube'],
backdrops=data['backdrops'],
posters=data['posters'],
collection=data['collection'],
seasons=data['seasons'],
tmdb_id=self.tmdb_id
)
return dialog
def fetch_season(self):
data = TMDBSeasons(self.call_params)
if not data['details']:
return
dialog = DialogSeason('script-embuary-video.xml', ADDON_PATH, 'default', '1080i',
details=data['details'],
cast=data['cast'],
gueststars=data['gueststars'],
posters=data['posters'],
tmdb_id=self.tmdb_id
)
return dialog
''' Dialog handler. Creates the window history, reopens dialogs from a stack
or cache and is responsible for keeping the script alive.
'''
def dialog_manager(self,dialog):
dialog.doModal()
try:
next_id = dialog['id']
next_call = dialog['call']
next_season = dialog['season']
if next_call == 'youtube':
while condition('Player.HasMedia | Window.IsVisible(busydialog) | Window.IsVisible(busydialognocancel) | Window.IsVisible(okdialog)') and not self.monitor.abortRequested():
self.monitor.waitForAbort(1)
# reopen dialog after playback ended
self.dialog_manager(dialog)
if next_call == 'back':
self.dialog_history()
if next_call == 'close':
raise Exception
if not next_id or not next_call:
raise Exception
self.window_stack.append(dialog)
self.tmdb_id = next_id
self.call = next_call
self.season = next_season
self.request = next_call + str(next_id) + str(next_season)
if self.dialog_cache.get(self.request):
dialog = self.dialog_cache[self.request]
self.dialog_manager(dialog)
else:
self.entry_point()
except Exception:
self.quit()
def dialog_history(self):
if self.window_stack:
dialog = self.window_stack.pop()
self.dialog_manager(dialog)
else:
self.quit()
def quit(self):
del self.call_params
del self.window_stack
del self.dialog_cache
quit()
''' Person dialog
'''
class DialogPerson(xbmcgui.WindowXMLDialog):
def __init__(self,*args,**kwargs):
self.first_load = True
self.action = {}
self.tmdb_id = kwargs['tmdb_id']
self.person = kwargs['person']
self.movies = kwargs['movies']
self.tvshows = kwargs['tvshows']
self.combined = kwargs['combined']
self.images = kwargs['images']
def __getitem__(self,key):
return self.action[key]
def __setitem__(self,key,value):
self.action[key] = value
def onInit(self):
execute('ClearProperty(script.embuary.info-nextcall,home)')
if self.first_load:
self.add_items()
def add_items(self):
self.first_load = False
index = 10051
li = [self.person, self.movies, self.tvshows, self.images, self.combined]
for items in li:
try:
clist = self.getControl(index)
clist.addItems(items)
except RuntimeError as error:
log('Control with id %s cannot be filled. Error --> %s' % (str(index), error), DEBUG)
pass
index += 1
def onAction(self,action):
if action.getId() in [92,10]:
self.action['id'] = ''
self.action['season'] = ''
self.action['call'] = 'back' if action.getId() == 92 else 'close'
self.quit()
def onClick(self,controlId):
next_id = xbmc.getInfoLabel('Container(%s).ListItem.Property(id)' % controlId)
next_call = xbmc.getInfoLabel('Container(%s).ListItem.Property(call)' % controlId)
if next_call in ['person','movie','tv'] and next_id:
self.action['id'] = next_id
self.action['call'] = next_call
self.action['season'] = ''
self.quit()
elif next_call == 'image':
FullScreenImage(controlId)
def quit(self):
close_action = self.getProperty('onclose')
onnext_action = self.getProperty('onnext')
onback_action = self.getProperty('onback_%s' % self.getFocusId())
if self.action.get('call') and self.action.get('id'):
execute('SetProperty(tmdb_next_call,true,home)')
if onnext_action:
execute(onnext_action)
if self.action.get('call') == 'back' and onback_action:
execute(onback_action)
else:
if close_action:
execute(close_action)
self.close()
''' Show & movie dialog
'''
class DialogVideo(xbmcgui.WindowXMLDialog):
def __init__(self,*args,**kwargs):
self.first_load = True
self.action = {}
self.tmdb_id = kwargs['tmdb_id']
self.details = kwargs['details']
self.cast = kwargs['cast']
self.crew = kwargs['crew']
self.similar = kwargs['similar']
self.youtube = kwargs['youtube']
self.backdrops = kwargs['backdrops']
self.posters = kwargs['posters']
self.seasons = kwargs['seasons']
self.collection = kwargs['collection']
def __getitem__(self,key):
return self.action[key]
def __setitem__(self,key,value):
self.action[key] = value
def onInit(self):
execute('ClearProperty(script.embuary.info-nextcall,home)')
if self.first_load:
self.add_items()
def add_items(self):
self.first_load = False
index = 10051
li = [self.details, self.cast, self.similar, self.youtube, self.backdrops, self.crew, self.collection, self.seasons, self.posters]
for items in li:
try:
clist = self.getControl(index)
clist.addItems(items)
except RuntimeError as error:
log('Control with id %s cannot be filled. Error --> %s' % (str(index), error), DEBUG)
pass
index += 1
def onAction(self,action):
if action.getId() in [92,10]:
self.action['id'] = ''
self.action['season'] = ''
self.action['call'] = 'back' if action.getId() == 92 else 'close'
self.quit()
def onClick(self,controlId):
next_id = xbmc.getInfoLabel('Container(%s).ListItem.Property(id)' % controlId)
next_call = xbmc.getInfoLabel('Container(%s).ListItem.Property(call)' % controlId)
next_season = xbmc.getInfoLabel('Container(%s).ListItem.Property(call_season)' % controlId)
if next_call in ['person','movie','tv'] and next_id:
if next_id != str(self.tmdb_id) or next_season:
self.action['id'] = next_id
self.action['call'] = next_call
self.action['season'] = next_season
self.quit()
elif next_call == 'image':
FullScreenImage(controlId)
elif next_call == 'youtube':
self.action['id'] = ''
self.action['season'] = ''
self.action['call'] = 'youtube'
xbmc.Player().play('plugin://plugin.video.youtube/play/?video_id=%s' % xbmc.getInfoLabel('Container(%s).ListItem.Property(ytid)' % controlId))
self.quit()
def quit(self):
close_action = self.getProperty('onclose')
onnext_action = self.getProperty('onnext')
onback_action = self.getProperty('onback_%s' % self.getFocusId())
if self.action.get('call') and self.action.get('id'):
execute('SetProperty(script.embuary.info-nextcall,true,home)')
if onnext_action:
execute(onnext_action)
if self.action.get('call') == 'back' and onback_action:
execute(onback_action)
else:
if close_action:
execute(close_action)
self.close()
''' Season dialog
'''
class DialogSeason(xbmcgui.WindowXMLDialog):
def __init__(self,*args,**kwargs):
self.first_load = True
self.action = {}
self.tmdb_id = kwargs['tmdb_id']
self.details = kwargs['details']
self.cast = kwargs['cast']
self.gueststars = kwargs['gueststars']
self.posters = kwargs['posters']
def __getitem__(self,key):
return self.action[key]
def __setitem__(self,key,value):
self.action[key] = value
def onInit(self):
execute('ClearProperty(script.embuary.info-nextcall,home)')
if self.first_load:
self.add_items()
def add_items(self):
self.first_load = False
index = [10051, 10052, 10056, 10059]
li = [self.details, self.cast, self.gueststars, self.posters]
for items in li:
try:
clist = self.getControl(index[li.index(items)])
clist.addItems(items)
except RuntimeError as error:
log('Control with id %s cannot be filled. Error --> %s' % (str(index[li.index(items)]), error), DEBUG)
pass
def onAction(self,action):
if action.getId() in [92,10]:
self.action['id'] = ''
self.action['season'] = ''
self.action['call'] = 'back' if action.getId() == 92 else 'close'
self.quit()
def onClick(self,controlId):
next_id = xbmc.getInfoLabel('Container(%s).ListItem.Property(id)' % controlId)
next_call = xbmc.getInfoLabel('Container(%s).ListItem.Property(call)' % controlId)
if next_call in ['person'] and next_id:
self.action['id'] = next_id
self.action['call'] = next_call
self.action['season'] = ''
self.quit()
elif next_call == 'image':
FullScreenImage(controlId)
def quit(self):
close_action = self.getProperty('onclose')
onnext_action = self.getProperty('onnext')
onback_action = self.getProperty('onback_%s' % self.getFocusId())
if self.action.get('call') and self.action.get('id'):
execute('SetProperty(script.embuary.info-nextcall,true,home)')
if onnext_action:
execute(onnext_action)
if self.action.get('call') == 'back' and onback_action:
execute(onback_action)
else:
if close_action:
execute(close_action)
self.close()
''' Slideshow dialog
'''
class FullScreenImage(object):
def __init__(self,controlId):
slideshow = []
for i in range(int(xbmc.getInfoLabel('Container(%s).NumItems' % controlId))):
slideshow.append(xbmc.getInfoLabel('Container(%s).ListItemAbsolute(%s).Art(thumb)' % (controlId,i)))
dialog = self.ShowImage('script-embuary-image.xml', ADDON_PATH, 'default', '1080i', slideshow=slideshow, position=xbmc.getInfoLabel('Container(%s).CurrentItem' % controlId))
dialog.doModal()
del dialog
class ShowImage(xbmcgui.WindowXMLDialog):
def __init__(self,*args,**kwargs):
self.position = int(kwargs['position']) - 1
self.slideshow = list()
for item in kwargs['slideshow']:
list_item = xbmcgui.ListItem(label='')
list_item.setArt({'icon': item})
self.slideshow.append(list_item)
def onInit(self):
self.cont = self.getControl(1)
self.cont.addItems(self.slideshow)
self.cont.selectItem(self.position)
self.setFocusId(2)

View File

@@ -0,0 +1,136 @@
#!/usr/bin/python
# coding: utf-8
########################
import requests
from resources.lib.helper import *
from resources.lib.tmdb import *
from resources.lib.trakt import *
from resources.lib.localdb import *
########################
class NextAired():
def __init__(self):
utc_date = arrow.utcnow()
local_date = utc_date.to(TIMEZONE)
self.date_today = utc_date.strftime('%Y-%m-%d')
local_media = get_local_media()
self.local_media = local_media['shows']
if self.local_media:
for item in self.local_media:
del item['playcount']
del item['watchedepisodes']
cache_key = 'nextaired_' + self.date_today + '_' + md5hash(self.local_media)
self.airing_items = get_cache(cache_key)
if not self.airing_items:
self.valid_days = []
tmp_day = local_date
for i in range(7):
self.valid_days.append(tmp_day.strftime('%Y-%m-%d'))
tmp_day = tmp_day.shift(days=1)
airing_items = {}
airing_items['week'] = []
airing_items['0'] = []
airing_items['1'] = []
airing_items['2'] = []
airing_items['3'] = []
airing_items['4'] = []
airing_items['5'] = []
airing_items['6'] = []
self.airing_items = airing_items
self.getdata()
if self.airing_items:
write_cache(cache_key, self.airing_items, 24)
def get(self,day=None):
if day is not None and day in self.airing_items:
return self.airing_items[day]
else:
return self.airing_items['week']
def getdata(self):
if not self.local_media:
return
local_media_data = []
for item in self.local_media:
local_media_data.append([item.get('tmdbid'), item.get('tvdbid'), item.get('imdbnumber'), item.get('art'), item.get('title'), item.get('originaltitle'), item.get('year')])
trakt_results = trakt_api('/calendars/all/shows/' + self.date_today + '/8?extended=full&countries=' + COUNTRY_CODE.lower() + '%2Cus')
if trakt_results:
for item in trakt_results:
airing_date, airing_time = utc_to_local(item.get('first_aired'))
weekday, weekday_code = date_weekday(airing_date)
''' Because Trakt is using UTC dates it's possible that the airing item is already in the past
for some timezones. Let's compare the converted airing date and only pick the ones for the
users timezone.
'''
if airing_date not in self.valid_days:
continue
show = item.get('show', {})
episode = item.get('episode', {})
tvshowtitle = show.get('title')
network = show.get('network')
country = show.get('country')
status = show.get('status')
runtime = episode.get('runtime') * 60 if episode.get('runtime') else 0
year = show.get('year')
tmdb_id = show.get('ids', {}).get('tmdb')
tvdb_id = show.get('ids', {}).get('tvdb')
imdb_id = show.get('ids', {}).get('imdb')
tvdb_id_episode = episode.get('ids', {}).get('tvdb')
tmdb_id_episode = episode.get('ids', {}).get('tmdb')
season_nr = episode.get('season')
episode_nr = episode.get('number')
for i in local_media_data:
if str(tmdb_id) == i[0] or str(tvdb_id) == i[1] or str(imdb_id) == i[2] or (tvshowtitle in [i[4], i[5]] and year == i[6]):
episode_cache_key = 'nextaired_tmdb_episode_' + COUNTRY_CODE + '_' + str(tmdb_id_episode)
episode_query = get_cache(episode_cache_key)
if not episode_query:
episode_query = tmdb_query(action='tv',
call=tmdb_id,
get='season',
get2=season_nr,
get3='episode',
get4=episode_nr,
params={'append_to_response': 'translations'}
)
if episode_query:
write_cache(episode_cache_key, episode_query, 48)
if episode_query:
episode_query['localart'] = i[3]
episode_query['showtitle'] = i[4] or i[5]
episode_query['airing'] = airing_date
episode_query['airing_time'] = airing_time
episode_query['weekday'] = weekday
episode_query['weekday_code'] = weekday_code
episode_query['network'] = network
episode_query['country'] = country
episode_query['status'] = status
episode_query['runtime'] = runtime
episode_query['show_id'] = tmdb_id
episode_query['overview'] = tmdb_fallback_info(episode_query, 'overview')
episode_query['name'] = tmdb_fallback_info(episode_query, 'name')
self.airing_items['week'].append(episode_query)
self.airing_items[str(weekday_code)].append(episode_query)
break

View File

@@ -0,0 +1,84 @@
#!/usr/bin/python
# coding: utf-8
########################
import json
import sys
import requests
import xml.etree.ElementTree as ET
from resources.lib.helper import *
########################
OMDB_API_KEY = ADDON.getSettingString('omdb_api_key')
########################
def omdb_api(imdbnumber=None,title=None,year=None,content_type=None):
if imdbnumber:
url = 'http://www.omdbapi.com/?apikey=%s&i=%s&plot=short&r=xml&tomatoes=true' % (OMDB_API_KEY, imdbnumber)
elif title and year and content_type:
# urllib has issues with some asian letters
try:
title = urllib.quote(title)
except KeyError:
return
url = 'http://www.omdbapi.com/?apikey=%s&t=%s&year=%s&plot=short&r=xml&tomatoes=true' % (OMDB_API_KEY, title, year)
else:
return
omdb = get_cache(url)
if omdb:
return omdb
elif OMDB_API_KEY:
omdb = {}
for i in range(1,4): # loop if heavy server load
try:
request = requests.get(url, timeout=5)
if not request.ok:
raise Exception(str(request.status_code))
result = request.text
tree = ET.ElementTree(ET.fromstring(result))
root = tree.getroot()
for child in root:
# imdb ratings
omdb['imdbRating'] = child.get('imdbRating', '').replace('N/A', '')
omdb['imdbVotes'] = child.get('imdbVotes', '0').replace('N/A', '0').replace(',', '')
# regular rotten rating
omdb['tomatometerallcritics'] = child.get('tomatoMeter', '').replace('N/A', '')
omdb['tomatometerallcritics_avg'] = child.get('tomatoRating', '').replace('N/A', '')
omdb['tomatometerallcritics_votes'] = child.get('tomatoReviews', '0').replace('N/A', '0').replace(',', '')
# user rotten rating
omdb['tomatometerallaudience'] = child.get('tomatoUserMeter', '').replace('N/A', '')
omdb['tomatometerallaudience_avg'] = child.get('tomatoUserRating', '').replace('N/A', '')
omdb['tomatometerallaudience_votes'] = child.get('tomatoUserReviews', '0').replace('N/A', '0').replace(',', '')
# metacritic
omdb['metacritic'] = child.get('metascore', '').replace('N/A', '')
# other
omdb['awards'] = child.get('awards', '').replace('N/A', '')
omdb['DVD'] = date_format(child.get('DVD', '').replace('N/A', ''), scheme='DD MMM YYYY')
except Exception as error:
log('OMDB Error: %s' % error)
pass
else:
write_cache(url,omdb)
break
return omdb

View File

@@ -0,0 +1,172 @@
#!/usr/bin/python
# coding: utf-8
########################
import sys
import xbmc
import xbmcgui
from resources.lib.helper import *
from resources.lib.tmdb import *
########################
FILTER_MOVIES = ADDON.getSettingBool('filter_movies')
FILTER_SHOWS = ADDON.getSettingBool('filter_shows')
FILTER_SHOWS_BLACKLIST = [10763, 10764, 10767]
FILTER_UPCOMING = ADDON.getSettingBool('filter_upcoming')
FILTER_DAYDELTA = int(ADDON.getSetting('filter_daydelta'))
########################
class TMDBPersons(object):
def __init__(self,call_request):
self.tmdb_id = call_request['tmdb_id']
self.local_movies = call_request['local_movies']
self.local_shows = call_request['local_shows']
self.result = {}
if self.tmdb_id:
cache_key = 'person' + str(self.tmdb_id)
self.details = get_cache(cache_key)
if not self.details:
self.details = tmdb_query(action='person',
call=self.tmdb_id,
params={'append_to_response': 'translations,movie_credits,tv_credits,images'},
show_error=True
)
write_cache(cache_key, self.details)
if not self.details:
return
self.local_movie_count = 0
self.local_tv_count = 0
self.all_credits = list()
self.result['movies'] = self.get_movie_list()
self.result['tvshows'] = self.get_tvshow_list()
self.result['combined'] = self.get_combined_list()
self.result['person'] = self.get_person_details()
self.result['images'] = self.get_person_images()
def __getitem__(self,key):
return self.result.get(key, '')
def get_person_details(self):
li = list()
list_item = tmdb_handle_person(self.details)
list_item.setProperty('LocalMovies', str(self.local_movie_count))
list_item.setProperty('LocalTVShows', str(self.local_tv_count))
list_item.setProperty('LocalMedia', str(self.local_movie_count + self.local_tv_count))
li.append(list_item)
return li
def get_combined_list(self):
combined = sort_dict(self.all_credits, 'release_date', True)
li = list()
for item in combined:
if item['type'] == 'movie':
list_item, is_local = tmdb_handle_movie(item, self.local_movies)
elif item['type'] =='tvshow':
list_item, is_local = tmdb_handle_tvshow(item, self.local_shows)
li.append(list_item)
return li
def get_movie_list(self):
movies = self.details['movie_credits']['cast']
movies = sort_dict(movies, 'release_date', True)
li = list()
duplicate_handler = list()
for item in movies:
skip_movie = False
''' Filter to only show real movies and to skip documentaries / behind the scenes / etc
'''
if FILTER_MOVIES:
character = item.get('character')
if character:
for genre in item['genre_ids']:
if genre == 99 and ('himself' in character.lower() or 'herself' in character.lower()):
skip_movie = True
break
''' Filter to hide in production or rumored future movies
'''
if FILTER_UPCOMING:
diff = date_delta(item.get('release_date', '2900-01-01'))
if diff.days > FILTER_DAYDELTA:
skip_movie = True
if not skip_movie and item['id'] not in duplicate_handler:
list_item, is_local = tmdb_handle_movie(item, self.local_movies)
li.append(list_item)
duplicate_handler.append(item['id'])
item['type'] = 'movie'
if is_local:
self.local_movie_count += 1
self.all_credits.append(item)
return li
def get_tvshow_list(self):
tvshows = self.details['tv_credits']['cast']
tvshows = sort_dict(tvshows, 'first_air_date', True)
li = list()
duplicate_handler = list()
for item in tvshows:
skip_show = False
''' Filter to only show real TV series and to skip talk, reality or news shows
'''
if FILTER_SHOWS:
if not item['genre_ids']:
skip_show = True
else:
for genre in item['genre_ids']:
if genre in FILTER_SHOWS_BLACKLIST:
skip_show = True
break
''' Filter to hide in production or rumored future shows
'''
if FILTER_UPCOMING:
diff = date_delta(item.get('first_air_date', '2900-01-01'))
if diff.days > FILTER_DAYDELTA:
skip_show = True
if not skip_show and item['id'] not in duplicate_handler:
list_item, is_local = tmdb_handle_tvshow(item, self.local_shows)
li.append(list_item)
duplicate_handler.append(item['id'])
item['type'] = 'tvshow'
item['release_date'] = item['first_air_date']
if is_local:
self.local_tv_count += 1
self.all_credits.append(item)
return li
def get_person_images(self):
li = list()
for item in self.details['images']['profiles']:
list_item = tmdb_handle_images(item)
li.append(list_item)
return li

View File

@@ -0,0 +1,128 @@
#!/usr/bin/python
# coding: utf-8
########################
import sys
import xbmc
import xbmcgui
import requests
from resources.lib.helper import *
from resources.lib.tmdb import *
########################
class TMDBSeasons(object):
def __init__(self,call_request):
self.result = {}
self.tmdb_id = call_request['tmdb_id']
self.season = call_request['season']
if self.tmdb_id:
cache_key = 'season' + str(self.season) + str(self.tmdb_id)
self.details = get_cache(cache_key)
if not self.details:
self.details = tmdb_query(action='tv',
call=self.tmdb_id,
get='season',
get2=self.season,
params={'append_to_response': 'credits'},
show_error=True
)
if not self.details:
return
if DEFAULT_LANGUAGE != FALLBACK_LANGUAGE and not self.details['overview']:
fallback_details = tmdb_query(action='tv',
call=self.tmdb_id,
get='season',
get2=self.season,
use_language=False
)
self.details['overview'] = fallback_details.get('overview')
write_cache(cache_key,self.details)
self.tvshow_details = self.get_tvshow_details()
self.person_duplicate_handler = list()
self.result['details'] = self.get_details()
self.result['cast'] = self.get_cast()
self.result['gueststars'] = self.get_gueststars()
self.result['posters'] = self.get_images()
def __getitem__(self, key):
return self.result.get(key,'')
def get_tvshow_details(self):
tvshow_cache_key = 'tv' + str(self.tmdb_id)
tvshow_details = get_cache(tvshow_cache_key)
if not tvshow_details:
tvshow_details = tmdb_query(action='tv',
call=self.tmdb_id,
params={'append_to_response': 'release_dates,content_ratings,external_ids,credits,videos,translations,similar'}
)
write_cache(tvshow_cache_key,tvshow_details)
return tvshow_details
def get_details(self):
li = list()
list_item = tmdb_handle_season(self.details,self.tvshow_details,full_info=True)
li.append(list_item)
return li
def get_cast(self):
li = list()
for item in self.details['credits']['cast']:
item['label2'] = item.get('character','')
list_item = tmdb_handle_credits(item)
li.append(list_item)
self.person_duplicate_handler.append(item['id'])
return li
def get_gueststars(self):
li = list()
for episode in self.details['episodes']:
for item in episode['guest_stars']:
if item['id'] not in self.person_duplicate_handler and item['character']:
item['label2'] = item['character']
list_item = tmdb_handle_credits(item)
li.append(list_item)
self.person_duplicate_handler.append(item['id'])
return li
def get_images(self):
cache_key = 'images' + str(self.tmdb_id) + 'season' + str(self.season)
images = get_cache(cache_key)
li = list()
if not images:
images = tmdb_query(action='tv',
call=self.tmdb_id,
get='season',
get2=self.season,
get3='images',
params={'include_image_language': '%s,en,null' % DEFAULT_LANGUAGE}
)
write_cache(cache_key,images)
for item in images['posters']:
list_item = tmdb_handle_images(item)
li.append(list_item)
return li

View File

@@ -0,0 +1,646 @@
#!/usr/bin/python
# coding: utf-8
########################
import xbmc
import xbmcgui
import requests
import datetime
import urllib.request as urllib
from urllib.parse import urlencode
from resources.lib.helper import *
from resources.lib.omdb import *
from resources.lib.localdb import *
########################
API_KEY = ADDON.getSettingString('tmdb_api_key')
API_URL = 'https://api.themoviedb.org/3/'
IMAGEPATH = 'https://image.tmdb.org/t/p/original'
########################
def tmdb_query(action,call=None,get=None,get2=None,get3=None,get4=None,params=None,use_language=True,language=DEFAULT_LANGUAGE,show_error=False):
urlargs = {}
urlargs['api_key'] = API_KEY
if use_language:
urlargs['language'] = language
if params:
urlargs.update(params)
url = urljoin(API_URL ,action, call, get, get2, get3, get4)
url = '{0}?{1}'.format(url, urlencode(urlargs))
try:
request = None
for i in range(1,4): # loop if heavy server load
try:
request = requests.get(url, timeout=5)
if str(request.status_code).startswith('5'):
raise Exception(str(request.status_code))
else:
break
except Exception:
xbmc.sleep(500)
if not request or request.status_code == 404:
error = ADDON.getLocalizedString(32019)
raise Exception(error)
elif request.status_code == 401:
error = ADDON.getLocalizedString(32022)
raise Exception(error)
elif not request.ok:
raise Exception('Code ' + str(request.status_code))
result = request.json()
if show_error:
if len(result) == 0 or ('results' in result and not len(result['results']) == 0):
error = ADDON.getLocalizedString(32019)
raise Exception(error)
return result
except Exception as error:
log('%s --> %s' % (error, url), ERROR)
if show_error:
tmdb_error(error)
def tmdb_search(call,query,year=None,include_adult='false'):
if call == 'person':
params = {'query': query, 'include_adult': include_adult}
elif call == 'movie':
params = {'query': query, 'year': year, 'include_adult': include_adult}
elif call == 'tv':
params = {'query': query, 'first_air_date_year': year}
else:
return ''
result = tmdb_query(action='search',
call=call,
params=params)
try:
result = result.get('results')
if not result:
raise Exception
return result
except Exception:
tmdb_error(ADDON.getLocalizedString(32019))
def tmdb_find(call,external_id,error_check=True):
if external_id.startswith('tt'):
external_source = 'imdb_id'
else:
external_source = 'tvdb_id'
result = tmdb_query(action='find',
call=str(external_id),
params={'external_source': external_source},
use_language=False,
show_error=True
)
try:
if call == 'movie':
return result.get('movie_results')
else:
return result.get('tv_results')
except AttributeError:
return
def tmdb_select_dialog(list,call):
indexlist = []
selectionlist = []
if call == 'person':
default_img = 'DefaultActor.png'
img = 'profile_path'
label = 'name'
label2 = ''
elif call == 'movie':
default_img = 'DefaultVideo.png'
img = 'poster_path'
label = 'title'
label2 = 'tmdb_get_year(item.get("release_date", ""))'
elif call == 'tv':
default_img = 'DefaultVideo.png'
img = 'poster_path'
label = 'name'
label2 = 'first_air_date'
label2 = 'tmdb_get_year(item.get("first_air_date", ""))'
else:
return
index = 0
for item in list:
icon = IMAGEPATH + item[img] if item[img] is not None else ''
list_item = xbmcgui.ListItem(item[label])
list_item.setArt({'icon': default_img, 'thumb': icon})
try:
list_item.setLabel2(str(eval(label2)))
except Exception:
pass
selectionlist.append(list_item)
indexlist.append(index)
index += 1
busydialog(close=True)
selected = DIALOG.select(xbmc.getLocalizedString(424), selectionlist, useDetails=True)
if selected == -1:
return -1
busydialog()
return indexlist[selected]
def tmdb_select_dialog_small(list):
indexlist = []
selectionlist = []
index = 0
for item in list:
list_item = xbmcgui.ListItem(item)
selectionlist.append(list_item)
indexlist.append(index)
index += 1
busydialog(close=True)
selected = DIALOG.select(xbmc.getLocalizedString(424), selectionlist, useDetails=False)
if selected == -1:
return -1
busydialog()
return indexlist[selected]
def tmdb_calc_age(birthday,deathday=None):
if deathday is not None:
ref_day = deathday.split("-")
elif birthday:
date = datetime.date.today()
ref_day = [date.year, date.month, date.day]
else:
return ''
born = birthday.split('-')
age = int(ref_day[0]) - int(born[0])
if len(born) > 1:
diff_months = int(ref_day[1]) - int(born[1])
diff_days = int(ref_day[2]) - int(born[2])
if diff_months < 0 or (diff_months == 0 and diff_days < 0):
age -= 1
return age
def tmdb_error(message=ADDON.getLocalizedString(32019)):
busydialog(close=True)
DIALOG.ok(ADDON.getLocalizedString(32000), str(message))
def tmdb_studios(list_item,item,key):
if key == 'production':
key_name = 'production_companies'
prop_name = 'studio'
elif key == 'network':
key_name = 'networks'
prop_name = 'network'
else:
return
i = 0
for studio in item[key_name]:
icon = IMAGEPATH + studio['logo_path'] if studio['logo_path'] is not None else ''
if icon:
list_item.setProperty(prop_name + '.' + str(i), studio['name'])
list_item.setProperty(prop_name + '.icon.' + str(i), icon)
i += 1
def tmdb_check_localdb(local_items,title,originaltitle,year,imdbnumber=False):
found_local = False
local = {'dbid': -1, 'playcount': 0, 'watchedepisodes': '', 'episodes': '', 'unwatchedepisodes': '', 'file': ''}
if local_items:
for item in local_items:
dbid = item['dbid']
playcount = item['playcount']
episodes = item.get('episodes', '')
watchedepisodes = item.get('watchedepisodes', '')
file = item.get('file', '')
if imdbnumber and item['imdbnumber'] == imdbnumber:
found_local = True
break
try:
tmdb_year = int(tmdb_get_year(year))
item_year = int(item['year'])
if item_year == tmdb_year:
if item['originaltitle'] == originaltitle or item['title'] == originaltitle or item['title'] == title:
found_local = True
break
elif tmdb_year in [item_year-2, item_year-1, item_year+1, item_year+2]:
if item['title'] == title and item['originaltitle'] == originaltitle:
found_local = True
break
except ValueError:
pass
if found_local:
local['dbid'] = dbid
local['file'] = file
local['playcount'] = playcount
local['episodes'] = episodes
local['watchedepisodes'] = watchedepisodes
local['unwatchedepisodes'] = episodes - watchedepisodes if episodes else ''
return local
def tmdb_handle_person(item):
if item.get('gender') == 2:
gender = 'male'
elif item.get('gender') == 1:
gender = 'female'
else:
gender = ''
icon = IMAGEPATH + item['profile_path'] if item['profile_path'] is not None else ''
list_item = xbmcgui.ListItem(label=item['name'])
list_item.setProperty('birthyear', date_year(item.get('birthday', '')))
list_item.setProperty('birthday', date_format(item.get('birthday', '')))
list_item.setProperty('deathday', date_format(item.get('deathday', '')))
list_item.setProperty('age', str(tmdb_calc_age(item.get('birthday', ''), item.get('deathday'))))
list_item.setProperty('biography', tmdb_fallback_info(item, 'biography'))
list_item.setProperty('place_of_birth', item.get('place_of_birth').strip() if item.get('place_of_birth') else '')
list_item.setProperty('known_for_department', item.get('known_for_department', ''))
list_item.setProperty('gender', gender)
list_item.setProperty('id', str(item.get('id', '')))
list_item.setProperty('call', 'person')
list_item.setArt({'icon': 'DefaultActor.png', 'thumb': icon, 'poster': icon})
return list_item
def tmdb_handle_movie(item,local_items=None,full_info=False,mediatype='movie'):
icon = IMAGEPATH + item['poster_path'] if item['poster_path'] is not None else ''
backdrop = IMAGEPATH + item['backdrop_path'] if item['backdrop_path'] is not None else ''
label = item['title'] or item['original_title']
originaltitle = item.get('original_title', '')
imdbnumber = item.get('imdb_id', '')
collection = item.get('belongs_to_collection', '')
duration = item.get('runtime') * 60 if item.get('runtime', 0) > 0 else ''
premiered = item.get('release_date')
if premiered in ['2999-01-01', '1900-01-01']:
premiered = ''
local_info = tmdb_check_localdb(local_items, label, originaltitle, premiered, imdbnumber)
dbid = local_info['dbid']
is_local = True if dbid > 0 else False
list_item = xbmcgui.ListItem(label=label)
list_item.setInfo('video', {'title': label,
'originaltitle': originaltitle,
'dbid': dbid,
'playcount': local_info['playcount'],
'imdbnumber': imdbnumber,
'rating': item.get('vote_average', ''),
'votes': item.get('vote_count', ''),
'premiered': premiered,
'mpaa': tmdb_get_cert(item),
'tagline': item.get('tagline', ''),
'duration': duration,
'status': item.get('status', ''),
'plot': tmdb_fallback_info(item, 'overview'),
'director': tmdb_join_items_by(item.get('crew', ''), key_is='job', value_is='Director'),
'writer': tmdb_join_items_by(item.get('crew', ''), key_is='department', value_is='Writing'),
'country': tmdb_join_items(item.get('production_countries', '')),
'genre': tmdb_join_items(item.get('genres', '')),
'studio': tmdb_join_items(item.get('production_companies', '')),
'mediatype': mediatype}
)
list_item.setArt({'icon': 'DefaultVideo.png', 'thumb': icon, 'poster': icon, 'fanart': backdrop})
list_item.setProperty('role', item.get('character', ''))
list_item.setProperty('budget', format_currency(item.get('budget')))
list_item.setProperty('revenue', format_currency(item.get('revenue')))
list_item.setProperty('homepage', item.get('homepage', ''))
list_item.setProperty('file', local_info.get('file', ''))
list_item.setProperty('id', str(item.get('id', '')))
list_item.setProperty('call', 'movie')
if full_info:
tmdb_studios(list_item, item, 'production')
omdb_properties(list_item, imdbnumber)
region_release = tmdb_get_region_release(item)
if premiered != region_release:
list_item.setProperty('region_release', date_format(region_release))
if collection:
list_item.setProperty('collection', collection['name'])
list_item.setProperty('collection_id', str(collection['id']))
list_item.setProperty('collection_poster', IMAGEPATH + collection['poster_path'] if collection['poster_path'] is not None else '')
list_item.setProperty('collection_fanart', IMAGEPATH + collection['backdrop_path'] if collection['backdrop_path'] is not None else '')
return list_item, is_local
def tmdb_handle_tvshow(item,local_items=None,full_info=False,mediatype='tvshow'):
icon = IMAGEPATH + item['poster_path'] if item['poster_path'] is not None else ''
backdrop = IMAGEPATH + item['backdrop_path'] if item['backdrop_path'] is not None else ''
label = item['name'] or item['original_name']
originaltitle = item.get('original_name', '')
imdbnumber = item['external_ids']['imdb_id'] if item.get('external_ids') else ''
next_episode = item.get('next_episode_to_air', '')
last_episode = item.get('last_episode_to_air', '')
tvdb_id = item['external_ids']['tvdb_id'] if item.get('external_ids') else ''
premiered = item.get('first_air_date')
if premiered in ['2999-01-01', '1900-01-01']:
premiered = ''
local_info = tmdb_check_localdb(local_items, label, originaltitle, premiered, tvdb_id)
dbid = local_info['dbid']
is_local = True if dbid > 0 else False
list_item = xbmcgui.ListItem(label=label)
list_item.setInfo('video', {'title': label,
'originaltitle': originaltitle,
'dbid': dbid,
'playcount': local_info['playcount'],
'status': item.get('status', ''),
'rating': item.get('vote_average', ''),
'votes': item.get('vote_count', ''),
'imdbnumber': imdbnumber,
'premiered': premiered,
'mpaa': tmdb_get_cert(item),
'season': str(item.get('number_of_seasons', '')),
'episode': str(item.get('number_of_episodes', '')),
'plot': tmdb_fallback_info(item, 'overview'),
'director': tmdb_join_items(item.get('created_by', '')),
'genre': tmdb_join_items(item.get('genres', '')),
'studio': tmdb_join_items(item.get('networks', '')),
'mediatype': mediatype}
)
list_item.setArt({'icon': 'DefaultVideo.png', 'thumb': icon, 'poster': icon, 'fanart': backdrop})
list_item.setProperty('TotalEpisodes', str(local_info['episodes']))
list_item.setProperty('WatchedEpisodes', str(local_info['watchedepisodes']))
list_item.setProperty('UnWatchedEpisodes', str(local_info['unwatchedepisodes']))
list_item.setProperty('homepage', item.get('homepage', ''))
list_item.setProperty('role', item.get('character', ''))
list_item.setProperty('tvdb_id', str(tvdb_id))
list_item.setProperty('id', str(item.get('id', '')))
list_item.setProperty('call', 'tv')
if full_info:
tmdb_studios(list_item,item, 'production')
tmdb_studios(list_item,item, 'network')
omdb_properties(list_item, imdbnumber)
if last_episode:
list_item.setProperty('lastepisode', last_episode.get('name'))
list_item.setProperty('lastepisode_plot', last_episode.get('overview'))
list_item.setProperty('lastepisode_number', str(last_episode.get('episode_number')))
list_item.setProperty('lastepisode_season', str(last_episode.get('season_number')))
list_item.setProperty('lastepisode_date', date_format(last_episode.get('air_date')))
list_item.setProperty('lastepisode_thumb', IMAGEPATH + last_episode['still_path'] if last_episode['still_path'] is not None else '')
if next_episode:
list_item.setProperty('nextepisode', next_episode.get('name'))
list_item.setProperty('nextepisode_plot', next_episode.get('overview'))
list_item.setProperty('nextepisode_number', str(next_episode.get('episode_number')))
list_item.setProperty('nextepisode_season', str(next_episode.get('season_number')))
list_item.setProperty('nextepisode_date', date_format(next_episode.get('air_date')))
list_item.setProperty('nextepisode_thumb', IMAGEPATH + next_episode['still_path'] if next_episode['still_path'] is not None else '')
return list_item, is_local
def tmdb_handle_season(item,tvshow_details,full_info=False):
backdrop = IMAGEPATH + tvshow_details['backdrop_path'] if tvshow_details['backdrop_path'] is not None else ''
icon = IMAGEPATH + item['poster_path'] if item['poster_path'] is not None else ''
if not icon and tvshow_details['poster_path']:
icon = IMAGEPATH + tvshow_details['poster_path']
imdbnumber = tvshow_details['external_ids']['imdb_id'] if tvshow_details.get('external_ids') else ''
season_nr = str(item.get('season_number', ''))
tvshow_label = tvshow_details['name'] or tvshow_details['original_name']
episodes_count = 0
for episode in item.get('episodes', ''):
episodes_count += 1
list_item = xbmcgui.ListItem(label=tvshow_label)
list_item.setInfo('video', {'title': item['name'],
'tvshowtitle': tvshow_label,
'premiered': item.get('air_date', ''),
'episode': episodes_count,
'season': season_nr,
'plot': item.get('overview', ''),
'genre': tmdb_join_items(tvshow_details.get('genres', '')),
'rating': tvshow_details.get('vote_average', ''),
'votes': tvshow_details.get('vote_count', ''),
'mpaa': tmdb_get_cert(tvshow_details),
'mediatype': 'season'}
)
list_item.setArt({'icon': 'DefaultVideo.png', 'thumb': icon, 'poster': icon, 'fanart': backdrop})
list_item.setProperty('TotalEpisodes', str(episodes_count))
list_item.setProperty('id', str(tvshow_details['id']))
list_item.setProperty('call', 'tv')
list_item.setProperty('call_season', season_nr)
if full_info:
tmdb_studios(list_item,tvshow_details, 'production')
tmdb_studios(list_item,tvshow_details, 'network')
omdb_properties(list_item, imdbnumber)
return list_item
def tmdb_fallback_info(item,key):
if FALLBACK_LANGUAGE == DEFAULT_LANGUAGE:
try:
key_value = item.get(key, '').replace('&amp;', '&').strip()
except Exception:
key_value = ''
else:
key_value = tmdb_get_translation(item, key, DEFAULT_LANGUAGE)
# Default language is empty in the translations dict? Fall back to EN
if not key_value:
key_value = tmdb_get_translation(item, key, FALLBACK_LANGUAGE)
return key_value
def tmdb_get_translation(item,key,language):
key_value_iso_639_1 = ""
try:
language_iso_639_1 = language[:2]
language_iso_3166_1 = language[3:] if len(language)>3 else None
for translation in item['translations']['translations']:
if translation.get('iso_639_1') == language_iso_639_1 and translation['data'][key]:
key_value = translation['data'][key]
if key_value:
key_value = key_value.replace('&amp;', '&').strip()
if not language_iso_3166_1 or language_iso_3166_1 == translation.get('iso_3166_1'):
return key_value
else:
key_value_iso_639_1 = key_value
except Exception:
pass
return key_value_iso_639_1
def tmdb_handle_images(item):
icon = IMAGEPATH + item['file_path'] if item['file_path'] is not None else ''
list_item = xbmcgui.ListItem(label=str(item['width']) + 'x' + str(item['height']) + 'px')
list_item.setArt({'icon': 'DefaultPicture.png', 'thumb': icon})
list_item.setProperty('call', 'image')
return list_item
def tmdb_handle_credits(item):
icon = IMAGEPATH + item['profile_path'] if item['profile_path'] is not None else ''
list_item = xbmcgui.ListItem(label=item['name'])
list_item.setLabel2(item['label2'])
list_item.setArt({'icon': 'DefaultActor.png', 'thumb': icon, 'poster': icon})
list_item.setProperty('id', str(item.get('id', '')))
list_item.setProperty('call', 'person')
return list_item
def tmdb_handle_yt_videos(item):
icon = 'https://img.youtube.com/vi/%s/0.jpg' % str(item['key'])
list_item = xbmcgui.ListItem(label=item['name'])
list_item.setLabel2(item.get('type', ''))
list_item.setArt({'icon': 'DefaultVideo.png', 'thumb': icon, 'landscape': icon})
list_item.setProperty('ytid', str(item['key']))
list_item.setProperty('call', 'youtube')
return list_item
def tmdb_join_items_by(item,key_is,value_is,key='name'):
values = []
for value in item:
if value[key_is] == value_is:
values.append(value[key])
return get_joined_items(values)
def tmdb_join_items(item,key='name'):
values = []
for value in item:
values.append(value[key])
return get_joined_items(values)
def tmdb_get_year(item):
try:
year = str(item)[:-6]
return year
except Exception:
return ''
def tmdb_get_region_release(item):
try:
for release in item['release_dates']['results']:
if release['iso_3166_1'] == COUNTRY_CODE:
date = release['release_dates'][0]['release_date']
return date[:-14]
except Exception:
return ''
def tmdb_get_cert(item):
prefix = 'FSK ' if COUNTRY_CODE == 'DE' else ''
mpaa = ''
mpaa_fallback = ''
if item.get('content_ratings'):
for cert in item['content_ratings']['results']:
if cert['iso_3166_1'] == COUNTRY_CODE:
mpaa = cert['rating']
break
elif cert['iso_3166_1'] == 'US':
mpaa_fallback = cert['rating']
elif item.get('release_dates'):
for cert in item['release_dates']['results']:
if cert['iso_3166_1'] == COUNTRY_CODE:
mpaa = cert['release_dates'][0]['certification']
break
elif cert['iso_3166_1'] == 'US':
mpaa_fallback = cert['release_dates'][0]['certification']
if mpaa:
return prefix + mpaa
return mpaa_fallback
def omdb_properties(list_item,imdbnumber):
if OMDB_API_KEY and imdbnumber:
omdb = omdb_api(imdbnumber)
if omdb:
list_item.setProperty('rating.metacritic', omdb.get('metacritic', ''))
list_item.setProperty('rating.rotten', omdb.get('tomatometerallcritics', ''))
list_item.setProperty('rating.rotten_avg', omdb.get('tomatometerallcritics_avg', ''))
list_item.setProperty('votes.rotten', omdb.get('tomatometerallcritics_votes', ''))
list_item.setProperty('rating.rotten_user', omdb.get('tomatometerallaudience', ''))
list_item.setProperty('rating.rotten_user_avg', omdb.get('tomatometerallaudience_avg', ''))
list_item.setProperty('votes.rotten_user', omdb.get('tomatometerallaudience_votes', ''))
list_item.setProperty('rating.imdb', omdb.get('imdbRating', ''))
list_item.setProperty('votes.imdb', omdb.get('imdbVotes', ''))
list_item.setProperty('awards', omdb.get('awards', ''))
list_item.setProperty('release', omdb.get('DVD', ''))

View File

@@ -0,0 +1,38 @@
#!/usr/bin/python
# coding: utf-8
########################
import xbmc
import requests
from resources.lib.helper import *
########################
TRAKT_API_KEY = ADDON.getSettingString('trakt_api_key')
########################
def trakt_api(call=None):
headers = {
'Content-Type': 'application/json',
'trakt-api-version': '2',
'trakt-api-key': TRAKT_API_KEY
}
request_url = 'https://api.trakt.tv' + call
for i in range(1,4): # loop if heavy server load
try:
request = requests.get(request_url, timeout=5, headers=headers)
if not request.ok:
raise Exception(str(request.status_code))
except Exception as error:
log('Trakt server error: Code ' + str(error), ERROR)
xbmc.sleep(500)
else:
return request.json()

View File

@@ -0,0 +1,297 @@
#!/usr/bin/python
# coding: utf-8
########################
import sys
import xbmc
import xbmcgui
import requests
from resources.lib.helper import *
from resources.lib.tmdb import *
########################
SIMILAR_FILTER = ADDON.getSettingBool('similar_movies_filter')
FILTER_UPCOMING = ADDON.getSettingBool('filter_upcoming')
FILTER_DAYDELTA = int(ADDON.getSetting('filter_daydelta'))
########################
class TMDBVideos(object):
def __init__(self,call_request):
self.result = {}
self.call = call_request['call']
self.tmdb_id = call_request['tmdb_id']
self.local_movies = call_request['local_movies']
self.local_shows = call_request['local_shows']
self.movie = get_bool(self.call, 'movie')
self.tvshow = get_bool(self.call, 'tv')
if self.tmdb_id:
cache_key = self.call + str(self.tmdb_id)
self.details = get_cache(cache_key)
if not self.details:
self.details = tmdb_query(action=self.call,
call=self.tmdb_id,
params={'append_to_response': 'release_dates,content_ratings,external_ids,credits,videos,translations,similar'},
show_error=True
)
write_cache(cache_key, self.details)
if not self.details:
return
self.created_by = self.details['created_by'] if self.details.get('created_by') else ''
self.crew = self.details['credits']['crew']
self.details['crew'] = self.crew
self.similar_duplicate_handler = list()
self.result['details'] = self.get_details()
self.result['cast'] = self.get_cast()
self.result['crew'] = self.get_crew()
self.result['collection'] = self.get_collection()
self.result['similar'] = self.get_similar()
self.result['youtube'] = self.get_yt_videos()
self.result['backdrops'], self.result['posters'] = self.get_images()
self.result['seasons'] = self.get_seasons()
def __getitem__(self, key):
return self.result.get(key, '')
def get_details(self):
li = list()
if self.movie:
list_item, is_local = tmdb_handle_movie(self.details, self.local_movies,full_info=True)
elif self.tvshow:
list_item, is_local = tmdb_handle_tvshow(self.details, self.local_shows,full_info=True)
li.append(list_item)
return li
def get_cast(self):
li = list()
for item in self.details['credits']['cast']:
item['label2'] = item.get('character', '')
list_item = tmdb_handle_credits(item)
li.append(list_item)
return li
def get_crew(self):
li_clean_crew = list()
li_crew_duplicate_handler_id = list()
li = list()
''' Add creators to crew
'''
for item in self.created_by:
item['job'] = 'Creator'
item['department'] = 'Directing'
li_clean_crew.append(item)
li_crew_duplicate_handler_id.append(item['id'])
''' Filter crew and merge duplicate crew members if they were responsible for different jobs
'''
for item in self.crew:
if item['job'] in ['Creator', 'Director', 'Producer', 'Screenplay', 'Writer', 'Original Music Composer', 'Novel', 'Storyboard', 'Executive Producer', 'Comic Book']:
if item['id'] not in li_crew_duplicate_handler_id:
li_clean_crew.append(item)
li_crew_duplicate_handler_id.append(item['id'])
else:
for duplicate in li_clean_crew:
if duplicate['id'] == item['id']:
duplicate['job'] = duplicate['job'] + ' / ' + item['job']
''' Sort crew output based on department
'''
for item in li_clean_crew:
if item['department'] == 'Directing':
item['label2'] = item.get('job', '')
list_item = tmdb_handle_credits(item)
li.append(list_item)
for item in li_clean_crew:
if item['department'] == 'Writing':
item['label2'] = item.get('job', '')
list_item = tmdb_handle_credits(item)
li.append(list_item)
for item in li_clean_crew:
if item['department'] == 'Production':
item['label2'] = item.get('job', '')
list_item = tmdb_handle_credits(item)
li.append(list_item)
for item in li_clean_crew:
if item['department'] == 'Sound':
item['job'] = 'Music Composer' if item['job'] == 'Original Music Composer' else item['job']
item['label2'] = item.get('job', '')
list_item = tmdb_handle_credits(item)
li.append(list_item)
return li
def get_seasons(self):
seasons = self.details.get('seasons')
li = list()
if seasons:
for item in seasons:
if item['season_number'] == 0:
continue
list_item = tmdb_handle_season(item, self.details)
li.append(list_item)
return li
def get_collection(self):
collection = self.details.get('belongs_to_collection')
li = list()
if collection:
collection_id = collection['id']
cache_key = 'collection' + str(collection_id)
collection_data = get_cache(cache_key)
if not collection_data:
collection_data = tmdb_query(action='collection',
call=collection_id
)
write_cache(cache_key, collection_data)
if collection_data['parts']:
set_items = sort_dict(collection_data['parts'], 'release_date')
for item in set_items:
''' Filter to hide in production or rumored future movies
'''
if FILTER_UPCOMING:
diff = date_delta(item.get('release_date', '2900-01-01'))
if diff.days > FILTER_DAYDELTA:
continue
list_item, is_local = tmdb_handle_movie(item, self.local_movies)
li.append(list_item)
if SIMILAR_FILTER:
self.similar_duplicate_handler.append(item['id'])
''' Don't show sets with only 1 item
'''
if len(li) == 1:
self.similar_duplicate_handler = list()
li = list()
return li
def get_similar(self):
similar = self.details['similar']['results']
li = list()
if self.movie:
similar = sort_dict(similar, 'release_date',True)
for item in similar:
''' Filter to hide item if it's part of the collection
'''
if SIMILAR_FILTER and item['id'] in self.similar_duplicate_handler:
continue
''' Filter to hide in production or rumored future movies
'''
if FILTER_UPCOMING:
diff = date_delta(item.get('release_date', '2900-01-01'))
if diff.days > FILTER_DAYDELTA:
continue
list_item, is_local = tmdb_handle_movie(item, self.local_movies)
li.append(list_item)
elif self.tvshow:
similar = sort_dict(similar, 'first_air_date', True)
for item in similar:
''' Filter to hide in production or rumored future shows
'''
if FILTER_UPCOMING:
diff = date_delta(item.get('first_air_date', '2900-01-01'))
if diff.days > FILTER_DAYDELTA:
continue
list_item, is_local = tmdb_handle_tvshow(item, self.local_shows)
li.append(list_item)
return li
def get_images(self):
cache_key = 'images' + str(self.tmdb_id)
images = get_cache(cache_key)
li_backdrops = list()
li_poster = list()
if not images:
images = tmdb_query(action=self.call,
call=self.tmdb_id,
get='images',
params={'include_image_language': '%s,en,null' % DEFAULT_LANGUAGE}
)
write_cache(cache_key, images)
for item in images['backdrops']:
list_item = tmdb_handle_images(item)
li_backdrops.append(list_item)
for item in images['posters']:
list_item = tmdb_handle_images(item)
li_poster.append(list_item)
return li_backdrops, li_poster
def get_yt_videos(self):
cache_key = 'ytvideos' + str(self.tmdb_id)
videos = get_cache(cache_key)
li = list()
if not videos:
videos = self.details['videos']['results']
''' Add EN videos next to the user configured language
'''
if DEFAULT_LANGUAGE != FALLBACK_LANGUAGE:
videos_en = tmdb_query(action=self.call,
call=self.tmdb_id,
get='videos',
use_language=False
)
videos_en = videos_en.get('results')
videos = videos + videos_en
''' Check online status of all videos to prevent dead links
'''
online_videos = []
for item in videos:
request = requests.head('https://img.youtube.com/vi/%s/0.jpg' % str(item['key']))
if request.status_code == requests.codes.ok:
online_videos.append(item)
videos = online_videos
write_cache(cache_key, videos)
for item in videos:
if item['site'] == 'YouTube':
list_item = tmdb_handle_yt_videos(item)
if not list_item == 404:
li.append(list_item)
return li

View File

@@ -0,0 +1,487 @@
#!/usr/bin/python
# coding: utf-8
########################
import routing
from xbmcgui import ListItem
from xbmcplugin import *
from datetime import date
from resources.lib.helper import *
from resources.lib.tmdb import *
from resources.lib.trakt import *
from resources.lib.localdb import *
from resources.lib.nextaired import *
########################
INDEX_MENU = {
'discover': {
'name': 'The Movie DB - ' + ADDON.getLocalizedString(32049),
'route': 'discover',
'folder': True,
'menu': [
{ 'name': ADDON.getLocalizedString(32050), 'call': 'movie'},
{ 'name': ADDON.getLocalizedString(32051), 'call': 'tv' },
{ 'name': ADDON.getLocalizedString(32057), 'call': 'person' }
]
},
'movie': {
'name': 'The Movie DB - ' + xbmc.getLocalizedString(342),
'route': 'movie_listing',
'folder': True,
'menu': [
{ 'name': ADDON.getLocalizedString(32042), 'call': 'trending' },
{ 'name': ADDON.getLocalizedString(32029), 'call': 'top_rated' },
{ 'name': ADDON.getLocalizedString(32030), 'call': 'now_playing' },
{ 'name': ADDON.getLocalizedString(32031), 'call': 'upcoming' },
{ 'name': ADDON.getLocalizedString(32032), 'call': 'popular' },
]
},
'tv': {
'name': 'The Movie DB - ' + xbmc.getLocalizedString(20343),
'route': 'tv_listing',
'folder': True,
'menu': [
{ 'name': ADDON.getLocalizedString(32043), 'call': 'trending' },
{ 'name': ADDON.getLocalizedString(32033), 'call': 'top_rated' },
{ 'name': ADDON.getLocalizedString(32034), 'call': 'popular' },
{ 'name': ADDON.getLocalizedString(32035), 'call': 'airing_today' },
{ 'name': ADDON.getLocalizedString(32036), 'call': 'on_the_air' }
]
},
'nextaired': {
'name': 'Trakt.tv - ' + ADDON.getLocalizedString(32059),
'route': 'nextaired',
'folder': True,
'menu': [
{ 'name': ADDON.getLocalizedString(32058), 'day': 'week' },
{ 'name': xbmc.getLocalizedString(33006), 'day': 'today' },
],
'days': [
xbmc.getLocalizedString(11),
xbmc.getLocalizedString(12),
xbmc.getLocalizedString(13),
xbmc.getLocalizedString(14),
xbmc.getLocalizedString(15),
xbmc.getLocalizedString(16),
xbmc.getLocalizedString(17)
]
},
'search': {
'name': xbmc.getLocalizedString(137),
'route': 'search',
'folder': False
}
}
DISCOVER_INDEX = {
'movie': [
{ 'name': ADDON.getLocalizedString(32050), 'option': 'all' },
{ 'name': ADDON.getLocalizedString(32052), 'option': 'year', 'param': 'year' },
{ 'name': ADDON.getLocalizedString(32053), 'option': 'genre', 'param': 'with_genres' },
],
'tv': [
{ 'name': ADDON.getLocalizedString(32051), 'option': 'all' },
{ 'name': ADDON.getLocalizedString(32054), 'option': 'year', 'parmam': 'first_air_date_year' },
{ 'name': ADDON.getLocalizedString(32055), 'option': 'genre', 'param': 'with_genres' }
]
}
DEFAULT_ART = {
'icon': 'DefaultFolder.png',
'thumb': 'special://home/addons/script.embuary.info/resources/icon.png'
}
########################
plugin = routing.Plugin()
# entrypoint
@plugin.route('/')
def index():
for i in ['discover', 'movie', 'tv', 'nextaired', 'search']:
item = INDEX_MENU[i]
li_item = ListItem(item['name'])
li_item.setArt(DEFAULT_ART)
xbmcplugin.addDirectoryItem(plugin.handle,
plugin.url_for(eval(item['route'])),
li_item, item['folder'])
_sortmethods()
xbmcplugin.endOfDirectory(plugin.handle)
# actions
@plugin.route('/info/<call>/<idtype>/<tmdbid>')
def dialog(call,idtype,tmdbid):
if idtype == 'tmdb':
execute('RunScript(script.embuary.info,call=%s,tmdb_id=%s)' % (call, tmdbid))
elif idtype == 'external':
execute('RunScript(script.embuary.info,call=%s,external_id=%s)' % (call, tmdbid))
@plugin.route('/search')
def search():
execute('RunScript(script.embuary.info)')
# next aired
@plugin.route('/nextaired')
@plugin.route('/nextaired/<day>')
def nextaired(day=None):
if not day:
for i in INDEX_MENU['nextaired'].get('menu'):
li_item = ListItem(i.get('name'))
li_item.setArt(DEFAULT_ART)
xbmcplugin.addDirectoryItem(plugin.handle,
plugin.url_for(nextaired, i.get('day')),
li_item, True)
utc = arrow.utcnow()
local_date = utc.to(TIMEZONE)
kodi_locale = json_call('Settings.GetSettingValue', params={'setting': 'locale.language'})
kodi_locale = kodi_locale['result']['value'][-5:]
for i in range(6):
local_date = local_date.shift(days=1)
translated_date = local_date.format(fmt='dddd, D. MMMM YYYY', locale=kodi_locale)
tmp_day_str, tmp_day = date_weekday(local_date)
li_item = ListItem(translated_date)
li_item.setArt(DEFAULT_ART)
xbmcplugin.addDirectoryItem(plugin.handle,
plugin.url_for(nextaired, tmp_day),
li_item, True)
_category(category=INDEX_MENU['nextaired']['name'])
else:
_nextaired(day)
_sortmethods()
xbmcplugin.endOfDirectory(plugin.handle)
def _nextaired(day):
if day == 'today':
day_str, day = date_weekday()
next_aired = NextAired()
next_aired_results = next_aired.get(str(day))
if day == 'week':
next_aired_results = sort_dict(next_aired_results, 'airing')
#log(next_aired_results,force=True,json=True)
for i in next_aired_results:
try:
if day != 'week' and day is not None:
label = '%s %sx%s. %s' % (i['showtitle'], i['season_number'], i['episode_number'], i['name'])
else:
kodi_date = date_format(i['airing'])
label = '%s, %s: %s %sx%s. %s' % (i['weekday'], kodi_date, i['showtitle'], i['season_number'], i['episode_number'], i['name'])
season = str(i.get('season_number', ''))
episode = str(i.get('episode_number', ''))
airing_date = i.get('airing', '')
airing_time = i.get('airing_time', '')
plot = i.get('overview') or xbmc.getLocalizedString(19055)
overview = [date_format(airing_date) + ' ' + airing_time, plot]
overview ='[CR]'.join(filter(None, overview))
thumb = IMAGEPATH + i.get('still_path') if i.get('still_path') else ''
if not thumb:
thumb = i['localart'].get('landscape') or i['localart'].get('fanart') or ''
li_item = ListItem(label)
li_item.setArt(i.get('localart'))
li_item.setArt({'icon': 'DefaultVideo.png', 'thumb': thumb})
li_item.setInfo('video', {'title': i.get('name') or xbmc.getLocalizedString(13205),
'tvshowtitle': i.get('showtitle') or xbmc.getLocalizedString(13205),
'plot': overview,
'premiered': airing_date,
'season': season,
'episode': episode,
'status': i.get('status', ''),
'country': i.get('country', ''),
'studio': i.get('network', ''),
'duration': i.get('runtime', 0),
'mediatype': 'episode'}
)
li_item.setProperty('AirDay', i['weekday'])
li_item.setProperty('AirTime', airing_time)
li_item.setProperty('IsPlayable', 'false')
xbmcplugin.addDirectoryItem(plugin.handle, plugin.url_for(dialog, 'tv', 'tmdb', i['show_id']), li_item)
except Exception as error:
pass
if day == 'week':
category = INDEX_MENU['nextaired']['menu'][0]['name']
else:
category = INDEX_MENU['nextaired']['days'][int(day)]
_category(content='videos', category=category)
# discover
@plugin.route('/discover')
@plugin.route('/discover/<directory>')
@plugin.route('/discover/<directory>/<option>')
@plugin.route('/discover/<directory>/<option>/<filterby>')
@plugin.route('/discover/<directory>/<option>/<filterby>/<page>')
def discover(directory=None,option=None,filterby=None,page=1,pages=1):
if not directory:
for i in INDEX_MENU['discover'].get('menu'):
li_item = ListItem(i.get('name'))
li_item.setArt(DEFAULT_ART)
xbmcplugin.addDirectoryItem(plugin.handle,
plugin.url_for(discover, i.get('call')),
li_item, True)
_category(category=INDEX_MENU['discover']['name'])
else:
category = _dict_match('name', INDEX_MENU['discover']['menu'], 'call', directory)
if _previouspage(page):
li_item = ListItem(ADDON.getLocalizedString(32056))
li_item.setArt(DEFAULT_ART)
li_item.setProperty('SpecialSort', 'top')
xbmcplugin.addDirectoryItem(plugin.handle,
plugin.url_for(discover, directory, option, filterby, int(page)-1),
li_item, True)
if directory == 'person':
result, pages = _query('person', 'popular', params={'page': page})
if result:
_add(result, 'person')
_category(directory, category)
elif not option:
for i in DISCOVER_INDEX[directory]:
li_item = ListItem(i.get('name'))
li_item.setArt(DEFAULT_ART)
xbmcplugin.addDirectoryItem(plugin.handle,
plugin.url_for(discover, directory, i.get('option')),
li_item, True)
_category(category=category)
elif option == 'all':
result, pages = _query('discover', directory, params={'page': page})
if result:
_add(result, directory)
_category(directory, category)
elif option in ['genre', 'year'] and not filterby:
option_results, filter_value, icon = _discover_option(directory, option)
for i in option_results:
li_item = ListItem(i.get('name'))
li_item.setArt({'icon': icon})
xbmcplugin.addDirectoryItem(plugin.handle,
plugin.url_for(discover, directory, option, i.get(filter_value)),
li_item, True)
_category(directory, category)
else:
filter_param = _dict_match('param', DISCOVER_INDEX[directory], 'option', option)
result, pages = _query('discover', directory, params={filter_param: filterby, 'page': page})
if result:
_add(result, directory)
_category(directory, category + ' (' + filterby + ')')
if _nextpage(page, pages):
li_item = ListItem(xbmc.getLocalizedString(33078))
li_item.setArt(DEFAULT_ART)
li_item.setProperty('SpecialSort', 'bottom')
xbmcplugin.addDirectoryItem(plugin.handle,
plugin.url_for(discover, directory, option, filterby, int(page)+1),
li_item, True)
_sortmethods()
xbmcplugin.endOfDirectory(plugin.handle)
def _discover_option(call,option):
if option == 'genre':
tmdb = tmdb_query(action='genre',
call=call,
get='list'
)
return tmdb['genres'], 'id', 'DefaultGenre.png'
elif option == 'year':
cur_year = date.today().year
index = cur_year
years = []
for i in range(cur_year - 1900 + 1):
years.append({'name': str(index)})
index -= 1
return years, 'name', 'DefaultYear.png'
elif option == 'keyword':
keyboard = xbmc.Keyboard()
keyboard.doModal()
if keyboard.isConfirmed():
return keyboard.getText(),
# common
@plugin.route('/movie')
@plugin.route('/movie/<call>')
@plugin.route('/movie/<call>/<page>')
def movie_listing(call=None,page=1,pages=1):
_listing('movie', call, page, pages)
@plugin.route('/tv')
@plugin.route('/tv/<call>')
@plugin.route('/tv/<call>/<page>')
def tv_listing(call=None,page=1,pages=1):
_listing('tv', call, page, pages)
def _listing(directory, call, page, pages):
route = '%s_listing' % directory
category = _dict_match('name', INDEX_MENU[directory]['menu'], 'call', call)
if _previouspage(page):
li_item = ListItem(ADDON.getLocalizedString(32056))
li_item.setArt(DEFAULT_ART)
li_item.setProperty('SpecialSort', 'top')
xbmcplugin.addDirectoryItem(plugin.handle,
plugin.url_for(eval(route), call, int(page)-1),
li_item, True)
if not call:
result = None
for i in INDEX_MENU[directory].get('menu'):
li_item = ListItem(i.get('name'))
li_item.setArt(DEFAULT_ART)
xbmcplugin.addDirectoryItem(plugin.handle,
plugin.url_for(eval(route), i.get('call')),
li_item, True)
_category(category=INDEX_MENU[directory]['name'])
elif call == 'trending':
result, pages = _query('trending', directory, 'week', params={'page': page})
else:
result, pages = _query(directory, call, params={'page': page})
if result:
_add(result, directory)
_category(directory, category)
if _nextpage(page, pages):
li_item = ListItem(xbmc.getLocalizedString(33078))
li_item.setArt(DEFAULT_ART)
li_item.setProperty('SpecialSort', 'bottom')
xbmcplugin.addDirectoryItem(plugin.handle,
plugin.url_for(eval(route), call, int(page)+1),
li_item, True)
_sortmethods()
xbmcplugin.endOfDirectory(plugin.handle)
#helpers
def _dict_match(get,source,key,value):
result = [i.get(get) for i in source if i.get(key) == value]
if result:
return result[0]
def _add(items,call):
local_items = get_local_media()
if call == 'tv':
for item in items:
list_item, is_local = tmdb_handle_tvshow(item, local_items=local_items.get('shows', []))
xbmcplugin.addDirectoryItem(plugin.handle, plugin.url_for(dialog, 'tv', 'tmdb', item['id']), list_item)
elif call == 'movie':
for item in items:
list_item, is_local = tmdb_handle_movie(item, local_items=local_items.get('movies', []))
xbmcplugin.addDirectoryItem(plugin.handle, plugin.url_for(dialog, 'movie', 'tmdb', item['id']), list_item)
elif call == 'person':
for item in items:
list_item = tmdb_handle_person(item)
xbmcplugin.addDirectoryItem(plugin.handle, plugin.url_for(dialog, 'person', 'tmdb', item['id']), list_item)
def _category(content='',category='',call=None,info=None):
if content == 'tv':
plugincontent = 'tvshows'
elif content == 'movie':
plugincontent = 'movies'
elif content == 'person':
plugincontent = 'actors'
elif content:
plugincontent = content
else:
plugincontent = ''
set_plugincontent(content=plugincontent, category=category)
def _query(content_type,call,get=None,params=None,get_details=False):
args = {'region': COUNTRY_CODE}
if params:
args.update(params)
cache_key = 'widget' + content_type + str(call) + str(get) + str(args)
tmdb = get_cache(cache_key)
if not tmdb:
tmdb = tmdb_query(action=content_type,
call=call,
get=get,
params=args
)
if tmdb:
write_cache(cache_key,tmdb,3)
if not get_details:
try:
return tmdb.get('results'), tmdb.get('total_pages')
except Exception:
return [], 1
else:
return tmdb
def _nextpage(page,pages):
if int(page) < int(pages) and condition('Window.IsVisible(MyVideoNav.xml)'):
return True
return False
def _previouspage(page):
if int(page) > 1 and condition('Window.IsVisible(MyVideoNav.xml) + !Container.HasParent'):
return True
return False
def _sortmethods():
xbmcplugin.addSortMethod(int(sys.argv[1]), xbmcplugin.SORT_METHOD_TITLE)

View File

@@ -0,0 +1,22 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<settings>
<category label="128">
<setting label="TheMovieDB" type="lsep"/>
<setting label="$ADDON[script.embuary.info 32024]" type="select" values="ar-AE|ar-SA|bg|bn|ca|ch|cs|da|de|el|en|eo|es-ES|es-MX|eu|fa|fi|fr-CA|fr-FR|he|hi|hu|id|it|ja|ka|kn|ko|lt|ml|nb|nl|no|pl|pt-BR|pt-PT|ro|ru|sk|sl|sr|sv|ta|te|th|tr|uk|vi|zh-CN|zh-TW" id="language_code" default="en"/>
<setting label="$ADDON[script.embuary.info 32003]" type="select" values="AU|BG|BR|CA|DE|DK|ES|FI|FR|GB|HU|IN|IT|KR|LT|MY|NL|NO|NZ|PH|PT|RU|SE|SK|TH|US" id="country_code" default="US"/>
<setting label="$ADDON[script.embuary.info 32023]" type="text" id="tmdb_api_key" default="fc168650632c6597038cf7072a7c20da"/>
<setting label="OMDB $ADDON[script.embuary.info 32002]" type="lsep"/>
<setting label="$ADDON[script.embuary.info 32023]" type="text" id="omdb_api_key"/>
<setting label="Trakt.tv" type="lsep"/>
<setting label="$ADDON[script.embuary.info 32023]" type="text" id="trakt_api_key" default="db17981042166c60e1642c483f5be54b12ec86e3401cd67c2514fdf6843a110f"/>
<setting label="$ADDON[script.embuary.info 32026]" type="lsep"/>
<setting label="$ADDON[script.embuary.info 32027]" type="bool" id="filter_shows" default="true"/>
<setting label="$ADDON[script.embuary.info 32028]" type="bool" id="filter_movies" default="false"/>
<setting label="$ADDON[script.embuary.info 32041]" type="bool" id="similar_movies_filter" default="false"/>
<setting label="$ADDON[script.embuary.info 32044]" type="bool" id="filter_upcoming" default="false"/>
<setting label="- $ADDON[script.embuary.info 32045]" type="slider" id="filter_daydelta" default="180" range="0,30,360" option="int" enable="eq(-1,true)"/>
<setting label="$ADDON[script.embuary.info 32047]" type="action" action="InstallAddon(context.embuary.info)" visible="!System.HasAddon(context.embuary.info)"/>
<setting label="$ADDON[script.embuary.info 32020]" type="lsep"/>
<setting label="$ADDON[script.embuary.info 32021]" type="bool" id="cache_enabled" default="true"/>
</category>
</settings>

View File

@@ -0,0 +1,53 @@
<?xml version="1.0" encoding="UTF-8"?>
<window>
<animation effect="fade" start="0" end="100" time="400">WindowOpen</animation>
<animation effect="fade" start="100" end="0" time="300">WindowClose</animation>
<controls>
<control type="group">
<control type="image">
<width>1920</width>
<height>1080</height>
<aspectratio>scale</aspectratio>
<texture>colors/black.png</texture>
</control>
<control type="group">
<animation effect="fade" start="100" end="97" time="0" condition="true">Conditional</animation>
<control type="image">
<width>1920</width>
<height>1080</height>
<aspectratio>scale</aspectratio>
<texture colordiffuse="FF0E597E">backgrounds/primary.jpg</texture>
</control>
</control>
</control>
<control type="list" id="1">
<description>REQUIRED: The list of images</description>
<width>1920</width>
<height>1080</height>
<orientation>horizontal</orientation>
<scrolltime>0</scrolltime>
<pagecontrol>2</pagecontrol>
<itemlayout/>
<focusedlayout width="1920" height="1080"/>
</control>
<control type="image">
<width>1920</width>
<height>1080</height>
<aspectratio>keep</aspectratio>
<texture>$INFO[Container(1).ListItem.Icon]</texture>
<fadetime>500</fadetime>
</control>
<control type="scrollbar" id="2">
<description>REQUIRED: It's the default control, which is going to be focused on window init.</description>
<bottom>0</bottom>
<height>5</height>
<width>1920</width>
<orientation>horizontal</orientation>
<showonepage>false</showonepage>
<texturesliderbackground colordiffuse="50000000">white.jpg</texturesliderbackground>
<texturesliderbar colordiffuse="ffffffff">white.jpg</texturesliderbar>
<texturesliderbarfocus colordiffuse="ffffffff">white.jpg</texturesliderbarfocus>
<animation effect="fade" time="300" start="100" end="0" condition="System.IdleTime(2)">Conditional</animation>
</control>
</controls>
</window>

View File

@@ -0,0 +1,915 @@
<?xml version="1.0" encoding="UTF-8"?>
<window>
<defaultcontrol>100</defaultcontrol>
<onload>SetProperty(onnext,SetFocus(100))</onload>
<onload>SetProperty(onback_10052,SetFocus(100))</onload>
<onload>SetProperty(onback_10053,SetFocus(100))</onload>
<onload>SetProperty(onback_10054,SetFocus(100))</onload>
<onload>SetProperty(onback_10055,SetFocus(100))</onload>
<onload>SetProperty(onback_10056,SetFocus(100))</onload>
<onload>SetProperty(onback_10057,SetFocus(100))</onload>
<onload>SetProperty(onback_10058,SetFocus(100))</onload>
<onload>SetProperty(onback_10059,SetFocus(100))</onload>
<controls>
<!-- Storage container for the item details -->
<control type="list" id="10051">
<top>-3000</top>
<left>-3000</left>
<width>1</width>
<height>1</height>
<itemlayout/>
<focusedlayout/>
</control>
<!-- background -->
<control type="group">
<animation effect="fade" start="0" end="100" time="400">WindowOpen</animation>
<animation effect="fade" start="100" end="0" time="300" condition="String.IsEmpty(Window(home).Property(script.embuary.info-nextcall))">WindowClose</animation>
<animation effect="fade" start="100" end="0" time="0" condition="!String.IsEmpty(Window(home).Property(script.embuary.info-nextcall))">WindowClose</animation>
<animation effect="fade" time="400">VisibleChange</animation>
<control type="image">
<width>1920</width>
<height>1080</height>
<aspectratio>scale</aspectratio>
<texture>colors/black.png</texture>
</control>
<control type="group">
<animation effect="fade" start="100" end="97" time="0" condition="true">Conditional</animation>
<control type="image">
<width>1920</width>
<height>1080</height>
<aspectratio>scale</aspectratio>
<texture colordiffuse="FF0E597E">backgrounds/primary.jpg</texture>
</control>
</control>
<control type="image">
<width>1920</width>
<height>1080</height>
<aspectratio>scale</aspectratio>
<fadetime>400</fadetime>
<animation effect="fade" time="400">VisibleChange</animation>
<texture background="true" colordiffuse="37FFFFFF">$INFO[Container(10051).ListItem.Art(fanart)]</texture>
</control>
</control>
<!-- infos -->
<control type="grouplist" id="50">
<animation type="WindowOpen">
<effect type="fade" start="0" end="100" time="300" tween="sine" easing="out" />
<effect type="slide" start="320" end="0" time="400" tween="cubic" easing="out" />
</animation>
<animation type="WindowCLose" condition="String.IsEmpty(Window(home).Property(script.embuary.info-nextcall))">
<effect type="fade" start="100" end="0" time="300" tween="sine" easing="out" />
<effect type="slide" start="0" end="320" time="300" tween="cubic" easing="out" />
</animation>
<animation type="WindowCLose" condition="!String.IsEmpty(Window(home).Property(script.embuary.info-nextcall))">
<effect type="fade" start="100" end="0" time="0" tween="sine" easing="out" />
</animation>
<width>1920</width>
<height>1080</height>
<orientation>vertical</orientation>
<scrolltime tween="cubic" easing="out">500</scrolltime>
<itemgap>-210</itemgap>
<usecontrolcoords>true</usecontrolcoords>
<!-- Meta -->
<control type="group">
<top>110</top>
<height>900</height>
<!-- poster -->
<control type="group">
<left>103</left>
<width>500</width>
<height>750</height>
<control type="image">
<left>-20</left>
<top>-20</top>
<width>540</width>
<height>790</height>
<texture>dialogs/dialog-bg-nobo.png</texture>
<bordertexture border="21">overlays/shadow.png</bordertexture>
<bordersize>20</bordersize>
</control>
<control type="image">
<width>500</width>
<height>750</height>
<texture background="true">$INFO[Container(10051).ListItem.Art(thumb)]</texture>
<aspectratio>scale</aspectratio>
</control>
</control>
<!-- meta -->
<control type="group">
<left>650</left>
<right>103</right>
<!-- plot -->
<control type="image">
<top>-11</top>
<left>-21</left>
<right>339</right>
<height>640</height>
<texture border="21">dialogs/dialog-bg.png</texture>
</control>
<control type="textbox">
<top>20</top>
<left>15</left>
<right>375</right>
<height max="580">auto</height>
<align>justify</align>
<aligny>top</aligny>
<label fallback="19055">$INFO[Container(10051).ListItem.Property(biography)]</label>
<font>font13</font>
<textcolor>ffffffff</textcolor>
<shadowcolor>50000000</shadowcolor>
<autoscroll delay="6000" time="3000" repeat="10000">true</autoscroll>
</control>
<!-- facts -->
<control type="image">
<top>-11</top>
<left>812</left>
<right>-20</right>
<height>640</height>
<texture border="21">dialogs/dialog-bg.png</texture>
</control>
<control type="grouplist">
<top>20</top>
<width>310</width>
<right>10</right>
<height>640</height>
<itemgap>5</itemgap>
<orientation>vertical</orientation>
<aligny>top</aligny>
<control type="label">
<label>[COLOR FF12A0C7]$LOCALIZE[39025]:[/COLOR][CR]$INFO[Container(10051).ListItem.Property(Gender)]</label>
<height>80</height>
<font>font12</font>
<textcolor>ffffffff</textcolor>
<shadowcolor>50000000</shadowcolor>
<scroll>false</scroll>
<align>left</align>
<aligny>top</aligny>
<visible>!String.IsEmpty(Container(10051).ListItem.Property(Gender))</visible>
</control>
<control type="label">
<label>[COLOR FF12A0C7]$ADDON[script.embuary.info 32017]:[/COLOR][CR]$INFO[Container(10051).ListItem.Property(Known_For_Department)]</label>
<height>80</height>
<font>font12</font>
<textcolor>ffffffff</textcolor>
<shadowcolor>50000000</shadowcolor>
<scroll>false</scroll>
<align>left</align>
<aligny>top</aligny>
<visible>!String.IsEmpty(Container(10051).ListItem.Property(Known_For_Department))</visible>
</control>
<control type="label">
<label>[COLOR FF12A0C7]$ADDON[script.embuary.info 32006]:[/COLOR][CR]$INFO[Container(10051).ListItem.Property(age)]</label>
<height>80</height>
<font>font12</font>
<textcolor>ffffffff</textcolor>
<shadowcolor>50000000</shadowcolor>
<scroll>false</scroll>
<align>left</align>
<aligny>top</aligny>
<visible>!String.IsEmpty(Container(10051).ListItem.Property(age))</visible>
</control>
<control type="label">
<label>[COLOR FF12A0C7]$LOCALIZE[21893]:[/COLOR][CR]$INFO[Container(10051).ListItem.Property(birthday)]</label>
<height>80</height>
<font>font12</font>
<textcolor>ffffffff</textcolor>
<shadowcolor>50000000</shadowcolor>
<scroll>false</scroll>
<align>left</align>
<aligny>top</aligny>
<visible>!String.IsEmpty(Container(10051).ListItem.Property(birthday))</visible>
</control>
<control type="label">
<label>[COLOR FF12A0C7]$LOCALIZE[21897]:[/COLOR][CR]$INFO[Container(10051).ListItem.Property(deathday)]</label>
<height>80</height>
<font>font12</font>
<textcolor>ffffffff</textcolor>
<shadowcolor>50000000</shadowcolor>
<scroll>false</scroll>
<align>left</align>
<aligny>top</aligny>
<visible>!String.IsEmpty(Container(10051).ListItem.Property(deathday))</visible>
</control>
<control type="label">
<label>[COLOR FF12A0C7]$ADDON[script.embuary.info 32007]:[/COLOR][CR]$INFO[Container(10051).ListItem.Property(Place_Of_Birth)]</label>
<height>auto</height>
<font>font12</font>
<textcolor>ffffffff</textcolor>
<shadowcolor>50000000</shadowcolor>
<wrapmultiline>true</wrapmultiline>
<scroll>false</scroll>
<align>left</align>
<aligny>top</aligny>
<visible>!String.IsEmpty(Container(10051).ListItem.Property(Place_Of_Birth))</visible>
</control>
</control>
<!-- buttons -->
<control type="panel" id="100">
<left>-21</left>
<top>619</top>
<height>130</height>
<width>100%</width>
<orientation>horizontal</orientation>
<defaultcontrol always="true">0</defaultcontrol>
<onright>noop</onright>
<onleft>noop</onleft>
<ondown>10052</ondown> -->
<itemlayout height="142" width="247">
<control type="group">
<width>262</width>
<height>142</height>
<control type="group">
<control type="image">
<width>262</width>
<height>142</height>
<texture border="21" colordiffuse="D0FFFFFF">buttons/button-nofo.png</texture>
</control>
<control type="image">
<centerleft>50%</centerleft>
<top>-35</top>
<width>48</width>
<texture>icons/$INFO[ListItem.Property(icon)].png</texture>
<aspectratio>keep</aspectratio>
</control>
<control type="label">
<left>10</left>
<top>25</top>
<width>242</width>
<height>142</height>
<align>center</align>
<aligny>center</aligny>
<font>font12</font>
<textcolor>ffffffff</textcolor>
<shadowcolor>50000000</shadowcolor>
<label>$INFO[ListItem.Label]</label>
</control>
</control>
</control>
</itemlayout>
<focusedlayout height="142" width="247">
<control type="group">
<width>262</width>
<height>142</height>
<control type="group">
<control type="image">
<width>262</width>
<height>142</height>
<texture border="21" colordiffuse="FF12A0C7">buttons/button-fo.png</texture>
<visible>Control.HasFocus(100)</visible>
</control>
<control type="image">
<width>262</width>
<height>142</height>
<texture border="21" colordiffuse="D0FFFFFF">buttons/button-nofo.png</texture>
<visible>!Control.HasFocus(100)</visible>
</control>
<control type="image">
<centerleft>50%</centerleft>
<top>-35</top>
<width>48</width>
<texture>icons/$INFO[ListItem.Property(icon)].png</texture>
<aspectratio>keep</aspectratio>
</control>
<control type="label">
<left>10</left>
<top>25</top>
<width>242</width>
<height>142</height>
<align>center</align>
<aligny>center</aligny>
<font>font12</font>
<textcolor>ffffffff</textcolor>
<shadowcolor>50000000</shadowcolor>
<label>$INFO[ListItem.Label]</label>
</control>
</control>
</control>
</focusedlayout>
<content>
<item>
<property name="icon">disable</property>
<label>$LOCALIZE[15067]</label>
<onclick>Dialog.Close(all)</onclick>
</item>
<item>
<visible>!String.IsEmpty(Container(10051).ListItem.Property(biography))</visible>
<property name="icon">plot</property>
<label>$LOCALIZE[21887]</label>
<onclick>RunScript(script.embuary.info,call=textviewer,header='$ESCINFO[Container(10051).ListItem.Label]',message='$ESCINFO[Container(10051).ListItem.Property(biography)]')</onclick>
</item>
</content>
</control>
</control>
</control>
<!-- movies -->
<control type="group">
<visible>true</visible>
<visible>Integer.IsGreater(Container(10052).NumItems,0) | Container(10052).IsUpdating</visible>
<top>50</top>
<height>715</height>
<control type="group">
<control type="label">
<left>55</left>
<top>80</top>
<width>900</width>
<height>90</height>
<align>left</align>
<label>$LOCALIZE[342]</label>
<textcolor>ffffffff</textcolor>
<shadowcolor>50000000</shadowcolor>
<font>font13</font>
</control>
<control type="panel" id="10052">
<movement>6</movement>
<top>115</top>
<width>100%</width>
<ondown>10053</ondown>
<onup>100</onup>
<scrolltime tween="cubic" easing="out">500</scrolltime>
<orientation>horizontal</orientation>
<onleft>9000</onleft>
<onright>noop</onright>
<preloaditems>2</preloaditems>
<itemlayout width="293" height="561">
<control type="group">
<left>68</left>
<top>10</top>
<control type="image">
<left>15</left>
<top>-10</top>
<width>290</width>
<height>475</height>
<texture>dialogs/dialog-bg-nobo.png</texture>
<bordertexture border="21">overlays/shadow.png</bordertexture>
<bordersize>20</bordersize>
</control>
<control type="image">
<left>15</left>
<top>-10</top>
<width>290</width>
<height>400</height>
<texture background="true">$INFO[ListItem.Icon]</texture>
<aspectratio>scale</aspectratio>
<bordersize>20</bordersize>
</control>
<control type="group">
<top>10</top>
<left>35</left>
<width>250</width>
<control type="group">
<visible>!String.IsEmpty(ListItem.DBID)</visible>
<control type="image">
<left>0</left>
<top>0</top>
<width>80</width>
<height>80</height>
<texture flipy="true">overlays/overlay-bg.png</texture>
</control>
<control type="image">
<left>5</left>
<top>5</top>
<width>32</width>
<height>32</height>
<texture>icons/OverlayLocal.png</texture>
</control>
</control>
<control type="group">
<visible>Integer.IsGreater(ListItem.Playcount,0)</visible>
<control type="image">
<right>0</right>
<top>0</top>
<width>80</width>
<height>80</height>
<texture flipy="true" flipx="true">overlays/overlay-bg.png</texture>
</control>
<control type="image">
<right>5</right>
<top>5</top>
<width>32</width>
<height>32</height>
<texture>icons/OverlayWatched.png</texture>
</control>
</control>
</control>
<control type="group">
<left>29</left>
<top>375</top>
<control type="label">
<width>260</width>
<label>$INFO[ListItem.Label]</label>
<font>font10</font>
<shadowcolor>50000000</shadowcolor>
<textoffsetx>10</textoffsetx>
<scroll>false</scroll>
<align>center</align>
</control>
<control type="label">
<top>28</top>
<width>260</width>
<label>$INFO[ListItem.Year]</label>
<font>font12</font>
<shadowcolor>50000000</shadowcolor>
<textoffsetx>10</textoffsetx>
<scroll>false</scroll>
<align>center</align>
</control>
</control>
</control>
</itemlayout>
<focusedlayout width="293" height="561">
<control type="group">
<left>68</left>
<top>10</top>
<animation type="Focus">
<effect type="zoom" start="100" end="110" time="200" tween="sine" easing="inout" center="230,65" />
</animation>
<animation type="Unfocus">
<effect type="zoom" start="110" end="100" time="200" tween="sine" easing="inout" center="230,65" />
</animation>
<control type="image">
<left>15</left>
<top>-10</top>
<width>290</width>
<height>475</height>
<texture>dialogs/dialog-bg-nobo.png</texture>
<bordertexture border="21">overlays/shadow.png</bordertexture>
<bordersize>20</bordersize>
</control>
<control type="image">
<left>11</left>
<top>-14</top>
<width>297</width>
<height>478</height>
<texture colordiffuse="button_focus">colors/grey.png</texture>
<bordertexture border="21">overlays/shadow.png</bordertexture>
<bordersize>20</bordersize>
<animation effect="fade" start="0" end="100" time="200" tween="sine">Focus</animation>
<animation effect="fade" start="100" end="0" time="0">UnFocus</animation>
</control>
<control type="image">
<left>15</left>
<top>-10</top>
<width>290</width>
<height>400</height>
<texture background="true">$INFO[ListItem.Icon]</texture>
<aspectratio>scale</aspectratio>
<bordersize>20</bordersize>
</control>
<control type="group">
<top>10</top>
<left>35</left>
<width>250</width>
<control type="group">
<visible>!String.IsEmpty(ListItem.DBID)</visible>
<control type="image">
<left>0</left>
<top>0</top>
<width>80</width>
<height>80</height>
<texture flipy="true">overlays/overlay-bg.png</texture>
</control>
<control type="image">
<left>5</left>
<top>5</top>
<width>32</width>
<height>32</height>
<texture>icons/OverlayLocal.png</texture>
</control>
</control>
<control type="group">
<visible>Integer.IsGreater(ListItem.Playcount,0)</visible>
<control type="image">
<right>0</right>
<top>0</top>
<width>80</width>
<height>80</height>
<texture flipy="true" flipx="true">overlays/overlay-bg.png</texture>
</control>
<control type="image">
<right>5</right>
<top>5</top>
<width>32</width>
<height>32</height>
<texture>icons/OverlayWatched.png</texture>
</control>
</control>
</control>
<control type="group">
<left>29</left>
<top>375</top>
<control type="label">
<width>260</width>
<label>$INFO[ListItem.Label]</label>
<font>font10</font>
<shadowcolor>50000000</shadowcolor>
<textoffsetx>10</textoffsetx>
<scroll>true</scroll>
<align>center</align>
</control>
<control type="label">
<top>28</top>
<width>260</width>
<label>$INFO[ListItem.Year]</label>
<font>font12</font>
<shadowcolor>50000000</shadowcolor>
<textoffsetx>10</textoffsetx>
<scroll>true</scroll>
<align>center</align>
</control>
</control>
</control>
</focusedlayout>
</control>
</control>
</control>
<!-- tv shows -->
<control type="group">
<visible>true</visible>
<visible>Integer.IsGreater(Container(10053).NumItems,0) | Container(10053).IsUpdating</visible>
<top>50</top>
<height>715</height>
<control type="group">
<control type="label">
<left>55</left>
<top>80</top>
<width>900</width>
<height>90</height>
<align>left</align>
<label>$LOCALIZE[20343]</label>
<textcolor>ffffffff</textcolor>
<shadowcolor>50000000</shadowcolor>
<font>font13</font>
</control>
<control type="panel" id="10053">
<movement>6</movement>
<top>115</top>
<width>100%</width>
<ondown>10054</ondown>
<onup>10052</onup>
<scrolltime tween="cubic" easing="out">500</scrolltime>
<orientation>horizontal</orientation>
<onleft>9000</onleft>
<onright>noop</onright>
<preloaditems>2</preloaditems>
<itemlayout width="293" height="561">
<control type="group">
<left>68</left>
<top>10</top>
<control type="image">
<left>15</left>
<top>-10</top>
<width>290</width>
<height>475</height>
<texture>dialogs/dialog-bg-nobo.png</texture>
<bordertexture border="21">overlays/shadow.png</bordertexture>
<bordersize>20</bordersize>
</control>
<control type="image">
<left>15</left>
<top>-10</top>
<width>290</width>
<height>400</height>
<texture background="true">$INFO[ListItem.Icon]</texture>
<aspectratio>scale</aspectratio>
<bordersize>20</bordersize>
</control>
<control type="group">
<top>10</top>
<left>35</left>
<width>250</width>
<control type="group">
<visible>!String.IsEmpty(ListItem.DBID)</visible>
<control type="image">
<left>0</left>
<top>0</top>
<width>80</width>
<height>80</height>
<texture flipy="true">overlays/overlay-bg.png</texture>
</control>
<control type="image">
<left>5</left>
<top>5</top>
<width>32</width>
<height>32</height>
<texture>icons/OverlayLocal.png</texture>
</control>
</control>
<control type="group">
<visible>Integer.IsGreater(ListItem.Playcount,0)</visible>
<control type="image">
<right>0</right>
<top>0</top>
<width>80</width>
<height>80</height>
<texture flipy="true" flipx="true">overlays/overlay-bg.png</texture>
</control>
<control type="image">
<right>5</right>
<top>5</top>
<width>32</width>
<height>32</height>
<texture>icons/OverlayWatched.png</texture>
</control>
</control>
</control>
<control type="group">
<left>29</left>
<top>375</top>
<control type="label">
<width>260</width>
<label>$INFO[ListItem.Label]</label>
<font>font10</font>
<shadowcolor>50000000</shadowcolor>
<textoffsetx>10</textoffsetx>
<scroll>false</scroll>
<align>center</align>
</control>
<control type="label">
<top>28</top>
<width>260</width>
<label>$INFO[ListItem.year]</label>
<font>font12</font>
<shadowcolor>50000000</shadowcolor>
<textoffsetx>10</textoffsetx>
<scroll>false</scroll>
<align>center</align>
</control>
</control>
</control>
</itemlayout>
<focusedlayout width="293" height="561">
<control type="group">
<left>68</left>
<top>10</top>
<animation type="Focus">
<effect type="zoom" start="100" end="110" time="200" tween="sine" easing="inout" center="230,65" />
</animation>
<animation type="Unfocus">
<effect type="zoom" start="110" end="100" time="200" tween="sine" easing="inout" center="230,65" />
</animation>
<control type="image">
<left>15</left>
<top>-10</top>
<width>290</width>
<height>475</height>
<texture>dialogs/dialog-bg-nobo.png</texture>
<bordertexture border="21">overlays/shadow.png</bordertexture>
<bordersize>20</bordersize>
</control>
<control type="image">
<left>11</left>
<top>-14</top>
<width>297</width>
<height>478</height>
<texture colordiffuse="button_focus">colors/grey.png</texture>
<bordertexture border="21">overlays/shadow.png</bordertexture>
<bordersize>20</bordersize>
<animation effect="fade" start="0" end="100" time="200" tween="sine">Focus</animation>
<animation effect="fade" start="100" end="0" time="0">UnFocus</animation>
</control>
<control type="image">
<left>15</left>
<top>-10</top>
<width>290</width>
<height>400</height>
<texture background="true">$INFO[ListItem.Icon]</texture>
<aspectratio>scale</aspectratio>
<bordersize>20</bordersize>
</control>
<control type="group">
<top>10</top>
<left>35</left>
<width>250</width>
<control type="group">
<visible>!String.IsEmpty(ListItem.DBID)</visible>
<control type="image">
<left>0</left>
<top>0</top>
<width>80</width>
<height>80</height>
<texture flipy="true">overlays/overlay-bg.png</texture>
</control>
<control type="image">
<left>5</left>
<top>5</top>
<width>32</width>
<height>32</height>
<texture>icons/OverlayLocal.png</texture>
</control>
</control>
<control type="group">
<visible>Integer.IsGreater(ListItem.Playcount,0)</visible>
<control type="image">
<right>0</right>
<top>0</top>
<width>80</width>
<height>80</height>
<texture flipy="true" flipx="true">overlays/overlay-bg.png</texture>
</control>
<control type="image">
<right>5</right>
<top>5</top>
<width>32</width>
<height>32</height>
<texture>icons/OverlayWatched.png</texture>
</control>
</control>
</control>
<control type="group">
<left>29</left>
<top>375</top>
<control type="label">
<width>260</width>
<label>$INFO[ListItem.Label]</label>
<font>font10</font>
<shadowcolor>50000000</shadowcolor>
<textoffsetx>10</textoffsetx>
<scroll>true</scroll>
<align>center</align>
</control>
<control type="label">
<top>28</top>
<width>260</width>
<label>$INFO[ListItem.year]</label>
<font>font12</font>
<shadowcolor>50000000</shadowcolor>
<textoffsetx>10</textoffsetx>
<scroll>false</scroll>
<align>center</align>
</control>
</control>
</control>
</focusedlayout>
</control>
</control>
</control>
<!-- images -->
<control type="group">
<visible>true</visible>
<visible>Integer.IsGreater(Container(10054).NumItems,0) | Container(10054).IsUpdating</visible>
<top>50</top>
<height>715</height>
<control type="group">
<control type="label">
<left>55</left>
<top>80</top>
<width>900</width>
<height>90</height>
<align>left</align>
<label>$ADDON[script.embuary.info 32010]</label>
<textcolor>ffffffff</textcolor>
<shadowcolor>50000000</shadowcolor>
<font>font13</font>
</control>
<control type="panel" id="10054">
<movement>6</movement>
<top>115</top>
<width>100%</width>
<ondown>10055</ondown>
<onup>10053</onup>
<scrolltime tween="cubic" easing="out">500</scrolltime>
<orientation>horizontal</orientation>
<onleft>9000</onleft>
<onright>noop</onright>
<preloaditems>2</preloaditems>
<itemlayout width="293" height="561">
<control type="group">
<left>68</left>
<top>10</top>
<control type="image">
<left>15</left>
<top>-10</top>
<width>290</width>
<height>475</height>
<texture>dialogs/dialog-bg-nobo.png</texture>
<bordertexture border="21">overlays/shadow.png</bordertexture>
<bordersize>20</bordersize>
</control>
<control type="image">
<left>15</left>
<top>-10</top>
<width>290</width>
<height>400</height>
<texture background="true">$INFO[ListItem.Icon]</texture>
<aspectratio>scale</aspectratio>
<bordersize>20</bordersize>
</control>
<control type="group">
<left>29</left>
<top>375</top>
<control type="label">
<top>14</top>
<width>260</width>
<label>$INFO[ListItem.Label]</label>
<font>font10</font>
<shadowcolor>50000000</shadowcolor>
<textoffsetx>10</textoffsetx>
<scroll>true</scroll>
<align>center</align>
</control>
</control>
</control>
</itemlayout>
<focusedlayout width="293" height="561">
<control type="group">
<left>68</left>
<top>10</top>
<animation type="Focus">
<effect type="zoom" start="100" end="110" time="200" tween="sine" easing="inout" center="230,65" />
</animation>
<animation type="Unfocus">
<effect type="zoom" start="110" end="100" time="200" tween="sine" easing="inout" center="230,65" />
</animation>
<control type="image">
<left>15</left>
<top>-10</top>
<width>290</width>
<height>475</height>
<texture>dialogs/dialog-bg-nobo.png</texture>
<bordertexture border="21">overlays/shadow.png</bordertexture>
<bordersize>20</bordersize>
</control>
<control type="image">
<left>11</left>
<top>-14</top>
<width>297</width>
<height>478</height>
<texture colordiffuse="button_focus">colors/grey.png</texture>
<bordertexture border="21">overlays/shadow.png</bordertexture>
<bordersize>20</bordersize>
<animation effect="fade" start="0" end="100" time="200" tween="sine">Focus</animation>
<animation effect="fade" start="100" end="0" time="0">UnFocus</animation>
</control>
<control type="image">
<left>15</left>
<top>-10</top>
<width>290</width>
<height>400</height>
<texture background="true">$INFO[ListItem.Icon]</texture>
<aspectratio>scale</aspectratio>
<bordersize>20</bordersize>
</control>
<control type="group">
<left>29</left>
<top>375</top>
<control type="label">
<top>14</top>
<width>260</width>
<label>$INFO[ListItem.Label]</label>
<font>font10</font>
<shadowcolor>50000000</shadowcolor>
<textoffsetx>10</textoffsetx>
<scroll>true</scroll>
<align>center</align>
</control>
</control>
</control>
</focusedlayout>
</control>
</control>
</control>
</control>
<!-- title -->
<control type="group">
<control type="image">
<left>0</left>
<top>0</top>
<width>110%</width>
<height>170</height>
<texture>frame/InfoBar.png</texture>
</control>
<control type="group">
<left>35</left>
<right>35</right>
<height>100</height>
<animation effect="fade" start="0" end="100" time="300">WindowOpen</animation>
<animation effect="fade" start="100" end="0" time="200" condition="String.IsEmpty(Window(home).Property(script.embuary.info-nextcall))">WindowClose</animation>
<animation effect="fade" start="100" end="0" time="0" condition="!String.IsEmpty(Window(home).Property(script.embuary.info-nextcall))">WindowClose</animation>
<control type="label">
<left>0</left>
<right>150</right>
<label>$INFO[Container(10051).ListItem.Label]$INFO[Container(10051).ListItem.Year, ([COLOR FFA0A0A0],[/COLOR])]</label>
<font>font45</font>
<shadowcolor>50000000</shadowcolor>
<height>100</height>
</control>
<control type="image">
<top>10</top>
<right>0</right>
<texture>tmdb.png</texture>
<height>65</height>
<width>200</width>
<aspectratio align="right">keep</aspectratio>
</control>
</control>
</control>
</controls>
</window>

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 307 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 166 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 71 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 167 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 72 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 72 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 412 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 193 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 267 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 534 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 318 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 187 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 273 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 403 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.2 KiB