diff options
171 files changed, 1788 insertions, 641 deletions
diff --git a/addons/resource.language.en_gb/resources/strings.po b/addons/resource.language.en_gb/resources/strings.po index dc73e73828..0b3a3d72f1 100644 --- a/addons/resource.language.en_gb/resources/strings.po +++ b/addons/resource.language.en_gb/resources/strings.po @@ -6896,7 +6896,7 @@ msgid "There are no presets available for this visualisation" msgstr "" msgctxt "#13390" -msgid "There are no settings available\nfor this visualisation" +msgid "There are no settings available[CR]for this visualisation" msgstr "" #: xbmc/ContextMenus.h @@ -19455,7 +19455,7 @@ msgstr "" #. Description of setting with label #13436 "Use display HDR capabilities" #: system/settings/settings.xml msgctxt "#36299" -msgid "Switch display into HDR mode if media with HDR information is played.\nIf disabled, HDR information are applied using Kodi's internal HDR path." +msgid "Switch display into HDR mode if media with HDR information is played.[CR]If disabled, HDR information are applied using Kodi's internal HDR path." msgstr "" #. Description of setting with label #20226 "Movie set information folder" diff --git a/addons/skin.estouchy/language/resource.language.am_et/strings.po b/addons/skin.estouchy/language/resource.language.am_et/strings.po index 7214a12cb7..cd274e4ddb 100644 --- a/addons/skin.estouchy/language/resource.language.am_et/strings.po +++ b/addons/skin.estouchy/language/resource.language.am_et/strings.po @@ -14,7 +14,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: am_ET\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" msgctxt "#31002" msgid "Audio Settings" diff --git a/addons/skin.estouchy/language/resource.language.ar_sa/strings.po b/addons/skin.estouchy/language/resource.language.ar_sa/strings.po index f838c4a7d5..6eac1d4f23 100644 --- a/addons/skin.estouchy/language/resource.language.ar_sa/strings.po +++ b/addons/skin.estouchy/language/resource.language.ar_sa/strings.po @@ -14,7 +14,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ar_SA\n" -"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n" +"Plural-Forms: nplurals=6; plural=(n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5);\n" msgctxt "#31002" msgid "Audio Settings" diff --git a/addons/skin.estouchy/language/resource.language.ast_es/strings.po b/addons/skin.estouchy/language/resource.language.ast_es/strings.po new file mode 100644 index 0000000000..b2e9670216 --- /dev/null +++ b/addons/skin.estouchy/language/resource.language.ast_es/strings.po @@ -0,0 +1,37 @@ +# Kodi Media Center language file +# Addon Name: Estouchy +# Addon id: skin.estouchy +# Addon Provider: Team Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\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 (Spain) (http://www.transifex.com/projects/p/kodi-main/language/ast_ES/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ast_ES\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#31013" +msgid "Movies" +msgstr "Películes" + +msgctxt "#31014" +msgid "Episodes" +msgstr "Episodios" + +msgctxt "#31016" +msgid "Albums" +msgstr "Álbumes" + +msgctxt "#31358" +msgid "Teletext" +msgstr "Teletestu" + +msgctxt "#31390" +msgid "Skin default" +msgstr "Lo predeterminao" diff --git a/addons/skin.estouchy/language/resource.language.az_az/strings.po b/addons/skin.estouchy/language/resource.language.az_az/strings.po index 799e7a80e0..c694ed41b9 100644 --- a/addons/skin.estouchy/language/resource.language.az_az/strings.po +++ b/addons/skin.estouchy/language/resource.language.az_az/strings.po @@ -14,7 +14,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: az_AZ\n" -"Plural-Forms: nplurals=1; plural=0;\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" msgctxt "#31013" msgid "Movies" diff --git a/addons/skin.estouchy/language/resource.language.be_by/strings.po b/addons/skin.estouchy/language/resource.language.be_by/strings.po index 45a2ef8711..52e3e71cb0 100644 --- a/addons/skin.estouchy/language/resource.language.be_by/strings.po +++ b/addons/skin.estouchy/language/resource.language.be_by/strings.po @@ -14,7 +14,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: be_BY\n" -"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" msgctxt "#31002" msgid "Audio Settings" diff --git a/addons/skin.estouchy/language/resource.language.cs_cz/strings.po b/addons/skin.estouchy/language/resource.language.cs_cz/strings.po index 28689baff5..36ea887441 100644 --- a/addons/skin.estouchy/language/resource.language.cs_cz/strings.po +++ b/addons/skin.estouchy/language/resource.language.cs_cz/strings.po @@ -14,7 +14,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: cs_CZ\n" -"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" +"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n <= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;\n" msgctxt "#31002" msgid "Audio Settings" diff --git a/addons/skin.estouchy/language/resource.language.en_us/strings.po b/addons/skin.estouchy/language/resource.language.en_us/strings.po index 529b1b92f0..a6046d9f59 100644 --- a/addons/skin.estouchy/language/resource.language.en_us/strings.po +++ b/addons/skin.estouchy/language/resource.language.en_us/strings.po @@ -100,6 +100,18 @@ msgctxt "#31039" msgid "Updated:" msgstr "Updated:" +msgctxt "#31040" +msgid "Select + X" +msgstr "Select + X" + +msgctxt "#31041" +msgid "Select + B" +msgstr "Select + B" + +msgctxt "#31042" +msgid "Select + Start" +msgstr "Select + Start" + msgctxt "#31043" msgid "PAUSED" msgstr "PAUSED" diff --git a/addons/skin.estouchy/language/resource.language.es_es/strings.po b/addons/skin.estouchy/language/resource.language.es_es/strings.po index 59fd265c83..f1d6c93252 100644 --- a/addons/skin.estouchy/language/resource.language.es_es/strings.po +++ b/addons/skin.estouchy/language/resource.language.es_es/strings.po @@ -100,6 +100,18 @@ msgctxt "#31039" msgid "Updated:" msgstr "Actualizado:" +msgctxt "#31040" +msgid "Select + X" +msgstr "Select + X" + +msgctxt "#31041" +msgid "Select + B" +msgstr "Select + B" + +msgctxt "#31042" +msgid "Select + Start" +msgstr "Select + Start" + msgctxt "#31043" msgid "PAUSED" msgstr "PAUSA" diff --git a/addons/skin.estouchy/language/resource.language.et_ee/strings.po b/addons/skin.estouchy/language/resource.language.et_ee/strings.po index f7ffebc90b..c302d7ceb6 100644 --- a/addons/skin.estouchy/language/resource.language.et_ee/strings.po +++ b/addons/skin.estouchy/language/resource.language.et_ee/strings.po @@ -38,12 +38,16 @@ msgstr "Visuaalide eelhäälestused" msgctxt "#31007" msgid "Context Menu" -msgstr "Menüü" +msgstr "Kontekstimenüü" msgctxt "#31009" msgid "Working..." msgstr "Toimetamine..." +msgctxt "#31011" +msgid "Recent" +msgstr "Viimati" + msgctxt "#31013" msgid "Movies" msgstr "Filmid" @@ -56,6 +60,10 @@ msgctxt "#31016" msgid "Albums" msgstr "Albumid" +msgctxt "#31017" +msgid "PVR info" +msgstr "PVR-i info" + msgctxt "#31018" msgid "Player process info" msgstr "Pleieri protsesside teave" @@ -84,17 +92,37 @@ msgctxt "#31038" msgid "Login" msgstr "Logi sisse" +msgctxt "#31039" +msgid "Updated:" +msgstr "Uuendatud:" + +msgctxt "#31040" +msgid "Select + X" +msgstr "Select + X" + +msgctxt "#31041" +msgid "Select + B" +msgstr "Select + B" + +msgctxt "#31042" +msgid "Select + Start" +msgstr "Select + Start" + msgctxt "#31043" msgid "PAUSED" -msgstr "PAUSIS" +msgstr "PAUSIL" msgctxt "#31044" msgid "FAST FORWARD" -msgstr "KIIRELT EDASI" +msgstr "EDASI KERIMINE" msgctxt "#31045" msgid "REWIND" -msgstr "TAGASI" +msgstr "TAGASI KERIMINE" + +msgctxt "#31046" +msgid "Play speed" +msgstr "Esitamise kiirus" msgctxt "#31049" msgid "End Time" @@ -102,11 +130,11 @@ msgstr "Lõpu aeg" msgctxt "#31050" msgid "Sort: Ascending" -msgstr "Järjesta: Kasvav" +msgstr "Järjestus: kasvav" msgctxt "#31051" msgid "Sort: Descending" -msgstr "Järjesta: Kahanev" +msgstr "Järjestus: Kahanev" msgctxt "#31055" msgid "Open playlist" @@ -138,7 +166,7 @@ msgstr "Asukoht" msgctxt "#31202" msgid "View" -msgstr "Vaata" +msgstr "Kuva" msgctxt "#31300" msgid "Current Temp" @@ -152,6 +180,10 @@ msgctxt "#31303" msgid "Data provider" msgstr "Teenusepakkuja" +msgctxt "#31309" +msgid "System Memory Used:" +msgstr "Süsteemimälu kasutus:" + msgctxt "#31320" msgid "Last Logged In" msgstr "Viimane sisselogimine" @@ -186,7 +218,15 @@ msgstr "Muuda rüüd · Määra keel ja regioon · Muuda faililoendi valikuid · msgctxt "#31421" msgid "Select your Kodi user Profile[CR]to login and continue" -msgstr "Vali enda Kodi profiil[CR]ja jätka" +msgstr "Vali sisse logimiseks enda Kodi profiil[CR]ja jätka" + +msgctxt "#31548" +msgid "Home menu" +msgstr "Peamenüü" + +msgctxt "#31549" +msgid "Home Add-ons" +msgstr "Peamenüü lisamoodulid" msgctxt "#31550" msgid "Backgrounds" @@ -196,9 +236,25 @@ msgctxt "#31551" msgid "Add-on Shortcut" msgstr "Lisamooduli otsetee" +msgctxt "#31552" +msgid "SYNC" +msgstr "SÜNKRONISEERI" + +msgctxt "#31553" +msgid "Use Custom Background" +msgstr "Kasuta kohandatud taustapilti" + msgctxt "#31556" msgid "Live TV" -msgstr "Live TV" +msgstr "Otse-eeter" + +msgctxt "#31559" +msgid "Channel settings" +msgstr "Kanali seaded" + +msgctxt "#31560" +msgid "Available groups" +msgstr "Saadaval grupid" msgctxt "#31561" msgid "Add Group" @@ -211,3 +267,23 @@ msgstr "Nimeta grupp ümber" msgctxt "#31563" msgid "Delete Group" msgstr "Kustuta grupp" + +msgctxt "#31564" +msgid "Show hidden" +msgstr "Kuva peidetud" + +msgctxt "#31565" +msgid "Show deleted" +msgstr "Kuva kustutatud" + +msgctxt "#31900" +msgid "First Run" +msgstr "Esmakasutus" + +msgctxt "#31901" +msgid "There are two things to know about navigating Estouchy" +msgstr "Estouchy's ringi liikumiseks on vaja teada kahte asja" + +msgctxt "#31902" +msgid "The Kodi logo functions as a 'HOME' button. Whenever you touch it, you will be taken back to the home screen." +msgstr "Kodi logo on nagu 'KODU' nupp. Ükskõik millal seda puudutada, siis viiakse alati tagasi peamenüüsse." diff --git a/addons/skin.estouchy/language/resource.language.fa_af/strings.po b/addons/skin.estouchy/language/resource.language.fa_af/strings.po index ed310ca24f..04e154e13f 100644 --- a/addons/skin.estouchy/language/resource.language.fa_af/strings.po +++ b/addons/skin.estouchy/language/resource.language.fa_af/strings.po @@ -14,7 +14,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: fa_AF\n" -"Plural-Forms: nplurals=1; plural=0;\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" msgctxt "#31016" msgid "Albums" diff --git a/addons/skin.estouchy/language/resource.language.fa_ir/strings.po b/addons/skin.estouchy/language/resource.language.fa_ir/strings.po index a990fc0da2..b8da6e945f 100644 --- a/addons/skin.estouchy/language/resource.language.fa_ir/strings.po +++ b/addons/skin.estouchy/language/resource.language.fa_ir/strings.po @@ -14,7 +14,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: fa_IR\n" -"Plural-Forms: nplurals=1; plural=0;\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" msgctxt "#31009" msgid "Working..." diff --git a/addons/skin.estouchy/language/resource.language.fi_fi/strings.po b/addons/skin.estouchy/language/resource.language.fi_fi/strings.po index 1440728131..3f4873b9ec 100644 --- a/addons/skin.estouchy/language/resource.language.fi_fi/strings.po +++ b/addons/skin.estouchy/language/resource.language.fi_fi/strings.po @@ -100,6 +100,18 @@ msgctxt "#31039" msgid "Updated:" msgstr "Päivitetty:" +msgctxt "#31040" +msgid "Select + X" +msgstr "Valinta + X" + +msgctxt "#31041" +msgid "Select + B" +msgstr "Valinta + B" + +msgctxt "#31042" +msgid "Select + Start" +msgstr "Valinta + Aloita" + msgctxt "#31043" msgid "PAUSED" msgstr "TAUKO" diff --git a/addons/skin.estouchy/language/resource.language.fr_fr/strings.po b/addons/skin.estouchy/language/resource.language.fr_fr/strings.po index e75923ea00..aa85603c96 100644 --- a/addons/skin.estouchy/language/resource.language.fr_fr/strings.po +++ b/addons/skin.estouchy/language/resource.language.fr_fr/strings.po @@ -100,6 +100,18 @@ msgctxt "#31039" msgid "Updated:" msgstr "Mis à jour :" +msgctxt "#31040" +msgid "Select + X" +msgstr "Sélectionner + X" + +msgctxt "#31041" +msgid "Select + B" +msgstr "Sélectionner + B" + +msgctxt "#31042" +msgid "Select + Start" +msgstr "Sélectionner + Démarrage" + msgctxt "#31043" msgid "PAUSED" msgstr "EN PAUSE" diff --git a/addons/skin.estouchy/language/resource.language.he_il/strings.po b/addons/skin.estouchy/language/resource.language.he_il/strings.po index bc894eb120..5a2dce95c1 100644 --- a/addons/skin.estouchy/language/resource.language.he_il/strings.po +++ b/addons/skin.estouchy/language/resource.language.he_il/strings.po @@ -14,7 +14,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: he_IL\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % 1 == 0) ? 1: (n % 10 == 0 && n % 1 == 0 && n > 10) ? 2 : 3;\n" msgctxt "#31002" msgid "Audio Settings" diff --git a/addons/skin.estouchy/language/resource.language.hu_hu/strings.po b/addons/skin.estouchy/language/resource.language.hu_hu/strings.po index ae8ea50c12..989d32b51a 100644 --- a/addons/skin.estouchy/language/resource.language.hu_hu/strings.po +++ b/addons/skin.estouchy/language/resource.language.hu_hu/strings.po @@ -100,6 +100,18 @@ msgctxt "#31039" msgid "Updated:" msgstr "Frissítve:" +msgctxt "#31040" +msgid "Select + X" +msgstr "Kiválasztás + X" + +msgctxt "#31041" +msgid "Select + B" +msgstr "Kiválasztás + B" + +msgctxt "#31042" +msgid "Select + Start" +msgstr "Kiválasztás + indítás" + msgctxt "#31043" msgid "PAUSED" msgstr "MEGÁLLÍTVA" diff --git a/addons/skin.estouchy/language/resource.language.is_is/strings.po b/addons/skin.estouchy/language/resource.language.is_is/strings.po index bf299864cb..82c0059329 100644 --- a/addons/skin.estouchy/language/resource.language.is_is/strings.po +++ b/addons/skin.estouchy/language/resource.language.is_is/strings.po @@ -14,7 +14,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: is_IS\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Plural-Forms: nplurals=2; plural=(n % 10 != 1 || n % 100 == 11);\n" msgctxt "#31002" msgid "Audio Settings" diff --git a/addons/skin.estouchy/language/resource.language.it_it/strings.po b/addons/skin.estouchy/language/resource.language.it_it/strings.po index 7ae241c6f2..be952f3fb4 100644 --- a/addons/skin.estouchy/language/resource.language.it_it/strings.po +++ b/addons/skin.estouchy/language/resource.language.it_it/strings.po @@ -100,6 +100,18 @@ msgctxt "#31039" msgid "Updated:" msgstr "Aggiornato:" +msgctxt "#31040" +msgid "Select + X" +msgstr "Select + X" + +msgctxt "#31041" +msgid "Select + B" +msgstr "Select + B" + +msgctxt "#31042" +msgid "Select + Start" +msgstr "Select + Start" + msgctxt "#31043" msgid "PAUSED" msgstr "IN PAUSA" diff --git a/addons/skin.estouchy/language/resource.language.ja_jp/strings.po b/addons/skin.estouchy/language/resource.language.ja_jp/strings.po index b6c9b2f1f4..81a8b6cf4c 100644 --- a/addons/skin.estouchy/language/resource.language.ja_jp/strings.po +++ b/addons/skin.estouchy/language/resource.language.ja_jp/strings.po @@ -100,6 +100,14 @@ msgctxt "#31039" msgid "Updated:" msgstr "更新:" +msgctxt "#31040" +msgid "Select + X" +msgstr "セレクト + X" + +msgctxt "#31042" +msgid "Select + Start" +msgstr "セレクト + スタート" + msgctxt "#31043" msgid "PAUSED" msgstr "静止中" diff --git a/addons/skin.estouchy/language/resource.language.kn_in/strings.po b/addons/skin.estouchy/language/resource.language.kn_in/strings.po new file mode 100644 index 0000000000..577366df94 --- /dev/null +++ b/addons/skin.estouchy/language/resource.language.kn_in/strings.po @@ -0,0 +1,17 @@ +# Kodi Media Center language file +# Addon Name: Estouchy +# Addon id: skin.estouchy +# Addon Provider: Team Kodi +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\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: Kannada (India) (http://www.transifex.com/projects/p/kodi-main/language/kn_IN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: kn_IN\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" diff --git a/addons/skin.estouchy/language/resource.language.ko_kr/strings.po b/addons/skin.estouchy/language/resource.language.ko_kr/strings.po index de99914165..736632fb7e 100644 --- a/addons/skin.estouchy/language/resource.language.ko_kr/strings.po +++ b/addons/skin.estouchy/language/resource.language.ko_kr/strings.po @@ -100,6 +100,18 @@ msgctxt "#31039" msgid "Updated:" msgstr "업데이트:" +msgctxt "#31040" +msgid "Select + X" +msgstr "선택 + X" + +msgctxt "#31041" +msgid "Select + B" +msgstr "선택 + B" + +msgctxt "#31042" +msgid "Select + Start" +msgstr "선택 + 시작" + msgctxt "#31043" msgid "PAUSED" msgstr "일시 중지" diff --git a/addons/skin.estouchy/language/resource.language.lt_lt/strings.po b/addons/skin.estouchy/language/resource.language.lt_lt/strings.po index 554864623e..ea97d5a77a 100644 --- a/addons/skin.estouchy/language/resource.language.lt_lt/strings.po +++ b/addons/skin.estouchy/language/resource.language.lt_lt/strings.po @@ -14,7 +14,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: lt_LT\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"Plural-Forms: nplurals=4; plural=(n % 10 == 1 && (n % 100 > 19 || n % 100 < 11) ? 0 : (n % 10 >= 2 && n % 10 <=9) && (n % 100 > 19 || n % 100 < 11) ? 1 : n % 1 != 0 ? 2: 3);\n" msgctxt "#31002" msgid "Audio Settings" @@ -100,6 +100,18 @@ msgctxt "#31039" msgid "Updated:" msgstr "Atnaujinta:" +msgctxt "#31040" +msgid "Select + X" +msgstr "Select + X" + +msgctxt "#31041" +msgid "Select + B" +msgstr "Select + B" + +msgctxt "#31042" +msgid "Select + Start" +msgstr "Select + Start" + msgctxt "#31043" msgid "PAUSED" msgstr "PAUZĖ" diff --git a/addons/skin.estouchy/language/resource.language.ms_my/strings.po b/addons/skin.estouchy/language/resource.language.ms_my/strings.po index 3325bdb5d3..da4cdde7de 100644 --- a/addons/skin.estouchy/language/resource.language.ms_my/strings.po +++ b/addons/skin.estouchy/language/resource.language.ms_my/strings.po @@ -100,6 +100,18 @@ msgctxt "#31039" msgid "Updated:" msgstr "Dikemaskini:" +msgctxt "#31040" +msgid "Select + X" +msgstr "Select + X" + +msgctxt "#31041" +msgid "Select + B" +msgstr "Select + B" + +msgctxt "#31042" +msgid "Select + Start" +msgstr "Select + Start" + msgctxt "#31043" msgid "PAUSED" msgstr "TERHENTI SEJENAK" diff --git a/addons/skin.estouchy/language/resource.language.pl_pl/strings.po b/addons/skin.estouchy/language/resource.language.pl_pl/strings.po index ef68b89ec3..8eb7afd50b 100644 --- a/addons/skin.estouchy/language/resource.language.pl_pl/strings.po +++ b/addons/skin.estouchy/language/resource.language.pl_pl/strings.po @@ -14,7 +14,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: pl_PL\n" -"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n" msgctxt "#31002" msgid "Audio Settings" diff --git a/addons/skin.estouchy/language/resource.language.pt_br/strings.po b/addons/skin.estouchy/language/resource.language.pt_br/strings.po index 774da5e295..34cd3a7a03 100644 --- a/addons/skin.estouchy/language/resource.language.pt_br/strings.po +++ b/addons/skin.estouchy/language/resource.language.pt_br/strings.po @@ -100,6 +100,18 @@ msgctxt "#31039" msgid "Updated:" msgstr "Atualizado:" +msgctxt "#31040" +msgid "Select + X" +msgstr "Selecionar + X" + +msgctxt "#31041" +msgid "Select + B" +msgstr "Selecionar + B" + +msgctxt "#31042" +msgid "Select + Start" +msgstr "Selecione + Iniciar" + msgctxt "#31043" msgid "PAUSED" msgstr "PAUSADO" diff --git a/addons/skin.estouchy/language/resource.language.ru_ru/strings.po b/addons/skin.estouchy/language/resource.language.ru_ru/strings.po index 21f171ef10..32e174899a 100644 --- a/addons/skin.estouchy/language/resource.language.ru_ru/strings.po +++ b/addons/skin.estouchy/language/resource.language.ru_ru/strings.po @@ -14,7 +14,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ru_RU\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" msgctxt "#31002" msgid "Audio Settings" diff --git a/addons/skin.estouchy/language/resource.language.sk_sk/strings.po b/addons/skin.estouchy/language/resource.language.sk_sk/strings.po index 227cab495f..c457ad1f55 100644 --- a/addons/skin.estouchy/language/resource.language.sk_sk/strings.po +++ b/addons/skin.estouchy/language/resource.language.sk_sk/strings.po @@ -14,7 +14,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: sk_SK\n" -"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" +"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n == 1 ? 0 : n % 1 == 0 && n >= 2 && n <= 4 ? 1 : n % 1 != 0 ? 2: 3);\n" msgctxt "#31002" msgid "Audio Settings" @@ -100,6 +100,14 @@ msgctxt "#31039" msgid "Updated:" msgstr "Aktualizované:" +msgctxt "#31040" +msgid "Select + X" +msgstr "Vybrať + X" + +msgctxt "#31042" +msgid "Select + Start" +msgstr "Vybrať + Štart" + msgctxt "#31043" msgid "PAUSED" msgstr "PAUZA" diff --git a/addons/skin.estouchy/language/resource.language.tr_tr/strings.po b/addons/skin.estouchy/language/resource.language.tr_tr/strings.po index d35f7f7c23..df6263c337 100644 --- a/addons/skin.estouchy/language/resource.language.tr_tr/strings.po +++ b/addons/skin.estouchy/language/resource.language.tr_tr/strings.po @@ -14,7 +14,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: tr_TR\n" -"Plural-Forms: nplurals=1; plural=0;\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" msgctxt "#31002" msgid "Audio Settings" @@ -100,6 +100,18 @@ msgctxt "#31039" msgid "Updated:" msgstr "Güncellendi" +msgctxt "#31040" +msgid "Select + X" +msgstr "Select + X" + +msgctxt "#31041" +msgid "Select + B" +msgstr "Select + B" + +msgctxt "#31042" +msgid "Select + Start" +msgstr "Select + Start" + msgctxt "#31043" msgid "PAUSED" msgstr "DURAKLATILDI" diff --git a/addons/skin.estouchy/language/resource.language.uk_ua/strings.po b/addons/skin.estouchy/language/resource.language.uk_ua/strings.po index 103fb92722..a6ec6610f3 100644 --- a/addons/skin.estouchy/language/resource.language.uk_ua/strings.po +++ b/addons/skin.estouchy/language/resource.language.uk_ua/strings.po @@ -14,7 +14,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: uk_UA\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != 11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || (n % 100 >=11 && n % 100 <=14 )) ? 2: 3);\n" msgctxt "#31002" msgid "Audio Settings" diff --git a/addons/skin.estouchy/language/resource.language.zh_cn/strings.po b/addons/skin.estouchy/language/resource.language.zh_cn/strings.po index e5f12033e1..3c31096145 100644 --- a/addons/skin.estouchy/language/resource.language.zh_cn/strings.po +++ b/addons/skin.estouchy/language/resource.language.zh_cn/strings.po @@ -100,6 +100,18 @@ msgctxt "#31039" msgid "Updated:" msgstr "已更新:" +msgctxt "#31040" +msgid "Select + X" +msgstr "Select + X" + +msgctxt "#31041" +msgid "Select + B" +msgstr "Select + B" + +msgctxt "#31042" +msgid "Select + Start" +msgstr "Select + Start" + msgctxt "#31043" msgid "PAUSED" msgstr "暂停" diff --git a/addons/skin.estouchy/language/resource.language.zh_tw/strings.po b/addons/skin.estouchy/language/resource.language.zh_tw/strings.po index d1a3526b6d..7166358cd2 100644 --- a/addons/skin.estouchy/language/resource.language.zh_tw/strings.po +++ b/addons/skin.estouchy/language/resource.language.zh_tw/strings.po @@ -100,6 +100,18 @@ msgctxt "#31039" msgid "Updated:" msgstr "已更新:" +msgctxt "#31040" +msgid "Select + X" +msgstr "選擇 + X" + +msgctxt "#31041" +msgid "Select + B" +msgstr "選擇 + B" + +msgctxt "#31042" +msgid "Select + Start" +msgstr "選擇 + 開始" + msgctxt "#31043" msgid "PAUSED" msgstr "已暫停" diff --git a/addons/skin.estuary/language/resource.language.am_et/strings.po b/addons/skin.estuary/language/resource.language.am_et/strings.po index 58bd8174e4..d14396336d 100644 --- a/addons/skin.estuary/language/resource.language.am_et/strings.po +++ b/addons/skin.estuary/language/resource.language.am_et/strings.po @@ -14,7 +14,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: am_ET\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" msgctxt "#31000" msgid "Now playing" diff --git a/addons/skin.estuary/language/resource.language.ar_sa/strings.po b/addons/skin.estuary/language/resource.language.ar_sa/strings.po index 1d09f2431a..c05a7f975c 100644 --- a/addons/skin.estuary/language/resource.language.ar_sa/strings.po +++ b/addons/skin.estuary/language/resource.language.ar_sa/strings.po @@ -14,7 +14,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ar_SA\n" -"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n" +"Plural-Forms: nplurals=6; plural=(n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5);\n" msgctxt "#31004" msgid "Change mode" diff --git a/addons/skin.estuary/language/resource.language.ast_es/strings.po b/addons/skin.estuary/language/resource.language.ast_es/strings.po new file mode 100644 index 0000000000..b1b20df080 --- /dev/null +++ b/addons/skin.estuary/language/resource.language.ast_es/strings.po @@ -0,0 +1,33 @@ +# Kodi Media Center language file +# Addon Name: Estuary +# Addon id: skin.estuary +# Addon Provider: phil65, Ichabod Fletchman +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\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 (Spain) (http://www.transifex.com/projects/p/kodi-main/language/ast_ES/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ast_ES\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#31020" +msgid "Actions" +msgstr "Aiciones" + +msgctxt "#31100" +msgid "Shift" +msgstr "Mayúscules" + +msgctxt "#31106" +msgid "Teletext" +msgstr "Teletestu" + +msgctxt "#31165" +msgid "Profile name" +msgstr "Nome del perfil" diff --git a/addons/skin.estuary/language/resource.language.az_az/strings.po b/addons/skin.estuary/language/resource.language.az_az/strings.po index a749b3b79a..508957bbdb 100644 --- a/addons/skin.estuary/language/resource.language.az_az/strings.po +++ b/addons/skin.estuary/language/resource.language.az_az/strings.po @@ -14,7 +14,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: az_AZ\n" -"Plural-Forms: nplurals=1; plural=0;\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" msgctxt "#31001" msgid "Search..." diff --git a/addons/skin.estuary/language/resource.language.be_by/strings.po b/addons/skin.estuary/language/resource.language.be_by/strings.po index ca1f6cf1ee..98a44ea2c3 100644 --- a/addons/skin.estuary/language/resource.language.be_by/strings.po +++ b/addons/skin.estuary/language/resource.language.be_by/strings.po @@ -14,7 +14,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: be_BY\n" -"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" msgctxt "#31000" msgid "Now playing" diff --git a/addons/skin.estuary/language/resource.language.cs_cz/strings.po b/addons/skin.estuary/language/resource.language.cs_cz/strings.po index e99110ffe5..66a2334ac6 100644 --- a/addons/skin.estuary/language/resource.language.cs_cz/strings.po +++ b/addons/skin.estuary/language/resource.language.cs_cz/strings.po @@ -14,7 +14,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: cs_CZ\n" -"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" +"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n <= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;\n" msgctxt "#31000" msgid "Now playing" diff --git a/addons/skin.estuary/language/resource.language.de_de/strings.po b/addons/skin.estuary/language/resource.language.de_de/strings.po index 4dc7b0dc74..dca027cf2d 100644 --- a/addons/skin.estuary/language/resource.language.de_de/strings.po +++ b/addons/skin.estuary/language/resource.language.de_de/strings.po @@ -18,11 +18,11 @@ msgstr "" msgctxt "#31000" msgid "Now playing" -msgstr "Es läuft" +msgstr "Gerade läuft" msgctxt "#31001" msgid "Search..." -msgstr "Suche..." +msgstr "Suchen ..." msgctxt "#31002" msgid "Show media fanart as background" @@ -54,7 +54,7 @@ msgstr "Kategorie-Widgets aktivieren" msgctxt "#31009" msgid "Download icons" -msgstr "Icons herunterladen" +msgstr "Symbole herunterladen" msgctxt "#31010" msgid "In progress movies" @@ -114,7 +114,7 @@ msgstr "Ansicht" msgctxt "#31024" msgid "Choose rating to display for media items" -msgstr "Bewertung, die für Medien-Inhalte angezeigt werden soll" +msgstr "Bewertung, die für Medieninhalte angezeigt werden soll" msgctxt "#31025" msgid "No favourites found. You can add any item from media views to this list by using the context menu." @@ -134,11 +134,11 @@ msgstr "Zuletzt angemeldet" msgctxt "#31030" msgid "System memory usage" -msgstr "System Speicher-Auslastung" +msgstr "Systemspeicherauslastung" msgctxt "#31031" msgid "Version info" -msgstr "Versionsinfos" +msgstr "Versionsinformationen" msgctxt "#31032" msgid "Order" @@ -210,7 +210,7 @@ msgstr "[B]Links[/B] zum Zurückspulen, [B]Rechts[/B] zum Vorspulen drücken" msgctxt "#31056" msgid "Go to playlist" -msgstr "Zur Wiedergabeliste..." +msgstr "Zur Wiedergabeliste ..." msgctxt "#31057" msgid "Show login screen on startup" @@ -234,11 +234,11 @@ msgstr "Sektionen" msgctxt "#31065" msgid "Video playlist" -msgstr "Video-Wiedergabeliste" +msgstr "Videowiedergabeliste" msgctxt "#31066" msgid "Music playlist" -msgstr "Musik-Wiedergabeliste" +msgstr "Musikwiedergabeliste" msgctxt "#31067" msgid "Event log" @@ -260,6 +260,10 @@ msgctxt "#31072" msgid "Power Options" msgstr "Ausschalten" +msgctxt "#31073" +msgid "Total length" +msgstr "Gesamtlänge" + msgctxt "#31074" msgid "Total duration" msgstr "Gesamtdauer" @@ -286,7 +290,7 @@ msgstr "Liedtexte-Addon-Einstellungen" msgctxt "#31084" msgid "Visualisation settings" -msgstr "Visualisierungs-Einstellungen" +msgstr "Visualisierungseinstellungen" msgctxt "#31089" msgid "Available groups" @@ -310,7 +314,7 @@ msgstr "Lokaler Untertitel verfügbar" msgctxt "#31097" msgid "Channel options" -msgstr "Kanal-Einstellungen" +msgstr "Kanaleinstellungen" msgctxt "#31098" msgid "Select your Kodi user profile[CR]to login and continue" @@ -334,11 +338,11 @@ msgstr "Wall" msgctxt "#31103" msgid "Enter text here..." -msgstr "Text hier eingeben..." +msgstr "Text hier eingeben ..." msgctxt "#31104" msgid "Your library is currently empty. In order to populate it with your personal media, enter \"Files\" section, add a media source and configure it. After the source has been added and indexed you will be able to browse your library." -msgstr "Die persönliche Bibliothek ist derzeit leer. Um sie mit Inhalten zu füllen, zu \"Dateien\" wechseln, eine Medienquelle hinzufügen und diese dann konfigurieren. Nachdem die Quelle hinzugefügt und indiziert wurde, kann die Bibliothek durchstöbert werden." +msgstr "Die persönliche Bibliothek ist derzeit leer. Um sie mit Inhalten zu füllen, zu „Dateien“ wechseln, eine Medienquelle hinzufügen und diese dann konfigurieren. Nachdem die Quelle hinzugefügt und indiziert wurde, kann die Bibliothek durchstöbert werden." msgctxt "#31105" msgid "Add video sources and set the appropriate content type in order to populate your video libraries." @@ -354,7 +358,7 @@ msgstr "WideList" msgctxt "#31110" msgid "Enter files section" -msgstr "Zu \"Dateien\"..." +msgstr "Zu „Dateien“ ..." msgctxt "#31111" msgid "View your personal pictures or download one of the many image add-ons from the official repository." @@ -382,7 +386,7 @@ msgstr "Menü editieren" msgctxt "#31118" msgid "Enter add-on browser" -msgstr "Zum Addon-Browser..." +msgstr "Zum Addon-Browser ..." msgctxt "#31119" msgid "You do not have any add-ons installed yet. Visit our add-on browser to browse through our collection and improve your Kodi experience." @@ -390,11 +394,11 @@ msgstr "Es sind noch keine Addons installiert. Den Addon-Browser öffnen, um in msgctxt "#31120" msgid "You did not set up a weather provider yet. In order to view weather information, choose a weather provider and set up your location." -msgstr "Es ist noch kein Wetterprovider eingerichtet. Um Wetterinformationen zu erhalten, einen Wetterprovider auswählen und Orte einrichten." +msgstr "Es ist noch kein Wetterinformationsanbieter eingerichtet. Um Wetterinformationen zu erhalten, einen Wetterinformationsanbieter auswählen und Orte einrichten." msgctxt "#31121" msgid "Set weather provider" -msgstr "Wetterprovider wählen" +msgstr "Wetterinformationsanbieter wählen" msgctxt "#31122" msgid "Unwatched TV Shows" @@ -406,7 +410,7 @@ msgstr "Filme dieses Regisseurs" msgctxt "#31125" msgid "Press up for actor info" -msgstr "[B]Hoch[/B] für Schauspieler-Infos drücken" +msgstr "[B]Hoch[/B] für Darstellerinformationen drücken" msgctxt "#31126" msgid "Press OK to read plot" @@ -426,7 +430,7 @@ msgstr "Allgemeine Einstellungen, die für den gesamten Skin gelten." msgctxt "#31130" msgid "Main menu-related settings: Configure the home screen to your likings." -msgstr "Einstellungen für das Hauptmenü: Der Hauptbildschirm kann nach Belieben angepaßt werden." +msgstr "Einstellungen für das Hauptmenü. Der Hauptbildschirm kann nach Belieben angepaßt werden." msgctxt "#31131" msgid "Choose skin fanart pack" @@ -446,15 +450,15 @@ msgstr "Restzeit" msgctxt "#31136" msgid "Click here to see latest changes..." -msgstr "Hier klicken, um die letzten Änderungen zu sehen..." +msgstr "Hier klicken, um die letzten Änderungen zu sehen ..." msgctxt "#31137" msgid "PVR info" -msgstr "PVR-Info" +msgstr "PVR-Informationen" msgctxt "#31138" msgid "Player process info" -msgstr "Player-Info" +msgstr "Player-Informationen" msgctxt "#31139" msgid "Video decoder" @@ -462,7 +466,7 @@ msgstr "Video-Decoder" msgctxt "#31140" msgid "Pixel format" -msgstr "Pixel-Format" +msgstr "Pixelformat" msgctxt "#31141" msgid "Changes for version" @@ -470,15 +474,15 @@ msgstr "Änderungen für Version" msgctxt "#31142" msgid "Play speed" -msgstr "Wiedergabe-Geschwindigkeit" +msgstr "Wiedergabegeschwindigkeit" msgctxt "#31143" msgid "You did not set up PVR yet. In order to use PVR, choose a PVR client addon and configure it. Please visit http://kodi.wiki/view/PVR to learn more." -msgstr "Der Personal Video Recorder wurde noch nicht eingerichtet. Um den PVR nutzen zu können, muß ein PVR-Client Addon ausgewählt und konfiguriert werden. Mehr Informationen unter http://kodi.wiki/view/PVR" +msgstr "Der Personal Video Recorder wurde noch nicht eingerichtet. Um den PVR nutzen zu können, muss ein PVR-Client Addon ausgewählt und konfiguriert werden. Mehr Informationen unter http://kodi.wiki/view/PVR" msgctxt "#31144" msgid "Enter add-on browser" -msgstr "Zum Addon-Browser..." +msgstr "Zum Addon-Browser ..." msgctxt "#31145" msgid "Search add-ons" @@ -490,7 +494,7 @@ msgstr "Kategorien" msgctxt "#31149" msgid "Select genre fanart pack" -msgstr "Genre Fanart Pack auswählen" +msgstr "Genre-Fanart-Pack auswählen" msgctxt "#31150" msgid "Repository" @@ -518,11 +522,11 @@ msgstr "Es wurden noch keine Lesezeichen angelegt." msgctxt "#31156" msgid "Choose background pattern" -msgstr "Hintergrund-Muster auswählen" +msgstr "Hintergrundmuster auswählen" msgctxt "#31157" msgid "Edit categories" -msgstr "Kategorien editieren" +msgstr "Kategorien anpassen" msgctxt "#31158" msgid "Touch mode" @@ -538,7 +542,7 @@ msgstr "Medien-Flags anzeigen" msgctxt "#31161" msgid "Numeric pad" -msgstr "Ziffern-Eingabe" +msgstr "Zifferneingabe" msgctxt "#31162" msgid "Play your personal games or download one of the many game add-ons from the official repository." @@ -550,11 +554,11 @@ msgstr "Fanart-Hintergrund anzeigen" msgctxt "#31164" msgid "Choose kind of profile identification" -msgstr "Art der Profil-Identifikation auswählen" +msgstr "Art der Profilidentifikation auswählen" msgctxt "#31165" msgid "Profile name" -msgstr "Profil-Name" +msgstr "Profilname" msgctxt "#31166" msgid "Profile avatar" diff --git a/addons/skin.estuary/language/resource.language.en_gb/strings.po b/addons/skin.estuary/language/resource.language.en_gb/strings.po index 67b18c5145..bb72227c60 100644 --- a/addons/skin.estuary/language/resource.language.en_gb/strings.po +++ b/addons/skin.estuary/language/resource.language.en_gb/strings.po @@ -2,6 +2,9 @@ # Addon Name: Estuary # Addon id: skin.estuary # Addon Provider: phil65, Ichabod Fletchman +# Addon Name: Estuary +# Addon id: skin.estuary +# Addon Provider: phil65, Ichabod Fletchman msgid "" msgstr "" "Project-Id-Version: KODI Main\n" diff --git a/addons/skin.estuary/language/resource.language.en_us/strings.po b/addons/skin.estuary/language/resource.language.en_us/strings.po index 73eba6bb81..ec9cf7ba5b 100644 --- a/addons/skin.estuary/language/resource.language.en_us/strings.po +++ b/addons/skin.estuary/language/resource.language.en_us/strings.po @@ -124,6 +124,10 @@ msgctxt "#31026" msgid "Timeshift" msgstr "Timeshift" +msgctxt "#31027" +msgid "Next aired" +msgstr "Next aired" + msgctxt "#31028" msgid "Show fanart" msgstr "Show fanart" @@ -156,6 +160,10 @@ msgctxt "#31036" msgid "items" msgstr "items" +msgctxt "#31037" +msgid "Selected track" +msgstr "Selected track" + msgctxt "#31038" msgid "Rewind" msgstr "Rewind" @@ -220,6 +228,14 @@ msgctxt "#31058" msgid "Automatic Login on startup" msgstr "Automatic Login on startup" +msgctxt "#31059" +msgid "Select + X" +msgstr "Select + X" + +msgctxt "#31060" +msgid "Select + Start" +msgstr "Select + Start" + msgctxt "#31061" msgid "Main menu items" msgstr "Main menu items" @@ -260,6 +276,10 @@ msgctxt "#31072" msgid "Power Options" msgstr "Power Options" +msgctxt "#31073" +msgid "Total length" +msgstr "Total length" + msgctxt "#31074" msgid "Total duration" msgstr "Total duration" @@ -484,6 +504,14 @@ msgctxt "#31145" msgid "Search add-ons" msgstr "Search add-ons" +msgctxt "#31146" +msgid "In cinemas" +msgstr "In theaters" + +msgctxt "#31147" +msgid "In cinemas soon" +msgstr "In theaters soon" + msgctxt "#31148" msgid "Categories" msgstr "Categories" diff --git a/addons/skin.estuary/language/resource.language.eo/strings.po b/addons/skin.estuary/language/resource.language.eo/strings.po index 3513fcd4a2..438fed3b90 100644 --- a/addons/skin.estuary/language/resource.language.eo/strings.po +++ b/addons/skin.estuary/language/resource.language.eo/strings.po @@ -1,11 +1,11 @@ # Kodi Media Center language file # Addon Name: Estuary # Addon id: skin.estuary -# Addon Provider: phil65, Piers +# Addon Provider: phil65, Ichabod Fletchman msgid "" msgstr "" "Project-Id-Version: KODI Main\n" -"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\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" @@ -15,7 +15,3 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Language: eo\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgctxt "#31081" -msgid "Album info" -msgstr "Albumo Info" diff --git a/addons/skin.estuary/language/resource.language.es_es/strings.po b/addons/skin.estuary/language/resource.language.es_es/strings.po index a28b34d368..8a8ed1051d 100644 --- a/addons/skin.estuary/language/resource.language.es_es/strings.po +++ b/addons/skin.estuary/language/resource.language.es_es/strings.po @@ -124,6 +124,10 @@ msgctxt "#31026" msgid "Timeshift" msgstr "Timeshift" +msgctxt "#31027" +msgid "Next aired" +msgstr "Próxima emisión" + msgctxt "#31028" msgid "Show fanart" msgstr "Mostrar fanart" @@ -224,6 +228,14 @@ msgctxt "#31058" msgid "Automatic Login on startup" msgstr "Iniciar sesión automáticamente" +msgctxt "#31059" +msgid "Select + X" +msgstr "Select + X" + +msgctxt "#31060" +msgid "Select + Start" +msgstr "Select + Start" + msgctxt "#31061" msgid "Main menu items" msgstr "Elementos del menú principal" @@ -492,6 +504,14 @@ msgctxt "#31145" msgid "Search add-ons" msgstr "Buscar add-ons" +msgctxt "#31146" +msgid "In cinemas" +msgstr "En cines" + +msgctxt "#31147" +msgid "In cinemas soon" +msgstr "En cines próximamente" + msgctxt "#31148" msgid "Categories" msgstr "Categorías" @@ -554,7 +574,7 @@ msgstr "Juegue a sus juegos o descargue alguno de los múltiples add-ons del rep msgctxt "#31163" msgid "Show Fanart background" -msgstr "Mostar fondo fanart" +msgstr "Mostrar fondo fanart" msgctxt "#31164" msgid "Choose kind of profile identification" diff --git a/addons/skin.estuary/language/resource.language.et_ee/strings.po b/addons/skin.estuary/language/resource.language.et_ee/strings.po index 1d4fe36297..43bac97997 100644 --- a/addons/skin.estuary/language/resource.language.et_ee/strings.po +++ b/addons/skin.estuary/language/resource.language.et_ee/strings.po @@ -16,30 +16,82 @@ msgstr "" "Language: et_EE\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +msgctxt "#31000" +msgid "Now playing" +msgstr "Hetkel eetris" + msgctxt "#31001" msgid "Search..." msgstr "Otsimine..." +msgctxt "#31002" +msgid "Show media fanart as background" +msgstr "Näita taustal fännide loodud pilte" + +msgctxt "#31003" +msgid "Cinema mode" +msgstr "Kinorežiim" + msgctxt "#31004" msgid "Change mode" msgstr "Muuda režiimi" msgctxt "#31005" msgid "Watch as 2D" -msgstr "Vaata 2Dna" +msgstr "Vaata 2D-s" msgctxt "#31006" msgid "Random movies" msgstr "Juhuslik film" +msgctxt "#31007" +msgid "Unwatched movies" +msgstr "Vaatamata filmid" + +msgctxt "#31008" +msgid "Enable category widgets" +msgstr "Luba kategooria vidinad" + +msgctxt "#31009" +msgid "Download icons" +msgstr "Lae alla ikoonid" + msgctxt "#31010" msgid "In progress movies" msgstr "Vaatamine pooleli" +msgctxt "#31011" +msgid "Most played albums" +msgstr "Enim esitatud albumid" + +msgctxt "#31012" +msgid "Random albums" +msgstr "Juhuslik album" + +msgctxt "#31013" +msgid "Random artists" +msgstr "Juhuslik artist" + +msgctxt "#31014" +msgid "Unplayed albums" +msgstr "Esitamata albumid" + +msgctxt "#31015" +msgid "Recent recordings" +msgstr "Viimased salvestused" + +msgctxt "#31016" +msgid "Recently played channels" +msgstr "Viimased vaadatud kanalid" + msgctxt "#31017" msgid "Rated" msgstr "Vanusepiirang" +msgctxt "#31018" +msgid "Recently played channels" +msgstr "Viimased kuulatud kanalid" + msgctxt "#31019" msgid "Forecast" msgstr "Ilmateade" @@ -48,6 +100,10 @@ msgctxt "#31020" msgid "Actions" msgstr "Tegevused" +msgctxt "#31021" +msgid "Misc options" +msgstr "Muud suvandid" + msgctxt "#31022" msgid "Sort by" msgstr "Järjesta" @@ -56,14 +112,30 @@ msgctxt "#31023" msgid "Viewtype" msgstr "Esitusviis" +msgctxt "#31024" +msgid "Choose rating to display for media items" +msgstr "Vali meediaüksuste kuvamiseks hinne" + +msgctxt "#31025" +msgid "No favourites found. You can add any item from media views to this list by using the context menu." +msgstr "Lemmikuid ei ole. Kontekstimenüüd kasutades saate lisada meediakuvas üksusi sellesse nimekirja." + msgctxt "#31026" msgid "Timeshift" msgstr "Ajanihe" +msgctxt "#31027" +msgid "Next aired" +msgstr "Järgmisena eetris" + msgctxt "#31028" msgid "Show fanart" msgstr "Poster" +msgctxt "#31029" +msgid "Last logged in" +msgstr "Viimati sisse logitud" + msgctxt "#31030" msgid "System memory usage" msgstr "Mälu kasutus" @@ -80,6 +152,18 @@ msgctxt "#31033" msgid "Your rating" msgstr "Minu hinne" +msgctxt "#31035" +msgid "Pages" +msgstr "Lehed" + +msgctxt "#31036" +msgid "items" +msgstr "üksust" + +msgctxt "#31037" +msgid "Selected track" +msgstr "Valitud lugu" + msgctxt "#31038" msgid "Rewind" msgstr "Tagasi" @@ -88,34 +172,122 @@ msgctxt "#31039" msgid "Fast forward" msgstr "Edasi" +msgctxt "#31041" +msgid "Camera manufacturer" +msgstr "Kaamera valmistaja" + +msgctxt "#31042" +msgid "Playlist options" +msgstr "Esitusloendi suvandid" + +msgctxt "#31043" +msgid "Set the type and add rules to create a smart playlist. These playlists are dynamic and include all media items from your database which apply to your chosen rules." +msgstr "Nutika esitusloendi loomiseks määra liik ja lisa reeglid. Nutikad esitusloendid on muutuvad ja sisaldavad kõiki määratud reeglitega sobivaid meediaüksusi andmebaasist." + +msgctxt "#31044" +msgid "Add group" +msgstr "Lisa grupp" + +msgctxt "#31045" +msgid "Rename group" +msgstr "Nimeta grupp ümber" + +msgctxt "#31046" +msgid "Delete group" +msgstr "Kustuta grupp" + +msgctxt "#31048" +msgid "Available" +msgstr "Saadaval" + +msgctxt "#31050" +msgid "Press [B]OK[/B] to stop" +msgstr "Peatamiseks vajuta [B]OK[/B]" + +msgctxt "#31052" +msgid "filtered" +msgstr "filtreeritud" + msgctxt "#31053" msgid "Arial based" msgstr "Arial-il põhinev" +msgctxt "#31054" +msgid "Press [B]Left[/B] to rewind, or [B]Right[/B] to fast-forward" +msgstr "Tagasi kerimiseks vajuta [B]vasakule[/B] või edasi kerimiseks [B]paremale[/B]" + +msgctxt "#31056" +msgid "Go to playlist" +msgstr "Mine esitusloendisse" + +msgctxt "#31057" +msgid "Show login screen on startup" +msgstr "Käivitusel kuva logimisaken" + +msgctxt "#31058" +msgid "Automatic Login on startup" +msgstr "Käivitusel logib ise sisse" + +msgctxt "#31059" +msgid "Select + X" +msgstr "Select + X" + +msgctxt "#31060" +msgid "Select + Start" +msgstr "Select + Start" + msgctxt "#31061" msgid "Main menu items" -msgstr "Peamenüü elemendid" +msgstr "Peamenüü üksused" + +msgctxt "#31062" +msgid "Choose weather fanart pack" +msgstr "Vali ilmateate fännipiltide pakk" + +msgctxt "#31063" +msgid "Sections" +msgstr "Rubriigid" + +msgctxt "#31065" +msgid "Video playlist" +msgstr "Video esitusloend" msgctxt "#31066" msgid "Music playlist" -msgstr "Muusika pleilist" +msgstr "Muusika esitusloend" msgctxt "#31067" msgid "Event log" -msgstr "Logimine" +msgstr "Logiraamat" + +msgctxt "#31068" +msgid "Choose presets" +msgstr "Vali eelhäälestused" msgctxt "#31069" msgid "Last Updated" msgstr "Viimati uuendatud" +msgctxt "#31071" +msgid "by" +msgstr "autor on" + msgctxt "#31072" msgid "Power Options" msgstr "Toide" +msgctxt "#31073" +msgid "Total length" +msgstr "Kogupikkus" + msgctxt "#31074" msgid "Total duration" msgstr "Kogukestvus" +msgctxt "#31075" +msgid "Movie sets" +msgstr "Filmi kogumikud" + msgctxt "#31079" msgid "Cast not available" msgstr "Osatäitjad pole teada" @@ -124,22 +296,130 @@ msgctxt "#31080" msgid "Ends at" msgstr "Lõpeb" +msgctxt "#31082" +msgid "Lyrics add-on" +msgstr "Laulusõnade lisamoodul" + +msgctxt "#31083" +msgid "Lyrics add-on settings" +msgstr "Laulusõnade lisamooduli seaded" + +msgctxt "#31084" +msgid "Visualisation settings" +msgstr "Visualiseerimise seaded" + +msgctxt "#31089" +msgid "Available groups" +msgstr "Saadaval grupid" + +msgctxt "#31092" +msgid "Video menu" +msgstr "Videomenüü" + +msgctxt "#31093" +msgid "Show weather info in top bar" +msgstr "Kuva ülaribal ilmateadet" + +msgctxt "#31095" +msgid "Use slide animations" +msgstr "Kasuta slaidanimatsioone" + msgctxt "#31096" msgid "Local subtitle available" msgstr "Lokaalsed subtiitrid on saadaval" +msgctxt "#31097" +msgid "Channel options" +msgstr "Kanali suvandid" + +msgctxt "#31098" +msgid "Select your Kodi user profile[CR]to login and continue" +msgstr "Vali sisse logimiseks Kodi kasutaja profiil[CR]ja jätka" + +msgctxt "#31099" +msgid "IconWall" +msgstr "Ikoonisein" + msgctxt "#31100" msgid "Shift" msgstr "Riba" +msgctxt "#31101" +msgid "InfoWall" +msgstr "Infosein" + +msgctxt "#31102" +msgid "Wall" +msgstr "Sein" + +msgctxt "#31103" +msgid "Enter text here..." +msgstr "Sisesta tekst siia..." + +msgctxt "#31104" +msgid "Your library is currently empty. In order to populate it with your personal media, enter \"Files\" section, add a media source and configure it. After the source has been added and indexed you will be able to browse your library." +msgstr "Teek on praegu tühi. Selleks, et seda täita oma meediaga minge rubriiki \"Failid\", lisage meediaallikas ja seadistage see." + +msgctxt "#31105" +msgid "Add video sources and set the appropriate content type in order to populate your video libraries." +msgstr "Lisa videoallikad ja määra videoteegi täitmiseks sisu liik." + msgctxt "#31106" msgid "Teletext" msgstr "Teletekst" +msgctxt "#31107" +msgid "WideList" +msgstr "Lai nimekiri" + +msgctxt "#31110" +msgid "Enter files section" +msgstr "Mine failide rubriiki" + +msgctxt "#31111" +msgid "View your personal pictures or download one of the many image add-ons from the official repository." +msgstr "Vaata oma pilte või lae ametlikust hoidlast alla piltide lisamoodulid." + msgctxt "#31112" msgid "Toggle audio stream" msgstr "Vaheta heliriba" +msgctxt "#31113" +msgid "Search local library" +msgstr "Otsi kohalikust teegist" + +msgctxt "#31114" +msgid "Search YouTube" +msgstr "Otsi YouTube-ist" + +msgctxt "#31116" +msgid "Remove this main menu item" +msgstr "Eemalda see peamenüü üksus" + +msgctxt "#31117" +msgid "Edit nodes" +msgstr "Redigeeri sõlmesid" + +msgctxt "#31118" +msgid "Enter add-on browser" +msgstr "Mine lisamoodulite brauserisse" + +msgctxt "#31119" +msgid "You do not have any add-ons installed yet. Visit our add-on browser to browse through our collection and improve your Kodi experience." +msgstr "Te ei ole paigaldanud ühtegi lisamoodulit. Külastage meie lisamoodulite brauserit ja sirvige lisamooduleid ning täiustage Kodit." + +msgctxt "#31120" +msgid "You did not set up a weather provider yet. In order to view weather information, choose a weather provider and set up your location." +msgstr "Te ei ole määranud ilmateate pakkujat. Ilmateate kuvamiseks valige ilmateate pakkuja ja määrake oma asukoht." + +msgctxt "#31121" +msgid "Set weather provider" +msgstr "Määra ilmateate pakkuja" + +msgctxt "#31122" +msgid "Unwatched TV Shows" +msgstr "Vaatamata seriaalid" + msgctxt "#31123" msgid "Same director" msgstr "Sama režissöör" @@ -152,13 +432,33 @@ msgctxt "#31126" msgid "Press OK to read plot" msgstr "Sisu täielikuks lugemiseks vajuta OK" +msgctxt "#31127" +msgid "Show icons" +msgstr "Kuva ikoonid" + +msgctxt "#31128" +msgid "Contributors" +msgstr "Osalejad" + +msgctxt "#31129" +msgid "General settings applying to all areas of the skin." +msgstr "Rüü kõikidele osadele kohalduvad üldseaded" + +msgctxt "#31130" +msgid "Main menu-related settings: Configure the home screen to your likings." +msgstr "Peamenüü seaded: Seadista avakuva oma meele järgi." + +msgctxt "#31131" +msgid "Choose skin fanart pack" +msgstr "Vali rüü fännipildi pakk" + msgctxt "#31132" msgid "Select Program" msgstr "Vali programm" msgctxt "#31133" msgid "Select Resolution" -msgstr "Vali lahutus" +msgstr "Vali ekraanilahutus" msgctxt "#31134" msgid "Remaining" @@ -168,6 +468,10 @@ msgctxt "#31136" msgid "Click here to see latest changes..." msgstr "Viimaste muudatuste vaatamiseks kliki siia..." +msgctxt "#31137" +msgid "PVR info" +msgstr "PVR-i info" + msgctxt "#31138" msgid "Player process info" msgstr "Pleieri protsesside teave" @@ -180,10 +484,54 @@ msgctxt "#31140" msgid "Pixel format" msgstr "Piksli vorming" +msgctxt "#31141" +msgid "Changes for version" +msgstr "Muudatused versioonis" + +msgctxt "#31142" +msgid "Play speed" +msgstr "Esitamise kiirus" + +msgctxt "#31143" +msgid "You did not set up PVR yet. In order to use PVR, choose a PVR client addon and configure it. Please visit http://kodi.wiki/view/PVR to learn more." +msgstr "PVR on seadistamata. PVR-i kasutamiseks valige ja seadistage PVR-i klientprogramm. Rohkem infot: http://kodi.wiki/view/PVR " + +msgctxt "#31144" +msgid "Enter add-on browser" +msgstr "Mine lisamoodulite brauserisse" + +msgctxt "#31145" +msgid "Search add-ons" +msgstr "Otsi lisamooduleid" + +msgctxt "#31146" +msgid "In cinemas" +msgstr "Kinodes" + +msgctxt "#31147" +msgid "In cinemas soon" +msgstr "Varsti kinodes" + msgctxt "#31148" msgid "Categories" msgstr "Kategooriad" +msgctxt "#31150" +msgid "Repository" +msgstr "Hoidla" + +msgctxt "#31151" +msgid "Unwatched music videos" +msgstr "Vaatamata muusikavideod" + +msgctxt "#31152" +msgid "Random music videos" +msgstr "Juhuslik muusikavideo" + +msgctxt "#31153" +msgid "You do not have any add-ons of this type installed. Enter the add-on browser to download add-ons created by our community." +msgstr "Teil ei ole seda sorti lisamooduleid paigaldatud. Meie kasutajate poolt loodud lisamoodulite alla laadimiseks, minge lisamoodulite brauserisse." + msgctxt "#31154" msgid "Press OK to switch between locations" msgstr "Asukohtade vahel valimiseks vajuta OK" @@ -192,10 +540,46 @@ msgctxt "#31155" msgid "No bookmarks created yet." msgstr "Järjehoidjaid ei ole" +msgctxt "#31156" +msgid "Choose background pattern" +msgstr "Vali taustapildi muster" + msgctxt "#31157" msgid "Edit categories" msgstr "Redigeeri" +msgctxt "#31158" +msgid "Touch mode" +msgstr "Puutetundlik režiim" + +msgctxt "#31159" +msgid "Artwork" +msgstr "Joonistus" + +msgctxt "#31160" +msgid "Show media flags" +msgstr "Kuva meedia andmed" + +msgctxt "#31161" +msgid "Numeric pad" +msgstr "Numbriklahvistik" + +msgctxt "#31162" +msgid "Play your personal games or download one of the many game add-ons from the official repository." +msgstr "Mängi oma mänge või lae ametlikust hoidlast alla mängude lisamoodulid." + +msgctxt "#31164" +msgid "Choose kind of profile identification" +msgstr "Vali profiili tuvastuse liik" + msgctxt "#31165" msgid "Profile name" msgstr "Profiili nimi" + +msgctxt "#31166" +msgid "Profile avatar" +msgstr "Profiili avatar" + +msgctxt "#31167" +msgid "Animate background" +msgstr "Tausta animeerimine" diff --git a/addons/skin.estuary/language/resource.language.fa_af/strings.po b/addons/skin.estuary/language/resource.language.fa_af/strings.po index 02f4c68ab4..8fabb433c6 100644 --- a/addons/skin.estuary/language/resource.language.fa_af/strings.po +++ b/addons/skin.estuary/language/resource.language.fa_af/strings.po @@ -14,7 +14,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: fa_AF\n" -"Plural-Forms: nplurals=1; plural=0;\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" msgctxt "#31001" msgid "Search..." diff --git a/addons/skin.estuary/language/resource.language.fa_ir/strings.po b/addons/skin.estuary/language/resource.language.fa_ir/strings.po index 7e57bfb9ff..0fe41805bc 100644 --- a/addons/skin.estuary/language/resource.language.fa_ir/strings.po +++ b/addons/skin.estuary/language/resource.language.fa_ir/strings.po @@ -14,7 +14,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: fa_IR\n" -"Plural-Forms: nplurals=1; plural=0;\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" msgctxt "#31000" msgid "Now playing" diff --git a/addons/skin.estuary/language/resource.language.fi_fi/strings.po b/addons/skin.estuary/language/resource.language.fi_fi/strings.po index cd195db999..d569ec710e 100644 --- a/addons/skin.estuary/language/resource.language.fi_fi/strings.po +++ b/addons/skin.estuary/language/resource.language.fi_fi/strings.po @@ -124,6 +124,10 @@ msgctxt "#31026" msgid "Timeshift" msgstr "Ajansiirto" +msgctxt "#31027" +msgid "Next aired" +msgstr "Seuraava esitys" + msgctxt "#31028" msgid "Show fanart" msgstr "Näytä fanitaide" @@ -224,6 +228,14 @@ msgctxt "#31058" msgid "Automatic Login on startup" msgstr "Automaattinen kirjautuminen" +msgctxt "#31059" +msgid "Select + X" +msgstr "Valinta + X" + +msgctxt "#31060" +msgid "Select + Start" +msgstr "Valinta + Aloita" + msgctxt "#31061" msgid "Main menu items" msgstr "Päävalikko" @@ -492,6 +504,14 @@ msgctxt "#31145" msgid "Search add-ons" msgstr "Etsi lisäosista" +msgctxt "#31146" +msgid "In cinemas" +msgstr "Teattereissa" + +msgctxt "#31147" +msgid "In cinemas soon" +msgstr "Tulossa pian teattereihin" + msgctxt "#31148" msgid "Categories" msgstr "Kategoriat" diff --git a/addons/skin.estuary/language/resource.language.fr_fr/strings.po b/addons/skin.estuary/language/resource.language.fr_fr/strings.po index 668f59ecd1..cfe1b099aa 100644 --- a/addons/skin.estuary/language/resource.language.fr_fr/strings.po +++ b/addons/skin.estuary/language/resource.language.fr_fr/strings.po @@ -124,6 +124,10 @@ msgctxt "#31026" msgid "Timeshift" msgstr "Différé" +msgctxt "#31027" +msgid "Next aired" +msgstr "Diffusion suivante" + msgctxt "#31028" msgid "Show fanart" msgstr "Afficher le FanArt" @@ -224,6 +228,14 @@ msgctxt "#31058" msgid "Automatic Login on startup" msgstr "Identification auto. au démarrage" +msgctxt "#31059" +msgid "Select + X" +msgstr "Sélectionner" + +msgctxt "#31060" +msgid "Select + Start" +msgstr "Sélectionner + Démarrage" + msgctxt "#31061" msgid "Main menu items" msgstr "Menu principal" @@ -492,6 +504,14 @@ msgctxt "#31145" msgid "Search add-ons" msgstr "Rechercher les extensions" +msgctxt "#31146" +msgid "In cinemas" +msgstr "À l'affiche" + +msgctxt "#31147" +msgid "In cinemas soon" +msgstr "Bientôt à l'affiche" + msgctxt "#31148" msgid "Categories" msgstr "Catégories" diff --git a/addons/skin.estuary/language/resource.language.he_il/strings.po b/addons/skin.estuary/language/resource.language.he_il/strings.po index 9dc18acbfd..672d1dd144 100644 --- a/addons/skin.estuary/language/resource.language.he_il/strings.po +++ b/addons/skin.estuary/language/resource.language.he_il/strings.po @@ -14,7 +14,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: he_IL\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % 1 == 0) ? 1: (n % 10 == 0 && n % 1 == 0 && n > 10) ? 2 : 3;\n" msgctxt "#31000" msgid "Now playing" @@ -274,7 +274,7 @@ msgstr "שידור אינו זמין" msgctxt "#31080" msgid "Ends at" -msgstr "מסתיים ב-" +msgstr "מסתיים ב" msgctxt "#31082" msgid "Lyrics add-on" diff --git a/addons/skin.estuary/language/resource.language.hu_hu/strings.po b/addons/skin.estuary/language/resource.language.hu_hu/strings.po index 92d782e37c..15d9cc4601 100644 --- a/addons/skin.estuary/language/resource.language.hu_hu/strings.po +++ b/addons/skin.estuary/language/resource.language.hu_hu/strings.po @@ -124,6 +124,10 @@ msgctxt "#31026" msgid "Timeshift" msgstr "Csúsztatott felvétel" +msgctxt "#31027" +msgid "Next aired" +msgstr "Következő premier" + msgctxt "#31028" msgid "Show fanart" msgstr "Illusztráció megjelenítése" @@ -156,6 +160,10 @@ msgctxt "#31036" msgid "items" msgstr "elem" +msgctxt "#31037" +msgid "Selected track" +msgstr "Kiválasztott sáv" + msgctxt "#31038" msgid "Rewind" msgstr "Visszatekerés" @@ -220,6 +228,14 @@ msgctxt "#31058" msgid "Automatic Login on startup" msgstr "Automatikus bejelentkezés indításkor" +msgctxt "#31059" +msgid "Select + X" +msgstr "Kiválasztás + X" + +msgctxt "#31060" +msgid "Select + Start" +msgstr "Kiválasztás + indítás" + msgctxt "#31061" msgid "Main menu items" msgstr "Főmenü elemek" @@ -260,9 +276,13 @@ msgctxt "#31072" msgid "Power Options" msgstr "Kikapcsolási lehetőségek" +msgctxt "#31073" +msgid "Total length" +msgstr "Teljes hossz" + msgctxt "#31074" msgid "Total duration" -msgstr "Teljes időtartam" +msgstr "Teljes időtartam" msgctxt "#31075" msgid "Movie sets" @@ -484,6 +504,14 @@ msgctxt "#31145" msgid "Search add-ons" msgstr "Bővítmények keresése" +msgctxt "#31146" +msgid "In cinemas" +msgstr "Mozikban" + +msgctxt "#31147" +msgid "In cinemas soon" +msgstr "Hamarosan a mozikban" + msgctxt "#31148" msgid "Categories" msgstr "Kategóriák" diff --git a/addons/skin.estuary/language/resource.language.is_is/strings.po b/addons/skin.estuary/language/resource.language.is_is/strings.po index a74df9e51c..0750a50b41 100644 --- a/addons/skin.estuary/language/resource.language.is_is/strings.po +++ b/addons/skin.estuary/language/resource.language.is_is/strings.po @@ -14,7 +14,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: is_IS\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Plural-Forms: nplurals=2; plural=(n % 10 != 1 || n % 100 == 11);\n" msgctxt "#31000" msgid "Now playing" diff --git a/addons/skin.estuary/language/resource.language.it_it/strings.po b/addons/skin.estuary/language/resource.language.it_it/strings.po index 713ea5fbc3..1f2775299c 100644 --- a/addons/skin.estuary/language/resource.language.it_it/strings.po +++ b/addons/skin.estuary/language/resource.language.it_it/strings.po @@ -124,6 +124,10 @@ msgctxt "#31026" msgid "Timeshift" msgstr "Timeshift" +msgctxt "#31027" +msgid "Next aired" +msgstr "Prossimo in onda" + msgctxt "#31028" msgid "Show fanart" msgstr "Mostra fanart" @@ -156,6 +160,10 @@ msgctxt "#31036" msgid "items" msgstr "elementi" +msgctxt "#31037" +msgid "Selected track" +msgstr "Traccia selezionata" + msgctxt "#31038" msgid "Rewind" msgstr "Indietro" @@ -220,6 +228,14 @@ msgctxt "#31058" msgid "Automatic Login on startup" msgstr "Login automatico all'avvio" +msgctxt "#31059" +msgid "Select + X" +msgstr "Select + X" + +msgctxt "#31060" +msgid "Select + Start" +msgstr "Select + Start" + msgctxt "#31061" msgid "Main menu items" msgstr "Elementi menù principale" @@ -260,6 +276,10 @@ msgctxt "#31072" msgid "Power Options" msgstr "Opzioni Alimentazione" +msgctxt "#31073" +msgid "Total length" +msgstr "Lunghezza totale" + msgctxt "#31074" msgid "Total duration" msgstr "Durata totale" @@ -484,6 +504,14 @@ msgctxt "#31145" msgid "Search add-ons" msgstr "Cerca Add-on" +msgctxt "#31146" +msgid "In cinemas" +msgstr "Nei cinema" + +msgctxt "#31147" +msgid "In cinemas soon" +msgstr "Presto nei cinema" + msgctxt "#31148" msgid "Categories" msgstr "Categorie" diff --git a/addons/skin.estuary/language/resource.language.ja_jp/strings.po b/addons/skin.estuary/language/resource.language.ja_jp/strings.po index 5cad80ef5b..ebe3594196 100644 --- a/addons/skin.estuary/language/resource.language.ja_jp/strings.po +++ b/addons/skin.estuary/language/resource.language.ja_jp/strings.po @@ -124,6 +124,10 @@ msgctxt "#31026" msgid "Timeshift" msgstr "タイムシフト" +msgctxt "#31027" +msgid "Next aired" +msgstr "次回の放送" + msgctxt "#31028" msgid "Show fanart" msgstr "ファンアートを見る" @@ -224,6 +228,14 @@ msgctxt "#31058" msgid "Automatic Login on startup" msgstr "スタートアップ時に自動ログイン" +msgctxt "#31059" +msgid "Select + X" +msgstr "セレクト + X" + +msgctxt "#31060" +msgid "Select + Start" +msgstr "セレクト + スタート" + msgctxt "#31061" msgid "Main menu items" msgstr "メインメニューアイテム" @@ -492,6 +504,14 @@ msgctxt "#31145" msgid "Search add-ons" msgstr "アドオン選択" +msgctxt "#31146" +msgid "In cinemas" +msgstr "映画館にて" + +msgctxt "#31147" +msgid "In cinemas soon" +msgstr "もうすぐ映画館で" + msgctxt "#31148" msgid "Categories" msgstr "カテゴリー" diff --git a/addons/skin.estuary/language/resource.language.kn_in/strings.po b/addons/skin.estuary/language/resource.language.kn_in/strings.po new file mode 100644 index 0000000000..799d36cd35 --- /dev/null +++ b/addons/skin.estuary/language/resource.language.kn_in/strings.po @@ -0,0 +1,17 @@ +# Kodi Media Center language file +# Addon Name: Estuary +# Addon id: skin.estuary +# Addon Provider: phil65, Ichabod Fletchman +msgid "" +msgstr "" +"Project-Id-Version: KODI Main\n" +"Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\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: Kannada (India) (http://www.transifex.com/projects/p/kodi-main/language/kn_IN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: kn_IN\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" diff --git a/addons/skin.estuary/language/resource.language.ko_kr/strings.po b/addons/skin.estuary/language/resource.language.ko_kr/strings.po index c47e617894..88f839f88a 100644 --- a/addons/skin.estuary/language/resource.language.ko_kr/strings.po +++ b/addons/skin.estuary/language/resource.language.ko_kr/strings.po @@ -124,6 +124,10 @@ msgctxt "#31026" msgid "Timeshift" msgstr "타임시프트" +msgctxt "#31027" +msgid "Next aired" +msgstr "다음 방송됨" + msgctxt "#31028" msgid "Show fanart" msgstr "팬아트 표시" @@ -224,6 +228,14 @@ msgctxt "#31058" msgid "Automatic Login on startup" msgstr "시작할 때 자동 로그인" +msgctxt "#31059" +msgid "Select + X" +msgstr "Select + X" + +msgctxt "#31060" +msgid "Select + Start" +msgstr "Select + Start" + msgctxt "#31061" msgid "Main menu items" msgstr "메인 메뉴 항목" @@ -492,6 +504,14 @@ msgctxt "#31145" msgid "Search add-ons" msgstr "애드온 검색" +msgctxt "#31146" +msgid "In cinemas" +msgstr "영화에서" + +msgctxt "#31147" +msgid "In cinemas soon" +msgstr "곧 영화에서" + msgctxt "#31148" msgid "Categories" msgstr "카테고리" diff --git a/addons/skin.estuary/language/resource.language.lt_lt/strings.po b/addons/skin.estuary/language/resource.language.lt_lt/strings.po index f49151027b..a7a75c75fd 100644 --- a/addons/skin.estuary/language/resource.language.lt_lt/strings.po +++ b/addons/skin.estuary/language/resource.language.lt_lt/strings.po @@ -14,7 +14,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: lt_LT\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"Plural-Forms: nplurals=4; plural=(n % 10 == 1 && (n % 100 > 19 || n % 100 < 11) ? 0 : (n % 10 >= 2 && n % 10 <=9) && (n % 100 > 19 || n % 100 < 11) ? 1 : n % 1 != 0 ? 2: 3);\n" msgctxt "#31000" msgid "Now playing" @@ -124,6 +124,10 @@ msgctxt "#31026" msgid "Timeshift" msgstr "Laiko poslinkis" +msgctxt "#31027" +msgid "Next aired" +msgstr "Kita transliacija" + msgctxt "#31028" msgid "Show fanart" msgstr "Rodyti Fanart" @@ -224,6 +228,14 @@ msgctxt "#31058" msgid "Automatic Login on startup" msgstr "Automatinis prisijungimas paleidžiant" +msgctxt "#31059" +msgid "Select + X" +msgstr "Select + X" + +msgctxt "#31060" +msgid "Select + Start" +msgstr "Select + Start" + msgctxt "#31061" msgid "Main menu items" msgstr "Meniu elementai" @@ -492,6 +504,14 @@ msgctxt "#31145" msgid "Search add-ons" msgstr "Ieškoti priedų" +msgctxt "#31146" +msgid "In cinemas" +msgstr "Kino teatruose" + +msgctxt "#31147" +msgid "In cinemas soon" +msgstr "Netrukus kino teatruose" + msgctxt "#31148" msgid "Categories" msgstr "Kategorijos" diff --git a/addons/skin.estuary/language/resource.language.ml_in/strings.po b/addons/skin.estuary/language/resource.language.ml_in/strings.po index 631a13a8da..810e485405 100644 --- a/addons/skin.estuary/language/resource.language.ml_in/strings.po +++ b/addons/skin.estuary/language/resource.language.ml_in/strings.po @@ -1,11 +1,11 @@ # Kodi Media Center language file # Addon Name: Estuary # Addon id: skin.estuary -# Addon Provider: phil65, Piers +# Addon Provider: phil65, Ichabod Fletchman msgid "" msgstr "" "Project-Id-Version: KODI Main\n" -"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\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" @@ -15,7 +15,3 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Language: ml_IN\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgctxt "#31001" -msgid "Search" -msgstr "തിരയുക" diff --git a/addons/skin.estuary/language/resource.language.ms_my/strings.po b/addons/skin.estuary/language/resource.language.ms_my/strings.po index 4ca3c91f31..1a1fe89e45 100644 --- a/addons/skin.estuary/language/resource.language.ms_my/strings.po +++ b/addons/skin.estuary/language/resource.language.ms_my/strings.po @@ -124,6 +124,10 @@ msgctxt "#31026" msgid "Timeshift" msgstr "Anjak Masa" +msgctxt "#31027" +msgid "Next aired" +msgstr "Keudara berikutnya" + msgctxt "#31028" msgid "Show fanart" msgstr "Tunjuk seni peminat" @@ -156,6 +160,10 @@ msgctxt "#31036" msgid "items" msgstr "item" +msgctxt "#31037" +msgid "Selected track" +msgstr "Trek terpilih" + msgctxt "#31038" msgid "Rewind" msgstr "Undur" @@ -220,6 +228,14 @@ msgctxt "#31058" msgid "Automatic Login on startup" msgstr "Daftar masuk automatik ketika permulaan" +msgctxt "#31059" +msgid "Select + X" +msgstr "Select + X" + +msgctxt "#31060" +msgid "Select + Start" +msgstr "Select + Start" + msgctxt "#31061" msgid "Main menu items" msgstr "Item menu utama" @@ -260,6 +276,10 @@ msgctxt "#31072" msgid "Power Options" msgstr "Opsyen Kuasa" +msgctxt "#31073" +msgid "Total length" +msgstr "Jumlah tempoh" + msgctxt "#31074" msgid "Total duration" msgstr "Tempoh keseluruhan" @@ -484,6 +504,14 @@ msgctxt "#31145" msgid "Search add-ons" msgstr "Gelintar tambahan" +msgctxt "#31146" +msgid "In cinemas" +msgstr "Ditayang wayang" + +msgctxt "#31147" +msgid "In cinemas soon" +msgstr "Akan ditayang wayang kelak" + msgctxt "#31148" msgid "Categories" msgstr "Kategori" diff --git a/addons/skin.estuary/language/resource.language.nl_nl/strings.po b/addons/skin.estuary/language/resource.language.nl_nl/strings.po index 4b7ccc30ee..fd3d49e454 100644 --- a/addons/skin.estuary/language/resource.language.nl_nl/strings.po +++ b/addons/skin.estuary/language/resource.language.nl_nl/strings.po @@ -260,6 +260,10 @@ msgctxt "#31072" msgid "Power Options" msgstr "Energiebeheer" +msgctxt "#31073" +msgid "Total length" +msgstr "Totale lengte" + msgctxt "#31074" msgid "Total duration" msgstr "Totale duur" diff --git a/addons/skin.estuary/language/resource.language.pl_pl/strings.po b/addons/skin.estuary/language/resource.language.pl_pl/strings.po index 3d89210237..fd78d80cef 100644 --- a/addons/skin.estuary/language/resource.language.pl_pl/strings.po +++ b/addons/skin.estuary/language/resource.language.pl_pl/strings.po @@ -14,7 +14,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: pl_PL\n" -"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n" msgctxt "#31000" msgid "Now playing" diff --git a/addons/skin.estuary/language/resource.language.pt_br/strings.po b/addons/skin.estuary/language/resource.language.pt_br/strings.po index 0b7c49bafc..d88dac2d16 100644 --- a/addons/skin.estuary/language/resource.language.pt_br/strings.po +++ b/addons/skin.estuary/language/resource.language.pt_br/strings.po @@ -124,6 +124,10 @@ msgctxt "#31026" msgid "Timeshift" msgstr "Mudança de horário" +msgctxt "#31027" +msgid "Next aired" +msgstr "Próxima exibição" + msgctxt "#31028" msgid "Show fanart" msgstr "Mostrar fanart" @@ -224,6 +228,14 @@ msgctxt "#31058" msgid "Automatic Login on startup" msgstr "Login automático ao inicializar" +msgctxt "#31059" +msgid "Select + X" +msgstr "Selecionar + X" + +msgctxt "#31060" +msgid "Select + Start" +msgstr "Selecione + Iniciar" + msgctxt "#31061" msgid "Main menu items" msgstr "Ítens Menu Principal" @@ -492,6 +504,14 @@ msgctxt "#31145" msgid "Search add-ons" msgstr "Procurar add-ons" +msgctxt "#31146" +msgid "In cinemas" +msgstr "Nos cinemas" + +msgctxt "#31147" +msgid "In cinemas soon" +msgstr "Nos cinemas em breve" + msgctxt "#31148" msgid "Categories" msgstr "Categorias" diff --git a/addons/skin.estuary/language/resource.language.ru_ru/strings.po b/addons/skin.estuary/language/resource.language.ru_ru/strings.po index 52c5669f5c..85bbccaa63 100644 --- a/addons/skin.estuary/language/resource.language.ru_ru/strings.po +++ b/addons/skin.estuary/language/resource.language.ru_ru/strings.po @@ -14,7 +14,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ru_RU\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" msgctxt "#31000" msgid "Now playing" diff --git a/addons/skin.estuary/language/resource.language.si_lk/strings.po b/addons/skin.estuary/language/resource.language.si_lk/strings.po index 3f7cab0ba1..89a3c9d9ab 100644 --- a/addons/skin.estuary/language/resource.language.si_lk/strings.po +++ b/addons/skin.estuary/language/resource.language.si_lk/strings.po @@ -1,11 +1,11 @@ # Kodi Media Center language file # Addon Name: Estuary # Addon id: skin.estuary -# Addon Provider: phil65, Piers +# Addon Provider: phil65, Ichabod Fletchman msgid "" msgstr "" "Project-Id-Version: KODI Main\n" -"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\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" @@ -15,7 +15,3 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Language: si_LK\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgctxt "#31081" -msgid "Album info" -msgstr "ඇල්බම් තොරතුරු " diff --git a/addons/skin.estuary/language/resource.language.sk_sk/strings.po b/addons/skin.estuary/language/resource.language.sk_sk/strings.po index 2c48ee280b..3770b22b47 100644 --- a/addons/skin.estuary/language/resource.language.sk_sk/strings.po +++ b/addons/skin.estuary/language/resource.language.sk_sk/strings.po @@ -14,7 +14,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: sk_SK\n" -"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" +"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n == 1 ? 0 : n % 1 == 0 && n >= 2 && n <= 4 ? 1 : n % 1 != 0 ? 2: 3);\n" msgctxt "#31000" msgid "Now playing" @@ -124,6 +124,10 @@ msgctxt "#31026" msgid "Timeshift" msgstr "Časový posun" +msgctxt "#31027" +msgid "Next aired" +msgstr "Nasledujúce vysielanie" + msgctxt "#31028" msgid "Show fanart" msgstr "Zobraziť fanart" @@ -156,6 +160,10 @@ msgctxt "#31036" msgid "items" msgstr "položky" +msgctxt "#31037" +msgid "Selected track" +msgstr "Vybraná stopa" + msgctxt "#31038" msgid "Rewind" msgstr "Pretočiť dozadu" @@ -220,6 +228,14 @@ msgctxt "#31058" msgid "Automatic Login on startup" msgstr "Automatické prihlásenie pri spustení" +msgctxt "#31059" +msgid "Select + X" +msgstr "Vybrať + X" + +msgctxt "#31060" +msgid "Select + Start" +msgstr "Vybrať + Štart" + msgctxt "#31061" msgid "Main menu items" msgstr "Položky hlavnej ponuky" @@ -260,6 +276,10 @@ msgctxt "#31072" msgid "Power Options" msgstr "Možnosti napájania" +msgctxt "#31073" +msgid "Total length" +msgstr "Celková dĺžka" + msgctxt "#31074" msgid "Total duration" msgstr "Celkové trvanie" @@ -474,7 +494,7 @@ msgstr "Rýchlosť prehrávania" msgctxt "#31143" msgid "You did not set up PVR yet. In order to use PVR, choose a PVR client addon and configure it. Please visit http://kodi.wiki/view/PVR to learn more." -msgstr "Nanadstavili ste PVR. Pokiaľ chcete používať PVR, vyberte si doplnok pre PVR klienta a nakonfigurujte ho. Navštívte http://kodi.wiki/view/PVR pre viac informácií." +msgstr "Nenastavili ste PVR. Aby ste mohli používať PVR, vyberte si doplnok PVR klienta a nakonfigurujte ho. Navštívte http://kodi.wiki/view/PVR pre viac informácií." msgctxt "#31144" msgid "Enter add-on browser" @@ -484,6 +504,14 @@ msgctxt "#31145" msgid "Search add-ons" msgstr "Prehľadávať doplnky" +msgctxt "#31146" +msgid "In cinemas" +msgstr "V kinách" + +msgctxt "#31147" +msgid "In cinemas soon" +msgstr "Čoskoro v kinách" + msgctxt "#31148" msgid "Categories" msgstr "Kategórie" @@ -542,7 +570,7 @@ msgstr "Numerická klávesnica" msgctxt "#31162" msgid "Play your personal games or download one of the many game add-ons from the official repository." -msgstr "Zahrajte si vaše osobné hry alebo si prevezmite jeden z mnohých herných doplnkov z oficiálneho repozitára." +msgstr "Zahrajte si hry alebo si prevezmite jeden z mnohých herných doplnkov z oficiálneho repozitára." msgctxt "#31163" msgid "Show Fanart background" diff --git a/addons/skin.estuary/language/resource.language.sv_se/strings.po b/addons/skin.estuary/language/resource.language.sv_se/strings.po index 3c144c057c..2a7b7cb624 100644 --- a/addons/skin.estuary/language/resource.language.sv_se/strings.po +++ b/addons/skin.estuary/language/resource.language.sv_se/strings.po @@ -124,6 +124,10 @@ msgctxt "#31026" msgid "Timeshift" msgstr "Tidsskifte" +msgctxt "#31027" +msgid "Next aired" +msgstr "Nästa sändning" + msgctxt "#31028" msgid "Show fanart" msgstr "Visa fanart" @@ -492,6 +496,14 @@ msgctxt "#31145" msgid "Search add-ons" msgstr "Sök bland tillägg" +msgctxt "#31146" +msgid "In cinemas" +msgstr "På bio" + +msgctxt "#31147" +msgid "In cinemas soon" +msgstr "På bio snart" + msgctxt "#31148" msgid "Categories" msgstr "Kategorier" diff --git a/addons/skin.estuary/language/resource.language.te_in/strings.po b/addons/skin.estuary/language/resource.language.te_in/strings.po index eadc6b6b4f..11383a14c2 100644 --- a/addons/skin.estuary/language/resource.language.te_in/strings.po +++ b/addons/skin.estuary/language/resource.language.te_in/strings.po @@ -1,11 +1,11 @@ # Kodi Media Center language file # Addon Name: Estuary # Addon id: skin.estuary -# Addon Provider: phil65, Piers +# Addon Provider: phil65, Ichabod Fletchman msgid "" msgstr "" "Project-Id-Version: KODI Main\n" -"Report-Msgid-Bugs-To: http://trac.kodi.tv/\n" +"Report-Msgid-Bugs-To: https://github.com/xbmc/xbmc/issues/\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" @@ -15,7 +15,3 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Language: te_IN\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgctxt "#31001" -msgid "Search" -msgstr "శోధించు" diff --git a/addons/skin.estuary/language/resource.language.tr_tr/strings.po b/addons/skin.estuary/language/resource.language.tr_tr/strings.po index fab7aa00bd..e3749e5b23 100644 --- a/addons/skin.estuary/language/resource.language.tr_tr/strings.po +++ b/addons/skin.estuary/language/resource.language.tr_tr/strings.po @@ -14,7 +14,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: tr_TR\n" -"Plural-Forms: nplurals=1; plural=0;\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" msgctxt "#31000" msgid "Now playing" @@ -124,6 +124,10 @@ msgctxt "#31026" msgid "Timeshift" msgstr "Zaman Kaydırma" +msgctxt "#31027" +msgid "Next aired" +msgstr "Sonraki gösterim" + msgctxt "#31028" msgid "Show fanart" msgstr "Fanartı göster" @@ -224,6 +228,14 @@ msgctxt "#31058" msgid "Automatic Login on startup" msgstr "Başlangıçta otomatik olarak oturum aç" +msgctxt "#31059" +msgid "Select + X" +msgstr "Select + X" + +msgctxt "#31060" +msgid "Select + Start" +msgstr "Select + Start" + msgctxt "#31061" msgid "Main menu items" msgstr "Ana menü öğeleri" @@ -492,6 +504,14 @@ msgctxt "#31145" msgid "Search add-ons" msgstr "Eklentilerde ara" +msgctxt "#31146" +msgid "In cinemas" +msgstr "Sinemalarda" + +msgctxt "#31147" +msgid "In cinemas soon" +msgstr "Yakında sinemalarda" + msgctxt "#31148" msgid "Categories" msgstr "Kategoriler" diff --git a/addons/skin.estuary/language/resource.language.uk_ua/strings.po b/addons/skin.estuary/language/resource.language.uk_ua/strings.po index 08d62edf67..1c39afd402 100644 --- a/addons/skin.estuary/language/resource.language.uk_ua/strings.po +++ b/addons/skin.estuary/language/resource.language.uk_ua/strings.po @@ -14,7 +14,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: uk_UA\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != 11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || (n % 100 >=11 && n % 100 <=14 )) ? 2: 3);\n" msgctxt "#31000" msgid "Now playing" diff --git a/addons/skin.estuary/language/resource.language.zh_cn/strings.po b/addons/skin.estuary/language/resource.language.zh_cn/strings.po index 6ceeb8c8fc..eea01bf89e 100644 --- a/addons/skin.estuary/language/resource.language.zh_cn/strings.po +++ b/addons/skin.estuary/language/resource.language.zh_cn/strings.po @@ -124,6 +124,10 @@ msgctxt "#31026" msgid "Timeshift" msgstr "时光平移" +msgctxt "#31027" +msgid "Next aired" +msgstr "下次播出" + msgctxt "#31028" msgid "Show fanart" msgstr "显示同人画" @@ -224,6 +228,14 @@ msgctxt "#31058" msgid "Automatic Login on startup" msgstr "启动时自动登录" +msgctxt "#31059" +msgid "Select + X" +msgstr "Select + X" + +msgctxt "#31060" +msgid "Select + Start" +msgstr "Select + Start" + msgctxt "#31061" msgid "Main menu items" msgstr "主菜单项" @@ -492,6 +504,14 @@ msgctxt "#31145" msgid "Search add-ons" msgstr "搜索插件" +msgctxt "#31146" +msgid "In cinemas" +msgstr "在电影院里" + +msgctxt "#31147" +msgid "In cinemas soon" +msgstr "即将上映" + msgctxt "#31148" msgid "Categories" msgstr "类别" diff --git a/addons/skin.estuary/language/resource.language.zh_tw/strings.po b/addons/skin.estuary/language/resource.language.zh_tw/strings.po index 23bba95b52..b1307a8b82 100644 --- a/addons/skin.estuary/language/resource.language.zh_tw/strings.po +++ b/addons/skin.estuary/language/resource.language.zh_tw/strings.po @@ -124,6 +124,10 @@ msgctxt "#31026" msgid "Timeshift" msgstr "時間平移" +msgctxt "#31027" +msgid "Next aired" +msgstr "下期上檔" + msgctxt "#31028" msgid "Show fanart" msgstr "顯示劇照" @@ -224,6 +228,14 @@ msgctxt "#31058" msgid "Automatic Login on startup" msgstr "啟動時自動登入" +msgctxt "#31059" +msgid "Select + X" +msgstr "選擇 + X" + +msgctxt "#31060" +msgid "Select + Start" +msgstr "選擇 + 開始" + msgctxt "#31061" msgid "Main menu items" msgstr "主選單項目" @@ -492,6 +504,14 @@ msgctxt "#31145" msgid "Search add-ons" msgstr "搜尋附加元件" +msgctxt "#31146" +msgid "In cinemas" +msgstr "上映中" + +msgctxt "#31147" +msgid "In cinemas soon" +msgstr "即將上映" + msgctxt "#31148" msgid "Categories" msgstr "分類" diff --git a/cmake/modules/FindCCache.cmake b/cmake/modules/FindCCache.cmake index a18d4e03e0..0f6463b709 100644 --- a/cmake/modules/FindCCache.cmake +++ b/cmake/modules/FindCCache.cmake @@ -16,8 +16,8 @@ if(CCACHE_FOUND) set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE "${CCACHE_PROGRAM}") set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK "${CCACHE_PROGRAM}") - file(WRITE "${CMAKE_BINARY_DIR}/launch-c" "exec \"${CCACHE_PROGRAM}\" \"${CMAKE_C_COMPILER}\" \"$@\"\n") - file(WRITE "${CMAKE_BINARY_DIR}/launch-cxx" "exec \"${CCACHE_PROGRAM}\" \"${CMAKE_CXX_COMPILER}\" \"$@\"\n") + file(WRITE "${CMAKE_BINARY_DIR}/launch-c" "#!/bin/sh\nexec \"${CCACHE_PROGRAM}\" \"${CMAKE_C_COMPILER}\" \"$@\"\n") + file(WRITE "${CMAKE_BINARY_DIR}/launch-cxx" "#!/bin/sh\nexec \"${CCACHE_PROGRAM}\" \"${CMAKE_CXX_COMPILER}\" \"$@\"\n") execute_process(COMMAND chmod +x "${CMAKE_BINARY_DIR}/launch-c" "${CMAKE_BINARY_DIR}/launch-cxx") set(CMAKE_XCODE_ATTRIBUTE_CC "${CMAKE_BINARY_DIR}/launch-c" PARENT_SCOPE) diff --git a/cmake/scripts/osx/ArchSetup.cmake b/cmake/scripts/osx/ArchSetup.cmake index 7d8f58bc43..f723aa24c4 100644 --- a/cmake/scripts/osx/ArchSetup.cmake +++ b/cmake/scripts/osx/ArchSetup.cmake @@ -23,6 +23,8 @@ else() endif() endif() +set(CMAKE_OSX_ARCHITECTURES ${CPU}) + # Additional SYSTEM_DEFINES list(APPEND SYSTEM_DEFINES -DHAS_POSIX_NETWORK -DHAS_OSX_NETWORK -DHAS_SDL -DHAS_ZEROCONF) diff --git a/media/splash.jpg b/media/splash.jpg Binary files differindex 10b1111e17..fd3c3afd71 100644 --- a/media/splash.jpg +++ b/media/splash.jpg diff --git a/system/settings/freebsd.xml b/system/settings/freebsd.xml index a500ce9fe2..fde0ce778e 100644..120000 --- a/system/settings/freebsd.xml +++ b/system/settings/freebsd.xml @@ -1,164 +1 @@ -<?xml version="1.0" encoding="utf-8" ?> -<settings version="1"> - <section id="player"> - <category id="videoplayer"> - <group id="3"> - <setting id="videoplayer.usevdpau" type="boolean" label="13425" help="36155"> - <requirement>HAVE_LIBVDPAU</requirement> - <visible>false</visible> - <level>2</level> - <default>true</default> - <control type="toggle" /> - </setting> - <setting id="videoplayer.usevdpaumixer" type="boolean" label="13437" help="36421"> - <requirement>HAVE_LIBVDPAU</requirement> - <visible>false</visible> - <level>2</level> - <default>true</default> - <dependencies> - <dependency type="enable"> - <condition setting="videoplayer.usevdpau" operator="is">true</condition> <!-- USE VDPAU --> - </dependency> - </dependencies> - <control type="toggle" /> - </setting> - <setting id="videoplayer.usevdpaumpeg2" type="boolean" parent="videoplayer.usevdpau" label="13441" help="13442"> - <requirement>HAVE_LIBVDPAU</requirement> - <visible>false</visible> - <level>3</level> - <default>true</default> - <dependencies> - <dependency type="enable"> - <condition setting="videoplayer.usevdpau" operator="is">true</condition> <!-- USE VDPAU --> - </dependency> - </dependencies> - <control type="toggle" /> - </setting> - <setting id="videoplayer.usevdpaumpeg4" type="boolean" parent="videoplayer.usevdpau" label="13443" help="13444"> - <requirement>HAVE_LIBVDPAU</requirement> - <visible>false</visible> - <level>3</level> - <default>false</default> - <dependencies> - <dependency type="enable"> - <condition setting="videoplayer.usevdpau" operator="is">true</condition> <!-- USE VDPAU --> - </dependency> - </dependencies> - <control type="toggle" /> - </setting> - <setting id="videoplayer.usevdpauvc1" type="boolean" parent="videoplayer.usevdpau" label="13445" help="13446"> - <requirement>HAVE_LIBVDPAU</requirement> - <visible>false</visible> - <level>3</level> - <default>true</default> - <dependencies> - <dependency type="enable"> - <condition setting="videoplayer.usevdpau" operator="is">true</condition> <!-- USE VDPAU --> - </dependency> - </dependencies> - <control type="toggle" /> - </setting> - <setting id="videoplayer.usevaapi" type="boolean" label="13426" help="36156"> - <requirement>HAVE_LIBVA</requirement> - <visible>false</visible> - <level>2</level> - <default>true</default> - <control type="toggle" /> - </setting> - <setting id="videoplayer.usevaapimpeg2" type="boolean" parent="videoplayer.usevaapi" label="13447" help="13448"> - <requirement>HAVE_LIBVA</requirement> - <visible>false</visible> - <dependencies> - <dependency type="enable"> - <condition setting="videoplayer.usevaapi" operator="is">true</condition> - </dependency> - </dependencies> - <level>3</level> - <default>true</default> - <control type="toggle" /> - </setting> - <setting id="videoplayer.usevaapimpeg4" type="boolean" parent="videoplayer.usevaapi" label="13449" help="13450"> - <requirement>HAVE_LIBVA</requirement> - <visible>false</visible> - <dependencies> - <dependency type="enable"> - <condition setting="videoplayer.usevaapi" operator="is">true</condition> - </dependency> - </dependencies> - <level>3</level> - <default>true</default> - <control type="toggle" /> - </setting> - <setting id="videoplayer.usevaapivc1" type="boolean" parent="videoplayer.usevaapi" label="13451" help="13452"> - <requirement>HAVE_LIBVA</requirement> - <visible>false</visible> - <dependencies> - <dependency type="enable"> - <condition setting="videoplayer.usevaapi" operator="is">true</condition> - </dependency> - </dependencies> - <level>3</level> - <default>true</default> - <control type="toggle" /> - </setting> - <setting id="videoplayer.usevaapivp8" type="boolean" parent="videoplayer.usevaapi" label="13453" help="13454"> - <requirement>HAVE_LIBVA</requirement> - <visible>false</visible> - <dependencies> - <dependency type="enable"> - <condition setting="videoplayer.usevaapi" operator="is">true</condition> - </dependency> - </dependencies> - <level>3</level> - <default>true</default> - <control type="toggle" /> - </setting> - <setting id="videoplayer.usevaapivp9" type="boolean" parent="videoplayer.usevaapi" label="13455" help="13456"> - <requirement>HAVE_LIBVA</requirement> - <visible>false</visible> - <dependencies> - <dependency type="enable"> - <condition setting="videoplayer.usevaapi" operator="is">true</condition> - </dependency> - </dependencies> - <level>3</level> - <default>true</default> - <control type="toggle" /> - </setting> - <setting id="videoplayer.usevaapihevc" type="boolean" parent="videoplayer.usevaapi" label="13460" help="13461"> - <requirement>HAVE_LIBVA</requirement> - <visible>false</visible> - <dependencies> - <dependency type="enable"> - <condition setting="videoplayer.usevaapi" operator="is">true</condition> - </dependency> - </dependencies> - <level>3</level> - <default>true</default> - <control type="toggle" /> - </setting> - <setting id="videoplayer.prefervaapirender" type="boolean" parent="videoplayer.usevaapi" label="13457" help="36433"> - <requirement>HAVE_LIBVA</requirement> - <visible>false</visible> - <dependencies> - <dependency type="enable"> - <condition setting="videoplayer.usevaapi" operator="is">true</condition> - </dependency> - </dependencies> - <level>3</level> - <default>true</default> - <control type="toggle" /> - </setting> - </group> - </category> - </section> - <section id="system"> - <category id="display"> - <group id="1"> - <setting id="videoscreen.fakefullscreen"> - <visible>false</visible> - </setting> - </group> - </category> - </section> -</settings> +linux.xml
\ No newline at end of file diff --git a/system/settings/settings.xml b/system/settings/settings.xml index ad46926425..99579c15f6 100755 --- a/system/settings/settings.xml +++ b/system/settings/settings.xml @@ -991,7 +991,7 @@ </setting> <setting id="videolibrary.musicvideosallperformers" type="boolean" label="20472" help="36308"> <level>1</level> - <default>false</default> + <default>true</default> <control type="toggle" /> </setting> </group> diff --git a/system/shaders/output_d3d.fx b/system/shaders/output_d3d.fx index 9e4f250850..a3f73412f8 100644 --- a/system/shaders/output_d3d.fx +++ b/system/shaders/output_d3d.fx @@ -156,8 +156,8 @@ float4 output4(float4 color, float2 uv) #if defined(KODI_DITHER) half2 ditherpos = uv * m_ditherParams.xy; // scale ditherval to [0,1) - float ditherval = m_ditherMatrix.Sample(DitherSampler, ditherpos).r * 16.0; - color = floor(color * m_ditherParams.z + ditherval) / m_ditherParams.z; + float ditherval = m_ditherMatrix.Sample(DitherSampler, ditherpos).r * 16.0f; + color.rgb = floor(color.rgb * m_ditherParams.z + ditherval) / m_ditherParams.z; #endif return color; } @@ -189,7 +189,7 @@ technique11 OUTPUT_T pass P0 { SetVertexShader( VS_SHADER ); - SetPixelShader( CompileShader( ps_4_0_level_9_1, OUTPUT_PS() ) ); + SetPixelShader( CompileShader( ps_4_0_level_9_3, OUTPUT_PS() ) ); } }; #endif
\ No newline at end of file diff --git a/tools/android/packaging/xbmc/AndroidManifest.xml.in b/tools/android/packaging/xbmc/AndroidManifest.xml.in index 2f5bf76023..882e0ae332 100644 --- a/tools/android/packaging/xbmc/AndroidManifest.xml.in +++ b/tools/android/packaging/xbmc/AndroidManifest.xml.in @@ -7,7 +7,7 @@ <uses-sdk android:minSdkVersion="21" - android:targetSdkVersion="26" /> + android:targetSdkVersion="29" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.INTERNET" /> @@ -48,7 +48,8 @@ android:hasCode="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" - android:logo="@drawable/banner"> + android:logo="@drawable/banner" + android:requestLegacyExternalStorage="true"> <activity android:name=".Splash" android:configChanges="orientation|keyboard|keyboardHidden|navigation|touchscreen|screenLayout|screenSize|colorMode" diff --git a/tools/android/packaging/xbmc/build.gradle.in b/tools/android/packaging/xbmc/build.gradle.in index 6b64c424b0..3554caf159 100644 --- a/tools/android/packaging/xbmc/build.gradle.in +++ b/tools/android/packaging/xbmc/build.gradle.in @@ -1,12 +1,12 @@ apply plugin: 'com.android.application' android { - compileSdkVersion 28 - buildToolsVersion "28.0.3" + compileSdkVersion 29 + buildToolsVersion "29.0.3" defaultConfig { applicationId "@APP_PACKAGE@" minSdkVersion 21 - targetSdkVersion 28 + targetSdkVersion 29 versionCode @APP_VERSION_CODE_ANDROID@ versionName "@APP_VERSION@" } diff --git a/tools/depends/bootstrap b/tools/depends/bootstrap index d9e14e783f..9f03bce44f 100755 --- a/tools/depends/bootstrap +++ b/tools/depends/bootstrap @@ -3,7 +3,7 @@ # Some platforms may not have m4/autoconf. If not, build temporary copies in # order to bootstrap. DEPENDS=`dirname $0` -export PATH=$DEPENDS/pre-build-deps/bin:$PATH +export PATH="$DEPENDS/pre-build-deps/bin:$PATH" which m4 >/dev/null 2>/dev/null || make -C $DEPENDS/pre-depends/m4-pre-depends which autoconf >/dev/null 2>/dev/null || make -C $DEPENDS/pre-depends/autoconf-pre-depends which autoconf >/dev/null 2>/dev/null || \ diff --git a/tools/depends/native/cmake/Makefile b/tools/depends/native/cmake/Makefile index 426ebe0628..08607fed34 100644 --- a/tools/depends/native/cmake/Makefile +++ b/tools/depends/native/cmake/Makefile @@ -3,7 +3,7 @@ PLATFORM=$(NATIVEPLATFORM) DEPS= ../../Makefile.include Makefile APPNAME=cmake -VERSION=3.14.5 +VERSION=3.18.4 SOURCE=$(APPNAME)-$(VERSION) ARCHIVE=$(SOURCE).tar.gz diff --git a/tools/depends/target/python3/darwin_embedded.patch b/tools/depends/target/python3/darwin_embedded.patch index 65c2ce70f8..6f77fcf2fa 100644 --- a/tools/depends/target/python3/darwin_embedded.patch +++ b/tools/depends/target/python3/darwin_embedded.patch @@ -30,6 +30,15 @@ --- a/Lib/subprocess.py +++ b/Lib/subprocess.py +@@ -737,6 +737,8 @@ + restore_signals=True, start_new_session=False, + pass_fds=(), *, encoding=None, errors=None, text=None): + """Create new Popen instance.""" ++ raise RuntimeError("Subprocesses are not supported on this platform.") ++ + _cleanup() + # Held while anything is calling waitpid before returncode has been + # updated to prevent clobbering returncode if wait() or poll() are @@ -936,6 +936,7 @@ if not self._child_created: # We didn't get to successfully create a child process. @@ -62,6 +71,24 @@ if errpipe_data: try: +@@ -1721,7 +1724,7 @@ + raise SubprocessError("Unknown child exit status!") + + +- def _internal_poll(self, _deadstate=None, _waitpid=os.waitpid, ++ def _internal_poll(self, _deadstate=None, _waitpid=None, + _WNOHANG=os.WNOHANG, _ECHILD=errno.ECHILD): + """Check if child process has terminated. Returns returncode + attribute. +@@ -1730,6 +1733,8 @@ + outside of the local scope (nor can any methods it calls). + + """ ++ if _waitpid is None: ++ _waitpid = os.waitpid + if self.returncode is None: + if not self._waitpid_lock.acquire(False): + # Something else is busy calling waitpid. Don't allow two --- a/Lib/urllib/request.py +++ b/Lib/urllib/request.py @@ -2616,11 +2616,9 @@ diff --git a/version.txt b/version.txt index bb4fe47ecf..bc76b7c8cf 100644 --- a/version.txt +++ b/version.txt @@ -4,9 +4,9 @@ COPYRIGHT_YEARS 2005-2020 WEBSITE http://kodi.tv VERSION_MAJOR 19 VERSION_MINOR 0 -VERSION_TAG ALPHA3 -VERSION_CODE 18.9.730 -ADDON_API 18.9.730 +VERSION_TAG BETA1 +VERSION_CODE 18.9.801 +ADDON_API 18.9.801 ADDON_REPOS repository.xbmc.org|https://mirrors.kodi.tv APP_PACKAGE org.xbmc.kodi PACKAGE_IDENTITY XBMCFoundation.Kodi diff --git a/xbmc/Application.cpp b/xbmc/Application.cpp index 35de935a74..ef73d7f38d 100644 --- a/xbmc/Application.cpp +++ b/xbmc/Application.cpp @@ -1068,13 +1068,19 @@ void CApplication::OnSettingAction(const std::shared_ptr<const CSetting>& settin else if (settingId == CSettings::SETTING_SCREENSAVER_SETTINGS) { AddonPtr addon; - if (CServiceBroker::GetAddonMgr().GetAddon(CServiceBroker::GetSettingsComponent()->GetSettings()->GetString(CSettings::SETTING_SCREENSAVER_MODE), addon, ADDON_SCREENSAVER)) + if (CServiceBroker::GetAddonMgr().GetAddon( + CServiceBroker::GetSettingsComponent()->GetSettings()->GetString( + CSettings::SETTING_SCREENSAVER_MODE), + addon, ADDON_SCREENSAVER, OnlyEnabled::YES)) CGUIDialogAddonSettings::ShowForAddon(addon); } else if (settingId == CSettings::SETTING_AUDIOCDS_SETTINGS) { AddonPtr addon; - if (CServiceBroker::GetAddonMgr().GetAddon(CServiceBroker::GetSettingsComponent()->GetSettings()->GetString(CSettings::SETTING_AUDIOCDS_ENCODER), addon, ADDON_AUDIOENCODER)) + if (CServiceBroker::GetAddonMgr().GetAddon( + CServiceBroker::GetSettingsComponent()->GetSettings()->GetString( + CSettings::SETTING_AUDIOCDS_ENCODER), + addon, ADDON_AUDIOENCODER, OnlyEnabled::YES)) CGUIDialogAddonSettings::ShowForAddon(addon); } else if (settingId == CSettings::SETTING_VIDEOSCREEN_GUICALIBRATION) @@ -1206,7 +1212,7 @@ bool CApplication::LoadSkin(const std::string& skinID) SkinPtr skin; { AddonPtr addon; - if (!CServiceBroker::GetAddonMgr().GetAddon(skinID, addon, ADDON_SKIN)) + if (!CServiceBroker::GetAddonMgr().GetAddon(skinID, addon, ADDON_SKIN, OnlyEnabled::YES)) return false; skin = std::static_pointer_cast<ADDON::CSkinInfo>(addon); } @@ -2772,7 +2778,8 @@ bool CApplication::PlayMedia(CFileItem& item, const std::string &player, int iPl if (path.GetProtocol() == "game") { AddonPtr addon; - if (CServiceBroker::GetAddonMgr().GetAddon(path.GetHostName(), addon, ADDON_GAMEDLL)) + if (CServiceBroker::GetAddonMgr().GetAddon(path.GetHostName(), addon, ADDON_GAMEDLL, + OnlyEnabled::YES)) { CFileItem addonItem(addon); return PlayFile(addonItem, player, false); @@ -2887,9 +2894,9 @@ bool CApplication::PlayFile(CFileItem item, const std::string& player, bool bRes CVideoDatabase dbs; dbs.Open(); - std::string path = item.GetDynPath(); + std::string path = item.GetPath(); std::string videoInfoTagPath(item.GetVideoInfoTag()->m_strFileNameAndPath); - if (videoInfoTagPath.find("removable://") == 0) + if (videoInfoTagPath.find("removable://") == 0 || item.IsVideoDb()) path = videoInfoTagPath; dbs.LoadVideoInfo(path, *item.GetVideoInfoTag()); @@ -3735,7 +3742,8 @@ void CApplication::ActivateScreenSaver(bool forceType /*= false */) { return; } - else if (CServiceBroker::GetAddonMgr().GetAddon(m_screensaverIdInUse, m_pythonScreenSaver, ADDON_SCREENSAVER)) + else if (CServiceBroker::GetAddonMgr().GetAddon(m_screensaverIdInUse, m_pythonScreenSaver, + ADDON_SCREENSAVER, OnlyEnabled::YES)) { std::string libPath = m_pythonScreenSaver->LibPath(); if (CScriptInvocationManager::GetInstance().HasLanguageInvoker(libPath)) diff --git a/xbmc/ContextMenuItem.cpp b/xbmc/ContextMenuItem.cpp index 97d3865f22..1f4d614526 100644 --- a/xbmc/ContextMenuItem.cpp +++ b/xbmc/ContextMenuItem.cpp @@ -47,7 +47,8 @@ bool CContextMenuItem::Execute(const CFileItemPtr& item) const return false; ADDON::AddonPtr addon; - if (!CServiceBroker::GetAddonMgr().GetAddon(m_addonId, addon)) + if (!CServiceBroker::GetAddonMgr().GetAddon(m_addonId, addon, ADDON::ADDON_UNKNOWN, + ADDON::OnlyEnabled::YES)) return false; bool reuseLanguageInvoker = false; diff --git a/xbmc/ContextMenuManager.cpp b/xbmc/ContextMenuManager.cpp index 871da53d39..e8693d521a 100644 --- a/xbmc/ContextMenuManager.cpp +++ b/xbmc/ContextMenuManager.cpp @@ -121,7 +121,7 @@ void CContextMenuManager::OnEvent(const ADDON::AddonEvent& event) else if (typeid(event) == typeid(AddonEvents::Enabled)) { AddonPtr addon; - if (m_addonMgr.GetAddon(event.id, addon, ADDON_CONTEXT_ITEM)) + if (m_addonMgr.GetAddon(event.id, addon, ADDON_CONTEXT_ITEM, OnlyEnabled::YES)) { CSingleLock lock(m_criticalSection); auto items = std::static_pointer_cast<CContextMenuAddon>(addon)->GetItems(); diff --git a/xbmc/LangInfo.cpp b/xbmc/LangInfo.cpp index b5e507fd78..d8b3dc643e 100644 --- a/xbmc/LangInfo.cpp +++ b/xbmc/LangInfo.cpp @@ -641,7 +641,9 @@ LanguageResourcePtr CLangInfo::GetLanguageAddon(const std::string& locale /* = " addonId = CServiceBroker::GetSettingsComponent()->GetSettings()->GetString(CSettings::SETTING_LOCALE_LANGUAGE); ADDON::AddonPtr addon; - if (CServiceBroker::GetAddonMgr().GetAddon(addonId, addon, ADDON::ADDON_RESOURCE_LANGUAGE, true) && addon != NULL) + if (CServiceBroker::GetAddonMgr().GetAddon(addonId, addon, ADDON::ADDON_RESOURCE_LANGUAGE, + ADDON::OnlyEnabled::YES) && + addon != NULL) return std::dynamic_pointer_cast<ADDON::CLanguageResource>(addon); return NULL; @@ -665,7 +667,7 @@ bool CLangInfo::SetLanguage(std::string language /* = "" */, bool reloadServices ADDON::AddonPtr addon; // Find the chosen language add-on if it's enabled - if (!addonMgr.GetAddon(language, addon, ADDON::ADDON_RESOURCE_LANGUAGE, true)) + if (!addonMgr.GetAddon(language, addon, ADDON::ADDON_RESOURCE_LANGUAGE, ADDON::OnlyEnabled::YES)) { if (!addonMgr.IsAddonInstalled(language) || (addonMgr.IsAddonDisabled(language) && !addonMgr.EnableAddon(language))) @@ -678,7 +680,8 @@ bool CLangInfo::SetLanguage(std::string language /* = "" */, bool reloadServices CSettings::SETTING_LOCALE_LANGUAGE)) ->GetDefault(); - if (!addonMgr.GetAddon(language, addon, ADDON::ADDON_RESOURCE_LANGUAGE, false)) + if (!addonMgr.GetAddon(language, addon, ADDON::ADDON_RESOURCE_LANGUAGE, + ADDON::OnlyEnabled::NO)) { CLog::Log(LOGFATAL, "CLangInfo::{}: could not find default language add-on '{}'", __func__, language); diff --git a/xbmc/addons/AddonInstaller.cpp b/xbmc/addons/AddonInstaller.cpp index 6db0160e6a..87fbdff7c7 100644 --- a/xbmc/addons/AddonInstaller.cpp +++ b/xbmc/addons/AddonInstaller.cpp @@ -160,7 +160,7 @@ bool CAddonInstaller::InstallModal(const std::string& addonID, return false; // we assume that addons that are enabled don't get to this routine (i.e. that GetAddon() has been called) - if (CServiceBroker::GetAddonMgr().GetAddon(addonID, addon, ADDON_UNKNOWN, false)) + if (CServiceBroker::GetAddonMgr().GetAddon(addonID, addon, ADDON_UNKNOWN, OnlyEnabled::NO)) return false; // addon is installed but disabled, and the user has specifically activated something that needs // the addon - should we enable it? @@ -183,7 +183,7 @@ bool CAddonInstaller::InstallModal(const std::string& addonID, if (!InstallOrUpdate(addonID, BackgroundJob::NO, ModalJob::YES)) return false; - return CServiceBroker::GetAddonMgr().GetAddon(addonID, addon); + return CServiceBroker::GetAddonMgr().GetAddon(addonID, addon, ADDON_UNKNOWN, OnlyEnabled::YES); } @@ -221,7 +221,7 @@ bool CAddonInstaller::Install(const std::string& addonId, return false; AddonPtr repo; - if (!CServiceBroker::GetAddonMgr().GetAddon(repoId, repo, ADDON_REPOSITORY)) + if (!CServiceBroker::GetAddonMgr().GetAddon(repoId, repo, ADDON_REPOSITORY, OnlyEnabled::YES)) return false; return DoInstall(addon, std::static_pointer_cast<CRepository>(repo), BackgroundJob::YES, @@ -343,7 +343,7 @@ bool CAddonInstaller::CheckDependencies(const AddonPtr &addon, bool optional = it.optional; AddonPtr dep; bool haveInstalledAddon = - CServiceBroker::GetAddonMgr().GetAddon(addonID, dep, ADDON_UNKNOWN, false); + CServiceBroker::GetAddonMgr().GetAddon(addonID, dep, ADDON_UNKNOWN, OnlyEnabled::NO); if ((haveInstalledAddon && !dep->MeetsVersion(versionMin, version)) || (!haveInstalledAddon && !optional)) { @@ -495,7 +495,8 @@ CAddonInstallJob::CAddonInstallJob(const AddonPtr& addon, : m_addon(addon), m_repo(repo), m_isAutoUpdate(isAutoUpdate) { AddonPtr dummy; - m_isUpdate = CServiceBroker::GetAddonMgr().GetAddon(addon->ID(), dummy, ADDON_UNKNOWN, false); + m_isUpdate = + CServiceBroker::GetAddonMgr().GetAddon(addon->ID(), dummy, ADDON_UNKNOWN, OnlyEnabled::NO); } bool CAddonInstallJob::GetAddon(const std::string& addonID, RepositoryPtr& repo, @@ -505,7 +506,8 @@ bool CAddonInstallJob::GetAddon(const std::string& addonID, RepositoryPtr& repo, return false; AddonPtr tmp; - if (!CServiceBroker::GetAddonMgr().GetAddon(addon->Origin(), tmp, ADDON_REPOSITORY)) + if (!CServiceBroker::GetAddonMgr().GetAddon(addon->Origin(), tmp, ADDON_REPOSITORY, + OnlyEnabled::YES)) return false; repo = std::static_pointer_cast<CRepository>(tmp); @@ -661,7 +663,8 @@ bool CAddonInstallJob::DoWork() // Load new installed and if successed replace defined m_addon here with new one if (!CServiceBroker::GetAddonMgr().LoadAddon(m_addon->ID(), m_addon->Origin(), m_addon->Version()) || - !CServiceBroker::GetAddonMgr().GetAddon(m_addon->ID(), m_addon)) + !CServiceBroker::GetAddonMgr().GetAddon(m_addon->ID(), m_addon, ADDON_UNKNOWN, + OnlyEnabled::YES)) { CLog::Log(LOGERROR, "CAddonInstallJob[%s]: failed to reload addon", m_addon->ID().c_str()); return false; @@ -885,7 +888,8 @@ bool CAddonInstallJob::Install(const std::string &installFrom, const RepositoryP const AddonVersion& version = it->version; bool optional = it->optional; AddonPtr dependency; - bool haveInstalledAddon = addonMgr.GetAddon(addonID, dependency, ADDON_UNKNOWN, false); + bool haveInstalledAddon = + addonMgr.GetAddon(addonID, dependency, ADDON_UNKNOWN, OnlyEnabled::NO); if ((haveInstalledAddon && !dependency->MeetsVersion(versionMin, version)) || (!haveInstalledAddon && !optional)) { @@ -992,7 +996,7 @@ void CAddonInstallJob::ReportInstallError(const std::string& addonID, const std: if (addon != NULL) { AddonPtr addon2; - CServiceBroker::GetAddonMgr().GetAddon(addonID, addon2); + CServiceBroker::GetAddonMgr().GetAddon(addonID, addon2, ADDON_UNKNOWN, OnlyEnabled::YES); if (msg.empty()) msg = g_localizeStrings.Get(addon2 != NULL ? 113 : 114); diff --git a/xbmc/addons/AddonManager.cpp b/xbmc/addons/AddonManager.cpp index 7606c6f95e..0e4098e7d2 100644 --- a/xbmc/addons/AddonManager.cpp +++ b/xbmc/addons/AddonManager.cpp @@ -123,7 +123,7 @@ bool CAddonMgr::Init() for (const auto& id : m_systemAddons) { AddonPtr addon; - if (!GetAddon(id, addon, ADDON_UNKNOWN)) + if (!GetAddon(id, addon, ADDON_UNKNOWN, OnlyEnabled::YES)) { CLog::Log(LOGFATAL, "addon '%s' not installed or not enabled.", id.c_str()); return false; @@ -381,7 +381,7 @@ bool CAddonMgr::FindInstallableById(const std::string& addonId, AddonPtr& result // check for an update if addon is installed already - if (GetAddon(addonId, addonToUpdate, ADDON_UNKNOWN, false)) + if (GetAddon(addonId, addonToUpdate, ADDON_UNKNOWN, OnlyEnabled::NO)) { if (addonRepos.DoAddonUpdateCheck(addonToUpdate, result)) return true; @@ -400,7 +400,7 @@ bool CAddonMgr::FindInstallableById(const std::string& addonId, AddonPtr& result bool CAddonMgr::GetAddonsInternal(const TYPE& type, VECADDONS& addons, - bool enabledOnly, + bool onlyEnabled, bool checkIncompatible) const { CSingleLock lock(m_critSection); @@ -410,7 +410,7 @@ bool CAddonMgr::GetAddonsInternal(const TYPE& type, if (type != ADDON_UNKNOWN && !addonInfo.second->HasType(type)) continue; - if (enabledOnly && + if (onlyEnabled && ((!checkIncompatible && IsAddonDisabled(addonInfo.second->ID())) || (checkIncompatible && IsAddonDisabledExcept(addonInfo.second->ID(), AddonDisabledReason::INCOMPATIBLE)))) @@ -567,8 +567,8 @@ void CAddonMgr::InstallAddonUpdates(VECADDONS& updates, bool CAddonMgr::GetAddon(const std::string& str, AddonPtr& addon, - const TYPE& type /*=ADDON_UNKNOWN*/, - bool enabledOnly /*= true*/) const + const TYPE& type, + OnlyEnabled onlyEnabled) const { CSingleLock lock(m_critSection); @@ -578,7 +578,7 @@ bool CAddonMgr::GetAddon(const std::string& str, addon = CAddonBuilder::Generate(addonInfo, type); if (addon) { - if (enabledOnly && IsAddonDisabled(addonInfo->ID())) + if (onlyEnabled == OnlyEnabled::YES && IsAddonDisabled(addonInfo->ID())) return false; // if the addon has a running instance, grab that @@ -595,7 +595,7 @@ bool CAddonMgr::GetAddon(const std::string& str, bool CAddonMgr::HasType(const std::string &id, const TYPE &type) { AddonPtr addon; - return GetAddon(id, addon, type, false); + return GetAddon(id, addon, type, OnlyEnabled::NO); } bool CAddonMgr::FindAddon(const std::string& addonId, @@ -674,7 +674,7 @@ bool CAddonMgr::UnloadAddon(const std::string& addonId) AddonPtr localAddon; // can't unload an binary addon that is in use - if (GetAddon(addonId, localAddon, ADDON_UNKNOWN, false) && localAddon->IsBinary() && + if (GetAddon(addonId, localAddon, ADDON_UNKNOWN, OnlyEnabled::NO) && localAddon->IsBinary() && localAddon->IsInUse()) { CLog::Log(LOGERROR, "CAddonMgr::{}: could not unload binary add-on {}, as is in use", __func__, @@ -698,7 +698,7 @@ bool CAddonMgr::LoadAddon(const std::string& addonId, CSingleLock lock(m_critSection); AddonPtr addon; - if (GetAddon(addonId, addon, ADDON_UNKNOWN, false)) + if (GetAddon(addonId, addon, ADDON_UNKNOWN, OnlyEnabled::NO)) { return true; } @@ -709,7 +709,7 @@ bool CAddonMgr::LoadAddon(const std::string& addonId, return false; } - if (!GetAddon(addonId, addon, ADDON_UNKNOWN, false)) + if (!GetAddon(addonId, addon, ADDON_UNKNOWN, OnlyEnabled::NO)) { CLog::Log(LOGERROR, "CAddonMgr: could not load add-on %s. No add-on with that ID is installed.", addonId.c_str()); return false; @@ -760,7 +760,7 @@ static void ResolveDependencies(const std::string& addonId, std::vector<std::str return; AddonPtr addon; - if (!CServiceBroker::GetAddonMgr().GetAddon(addonId, addon, ADDON_UNKNOWN, false)) + if (!CServiceBroker::GetAddonMgr().GetAddon(addonId, addon, ADDON_UNKNOWN, OnlyEnabled::NO)) missing.push_back(addonId); else { @@ -786,7 +786,7 @@ bool CAddonMgr::DisableAddon(const std::string& id, AddonDisabledReason disabled //success CLog::Log(LOGDEBUG, "CAddonMgr: %s disabled", id.c_str()); AddonPtr addon; - if (GetAddon(id, addon, ADDON_UNKNOWN, false) && addon != NULL) + if (GetAddon(id, addon, ADDON_UNKNOWN, OnlyEnabled::NO) && addon != NULL) { CServiceBroker::GetEventLog().Add(EventPtr(new CAddonManagementEvent(addon, 24141))); } @@ -803,7 +803,7 @@ bool CAddonMgr::EnableSingle(const std::string& id) return true; //already enabled AddonPtr addon; - if (!GetAddon(id, addon, ADDON_UNKNOWN, false) || addon == nullptr) + if (!GetAddon(id, addon, ADDON_UNKNOWN, OnlyEnabled::NO) || addon == nullptr) return false; if (!IsCompatible(*addon)) @@ -870,7 +870,7 @@ bool CAddonMgr::CanAddonBeDisabled(const std::string& ID) AddonPtr localAddon; // can't disable an addon that isn't installed - if (!GetAddon(ID, localAddon, ADDON_UNKNOWN, false)) + if (!GetAddon(ID, localAddon, ADDON_UNKNOWN, OnlyEnabled::NO)) return false; // can't disable an addon that is in use @@ -888,14 +888,14 @@ bool CAddonMgr::CanAddonBeEnabled(const std::string& id) bool CAddonMgr::IsAddonInstalled(const std::string& ID) { AddonPtr tmp; - return GetAddon(ID, tmp, ADDON_UNKNOWN, false); + return GetAddon(ID, tmp, ADDON_UNKNOWN, OnlyEnabled::NO); } bool CAddonMgr::IsAddonInstalled(const std::string& ID, const std::string& origin) const { AddonPtr tmp; - if (GetAddon(ID, tmp, ADDON_UNKNOWN, false) && tmp) + if (GetAddon(ID, tmp, ADDON_UNKNOWN, OnlyEnabled::NO) && tmp) { if (tmp->Origin() == ORIGIN_SYSTEM) { @@ -915,7 +915,7 @@ bool CAddonMgr::IsAddonInstalled(const std::string& ID, { AddonPtr tmp; - if (GetAddon(ID, tmp, ADDON_UNKNOWN, false) && tmp) + if (GetAddon(ID, tmp, ADDON_UNKNOWN, OnlyEnabled::NO) && tmp) { if (tmp->Origin() == ORIGIN_SYSTEM) { @@ -1002,7 +1002,7 @@ bool CAddonMgr::IsCompatible(const IAddon& addon) const StringUtils::StartsWith(dependency.id, "kodi.")) { AddonPtr addon; - bool haveAddon = GetAddon(dependency.id, addon); + bool haveAddon = GetAddon(dependency.id, addon, ADDON_UNKNOWN, OnlyEnabled::YES); if (!haveAddon || !addon->MeetsVersion(dependency.versionMin, dependency.version)) return false; } @@ -1031,12 +1031,16 @@ bool CAddonMgr::IsCompatible(const AddonInfoPtr& addonInfo) const return true; } -std::vector<DependencyInfo> CAddonMgr::GetDepsRecursive(const std::string& id) +std::vector<DependencyInfo> CAddonMgr::GetDepsRecursive(const std::string& id, + OnlyEnabledRootAddon onlyEnabledRootAddon) { std::vector<DependencyInfo> added; AddonPtr root_addon; - if (!FindInstallableById(id, root_addon) && !GetAddon(id, root_addon)) + if (!FindInstallableById(id, root_addon) && + !GetAddon(id, root_addon, ADDON_UNKNOWN, static_cast<OnlyEnabled>(onlyEnabledRootAddon))) + { return added; + } std::vector<DependencyInfo> toProcess; for (const auto& dep : root_addon->GetDependencies()) @@ -1076,14 +1080,14 @@ std::vector<DependencyInfo> CAddonMgr::GetDepsRecursive(const std::string& id) return added; } -bool CAddonMgr::GetAddonInfos(AddonInfos& addonInfos, bool enabledOnly, TYPE type) const +bool CAddonMgr::GetAddonInfos(AddonInfos& addonInfos, bool onlyEnabled, TYPE type) const { CSingleLock lock(m_critSection); bool forUnknown = type == ADDON_UNKNOWN; for (auto& info : m_installedAddons) { - if (enabledOnly && m_disabled.find(info.first) != m_disabled.end()) + if (onlyEnabled && m_disabled.find(info.first) != m_disabled.end()) continue; if (info.second->MainType() != ADDON_UNKNOWN && (forUnknown || info.second->HasType(type))) diff --git a/xbmc/addons/AddonManager.h b/xbmc/addons/AddonManager.h index a7efdfac58..346ae3ef96 100644 --- a/xbmc/addons/AddonManager.h +++ b/xbmc/addons/AddonManager.h @@ -34,6 +34,18 @@ namespace ADDON AVAILABLE_UPDATES }; + enum class OnlyEnabled : bool + { + YES = true, + NO = false, + }; + + enum class OnlyEnabledRootAddon : bool + { + YES = true, + NO = false, + }; + struct CAddonWithUpdate; /** @@ -77,13 +89,13 @@ namespace ADDON \param id the id of the addon to retrieve. \param addon[out] the retrieved addon pointer - only use if the function returns true. \param type type of addon to retrieve - defaults to any type. - \param enabledOnly whether we only want enabled addons - set to false to allow both enabled and disabled addons - defaults to true. - \return true if an addon matching the id of the given type is available and is enabled (if enabledOnly is true). + \param onlyEnabled whether we only want enabled addons - set to false to allow both enabled and disabled addons - defaults to true. + \return true if an addon matching the id of the given type is available and is enabled (if onlyEnabled is true). */ bool GetAddon(const std::string& id, AddonPtr& addon, - const TYPE& type = ADDON_UNKNOWN, - bool enabledOnly = true) const; + const TYPE& type, + OnlyEnabled onlyEnabled) const; bool HasType(const std::string &id, const TYPE &type); @@ -359,15 +371,18 @@ namespace ADDON bool IsCompatible(const AddonInfoPtr& addonInfo) const; /*! \brief Recursively get dependencies for an add-on + * \param id the id of the root addon + * \param onlyEnabledRootAddon whether look for enabled root add-ons only */ - std::vector<DependencyInfo> GetDepsRecursive(const std::string& id); + std::vector<DependencyInfo> GetDepsRecursive(const std::string& id, + OnlyEnabledRootAddon onlyEnabledRootAddon); /*! * @brief Get a list of add-on's with info's for the on system available * ones. * * @param[out] addonInfos list where finded addon information becomes stored - * @param[in] enabledOnly If true are only enabled ones given back, + * @param[in] onlyEnabled If true are only enabled ones given back, * if false all on system available. Default is true. * @param[in] type The requested type, with "ADDON_UNKNOWN" are all add-on * types given back who match the case with value before. @@ -375,7 +390,7 @@ namespace ADDON * match them. Default is for all types. * @return true if the list contains entries */ - bool GetAddonInfos(AddonInfos& addonInfos, bool enabledOnly, TYPE type) const; + bool GetAddonInfos(AddonInfos& addonInfos, bool onlyEnabled, TYPE type) const; /*! * @brief Get a list of disabled add-on's with info's @@ -523,7 +538,7 @@ namespace ADDON bool GetAddonsInternal(const TYPE& type, VECADDONS& addons, - bool enabledOnly, + bool onlyEnabled, bool checkIncompatible = false) const; bool EnableSingle(const std::string& id); diff --git a/xbmc/addons/AddonRepos.cpp b/xbmc/addons/AddonRepos.cpp index f73613c6a2..462660908f 100644 --- a/xbmc/addons/AddonRepos.cpp +++ b/xbmc/addons/AddonRepos.cpp @@ -453,7 +453,7 @@ bool CAddonRepos::FindDependency(const std::string& dependsId, // we got the dependency, so now get a repository-pointer to return std::shared_ptr<IAddon> tmp; - if (!m_addonMgr.GetAddon(dependencyToInstall->Origin(), tmp, ADDON_REPOSITORY)) + if (!m_addonMgr.GetAddon(dependencyToInstall->Origin(), tmp, ADDON_REPOSITORY, OnlyEnabled::YES)) return false; repoForDep = std::static_pointer_cast<CRepository>(tmp); diff --git a/xbmc/addons/AddonStatusHandler.cpp b/xbmc/addons/AddonStatusHandler.cpp index 1184690a8f..8b8fc30b80 100644 --- a/xbmc/addons/AddonStatusHandler.cpp +++ b/xbmc/addons/AddonStatusHandler.cpp @@ -44,7 +44,7 @@ CAddonStatusHandler::CAddonStatusHandler(const std::string &addonID, ADDON_STATU { //! @todo The status handled CAddonStatusHandler by is related to the class, not the instance //! having CAddonMgr construct an instance makes no sense - if (!CServiceBroker::GetAddonMgr().GetAddon(addonID, m_addon)) + if (!CServiceBroker::GetAddonMgr().GetAddon(addonID, m_addon, ADDON_UNKNOWN, OnlyEnabled::YES)) return; CLog::Log(LOGINFO, "Called Add-on status handler for '%u' of clientName:%s, clientID:%s (same Thread=%s)", status, m_addon->Name().c_str(), m_addon->ID().c_str(), sameThread ? "yes" : "no"); diff --git a/xbmc/addons/AddonSystemSettings.cpp b/xbmc/addons/AddonSystemSettings.cpp index ca15b941ff..11159bcbfc 100644 --- a/xbmc/addons/AddonSystemSettings.cpp +++ b/xbmc/addons/AddonSystemSettings.cpp @@ -77,7 +77,7 @@ bool CAddonSystemSettings::GetActive(const TYPE& type, AddonPtr& addon) if (it != m_activeSettings.end()) { auto settingValue = CServiceBroker::GetSettingsComponent()->GetSettings()->GetString(it->second); - return CServiceBroker::GetAddonMgr().GetAddon(settingValue, addon, type); + return CServiceBroker::GetAddonMgr().GetAddon(settingValue, addon, type, OnlyEnabled::YES); } return false; } diff --git a/xbmc/addons/ContextMenus.cpp b/xbmc/addons/ContextMenus.cpp index 5e9d7475e7..1bcfefa336 100644 --- a/xbmc/addons/ContextMenus.cpp +++ b/xbmc/addons/ContextMenus.cpp @@ -23,16 +23,18 @@ using namespace ADDON; bool CAddonSettings::IsVisible(const CFileItem& item) const { AddonPtr addon; - return item.HasAddonInfo() - && CServiceBroker::GetAddonMgr().GetAddon(item.GetAddonInfo()->ID(), addon, ADDON_UNKNOWN, false) - && addon->HasSettings(); + return item.HasAddonInfo() && + CServiceBroker::GetAddonMgr().GetAddon(item.GetAddonInfo()->ID(), addon, ADDON_UNKNOWN, + OnlyEnabled::NO) && + addon->HasSettings(); } bool CAddonSettings::Execute(const CFileItemPtr& item) const { AddonPtr addon; - return CServiceBroker::GetAddonMgr().GetAddon(item->GetAddonInfo()->ID(), addon, ADDON_UNKNOWN, false) - && CGUIDialogAddonSettings::ShowForAddon(addon); + return CServiceBroker::GetAddonMgr().GetAddon(item->GetAddonInfo()->ID(), addon, ADDON_UNKNOWN, + OnlyEnabled::NO) && + CGUIDialogAddonSettings::ShowForAddon(addon); } bool CCheckForUpdates::IsVisible(const CFileItem& item) const @@ -43,7 +45,9 @@ bool CCheckForUpdates::IsVisible(const CFileItem& item) const bool CCheckForUpdates::Execute(const CFileItemPtr& item) const { AddonPtr addon; - if (item->HasAddonInfo() && CServiceBroker::GetAddonMgr().GetAddon(item->GetAddonInfo()->ID(), addon, ADDON_REPOSITORY)) + if (item->HasAddonInfo() && + CServiceBroker::GetAddonMgr().GetAddon(item->GetAddonInfo()->ID(), addon, ADDON_REPOSITORY, + OnlyEnabled::YES)) { CServiceBroker::GetRepositoryUpdater().CheckForUpdates(std::static_pointer_cast<CRepository>(addon), true); return true; diff --git a/xbmc/addons/FontResource.cpp b/xbmc/addons/FontResource.cpp index 91b57e6590..1ef8fd10f4 100644 --- a/xbmc/addons/FontResource.cpp +++ b/xbmc/addons/FontResource.cpp @@ -27,7 +27,8 @@ namespace ADDON void CFontResource::OnPostInstall(bool update, bool modal) { std::string skin = CServiceBroker::GetSettingsComponent()->GetSettings()->GetString(CSettings::SETTING_LOOKANDFEEL_SKIN); - const auto& deps = CServiceBroker::GetAddonMgr().GetDepsRecursive(skin); + const auto& deps = + CServiceBroker::GetAddonMgr().GetDepsRecursive(skin, OnlyEnabledRootAddon::YES); for (const auto& it : deps) if (it.id == ID()) CApplicationMessenger::GetInstance().PostMsg(TMSG_EXECUTE_BUILT_IN, -1, -1, nullptr, "ReloadSkin"); diff --git a/xbmc/addons/LanguageResource.cpp b/xbmc/addons/LanguageResource.cpp index ccc5e29b70..b9d1c41eed 100644 --- a/xbmc/addons/LanguageResource.cpp +++ b/xbmc/addons/LanguageResource.cpp @@ -136,7 +136,8 @@ bool CLanguageResource::FindLegacyLanguage(const std::string &locale, std::strin std::string addonId = GetAddonId(locale); AddonPtr addon; - if (!CServiceBroker::GetAddonMgr().GetAddon(addonId, addon, ADDON_RESOURCE_LANGUAGE, true)) + if (!CServiceBroker::GetAddonMgr().GetAddon(addonId, addon, ADDON_RESOURCE_LANGUAGE, + OnlyEnabled::YES)) return false; legacyLanguage = addon->Name(); diff --git a/xbmc/addons/Scraper.cpp b/xbmc/addons/Scraper.cpp index c9b9bb732f..3485da6a6e 100644 --- a/xbmc/addons/Scraper.cpp +++ b/xbmc/addons/Scraper.cpp @@ -368,7 +368,8 @@ bool CScraper::Load() bool bOptional = itr->optional; - if (CServiceBroker::GetAddonMgr().GetAddon((*itr).id, dep)) + if (CServiceBroker::GetAddonMgr().GetAddon((*itr).id, dep, ADDON::ADDON_UNKNOWN, + ADDON::OnlyEnabled::YES)) { CXBMCTinyXML doc; if (dep->Type() == ADDON_SCRAPER_LIBRARY && doc.LoadFile(dep->LibPath())) diff --git a/xbmc/addons/Service.cpp b/xbmc/addons/Service.cpp index 144c059ece..0fc260bca9 100644 --- a/xbmc/addons/Service.cpp +++ b/xbmc/addons/Service.cpp @@ -60,7 +60,7 @@ void CServiceAddonManager::Start() void CServiceAddonManager::Start(const std::string& addonId) { AddonPtr addon; - if (m_addonMgr.GetAddon(addonId, addon, ADDON_SERVICE)) + if (m_addonMgr.GetAddon(addonId, addon, ADDON_SERVICE, OnlyEnabled::YES)) { Start(addon); } diff --git a/xbmc/addons/addoninfo/AddonInfo.cpp b/xbmc/addons/addoninfo/AddonInfo.cpp index c32bbc9fc3..b0360d4166 100644 --- a/xbmc/addons/addoninfo/AddonInfo.cpp +++ b/xbmc/addons/addoninfo/AddonInfo.cpp @@ -78,7 +78,8 @@ const std::string& CAddonInfo::OriginName() const if (!m_originName) { ADDON::AddonPtr origin; - if (CServiceBroker::GetAddonMgr().GetAddon(m_origin, origin, ADDON::ADDON_UNKNOWN, false)) + if (CServiceBroker::GetAddonMgr().GetAddon(m_origin, origin, ADDON::ADDON_UNKNOWN, + ADDON::OnlyEnabled::NO)) m_originName = std::make_unique<std::string>(origin->Name()); else m_originName = std::make_unique<std::string>(); // remember we tried to fetch the name diff --git a/xbmc/addons/gui/GUIDialogAddonInfo.cpp b/xbmc/addons/gui/GUIDialogAddonInfo.cpp index 9fe4a0d66e..da6663b62e 100644 --- a/xbmc/addons/gui/GUIDialogAddonInfo.cpp +++ b/xbmc/addons/gui/GUIDialogAddonInfo.cpp @@ -290,7 +290,8 @@ int CGUIDialogAddonInfo::AskForVersion(std::vector<std::pair<AddonVersion, std:: item.SetArt("icon", "DefaultAddonRepository.png"); dialog->Add(item); } - else if (CServiceBroker::GetAddonMgr().GetAddon(versionInfo.second, repo, ADDON_REPOSITORY)) + else if (CServiceBroker::GetAddonMgr().GetAddon(versionInfo.second, repo, ADDON_REPOSITORY, + OnlyEnabled::YES)) { item.SetLabel2(repo->Name()); item.SetArt("icon", repo->Icon()); @@ -722,7 +723,7 @@ bool CGUIDialogAddonInfo::SetItem(const CFileItemPtr& item) m_item = std::make_shared<CFileItem>(*item); m_localAddon.reset(); CServiceBroker::GetAddonMgr().GetAddon(item->GetAddonInfo()->ID(), m_localAddon, ADDON_UNKNOWN, - false); + OnlyEnabled::NO); return true; } @@ -733,7 +734,8 @@ void CGUIDialogAddonInfo::BuildDependencyList() m_allDepsInstalled = true; m_depsInstalledWithAvailable.clear(); - m_deps = CServiceBroker::GetAddonMgr().GetDepsRecursive(m_item->GetAddonInfo()->ID()); + m_deps = CServiceBroker::GetAddonMgr().GetDepsRecursive(m_item->GetAddonInfo()->ID(), + OnlyEnabledRootAddon::NO); for (const auto& dep : m_deps) { @@ -741,7 +743,8 @@ void CGUIDialogAddonInfo::BuildDependencyList() std::shared_ptr<IAddon> addonAvailable; // Find add-on in local installation - if (!CServiceBroker::GetAddonMgr().GetAddon(dep.id, addonInstalled)) + if (!CServiceBroker::GetAddonMgr().GetAddon(dep.id, addonInstalled, ADDON_UNKNOWN, + OnlyEnabled::YES)) { addonInstalled = nullptr; m_allDepsInstalled = false; diff --git a/xbmc/addons/gui/GUIWindowAddonBrowser.cpp b/xbmc/addons/gui/GUIWindowAddonBrowser.cpp index 48dfbd81ad..74e1d2f3f0 100644 --- a/xbmc/addons/gui/GUIWindowAddonBrowser.cpp +++ b/xbmc/addons/gui/GUIWindowAddonBrowser.cpp @@ -328,7 +328,7 @@ bool CGUIWindowAddonBrowser::GetDirectory(const std::string& strDirectory, CFile //check if it's installed AddonPtr addon; if (!CServiceBroker::GetAddonMgr().GetAddon(items[i]->GetProperty("Addon.ID").asString(), - addon)) + addon, ADDON_UNKNOWN, OnlyEnabled::YES)) items.Remove(i); } } diff --git a/xbmc/addons/interfaces/General.cpp b/xbmc/addons/interfaces/General.cpp index 6ec1d16e8b..205be0cfa1 100644 --- a/xbmc/addons/interfaces/General.cpp +++ b/xbmc/addons/interfaces/General.cpp @@ -131,7 +131,8 @@ bool Interface_General::open_settings_dialog(void* kodiBase) // show settings dialog AddonPtr addonInfo; - if (!CServiceBroker::GetAddonMgr().GetAddon(addon->ID(), addonInfo)) + if (!CServiceBroker::GetAddonMgr().GetAddon(addon->ID(), addonInfo, ADDON_UNKNOWN, + OnlyEnabled::YES)) { CLog::Log(LOGERROR, "Interface_General::{} - Could not get addon information for '{}'", __FUNCTION__, addon->ID()); @@ -439,7 +440,7 @@ bool Interface_General::is_addon_avilable(void* kodiBase, } AddonPtr addonInfo; - if (!CServiceBroker::GetAddonMgr().GetAddon(id, addonInfo, ADDON_UNKNOWN, false)) + if (!CServiceBroker::GetAddonMgr().GetAddon(id, addonInfo, ADDON_UNKNOWN, OnlyEnabled::NO)) return false; *version = strdup(addonInfo->Version().asString().c_str()); diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/Inputstream.h b/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/Inputstream.h index c69c45da99..c4c7aca16c 100644 --- a/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/Inputstream.h +++ b/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/Inputstream.h @@ -513,7 +513,11 @@ class ATTRIBUTE_HIDDEN InputstreamInfo : public CStructHdl<InputstreamInfo, INPU public: /*! \cond PRIVATE */ InputstreamInfo() = default; - InputstreamInfo(const InputstreamInfo& stream) : CStructHdl(stream) { CopyExtraData(); } + InputstreamInfo(const InputstreamInfo& stream) : CStructHdl(stream) + { + SetCryptoSession(stream.GetCryptoSession()); + CopyExtraData(); + } /*! \endcond */ /// @defgroup cpp_kodi_addon_inputstream_Defs_Interface_InputstreamInfo_Help Value Help @@ -797,7 +801,6 @@ public: void SetCryptoSession(const kodi::addon::StreamCryptoSession& cryptoSession) { m_cryptoSession = cryptoSession; - m_cryptoSession.SetSessionId(cryptoSession.GetSessionId()); memcpy(&m_cStructure->m_cryptoSession, m_cryptoSession.GetCStructure(), sizeof(STREAM_CRYPTO_SESSION)); } @@ -902,8 +905,16 @@ public: ///@} private: - InputstreamInfo(const INPUTSTREAM_INFO* stream) : CStructHdl(stream) { CopyExtraData(); } - InputstreamInfo(INPUTSTREAM_INFO* stream) : CStructHdl(stream) { CopyExtraData(); } + InputstreamInfo(const INPUTSTREAM_INFO* stream) : CStructHdl(stream) + { + SetCryptoSession(StreamCryptoSession(&stream->m_cryptoSession)); + CopyExtraData(); + } + InputstreamInfo(INPUTSTREAM_INFO* stream) : CStructHdl(stream) + { + SetCryptoSession(StreamCryptoSession(&stream->m_cryptoSession)); + CopyExtraData(); + } void CopyExtraData() { diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/inputstream/StreamCrypto.h b/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/inputstream/StreamCrypto.h index 32af6ae1c7..8a851216a1 100644 --- a/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/inputstream/StreamCrypto.h +++ b/xbmc/addons/kodi-dev-kit/include/kodi/addon-instance/inputstream/StreamCrypto.h @@ -50,10 +50,7 @@ class ATTRIBUTE_HIDDEN StreamCryptoSession public: /*! \cond PRIVATE */ StreamCryptoSession() { memset(m_cStructure, 0, sizeof(STREAM_CRYPTO_SESSION)); } - StreamCryptoSession(const StreamCryptoSession& session) - : CStructHdl(session), m_sessionId(session.m_sessionId) - { - } + StreamCryptoSession(const StreamCryptoSession& session) : CStructHdl(session) {} /*! \endcond */ /// @defgroup cpp_kodi_addon_inputstream_Defs_Info_StreamCryptoSession_Help Value Help @@ -85,33 +82,15 @@ public: /// @brief To set the crypto session key identifier. void SetSessionId(const std::string& sessionId) { - m_sessionId = sessionId; - if (!m_sessionId.empty()) - { - m_cStructure->sessionId = m_sessionId.c_str(); - m_cStructure->sessionIdSize = m_sessionId.size(); - } - else - { - m_cStructure->sessionId = nullptr; - m_cStructure->sessionIdSize = 0; - } + strncpy(m_cStructure->sessionId, sessionId.c_str(), sizeof(m_cStructure->sessionId) - 1); } /// @brief To get the crypto session key identifier. - std::string GetSessionId() const { return m_sessionId; } + std::string GetSessionId() const { return m_cStructure->sessionId; } private: - StreamCryptoSession(const STREAM_CRYPTO_SESSION* session) - : CStructHdl(session), m_sessionId(session->sessionId) - { - } - StreamCryptoSession(STREAM_CRYPTO_SESSION* session) - : CStructHdl(session), m_sessionId(session->sessionId) - { - } - - std::string m_sessionId; + StreamCryptoSession(const STREAM_CRYPTO_SESSION* session) : CStructHdl(session) {} + StreamCryptoSession(STREAM_CRYPTO_SESSION* session) : CStructHdl(session) {} }; } /* namespace addon */ diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/c-api/addon-instance/inputstream/stream_crypto.h b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/addon-instance/inputstream/stream_crypto.h index e083cc7a65..4b60306b2d 100644 --- a/xbmc/addons/kodi-dev-kit/include/kodi/c-api/addon-instance/inputstream/stream_crypto.h +++ b/xbmc/addons/kodi-dev-kit/include/kodi/c-api/addon-instance/inputstream/stream_crypto.h @@ -116,14 +116,8 @@ extern "C" // Flags to use special conditions, see STREAM_CRYPTO_FLAGS for available flags. uint8_t flags; - // The size of the crypto session key id set in sessionId. - uint16_t sessionIdSize; - // The crypto session key id. - // - // WARNING The data set here is not copied and its pointer must still be - // available. - const char* sessionId; + char sessionId[256]; }; ///@} //---------------------------------------------------------------------------- diff --git a/xbmc/addons/kodi-dev-kit/include/kodi/versions.h b/xbmc/addons/kodi-dev-kit/include/kodi/versions.h index 5808e1ab38..6ece41d2bc 100644 --- a/xbmc/addons/kodi-dev-kit/include/kodi/versions.h +++ b/xbmc/addons/kodi-dev-kit/include/kodi/versions.h @@ -172,7 +172,7 @@ #define ADDON_INSTANCE_VERSION_VISUALIZATION_DEPENDS "addon-instance/Visualization.h" \ "c-api/addon-instance/visualization.h" -#define ADDON_INSTANCE_VERSION_VIDEOCODEC "2.0.1" +#define ADDON_INSTANCE_VERSION_VIDEOCODEC "2.0.2" #define ADDON_INSTANCE_VERSION_VIDEOCODEC_MIN "2.0.1" #define ADDON_INSTANCE_VERSION_VIDEOCODEC_XML_ID "kodi.binary.instance.videocodec" #define ADDON_INSTANCE_VERSION_VIDEOCODEC_DEPENDS "c-api/addon-instance/video_codec.h" \ diff --git a/xbmc/cdrip/EncoderFFmpeg.cpp b/xbmc/cdrip/EncoderFFmpeg.cpp index b8e87f29e4..cb952e2aab 100644 --- a/xbmc/cdrip/EncoderFFmpeg.cpp +++ b/xbmc/cdrip/EncoderFFmpeg.cpp @@ -75,7 +75,10 @@ bool CEncoderFFmpeg::Init(AddonToKodiFuncTable_AudioEncoder& callbacks) } AddonPtr addon; - CServiceBroker::GetAddonMgr().GetAddon(CServiceBroker::GetSettingsComponent()->GetSettings()->GetString(CSettings::SETTING_AUDIOCDS_ENCODER), addon); + CServiceBroker::GetAddonMgr().GetAddon( + CServiceBroker::GetSettingsComponent()->GetSettings()->GetString( + CSettings::SETTING_AUDIOCDS_ENCODER), + addon, ADDON::ADDON_UNKNOWN, ADDON::OnlyEnabled::YES); if (addon) { m_Format->bit_rate = (128+32*strtol(addon->GetSetting("bitrate").c_str(), NULL, 10))*1000; diff --git a/xbmc/cores/RetroPlayer/RetroPlayer.cpp b/xbmc/cores/RetroPlayer/RetroPlayer.cpp index cadbeae545..8b72621819 100644 --- a/xbmc/cores/RetroPlayer/RetroPlayer.cpp +++ b/xbmc/cores/RetroPlayer/RetroPlayer.cpp @@ -109,7 +109,8 @@ bool CRetroPlayer::OpenFile(const CFileItem& file, const CPlayerOptions& options { CLog::Log(LOGERROR, "RetroPlayer[PLAYER]: Can't play game, no game client was passed!"); } - else if (!CServiceBroker::GetAddonMgr().GetAddon(gameClientId, addon, ADDON::ADDON_GAMEDLL)) + else if (!CServiceBroker::GetAddonMgr().GetAddon(gameClientId, addon, ADDON::ADDON_GAMEDLL, + ADDON::OnlyEnabled::YES)) { CLog::Log(LOGERROR, "RetroPlayer[PLAYER]: Can't find add-on %s for game file!", gameClientId.c_str()); @@ -156,7 +157,8 @@ bool CRetroPlayer::OpenFile(const CFileItem& file, const CPlayerOptions& options if (save->GameClientID() != m_gameClient->ID()) { ADDON::AddonPtr addon; - if (CServiceBroker::GetAddonMgr().GetAddon(save->GameClientID(), addon)) + if (CServiceBroker::GetAddonMgr().GetAddon(save->GameClientID(), addon, + ADDON::ADDON_UNKNOWN, ADDON::OnlyEnabled::YES)) { // Warn the user that continuing with a different game client will // overwrite the save diff --git a/xbmc/cores/VideoPlayer/DVDCodecs/Audio/DVDAudioCodecAndroidMediaCodec.cpp b/xbmc/cores/VideoPlayer/DVDCodecs/Audio/DVDAudioCodecAndroidMediaCodec.cpp index 9046d42a0f..87c3df3773 100644 --- a/xbmc/cores/VideoPlayer/DVDCodecs/Audio/DVDAudioCodecAndroidMediaCodec.cpp +++ b/xbmc/cores/VideoPlayer/DVDCodecs/Audio/DVDAudioCodecAndroidMediaCodec.cpp @@ -250,7 +250,9 @@ PROCESSDECODER: return false; } - m_crypto = new CJNIMediaCrypto(uuid, std::vector<char>(m_hints.cryptoSession->sessionId, m_hints.cryptoSession->sessionId + m_hints.cryptoSession->sessionIdSize)); + m_crypto = + new CJNIMediaCrypto(uuid, std::vector<char>(m_hints.cryptoSession->sessionId.begin(), + m_hints.cryptoSession->sessionId.end())); if (xbmc_jnienv()->ExceptionCheck()) { diff --git a/xbmc/cores/VideoPlayer/DVDCodecs/Video/AddonVideoCodec.cpp b/xbmc/cores/VideoPlayer/DVDCodecs/Video/AddonVideoCodec.cpp index 6b2e51b6de..c0c48ba701 100644 --- a/xbmc/cores/VideoPlayer/DVDCodecs/Video/AddonVideoCodec.cpp +++ b/xbmc/cores/VideoPlayer/DVDCodecs/Video/AddonVideoCodec.cpp @@ -136,9 +136,9 @@ bool CAddonVideoCodec::CopyToInitData(VIDEOCODEC_INITDATA &initData, CDVDStreamI default: return false; } - initData.cryptoSession.sessionIdSize = hints.cryptoSession->sessionIdSize; - //We assume that we need this sessionid only for the directly following call - initData.cryptoSession.sessionId = hints.cryptoSession->sessionId; + + strncpy(initData.cryptoSession.sessionId, hints.cryptoSession->sessionId.c_str(), + sizeof(initData.cryptoSession.sessionId) - 1); } initData.extraData = reinterpret_cast<const uint8_t*>(hints.extradata); diff --git a/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecAndroidMediaCodec.cpp b/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecAndroidMediaCodec.cpp index 7c0f26339e..47f2547ae4 100644 --- a/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecAndroidMediaCodec.cpp +++ b/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecAndroidMediaCodec.cpp @@ -589,9 +589,8 @@ bool CDVDVideoCodecAndroidMediaCodec::Open(CDVDStreamInfo &hints, CDVDCodecOptio m_hints.cryptoSession->keySystem); goto FAIL; } - CJNIMediaCrypto crypto(uuid, std::vector<char>(m_hints.cryptoSession->sessionId, - m_hints.cryptoSession->sessionId + - m_hints.cryptoSession->sessionIdSize)); + CJNIMediaCrypto crypto(uuid, std::vector<char>(m_hints.cryptoSession->sessionId.begin(), + m_hints.cryptoSession->sessionId.end())); m_needSecureDecoder = crypto.requiresSecureDecoderComponent(m_mime) && (m_hints.cryptoSession->flags & DemuxCryptoSession::FLAG_SECURE_DECODER) != 0; @@ -700,9 +699,8 @@ bool CDVDVideoCodecAndroidMediaCodec::Open(CDVDStreamInfo &hints, CDVDCodecOptio CLog::Log(LOGDEBUG, "CDVDVideoCodecAndroidMediaCodec::Open Initializing MediaCrypto"); m_crypto = - new CJNIMediaCrypto(uuid, std::vector<char>(m_hints.cryptoSession->sessionId, - m_hints.cryptoSession->sessionId + - m_hints.cryptoSession->sessionIdSize)); + new CJNIMediaCrypto(uuid, std::vector<char>(m_hints.cryptoSession->sessionId.begin(), + m_hints.cryptoSession->sessionId.end())); if (!m_crypto) { diff --git a/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecDRMPRIME.cpp b/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecDRMPRIME.cpp index a12ef9ec1e..3937e25aed 100644 --- a/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecDRMPRIME.cpp +++ b/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecDRMPRIME.cpp @@ -252,27 +252,16 @@ bool CDVDVideoCodecDRMPRIME::Open(CDVDStreamInfo& hints, CDVDCodecOptions& optio #if defined(HAVE_GBM) auto winSystem = dynamic_cast<KODI::WINDOWING::GBM::CWinSystemGbm*>(CServiceBroker::GetWinSystem()); - if (!winSystem) - return false; - - auto drm = winSystem->GetDrm(); - - if (!drm) - return false; - - int fd = drm->GetFileDescriptor(); - - if (fd < 0) - return false; - - if (!device) - device = drmGetRenderDeviceNameFromFd(fd); + if (winSystem) + { + auto drm = winSystem->GetDrm(); - if (!device) - device = drmGetDeviceNameFromFd2(fd); + if (!drm) + return false; - if (!device) - device = drmGetDeviceNameFromFd(fd); + if (!device) + device = drm->GetRenderDevicePath(); + } #endif //! @todo: fix with proper device when dma-hints wayland protocol works diff --git a/xbmc/cores/VideoPlayer/DVDCodecs/Video/DXVA.cpp b/xbmc/cores/VideoPlayer/DVDCodecs/Video/DXVA.cpp index 64584b8eae..9941e714ae 100644 --- a/xbmc/cores/VideoPlayer/DVDCodecs/Video/DXVA.cpp +++ b/xbmc/cores/VideoPlayer/DVDCodecs/Video/DXVA.cpp @@ -1212,6 +1212,14 @@ bool CDecoder::Open(AVCodecContext* avctx, AVCodecContext* mainctx, enum AVPixel if (avctx->active_thread_type & FF_THREAD_FRAME) m_refs += avctx->thread_count; + // Limit decoder surfaces to 32 maximum in any case. Since with some 16 cores / 32 threads + // new CPU's (Ryzen 5950x) this number may be higher than what the graphics card can handle. + if (m_refs > 32) + { + CLog::LogF(LOGWARNING, "The number of decoder surfaces has been limited from {} to 32.", m_refs); + m_refs = 32; + } + // Check if available video memory is sufficient for 4K decoding (is need ~3000 MB) if (avctx->width >= 3840 && m_refs > 16 && videoMem < (3000ull * MB)) { diff --git a/xbmc/cores/VideoPlayer/DVDInputStreams/InputStreamAddon.cpp b/xbmc/cores/VideoPlayer/DVDInputStreams/InputStreamAddon.cpp index b6aecc7ce7..4807627af8 100644 --- a/xbmc/cores/VideoPlayer/DVDInputStreams/InputStreamAddon.cpp +++ b/xbmc/cores/VideoPlayer/DVDInputStreams/InputStreamAddon.cpp @@ -533,9 +533,9 @@ KODI_HANDLE CInputStreamAddon::cb_get_stream_transfer(KODI_HANDLE handle, CRYPTO_SESSION_SYSTEM_PLAYREADY, CRYPTO_SESSION_SYSTEM_WISEPLAY, }; - demuxStream->cryptoSession = std::shared_ptr<DemuxCryptoSession>(new DemuxCryptoSession( - map[stream->m_cryptoSession.keySystem], stream->m_cryptoSession.sessionIdSize, - stream->m_cryptoSession.sessionId, stream->m_cryptoSession.flags)); + demuxStream->cryptoSession = std::shared_ptr<DemuxCryptoSession>( + new DemuxCryptoSession(map[stream->m_cryptoSession.keySystem], + stream->m_cryptoSession.sessionId, stream->m_cryptoSession.flags)); if ((stream->m_features & INPUTSTREAM_FEATURE_DECODE) != 0) demuxStream->externalInterfaces = thisClass->m_subAddonProvider; diff --git a/xbmc/cores/VideoPlayer/Interface/DemuxCrypto.h b/xbmc/cores/VideoPlayer/Interface/DemuxCrypto.h index 8884ae080d..4d2a859b3d 100644 --- a/xbmc/cores/VideoPlayer/Interface/DemuxCrypto.h +++ b/xbmc/cores/VideoPlayer/Interface/DemuxCrypto.h @@ -10,7 +10,7 @@ #include "addons/kodi-dev-kit/include/kodi/c-api/addon-instance/inputstream/stream_crypto.h" -#include <string.h> +#include <string> //CryptoSession is usually obtained once per stream, but could change if an key expires @@ -24,30 +24,18 @@ enum CryptoSessionSystem : uint8_t struct DemuxCryptoSession { - DemuxCryptoSession(const CryptoSessionSystem sys, const uint16_t sSize, const char *sData, const uint8_t flags) - : sessionId(new char[sSize]) - , sessionIdSize(sSize) - , keySystem(sys) - , flags(flags) + DemuxCryptoSession(const CryptoSessionSystem sys, const char* sData, const uint8_t flags) + : sessionId(sData), keySystem(sys), flags(flags) { - memcpy(sessionId, sData, sSize); - }; - - ~DemuxCryptoSession() - { - delete[] sessionId; } bool operator == (const DemuxCryptoSession &other) const { - return sessionIdSize == other.sessionIdSize && - keySystem == other.keySystem && - memcmp(sessionId, other.sessionId, sessionIdSize) == 0; + return keySystem == other.keySystem && sessionId == other.sessionId; }; // encryped stream infos - char * sessionId; - uint16_t sessionIdSize; + std::string sessionId; CryptoSessionSystem keySystem; static const uint8_t FLAG_SECURE_DECODER = 1; diff --git a/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/DRMPRIMEEGL.cpp b/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/DRMPRIMEEGL.cpp index af3dd89f6a..d60adf4889 100644 --- a/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/DRMPRIMEEGL.cpp +++ b/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/DRMPRIMEEGL.cpp @@ -12,6 +12,11 @@ using namespace DRMPRIME; +CDRMPRIMETexture::~CDRMPRIMETexture() +{ + glDeleteTextures(1, &m_texture); +} + void CDRMPRIMETexture::Init(EGLDisplay eglDisplay) { m_eglImage.reset(new CEGLImage(eglDisplay)); @@ -60,7 +65,8 @@ bool CDRMPRIMETexture::Map(CVideoBufferDRMPRIME* buffer) return false; } - glGenTextures(1, &m_texture); + if (!glIsTexture(m_texture)) + glGenTextures(1, &m_texture); glBindTexture(m_textureTarget, m_texture); glTexParameteri(m_textureTarget, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(m_textureTarget, GL_TEXTURE_MAG_FILTER, GL_LINEAR); @@ -83,8 +89,6 @@ void CDRMPRIMETexture::Unmap() m_eglImage->DestroyImage(); - glDeleteTextures(1, &m_texture); - m_primebuffer->ReleaseDescriptor(); m_primebuffer->Release(); diff --git a/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/DRMPRIMEEGL.h b/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/DRMPRIMEEGL.h index 8c494e8777..d39c5f2b96 100644 --- a/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/DRMPRIMEEGL.h +++ b/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/DRMPRIMEEGL.h @@ -17,6 +17,9 @@ class CDRMPRIMETexture { public: + CDRMPRIMETexture() = default; + ~CDRMPRIMETexture(); + bool Map(CVideoBufferDRMPRIME* buffer); void Unmap(); void Init(EGLDisplay eglDisplay); diff --git a/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/DXVAHD.cpp b/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/DXVAHD.cpp index 44759d3780..97f9fd149f 100644 --- a/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/DXVAHD.cpp +++ b/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/DXVAHD.cpp @@ -59,7 +59,6 @@ void CProcessorHD::Close() m_pVideoProcessor = nullptr; m_pVideoContext = nullptr; m_pVideoDevice = nullptr; - m_bSupportHDR10 = false; } bool CProcessorHD::PreInit() const diff --git a/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/DXVAHD.h b/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/DXVAHD.h index c854f57969..5235544967 100644 --- a/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/DXVAHD.h +++ b/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/DXVAHD.h @@ -43,7 +43,6 @@ public: bool Render(CRect src, CRect dst, ID3D11Resource* target, CRenderBuffer **views, DWORD flags, UINT frameIdx, UINT rotation, float contrast, float brightness); uint8_t PastRefs() const { return m_max_back_refs; } bool IsFormatSupported(DXGI_FORMAT format, D3D11_VIDEO_PROCESSOR_FORMAT_SUPPORT support) const; - bool HasHDR10Support() const { return m_bSupportHDR10; } // ID3DResource overrides void OnCreateDevice() override {} @@ -69,7 +68,6 @@ protected: uint32_t m_procIndex = 0; D3D11_VIDEO_PROCESSOR_CAPS m_vcaps = {}; D3D11_VIDEO_PROCESSOR_RATE_CONVERSION_CAPS m_rateCaps = {}; - bool m_bSupportHDR10 = false; bool m_bSupportHLG = false; struct ProcAmpInfo diff --git a/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/RendererDRMPRIMEGLES.cpp b/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/RendererDRMPRIMEGLES.cpp index af1836f92c..c1d69bf381 100644 --- a/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/RendererDRMPRIMEGLES.cpp +++ b/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/RendererDRMPRIMEGLES.cpp @@ -18,6 +18,7 @@ #include "utils/EGLImage.h" #include "utils/GLUtils.h" #include "utils/log.h" +#include "windowing/GraphicContext.h" #include "windowing/WinSystem.h" #include "windowing/linux/WinSystemEGL.h" @@ -179,6 +180,68 @@ void CRendererDRMPRIMEGLES::Update() ManageRenderArea(); } +void CRendererDRMPRIMEGLES::DrawBlackBars() +{ + CRect windowRect(0, 0, CServiceBroker::GetWinSystem()->GetGfxContext().GetWidth(), + CServiceBroker::GetWinSystem()->GetGfxContext().GetHeight()); + + auto quads = windowRect.SubtractRect(m_destRect); + + struct Svertex + { + float x, y; + }; + + std::vector<Svertex> vertices(6 * quads.size()); + + GLubyte count = 0; + for (const auto& quad : quads) + { + vertices[count + 1].x = quad.x1; + vertices[count + 1].y = quad.y1; + + vertices[count + 0].x = vertices[count + 5].x = quad.x1; + vertices[count + 0].y = vertices[count + 5].y = quad.y2; + + vertices[count + 2].x = vertices[count + 3].x = quad.x2; + vertices[count + 2].y = vertices[count + 3].y = quad.y1; + + vertices[count + 4].x = quad.x2; + vertices[count + 4].y = quad.y2; + + count += 6; + } + + glDisable(GL_BLEND); + + CRenderSystemGLES* renderSystem = + dynamic_cast<CRenderSystemGLES*>(CServiceBroker::GetRenderSystem()); + if (!renderSystem) + return; + + renderSystem->EnableGUIShader(SM_DEFAULT); + GLint posLoc = renderSystem->GUIShaderGetPos(); + GLint uniCol = renderSystem->GUIShaderGetUniCol(); + + glUniform4f(uniCol, m_clearColour / 255.0f, m_clearColour / 255.0f, m_clearColour / 255.0f, 1.0f); + + GLuint vertexVBO; + glGenBuffers(1, &vertexVBO); + glBindBuffer(GL_ARRAY_BUFFER, vertexVBO); + glBufferData(GL_ARRAY_BUFFER, sizeof(Svertex) * vertices.size(), vertices.data(), GL_STATIC_DRAW); + + glVertexAttribPointer(posLoc, 2, GL_FLOAT, GL_FALSE, sizeof(Svertex), 0); + glEnableVertexAttribArray(posLoc); + + glDrawArrays(GL_TRIANGLES, 0, vertices.size()); + + glDisableVertexAttribArray(posLoc); + glBindBuffer(GL_ARRAY_BUFFER, 0); + glDeleteBuffers(1, &vertexVBO); + + renderSystem->DisableGUIShader(); +} + void CRendererDRMPRIMEGLES::RenderUpdate( int index, int index2, bool clear, unsigned int flags, unsigned int alpha) { @@ -189,9 +252,14 @@ void CRendererDRMPRIMEGLES::RenderUpdate( if (clear) { - glClearColor(m_clearColour, m_clearColour, m_clearColour, 0); - glClear(GL_COLOR_BUFFER_BIT); - glClearColor(0, 0, 0, 0); + if (alpha == 255) + DrawBlackBars(); + else + { + glClearColor(m_clearColour, m_clearColour, m_clearColour, 0); + glClear(GL_COLOR_BUFFER_BIT); + glClearColor(0, 0, 0, 0); + } } if (alpha < 255) diff --git a/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/RendererDRMPRIMEGLES.h b/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/RendererDRMPRIMEGLES.h index 86a1e19618..e04dac0eaf 100644 --- a/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/RendererDRMPRIMEGLES.h +++ b/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/RendererDRMPRIMEGLES.h @@ -55,6 +55,7 @@ public: bool Supports(ESCALINGMETHOD method) override; private: + void DrawBlackBars(); void Render(unsigned int flags, int index); bool m_configured = false; diff --git a/xbmc/cores/VideoPlayer/VideoRenderers/LinuxRendererGLES.cpp b/xbmc/cores/VideoPlayer/VideoRenderers/LinuxRendererGLES.cpp index 590beb0ea0..d76a4d6c5f 100644 --- a/xbmc/cores/VideoPlayer/VideoRenderers/LinuxRendererGLES.cpp +++ b/xbmc/cores/VideoPlayer/VideoRenderers/LinuxRendererGLES.cpp @@ -366,6 +366,68 @@ void CLinuxRendererGLES::Update() ValidateRenderTarget(); } +void CLinuxRendererGLES::DrawBlackBars() +{ + CRect windowRect(0, 0, CServiceBroker::GetWinSystem()->GetGfxContext().GetWidth(), + CServiceBroker::GetWinSystem()->GetGfxContext().GetHeight()); + + auto quads = windowRect.SubtractRect(m_destRect); + + struct Svertex + { + float x, y; + }; + + std::vector<Svertex> vertices(6 * quads.size()); + + GLubyte count = 0; + for (const auto& quad : quads) + { + vertices[count + 1].x = quad.x1; + vertices[count + 1].y = quad.y1; + + vertices[count + 0].x = vertices[count + 5].x = quad.x1; + vertices[count + 0].y = vertices[count + 5].y = quad.y2; + + vertices[count + 2].x = vertices[count + 3].x = quad.x2; + vertices[count + 2].y = vertices[count + 3].y = quad.y1; + + vertices[count + 4].x = quad.x2; + vertices[count + 4].y = quad.y2; + + count += 6; + } + + glDisable(GL_BLEND); + + CRenderSystemGLES* renderSystem = + dynamic_cast<CRenderSystemGLES*>(CServiceBroker::GetRenderSystem()); + if (!renderSystem) + return; + + renderSystem->EnableGUIShader(SM_DEFAULT); + GLint posLoc = renderSystem->GUIShaderGetPos(); + GLint uniCol = renderSystem->GUIShaderGetUniCol(); + + glUniform4f(uniCol, m_clearColour / 255.0f, m_clearColour / 255.0f, m_clearColour / 255.0f, 1.0f); + + GLuint vertexVBO; + glGenBuffers(1, &vertexVBO); + glBindBuffer(GL_ARRAY_BUFFER, vertexVBO); + glBufferData(GL_ARRAY_BUFFER, sizeof(Svertex) * vertices.size(), vertices.data(), GL_STATIC_DRAW); + + glVertexAttribPointer(posLoc, 2, GL_FLOAT, GL_FALSE, sizeof(Svertex), 0); + glEnableVertexAttribArray(posLoc); + + glDrawArrays(GL_TRIANGLES, 0, vertices.size()); + + glDisableVertexAttribArray(posLoc); + glBindBuffer(GL_ARRAY_BUFFER, 0); + glDeleteBuffers(1, &vertexVBO); + + renderSystem->DisableGUIShader(); +} + void CLinuxRendererGLES::RenderUpdate(int index, int index2, bool clear, unsigned int flags, unsigned int alpha) { m_iYV12RenderBuffer = index; @@ -398,9 +460,14 @@ void CLinuxRendererGLES::RenderUpdate(int index, int index2, bool clear, unsigne if (clear) { - glClearColor(m_clearColour, m_clearColour, m_clearColour, 0); - glClear(GL_COLOR_BUFFER_BIT); - glClearColor(0,0,0,0); + if (alpha == 255) + DrawBlackBars(); + else + { + glClearColor(m_clearColour, m_clearColour, m_clearColour, 0); + glClear(GL_COLOR_BUFFER_BIT); + glClearColor(0, 0, 0, 0); + } } if (alpha < 255) diff --git a/xbmc/cores/VideoPlayer/VideoRenderers/LinuxRendererGLES.h b/xbmc/cores/VideoPlayer/VideoRenderers/LinuxRendererGLES.h index 078d8cdd6b..5c776c932b 100644 --- a/xbmc/cores/VideoPlayer/VideoRenderers/LinuxRendererGLES.h +++ b/xbmc/cores/VideoPlayer/VideoRenderers/LinuxRendererGLES.h @@ -209,4 +209,7 @@ protected: // clear colour for "black" bars float m_clearColour{0.0f}; CRect m_viewRect; + +private: + void DrawBlackBars(); }; diff --git a/xbmc/cores/VideoPlayer/VideoRenderers/VideoShaders/WinVideoFilter.cpp b/xbmc/cores/VideoPlayer/VideoRenderers/VideoShaders/WinVideoFilter.cpp index 3b8a906bc5..a7f526c069 100644 --- a/xbmc/cores/VideoPlayer/VideoRenderers/VideoShaders/WinVideoFilter.cpp +++ b/xbmc/cores/VideoPlayer/VideoRenderers/VideoShaders/WinVideoFilter.cpp @@ -493,7 +493,7 @@ void COutputShader::CreateDitherView() if (FAILED(hr)) { - CLog::LogF(LOGDEBUG, "unable to create 3dlut texture cube."); + CLog::LogF(LOGDEBUG, "unable to create dither texture cube."); m_useDithering = false; return; } @@ -502,7 +502,7 @@ void COutputShader::CreateDitherView() hr = pDevice->CreateShaderResourceView(pDitherTex.Get(), &srvDesc, &m_pDitherView); if (FAILED(hr)) { - CLog::LogF(LOGDEBUG, "unable to create view for 3dlut texture cube."); + CLog::LogF(LOGDEBUG, "unable to create view for dither texture cube."); m_useDithering = false; return; } diff --git a/xbmc/cores/VideoPlayer/VideoRenderers/windows/RendererBase.cpp b/xbmc/cores/VideoPlayer/VideoRenderers/windows/RendererBase.cpp index b888859b43..2f192fc195 100644 --- a/xbmc/cores/VideoPlayer/VideoRenderers/windows/RendererBase.cpp +++ b/xbmc/cores/VideoPlayer/VideoRenderers/windows/RendererBase.cpp @@ -40,6 +40,8 @@ void CRenderBuffer::AppendPicture(const VideoPicture& picture) displayMetadata = picture.displayMetadata; lightMetadata = picture.lightMetadata; hasLightMetadata = picture.hasLightMetadata && picture.lightMetadata.MaxCLL; + if (hasDisplayMetadata && displayMetadata.has_luminance && !displayMetadata.max_luminance.num) + displayMetadata.has_luminance = 0; } void CRenderBuffer::ReleasePicture() @@ -173,6 +175,9 @@ bool CRendererBase::Configure(const VideoPicture& picture, float fps, unsigned o m_fps = fps; m_renderOrientation = orientation; + m_useDithering = CServiceBroker::GetSettingsComponent()->GetSettings()->GetBool("videoscreen.dither"); + m_ditherDepth = CServiceBroker::GetSettingsComponent()->GetSettings()->GetInt("videoscreen.ditherdepth"); + m_lastHdr10 = {}; m_HdrType = HDR_TYPE::HDR_NONE_SDR; m_useHLGtoPQ = false; @@ -244,7 +249,7 @@ void CRendererBase::Render(CD3DTexture& target, const CRect& sourceRect, const C RenderImpl(m_IntermediateTarget, source, dest, flags); - if (UseToneMapping()) + if (m_toneMapping) { m_outputShader->SetDisplayMetadata(buf->hasDisplayMetadata, buf->displayMetadata, buf->hasLightMetadata, buf->lightMetadata); m_outputShader->SetToneMapParam(m_toneMapMethod, m_videoSettings.m_ToneMapParam); @@ -486,7 +491,7 @@ DXGI_HDR_METADATA_HDR10 CRendererBase::GetDXGIHDR10MetaData(CRenderBuffer* rb) { DXGI_HDR_METADATA_HDR10 hdr10 = {}; - if (rb->displayMetadata.has_primaries) + if (rb->hasDisplayMetadata && rb->displayMetadata.has_primaries) { hdr10.RedPrimary[0] = static_cast<uint16_t>(rb->displayMetadata.display_primaries[0][0].num); hdr10.RedPrimary[1] = static_cast<uint16_t>(rb->displayMetadata.display_primaries[0][1].num); @@ -497,7 +502,7 @@ DXGI_HDR_METADATA_HDR10 CRendererBase::GetDXGIHDR10MetaData(CRenderBuffer* rb) hdr10.WhitePoint[0] = static_cast<uint16_t>(rb->displayMetadata.white_point[0].num); hdr10.WhitePoint[1] = static_cast<uint16_t>(rb->displayMetadata.white_point[1].num); } - if (rb->displayMetadata.has_luminance) + if (rb->hasDisplayMetadata && rb->displayMetadata.has_luminance) { hdr10.MaxMasteringLuminance = static_cast<uint32_t>(rb->displayMetadata.max_luminance.num); hdr10.MinMasteringLuminance = static_cast<uint32_t>(rb->displayMetadata.min_luminance.num); @@ -522,10 +527,11 @@ void CRendererBase::ProcessHDR(CRenderBuffer* rb) if (!DX::Windowing()->IsHDROutput()) { - if (m_lastHdr10.RedPrimary[0] != 0) - m_lastHdr10 = {}; if (m_HdrType != HDR_TYPE::HDR_NONE_SDR) + { m_HdrType = HDR_TYPE::HDR_NONE_SDR; + m_lastHdr10 = {}; + } return; } diff --git a/xbmc/cores/VideoPlayer/VideoRenderers/windows/RendererBase.h b/xbmc/cores/VideoPlayer/VideoRenderers/windows/RendererBase.h index c7a1ff8ac2..000d2beee2 100644 --- a/xbmc/cores/VideoPlayer/VideoRenderers/windows/RendererBase.h +++ b/xbmc/cores/VideoPlayer/VideoRenderers/windows/RendererBase.h @@ -151,7 +151,6 @@ protected: virtual void CheckVideoParameters(); virtual void OnViewSizeChanged() {} virtual void OnOutputReset() {} - virtual bool UseToneMapping() const { return m_toneMapping; } bool m_toneMapping = false; bool m_useDithering = false; diff --git a/xbmc/cores/VideoPlayer/VideoRenderers/windows/RendererDXVA.cpp b/xbmc/cores/VideoPlayer/VideoRenderers/windows/RendererDXVA.cpp index 31cfd02ca5..ecfb1d27ad 100644 --- a/xbmc/cores/VideoPlayer/VideoRenderers/windows/RendererDXVA.cpp +++ b/xbmc/cores/VideoPlayer/VideoRenderers/windows/RendererDXVA.cpp @@ -179,12 +179,6 @@ CRect CRendererDXVA::ApplyTransforms(const CRect& destRect) const return result; } -bool CRendererDXVA::UseToneMapping() const -{ - // use mapping only if processor doesn't support HDR10 - return !m_processor->HasHDR10Support() && __super::UseToneMapping(); -} - void CRendererDXVA::FillBuffersSet(CRenderBuffer* (&buffers)[8]) { int past = 0; diff --git a/xbmc/cores/VideoPlayer/VideoRenderers/windows/RendererDXVA.h b/xbmc/cores/VideoPlayer/VideoRenderers/windows/RendererDXVA.h index 2efe9bffb1..ab94796157 100644 --- a/xbmc/cores/VideoPlayer/VideoRenderers/windows/RendererDXVA.h +++ b/xbmc/cores/VideoPlayer/VideoRenderers/windows/RendererDXVA.h @@ -38,7 +38,6 @@ protected: void CheckVideoParameters() override; void RenderImpl(CD3DTexture& target, CRect& sourceRect, CPoint(&destPoints)[4], uint32_t flags) override; CRenderBuffer* CreateBuffer() override; - bool UseToneMapping() const override; private: void FillBuffersSet(CRenderBuffer* (&buffers)[8]); diff --git a/xbmc/cores/VideoSettings.h b/xbmc/cores/VideoSettings.h index 4e2007a8a6..e0cecda754 100644 --- a/xbmc/cores/VideoSettings.h +++ b/xbmc/cores/VideoSettings.h @@ -101,7 +101,6 @@ public: int m_SubtitleStream; float m_SubtitleDelay; bool m_SubtitleOn; - bool m_SubtitleCached; // not used -> remove from DB float m_Brightness; float m_Contrast; float m_Gamma; diff --git a/xbmc/filesystem/AddonsDirectory.cpp b/xbmc/filesystem/AddonsDirectory.cpp index 31fb5aa0fa..fb1c73a39c 100644 --- a/xbmc/filesystem/AddonsDirectory.cpp +++ b/xbmc/filesystem/AddonsDirectory.cpp @@ -558,7 +558,7 @@ static bool Browse(const CURL& path, CFileItemList &items) AddonPtr repoAddon; const auto& addonMgr = CServiceBroker::GetAddonMgr(); - if (!addonMgr.GetAddon(repoId, repoAddon, ADDON_REPOSITORY)) + if (!addonMgr.GetAddon(repoId, repoAddon, ADDON_REPOSITORY, OnlyEnabled::YES)) return false; CAddonRepos addonRepos(addonMgr); @@ -782,10 +782,10 @@ bool CAddonsDirectory::IsRepoDirectory(const CURL& url) return false; AddonPtr tmp; - return url.GetHostName() == "repos" - || url.GetHostName() == "all" - || url.GetHostName() == "search" - || CServiceBroker::GetAddonMgr().GetAddon(url.GetHostName(), tmp, ADDON_REPOSITORY); + return url.GetHostName() == "repos" || url.GetHostName() == "all" || + url.GetHostName() == "search" || + CServiceBroker::GetAddonMgr().GetAddon(url.GetHostName(), tmp, ADDON_REPOSITORY, + OnlyEnabled::YES); } void CAddonsDirectory::GenerateAddonListing(const CURL& path, diff --git a/xbmc/filesystem/PluginDirectory.cpp b/xbmc/filesystem/PluginDirectory.cpp index eae290391f..cf6422aca4 100644 --- a/xbmc/filesystem/PluginDirectory.cpp +++ b/xbmc/filesystem/PluginDirectory.cpp @@ -114,8 +114,10 @@ bool CPluginDirectory::StartScript(const std::string& strPath, bool retrievingDi CURL url(strPath); // try the plugin type first, and if not found, try an unknown type - if (!CServiceBroker::GetAddonMgr().GetAddon(url.GetHostName(), m_addon, ADDON_PLUGIN) && - !CServiceBroker::GetAddonMgr().GetAddon(url.GetHostName(), m_addon, ADDON_UNKNOWN) && + if (!CServiceBroker::GetAddonMgr().GetAddon(url.GetHostName(), m_addon, ADDON_PLUGIN, + OnlyEnabled::YES) && + !CServiceBroker::GetAddonMgr().GetAddon(url.GetHostName(), m_addon, ADDON_UNKNOWN, + OnlyEnabled::YES) && !CAddonInstaller::GetInstance().InstallModal(url.GetHostName(), m_addon, InstallModalPrompt::PROMPT)) { @@ -458,7 +460,8 @@ bool CPluginDirectory::RunScriptWithParams(const std::string& strPath, bool resu return false; AddonPtr addon; - if (!CServiceBroker::GetAddonMgr().GetAddon(url.GetHostName(), addon, ADDON_PLUGIN) && + if (!CServiceBroker::GetAddonMgr().GetAddon(url.GetHostName(), addon, ADDON_PLUGIN, + OnlyEnabled::YES) && !CAddonInstaller::GetInstance().InstallModal(url.GetHostName(), addon, InstallModalPrompt::PROMPT)) { @@ -622,7 +625,8 @@ bool CPluginDirectory::IsMediaLibraryScanningAllowed(const std::string& content, if (url.GetHostName().empty()) return false; AddonPtr addon; - if (!CServiceBroker::GetAddonMgr().GetAddon(url.GetHostName(), addon, ADDON_PLUGIN)) + if (!CServiceBroker::GetAddonMgr().GetAddon(url.GetHostName(), addon, ADDON_PLUGIN, + OnlyEnabled::YES)) { CLog::Log(LOGERROR, "Unable to find plugin %s", url.GetHostName().c_str()); return false; diff --git a/xbmc/filesystem/ResourceFile.cpp b/xbmc/filesystem/ResourceFile.cpp index f319f12f76..65ac717093 100644 --- a/xbmc/filesystem/ResourceFile.cpp +++ b/xbmc/filesystem/ResourceFile.cpp @@ -46,7 +46,8 @@ bool CResourceFile::TranslatePath(const CURL &url, std::string &translatedPath) return false; AddonPtr addon; - if (!CServiceBroker::GetAddonMgr().GetAddon(addonId, addon, ADDON_UNKNOWN, true) || addon == NULL) + if (!CServiceBroker::GetAddonMgr().GetAddon(addonId, addon, ADDON_UNKNOWN, OnlyEnabled::YES) || + addon == NULL) return false; std::shared_ptr<CResource> resource = std::dynamic_pointer_cast<ADDON::CResource>(addon); diff --git a/xbmc/games/addons/GameClient.cpp b/xbmc/games/addons/GameClient.cpp index 71dbbb646f..4a79ccebcd 100644 --- a/xbmc/games/addons/GameClient.cpp +++ b/xbmc/games/addons/GameClient.cpp @@ -420,7 +420,8 @@ std::string CGameClient::GetMissingResource() if (StringUtils::StartsWith(strDependencyId, "resource.games")) { AddonPtr addon; - const bool bInstalled = CServiceBroker::GetAddonMgr().GetAddon(strDependencyId, addon); + const bool bInstalled = CServiceBroker::GetAddonMgr().GetAddon( + strDependencyId, addon, ADDON_UNKNOWN, OnlyEnabled::YES); if (!bInstalled) { strAddonId = strDependencyId; diff --git a/xbmc/games/addons/GameClientProperties.cpp b/xbmc/games/addons/GameClientProperties.cpp index be76601735..d46cb7c8a4 100644 --- a/xbmc/games/addons/GameClientProperties.cpp +++ b/xbmc/games/addons/GameClientProperties.cpp @@ -112,7 +112,8 @@ const char** CGameClientProperties::GetResourceDirectories(void) { const std::string& strAddonId = it->id; AddonPtr addon; - if (CServiceBroker::GetAddonMgr().GetAddon(strAddonId, addon, ADDON_RESOURCE_GAMES)) + if (CServiceBroker::GetAddonMgr().GetAddon(strAddonId, addon, ADDON_RESOURCE_GAMES, + OnlyEnabled::YES)) { std::shared_ptr<CGameResource> resource = std::static_pointer_cast<CGameResource>(addon); @@ -202,7 +203,8 @@ bool CGameClientProperties::GetProxyAddons(ADDON::VECADDONS& addons) for (const auto& dependency : m_parent.GetDependencies()) { AddonPtr addon; - if (CServiceBroker::GetAddonMgr().GetAddon(dependency.id, addon, ADDON_UNKNOWN, false)) + if (CServiceBroker::GetAddonMgr().GetAddon(dependency.id, addon, ADDON_UNKNOWN, + OnlyEnabled::NO)) { // If add-on is disabled, ask the user to enable it if (CServiceBroker::GetAddonMgr().IsAddonDisabled(dependency.id)) diff --git a/xbmc/games/controllers/ControllerManager.cpp b/xbmc/games/controllers/ControllerManager.cpp index 428cd6bc99..b6d64f5a46 100644 --- a/xbmc/games/controllers/ControllerManager.cpp +++ b/xbmc/games/controllers/ControllerManager.cpp @@ -25,7 +25,8 @@ ControllerPtr CControllerManager::GetController(const std::string& controllerId) if (!cachedController && m_failedControllers.find(controllerId) == m_failedControllers.end()) { AddonPtr addon; - if (CServiceBroker::GetAddonMgr().GetAddon(controllerId, addon, ADDON_GAME_CONTROLLER, false)) + if (CServiceBroker::GetAddonMgr().GetAddon(controllerId, addon, ADDON_GAME_CONTROLLER, + OnlyEnabled::NO)) cachedController = LoadController(addon); } diff --git a/xbmc/games/controllers/windows/GUIControllerWindow.cpp b/xbmc/games/controllers/windows/GUIControllerWindow.cpp index 026b63d9fa..a2096e271a 100644 --- a/xbmc/games/controllers/windows/GUIControllerWindow.cpp +++ b/xbmc/games/controllers/windows/GUIControllerWindow.cpp @@ -223,7 +223,7 @@ void CGUIControllerWindow::OnInitWindow(void) { ADDON::AddonPtr addon; if (CServiceBroker::GetAddonMgr().GetAddon(gameSettingsHandle->GameClientID(), addon, - ADDON::ADDON_GAMEDLL)) + ADDON::ADDON_GAMEDLL, ADDON::OnlyEnabled::YES)) gameClient = std::static_pointer_cast<CGameClient>(addon); } } diff --git a/xbmc/games/dialogs/osd/DialogGameAdvancedSettings.cpp b/xbmc/games/dialogs/osd/DialogGameAdvancedSettings.cpp index 9403e66e3c..5a035c622d 100644 --- a/xbmc/games/dialogs/osd/DialogGameAdvancedSettings.cpp +++ b/xbmc/games/dialogs/osd/DialogGameAdvancedSettings.cpp @@ -35,7 +35,7 @@ bool CDialogGameAdvancedSettings::OnMessage(CGUIMessage& message) { ADDON::AddonPtr addon; if (CServiceBroker::GetAddonMgr().GetAddon(gameSettingsHandle->GameClientID(), addon, - ADDON::ADDON_GAMEDLL)) + ADDON::ADDON_GAMEDLL, ADDON::OnlyEnabled::YES)) { gameSettingsHandle.reset(); CGUIDialogAddonSettings::ShowForAddon(addon); diff --git a/xbmc/guilib/GUIAudioManager.cpp b/xbmc/guilib/GUIAudioManager.cpp index e3fb16d024..0b2c793395 100644 --- a/xbmc/guilib/GUIAudioManager.cpp +++ b/xbmc/guilib/GUIAudioManager.cpp @@ -229,7 +229,8 @@ std::string GetSoundSkinPath() return ""; ADDON::AddonPtr addon; - if (!CServiceBroker::GetAddonMgr().GetAddon(value, addon, ADDON::ADDON_RESOURCE_UISOUNDS)) + if (!CServiceBroker::GetAddonMgr().GetAddon(value, addon, ADDON::ADDON_RESOURCE_UISOUNDS, + ADDON::OnlyEnabled::YES)) { CLog::Log(LOGINFO, "Unknown sounds addon '%s'. Setting default sounds.", value.c_str()); setting->Reset(); diff --git a/xbmc/guilib/guiinfo/AddonsGUIInfo.cpp b/xbmc/guilib/guiinfo/AddonsGUIInfo.cpp index e8af7ae1d6..28eb578024 100644 --- a/xbmc/guilib/guiinfo/AddonsGUIInfo.cpp +++ b/xbmc/guilib/guiinfo/AddonsGUIInfo.cpp @@ -154,7 +154,8 @@ bool CAddonsGUIInfo::GetLabel(std::string& value, const CFileItem *item, int con ADDON::AddonPtr addon; if (!info.GetData3().empty()) { - CServiceBroker::GetAddonMgr().GetAddon(info.GetData3(), addon, ADDON::ADDON_UNKNOWN, false); + CServiceBroker::GetAddonMgr().GetAddon(info.GetData3(), addon, ADDON::ADDON_UNKNOWN, + ADDON::OnlyEnabled::YES); if (!addon) break; @@ -203,7 +204,8 @@ bool CAddonsGUIInfo::GetBool(bool& value, const CGUIListItem *gitem, int context { value = false; ADDON::AddonPtr addon; - if (CServiceBroker::GetAddonMgr().GetAddon(info.GetData3(), addon)) + if (CServiceBroker::GetAddonMgr().GetAddon(info.GetData3(), addon, ADDON::ADDON_UNKNOWN, + ADDON::OnlyEnabled::YES)) value = !CServiceBroker::GetAddonMgr().IsAddonDisabled(info.GetData3()); return true; } diff --git a/xbmc/guilib/guiinfo/VisualisationGUIInfo.cpp b/xbmc/guilib/guiinfo/VisualisationGUIInfo.cpp index 7777d82c86..8400ad9860 100644 --- a/xbmc/guilib/guiinfo/VisualisationGUIInfo.cpp +++ b/xbmc/guilib/guiinfo/VisualisationGUIInfo.cpp @@ -54,7 +54,9 @@ bool CVisualisationGUIInfo::GetLabel(std::string& value, const CFileItem *item, { ADDON::AddonPtr addon; value = CServiceBroker::GetSettingsComponent()->GetSettings()->GetString(CSettings::SETTING_MUSICPLAYER_VISUALISATION); - if (CServiceBroker::GetAddonMgr().GetAddon(value, addon) && addon) + if (CServiceBroker::GetAddonMgr().GetAddon(value, addon, ADDON::ADDON_UNKNOWN, + ADDON::OnlyEnabled::YES) && + addon) { value = addon->Name(); return true; diff --git a/xbmc/interfaces/builtins/AddonBuiltins.cpp b/xbmc/interfaces/builtins/AddonBuiltins.cpp index f4739e8f61..f03a7182f1 100644 --- a/xbmc/interfaces/builtins/AddonBuiltins.cpp +++ b/xbmc/interfaces/builtins/AddonBuiltins.cpp @@ -70,7 +70,7 @@ static int EnableAddon(const std::vector<std::string>& params) return -1; AddonPtr addon; - if (!CServiceBroker::GetAddonMgr().GetAddon(addonid, addon, ADDON_UNKNOWN, false)) + if (!CServiceBroker::GetAddonMgr().GetAddon(addonid, addon, ADDON_UNKNOWN, OnlyEnabled::NO)) return -1; auto response = HELPERS::ShowYesNoDialogLines(CVariant{24076}, CVariant{24135}, CVariant{addon->Name()}, CVariant{24136}); @@ -117,7 +117,7 @@ static int RunAddon(const std::vector<std::string>& params) const std::string& addonid = params[0]; AddonPtr addon; - if (CServiceBroker::GetAddonMgr().GetAddon(addonid, addon, ADDON_PLUGIN)) + if (CServiceBroker::GetAddonMgr().GetAddon(addonid, addon, ADDON_PLUGIN, OnlyEnabled::YES)) { PluginPtr plugin = std::dynamic_pointer_cast<CPluginSource>(addon); std::string urlParameters; @@ -154,16 +154,21 @@ static int RunAddon(const std::vector<std::string>& params) cmd = StringUtils::Format("RunPlugin(%s)", StringUtils::Join(params, ",").c_str()); CBuiltins::GetInstance().Execute(cmd); } - else if (CServiceBroker::GetAddonMgr().GetAddon(addonid, addon, ADDON_SCRIPT) || - CServiceBroker::GetAddonMgr().GetAddon(addonid, addon, ADDON_SCRIPT_WEATHER) || - CServiceBroker::GetAddonMgr().GetAddon(addonid, addon, ADDON_SCRIPT_LYRICS) || - CServiceBroker::GetAddonMgr().GetAddon(addonid, addon, ADDON_SCRIPT_LIBRARY)) + else if (CServiceBroker::GetAddonMgr().GetAddon(addonid, addon, ADDON_SCRIPT, + OnlyEnabled::YES) || + CServiceBroker::GetAddonMgr().GetAddon(addonid, addon, ADDON_SCRIPT_WEATHER, + OnlyEnabled::YES) || + CServiceBroker::GetAddonMgr().GetAddon(addonid, addon, ADDON_SCRIPT_LYRICS, + OnlyEnabled::YES) || + CServiceBroker::GetAddonMgr().GetAddon(addonid, addon, ADDON_SCRIPT_LIBRARY, + OnlyEnabled::YES)) { // Pass the script name (addonid) and all the parameters // (params[1] ... params[x]) separated by a comma to RunScript CBuiltins::GetInstance().Execute(StringUtils::Format("RunScript(%s)", StringUtils::Join(params, ",").c_str())); } - else if (CServiceBroker::GetAddonMgr().GetAddon(addonid, addon, ADDON_GAMEDLL)) + else if (CServiceBroker::GetAddonMgr().GetAddon(addonid, addon, ADDON_GAMEDLL, + OnlyEnabled::YES)) { CFileItem item; @@ -222,20 +227,24 @@ static int RunScript(const std::vector<std::string>& params) AddonPtr addon; std::string scriptpath; // Test to see if the param is an addon ID - if (CServiceBroker::GetAddonMgr().GetAddon(params[0], addon)) + if (CServiceBroker::GetAddonMgr().GetAddon(params[0], addon, ADDON_UNKNOWN, OnlyEnabled::YES)) { //Get the correct extension point to run - if (CServiceBroker::GetAddonMgr().GetAddon(params[0], addon, ADDON_SCRIPT) || - CServiceBroker::GetAddonMgr().GetAddon(params[0], addon, ADDON_SCRIPT_WEATHER) || - CServiceBroker::GetAddonMgr().GetAddon(params[0], addon, ADDON_SCRIPT_LYRICS) || - CServiceBroker::GetAddonMgr().GetAddon(params[0], addon, ADDON_SCRIPT_LIBRARY)) + if (CServiceBroker::GetAddonMgr().GetAddon(params[0], addon, ADDON_SCRIPT, + OnlyEnabled::YES) || + CServiceBroker::GetAddonMgr().GetAddon(params[0], addon, ADDON_SCRIPT_WEATHER, + OnlyEnabled::YES) || + CServiceBroker::GetAddonMgr().GetAddon(params[0], addon, ADDON_SCRIPT_LYRICS, + OnlyEnabled::YES) || + CServiceBroker::GetAddonMgr().GetAddon(params[0], addon, ADDON_SCRIPT_LIBRARY, + OnlyEnabled::YES)) { scriptpath = addon->LibPath(); } else { //Run a random extension point (old behaviour). - CServiceBroker::GetAddonMgr().GetAddon(params[0], addon); + CServiceBroker::GetAddonMgr().GetAddon(params[0], addon, ADDON_UNKNOWN, OnlyEnabled::YES); scriptpath = addon->LibPath(); CLog::Log(LOGWARNING, "RunScript called for a non-script addon '%s'. This behaviour is deprecated.", params[0].c_str()); } @@ -303,7 +312,7 @@ static int SetDefaultAddon(const std::vector<std::string>& params) static int AddonSettings(const std::vector<std::string>& params) { AddonPtr addon; - if (CServiceBroker::GetAddonMgr().GetAddon(params[0], addon)) + if (CServiceBroker::GetAddonMgr().GetAddon(params[0], addon, ADDON_UNKNOWN, OnlyEnabled::YES)) CGUIDialogAddonSettings::ShowForAddon(addon); return 0; @@ -331,7 +340,7 @@ static int StopScript(const std::vector<std::string>& params) std::string scriptpath(params[0]); // Test to see if the param is an addon ID AddonPtr script; - if (CServiceBroker::GetAddonMgr().GetAddon(params[0], script)) + if (CServiceBroker::GetAddonMgr().GetAddon(params[0], script, ADDON_UNKNOWN, OnlyEnabled::YES)) scriptpath = script->LibPath(); CScriptInvocationManager::GetInstance().Stop(scriptpath); diff --git a/xbmc/interfaces/json-rpc/AddonsOperations.cpp b/xbmc/interfaces/json-rpc/AddonsOperations.cpp index e9010032a9..2c1e4f40f1 100644 --- a/xbmc/interfaces/json-rpc/AddonsOperations.cpp +++ b/xbmc/interfaces/json-rpc/AddonsOperations.cpp @@ -131,8 +131,8 @@ JSONRPC_STATUS CAddonsOperations::GetAddonDetails(const std::string &method, ITr { std::string id = parameterObject["addonid"].asString(); AddonPtr addon; - if (!CServiceBroker::GetAddonMgr().GetAddon(id, addon, ADDON::ADDON_UNKNOWN, false) || addon.get() == NULL || - addon->Type() <= ADDON_UNKNOWN || addon->Type() >= ADDON_MAX) + if (!CServiceBroker::GetAddonMgr().GetAddon(id, addon, ADDON::ADDON_UNKNOWN, OnlyEnabled::NO) || + addon.get() == NULL || addon->Type() <= ADDON_UNKNOWN || addon->Type() >= ADDON_MAX) return InvalidParams; CAddonDatabase addondb; @@ -145,8 +145,8 @@ JSONRPC_STATUS CAddonsOperations::SetAddonEnabled(const std::string &method, ITr { std::string id = parameterObject["addonid"].asString(); AddonPtr addon; - if (!CServiceBroker::GetAddonMgr().GetAddon(id, addon, ADDON::ADDON_UNKNOWN, false) || addon == nullptr || - addon->Type() <= ADDON_UNKNOWN || addon->Type() >= ADDON_MAX) + if (!CServiceBroker::GetAddonMgr().GetAddon(id, addon, ADDON::ADDON_UNKNOWN, OnlyEnabled::NO) || + addon == nullptr || addon->Type() <= ADDON_UNKNOWN || addon->Type() >= ADDON_MAX) return InvalidParams; bool disabled = false; @@ -178,8 +178,8 @@ JSONRPC_STATUS CAddonsOperations::ExecuteAddon(const std::string &method, ITrans { std::string id = parameterObject["addonid"].asString(); AddonPtr addon; - if (!CServiceBroker::GetAddonMgr().GetAddon(id, addon) || addon.get() == NULL || - addon->Type() < ADDON_VIZ || addon->Type() >= ADDON_MAX) + if (!CServiceBroker::GetAddonMgr().GetAddon(id, addon, ADDON_UNKNOWN, OnlyEnabled::YES) || + addon.get() == NULL || addon->Type() < ADDON_VIZ || addon->Type() >= ADDON_MAX) return InvalidParams; std::string argv; diff --git a/xbmc/interfaces/json-rpc/GUIOperations.cpp b/xbmc/interfaces/json-rpc/GUIOperations.cpp index 9c24013d74..407489323d 100644 --- a/xbmc/interfaces/json-rpc/GUIOperations.cpp +++ b/xbmc/interfaces/json-rpc/GUIOperations.cpp @@ -136,7 +136,7 @@ JSONRPC_STATUS CGUIOperations::GetPropertyValue(const std::string &property, CVa { std::string skinId = CServiceBroker::GetSettingsComponent()->GetSettings()->GetString(CSettings::SETTING_LOOKANDFEEL_SKIN); AddonPtr addon; - if (!CServiceBroker::GetAddonMgr().GetAddon(skinId, addon, ADDON_SKIN)) + if (!CServiceBroker::GetAddonMgr().GetAddon(skinId, addon, ADDON_SKIN, OnlyEnabled::YES)) return InternalError; result["id"] = skinId; diff --git a/xbmc/interfaces/json-rpc/schema/types.json b/xbmc/interfaces/json-rpc/schema/types.json index c4d40317e1..29dc585108 100644 --- a/xbmc/interfaces/json-rpc/schema/types.json +++ b/xbmc/interfaces/json-rpc/schema/types.json @@ -25,8 +25,9 @@ }, "Global.Time": { "type": "object", + "description": "A duration.", "properties": { - "hours": { "type": "integer", "required": true, "minimum": 0, "maximum": 23 }, + "hours": { "type": "integer", "required": true, "minimum": 0 }, "minutes": { "type": "integer", "required": true, "minimum": 0, "maximum": 59 }, "seconds": { "type": "integer", "required": true, "minimum": 0, "maximum": 59 }, "milliseconds": { "type": "integer", "required": true, "minimum": 0, "maximum": 999 } @@ -180,9 +181,10 @@ }, "Player.Position.Time": { "type": "object", + "description": "A position in duration.", "additionalProperties": false, "properties": { - "hours": { "type": "integer", "minimum": 0, "maximum": 23, "default": 0 }, + "hours": { "type": "integer", "minimum": 0, "default": 0 }, "minutes": { "type": "integer", "minimum": 0, "maximum": 59, "default": 0 }, "seconds": { "type": "integer", "minimum": 0, "maximum": 59, "default": 0 }, "milliseconds": { "type": "integer", "minimum": 0, "maximum": 999, "default": 0 } diff --git a/xbmc/interfaces/json-rpc/schema/version.txt b/xbmc/interfaces/json-rpc/schema/version.txt index ad71274949..74c82f7af3 100644 --- a/xbmc/interfaces/json-rpc/schema/version.txt +++ b/xbmc/interfaces/json-rpc/schema/version.txt @@ -1 +1 @@ -JSONRPC_VERSION 11.19.2 +JSONRPC_VERSION 11.20.0 diff --git a/xbmc/interfaces/legacy/Addon.cpp b/xbmc/interfaces/legacy/Addon.cpp index d44a2372cb..7ac86b891d 100644 --- a/xbmc/interfaces/legacy/Addon.cpp +++ b/xbmc/interfaces/legacy/Addon.cpp @@ -61,7 +61,8 @@ namespace XBMCAddon if (id.empty()) throw AddonException("No valid addon id could be obtained. None was passed and the script wasn't executed in a normal xbmc manner."); - if (!CServiceBroker::GetAddonMgr().GetAddon(id.c_str(), pAddon)) + if (!CServiceBroker::GetAddonMgr().GetAddon(id.c_str(), pAddon, ADDON_UNKNOWN, + OnlyEnabled::YES)) throw AddonException("Unknown addon id '%s'.", id.c_str()); CServiceBroker::GetAddonMgr().AddToUpdateableAddons(pAddon); diff --git a/xbmc/interfaces/python/PythonInvoker.cpp b/xbmc/interfaces/python/PythonInvoker.cpp index 30d095a20e..88d4571894 100644 --- a/xbmc/interfaces/python/PythonInvoker.cpp +++ b/xbmc/interfaces/python/PythonInvoker.cpp @@ -725,7 +725,8 @@ void CPythonInvoker::getAddonModuleDeps(const ADDON::AddonPtr& addon, std::set<s { //Check if dependency is a module addon ADDON::AddonPtr dependency; - if (CServiceBroker::GetAddonMgr().GetAddon(it.id, dependency, ADDON::ADDON_SCRIPT_MODULE)) + if (CServiceBroker::GetAddonMgr().GetAddon(it.id, dependency, ADDON::ADDON_SCRIPT_MODULE, + ADDON::OnlyEnabled::YES)) { std::string path = CSpecialProtocol::TranslatePath(dependency->LibPath()); if (paths.find(path) == paths.end()) diff --git a/xbmc/music/MusicDatabase.cpp b/xbmc/music/MusicDatabase.cpp index 76e5eeb2a2..ddea303cdc 100644 --- a/xbmc/music/MusicDatabase.cpp +++ b/xbmc/music/MusicDatabase.cpp @@ -10895,7 +10895,10 @@ bool CMusicDatabase::GetScraper(int id, const CONTENT_TYPE &content, ADDON::Scra // Use pre configured or default scraper ADDON::AddonPtr addon; - if (!scraperUUID.empty() && CServiceBroker::GetAddonMgr().GetAddon(scraperUUID, addon) && addon) + if (!scraperUUID.empty() && + CServiceBroker::GetAddonMgr().GetAddon(scraperUUID, addon, ADDON::ADDON_UNKNOWN, + ADDON::OnlyEnabled::YES) && + addon) { scraper = std::dynamic_pointer_cast<ADDON::CScraper>(addon); if (scraper) diff --git a/xbmc/music/dialogs/GUIDialogInfoProviderSettings.cpp b/xbmc/music/dialogs/GUIDialogInfoProviderSettings.cpp index b5964cc43d..8f63fc66ef 100644 --- a/xbmc/music/dialogs/GUIDialogInfoProviderSettings.cpp +++ b/xbmc/music/dialogs/GUIDialogInfoProviderSettings.cpp @@ -179,7 +179,8 @@ void CGUIDialogInfoProviderSettings::OnSettingAction(const std::shared_ptr<const && selectedAddonId != currentScraperId) { AddonPtr scraperAddon; - CServiceBroker::GetAddonMgr().GetAddon(selectedAddonId, scraperAddon); + CServiceBroker::GetAddonMgr().GetAddon(selectedAddonId, scraperAddon, ADDON_UNKNOWN, + OnlyEnabled::YES); m_albumscraper = std::dynamic_pointer_cast<CScraper>(scraperAddon); SetupView(); SetFocus(settingId); @@ -196,7 +197,8 @@ void CGUIDialogInfoProviderSettings::OnSettingAction(const std::shared_ptr<const && selectedAddonId != currentScraperId) { AddonPtr scraperAddon; - CServiceBroker::GetAddonMgr().GetAddon(selectedAddonId, scraperAddon); + CServiceBroker::GetAddonMgr().GetAddon(selectedAddonId, scraperAddon, ADDON_UNKNOWN, + OnlyEnabled::YES); m_artistscraper = std::dynamic_pointer_cast<CScraper>(scraperAddon); SetupView(); SetFocus(settingId); diff --git a/xbmc/music/windows/GUIWindowMusicPlaylistEditor.cpp b/xbmc/music/windows/GUIWindowMusicPlaylistEditor.cpp index aa3206e6fd..b017b873f9 100644 --- a/xbmc/music/windows/GUIWindowMusicPlaylistEditor.cpp +++ b/xbmc/music/windows/GUIWindowMusicPlaylistEditor.cpp @@ -53,6 +53,19 @@ bool CGUIWindowMusicPlaylistEditor::OnBack(int actionID) return CGUIWindowMusicBase::OnBack(actionID); } +bool CGUIWindowMusicPlaylistEditor::OnAction(const CAction &action) +{ + if (action.GetID() == ACTION_CONTEXT_MENU) + { + if (GetFocusedControlID() == CONTROL_PLAYLIST) + { + OnPlaylistContext(); + return true; + } + } + return CGUIWindow::OnAction(action); +} + bool CGUIWindowMusicPlaylistEditor::OnMessage(CGUIMessage& message) { switch ( message.GetMessage() ) @@ -90,16 +103,9 @@ bool CGUIWindowMusicPlaylistEditor::OnMessage(CGUIMessage& message) int control = message.GetSenderId(); if (control == CONTROL_PLAYLIST) { - int item = GetCurrentPlaylistItem(); int action = message.GetParam1(); if (action == ACTION_CONTEXT_MENU || action == ACTION_MOUSE_RIGHT_CLICK) OnPlaylistContext(); - else if (action == ACTION_QUEUE_ITEM || action == ACTION_DELETE_ITEM || action == ACTION_MOUSE_MIDDLE_CLICK) - OnDeletePlaylistItem(item); - else if (action == ACTION_MOVE_ITEM_UP) - OnMovePlaylistItem(item, -1); - else if (action == ACTION_MOVE_ITEM_DOWN) - OnMovePlaylistItem(item, 1); return true; } else if (control == CONTROL_LOAD_PLAYLIST) @@ -129,7 +135,7 @@ bool CGUIWindowMusicPlaylistEditor::GetDirectory(const std::string &strDirectory items.Clear(); if (strDirectory.empty()) { // root listing - list files:// and musicdb:// - CFileItemPtr files(new CFileItem("files://", true)); + CFileItemPtr files(new CFileItem("sources://music/", true)); files->SetLabel(g_localizeStrings.Get(744)); files->SetLabelPreformatted(true); files->m_bIsShareOrDrive = true; @@ -294,41 +300,10 @@ void CGUIWindowMusicPlaylistEditor::GetContextButtons(int itemNumber, CContextBu if (itemNumber >= 0 && itemNumber < m_vecItems->Size()) item = m_vecItems->Get(itemNumber); - if (GetFocusedControlID() == CONTROL_PLAYLIST) - { - int playlistItem = GetCurrentPlaylistItem(); - if (playlistItem > 0) - buttons.Add(CONTEXT_BUTTON_MOVE_ITEM_UP, 13332); - if (playlistItem >= 0 && playlistItem < m_playlist->Size()) - buttons.Add(CONTEXT_BUTTON_MOVE_ITEM_DOWN, 13333); - if (playlistItem >= 0) - buttons.Add(CONTEXT_BUTTON_DELETE, 1210); - } - else if (item && !item->IsParentFolder() && !m_vecItems->IsVirtualDirectoryRoot()) + if (item && !item->IsParentFolder() && !m_vecItems->IsVirtualDirectoryRoot()) buttons.Add(CONTEXT_BUTTON_QUEUE_ITEM, 15019); } -bool CGUIWindowMusicPlaylistEditor::OnContextButton(int itemNumber, CONTEXT_BUTTON button) -{ - switch (button) - { - case CONTEXT_BUTTON_MOVE_ITEM_UP: - OnMovePlaylistItem(GetCurrentPlaylistItem(), -1); - return true; - - case CONTEXT_BUTTON_MOVE_ITEM_DOWN: - OnMovePlaylistItem(GetCurrentPlaylistItem(), 1); - return true; - - case CONTEXT_BUTTON_DELETE: - OnDeletePlaylistItem(GetCurrentPlaylistItem()); - return true; - default: - break; - } - return CGUIWindowMusicBase::OnContextButton(itemNumber, button); -} - void CGUIWindowMusicPlaylistEditor::OnLoadPlaylist() { // prompt user for file to load @@ -396,8 +371,19 @@ void CGUIWindowMusicPlaylistEditor::AppendToPlaylist(CFileItemList &newItems) void CGUIWindowMusicPlaylistEditor::OnPlaylistContext() { int item = GetCurrentPlaylistItem(); + CContextButtons buttons; + if (item > 0) + buttons.Add(CONTEXT_BUTTON_MOVE_ITEM_UP, 13332); + if (item >= 0 && item < m_playlist->Size() - 1) + buttons.Add(CONTEXT_BUTTON_MOVE_ITEM_DOWN, 13333); if (item >= 0) - m_playlist->Get(item)->Select(true); - if (!OnPopupMenu(-1) && item >= 0 && item < m_playlist->Size()) - m_playlist->Get(item)->Select(false); + buttons.Add(CONTEXT_BUTTON_DELETE, 1210); + + int btnid = CGUIDialogContextMenu::ShowAndGetChoice(buttons); + if (btnid == CONTEXT_BUTTON_MOVE_ITEM_UP) + OnMovePlaylistItem(item, -1); + else if (btnid == CONTEXT_BUTTON_MOVE_ITEM_DOWN) + OnMovePlaylistItem(item, 1); + else if (btnid == CONTEXT_BUTTON_DELETE) + OnDeletePlaylistItem(item); } diff --git a/xbmc/music/windows/GUIWindowMusicPlaylistEditor.h b/xbmc/music/windows/GUIWindowMusicPlaylistEditor.h index 97f27a0242..6644cf1346 100644 --- a/xbmc/music/windows/GUIWindowMusicPlaylistEditor.h +++ b/xbmc/music/windows/GUIWindowMusicPlaylistEditor.h @@ -19,6 +19,7 @@ public: ~CGUIWindowMusicPlaylistEditor(void) override; bool OnMessage(CGUIMessage& message) override; + bool OnAction(const CAction &action) override; bool OnBack(int actionID) override; protected: @@ -27,7 +28,6 @@ protected: bool Update(const std::string &strDirectory, bool updateFilterPath = true) override; void OnPrepareFileItems(CFileItemList &items) override; void GetContextButtons(int itemNumber, CContextButtons &buttons) override; - bool OnContextButton(int itemNumber, CONTEXT_BUTTON button) override; void OnQueueItem(int iItem, bool) override; std::string GetStartFolder(const std::string &dir) override { return ""; }; diff --git a/xbmc/network/httprequesthandler/HTTPWebinterfaceHandler.cpp b/xbmc/network/httprequesthandler/HTTPWebinterfaceHandler.cpp index a142111b74..8e5f4f692e 100644 --- a/xbmc/network/httprequesthandler/HTTPWebinterfaceHandler.cpp +++ b/xbmc/network/httprequesthandler/HTTPWebinterfaceHandler.cpp @@ -90,7 +90,9 @@ bool CHTTPWebinterfaceHandler::ResolveAddon(const std::string &url, ADDON::Addon if (components.size() <= 1) return false; - if (!CServiceBroker::GetAddonMgr().GetAddon(components.at(1), addon) || addon == NULL) + if (!CServiceBroker::GetAddonMgr().GetAddon(components.at(1), addon, ADDON::ADDON_UNKNOWN, + ADDON::OnlyEnabled::YES) || + addon == NULL) return false; addonPath = addon->Path(); diff --git a/xbmc/peripherals/Peripherals.cpp b/xbmc/peripherals/Peripherals.cpp index 7101798981..7062abfe8f 100644 --- a/xbmc/peripherals/Peripherals.cpp +++ b/xbmc/peripherals/Peripherals.cpp @@ -979,7 +979,8 @@ void CPeripherals::OnSettingAction(const std::shared_ptr<const CSetting>& settin !strAddonId.empty()) { ADDON::AddonPtr addon; - if (CServiceBroker::GetAddonMgr().GetAddon(strAddonId, addon)) + if (CServiceBroker::GetAddonMgr().GetAddon(strAddonId, addon, ADDON::ADDON_UNKNOWN, + ADDON::OnlyEnabled::YES)) CGUIDialogAddonSettings::ShowForAddon(addon); } } diff --git a/xbmc/platform/darwin/ios-common/DarwinEmbedKeyboard.mm b/xbmc/platform/darwin/ios-common/DarwinEmbedKeyboard.mm index f40684bb90..04c0374680 100644 --- a/xbmc/platform/darwin/ios-common/DarwinEmbedKeyboard.mm +++ b/xbmc/platform/darwin/ios-common/DarwinEmbedKeyboard.mm @@ -124,8 +124,11 @@ void CDarwinEmbedKeyboard::invalidateCallback() bool CDarwinEmbedKeyboard::hasExternalKeyboard() { #if defined(TARGET_DARWIN_IOS) + // @todo: use @available after switching to iOS 14 SDK or later + if (auto keyboardClassIOS14 = NSClassFromString(@"GCKeyboard")) + return [keyboardClassIOS14 performSelector:@selector(coalescedKeyboard)] != nil; + // https://stackoverflow.com/questions/31991873/how-to-reliably-detect-if-an-external-keyboard-is-connected-on-ios-9 - // @todo: use public API when it appears const auto keyboardClassStr = "UIKeyboardImpl"; auto keyboardClass = NSClassFromString(@(keyboardClassStr)); if (!keyboardClass) diff --git a/xbmc/platform/darwin/tvos/XBMCController.h b/xbmc/platform/darwin/tvos/XBMCController.h index 85f2db72cc..ec26fb3d72 100644 --- a/xbmc/platform/darwin/tvos/XBMCController.h +++ b/xbmc/platform/darwin/tvos/XBMCController.h @@ -24,8 +24,7 @@ class CFileItem; @interface XBMCController : UIViewController { BOOL m_isPlayingBeforeInactive; - UIBackgroundTaskIdentifier m_bgTask; - BOOL m_bgTaskActive; + UIBackgroundTaskIdentifier m_enterBackgroundTaskId; bool m_nativeKeyboardActive; BOOL m_pause; BOOL m_animating; @@ -54,8 +53,8 @@ class CFileItem; - (void)deactivateKeyboard:(UIView*)view; - (void)nativeKeyboardActive:(bool)active; -- (UIBackgroundTaskIdentifier)enableBackGroundTask; -- (void)disableBackGroundTask:(UIBackgroundTaskIdentifier)bgTaskID; +- (void)beginEnterBackgroundTask; +- (void)endEnterBackgroundTask; - (void)disableScreenSaver; - (void)enableScreenSaver; diff --git a/xbmc/platform/darwin/tvos/XBMCController.mm b/xbmc/platform/darwin/tvos/XBMCController.mm index 998f9f5ff7..5eb73951b7 100644 --- a/xbmc/platform/darwin/tvos/XBMCController.mm +++ b/xbmc/platform/darwin/tvos/XBMCController.mm @@ -174,20 +174,22 @@ XBMCController* g_xbmcController; #pragma mark - BackgroundTask -- (UIBackgroundTaskIdentifier)enableBackGroundTask; +- (void)beginEnterBackgroundTask; { - CLog::Log(LOGDEBUG, "%s: enableBackgroundTask created", __PRETTY_FUNCTION__); + CLog::Log(LOGDEBUG, "%s", __PRETTY_FUNCTION__); // we have to alloc the background task for keep network working after screen lock and dark. - return [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:nil]; + if (m_enterBackgroundTaskId == UIBackgroundTaskInvalid) + m_enterBackgroundTaskId = + [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:nil]; } -- (void)disableBackGroundTask:(UIBackgroundTaskIdentifier)bgTaskID; +- (void)endEnterBackgroundTask; { - if (bgTaskID != UIBackgroundTaskInvalid) + CLog::Log(LOGDEBUG, "%s", __PRETTY_FUNCTION__); + if (m_enterBackgroundTaskId != UIBackgroundTaskInvalid) { - CLog::Log(LOGDEBUG, "%s: endBackgroundTask closed", __PRETTY_FUNCTION__); - [[UIApplication sharedApplication] endBackgroundTask:bgTaskID]; - bgTaskID = UIBackgroundTaskInvalid; + [[UIApplication sharedApplication] endBackgroundTask:m_enterBackgroundTaskId]; + m_enterBackgroundTaskId = UIBackgroundTaskInvalid; } } @@ -196,22 +198,19 @@ XBMCController* g_xbmcController; - (void)enterBackground { CLog::Log(LOGDEBUG, "%s", __PRETTY_FUNCTION__); - - m_bgTask = [self enableBackGroundTask]; - m_bgTaskActive = YES; + [self beginEnterBackgroundTask]; // We need this hack, without it we stay stuck forever in // CPowerManager::OnSleep() // CApplication::StopPlaying() // CGUIWindowManager::ProcessRenderLoop + //TODO: Understand why we need this hack and fix the bug to remove this hack if (CServiceBroker::GetGUI()->GetWindowManager().GetActiveWindow() == WINDOW_SLIDESHOW || CServiceBroker::GetGUI()->GetWindowManager().GetActiveWindow() == WINDOW_FULLSCREEN_VIDEO || CServiceBroker::GetGUI()->GetWindowManager().GetActiveWindow() == WINDOW_FULLSCREEN_GAME || CServiceBroker::GetGUI()->GetWindowManager().GetActiveWindow() == WINDOW_VISUALISATION) CServiceBroker::GetGUI()->GetWindowManager().PreviousWindow(); - CServiceBroker::GetNetwork().GetServices().Stop(true); - dynamic_cast<CTVOSPowerSyscall*>(CServiceBroker::GetPowerManager().GetPowerSyscall()) ->SetOnPause(); CServiceBroker::GetPowerManager().ProcessEvents(); @@ -219,41 +218,23 @@ XBMCController* g_xbmcController; CWinSystemTVOS* winSystem = dynamic_cast<CWinSystemTVOS*>(CServiceBroker::GetWinSystem()); winSystem->OnAppFocusChange(false); - m_bgTaskActive = NO; - [self disableBackGroundTask:m_bgTask]; + CServiceBroker::GetNetwork().GetServices().Stop(true); + + [self endEnterBackgroundTask]; } - (void)enterForeground { CLog::Log(LOGDEBUG, "%s", __PRETTY_FUNCTION__); - // stop background task (if running) - if (m_bgTaskActive) + + // If enterBackground task is still running, wait + while (m_enterBackgroundTaskId != UIBackgroundTaskInvalid) { - CLog::Log(LOGDEBUG, "%s: bgTask already running, closing", __PRETTY_FUNCTION__); - [self disableBackGroundTask:m_bgTask]; + CLog::Log(LOGDEBUG, "%s: enterBackground task still running, wait", __PRETTY_FUNCTION__); + usleep(50 * 1000); } - [NSThread detachNewThreadSelector:@selector(enterForegroundDelayed:) - toTarget:self - withObject:nil]; -} - -- (void)enterForegroundDelayed:(id)arg -{ - - __block BOOL appstate = YES; - dispatch_async(dispatch_get_main_queue(), ^{ - if ([UIApplication sharedApplication].applicationState != UIApplicationStateActive) - appstate = NO; - }); - - if (!appstate) - return; - - // g_application.IsInitialized is only true if - // we were running and got moved to background - while (!g_application.IsInitialized()) - usleep(50 * 1000); + CServiceBroker::GetNetwork().GetServices().Start(); CWinSystemTVOS* winSystem = dynamic_cast<CWinSystemTVOS*>(CServiceBroker::GetWinSystem()); winSystem->OnAppFocusChange(true); @@ -261,7 +242,6 @@ XBMCController* g_xbmcController; dynamic_cast<CTVOSPowerSyscall*>(CServiceBroker::GetPowerManager().GetPowerSyscall()) ->SetOnResume(); CServiceBroker::GetPowerManager().ProcessEvents(); - CServiceBroker::GetNetwork().GetServices().Start(); // this handles what to do if we got pushed // into foreground by a topshelf item select/play @@ -492,7 +472,7 @@ int KODI_Run(bool renderGUI) { [displayManager removeModeSwitchObserver]; // stop background task (if running) - [self disableBackGroundTask:m_bgTask]; + [self endEnterBackgroundTask]; [self stopAnimation]; } @@ -508,8 +488,7 @@ int KODI_Run(bool renderGUI) m_animating = NO; m_isPlayingBeforeInactive = NO; - m_bgTaskActive = NO; - m_bgTask = UIBackgroundTaskInvalid; + m_enterBackgroundTaskId = UIBackgroundTaskInvalid; [self enableScreenSaver]; diff --git a/xbmc/platform/win32/pch.h b/xbmc/platform/win32/pch.h index dce2b191f4..8f56c347d1 100644 --- a/xbmc/platform/win32/pch.h +++ b/xbmc/platform/win32/pch.h @@ -20,6 +20,11 @@ #include <string> #include <vector> +// workaround for broken [[deprecated]] in coverity +#if defined(__COVERITY__) +#undef FMT_DEPRECATED +#define FMT_DEPRECATED +#endif #include <fmt/core.h> #include <fmt/format.h> // 53 seconds #include <intrin.h> // 97 seconds diff --git a/xbmc/rendering/dx/DeviceResources.cpp b/xbmc/rendering/dx/DeviceResources.cpp index d2a949f10f..b66078e475 100644 --- a/xbmc/rendering/dx/DeviceResources.cpp +++ b/xbmc/rendering/dx/DeviceResources.cpp @@ -80,6 +80,7 @@ DX::DeviceResources::DeviceResources() , m_deviceNotify(nullptr) , m_stereoEnabled(false) , m_bDeviceCreated(false) + , m_IsHDROutput(false) { } diff --git a/xbmc/settings/MediaSettings.cpp b/xbmc/settings/MediaSettings.cpp index 37d653e999..811fee6013 100644 --- a/xbmc/settings/MediaSettings.cpp +++ b/xbmc/settings/MediaSettings.cpp @@ -114,7 +114,6 @@ bool CMediaSettings::Load(const TiXmlNode *settings) m_defaultVideoSettings.m_StereoMode = 0; if (!XMLUtils::GetInt(pElement, "centermixlevel", m_defaultVideoSettings.m_CenterMixLevel)) m_defaultVideoSettings.m_CenterMixLevel = 0; - m_defaultVideoSettings.m_SubtitleCached = false; if (!XMLUtils::GetInt(pElement, "tonemapmethod", m_defaultVideoSettings.m_ToneMapMethod)) m_defaultVideoSettings.m_ToneMapMethod = VS_TONEMAPMETHOD_REINHARD; if (!XMLUtils::GetFloat(pElement, "tonemapparam", m_defaultVideoSettings.m_ToneMapParam, 0.1f, 5.0f)) diff --git a/xbmc/settings/SettingConditions.cpp b/xbmc/settings/SettingConditions.cpp index f4c8f7dbeb..5f6c6ae4d9 100644 --- a/xbmc/settings/SettingConditions.cpp +++ b/xbmc/settings/SettingConditions.cpp @@ -41,7 +41,9 @@ bool AddonHasSettings(const std::string& condition, return false; ADDON::AddonPtr addon; - if (!CServiceBroker::GetAddonMgr().GetAddon(settingAddon->GetValue(), addon, settingAddon->GetAddonType()) || addon == NULL) + if (!CServiceBroker::GetAddonMgr().GetAddon( + settingAddon->GetValue(), addon, settingAddon->GetAddonType(), ADDON::OnlyEnabled::YES) || + addon == NULL) return false; if (addon->Type() == ADDON::ADDON_SKIN) diff --git a/xbmc/settings/dialogs/GUIDialogContentSettings.cpp b/xbmc/settings/dialogs/GUIDialogContentSettings.cpp index 7897754874..898c5c36a5 100644 --- a/xbmc/settings/dialogs/GUIDialogContentSettings.cpp +++ b/xbmc/settings/dialogs/GUIDialogContentSettings.cpp @@ -248,7 +248,8 @@ void CGUIDialogContentSettings::OnSettingAction(const std::shared_ptr<const CSet && selectedAddonId != currentScraperId) { AddonPtr scraperAddon; - CServiceBroker::GetAddonMgr().GetAddon(selectedAddonId, scraperAddon); + CServiceBroker::GetAddonMgr().GetAddon(selectedAddonId, scraperAddon, ADDON::ADDON_UNKNOWN, + ADDON::OnlyEnabled::YES); m_scraper = std::dynamic_pointer_cast<CScraper>(scraperAddon); SetupView(); diff --git a/xbmc/settings/windows/GUIControlSettings.cpp b/xbmc/settings/windows/GUIControlSettings.cpp index dc807bb338..c4b1e5e6ef 100644 --- a/xbmc/settings/windows/GUIControlSettings.cpp +++ b/xbmc/settings/windows/GUIControlSettings.cpp @@ -1028,7 +1028,8 @@ void CGUIControlButtonSetting::Update(bool fromControl, bool updateDisplayOnly) for (const auto& addonID : addonIDs) { ADDON::AddonPtr addon; - if (CServiceBroker::GetAddonMgr().GetAddon(addonID, addon)) + if (CServiceBroker::GetAddonMgr().GetAddon(addonID, addon, ADDON::ADDON_UNKNOWN, + ADDON::OnlyEnabled::YES)) addonNames.push_back(addon->Name()); } diff --git a/xbmc/utils/ContentUtils.cpp b/xbmc/utils/ContentUtils.cpp index 87737de44c..deda908041 100644 --- a/xbmc/utils/ContentUtils.cpp +++ b/xbmc/utils/ContentUtils.cpp @@ -21,7 +21,7 @@ const bool HasPreferredArtType(const CFileItem& item) item.GetVideoInfoTag()->m_type == MediaTypeVideoCollection); } -const std::string GetPreferredArtType(MediaType type) +std::string GetPreferredArtType(const MediaType& type) { if (type == MediaTypeMovie || type == MediaTypeTvShow || type == MediaTypeSeason || type == MediaTypeVideoCollection) diff --git a/xbmc/utils/RssManager.cpp b/xbmc/utils/RssManager.cpp index 67b8f78ba9..4c2a2f06b3 100644 --- a/xbmc/utils/RssManager.cpp +++ b/xbmc/utils/RssManager.cpp @@ -65,7 +65,8 @@ void CRssManager::OnSettingAction(const std::shared_ptr<const CSetting>& setting if (settingId == CSettings::SETTING_LOOKANDFEEL_RSSEDIT) { ADDON::AddonPtr addon; - if (!CServiceBroker::GetAddonMgr().GetAddon("script.rss.editor", addon)) + if (!CServiceBroker::GetAddonMgr().GetAddon("script.rss.editor", addon, ADDON::ADDON_UNKNOWN, + ADDON::OnlyEnabled::YES)) { if (!ADDON::CAddonInstaller::GetInstance().InstallModal("script.rss.editor", addon, ADDON::InstallModalPrompt::PROMPT)) diff --git a/xbmc/utils/StringUtils.h b/xbmc/utils/StringUtils.h index c3c93c0357..ca6f82953d 100644 --- a/xbmc/utils/StringUtils.h +++ b/xbmc/utils/StringUtils.h @@ -26,7 +26,7 @@ #include <sstream> #include <locale> -// workaround for broken [[depreciated]] in coverity +// workaround for broken [[deprecated]] in coverity #if defined(__COVERITY__) #undef FMT_DEPRECATED #define FMT_DEPRECATED diff --git a/xbmc/video/VideoDatabase.cpp b/xbmc/video/VideoDatabase.cpp index 862b4874e2..89bdbb054e 100644 --- a/xbmc/video/VideoDatabase.cpp +++ b/xbmc/video/VideoDatabase.cpp @@ -4462,7 +4462,6 @@ bool CVideoDatabase::GetVideoSettings(int idFile, CVideoSettings &settings) settings.m_ScalingMethod = (ESCALINGMETHOD)m_pDS->fv("ScalingMethod").get_asInt(); settings.m_StereoMode = m_pDS->fv("StereoMode").get_asInt(); settings.m_StereoInvert = m_pDS->fv("StereoInvert").get_asBool(); - settings.m_SubtitleCached = false; settings.m_VideoStream = m_pDS->fv("VideoStream").get_asInt(); settings.m_ToneMapMethod = m_pDS->fv("TonemapMethod").get_asInt(); settings.m_ToneMapParam = m_pDS->fv("TonemapParam").get_asFloat(); @@ -7926,7 +7925,9 @@ ScraperPtr CVideoDatabase::GetScraperForPath(const std::string& strPath, SScanSe std::string scraperID = m_pDS->fv("path.strScraper").get_asString(); AddonPtr addon; - if (!scraperID.empty() && CServiceBroker::GetAddonMgr().GetAddon(scraperID, addon)) + if (!scraperID.empty() && + CServiceBroker::GetAddonMgr().GetAddon(scraperID, addon, ADDON::ADDON_UNKNOWN, + ADDON::OnlyEnabled::YES)) { scraper = std::dynamic_pointer_cast<CScraper>(addon); if (!scraper) @@ -7972,8 +7973,9 @@ ScraperPtr CVideoDatabase::GetScraperForPath(const std::string& strPath, SScanSe content = TranslateContent(strcontent); AddonPtr addon; - if (content != CONTENT_NONE && - CServiceBroker::GetAddonMgr().GetAddon(m_pDS->fv("path.strScraper").get_asString(), addon)) + if (content != CONTENT_NONE && CServiceBroker::GetAddonMgr().GetAddon( + m_pDS->fv("path.strScraper").get_asString(), addon, + ADDON::ADDON_UNKNOWN, ADDON::OnlyEnabled::YES)) { scraper = std::dynamic_pointer_cast<CScraper>(addon); scraper->SetPathSettings(content, m_pDS->fv("path.strSettings").get_asString()); @@ -10251,7 +10253,8 @@ void CVideoDatabase::ImportFromXML(const std::string &path) AddonPtr addon; std::string id; XMLUtils::GetString(path,"scraperpath",id); - if (CServiceBroker::GetAddonMgr().GetAddon(id, addon)) + if (CServiceBroker::GetAddonMgr().GetAddon(id, addon, ADDON::ADDON_UNKNOWN, + ADDON::OnlyEnabled::YES)) { SScanSettings settings; ScraperPtr scraper = std::dynamic_pointer_cast<CScraper>(addon); diff --git a/xbmc/view/GUIViewState.cpp b/xbmc/view/GUIViewState.cpp index 9267cd85cb..f54d5ff45f 100644 --- a/xbmc/view/GUIViewState.cpp +++ b/xbmc/view/GUIViewState.cpp @@ -597,7 +597,8 @@ CGUIViewStateFromItems::CGUIViewStateFromItems(const CFileItemList &items) : CGU { CURL url(items.GetPath()); AddonPtr addon; - if (CServiceBroker::GetAddonMgr().GetAddon(url.GetHostName(), addon, ADDON_PLUGIN)) + if (CServiceBroker::GetAddonMgr().GetAddon(url.GetHostName(), addon, ADDON_PLUGIN, + OnlyEnabled::YES)) { PluginPtr plugin = std::static_pointer_cast<CPluginSource>(addon); if (plugin->Provides(CPluginSource::AUDIO)) diff --git a/xbmc/weather/WeatherJob.cpp b/xbmc/weather/WeatherJob.cpp index e649c12ddd..263ca061d1 100644 --- a/xbmc/weather/WeatherJob.cpp +++ b/xbmc/weather/WeatherJob.cpp @@ -50,7 +50,10 @@ bool CWeatherJob::DoWork() return false; AddonPtr addon; - if (!CServiceBroker::GetAddonMgr().GetAddon(CServiceBroker::GetSettingsComponent()->GetSettings()->GetString(CSettings::SETTING_WEATHER_ADDON), addon, ADDON_SCRIPT_WEATHER)) + if (!CServiceBroker::GetAddonMgr().GetAddon( + CServiceBroker::GetSettingsComponent()->GetSettings()->GetString( + CSettings::SETTING_WEATHER_ADDON), + addon, ADDON_SCRIPT_WEATHER, OnlyEnabled::YES)) return false; // initialize our sys.argv variables diff --git a/xbmc/weather/WeatherManager.cpp b/xbmc/weather/WeatherManager.cpp index 18248116a6..06c591f7dd 100644 --- a/xbmc/weather/WeatherManager.cpp +++ b/xbmc/weather/WeatherManager.cpp @@ -174,7 +174,11 @@ void CWeatherManager::OnSettingAction(const std::shared_ptr<const CSetting>& set if (settingId == CSettings::SETTING_WEATHER_ADDONSETTINGS) { AddonPtr addon; - if (CServiceBroker::GetAddonMgr().GetAddon(CServiceBroker::GetSettingsComponent()->GetSettings()->GetString(CSettings::SETTING_WEATHER_ADDON), addon, ADDON_SCRIPT_WEATHER) && addon != NULL) + if (CServiceBroker::GetAddonMgr().GetAddon( + CServiceBroker::GetSettingsComponent()->GetSettings()->GetString( + CSettings::SETTING_WEATHER_ADDON), + addon, ADDON_SCRIPT_WEATHER, OnlyEnabled::YES) && + addon != NULL) { //! @todo maybe have ShowAndGetInput return a bool if settings changed, then only reset weather if true. CGUIDialogAddonSettings::ShowForAddon(addon); Refresh(); diff --git a/xbmc/windowing/gbm/drm/DRMUtils.cpp b/xbmc/windowing/gbm/drm/DRMUtils.cpp index 836597b46a..5593ce086b 100644 --- a/xbmc/windowing/gbm/drm/DRMUtils.cpp +++ b/xbmc/windowing/gbm/drm/DRMUtils.cpp @@ -351,8 +351,16 @@ bool CDRMUtils::OpenDrm(bool needConnector) PrintDrmDeviceInfo(device); const char* renderPath = drmGetRenderDeviceNameFromFd(m_fd); + + if (!renderPath) + renderPath = drmGetDeviceNameFromFd2(m_fd); + + if (!renderPath) + renderPath = drmGetDeviceNameFromFd(m_fd); + if (renderPath) { + m_renderDevicePath = renderPath; m_renderFd = open(renderPath, O_RDWR | O_CLOEXEC); if (m_renderFd != 0) CLog::Log(LOGDEBUG, "CDRMUtils::{} - opened render node: {}", __FUNCTION__, renderPath); diff --git a/xbmc/windowing/gbm/drm/DRMUtils.h b/xbmc/windowing/gbm/drm/DRMUtils.h index 2828f9567e..87e321b9ec 100644 --- a/xbmc/windowing/gbm/drm/DRMUtils.h +++ b/xbmc/windowing/gbm/drm/DRMUtils.h @@ -47,6 +47,7 @@ public: int GetFileDescriptor() const { return m_fd; } int GetRenderNodeFileDescriptor() const { return m_renderFd; } + const char* GetRenderDevicePath() const { return m_renderDevicePath; } CDRMPlane* GetVideoPlane() const { return m_video_plane; } CDRMPlane* GetGuiPlane() const { return m_gui_plane; } CDRMCrtc* GetCrtc() const { return m_crtc; } @@ -89,6 +90,7 @@ private: void PrintDrmDeviceInfo(drmDevicePtr device); int m_renderFd; + const char* m_renderDevicePath{nullptr}; std::vector<std::unique_ptr<CDRMConnector>> m_connectors; std::vector<std::unique_ptr<CDRMEncoder>> m_encoders; diff --git a/xbmc/windows/GUIMediaWindow.cpp b/xbmc/windows/GUIMediaWindow.cpp index b4cf681a37..3ae013da08 100644 --- a/xbmc/windows/GUIMediaWindow.cpp +++ b/xbmc/windows/GUIMediaWindow.cpp @@ -1053,7 +1053,8 @@ bool CGUIMediaWindow::OnClick(int iItem, const std::string &player) // execute the script CURL url(pItem->GetPath()); AddonPtr addon; - if (CServiceBroker::GetAddonMgr().GetAddon(url.GetHostName(), addon, ADDON_SCRIPT)) + if (CServiceBroker::GetAddonMgr().GetAddon(url.GetHostName(), addon, ADDON_SCRIPT, + OnlyEnabled::YES)) { if (!CScriptInvocationManager::GetInstance().Stop(addon->LibPath())) { @@ -1156,7 +1157,8 @@ bool CGUIMediaWindow::OnClick(int iItem, const std::string &player) { CURL url(m_vecItems->GetPath()); AddonPtr addon; - if (CServiceBroker::GetAddonMgr().GetAddon(url.GetHostName(),addon)) + if (CServiceBroker::GetAddonMgr().GetAddon(url.GetHostName(), addon, ADDON_UNKNOWN, + OnlyEnabled::YES)) { PluginPtr plugin = std::dynamic_pointer_cast<CPluginSource>(addon); if (plugin && plugin->Provides(CPluginSource::AUDIO)) diff --git a/xbmc/windows/GUIWindowScreensaverDim.cpp b/xbmc/windows/GUIWindowScreensaverDim.cpp index fb357a24e4..2cc38f5d1e 100644 --- a/xbmc/windows/GUIWindowScreensaverDim.cpp +++ b/xbmc/windows/GUIWindowScreensaverDim.cpp @@ -37,7 +37,8 @@ void CGUIWindowScreensaverDim::UpdateVisibility() { m_visible = true; ADDON::AddonPtr info; - CServiceBroker::GetAddonMgr().GetAddon(usedId, info, ADDON::ADDON_SCREENSAVER); + CServiceBroker::GetAddonMgr().GetAddon(usedId, info, ADDON::ADDON_SCREENSAVER, + ADDON::OnlyEnabled::YES); if (info && !info->GetSetting("level").empty()) m_newDimLevel = 100.0f - (float)atof(info->GetSetting("level").c_str()); else |