diff options
54 files changed, 1434 insertions, 126 deletions
diff --git a/addons/metadata.themoviedb.org/addon.xml b/addons/metadata.themoviedb.org/addon.xml index a37ac88ece..846272214f 100644 --- a/addons/metadata.themoviedb.org/addon.xml +++ b/addons/metadata.themoviedb.org/addon.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <addon id="metadata.themoviedb.org" name="The Movie Database" - version="3.8.0" + version="3.8.3" provider-name="XBMC Foundation"> <requires> <import addon="xbmc.metadata" version="2.1.0"/> diff --git a/addons/metadata.themoviedb.org/changelog.txt b/addons/metadata.themoviedb.org/changelog.txt index 2c81297503..6c32b33b32 100644 --- a/addons/metadata.themoviedb.org/changelog.txt +++ b/addons/metadata.themoviedb.org/changelog.txt @@ -1,3 +1,12 @@ +[B]3.8.3[/B] +- fixed: further fixes to the broken search results due to API changes + +[B]3.8.2[/B] +- fixed: further fixes to the broken search results due to API changes + +[B]3.8.1[/B] +- fixed: broken search results due to API changes + [B]3.8.0[/B] - added extra languages for selection - changed language to a selection list diff --git a/addons/metadata.themoviedb.org/tmdb.xml b/addons/metadata.themoviedb.org/tmdb.xml index 15f9f15038..73c1fb2ff1 100644 --- a/addons/metadata.themoviedb.org/tmdb.xml +++ b/addons/metadata.themoviedb.org/tmdb.xml @@ -22,13 +22,13 @@ <GetSearchResults dest="8"> <RegExp input="$$3" output="<results>\1</results>" dest="8"> <RegExp input="$$1" output="<entity><title>\4</title><id>\1</id><year>\3</year><url cache="tmdb-$INFO[language]-\1.json">http://api.tmdb.org/3/movie/\1?api_key=57983e31fb435df4df77afb854740ea9&amp;language=$INFO[language]</url></entity>" dest="3"> - <expression repeat="yes">"id":([0-9]*),"original_title":"([^"]*)","release_date":"([0-9]+)-.*?"title":"([^"]*)</expression> + <expression repeat="yes">"id":([0-9]*),"original_language":"[^"]*","original_title":"([^"]*)","overview":.*?,"release_date":"([0-9]+)-.*?"title":"([^"]*)</expression> </RegExp> <RegExp input="$$1" output="<entity><title>\2</title><id>\1</id><year>\3</year><url cache="tmdb-$INFO[language]-\1.json">http://api.tmdb.org/3/movie/\1?api_key=57983e31fb435df4df77afb854740ea9&amp;language=$INFO[language]</url></entity>" dest="3+"> - <expression repeat="yes">"id":([0-9]*),"original_title":"([^"]*)","release_date":"([0-9]+)-</expression> + <expression repeat="yes">"id":([0-9]*),"original_language":"[^"]*","original_title":"([^"]*)","overview":.*?,"release_date":"([0-9]+)-</expression> </RegExp> <RegExp input="$$1" output="<entity><title>\2</title><id>\1</id><url cache="tmdb-$INFO[language]-\1.json">http://api.tmdb.org/3/movie/\1?api_key=57983e31fb435df4df77afb854740ea9&amp;language=$INFO[language]</url></entity>" dest="3+"> - <expression repeat="yes">"id":([0-9]*),"original_title":"([^"]*)","release_date":null</expression> + <expression repeat="yes">"id":([0-9]*),"original_language":"[^"]*","original_title":"([^"]*)","overview":.*?,"release_date":null</expression> </RegExp> <expression noclean="1" /> </RegExp> diff --git a/addons/service.xbmc.versioncheck/addon.xml b/addons/service.xbmc.versioncheck/addon.xml index 8f63c24e06..7dcfb04021 100644 --- a/addons/service.xbmc.versioncheck/addon.xml +++ b/addons/service.xbmc.versioncheck/addon.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <addon id="service.xbmc.versioncheck" name="Version Check" - version="0.3.2" + version="0.3.3" provider-name="XBMC Foundation"> <requires> <import addon="xbmc.python" version="2.1.0"/> @@ -12,6 +12,7 @@ <summary lang="bg">Проверява дали ползвате най-новата версия на Kodi.</summary> <summary lang="ca">Kodi Version Check comprova si està utilitzant la última versió publicada.</summary> <summary lang="cs">Kontrola verze Kodi, zkontroluje, zda používáte nejnovější vydanou verzi.</summary> + <summary lang="da">Kodi undersøger om du benytter den nyeste version.</summary> <summary lang="de">Kodi Versionsprüfung prüft, ob die neuste Version von Kodi installiert ist.</summary> <summary lang="el">Ο Έλεγχος Έκδοσης Kodi εξετάζει αν έχετε την πιο πρόσφατη έκδοση του προγράμματος.</summary> <summary lang="en">Kodi Version Check checks if you are running latest released version.</summary> @@ -32,17 +33,21 @@ <summary lang="lt">Kodi Version Check patikrina ar naudojate naujausią versiją.</summary> <summary lang="nl">Kodi versie-check controleert of je de laatst beschikbare versie hebt.</summary> <summary lang="no">Kodi Versjonsettersyn sjekker om du kjører den sist utgitte versjonen.</summary> - <summary lang="pl">Wtyczka sprawdza czy używasz najnowszą wersję Kodi.</summary> + <summary lang="pl">Dodatek Version Check sprawdza czy używasz najnowszej wersji Kodi.</summary> <summary lang="pt">O Kodi Version Check verifica se a sua versão de lançamento do Kodi está actualizada.</summary> <summary lang="pt_BR">Kodi Version Check verifica se você está executando a versão mais recente.</summary> + <summary lang="ro">Verificare versiune Kodi verifică dacă folosiți ultima versiune lansată.</summary> <summary lang="ru">Kodi Version Check проверяет если вы используете последнюю версию</summary> <summary lang="sk">Kodi Kontrola verzií overuje, či používate najnovšiu vydanú verziu.</summary> + <summary lang="sl">Preverjanje različice Kodi preveri, če imate nameščeno nazadnje izdano različico.</summary> <summary lang="sv">Kodi Version Check kontrollerar om du använder den senaste versionen.</summary> + <summary lang="tr">Kodi Versiyon Kontrol yayınlanmış son versiyonu kullanıp kullanmadığınızı kontrol eder.</summary> <summary lang="zh">Kodi 版本检查检查你使用的是否为最新发布的版本。</summary> <description lang="be">Kodi Version Check only supports a number of platforms/distros as releases may differ between them. For more information visit the kodi.tv website.</description> <description lang="bg">Kodi Version Check поддържа няколко платформи/дистрибуции. За повече информация посетете страницата www.kodi.tv</description> <description lang="ca">Kodi Version Check només és compatible amb una sèrie de plataformes / distribucions ja que les ultimes versions poden ser diferents entre elles. Per obtenir més informació, visiteu el lloc web kodi.tv.</description> <description lang="cs">Kontrola verze Kodi podporuje pouze několik platforem/distribucí a verze mezi nimi se můžou lišit. Pro více informací navštivte webové stránky kodi.tv.</description> + <description lang="da">Kodi kan kun undersøge for opdateringer for visse platforme/udgaver, da der kan være forskel. For mere information, besøg kodi.tv.</description> <description lang="de">Kodi Versionsprüfung unterstützt nur ein paar Plattformen/Distributionen, da sich die jeweiligen Veröffentlichungen unterscheiden können. Für weitere Informationen besuchen Sie die kodi.tv-Webseite.</description> <description lang="el">Ο Έλεγχος Έκδοσης Kodi υποστηρίζει μόνο ορισμένα λειτουργικά συστήματα/διανομές, καθώς οι εκδόσεις διαφέρουν για το καθένα. Για περισσότερες πληροφορίες επισκεφθείτε το kodi.tv</description> <description lang="en">Kodi Version Check only supports a number of platforms/distros as releases may differ between them. For more information visit the kodi.tv website.</description> @@ -61,16 +66,19 @@ <description lang="lt">Kodi Version Check palaiko tik kelias platformas/distribucijas, nes leidimai tarp jų gali skirtis. Norėdami gauti daugiau informacijos, apsilankykite Kodi.tv puslapyje.</description> <description lang="nl">Kodi versie check ondersteunt alleen een aantal platforms/distro`s omdat uitgaven verschillen tussen hen. Voor meer informatie bezoek de kodi.tv website.</description> <description lang="no">Kodi Versjonsettersyn støtter kun noen plattformer/distribusjoner fordi utgivelser kan være forskjellige mellom dem. Besøk kodi.tv for mer informasjon.</description> - <description lang="pl">Kodi Version Check, jako że wydania mogą się różnić, wspiera tylko część platform/dystrybucji. Więcej informacji na stronie kodi.tv.</description> + <description lang="pl">Dodatek Version Check wspiera tylko część platform i dystrybucji. Więcej informacji na stronie kodi.tv</description> <description lang="pt">O Kodi Version Check suporta apenas algumas plataformas/distribuições, porque os lançamentos podem não ser sempre idênticos. Para mais informação, visite o site kodi.tv.</description> <description lang="pt_BR">Verificador de versões do Kodi somente suporta algumas plataformas/distros em que os lançamentos podem diferenciar entre si. Para maiores informações visite o website kodi.tv.</description> <description lang="ru">Проверка новых версий Kodi поддерживается только на ряде платформ/дистрибутивов и они могут различаться между собой. Для получения доп. информации посетите сайт kodi.tv</description> + <description lang="sl">Preverjanje različice Kodi podpira le nekatere platforme/distribucije, saj se izdaje med njimi lahko zelo razlikujejo. Za več informacij obiščite spletišče kodi.tv</description> <description lang="sv">Kodi Version Check stöder endeast ett antal plattformar/distributioner eftersom utgivningar kan skilja mellan dessa. För mer information besök kodi.tv webplatsen.</description> + <description lang="tr">Kodi Versiyon Kontrol sürümler arasında değişiklik olduğu için sadece birkaç platform/dağıtım destekler. Daha fazla bilgi için kodi.tv websitesini ziyaret edin</description> <description lang="zh">Kodi 版本检查只支持部分平台/发行版,它们之间的版本可能会有所不同。欲了解更多信息,请访问 kodi.tv 网站。</description> <disclaimer lang="be">Feel free to use this script. For information visit kodi.tv</disclaimer> <disclaimer lang="bg">Ползвайте скрипта свободно. За повече информация посетете www.kodi.tv</disclaimer> <disclaimer lang="ca">Sigues lliure d'utilitzar aquest script. Per més informació visita kodi.tv</disclaimer> <disclaimer lang="cs">Neváhejte použít tento skript. Pro více informací navštivte kodi.tv</disclaimer> + <disclaimer lang="da">Du er velkommen til at bruge dette script. For information, besøg kodi.tv</disclaimer> <disclaimer lang="de">Zögern Sie nicht, dieses Skript zu verwenden. Für Informationen besuchen Sie kodi.tv</disclaimer> <disclaimer lang="el">Χρησιμοποιήστε αυτό το script ελεύθερα. Για πληροφορίες επισκεφθείτε το kodi.tv</disclaimer> <disclaimer lang="en">Feel free to use this script. For information visit kodi.tv</disclaimer> @@ -90,11 +98,13 @@ <disclaimer lang="lt">Galite laisvai naudoti šį scenarijų. Apsilankykite kodi.tv, norėdami gauti daugiau informacijos.</disclaimer> <disclaimer lang="nl">Gebruik dit script vrijblijvend. Voor meer informatie bezoek kodi.tv</disclaimer> <disclaimer lang="no">Du har fri tillatelse til å benytte dette skriptet. Besøk kodi.tv for informasjon</disclaimer> - <disclaimer lang="pl">Zapraszamy do używania skryptu. Więcej informacji na stronie kodi.tv.</disclaimer> + <disclaimer lang="pl">Zapraszamy do używania tego dodatku. Więcej informacji na stronie kodi.tv</disclaimer> <disclaimer lang="pt">Esteja à vontade para usar este script. Para mais informação, visite kodi.tv.</disclaimer> <disclaimer lang="pt_BR">Sinta-se livre para usar este script. Para maiores informações visite kodi.tv</disclaimer> <disclaimer lang="ru">Используйте этот скрипт на свое усмотрение. Для информации посетите kodi.tv</disclaimer> + <disclaimer lang="sl">Izvolite uporabiti ta skript. Za dodatne informacije obiščite kodi.tv</disclaimer> <disclaimer lang="sv">Använd gärna detta skript. För information, besök kodi.tv</disclaimer> + <disclaimer lang="tr">Bu betiği kullanmaktan çekinmeyin. Daha fazla bilgi için kodi.tv ziyaret edin</disclaimer> <disclaimer lang="zh">可放心使用此脚本,更多信息访问 kodi.tv</disclaimer> <platform>all</platform> <license>GNU GENERAL PUBLIC LICENSE. Version 2, June 1991</license> diff --git a/addons/service.xbmc.versioncheck/changelog.txt b/addons/service.xbmc.versioncheck/changelog.txt index b5f5c3a56a..e2a9d917cd 100644 --- a/addons/service.xbmc.versioncheck/changelog.txt +++ b/addons/service.xbmc.versioncheck/changelog.txt @@ -1,3 +1,7 @@ +v0.3.3 +- Updated language files from Transifex +- Update version list + v0.3.2 - Don't notify on newer unreleased builds diff --git a/addons/service.xbmc.versioncheck/resources/language/Asturian/strings.po b/addons/service.xbmc.versioncheck/resources/language/Asturian/strings.po new file mode 100644 index 0000000000..8f916b6dcb --- /dev/null +++ b/addons/service.xbmc.versioncheck/resources/language/Asturian/strings.po @@ -0,0 +1,21 @@ +# Kodi Media Center language file +# Addon Name: Version Check +# Addon id: service.xbmc.versioncheck +# Addon Provider: XBMC Foundation +msgid "" +msgstr "" +"Project-Id-Version: XBMC Addons\n" +"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Asturian (http://www.transifex.com/projects/p/xbmc-addons/language/ast/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ast\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#32020" +msgid "General" +msgstr "Xeneral" diff --git a/addons/service.xbmc.versioncheck/resources/language/Croatian/strings.po b/addons/service.xbmc.versioncheck/resources/language/Croatian/strings.po index bf2c4ceae3..0b7bbd3f02 100644 --- a/addons/service.xbmc.versioncheck/resources/language/Croatian/strings.po +++ b/addons/service.xbmc.versioncheck/resources/language/Croatian/strings.po @@ -28,6 +28,10 @@ msgctxt "#32009" msgid "Would you like to remove this reminder?" msgstr "Želite li ukloniti ovog podsjetnika?" +msgctxt "#32010" +msgid "You can enable/disable it through add-on settings." +msgstr "Možete ga omogućiti/onemogućiti u postavakama dodataka." + msgctxt "#32011" msgid "Use your package manager(apt) to upgrade." msgstr "Koristite svoj upravitelj paketa (apt) za nadogradnju." @@ -48,6 +52,10 @@ msgctxt "#32015" msgid "Do you want to check the repository for a new version?" msgstr "Želite li provjeriti repozitorij za novu inačicu?" +msgctxt "#32016" +msgid "There is a newer stable Kodi version available." +msgstr "Dostupna je novija stabilna inačica Kodija." + msgctxt "#32020" msgid "General" msgstr "Općenito" @@ -67,3 +75,27 @@ msgstr "Linux: nadogradi cjelokupan sustav" msgctxt "#32024" msgid "Linux: Upgrade using apt" msgstr "Linux: ažurirajte koristeći 'apt'" + +msgctxt "#32030" +msgid "A new stable version of Kodi is available." +msgstr "Dostupna je novija stabilna inačica Kodija." + +msgctxt "#32031" +msgid "Visit http://kodi.tv for more information." +msgstr "Posjetite http://kodi.tv za više informacija." + +msgctxt "#32032" +msgid "A new stable version of Kodi is available." +msgstr "Dostupna je novija stabilna inačica Kodija." + +msgctxt "#32033" +msgid "Visit http://kodi.tv for more information." +msgstr "Posjetite http://kodi.tv za više informacija." + +msgctxt "#32034" +msgid "Using %s while %s is available." +msgstr "Koristite %s dok je %s dostupna." + +msgctxt "#32035" +msgid "It is recommended that you to upgrade to a newer version." +msgstr "Preporučljivo je da nadogradite na noviju inačicu." diff --git a/addons/service.xbmc.versioncheck/resources/language/Czech/strings.po b/addons/service.xbmc.versioncheck/resources/language/Czech/strings.po index 2dcde3d1d4..61f91c630b 100644 --- a/addons/service.xbmc.versioncheck/resources/language/Czech/strings.po +++ b/addons/service.xbmc.versioncheck/resources/language/Czech/strings.po @@ -28,6 +28,10 @@ msgctxt "#32009" msgid "Would you like to remove this reminder?" msgstr "Chtěli byste odstranit tuto připomínku?" +msgctxt "#32010" +msgid "You can enable/disable it through add-on settings." +msgstr "Je možno povolit/zakázat v nastavení doplňku" + msgctxt "#32011" msgid "Use your package manager(apt) to upgrade." msgstr "Použijte správce balíčků (APT) k upgradu." @@ -71,3 +75,27 @@ msgstr "Linux: Aktualizace celého systému" msgctxt "#32024" msgid "Linux: Upgrade using apt" msgstr "Linux: Aktualizace za použití apt" + +msgctxt "#32030" +msgid "A new stable version of Kodi is available." +msgstr "Je k dispozici nová stabilní verze Kodi." + +msgctxt "#32031" +msgid "Visit http://kodi.tv for more information." +msgstr "Navštivte http://kodi.tv pro více informací." + +msgctxt "#32032" +msgid "A new stable version of Kodi is available." +msgstr "Je k dispozici nová stabilní verze Kodi." + +msgctxt "#32033" +msgid "Visit http://kodi.tv for more information." +msgstr "Navštivte http://kodi.tv pro více informací." + +msgctxt "#32034" +msgid "Using %s while %s is available." +msgstr "Používáte %s zatímco je %s k dispozici." + +msgctxt "#32035" +msgid "It is recommended that you to upgrade to a newer version." +msgstr "Je doporučeno upgradovat na novější verzi." diff --git a/addons/service.xbmc.versioncheck/resources/language/Danish/strings.po b/addons/service.xbmc.versioncheck/resources/language/Danish/strings.po index 574cdb5e14..d50c670ccc 100644 --- a/addons/service.xbmc.versioncheck/resources/language/Danish/strings.po +++ b/addons/service.xbmc.versioncheck/resources/language/Danish/strings.po @@ -16,6 +16,86 @@ msgstr "" "Language: da\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +msgctxt "#32001" +msgid "We would like to recommend you to upgrade." +msgstr "Opdatering anbefales!" + +msgctxt "#32002" +msgid "Visit Kodi.tv for more information." +msgstr "Besøg Kodi.tv for mere information." + +msgctxt "#32009" +msgid "Would you like to remove this reminder?" +msgstr "Ønsker du at fjerne denne advarsel?" + +msgctxt "#32010" +msgid "You can enable/disable it through add-on settings." +msgstr "Du kan slå den til/fra i tilføjelses indstillingerne." + +msgctxt "#32011" +msgid "Use your package manager(apt) to upgrade." +msgstr "Benyt til pakke manager(apt) til at opgradere." + +msgctxt "#32012" +msgid "A new version is available, do you want to upgrade now?" +msgstr "Ny version tilgængelig. Ønsker du at opdatere?" + +msgctxt "#32013" +msgid "Upgrade successful" +msgstr "Opdatering lykkedes" + +msgctxt "#32014" +msgid "Do you want to restart Kodi to finish the upgrade?" +msgstr "Ønsker du at genstarte Kodi for at afslutte opgraderingen?" + +msgctxt "#32015" +msgid "Do you want to check the repository for a new version?" +msgstr "Ønsker du at undersøge om repositoriet for ny version?" + +msgctxt "#32016" +msgid "There is a newer stable Kodi version available." +msgstr "Der er en nyere stabil version af Kodi tilgængelig." + msgctxt "#32020" msgid "General" msgstr "Generelt" + +msgctxt "#32021" +msgid "Enable Kodi version check?" +msgstr "Tjek for Kodi-opdateringer?" + +msgctxt "#32022" +msgid "Please enter your password" +msgstr "Indtast dit password" + +msgctxt "#32023" +msgid "Linux: Upgrade complete system" +msgstr "Linux: Opgrader hele systemet" + +msgctxt "#32024" +msgid "Linux: Upgrade using apt" +msgstr "Linux: Opgrader ved brug af apt" + +msgctxt "#32030" +msgid "A new stable version of Kodi is available." +msgstr "Der er en ny stabil version af Kodi tilgængelig." + +msgctxt "#32031" +msgid "Visit http://kodi.tv for more information." +msgstr "Besøg http://kodi.tv for mere information." + +msgctxt "#32032" +msgid "A new stable version of Kodi is available." +msgstr "Der er en ny stabil version af Kodi tilgængelig." + +msgctxt "#32033" +msgid "Visit http://kodi.tv for more information." +msgstr "Besøg http://kodi.tv for mere information." + +msgctxt "#32034" +msgid "Using %s while %s is available." +msgstr "Du benytter %s, mens %s er tilgængelig." + +msgctxt "#32035" +msgid "It is recommended that you to upgrade to a newer version." +msgstr "Det anbefales at du opdaterer til en nyere version." diff --git a/addons/service.xbmc.versioncheck/resources/language/French (Canada)/strings.po b/addons/service.xbmc.versioncheck/resources/language/French (Canada)/strings.po index de439470de..aa6ea3c6ac 100644 --- a/addons/service.xbmc.versioncheck/resources/language/French (Canada)/strings.po +++ b/addons/service.xbmc.versioncheck/resources/language/French (Canada)/strings.po @@ -26,7 +26,7 @@ msgstr "Visitez Kodi.tv pour plus d'information." msgctxt "#32009" msgid "Would you like to remove this reminder?" -msgstr "Voulez-vous enlever ce rappel?" +msgstr "Voulez-vous supprimer ce rappel?" msgctxt "#32010" msgid "You can enable/disable it through add-on settings." @@ -38,7 +38,7 @@ msgstr "Utilisez votre gestionnaire de paquets (apt) pour mettre à niveau." msgctxt "#32012" msgid "A new version is available, do you want to upgrade now?" -msgstr "Une nouvelle version est disponible, voulez-vous mettre à niveau maintenant?" +msgstr "Une nouvelle version est proposée, voulez-vous mettre à niveau maintenant?" msgctxt "#32013" msgid "Upgrade successful" @@ -50,11 +50,11 @@ msgstr "Voulez-vous redémarrer Kodi pour finir la mise à niveau?" msgctxt "#32015" msgid "Do you want to check the repository for a new version?" -msgstr "Voulez-vous vérifier si une nouvelle version est disponible dans le dépôt?" +msgstr "Voulez-vous vérifier si une nouvelle version est proposée dans le dépôt?" msgctxt "#32016" msgid "There is a newer stable Kodi version available." -msgstr "Il y a une nouvelle version stable de Kodi disponible." +msgstr "Une nouvelle version stable de Kodi est proposée." msgctxt "#32020" msgid "General" @@ -78,7 +78,7 @@ msgstr "Linux : mettre à niveau en utilisant apt" msgctxt "#32030" msgid "A new stable version of Kodi is available." -msgstr "Une nouvelle version stable de Kodi est disponible." +msgstr "Une nouvelle version stable de Kodi est proposée." msgctxt "#32031" msgid "Visit http://kodi.tv for more information." @@ -86,7 +86,7 @@ msgstr "Visitez http://kodi.tv pour plus d'informations." msgctxt "#32032" msgid "A new stable version of Kodi is available." -msgstr "Une nouvelle version de Kodi est disponible." +msgstr "Une nouvelle version de Kodi est proposée." msgctxt "#32033" msgid "Visit http://kodi.tv for more information." @@ -94,7 +94,7 @@ msgstr "Visitez http://kodi.tv pour plus d'informations." msgctxt "#32034" msgid "Using %s while %s is available." -msgstr "%s est utilisé alors que %s est disponible." +msgstr "%s est utilisée alors que %s est proposée." msgctxt "#32035" msgid "It is recommended that you to upgrade to a newer version." diff --git a/addons/service.xbmc.versioncheck/resources/language/French/strings.po b/addons/service.xbmc.versioncheck/resources/language/French/strings.po index aac9565f6a..c2fd99fca6 100644 --- a/addons/service.xbmc.versioncheck/resources/language/French/strings.po +++ b/addons/service.xbmc.versioncheck/resources/language/French/strings.po @@ -28,6 +28,10 @@ msgctxt "#32009" msgid "Would you like to remove this reminder?" msgstr "Souhaitez-vous supprimer ce rappel ?" +msgctxt "#32010" +msgid "You can enable/disable it through add-on settings." +msgstr "Vous pouvez l'activer/désactiver depuis les paramètres de l'extension." + msgctxt "#32011" msgid "Use your package manager(apt) to upgrade." msgstr "Utilisez votre gestionnaire de paquets (apt) pour mettre à jour." @@ -71,3 +75,27 @@ msgstr "Linux: Mise à niveau du système terminée" msgctxt "#32024" msgid "Linux: Upgrade using apt" msgstr "Linux: Mettre à niveau en utilisant apt" + +msgctxt "#32030" +msgid "A new stable version of Kodi is available." +msgstr "Une nouvelle version stable de Kodi est disponible" + +msgctxt "#32031" +msgid "Visit http://kodi.tv for more information." +msgstr "Visitez http://kodi.tv pour plus d'informations." + +msgctxt "#32032" +msgid "A new stable version of Kodi is available." +msgstr "A new stable version of Kodi is available." + +msgctxt "#32033" +msgid "Visit http://kodi.tv for more information." +msgstr "Visitez http://kodi.tv pour plus d'informations." + +msgctxt "#32034" +msgid "Using %s while %s is available." +msgstr "Utiliser %s tant que %s est disponible." + +msgctxt "#32035" +msgid "It is recommended that you to upgrade to a newer version." +msgstr "Il est recommandé de mettre à niveau vers une nouvelle version." diff --git a/addons/service.xbmc.versioncheck/resources/language/Galician/strings.po b/addons/service.xbmc.versioncheck/resources/language/Galician/strings.po index e2ec309cda..b608e6aaa0 100644 --- a/addons/service.xbmc.versioncheck/resources/language/Galician/strings.po +++ b/addons/service.xbmc.versioncheck/resources/language/Galician/strings.po @@ -28,13 +28,17 @@ msgctxt "#32009" msgid "Would you like to remove this reminder?" msgstr "Quere eliminar este aviso?" +msgctxt "#32010" +msgid "You can enable/disable it through add-on settings." +msgstr "Pode des/activalo a través dos axustes do complemento." + msgctxt "#32011" msgid "Use your package manager(apt) to upgrade." msgstr "Use o xestor de paquetes(apt) para actualizar." msgctxt "#32012" msgid "A new version is available, do you want to upgrade now?" -msgstr "Hai unha nova versión dispoñíbel, ¿quere actualizar agora?" +msgstr "Hai unha nova versión dispoñíbel, quere actualizar agora?" msgctxt "#32013" msgid "Upgrade successful" @@ -82,12 +86,16 @@ msgstr "Ir a http://kodi.tv para máis información." msgctxt "#32032" msgid "A new stable version of Kodi is available." -msgstr "Está dispoñible unha versión estable nova de Kodi. " +msgstr "Está dispoñíbel unha nova versión estábel de Kodi. " msgctxt "#32033" msgid "Visit http://kodi.tv for more information." msgstr "Ir a http://kodi.tv para máis información." +msgctxt "#32034" +msgid "Using %s while %s is available." +msgstr "Está a empregar a versión %s mentres que a %s está dispoñíbel." + msgctxt "#32035" msgid "It is recommended that you to upgrade to a newer version." -msgstr "É recomendable actualizar á nova versión." +msgstr "É recomendábel actualizar á nova versión." diff --git a/addons/service.xbmc.versioncheck/resources/language/Hungarian/strings.po b/addons/service.xbmc.versioncheck/resources/language/Hungarian/strings.po index 48181a64dc..7fa35c362f 100644 --- a/addons/service.xbmc.versioncheck/resources/language/Hungarian/strings.po +++ b/addons/service.xbmc.versioncheck/resources/language/Hungarian/strings.po @@ -28,6 +28,10 @@ msgctxt "#32009" msgid "Would you like to remove this reminder?" msgstr "Szeretné eltávolítani ezt az emlékeztetőt?" +msgctxt "#32010" +msgid "You can enable/disable it through add-on settings." +msgstr "Engedélyezheti / letilthatja a kiegészítő beállításaiban." + msgctxt "#32011" msgid "Use your package manager(apt) to upgrade." msgstr "Használja a csomagkezelőt (apt) a frissítéshez." @@ -71,3 +75,27 @@ msgstr "Linux: Teljes rendszer frissítése" msgctxt "#32024" msgid "Linux: Upgrade using apt" msgstr "Linux: Frissítés apt segítségével" + +msgctxt "#32030" +msgid "A new stable version of Kodi is available." +msgstr "Újabb stabil Kodi kiadás elérhető." + +msgctxt "#32031" +msgid "Visit http://kodi.tv for more information." +msgstr "További információkért keresse fel az http://kodi.tv oldalt!" + +msgctxt "#32032" +msgid "A new stable version of Kodi is available." +msgstr "Újabb stabil Kodi kiadás elérhető." + +msgctxt "#32033" +msgid "Visit http://kodi.tv for more information." +msgstr "További információkért keresse fel az http://kodi.tv." + +msgctxt "#32034" +msgid "Using %s while %s is available." +msgstr "%s használata mialatt %s elérhető." + +msgctxt "#32035" +msgid "It is recommended that you to upgrade to a newer version." +msgstr "Javasolt a hogy frissítsen az újabb változatra." diff --git a/addons/service.xbmc.versioncheck/resources/language/Italian/strings.po b/addons/service.xbmc.versioncheck/resources/language/Italian/strings.po index e091724d72..6724984dbd 100644 --- a/addons/service.xbmc.versioncheck/resources/language/Italian/strings.po +++ b/addons/service.xbmc.versioncheck/resources/language/Italian/strings.po @@ -28,6 +28,10 @@ msgctxt "#32009" msgid "Would you like to remove this reminder?" msgstr "Vuoi eliminare questo promemoria?" +msgctxt "#32010" +msgid "You can enable/disable it through add-on settings." +msgstr "Puoi abilitare/disabilitare attraverso le impostazione dell'addon" + msgctxt "#32011" msgid "Use your package manager(apt) to upgrade." msgstr "Usa il tuo gestore pacchetti (apt) per aggiornare." @@ -71,3 +75,27 @@ msgstr "Linux: Aggiornamento completo del sistema" msgctxt "#32024" msgid "Linux: Upgrade using apt" msgstr "Linux: Aggiorna utilizzando apt" + +msgctxt "#32030" +msgid "A new stable version of Kodi is available." +msgstr "Una nuova versione stabile di di Kodi è disponibile " + +msgctxt "#32031" +msgid "Visit http://kodi.tv for more information." +msgstr "Visita http://kodi.tv per più informazioni." + +msgctxt "#32032" +msgid "A new stable version of Kodi is available." +msgstr "Una nuova versione stabile di di Kodi è disponibile." + +msgctxt "#32033" +msgid "Visit http://kodi.tv for more information." +msgstr "Visita http://kodi.tv per più informazioni." + +msgctxt "#32034" +msgid "Using %s while %s is available." +msgstr "Usa %s mentre %s è disponibile." + +msgctxt "#32035" +msgid "It is recommended that you to upgrade to a newer version." +msgstr "E' raccomandato che tu aggiorni ad una nuova versione." diff --git a/addons/service.xbmc.versioncheck/resources/language/Norwegian/strings.po b/addons/service.xbmc.versioncheck/resources/language/Norwegian/strings.po index 4d4d6fbe13..9a7de075e0 100644 --- a/addons/service.xbmc.versioncheck/resources/language/Norwegian/strings.po +++ b/addons/service.xbmc.versioncheck/resources/language/Norwegian/strings.po @@ -28,6 +28,10 @@ msgctxt "#32009" msgid "Would you like to remove this reminder?" msgstr "Ønsker du å fjerne denne påminnelsen?" +msgctxt "#32010" +msgid "You can enable/disable it through add-on settings." +msgstr "Du kan aktivere/deaktivere det gjennom utvidelsesinnstillingene." + msgctxt "#32011" msgid "Use your package manager(apt) to upgrade." msgstr "Bruk pakkebehandleren (apt) din for å oppgradere." @@ -71,3 +75,27 @@ msgstr "Linux: Oppgrader hele systemet" msgctxt "#32024" msgid "Linux: Upgrade using apt" msgstr "Linux: Oppgrader med apt" + +msgctxt "#32030" +msgid "A new stable version of Kodi is available." +msgstr "En ny stabil versjon av Kodi er tilgjengelig." + +msgctxt "#32031" +msgid "Visit http://kodi.tv for more information." +msgstr "Se http://kodi.tv for mer informasjon." + +msgctxt "#32032" +msgid "A new stable version of Kodi is available." +msgstr "En ny stabil versjon av Kodi er tilgjengelig." + +msgctxt "#32033" +msgid "Visit http://kodi.tv for more information." +msgstr "Se http://kodi.tv for mer informasjon." + +msgctxt "#32034" +msgid "Using %s while %s is available." +msgstr "Bruker %s mens %s er tilgjengelig." + +msgctxt "#32035" +msgid "It is recommended that you to upgrade to a newer version." +msgstr "Det er anbefalt å oppgradere til en nyere versjon." diff --git a/addons/service.xbmc.versioncheck/resources/language/Polish/strings.po b/addons/service.xbmc.versioncheck/resources/language/Polish/strings.po index 190816113b..8eddb69d36 100644 --- a/addons/service.xbmc.versioncheck/resources/language/Polish/strings.po +++ b/addons/service.xbmc.versioncheck/resources/language/Polish/strings.po @@ -18,16 +18,20 @@ msgstr "" msgctxt "#32001" msgid "We would like to recommend you to upgrade." -msgstr "Chcielibyśmy polecić aktualizację." +msgstr "Zaleca się uaktualnienie do nowszej wersji." msgctxt "#32002" msgid "Visit Kodi.tv for more information." -msgstr "Odwiedź Kodi.tv po więcej informacji." +msgstr "Odwiedź stronę Kodi.tv po więcej informacji." msgctxt "#32009" msgid "Would you like to remove this reminder?" msgstr "Usunąć to przypomnienie?" +msgctxt "#32010" +msgid "You can enable/disable it through add-on settings." +msgstr "Można to włączyć/wyłączyć w ustawieniach wtyczki." + msgctxt "#32011" msgid "Use your package manager(apt) to upgrade." msgstr "Używaj własnego menedżera pakietów (apt) do aktualizacji." @@ -42,7 +46,7 @@ msgstr "Aktualizacja powiodła się" msgctxt "#32014" msgid "Do you want to restart Kodi to finish the upgrade?" -msgstr "Chcesz zrestartować Kodi by dokończyć aktualizację?" +msgstr "Chcesz zrestartować Kodi, aby dokończyć aktualizację?" msgctxt "#32015" msgid "Do you want to check the repository for a new version?" @@ -62,7 +66,7 @@ msgstr "Sprawdzać wersję Kodi?" msgctxt "#32022" msgid "Please enter your password" -msgstr "Proszę podać hasło" +msgstr "Wprowadź hasło" msgctxt "#32023" msgid "Linux: Upgrade complete system" @@ -71,3 +75,27 @@ msgstr "Linux: aktualizacja systemu kompletna" msgctxt "#32024" msgid "Linux: Upgrade using apt" msgstr "Linux: Aktualizuj za pomocą menadżera pakietów (apt)" + +msgctxt "#32030" +msgid "A new stable version of Kodi is available." +msgstr "Dostępna jest nowa, stabilna wersja Kodi." + +msgctxt "#32031" +msgid "Visit http://kodi.tv for more information." +msgstr "Odwiedź stronę http://kodi.tv po więcej informacji." + +msgctxt "#32032" +msgid "A new stable version of Kodi is available." +msgstr "Dostępna jest nowa, stabilna wersja Kodi." + +msgctxt "#32033" +msgid "Visit http://kodi.tv for more information." +msgstr "Odwiedź stronę http://kodi.tv po więcej informacji." + +msgctxt "#32034" +msgid "Using %s while %s is available." +msgstr "Korzystasz z %s a dostępna jest już wersja %s." + +msgctxt "#32035" +msgid "It is recommended that you to upgrade to a newer version." +msgstr "Zaleca się uaktualnienie do nowszej wersji." diff --git a/addons/service.xbmc.versioncheck/resources/language/Portuguese/strings.po b/addons/service.xbmc.versioncheck/resources/language/Portuguese/strings.po index efd5d20362..9ea1e4549f 100644 --- a/addons/service.xbmc.versioncheck/resources/language/Portuguese/strings.po +++ b/addons/service.xbmc.versioncheck/resources/language/Portuguese/strings.po @@ -28,13 +28,17 @@ msgctxt "#32009" msgid "Would you like to remove this reminder?" msgstr "Gostaria de anular este lembrete?" +msgctxt "#32010" +msgid "You can enable/disable it through add-on settings." +msgstr "Pode activá-lo/desactivá-lo através das definições de addon." + msgctxt "#32011" msgid "Use your package manager(apt) to upgrade." msgstr "Use o gestor de pacotes(apt) para actualizar." msgctxt "#32012" msgid "A new version is available, do you want to upgrade now?" -msgstr "Uma nova versão está disponível, quer actualizar agora?" +msgstr "Uma nova versão está disponível, deseja actualizar agora?" msgctxt "#32013" msgid "Upgrade successful" @@ -42,11 +46,11 @@ msgstr "A actualização foi concluída" msgctxt "#32014" msgid "Do you want to restart Kodi to finish the upgrade?" -msgstr "Quer reiniciar o Kodi para concluir a actualização?" +msgstr "Deseja reiniciar o Kodi para concluir a actualização?" msgctxt "#32015" msgid "Do you want to check the repository for a new version?" -msgstr "Quer procurar por uma nova versão no repositório?" +msgstr "Deseja procurar por uma nova versão no repositório?" msgctxt "#32016" msgid "There is a newer stable Kodi version available." @@ -54,7 +58,7 @@ msgstr "Está disponível uma versão mais recente do Kodi." msgctxt "#32020" msgid "General" -msgstr "Menus" +msgstr "Geral" msgctxt "#32021" msgid "Enable Kodi version check?" @@ -71,3 +75,27 @@ msgstr "Linux: Actualização completa do sistema" msgctxt "#32024" msgid "Linux: Upgrade using apt" msgstr "Linux: Actualizar com apt" + +msgctxt "#32030" +msgid "A new stable version of Kodi is available." +msgstr "Está disponível uma nova versão do Kodi." + +msgctxt "#32031" +msgid "Visit http://kodi.tv for more information." +msgstr "Visite http://kodi.tv para mais informação." + +msgctxt "#32032" +msgid "A new stable version of Kodi is available." +msgstr "Está disponível uma nova versão do Kodi." + +msgctxt "#32033" +msgid "Visit http://kodi.tv for more information." +msgstr "Visite http://kodi.tv para mais informação." + +msgctxt "#32034" +msgid "Using %s while %s is available." +msgstr "Possuis a %s embora esteja disponível a %s." + +msgctxt "#32035" +msgid "It is recommended that you to upgrade to a newer version." +msgstr "Recomenda-se que actualize para uma versão mais recente." diff --git a/addons/service.xbmc.versioncheck/resources/language/Romanian/strings.po b/addons/service.xbmc.versioncheck/resources/language/Romanian/strings.po index c90947238b..cf765156bf 100644 --- a/addons/service.xbmc.versioncheck/resources/language/Romanian/strings.po +++ b/addons/service.xbmc.versioncheck/resources/language/Romanian/strings.po @@ -16,6 +16,50 @@ msgstr "" "Language: ro\n" "Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));\n" +msgctxt "#32002" +msgid "Visit Kodi.tv for more information." +msgstr "Vizitați Kodi.tv pentru mai multe informații" + +msgctxt "#32014" +msgid "Do you want to restart Kodi to finish the upgrade?" +msgstr "Doriți să reporniți Kodi pentru a finaliza actualizarea?" + +msgctxt "#32016" +msgid "There is a newer stable Kodi version available." +msgstr "Este disponibilă o nouă versiune stabilă pentru Kodi." + msgctxt "#32020" msgid "General" msgstr "General" + +msgctxt "#32021" +msgid "Enable Kodi version check?" +msgstr "Activați Verificare versiune Kodi?" + +msgctxt "#32022" +msgid "Please enter your password" +msgstr "Introduceți parola dumneavoastră" + +msgctxt "#32024" +msgid "Linux: Upgrade using apt" +msgstr "Linux: Actualizare folosind apt" + +msgctxt "#32030" +msgid "A new stable version of Kodi is available." +msgstr "Este disponibilă o versiune stabilă mai nouă pentru Kodi." + +msgctxt "#32031" +msgid "Visit http://kodi.tv for more information." +msgstr "Vizitați http://kodi.tv pentru mai multe informații." + +msgctxt "#32032" +msgid "A new stable version of Kodi is available." +msgstr "Este disponibilă o versiune stabilă mai nouă pentru Kodi." + +msgctxt "#32033" +msgid "Visit http://kodi.tv for more information." +msgstr "Vizitați http://kodi.tv pentru mai multe informații." + +msgctxt "#32035" +msgid "It is recommended that you to upgrade to a newer version." +msgstr "Este recomandat să treceți la o versiune mai nouă." diff --git a/addons/service.xbmc.versioncheck/resources/language/Russian/strings.po b/addons/service.xbmc.versioncheck/resources/language/Russian/strings.po index 8f2ac0d634..9417147284 100644 --- a/addons/service.xbmc.versioncheck/resources/language/Russian/strings.po +++ b/addons/service.xbmc.versioncheck/resources/language/Russian/strings.po @@ -28,6 +28,10 @@ msgctxt "#32009" msgid "Would you like to remove this reminder?" msgstr "Вы хотите убрать это напоминание?" +msgctxt "#32010" +msgid "You can enable/disable it through add-on settings." +msgstr "Вы можете включить/выключить это в разделе настроек дополнений." + msgctxt "#32011" msgid "Use your package manager(apt) to upgrade." msgstr "Используйте Ваш менеджер пакетов (apt) чтобы обновиться." @@ -71,3 +75,27 @@ msgstr "Linux: Полное обновление системы" msgctxt "#32024" msgid "Linux: Upgrade using apt" msgstr "Linux: Обновление с помощью apt" + +msgctxt "#32030" +msgid "A new stable version of Kodi is available." +msgstr "Доступна новая стабильная версия Kodi." + +msgctxt "#32031" +msgid "Visit http://kodi.tv for more information." +msgstr "Для более полной информации посетите http://kodi.tv" + +msgctxt "#32032" +msgid "A new stable version of Kodi is available." +msgstr "Доступна новая стабильная версия Kodi." + +msgctxt "#32033" +msgid "Visit http://kodi.tv for more information." +msgstr "Для более полной информации посетите http://kodi.tv" + +msgctxt "#32034" +msgid "Using %s while %s is available." +msgstr "Вы используете %s, но обновленная версия %s уже доступна." + +msgctxt "#32035" +msgid "It is recommended that you to upgrade to a newer version." +msgstr "Рекомендуется обновление до новой версии." diff --git a/addons/service.xbmc.versioncheck/resources/language/Slovak/strings.po b/addons/service.xbmc.versioncheck/resources/language/Slovak/strings.po index c31861f7f3..201f15955b 100644 --- a/addons/service.xbmc.versioncheck/resources/language/Slovak/strings.po +++ b/addons/service.xbmc.versioncheck/resources/language/Slovak/strings.po @@ -20,6 +20,10 @@ msgctxt "#32001" msgid "We would like to recommend you to upgrade." msgstr "Radi by sme vám odporučili aktualizáciu." +msgctxt "#32002" +msgid "Visit Kodi.tv for more information." +msgstr "Pre viac informácií navštívte Kodi.tv" + msgctxt "#32009" msgid "Would you like to remove this reminder?" msgstr "Chcete túto pripomienku odstrániť?" @@ -67,3 +71,19 @@ msgstr "Linux: Aktualizovať kompletný systém" msgctxt "#32024" msgid "Linux: Upgrade using apt" msgstr "Linux: Aktualizovať pomocou apt" + +msgctxt "#32030" +msgid "A new stable version of Kodi is available." +msgstr "Nová stabilná verzia Kodi je k dipozícii." + +msgctxt "#32031" +msgid "Visit http://kodi.tv for more information." +msgstr "Pre viac informácií navštívte http://kodi.tv." + +msgctxt "#32032" +msgid "A new stable version of Kodi is available." +msgstr "Nová stabilná verzia Kodi je k dipozícii." + +msgctxt "#32033" +msgid "Visit http://kodi.tv for more information." +msgstr "Pre viac informácií navštívte http://kodi.tv." diff --git a/addons/service.xbmc.versioncheck/resources/language/Slovenian/strings.po b/addons/service.xbmc.versioncheck/resources/language/Slovenian/strings.po index 0154a2b08b..f0c869c681 100644 --- a/addons/service.xbmc.versioncheck/resources/language/Slovenian/strings.po +++ b/addons/service.xbmc.versioncheck/resources/language/Slovenian/strings.po @@ -16,6 +16,86 @@ msgstr "" "Language: sl\n" "Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);\n" +msgctxt "#32001" +msgid "We would like to recommend you to upgrade." +msgstr "Predlagamo vam nadgradnjo." + +msgctxt "#32002" +msgid "Visit Kodi.tv for more information." +msgstr "Za dodatne informacije obiščite Kodi.tv." + +msgctxt "#32009" +msgid "Would you like to remove this reminder?" +msgstr "Želite odstraniti ta opomnik?" + +msgctxt "#32010" +msgid "You can enable/disable it through add-on settings." +msgstr "Omogočite/onemogočite ga lahko prek nastavitev dodatkov." + +msgctxt "#32011" +msgid "Use your package manager(apt) to upgrade." +msgstr "Za nadgradnjo uporabite upravitelja paketov (apt)." + +msgctxt "#32012" +msgid "A new version is available, do you want to upgrade now?" +msgstr "Na voljo je nova različica, želite zdaj izvesti nadgradnjo?" + +msgctxt "#32013" +msgid "Upgrade successful" +msgstr "Nadgradnja je uspela." + +msgctxt "#32014" +msgid "Do you want to restart Kodi to finish the upgrade?" +msgstr "Želite ponovno zagnati Kodi, da zaključite z nadgradnjo?" + +msgctxt "#32015" +msgid "Do you want to check the repository for a new version?" +msgstr "Želite preveriti, če je v skladišču na voljo novejša različica?" + +msgctxt "#32016" +msgid "There is a newer stable Kodi version available." +msgstr "Na voljo je novejša stabilna različica Kodija." + msgctxt "#32020" msgid "General" msgstr "Splošno" + +msgctxt "#32021" +msgid "Enable Kodi version check?" +msgstr "Želite omogočiti preverjanje različice Kodi?" + +msgctxt "#32022" +msgid "Please enter your password" +msgstr "Vnesite svoje geslo" + +msgctxt "#32023" +msgid "Linux: Upgrade complete system" +msgstr "GNU/Linux: nadgradite celoten sistem" + +msgctxt "#32024" +msgid "Linux: Upgrade using apt" +msgstr "GNU/Linux: nadgradite z apt" + +msgctxt "#32030" +msgid "A new stable version of Kodi is available." +msgstr "Na voljo je nova stabilna različica Kodija." + +msgctxt "#32031" +msgid "Visit http://kodi.tv for more information." +msgstr "Za dodatne informacije obiščite http://kodi.tv" + +msgctxt "#32032" +msgid "A new stable version of Kodi is available." +msgstr "Na voljo je nova stabilna različica Kodija." + +msgctxt "#32033" +msgid "Visit http://kodi.tv for more information." +msgstr "Za dodatne informacije obiščite Kodi.tv." + +msgctxt "#32034" +msgid "Using %s while %s is available." +msgstr "Uporabljate %s, ko je na voljo že %s." + +msgctxt "#32035" +msgid "It is recommended that you to upgrade to a newer version." +msgstr "Priporočamo, da nadgradite sistem na novejšo različico." diff --git a/addons/service.xbmc.versioncheck/resources/language/Spanish/strings.po b/addons/service.xbmc.versioncheck/resources/language/Spanish/strings.po index 090077d6e4..8b6f39867c 100644 --- a/addons/service.xbmc.versioncheck/resources/language/Spanish/strings.po +++ b/addons/service.xbmc.versioncheck/resources/language/Spanish/strings.po @@ -28,6 +28,10 @@ msgctxt "#32009" msgid "Would you like to remove this reminder?" msgstr "¿Desea eliminar este recordatorio?" +msgctxt "#32010" +msgid "You can enable/disable it through add-on settings." +msgstr "Puede activarlo/desactivarlo a través de los ajustes del add-on ." + msgctxt "#32011" msgid "Use your package manager(apt) to upgrade." msgstr "Use su administrador de paquetes (apt) para actualizar." @@ -71,3 +75,27 @@ msgstr "Linux: Actualizar sistema completo" msgctxt "#32024" msgid "Linux: Upgrade using apt" msgstr "Linux: Actualizar usado apt" + +msgctxt "#32030" +msgid "A new stable version of Kodi is available." +msgstr "Una nueva versión estable de Kodi está disponible." + +msgctxt "#32031" +msgid "Visit http://kodi.tv for more information." +msgstr "Visite http://kodi.tv para más información." + +msgctxt "#32032" +msgid "A new stable version of Kodi is available." +msgstr "Una nueva versión estable de Kodi está disponible." + +msgctxt "#32033" +msgid "Visit http://kodi.tv for more information." +msgstr "Visite http://kodi.tv para más información." + +msgctxt "#32034" +msgid "Using %s while %s is available." +msgstr "Usando %s mientras que %s está disponible." + +msgctxt "#32035" +msgid "It is recommended that you to upgrade to a newer version." +msgstr "Se recomienda que actualice a una nueva versión." diff --git a/addons/service.xbmc.versioncheck/resources/language/Tamil (India)/strings.po b/addons/service.xbmc.versioncheck/resources/language/Tamil (India)/strings.po new file mode 100644 index 0000000000..81196db3b9 --- /dev/null +++ b/addons/service.xbmc.versioncheck/resources/language/Tamil (India)/strings.po @@ -0,0 +1,21 @@ +# Kodi Media Center language file +# Addon Name: Version Check +# Addon id: service.xbmc.versioncheck +# Addon Provider: XBMC Foundation +msgid "" +msgstr "" +"Project-Id-Version: XBMC Addons\n" +"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n" +"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Kodi Translation Team\n" +"Language-Team: Tamil (India) (http://www.transifex.com/projects/p/xbmc-addons/language/ta_IN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ta_IN\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#32020" +msgid "General" +msgstr "பொதுவானது" diff --git a/addons/service.xbmc.versioncheck/resources/language/Turkish/strings.po b/addons/service.xbmc.versioncheck/resources/language/Turkish/strings.po index b9c5ea8c47..adc62d2c00 100644 --- a/addons/service.xbmc.versioncheck/resources/language/Turkish/strings.po +++ b/addons/service.xbmc.versioncheck/resources/language/Turkish/strings.po @@ -16,6 +16,86 @@ msgstr "" "Language: tr\n" "Plural-Forms: nplurals=1; plural=0;\n" +msgctxt "#32001" +msgid "We would like to recommend you to upgrade." +msgstr "Sürüm güncellemenizi tavsiye ederiz." + +msgctxt "#32002" +msgid "Visit Kodi.tv for more information." +msgstr "Daha fazla bilgi için Kodi.tv adresini ziyaret edin." + +msgctxt "#32009" +msgid "Would you like to remove this reminder?" +msgstr "Bu hatırlatmayı kaldırmak istermisiniz?" + +msgctxt "#32010" +msgid "You can enable/disable it through add-on settings." +msgstr "Eklenti ayarlarından etkinleştir/etkinleştirmeyi kaldırabilirsiniz." + +msgctxt "#32011" +msgid "Use your package manager(apt) to upgrade." +msgstr "Güncelleme için paket yöneticinizi(apt) kullanabilirsiniz." + +msgctxt "#32012" +msgid "A new version is available, do you want to upgrade now?" +msgstr "Yeni bir versiyon mevcut, şimdi güncellemek istermisiniz?" + +msgctxt "#32013" +msgid "Upgrade successful" +msgstr "Güncelleme başarılı" + +msgctxt "#32014" +msgid "Do you want to restart Kodi to finish the upgrade?" +msgstr "Güncellemeyi tamamlamak için Kodi'yi yeniden başlatmak istermisiniz?" + +msgctxt "#32015" +msgid "Do you want to check the repository for a new version?" +msgstr "Yeni bir versiyon için depoyu kontrol etmek istermisiniz?" + +msgctxt "#32016" +msgid "There is a newer stable Kodi version available." +msgstr "Daha yeni stabil bir Kodi versiyonu mevcut." + msgctxt "#32020" msgid "General" msgstr "Genel" + +msgctxt "#32021" +msgid "Enable Kodi version check?" +msgstr "Kodi versiyon kontrolünü etkinleştir?" + +msgctxt "#32022" +msgid "Please enter your password" +msgstr "Lütfen şifrenizi giriniz" + +msgctxt "#32023" +msgid "Linux: Upgrade complete system" +msgstr "Linux: Tüm sistemi güncelle" + +msgctxt "#32024" +msgid "Linux: Upgrade using apt" +msgstr "Linux: apt kullanarak güncelle" + +msgctxt "#32030" +msgid "A new stable version of Kodi is available." +msgstr "Yeni stabil bir Kodi versiyonu mevcut." + +msgctxt "#32031" +msgid "Visit http://kodi.tv for more information." +msgstr "Daha fazla bilgi için http://kodi.tv ziyaret ediniz." + +msgctxt "#32032" +msgid "A new stable version of Kodi is available." +msgstr "Yeni stabil bir Kodi versiyonu mevcut." + +msgctxt "#32033" +msgid "Visit http://kodi.tv for more information." +msgstr "Daha fazla bilgi için http://kodi.tv ziyaret ediniz." + +msgctxt "#32034" +msgid "Using %s while %s is available." +msgstr "%s kullanırken %s mevcut." + +msgctxt "#32035" +msgid "It is recommended that you to upgrade to a newer version." +msgstr "Daha yeni bir versiyona güncellemeniz tavsiye olunur." diff --git a/addons/service.xbmc.versioncheck/resources/versions.txt b/addons/service.xbmc.versioncheck/resources/versions.txt index 73e2f1ca90..990b029945 100644 --- a/addons/service.xbmc.versioncheck/resources/versions.txt +++ b/addons/service.xbmc.versioncheck/resources/versions.txt @@ -4,6 +4,24 @@ "stable": [ { "major": "14", + "minor": "2", + "tag": "stable", + "tagversion":"", + "revision": "20150326-7cc53a9", + "extrainfo": "final", + "addon_support": "yes" + }, + { + "major": "14", + "minor": "1", + "tag": "stable", + "tagversion":"", + "revision": "20150129-38e4046", + "extrainfo": "final", + "addon_support": "yes" + }, + { + "major": "14", "minor": "0", "tag": "stable", "tagversion":"", @@ -205,6 +223,14 @@ ], "beta": [ { + "major": "15", + "minor": "0", + "tag": "beta", + "tagversion":"1", + "revision": "20150501-d1a2c33", + "addon_support": "yes" + }, + { "major": "14", "minor": "0", "tag": "beta", @@ -391,6 +417,22 @@ ], "alpha": [ { + "major": "15", + "minor": "0", + "tag": "alpha", + "tagversion":"2", + "revision": "20150331-32c1f53", + "addon_support": "yes" + }, + { + "major": "15", + "minor": "0", + "tag": "alpha", + "tagversion":"1", + "revision": "20150228-5dc1a55", + "addon_support": "yes" + }, + { "major": "14", "minor": "0", "tag": "alpha", diff --git a/addons/service.xbmc.versioncheck/service.py b/addons/service.xbmc.versioncheck/service.py index 97a4f3238c..d69cbc0711 100644 --- a/addons/service.xbmc.versioncheck/service.py +++ b/addons/service.xbmc.versioncheck/service.py @@ -37,11 +37,8 @@ class Main: packages = [] xbmc.sleep(5000) if xbmc.getCondVisibility('System.Platform.Linux') and __addon__.getSetting("upgrade_apt") == 'true': - packages = ['xbmc'] + packages = ['kodi'] _versionchecklinux(packages) - # temporary don't notify Windows untill crashing has been solved - elif xbmc.getCondVisibility('System.Platform.Windows'): - pass else: oldversion, version_installed, version_available, version_stable = _versioncheck() if oldversion: diff --git a/configure.ac b/configure.ac index 8c1e41221d..4e55ad6b28 100644 --- a/configure.ac +++ b/configure.ac @@ -2530,6 +2530,7 @@ OUTPUT_FILES="Makefile \ tools/android/packaging/xbmc/src/org/xbmc/kodi/XBMCBroadcastReceiver.java \ tools/android/packaging/xbmc/src/org/xbmc/kodi/XBMCOnFrameAvailableListener.java \ tools/android/packaging/xbmc/src/org/xbmc/kodi/XBMCSettingsContentObserver.java \ + tools/android/packaging/xbmc/src/org/xbmc/kodi/XBMCOnAudioFocusChangeListener.java \ tools/android/packaging/xbmc/strings.xml \ addons/xbmc.addon/addon.xml" diff --git a/tools/android/packaging/xbmc/src/org/xbmc/kodi/Main.java.in b/tools/android/packaging/xbmc/src/org/xbmc/kodi/Main.java.in index eba046a6ae..0c35d43285 100644 --- a/tools/android/packaging/xbmc/src/org/xbmc/kodi/Main.java.in +++ b/tools/android/packaging/xbmc/src/org/xbmc/kodi/Main.java.in @@ -109,4 +109,18 @@ public class Main extends NativeActivity getApplicationContext().getContentResolver().unregisterContentObserver(mSettingsContentObserver); super.onDestroy(); } + + private native void _callNative(long funcAddr, long variantAddr); + + private void runNativeOnUiThread(final long funcAddr, final long variantAddr) + { + runOnUiThread(new Runnable() + { + @Override + public void run() + { + _callNative(funcAddr, variantAddr); + } + }); + } } diff --git a/tools/android/packaging/xbmc/src/org/xbmc/kodi/XBMCOnAudioFocusChangeListener.java.in b/tools/android/packaging/xbmc/src/org/xbmc/kodi/XBMCOnAudioFocusChangeListener.java.in new file mode 100644 index 0000000000..df33b17810 --- /dev/null +++ b/tools/android/packaging/xbmc/src/org/xbmc/kodi/XBMCOnAudioFocusChangeListener.java.in @@ -0,0 +1,16 @@ +package org.xbmc.@APP_NAME_LC@; + +import android.media.AudioManager.OnAudioFocusChangeListener; +import android.util.Log; + +public class XBMCOnAudioFocusChangeListener implements OnAudioFocusChangeListener +{ + native void _onAudioFocusChange(int focusChange); + + @Override + public void onAudioFocusChange(int focusChange) + { + _onAudioFocusChange(focusChange); + + } +} diff --git a/xbmc/Application.cpp b/xbmc/Application.cpp index 291f3a04af..ffc7ad38d6 100644 --- a/xbmc/Application.cpp +++ b/xbmc/Application.cpp @@ -2598,6 +2598,9 @@ void CApplication::Stop(int exitCode) vExitCode["exitcode"] = exitCode; CAnnouncementManager::Get().Announce(System, "xbmc", "OnQuit", vExitCode); + // Abort any active screensaver + WakeUpScreenSaverAndDPMS(); + SaveFileState(true); g_alarmClock.StopThread(); @@ -3310,6 +3313,9 @@ void CApplication::OnPlayBackEnded() #ifdef HAS_PYTHON g_pythonParser.OnPlayBackEnded(); #endif +#ifdef TARGET_ANDROID + CXBMCApp::OnPlayBackEnded(); +#endif CVariant data(CVariant::VariantTypeObject); data["end"] = true; @@ -3332,6 +3338,9 @@ void CApplication::OnPlayBackStarted() // (does nothing if python is not loaded) g_pythonParser.OnPlayBackStarted(); #endif +#ifdef TARGET_ANDROID + CXBMCApp::OnPlayBackStarted(); +#endif CGUIMessage msg(GUI_MSG_PLAYBACK_STARTED, 0, 0); g_windowManager.SendThreadMessage(msg); @@ -3366,6 +3375,9 @@ void CApplication::OnPlayBackStopped() #ifdef HAS_PYTHON g_pythonParser.OnPlayBackStopped(); #endif +#ifdef TARGET_ANDROID + CXBMCApp::OnPlayBackStopped(); +#endif CVariant data(CVariant::VariantTypeObject); data["end"] = false; @@ -3380,6 +3392,9 @@ void CApplication::OnPlayBackPaused() #ifdef HAS_PYTHON g_pythonParser.OnPlayBackPaused(); #endif +#ifdef TARGET_ANDROID + CXBMCApp::OnPlayBackPaused(); +#endif CVariant param; param["player"]["speed"] = 0; @@ -3392,6 +3407,9 @@ void CApplication::OnPlayBackResumed() #ifdef HAS_PYTHON g_pythonParser.OnPlayBackResumed(); #endif +#ifdef TARGET_ANDROID + CXBMCApp::OnPlayBackResumed(); +#endif CVariant param; param["player"]["speed"] = 1; diff --git a/xbmc/Util.cpp b/xbmc/Util.cpp index 28da2653fa..086345e4c0 100644 --- a/xbmc/Util.cpp +++ b/xbmc/Util.cpp @@ -1856,6 +1856,7 @@ void CUtil::ScanForExternalSubtitles(const std::string& strMovie, std::vector<st int CUtil::ScanArchiveForSubtitles( const std::string& strArchivePath, const std::string& strMovieFileNameNoExt, std::vector<std::string>& vecSubtitles ) { + CLog::Log(LOGDEBUG, "ScanArchiveForSubtitles:: Scanning archive %s", strArchivePath.c_str()); int nSubtitlesAdded = 0; CFileItemList ItemList; @@ -1882,8 +1883,7 @@ int CUtil::ScanArchiveForSubtitles( const std::string& strArchivePath, const std { std::string strPathInRar = ItemList[it]->GetPath(); std::string strExt = URIUtils::GetExtension(strPathInRar); - - CLog::Log(LOGDEBUG, "ScanArchiveForSubtitles:: Found file %s", strPathInRar.c_str()); + // always check any embedded rar archives // checking for embedded rars, I moved this outside the sub_ext[] loop. We only need to check this once for each file. if (URIUtils::IsRAR(strPathInRar) || URIUtils::IsZIP(strPathInRar)) diff --git a/xbmc/android/activity/XBMCApp.cpp b/xbmc/android/activity/XBMCApp.cpp index 5b07d525f6..1ece8379d9 100644 --- a/xbmc/android/activity/XBMCApp.cpp +++ b/xbmc/android/activity/XBMCApp.cpp @@ -45,6 +45,7 @@ #include "utils/log.h" #include "ApplicationMessenger.h" #include "utils/StringUtils.h" +#include "utils/Variant.h" #include "AppParamParser.h" #include "XbmcContext.h" #include <android/bitmap.h> @@ -53,7 +54,6 @@ #include "android/jni/Intent.h" #include "android/jni/PackageManager.h" #include "android/jni/Context.h" -#include "android/jni/AudioManager.h" #include "android/jni/PowerManager.h" #include "android/jni/WakeLock.h" #include "android/jni/Environment.h" @@ -75,6 +75,9 @@ #if defined(HAS_LIBAMCODEC) #include "utils/AMLUtils.h" #endif +#include "android/jni/Window.h" +#include "android/jni/WindowManager.h" + #include "CompileInfo.h" #define GIGABYTES 1073741824 @@ -87,6 +90,8 @@ void* thread_run(void* obj) (static_cast<T*>(obj)->*fn)(); return NULL; } + +CXBMCApp* CXBMCApp::m_xbmcappinstance = NULL; CEvent CXBMCApp::m_windowCreated; ANativeActivity *CXBMCApp::m_activity = NULL; CJNIWakeLock *CXBMCApp::m_wakeLock = NULL; @@ -101,6 +106,7 @@ CXBMCApp::CXBMCApp(ANativeActivity* nativeActivity) : CJNIApplicationMainActivity(nativeActivity) , CJNIBroadcastReceiver("org/xbmc/kodi/XBMCBroadcastReceiver") { + m_xbmcappinstance = this; m_activity = nativeActivity; m_firstrun = true; m_exiting=false; @@ -114,6 +120,7 @@ CXBMCApp::CXBMCApp(ANativeActivity* nativeActivity) CXBMCApp::~CXBMCApp() { + m_xbmcappinstance = NULL; delete m_wakeLock; } @@ -299,6 +306,45 @@ bool CXBMCApp::EnableWakeLock(bool on) return true; } +bool CXBMCApp::AcquireAudioFocus() +{ + if (!m_xbmcappinstance) + return false; + + CJNIAudioManager audioManager(getSystemService("audio")); + + // Request audio focus for playback + int result = audioManager.requestAudioFocus(*m_xbmcappinstance, + // Use the music stream. + CJNIAudioManager::STREAM_MUSIC, + // Request permanent focus. + CJNIAudioManager::AUDIOFOCUS_GAIN); + + if (result != CJNIAudioManager::AUDIOFOCUS_REQUEST_GRANTED) + { + CXBMCApp::android_printf("Audio Focus request failed"); + return false; + } + return true; +} + +bool CXBMCApp::ReleaseAudioFocus() +{ + if (!m_xbmcappinstance) + return false; + + CJNIAudioManager audioManager(getSystemService("audio")); + + // Release audio focus after playback + int result = audioManager.abandonAudioFocus(*m_xbmcappinstance); + if (result != CJNIAudioManager::AUDIOFOCUS_REQUEST_GRANTED) + { + CXBMCApp::android_printf("Audio Focus abandon failed"); + return false; + } + return true; +} + bool CXBMCApp::HasFocus() { return m_hasFocus; @@ -380,6 +426,36 @@ int CXBMCApp::SetBuffersGeometry(int width, int height, int format) return ANativeWindow_setBuffersGeometry(m_window, width, height, format); } +#include "threads/Event.h" +#include <time.h> + +void CXBMCApp::SetRefreshRateCallback(CVariant* rateVariant) +{ + float rate = rateVariant->asFloat(); + delete rateVariant; + + CJNIWindow window = getWindow(); + if (window) + { + CJNIWindowManagerLayoutParams params = window.getAttributes(); + if (params.getpreferredRefreshRate() != rate) + { + params.setpreferredRefreshRate(rate); + if (params.getpreferredRefreshRate() > 0.0) + window.setAttributes(params); + } + } +} + +void CXBMCApp::SetRefreshRate(float rate) +{ + if (rate < 1.0) + return; + + CVariant *variant = new CVariant(rate); + runNativeOnUiThread(SetRefreshRateCallback, variant); +} + int CXBMCApp::android_printf(const char *format, ...) { // For use before CLog is setup by XBMC_Run() @@ -405,6 +481,31 @@ int CXBMCApp::GetDPI() return dpi; } +void CXBMCApp::OnPlayBackStarted() +{ + AcquireAudioFocus(); +} + +void CXBMCApp::OnPlayBackPaused() +{ + ReleaseAudioFocus(); +} + +void CXBMCApp::OnPlayBackResumed() +{ + AcquireAudioFocus(); +} + +void CXBMCApp::OnPlayBackStopped() +{ + ReleaseAudioFocus(); +} + +void CXBMCApp::OnPlayBackEnded() +{ + ReleaseAudioFocus(); +} + std::vector<androidPackage> CXBMCApp::GetApplications() { CSingleLock lock(m_applicationsMutex); @@ -652,6 +753,13 @@ void CXBMCApp::onVolumeChanged(int volume) CApplicationMessenger::Get().SendAction(CAction(ACTION_VOLUME_SET, (float)volume), WINDOW_INVALID, false); } +void CXBMCApp::onAudioFocusChange(int focusChange) +{ + CXBMCApp::android_printf("Audio Focus changed: %d", focusChange); + if (focusChange == CJNIAudioManager::AUDIOFOCUS_LOSS && g_application.m_pPlayer->IsPlaying() && !g_application.m_pPlayer->IsPaused()) + CApplicationMessenger::Get().SendAction(CAction(ACTION_PAUSE), WINDOW_INVALID, true); +} + void CXBMCApp::SetupEnv() { setenv("XBMC_ANDROID_SYSTEM_LIBS", CJNISystem::getProperty("java.library.path").c_str(), 0); diff --git a/xbmc/android/activity/XBMCApp.h b/xbmc/android/activity/XBMCApp.h index 72b9caad53..6f16ff739a 100644 --- a/xbmc/android/activity/XBMCApp.h +++ b/xbmc/android/activity/XBMCApp.h @@ -32,11 +32,13 @@ #include "xbmc.h" #include "android/jni/Activity.h" #include "android/jni/BroadcastReceiver.h" +#include "android/jni/AudioManager.h" #include "threads/Event.h" // forward delares class CJNIWakeLock; class CAESinkAUDIOTRACK; +class CVariant; typedef struct _JNIEnv JNIEnv; struct androidIcon @@ -52,7 +54,7 @@ struct androidPackage std::string packageLabel; }; -class CXBMCApp : public IActivityHandler, public CJNIApplicationMainActivity, public CJNIBroadcastReceiver +class CXBMCApp : public IActivityHandler, public CJNIApplicationMainActivity, public CJNIBroadcastReceiver, public CJNIAudioManagerAudioFocusChangeListener { public: CXBMCApp(ANativeActivity *nativeActivity); @@ -60,6 +62,7 @@ public: virtual void onReceive(CJNIIntent intent); virtual void onNewIntent(CJNIIntent intent); virtual void onVolumeChanged(int volume); + virtual void onAudioFocusChange(int focusChange); bool isValid() { return m_activity != NULL; } @@ -105,19 +108,32 @@ public: static float GetSystemVolume(); static void SetSystemVolume(float percent); + static void SetRefreshRate(float rate); static int GetDPI(); + + // Playback callbacks + static void OnPlayBackStarted(); + static void OnPlayBackPaused(); + static void OnPlayBackResumed(); + static void OnPlayBackStopped(); + static void OnPlayBackEnded(); + protected: // limit who can access Volume friend class CAESinkAUDIOTRACK; static int GetMaxSystemVolume(JNIEnv *env); + static bool AcquireAudioFocus(); + static bool ReleaseAudioFocus(); private: + static CXBMCApp* m_xbmcappinstance; static bool HasLaunchIntent(const std::string &package); std::string GetFilenameFromIntent(const CJNIIntent &intent); void run(); void stop(); void SetupEnv(); + static void SetRefreshRateCallback(CVariant *rate); static ANativeActivity *m_activity; static CJNIWakeLock *m_wakeLock; static int m_batteryLevel; diff --git a/xbmc/android/activity/android_main.cpp b/xbmc/android/activity/android_main.cpp index c028eb8a2a..47f03cacb3 100644 --- a/xbmc/android/activity/android_main.cpp +++ b/xbmc/android/activity/android_main.cpp @@ -90,6 +90,7 @@ extern "C" JNIEXPORT jint JNI_OnLoad(JavaVM *vm, void *reserved) std::string bcReceiver = "org/xbmc/" + appName + "/XBMCBroadcastReceiver"; std::string frameListener = "org/xbmc/" + appName + "/XBMCOnFrameAvailableListener"; std::string settingsObserver = "org/xbmc/" + appName + "/XBMCSettingsContentObserver"; + std::string audioFocusChangeListener = "org/xbmc/" + appName + "/XBMCOnAudioFocusChangeListener"; jclass cMain = env->FindClass(mainClass.c_str()); if(cMain) @@ -100,6 +101,13 @@ extern "C" JNIEXPORT jint JNI_OnLoad(JavaVM *vm, void *reserved) (void*)&CJNIApplicationMainActivity::_onNewIntent }; env->RegisterNatives(cMain, &mOnNewIntent, 1); + + JNINativeMethod mCallNative = { + "_callNative", + "(JJ)V", + (void*)&CJNIApplicationMainActivity::_callNative + }; + env->RegisterNatives(cMain, &mCallNative, 1); } jclass cBroadcastReceiver = env->FindClass(bcReceiver.c_str()); @@ -135,5 +143,16 @@ extern "C" JNIEXPORT jint JNI_OnLoad(JavaVM *vm, void *reserved) env->RegisterNatives(cSettingsObserver, &mOnVolumeChanged, 1); } + jclass cAudioFocusChangeListener = env->FindClass(audioFocusChangeListener.c_str()); + if(cAudioFocusChangeListener) + { + JNINativeMethod mOnAudioFocusChange = { + "_onAudioFocusChange", + "(I)V", + (void*)&CJNIApplicationMainActivity::_onAudioFocusChange + }; + env->RegisterNatives(cAudioFocusChangeListener, &mOnAudioFocusChange, 1); + } + return version; } diff --git a/xbmc/android/jni/Activity.cpp b/xbmc/android/jni/Activity.cpp index 4162703b2d..1df5241ee4 100644 --- a/xbmc/android/jni/Activity.cpp +++ b/xbmc/android/jni/Activity.cpp @@ -68,6 +68,19 @@ void CJNIApplicationMainActivity::_onNewIntent(JNIEnv *env, jobject context, job m_appInstance->onNewIntent(CJNIIntent(jhobject(intent))); } +void CJNIApplicationMainActivity::_callNative(JNIEnv *env, jobject context, jlong funcAddr, jlong variantAddr) +{ + (void)env; + (void)context; + ((void (*)(CVariant *))funcAddr)((CVariant *)variantAddr); +} + +void CJNIApplicationMainActivity::runNativeOnUiThread(void (*callback)(CVariant *), CVariant* variant) +{ + call_method<void>(m_context, + "runNativeOnUiThread", "(JJ)V", (jlong)callback, (jlong)variant); +} + void CJNIApplicationMainActivity::_onVolumeChanged(JNIEnv *env, jobject context, jint volume) { (void)env; @@ -75,3 +88,11 @@ void CJNIApplicationMainActivity::_onVolumeChanged(JNIEnv *env, jobject context, if(m_appInstance) m_appInstance->onVolumeChanged(volume); } + +void CJNIApplicationMainActivity::_onAudioFocusChange(JNIEnv *env, jobject context, jint focusChange) +{ + (void)env; + (void)context; + if(m_appInstance) + m_appInstance->onAudioFocusChange(focusChange); +} diff --git a/xbmc/android/jni/Activity.h b/xbmc/android/jni/Activity.h index 25da7b5a96..e87585883a 100644 --- a/xbmc/android/jni/Activity.h +++ b/xbmc/android/jni/Activity.h @@ -22,6 +22,7 @@ #include "JNIBase.h" #include "Context.h" +class CVariant; struct ANativeActivity; class CJNIActivity : public CJNIContext @@ -48,6 +49,10 @@ public: static void _onNewIntent(JNIEnv *env, jobject context, jobject intent); static void _onVolumeChanged(JNIEnv *env, jobject context, jint volume); + static void _onAudioFocusChange(JNIEnv *env, jobject context, jint focusChange); + + static void _callNative(JNIEnv *env, jobject context, jlong funcAddr, jlong variantAddr); + static void runNativeOnUiThread(void (*callback)(CVariant *), CVariant *variant); private: static CJNIApplicationMainActivity *m_appInstance; @@ -55,5 +60,6 @@ private: protected: virtual void onNewIntent(CJNIIntent intent)=0; virtual void onVolumeChanged(int volume)=0; + virtual void onAudioFocusChange(int focusChange)=0; }; diff --git a/xbmc/android/jni/AudioManager.cpp b/xbmc/android/jni/AudioManager.cpp index 5983852dea..42b0dc292e 100644 --- a/xbmc/android/jni/AudioManager.cpp +++ b/xbmc/android/jni/AudioManager.cpp @@ -19,16 +19,30 @@ */ #include "AudioManager.h" +#include "Activity.h" +#include "ClassLoader.h" + #include "jutils/jutils-details.hpp" +#include <algorithm> + using namespace jni; int CJNIAudioManager::STREAM_MUSIC(3); +int CJNIAudioManager::AUDIOFOCUS_GAIN(0x00000001); +int CJNIAudioManager::AUDIOFOCUS_LOSS(0xffffffff); +int CJNIAudioManager::AUDIOFOCUS_REQUEST_GRANTED(0x00000001); +int CJNIAudioManager::AUDIOFOCUS_REQUEST_FAILED(0x00000000); + void CJNIAudioManager::PopulateStaticFields() { jhclass clazz = find_class("android/media/AudioManager"); STREAM_MUSIC = (get_static_field<int>(clazz, "STREAM_MUSIC")); + AUDIOFOCUS_GAIN = (get_static_field<int>(clazz, "AUDIOFOCUS_GAIN")); + AUDIOFOCUS_LOSS = (get_static_field<int>(clazz, "AUDIOFOCUS_LOSS")); + AUDIOFOCUS_REQUEST_GRANTED = (get_static_field<int>(clazz, "AUDIOFOCUS_REQUEST_GRANTED")); + AUDIOFOCUS_REQUEST_FAILED = (get_static_field<int>(clazz, "AUDIOFOCUS_REQUEST_FAILED")); } int CJNIAudioManager::getStreamMaxVolume() @@ -49,5 +63,49 @@ void CJNIAudioManager::setStreamVolume(int index /* 0 */, int flags /* NONE */) { call_method<void>(m_object, "setStreamVolume", "(III)V", - STREAM_MUSIC, index, flags); + STREAM_MUSIC, index, flags); +} + +int CJNIAudioManager::requestAudioFocus(const CJNIAudioManagerAudioFocusChangeListener &listener, int streamType, int durationHint) +{ + return call_method<int>(m_object, + "requestAudioFocus", + "(Landroid/media/AudioManager$OnAudioFocusChangeListener;II)I", listener.get_raw(), streamType, durationHint); +} + +int CJNIAudioManager::abandonAudioFocus(const CJNIAudioManagerAudioFocusChangeListener &listener) +{ + return call_method<int>(m_object, + "abandonAudioFocus", + "(Landroid/media/AudioManager$OnAudioFocusChangeListener;)I", listener.get_raw()); +} + +////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////// +CJNIAudioManagerAudioFocusChangeListener* CJNIAudioManagerAudioFocusChangeListener::m_listenerInstance(NULL); + +CJNIAudioManagerAudioFocusChangeListener::CJNIAudioManagerAudioFocusChangeListener() +: CJNIBase("org/xbmc/kodi/XBMCOnAudioFocusChangeListener") +{ + CJNIApplicationMainActivity *appInstance = CJNIApplicationMainActivity::GetAppInstance(); + if (!appInstance) + return; + + // Convert "the/class/name" to "the.class.name" as loadClass() expects it. + std::string dotClassName = GetClassName(); + std::replace(dotClassName.begin(), dotClassName.end(), '/', '.'); + m_object = new_object(appInstance->getClassLoader().loadClass(dotClassName)); + m_object.setGlobal(); + + m_listenerInstance = this; +} + +void CJNIAudioManagerAudioFocusChangeListener::_onAudioFocusChange(JNIEnv *env, jobject context, jint focusChange) +{ + (void)env; + (void)context; + if (m_listenerInstance) + { + m_listenerInstance->onAudioFocusChange(focusChange); + } } diff --git a/xbmc/android/jni/AudioManager.h b/xbmc/android/jni/AudioManager.h index 0eb8291617..c02889fefd 100644 --- a/xbmc/android/jni/AudioManager.h +++ b/xbmc/android/jni/AudioManager.h @@ -21,6 +21,23 @@ #include "JNIBase.h" +class CJNIAudioManagerAudioFocusChangeListener : public CJNIBase +{ +public: + CJNIAudioManagerAudioFocusChangeListener(const jni::jhobject &object) : CJNIBase(object) {}; + virtual ~CJNIAudioManagerAudioFocusChangeListener() {}; + + static void _onAudioFocusChange(JNIEnv *env, jobject context, jint focusChange); + +protected: + CJNIAudioManagerAudioFocusChangeListener(); + + virtual void onAudioFocusChange(int focusChange)=0; + +private: + static CJNIAudioManagerAudioFocusChangeListener *m_listenerInstance; +}; + class CJNIAudioManager : public CJNIBase { public: @@ -32,9 +49,17 @@ public: int getStreamVolume(); void setStreamVolume(int index = 0, int flags = 0); + int requestAudioFocus(const CJNIAudioManagerAudioFocusChangeListener &listener, int streamType, int durationHint); + int abandonAudioFocus (const CJNIAudioManagerAudioFocusChangeListener &listener); + static void PopulateStaticFields(); static int STREAM_MUSIC; + static int AUDIOFOCUS_GAIN; + static int AUDIOFOCUS_LOSS; + static int AUDIOFOCUS_REQUEST_GRANTED; + static int AUDIOFOCUS_REQUEST_FAILED; + private: CJNIAudioManager(); }; diff --git a/xbmc/android/jni/Display.cpp b/xbmc/android/jni/Display.cpp new file mode 100644 index 0000000000..088802aa71 --- /dev/null +++ b/xbmc/android/jni/Display.cpp @@ -0,0 +1,40 @@ +/* + * Copyright (C) 2014 Team Kodi + * http://xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Kodi; see the file COPYING. If not, see + * <http://www.gnu.org/licenses/>. + * + */ + +#include "Display.h" + +#include "jutils/jutils-details.hpp" + +using namespace jni; + +float CJNIDisplay::getRefreshRate() +{ + return call_method<jfloat>(m_object, + "getRefreshRate", "()F"); +} + +std::vector<float> CJNIDisplay::getSupportedRefreshRates() +{ + if (GetSDKVersion() >= 21) + return jcast<std::vector<float>>( + call_method<jhfloatArray>(m_object, "getSupportedRefreshRates", "()[F")); + else + return std::vector<float>(); +} diff --git a/xbmc/android/jni/Display.h b/xbmc/android/jni/Display.h new file mode 100644 index 0000000000..536a753bd0 --- /dev/null +++ b/xbmc/android/jni/Display.h @@ -0,0 +1,32 @@ +#pragma once +/* + * Copyright (C) 2014 Team Kodi + * http://xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Kodi; see the file COPYING. If not, see + * <http://www.gnu.org/licenses/>. + * + */ + +#include "JNIBase.h" + +class CJNIDisplay : public CJNIBase +{ +public: + CJNIDisplay(const jni::jhobject &object) : CJNIBase(object) {}; + ~CJNIDisplay() {}; + + float getRefreshRate(); + std::vector<float> getSupportedRefreshRates(); +}; diff --git a/xbmc/android/jni/Makefile.in b/xbmc/android/jni/Makefile.in index d108ba701f..7e7a58431a 100644 --- a/xbmc/android/jni/Makefile.in +++ b/xbmc/android/jni/Makefile.in @@ -52,6 +52,8 @@ SRCS += Build.cpp SRCS += KeyCharacterMap.cpp SRCS += Activity.cpp SRCS += SystemProperties.cpp +SRCS += Display.cpp +SRCS += WindowManager.cpp LIB = jni.a diff --git a/xbmc/android/jni/View.cpp b/xbmc/android/jni/View.cpp index 2667a97752..635f568e2b 100644 --- a/xbmc/android/jni/View.cpp +++ b/xbmc/android/jni/View.cpp @@ -20,6 +20,7 @@ #include "Window.h" #include "View.h" +#include "Display.h" #include "jutils/jutils-details.hpp" @@ -148,3 +149,12 @@ int CJNIView::getSystemUiVisibility() return call_method<int>(m_object, "getSystemUiVisibility", "()I"); } + +CJNIDisplay CJNIView::getDisplay() +{ + if (GetSDKVersion() >= 17) + return call_method<jhobject>(m_object, + "getDisplay", "()Landroid/view/Display;"); + else + return jhobject(); +} diff --git a/xbmc/android/jni/View.h b/xbmc/android/jni/View.h index 1284024492..cd22ad98c5 100644 --- a/xbmc/android/jni/View.h +++ b/xbmc/android/jni/View.h @@ -22,6 +22,8 @@ #include "JNIBase.h" #include "List.h" +class CJNIDisplay; + class CJNIViewInputDeviceMotionRange : public CJNIBase { public: @@ -68,6 +70,7 @@ public: void setSystemUiVisibility(int visibility); int getSystemUiVisibility(); + CJNIDisplay getDisplay(); static void PopulateStaticFields(); static int SYSTEM_UI_FLAG_FULLSCREEN; diff --git a/xbmc/android/jni/Window.cpp b/xbmc/android/jni/Window.cpp index 2f8c749f71..969e9aa067 100644 --- a/xbmc/android/jni/Window.cpp +++ b/xbmc/android/jni/Window.cpp @@ -19,12 +19,30 @@ */ #include "Window.h" +#include "WindowManager.h" #include "View.h" #include "jutils/jutils-details.hpp" using namespace jni; +CJNIWindowManagerLayoutParams CJNIWindow::getAttributes() +{ + return call_method<jhobject>(m_object, + "getAttributes", "()Landroid/view/WindowManager$LayoutParams;"); +} + +void CJNIWindow::setAttributes(const CJNIWindowManagerLayoutParams& attributes) +{ + call_method<void>(m_object, + "setAttributes", "(Landroid/view/WindowManager$LayoutParams;)V", + attributes.get_raw()); + + + if (xbmc_jnienv()->ExceptionCheck()) + xbmc_jnienv()->ExceptionClear(); +} + CJNIView CJNIWindow::getDecorView() { return call_method<jhobject>(m_object, diff --git a/xbmc/android/jni/Window.h b/xbmc/android/jni/Window.h index 737f090947..eb63f8b8f6 100644 --- a/xbmc/android/jni/Window.h +++ b/xbmc/android/jni/Window.h @@ -22,11 +22,16 @@ #include "JNIBase.h" class CJNIView; +class CJNIWindowManagerLayoutParams; + class CJNIWindow : public CJNIBase { public: CJNIWindow(const jni::jhobject &object) : CJNIBase(object) {}; ~CJNIWindow() {}; + CJNIWindowManagerLayoutParams getAttributes(); + void setAttributes(const CJNIWindowManagerLayoutParams& attributes); + CJNIView getDecorView(); }; diff --git a/xbmc/android/jni/WindowManager.cpp b/xbmc/android/jni/WindowManager.cpp new file mode 100644 index 0000000000..8e0f352b6d --- /dev/null +++ b/xbmc/android/jni/WindowManager.cpp @@ -0,0 +1,39 @@ +/* + * Copyright (C) 2014 Team Kodi + * http://xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Kodi; see the file COPYING. If not, see + * <http://www.gnu.org/licenses/>. + * + */ + +#include "WindowManager.h" + +#include "jutils/jutils-details.hpp" + +using namespace jni; + +float CJNIWindowManagerLayoutParams::getpreferredRefreshRate() const +{ + if (GetSDKVersion() >= 21) + return get_field<jfloat>(m_object, "preferredRefreshRate"); + else + return -1.0; +} + +void CJNIWindowManagerLayoutParams::setpreferredRefreshRate(float rate) +{ + if (GetSDKVersion() >= 21) + set_field(m_object, "preferredRefreshRate", rate); +} diff --git a/xbmc/android/jni/WindowManager.h b/xbmc/android/jni/WindowManager.h new file mode 100644 index 0000000000..0ea37fc16b --- /dev/null +++ b/xbmc/android/jni/WindowManager.h @@ -0,0 +1,32 @@ +#pragma once +/* + * Copyright (C) 2014 Team Kodi + * http://xbmc.org + * + * This Program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This Program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Kodi; see the file COPYING. If not, see + * <http://www.gnu.org/licenses/>. + * + */ + +#include "JNIBase.h" + +class CJNIWindowManagerLayoutParams : public CJNIBase +{ +public: + CJNIWindowManagerLayoutParams(const jni::jhobject &object) : CJNIBase(object) {}; + ~CJNIWindowManagerLayoutParams() {}; + + float getpreferredRefreshRate() const; + void setpreferredRefreshRate(float rate); +}; diff --git a/xbmc/android/jni/jutils/jutils-details.hpp b/xbmc/android/jni/jutils/jutils-details.hpp index 9c3e833a99..b67a6aa545 100644 --- a/xbmc/android/jni/jutils/jutils-details.hpp +++ b/xbmc/android/jni/jutils/jutils-details.hpp @@ -78,6 +78,29 @@ struct jcast_helper<std::vector<T>, jobjectArray> }; template <> +struct jcast_helper<std::vector<float>, jfloatArray> +{ + static std::vector<float> cast(jfloatArray const &v) + { + JNIEnv *env = xbmc_jnienv(); + jsize size = 0; + if(v) + size = env->GetArrayLength(v); + + std::vector<float> vec; + vec.reserve(size); + + float *elements = env->GetFloatArrayElements(v, NULL); + for (int i = 0; i < size; i++) + { + vec.emplace_back(elements[i]); + } + env->ReleaseFloatArrayElements(v, elements, JNI_ABORT); + return vec; + } +}; + +template <> struct jcast_helper<jhstring, std::string> { static jhstring cast(const std::string &v); @@ -116,6 +139,14 @@ struct jcast_helper<std::vector<T>, jhobjectArray> } }; +template <> +struct jcast_helper<std::vector<float>, jhfloatArray> +{ + static std::vector<float> cast(jhfloatArray const &v) + { + return jcast_helper<std::vector<float>, jfloatArray>::cast(v.get()); + } +}; template <typename T> std::vector<T> jcast_helper<std::vector<T>, jobjectArray>::cast(jobjectArray const &v) diff --git a/xbmc/cores/dvdplayer/DVDPlayer.cpp b/xbmc/cores/dvdplayer/DVDPlayer.cpp index dd9e10a378..82b5baa538 100644 --- a/xbmc/cores/dvdplayer/DVDPlayer.cpp +++ b/xbmc/cores/dvdplayer/DVDPlayer.cpp @@ -3407,8 +3407,6 @@ bool CDVDPlayer::OpenAudioStream(CDVDStreamInfo& hint, bool reset) /* we are potentially going to be waiting on this */ m_dvdPlayerAudio->SendMessage(new CDVDMsg(CDVDMsg::PLAYER_STARTED), 1); - /* audio normally won't consume full cpu, so let it have prio */ - m_dvdPlayerAudio->SetPriority(GetPriority()+1); return true; } @@ -3469,20 +3467,6 @@ bool CDVDPlayer::OpenVideoStream(CDVDStreamInfo& hint, bool reset) /* we are potentially going to be waiting on this */ m_dvdPlayerVideo->SendMessage(new CDVDMsg(CDVDMsg::PLAYER_STARTED), 1); -#if defined(TARGET_DARWIN) - // Apple thread scheduler works a little different than Linux. It - // will favor OS GUI side and can cause DVDPlayerVideo to miss frame - // updates when the OS gets busy. Apple's recomended method is to - // elevate time critical threads to SCHED_RR and OSX does this for - // the CoreAudio audio device handler thread. We do the same for - // the DVDPlayerVideo thread so it can run to sleep without getting - // swapped out by a busy OS. - m_dvdPlayerVideo->SetPriority(GetSchedRRPriority()); -#else - /* use same priority for video thread as demuxing thread, as */ - /* otherwise demuxer will starve if video consumes the full cpu */ - m_dvdPlayerVideo->SetPriority(GetPriority()); -#endif return true; } diff --git a/xbmc/cores/dvdplayer/IDVDPlayer.h b/xbmc/cores/dvdplayer/IDVDPlayer.h index 4e3fd69042..560a3f4d11 100644 --- a/xbmc/cores/dvdplayer/IDVDPlayer.h +++ b/xbmc/cores/dvdplayer/IDVDPlayer.h @@ -55,7 +55,6 @@ class IDVDStreamPlayerVideo : public IDVDStreamPlayer public: ~IDVDStreamPlayerVideo() {} float GetRelativeUsage() { return 0.0f; } - bool SetPriority(const int iPriority) { return true; } virtual bool OpenStream(CDVDStreamInfo &hint) = 0; virtual void CloseStream(bool bWaitForBuffers) = 0; virtual bool StepFrame() = 0; @@ -96,7 +95,6 @@ class IDVDStreamPlayerAudio : public IDVDStreamPlayer public: ~IDVDStreamPlayerAudio() {} float GetRelativeUsage() { return 0.0f; } - bool SetPriority(const int iPriority) { return true; } virtual bool OpenStream(CDVDStreamInfo &hints) = 0; virtual void CloseStream(bool bWaitForBuffers) = 0; virtual void SetSpeed(int speed) = 0; diff --git a/xbmc/utils/XMLUtils.cpp b/xbmc/utils/XMLUtils.cpp index dc234da225..94329bfe70 100644 --- a/xbmc/utils/XMLUtils.cpp +++ b/xbmc/utils/XMLUtils.cpp @@ -125,8 +125,9 @@ bool XMLUtils::GetBoolean(const TiXmlNode* pRootNode, const char* strTag, bool& bool XMLUtils::GetString(const TiXmlNode* pRootNode, const char* strTag, std::string& strStringValue) { - const TiXmlElement* pElement = pRootNode->FirstChildElement(strTag ); + const TiXmlElement* pElement = pRootNode->FirstChildElement(strTag); if (!pElement) return false; + const char* encoded = pElement->Attribute("urlencoded"); const TiXmlNode* pNode = pElement->FirstChild(); if (pNode != NULL) @@ -140,6 +141,13 @@ bool XMLUtils::GetString(const TiXmlNode* pRootNode, const char* strTag, std::st return true; } +std::string XMLUtils::GetString(const TiXmlNode* pRootNode, const char* strTag) +{ + std::string temp; + GetString(pRootNode, strTag, temp); + return temp; +} + bool XMLUtils::HasChild(const TiXmlNode* pRootNode, const char* strTag) { const TiXmlElement* pElement = pRootNode->FirstChildElement(strTag); diff --git a/xbmc/utils/XMLUtils.h b/xbmc/utils/XMLUtils.h index 70e6446e46..294dadc39d 100644 --- a/xbmc/utils/XMLUtils.h +++ b/xbmc/utils/XMLUtils.h @@ -39,7 +39,26 @@ public: static bool GetDouble(const TiXmlNode* pRootNode, const char* strTag, double &value); static bool GetInt(const TiXmlNode* pRootNode, const char* strTag, int& iIntValue); static bool GetBoolean(const TiXmlNode* pRootNode, const char* strTag, bool& bBoolValue); + + /*! \brief Get a string value from the xml tag + If the specified tag isn't found strStringvalue is not modified and will contain whatever + value it had before the method call. + + \param[in] pRootNode the xml node that contains the tag + \param[in] strTag the xml tag to read from + \param[in,out] strStringValue where to store the read string + \return true on success, false if the tag isn't found + */ static bool GetString(const TiXmlNode* pRootNode, const char* strTag, std::string& strStringValue); + + /*! \brief Get a string value from the xml tag + + \param[in] pRootNode the xml node that contains the tag + \param[in] strTag the tag to read from + + \return the value in the specified tag or an empty string if the tag isn't found + */ + static std::string GetString(const TiXmlNode* pRootNode, const char* strTag); /*! \brief Get multiple tags, concatenating the values together. Transforms <tag>value1</tag> diff --git a/xbmc/video/VideoInfoTag.cpp b/xbmc/video/VideoInfoTag.cpp index fa24851147..57f8bd43be 100644 --- a/xbmc/video/VideoInfoTag.cpp +++ b/xbmc/video/VideoInfoTag.cpp @@ -568,14 +568,19 @@ const std::string CVideoInfoTag::GetCast(bool bIncludeRole /*= false*/) const void CVideoInfoTag::ParseNative(const TiXmlElement* movie, bool prioritise) { std::string value; - XMLUtils::GetString(movie, "title", value); - SetTitle(value); - XMLUtils::GetString(movie, "originaltitle", value); - SetOriginalTitle(value); - XMLUtils::GetString(movie, "showtitle", value); - SetShowTitle(value); - XMLUtils::GetString(movie, "sorttitle", value); - SetSortTitle(value); + + if (XMLUtils::GetString(movie, "title", value)) + SetTitle(value); + + if (XMLUtils::GetString(movie, "originaltitle", value)) + SetOriginalTitle(value); + + if (XMLUtils::GetString(movie, "showtitle", value)) + SetShowTitle(value); + + if (XMLUtils::GetString(movie, "sorttitle", value)) + SetSortTitle(value); + XMLUtils::GetFloat(movie, "rating", m_fRating); XMLUtils::GetFloat(movie, "epbookmark", m_fEpBookmark); int max_value = 10; @@ -589,8 +594,9 @@ void CVideoInfoTag::ParseNative(const TiXmlElement* movie, bool prioritise) XMLUtils::GetInt(movie, "season", m_iSeason); XMLUtils::GetInt(movie, "episode", m_iEpisode); XMLUtils::GetInt(movie, "track", m_iTrack); - XMLUtils::GetString(movie, "uniqueid", value); - SetUniqueId(value); + if (XMLUtils::GetString(movie, "uniqueid", value)) + SetUniqueId(value); + XMLUtils::GetInt(movie, "displayseason", m_iSpecialSortSeason); XMLUtils::GetInt(movie, "displayepisode", m_iSpecialSortEpisode); int after=0; @@ -600,40 +606,58 @@ void CVideoInfoTag::ParseNative(const TiXmlElement* movie, bool prioritise) m_iSpecialSortSeason = after; m_iSpecialSortEpisode = 0x1000; // should be more than any realistic episode number } - XMLUtils::GetString(movie, "votes", value); - SetVotes(value); - XMLUtils::GetString(movie, "outline", value); - SetPlotOutline(value); - XMLUtils::GetString(movie, "plot", value); - SetPlot(value); - XMLUtils::GetString(movie, "tagline", value); - SetTagLine(value); + if (XMLUtils::GetString(movie, "votes", value)) + SetVotes(value); + + if (XMLUtils::GetString(movie, "outline", value)) + SetPlotOutline(value); + + if (XMLUtils::GetString(movie, "plot", value)) + SetPlot(value); + + if (XMLUtils::GetString(movie, "tagline", value)) + SetTagLine(value); + + if (XMLUtils::GetString(movie, "runtime", value) && !value.empty()) m_duration = GetDurationFromMinuteString(StringUtils::Trim(value)); - XMLUtils::GetString(movie, "mpaa", value); - SetMPAARating(value); + + if (XMLUtils::GetString(movie, "mpaa", value)) + SetMPAARating(value); + XMLUtils::GetInt(movie, "playcount", m_playCount); XMLUtils::GetDate(movie, "lastplayed", m_lastPlayed); - XMLUtils::GetString(movie, "file", value); - SetFile(value); - XMLUtils::GetString(movie, "path", value); - SetPath(value); - XMLUtils::GetString(movie, "id", value); - SetIMDBNumber(value); - XMLUtils::GetString(movie, "filenameandpath", value); - SetFileNameAndPath(value); + + if (XMLUtils::GetString(movie, "file", value)) + SetFile(value); + + if (XMLUtils::GetString(movie, "path", value)) + SetPath(value); + + if (XMLUtils::GetString(movie, "id", value)) + SetIMDBNumber(value); + + if (XMLUtils::GetString(movie, "filenameandpath", value)) + SetFileNameAndPath(value); + XMLUtils::GetDate(movie, "premiered", m_premiered); - XMLUtils::GetString(movie, "status", value); - SetStatus(value); - XMLUtils::GetString(movie, "code", value); - SetProductionCode(value); + + if (XMLUtils::GetString(movie, "status", value)) + SetStatus(value); + + if (XMLUtils::GetString(movie, "code", value)) + SetProductionCode(value); + XMLUtils::GetDate(movie, "aired", m_firstAired); - XMLUtils::GetString(movie, "album", value); - SetAlbum(value); - XMLUtils::GetString(movie, "trailer", value); - SetTrailer(value); - XMLUtils::GetString(movie, "basepath", value); - SetBasePath(value); + + if (XMLUtils::GetString(movie, "album", value)) + SetAlbum(value); + + if (XMLUtils::GetString(movie, "trailer", value)) + SetTrailer(value); + + if (XMLUtils::GetString(movie, "basepath", value)) + SetBasePath(value); size_t iThumbCount = m_strPictureURL.m_url.size(); std::string xmlAdd = m_strPictureURL.m_xml; @@ -661,24 +685,24 @@ void CVideoInfoTag::ParseNative(const TiXmlElement* movie, bool prioritise) } std::vector<std::string> genres(m_genre); - XMLUtils::GetStringArray(movie, "genre", genres, prioritise, g_advancedSettings.m_videoItemSeparator); - SetGenre(genres); + if (XMLUtils::GetStringArray(movie, "genre", genres, prioritise, g_advancedSettings.m_videoItemSeparator)) + SetGenre(genres); std::vector<std::string> country(m_country); - XMLUtils::GetStringArray(movie, "country", country, prioritise, g_advancedSettings.m_videoItemSeparator); - SetCountry(country); + if (XMLUtils::GetStringArray(movie, "country", country, prioritise, g_advancedSettings.m_videoItemSeparator)) + SetCountry(country); std::vector<std::string> credits(m_writingCredits); - XMLUtils::GetStringArray(movie, "credits", credits, prioritise, g_advancedSettings.m_videoItemSeparator); - SetWritingCredits(credits); + if (XMLUtils::GetStringArray(movie, "credits", credits, prioritise, g_advancedSettings.m_videoItemSeparator)) + SetWritingCredits(credits); std::vector<std::string> director(m_director); - XMLUtils::GetStringArray(movie, "director", director, prioritise, g_advancedSettings.m_videoItemSeparator); - SetDirector(director); + if (XMLUtils::GetStringArray(movie, "director", director, prioritise, g_advancedSettings.m_videoItemSeparator)) + SetDirector(director); std::vector<std::string> showLink(m_showLink); - XMLUtils::GetStringArray(movie, "showlink", showLink, prioritise, g_advancedSettings.m_videoItemSeparator); - SetShowLink(showLink); + if (XMLUtils::GetStringArray(movie, "showlink", showLink, prioritise, g_advancedSettings.m_videoItemSeparator)) + SetShowLink(showLink); // cast const TiXmlElement* node = movie->FirstChildElement("actor"); @@ -691,8 +715,10 @@ void CVideoInfoTag::ParseNative(const TiXmlElement* movie, bool prioritise) { SActorInfo info; info.strName = actor->FirstChild()->Value(); - XMLUtils::GetString(node, "role", value); - info.strRole = StringUtils::Trim(value); + + if (XMLUtils::GetString(node, "role", value)) + info.strRole = StringUtils::Trim(value); + XMLUtils::GetInt(node, "order", info.order); const TiXmlElement* thumb = node->FirstChildElement("thumb"); while (thumb) @@ -708,16 +734,16 @@ void CVideoInfoTag::ParseNative(const TiXmlElement* movie, bool prioritise) node = node->NextSiblingElement("actor"); } - XMLUtils::GetString(movie, "set", value); - SetSet(value); + if (XMLUtils::GetString(movie, "set", value)) + SetSet(value); std::vector<std::string> tags(m_tags); - XMLUtils::GetStringArray(movie, "tag", tags, prioritise, g_advancedSettings.m_videoItemSeparator); - SetTags(tags); + if (XMLUtils::GetStringArray(movie, "tag", tags, prioritise, g_advancedSettings.m_videoItemSeparator)) + SetTags(tags); std::vector<std::string> studio(m_studio); - XMLUtils::GetStringArray(movie, "studio", studio, prioritise, g_advancedSettings.m_videoItemSeparator); - SetStudio(studio); + if (XMLUtils::GetStringArray(movie, "studio", studio, prioritise, g_advancedSettings.m_videoItemSeparator)) + SetStudio(studio); // artists std::vector<std::string> artist(m_artist); @@ -755,10 +781,12 @@ void CVideoInfoTag::ParseNative(const TiXmlElement* movie, bool prioritise) while ((nodeDetail = nodeStreamDetails->IterateChildren("audio", nodeDetail))) { CStreamDetailAudio *p = new CStreamDetailAudio(); - XMLUtils::GetString(nodeDetail, "codec", value); - p->m_strCodec = StringUtils::Trim(value); - XMLUtils::GetString(nodeDetail, "language", value); - p->m_strLanguage = StringUtils::Trim(value); + if (XMLUtils::GetString(nodeDetail, "codec", value)) + p->m_strCodec = StringUtils::Trim(value); + + if (XMLUtils::GetString(nodeDetail, "language", value)) + p->m_strLanguage = StringUtils::Trim(value); + XMLUtils::GetInt(nodeDetail, "channels", p->m_iChannels); StringUtils::ToLower(p->m_strCodec); StringUtils::ToLower(p->m_strLanguage); @@ -768,14 +796,16 @@ void CVideoInfoTag::ParseNative(const TiXmlElement* movie, bool prioritise) while ((nodeDetail = nodeStreamDetails->IterateChildren("video", nodeDetail))) { CStreamDetailVideo *p = new CStreamDetailVideo(); - XMLUtils::GetString(nodeDetail, "codec", value); - p->m_strCodec = StringUtils::Trim(value); + if (XMLUtils::GetString(nodeDetail, "codec", value)) + p->m_strCodec = StringUtils::Trim(value); + XMLUtils::GetFloat(nodeDetail, "aspect", p->m_fAspect); XMLUtils::GetInt(nodeDetail, "width", p->m_iWidth); XMLUtils::GetInt(nodeDetail, "height", p->m_iHeight); XMLUtils::GetInt(nodeDetail, "durationinseconds", p->m_iDuration); - XMLUtils::GetString(nodeDetail, "stereomode", value); - p->m_strStereoMode = StringUtils::Trim(value); + if (XMLUtils::GetString(nodeDetail, "stereomode", value)) + p->m_strStereoMode = StringUtils::Trim(value); + StringUtils::ToLower(p->m_strCodec); StringUtils::ToLower(p->m_strStereoMode); m_streamDetails.AddStream(p); @@ -784,8 +814,8 @@ void CVideoInfoTag::ParseNative(const TiXmlElement* movie, bool prioritise) while ((nodeDetail = nodeStreamDetails->IterateChildren("subtitle", nodeDetail))) { CStreamDetailSubtitle *p = new CStreamDetailSubtitle(); - XMLUtils::GetString(nodeDetail, "language", value); - p->m_strLanguage = StringUtils::Trim(value); + if (XMLUtils::GetString(nodeDetail, "language", value)) + p->m_strLanguage = StringUtils::Trim(value); StringUtils::ToLower(p->m_strLanguage); m_streamDetails.AddStream(p); } diff --git a/xbmc/windowing/egl/EGLNativeTypeAndroid.cpp b/xbmc/windowing/egl/EGLNativeTypeAndroid.cpp index 35505d1f50..c8dba0302e 100644 --- a/xbmc/windowing/egl/EGLNativeTypeAndroid.cpp +++ b/xbmc/windowing/egl/EGLNativeTypeAndroid.cpp @@ -27,6 +27,10 @@ #include "android/activity/XBMCApp.h" #include "utils/StringUtils.h" #include "android/jni/SystemProperties.h" +#include "android/jni/Display.h" +#include "android/jni/View.h" +#include "android/jni/Window.h" +#include "android/jni/WindowManager.h" CEGLNativeTypeAndroid::CEGLNativeTypeAndroid() : m_width(0), m_height(0) @@ -105,6 +109,30 @@ bool CEGLNativeTypeAndroid::DestroyNativeWindow() return true; } +static float currentRefreshRate() +{ + CJNIWindow window = CXBMCApp::getWindow(); + if (window) + { + float preferredRate = window.getAttributes().getpreferredRefreshRate(); + if (preferredRate > 1.0) + { + return preferredRate; + } + CJNIView view(window.getDecorView()); + if (view) { + CJNIDisplay display(view.getDisplay()); + if (display) + { + float reportedRate = display.getRefreshRate(); + return reportedRate; + } + } + } + CLog::Log(LOGDEBUG, "found no refresh rate"); + return 60.0; +} + bool CEGLNativeTypeAndroid::GetNativeResolution(RESOLUTION_INFO *res) const { EGLNativeWindowType *nativeWindow = (EGLNativeWindowType*)CXBMCApp::GetNativeWindow(30000); @@ -124,7 +152,7 @@ bool CEGLNativeTypeAndroid::GetNativeResolution(RESOLUTION_INFO *res) const res->iHeight = m_height; } - res->fRefreshRate = 60; + res->fRefreshRate = currentRefreshRate(); res->dwFlags= D3DPRESENTFLAG_PROGRESSIVE; res->iScreen = 0; res->bFullScreen = true; @@ -142,10 +170,10 @@ bool CEGLNativeTypeAndroid::SetNativeResolution(const RESOLUTION_INFO &res) { CLog::Log(LOGDEBUG, "CEGLNativeTypeAndroid: SetNativeResolution: %dx%d", m_width, m_height); if (m_width && m_height) - { - if (!CXBMCApp::SetBuffersGeometry(m_width, m_height, 0)) - return false; - } + CXBMCApp::SetBuffersGeometry(m_width, m_height, 0); + + if (abs(currentRefreshRate() - res.fRefreshRate) > 0.0001) + CXBMCApp::SetRefreshRate(res.fRefreshRate); return true; } @@ -156,7 +184,34 @@ bool CEGLNativeTypeAndroid::ProbeResolutions(std::vector<RESOLUTION_INFO> &resol bool ret = GetNativeResolution(&res); if (ret && res.iWidth > 1 && res.iHeight > 1) { - resolutions.push_back(res); + std::vector<float> refreshRates; + CJNIWindow window = CXBMCApp::getWindow(); + if (window) + { + CJNIView view = window.getDecorView(); + if (view) + { + CJNIDisplay display = view.getDisplay(); + if (display) + { + refreshRates = display.getSupportedRefreshRates(); + } + } + } + + if (refreshRates.size()) + { + for (unsigned int i = 0; i < refreshRates.size(); i++) + { + res.fRefreshRate = refreshRates[i]; + resolutions.push_back(res); + } + } + else + { + /* No refresh rate list available, just provide the current one */ + resolutions.push_back(res); + } return true; } return false; |