aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore9
-rw-r--r--Kodi.xcodeproj/project.pbxproj162
-rw-r--r--Makefile.in1
-rw-r--r--Makefile.include.in2
-rw-r--r--addons/metadata.common.imdb.com/addon.xml2
-rw-r--r--addons/metadata.common.imdb.com/changelog.txt3
-rw-r--r--addons/metadata.common.imdb.com/imdb.xml2
-rw-r--r--addons/metadata.common.last.fm/addon.xml40
-rw-r--r--addons/metadata.common.last.fm/icon.pngbin7350 -> 0 bytes
-rw-r--r--addons/metadata.common.last.fm/lastfm.xml306
-rw-r--r--addons/metadata.musicvideos.theaudiodb.com/addon.xml117
-rw-r--r--addons/metadata.musicvideos.theaudiodb.com/changelog.txt22
-rw-r--r--addons/metadata.musicvideos.theaudiodb.com/icon.pngbin9382 -> 0 bytes
-rw-r--r--addons/metadata.musicvideos.theaudiodb.com/resources/language/Afrikaans/strings.po21
-rw-r--r--addons/metadata.musicvideos.theaudiodb.com/resources/language/Belarusian/strings.po21
-rw-r--r--addons/metadata.musicvideos.theaudiodb.com/resources/language/Bulgarian/strings.po25
-rw-r--r--addons/metadata.musicvideos.theaudiodb.com/resources/language/Burmese/strings.po21
-rw-r--r--addons/metadata.musicvideos.theaudiodb.com/resources/language/Catalan/strings.po25
-rw-r--r--addons/metadata.musicvideos.theaudiodb.com/resources/language/Chinese (Simple)/strings.po25
-rw-r--r--addons/metadata.musicvideos.theaudiodb.com/resources/language/Chinese (Traditional)/strings.po25
-rw-r--r--addons/metadata.musicvideos.theaudiodb.com/resources/language/Croatian/strings.po25
-rw-r--r--addons/metadata.musicvideos.theaudiodb.com/resources/language/Czech/strings.po25
-rw-r--r--addons/metadata.musicvideos.theaudiodb.com/resources/language/Danish/strings.po25
-rw-r--r--addons/metadata.musicvideos.theaudiodb.com/resources/language/Dutch/strings.po25
-rw-r--r--addons/metadata.musicvideos.theaudiodb.com/resources/language/English (New Zealand)/strings.po25
-rw-r--r--addons/metadata.musicvideos.theaudiodb.com/resources/language/English (US)/strings.po25
-rw-r--r--addons/metadata.musicvideos.theaudiodb.com/resources/language/English/strings.po25
-rw-r--r--addons/metadata.musicvideos.theaudiodb.com/resources/language/Estonian/strings.po25
-rw-r--r--addons/metadata.musicvideos.theaudiodb.com/resources/language/Finnish/strings.po21
-rw-r--r--addons/metadata.musicvideos.theaudiodb.com/resources/language/French (Canada)/strings.po25
-rw-r--r--addons/metadata.musicvideos.theaudiodb.com/resources/language/French/strings.po25
-rw-r--r--addons/metadata.musicvideos.theaudiodb.com/resources/language/Galician/strings.po25
-rw-r--r--addons/metadata.musicvideos.theaudiodb.com/resources/language/German/strings.po25
-rw-r--r--addons/metadata.musicvideos.theaudiodb.com/resources/language/Greek/strings.po25
-rw-r--r--addons/metadata.musicvideos.theaudiodb.com/resources/language/Hebrew/strings.po25
-rw-r--r--addons/metadata.musicvideos.theaudiodb.com/resources/language/Hungarian/strings.po25
-rw-r--r--addons/metadata.musicvideos.theaudiodb.com/resources/language/Icelandic/strings.po25
-rw-r--r--addons/metadata.musicvideos.theaudiodb.com/resources/language/Indonesian/strings.po25
-rw-r--r--addons/metadata.musicvideos.theaudiodb.com/resources/language/Italian/strings.po25
-rw-r--r--addons/metadata.musicvideos.theaudiodb.com/resources/language/Japanese/strings.po25
-rw-r--r--addons/metadata.musicvideos.theaudiodb.com/resources/language/Korean/strings.po25
-rw-r--r--addons/metadata.musicvideos.theaudiodb.com/resources/language/Lithuanian/strings.po25
-rw-r--r--addons/metadata.musicvideos.theaudiodb.com/resources/language/Macedonian/strings.po21
-rw-r--r--addons/metadata.musicvideos.theaudiodb.com/resources/language/Malay/strings.po25
-rw-r--r--addons/metadata.musicvideos.theaudiodb.com/resources/language/Norwegian/strings.po25
-rw-r--r--addons/metadata.musicvideos.theaudiodb.com/resources/language/Polish/strings.po25
-rw-r--r--addons/metadata.musicvideos.theaudiodb.com/resources/language/Portuguese (Brazil)/strings.po25
-rw-r--r--addons/metadata.musicvideos.theaudiodb.com/resources/language/Portuguese/strings.po25
-rw-r--r--addons/metadata.musicvideos.theaudiodb.com/resources/language/Romanian/strings.po25
-rw-r--r--addons/metadata.musicvideos.theaudiodb.com/resources/language/Russian/strings.po25
-rw-r--r--addons/metadata.musicvideos.theaudiodb.com/resources/language/Slovak/strings.po25
-rw-r--r--addons/metadata.musicvideos.theaudiodb.com/resources/language/Slovenian/strings.po25
-rw-r--r--addons/metadata.musicvideos.theaudiodb.com/resources/language/Spanish (Argentina)/strings.po25
-rw-r--r--addons/metadata.musicvideos.theaudiodb.com/resources/language/Spanish (Mexico)/strings.po21
-rw-r--r--addons/metadata.musicvideos.theaudiodb.com/resources/language/Spanish/strings.po25
-rw-r--r--addons/metadata.musicvideos.theaudiodb.com/resources/language/Swedish/strings.po25
-rw-r--r--addons/metadata.musicvideos.theaudiodb.com/resources/language/Tamil (India)/strings.po25
-rw-r--r--addons/metadata.musicvideos.theaudiodb.com/resources/language/Thai/strings.po21
-rw-r--r--addons/metadata.musicvideos.theaudiodb.com/resources/language/Turkish/strings.po21
-rw-r--r--addons/metadata.musicvideos.theaudiodb.com/resources/language/Ukrainian/strings.po21
-rw-r--r--addons/metadata.musicvideos.theaudiodb.com/resources/language/Vietnamese/strings.po25
-rw-r--r--addons/metadata.musicvideos.theaudiodb.com/resources/language/Welsh/strings.po25
-rw-r--r--addons/metadata.musicvideos.theaudiodb.com/resources/settings.xml5
-rw-r--r--addons/metadata.musicvideos.theaudiodb.com/tadb.xml71
-rw-r--r--addons/metadata.themoviedb.org/addon.xml2
-rw-r--r--addons/metadata.themoviedb.org/changelog.txt6
-rw-r--r--addons/metadata.themoviedb.org/tmdb.xml10
-rw-r--r--addons/repository.xbmc.org/addon.xml39
-rw-r--r--addons/resource.language.en_gb/addon.xml2
-rw-r--r--addons/resource.language.en_gb/resources/strings.po252
-rw-r--r--addons/screensaver.xbmc.builtin.black/addon.xml8
-rw-r--r--addons/screensaver.xbmc.builtin.dim/addon.xml14
-rw-r--r--addons/screensaver.xbmc.builtin.dim/resources/language/resource.language.mt_mt/strings.po21
-rw-r--r--addons/screensaver.xbmc.builtin.dim/resources/language/resource.language.sr_rs@latin/strings.po21
-rw-r--r--addons/skin.confluence/720p/DialogExtendedProgressBar.xml2
-rw-r--r--addons/skin.confluence/720p/DialogKaraokeSongSelector.xml41
-rw-r--r--addons/skin.confluence/720p/DialogKaraokeSongSelectorLarge.xml44
-rw-r--r--addons/skin.confluence/720p/DialogVolumeBar.xml2
-rw-r--r--addons/skin.confluence/720p/Home.xml8
-rw-r--r--addons/skin.confluence/720p/IncludesBackgroundBuilding.xml3
-rw-r--r--addons/skin.confluence/720p/MusicKaraokeLyrics.xml46
-rw-r--r--addons/skin.confluence/720p/MusicOSD.xml19
-rw-r--r--addons/skin.confluence/720p/MyPVRChannels.xml13
-rw-r--r--addons/skin.confluence/720p/SkinSettings.xml42
-rw-r--r--addons/skin.confluence/720p/VideoOSD.xml4
-rw-r--r--addons/skin.confluence/720p/ViewsMusicLibrary.xml2
-rw-r--r--addons/skin.confluence/720p/ViewsVideoLibrary.xml4
-rw-r--r--addons/skin.confluence/720p/includes.xml305
-rw-r--r--addons/skin.confluence/720p/script-cu-lrclyrics-main.xml2
-rw-r--r--addons/skin.confluence/720p/script-globalsearch-main.xml1
-rw-r--r--addons/skin.confluence/addon.xml23
-rw-r--r--addons/skin.confluence/changelog.txt8
-rw-r--r--addons/skin.confluence/language/resource.language.af_za/strings.po12
-rw-r--r--addons/skin.confluence/language/resource.language.ar_sa/strings.po12
-rw-r--r--addons/skin.confluence/language/resource.language.be_by/strings.po12
-rw-r--r--addons/skin.confluence/language/resource.language.bg_bg/strings.po42
-rw-r--r--addons/skin.confluence/language/resource.language.ca_es/strings.po236
-rw-r--r--addons/skin.confluence/language/resource.language.cs_cz/strings.po18
-rw-r--r--addons/skin.confluence/language/resource.language.cy_gb/strings.po12
-rw-r--r--addons/skin.confluence/language/resource.language.da_dk/strings.po266
-rw-r--r--addons/skin.confluence/language/resource.language.de_de/strings.po16
-rw-r--r--addons/skin.confluence/language/resource.language.el_gr/strings.po296
-rw-r--r--addons/skin.confluence/language/resource.language.en_au/strings.po12
-rw-r--r--addons/skin.confluence/language/resource.language.en_gb/strings.po8
-rw-r--r--addons/skin.confluence/language/resource.language.en_nz/strings.po20
-rw-r--r--addons/skin.confluence/language/resource.language.en_us/strings.po16
-rw-r--r--addons/skin.confluence/language/resource.language.es_ar/strings.po274
-rw-r--r--addons/skin.confluence/language/resource.language.es_es/strings.po16
-rw-r--r--addons/skin.confluence/language/resource.language.es_mx/strings.po16
-rw-r--r--addons/skin.confluence/language/resource.language.et_ee/strings.po12
-rw-r--r--addons/skin.confluence/language/resource.language.fa_ir/strings.po48
-rw-r--r--addons/skin.confluence/language/resource.language.fi_fi/strings.po270
-rw-r--r--addons/skin.confluence/language/resource.language.fo_fo/strings.po4
-rw-r--r--addons/skin.confluence/language/resource.language.fr_ca/strings.po18
-rw-r--r--addons/skin.confluence/language/resource.language.fr_fr/strings.po124
-rw-r--r--addons/skin.confluence/language/resource.language.gl_es/strings.po282
-rw-r--r--addons/skin.confluence/language/resource.language.he_il/strings.po268
-rw-r--r--addons/skin.confluence/language/resource.language.hr_hr/strings.po272
-rw-r--r--addons/skin.confluence/language/resource.language.hu_hu/strings.po18
-rw-r--r--addons/skin.confluence/language/resource.language.hy_am/strings.po8
-rw-r--r--addons/skin.confluence/language/resource.language.id_id/strings.po270
-rw-r--r--addons/skin.confluence/language/resource.language.is_is/strings.po274
-rw-r--r--addons/skin.confluence/language/resource.language.it_it/strings.po54
-rw-r--r--addons/skin.confluence/language/resource.language.ja_jp/strings.po12
-rw-r--r--addons/skin.confluence/language/resource.language.ko_kr/strings.po16
-rw-r--r--addons/skin.confluence/language/resource.language.lt_lt/strings.po20
-rw-r--r--addons/skin.confluence/language/resource.language.lv_lv/strings.po12
-rw-r--r--addons/skin.confluence/language/resource.language.mk_mk/strings.po12
-rw-r--r--addons/skin.confluence/language/resource.language.mn_mn/strings.po84
-rw-r--r--addons/skin.confluence/language/resource.language.ms_my/strings.po304
-rw-r--r--addons/skin.confluence/language/resource.language.mt_mt/strings.po464
-rw-r--r--addons/skin.confluence/language/resource.language.nb_no/strings.po242
-rw-r--r--addons/skin.confluence/language/resource.language.nl_nl/strings.po20
-rw-r--r--addons/skin.confluence/language/resource.language.pl_pl/strings.po36
-rw-r--r--addons/skin.confluence/language/resource.language.pt_br/strings.po22
-rw-r--r--addons/skin.confluence/language/resource.language.pt_pt/strings.po234
-rw-r--r--addons/skin.confluence/language/resource.language.ro_ro/strings.po20
-rw-r--r--addons/skin.confluence/language/resource.language.ru_ru/strings.po16
-rw-r--r--addons/skin.confluence/language/resource.language.sk_sk/strings.po276
-rw-r--r--addons/skin.confluence/language/resource.language.sl_si/strings.po20
-rw-r--r--addons/skin.confluence/language/resource.language.sq_al/strings.po12
-rw-r--r--addons/skin.confluence/language/resource.language.sr_rs/strings.po12
-rw-r--r--addons/skin.confluence/language/resource.language.sr_rs@latin/strings.po334
-rw-r--r--addons/skin.confluence/language/resource.language.sv_se/strings.po90
-rw-r--r--addons/skin.confluence/language/resource.language.szl/strings.po16
-rw-r--r--addons/skin.confluence/language/resource.language.ta_in/strings.po8
-rw-r--r--addons/skin.confluence/language/resource.language.tg_tj/strings.po12
-rw-r--r--addons/skin.confluence/language/resource.language.th_th/strings.po274
-rw-r--r--addons/skin.confluence/language/resource.language.tr_tr/strings.po26
-rw-r--r--addons/skin.confluence/language/resource.language.uk_ua/strings.po288
-rw-r--r--addons/skin.confluence/language/resource.language.vi_vn/strings.po12
-rw-r--r--addons/skin.confluence/language/resource.language.zh_cn/strings.po16
-rw-r--r--addons/skin.confluence/language/resource.language.zh_tw/strings.po282
-rw-r--r--addons/skin.confluence/media/Makefile.in4
-rw-r--r--addons/skin.confluence/media/VideoWindowFO.pngbin0 -> 152 bytes
m---------addons/skin.re-touched0
-rw-r--r--addons/webinterface.default/addon.xml22
-rw-r--r--addons/xbmc.gui/addon.xml2
-rw-r--r--configure.ac8
-rw-r--r--docs/README.android2
-rw-r--r--media/Splash.pngbin401814 -> 449476 bytes
-rw-r--r--project/VS2010Express/XBMC.vcxproj27
-rw-r--r--project/VS2010Express/XBMC.vcxproj.filters80
-rw-r--r--project/cmake/addons/CMakeLists.txt2
-rw-r--r--project/cmake/scripts/common/addon-helpers.cmake3
-rw-r--r--system/keyboardlayouts/czech.xml27
-rw-r--r--system/keymaps/gamepad.xml7
-rw-r--r--system/keymaps/joystick.Microsoft.Xbox.360.Controller.xml4
-rw-r--r--system/keymaps/keyboard.xml64
-rw-r--r--system/keymaps/mouse.xml7
-rw-r--r--system/keymaps/remote.xml7
-rw-r--r--system/keymaps/touchscreen.xml64
-rw-r--r--system/settings/android.xml7
-rw-r--r--system/settings/settings.xml95
-rw-r--r--system/settings/win32.xml9
-rw-r--r--tools/android/packaging/xbmc/AndroidManifest.xml.in10
-rw-r--r--tools/android/packaging/xbmc/src/org/xbmc/kodi/Main.java.in13
-rw-r--r--tools/android/packaging/xbmc/src/org/xbmc/kodi/Splash.java.in22
-rw-r--r--tools/android/packaging/xbmc/src/org/xbmc/kodi/XBMCVideoView.java.in3
-rw-r--r--tools/buildsteps/android/make-binary-addons4
-rw-r--r--tools/buildsteps/androidx86/make-binary-addons4
-rw-r--r--tools/buildsteps/defaultenv6
-rwxr-xr-xtools/buildsteps/ios/make-binary-addons4
-rwxr-xr-xtools/buildsteps/linux32/configure-depends9
-rwxr-xr-xtools/buildsteps/linux32/configure-xbmc5
-rwxr-xr-xtools/buildsteps/linux32/make-binary-addons28
-rwxr-xr-xtools/buildsteps/linux32/make-depends9
-rwxr-xr-xtools/buildsteps/linux32/make-native-depends9
-rwxr-xr-xtools/buildsteps/linux32/make-xbmc5
-rwxr-xr-xtools/buildsteps/linux32/package5
-rwxr-xr-xtools/buildsteps/linux32/prepare-depends15
-rwxr-xr-xtools/buildsteps/linux32/prepare-xbmc9
-rwxr-xr-xtools/buildsteps/linux32/run-tests9
-rwxr-xr-xtools/buildsteps/linux64/make-binary-addons4
-rwxr-xr-xtools/buildsteps/osx32/configure-depends12
-rwxr-xr-xtools/buildsteps/osx32/configure-xbmc5
-rwxr-xr-xtools/buildsteps/osx32/make-binary-addons28
-rwxr-xr-xtools/buildsteps/osx32/make-depends9
-rwxr-xr-xtools/buildsteps/osx32/make-native-depends9
-rwxr-xr-xtools/buildsteps/osx32/make-xbmc8
-rwxr-xr-xtools/buildsteps/osx32/package10
-rwxr-xr-xtools/buildsteps/osx32/prepare-depends15
-rwxr-xr-xtools/buildsteps/osx32/prepare-xbmc9
-rwxr-xr-xtools/buildsteps/osx32/run-tests9
-rwxr-xr-xtools/buildsteps/osx64/make-binary-addons4
-rwxr-xr-xtools/buildsteps/rbpi/make-binary-addons4
-rw-r--r--tools/depends/native/TexturePacker/src/TexturePacker.cpp2
-rw-r--r--tools/depends/target/Makefile8
-rw-r--r--tools/depends/target/crossguid/Makefile3
-rw-r--r--tools/depends/target/ffmpeg/FFMPEG-VERSION2
-rw-r--r--tools/depends/target/libgpg-error/Makefile10
-rw-r--r--tools/depends/target/libssh/Makefile1
-rw-r--r--tools/depends/target/libssh/fix-gcc-5-compile.patch55
-rw-r--r--tools/depends/target/libuuid/Makefile24
-rw-r--r--version.txt6
-rw-r--r--xbmc/Application.cpp79
-rw-r--r--xbmc/Application.h3
-rw-r--r--xbmc/Autorun.cpp3
-rw-r--r--xbmc/FileItem.cpp25
-rw-r--r--xbmc/FileItem.h8
-rw-r--r--xbmc/GUIInfoManager.cpp16
-rw-r--r--xbmc/addons/Addon.cpp48
-rw-r--r--xbmc/addons/AddonDatabase.cpp73
-rw-r--r--xbmc/addons/AddonDatabase.h21
-rw-r--r--xbmc/addons/AddonInstaller.cpp29
-rw-r--r--xbmc/addons/AddonManager.cpp14
-rw-r--r--xbmc/addons/AddonManager.h3
-rw-r--r--xbmc/addons/GUIDialogAddonInfo.cpp9
-rw-r--r--xbmc/addons/Repository.cpp75
-rw-r--r--xbmc/addons/Repository.h2
-rw-r--r--xbmc/addons/RepositoryUpdater.cpp11
-rw-r--r--xbmc/android/activity/AndroidKey.cpp65
-rw-r--r--xbmc/android/activity/AndroidKey.h8
-rw-r--r--xbmc/android/activity/EventLoop.cpp19
-rw-r--r--xbmc/android/activity/JNIMainActivity.cpp12
-rw-r--r--xbmc/android/activity/JNIMainActivity.h2
-rw-r--r--xbmc/android/activity/XBMCApp.cpp118
-rw-r--r--xbmc/android/activity/XBMCApp.h5
-rw-r--r--xbmc/android/jni/ApplicationInfo.cpp2
-rw-r--r--xbmc/android/jni/ApplicationInfo.h3
-rw-r--r--xbmc/android/jni/Context.cpp6
-rw-r--r--xbmc/android/jni/DisplayMetrics.cpp50
-rw-r--r--xbmc/android/jni/DisplayMetrics.h42
-rw-r--r--xbmc/android/jni/Intent.cpp15
-rw-r--r--xbmc/android/jni/Intent.h4
-rw-r--r--xbmc/android/jni/KeyEvent.cpp68
-rw-r--r--xbmc/android/jni/KeyEvent.h68
-rw-r--r--xbmc/android/jni/Makefile.in4
-rw-r--r--xbmc/android/jni/PackageItemInfo.cpp30
-rw-r--r--xbmc/android/jni/PackageItemInfo.h36
-rw-r--r--xbmc/android/jni/PackageManager.cpp14
-rw-r--r--xbmc/android/jni/PackageManager.h3
-rw-r--r--xbmc/android/jni/Resources.cpp33
-rw-r--r--xbmc/android/jni/Resources.h37
-rw-r--r--xbmc/cores/AudioEngine/DSPAddons/ActiveAEDSP.cpp76
-rw-r--r--xbmc/cores/AudioEngine/DSPAddons/ActiveAEDSP.h16
-rw-r--r--xbmc/cores/AudioEngine/DSPAddons/ActiveAEDSPDatabase.cpp2
-rw-r--r--xbmc/cores/AudioEngine/Sinks/AESinkAUDIOTRACK.cpp19
-rw-r--r--xbmc/cores/AudioEngine/Sinks/AESinkAUDIOTRACK.h2
-rw-r--r--xbmc/cores/AudioEngine/Sinks/AESinkDirectSound.cpp2
-rw-r--r--xbmc/cores/AudioEngine/Sinks/AESinkPULSE.cpp2
-rw-r--r--xbmc/cores/AudioEngine/Utils/AEUtil.cpp19
-rw-r--r--xbmc/cores/AudioEngine/Utils/AEUtil.h6
-rw-r--r--xbmc/cores/DllLoader/Win32DllLoader.cpp4
-rw-r--r--xbmc/cores/DllLoader/exports/emu_kernel32.cpp4
-rw-r--r--xbmc/cores/VideoRenderers/DXVAHD.cpp2
-rw-r--r--xbmc/cores/VideoRenderers/VideoShaders/WinVideoFilter.cpp103
-rw-r--r--xbmc/cores/VideoRenderers/WinRenderer.cpp123
-rw-r--r--xbmc/cores/dvdplayer/DVDCodecs/DVDFactoryCodec.cpp6
-rw-r--r--xbmc/cores/dvdplayer/DVDCodecs/Overlay/contrib/cc_decoder708.cpp28
-rw-r--r--xbmc/cores/dvdplayer/DVDCodecs/Video/AMLCodec.cpp93
-rw-r--r--xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecAmlogic.cpp6
-rw-r--r--xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecAndroidMediaCodec.cpp18
-rw-r--r--xbmc/cores/dvdplayer/DVDCodecs/Video/DXVA.cpp12
-rw-r--r--xbmc/cores/dvdplayer/DVDCodecs/Video/OpenMaxVideo.cpp7
-rw-r--r--xbmc/cores/dvdplayer/DVDDemuxers/DVDDemux.h3
-rw-r--r--xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp7
-rw-r--r--xbmc/cores/dvdplayer/DVDPlayer.cpp3
-rw-r--r--xbmc/cores/dvdplayer/DVDTSCorrection.cpp7
-rw-r--r--xbmc/cores/dvdplayer/DVDTSCorrection.h16
-rw-r--r--xbmc/cores/paplayer/PAPlayer.cpp3
-rw-r--r--xbmc/dbwrappers/mysqldataset.cpp43
-rw-r--r--xbmc/dbwrappers/mysqldataset.h1
-rw-r--r--xbmc/dbwrappers/sqlitedataset.cpp1
-rw-r--r--xbmc/dialogs/GUIDialogContextMenu.h4
-rw-r--r--xbmc/dialogs/GUIDialogKeyboardGeneric.cpp57
-rw-r--r--xbmc/dialogs/GUIDialogMediaSource.cpp107
-rw-r--r--xbmc/dialogs/GUIDialogYesNo.cpp1
-rw-r--r--xbmc/epg/Epg.cpp2
-rw-r--r--xbmc/epg/EpgContainer.cpp8
-rw-r--r--xbmc/epg/GUIEPGGridContainer.cpp1
-rw-r--r--xbmc/events/EventLog.cpp14
-rw-r--r--xbmc/filesystem/AddonsDirectory.cpp19
-rw-r--r--xbmc/filesystem/AndroidAppDirectory.cpp1
-rw-r--r--xbmc/filesystem/AndroidAppFile.cpp75
-rw-r--r--xbmc/filesystem/AndroidAppFile.h19
-rw-r--r--xbmc/filesystem/DirectoryCache.cpp6
-rw-r--r--xbmc/filesystem/MusicDatabaseDirectory.cpp2
-rw-r--r--xbmc/filesystem/SMBFile.cpp12
-rw-r--r--xbmc/filesystem/VideoDatabaseDirectory.cpp1
-rw-r--r--xbmc/filesystem/ZipFile.cpp45
-rw-r--r--xbmc/filesystem/ZipFile.h5
-rw-r--r--xbmc/guilib/GUIAction.cpp2
-rw-r--r--xbmc/guilib/GUIControlFactory.cpp1
-rw-r--r--xbmc/guilib/GUIEditControl.cpp4
-rw-r--r--xbmc/guilib/GUIFont.h2
-rw-r--r--xbmc/guilib/GUIFontTTF.cpp2
-rw-r--r--xbmc/guilib/GUIToggleButtonControl.cpp32
-rw-r--r--xbmc/guilib/GUIToggleButtonControl.h6
-rw-r--r--xbmc/guilib/GUIWindowManager.cpp17
-rw-r--r--xbmc/guilib/Gif.cpp22
-rw-r--r--xbmc/guilib/Gif.h2
-rw-r--r--xbmc/guilib/GraphicContext.h4
-rw-r--r--xbmc/guilib/JpegIO.cpp12
-rw-r--r--xbmc/guilib/JpegIO.h2
-rw-r--r--xbmc/guilib/Texture.cpp17
-rw-r--r--xbmc/guilib/TextureManager.cpp25
-rw-r--r--xbmc/guilib/TextureManager.h2
-rw-r--r--xbmc/guilib/WindowIDs.h5
-rw-r--r--xbmc/guilib/cximage.cpp14
-rw-r--r--xbmc/guilib/cximage.h2
-rw-r--r--xbmc/guilib/iimage.h2
-rw-r--r--xbmc/input/ButtonTranslator.cpp19
-rw-r--r--xbmc/input/InputCodingTableKorean.cpp97
-rw-r--r--xbmc/input/XBMC_keysym.h5
-rw-r--r--xbmc/input/XBMC_keytable.cpp5
-rw-r--r--xbmc/input/XBMC_vkeys.h5
-rw-r--r--xbmc/input/linux/LinuxInputDevices.cpp35
-rw-r--r--xbmc/interfaces/builtins/GUIContainerBuiltins.cpp8
-rw-r--r--xbmc/interfaces/builtins/LibraryBuiltins.cpp8
-rw-r--r--xbmc/interfaces/json-rpc/AudioLibrary.cpp107
-rw-r--r--xbmc/interfaces/json-rpc/AudioLibrary.h1
-rw-r--r--xbmc/interfaces/json-rpc/PlayerOperations.cpp2
-rw-r--r--xbmc/interfaces/json-rpc/schema/types.json84
-rw-r--r--xbmc/interfaces/json-rpc/schema/version.txt2
-rw-r--r--xbmc/interfaces/legacy/InfoTagMusic.cpp4
-rw-r--r--xbmc/interfaces/legacy/ModuleXbmc.h2
-rw-r--r--xbmc/interfaces/python/AddonPythonInvoker.cpp2
-rw-r--r--xbmc/main/win32/WinMain.cpp6
-rw-r--r--xbmc/messaging/ApplicationMessenger.h4
-rw-r--r--xbmc/music/Album.cpp14
-rw-r--r--xbmc/music/Album.h13
-rw-r--r--xbmc/music/MusicDatabase.cpp864
-rw-r--r--xbmc/music/MusicDatabase.h36
-rw-r--r--xbmc/music/MusicInfoLoader.cpp5
-rw-r--r--xbmc/music/Song.cpp20
-rw-r--r--xbmc/music/Song.h9
-rw-r--r--xbmc/music/infoscanner/MusicInfoScanner.cpp1
-rw-r--r--xbmc/music/karaoke/GUIDialogKaraokeSongSelector.cpp270
-rw-r--r--xbmc/music/karaoke/GUIDialogKaraokeSongSelector.h87
-rw-r--r--xbmc/music/karaoke/GUIWindowKaraokeLyrics.cpp174
-rw-r--r--xbmc/music/karaoke/GUIWindowKaraokeLyrics.h53
-rw-r--r--xbmc/music/karaoke/Makefile.in17
-rw-r--r--xbmc/music/karaoke/cdgdata.h73
-rw-r--r--xbmc/music/karaoke/karaokelyrics.cpp119
-rw-r--r--xbmc/music/karaoke/karaokelyrics.h92
-rw-r--r--xbmc/music/karaoke/karaokelyricscdg.cpp610
-rw-r--r--xbmc/music/karaoke/karaokelyricscdg.h114
-rw-r--r--xbmc/music/karaoke/karaokelyricsfactory.cpp97
-rw-r--r--xbmc/music/karaoke/karaokelyricsfactory.h45
-rw-r--r--xbmc/music/karaoke/karaokelyricsmanager.cpp170
-rw-r--r--xbmc/music/karaoke/karaokelyricsmanager.h74
-rw-r--r--xbmc/music/karaoke/karaokelyricstext.cpp748
-rw-r--r--xbmc/music/karaoke/karaokelyricstext.h205
-rw-r--r--xbmc/music/karaoke/karaokelyricstextkar.cpp597
-rw-r--r--xbmc/music/karaoke/karaokelyricstextkar.h62
-rw-r--r--xbmc/music/karaoke/karaokelyricstextlrc.cpp541
-rw-r--r--xbmc/music/karaoke/karaokelyricstextlrc.h48
-rw-r--r--xbmc/music/karaoke/karaokelyricstextustar.cpp271
-rw-r--r--xbmc/music/karaoke/karaokelyricstextustar.h49
-rw-r--r--xbmc/music/karaoke/karaokevideobackground.cpp186
-rw-r--r--xbmc/music/karaoke/karaokevideobackground.h85
-rw-r--r--xbmc/music/karaoke/karaokewindowbackground.cpp258
-rw-r--r--xbmc/music/karaoke/karaokewindowbackground.h102
-rw-r--r--xbmc/music/tags/MusicInfoTag.cpp29
-rw-r--r--xbmc/music/tags/MusicInfoTag.h4
-rw-r--r--xbmc/music/tags/TagLoaderTagLib.cpp407
-rw-r--r--xbmc/music/tags/TagLoaderTagLib.h27
-rw-r--r--xbmc/music/tags/test/TestTagLoaderTagLib.cpp148
-rw-r--r--xbmc/music/windows/GUIWindowMusicBase.cpp14
-rw-r--r--xbmc/music/windows/GUIWindowMusicBase.h7
-rw-r--r--xbmc/music/windows/GUIWindowMusicNav.cpp40
-rw-r--r--xbmc/music/windows/GUIWindowMusicPlaylist.cpp1
-rw-r--r--xbmc/network/httprequesthandler/HTTPWebinterfaceHandler.cpp7
-rw-r--r--xbmc/osx/XBMCHelper.cpp2
-rw-r--r--xbmc/osx/ios/XBMCController.mm18
-rw-r--r--xbmc/pictures/GUIWindowSlideShow.cpp12
-rw-r--r--xbmc/pictures/PictureInfoLoader.cpp1
-rw-r--r--xbmc/powermanagement/DPMSSupport.cpp2
-rw-r--r--xbmc/powermanagement/PowerManager.cpp2
-rw-r--r--xbmc/pvr/PVRDatabase.cpp8
-rw-r--r--xbmc/pvr/PVRGUIInfo.cpp6
-rw-r--r--xbmc/pvr/PVRManager.cpp2
-rw-r--r--xbmc/pvr/channels/PVRChannel.cpp6
-rw-r--r--xbmc/pvr/channels/PVRChannel.h5
-rw-r--r--xbmc/pvr/channels/PVRChannelGroup.cpp8
-rw-r--r--xbmc/pvr/dialogs/GUIDialogPVRGuideInfo.cpp73
-rw-r--r--xbmc/pvr/dialogs/GUIDialogPVRGuideInfo.h2
-rw-r--r--xbmc/pvr/dialogs/GUIDialogPVRRadioRDSInfo.cpp10
-rw-r--r--xbmc/pvr/dialogs/GUIDialogPVRTimerSettings.cpp47
-rw-r--r--xbmc/pvr/timers/PVRTimerInfoTag.cpp6
-rw-r--r--xbmc/pvr/timers/PVRTimerInfoTag.h9
-rw-r--r--xbmc/pvr/timers/PVRTimerType.cpp4
-rw-r--r--xbmc/pvr/timers/PVRTimers.cpp24
-rw-r--r--xbmc/pvr/windows/GUIWindowPVRBase.cpp128
-rw-r--r--xbmc/pvr/windows/GUIWindowPVRBase.h39
-rw-r--r--xbmc/pvr/windows/GUIWindowPVRChannels.cpp44
-rw-r--r--xbmc/pvr/windows/GUIWindowPVRChannels.h3
-rw-r--r--xbmc/pvr/windows/GUIWindowPVRGuide.cpp74
-rw-r--r--xbmc/pvr/windows/GUIWindowPVRGuide.h1
-rw-r--r--xbmc/pvr/windows/GUIWindowPVRRecordings.cpp24
-rw-r--r--xbmc/pvr/windows/GUIWindowPVRSearch.cpp65
-rw-r--r--xbmc/pvr/windows/GUIWindowPVRSearch.h1
-rw-r--r--xbmc/pvr/windows/GUIWindowPVRTimers.cpp120
-rw-r--r--xbmc/pvr/windows/GUIWindowPVRTimers.h2
-rw-r--r--xbmc/rendering/dx/RenderSystemDX.cpp18
-rw-r--r--xbmc/settings/AdvancedSettings.cpp29
-rw-r--r--xbmc/settings/AdvancedSettings.h14
-rw-r--r--xbmc/settings/MediaSettings.cpp46
-rw-r--r--xbmc/settings/SettingConditions.cpp3
-rw-r--r--xbmc/settings/Settings.cpp12
-rw-r--r--xbmc/settings/Settings.h9
-rw-r--r--xbmc/settings/dialogs/GUIDialogAudioDSPSettings.cpp2
-rw-r--r--xbmc/storage/linux/UDevProvider.cpp24
-rw-r--r--xbmc/system.h1
-rw-r--r--xbmc/threads/Thread.cpp2
-rw-r--r--xbmc/threads/Timer.cpp19
-rw-r--r--xbmc/threads/Timer.h1
-rw-r--r--xbmc/threads/platform/win/Win32Exception.cpp4
-rw-r--r--xbmc/utils/AMLUtils.cpp133
-rw-r--r--xbmc/utils/AMLUtils.h5
-rw-r--r--xbmc/utils/CharsetConverter.cpp18
-rw-r--r--xbmc/utils/CharsetConverter.h5
-rw-r--r--xbmc/utils/GlobalsHandling.h10
-rw-r--r--xbmc/utils/LabelFormatter.cpp2
-rw-r--r--xbmc/utils/Splash.cpp1
-rw-r--r--xbmc/utils/StringUtils.cpp4
-rw-r--r--xbmc/utils/win32/memcpy_sse2.h62
-rw-r--r--xbmc/video/Teletext.cpp2
-rw-r--r--xbmc/video/TeletextDefines.h5
-rw-r--r--xbmc/video/VideoDatabase.cpp2
-rw-r--r--xbmc/video/dialogs/GUIDialogVideoInfo.cpp2
-rw-r--r--xbmc/video/windows/GUIWindowVideoBase.cpp5
-rw-r--r--xbmc/video/windows/GUIWindowVideoNav.cpp2
-rw-r--r--xbmc/windowing/X11/WinSystemX11.cpp15
-rw-r--r--xbmc/windowing/egl/EGLNativeTypeAmlogic.cpp4
-rw-r--r--xbmc/windowing/egl/EGLNativeTypeAndroid.cpp8
-rw-r--r--xbmc/windows/GUIMediaWindow.cpp10
-rw-r--r--xbmc/windows/GUIWindowFileManager.cpp4
-rw-r--r--xbmc/windows/GUIWindowLoginScreen.cpp52
-rw-r--r--xbmc/windows/GUIWindowLoginScreen.h2
-rw-r--r--xbmc/windows/GUIWindowScreensaverDim.cpp7
-rw-r--r--xbmc/windows/GUIWindowScreensaverDim.h1
453 files changed, 9473 insertions, 11380 deletions
diff --git a/.gitignore b/.gitignore
index 0ed6086e85..4d36744355 100644
--- a/.gitignore
+++ b/.gitignore
@@ -13,6 +13,8 @@ testMain
*.kdev4
# gedit
*~
+# CLion
+/.idea
# generated files etc
config.cache
@@ -406,14 +408,16 @@ lib/cpluff/stamp-h1
/skin/Confluence/BUILD
#/tools/android
-/tools/android/packaging/xbmc/AndroidManifest.xml
/tools/android/packaging/Makefile
+/tools/android/packaging/xbmc/activity_main.xml
+/tools/android/packaging/xbmc/AndroidManifest.xml
/tools/android/packaging/xbmc/src/org/xbmc/kodi/Main.java
/tools/android/packaging/xbmc/src/org/xbmc/kodi/Splash.java
/tools/android/packaging/xbmc/src/org/xbmc/kodi/XBMCBroadcastReceiver.java
/tools/android/packaging/xbmc/src/org/xbmc/kodi/XBMCOnAudioFocusChangeListener.java
/tools/android/packaging/xbmc/src/org/xbmc/kodi/XBMCOnFrameAvailableListener.java
/tools/android/packaging/xbmc/src/org/xbmc/kodi/XBMCSettingsContentObserver.java
+/tools/android/packaging/xbmc/src/org/xbmc/kodi/XBMCVideoView.java
/tools/android/packaging/xbmc/strings.xml
#/tools/depends
@@ -551,9 +555,6 @@ lib/cpluff/stamp-h1
/xbmc/messaging/Makefile
/xbmc/messaging/helpers/Makefile
-# /xbmc/music/
-/xbmc/music/karaoke/Makefile
-
# /xbmc/network/
/xbmc/network/Makefile
/xbmc/network/httprequesthandler/python/Makefile
diff --git a/Kodi.xcodeproj/project.pbxproj b/Kodi.xcodeproj/project.pbxproj
index 3708f74363..8fb3ba756a 100644
--- a/Kodi.xcodeproj/project.pbxproj
+++ b/Kodi.xcodeproj/project.pbxproj
@@ -139,8 +139,9 @@
1D638128161E211E003603ED /* PeripheralImon.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1D638126161E211E003603ED /* PeripheralImon.cpp */; };
1DAFDB7C16DFDCA7007F8C68 /* PeripheralBusCEC.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1DAFDB7A16DFDCA7007F8C68 /* PeripheralBusCEC.cpp */; };
1DE0443515828F4B005DDB4D /* Exception.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1DE0443315828F4B005DDB4D /* Exception.cpp */; };
- 2A7B2BDC1BD6F16600044BCD /* PVRSettings.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2A7B2BDB1BD6F16600044BCD /* PVRSettings.cpp */; settings = {ASSET_TAGS = (); }; };
- 2A7B2BDD1BD6F16600044BCD /* PVRSettings.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2A7B2BDB1BD6F16600044BCD /* PVRSettings.cpp */; settings = {ASSET_TAGS = (); }; };
+ 2A1A5A6C1BDEAA6D0084702D /* NOTE in Resources */ = {isa = PBXBuildFile; fileRef = 2A1A5A5D1BDEAA6D0084702D /* NOTE */; };
+ 2A7B2BDC1BD6F16600044BCD /* PVRSettings.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2A7B2BDB1BD6F16600044BCD /* PVRSettings.cpp */; };
+ 2A7B2BDD1BD6F16600044BCD /* PVRSettings.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2A7B2BDB1BD6F16600044BCD /* PVRSettings.cpp */; };
2F4564D51970129A00396109 /* GUIFontCache.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2F4564D31970129A00396109 /* GUIFontCache.cpp */; };
2F4564D61970129A00396109 /* GUIFontCache.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2F4564D31970129A00396109 /* GUIFontCache.cpp */; };
32C631281423A90F00F18420 /* JpegIO.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 32C631261423A90F00F18420 /* JpegIO.cpp */; };
@@ -284,8 +285,8 @@
7C2612711825B6340086E04D /* DatabaseQuery.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C26126F1825B6340086E04D /* DatabaseQuery.cpp */; };
7C2612721825B6340086E04D /* DatabaseQuery.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C26126F1825B6340086E04D /* DatabaseQuery.cpp */; };
7C2D6AE40F35453E00DD2E85 /* SpecialProtocol.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C2D6AE20F35453E00DD2E85 /* SpecialProtocol.cpp */; };
- 7C3018311BCC2DE200B1FE6F /* MusicInfoTagLoaderFFmpeg.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C30182F1BCC2DE200B1FE6F /* MusicInfoTagLoaderFFmpeg.cpp */; settings = {ASSET_TAGS = (); }; };
- 7C3018321BCC2DE200B1FE6F /* MusicInfoTagLoaderFFmpeg.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C30182F1BCC2DE200B1FE6F /* MusicInfoTagLoaderFFmpeg.cpp */; settings = {ASSET_TAGS = (); }; };
+ 7C3018311BCC2DE200B1FE6F /* MusicInfoTagLoaderFFmpeg.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C30182F1BCC2DE200B1FE6F /* MusicInfoTagLoaderFFmpeg.cpp */; };
+ 7C3018321BCC2DE200B1FE6F /* MusicInfoTagLoaderFFmpeg.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C30182F1BCC2DE200B1FE6F /* MusicInfoTagLoaderFFmpeg.cpp */; };
7C4458BD161E203800A905F6 /* Screenshot.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C4458BB161E203800A905F6 /* Screenshot.cpp */; };
7C45DBE910F325C400D4BBF3 /* DAVDirectory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C45DBE710F325C400D4BBF3 /* DAVDirectory.cpp */; };
7C4705AE12EF584C00369E51 /* AddonInstaller.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C4705AC12EF584C00369E51 /* AddonInstaller.cpp */; };
@@ -583,7 +584,6 @@
7CCDACCB19275D790074CF51 /* NptAppleLogConfig.mm in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDACC019275D790074CF51 /* NptAppleLogConfig.mm */; };
7CCF7FC9106A0DF500992676 /* TimeUtils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCF7FC7106A0DF500992676 /* TimeUtils.cpp */; };
7CDAE9050FFCA3520040B25F /* DVDTSCorrection.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CDAE9030FFCA3520040B25F /* DVDTSCorrection.cpp */; };
- 7CDAEA7D1001CD6E0040B25F /* karaokelyricstextustar.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CDAEA7B1001CD6E0040B25F /* karaokelyricstextustar.cpp */; };
7CEBD8A80F33A0D800CAF6AD /* SpecialProtocolDirectory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CEBD8A60F33A0D800CAF6AD /* SpecialProtocolDirectory.cpp */; };
7CEE2E5B13D6B71E000ABF2A /* TimeSmoother.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CEE2E5913D6B71E000ABF2A /* TimeSmoother.cpp */; };
7CEE587D1B5A3FFB007C2B5A /* AudioDSPSettings.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CEE587C1B5A3FFB007C2B5A /* AudioDSPSettings.cpp */; };
@@ -681,7 +681,6 @@
DF02BA621A910623006DCA16 /* VideoSyncIos.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF02BA601A910623006DCA16 /* VideoSyncIos.cpp */; };
DF02BA661A91065F006DCA16 /* VideoSyncOsx.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF02BA641A91065F006DCA16 /* VideoSyncOsx.cpp */; };
DF033D381946612400BFC82E /* AEDeviceEnumerationOSX.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF033D361946612400BFC82E /* AEDeviceEnumerationOSX.cpp */; };
- DF07252E168734D7008DCAAD /* karaokevideobackground.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF07252C168734D7008DCAAD /* karaokevideobackground.cpp */; };
DF072534168734ED008DCAAD /* FFmpegVideoDecoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF072532168734ED008DCAAD /* FFmpegVideoDecoder.cpp */; };
DF0ABB73183A94A30018445D /* Utf8Utils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF0ABB71183A94A30018445D /* Utf8Utils.cpp */; };
DF0ABB74183A94A30018445D /* Utf8Utils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF0ABB71183A94A30018445D /* Utf8Utils.cpp */; };
@@ -1727,18 +1726,6 @@
E4991379174E5F0E00741B6D /* MusicArtistInfo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E36C29E80DA72486001F0C9D /* MusicArtistInfo.cpp */; };
E499137A174E5F0E00741B6D /* MusicInfoScanner.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1D930D25F9FD00618676 /* MusicInfoScanner.cpp */; };
E499137B174E5F0E00741B6D /* MusicInfoScraper.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1E670D25F9FD00618676 /* MusicInfoScraper.cpp */; };
- E499137C174E5F0E00741B6D /* GUIDialogKaraokeSongSelector.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F54C51D00F1E783200D46E3C /* GUIDialogKaraokeSongSelector.cpp */; };
- E499137D174E5F0E00741B6D /* GUIWindowKaraokeLyrics.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5AD1EA70F488A1A0065EB5D /* GUIWindowKaraokeLyrics.cpp */; };
- E499137E174E5F0E00741B6D /* karaokelyrics.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F54C51D60F1E785700D46E3C /* karaokelyrics.cpp */; };
- E499137F174E5F0E00741B6D /* karaokelyricscdg.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F54C51D40F1E784800D46E3C /* karaokelyricscdg.cpp */; };
- E4991380174E5F0E00741B6D /* karaokelyricsfactory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F54C51E20F1E787700D46E3C /* karaokelyricsfactory.cpp */; };
- E4991381174E5F0E00741B6D /* karaokelyricsmanager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F54C51E10F1E787700D46E3C /* karaokelyricsmanager.cpp */; };
- E4991382174E5F0E00741B6D /* karaokelyricstext.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F54C51E40F1E787700D46E3C /* karaokelyricstext.cpp */; };
- E4991383174E5F0E00741B6D /* karaokelyricstextkar.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F54C51DE0F1E787700D46E3C /* karaokelyricstextkar.cpp */; };
- E4991384174E5F0E00741B6D /* karaokelyricstextlrc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F54C51E30F1E787700D46E3C /* karaokelyricstextlrc.cpp */; };
- E4991385174E5F0E00741B6D /* karaokelyricstextustar.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CDAEA7B1001CD6E0040B25F /* karaokelyricstextustar.cpp */; };
- E4991386174E5F0E00741B6D /* karaokevideobackground.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF07252C168734D7008DCAAD /* karaokevideobackground.cpp */; };
- E4991387174E5F0E00741B6D /* karaokewindowbackground.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F56A084A0F4A18FB003F9F87 /* karaokewindowbackground.cpp */; };
E4991388174E5F0E00741B6D /* MusicInfoTag.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C85E129423A7009E7A26 /* MusicInfoTag.cpp */; };
E499138A174E5F0E00741B6D /* MusicInfoTagLoaderCDDA.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C866129423A7009E7A26 /* MusicInfoTagLoaderCDDA.cpp */; };
E499138B174E5F0E00741B6D /* MusicInfoTagLoaderDatabase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 18B7C868129423A7009E7A26 /* MusicInfoTagLoaderDatabase.cpp */; };
@@ -2101,14 +2088,6 @@
F548786D0FE060FF00E506FD /* DVDSubtitleParserMPL2.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F548786C0FE060FF00E506FD /* DVDSubtitleParserMPL2.cpp */; };
F5487B4C0FE6F02700E506FD /* StreamDetails.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5487B4B0FE6F02700E506FD /* StreamDetails.cpp */; };
F54BCC5F1439345300F86B0F /* HotKeyController.m in Sources */ = {isa = PBXBuildFile; fileRef = F54BCC5E1439345300F86B0F /* HotKeyController.m */; };
- F54C51D20F1E783200D46E3C /* GUIDialogKaraokeSongSelector.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F54C51D00F1E783200D46E3C /* GUIDialogKaraokeSongSelector.cpp */; };
- F54C51D50F1E784800D46E3C /* karaokelyricscdg.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F54C51D40F1E784800D46E3C /* karaokelyricscdg.cpp */; };
- F54C51D80F1E785700D46E3C /* karaokelyrics.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F54C51D60F1E785700D46E3C /* karaokelyrics.cpp */; };
- F54C51E50F1E787700D46E3C /* karaokelyricstextkar.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F54C51DE0F1E787700D46E3C /* karaokelyricstextkar.cpp */; };
- F54C51E60F1E787700D46E3C /* karaokelyricsmanager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F54C51E10F1E787700D46E3C /* karaokelyricsmanager.cpp */; };
- F54C51E70F1E787700D46E3C /* karaokelyricsfactory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F54C51E20F1E787700D46E3C /* karaokelyricsfactory.cpp */; };
- F54C51E80F1E787700D46E3C /* karaokelyricstextlrc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F54C51E30F1E787700D46E3C /* karaokelyricstextlrc.cpp */; };
- F54C51E90F1E787700D46E3C /* karaokelyricstext.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F54C51E40F1E787700D46E3C /* karaokelyricstext.cpp */; };
F558F25613ABCF7800631E12 /* WinEventsOSX.mm in Sources */ = {isa = PBXBuildFile; fileRef = F558F25513ABCF7800631E12 /* WinEventsOSX.mm */; };
F558F27B13ABD56600631E12 /* DirtyRegionSolvers.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F558F27913ABD56600631E12 /* DirtyRegionSolvers.cpp */; };
F558F27F13ABD57400631E12 /* DirtyRegionTracker.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F558F27D13ABD57400631E12 /* DirtyRegionTracker.cpp */; };
@@ -2124,7 +2103,6 @@
F56352C816E5436900D21BAD /* AppParamParser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F56352C616E5436900D21BAD /* AppParamParser.cpp */; };
F56353BF16E9BB3500D21BAD /* BitstreamConverter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F56353BD16E9BB3500D21BAD /* BitstreamConverter.cpp */; };
F56579AF13060D1E0085ED7F /* RenderCapture.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F56579AD13060D1E0085ED7F /* RenderCapture.cpp */; };
- F56A084B0F4A18FB003F9F87 /* karaokewindowbackground.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F56A084A0F4A18FB003F9F87 /* karaokewindowbackground.cpp */; };
F57A1D1E1329B15300498CC7 /* AutoPool.mm in Sources */ = {isa = PBXBuildFile; fileRef = F57A1D1D1329B15300498CC7 /* AutoPool.mm */; };
F57B6F801071B8B500079ACB /* JobManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F57B6F7E1071B8B500079ACB /* JobManager.cpp */; };
F584E12E0F257C5100DB26A5 /* HTTPDirectory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F584E12D0F257C5100DB26A5 /* HTTPDirectory.cpp */; };
@@ -2147,7 +2125,6 @@
F5A9D3091097C9370050490F /* AliasShortcutUtils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5A9D3081097C9370050490F /* AliasShortcutUtils.cpp */; };
F5AACA680FB3DE2D00DBB77C /* GUIDialogSelect.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5AACA670FB3DE2D00DBB77C /* GUIDialogSelect.cpp */; };
F5AACA970FB3E2B800DBB77C /* GUIDialogSlider.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5AACA950FB3E2B800DBB77C /* GUIDialogSlider.cpp */; };
- F5AD1EA80F488A1A0065EB5D /* GUIWindowKaraokeLyrics.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5AD1EA70F488A1A0065EB5D /* GUIWindowKaraokeLyrics.cpp */; };
F5AE409C13415D9E0004BD79 /* AudioLibrary.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5AE408013415D9E0004BD79 /* AudioLibrary.cpp */; };
F5AE409F13415D9E0004BD79 /* FileItemHandler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5AE408613415D9E0004BD79 /* FileItemHandler.cpp */; };
F5AE40A013415D9E0004BD79 /* FileOperations.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5AE408813415D9E0004BD79 /* FileOperations.cpp */; };
@@ -2515,6 +2492,26 @@
1DAFDB7B16DFDCA7007F8C68 /* PeripheralBusCEC.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PeripheralBusCEC.h; sourceTree = "<group>"; };
1DE0443315828F4B005DDB4D /* Exception.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Exception.cpp; path = commons/Exception.cpp; sourceTree = "<group>"; };
1DE0443415828F4B005DDB4D /* Exception.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Exception.h; path = commons/Exception.h; sourceTree = "<group>"; };
+ 2A1A5A581BDEAA6D0084702D /* kodi_adsp_dll.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = kodi_adsp_dll.h; sourceTree = "<group>"; };
+ 2A1A5A591BDEAA6D0084702D /* kodi_adsp_types.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = kodi_adsp_types.h; sourceTree = "<group>"; };
+ 2A1A5A5A1BDEAA6D0084702D /* kodi_audiodec_dll.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = kodi_audiodec_dll.h; sourceTree = "<group>"; };
+ 2A1A5A5B1BDEAA6D0084702D /* kodi_audiodec_types.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = kodi_audiodec_types.h; sourceTree = "<group>"; };
+ 2A1A5A5C1BDEAA6D0084702D /* kodi_audioengine_types.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = kodi_audioengine_types.h; sourceTree = "<group>"; };
+ 2A1A5A5D1BDEAA6D0084702D /* NOTE */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = NOTE; sourceTree = "<group>"; };
+ 2A1A5A5E1BDEAA6D0084702D /* xbmc_addon_cpp_dll.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = xbmc_addon_cpp_dll.h; sourceTree = "<group>"; };
+ 2A1A5A5F1BDEAA6D0084702D /* xbmc_addon_dll.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = xbmc_addon_dll.h; sourceTree = "<group>"; };
+ 2A1A5A601BDEAA6D0084702D /* xbmc_addon_types.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = xbmc_addon_types.h; sourceTree = "<group>"; };
+ 2A1A5A611BDEAA6D0084702D /* xbmc_audioenc_dll.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = xbmc_audioenc_dll.h; sourceTree = "<group>"; };
+ 2A1A5A621BDEAA6D0084702D /* xbmc_audioenc_types.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = xbmc_audioenc_types.h; sourceTree = "<group>"; };
+ 2A1A5A631BDEAA6D0084702D /* xbmc_codec_types.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = xbmc_codec_types.h; sourceTree = "<group>"; };
+ 2A1A5A641BDEAA6D0084702D /* xbmc_epg_types.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = xbmc_epg_types.h; sourceTree = "<group>"; };
+ 2A1A5A651BDEAA6D0084702D /* xbmc_pvr_dll.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = xbmc_pvr_dll.h; sourceTree = "<group>"; };
+ 2A1A5A661BDEAA6D0084702D /* xbmc_pvr_types.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = xbmc_pvr_types.h; sourceTree = "<group>"; };
+ 2A1A5A671BDEAA6D0084702D /* xbmc_scr_dll.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = xbmc_scr_dll.h; sourceTree = "<group>"; };
+ 2A1A5A681BDEAA6D0084702D /* xbmc_scr_types.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = xbmc_scr_types.h; sourceTree = "<group>"; };
+ 2A1A5A691BDEAA6D0084702D /* xbmc_stream_utils.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = xbmc_stream_utils.hpp; sourceTree = "<group>"; };
+ 2A1A5A6A1BDEAA6D0084702D /* xbmc_vis_dll.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = xbmc_vis_dll.h; sourceTree = "<group>"; };
+ 2A1A5A6B1BDEAA6D0084702D /* xbmc_vis_types.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = xbmc_vis_types.h; sourceTree = "<group>"; };
2A7B2BDB1BD6F16600044BCD /* PVRSettings.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PVRSettings.cpp; sourceTree = "<group>"; };
2A7B2BDE1BD6F18B00044BCD /* PVRSettings.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PVRSettings.h; sourceTree = "<group>"; };
2F4564D31970129A00396109 /* GUIFontCache.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GUIFontCache.cpp; sourceTree = "<group>"; };
@@ -3223,8 +3220,6 @@
7CCF7FC8106A0DF500992676 /* TimeUtils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TimeUtils.h; sourceTree = "<group>"; };
7CDAE9030FFCA3520040B25F /* DVDTSCorrection.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DVDTSCorrection.cpp; sourceTree = "<group>"; };
7CDAE9040FFCA3520040B25F /* DVDTSCorrection.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DVDTSCorrection.h; sourceTree = "<group>"; };
- 7CDAEA7B1001CD6E0040B25F /* karaokelyricstextustar.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = karaokelyricstextustar.cpp; sourceTree = "<group>"; };
- 7CDAEA7C1001CD6E0040B25F /* karaokelyricstextustar.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = karaokelyricstextustar.h; sourceTree = "<group>"; };
7CEBD8A60F33A0D800CAF6AD /* SpecialProtocolDirectory.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SpecialProtocolDirectory.cpp; sourceTree = "<group>"; };
7CEBD8A70F33A0D800CAF6AD /* SpecialProtocolDirectory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SpecialProtocolDirectory.h; sourceTree = "<group>"; };
7CEE2E5913D6B71E000ABF2A /* TimeSmoother.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TimeSmoother.cpp; sourceTree = "<group>"; };
@@ -3403,8 +3398,6 @@
DF02BA651A91065F006DCA16 /* VideoSyncOsx.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VideoSyncOsx.h; path = videosync/VideoSyncOsx.h; sourceTree = "<group>"; };
DF033D361946612400BFC82E /* AEDeviceEnumerationOSX.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = AEDeviceEnumerationOSX.cpp; path = Sinks/osx/AEDeviceEnumerationOSX.cpp; sourceTree = "<group>"; };
DF033D371946612400BFC82E /* AEDeviceEnumerationOSX.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AEDeviceEnumerationOSX.h; path = Sinks/osx/AEDeviceEnumerationOSX.h; sourceTree = "<group>"; };
- DF07252C168734D7008DCAAD /* karaokevideobackground.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = karaokevideobackground.cpp; sourceTree = "<group>"; };
- DF07252D168734D7008DCAAD /* karaokevideobackground.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = karaokevideobackground.h; sourceTree = "<group>"; };
DF072532168734ED008DCAAD /* FFmpegVideoDecoder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FFmpegVideoDecoder.cpp; sourceTree = "<group>"; };
DF072533168734ED008DCAAD /* FFmpegVideoDecoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FFmpegVideoDecoder.h; sourceTree = "<group>"; };
DF0ABB71183A94A30018445D /* Utf8Utils.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Utf8Utils.cpp; sourceTree = "<group>"; };
@@ -4629,22 +4622,6 @@
F5487B4B0FE6F02700E506FD /* StreamDetails.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = StreamDetails.cpp; sourceTree = "<group>"; };
F54BCC5D1439345300F86B0F /* HotKeyController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HotKeyController.h; sourceTree = "<group>"; };
F54BCC5E1439345300F86B0F /* HotKeyController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HotKeyController.m; sourceTree = "<group>"; };
- F54C51D00F1E783200D46E3C /* GUIDialogKaraokeSongSelector.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GUIDialogKaraokeSongSelector.cpp; sourceTree = "<group>"; };
- F54C51D10F1E783200D46E3C /* GUIDialogKaraokeSongSelector.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GUIDialogKaraokeSongSelector.h; sourceTree = "<group>"; };
- F54C51D30F1E784800D46E3C /* karaokelyricscdg.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = karaokelyricscdg.h; sourceTree = "<group>"; };
- F54C51D40F1E784800D46E3C /* karaokelyricscdg.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = karaokelyricscdg.cpp; sourceTree = "<group>"; };
- F54C51D60F1E785700D46E3C /* karaokelyrics.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = karaokelyrics.cpp; sourceTree = "<group>"; };
- F54C51D70F1E785700D46E3C /* karaokelyrics.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = karaokelyrics.h; sourceTree = "<group>"; };
- F54C51DB0F1E787700D46E3C /* karaokelyricsmanager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = karaokelyricsmanager.h; sourceTree = "<group>"; };
- F54C51DC0F1E787700D46E3C /* karaokelyricsfactory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = karaokelyricsfactory.h; sourceTree = "<group>"; };
- F54C51DD0F1E787700D46E3C /* karaokelyricstext.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = karaokelyricstext.h; sourceTree = "<group>"; };
- F54C51DE0F1E787700D46E3C /* karaokelyricstextkar.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = karaokelyricstextkar.cpp; sourceTree = "<group>"; };
- F54C51DF0F1E787700D46E3C /* karaokelyricstextkar.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = karaokelyricstextkar.h; sourceTree = "<group>"; };
- F54C51E00F1E787700D46E3C /* karaokelyricstextlrc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = karaokelyricstextlrc.h; sourceTree = "<group>"; };
- F54C51E10F1E787700D46E3C /* karaokelyricsmanager.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = karaokelyricsmanager.cpp; sourceTree = "<group>"; };
- F54C51E20F1E787700D46E3C /* karaokelyricsfactory.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = karaokelyricsfactory.cpp; sourceTree = "<group>"; };
- F54C51E30F1E787700D46E3C /* karaokelyricstextlrc.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = karaokelyricstextlrc.cpp; sourceTree = "<group>"; };
- F54C51E40F1E787700D46E3C /* karaokelyricstext.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = karaokelyricstext.cpp; sourceTree = "<group>"; };
F558F25413ABCF7800631E12 /* WinEventsOSX.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WinEventsOSX.h; sourceTree = "<group>"; };
F558F25513ABCF7800631E12 /* WinEventsOSX.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = WinEventsOSX.mm; sourceTree = "<group>"; };
F558F27813ABD56600631E12 /* DirtyRegion.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DirtyRegion.h; sourceTree = "<group>"; };
@@ -4674,8 +4651,6 @@
F56353BE16E9BB3500D21BAD /* BitstreamConverter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BitstreamConverter.h; sourceTree = "<group>"; };
F56579AD13060D1E0085ED7F /* RenderCapture.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RenderCapture.cpp; sourceTree = "<group>"; };
F56579AE13060D1E0085ED7F /* RenderCapture.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RenderCapture.h; sourceTree = "<group>"; };
- F56A08490F4A18FB003F9F87 /* karaokewindowbackground.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = karaokewindowbackground.h; sourceTree = "<group>"; };
- F56A084A0F4A18FB003F9F87 /* karaokewindowbackground.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = karaokewindowbackground.cpp; sourceTree = "<group>"; };
F57A1D1C1329B15300498CC7 /* AutoPool.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AutoPool.h; sourceTree = "<group>"; };
F57A1D1D1329B15300498CC7 /* AutoPool.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = AutoPool.mm; sourceTree = "<group>"; };
F57B6F7E1071B8B500079ACB /* JobManager.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JobManager.cpp; sourceTree = "<group>"; };
@@ -4714,8 +4689,6 @@
F5AACA670FB3DE2D00DBB77C /* GUIDialogSelect.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GUIDialogSelect.cpp; sourceTree = "<group>"; };
F5AACA950FB3E2B800DBB77C /* GUIDialogSlider.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GUIDialogSlider.cpp; sourceTree = "<group>"; };
F5AACA960FB3E2B800DBB77C /* GUIDialogSlider.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GUIDialogSlider.h; sourceTree = "<group>"; };
- F5AD1EA60F488A1A0065EB5D /* GUIWindowKaraokeLyrics.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GUIWindowKaraokeLyrics.h; sourceTree = "<group>"; };
- F5AD1EA70F488A1A0065EB5D /* GUIWindowKaraokeLyrics.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GUIWindowKaraokeLyrics.cpp; sourceTree = "<group>"; };
F5AE408013415D9E0004BD79 /* AudioLibrary.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = AudioLibrary.cpp; sourceTree = "<group>"; };
F5AE408113415D9E0004BD79 /* AudioLibrary.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AudioLibrary.h; sourceTree = "<group>"; };
F5AE408613415D9E0004BD79 /* FileItemHandler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FileItemHandler.cpp; sourceTree = "<group>"; };
@@ -4922,6 +4895,7 @@
18B49FF01152BEEB001AF8A6 /* addons */ = {
isa = PBXGroup;
children = (
+ 2A1A5A571BDEAA6D0084702D /* include */,
7C226E3C1BA5F61C00185CE0 /* AddonCallbacksAudioEngine.cpp */,
7C226E3D1BA5F61C00185CE0 /* AddonCallbacksAudioEngine.h */,
7C973CE31B50378E0002A874 /* AddonCallbacksAudioDSP.cpp */,
@@ -5197,7 +5171,6 @@
children = (
431376A812D640B500680C15 /* dialogs */,
431376CC12D6421A00680C15 /* infoscanner */,
- 431376D412D6427900680C15 /* karaoke */,
18B7C854129423A7009E7A26 /* tags */,
431376DC12D6430600680C15 /* windows */,
E36C29DC0DA72429001F0C9D /* Album.cpp */,
@@ -5337,6 +5310,33 @@
path = virtual;
sourceTree = "<group>";
};
+ 2A1A5A571BDEAA6D0084702D /* include */ = {
+ isa = PBXGroup;
+ children = (
+ 2A1A5A581BDEAA6D0084702D /* kodi_adsp_dll.h */,
+ 2A1A5A591BDEAA6D0084702D /* kodi_adsp_types.h */,
+ 2A1A5A5A1BDEAA6D0084702D /* kodi_audiodec_dll.h */,
+ 2A1A5A5B1BDEAA6D0084702D /* kodi_audiodec_types.h */,
+ 2A1A5A5C1BDEAA6D0084702D /* kodi_audioengine_types.h */,
+ 2A1A5A5D1BDEAA6D0084702D /* NOTE */,
+ 2A1A5A5E1BDEAA6D0084702D /* xbmc_addon_cpp_dll.h */,
+ 2A1A5A5F1BDEAA6D0084702D /* xbmc_addon_dll.h */,
+ 2A1A5A601BDEAA6D0084702D /* xbmc_addon_types.h */,
+ 2A1A5A611BDEAA6D0084702D /* xbmc_audioenc_dll.h */,
+ 2A1A5A621BDEAA6D0084702D /* xbmc_audioenc_types.h */,
+ 2A1A5A631BDEAA6D0084702D /* xbmc_codec_types.h */,
+ 2A1A5A641BDEAA6D0084702D /* xbmc_epg_types.h */,
+ 2A1A5A651BDEAA6D0084702D /* xbmc_pvr_dll.h */,
+ 2A1A5A661BDEAA6D0084702D /* xbmc_pvr_types.h */,
+ 2A1A5A671BDEAA6D0084702D /* xbmc_scr_dll.h */,
+ 2A1A5A681BDEAA6D0084702D /* xbmc_scr_types.h */,
+ 2A1A5A691BDEAA6D0084702D /* xbmc_stream_utils.hpp */,
+ 2A1A5A6A1BDEAA6D0084702D /* xbmc_vis_dll.h */,
+ 2A1A5A6B1BDEAA6D0084702D /* xbmc_vis_types.h */,
+ );
+ path = include;
+ sourceTree = "<group>";
+ };
38F4E56013CCCB3B00664821 /* platform */ = {
isa = PBXGroup;
children = (
@@ -5517,37 +5517,6 @@
path = infoscanner;
sourceTree = "<group>";
};
- 431376D412D6427900680C15 /* karaoke */ = {
- isa = PBXGroup;
- children = (
- F54C51D00F1E783200D46E3C /* GUIDialogKaraokeSongSelector.cpp */,
- F54C51D10F1E783200D46E3C /* GUIDialogKaraokeSongSelector.h */,
- F5AD1EA70F488A1A0065EB5D /* GUIWindowKaraokeLyrics.cpp */,
- F5AD1EA60F488A1A0065EB5D /* GUIWindowKaraokeLyrics.h */,
- F54C51D60F1E785700D46E3C /* karaokelyrics.cpp */,
- F54C51D70F1E785700D46E3C /* karaokelyrics.h */,
- F54C51D40F1E784800D46E3C /* karaokelyricscdg.cpp */,
- F54C51D30F1E784800D46E3C /* karaokelyricscdg.h */,
- F54C51E20F1E787700D46E3C /* karaokelyricsfactory.cpp */,
- F54C51DC0F1E787700D46E3C /* karaokelyricsfactory.h */,
- F54C51E10F1E787700D46E3C /* karaokelyricsmanager.cpp */,
- F54C51DB0F1E787700D46E3C /* karaokelyricsmanager.h */,
- F54C51E40F1E787700D46E3C /* karaokelyricstext.cpp */,
- F54C51DD0F1E787700D46E3C /* karaokelyricstext.h */,
- F54C51DE0F1E787700D46E3C /* karaokelyricstextkar.cpp */,
- F54C51DF0F1E787700D46E3C /* karaokelyricstextkar.h */,
- F54C51E30F1E787700D46E3C /* karaokelyricstextlrc.cpp */,
- F54C51E00F1E787700D46E3C /* karaokelyricstextlrc.h */,
- 7CDAEA7B1001CD6E0040B25F /* karaokelyricstextustar.cpp */,
- 7CDAEA7C1001CD6E0040B25F /* karaokelyricstextustar.h */,
- DF07252C168734D7008DCAAD /* karaokevideobackground.cpp */,
- DF07252D168734D7008DCAAD /* karaokevideobackground.h */,
- F56A084A0F4A18FB003F9F87 /* karaokewindowbackground.cpp */,
- F56A08490F4A18FB003F9F87 /* karaokewindowbackground.h */,
- );
- path = karaoke;
- sourceTree = "<group>";
- };
431376DC12D6430600680C15 /* windows */ = {
isa = PBXGroup;
children = (
@@ -8951,6 +8920,7 @@
buildActionMask = 2147483647;
files = (
E49910B5174D0E2A00741B6D /* Default-568h@2x.png in Resources */,
+ 2A1A5A6C1BDEAA6D0084702D /* NOTE in Resources */,
E49910B6174D0E2A00741B6D /* InfoPlist.strings in Resources */,
DFFA440119104C1300C3923B /* AppIcon29x29.png in Resources */,
DFFA440219104C1300C3923B /* AppIcon29x29@2x.png in Resources */,
@@ -9520,20 +9490,10 @@
F584E12E0F257C5100DB26A5 /* HTTPDirectory.cpp in Sources */,
397877D51AAAF87700F98A45 /* Speed.cpp in Sources */,
7C8E02341BA35D0B0072E8B2 /* OpticalBuiltins.cpp in Sources */,
- F54C51D20F1E783200D46E3C /* GUIDialogKaraokeSongSelector.cpp in Sources */,
DF29BCF71B5D911800904347 /* MediaLibraryEvent.cpp in Sources */,
2F4564D51970129A00396109 /* GUIFontCache.cpp in Sources */,
- F54C51D50F1E784800D46E3C /* karaokelyricscdg.cpp in Sources */,
- F54C51D80F1E785700D46E3C /* karaokelyrics.cpp in Sources */,
- F54C51E50F1E787700D46E3C /* karaokelyricstextkar.cpp in Sources */,
- F54C51E60F1E787700D46E3C /* karaokelyricsmanager.cpp in Sources */,
- F54C51E70F1E787700D46E3C /* karaokelyricsfactory.cpp in Sources */,
- F54C51E80F1E787700D46E3C /* karaokelyricstextlrc.cpp in Sources */,
- F54C51E90F1E787700D46E3C /* karaokelyricstext.cpp in Sources */,
7CEBD8A80F33A0D800CAF6AD /* SpecialProtocolDirectory.cpp in Sources */,
7C2D6AE40F35453E00DD2E85 /* SpecialProtocol.cpp in Sources */,
- F5AD1EA80F488A1A0065EB5D /* GUIWindowKaraokeLyrics.cpp in Sources */,
- F56A084B0F4A18FB003F9F87 /* karaokewindowbackground.cpp in Sources */,
F51CEEEF0F5C5D20004F4602 /* OSXGNUReplacements.c in Sources */,
F5EA02260F6DA990005C2EC5 /* CocoaPowerSyscall.cpp in Sources */,
F5EA02270F6DA9A5005C2EC5 /* PowerManager.cpp in Sources */,
@@ -9551,7 +9511,6 @@
7CDAE9050FFCA3520040B25F /* DVDTSCorrection.cpp in Sources */,
E4DC97540FFE5BA8008E0C07 /* SAPDirectory.cpp in Sources */,
E4DC97550FFE5BA8008E0C07 /* SAPFile.cpp in Sources */,
- 7CDAEA7D1001CD6E0040B25F /* karaokelyricstextustar.cpp in Sources */,
F5D8D732102BB3B1004A11AB /* OverlayRendererGL.cpp in Sources */,
F5D8D733102BB3B1004A11AB /* OverlayRenderer.cpp in Sources */,
E49ACD8C100745C400A86ECD /* ZeroconfDirectory.cpp in Sources */,
@@ -9993,7 +9952,6 @@
F5EDC48C1651A6F900B852D8 /* GroupUtils.cpp in Sources */,
7C7CEAF1165629530059C9EB /* AELimiter.cpp in Sources */,
DFB02DEA16629DBA00F37752 /* PyContext.cpp in Sources */,
- DF07252E168734D7008DCAAD /* karaokevideobackground.cpp in Sources */,
DF072534168734ED008DCAAD /* FFmpegVideoDecoder.cpp in Sources */,
7C8E02221BA35D0B0072E8B2 /* Builtins.cpp in Sources */,
395F6DE21A81FACF0088CC74 /* HTTPImageTransformationHandler.cpp in Sources */,
@@ -10756,20 +10714,8 @@
E4991379174E5F0E00741B6D /* MusicArtistInfo.cpp in Sources */,
E499137A174E5F0E00741B6D /* MusicInfoScanner.cpp in Sources */,
E499137B174E5F0E00741B6D /* MusicInfoScraper.cpp in Sources */,
- E499137C174E5F0E00741B6D /* GUIDialogKaraokeSongSelector.cpp in Sources */,
- E499137D174E5F0E00741B6D /* GUIWindowKaraokeLyrics.cpp in Sources */,
- E499137E174E5F0E00741B6D /* karaokelyrics.cpp in Sources */,
7C8E022C1BA35D0B0072E8B2 /* GUIContainerBuiltins.cpp in Sources */,
DF54F8041B6580C8000FCBA4 /* ContextMenuAddon.cpp in Sources */,
- E499137F174E5F0E00741B6D /* karaokelyricscdg.cpp in Sources */,
- E4991380174E5F0E00741B6D /* karaokelyricsfactory.cpp in Sources */,
- E4991381174E5F0E00741B6D /* karaokelyricsmanager.cpp in Sources */,
- E4991382174E5F0E00741B6D /* karaokelyricstext.cpp in Sources */,
- E4991383174E5F0E00741B6D /* karaokelyricstextkar.cpp in Sources */,
- E4991384174E5F0E00741B6D /* karaokelyricstextlrc.cpp in Sources */,
- E4991385174E5F0E00741B6D /* karaokelyricstextustar.cpp in Sources */,
- E4991386174E5F0E00741B6D /* karaokevideobackground.cpp in Sources */,
- E4991387174E5F0E00741B6D /* karaokewindowbackground.cpp in Sources */,
E4991388174E5F0E00741B6D /* MusicInfoTag.cpp in Sources */,
E499138A174E5F0E00741B6D /* MusicInfoTagLoaderCDDA.cpp in Sources */,
E499138B174E5F0E00741B6D /* MusicInfoTagLoaderDatabase.cpp in Sources */,
diff --git a/Makefile.in b/Makefile.in
index 8ead761782..c85825260d 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -64,7 +64,6 @@ DIRECTORY_ARCHIVES=$(DVDPLAYER_ARCHIVES) \
xbmc/messaging/helpers/messagingHelpers.a \
xbmc/music/dialogs/musicdialogs.a \
xbmc/music/infoscanner/musicscanner.a \
- xbmc/music/karaoke/karaoke.a \
xbmc/music/music.a \
xbmc/music/tags/musictags.a \
xbmc/music/windows/musicwindows.a \
diff --git a/Makefile.include.in b/Makefile.include.in
index 471933991c..510a6e0a12 100644
--- a/Makefile.include.in
+++ b/Makefile.include.in
@@ -1,5 +1,5 @@
AR=@AR@
-ARFLAGS=crus
+ARFLAGS=crs
RM=rm -rf
SHELL=@SHELL@
ARCH=@ARCH@
diff --git a/addons/metadata.common.imdb.com/addon.xml b/addons/metadata.common.imdb.com/addon.xml
index 89cef20ae2..19ff5490fa 100644
--- a/addons/metadata.common.imdb.com/addon.xml
+++ b/addons/metadata.common.imdb.com/addon.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<addon id="metadata.common.imdb.com"
name="IMDB Scraper Library"
- version="2.7.9"
+ version="2.8.0"
provider-name="XBMC Foundation">
<requires>
<import addon="xbmc.metadata" version="2.1.0"/>
diff --git a/addons/metadata.common.imdb.com/changelog.txt b/addons/metadata.common.imdb.com/changelog.txt
index d310c4a047..38b9169b8b 100644
--- a/addons/metadata.common.imdb.com/changelog.txt
+++ b/addons/metadata.common.imdb.com/changelog.txt
@@ -1,3 +1,6 @@
+[B]2.8.0[/B]
+- fixed: won't scrape IMDb TOP250
+
[B]2.7.8[/B]
- fixed: add xml header
diff --git a/addons/metadata.common.imdb.com/imdb.xml b/addons/metadata.common.imdb.com/imdb.xml
index 0ea0e5f457..c1a0a9cacc 100644
--- a/addons/metadata.common.imdb.com/imdb.xml
+++ b/addons/metadata.common.imdb.com/imdb.xml
@@ -36,7 +36,7 @@
<ParseIMDBTOP250 dest="5">
<RegExp input="$$2" output="&lt;details&gt;\1&lt;/details&gt;" dest="5">
<RegExp input="$$1" output="&lt;top250&gt;\1&lt;/top250&gt;" dest="2">
- <expression>Top\s250\s#([0-9]*)&lt;/</expression>
+ <expression>Top\sRated\sMovies\s#([0-9]*)</expression>
</RegExp>
<expression noclean="1" />
</RegExp>
diff --git a/addons/metadata.common.last.fm/addon.xml b/addons/metadata.common.last.fm/addon.xml
deleted file mode 100644
index e1aabd9398..0000000000
--- a/addons/metadata.common.last.fm/addon.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<addon id="metadata.common.last.fm"
- name="Last.FM Scraper Library"
- version="1.6.2"
- provider-name="XBMC Foundation">
- <requires>
- <import addon="xbmc.metadata" version="2.1.0"/>
- </requires>
- <extension point="xbmc.metadata.scraper.library"
- library="lastfm.xml"/>
- <extension point="xbmc.addon.metadata">
- <platform>all</platform>
- <summary lang="bg">Библиотека за ÑвалÑне на инф. от LastFM</summary>
- <summary lang="en">LastFM Scraper Library</summary>
- <summary lang="de">Musik-Scraper für LastFM</summary>
- <summary lang="es">Scraper de música de LastFM</summary>
- <summary lang="fi">LastFM musiikkitietojen lataaja</summary>
- <summary lang="fr">Scraper LastFM</summary>
- <summary lang="hu">LastFM leolvasó-könyvtár</summary>
- <summary lang="nl">LastFM-scraperfuncties</summary>
- <summary lang="pl">Scraper biblioteki LastFM</summary>
- <summary lang="pt">Scraper de música LastFM</summary>
- <summary lang="ru">Обработчик Ð´Ð»Ñ LastFM</summary>
- <summary lang="se">Skrapebibliotek för LastFM</summary>
- <summary lang="zh">LastFM刮削器代ç åº“</summary>
- <description lang="bg">Извлича инф. за музикални файлове от www.last.fm</description>
- <description lang="en">Download Music information from www.last.fm</description>
- <description lang="de">Downloade Musik informationen von www.last.fm</description>
- <description lang="es">Descargar información musical de www.last.fm</description>
- <description lang="fi">Lataa musiikkitietoja osoitteesta www.last.fm</description>
- <description lang="fr">Télécharge les infos musicales depuis www.last.fm</description>
- <description lang="hu">Zene információk letöltése a www.last.fm webhelyről</description>
- <description lang="nl">Muziekinfo ophalen van LastFM</description>
- <description lang="pl">Pobieraj informacje o muzyce z www.last.fm</description>
- <description lang="pt">Descarregar informação de música de www.last.fm</description>
- <description lang="ru">Загружать информацию о Музыке Ñ www.last.fm</description>
- <description lang="se">Ladda ner musikinformation från www.last.fm</description>
- <description lang="zh">从www.last.fm下载音ä¹ä¿¡æ¯</description>
- </extension>
-</addon>
diff --git a/addons/metadata.common.last.fm/icon.png b/addons/metadata.common.last.fm/icon.png
deleted file mode 100644
index 95692bec7b..0000000000
--- a/addons/metadata.common.last.fm/icon.png
+++ /dev/null
Binary files differ
diff --git a/addons/metadata.common.last.fm/lastfm.xml b/addons/metadata.common.last.fm/lastfm.xml
deleted file mode 100644
index 0c5b26341b..0000000000
--- a/addons/metadata.common.last.fm/lastfm.xml
+++ /dev/null
@@ -1,306 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<scraperfunctions>
- <GetLastFMDiscographyByMBID dest="5" clearbuffers="no">
- <RegExp input="$$1" output="&lt;details&gt;&lt;url function=&quot;ParseLastFMDiscography&quot; cache=&quot;lastfmdiscog-\1.xml&quot;&gt;http://ws.audioscrobbler.com/2.0/?method=artist.gettopalbums&amp;amp;mbid=\1&amp;amp;api_key=71e468a84c1f40d4991ddccc46e40f1b&lt;/url&gt;&lt;/details&gt;" dest="5">
- <expression noclean="1"/>
- </RegExp>
- </GetLastFMDiscographyByMBID>
- <GetLastFMDiscography dest="5" clearbuffers="no">
- <RegExp input="$$1" output="&lt;details&gt;&lt;url function=&quot;ParseLastFMDiscography&quot;&gt;http://ws.audioscrobbler.com/2.0/?method=artist.gettopalbums&amp;amp;artist=\1&amp;amp;api_key=71e468a84c1f40d4991ddccc46e40f1b&lt;/url&gt;&lt;/details&gt;" dest="5">
- <expression noclean="1"/>
- </RegExp>
- </GetLastFMDiscography>
- <ParseLastFMDiscography dest="5" clearbuffers="no">
- <RegExp input="$$2" output="&lt;details&gt;\1&lt;/details&gt;" dest="5">
- <RegExp input="" output="" dest="2">
- <expression />
- </RegExp>
- <RegExp input="$$1" output="&lt;album&gt;&lt;title&gt;\1&lt;/title&gt;&lt;/album&gt;" dest="2">
- <expression repeat="yes">&lt;album[^&gt;]*&gt;[^&lt;]*&lt;name&gt;([^&lt;]*?)&lt;/name&gt;</expression>
- </RegExp>
- <expression noclean="1"/>
- </RegExp>
- </ParseLastFMDiscography>
-
- <GetLastFMBiographyByMBID dest="5" clearbuffers="no">
- <RegExp input="$$1" output="&lt;details&gt;&lt;url function=&quot;ParseLastFMBiography&quot; cache=&quot;lastfmartistinfo-\1.xml&quot;&gt;http://ws.audioscrobbler.com/2.0/?method=artist.getinfo&amp;amp;mbid=\1&amp;amp;api_key=71e468a84c1f40d4991ddccc46e40f1b&amp;lang=$INFO[lastfmlanguage]&lt;/url&gt;&lt;/details&gt;" dest="5">
- <expression noclean="1"/>
- </RegExp>
- </GetLastFMBiographyByMBID>
- <ParseLastFMBiography dest="5" clearbuffers="no">
- <RegExp input="$$6" output="&lt;details&gt;\1&lt;/details&gt;" dest="5">
- <RegExp input="" output="" dest="6">
- <expression />
- </RegExp>
- <RegExp input="" output="" dest="11">
- <expression />
- </RegExp>
- <RegExp input="$$1" output="\1" dest="11">
- <expression fixchars="1">&lt;content&gt;&lt;!\[CDATA\[(.*?)\]\]</expression>
- </RegExp>
- <RegExp input="$$11" output="$$12" dest="6">
- <RegExp input="$INFO[biogfbsource]" output="&lt;chain function=&quot;GetAMGFallbackBiographyByAMGID&quot;&gt;$$9&lt;/chain&gt;" dest="12">
- <expression>allmusic.com</expression>
- </RegExp>
- <RegExp input="$INFO[biogfbsource]" output="&lt;chain function=&quot;GetTADBFMFallbackBiographyByMBID&quot;&gt;$$9&lt;/chain&gt;" dest="12">
- <expression>TheAudioDb.com</expression>
- </RegExp>
- <expression>^$</expression>
- </RegExp>
- <RegExp input="$$11" output="&lt;biography&gt;\1&lt;/biography&gt;" dest="6">
- <expression>(.+)</expression>
- </RegExp>
- <expression noclean="1"/>
- </RegExp>
- </ParseLastFMBiography>
-
- <GetLastFMFallbackBiographyByMBID dest="5" clearbuffers="no">
- <RegExp input="$$1" output="&lt;details&gt;&lt;url function=&quot;ParseLastFMFallbackBiography&quot; cache=&quot;lastfmartistinfo-\1.xml&quot;&gt;http://ws.audioscrobbler.com/2.0/?method=artist.getinfo&amp;amp;mbid=\1&amp;amp;api_key=71e468a84c1f40d4991ddccc46e40f1b&amp;lang=$INFO[lastfmlanguage]&lt;/url&gt;&lt;/details&gt;" dest="5">
- <expression noclean="1"/>
- </RegExp>
- </GetLastFMFallbackBiographyByMBID>
- <ParseLastFMFallbackBiography dest="5" clearbuffers="no">
- <RegExp input="$$6" output="&lt;details&gt;\1&lt;/details&gt;" dest="5">
- <RegExp input="" output="" dest="6">
- <expression />
- </RegExp>
- <RegExp input="$$1" output="&lt;biography&gt;\1&lt;/biography&gt;" dest="6">
- <expression fixchars="1">&lt;content&gt;&lt;!\[CDATA\[(.*?)\]\]</expression>
- </RegExp>
- <expression noclean="1"/>
- </RegExp>
- </ParseLastFMFallbackBiography>
-
- <GetLastFMArtistGenresByMBID dest="5" clearbuffers="no">
- <RegExp input="$$1" output="&lt;details&gt;&lt;url function=&quot;ParseLastFMArtistGenres&quot; cache=&quot;lastfmgenres-\1.xml&quot;&gt;http://ws.audioscrobbler.com/2.0/?method=artist.gettoptags&amp;amp;mbid=\1&amp;amp;api_key=71e468a84c1f40d4991ddccc46e40f1b&amp;lang=$INFO[lastfmlanguage]&lt;/url&gt;&lt;/details&gt;" dest="5">
- <expression noclean="1"/>
- </RegExp>
- </GetLastFMArtistGenresByMBID>
- <ParseLastFMArtistGenres dest="5" clearbuffers="no">
- <RegExp input="$$4" output="&lt;details&gt;\1&lt;/details&gt;" dest="5">
- <RegExp input="" output="" dest="4">
- <expression />
- </RegExp>
- <RegExp input="$$1" output="&lt;genre&gt;\1&lt;/genre&gt;" dest="11">
- <expression noclean="1">&lt;tag&gt;.*?&lt;name&gt;([^/lt;]*)&lt;/name&gt;</expression>
- </RegExp>
- <RegExp input="$$11" output="$$12" dest="4">
- <RegExp input="$INFO[genresfbsource]" output="&lt;chain function=&quot;GetAMGFallbackArtistGenresByAMGID&quot;&gt;$$9&lt;/chain&gt;" dest="12">
- <expression>allmusic.com</expression>
- </RegExp>
- <RegExp input="$INFO[genresfbsource]" output="&lt;chain function=&quot;GetTADBFallbackArtistGenresByMBID&quot;&gt;$$8&lt;/chain&gt;" dest="12">
- <expression>TheAudioDb.com</expression>
- </RegExp>
- <expression>&lt;genre&gt;&lt;/genre&gt;</expression>
- </RegExp>
- <RegExp input="$$11" output="$$11" dest="4">
- <expression>&lt;genre&gt;(.+)&lt;/genre&gt;</expression>
- </RegExp>
- <expression noclean="1" />
- </RegExp>
- </ParseLastFMArtistGenres>
-
- <GetLastFMFallbackArtistGenresByMBID dest="5" clearbuffers="no">
- <RegExp input="$$1" output="&lt;details&gt;&lt;url function=&quot;ParseLastFMFallbackArtistGenres&quot; cache=&quot;lastfmgenres-\1.xml&quot;&gt;http://ws.audioscrobbler.com/2.0/?method=artist.gettoptags&amp;amp;mbid=\1&amp;amp;api_key=71e468a84c1f40d4991ddccc46e40f1b&amp;lang=$INFO[lastfmlanguage]&lt;/url&gt;&lt;/details&gt;" dest="5">
- <expression noclean="1"/>
- </RegExp>
- </GetLastFMFallbackArtistGenresByMBID>
- <ParseLastFMFallbackArtistGenres dest="5" clearbuffers="no">
- <RegExp input="$$4" output="&lt;details&gt;\1&lt;/details&gt;" dest="5">
- <RegExp input="" output="" dest="4">
- <expression />
- </RegExp>
- <RegExp input="$$1" output="&lt;genre&gt;\1&lt;/genre&gt;" dest="4">
- <expression noclean="1">&lt;tag&gt;.*?&lt;name&gt;([^/lt;]*)&lt;/name&gt;</expression>
- </RegExp>
- <expression noclean="1"/>
- </RegExp>
- </ParseLastFMFallbackArtistGenres>
-
- <GetLastFMArtistStylesByMBID dest="5" clearbuffers="no">
- <RegExp input="$$1" output="&lt;details&gt;&lt;url function=&quot;ParseLastFMArtistStyles&quot; cache=&quot;lastfmgenres-\1.xml&quot;&gt;http://ws.audioscrobbler.com/2.0/?method=artist.gettoptags&amp;amp;mbid=\1&amp;amp;api_key=71e468a84c1f40d4991ddccc46e40f1b&amp;lang=$INFO[lastfmlanguage]&lt;/url&gt;&lt;/details&gt;" dest="5">
- <expression noclean="1"/>
- </RegExp>
- </GetLastFMArtistStylesByMBID>
- <ParseLastFMArtistStyles dest="5" clearbuffers="no">
- <RegExp input="$$4" output="&lt;details&gt;\1&lt;/details&gt;" dest="5">
- <RegExp input="" output="" dest="4">
- <expression />
- </RegExp>
- <RegExp input="$$1" output="&lt;style&gt;\1&lt;/style&gt;" dest="11">
- <expression repeat="yes" noclean="1">&lt;tag&gt;.*?&lt;name&gt;([^/lt;]*)&lt;/name&gt;</expression>
- </RegExp>
- <RegExp input="$$11" output="$$12" dest="4">
- <RegExp input="$INFO[genresfbsource]" output="&lt;chain function=&quot;GetAMGFallbackArtistStylesByAMGID&quot;&gt;$$9&lt;/chain&gt;" dest="12">
- <expression>allmusic.com</expression>
- </RegExp>
- <expression>&lt;style&gt;&lt;/style&gt;</expression>
- </RegExp>
- <RegExp input="$$11" output="$$11" dest="4">
- <expression>&lt;style&gt;(.+)&lt;/style&gt;</expression>
- </RegExp>
- <expression noclean="1" />
- </RegExp>
- </ParseLastFMArtistStyles>
-
- <GetLastFMFallbackArtistStylesByMBID dest="5" clearbuffers="no">
- <RegExp input="$$1" output="&lt;details&gt;&lt;url function=&quot;ParseLastFMFallbackArtistStyles&quot; cache=&quot;lastfmgenres-\1.xml&quot;&gt;http://ws.audioscrobbler.com/2.0/?method=artist.gettoptags&amp;amp;mbid=\1&amp;amp;api_key=71e468a84c1f40d4991ddccc46e40f1b&amp;lang=$INFO[lastfmlanguage]&lt;/url&gt;&lt;/details&gt;" dest="5">
- <expression noclean="1"/>
- </RegExp>
- </GetLastFMFallbackArtistStylesByMBID>
- <ParseLastFMFallbackArtistStyles dest="5" clearbuffers="no">
- <RegExp input="$$4" output="&lt;details&gt;\1&lt;/details&gt;" dest="5">
- <RegExp input="" output="" dest="4">
- <expression />
- </RegExp>
- <RegExp input="$$1" output="&lt;style&gt;\1&lt;/style&gt;" dest="4">
- <expression repeat="yes" noclean="1">&lt;tag&gt;.*?&lt;name&gt;([^/lt;]*)&lt;/name&gt;</expression>
- </RegExp>
- <expression noclean="1" />
- </RegExp>
- </ParseLastFMFallbackArtistStyles>
-
- <GetLastFMArtistThumbsByMBID dest="5" clearbuffers="no">
- <RegExp input="$$1" output="&lt;details&gt;&lt;url function=&quot;ParseLastFMArtistThumbs&quot; cache=&quot;lastfmartistimages-\1.xml&quot;&gt;http://ws.audioscrobbler.com/2.0/?method=artist.getimages&amp;amp;mbid=\1&amp;amp;api_key=71e468a84c1f40d4991ddccc46e40f1b&amp;lang=$INFO[lastfmlanguage]&lt;/url&gt;&lt;/details&gt;" dest="5">
- <expression noclean="1" />
- </RegExp>
- </GetLastFMArtistThumbsByMBID>
- <GetLastFMArtistThumbsByName dest="5" clearbuffers="no">
- <RegExp input="$$1" output="&lt;details&gt;&lt;url function=&quot;ParseLastFMArtistThumbs&quot;&gt;http://ws.audioscrobbler.com/2.0/?method=artist.getimages&amp;amp;artist=\1&amp;amp;api_key=71e468a84c1f40d4991ddccc46e40f1b&amp;lang=$INFO[lastfmlanguage]&lt;/url&gt;&lt;/details&gt;" dest="5">
- <expression noclean="1" />
- </RegExp>
- </GetLastFMArtistThumbsByName>
- <ParseLastFMArtistThumbs dest="5" clearbuffers="no">
- <RegExp input="$$6" output="&lt;details&gt;\1&lt;/details&gt;" dest="5">
- <RegExp input="" output="" dest="6">
- <expression />
- </RegExp>
- <RegExp input="$$1" output="&lt;thumb preview=&quot;\2&quot;&gt;\1&lt;/thumb&gt;" dest="6">
- <expression repeat="yes" noclean="1">&lt;size name=&quot;original&quot;[^&gt;]*&gt;([^&lt;]*)&lt;[^&lt;]*&lt;size name=&quot;large&quot;[^&gt;]*&gt;([^&lt;]*)&lt;</expression>
- </RegExp>
- <expression noclean="1" />
- </RegExp>
- </ParseLastFMArtistThumbs>
-
-
- <GetLastFMAlbumTitleByMBID dest="5">
- <RegExp input="$$1" output="&lt;details&gt;&lt;url function=&quot;ParseLastFMAlbumTitle&quot; cache=&quot;lastfmalbum-\1.xml&quot;&gt;http://ws.audioscrobbler.com/2.0/?method=album.getinfo&amp;amp;mbid=\1&amp;amp;api_key=71e468a84c1f40d4991ddccc46e40f1b&amp;lang=$INFO[lastfmlanguage]&lt;/url&gt;&lt;/details&gt;" dest="5">
- <expression noclean="1"/>
- </RegExp>
- </GetLastFMAlbumTitleByMBID>
- <GetLastFMAlbumTitleByAlbumAndArtist dest="5">
- <RegExp input="$$1" output="&lt;details&gt;&lt;url function=&quot;ParseLastFMAlbumTitle&quot; cache=&quot;lastfmalbum-\4-\3.xml&quot;&gt;http://ws.audioscrobbler.com/2.0/?method=album.getinfo&amp;artist=\2&amp;amp;album=\1&amp;amp;api_key=71e468a84c1f40d4991ddccc46e40f1b&amp;lang=$INFO[lastfmlanguage]&lt;/url&gt;&lt;/details&gt;" dest="5">
- <expression encode="1,2">(.+)::(.+)::(.+)::(.+)</expression>
- </RegExp>
- </GetLastFMAlbumTitleByAlbumAndArtist>
- <ParseLastFMAlbumTitle dest="5">
- <RegExp input="$$2" output="&lt;details&gt;\1&lt;/details&gt;" dest="5">
- <RegExp input="$$1" output="&lt;title&gt;\1&lt;/title&gt;" dest="2">
- <expression noclean="1">&lt;name&gt;(.*?)&lt;/name&gt;</expression>
- </RegExp>
- <expression noclean="1">(.+)</expression>
- </RegExp>
- </ParseLastFMAlbumTitle>
-
- <GetLastFMAlbumArtistByMBID dest="5">
- <RegExp input="$$1" output="&lt;details&gt;&lt;url function=&quot;ParseLastFMAlbumArtist&quot; cache=&quot;lastfmalbum-\1.xml&quot;&gt;http://ws.audioscrobbler.com/2.0/?method=album.getinfo&amp;amp;mbid=\1&amp;amp;api_key=71e468a84c1f40d4991ddccc46e40f1b&amp;lang=$INFO[lastfmlanguage]&lt;/url&gt;&lt;/details&gt;" dest="5">
- <expression noclean="1"/>
- </RegExp>
- </GetLastFMAlbumArtistByMBID>
- <GetLastFMAlbumArtistByAlbumAndArtist dest="5">
- <RegExp input="$$1" output="&lt;details&gt;&lt;url function=&quot;ParseLastFMAlbumArtist&quot; cache=&quot;lastfmalbum-\4-\3.xml&quot;&gt;http://ws.audioscrobbler.com/2.0/?method=album.getinfo&amp;artist=\2&amp;amp;album=\1&amp;amp;api_key=71e468a84c1f40d4991ddccc46e40f1b&amp;lang=$INFO[lastfmlanguage]&lt;/url&gt;&lt;/details&gt;" dest="5">
- <expression encode="1,2">(.+)::(.+)::(.+)::(.+)</expression>
- </RegExp>
- </GetLastFMAlbumArtistByAlbumAndArtist>
- <ParseLastFMAlbumArtist dest="5">
- <RegExp input="$$2" output="&lt;details&gt;\1&lt;/details&gt;" dest="5">
- <RegExp input="$$1" output="&lt;artist&gt;\1&lt;/artist&gt;" dest="2">
- <expression noclean="1">&lt;artist&gt;(.*?)&lt;/artist&gt;</expression>
- </RegExp>
- <expression noclean="1">(.+)</expression>
- </RegExp>
- </ParseLastFMAlbumArtist>
-
- <GetLastFMAlbumDateByMBID dest="5">
- <RegExp input="$$1" output="&lt;details&gt;&lt;url function=&quot;ParseLastFMAlbumDate&quot; cache=&quot;lastfmalbum-\1.xml&quot;&gt;http://ws.audioscrobbler.com/2.0/?method=album.getinfo&amp;amp;mbid=\1&amp;amp;api_key=71e468a84c1f40d4991ddccc46e40f1b&amp;lang=$INFO[lastfmlanguage]&lt;/url&gt;&lt;/details&gt;" dest="5">
- <expression noclean="1"/>
- </RegExp>
- </GetLastFMAlbumDateByMBID>
- <GetLastFMAlbumDateByAlbumAndArtist dest="5">
- <RegExp input="$$1" output="&lt;details&gt;&lt;url function=&quot;ParseLastFMAlbumDate&quot; cache=&quot;lastfmalbum-\4-\3.xml&quot;&gt;http://ws.audioscrobbler.com/2.0/?method=album.getinfo&amp;artist=\2&amp;amp;album=\1&amp;amp;api_key=71e468a84c1f40d4991ddccc46e40f1b&amp;lang=$INFO[lastfmlanguage]&lt;/url&gt;&lt;/details&gt;" dest="5">
- <expression encode="1,2">(.+)::(.+)::(.+)::(.+)</expression>
- </RegExp>
- </GetLastFMAlbumDateByAlbumAndArtist>
- <ParseLastFMAlbumDate dest="5">
- <RegExp input="$$2" output="&lt;details&gt;\1&lt;/details&gt;" dest="5">
- <RegExp input="$$1" output="&lt;releasedate&gt;\1&lt;/releasedate&gt;" dest="2">
- <expression trim="1">&lt;releasedate&gt;([^,]*)?([^&lt;]*)?&lt;/releasedate&gt;</expression>
- </RegExp>
- <RegExp input="$$1" output="&lt;year&gt;\1&lt;/year&gt;" dest="2+">
- <expression trim="1">&lt;releasedate&gt;.*?([0-9]{4})[^&lt;]*&lt;/releasedate&gt;</expression>
- </RegExp>
- <expression noclean="1">(.+)</expression>
- </RegExp>
- </ParseLastFMAlbumDate>
-
- <GetLastFMAlbumTracksByMBID dest="5">
- <RegExp input="$$1" output="&lt;details&gt;&lt;url function=&quot;ParseLastFMAlbumTracks&quot; cache=&quot;lastfmalbum-\1.xml&quot;&gt;http://ws.audioscrobbler.com/2.0/?method=album.getinfo&amp;amp;mbid=\1&amp;amp;api_key=71e468a84c1f40d4991ddccc46e40f1b&amp;lang=$INFO[lastfmlanguage]&lt;/url&gt;&lt;/details&gt;" dest="5">
- <expression noclean="1"/>
- </RegExp>
- </GetLastFMAlbumTracksByMBID>
- <GetLastFMAlbumTracksByAlbumAndArtist dest="5">
- <RegExp input="$$1" output="&lt;details&gt;&lt;url function=&quot;ParseLastFMAlbumTracks&quot; cache=&quot;lastfmalbum-\4-\3.xml&quot;&gt;http://ws.audioscrobbler.com/2.0/?method=album.getinfo&amp;artist=\2&amp;amp;album=\1&amp;amp;api_key=71e468a84c1f40d4991ddccc46e40f1b&amp;lang=$INFO[lastfmlanguage]&lt;/url&gt;&lt;/details&gt;" dest="5">
- <expression encode="1,2">(.+)::(.+)::(.+)::(.+)</expression>
- </RegExp>
- </GetLastFMAlbumTracksByAlbumAndArtist>
- <ParseLastFMAlbumTracks dest="5">
- <RegExp input="$$2" output="&lt;details&gt;\1&lt;/details&gt;" dest="5">
- <RegExp input="$$1" output="&lt;track&gt;&lt;position&gt;\1&lt;/position&gt;&lt;title&gt;\2&lt;/title&gt;&lt;/track&gt;" dest="2">
- <expression repeat="yes" noclean="1">&lt;track rank=&quot;(.*?)&quot;.*?&lt;name&gt;(.*?)&lt;/name&gt;</expression>
- </RegExp>
- <expression noclean="1">(.+)</expression>
- </RegExp>
- </ParseLastFMAlbumTracks>
-
- <GetLastFMAlbumReviewByMBID dest="5">
- <RegExp input="$$1" output="&lt;details&gt;&lt;url function=&quot;ParseLastFMAlbumReview&quot; cache=&quot;lastfmalbum-\1.xml&quot;&gt;http://ws.audioscrobbler.com/2.0/?method=album.getinfo&amp;amp;mbid=\1&amp;amp;api_key=71e468a84c1f40d4991ddccc46e40f1b&amp;lang=$INFO[lastfmlanguage]&lt;/url&gt;&lt;/details&gt;" dest="5">
- <expression noclean="1"/>
- </RegExp>
- </GetLastFMAlbumReviewByMBID>
- <GetLastFMAlbumReviewByAlbumAndArtist dest="5">
- <RegExp input="$$1" output="&lt;details&gt;&lt;url function=&quot;ParseLastFMAlbumReview&quot; cache=&quot;lastfmalbum-\4-\3.xml&quot;&gt;http://ws.audioscrobbler.com/2.0/?method=album.getinfo&amp;artist=\2&amp;amp;album=\1&amp;amp;api_key=71e468a84c1f40d4991ddccc46e40f1b&amp;lang=$INFO[lastfmlanguage]&lt;/url&gt;&lt;/details&gt;" dest="5">
- <expression encode="1,2">(.+)::(.+)::(.+)::(.+)</expression>
- </RegExp>
- </GetLastFMAlbumReviewByAlbumAndArtist>
- <ParseLastFMAlbumReview dest="5">
- <RegExp input="$$2" output="&lt;details&gt;\1&lt;/details&gt;" dest="5">
- <RegExp input="$$1" output="&lt;review&gt;\1&lt;/review&gt;" dest="2">
- <expression fixchars="1">&lt;content&gt;&lt;!\[CDATA\[(.*?)(User-|\]\])</expression>
- </RegExp>
- <expression noclean="1">(.+)</expression>
- </RegExp>
- </ParseLastFMAlbumReview>
-
- <GetLastFMAlbumThumbsByMBID dest="5">
- <RegExp input="$$1" output="&lt;details&gt;&lt;url function=&quot;ParseLastFMAlbumThumbs&quot; cache=&quot;lastfmalbum-\1.xml&quot;&gt;http://ws.audioscrobbler.com/2.0/?method=album.getinfo&amp;amp;mbid=\1&amp;amp;api_key=71e468a84c1f40d4991ddccc46e40f1b&amp;lang=$INFO[lastfmlanguage]&lt;/url&gt;&lt;/details&gt;" dest="5">
- <expression noclean="1"/>
- </RegExp>
- </GetLastFMAlbumThumbsByMBID>
- <GetLastFMAlbumThumbs dest="5">
- <RegExp input="$$1" output="&lt;details&gt;&lt;url function=&quot;ParseLastFMAlbumThumbs&quot; cache=&quot;lastfmalbum-\4-\3.xml&quot;&gt;http://ws.audioscrobbler.com/2.0/?method=album.getinfo&amp;artist=\2&amp;amp;album=\1&amp;amp;api_key=71e468a84c1f40d4991ddccc46e40f1b&amp;lang=$INFO[lastfmlanguage]&lt;/url&gt;&lt;/details&gt;" dest="5">
- <expression encode="1,2">(.+)::(.+)::(.+)::(.+)</expression>
- </RegExp>
- </GetLastFMAlbumThumbs>
- <ParseLastFMAlbumThumbs dest="5">
- <RegExp input="$$2" output="&lt;details&gt;\1&lt;/details&gt;" dest="5">
- <RegExp input="$$1" output="&lt;thumb&gt;\1&lt;/thumb&gt;" dest="2">
- <expression noclean="1">&lt;image size=&quot;extralarge&quot;&gt;([^&lt;]*)&lt;/image&gt;</expression>
- </RegExp>
- <RegExp input="$$1" output="&lt;thumb&gt;\1&lt;/thumb&gt;" dest="2+">
- <expression noclean="1">&lt;image size=&quot;large&quot;&gt;([^&lt;]*)&lt;/image&gt;</expression>
- </RegExp>
- <expression noclean="1">(.+)</expression>
- </RegExp>
- </ParseLastFMAlbumThumbs>
-
-</scraperfunctions>
diff --git a/addons/metadata.musicvideos.theaudiodb.com/addon.xml b/addons/metadata.musicvideos.theaudiodb.com/addon.xml
deleted file mode 100644
index d97027bbd4..0000000000
--- a/addons/metadata.musicvideos.theaudiodb.com/addon.xml
+++ /dev/null
@@ -1,117 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<addon id="metadata.musicvideos.theaudiodb.com"
- name="TheAudioDb.com for Music Videos"
- version="1.2.7"
- provider-name="XBMC Foundation">
- <requires>
- <import addon="xbmc.metadata" version="2.1.0"/>
- <import addon="metadata.common.fanart.tv" version="3.1.0"/>
- <import addon="metadata.common.theaudiodb.com" version="1.7.3"/>
- </requires>
- <extension point="xbmc.metadata.scraper.musicvideos"
- language="en"
- library="tadb.xml"/>
- <extension point="xbmc.addon.metadata">
- <summary lang="af">theaudiodb.com Musiek Video Skraper</summary>
- <summary lang="be">theaudiodb.com Music Video Scraper</summary>
- <summary lang="bg">Ð¡Ð²Ð°Ð»Ñ Ð¸Ð½Ñ„. за музикални клипове от theaudiodb.com</summary>
- <summary lang="ca">Arreplegador de vídeos musicals de theaudiodb.com</summary>
- <summary lang="cs">Zdroj dat o hudebních videích theaudiodb.com</summary>
- <summary lang="cy">Crafwr Fideo Cerddoriaeth theaudiodb.com</summary>
- <summary lang="da">theaudiodb.com Musikvideo-scraper</summary>
- <summary lang="de">theaudiodb.com Musikvideo Scraper</summary>
- <summary lang="el">Scraper Μουσικών Βίντεο του theaudiodb.com</summary>
- <summary lang="en">theaudiodb.com Music Video Scraper</summary>
- <summary lang="en_NZ">theaudiodb.com Music Video Scraper</summary>
- <summary lang="en_US">theaudiodb.com Music Video Scraper</summary>
- <summary lang="es">Buscador de videoclips de theaudiodb.com</summary>
- <summary lang="es_AR">Scraper de Videos de Música de theaudiodb.com</summary>
- <summary lang="et">theaudiodb.com muusikavideo kraabits</summary>
- <summary lang="fi">theaudiodb.com musiikkivideotietojen lataaja</summary>
- <summary lang="fr">theaudiodb.com Scraper Clip Vidéo</summary>
- <summary lang="fr_CA">Extracteur de vidéos musicales pour theaudiodb.com</summary>
- <summary lang="gl">Scraper de vídeo e música de theaudiodb.com</summary>
- <summary lang="he">theaudiodb.com סקרייפר ויד×ו קליפ</summary>
- <summary lang="hr">theaudiodb.com sakupljaÄ za glazbene spotove</summary>
- <summary lang="hu">theaudiodb.com videóklip leolvasó</summary>
- <summary lang="id">Pengais Video Musik theaudiodb.com</summary>
- <summary lang="is">theaudiodb.com Skafa fyrir Tónlistarmyndbönd</summary>
- <summary lang="it">Lo scraper di video musicali theaudiodb.com</summary>
- <summary lang="ja">theaudiodb.com 音楽ビデオスクレーパー</summary>
- <summary lang="ko">theaudiodb.com ë®¤ì§ ë¹„ë””ì˜¤ 정보수집기</summary>
- <summary lang="lt">theaudiodb.com muzikinių vaizdo klipų skreperis</summary>
- <summary lang="mk">theaudiodb.com Music Video Scraper</summary>
- <summary lang="ms">Pengikis Video Muzik theaudiodb.com</summary>
- <summary lang="my">theaudiodb.com Music Video Scraper</summary>
- <summary lang="nl">theaudiodb.com Muziekvideo-scraper</summary>
- <summary lang="no">theaudiodb.com Skraper for musikkvideo</summary>
- <summary lang="pl">Scraper teledysków theaudiodb.com</summary>
- <summary lang="pt">Colector de música theaudiodb.com</summary>
- <summary lang="pt_BR">Scraper de concertos theaudiodb.com</summary>
- <summary lang="ro">Informaţii videoclipuri de la theaudiodb.com </summary>
- <summary lang="ru">Скрапер музыки и видео theaudiodb.com</summary>
- <summary lang="se">Skrapa för theaudiodb.com musik</summary>
- <summary lang="sk">Zdroj získavania dát o hudobných videách zo stránky theaudiodb.com</summary>
- <summary lang="sl">Ponudnik informacij o videospotih theaudiodb.com</summary>
- <summary lang="sv">theaudiodb.com musikvideoskrapa</summary>
- <summary lang="ta_IN">theaudiodb.com இசை நிகழà¯à®ªà®Ÿà®®à¯ சà¯à®°à®£à¯à®Ÿà®¿</summary>
- <summary lang="th">ตัวดึงข้อมูลวิดีโอเพลง theaudiodb.com</summary>
- <summary lang="uk">Здирач музичного відео з theaudiodb.com</summary>
- <summary lang="vi">Trình lấy dữ liệu video nhạc từ theaudiodb.com</summary>
- <summary lang="zh">theaudiodb.com 音ä¹ç”µè§†åˆ®å‰Šå™¨</summary>
- <summary lang="zh_TW">theaudiodb.com音樂影片æœæ‹¬å™¨</summary>
- <description lang="af">Laai Musiek Video informasie af</description>
- <description lang="am">የሙዚቃ ቪዲዮ መረጃ ማá‹áˆ¨áŒƒ</description>
- <description lang="be">Download Music Video information</description>
- <description lang="bg">Ð¡Ð²Ð°Ð»Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð·Ð° музикални клипове</description>
- <description lang="ca">Baixa informació de videos musicals</description>
- <description lang="cs">Zdroj dat stahující informace o hudebních videích z TheAudioDB.com. Kvůli složitým problémům s vyhledáváním požaduje nástroj pro vyhledávání název složky složky/souboru pojmenován jako 'umělec - název stopy', pokud tomu tak není, nenalezne žádné výsledky.</description>
- <description lang="cy">Mae'r crafwr yn llwytho i lawr gwybodaeth am Gerddoriaeth Fideo o TheAudioDB.com. Oherwydd amryw o anawsterau chwilio mae'r crafwr yn disgwyl i'r ffolder/enw ffeil fod wedi ei fformatio fel 'artist - enw track' neu ni fydd yn dychwelyd canlyniadau.</description>
- <description lang="da">Hent Musikvideo-information</description>
- <description lang="de">Dieser Scraper lädt Musikvideoinformationen von TheAudioDB.com herunter. Aufgrund diverser Suchschwierigkeiten erwartet der Scraper derzeit, dass Ordner/Dateinamen als 'Künstler - Songname' formatiert werden, andernfalls wird er keine Ergebnisse zurückliefern.</description>
- <description lang="el">Λήψη πληÏοφοÏιών Μουσικών Βίντεο</description>
- <description lang="en">This scraper is downloading Music Video information from TheAudioDB.com. Due to various search difficulties the scraper currently expects the folder/filename to be formatted as 'artist - trackname' otherwise it will not return results.</description>
- <description lang="en_NZ">This scraper is downloading Music Video information from TheAudioDB.com. Due to various search difficulties the scraper currently expects the folder/filename to be formatted as 'artist - trackname' otherwise it will not return results.</description>
- <description lang="en_US">This scraper is downloading Music Video information from TheAudioDB.com. Due to various search difficulties the scraper currently expects the folder/filename to be formatted as 'artist - trackname' otherwise it will not return results.</description>
- <description lang="es">Descarga información del videoclip</description>
- <description lang="es_AR">Descarga información del Video Clip</description>
- <description lang="es_MX">Descarga Información de Vídeos de Músca</description>
- <description lang="et">Hankija laeb alla muusikavideo infot portaalist TheAudioDB.com. Mitmete otsinguohtude tõttu tuvastab hankija kausta/faili nime vormingus 'esitaja - loo nimi', muidu hankija ei suuda otsimist läbi viia.</description>
- <description lang="fi">Lataa musiikkivideoiden tiedot</description>
- <description lang="fr">Télécharger les informations des clips vidéos</description>
- <description lang="fr_CA">Cet extracteur télécharge les informations sur les vidéos musicales depuis TheAudioDB.com. À cause de difficultés de recherche diverses, l'extracteur s'attend présentement à ce que le dossier/nom du fichier soit formaté comme « artiste - nom de la piste ». Aucun résultat ne sera retourné si ce n'est pas le cas.</description>
- <description lang="gl">Este scraper descarga a información dende TheAudioDB.com. Debido a algúns problemas o scraper agarda que o cartafol/nome do ficheiro teña o formato 'artista - nome da pista' ou non retornará resultados.</description>
- <description lang="he">הורד מידע ויד×ו קליפ</description>
- <description lang="hr">Ovaj sakupljaÄ preuzima informacije o glazbenim spotovima s TheAudioDB.com. Uslijed mnogih problema s pretragom sakupljaÄ oÄekuje da mape i datoteke budu u formatu 'izvoÄ‘aÄ - naziv pjesme' ili neće dati rezultata.</description>
- <description lang="hu">Videóklip információk letöltése a theaudiodb.com webhelyről</description>
- <description lang="id">Pengais sedang mengunduh informasi musik video dari TheAudioDB.com. Dikarenakan berbagai kesulitan pencarian, Pengais mengharapkan folder/nama-berkas dalam format 'artis-judullagu' Apabila tidak, hasil tidak dapat muncul.</description>
- <description lang="is">Þessi skafa halar niður upplýsingum Tónlistarmyndbanda frá TheAudioDB.com. Vegna ýmissa vandamála með leit þá gerir þessi skafa ráð fyrir að möppu/skráarnafn sé á forminu 'Listamaður - laganafn' annars skilar hún engum niðurstöðum.</description>
- <description lang="it">Scarica informazioni Video Musicale</description>
- <description lang="ja">ã“ã®ã‚¹ã‚¯ãƒ¬ã‚¤ãƒ‘ーã¯TheAudioDB.comã‹ã‚‰éŸ³æ¥½ãƒ“デオ情報をダウンロードã—ã¦ã„ã¾ã™ã€‚様々ãªæ¤œç´¢ã®å›°é›£ã®ãŸã‚ã€ã‚¹ã‚¯ãƒ¬ã‚¤ãƒ‘ーã¯ç¾åœ¨ã€Œã‚¢ãƒ¼ãƒ†ã‚£ã‚¹ãƒˆ - 曲åã€ã¨ãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆã•ã‚Œã¦ã„るフォルダ/ファイルãƒãƒ¼ãƒ ã‚’期待ã—ã¦ã„ã¾ã™ã€‚ãã†ã§ãªã‘ã‚Œã°ã€çµæžœã‚’è¿”ã—ã¾ã›ã‚“。</description>
- <description lang="ko">ì´ ì •ë³´ìˆ˜ì§‘ê¸°ë¯„ TheAudioDB.comì—ì„œ ë®¤ì§ ë¹„ë””ì˜¤ 정보를 가져옵니다. 여러가지 검색ìƒì˜ 어려움 ë•Œë¬¸ì— í´ë”/파ì¼ì´ë¦„ì´ '아티스트-트랙ì´ë¦„'으로 지정ë˜ì–´ì•¼ 합니다. 그렇지 않으면 결과를 가져올 수 없습니다.</description>
- <description lang="lt">Å is skreperis atsiunÄia muzikinių vaizdo klipų informacijÄ… iÅ¡ TheAudioDB.com. DÄ—l įvairių paieÅ¡kos sunkumų, aplanko/failo pavadinimo formatas turi bÅ«ti 'atlikÄ—jas - takelio pavadinimas'. PrieÅ¡ingu atvejus nebus rasta jokių rezultatų.</description>
- <description lang="mk">Превземи информации за музичко видео</description>
- <description lang="ms">Pengikis ini memuat turun maklumat Video Muzik dari TheAudioDB.com. Oleh kerana kesukaran menggelintar, pengikis biasanya jangkakan folder/namafail diformat sebagai 'artis - namatrek' jika tidak ia tidak akan kembalikan keputusan.</description>
- <description lang="nl">Deze scraper download muziekvideo-informatie van TheAudioDB.com. Vanwege diverse zoek moeilijkheden verwacht de scraper nu dat de map/bestandsnaam is genaamd als 'artiest - Titel' anders zal het geen resultaten tonen.</description>
- <description lang="no">Last ned musikkvideoinformasjon</description>
- <description lang="pl">Scraper teledysków pobiera informacje z bazy TheAudioDB.com. Ze względu na różne trudności wyszukiwania, scraper obecnie wymaga aby folder/plik był sformatowany: "artysta - nazwa ścieżki" inaczej nie zadziała poprawnie.</description>
- <description lang="pt">Descarregar informação de filmes de theaudiodb.com</description>
- <description lang="pt_BR">Download de informação de Concertos</description>
- <description lang="ro">Acest plugin descarcă informaţii despre videoclipuri de la TheAudioDB.com. Datorita dificultatilor de cautare, pluginul asteapta ca perechea director/nume fisier sa fie formatate ca 'artist - nume piesa' altfel nu va returna nici un rezultat.</description>
- <description lang="ru">Загружать ÑÐ²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¾ видеоклипах</description>
- <description lang="se">Ladda ner musikvideoinformation från theaudiodb.com</description>
- <description lang="sk">Tento zdroj dát získava informácie o hudobných videách zo stránky TheAudioDB.com. Z dôvodu rôznych problémov pri hľadaní, zdroj dát aktuálne oÄakáva, aby bol názov prieÄinka/súboru formátovaný ako 'interpret - názov_skladby', v opaÄnom prípade nevráti žiadne výsledky.</description>
- <description lang="sl">Prenesite informacije o videospotih z TheAudioDB.com. Zaradi težavnosti iskanja morajo biti mape/datoteke v formatu 'izvajalec - pesem', drugaÄe informacije ne bodo najdene.</description>
- <description lang="sv">Ladda ner musikvideoinformation</description>
- <description lang="ta_IN">இநà¯à®¤ வலை சà¯à®°à®£à¯à®Ÿà®¿ TheAudioDB.com இல௠இரà¯à®¨à¯à®¤à¯ இசை வீடியோ தகவலà¯à®•à®³à¯ˆ பதிவிறகà¯à®•à®®à¯ செயà¯à®•à®¿à®±à®¤à¯. பலà¯à®µà¯‡à®±à¯ தேடல௠சிரமஙà¯à®•à®³à¯ காரணமாக தறà¯à®ªà¯‡à®¾à®¤à¯ இநà¯à®¤ வலை சà¯à®°à®£à¯à®Ÿà®¿à®¯à®¾à®©à®¤à¯ கோபà¯à®ªà¯à®±à¯ˆ / கோபà¯à®ªà¯ பெயரை 'கலைஞர௠- தடஙà¯à®•à®³à¯ பெயரà¯' எனவாக வடிவமைகà¯à®• வேணà¯à®Ÿà¯à®®à¯ எனà¯à®±à¯ எதிரà¯à®ªà®¾à®°à¯à®•à¯à®•à®¿à®±à®¤à¯ இலà¯à®²à¯ˆà®¯à¯†à®©à®¿à®²à¯ à®®à¯à®Ÿà®¿à®µà¯à®•à®³à¯ˆ தராதà¯. கலைஞர௠அலà¯à®²à®¤à¯ தடஙà¯à®•à®³à¯ பெயரில௠'-' அடையாளம௠இரà¯à®¨à¯à®¤à®¾à®²à¯ அதை கூட கணà¯à®Ÿà¯à®ªà®¿à®Ÿà®¿à®•à¯à®• à®®à¯à®Ÿà®¿à®¯à®¾à®¤à¯.</description>
- <description lang="th">ดาวน์โหลดข้อมูลวิดีโอเพลง</description>
- <description lang="vi">Trình lấy dữ liệu Ä‘ang tải thông tin video nhạc từ nguồn TheAudioDB.com. Do nhiá»u khó khăn tìm kiếm khác nhau, trình lấy dữ liệu này hiện chỉ há»— trợ định dạng thÆ° mục/tên tệp tin theo mẫu 'nghệ sỹ - tên track' nếu không sẽ không trả lại kết quả.</description>
- <description lang="zh">从 theaudiodb.com 下载音ä¹ç”µè§†èµ„料。为简化æœç´¢ï¼Œåˆ®å‰Šå™¨é™å®šæ–‡ä»¶å¤¹/文件åæ ¼å¼ä¸ºâ€œæ­Œæ‰‹ - æ­Œåâ€ï¼Œå¦åˆ™å°†ä¸ä¼šè¿”回结果。</description>
- <description lang="zh_TW">æ­¤æœæ‹¬å™¨æ˜¯å¾ž TheAudioDB.com下載å–得音樂影片資訊。因為å„種ä¸åŒæœå°‹è®Šæ•¸ï¼Œæ­¤æœæ‹¬å™¨ç›®å‰é ˆå°‡è³‡æ–™å¤¾ï¼æª”案å稱 é‡æ–°å‘½å為 "演出者ï¼æ­Œæ›²è³‡è¨Š"å¦å‰‡å°‡ç„¡æ³•æ­£å¸¸å–得專輯資料。帶有'-"符號的演出者或歌曲資訊也有極高å¯èƒ½ç„¡æ³•æ‰¾åˆ°ã€‚</description>
- <license>GPL v2.0</license>
- <forum>http://forum.xbmc.org/showthread.php?tid=136105</forum>
- <website></website>
- <email></email>
- <source></source>
- </extension>
-</addon>
diff --git a/addons/metadata.musicvideos.theaudiodb.com/changelog.txt b/addons/metadata.musicvideos.theaudiodb.com/changelog.txt
deleted file mode 100644
index 77d927b9da..0000000000
--- a/addons/metadata.musicvideos.theaudiodb.com/changelog.txt
+++ /dev/null
@@ -1,22 +0,0 @@
-[B]1.2.7[/B]
-- Fixed: Allow for apostrophes in artist/title
-
-[B]1.2.1[/B]
-- Fixed: Allow for dashes in artist/title (v12.2+ required)
-
-[B]1.2.0[/B]
-- Added: NfoURL function
-- Added: Album thumbs from theaudiodb.com
-
-[B]1.1.1[/B]
-- Fixed Workaround: Scraper won't return 'Unable to Connect to Remote Server' in case of year is available from the folder/file name
-
-[B]1.1.0[/B]
-- Workaround: Scraper won't return 'Unable to Connect to Remote Server' in case of unexpected folder/file naming conventions
-- Added: Music Video Director
-- Added: Music Video Studio
-- Changed: Scrape Music Video screenshot instead of album thumb if available
-- Changed: Trust search result ordering from TheAudioDb.com
-- Changed: Scrape Album genre instead of track genre for now
-- Added: Scrape Album Year
-- Added: Scraper description (stating current limitations)
diff --git a/addons/metadata.musicvideos.theaudiodb.com/icon.png b/addons/metadata.musicvideos.theaudiodb.com/icon.png
deleted file mode 100644
index c102293a41..0000000000
--- a/addons/metadata.musicvideos.theaudiodb.com/icon.png
+++ /dev/null
Binary files differ
diff --git a/addons/metadata.musicvideos.theaudiodb.com/resources/language/Afrikaans/strings.po b/addons/metadata.musicvideos.theaudiodb.com/resources/language/Afrikaans/strings.po
deleted file mode 100644
index 402f11ef5f..0000000000
--- a/addons/metadata.musicvideos.theaudiodb.com/resources/language/Afrikaans/strings.po
+++ /dev/null
@@ -1,21 +0,0 @@
-# Kodi Media Center language file
-# Addon Name: TheAudioDb.com for Music Videos
-# Addon id: metadata.musicvideos.theaudiodb.com
-# Addon Provider: XBMC Foundation
-msgid ""
-msgstr ""
-"Project-Id-Version: XBMC Addons\n"
-"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n"
-"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: Kodi Translation Team\n"
-"Language-Team: Afrikaans (http://www.transifex.com/projects/p/xbmc-addons/language/af/)\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Language: af\n"
-"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-
-msgctxt "#30000"
-msgid "Grab album thumbs from fanart.tv"
-msgstr "Gryp album duimnaelsketse vanaf fanart.tv"
diff --git a/addons/metadata.musicvideos.theaudiodb.com/resources/language/Belarusian/strings.po b/addons/metadata.musicvideos.theaudiodb.com/resources/language/Belarusian/strings.po
deleted file mode 100644
index 15d5a25458..0000000000
--- a/addons/metadata.musicvideos.theaudiodb.com/resources/language/Belarusian/strings.po
+++ /dev/null
@@ -1,21 +0,0 @@
-# Kodi Media Center language file
-# Addon Name: TheAudioDb.com for Music Videos
-# Addon id: metadata.musicvideos.theaudiodb.com
-# Addon Provider: XBMC Foundation
-msgid ""
-msgstr ""
-"Project-Id-Version: XBMC Addons\n"
-"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n"
-"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: Kodi Translation Team\n"
-"Language-Team: Belarusian (http://www.transifex.com/projects/p/xbmc-addons/language/be/)\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Language: be\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"
-
-msgctxt "#30000"
-msgid "Grab album thumbs from fanart.tv"
-msgstr "Grab album thumbs from fanart.tv"
diff --git a/addons/metadata.musicvideos.theaudiodb.com/resources/language/Bulgarian/strings.po b/addons/metadata.musicvideos.theaudiodb.com/resources/language/Bulgarian/strings.po
deleted file mode 100644
index 3964dafd12..0000000000
--- a/addons/metadata.musicvideos.theaudiodb.com/resources/language/Bulgarian/strings.po
+++ /dev/null
@@ -1,25 +0,0 @@
-# Kodi Media Center language file
-# Addon Name: TheAudioDb.com for Music Videos
-# Addon id: metadata.musicvideos.theaudiodb.com
-# Addon Provider: XBMC Foundation
-msgid ""
-msgstr ""
-"Project-Id-Version: XBMC Addons\n"
-"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n"
-"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: Kodi Translation Team\n"
-"Language-Team: Bulgarian (http://www.transifex.com/projects/p/xbmc-addons/language/bg/)\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Language: bg\n"
-"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-
-msgctxt "#30000"
-msgid "Grab album thumbs from fanart.tv"
-msgstr "СвалÑй миниатюри за албумите от fanart.tv"
-
-msgctxt "#30001"
-msgid "Grab album thumbs from theaudiodb.com"
-msgstr "СвалÑй миниатюри за албумите от theaudiodb.com"
diff --git a/addons/metadata.musicvideos.theaudiodb.com/resources/language/Burmese/strings.po b/addons/metadata.musicvideos.theaudiodb.com/resources/language/Burmese/strings.po
deleted file mode 100644
index 094d6183b0..0000000000
--- a/addons/metadata.musicvideos.theaudiodb.com/resources/language/Burmese/strings.po
+++ /dev/null
@@ -1,21 +0,0 @@
-# Kodi Media Center language file
-# Addon Name: TheAudioDb.com for Music Videos
-# Addon id: metadata.musicvideos.theaudiodb.com
-# Addon Provider: XBMC Foundation
-msgid ""
-msgstr ""
-"Project-Id-Version: XBMC Addons\n"
-"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n"
-"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: Kodi Translation Team\n"
-"Language-Team: Burmese (http://www.transifex.com/projects/p/xbmc-addons/language/my/)\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Language: my\n"
-"Plural-Forms: nplurals=1; plural=0;\n"
-
-msgctxt "#30000"
-msgid "Grab album thumbs from fanart.tv"
-msgstr "fanart.tv မှ album thumbs များရာယူမည်"
diff --git a/addons/metadata.musicvideos.theaudiodb.com/resources/language/Catalan/strings.po b/addons/metadata.musicvideos.theaudiodb.com/resources/language/Catalan/strings.po
deleted file mode 100644
index 485dd2d541..0000000000
--- a/addons/metadata.musicvideos.theaudiodb.com/resources/language/Catalan/strings.po
+++ /dev/null
@@ -1,25 +0,0 @@
-# Kodi Media Center language file
-# Addon Name: TheAudioDb.com for Music Videos
-# Addon id: metadata.musicvideos.theaudiodb.com
-# Addon Provider: XBMC Foundation
-msgid ""
-msgstr ""
-"Project-Id-Version: XBMC Addons\n"
-"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n"
-"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: Kodi Translation Team\n"
-"Language-Team: Catalan (http://www.transifex.com/projects/p/xbmc-addons/language/ca/)\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Language: ca\n"
-"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-
-msgctxt "#30000"
-msgid "Grab album thumbs from fanart.tv"
-msgstr "Obté les miniatures de l'àlbum de fanart.tv"
-
-msgctxt "#30001"
-msgid "Grab album thumbs from theaudiodb.com"
-msgstr "Obté les miniatures de l'àlbum de theaudiodb.com"
diff --git a/addons/metadata.musicvideos.theaudiodb.com/resources/language/Chinese (Simple)/strings.po b/addons/metadata.musicvideos.theaudiodb.com/resources/language/Chinese (Simple)/strings.po
deleted file mode 100644
index e6f3fc3204..0000000000
--- a/addons/metadata.musicvideos.theaudiodb.com/resources/language/Chinese (Simple)/strings.po
+++ /dev/null
@@ -1,25 +0,0 @@
-# Kodi Media Center language file
-# Addon Name: TheAudioDb.com for Music Videos
-# Addon id: metadata.musicvideos.theaudiodb.com
-# Addon Provider: XBMC Foundation
-msgid ""
-msgstr ""
-"Project-Id-Version: XBMC Addons\n"
-"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n"
-"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: Kodi Translation Team\n"
-"Language-Team: Chinese (Simple) (http://www.transifex.com/projects/p/xbmc-addons/language/zh/)\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Language: zh\n"
-"Plural-Forms: nplurals=1; plural=0;\n"
-
-msgctxt "#30000"
-msgid "Grab album thumbs from fanart.tv"
-msgstr "从 fanart.tv 获å–专辑图片"
-
-msgctxt "#30001"
-msgid "Grab album thumbs from theaudiodb.com"
-msgstr "从 theaudiodb.com 获å–专辑图片"
diff --git a/addons/metadata.musicvideos.theaudiodb.com/resources/language/Chinese (Traditional)/strings.po b/addons/metadata.musicvideos.theaudiodb.com/resources/language/Chinese (Traditional)/strings.po
deleted file mode 100644
index f652655bf2..0000000000
--- a/addons/metadata.musicvideos.theaudiodb.com/resources/language/Chinese (Traditional)/strings.po
+++ /dev/null
@@ -1,25 +0,0 @@
-# Kodi Media Center language file
-# Addon Name: TheAudioDb.com for Music Videos
-# Addon id: metadata.musicvideos.theaudiodb.com
-# Addon Provider: XBMC Foundation
-msgid ""
-msgstr ""
-"Project-Id-Version: XBMC Addons\n"
-"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n"
-"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: Kodi Translation Team\n"
-"Language-Team: Chinese (Traditional) (http://www.transifex.com/projects/p/xbmc-addons/language/zh_TW/)\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Language: zh_TW\n"
-"Plural-Forms: nplurals=1; plural=0;\n"
-
-msgctxt "#30000"
-msgid "Grab album thumbs from fanart.tv"
-msgstr "從fanart.två–得專輯縮圖"
-
-msgctxt "#30001"
-msgid "Grab album thumbs from theaudiodb.com"
-msgstr "從 theaudiodb.comå–得專輯縮圖"
diff --git a/addons/metadata.musicvideos.theaudiodb.com/resources/language/Croatian/strings.po b/addons/metadata.musicvideos.theaudiodb.com/resources/language/Croatian/strings.po
deleted file mode 100644
index f0d0d601a5..0000000000
--- a/addons/metadata.musicvideos.theaudiodb.com/resources/language/Croatian/strings.po
+++ /dev/null
@@ -1,25 +0,0 @@
-# Kodi Media Center language file
-# Addon Name: TheAudioDb.com for Music Videos
-# Addon id: metadata.musicvideos.theaudiodb.com
-# Addon Provider: XBMC Foundation
-msgid ""
-msgstr ""
-"Project-Id-Version: XBMC Addons\n"
-"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n"
-"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: Kodi Translation Team\n"
-"Language-Team: Croatian (http://www.transifex.com/projects/p/xbmc-addons/language/hr/)\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Language: hr\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"
-
-msgctxt "#30000"
-msgid "Grab album thumbs from fanart.tv"
-msgstr "Nabavi minijature albuma s fanart.tv"
-
-msgctxt "#30001"
-msgid "Grab album thumbs from theaudiodb.com"
-msgstr "Nabavi minijature albuma s theaudiodb.com"
diff --git a/addons/metadata.musicvideos.theaudiodb.com/resources/language/Czech/strings.po b/addons/metadata.musicvideos.theaudiodb.com/resources/language/Czech/strings.po
deleted file mode 100644
index e60f02ac75..0000000000
--- a/addons/metadata.musicvideos.theaudiodb.com/resources/language/Czech/strings.po
+++ /dev/null
@@ -1,25 +0,0 @@
-# Kodi Media Center language file
-# Addon Name: TheAudioDb.com for Music Videos
-# Addon id: metadata.musicvideos.theaudiodb.com
-# Addon Provider: XBMC Foundation
-msgid ""
-msgstr ""
-"Project-Id-Version: XBMC Addons\n"
-"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n"
-"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: Kodi Translation Team\n"
-"Language-Team: Czech (http://www.transifex.com/projects/p/xbmc-addons/language/cs/)\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Language: cs\n"
-"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
-
-msgctxt "#30000"
-msgid "Grab album thumbs from fanart.tv"
-msgstr "Získat náhledy alb z fanart.tv"
-
-msgctxt "#30001"
-msgid "Grab album thumbs from theaudiodb.com"
-msgstr "Získat náhledy alb z theaudiodb.com"
diff --git a/addons/metadata.musicvideos.theaudiodb.com/resources/language/Danish/strings.po b/addons/metadata.musicvideos.theaudiodb.com/resources/language/Danish/strings.po
deleted file mode 100644
index 5d06b18c20..0000000000
--- a/addons/metadata.musicvideos.theaudiodb.com/resources/language/Danish/strings.po
+++ /dev/null
@@ -1,25 +0,0 @@
-# Kodi Media Center language file
-# Addon Name: TheAudioDb.com for Music Videos
-# Addon id: metadata.musicvideos.theaudiodb.com
-# Addon Provider: XBMC Foundation
-msgid ""
-msgstr ""
-"Project-Id-Version: XBMC Addons\n"
-"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n"
-"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: Kodi Translation Team\n"
-"Language-Team: Danish (http://www.transifex.com/projects/p/xbmc-addons/language/da/)\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Language: da\n"
-"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-
-msgctxt "#30000"
-msgid "Grab album thumbs from fanart.tv"
-msgstr "Hent Miniaturebilleder af Albummer fra fanart.tv"
-
-msgctxt "#30001"
-msgid "Grab album thumbs from theaudiodb.com"
-msgstr "Hent miniaturebilleder til albummer fra theaudiodb.com"
diff --git a/addons/metadata.musicvideos.theaudiodb.com/resources/language/Dutch/strings.po b/addons/metadata.musicvideos.theaudiodb.com/resources/language/Dutch/strings.po
deleted file mode 100644
index 6df1de23ab..0000000000
--- a/addons/metadata.musicvideos.theaudiodb.com/resources/language/Dutch/strings.po
+++ /dev/null
@@ -1,25 +0,0 @@
-# Kodi Media Center language file
-# Addon Name: TheAudioDb.com for Music Videos
-# Addon id: metadata.musicvideos.theaudiodb.com
-# Addon Provider: XBMC Foundation
-msgid ""
-msgstr ""
-"Project-Id-Version: XBMC Addons\n"
-"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n"
-"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: Kodi Translation Team\n"
-"Language-Team: Dutch (http://www.transifex.com/projects/p/xbmc-addons/language/nl/)\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Language: nl\n"
-"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-
-msgctxt "#30000"
-msgid "Grab album thumbs from fanart.tv"
-msgstr "Pak albumminiaturen van fanart.tv"
-
-msgctxt "#30001"
-msgid "Grab album thumbs from theaudiodb.com"
-msgstr "Haal Albumminiaturen van theaudiodb.com"
diff --git a/addons/metadata.musicvideos.theaudiodb.com/resources/language/English (New Zealand)/strings.po b/addons/metadata.musicvideos.theaudiodb.com/resources/language/English (New Zealand)/strings.po
deleted file mode 100644
index d4a790234b..0000000000
--- a/addons/metadata.musicvideos.theaudiodb.com/resources/language/English (New Zealand)/strings.po
+++ /dev/null
@@ -1,25 +0,0 @@
-# Kodi Media Center language file
-# Addon Name: TheAudioDb.com for Music Videos
-# Addon id: metadata.musicvideos.theaudiodb.com
-# Addon Provider: XBMC Foundation
-msgid ""
-msgstr ""
-"Project-Id-Version: XBMC Addons\n"
-"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n"
-"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: Kodi Translation Team\n"
-"Language-Team: English (New Zealand) (http://www.transifex.com/projects/p/xbmc-addons/language/en_NZ/)\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Language: en_NZ\n"
-"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-
-msgctxt "#30000"
-msgid "Grab album thumbs from fanart.tv"
-msgstr "Grab album thumbs from fanart.tv"
-
-msgctxt "#30001"
-msgid "Grab album thumbs from theaudiodb.com"
-msgstr "Grab album thumbs from theaudiodb.com"
diff --git a/addons/metadata.musicvideos.theaudiodb.com/resources/language/English (US)/strings.po b/addons/metadata.musicvideos.theaudiodb.com/resources/language/English (US)/strings.po
deleted file mode 100644
index 5984b1d310..0000000000
--- a/addons/metadata.musicvideos.theaudiodb.com/resources/language/English (US)/strings.po
+++ /dev/null
@@ -1,25 +0,0 @@
-# Kodi Media Center language file
-# Addon Name: TheAudioDb.com for Music Videos
-# Addon id: metadata.musicvideos.theaudiodb.com
-# Addon Provider: XBMC Foundation
-msgid ""
-msgstr ""
-"Project-Id-Version: XBMC Addons\n"
-"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n"
-"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: Kodi Translation Team\n"
-"Language-Team: English (US) (http://www.transifex.com/projects/p/xbmc-addons/language/en_US/)\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Language: en_US\n"
-"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-
-msgctxt "#30000"
-msgid "Grab album thumbs from fanart.tv"
-msgstr "Grab album thumbs from fanart.tv"
-
-msgctxt "#30001"
-msgid "Grab album thumbs from theaudiodb.com"
-msgstr "Grab album thumbs from theaudiodb.com"
diff --git a/addons/metadata.musicvideos.theaudiodb.com/resources/language/English/strings.po b/addons/metadata.musicvideos.theaudiodb.com/resources/language/English/strings.po
deleted file mode 100644
index ae13059986..0000000000
--- a/addons/metadata.musicvideos.theaudiodb.com/resources/language/English/strings.po
+++ /dev/null
@@ -1,25 +0,0 @@
-# Kodi Media Center language file
-# Addon Name: TheAudioDb.com for Music Videos
-# Addon id: metadata.musicvideos.theaudiodb.com
-# Addon Provider: XBMC Foundation
-msgid ""
-msgstr ""
-"Project-Id-Version: XBMC Addons\n"
-"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n"
-"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: Kodi Translation Team\n"
-"Language-Team: English (http://www.transifex.com/projects/p/xbmc-addons/language/en/)\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Language: en\n"
-"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-
-msgctxt "#30000"
-msgid "Grab album thumbs from fanart.tv"
-msgstr ""
-
-msgctxt "#30001"
-msgid "Grab album thumbs from theaudiodb.com"
-msgstr ""
diff --git a/addons/metadata.musicvideos.theaudiodb.com/resources/language/Estonian/strings.po b/addons/metadata.musicvideos.theaudiodb.com/resources/language/Estonian/strings.po
deleted file mode 100644
index 1faf990e55..0000000000
--- a/addons/metadata.musicvideos.theaudiodb.com/resources/language/Estonian/strings.po
+++ /dev/null
@@ -1,25 +0,0 @@
-# Kodi Media Center language file
-# Addon Name: TheAudioDb.com for Music Videos
-# Addon id: metadata.musicvideos.theaudiodb.com
-# Addon Provider: XBMC Foundation
-msgid ""
-msgstr ""
-"Project-Id-Version: XBMC Addons\n"
-"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n"
-"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: Kodi Translation Team\n"
-"Language-Team: Estonian (http://www.transifex.com/projects/p/xbmc-addons/language/et/)\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Language: et\n"
-"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-
-msgctxt "#30000"
-msgid "Grab album thumbs from fanart.tv"
-msgstr "Hangi albumi pisipildid fanart.tv-st"
-
-msgctxt "#30001"
-msgid "Grab album thumbs from theaudiodb.com"
-msgstr "Hangi albumi pisipildid theaudiodb.com-st"
diff --git a/addons/metadata.musicvideos.theaudiodb.com/resources/language/Finnish/strings.po b/addons/metadata.musicvideos.theaudiodb.com/resources/language/Finnish/strings.po
deleted file mode 100644
index 7646e262b6..0000000000
--- a/addons/metadata.musicvideos.theaudiodb.com/resources/language/Finnish/strings.po
+++ /dev/null
@@ -1,21 +0,0 @@
-# Kodi Media Center language file
-# Addon Name: TheAudioDb.com for Music Videos
-# Addon id: metadata.musicvideos.theaudiodb.com
-# Addon Provider: XBMC Foundation
-msgid ""
-msgstr ""
-"Project-Id-Version: XBMC Addons\n"
-"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n"
-"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: Kodi Translation Team\n"
-"Language-Team: Finnish (http://www.transifex.com/projects/p/xbmc-addons/language/fi/)\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Language: fi\n"
-"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-
-msgctxt "#30000"
-msgid "Grab album thumbs from fanart.tv"
-msgstr "Hae albumin pienoiskuvat fanart.tv:stä"
diff --git a/addons/metadata.musicvideos.theaudiodb.com/resources/language/French (Canada)/strings.po b/addons/metadata.musicvideos.theaudiodb.com/resources/language/French (Canada)/strings.po
deleted file mode 100644
index a4542b4273..0000000000
--- a/addons/metadata.musicvideos.theaudiodb.com/resources/language/French (Canada)/strings.po
+++ /dev/null
@@ -1,25 +0,0 @@
-# Kodi Media Center language file
-# Addon Name: TheAudioDb.com for Music Videos
-# Addon id: metadata.musicvideos.theaudiodb.com
-# Addon Provider: XBMC Foundation
-msgid ""
-msgstr ""
-"Project-Id-Version: XBMC Addons\n"
-"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n"
-"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: Kodi Translation Team\n"
-"Language-Team: French (Canada) (http://www.transifex.com/projects/p/xbmc-addons/language/fr_CA/)\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Language: fr_CA\n"
-"Plural-Forms: nplurals=2; plural=(n > 1);\n"
-
-msgctxt "#30000"
-msgid "Grab album thumbs from fanart.tv"
-msgstr "Récupérer les imagettes d'albums de fanart.tv"
-
-msgctxt "#30001"
-msgid "Grab album thumbs from theaudiodb.com"
-msgstr "Récupérer les imagettes d'albums de theaudiodb.com"
diff --git a/addons/metadata.musicvideos.theaudiodb.com/resources/language/French/strings.po b/addons/metadata.musicvideos.theaudiodb.com/resources/language/French/strings.po
deleted file mode 100644
index af899c2187..0000000000
--- a/addons/metadata.musicvideos.theaudiodb.com/resources/language/French/strings.po
+++ /dev/null
@@ -1,25 +0,0 @@
-# Kodi Media Center language file
-# Addon Name: TheAudioDb.com for Music Videos
-# Addon id: metadata.musicvideos.theaudiodb.com
-# Addon Provider: XBMC Foundation
-msgid ""
-msgstr ""
-"Project-Id-Version: XBMC Addons\n"
-"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n"
-"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: Kodi Translation Team\n"
-"Language-Team: French (http://www.transifex.com/projects/p/xbmc-addons/language/fr/)\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Language: fr\n"
-"Plural-Forms: nplurals=2; plural=(n > 1);\n"
-
-msgctxt "#30000"
-msgid "Grab album thumbs from fanart.tv"
-msgstr "Récupérer les vignettes d'albums depuis fanart.tv"
-
-msgctxt "#30001"
-msgid "Grab album thumbs from theaudiodb.com"
-msgstr "Récupère les vignettes des albums depuis theaudiodb.com"
diff --git a/addons/metadata.musicvideos.theaudiodb.com/resources/language/Galician/strings.po b/addons/metadata.musicvideos.theaudiodb.com/resources/language/Galician/strings.po
deleted file mode 100644
index 8cf6aca414..0000000000
--- a/addons/metadata.musicvideos.theaudiodb.com/resources/language/Galician/strings.po
+++ /dev/null
@@ -1,25 +0,0 @@
-# Kodi Media Center language file
-# Addon Name: TheAudioDb.com for Music Videos
-# Addon id: metadata.musicvideos.theaudiodb.com
-# Addon Provider: XBMC Foundation
-msgid ""
-msgstr ""
-"Project-Id-Version: XBMC Addons\n"
-"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n"
-"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: Kodi Translation Team\n"
-"Language-Team: Galician (http://www.transifex.com/projects/p/xbmc-addons/language/gl/)\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Language: gl\n"
-"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-
-msgctxt "#30000"
-msgid "Grab album thumbs from fanart.tv"
-msgstr "Obter as miniaturas do álbum dende fanart.tv"
-
-msgctxt "#30001"
-msgid "Grab album thumbs from theaudiodb.com"
-msgstr "Obter as miniaturas do álbum dende theaudiodb.com"
diff --git a/addons/metadata.musicvideos.theaudiodb.com/resources/language/German/strings.po b/addons/metadata.musicvideos.theaudiodb.com/resources/language/German/strings.po
deleted file mode 100644
index 3a989f206b..0000000000
--- a/addons/metadata.musicvideos.theaudiodb.com/resources/language/German/strings.po
+++ /dev/null
@@ -1,25 +0,0 @@
-# Kodi Media Center language file
-# Addon Name: TheAudioDb.com for Music Videos
-# Addon id: metadata.musicvideos.theaudiodb.com
-# Addon Provider: XBMC Foundation
-msgid ""
-msgstr ""
-"Project-Id-Version: XBMC Addons\n"
-"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n"
-"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: Kodi Translation Team\n"
-"Language-Team: German (http://www.transifex.com/projects/p/xbmc-addons/language/de/)\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Language: de\n"
-"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-
-msgctxt "#30000"
-msgid "Grab album thumbs from fanart.tv"
-msgstr "Album-Vorschaubilder von fanart.tv laden"
-
-msgctxt "#30001"
-msgid "Grab album thumbs from theaudiodb.com"
-msgstr "Album-Vorschaubilder von theaudiodb.com laden"
diff --git a/addons/metadata.musicvideos.theaudiodb.com/resources/language/Greek/strings.po b/addons/metadata.musicvideos.theaudiodb.com/resources/language/Greek/strings.po
deleted file mode 100644
index 3cb0bb171d..0000000000
--- a/addons/metadata.musicvideos.theaudiodb.com/resources/language/Greek/strings.po
+++ /dev/null
@@ -1,25 +0,0 @@
-# Kodi Media Center language file
-# Addon Name: TheAudioDb.com for Music Videos
-# Addon id: metadata.musicvideos.theaudiodb.com
-# Addon Provider: XBMC Foundation
-msgid ""
-msgstr ""
-"Project-Id-Version: XBMC Addons\n"
-"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n"
-"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: Kodi Translation Team\n"
-"Language-Team: Greek (http://www.transifex.com/projects/p/xbmc-addons/language/el/)\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Language: el\n"
-"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-
-msgctxt "#30000"
-msgid "Grab album thumbs from fanart.tv"
-msgstr "ΜικÏογÏαφίες άλμπουμ από fanart.tv"
-
-msgctxt "#30001"
-msgid "Grab album thumbs from theaudiodb.com"
-msgstr "ΜικÏογÏαφίες Άλμπουμ από το theaudiodb.com"
diff --git a/addons/metadata.musicvideos.theaudiodb.com/resources/language/Hebrew/strings.po b/addons/metadata.musicvideos.theaudiodb.com/resources/language/Hebrew/strings.po
deleted file mode 100644
index 780cc76d0b..0000000000
--- a/addons/metadata.musicvideos.theaudiodb.com/resources/language/Hebrew/strings.po
+++ /dev/null
@@ -1,25 +0,0 @@
-# Kodi Media Center language file
-# Addon Name: TheAudioDb.com for Music Videos
-# Addon id: metadata.musicvideos.theaudiodb.com
-# Addon Provider: XBMC Foundation
-msgid ""
-msgstr ""
-"Project-Id-Version: XBMC Addons\n"
-"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n"
-"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: Kodi Translation Team\n"
-"Language-Team: Hebrew (http://www.transifex.com/projects/p/xbmc-addons/language/he/)\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Language: he\n"
-"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-
-msgctxt "#30000"
-msgid "Grab album thumbs from fanart.tv"
-msgstr "השג תמונות ××œ×‘×•× ×ž- fanart.tv"
-
-msgctxt "#30001"
-msgid "Grab album thumbs from theaudiodb.com"
-msgstr "השג תמונת ××œ×‘×•× ×ž-theaudiodb.com"
diff --git a/addons/metadata.musicvideos.theaudiodb.com/resources/language/Hungarian/strings.po b/addons/metadata.musicvideos.theaudiodb.com/resources/language/Hungarian/strings.po
deleted file mode 100644
index c6cd7b55ad..0000000000
--- a/addons/metadata.musicvideos.theaudiodb.com/resources/language/Hungarian/strings.po
+++ /dev/null
@@ -1,25 +0,0 @@
-# Kodi Media Center language file
-# Addon Name: TheAudioDb.com for Music Videos
-# Addon id: metadata.musicvideos.theaudiodb.com
-# Addon Provider: XBMC Foundation
-msgid ""
-msgstr ""
-"Project-Id-Version: XBMC Addons\n"
-"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n"
-"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: Kodi Translation Team\n"
-"Language-Team: Hungarian (http://www.transifex.com/projects/p/xbmc-addons/language/hu/)\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Language: hu\n"
-"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-
-msgctxt "#30000"
-msgid "Grab album thumbs from fanart.tv"
-msgstr "Album miniképek letőltésea fanart.tv-ről"
-
-msgctxt "#30001"
-msgid "Grab album thumbs from theaudiodb.com"
-msgstr "Album miniképek a theaudiodb.com-ról"
diff --git a/addons/metadata.musicvideos.theaudiodb.com/resources/language/Icelandic/strings.po b/addons/metadata.musicvideos.theaudiodb.com/resources/language/Icelandic/strings.po
deleted file mode 100644
index f0a30f883b..0000000000
--- a/addons/metadata.musicvideos.theaudiodb.com/resources/language/Icelandic/strings.po
+++ /dev/null
@@ -1,25 +0,0 @@
-# Kodi Media Center language file
-# Addon Name: TheAudioDb.com for Music Videos
-# Addon id: metadata.musicvideos.theaudiodb.com
-# Addon Provider: XBMC Foundation
-msgid ""
-msgstr ""
-"Project-Id-Version: XBMC Addons\n"
-"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n"
-"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: Kodi Translation Team\n"
-"Language-Team: Icelandic (http://www.transifex.com/projects/p/xbmc-addons/language/is/)\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Language: is\n"
-"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-
-msgctxt "#30000"
-msgid "Grab album thumbs from fanart.tv"
-msgstr "Ná í smámyndir hljómplatna frá fanart.tv"
-
-msgctxt "#30001"
-msgid "Grab album thumbs from theaudiodb.com"
-msgstr "Ná í smámyndir hljómplatna frá theaudiodb.com"
diff --git a/addons/metadata.musicvideos.theaudiodb.com/resources/language/Indonesian/strings.po b/addons/metadata.musicvideos.theaudiodb.com/resources/language/Indonesian/strings.po
deleted file mode 100644
index 57be33fdd9..0000000000
--- a/addons/metadata.musicvideos.theaudiodb.com/resources/language/Indonesian/strings.po
+++ /dev/null
@@ -1,25 +0,0 @@
-# Kodi Media Center language file
-# Addon Name: TheAudioDb.com for Music Videos
-# Addon id: metadata.musicvideos.theaudiodb.com
-# Addon Provider: XBMC Foundation
-msgid ""
-msgstr ""
-"Project-Id-Version: XBMC Addons\n"
-"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n"
-"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: Kodi Translation Team\n"
-"Language-Team: Indonesian (http://www.transifex.com/projects/p/xbmc-addons/language/id/)\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Language: id\n"
-"Plural-Forms: nplurals=1; plural=0;\n"
-
-msgctxt "#30000"
-msgid "Grab album thumbs from fanart.tv"
-msgstr "Ambil thumb album dari fanart.tv"
-
-msgctxt "#30001"
-msgid "Grab album thumbs from theaudiodb.com"
-msgstr "Ambil thumb album dari theaudiodb.com"
diff --git a/addons/metadata.musicvideos.theaudiodb.com/resources/language/Italian/strings.po b/addons/metadata.musicvideos.theaudiodb.com/resources/language/Italian/strings.po
deleted file mode 100644
index fe3cb1f942..0000000000
--- a/addons/metadata.musicvideos.theaudiodb.com/resources/language/Italian/strings.po
+++ /dev/null
@@ -1,25 +0,0 @@
-# Kodi Media Center language file
-# Addon Name: TheAudioDb.com for Music Videos
-# Addon id: metadata.musicvideos.theaudiodb.com
-# Addon Provider: XBMC Foundation
-msgid ""
-msgstr ""
-"Project-Id-Version: XBMC Addons\n"
-"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n"
-"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: Kodi Translation Team\n"
-"Language-Team: Italian (http://www.transifex.com/projects/p/xbmc-addons/language/it/)\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Language: it\n"
-"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-
-msgctxt "#30000"
-msgid "Grab album thumbs from fanart.tv"
-msgstr "Scarica le copertine album da fanart.tv"
-
-msgctxt "#30001"
-msgid "Grab album thumbs from theaudiodb.com"
-msgstr "Prendi miniature album da theaudiodb.com"
diff --git a/addons/metadata.musicvideos.theaudiodb.com/resources/language/Japanese/strings.po b/addons/metadata.musicvideos.theaudiodb.com/resources/language/Japanese/strings.po
deleted file mode 100644
index 89426de248..0000000000
--- a/addons/metadata.musicvideos.theaudiodb.com/resources/language/Japanese/strings.po
+++ /dev/null
@@ -1,25 +0,0 @@
-# Kodi Media Center language file
-# Addon Name: TheAudioDb.com for Music Videos
-# Addon id: metadata.musicvideos.theaudiodb.com
-# Addon Provider: XBMC Foundation
-msgid ""
-msgstr ""
-"Project-Id-Version: XBMC Addons\n"
-"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n"
-"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: Kodi Translation Team\n"
-"Language-Team: Japanese (http://www.transifex.com/projects/p/xbmc-addons/language/ja/)\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Language: ja\n"
-"Plural-Forms: nplurals=1; plural=0;\n"
-
-msgctxt "#30000"
-msgid "Grab album thumbs from fanart.tv"
-msgstr "fanart.tv ã‹ã‚‰ã‚¢ãƒ«ãƒãƒ ã‚µãƒ ãƒã‚¤ãƒ«ã‚’å–å¾—"
-
-msgctxt "#30001"
-msgid "Grab album thumbs from theaudiodb.com"
-msgstr "theaudiodb.com ã‹ã‚‰ã‚¢ãƒ«ãƒãƒ ã‚µãƒ ãƒã‚¤ãƒ«ã‚’å–å¾—"
diff --git a/addons/metadata.musicvideos.theaudiodb.com/resources/language/Korean/strings.po b/addons/metadata.musicvideos.theaudiodb.com/resources/language/Korean/strings.po
deleted file mode 100644
index 2ded43df9d..0000000000
--- a/addons/metadata.musicvideos.theaudiodb.com/resources/language/Korean/strings.po
+++ /dev/null
@@ -1,25 +0,0 @@
-# Kodi Media Center language file
-# Addon Name: TheAudioDb.com for Music Videos
-# Addon id: metadata.musicvideos.theaudiodb.com
-# Addon Provider: XBMC Foundation
-msgid ""
-msgstr ""
-"Project-Id-Version: XBMC Addons\n"
-"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n"
-"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: Kodi Translation Team\n"
-"Language-Team: Korean (http://www.transifex.com/projects/p/xbmc-addons/language/ko/)\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Language: ko\n"
-"Plural-Forms: nplurals=1; plural=0;\n"
-
-msgctxt "#30000"
-msgid "Grab album thumbs from fanart.tv"
-msgstr "fanart.tv ì—ì„œ 앨범 커버 가져오기"
-
-msgctxt "#30001"
-msgid "Grab album thumbs from theaudiodb.com"
-msgstr "theaudiodb.com ì—ì„œ 앨범 커버 가져오기"
diff --git a/addons/metadata.musicvideos.theaudiodb.com/resources/language/Lithuanian/strings.po b/addons/metadata.musicvideos.theaudiodb.com/resources/language/Lithuanian/strings.po
deleted file mode 100644
index 3677efcafe..0000000000
--- a/addons/metadata.musicvideos.theaudiodb.com/resources/language/Lithuanian/strings.po
+++ /dev/null
@@ -1,25 +0,0 @@
-# Kodi Media Center language file
-# Addon Name: TheAudioDb.com for Music Videos
-# Addon id: metadata.musicvideos.theaudiodb.com
-# Addon Provider: XBMC Foundation
-msgid ""
-msgstr ""
-"Project-Id-Version: XBMC Addons\n"
-"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n"
-"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: Kodi Translation Team\n"
-"Language-Team: Lithuanian (http://www.transifex.com/projects/p/xbmc-addons/language/lt/)\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Language: 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"
-
-msgctxt "#30000"
-msgid "Grab album thumbs from fanart.tv"
-msgstr "Paimti albumų miniatiūras iš fanart.tv"
-
-msgctxt "#30001"
-msgid "Grab album thumbs from theaudiodb.com"
-msgstr "Paimti albumų miniatiūras iš theaudiodb.com"
diff --git a/addons/metadata.musicvideos.theaudiodb.com/resources/language/Macedonian/strings.po b/addons/metadata.musicvideos.theaudiodb.com/resources/language/Macedonian/strings.po
deleted file mode 100644
index 290e080f50..0000000000
--- a/addons/metadata.musicvideos.theaudiodb.com/resources/language/Macedonian/strings.po
+++ /dev/null
@@ -1,21 +0,0 @@
-# Kodi Media Center language file
-# Addon Name: TheAudioDb.com for Music Videos
-# Addon id: metadata.musicvideos.theaudiodb.com
-# Addon Provider: XBMC Foundation
-msgid ""
-msgstr ""
-"Project-Id-Version: XBMC Addons\n"
-"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n"
-"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: Kodi Translation Team\n"
-"Language-Team: Macedonian (http://www.transifex.com/projects/p/xbmc-addons/language/mk/)\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Language: mk\n"
-"Plural-Forms: nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;\n"
-
-msgctxt "#30000"
-msgid "Grab album thumbs from fanart.tv"
-msgstr "Симни Ñликички за албум од fanart.tv"
diff --git a/addons/metadata.musicvideos.theaudiodb.com/resources/language/Malay/strings.po b/addons/metadata.musicvideos.theaudiodb.com/resources/language/Malay/strings.po
deleted file mode 100644
index ab2fb2c130..0000000000
--- a/addons/metadata.musicvideos.theaudiodb.com/resources/language/Malay/strings.po
+++ /dev/null
@@ -1,25 +0,0 @@
-# Kodi Media Center language file
-# Addon Name: TheAudioDb.com for Music Videos
-# Addon id: metadata.musicvideos.theaudiodb.com
-# Addon Provider: XBMC Foundation
-msgid ""
-msgstr ""
-"Project-Id-Version: XBMC Addons\n"
-"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n"
-"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: Kodi Translation Team\n"
-"Language-Team: Malay (http://www.transifex.com/projects/p/xbmc-addons/language/ms/)\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Language: ms\n"
-"Plural-Forms: nplurals=1; plural=0;\n"
-
-msgctxt "#30000"
-msgid "Grab album thumbs from fanart.tv"
-msgstr "Dapatkan Lakaran Kenit Album dari fanart.tv"
-
-msgctxt "#30001"
-msgid "Grab album thumbs from theaudiodb.com"
-msgstr "Dapatkan Lakaran Kenit Album dari theaudiodb.com"
diff --git a/addons/metadata.musicvideos.theaudiodb.com/resources/language/Norwegian/strings.po b/addons/metadata.musicvideos.theaudiodb.com/resources/language/Norwegian/strings.po
deleted file mode 100644
index eef3a7320c..0000000000
--- a/addons/metadata.musicvideos.theaudiodb.com/resources/language/Norwegian/strings.po
+++ /dev/null
@@ -1,25 +0,0 @@
-# Kodi Media Center language file
-# Addon Name: TheAudioDb.com for Music Videos
-# Addon id: metadata.musicvideos.theaudiodb.com
-# Addon Provider: XBMC Foundation
-msgid ""
-msgstr ""
-"Project-Id-Version: XBMC Addons\n"
-"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n"
-"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: Kodi Translation Team\n"
-"Language-Team: Norwegian (http://www.transifex.com/projects/p/xbmc-addons/language/no/)\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Language: no\n"
-"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-
-msgctxt "#30000"
-msgid "Grab album thumbs from fanart.tv"
-msgstr "Hent album bilder fra fanart.tv"
-
-msgctxt "#30001"
-msgid "Grab album thumbs from theaudiodb.com"
-msgstr "Hent Album Thumbs fra theaudiodb.com"
diff --git a/addons/metadata.musicvideos.theaudiodb.com/resources/language/Polish/strings.po b/addons/metadata.musicvideos.theaudiodb.com/resources/language/Polish/strings.po
deleted file mode 100644
index 76f342e4d1..0000000000
--- a/addons/metadata.musicvideos.theaudiodb.com/resources/language/Polish/strings.po
+++ /dev/null
@@ -1,25 +0,0 @@
-# Kodi Media Center language file
-# Addon Name: TheAudioDb.com for Music Videos
-# Addon id: metadata.musicvideos.theaudiodb.com
-# Addon Provider: XBMC Foundation
-msgid ""
-msgstr ""
-"Project-Id-Version: XBMC Addons\n"
-"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n"
-"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: Kodi Translation Team\n"
-"Language-Team: Polish (http://www.transifex.com/projects/p/xbmc-addons/language/pl/)\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Language: 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"
-
-msgctxt "#30000"
-msgid "Grab album thumbs from fanart.tv"
-msgstr "Pobieraj miniatur albumu z fanart.tv"
-
-msgctxt "#30001"
-msgid "Grab album thumbs from theaudiodb.com"
-msgstr "Pobieraj miniatur albumu theaudiodb.com"
diff --git a/addons/metadata.musicvideos.theaudiodb.com/resources/language/Portuguese (Brazil)/strings.po b/addons/metadata.musicvideos.theaudiodb.com/resources/language/Portuguese (Brazil)/strings.po
deleted file mode 100644
index 7e27a3e6c8..0000000000
--- a/addons/metadata.musicvideos.theaudiodb.com/resources/language/Portuguese (Brazil)/strings.po
+++ /dev/null
@@ -1,25 +0,0 @@
-# Kodi Media Center language file
-# Addon Name: TheAudioDb.com for Music Videos
-# Addon id: metadata.musicvideos.theaudiodb.com
-# Addon Provider: XBMC Foundation
-msgid ""
-msgstr ""
-"Project-Id-Version: XBMC Addons\n"
-"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n"
-"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: Kodi Translation Team\n"
-"Language-Team: Portuguese (Brazil) (http://www.transifex.com/projects/p/xbmc-addons/language/pt_BR/)\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Language: pt_BR\n"
-"Plural-Forms: nplurals=2; plural=(n > 1);\n"
-
-msgctxt "#30000"
-msgid "Grab album thumbs from fanart.tv"
-msgstr "Obter miniaturas de álbuns de fanart.tv"
-
-msgctxt "#30001"
-msgid "Grab album thumbs from theaudiodb.com"
-msgstr "Pegar miniaturas de álbum de theaudiodb.com"
diff --git a/addons/metadata.musicvideos.theaudiodb.com/resources/language/Portuguese/strings.po b/addons/metadata.musicvideos.theaudiodb.com/resources/language/Portuguese/strings.po
deleted file mode 100644
index 1ab97e3d65..0000000000
--- a/addons/metadata.musicvideos.theaudiodb.com/resources/language/Portuguese/strings.po
+++ /dev/null
@@ -1,25 +0,0 @@
-# Kodi Media Center language file
-# Addon Name: TheAudioDb.com for Music Videos
-# Addon id: metadata.musicvideos.theaudiodb.com
-# Addon Provider: XBMC Foundation
-msgid ""
-msgstr ""
-"Project-Id-Version: XBMC Addons\n"
-"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n"
-"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: Kodi Translation Team\n"
-"Language-Team: Portuguese (http://www.transifex.com/projects/p/xbmc-addons/language/pt/)\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Language: pt\n"
-"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-
-msgctxt "#30000"
-msgid "Grab album thumbs from fanart.tv"
-msgstr "Obter miniaturas de álbum em fanart.tv"
-
-msgctxt "#30001"
-msgid "Grab album thumbs from theaudiodb.com"
-msgstr "Obter miniaturas de álbum em theaudiodb.com"
diff --git a/addons/metadata.musicvideos.theaudiodb.com/resources/language/Romanian/strings.po b/addons/metadata.musicvideos.theaudiodb.com/resources/language/Romanian/strings.po
deleted file mode 100644
index 415670bca7..0000000000
--- a/addons/metadata.musicvideos.theaudiodb.com/resources/language/Romanian/strings.po
+++ /dev/null
@@ -1,25 +0,0 @@
-# Kodi Media Center language file
-# Addon Name: TheAudioDb.com for Music Videos
-# Addon id: metadata.musicvideos.theaudiodb.com
-# Addon Provider: XBMC Foundation
-msgid ""
-msgstr ""
-"Project-Id-Version: XBMC Addons\n"
-"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n"
-"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: Kodi Translation Team\n"
-"Language-Team: Romanian (http://www.transifex.com/projects/p/xbmc-addons/language/ro/)\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Language: ro\n"
-"Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));\n"
-
-msgctxt "#30000"
-msgid "Grab album thumbs from fanart.tv"
-msgstr "Obţine imagini albume de la fanart.tv"
-
-msgctxt "#30001"
-msgid "Grab album thumbs from theaudiodb.com"
-msgstr "Obţine imagini albume de la theaudiodb.com"
diff --git a/addons/metadata.musicvideos.theaudiodb.com/resources/language/Russian/strings.po b/addons/metadata.musicvideos.theaudiodb.com/resources/language/Russian/strings.po
deleted file mode 100644
index 0cd9497730..0000000000
--- a/addons/metadata.musicvideos.theaudiodb.com/resources/language/Russian/strings.po
+++ /dev/null
@@ -1,25 +0,0 @@
-# Kodi Media Center language file
-# Addon Name: TheAudioDb.com for Music Videos
-# Addon id: metadata.musicvideos.theaudiodb.com
-# Addon Provider: XBMC Foundation
-msgid ""
-msgstr ""
-"Project-Id-Version: XBMC Addons\n"
-"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n"
-"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: Kodi Translation Team\n"
-"Language-Team: Russian (http://www.transifex.com/projects/p/xbmc-addons/language/ru/)\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Language: 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"
-
-msgctxt "#30000"
-msgid "Grab album thumbs from fanart.tv"
-msgstr "Загружать ÑÑкизы альбомов Ñ fanart.tv"
-
-msgctxt "#30001"
-msgid "Grab album thumbs from theaudiodb.com"
-msgstr "Загружать ÑÑкизы альбомов Ñ fanart.tv"
diff --git a/addons/metadata.musicvideos.theaudiodb.com/resources/language/Slovak/strings.po b/addons/metadata.musicvideos.theaudiodb.com/resources/language/Slovak/strings.po
deleted file mode 100644
index 289e283632..0000000000
--- a/addons/metadata.musicvideos.theaudiodb.com/resources/language/Slovak/strings.po
+++ /dev/null
@@ -1,25 +0,0 @@
-# Kodi Media Center language file
-# Addon Name: TheAudioDb.com for Music Videos
-# Addon id: metadata.musicvideos.theaudiodb.com
-# Addon Provider: XBMC Foundation
-msgid ""
-msgstr ""
-"Project-Id-Version: XBMC Addons\n"
-"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n"
-"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: Kodi Translation Team\n"
-"Language-Team: Slovak (http://www.transifex.com/projects/p/xbmc-addons/language/sk/)\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Language: sk\n"
-"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
-
-msgctxt "#30000"
-msgid "Grab album thumbs from fanart.tv"
-msgstr "Získať náhľady albumov zo stránky fanart.tv"
-
-msgctxt "#30001"
-msgid "Grab album thumbs from theaudiodb.com"
-msgstr "Získať náhľady albumov zo stránky theaudiodb.com"
diff --git a/addons/metadata.musicvideos.theaudiodb.com/resources/language/Slovenian/strings.po b/addons/metadata.musicvideos.theaudiodb.com/resources/language/Slovenian/strings.po
deleted file mode 100644
index ee014f922c..0000000000
--- a/addons/metadata.musicvideos.theaudiodb.com/resources/language/Slovenian/strings.po
+++ /dev/null
@@ -1,25 +0,0 @@
-# Kodi Media Center language file
-# Addon Name: TheAudioDb.com for Music Videos
-# Addon id: metadata.musicvideos.theaudiodb.com
-# Addon Provider: XBMC Foundation
-msgid ""
-msgstr ""
-"Project-Id-Version: XBMC Addons\n"
-"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n"
-"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: Kodi Translation Team\n"
-"Language-Team: Slovenian (http://www.transifex.com/projects/p/xbmc-addons/language/sl/)\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Language: sl\n"
-"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);\n"
-
-msgctxt "#30000"
-msgid "Grab album thumbs from fanart.tv"
-msgstr "Prenesi sliÄice albumov s fanart.tv"
-
-msgctxt "#30001"
-msgid "Grab album thumbs from theaudiodb.com"
-msgstr "Prenesi sliÄice albumov z theaudiodb.com"
diff --git a/addons/metadata.musicvideos.theaudiodb.com/resources/language/Spanish (Argentina)/strings.po b/addons/metadata.musicvideos.theaudiodb.com/resources/language/Spanish (Argentina)/strings.po
deleted file mode 100644
index 9d23da7ed6..0000000000
--- a/addons/metadata.musicvideos.theaudiodb.com/resources/language/Spanish (Argentina)/strings.po
+++ /dev/null
@@ -1,25 +0,0 @@
-# Kodi Media Center language file
-# Addon Name: TheAudioDb.com for Music Videos
-# Addon id: metadata.musicvideos.theaudiodb.com
-# Addon Provider: XBMC Foundation
-msgid ""
-msgstr ""
-"Project-Id-Version: XBMC Addons\n"
-"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n"
-"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: Kodi Translation Team\n"
-"Language-Team: Spanish (Argentina) (http://www.transifex.com/projects/p/xbmc-addons/language/es_AR/)\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Language: es_AR\n"
-"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-
-msgctxt "#30000"
-msgid "Grab album thumbs from fanart.tv"
-msgstr "Obtener miniaturas de álbum de fanart.tv"
-
-msgctxt "#30001"
-msgid "Grab album thumbs from theaudiodb.com"
-msgstr "Descargar miniaturas de álbum de theaudiodb.com"
diff --git a/addons/metadata.musicvideos.theaudiodb.com/resources/language/Spanish (Mexico)/strings.po b/addons/metadata.musicvideos.theaudiodb.com/resources/language/Spanish (Mexico)/strings.po
deleted file mode 100644
index 6c6eed4ea4..0000000000
--- a/addons/metadata.musicvideos.theaudiodb.com/resources/language/Spanish (Mexico)/strings.po
+++ /dev/null
@@ -1,21 +0,0 @@
-# Kodi Media Center language file
-# Addon Name: TheAudioDb.com for Music Videos
-# Addon id: metadata.musicvideos.theaudiodb.com
-# Addon Provider: XBMC Foundation
-msgid ""
-msgstr ""
-"Project-Id-Version: XBMC Addons\n"
-"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n"
-"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: Kodi Translation Team\n"
-"Language-Team: Spanish (Mexico) (http://www.transifex.com/projects/p/xbmc-addons/language/es_MX/)\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Language: es_MX\n"
-"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-
-msgctxt "#30000"
-msgid "Grab album thumbs from fanart.tv"
-msgstr "Obtener miniaturas de álbumes desde fanart.tv"
diff --git a/addons/metadata.musicvideos.theaudiodb.com/resources/language/Spanish/strings.po b/addons/metadata.musicvideos.theaudiodb.com/resources/language/Spanish/strings.po
deleted file mode 100644
index 1a88bf2ef4..0000000000
--- a/addons/metadata.musicvideos.theaudiodb.com/resources/language/Spanish/strings.po
+++ /dev/null
@@ -1,25 +0,0 @@
-# Kodi Media Center language file
-# Addon Name: TheAudioDb.com for Music Videos
-# Addon id: metadata.musicvideos.theaudiodb.com
-# Addon Provider: XBMC Foundation
-msgid ""
-msgstr ""
-"Project-Id-Version: XBMC Addons\n"
-"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n"
-"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: Kodi Translation Team\n"
-"Language-Team: Spanish (http://www.transifex.com/projects/p/xbmc-addons/language/es/)\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Language: es\n"
-"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-
-msgctxt "#30000"
-msgid "Grab album thumbs from fanart.tv"
-msgstr "Obtener miniatura de álbum de fanart.tv"
-
-msgctxt "#30001"
-msgid "Grab album thumbs from theaudiodb.com"
-msgstr "Descargar miniaturas de álbum desde theaudiodb.com"
diff --git a/addons/metadata.musicvideos.theaudiodb.com/resources/language/Swedish/strings.po b/addons/metadata.musicvideos.theaudiodb.com/resources/language/Swedish/strings.po
deleted file mode 100644
index ddfe09b4c3..0000000000
--- a/addons/metadata.musicvideos.theaudiodb.com/resources/language/Swedish/strings.po
+++ /dev/null
@@ -1,25 +0,0 @@
-# Kodi Media Center language file
-# Addon Name: TheAudioDb.com for Music Videos
-# Addon id: metadata.musicvideos.theaudiodb.com
-# Addon Provider: XBMC Foundation
-msgid ""
-msgstr ""
-"Project-Id-Version: XBMC Addons\n"
-"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n"
-"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: Kodi Translation Team\n"
-"Language-Team: Swedish (http://www.transifex.com/projects/p/xbmc-addons/language/sv/)\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Language: sv\n"
-"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-
-msgctxt "#30000"
-msgid "Grab album thumbs from fanart.tv"
-msgstr "Hämta albumminiatyrer från fanart.tv"
-
-msgctxt "#30001"
-msgid "Grab album thumbs from theaudiodb.com"
-msgstr "Hämta albumminiatyrer från theaudiodb.com"
diff --git a/addons/metadata.musicvideos.theaudiodb.com/resources/language/Tamil (India)/strings.po b/addons/metadata.musicvideos.theaudiodb.com/resources/language/Tamil (India)/strings.po
deleted file mode 100644
index c8476613c5..0000000000
--- a/addons/metadata.musicvideos.theaudiodb.com/resources/language/Tamil (India)/strings.po
+++ /dev/null
@@ -1,25 +0,0 @@
-# Kodi Media Center language file
-# Addon Name: TheAudioDb.com for Music Videos
-# Addon id: metadata.musicvideos.theaudiodb.com
-# Addon Provider: XBMC Foundation
-msgid ""
-msgstr ""
-"Project-Id-Version: XBMC Addons\n"
-"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n"
-"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: Kodi Translation Team\n"
-"Language-Team: Tamil (India) (http://www.transifex.com/projects/p/xbmc-addons/language/ta_IN/)\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Language: ta_IN\n"
-"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-
-msgctxt "#30000"
-msgid "Grab album thumbs from fanart.tv"
-msgstr "ஆலà¯à®ªà®®à¯ கà¯à®°à¯à®ªà®Ÿà®™à¯à®•à®³à¯ˆ fanart.tv இரà¯à®¨à¯à®¤à¯ கைபà¯à®ªà®±à¯à®±à¯"
-
-msgctxt "#30001"
-msgid "Grab album thumbs from theaudiodb.com"
-msgstr "ஆலà¯à®ªà®®à¯ கà¯à®°à¯à®ªà®Ÿà®™à¯à®•à®³à¯ˆ theaudiodb.com இரà¯à®¨à¯à®¤à¯ கைபà¯à®ªà®±à¯à®±à¯"
diff --git a/addons/metadata.musicvideos.theaudiodb.com/resources/language/Thai/strings.po b/addons/metadata.musicvideos.theaudiodb.com/resources/language/Thai/strings.po
deleted file mode 100644
index 59c781493b..0000000000
--- a/addons/metadata.musicvideos.theaudiodb.com/resources/language/Thai/strings.po
+++ /dev/null
@@ -1,21 +0,0 @@
-# Kodi Media Center language file
-# Addon Name: TheAudioDb.com for Music Videos
-# Addon id: metadata.musicvideos.theaudiodb.com
-# Addon Provider: XBMC Foundation
-msgid ""
-msgstr ""
-"Project-Id-Version: XBMC Addons\n"
-"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n"
-"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: Kodi Translation Team\n"
-"Language-Team: Thai (http://www.transifex.com/projects/p/xbmc-addons/language/th/)\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Language: th\n"
-"Plural-Forms: nplurals=1; plural=0;\n"
-
-msgctxt "#30000"
-msgid "Grab album thumbs from fanart.tv"
-msgstr "ดึงข้อมูลภาพปà¸à¸­à¸±à¸¥à¸šà¸±à¹‰à¸¡à¸ˆà¸²à¸ fanart.tv"
diff --git a/addons/metadata.musicvideos.theaudiodb.com/resources/language/Turkish/strings.po b/addons/metadata.musicvideos.theaudiodb.com/resources/language/Turkish/strings.po
deleted file mode 100644
index 79726674a7..0000000000
--- a/addons/metadata.musicvideos.theaudiodb.com/resources/language/Turkish/strings.po
+++ /dev/null
@@ -1,21 +0,0 @@
-# Kodi Media Center language file
-# Addon Name: TheAudioDb.com for Music Videos
-# Addon id: metadata.musicvideos.theaudiodb.com
-# Addon Provider: XBMC Foundation
-msgid ""
-msgstr ""
-"Project-Id-Version: XBMC Addons\n"
-"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n"
-"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: Kodi Translation Team\n"
-"Language-Team: Turkish (http://www.transifex.com/projects/p/xbmc-addons/language/tr/)\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Language: tr\n"
-"Plural-Forms: nplurals=1; plural=0;\n"
-
-msgctxt "#30000"
-msgid "Grab album thumbs from fanart.tv"
-msgstr "Albüm kapaklarını fanart.tv'den al"
diff --git a/addons/metadata.musicvideos.theaudiodb.com/resources/language/Ukrainian/strings.po b/addons/metadata.musicvideos.theaudiodb.com/resources/language/Ukrainian/strings.po
deleted file mode 100644
index f2931e5461..0000000000
--- a/addons/metadata.musicvideos.theaudiodb.com/resources/language/Ukrainian/strings.po
+++ /dev/null
@@ -1,21 +0,0 @@
-# Kodi Media Center language file
-# Addon Name: TheAudioDb.com for Music Videos
-# Addon id: metadata.musicvideos.theaudiodb.com
-# Addon Provider: XBMC Foundation
-msgid ""
-msgstr ""
-"Project-Id-Version: XBMC Addons\n"
-"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n"
-"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: Kodi Translation Team\n"
-"Language-Team: Ukrainian (http://www.transifex.com/projects/p/xbmc-addons/language/uk/)\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Language: uk\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"
-
-msgctxt "#30000"
-msgid "Grab album thumbs from fanart.tv"
-msgstr "Отримати малюнки альбому з fanart.tv"
diff --git a/addons/metadata.musicvideos.theaudiodb.com/resources/language/Vietnamese/strings.po b/addons/metadata.musicvideos.theaudiodb.com/resources/language/Vietnamese/strings.po
deleted file mode 100644
index 4cb97352c0..0000000000
--- a/addons/metadata.musicvideos.theaudiodb.com/resources/language/Vietnamese/strings.po
+++ /dev/null
@@ -1,25 +0,0 @@
-# Kodi Media Center language file
-# Addon Name: TheAudioDb.com for Music Videos
-# Addon id: metadata.musicvideos.theaudiodb.com
-# Addon Provider: XBMC Foundation
-msgid ""
-msgstr ""
-"Project-Id-Version: XBMC Addons\n"
-"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n"
-"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: Kodi Translation Team\n"
-"Language-Team: Vietnamese (http://www.transifex.com/projects/p/xbmc-addons/language/vi/)\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Language: vi\n"
-"Plural-Forms: nplurals=1; plural=0;\n"
-
-msgctxt "#30000"
-msgid "Grab album thumbs from fanart.tv"
-msgstr "Lấy hình đại diện album từ nguồn fanart.tv"
-
-msgctxt "#30001"
-msgid "Grab album thumbs from theaudiodb.com"
-msgstr "Lấy hình đại diện album từ nguồn theaudiodb.com"
diff --git a/addons/metadata.musicvideos.theaudiodb.com/resources/language/Welsh/strings.po b/addons/metadata.musicvideos.theaudiodb.com/resources/language/Welsh/strings.po
deleted file mode 100644
index 66fbfb2290..0000000000
--- a/addons/metadata.musicvideos.theaudiodb.com/resources/language/Welsh/strings.po
+++ /dev/null
@@ -1,25 +0,0 @@
-# Kodi Media Center language file
-# Addon Name: TheAudioDb.com for Music Videos
-# Addon id: metadata.musicvideos.theaudiodb.com
-# Addon Provider: XBMC Foundation
-msgid ""
-msgstr ""
-"Project-Id-Version: XBMC Addons\n"
-"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n"
-"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: Kodi Translation Team\n"
-"Language-Team: Welsh (http://www.transifex.com/projects/p/xbmc-addons/language/cy/)\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Language: cy\n"
-"Plural-Forms: nplurals=4; plural=(n==1) ? 0 : (n==2) ? 1 : (n != 8 && n != 11) ? 2 : 3;\n"
-
-msgctxt "#30000"
-msgid "Grab album thumbs from fanart.tv"
-msgstr "Estyn lluniau bach album o fanart.tv"
-
-msgctxt "#30001"
-msgid "Grab album thumbs from theaudiodb.com"
-msgstr "Estynnwch luniau bach albwm o theaudiodb.com"
diff --git a/addons/metadata.musicvideos.theaudiodb.com/resources/settings.xml b/addons/metadata.musicvideos.theaudiodb.com/resources/settings.xml
deleted file mode 100644
index fa23fe04ab..0000000000
--- a/addons/metadata.musicvideos.theaudiodb.com/resources/settings.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<settings>
- <setting label="30001" type="bool" id="tadbalbumthumbs" default="true"/>
- <setting label="30000" type="bool" id="fanarttvalbumthumbs" default="false"/>
-</settings>
diff --git a/addons/metadata.musicvideos.theaudiodb.com/tadb.xml b/addons/metadata.musicvideos.theaudiodb.com/tadb.xml
deleted file mode 100644
index 709e32f040..0000000000
--- a/addons/metadata.musicvideos.theaudiodb.com/tadb.xml
+++ /dev/null
@@ -1,71 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<scraper framework="1.1" date="2013-04-03">
- <NfoUrl dest="3">
- <RegExp input="$$1" output="&lt;url&gt;http://www.theaudiodb.com/api/v1/json/58424d43204d6564696120/track.php?h=\1&lt;/url&gt;" dest="3">
- <expression>http://www.theaudiodb.com/track/(.+)</expression>
- </RegExp>
- </NfoUrl>
- <CreateSearchUrl dest="3">
- <RegExp input="$$5" output="\1" dest="3">
- <RegExp input="$$1" output="\1\\&apos;\2" dest="1">
- <expression repeat="yes">((?:[^%]*(?:%20))*[^%]*)(?:%27)((?:[^%]*(?:%20))*[^%]*)</expression>
- </RegExp>
- <RegExp input="$$1" output="&lt;url&gt;http://www.theaudiodb.com/api/v1/json/58424d43204d6564696120/searchtrack.php?s=\1&amp;amp;t=\2&lt;/url&gt;" dest="6">
- <expression trim="1,2">(.+)%20(?:%20|-)%20(.+)</expression>
- </RegExp>
- <RegExp input="$$6" output="\1" dest="5">
- <expression noclean="1" />
- </RegExp>
- <RegExp input="$$6" output="&lt;url&gt;http://www.theaudiodb.com/api/v1/json/58424d43204d6564696120/searchtrack.php?s=$$1&amp;amp;t=&lt;/url&gt;" dest="5">
- <expression>^$</expression>
- </RegExp>
- <expression noclean="1" />
- </RegExp>
- </CreateSearchUrl>
- <GetSearchResults dest="3">
- <RegExp input="$$5" output="&lt;results sorted=&quot;yes&quot;&gt;\1&lt;/results&gt;" dest="3">
- <RegExp input="$$1" output="&lt;entity&gt;&lt;title&gt;\5 - \3 [\4]&lt;/title&gt;&lt;url cache=&quot;tadb-\1.json&quot;&gt;http://www.theaudiodb.com/api/v1/json/58424d43204d6564696120/track.php?h=\1&lt;/url&gt;&lt;/entity&gt;" dest="5">
- <expression repeat="yes" clear="yes" fixchars="1" noclean="1">idTrack&quot;:&quot;([^&quot;]*)&quot;,&quot;idAlbum&quot;:&quot;([^&quot;]*).*?&quot;strTrack&quot;:&quot;([^&quot;]*)&quot;,&quot;strAlbum&quot;:&quot;([^&quot;]*)&quot;,&quot;strArtist&quot;:&quot;([^&quot;]*)</expression>
- </RegExp>
- <expression noclean="1" />
- </RegExp>
- </GetSearchResults>
- <GetDetails dest="3">
- <RegExp input="$$5" output="&lt;details&gt;\1&lt;/details&gt;" dest="3">
- <RegExp input="$$1" output="&lt;title&gt;\1&lt;/title&gt;" dest="5">
- <expression fixchars="1" noclean="1">strTrack&quot;:&quot;([^&quot;]*)&quot;</expression>
- </RegExp>
- <RegExp input="$$1" output="&lt;artist&gt;\1&lt;/artist&gt;" dest="5+">
- <expression fixchars="1" noclean="1">strArtist&quot;:&quot;([^&quot;]*)&quot;</expression>
- </RegExp>
- <RegExp input="$$1" output="&lt;album&gt;\1&lt;/album&gt;" dest="5+">
- <expression fixchars="1" noclean="1">strAlbum&quot;:&quot;([^&quot;]*)&quot;</expression>
- </RegExp>
- <RegExp input="$$1" output="&lt;plot&gt;\1&lt;/plot&gt;" dest="5+">
- <expression fixchars="1" noclean="1">strDescriptionEN&quot;:&quot;(.*?)&quot;,&quot;</expression>
- </RegExp>
- <RegExp input="$$1" output="&lt;director&gt;\1&lt;/director&gt;" dest="5+">
- <expression fixchars="1" noclean="1">strMusicVidDirector&quot;:&quot;(.*?)&quot;,&quot;</expression>
- </RegExp>
- <RegExp input="$$1" output="&lt;studio&gt;\1&lt;/studio&gt;" dest="5+">
- <expression fixchars="1" noclean="1">strMusicVidCompany&quot;:&quot;(.*?)&quot;,&quot;</expression>
- </RegExp>
- <RegExp input="$$1" output="&lt;thumb&gt;\1&lt;/thumb&gt;" dest="5+">
- <expression repeat="yes">strMusicVidScreen1\d?&quot;:&quot;([^&quot;]*)</expression>
- </RegExp>
- <RegExp input="$$1" output="&lt;chain function=&quot;GetTADBAlbumGenresByMBID&quot;&gt;\1&lt;/chain&gt;" dest="5+">
- <expression fixchars="1" noclean="1">strMusicBrainzAlbumID&quot;:&quot;([^&quot;]*)&quot;</expression>
- </RegExp>
- <RegExp input="$$1" output="&lt;chain function=&quot;GetTADBAlbumDateByMBID&quot;&gt;\1&lt;/chain&gt;" dest="5+">
- <expression fixchars="1" noclean="1">strMusicBrainzAlbumID&quot;:&quot;([^&quot;]*)&quot;</expression>
- </RegExp>
- <RegExp conditional="tadbalbumthumbs" input="$$1" output="&lt;chain function=&quot;GetTADBAlbumThumbsByMBID&quot;&gt;\1&lt;/chain&gt;" dest="5+">
- <expression fixchars="1" noclean="1">strMusicBrainzAlbumID&quot;:&quot;([^&quot;]*)&quot;</expression>
- </RegExp>
- <RegExp conditional="fanarttvalbumthumbs" input="$$1" output="&lt;chain function=&quot;GetFanartTvAlbumThumbsByMBID&quot;&gt;\1&lt;/chain&gt;" dest="5+">
- <expression fixchars="1" noclean="1">strMusicBrainzAlbumID&quot;:&quot;([^&quot;]*)&quot;</expression>
- </RegExp>
- <expression noclean="1"/>
- </RegExp>
- </GetDetails>
-</scraper>
diff --git a/addons/metadata.themoviedb.org/addon.xml b/addons/metadata.themoviedb.org/addon.xml
index 0ba464c889..2dd60e933c 100644
--- a/addons/metadata.themoviedb.org/addon.xml
+++ b/addons/metadata.themoviedb.org/addon.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<addon id="metadata.themoviedb.org"
name="The Movie Database"
- version="3.8.4"
+ version="3.8.7"
provider-name="XBMC Foundation">
<requires>
<import addon="xbmc.metadata" version="2.1.0"/>
diff --git a/addons/metadata.themoviedb.org/changelog.txt b/addons/metadata.themoviedb.org/changelog.txt
index 5eeae098f0..33e98e7baf 100644
--- a/addons/metadata.themoviedb.org/changelog.txt
+++ b/addons/metadata.themoviedb.org/changelog.txt
@@ -1,3 +1,9 @@
+[B]3.8.7[/B]
+- fixed: caching
+
+[B]3.8.6[/B]
+- fixed: broken search results due to API changes
+
[B]3.8.4[/B]
- removed: option to scrape trailers from hd-trailers.net (it was broken)
diff --git a/addons/metadata.themoviedb.org/tmdb.xml b/addons/metadata.themoviedb.org/tmdb.xml
index e256edcc10..8a9222d44a 100644
--- a/addons/metadata.themoviedb.org/tmdb.xml
+++ b/addons/metadata.themoviedb.org/tmdb.xml
@@ -21,14 +21,14 @@
</NfoUrl>
<GetSearchResults dest="8">
<RegExp input="$$3" output="&lt;results&gt;\1&lt;/results&gt;" dest="8">
- <RegExp input="$$1" output="&lt;entity&gt;&lt;title&gt;\4&lt;/title&gt;&lt;id&gt;\1&lt;/id&gt;&lt;year&gt;\3&lt;/year&gt;&lt;url cache=&quot;tmdb-$INFO[language]-\1.json&quot;&gt;http://api.tmdb.org/3/movie/\1?api_key=57983e31fb435df4df77afb854740ea9&amp;amp;language=$INFO[language]&lt;/url&gt;&lt;/entity&gt;" dest="3">
- <expression repeat="yes">&quot;id&quot;:([0-9]*),&quot;original_language&quot;:&quot;[^&quot;]*&quot;,&quot;original_title&quot;:&quot;([^&quot;]*)&quot;,&quot;overview&quot;:.*?,&quot;release_date&quot;:&quot;([0-9]+)-.*?&quot;title&quot;:&quot;([^&quot;]*)</expression>
+ <RegExp input="$$1" output="&lt;entity&gt;&lt;title&gt;\3&lt;/title&gt;&lt;id&gt;\2&lt;/id&gt;&lt;year&gt;\1&lt;/year&gt;&lt;url cache=&quot;tmdb-$INFO[language]-\2.json&quot;&gt;http://api.tmdb.org/3/movie/\2?api_key=57983e31fb435df4df77afb854740ea9&amp;amp;language=$INFO[language]&lt;/url&gt;&lt;/entity&gt;" dest="3">
+ <expression repeat="yes">&quot;release_date&quot;:&quot;([0-9]+)-.*?&quot;id&quot;:([0-9]*),&quot;original_title&quot;:&quot;[^&quot;]*&quot;,&quot;original_language&quot;:&quot;[^&quot;]*&quot;,&quot;title&quot;:&quot;([^&quot;]*)&quot;</expression>
</RegExp>
- <RegExp input="$$1" output="&lt;entity&gt;&lt;title&gt;\2&lt;/title&gt;&lt;id&gt;\1&lt;/id&gt;&lt;year&gt;\3&lt;/year&gt;&lt;url cache=&quot;tmdb-$INFO[language]-\1.json&quot;&gt;http://api.tmdb.org/3/movie/\1?api_key=57983e31fb435df4df77afb854740ea9&amp;amp;language=$INFO[language]&lt;/url&gt;&lt;/entity&gt;" dest="3+">
- <expression repeat="yes">&quot;id&quot;:([0-9]*),&quot;original_language&quot;:&quot;[^&quot;]*&quot;,&quot;original_title&quot;:&quot;([^&quot;]*)&quot;,&quot;overview&quot;:.*?,&quot;release_date&quot;:&quot;([0-9]+)-</expression>
+ <RegExp input="$$1" output="&lt;entity&gt;&lt;title&gt;\3&lt;/title&gt;&lt;id&gt;\2&lt;/id&gt;&lt;year&gt;\1&lt;/year&gt;&lt;url cache=&quot;tmdb-$INFO[language]-\2.json&quot;&gt;http://api.tmdb.org/3/movie/\2?api_key=57983e31fb435df4df77afb854740ea9&amp;amp;language=$INFO[language]&lt;/url&gt;&lt;/entity&gt;" dest="3+">
+ <expression repeat="yes">&quot;release_date&quot;:&quot;([0-9]+)-.*?&quot;id&quot;:([0-9]*),&quot;original_title&quot;:&quot;([^&quot;]*)&quot;,&quot;original_language&quot;:&quot;[^&quot;]*&quot;</expression>
</RegExp>
<RegExp input="$$1" output="&lt;entity&gt;&lt;title&gt;\2&lt;/title&gt;&lt;id&gt;\1&lt;/id&gt;&lt;url cache=&quot;tmdb-$INFO[language]-\1.json&quot;&gt;http://api.tmdb.org/3/movie/\1?api_key=57983e31fb435df4df77afb854740ea9&amp;amp;language=$INFO[language]&lt;/url&gt;&lt;/entity&gt;" dest="3+">
- <expression repeat="yes">&quot;id&quot;:([0-9]*),&quot;original_language&quot;:&quot;[^&quot;]*&quot;,&quot;original_title&quot;:&quot;([^&quot;]*)&quot;,&quot;overview&quot;:.*?,&quot;release_date&quot;:null</expression>
+ <expression repeat="yes">&quot;release_date&quot;:null.*?&quot;id&quot;:([0-9]*),&quot;original_title&quot;:&quot;([^&quot;]*)&quot;,&quot;original_language&quot;:&quot;[^&quot;]*&quot;</expression>
</RegExp>
<expression noclean="1" />
</RegExp>
diff --git a/addons/repository.xbmc.org/addon.xml b/addons/repository.xbmc.org/addon.xml
index 4b8c41b449..b8da08fa77 100644
--- a/addons/repository.xbmc.org/addon.xml
+++ b/addons/repository.xbmc.org/addon.xml
@@ -1,34 +1,16 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<addon id="repository.xbmc.org"
name="Kodi Add-on repository"
- version="2.2.32"
+ version="2.3.1"
provider-name="XBMC Foundation">
<requires>
<import addon="xbmc.addon" version="12.0.0"/>
</requires>
<extension point="xbmc.addon.repository"
name="Official XBMC.org Add-on Repository">
- <dir minversion="13.0.0">
- <info compressed="true">http://mirrors.kodi.tv/addons/gotham/addons.xml</info>
- <checksum>http://mirrors.kodi.tv/addons/gotham/addons.xml.md5</checksum>
- <datadir zip="true">http://mirrors.kodi.tv/addons/gotham</datadir>
- <hashes>true</hashes>
- </dir>
- <dir minversion="14.0.0">
- <info compressed="true">http://mirrors.kodi.tv/addons/helix/addons.xml</info>
- <checksum>http://mirrors.kodi.tv/addons/helix/addons.xml.md5</checksum>
- <datadir zip="true">http://mirrors.kodi.tv/addons/helix</datadir>
- <hashes>true</hashes>
- </dir>
- <dir minversion="15.0.0">
- <info compressed="true">http://mirrors.kodi.tv/addons/isengard/addons.xml</info>
- <checksum>http://mirrors.kodi.tv/addons/isengard/addons.xml.md5</checksum>
- <datadir zip="true">http://mirrors.kodi.tv/addons/isengard</datadir>
- <hashes>true</hashes>
- </dir>
<dir minversion="15.9.0">
- <info compressed="true">http://mirrors.kodi.tv/addons/jarvis/addons.xml</info>
- <checksum>http://mirrors.kodi.tv/addons/jarvis/addons.xml.md5</checksum>
+ <info>http://mirrors.kodi.tv/addons/jarvis/addons.xml.gz</info>
+ <checksum>http://mirrors.kodi.tv/addons/jarvis/addons.xml.gz.md5</checksum>
<datadir zip="true">http://mirrors.kodi.tv/addons/jarvis</datadir>
<hashes>true</hashes>
</dir>
@@ -71,6 +53,7 @@
<summary lang="lv_LV">Instalēt pielikumus no Kodi.tv</summary>
<summary lang="mk_MK">ИнÑталирај Додатоци од Kodi.tv</summary>
<summary lang="ms_MY">Pasang tambahan daripada Kodi.tv</summary>
+ <summary lang="mt_MT">Installa Add-ons minn Kodi.tv</summary>
<summary lang="my_MM">Kodi.tv မှ Add-on များကိုသွင်းမည်</summary>
<summary lang="nb_NO">Installer utvidelser fra Kodi.tv</summary>
<summary lang="nl_NL">Add-ons van Kodi.tv installeren</summary>
@@ -82,7 +65,7 @@
<summary lang="sk_SK">Inštalovať rozšírenia z Kodi.tv</summary>
<summary lang="sl_SI">Namestite dodatke s Kodi.tv</summary>
<summary lang="sr_RS">ИнÑталирај додатке Ñа Kodi.tv</summary>
- <summary lang="sr_RS@latin">Instaliraj dodake sa Kodi-tv</summary>
+ <summary lang="sr_RS@latin">Instaliraj dodatne programe sa Kodi.tv</summary>
<summary lang="sv_SE">Installera tillägg från Kodi.tv</summary>
<summary lang="tg_TJ">ÐаÑб кардани барномаҳои иловагӣ аз Kodi.tv</summary>
<summary lang="th_TH">ติดตั้งส่วนเสริมจาภKodi.tv</summary>
@@ -113,20 +96,21 @@
<description lang="fa_IR">اÙزودنی ها را از منبع رسمی اÙزونه ها در Kodi.tv دانلود Ùˆ نصب کنید. [CR] با استÙاده از منبع رسمی شما قادر خواهید بود از خدمات گسترده سرویس دانلود جایگزین ما بهره ببرید Ú©Ù‡ امکان دانلود از مناطق نزدیکتر را در اختیار شما قرار Ù…ÛŒ دهد. [CR] همه اÙزونه های این منبع آزمایش های اولیه را پشت سر گذاشته اند. در صورت یاÙتن اÙزونه معیوب یا غیر قابل استÙاده لطÙا آن را به تیم کودی گزارش کنید تا اقدامات لازم را انجام دهیم.</description>
<description lang="fi_FI">Lataa ja asenna lisäosia virallisesta Kodi.tv -lisäosasäilöstä.[CR] Käyttämällä virallista säilöä sinun on mahdollista käyttää hyväksesi meidän kattavaa tiedostojen peilauspalveluamme saavuttaaksesi korkeat latausnopeudet sinun lähialueeltasi.[CR] Kaikki tämän säilön lisäosat on testattu toimiviksi, jos löydät rikkinäisen tai "ei toimivan" lisäosan, ilmoita siitä Team-Kodi:lle, jotta voimme korjata asian.</description>
<description lang="fr_CA">Télécharger et installer des addiciels depuis le dépôt officiel de Kodi.tv.[CR] En utilisant le dépôt officiel vous pourrez bénéficier de notre service étendu de miroirs de fichiers favorisant des téléchargements plus rapides depuis une région proche de vous.[CR] Tous les addiciels de ce dépôt ont subi des tests de base. Si vous trouvez un addiciel non fonctionnel ou brisé, veuillez le rapporter à l'équipe-Kodi afin que nous puissions agir.</description>
- <description lang="fr_FR">Télécharger et installer des extensions à partir du dépôt officiel Kodi.tv.[CR] En utilisant le dépôt officiel, vous bénéficierez de notre service de serveurs miroirs vous permettant de télécharger rapidement depuis une région proche de chez vous.[CR] Toutes les extensions de ce dépôt ont été testées sommairement, si vous trouvez une extension corrompue ou inutilisable, veuillez en informer l'Équipe Kodi afin que nous puissions prendre les mesures nécessaires.</description>
+ <description lang="fr_FR">Télécharger et installer des extensions à partir du dépôt officiel Kodi.tv.[CR]En utilisant le dépôt officiel, vous bénéficierez de notre service de serveurs miroirs permettant de télécharger rapidement depuis une région proche de chez vous.[CR]Toutes les extensions de ce dépôt ont été testées sommairement, si vous trouvez une extension corrompue ou inutilisable, veuillez en informer l'Équipe Kodi afin que nous puissions prendre les mesures nécessaires.</description>
<description lang="gl_ES">Descargar e instalar Engadidos dende o repositorio oficial de Kodi.tv.[CR] Empregando o repositorio oficial, vostede poderá gozar das vantaxes do seu extenso servizo de replicación de ficheiros que lle permite unhas descargas máis rápidas dende unha rexión preto a vostede.[CR] Tódolos Engadidos deste repositorio pasaron por comprobacións básicas. Se atopa algún Engadido roto ou non funcional, por favor reporteo ó equipo de Kodi para que poidan actuar en consecuencia.</description>
<description lang="he_IL">הורדה והתקנת הרחבות ממ×גר הרחבות Kodi.tv הרשמי.[CR] שימוש במ×גר הרשמי מ×פשר לנצל ×ת שירות שיקוף ×”×§×‘×¦×™× ×©×œ Kodi.tv העוזר להוריד מהר יותר מהשרת הקרוב ביותר.[CR] כל ההרחבות במ×גר ×–×” עברו בדיקה בסיסית. יש לדווח לצוות הפיתוח של Kodi על כל הרחבה שנמצ××” ×›×œ× ×ª×§×™× ×” ×ו ×©×œ× ×¢×•×‘×“×ª ×¢"מ שתתבצע הפעולה המת×ימה.</description>
<description lang="hr_HR">Preuzmite i instalirajte dodatke sa službenog Kodi.tv repozitorija dodataka.[CR] KoriÅ¡tenjem službenog repozitorija bit ćete u mogućnosti iskoristiti prednosti usluge naÅ¡eg brzog zrcalnog poslužitelja datoteka, da bi mogli brže preuzimati iz regije koje je bliže vaÅ¡oj lokaciji.[CR] Svi dodaci na ovom repozitoriju proÅ¡li su osnovno testiranje, u sluÄaju da primijetite neispravan dodatak, molimo vas da to prijavite Kodi timu koji će zatim poduzeti potrebne korake.</description>
<description lang="hu_HU">Kiegészítők letöltése és telepítése a hivatalos Kodi.tv tárolóhelyről.[CR] A hivatalos tárolóhely használatával kihasználhatod szerteágazó tükör-kiszolgáló hálózatunkat, ami segít a gyorsabb letöltésben egy hozzád közelebb eső körzet használatával.[CR] Minden kiegészítő ezen a tárolóhelyen átment egy alaptesztelésen. Ha mégis hibás vagy nem működő kiegészítőt találsz, kérünk jelezd az Kodi csapatnak, hogy megtegyük a szükséges lépéseket.</description>
<description lang="id_ID">Unduh dan pasang pengaya dari repositori pengaya resmi Kodi.tv. [CR] Dengan menggunakan repositori resmi anda akan mendapat keuntungan dari miror berkas kami yang luas dimana dapat membantu anda untuk lebih cepat mengunduh dari daerah yang dekat dengan anda. [CR] Semua pengaya pada repository telah melalui uji coba standar, jika anda menemukan pengaya yang rusak atau tidak bekerja tolong laporkan kepada tim Kodi agar kami bisa menindak lanjutinya.</description>
<description lang="is_IS">Sækja og setja inn viðbætur frá hinu viðurkennda Kodi.tv viðbóta safni.[CR] Með því að nota þetta safn getur þú nýtt þér möguleikann á fullkmonni speglunar þjónustu sem hjálpar við að sækja viðbætur hraðar frá landsvæði nálægt þér.[CR] Allar viðbætur í þessu safni hafa gengið undir grunn prófanir, ef þú finnur viðbætur sem eru bilaðar eða virka ekki vinsamlegast látið Kodi teymið vita svo við getum gert eitthvað í málinu.</description>
- <description lang="it_IT">Scarica ed installa gli add-on dalla libreria ufficiale di Kodi.tv[CR] Usando la libreria ufficiale avrai il vantaggio di ottenere download più veloci con mirror più vicini alla tua località.[CR] Tutti gli add-on in questa libreria sono stati sottoposti a test di base, se ne trovi uno non funzionante o corrotto, per favore riporta il problema al team di Kodi così potremmo prendere provvedimenti.</description>
+ <description lang="it_IT">Scarica e installa gli add-on dalla libreria ufficiale di Kodi.tv.[CR] Usando la libreria ufficiale avrai il vantaggio di ottenere download più veloci con mirror più vicini alla tua località.[CR] Tutti gli add-on in questa libreria sono stati sottoposti a test di base, se ne trovi uno non funzionante o corrotto, per favore riporta il problema al team di Kodi così potremmo prendere provvedimenti.</description>
<description lang="ja_JP">オフィシャル㮠Kodi.tv リãƒã‚¸ãƒˆãƒªã‹ã‚‰ã‚¢ãƒ‰ã‚ªãƒ³ã‚’ダウンロードã—ã¾ã™ã€‚[CR] オフィシャルリãƒã‚¸ãƒˆãƒªã‚’使ã†ã“ã¨ã§ã€ãŠä½ã¾ã„ã®ã‚¨ãƒªã‚¢ã«è¿‘ã„ミラーサーãƒãƒ¼ã‹ã‚‰é«˜é€Ÿã«ã‚¢ãƒ‰ã‚ªãƒ³ã‚’ダウンロードã™ã‚‹ã“ã¨ãŒå¯èƒ½ã§ã™ã€‚[CR] ã“ã®ãƒªãƒã‚¸ãƒˆãƒªä¸Šã®ã‚¢ãƒ‰ã‚ªãƒ³ã¯å…¨ã¦ã€ç°¡å˜ãªå‹•ä½œãƒ†ã‚¹ãƒˆã‚’å—ã‘ã¦ã¯ã„ã¾ã™ãŒã€ã‚‚ã—アドオンãŒãŠã‹ã—ã‹ã£ãŸã‚Šã†ã¾ã動作ã—ãªã‹ã£ãŸã‚Šã—ãŸå ´åˆã¯ã€Kodi ãƒãƒ¼ãƒ ã«é€£çµ¡ã‚’ãŠé¡˜ã„ã—ã¾ã™ã€‚</description>
<description lang="ko_KR">ê³µì‹ Kodi.tv 애드온 저장소ì—ì„œ ì• ë“œì˜¨ì„ ë‹¤ìš´ë¡œë“œí•˜ì—¬ 설치합니다.[CR] ê³µì‹ ì €ìž¥ì†Œë¥¼ 사용하면 íŒŒì¼ ë¯¸ëŸ¬ë§ ì„œë¹„ìŠ¤ë¥¼ 통해 사용ìžì™€ 가까운 ê³³ì—ì„œ 빠르게 다운로드할 수 있습니다.[CR] ì €ìž¥ì†Œì˜ ëª¨ë“  ì• ë“œì˜¨ì€ ê¸°ë³¸ 테스트를 거치지만 ìž‘ë™ì´ ë˜ì§€ 않거나 ì†ìƒëœ ì• ë“œì˜¨ì„ ë°œê²¬í•˜ë©´ 필요한 조치를 취할 수 있게 Team-Kodië¡œ 알려주시기 ë°”ëžë‹ˆë‹¤.</description>
<description lang="lt_LT">Atsisiųskite ir įdiegite priedus iÅ¡ oficialios Kodi.tv saugyklos.[CR]Naudojantis oficialia saugykla, galÄ—site pasinaudoti pranaÅ¡umu mÅ«sų didele failų veidrodinÄ™ paslauga.[CR]Taip pat siekiame padÄ—ti jums greiÄiau parsisiųsti priedÄ… iÅ¡ JÅ«sų regiono.[CR]Visiems Å¡ioje saugykloje saugomiems priedams buvo atliktas testavimas, jei JÅ«s radote netaisyklingÄ… ir nedarbinį priedÄ….[CR]PraÅ¡ome praneÅ¡ti apie tai Kodi komandai, kad mes galÄ—tume imtis bÅ«tinų veiksmų </description>
<description lang="lv_LV">LejupielÄdÄ“jiet un instalÄ“jiet pielikumus no oficiÄlÄ Kodi.tv pielikumu repozitorija[CR] Izmantojot oficiÄlo repozitoriju, varÄ“siet izmantot mÅ«su plaÅ¡o spoguļu pakalpojumu, lai iegÅ«tu ÄtrÄkas lejupielÄdes no reÄ£iona, kas vistuvÄk.[CR] Visi pielikumi Å¡ajÄ repozitorijÄ ir izgÄjuÅ¡i pamata testÄ“Å¡anu, bet, ja atrodat saplÄ«suÅ¡u vai nestrÄdÄjoÅ¡u pielikumu, lÅ«dzu, ziņojiet par to Team-Kodi, lai varam izpildÄ«t nepiecieÅ¡amÄs laboÅ¡anas darbÄ«bas.</description>
<description lang="mk_MK">Превземи и инÑталирај Додатоци од официјалниот Kodi.tv Ñклад.[CR] Со кориÑтење на официјалниот Ñклад ќе бидете во можноÑÑ‚ да ги кориÑтите предноÑтите на нашата богата датотека Ñо уÑлуги која ви помага да добиете побрзи превземања од регионот блиÑку до ваÑ.[CR] Сите Додатоци во овој Ñклад Ñе оÑновно теÑтирани, ако најдете неиÑправни или додатоци кои не работат пријавете го тоа на тимот на Kodi така што ќе можеме да превземеме било каква акција што е потребна.</description>
<description lang="ms_MY">Muat turun dan pasang tambahan PVR melalui repositori rasmi Kodi.tv[CR] Dengan menggunakan Repositori rasmi anda dapat perkhidmatan cermin fail yang luas supaya dapat memuat turun lebih pantas menerusi kawasan berhampiran anda.[CR] Semua tambahan di dalam repositori ini telah lulus pengujian asas, jika anda temui tambahan yang rosak atau tidak berfungsi sila laporkannya kepada Team-Kodi supaya kami boleh membuat tindakan yang sewajarnya.</description>
+ <description lang="mt_MT">Niżżel u nstalla add-ons mir-repożitorju uffiċjali ta Kodi.tv.[CR] Permezz ta' dan ir-ripożitorju uffiċjali tista' tieħu vantaġġ mis-servizz ta' file mirrors estensiv li jgħinek tniżżel l-add-ons iktar malajr minn postijiet li huma ġeografikament qrib tiegħek.[CR] L-Add-ons kollha f'dan ir-repożitorju għaddew minn testijiet bażiċi, f'każ li tinzerta xi add-on miksura jew mhux taħdem jekk jpgħġbok irrportha lil Team-Kodi biex inkunu nistgħu nieħdu l-azzjoni li jkun hemm bżonn.</description>
<description lang="nb_NO">Last ned og installer utvidelser fra den offisielle Kodi.tv pakkebrønnen.[CR] Når du benytter den offisielle pakkebrønnen kan du dra nytte av vår omfattende arkivtjeneste slik at du får raskere nedlasting fra en server nær deg.[CR] Alle tillegg i denne brønnen har gått gjennom grunnleggende testing, men hvis du finner et tillegg som ikke fungerer, vennligst rapporter det til Team-Kodi så vi får sett på det.</description>
<description lang="nl_NL">Download en installeer add-ons uit de officiële Kodi.tv add-on depot.[CR] Wanneer u de officiële depot gebruikt beschikt u over onze uitgebreide mirrorservice, waardoor u snel kan downloaden van locaties in uw buurt.[CR] Alle add-ons in dit depot ondergingen standaardtests; indien u een defecte of niet-werkende add-on vindt, meld dit dan aan Team-Kodi zodat zij actie kunnen ondernemen.</description>
<description lang="pl_PL">Pobieraj i instaluj dodatki z oficjalnego repozytorium Kodi.tv.[CR] Używając oficjalnego repozytorium korzystasz z serwerów lustrzanych, rozsianych po całym świecie. Wybierany jest ten, który znajduje się najbliżej ciebie, zapewniając dużą prędkość połączenia.[CR]Wszystkie dodatki znajdujące się w tym repozytorium są testowane, ale mogą okazać się niesprawne. Zgłoś wówczas błąd, aby zespół Kodi mógł podjąć odpowiednie działanie.</description>
@@ -137,7 +121,7 @@
<description lang="sk_SK">StiahnuÅ¥ a nainÅ¡talovaÅ¥ rozšírenia z oficiálneho zdroja rozšírení Kodi.tv.[CR] Použitím oficiálneho zdroja získavate možnosÅ¥ využiÅ¥ rozsiahly systém zrkadiel, ktorý Vám umožní rýchlejÅ¡ie sÅ¥ahovanie z Vám blízkeho regiónu.[CR] VÅ¡etky rozšírenia v tomto zdroji boli podrobené základnému testovaniu. Ak nájdete poÅ¡kodené alebo nefunkÄné rozšírenie, oznámte to prosím týmu Kodi aby mohol podľa potreby zakroÄiÅ¥.</description>
<description lang="sl_SI">Prenos in namestitev dodatkov iz uradnega skladiÅ¡Äa Kodi.tv.[CR] Z uporabo uradnega skladiÅ¡Äa, boste lahko izkoristili hitrejÅ¡o povezavo, ki bo izbrana glede na vaÅ¡o lokacijo.[CR] Vsi dodatki tega skladiÅ¡Äa so bili osnovno stestirani, Äe pa boste naÅ¡li pokvarjen ali nedelujoÄ dodatek, to sporoÄite ekipi Kodi, da bomo lahko odpravili napake.</description>
<description lang="sr_RS">Преузмите и инÑталирајте додатке из Званичног Kodi.tv Ñпремишта додатака.[CR] Коришћењем званичног Спремишта моћићете да иÑкориÑтите предноÑти нашег ÑервиÑа копија фајлова који ће вам помоћи приликом бржег преузимања из региона ближег вашој локацији.[CR] Сви додаци у овом Ñпремишту прошли Ñу оÑновно теÑтирање, у Ñлучају да пронађете неиÑправан додатак молимо Ð²Ð°Ñ Ð´Ð° то пријавите Kodi тиму који ће затим предузети неопходне мере.</description>
- <description lang="sr_RS@latin">Preuzmi i instaliraj dodatke iz ZvaniÄnog Kodi.tv spremiÅ¡ta za dodatke.[CR] Korišćenjem zvaniÄnog SpremiÅ¡ta moćićete da iskoristite prednosti naÅ¡eg servisa kopija fajlova koji će vam pomoći prilikom bržeg preuzimanja iz regiona bližeg vaÅ¡oj lokaciji.[CR] Svi dodaci u ovom spremiÅ¡tu proÅ¡li su osnovno testiranje, u sluÄaju da pronaÄ‘ete neispravan dodatak molimo vas da to prijavite Kodi timu koji će zatim preduzeti neophodne mere.</description>
+ <description lang="sr_RS@latin">Preuzmi i instaliraj dodatne programe iz ZvaniÄnog Kodi.tv spremiÅ¡ta za dodatne programe.[CR] Korišćenjem zvaniÄnog SpremiÅ¡ta moći ćete da iskoristite prednosti naÅ¡eg servisa kopija fajlova koji će vam pomoći prilikom bržeg preuzimanja iz regiona bližeg vaÅ¡oj lokaciji.[CR] Svi dodatni programi u ovom spremiÅ¡tu proÅ¡li su osnovno testiranje, u sluÄaju da pronaÄ‘ete neispravan dodatni program molimo vas da to prijavite Kodi timu koji će zatim preduzeti neophodne mere.</description>
<description lang="sv_SE">Ladda ner och installera tillägg från det officiella Kodi.tv tilläggsförrådet.[CR]Genom att använda det officiella förrådet kommer du att få fördelen att kunna använda vår omfattande spegeltjänst som kommer att hjälpa dig till snabbare nedladdningar från en plats nära dig.[CR]Alla tillägg i detta förråd har genomgått grundläggande tester. Hittar du ett trasigt eller icke fungerande tillägg, vänligen meddela detta till Team-Kodi så att vi kan vidta nödvändiga åtgärder.</description>
<description lang="tg_TJ">Барномаҳои иловагиро аз анбори нармафзори Kodi.tv боргирӣ кунед ва наÑб намоед.[CR] Ðз иÑтифодаи анбори нармафзори раÑмии мо ба шумо имкониÑÑ‚ пайдо мешавад, ки тавонед шароити муÑофидро аз хидмати оинаи файлии ваÑеъ ба даÑÑ‚ оред ва нармафзори лозимиро аз Ñервери минтакаи ба шумо наздиктар бо Ñуръати баланд боргирӣ кунед.[CR] Ҳамаи барномаҳо аз анбори нармафзори мо дар ҳолати Ñанҷишӣ мебошанд, бинобар ин агар Ñгон барномаи иловагии нуқÑондор Ñ‘ вайроншударо ёбед, лутфан дар бораи он барнома ва нуқÑон пайдошуда ба гурӯҳи кории Kodi гузориш диҳед, то ин ки мо тавонем ҳамаи камбудиҳои барномаҳои моро ҳал кунем.</description>
<description lang="th_TH">ดาวน์โหลดà¹à¸¥à¸°à¸•à¸´à¸”ตั้งส่วนเสริม จาà¸à¹à¸«à¸¥à¹ˆà¸‡à¸‚้อมูลโปรà¹à¸à¸£à¸¡à¸‚อง Kodi.tv อย่างเป็นทางà¸à¸²à¸£.[CR] โดยà¸à¸²à¸£à¹ƒà¸Šà¹‰à¸‡à¸²à¸™à¹à¸«à¸¥à¹ˆà¸‡à¸‚้อมูลโปรà¹à¸à¸£à¸¡à¸­à¸¢à¹ˆà¸²à¸‡à¹€à¸›à¹‡à¸™à¸—างà¸à¸²à¸£ คุณสามารถใช้ประโยชน์จาà¸à¸šà¸£à¸´à¸à¸²à¸£à¹à¸Ÿà¹‰à¸¡à¸¡à¸´à¹€à¸£à¸­à¸£à¹Œà¸—ี่à¸à¸§à¹‰à¸²à¸‡à¸‚วางของเรา ที่จะช่วยให้à¸à¸²à¸£à¸”าวน์โหลดของคุณเร็วขึ้นจาà¸à¸ à¸¹à¸¡à¸´à¸ à¸²à¸„ที่ใà¸à¸¥à¹‰à¸—ี่สุด.[CR] ส่วนเสริม ทั้งหมดในà¹à¸«à¸¥à¹ˆà¸‡à¹€à¸à¹‡à¸šà¸‚้อมูลนี้ อยู่ภายใต้à¸à¸²à¸£à¸—ดสอบขั้นพื้นà¸à¸²à¸™à¹à¸¥à¹‰à¸§ ถ้าคุณพบส่วนเสริมที่เสียหายหรือไม่ทำงาน à¸à¸£à¸¸à¸“าà¹à¸ˆà¹‰à¸‡à¸—ีมงาน Kodi เพื่อให้เราสามารถดำเนินà¸à¸²à¸£à¹ƒà¸” ๆ ที่จำเป็น.</description>
@@ -169,7 +153,7 @@
<disclaimer lang="fa_IR">همه اÙزونه های این منبع محصول کار تیم کودی نیستند Ùˆ این تیم مسئولیتی در قبال محتوای آنها ندارد.</disclaimer>
<disclaimer lang="fi_FI">Team-Kodi ei ole tehnyt kaikkia tässä säilössä olevia lisäosia, eikä siten ole vastuullinen kyseisten lisäosien sisällöstä</disclaimer>
<disclaimer lang="fr_CA">L'équipe-Kodi n'a pas créé tous les addiciels de ce dépôt et n'est pas responsable de leur contenu</disclaimer>
- <disclaimer lang="fr_FR">L'Équipe-Kodi n'a pas créé toutes les extensions de ce dépôt et n'est pas responsable de leur contenu</disclaimer>
+ <disclaimer lang="fr_FR">L'Équipe Kodi n'a pas créé toutes les extensions de ce dépôt et n'est pas responsable de leur contenu.</disclaimer>
<disclaimer lang="gl_ES">O equipo de Kodi non creou todos os Engadidos deste repositorio e non é responsábel do seu contido</disclaimer>
<disclaimer lang="he_IL">צוות הפיתוח של Kodi ×œ× ×™×¦×¨ ×ת כל ההרחבות שבמ×גר ×–×” ו×יננו ×חר××™ על תוכנן</disclaimer>
<disclaimer lang="hr_HR">Kodi tim nije autor svih dodataka u ovom repozitoriju te kao takvi ne odgovaraju za njihov sadržaj</disclaimer>
@@ -183,6 +167,7 @@
<disclaimer lang="lv_LV">Kodi komanda nav izveidojusi visus Å¡Ä«s krÄtuves pielikumus un nav atbildÄ«ga par to saturu</disclaimer>
<disclaimer lang="mk_MK">Kodi тимот ги нема направено Ñите овие додатоци и не е одговорен за нивната Ñодржина</disclaimer>
<disclaimer lang="ms_MY">Team-Kodi tidak menghasilkan semua tambahan di dalam repositori ini dan tidak bertanggungjawab keatas kandungannya</disclaimer>
+ <disclaimer lang="mt_MT">Team-Kodi m'għamilx l-add-ons kollha li hawn f'dan ir-repożitorju u mhumiex responsabbli għall-kontenut tagħhom</disclaimer>
<disclaimer lang="nb_NO">Team-Kodi har ikke utviklet alle utvidelsene i denne pakkebrønnen og er ikke ansvarlig for deres innhold</disclaimer>
<disclaimer lang="nl_NL">Team-Kodi heeft niet alle add-ons in deze depot geschreven en is niet verantwoordelijk voor hun inhoud.</disclaimer>
<disclaimer lang="pl_PL">Zespół Kodi nie tworzy wszystkich dodatków i nie bierze odpowiedzialności za ich zawartość</disclaimer>
@@ -193,7 +178,7 @@
<disclaimer lang="sk_SK">Team-Kodi nevytvoril všetky rozšírenia v tomto zdroji nie je zodpovedný za ich obsah</disclaimer>
<disclaimer lang="sl_SI">Ekipa Kodi ni naredila vseh dodatkov v tem skladiÅ¡Äu in ne odgovarja za njihovo vsebino</disclaimer>
<disclaimer lang="sr_RS">Тим Kodi није направио Ñве додатке у овом Ñпремишту и није одговоран за њихов Ñадржај</disclaimer>
- <disclaimer lang="sr_RS@latin">Tim-Kodi nije napravio sve dodatke u ovom spremištu i nije odgovoran za njihov sadržaj</disclaimer>
+ <disclaimer lang="sr_RS@latin">Tim-Kodi nije napravio sve dodatne programe u ovom spremištu i nije odgovoran za njihov sadržaj</disclaimer>
<disclaimer lang="sv_SE">Team-Kodi har inte gjort alla tillägg och är inte ansvariga för innehållet i dessa.</disclaimer>
<disclaimer lang="tg_TJ">Гурӯҳи кории Kodi дар ин анбори нармафзор Ñоҳиби ҳамаи барномаҳои иловагӣ намебошад ва барои мӯҳтавоÑшон ҷавобгар намебшад</disclaimer>
<disclaimer lang="th_TH">ทีม Kodi ไม่ได้จัดทำ ส่วนเสริม ทั้งหมดในà¹à¸«à¸¥à¹ˆà¸‡à¸‚้อมูลโปรà¹à¸à¸£à¸¡à¸™à¸µà¹‰ à¹à¸¥à¸°à¸ˆà¸°à¹„ม่รับผิดชอบต่อเนื้อหาเหล่านั้น</disclaimer>
diff --git a/addons/resource.language.en_gb/addon.xml b/addons/resource.language.en_gb/addon.xml
index 31e02feaae..df5ba2f968 100644
--- a/addons/resource.language.en_gb/addon.xml
+++ b/addons/resource.language.en_gb/addon.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<addon
id="resource.language.en_gb"
- version="1.0.0"
+ version="2.0.0"
name="English"
provider-name="Team Kodi">
<requires>
diff --git a/addons/resource.language.en_gb/resources/strings.po b/addons/resource.language.en_gb/resources/strings.po
index 7369139633..a28496c28f 100644
--- a/addons/resource.language.en_gb/resources/strings.po
+++ b/addons/resource.language.en_gb/resources/strings.po
@@ -756,7 +756,6 @@ msgid "%s has been successfully started."
msgstr ""
#: xbmc/media/MediaTypes.cpp
-#: xbmc/music/karaoke/GUIDialogKaraokeSongSelector.cpp
msgctxt "#179"
msgid "Song"
msgstr ""
@@ -1342,9 +1341,11 @@ msgctxt "#304"
msgid "Language"
msgstr ""
+#. Label of active/inactive radiobutton in PVR timer settings dialog
#: system/peripherals.xml
#: xbmc/filesystem/AddonsDirectory.cpp
#: system/settings/settings.xml
+#: xbmc/pvr/dialogs/GUIDialogPVRTimerSettings.cpp
msgctxt "#305"
msgid "Enabled"
msgstr ""
@@ -2822,8 +2823,6 @@ msgctxt "#644"
msgid "Stretch 16:9 - Nonlinear"
msgstr ""
-#empty string with id 644
-
msgctxt "#645"
msgid "Need to unpack a big file. Continue?"
msgstr ""
@@ -3458,8 +3457,8 @@ msgid "Recording group"
msgstr ""
#. Label for setting TV->Recordings->Prevent duplicate episodes
-#: system/settings/settings.xml
#. Label of prevent duplicate episodes list control (if user does not want to record the same episode multiple times) in PVR timer settings dialog
+#: system/settings/settings.xml
#: xbmc/pvr/dialogs/GUIDialogPVRTimerSettings.cpp
msgctxt "#812"
msgid "Prevent duplicate episodes"
@@ -3493,6 +3492,7 @@ msgstr ""
#: xbmc/pvr/dialogs/GUIDialogPVRTimerSettings.cpp
msgctxt "#817"
msgid "End any time"
+msgstr ""
#. Label of "MaxRecordings" list in the PVR timer setting dialog
#: xbmc/pvr/dialogs/GUIDialogPVRTimerSettings.cpp
@@ -3500,7 +3500,7 @@ msgctxt "#818"
msgid "Max recordings"
msgstr ""
-#empty strings from id 819
+#empty string with id 819
#. Representation of a one-time timer.
#: xbmc/pvr/addons/PVRClient.cpp
@@ -3526,25 +3526,7 @@ msgctxt "#823"
msgid "Repeating (guide-based)"
msgstr ""
-#empty string with id 824
-
-#. Representation of PVR timer state "disabled"
-#: xbmc/pvr/timers/PVRTimerInfoTag.cpp
-msgctxt "#825"
-msgid "Inactive"
-msgstr ""
-
-#. Notification text to announce that a timer was activated
-#: xbmc/pvr/timers/PVRTimerInfoTag.cpp
-msgctxt "#826"
-msgid "Timer activated"
-msgstr ""
-
-#. Notification text to announce that a timer was deactivated
-#: xbmc/pvr/timers/PVRTimerInfoTag.cpp
-msgctxt "#827"
-msgid "Timer deactivated"
-msgstr ""
+#empty strings from id 824 to 827
#. Text for notification that a repeating timer has been deleted
#: xbmc/pvr/timers/PVRTimers.cpp
@@ -3552,7 +3534,7 @@ msgctxt "#828"
msgid "Repeating timer deleted"
msgstr ""
-#empty string from id 829 to 830
+#empty strings from id 829 to 830
#. Weekday representation
#: xbmc/dialogs/GUIDialogPVRTimerWeekdaysSettings.cpp
@@ -3647,7 +3629,19 @@ msgctxt "#846"
msgid "Are you sure you want to delete this timer?"
msgstr ""
-#empty strings from id 847 to 849
+#. Message in a dialog when a user wants to delete a non-repeating timer
+#: xbmc/pvr/windows/GUIWindowPVRBase.cpp
+msgctxt "#847"
+msgid "Confirm stop recording"
+msgstr ""
+
+#. Message in a dialog when a user wants to delete a non-repeating timer
+#: xbmc/pvr/windows/GUIWindowPVRBase.cpp
+msgctxt "#848"
+msgid "Are you sure you want to stop this recording?"
+msgstr ""
+
+#empty string with id 849
msgctxt "#850"
msgid "Invalid port number entered"
@@ -4095,7 +4089,7 @@ msgstr ""
#: system/settings/settings.xml
msgctxt "#1268"
-msgid "Enable AirPlay Video and Picture support"
+msgid "Enable AirPlay \"Videos\" and \"Pictures\" support"
msgstr ""
msgctxt "#1269"
@@ -5515,17 +5509,17 @@ msgstr ""
#: xbmc\storage\MediaManager.cpp
msgctxt "#13021"
-msgid "Mounted removable hard drive"
+msgid "Mounted removable storage device"
msgstr ""
#: xbmc\storage\MediaManager.cpp
msgctxt "#13022"
-msgid "Unsafe device removal"
+msgid "Unsafe storage device removal"
msgstr ""
#: xbmc\storage\MediaManager.cpp
msgctxt "#13023"
-msgid "Successfully removed device"
+msgid "Successfully removed storage device"
msgstr ""
msgctxt "#13024"
@@ -5619,6 +5613,7 @@ msgstr ""
#: xbmc/peripherals/bus/PeripheralBus.cpp
#: system/settings/settings.xml
+#: xbmc/pvr/timers/PVRTimerInfoTag.cpp
msgctxt "#13106"
msgid "Disabled"
msgstr ""
@@ -5808,7 +5803,6 @@ msgid "Last loaded profile:"
msgstr ""
#: xbmc/addons/GUIDialogAddonInfo.cpp
-#: xbmc/music/karaoke/GUIDialogKaraokeSongSelector.cpp
#: xbmc/peripherals/devices/Peripheral.cpp
#: xbmc/peripherals/bus/PeripheralBus.cpp
msgctxt "#13205"
@@ -6073,10 +6067,7 @@ msgctxt "#13322"
msgid "Right only"
msgstr ""
-#: system/settings/settings.xml
-msgctxt "#13323"
-msgid "Enable karaoke support"
-msgstr ""
+#empty string with id 13323
msgctxt "#13324"
msgid "Background transparency"
@@ -6090,10 +6081,7 @@ msgctxt "#13326"
msgid "A/V delay"
msgstr ""
-#: system/settings/settings.xml
-msgctxt "#13327"
-msgid "Karaoke"
-msgstr ""
+#empty string with id 13327
msgctxt "#13328"
msgid "%s not found"
@@ -7481,7 +7469,7 @@ msgctxt "#15031"
msgid "Audio DSP settings - Audio information"
msgstr ""
-#empty string from id 15032
+#empty string with id 15032
#: xbmc/settings/dialogs/GUIDialogAudioDSPSettings.cpp
msgctxt "#15033"
@@ -7498,7 +7486,7 @@ msgctxt "#15035"
msgid "Audio DSP settings - Resampler"
msgstr ""
-#empty string from id 15036
+#empty string with id 15036
#: xbmc/settings/dialogs/GUIDialogAudioDSPSettings.cpp
msgctxt "#15037"
@@ -7617,7 +7605,7 @@ msgctxt "#15064"
msgid "Apply changes directly"
msgstr ""
-#empty string id 15065
+#empty string with id 15065
#. Button to disable all enabled modes on current selected type
#: addons/skin.confluence/720p/DialogAudioDSPManager.xml
@@ -8386,12 +8374,11 @@ msgctxt "#19002"
msgid "or use phrases to find an exact match, like \"The wizard of Oz\"."
msgstr ""
-#. Label of the button / context menu entry to find similar programs in the PVR EPG data
+#. Label of a button / context menu entry to find similar programs (matching a given epg event)
#: skin.confluence
#: xbmc/pvr/windows/GUIWindowPVRChannels.cpp
#: xbmc/pvr/windows/GUIWindowPVRGuide.cpp
#: xbmc/pvr/windows/GUIWindowPVRRecordings.cpp
-#: xbmc/pvr/windows/GUIWindowPVRTimers.cpp
msgctxt "#19003"
msgid "Find similar"
msgstr ""
@@ -8660,16 +8647,22 @@ msgctxt "#19055"
msgid "No information available"
msgstr ""
+#. Label for a new timer
+#: xbmc/pvr/timers/PVRTimers.cpp
+#: xbmc/pvr/timers/PVRTimerInfoTag.cpp
+#: xbmc/pvr/dialogs/GUIDialogPVRTimerSettings.cpp
msgctxt "#19056"
msgid "New timer"
msgstr ""
-#. Label for a context menu entry to open timer settings dialog
-#: xbmc/pvr/windows/GUIWindowPVRTimers.cpp
+#. Notification text to announce that a timer was disabled
+#: xbmc/pvr/timers/PVRTimerInfoTag.cpp
msgctxt "#19057"
-msgid "Edit settings"
+msgid "Timer disabled"
msgstr ""
+#. Notification text to announce that a timer was enabled
+#: xbmc/pvr/timers/PVRTimerInfoTag.cpp
msgctxt "#19058"
msgid "Timer enabled"
msgstr ""
@@ -8750,8 +8743,7 @@ msgctxt "#19073"
msgid "Delay channel switch"
msgstr ""
-#. Label of active/inactive radiobutton in PVR timer settings dialog
-#: xbmc/pvr/dialogs/GUIDialogPVRTimerSettings.cpp
+#: addons/skin.confluence/720p/DialogPVRChannelManager.xml
msgctxt "#19074"
msgid "Active"
msgstr ""
@@ -8777,8 +8769,8 @@ msgid "Channel"
msgstr ""
#. heading for PVR timer days of week settings dialog
-#: skin.confluence
#. Label of days of week button in PVR timer settings dialog
+#: skin.confluence
#: xbmc/pvr/dialogs/GUIDialogPVRTimerSettings.cpp
msgctxt "#19079"
msgid "Days of week"
@@ -11849,7 +11841,10 @@ msgctxt "#20443"
msgid "Do you want to refresh information for all items within this path?"
msgstr ""
-#empty string with id 20444
+#: xbmc/music/windows/GUIWindowMusicBase.cpp
+msgctxt "#20444"
+msgid "Add to library"
+msgstr ""
#: xbmc/music/dialogs/GUIDialogMusicInfo.cpp
msgctxt "#20445"
@@ -11860,7 +11855,10 @@ msgctxt "#20446"
msgid "Locally stored information found. Ignore and refresh from Internet?"
msgstr ""
-#empty string with id 20447
+#: xbmc/music/windows/GUIWindowMusicBase.cpp
+msgctxt "#20447"
+msgid "Do you want to add the media from this source to your library?"
+msgstr ""
#: xbmc/video/VideoInfoScanner.cpp
msgctxt "#20448"
@@ -11970,7 +11968,12 @@ msgctxt "#20470"
msgid "Use movie sets for single movies"
msgstr ""
-#empty strings from id 20471 to 21329
+#: system/settings/settings.xml
+msgctxt "#20471"
+msgid "Show empty TV shows"
+msgstr ""
+
+#empty strings from id 20472 to 21329
#up to 21329 is reserved for the video db !! !
#: system/settings/settings.xml
@@ -12029,7 +12032,17 @@ msgctxt "#21340"
msgid "Auto-update"
msgstr ""
-#empty strings from id 21341 to 21358
+#: xbmc/addons/GUIDialogAddonInfo.cpp
+msgctxt "#21341"
+msgid "No updates available"
+msgstr ""
+
+#: xbmc/addons/GUIDialogAddonInfo.cpp
+msgctxt "#21342"
+msgid "There are currently no updates available for this add-on."
+msgstr ""
+
+#empty strings from id 21343 to 21358
#: xbmc/dialogs/GUIDialogFileBrowser.cpp
msgctxt "#21359"
@@ -12438,8 +12451,9 @@ msgctxt "#21449"
msgid "Remote control sends keyboard presses"
msgstr ""
-#. Label of setting "Appearance -> Skin -> Edit"
+#. Label for controls used to edit something (e.g. setting "Appearance -> Skin -> Edit" or a context menu entry to open timer settings dialog)
#: system/settings/settings.xml
+#: xbmc/pvr/windows/GUIWindowPVRTimers.cpp
msgctxt "#21450"
msgid "Edit"
msgstr ""
@@ -13049,13 +13063,14 @@ msgctxt "#22022"
msgid "Show video files in listings"
msgstr ""
+#empty string with id 22023
+
#: xbmc/windows/GUIWindowSystemInfo.cpp
msgctxt "#22024"
msgid "Direct3D version:"
msgstr ""
#empty strings from id 22025 to 22029
-#strings 22030 thru 22060 reserved for karaoke
#: system/settings/settings.xml
msgctxt "#22030"
@@ -13077,51 +13092,7 @@ msgctxt "#22033"
msgid "Charset"
msgstr ""
-msgctxt "#22034"
-msgid "Export karaoke titles as HTML"
-msgstr ""
-
-msgctxt "#22035"
-msgid "Export karaoke titles as CSV"
-msgstr ""
-
-#: system/settings/settings.xml
-msgctxt "#22036"
-msgid "Import karaoke titles..."
-msgstr ""
-
-#: system/settings/settings.xml
-msgctxt "#22037"
-msgid "Show song selector automatically"
-msgstr ""
-
-#: system/settings/settings.xml
-msgctxt "#22038"
-msgid "Export karaoke titles..."
-msgstr ""
-
-msgctxt "#22039"
-msgid "Enter song number"
-msgstr ""
-
-#: system/settings/settings.xml
-msgctxt "#22040"
-msgid "white / green"
-msgstr ""
-
-msgctxt "#22041"
-msgid "white / red"
-msgstr ""
-
-msgctxt "#22042"
-msgid "white / blue"
-msgstr ""
-
-msgctxt "#22043"
-msgid "black / white"
-msgstr ""
-
-#empty strings from id 22044 to 22078
+#empty strings from id 22034 to 22078
#: system/settings/settings.xml
msgctxt "#22079"
@@ -14494,7 +14465,7 @@ msgstr ""
#. Program style name
#: xbmc/cores/dvdplayer/DVDPlayerRadioRDS.cpp
-msgctxt "#29960"
+msgctxt "#29970"
msgid "Alarm Test"
msgstr ""
@@ -14504,6 +14475,8 @@ msgctxt "#29971"
msgid "Alarm"
msgstr ""
+#empty strings from id 29972 to 29976
+
#. Program style name
#: xbmc/cores/dvdplayer/DVDPlayerRadioRDS.cpp
msgctxt "#29977"
@@ -14567,10 +14540,10 @@ msgstr ""
#. Help text of boolean on/off value
#: system/settings/settings.xml
msgctxt "#29987"
-msgid "Send present traffic messages around and can be handled from addons (nothing inisde KODI)"
+msgid "Send present traffic messages around and can be handled from addons (nothing inside KODI)"
msgstr ""
-#empty strings from id 29888 to 33000
+#empty strings from id 29988 to 33000
#strings 30000 thru 30999 reserved for plug-ins and plug-in settings
#strings 31000 thru 31999 reserved for skins
#strings 32000 thru 32999 reserved for scripts
@@ -15507,7 +15480,7 @@ msgctxt "#36042"
msgid "Use limited colour range (16-235)"
msgstr ""
-#empty strings from id 36043
+#empty string with id 36043
#. Name of an action to perform on a specific event, like changing the CEC source away from Kodi
#: xbmc/peripherals/devices/PeripheralCecAdapter.cpp
@@ -15897,7 +15870,11 @@ msgctxt "#36162"
msgid "Enable VideoToolbox hardware decoding of video files."
msgstr ""
-#empty string with id 36163
+#. Description of setting "Videos -> Library -> Show empty TV shows" with label #20471
+#: system/settings/settings.xml
+msgctxt "#36163"
+msgid "Show TV shows with no episodes when browsing the video library."
+msgstr ""
#. Description of setting "Videos -> Playback -> Adjust display refresh rate" with label #170
#: system/settings/settings.xml
@@ -16599,59 +16576,7 @@ msgctxt "#36291"
msgid "Auto eject disc after rip is complete."
msgstr ""
-#. Description of settings category "Music -> Karaoke" with label #13327
-#: system/settings/settings.xml
-msgctxt "#36292"
-msgid "This category contains the settings for how karaoke is handled."
-msgstr ""
-
-#. Description of setting "Music -> Karaoke -> Enable karaoke support" with label #13323
-#: system/settings/settings.xml
-msgctxt "#36293"
-msgid "When playing any music file, look for a matching .cdg file and display its graphics."
-msgstr ""
-
-#. Description of setting "Music -> Karaoke -> Show song selector automatically" with label #22037
-#: system/settings/settings.xml
-msgctxt "#36294"
-msgid "Show song selection dialogue once the last song in the queue has been played."
-msgstr ""
-
-#. Description of setting "Music -> Karaoke -> Font" with label #22030
-#: system/settings/settings.xml
-msgctxt "#36295"
-msgid "Select the font type used during karaoke."
-msgstr ""
-
-#. Description of setting "Music -> Karaoke -> Size" with label #22031
-#: system/settings/settings.xml
-msgctxt "#36296"
-msgid "Select the size of the font used during karaoke."
-msgstr ""
-
-#. Description of setting "Music -> Karaoke -> Colours" with label #22032
-#: system/settings/settings.xml
-msgctxt "#36297"
-msgid "Select the font colour used during karaoke."
-msgstr ""
-
-#. Description of setting "Music -> Karaoke -> Charset" with label #22033
-#: system/settings/settings.xml
-msgctxt "#36298"
-msgid "Select the character set used during karaoke."
-msgstr ""
-
-#. Description of setting "Music -> Karaoke -> Export karaoke titles..." with label #22038
-#: system/settings/settings.xml
-msgctxt "#36299"
-msgid "Export the karaoke numbered songs to HTML or CSV files."
-msgstr ""
-
-#. Description of setting "Music -> Karaoke -> Import karaoke titles..." with label #22036
-#: system/settings/settings.xml
-msgctxt "#36300"
-msgid "Import the karaoke numbered songs from HTML or CSV files."
-msgstr ""
+#empty strings from id 36292 to 36300
#: system/settings/settings.xml
msgctxt "#36301"
@@ -16975,7 +16900,7 @@ msgstr ""
#. Description of setting "System -> Video output -> Vertical blank sync" with label #13105
#: system/settings/settings.xml
msgctxt "#36356"
-msgid "Eliminate vertical tearing."
+msgid "Eliminates tearing."
msgstr ""
#. Description of setting "System -> Video output -> Video calibration..." with label #214
@@ -17475,7 +17400,7 @@ msgctxt "#36441"
msgid "Enable audio DSP processing"
msgstr ""
-#empty strings from id 36459 to 36499
+#empty strings from id 36442 to 36459
#. Description of settings "System -> Logging -> Enable event logging" with label #14112
#: system/settings/settings.xml
@@ -17490,7 +17415,6 @@ msgid "Notification event describe regular processes and actions performed by th
msgstr ""
#empty strings from id 36462 to 36499
-
#end reservation
#. label of a setting for the stereoscopic 3D mode of the GUI that is/should be applied
@@ -17733,7 +17657,7 @@ msgstr ""
#. Description of setting "Services -> AirPlay -> iOS 8 compatibility mode" with label #1268
#: system/settings/settings.xml
msgctxt "#36549"
-msgid "Enables support for receving videos and pictures via AirPlay. This needs to be disabled when using iOS 9 or later clients to restore music streaming via AirPlay. Videos and Pictures are only supported for iOS clients using iOS 8.x and older."
+msgid "Enables support for receiving \"Videos\" and \"Pictures\" via AirPlay. This needs to be disabled when using iOS 9 or later clients to restore music streaming via AirPlay. \"Videos\" and \"Pictures\" are only supported for iOS clients using iOS 8.x and older."
msgstr ""
#. Name of a setting
@@ -18161,6 +18085,8 @@ msgctxt "#38020"
msgid "Enables decoding of high quality DTS-HD audio streams. Note: This increases CPU load and is only available when DTS and DTS-HD audio passthrough are disabled."
msgstr ""
+#empty string with id 38021
+
#. Used for the viewstate selection
#: xbmc/video/dialogs/GUIDialogVideoInfo.cpp
msgctxt "#38022"
diff --git a/addons/screensaver.xbmc.builtin.black/addon.xml b/addons/screensaver.xbmc.builtin.black/addon.xml
index 94fdec03bb..742c0c0035 100644
--- a/addons/screensaver.xbmc.builtin.black/addon.xml
+++ b/addons/screensaver.xbmc.builtin.black/addon.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<addon id="screensaver.xbmc.builtin.black"
name="Black"
- version="1.0.26"
+ version="1.0.27"
provider-name="Team-Kodi">
<extension point="xbmc.ui.screensaver" library=""/>
<extension point="xbmc.addon.metadata">
@@ -28,7 +28,7 @@
<summary lang="fa_IR">محاÙظ خاموش کننده صÙحه نمایش</summary>
<summary lang="fi_FI">Tyhjä ruutu</summary>
<summary lang="fr_CA">Un économiseur d'écran qui rend votre écran noir</summary>
- <summary lang="fr_FR">Un économiseur d'écran qui rend votre écran noir</summary>
+ <summary lang="fr_FR">Un économiseur d'écran qui rend l'écran noir</summary>
<summary lang="gl_ES"> Protector de pantalla que volta a súa pantalla negra</summary>
<summary lang="he_IL">שומר מסך ההופך ×ת המסך לשחור</summary>
<summary lang="hr_HR">ÄŒuvar zaslona koji pretvara zaslon u crno</summary>
@@ -53,6 +53,7 @@
<summary lang="sk_SK">Å etriÄ obrazovky, ktorú ju zmení na Äiernu</summary>
<summary lang="sl_SI">Ohranjevalnik zaslona, ki poÄrni zaslon</summary>
<summary lang="sr_RS">Чувар екрана који поцрни ваш екран</summary>
+ <summary lang="sr_RS@latin">Čuvar ekrana koji zacrni vaš ekran</summary>
<summary lang="sv_SE">En skärmsläckare som gör din skärm svart</summary>
<summary lang="tg_TJ">Пардаи Ñкран бо таъÑири «Пардаи Ñкрани Ñиёҳ»</summary>
<summary lang="th_TH">สà¸à¸£à¸µà¸™à¹€à¸‹à¸Ÿà¹€à¸§à¸­à¸£à¹Œà¸—ี่จะพัà¸à¸«à¸™à¹‰à¸²à¸ˆà¸­à¸‚องคุณให้เป็นสีดำ</summary>
@@ -84,7 +85,7 @@
<description lang="fa_IR">Black یک محاÙظ ساده است Ú©Ù‡ صÙحه نمایش را خاموش Ù…ÛŒ کند.</description>
<description lang="fi_FI">Black on yksinkertainen näytönsäästäjä, joka muuttaa ruudun mustaksi.</description>
<description lang="fr_CA">Black est un économiseur d'écran simple qui rend votre écran noir.</description>
- <description lang="fr_FR">Black est un simple économiseur qui passe votre écran au noir.</description>
+ <description lang="fr_FR">Black est un simple économiseur qui passe l'écran au noir.</description>
<description lang="gl_ES">Black é un protector de pantalla que voltará a súa pantalla a negro.</description>
<description lang="he_IL">Black ×”×•× ×©×•×ž×¨ מסך פשוט ×שר צובע ×ת המסך בשחור.</description>
<description lang="hr_HR">Black je jednostavni Äuvar zaslona koji pretvara zaslon u crno.</description>
@@ -109,6 +110,7 @@
<description lang="sk_SK">Black je jednoduchý Å¡etriÄ, ktorý zmení vaÅ¡u obrazovku na Äiernu.</description>
<description lang="sl_SI">Black je enostaven ohranjevalnik zaslona, ki poÄrni zaslon.</description>
<description lang="sr_RS">Black је једноÑтаван чувар екрана који поцрни ваш екран.</description>
+ <description lang="sr_RS@latin">Crno je jednostavan Äuvar ekrana koji će zacrniti vaÅ¡ ekran.</description>
<description lang="sv_SE">Detta är en enkel skärmsläckare som gör din skärm svart.</description>
<description lang="tg_TJ">Ин пардаи Ñкрани оÑон мебошад, ки таъÑири «Пардаи Ñкрани Ñиёҳ»-ро иÑтифода мебарад.</description>
<description lang="th_TH">หน้าจอสีดำเป็นสà¸à¸£à¸µà¸™à¹€à¸‹à¸Ÿà¹€à¸§à¸­à¸£à¹Œà¹à¸šà¸šà¸‡à¹ˆà¸²à¸¢à¹†à¸—ี่จะเปิดหน้าจอของคุณให้เป็นสีดำ</description>
diff --git a/addons/screensaver.xbmc.builtin.dim/addon.xml b/addons/screensaver.xbmc.builtin.dim/addon.xml
index 9ac810d09a..b316bce2d8 100644
--- a/addons/screensaver.xbmc.builtin.dim/addon.xml
+++ b/addons/screensaver.xbmc.builtin.dim/addon.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<addon id="screensaver.xbmc.builtin.dim"
name="Dim"
- version="1.0.26"
+ version="1.0.27"
provider-name="Team-Kodi">
<extension point="xbmc.ui.screensaver" library=""/>
<extension point="xbmc.addon.metadata">
@@ -27,7 +27,7 @@
<summary lang="fa_IR">محاÙظ تاریک کننده صÙحه نمایش</summary>
<summary lang="fi_FI">Ruudun himmennys</summary>
<summary lang="fr_CA">Un économiseur d'écran qui baisse la luminosité de votre écran</summary>
- <summary lang="fr_FR">Un économiseur qui assombrit votre écran</summary>
+ <summary lang="fr_FR">Un économiseur qui assombrit l'écran</summary>
<summary lang="gl_ES">O protector de pantalla atenúa a súa pantalla</summary>
<summary lang="he_IL">שומר מסך ×שר ×ž×¢×ž×¢× ×ת המסך</summary>
<summary lang="hr_HR">Čuvar zaslona koji zatamnjuje vaš zaslon</summary>
@@ -41,6 +41,7 @@
<summary lang="lv_LV">EkrÄnsaudzÄ“tÄjs, kas aptumÅ¡o jÅ«su ekrÄnu</summary>
<summary lang="mk_MK">Заштита што го Ñтемнува екранот</summary>
<summary lang="ms_MY">Penyelamat skrin yang memalapkan skrin anda</summary>
+ <summary lang="mt_MT">Skrinsejver li jbaxxilek id-dawl tal-iskrin</summary>
<summary lang="my_MM">သင်áစကရင်ကို မှေးမှိန်စေသော Screensaver</summary>
<summary lang="nb_NO">Skjermsparer som demper skjermen din</summary>
<summary lang="nl_NL">Schermbeveiliging die je scherm dimt</summary>
@@ -53,6 +54,7 @@
<summary lang="sl_SI">Ohranjevalnik zaslona, ki zatemni zaslon</summary>
<summary lang="sq_AL">Ruajtës ekrani, që errëson ekranin</summary>
<summary lang="sr_RS">Чувар екрана који затамни ваш екран.</summary>
+ <summary lang="sr_RS@latin">Čuvar ekrana koji prigušuje vaš ekran</summary>
<summary lang="sv_SE">En skärmsläckare som tonar ned din skärm</summary>
<summary lang="tg_TJ">Пардаи Ñкран бо таъÑири «Пардаи Ñкрани камнур»</summary>
<summary lang="th_TH">สà¸à¸£à¸µà¸™à¹€à¸‹à¸Ÿà¹€à¸§à¸­à¸£à¹Œà¸—ี่หรี่หน้าจอของคุณ</summary>
@@ -83,20 +85,21 @@
<description lang="fa_IR">محاÙظ تاریک کننده صÙحه نمایش یک محاÙظ ساده است Ú©Ù‡ نور صÙحه نمایش را (بطور تدریجی) تا سطح تعری٠شده بین 20 تا 100% Ú©Ù… Ù…ÛŒ کند.</description>
<description lang="fi_FI">Dim on yksinkertainen näytönsäästäjä joka himmentää ruudun valitulle tasolle välillä 20-100%.</description>
<description lang="fr_CA">L'économiseur Dim est un économiseur d'écran simple qui abaissera la luminosité de votre écran à une valeur réglable entre 20 à 100 %.</description>
- <description lang="fr_FR">L'économiseur Dim est un simple économiseur qui assombrira votre écran. L'assombrissement est paramétrable de 20 à 100 %.</description>
+ <description lang="fr_FR">L'économiseur Dim est un simple économiseur qui assombrira l'écran. L'assombrissement est paramétrable de 20 à 100 %.</description>
<description lang="gl_ES">O protector de pantalla de Atenuación atenuará a súa pantalla nun valor configurábel entre o 20% e o 100%</description>
<description lang="he_IL">שומר המסך Dim ×”×•× ×©×•×ž×¨ מסך פשוט ×שר ×ž×¢×ž×¢× ×ת המסך לערך מוגדר בין 20% ל־100%.</description>
<description lang="hr_HR">Dim Äuvar zaslona je jednostavan Äuvar zaslona koji će zatamniti (postepeno isÄeznuti) vaÅ¡ zaslon na odabranu vrijednost izmeÄ‘u 20 i 100% .</description>
<description lang="hu_HU">A Dim képernyővédő egyszerűen elhalványítja a képernyőt egy előre beállítható sötétségi szintre 20 és 100% között.</description>
<description lang="id_ID">Penyelamat layar Redup adalah penyelamat layar sederhana yang akan meredupkan (membuat gambar menjadi hilang) layar Anda ke suatu nilai yang dapat diatur antara 20 dan 100%.</description>
<description lang="is_IS">Dim er einföld skjáhvíla sem lækkar birtustigið á skjánum um stillanlegt gildi á milli 20 og 100%</description>
- <description lang="it_IT">'Dim' è un semplice salvaschermo che diminuirà la luminosità del tuo schermo ad un valore (regolabile) tra il 20% ed il 100%.</description>
+ <description lang="it_IT">Dim è un semplice salvaschermo che diminuirà la luminosità del tuo schermo ad un valore (regolabile) tra il 20% e il 100%.</description>
<description lang="ja_JP">Dim ã¯ã‚·ãƒ³ãƒ—ルãªã‚¹ã‚¯ãƒªãƒ¼ãƒ³ã‚»ãƒ¼ãƒãƒ¼ã§ã€ç”»é¢ã‚’(フェードアウトã§)è–„æš—ãã—ã¾ã™ã€‚値ã¯20%ã‹ã‚‰100%ã¾ã§è¨­å®šå¯èƒ½ã§ã™ã€‚</description>
<description lang="ko_KR">Dim 화면보호기는 í™”ë©´ì„ ì–´ë‘¡ê²Œ(페ì´ë“œ 아웃)하는 간단한 화면 보호기 입니다. 어둡게 하는 ì •ë„를 20-100%사ì´ì—ì„œ 설정할 수 있습니다.</description>
<description lang="lt_LT">Pritemdyta ekrano užsklanda yra paprasta ekrano užsklanda,katra pamažu (pamažu mažinant vaizdo ryškumą) jūsų ekrano ryškuma sumažins nuo 20 iki 100%.</description>
<description lang="lv_LV">Aptumsuma ekrÄnsaudzÄ“tÄjs ir vienkÄrÅ¡s ekrÄnsaudzÄ“tÄjs, kas aptumÅ¡o (padara tumÅ¡Äku) jÅ«su ekrÄnu lÄ«dz uzstÄdÄmai robežai starp 20 un 100%.</description>
<description lang="mk_MK">ДИМ Заштитата на екран е едноÑтавно Ñтемнување на екранот, може да Ñе одбере вредноÑÑ‚ помеѓу 20 и 100%</description>
<description lang="ms_MY">Penyelamat skrin malap adapah penyelamat skrin ringkas yang memalapkan (lenyapkan) skrin anda kepada nilai boleh ditetap diantara 20 hingga 100%.</description>
+ <description lang="mt_MT">L-iskrinsejver Dim huwa skrinsejver sempliċi li jbaxxilek (bil-mod) il-qawwa tal-iskrin sa valur li tista' tagħżel bejn 20 u 100%.</description>
<description lang="my_MM">Dim screensaver သည် ရိုးရှင်းသော Screensaver á€á€…်á€á€¯á€–ြစ်သည်ዠáŽá€„်းသည် သင်á စá€á€›á€„် ကို á‚á€% မှ áá€á€% အá€á€½á€„်း မှေးမှိန်သွားအောင်ပြုလုပ်လိမ့်မည်</description>
<description lang="nb_NO">Dim er en enkel skjermsparer som demper skjermen din til en justerbar verdi mellom 20-100%</description>
<description lang="nl_NL">De Dim-schermbeveiliging is een eenvoudige schermbeveiliging die uw scherm geleidelijk dimt. U kan een waarde gaande van 20 tot 100% instellen.</description>
@@ -109,10 +112,11 @@
<description lang="sl_SI">Dim je enostaven ohranjevalnik zaslona, ki zatemni zaslon do izbrane svetlosti med 20 in 100%.</description>
<description lang="sq_AL">Errësuesi i ekranit është një mbrojtës i thjeshtë ekrani, i cili errëson (zbeh) ekranin tuaj në varësi të një vlere të axhustueshme nga 20 deri në 100%. </description>
<description lang="sr_RS">Dim чувар екрана је једноÑтаван чувар екрана који ће затамнети (поÑтепено) ваш екран на подешену вредноÑÑ‚ између 20 и 100%.</description>
+ <description lang="sr_RS@latin">ÄŒuvar ekrana PriguÅ¡i je jednostavan Äuvar ekrana koji će priguÅ¡iti (izbledeti) vaÅ¡ ekran na podeÅ¡enu vrednost izmeÄ‘u 20 i 100% .</description>
<description lang="sv_SE">Detta är en enkel skärmsläckare som tonar ned ljusstyrkan på din skärm till ett angivet värde mellan 20 och 100%</description>
<description lang="tg_TJ">Ин пардаи Ñкран бо таъÑири «Пардаи Ñкрани камнур» хеле оÑон мебошад, ки Ñатҳи камнури Ñкранро то дараҷае байни 20% ва 100% тағйир меёбад.</description>
<description lang="th_TH">สà¸à¸£à¸µà¸™à¹€à¸‹à¸Ÿà¹€à¸§à¸­à¸£à¹Œà¸«à¸£à¸µà¹ˆà¸«à¸™à¹‰à¸²à¸ˆà¸­à¹€à¸›à¹‡à¸™à¸ªà¸à¸£à¸µà¸™à¹€à¸‹à¸Ÿà¹€à¸§à¸­à¸£à¹Œà¹à¸šà¸šà¸žà¸·à¹‰à¸™à¸à¸²à¸™à¸—ี่ช่วยหรี่หน้าจอของคุณซึ่งสามารถตั้งค่าà¸à¸²à¸£à¸«à¸£à¸µà¹ˆà¸«à¸™à¹‰à¸²à¸ˆà¸­à¹„ด้ตั้งà¹à¸•à¹ˆ 20% ถึง 100%</description>
- <description lang="tr_TR">Dim ekran koruyucusu, değeri %20 ila %100 arasında ayarlanabilen ve ekranınızı karanlıklaştıran (silikleştiren) basit bir ekran koruyucudur.</description>
+ <description lang="tr_TR">Dim ekran koruyucusu, değeri %20 ile %100 arasında ayarlanabilen ve ekranınızı karanlıklaştıran (silikleştiren) basit bir ekran koruyucudur.</description>
<description lang="uk_UA">Ð¦Ñ Ð·Ð°Ñтавка затемнÑÑ” екран (зменшує ÑÑкравіÑÑ‚ÑŒ) на вÑтановлене Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð² межах від 20% до 100%.</description>
<description lang="vi_VN">Trình bảo vệ Dim là trình bảo vệ đơn giản để làm tối (mỠdần) màn hình của bạn theo giá trị được sắp đặt từ 20 cho đến 100%.</description>
<description lang="zh_CN">淡出å±ä¿æ˜¯ä¸€ä¸ªç®€å•çš„å±å¹•ä¿æŠ¤ç¨‹åºï¼Œå®ƒä½¿ä½ çš„å±å¹•æ˜¾ç¤ºå†…容å˜æš—(淡出效果),暗化度å¯åœ¨20%至100%之间调节。</description>
diff --git a/addons/screensaver.xbmc.builtin.dim/resources/language/resource.language.mt_mt/strings.po b/addons/screensaver.xbmc.builtin.dim/resources/language/resource.language.mt_mt/strings.po
new file mode 100644
index 0000000000..f885171e66
--- /dev/null
+++ b/addons/screensaver.xbmc.builtin.dim/resources/language/resource.language.mt_mt/strings.po
@@ -0,0 +1,21 @@
+# Kodi Media Center language file
+# Addon Name: Dim
+# Addon id: screensaver.xbmc.builtin.dim
+# Addon Provider: Team-Kodi
+msgid ""
+msgstr ""
+"Project-Id-Version: KODI Main\n"
+"Report-Msgid-Bugs-To: http://trac.kodi.tv/\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: Maltese (Malta) (http://www.transifex.com/projects/p/kodi-main/language/mt_MT/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: mt_MT\n"
+"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : n==0 || ( n%100>1 && n%100<11) ? 1 : (n%100>10 && n%100<20 ) ? 2 : 3);\n"
+
+msgctxt "#30000"
+msgid "Dim level"
+msgstr "Livell b'kemm jitbaxxa l-iskrin"
diff --git a/addons/screensaver.xbmc.builtin.dim/resources/language/resource.language.sr_rs@latin/strings.po b/addons/screensaver.xbmc.builtin.dim/resources/language/resource.language.sr_rs@latin/strings.po
new file mode 100644
index 0000000000..075e39fce3
--- /dev/null
+++ b/addons/screensaver.xbmc.builtin.dim/resources/language/resource.language.sr_rs@latin/strings.po
@@ -0,0 +1,21 @@
+# Kodi Media Center language file
+# Addon Name: Dim
+# Addon id: screensaver.xbmc.builtin.dim
+# Addon Provider: Team-Kodi
+msgid ""
+msgstr ""
+"Project-Id-Version: KODI Main\n"
+"Report-Msgid-Bugs-To: http://trac.kodi.tv/\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: Serbian (Latin) (Serbia) (http://www.transifex.com/projects/p/kodi-main/language/sr_RS@latin/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: sr_RS@latin\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"
+
+msgctxt "#30000"
+msgid "Dim level"
+msgstr "Nivo prigušenja"
diff --git a/addons/skin.confluence/720p/DialogExtendedProgressBar.xml b/addons/skin.confluence/720p/DialogExtendedProgressBar.xml
index 6b1d7b4070..c6ed2bba3e 100644
--- a/addons/skin.confluence/720p/DialogExtendedProgressBar.xml
+++ b/addons/skin.confluence/720p/DialogExtendedProgressBar.xml
@@ -5,7 +5,7 @@
<animation effect="slide" start="0,0" end="0,-70" delay="300" time="75">WindowClose</animation>
<controls>
<control type="group">
- <depth>DepthDialog+</depth>
+ <depth>DepthHeader</depth>
<left>720</left>
<top>0</top>
<animation effect="slide" end="0,-80" time="150" condition="Window.IsVisible(FullscreenVideo) | Window.IsVisible(Visualisation)">conditional</animation>
diff --git a/addons/skin.confluence/720p/DialogKaraokeSongSelector.xml b/addons/skin.confluence/720p/DialogKaraokeSongSelector.xml
deleted file mode 100644
index 4eb9954e2f..0000000000
--- a/addons/skin.confluence/720p/DialogKaraokeSongSelector.xml
+++ /dev/null
@@ -1,41 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<window type="dialog">
- <animation effect="slide" start="0,-40" end="0,0" time="75">WindowOpen</animation>
- <animation effect="slide" start="0,0" end="0,-40" delay="300" time="75">WindowClose</animation>
- <controls>
- <control type="group">
- <depth>DepthDialog-</depth>
- <left>100</left>
- <top>0</top>
- <control type="image">
- <left>0</left>
- <top>-10</top>
- <width>370</width>
- <height>70</height>
- <texture flipy="true" border="20,20,20,2">InfoMessagePanel.png</texture>
- </control>
- <control type="label" id="401">
- <description>Song Number Label</description>
- <left>15</left>
- <top>2</top>
- <width>340</width>
- <height>25</height>
- <font>font13_title</font>
- <textcolor>selected</textcolor>
- <align>left</align>
- <aligny>center</aligny>
- </control>
- <control type="label" id="402">
- <description>Song Name Label</description>
- <left>15</left>
- <top>27</top>
- <width>340</width>
- <height>20</height>
- <font>font13</font>
- <textcolor>blue</textcolor>
- <align>left</align>
- <aligny>center</aligny>
- </control>
- </control>
- </controls>
-</window>
diff --git a/addons/skin.confluence/720p/DialogKaraokeSongSelectorLarge.xml b/addons/skin.confluence/720p/DialogKaraokeSongSelectorLarge.xml
deleted file mode 100644
index 6f5d8f83f9..0000000000
--- a/addons/skin.confluence/720p/DialogKaraokeSongSelectorLarge.xml
+++ /dev/null
@@ -1,44 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<window type="dialog">
- <include>dialogeffect</include>
- <coordinates>
- <left>415</left>
- <top>275</top>
- </coordinates>
- <controls>
- <control type="group">
- <include name="DialogBackgroundCommons">
- <param name="DialogBackgroundWidth" value="450" />
- <param name="DialogBackgroundHeight" value="170" />
- <param name="DialogHeaderWidth" value="370" />
- <param name="DialogHeaderLabel" value="$LOCALIZE[31321]" />
- <param name="DialogHeaderId" value="1" />
- <param name="CloseButtonLeft" value="360" />
- <param name="CloseButtonNav" value="10" />
- </include>
- <control type="label" id="401">
- <description>Song Number Label</description>
- <left>30</left>
- <top>70</top>
- <width>390</width>
- <height>30</height>
- <font>font28_title</font>
- <textcolor>white</textcolor>
- <align>center</align>
- <aligny>center</aligny>
- </control>
- <control type="label" id="402">
- <description>Song Name Label</description>
- <left>30</left>
- <top>120</top>
- <width>390</width>
- <height>20</height>
- <font>font13</font>
- <align>center</align>
- <aligny>center</aligny>
- <textcolor>blue</textcolor>
- <scroll>true</scroll>
- </control>
- </control>
- </controls>
-</window>
diff --git a/addons/skin.confluence/720p/DialogVolumeBar.xml b/addons/skin.confluence/720p/DialogVolumeBar.xml
index 30f38b9cb5..6104c0d029 100644
--- a/addons/skin.confluence/720p/DialogVolumeBar.xml
+++ b/addons/skin.confluence/720p/DialogVolumeBar.xml
@@ -5,7 +5,7 @@
<animation effect="slide" start="0,0" end="0,-40" delay="300" time="75">WindowClose</animation>
<controls>
<control type="group">
- <depth>DepthMax</depth>
+ <depth>DepthOSD</depth>
<left>820</left>
<top>0</top>
<control type="image">
diff --git a/addons/skin.confluence/720p/Home.xml b/addons/skin.confluence/720p/Home.xml
index 9ac8edcc8f..795d495064 100644
--- a/addons/skin.confluence/720p/Home.xml
+++ b/addons/skin.confluence/720p/Home.xml
@@ -24,7 +24,7 @@
<depth>DepthMenu</depth>
<left>0</left>
<top>60</top>
- <visible>Player.HasAudio + !Skin.HasSetting(homepageMusicinfo)</visible>
+ <visible>Player.HasAudio + !Skin.HasSetting(homepageMusicinfo) + IsEmpty(Window(videolibrary).Property(PlayingBackgroundMedia))</visible>
<include>VisibleFadeEffect</include>
<include>Window_OpenClose_Animation</include>
<control type="image">
@@ -228,7 +228,7 @@
<depth>DepthMenu</depth>
<left>0</left>
<top>50</top>
- <visible>Player.HasVideo + !Skin.HasSetting(homepageVideoinfo)</visible>
+ <visible>Player.HasVideo + !Skin.HasSetting(homepageVideoinfo) + IsEmpty(Window(videolibrary).Property(PlayingBackgroundMedia))</visible>
<include>VisibleFadeEffect</include>
<include>Window_OpenClose_Animation</include>
<control type="group">
@@ -462,6 +462,7 @@
<effect type="zoom" start="100" end="80" center="640,360" easing="in" tween="back" time="225" />
<effect type="fade" start="100" end="0" time="225" />
</animation>
+ <visible>IsEmpty(Window(videolibrary).Property(PlayingBackgroundMedia))</visible>
<control type="image">
<description>Background End image</description>
<left>0</left>
@@ -684,7 +685,8 @@
<onup>9003</onup>
<ondown>9000</ondown>
<onclick>ActivateWindow(PVRRadioRDSInfo)</onclick>
- <visible>RDS.HasRadiotextPlus</visible>
+ <enable>RDS.HasRadiotextPlus</enable>
+ <animation effect="fade" start="100" end="30" time="75" condition="!RDS.HasRadiotextPlus">Conditional</animation>
</control>
<control type="button" id="606">
<left>160</left>
diff --git a/addons/skin.confluence/720p/IncludesBackgroundBuilding.xml b/addons/skin.confluence/720p/IncludesBackgroundBuilding.xml
index 63ad350164..cc996da50d 100644
--- a/addons/skin.confluence/720p/IncludesBackgroundBuilding.xml
+++ b/addons/skin.confluence/720p/IncludesBackgroundBuilding.xml
@@ -42,6 +42,7 @@
<width>1280</width>
<height>720</height>
<visible>Player.HasAudio + !Skin.HasSetting(ShowBackgroundVis)</visible>
+ <visible>IsEmpty(Window(videolibrary).Property(PlayingBackgroundMedia))</visible>
</control>
<control type="videowindow">
<depth>DepthBackground</depth>
@@ -58,7 +59,7 @@
<width>1320</width>
<height>120</height>
<texture flipy="true" border="1">HomeNowPlayingBack.png</texture>
- <visible>[Player.HasVideo + !Skin.HasSetting(ShowBackgroundVideo)] | [Player.HasAudio + !Skin.HasSetting(ShowBackgroundVis)] | [!Skin.HasSetting(HideBackGroundFanart) + !IsEmpty(ListItem.Property(Fanart_Image))]</visible>
+ <visible>[Player.HasVideo + !Skin.HasSetting(ShowBackgroundVideo)] | [Player.HasAudio + ![Skin.HasSetting(ShowBackgroundVis) | !IsEmpty(Window(videolibrary).Property(PlayingBackgroundMedia))]] | [!Skin.HasSetting(HideBackGroundFanart) + !IsEmpty(ListItem.Property(Fanart_Image))]</visible>
<include>VisibleFadeEffect</include>
</control>
</include>
diff --git a/addons/skin.confluence/720p/MusicKaraokeLyrics.xml b/addons/skin.confluence/720p/MusicKaraokeLyrics.xml
deleted file mode 100644
index 0a63ce81c7..0000000000
--- a/addons/skin.confluence/720p/MusicKaraokeLyrics.xml
+++ /dev/null
@@ -1,46 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<window>
- <controls>
- <control type="karvisualisation" id="1">
- <description>visualisation</description>
- <left>0</left>
- <top>0</top>
- <width>1280</width>
- <height>720</height>
- <visible>false</visible>
- </control>
- <control type="image" id="2">
- <description>fullscreen image</description>
- <left>0</left>
- <top>0</top>
- <width>1280</width>
- <height>720</height>
- <visible>false</visible>
- </control>
- <control type="group">
- <visible>MusicPlayer.Offset(number).Exists + !IntegerGreaterThan(Player.TimeRemaining,20)</visible>
- <animation effect="slide" start="0,-40" end="0,0" time="75">Visible</animation>
- <left>420</left>
- <top>0</top>
- <control type="image">
- <left>0</left>
- <top>-10</top>
- <width>470</width>
- <height>55</height>
- <texture flipy="true" border="20,20,20,2">InfoMessagePanel.png</texture>
- </control>
- <control type="label" id="402">
- <description>Next Song Name</description>
- <left>5</left>
- <top>5</top>
- <width>470</width>
- <height>25</height>
- <font>font13_title</font>
- <textcolor>blue</textcolor>
- <label>[COLOR=blue]$LOCALIZE[19031] :[/COLOR] [COLOR=selected]$INFO[MusicPlayer.offset(1).Title][/COLOR]</label>
- <align>center</align>
- <aligny>center</aligny>
- </control>
- </control>
- </controls>
-</window>
diff --git a/addons/skin.confluence/720p/MusicOSD.xml b/addons/skin.confluence/720p/MusicOSD.xml
index fbde2d225b..b23fe1a890 100644
--- a/addons/skin.confluence/720p/MusicOSD.xml
+++ b/addons/skin.confluence/720p/MusicOSD.xml
@@ -259,29 +259,25 @@
<onclick>PlayerControl(Random)</onclick>
</control>
<control type="image" id="2300">
- <width>215</width>
- <height>55</height>
+ <width>160</width>
<texture>-</texture>
- <visible>!MusicPlayer.Content(LiveTV) + Player.CanRecord</visible>
</control>
<control type="image" id="2400">
- <width>215</width>
+ <width>55</width>
<texture>-</texture>
- <visible>MusicPlayer.Content(LiveTV)</visible>
+ <visible>!system.getbool(audiooutput.dspaddonsenabled)</visible>
</control>
<control type="image" id="2500">
- <width>270</width>
- <height>55</height>
+ <width>55</width>
<texture>-</texture>
- <visible>!MusicPlayer.Content(LiveTV) + !Player.CanRecord + !system.getbool(audiooutput.dspaddonsenabled)</visible>
+ <visible>MusicPlayer.Content(LiveTV)</visible>
</control>
<control type="image" id="2600">
- <width>215</width>
+ <width>55</width>
<texture>-</texture>
- <visible>system.getbool(audiooutput.dspaddonsenabled)</visible>
+ <visible>!Player.CanRecord</visible>
</control>
<control type="button" id="700">
- <visible>system.getbool(audiooutput.dspaddonsenabled)</visible>
<width>55</width>
<height>55</height>
<label>15047</label>
@@ -289,6 +285,7 @@
<texturefocus>OSDDSPAudioFO.png</texturefocus>
<texturenofocus>OSDDSPAudioNF.png</texturenofocus>
<onclick>ActivateWindow(OSDAudioDSPSettings)</onclick>
+ <visible>system.getbool(audiooutput.dspaddonsenabled)</visible>
</control>
<control type="togglebutton" id="701">
<width>55</width>
diff --git a/addons/skin.confluence/720p/MyPVRChannels.xml b/addons/skin.confluence/720p/MyPVRChannels.xml
index fa3c4e6030..d4106801e9 100644
--- a/addons/skin.confluence/720p/MyPVRChannels.xml
+++ b/addons/skin.confluence/720p/MyPVRChannels.xml
@@ -82,6 +82,19 @@
<height>400</height>
<texture border="5">button-nofocus.png</texture>
</control>
+ <control type="button" id="61">
+ <left>-1</left>
+ <top>-1</top>
+ <width>692</width>
+ <height>402</height>
+ <texturefocus border="3">VideoWindowFO.png</texturefocus>
+ <texturenofocus>-</texturenofocus>
+ <font>-</font>
+ <pulseonselect>no</pulseonselect>
+ <onleft>70</onleft>
+ <onclick>Fullscreen</onclick>
+ <visible>Player.HasVideo</visible>
+ </control>
<control type="image">
<left>5</left>
<top>5</top>
diff --git a/addons/skin.confluence/720p/SkinSettings.xml b/addons/skin.confluence/720p/SkinSettings.xml
index dd9942b95b..e23e598fb8 100644
--- a/addons/skin.confluence/720p/SkinSettings.xml
+++ b/addons/skin.confluence/720p/SkinSettings.xml
@@ -707,7 +707,7 @@
<focusedcolor>white</focusedcolor>
<texturefocus>MenuItemFO.png</texturefocus>
<texturenofocus>MenuItemNF.png</texturenofocus>
- <onclick>Skin.SetAddon(HomeVideosButton1,xbmc.addon.video,xbmc.addon.executable)</onclick>
+ <onclick>Skin.SetAddon(HomeVideosButton1,xbmc.addon.video)</onclick>
</control>
<control type="button" id="412">
<width>750</width>
@@ -719,7 +719,7 @@
<focusedcolor>white</focusedcolor>
<texturefocus>MenuItemFO.png</texturefocus>
<texturenofocus>MenuItemNF.png</texturenofocus>
- <onclick>Skin.SetAddon(HomeVideosButton2,xbmc.addon.video,xbmc.addon.executable)</onclick>
+ <onclick>Skin.SetAddon(HomeVideosButton2,xbmc.addon.video)</onclick>
</control>
<control type="button" id="413">
<width>750</width>
@@ -731,7 +731,7 @@
<focusedcolor>white</focusedcolor>
<texturefocus>MenuItemFO.png</texturefocus>
<texturenofocus>MenuItemNF.png</texturenofocus>
- <onclick>Skin.SetAddon(HomeVideosButton3,xbmc.addon.video,xbmc.addon.executable)</onclick>
+ <onclick>Skin.SetAddon(HomeVideosButton3,xbmc.addon.video)</onclick>
</control>
<control type="button" id="414">
<width>750</width>
@@ -743,7 +743,7 @@
<focusedcolor>white</focusedcolor>
<texturefocus>MenuItemFO.png</texturefocus>
<texturenofocus>MenuItemNF.png</texturenofocus>
- <onclick>Skin.SetAddon(HomeVideosButton4,xbmc.addon.video,xbmc.addon.executable)</onclick>
+ <onclick>Skin.SetAddon(HomeVideosButton4,xbmc.addon.video)</onclick>
</control>
<control type="button" id="415">
<width>750</width>
@@ -755,7 +755,7 @@
<focusedcolor>white</focusedcolor>
<texturefocus>MenuItemFO.png</texturefocus>
<texturenofocus>MenuItemNF.png</texturenofocus>
- <onclick>Skin.SetAddon(HomeVideosButton5,xbmc.addon.video,xbmc.addon.executable)</onclick>
+ <onclick>Skin.SetAddon(HomeVideosButton5,xbmc.addon.video)</onclick>
</control>
<control type="label" id="420">
<width>750</width>
@@ -777,7 +777,7 @@
<focusedcolor>white</focusedcolor>
<texturefocus>MenuItemFO.png</texturefocus>
<texturenofocus>MenuItemNF.png</texturenofocus>
- <onclick>Skin.SetAddon(HomeMusicButton1,xbmc.addon.audio,xbmc.addon.executable)</onclick>
+ <onclick>Skin.SetAddon(HomeMusicButton1,xbmc.addon.audio)</onclick>
</control>
<control type="button" id="422">
<width>750</width>
@@ -789,7 +789,7 @@
<focusedcolor>white</focusedcolor>
<texturefocus>MenuItemFO.png</texturefocus>
<texturenofocus>MenuItemNF.png</texturenofocus>
- <onclick>Skin.SetAddon(HomeMusicButton2,xbmc.addon.audio,xbmc.addon.executable)</onclick>
+ <onclick>Skin.SetAddon(HomeMusicButton2,xbmc.addon.audio)</onclick>
</control>
<control type="button" id="423">
<width>750</width>
@@ -801,7 +801,7 @@
<focusedcolor>white</focusedcolor>
<texturefocus>MenuItemFO.png</texturefocus>
<texturenofocus>MenuItemNF.png</texturenofocus>
- <onclick>Skin.SetAddon(HomeMusicButton3,xbmc.addon.audio,xbmc.addon.executable)</onclick>
+ <onclick>Skin.SetAddon(HomeMusicButton3,xbmc.addon.audio)</onclick>
</control>
<control type="button" id="424">
<width>750</width>
@@ -813,7 +813,7 @@
<focusedcolor>white</focusedcolor>
<texturefocus>MenuItemFO.png</texturefocus>
<texturenofocus>MenuItemNF.png</texturenofocus>
- <onclick>Skin.SetAddon(HomeMusicButton4,xbmc.addon.audio,xbmc.addon.executable)</onclick>
+ <onclick>Skin.SetAddon(HomeMusicButton4,xbmc.addon.audio)</onclick>
</control>
<control type="button" id="425">
<width>750</width>
@@ -825,7 +825,7 @@
<focusedcolor>white</focusedcolor>
<texturefocus>MenuItemFO.png</texturefocus>
<texturenofocus>MenuItemNF.png</texturenofocus>
- <onclick>Skin.SetAddon(HomeMusicButton5,xbmc.addon.audio,xbmc.addon.executable)</onclick>
+ <onclick>Skin.SetAddon(HomeMusicButton5,xbmc.addon.audio)</onclick>
</control>
<control type="label" id="430">
<width>750</width>
@@ -847,7 +847,7 @@
<focusedcolor>white</focusedcolor>
<texturefocus>MenuItemFO.png</texturefocus>
<texturenofocus>MenuItemNF.png</texturenofocus>
- <onclick>Skin.SetAddon(HomePictureButton1,xbmc.addon.image,xbmc.addon.executable)</onclick>
+ <onclick>Skin.SetAddon(HomePictureButton1,xbmc.addon.image)</onclick>
</control>
<control type="button" id="432">
<width>750</width>
@@ -859,7 +859,7 @@
<focusedcolor>white</focusedcolor>
<texturefocus>MenuItemFO.png</texturefocus>
<texturenofocus>MenuItemNF.png</texturenofocus>
- <onclick>Skin.SetAddon(HomePictureButton2,xbmc.addon.image,xbmc.addon.executable)</onclick>
+ <onclick>Skin.SetAddon(HomePictureButton2,xbmc.addon.image)</onclick>
</control>
<control type="button" id="433">
<width>750</width>
@@ -871,7 +871,7 @@
<focusedcolor>white</focusedcolor>
<texturefocus>MenuItemFO.png</texturefocus>
<texturenofocus>MenuItemNF.png</texturenofocus>
- <onclick>Skin.SetAddon(HomePictureButton3,xbmc.addon.image,xbmc.addon.executable)</onclick>
+ <onclick>Skin.SetAddon(HomePictureButton3,xbmc.addon.image)</onclick>
</control>
<control type="button" id="434">
<width>750</width>
@@ -883,7 +883,7 @@
<focusedcolor>white</focusedcolor>
<texturefocus>MenuItemFO.png</texturefocus>
<texturenofocus>MenuItemNF.png</texturenofocus>
- <onclick>Skin.SetAddon(HomePictureButton4,xbmc.addon.image,xbmc.addon.executable)</onclick>
+ <onclick>Skin.SetAddon(HomePictureButton4,xbmc.addon.image)</onclick>
</control>
<control type="button" id="435">
<width>750</width>
@@ -895,7 +895,7 @@
<focusedcolor>white</focusedcolor>
<texturefocus>MenuItemFO.png</texturefocus>
<texturenofocus>MenuItemNF.png</texturenofocus>
- <onclick>Skin.SetAddon(HomePictureButton5,xbmc.addon.image,xbmc.addon.executable)</onclick>
+ <onclick>Skin.SetAddon(HomePictureButton5,xbmc.addon.image)</onclick>
</control>
<control type="label" id="440">
<width>750</width>
@@ -967,18 +967,6 @@
<texturenofocus>MenuItemNF.png</texturenofocus>
<onclick>Skin.SetAddon(HomeProgramButton5,xbmc.addon.executable)</onclick>
</control>
- <control type="button" id="446">
- <width>750</width>
- <height>40</height>
- <font>font13</font>
- <label>$LOCALIZE[24000] [B]6[/B]</label>
- <label2>[COLOR=selected]$INFO[system.addontitle(Skin.String(HomeProgramButton6))][/COLOR]</label2>
- <textcolor>grey2</textcolor>
- <focusedcolor>white</focusedcolor>
- <texturefocus>MenuItemFO.png</texturefocus>
- <texturenofocus>MenuItemNF.png</texturenofocus>
- <onclick>Skin.SetAddon(HomeProgramButton6,xbmc.addon.executable)</onclick>
- </control>
</control>
</control>
<control type="scrollbar" id="61">
diff --git a/addons/skin.confluence/720p/VideoOSD.xml b/addons/skin.confluence/720p/VideoOSD.xml
index c6733dc0b3..83c505b5ee 100644
--- a/addons/skin.confluence/720p/VideoOSD.xml
+++ b/addons/skin.confluence/720p/VideoOSD.xml
@@ -177,7 +177,7 @@
<visible>VideoPlayer.HasMenu + !VideoPlayer.Content(LiveTV)</visible>
</control>
<control type="image" id="2300">
- <width>165</width>
+ <width>160</width>
<texture>-</texture>
<visible>VideoPlayer.Content(LiveTV)</visible>
</control>
@@ -294,6 +294,7 @@
<animation effect="slide" start="0,0" end="0,80" time="0" condition="![VideoPlayer.HasSubtitles + VideoPlayer.SubtitlesEnabled]">Conditional</animation>
<animation effect="slide" start="0,0" end="0,40" time="0" condition="!VideoPlayer.HasSubtitles">Conditional</animation>
<animation effect="slide" start="0,0" end="55,0" time="0" condition="![VideoPlayer.HasMenu | VideoPlayer.Content(LiveTV)]">Conditional</animation>
+ <animation effect="slide" start="0,0" end="55,0" time="0" condition="!VideoPlayer.HasMenu + VideoPlayer.Content(LiveTV)">Conditional</animation>
<right>145</right>
<bottom>45</bottom>
<width>256</width>
@@ -413,6 +414,7 @@
<depth>DepthOSD+</depth>
<visible>videoplayer.isstereoscopic + ![Window.IsVisible(SliderDialog) | Window.IsVisible(OSDVideoSettings) | Window.IsVisible(OSDAudioSettings) | Window.IsVisible(OSDAudioDSPSettings) | Window.IsVisible(VideoBookmarks) | Window.IsVisible(PVROSDChannels) | Window.IsVisible(PVROSDGuide)] + [Control.HasFocus(255) | ControlGroup(500).HasFocus | Control.HasFocus(520)]</visible>
<animation effect="fade" time="150">VisibleChange</animation>
+ <animation effect="slide" start="0,0" end="55,0" time="0" condition="![VideoPlayer.HasMenu | VideoPlayer.Content(LiveTV)]">Conditional</animation>
<animation effect="slide" start="0,0" end="55,0" time="0" condition="VideoPlayer.Content(LiveTV)">Conditional</animation>
<right>200</right>
<bottom>45</bottom>
diff --git a/addons/skin.confluence/720p/ViewsMusicLibrary.xml b/addons/skin.confluence/720p/ViewsMusicLibrary.xml
index bdf81a4289..58a5886fea 100644
--- a/addons/skin.confluence/720p/ViewsMusicLibrary.xml
+++ b/addons/skin.confluence/720p/ViewsMusicLibrary.xml
@@ -16,7 +16,7 @@
<viewtype label="$LOCALIZE[544]">list</viewtype>
<pagecontrol>60</pagecontrol>
<scrolltime>200</scrolltime>
- <visible>Window.IsVisible(MusicPlaylist) | Container.Content(Songs) | Container.Content(Albums)</visible>
+ <visible>Container.Content(Files) | Window.IsVisible(MusicPlaylist) | Container.Content(Songs) | Container.Content(Albums)</visible>
<itemlayout height="40" width="780">
<control type="image">
<left>0</left>
diff --git a/addons/skin.confluence/720p/ViewsVideoLibrary.xml b/addons/skin.confluence/720p/ViewsVideoLibrary.xml
index b3259d4ccd..9609cdf7c0 100644
--- a/addons/skin.confluence/720p/ViewsVideoLibrary.xml
+++ b/addons/skin.confluence/720p/ViewsVideoLibrary.xml
@@ -1767,6 +1767,7 @@
<include>VideoTypeHackFlaggingConditions</include>
</control>
<control type="image">
+ <depth>DepthContent+</depth>
<left>560</left>
<top>140</top>
<width>180</width>
@@ -1816,6 +1817,7 @@
<autoscroll time="2000" delay="3000" repeat="5000">Skin.HasSetting(AutoScroll)</autoscroll>
</control>
<control type="image">
+ <depth>DepthContent+</depth>
<left>560</left>
<top>140</top>
<width>180</width>
@@ -1865,6 +1867,7 @@
<autoscroll time="2000" delay="3000" repeat="5000">Skin.HasSetting(AutoScroll)</autoscroll>
</control>
<control type="image">
+ <depth>DepthContent+</depth>
<left>560</left>
<top>140</top>
<width>180</width>
@@ -1929,6 +1932,7 @@
<include>VideoTypeHackFlaggingConditions</include>
</control>
<control type="image">
+ <depth>DepthContent+</depth>
<left>420</left>
<top>140</top>
<width>330</width>
diff --git a/addons/skin.confluence/720p/includes.xml b/addons/skin.confluence/720p/includes.xml
index 3f49db724d..327d8220dc 100644
--- a/addons/skin.confluence/720p/includes.xml
+++ b/addons/skin.confluence/720p/includes.xml
@@ -432,7 +432,7 @@
</include>
<include name="CommonNowPlaying">
<control type="group">
- <visible>Player.HasMedia</visible>
+ <visible>Player.HasMedia + IsEmpty(Window(videolibrary).Property(PlayingBackgroundMedia))</visible>
<include>VisibleFadeEffect</include>
<animation effect="fade" time="200" condition="Window.Previous(Home)">WindowOpen</animation>
<animation effect="fade" time="200" condition="Window.Next(Home)">WindowClose</animation>
@@ -808,164 +808,120 @@
<description>Fake Button to fix Player Controls Navigation</description>
<visible>false</visible>
</control>
- <control type="group" id="9006">
- <width>250</width>
+ <control type="group" id="90060">
<height>45</height>
<visible>VideoPlayer.Content(LiveTV)</visible>
<include>VisibleFadeEffect</include>
- <control type="button" id="600">
- <left>5</left>
- <top>2</top>
- <width>39</width>
- <height>39</height>
- <label>-</label>
- <texturefocus>OSDChannelUPFO.png</texturefocus>
- <texturenofocus>OSDChannelUPNF.png</texturenofocus>
- <onleft>50</onleft>
- <onright>601</onright>
- <onup>610</onup>
- <ondown>611</ondown>
- <onclick>ChannelDown</onclick>
- </control>
- <control type="button" id="601">
- <left>45</left>
- <top>2</top>
- <width>39</width>
- <height>39</height>
- <label>-</label>
- <texturefocus>OSDChannelDownFO.png</texturefocus>
- <texturenofocus>OSDChannelDownNF.png</texturenofocus>
- <onleft>600</onleft>
- <onright>603</onright>
- <onup>610</onup>
- <ondown>611</ondown>
- <onclick>ChannelUp</onclick>
- </control>
- <control type="button" id="603">
- <left>85</left>
- <top>2</top>
- <width>39</width>
- <height>39</height>
- <label>-</label>
- <texturefocus>OSDStopFO.png</texturefocus>
- <texturenofocus>OSDStopNF.png</texturenofocus>
- <onleft>601</onleft>
- <onright>604</onright>
- <onup>610</onup>
- <ondown>611</ondown>
- <onclick>down</onclick>
- <onclick>PlayerControl(Stop)</onclick>
- </control>
- <control type="togglebutton" id="604">
- <left>125</left>
- <top>2</top>
- <width>39</width>
- <height>39</height>
- <label>-</label>
- <texturefocus>OSDPauseFO.png</texturefocus>
- <texturenofocus>OSDPauseNF.png</texturenofocus>
- <usealttexture>Player.Paused | Player.Forwarding | Player.Rewinding</usealttexture>
- <alttexturefocus>OSDPlayFO.png</alttexturefocus>
- <alttexturenofocus>OSDPlayNF.png</alttexturenofocus>
- <onleft>603</onleft>
- <onright>605</onright>
- <onup>610</onup>
- <ondown>606</ondown>
- <onback>50</onback>
- <onclick>PlayerControl(Play)</onclick>
- <enable>Player.PauseEnabled</enable>
- <animation effect="fade" start="100" end="30" time="75" condition="!Player.PauseEnabled">Conditional</animation>
- </control>
- <control type="button" id="605">
- <left>165</left>
- <top>2</top>
- <width>39</width>
- <height>39</height>
- <label>-</label>
- <texturefocus>OSDRecordOffFO.png</texturefocus>
- <texturenofocus>OSDRecordOffNF.png</texturenofocus>
- <onleft>604</onleft>
- <onright>606</onright>
- <onup>610</onup>
- <ondown>611</ondown>
- <onclick>PlayerControl(record)</onclick>
- <enable>Player.CanRecord</enable>
- <animation effect="fade" start="100" end="30" time="75" condition="!Player.CanRecord">Conditional</animation>
- </control>
- <control type="button" id="606">
- <left>205</left>
- <top>2</top>
- <width>39</width>
- <height>39</height>
- <label>-</label>
- <visible>RDS.HasRadiotextPlus</visible>
- <texturefocus>OSDRadioRDSFO.png</texturefocus>
- <texturenofocus>OSDRadioRDSNF.png</texturenofocus>
- <onleft>605</onleft>
- <onright>50</onright>
- <onup>610</onup>
- <ondown>611</ondown>
- <onclick>ActivateWindow(PVRRadioRDSInfo)</onclick>
- </control>
- <control type="button" id="606">
- <left>205</left>
- <top>2</top>
- <width>39</width>
- <height>39</height>
- <label>-</label>
- <visible>!RDS.HasRadiotextPlus</visible>
- <texturefocus>OSDChannelListFO.png</texturefocus>
- <texturenofocus>OSDChannelListNF.png</texturenofocus>
- <onleft>605</onleft>
+ <control type="grouplist" id="9006">
+ <width>250</width>
+ <height>45</height>
+ <itemgap>1</itemgap>
+ <orientation>horizontal</orientation>
<onright>50</onright>
+ <onback>50</onback>
<onup>610</onup>
<ondown>611</ondown>
- <onclick>ActivateWindow(PVRGuideInfo)</onclick>
+ <control type="button" id="600">
+ <width>39</width>
+ <height>39</height>
+ <label>-</label>
+ <texturefocus>OSDChannelUPFO.png</texturefocus>
+ <texturenofocus>OSDChannelUPNF.png</texturenofocus>
+ <onclick>ChannelDown</onclick>
+ </control>
+ <control type="button" id="601">
+ <width>39</width>
+ <height>39</height>
+ <label>-</label>
+ <texturefocus>OSDChannelDownFO.png</texturefocus>
+ <texturenofocus>OSDChannelDownNF.png</texturenofocus>
+ <onclick>ChannelUp</onclick>
+ </control>
+ <control type="button" id="603">
+ <width>39</width>
+ <height>39</height>
+ <label>-</label>
+ <texturefocus>OSDStopFO.png</texturefocus>
+ <texturenofocus>OSDStopNF.png</texturenofocus>
+ <onclick>down</onclick>
+ <onclick>PlayerControl(Stop)</onclick>
+ </control>
+ <control type="togglebutton" id="604">
+ <width>39</width>
+ <height>39</height>
+ <label>-</label>
+ <texturefocus>OSDPauseFO.png</texturefocus>
+ <texturenofocus>OSDPauseNF.png</texturenofocus>
+ <usealttexture>Player.Paused | Player.Forwarding | Player.Rewinding</usealttexture>
+ <alttexturefocus>OSDPlayFO.png</alttexturefocus>
+ <alttexturenofocus>OSDPlayNF.png</alttexturenofocus>
+ <onclick>PlayerControl(Play)</onclick>
+ <enable>Player.PauseEnabled</enable>
+ <animation effect="fade" start="100" end="30" time="75" condition="!Player.PauseEnabled">Conditional</animation>
+ </control>
+ <control type="button" id="605">
+ <width>39</width>
+ <height>39</height>
+ <label>-</label>
+ <texturefocus>OSDRecordOffFO.png</texturefocus>
+ <texturenofocus>OSDRecordOffNF.png</texturenofocus>
+ <onclick>PlayerControl(record)</onclick>
+ <enable>Player.CanRecord</enable>
+ <animation effect="fade" start="100" end="30" time="75" condition="!Player.CanRecord">Conditional</animation>
+ </control>
+ <control type="button" id="606">
+ <width>39</width>
+ <height>39</height>
+ <label>-</label>
+ <visible>RDS.HasRadiotextPlus</visible>
+ <texturefocus>OSDRadioRDSFO.png</texturefocus>
+ <texturenofocus>OSDRadioRDSNF.png</texturenofocus>
+ <onclick>ActivateWindow(PVRRadioRDSInfo)</onclick>
+ </control>
+ <control type="button" id="622">
+ <width>39</width>
+ <height>39</height>
+ <label>-</label>
+ <visible>!RDS.HasRadiotextPlus</visible>
+ <texturefocus>OSDChannelListFO.png</texturefocus>
+ <texturenofocus>OSDChannelListNF.png</texturenofocus>
+ <onclick>ActivateWindow(PVRGuideInfo)</onclick>
+ </control>
</control>
</control>
- <control type="group" id="9005">
+ <control type="group" id="90050">
<visible>Player.HasMedia</visible>
<visible>!VideoPlayer.Content(LiveTV)</visible>
<include>VisibleFadeEffect</include>
- <width>250</width>
<height>45</height>
- <defaultcontrol always="true">603</defaultcontrol>
- <control type="button" id="600">
- <left>5</left>
- <top>2</top>
- <width>39</width>
- <height>39</height>
- <label>-</label>
- <texturefocus>OSDPrevTrackFO.png</texturefocus>
- <texturenofocus>OSDPrevTrackNF.png</texturenofocus>
- <onleft>50</onleft>
- <onright>606</onright>
- <onup>610</onup>
- <ondown>611</ondown>
+ <control type="grouplist" id="9005">
+ <width>250</width>
+ <height>45</height>
+ <itemgap>1</itemgap>
+ <orientation>horizontal</orientation>
+ <onright>50</onright>
<onback>50</onback>
- <onclick>PlayerControl(Previous)</onclick>
- </control>
- <control type="button" id="606">
- <left>45</left>
- <top>2</top>
- <width>39</width>
- <height>39</height>
- <label>-</label>
- <texturefocus>OSDRewindFO.png</texturefocus>
- <texturenofocus>OSDRewindNF.png</texturenofocus>
- <onleft>600</onleft>
- <onright>603</onright>
<onup>610</onup>
<ondown>611</ondown>
- <onback>50</onback>
- <onclick>PlayerControl(Rewind)</onclick>
- <visible>Window.IsVisible(MusicPlaylist) | Window.IsVisible(VideoPlaylist) | Player.HasVideo</visible>
- </control>
- <control type="group">
- <animation effect="slide" start="0,0" end="40,0" time="0" condition="Window.IsVisible(MusicPlaylist) | Window.IsVisible(VideoPlaylist) | Player.HasVideo">Conditional</animation>
- <control type="togglebutton" id="603">
- <left>45</left>
- <top>2</top>
+ <defaultcontrol always="true">603</defaultcontrol>
+ <control type="button" id="700">
+ <width>39</width>
+ <height>39</height>
+ <label>-</label>
+ <texturefocus>OSDPrevTrackFO.png</texturefocus>
+ <texturenofocus>OSDPrevTrackNF.png</texturenofocus>
+ <onclick>PlayerControl(Previous)</onclick>
+ </control>
+ <control type="button" id="706">
+ <width>39</width>
+ <height>39</height>
+ <label>-</label>
+ <texturefocus>OSDRewindFO.png</texturefocus>
+ <texturenofocus>OSDRewindNF.png</texturenofocus>
+ <onclick>PlayerControl(Rewind)</onclick>
+ <visible>Window.IsVisible(MusicPlaylist) | Window.IsVisible(VideoPlaylist) | Player.HasVideo</visible>
+ </control>
+ <control type="togglebutton" id="703">
<width>39</width>
<height>39</height>
<label>-</label>
@@ -974,89 +930,50 @@
<usealttexture>Player.Paused | Player.Forwarding | Player.Rewinding</usealttexture>
<alttexturefocus>OSDPlayFO.png</alttexturefocus>
<alttexturenofocus>OSDPlayNF.png</alttexturenofocus>
- <onleft>606</onleft>
- <onright>601</onright>
- <onup>610</onup>
- <ondown>611</ondown>
- <onback>50</onback>
<onclick>PlayerControl(Play)</onclick>
</control>
- <control type="button" id="601">
- <left>85</left>
- <top>2</top>
+ <control type="button" id="701">
<width>39</width>
<height>39</height>
<label>-</label>
<texturefocus>OSDStopFO.png</texturefocus>
<texturenofocus>OSDStopNF.png</texturenofocus>
- <onleft>603</onleft>
- <onright>607</onright>
- <onup>610</onup>
- <ondown>611</ondown>
- <onback>50</onback>
<onclick>down</onclick>
<onclick>PlayerControl(Stop)</onclick>
</control>
- <control type="button" id="607">
- <left>125</left>
- <top>2</top>
+ <control type="button" id="707">
<width>39</width>
<height>39</height>
<label>-</label>
<texturefocus>OSDForwardFO.png</texturefocus>
<texturenofocus>OSDForwardNF.png</texturenofocus>
- <onleft>601</onleft>
- <onright>602</onright>
- <onup>610</onup>
- <ondown>611</ondown>
- <onback>50</onback>
<onclick>PlayerControl(Forward)</onclick>
<visible>Window.IsVisible(MusicPlaylist) | Window.IsVisible(VideoPlaylist) | Player.HasVideo</visible>
</control>
- <control type="button" id="602">
- <left>125</left>
- <top>2</top>
+ <control type="button" id="702">
<width>39</width>
<height>39</height>
<label>-</label>
<texturefocus>OSDNextTrackFO.png</texturefocus>
<texturenofocus>OSDNextTrackNF.png</texturenofocus>
- <onleft>607</onleft>
- <onright>604</onright>
- <onup>610</onup>
- <ondown>611</ondown>
- <onback>50</onback>
<onclick>PlayerControl(Next)</onclick>
- <animation effect="slide" start="0,0" end="40,0" time="0" condition="Window.IsVisible(MusicPlaylist) | Window.IsVisible(VideoPlaylist) | Player.HasVideo">Conditional</animation>
</control>
- </control>
- <control type="group">
- <visible>!Window.IsVisible(MusicPlaylist) + !Window.IsVisible(VideoPlaylist) + !Player.HasVideo</visible>
- <control type="button" id="604">
- <left>165</left>
- <top>2</top>
+ <control type="button" id="704">
<width>39</width>
<height>39</height>
<label>-</label>
<texturefocus>-</texturefocus>
<texturenofocus>-</texturenofocus>
<onclick>PlayerControl(Repeat)</onclick>
- <onleft>602</onleft>
- <onright>605</onright>
- <onup>610</onup>
- <ondown>611</ondown>
- <onback>50</onback>
+ <visible>!Window.IsVisible(MusicPlaylist) + !Window.IsVisible(VideoPlaylist) + !Player.HasVideo</visible>
</control>
- <control type="image">
- <left>165</left>
- <top>2</top>
+ <control type="image" id="713">
<width>39</width>
<height>39</height>
<texture>$VAR[PlayerControlsRepeatImageVar]</texture>
+ <visible>!Window.IsVisible(MusicPlaylist) + !Window.IsVisible(VideoPlaylist) + !Player.HasVideo</visible>
</control>
- <control type="togglebutton" id="605">
- <left>205</left>
- <top>2</top>
+ <control type="togglebutton" id="705">
<width>39</width>
<height>39</height>
<label>-</label>
@@ -1066,11 +983,7 @@
<alttexturefocus>OSDRandomOnFO.png</alttexturefocus>
<alttexturenofocus>OSDRandomOnNF.png</alttexturenofocus>
<onclick>PlayerControl(Random)</onclick>
- <onleft>604</onleft>
- <onright>50</onright>
- <onup>610</onup>
- <ondown>611</ondown>
- <onback>50</onback>
+ <visible>!Window.IsVisible(MusicPlaylist) + !Window.IsVisible(VideoPlaylist) + !Player.HasVideo</visible>
</control>
</control>
</control>
diff --git a/addons/skin.confluence/720p/script-cu-lrclyrics-main.xml b/addons/skin.confluence/720p/script-cu-lrclyrics-main.xml
index 682826911c..06f29d3ec7 100644
--- a/addons/skin.confluence/720p/script-cu-lrclyrics-main.xml
+++ b/addons/skin.confluence/720p/script-cu-lrclyrics-main.xml
@@ -7,7 +7,7 @@
<include>dialogeffect</include>
<controls>
<control type="group">
- <depth>DepthOSDPopout</depth>
+ <depth>DepthSideBlade</depth>
<control type="image">
<description>background image</description>
<left>0</left>
diff --git a/addons/skin.confluence/720p/script-globalsearch-main.xml b/addons/skin.confluence/720p/script-globalsearch-main.xml
index 9809708348..d93c7eee19 100644
--- a/addons/skin.confluence/720p/script-globalsearch-main.xml
+++ b/addons/skin.confluence/720p/script-globalsearch-main.xml
@@ -4,6 +4,7 @@
<left>0</left>
<top>0</top>
</coordinates>
+ <depth>DepthDialog</depth>
<controls>
<control type="group" id="100">
<include>VisibleFadeEffect</include>
diff --git a/addons/skin.confluence/addon.xml b/addons/skin.confluence/addon.xml
index b43843bd87..a182858a0a 100644
--- a/addons/skin.confluence/addon.xml
+++ b/addons/skin.confluence/addon.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<addon
id="skin.confluence"
- version="2.8.0"
+ version="2.8.2"
name="Confluence"
provider-name="Jezz_X, Team Kodi">
<requires>
@@ -17,13 +17,13 @@
<summary lang="af_ZA">Confluence tema deur Jezz_X. (Kodi se standaard tema)</summary>
<summary lang="ar_SA">جلد "كونÙليونس" من صنع Jezz_x. (الجلد المبدأى لبرنامج إكس بى إم سى)</summary>
<summary lang="be_BY">Confluence skin by Jezz_X. (Kodi's default skin)</summary>
- <summary lang="bg_BG">Облик от Jezz_X. (ÑÑ‚Ð°Ð½Ð´Ð°Ñ€Ñ‚Ð½Ð¸Ñ Ð·Ð° Kodi)</summary>
+ <summary lang="bg_BG">Confluence облик от Jezz_X. (ÑÑ‚Ð°Ð½Ð´Ð°Ñ€Ñ‚Ð½Ð¸Ñ Ð¾Ð±Ð»Ð¸Ðº за Kodi)</summary>
<summary lang="ca_ES">Pell Confluence, per Jezz_X. (Pell per defecte del Kodi)</summary>
<summary lang="cs_CZ">Vzhled Confluence od Jezz_X. (výchozí vzhled Kodi)</summary>
<summary lang="cy_GB">Croen Confluence gan Jezz_X. (Croen rhagosodedig Kodi)</summary>
<summary lang="da_DK">Confluence skin af Jezz_X. (Kodi's standardskin)</summary>
<summary lang="de_DE">Confluence Skin von Jezz_X. (Standard-Skin von Kodi)</summary>
- <summary lang="el_GR">Το κέλυφος Confluence από τον Jezz_X (Ï€Ïοεπιλεγμένο κέλυφος του Kodi).</summary>
+ <summary lang="el_GR">Η αμφίεση Confluence από τον Jezz_X (Ï€Ïοεπιλεγμένη αμφίεση Kodi).</summary>
<summary lang="en_AU">Confluence skin by Jezz_X. (Kodi's default skin)</summary>
<summary lang="en_GB">Confluence skin by Jezz_X. (Kodi's default skin)</summary>
<summary lang="en_NZ">Confluence skin by Jezz_X. (Kodi's default skin)</summary>
@@ -36,7 +36,7 @@
<summary lang="fi_FI">Confluence-ulkoasu Jezz_X:ltä. (Kodi:n oletus ulkoasu)</summary>
<summary lang="fo_FO">Confluence útsjónd av Jezz_X. (Kodi's vanliga útsjónd)</summary>
<summary lang="fr_CA">Habillage Confluence par Jezz_X. (habillage par défaut de Kodi)</summary>
- <summary lang="fr_FR">Confluence par Jezz_X. (Habillage prédéfini de Kodi)</summary>
+ <summary lang="fr_FR">Confluence par Jezz_X. (thème par défaut de Kodi)</summary>
<summary lang="gl_ES">Pel Confluence por Jezz_Z. (Pel predefinida do Kodi)</summary>
<summary lang="he_IL">המעטפת Confluence של Jezz_X. (ברירת המחדל של Kodi)</summary>
<summary lang="hr_HR">Confluence presvlaka autora Jezz_X. (uobiÄajena Kodi presvlaka)</summary>
@@ -51,6 +51,7 @@
<summary lang="lv_LV">Confluence apvalks no Jeez_X. (Kodi noklusētais apvalks)</summary>
<summary lang="mk_MK">Confluence skin by Jezz_X. (Kodi's default skin)</summary>
<summary lang="ms_MY">Penyatuan, kulit daripada Jezz_X. (Kulit lalai Kodi)</summary>
+ <summary lang="mt_MT">Dehra Confluence magħmula minn Jezz_X. (Id-dehra normali ta' Kodi)</summary>
<summary lang="nb_NO">Confluence-skall av Jezz_X. (Kodis standardskall)</summary>
<summary lang="nl_NL">Confluence skin door Jezz_X. (Kodi's standaard skin)</summary>
<summary lang="pl_PL">Confluence autorstwa Jezz_X (domyślna skóra Kodi)</summary>
@@ -81,7 +82,7 @@
<description lang="cy_GB">Confluence yw croen rhagosodedig Kodi 9.11 ac uwch. Mae'n gyfuniad o gysyniadau o nifer o grwyn poblogaidd ac mae'n ymdrechu i gyfuno eu syniadau da hwy i groen ddylai fod yn hawdd i ddefnyddiwr cyntaf Kodi ei deall a'i ddefnyddio.</description>
<description lang="da_DK">Confluence er standardskin'et til Kodi 9.11 og senere versioner. Det er en kombination af koncepter fra mange populære skins, og det forsøger at omfavne og integrere de gode ideer i et skin, der er let for førstegangsbrugere af Kodi at forstå og bruge.</description>
<description lang="de_DE">Confluence ist der Standardskin ab Kodi 14.0. Er ist eine Kombination mehrerer unterschiedlicher Skin-Konzepte und versucht dabei, die besten Ideen zu kombinieren, um einen einfachen Einstieg für neue Kodi-Nutzer zu ermöglichen.</description>
- <description lang="el_GR">Το Confluence είναι το Ï€Ïοεπιλεγμένο κέλυφος για τις εκδόσεις Kodi 9.11 και άνω. Είναι ένας συνδυασμός από πολλά δημοφιλή κελÏφη, και επιχειÏεί να συμπεÏιλάβει τις καλÏτεÏες ιδέες τους σε ένα κέλυφος το οποίο είναι εÏκολο σε αÏχάÏιους χÏήστες του Kodi να κατανοήσουν και χÏησιμοποιήσουν.</description>
+ <description lang="el_GR">Το Confluence είναι η Ï€Ïοεπιλεγμένη αμφίεση για τις εκδόσεις Kodi 14.0 και άνω. Είναι ένας συνδυασμός από πολλές δημοφιλής αμφιέσεις, και επιχειÏεί να παÏέχει τις καλÏτεÏες ιδέες τους σε μία αμφίεση, το οποίο είναι εÏκολο για τους αÏχάÏιους χÏήστες του Kodi να κατανοήσουν και να χÏησιμοποιήσουν.</description>
<description lang="en_AU">Confluence is the default skin for Kodi 9.11 and above. It is a combination of concepts from many popular skins, and attempts to embrace and integrate their good ideas into a skin that should be easy for first time Kodi users to understand and use.</description>
<description lang="en_GB">Confluence is the default skin for Kodi 14.0 and above. It is a combination of concepts from many popular skins, and attempts to embrace and integrate their good ideas into a skin that should be easy for first time Kodi users to understand and use.</description>
<description lang="en_NZ">Confluence is the default skin for Kodi 9.11 and above. It is a combination of concepts from many popular skins, and attempts to embrace and integrate their good ideas into a skin that should be easy for first time Kodi users to understand and use.</description>
@@ -94,7 +95,7 @@
<description lang="fi_FI">Confluence on oletusulkoasu Kodi:n versiosta 9.11 lähtien. Se on yhdistelmä useiden suosittujen ulkoasujen konsepteista, ja yritys omaksua ja integroida heidän hyvät ideat ulkoasuun, jonka pitäisi olla helppokäyttöinen ja -tajuinen kaikille Kodi:n käyttäjille.</description>
<description lang="fo_FO">Confluence er vanliga útsjóndin, sum er brúkt í Kodi síðan útg. 9.11. Hetta er ein samansjóðan av fleiri hugtøkum. Ætlanin er at útsjóndin skal lætta um móttøku og nýtslu av Kodi fyri nýggjar brúkarar.</description>
<description lang="fr_CA">Confluence est l'habillage par défaut pour Kodi 9.11 et ultérieur. C'est une combinaison des concepts issus de plusieurs habillages populaires et une tentative d'inclure et d'intégrer leurs bonnes idées en un habillage qui devrait être facile à comprendre et à utiliser pour les utilisateurs débutants de Kodi.</description>
- <description lang="fr_FR">Confluence est l'habillage prédéfini depuis Kodi 14.0. Reprenant les concepts issus de plusieurs thèmes populaires, il est une tentative d'inclusion et d'intégration des meilleures idées afin de créer un habillage qui soit facile à comprendre et à utiliser pour les personnes découvrant Kodi.</description>
+ <description lang="fr_FR">Confluence est le thème par défaut depuis Kodi 14.0. Reprenant les concepts issus de plusieurs thèmes populaires, il est une tentative d'inclusion et d'intégration des meilleures idées afin de créer un habillage d'interface qui soit facile à comprendre et à utiliser pour les personnes découvrant Kodi.</description>
<description lang="gl_ES">Confluence é a pel predeterminada para Kodi 9.11 e posteriores. É unha combinación de conceptos de algunhas peles populares, e tenta abranguer e integrar as súas mellores ideas nunha pel que sexa fácil de entender e utilizar para as usuarias que utilizan por primeira vez Kodi.</description>
<description lang="he_IL">המעטפת Confluence ×”×™× ×ž×¢×˜×¤×ª ברירת המחדל של Kodi. המעטפת ×”×™× ×” תוצר של ×ימוץ מ××¤×™×™× ×™× ×ž×ž×¢×˜×¤×•×ª פופולריות רבות תוך רצון לשלב מ××¤×™×™× ×™× ×לה למעטפת פשוטה לשימוש ולהכרה ר×שונית ×¢"×™ משתמשי Kodi חדשי×.</description>
<description lang="hr_HR">Confluence je uobiÄajena presvlaka za Kodi 14.0 naviÅ¡e. To je mjeÅ¡avina koncepta iz mnogih drugih popularnih presvlaka, pokuÅ¡aj da se objedine njihove dobre osobine u presvlaku i da budu lagane za upotrebu i razumljive novim Kodi korisnicima.</description>
@@ -108,6 +109,7 @@
<description lang="lv_LV">Confluence ir Kodi 9.11 un jaunÄku versiju noklusÄ“tais apvalks. TajÄ apvienota daudzu populÄru apvalku koncepcija un centieni pieņemt un integrÄ“t labÄkÄs idejas, lai jaunajiem Kodi ietotÄjiem to bÅ«tu viegli izprast un lietot.</description>
<description lang="mk_MK">Confluence е оÑновниот изглед на Kodi 14.0 и нагоре. Тој е комбинација на концепти од повеќе популарни изгледи, и наÑтојува да ги обедини и иÑтакне нивните добри идеи во еден изглед разбирлив за почетници.</description>
<description lang="ms_MY">Penyatuan ialah kulit lalai untuk Kodi 9.11 dan ke atas. Ia merupakan gabungan konsep dari pelbagai kulit terkenal, dan berusaha untuk merangkumkan dan menyepadukan idea baik kulit-kulit tersebut menjadi satu kulit yang mudah difahami dan digunakan oleh pengguna baru Kodi .</description>
+ <description lang="mt_MT">Confluence hija d-dehra normali ta' Kodi 14.0 il-fuq. Hija taħlita ta' kunċetti minn ħafna dehriet popolari, u tipporva tgħaqqad u tintegra l-aqwa ideat tagħhom f'dehra li għandha tkun faċli biex jifmuha u jużawha dawk l-utenti li qed jużaw Kodi għall-ewwel darba.</description>
<description lang="nb_NO">Confluence er standardskallet for Kodi 9.11 og oppover. Det er en kombinasjon av konseptene fra mange populære skall, og prøver å omfavne og integrere de gode idéene i et skall som bør være lett å forstå og benytte seg av for nye Kodi-brukere.</description>
<description lang="nl_NL">Confluence is de standaard skin voor Kodi 15.0 en hoger. Het combineert de concepten van andere populaire skins, waarbij het tracht hun goede ideeën te integreren in een skin die gemakkelijk in gebruik is.</description>
<description lang="pl_PL">Confluence jest domyślną skóra dla Kodi w wersji 14.0 lub nowszych. Jest kombinacją pomysłów z wielu popularnych skór i próbą zawarcia tego, co w nich najlepsze w skórze, która będzie łatwa do opanowania dla początkującego użytkownika.</description>
@@ -138,7 +140,7 @@
<disclaimer lang="cy_GB">Confluence yw croen rhagosodedig Kodi, gall ei dynnu achosi anhawsterau</disclaimer>
<disclaimer lang="da_DK">Confluence er standardskin'et til Kodi. Fjernes det, kan der opstå problemer</disclaimer>
<disclaimer lang="de_DE">Confluence ist der Standard-Skin für Kodi. Die Deinstallation kann zu unerwünschten Nebeneffekten führen.</disclaimer>
- <disclaimer lang="el_GR">Το Confluence είναι το Ï€Ïοεπιλεγμένο κέλυφος για το Kodi, η αφαίÏεσή του μποÏεί να δημιουÏγήσει Ï€Ïοβλήματα</disclaimer>
+ <disclaimer lang="el_GR">Το Confluence είναι η Ï€Ïοεπιλεγμένη αμφίεση για το Kodi, η αφαίÏεσή του μποÏεί να δημιουÏγήσει Ï€Ïοβλήματα</disclaimer>
<disclaimer lang="en_AU">Confluence is the default skin for Kodi, removing it may cause issues</disclaimer>
<disclaimer lang="en_GB">Confluence is the default skin for Kodi, removing it may cause issues</disclaimer>
<disclaimer lang="en_NZ">Confluence is the default skin for Kodi, removing it may cause issues</disclaimer>
@@ -151,20 +153,21 @@
<disclaimer lang="fi_FI">Confluence on Kodi:n oletusulkoasu, sen poistaminen saattaa aiheuttaa ongelmia</disclaimer>
<disclaimer lang="fo_FO">Confluence er vanliga útsjónding brúkt av Kodi. Strikan kann viðføra brek.</disclaimer>
<disclaimer lang="fr_CA">Confluence est l'habillage par défaut de Kodi, le supprimer peut créer des problèmes</disclaimer>
- <disclaimer lang="fr_FR">Confluence est l'habillage prédéfini de Kodi, le supprimer peut créer des problèmes</disclaimer>
- <disclaimer lang="gl_ES">Confluence é a pel predefinida para Kodi e eliminala pode causas problemas.</disclaimer>
+ <disclaimer lang="fr_FR">Confluence est le thème par défaut de Kodi, le supprimer peut créer des problèmes</disclaimer>
+ <disclaimer lang="gl_ES">Confluence é a pel predefinida para Kodi e eliminala pode causar problemas.</disclaimer>
<disclaimer lang="he_IL">המעטפת Confluence ×”×™× ×ž×¢×˜×¤×ª ברירת המחדל של Kodi, הסרתה עלולה ×œ×’×¨×•× ×œ×ª×§×œ×•×ª</disclaimer>
<disclaimer lang="hr_HR">Confluence je uobiÄajena presvlaka za Kodi, njegovim uklanjanjem može uzrokovati poteÅ¡koće.</disclaimer>
<disclaimer lang="hu_HU">A Confluence az alapértelmezett Kodi felszín. Eltávolítása problémákat okozhat.</disclaimer>
<disclaimer lang="id_ID">Confluence merupakan skin bawaan untuk Kodi, menghapusnya mungkin menyebabkan permasalahan</disclaimer>
<disclaimer lang="is_IS">Confluence er sjálfgefið útlit Kodi, það getur orsakað vandamál að fjarlægja það.</disclaimer>
- <disclaimer lang="it_IT">Confluence è la Skin predefinita di Kodi, rimuoverla potrebbe comportare dei problemi</disclaimer>
+ <disclaimer lang="it_IT">Confluence è la skin predefinita di Kodi, rimuoverla potrebbe comportare dei problemi</disclaimer>
<disclaimer lang="ja_JP">Confluence 㯠Kodi ã®ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã‚¹ã‚­ãƒ³ã§ã™ã®ã§ã€ã“れを削除ã™ã‚‹ã¨ã†ã¾ãå‹•ã‹ãªããªã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™</disclaimer>
<disclaimer lang="ko_KR">Confluence는 Kodiì˜ ê¸°ë³¸ìŠ¤í‚¨ìœ¼ë¡œ 제거시 문제가 ìƒê¸¸ 수 있습니다.</disclaimer>
<disclaimer lang="lt_LT">Confluence yra numatytoji Kodi teminė išvaizda, jos pašalinimas gali sukelti problemų</disclaimer>
<disclaimer lang="lv_LV">Confluence ir Kodi noklusētais apvalks, dzēšot to, var rasties problēmas</disclaimer>
<disclaimer lang="mk_MK">Confluence е оÑновната маÑка, бришењето може да предизвика проблеми</disclaimer>
<disclaimer lang="ms_MY">Penyatuan ialah kulit lalai Kodi, mengubahnya boleh menimbulkan isu.</disclaimer>
+ <disclaimer lang="mt_MT">Confluence hija d-dehra normali ta' Kodi, jekk tneħħiha jaf ikollok il-problemi.</disclaimer>
<disclaimer lang="nb_NO">Confluence er standardskallet for Kodi, å fjerne det kan skape problemer</disclaimer>
<disclaimer lang="nl_NL">Confluence is de standaard Kodi skin, het verwijderen van Confluence kan leiden tot problemen.</disclaimer>
<disclaimer lang="pl_PL">Confluence jest domyślną skórą Kodi. Jej usunięcie może powodować problemy.</disclaimer>
diff --git a/addons/skin.confluence/changelog.txt b/addons/skin.confluence/changelog.txt
index 0660497573..309df9d43c 100644
--- a/addons/skin.confluence/changelog.txt
+++ b/addons/skin.confluence/changelog.txt
@@ -1,3 +1,11 @@
+[B]2.8.2[/B]
+
+- Updated language files from Transifex
+
+[B]2.8.1[/B]
+
+- Updated language files from Transifex
+
[B]2.7.3[/B]
- Updated language files from Transifex
diff --git a/addons/skin.confluence/language/resource.language.af_za/strings.po b/addons/skin.confluence/language/resource.language.af_za/strings.po
index ac87074fc9..c71a74ba3f 100644
--- a/addons/skin.confluence/language/resource.language.af_za/strings.po
+++ b/addons/skin.confluence/language/resource.language.af_za/strings.po
@@ -144,14 +144,6 @@ msgctxt "#31112"
msgid "Options"
msgstr "Opsies"
-msgctxt "#31126"
-msgid "Play TV theme songs in video library (TvTunes add-on)"
-msgstr "Speel TV tema musiek in video lys (TvTunes byvoegsel)"
-
-msgctxt "#31127"
-msgid "TvTunes"
-msgstr "TvMelodie"
-
msgctxt "#31128"
msgid "Lyrics"
msgstr "Lirieke"
@@ -244,10 +236,6 @@ msgctxt "#31401"
msgid "[B]CONFIGURE VIDEO SETTINGS[/B][CR][CR]Manage your video library · Set video playback options · Change video listing options[CR]Set subtitle fonts"
msgstr "[B]KONFIGUREER VIDEO VERSTELLINGS[/B][CR][CR]Beheer jou video lys · Stel video terugspeel opsies · Verander video lys opsies[CR]Stel onderskrif font"
-msgctxt "#31402"
-msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission · Set karaoke options"
-msgstr "[B]KONFIGUREER MUSIEK VERSTELLINGS[/B][CR][CR]Beheer jou musiek lys · Stel musiek speel opsies · Verander musiek lys opsies[CR]Stel liedjie voorlegging op · Stel kareoke opsies"
-
msgctxt "#31406"
msgid "[B]CONFIGURE SYSTEM SETTINGS[/B][CR][CR]Setup and calibrate displays · Configure audio output · Setup remote controls[CR]Set power saving options · Enable debugging · Setup master lock"
msgstr "[B]KONFIGUREER STELSEL VERSTELLINGS[/B][CR][CR]Stel op en kalibreer skerms · Konfigureer klank uitvoer · Stel afstandbeheerders op[CR]Stel krag bespaar opsies · Stel ontfouting in staat · Stel hoof slot op"
diff --git a/addons/skin.confluence/language/resource.language.ar_sa/strings.po b/addons/skin.confluence/language/resource.language.ar_sa/strings.po
index fb9cf27604..874be5de3d 100644
--- a/addons/skin.confluence/language/resource.language.ar_sa/strings.po
+++ b/addons/skin.confluence/language/resource.language.ar_sa/strings.po
@@ -144,14 +144,6 @@ msgctxt "#31112"
msgid "Options"
msgstr "إعدادات"
-msgctxt "#31126"
-msgid "Play TV theme songs in video library (TvTunes add-on)"
-msgstr "(TvTunes ملحق) تشغيل أغاني سمة التلÙزيون ÙÙŠ مكتبة الÙيديو"
-
-msgctxt "#31127"
-msgid "TvTunes"
-msgstr "TvTunes"
-
msgctxt "#31128"
msgid "Lyrics"
msgstr "كلمات الأغاني"
@@ -244,10 +236,6 @@ msgctxt "#31401"
msgid "[B]CONFIGURE VIDEO SETTINGS[/B][CR][CR]Manage your video library · Set video playback options · Change video listing options[CR]Set subtitle fonts"
msgstr "[B]ضبط إعدادات المقاطع المرئيه[/B][CR][CR]ضبط إعدادات مكتبات المقاطع المرئيه - ضبط إعدادات تشغيل المقاطع المرئيه - تغيير إعدادات قوائم المقاطع المرئيه[CR]ضبط الترجمات"
-msgctxt "#31402"
-msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission · Set karaoke options"
-msgstr "[B]ضبط إعدادات الموسيقى[/B][CR][CR]ضبط مكتبات الموسيقى · ضبط إعدادات تشغيل الموسيقى · ضبط إعدادات قائمه الموسيقى[CR]ضبط إعدادات إذاعه الموسيقى - ضبط إعدادات الكارويوكي"
-
msgctxt "#31406"
msgid "[B]CONFIGURE SYSTEM SETTINGS[/B][CR][CR]Setup and calibrate displays · Configure audio output · Setup remote controls[CR]Set power saving options · Enable debugging · Setup master lock"
msgstr "[B]ضبط إعدادات النظام[/B][CR][CR]ضبط ومعايره Ø·ÙرÙÙ‚ العرض - ضبط مخارج الصوت - ضبط التحكم عن بعد[CR]ضبط إعدادات توÙير الطاقه - ضبط وضع المعالجه - ضبط القÙÙ„ الرئيسى"
diff --git a/addons/skin.confluence/language/resource.language.be_by/strings.po b/addons/skin.confluence/language/resource.language.be_by/strings.po
index 5f9815b6b7..dbd3cb9f30 100644
--- a/addons/skin.confluence/language/resource.language.be_by/strings.po
+++ b/addons/skin.confluence/language/resource.language.be_by/strings.po
@@ -140,14 +140,6 @@ msgctxt "#31112"
msgid "Options"
msgstr "Options"
-msgctxt "#31126"
-msgid "Play TV theme songs in video library (TvTunes add-on)"
-msgstr "Play TV theme songs in video library (TvTunes add-on)"
-
-msgctxt "#31127"
-msgid "TvTunes"
-msgstr "TvTunes"
-
msgctxt "#31128"
msgid "Lyrics"
msgstr "Lyrics"
@@ -228,10 +220,6 @@ msgctxt "#31401"
msgid "[B]CONFIGURE VIDEO SETTINGS[/B][CR][CR]Manage your video library · Set video playback options · Change video listing options[CR]Set subtitle fonts"
msgstr "[B]ЗЬМЯÐІЦЬ ÐÐЛÐДЫ ВІДЭÐ[/B][CR][CR]Кіраваць бібліÑÑ‚Ñкай відÑа · ÐаÑтавіць налады Ð¿Ñ€Ð°Ð¹Ð³Ñ€Ð°Ð²Ð°Ð½ÑŒÐ½Ñ Ð²Ñ–Ð´Ñа · ЗьмÑніць налады ÑьпіÑу відÑа[CR]ÐаÑтавіць шрыфт Ñубтытраў"
-msgctxt "#31402"
-msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission · Set karaoke options"
-msgstr "[B]ЗЬМЯÐІЦЬ ÐÐЛÐДЫ МУЗЫКІ[/B][CR][CR]Кіраваць бібліÑÑ‚Ñкай музыкі · ÐаÑтавіць налады Ð¿Ñ€Ð°Ð¹Ð³Ñ€Ð°Ð²Ð°Ð½ÑŒÐ½Ñ Ð¼ÑƒÐ·Ñ‹ÐºÑ– · ЗьмÑніць налады ÑьпіÑу музыкі[CR]Ðаладзіць перадачу музыкі · ÐаÑтавіць налады караоке"
-
msgctxt "#31406"
msgid "[B]CONFIGURE SYSTEM SETTINGS[/B][CR][CR]Setup and calibrate displays · Configure audio output · Setup remote controls[CR]Set power saving options · Enable debugging · Setup master lock"
msgstr "[B]ЗЬМЯÐІЦЬ ÐÐЛÐДЫ СЫСТЭМЫ[/B][CR][CR]Ðаладзіць Ñ– калібраваць адлюÑтраваньне · ÐаÑтавіць аўдыё вывад · Ðаладзіць адлеглае кіраваньне[CR]ÐаÑтавіць захоўваньне ÑнÑргіі · Дазволіць дÑбаг · ÐаÑтавіць агульны замок"
diff --git a/addons/skin.confluence/language/resource.language.bg_bg/strings.po b/addons/skin.confluence/language/resource.language.bg_bg/strings.po
index 8efe0db36f..0e1dfc5646 100644
--- a/addons/skin.confluence/language/resource.language.bg_bg/strings.po
+++ b/addons/skin.confluence/language/resource.language.bg_bg/strings.po
@@ -22,12 +22,16 @@ msgstr "Променете вашите"
msgctxt "#31003"
msgid "Power options"
-msgstr "Изключи..."
+msgstr "ÐаÑтройки за захранване"
msgctxt "#31004"
msgid "Working..."
msgstr "Работи..."
+msgctxt "#31005"
+msgid "Hide information"
+msgstr "Скрий информациÑта"
+
msgctxt "#31006"
msgid "View options"
msgstr "Преглед на наÑтройките"
@@ -164,6 +168,10 @@ msgctxt "#31102"
msgid "Background"
msgstr "Фон"
+msgctxt "#31103"
+msgid "Show \"Paused\" in picture slideshow"
+msgstr "Показвай \"Ðа Пауза\" Ð¸Ð½Ð´Ð¸ÐºÐ°Ñ†Ð¸Ñ Ð¿Ñ€Ð¸ Ñлайдшоу от Ñнимки"
+
msgctxt "#31104"
msgid "Play trailers in a window [COLOR=grey3](Video information dialogue only)[/COLOR]"
msgstr "Възпроизвеждай трейлърите в прозореца [COLOR=grey3]Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð·Ð° видеото[/COLOR]"
@@ -220,14 +228,6 @@ msgctxt "#31125"
msgid "Show background \"Now playing\" visualisation"
msgstr "Ползвай за фон възпроизвежданата визуализациÑ"
-msgctxt "#31126"
-msgid "Play TV theme songs in video library (TvTunes add-on)"
-msgstr "Възпроизвеждай мелодии от ТВ Сериали в библиотеката (добавка TvTunes)"
-
-msgctxt "#31127"
-msgid "TvTunes"
-msgstr "TvTunes"
-
msgctxt "#31128"
msgid "Lyrics"
msgstr "Лирики"
@@ -306,7 +306,7 @@ msgstr "Скрий фен-арта"
msgctxt "#31308"
msgid "Movie details"
-msgstr "ПодробноÑти за филма"
+msgstr "Детайли за филма"
msgctxt "#31309"
msgid "Memory used:"
@@ -344,10 +344,6 @@ msgctxt "#31320"
msgid "Last logged in"
msgstr "ПоÑледно влизане"
-msgctxt "#31321"
-msgid "Karaoke song selector"
-msgstr "Прозорец за избор на караоке пеÑен"
-
msgctxt "#31322"
msgid "Aired"
msgstr "Излъчен"
@@ -378,7 +374,7 @@ msgstr "ÐатиÑнете бутона, за да започне[CR][CR]възÐ
msgctxt "#31331"
msgid "Album details"
-msgstr "ПодробноÑти за албума"
+msgstr "Детайли за албума"
msgctxt "#31351"
msgid "Pause"
@@ -436,10 +432,6 @@ msgctxt "#31401"
msgid "[B]CONFIGURE VIDEO SETTINGS[/B][CR][CR]Manage your video library · Set video playback options · Change video listing options[CR]Set subtitle fonts"
msgstr "[B]КОÐФИГУРИРÐЙТЕ ВИДЕОТО[/B][CR][CR]УправлÑвайте видео библиотеката Ñи · ÐаÑтройте възпроизвеждането на видео[CR]Променете наÑтройките на ÑпиÑъците Ñ Ð²Ð¸Ð´ÐµÐ¾ файлове · Задайте шрифт за Ñубтитрите"
-msgctxt "#31402"
-msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission · Set karaoke options"
-msgstr "[B]КОÐФИГУРИРÐЙТЕ МУЗИКÐТÐ[/B][CR][CR]УправлÑвайте музикалната Ñи библиотеката · ÐаÑтройте възпроизвеждането на музика[CR]Променете наÑтройките на ÑпиÑъците Ñ Ð°ÑƒÐ´Ð¸Ð¾ файлове · ÐаÑтройте караоке плеъра"
-
msgctxt "#31403"
msgid "[B]CONFIGURE PICTURE SETTINGS[/B][CR][CR]Set picture listing options · Configure slideshow"
msgstr "[B]КОÐФИГУРИРÐЙТЕ СÐИМКИТЕ[/B][CR][CR]Променете наÑтройките на ÑпиÑъците ÑÑŠÑ Ñнимки · Конфигурирайте презентациите"
@@ -492,6 +484,10 @@ msgctxt "#31423"
msgid "Select the profile that will be used at startup when the login screen is disabled."
msgstr "Изберете кой профил да Ñе ползва за влизане, когато екрана за впиÑване е изключен"
+msgctxt "#31501"
+msgid "Scheduled time"
+msgstr "График"
+
msgctxt "#31502"
msgid "TV"
msgstr "ТелевизиÑ"
@@ -516,6 +512,14 @@ msgctxt "#31509"
msgid "Channel group"
msgstr "Група канали"
+msgctxt "#31510"
+msgid "Timer set"
+msgstr "ÐаÑтройка на броÑча"
+
+msgctxt "#31511"
+msgid "Channel options"
+msgstr "ÐаÑтройки на канала"
+
msgctxt "#31901"
msgid "36-hour forecast"
msgstr "36 чаÑова прогноза"
diff --git a/addons/skin.confluence/language/resource.language.ca_es/strings.po b/addons/skin.confluence/language/resource.language.ca_es/strings.po
index b2b5d7e714..a2de1862ec 100644
--- a/addons/skin.confluence/language/resource.language.ca_es/strings.po
+++ b/addons/skin.confluence/language/resource.language.ca_es/strings.po
@@ -24,6 +24,10 @@ msgctxt "#31004"
msgid "Working..."
msgstr "Carregant..."
+msgctxt "#31005"
+msgid "Hide information"
+msgstr "Amaga la informació"
+
msgctxt "#31006"
msgid "View options"
msgstr "Mostra les opcions"
@@ -32,6 +36,10 @@ msgctxt "#31008"
msgid "Full screen"
msgstr "Pantalla completa"
+msgctxt "#31009"
+msgid "Total duration"
+msgstr "Duració total"
+
msgctxt "#31022"
msgid "Music - Files"
msgstr "Música - Fitxers"
@@ -48,14 +56,26 @@ msgctxt "#31025"
msgid "Items"
msgstr "Elements"
+msgctxt "#31026"
+msgid "Misc options"
+msgstr "Opcions vàries"
+
msgctxt "#31027"
msgid "Location"
msgstr "Ubicació"
+msgctxt "#31028"
+msgid "Poster wrap"
+msgstr "Embolcall del cartell"
+
msgctxt "#31029"
msgid "Fanart"
msgstr "Fanart"
+msgctxt "#31031"
+msgid "Pic thumbs"
+msgstr "Miniatures"
+
msgctxt "#31033"
msgid "Info"
msgstr "Info"
@@ -64,6 +84,10 @@ msgctxt "#31039"
msgid "Actions"
msgstr "Accions"
+msgctxt "#31040"
+msgid "Now playing"
+msgstr "S'està reproduint"
+
msgctxt "#31042"
msgid "PLAYING"
msgstr "REPRODUINT"
@@ -84,6 +108,10 @@ msgctxt "#31046"
msgid "SEEKING"
msgstr "S'ESTÀ CERCANT"
+msgctxt "#31048"
+msgid "Visualisation presets"
+msgstr "Visualitzacions preestablertes"
+
msgctxt "#31049"
msgid "End time"
msgstr "Hora de fi"
@@ -120,6 +148,10 @@ msgctxt "#31060"
msgid "This file is stacked, select the part you want to play from."
msgstr "Aquest fitxer està agrupat, seleccioneu la part que desitgeu reproduir."
+msgctxt "#31061"
+msgid "Current selected"
+msgstr "Selecció actual"
+
msgctxt "#31101"
msgid "Home screen options"
msgstr "Opcions de la pantalla principal"
@@ -128,10 +160,22 @@ msgctxt "#31102"
msgid "Background"
msgstr "Fons"
+msgctxt "#31103"
+msgid "Show \"Paused\" in picture slideshow"
+msgstr "Mostra \"Pausa\" en la presentació de diapositives"
+
+msgctxt "#31104"
+msgid "Play trailers in a window [COLOR=grey3](Video information dialogue only)[/COLOR]"
+msgstr "Reprodueix els tràilers en una finestra [COLOR=grey3](Només al diàleg d'informació de vídeo)[/COLOR]"
+
msgctxt "#31106"
msgid "Miscellaneous options"
msgstr "Opcions vàries"
+msgctxt "#31108"
+msgid "Hide main menu buttons"
+msgstr "Amaga els botons del menú principal"
+
msgctxt "#31109"
msgid "Enable custom background"
msgstr "Habilita el fons personalitzat"
@@ -148,18 +192,46 @@ msgctxt "#31112"
msgid "Options"
msgstr "Opcions"
-msgctxt "#31126"
-msgid "Play TV theme songs in video library (TvTunes add-on)"
-msgstr "Reprodueix les cançons de la temàtica TV a la llibreria de vídeo (complement TvTunes)"
+msgctxt "#31116"
+msgid "Show recently added albums"
+msgstr "Mostra els àlbums afegits recentment"
-msgctxt "#31127"
-msgid "TvTunes"
-msgstr "TvTunes"
+msgctxt "#31117"
+msgid "Show recently added videos"
+msgstr "Mostra els vídeos afegits recentment"
+
+msgctxt "#31118"
+msgid "Home page programs submenu"
+msgstr "Submenú de programes de la pantalla principal"
+
+msgctxt "#31119"
+msgid "Hide background fanart"
+msgstr "Amaga el Fanart del fons"
msgctxt "#31128"
msgid "Lyrics"
msgstr "Lletres"
+msgctxt "#31129"
+msgid "Hide fanart in full screen visualisation"
+msgstr "Amaga el fanart a la reproducció a pantalla completa"
+
+msgctxt "#31132"
+msgid "Lyrics add-on"
+msgstr "Complement de lletres"
+
+msgctxt "#31134"
+msgid "Home page \"Videos\" submenu"
+msgstr "Submenú \"Vídeos\" de la pàgina principal"
+
+msgctxt "#31135"
+msgid "Home page \"Music\" submenu"
+msgstr "Submenú \"Música\" de la pàgina principal"
+
+msgctxt "#31136"
+msgid "Home page \"Pictures\" submenu"
+msgstr "Submenú \"Imatges\" de la pàgina principal"
+
msgctxt "#31140"
msgid "Music OSD"
msgstr "OSD de música"
@@ -176,22 +248,90 @@ msgctxt "#31200"
msgid "Shortcuts"
msgstr "Dreceres de teclat"
+msgctxt "#31203"
+msgid "Choose your song"
+msgstr "Trieu la vostra cançó"
+
+msgctxt "#31205"
+msgid "Lyrics source"
+msgstr "Origen de les lletres"
+
msgctxt "#31206"
msgid "Found"
msgstr "Trobat"
+msgctxt "#31207"
+msgid "Find more items"
+msgstr "Troba més elements"
+
+msgctxt "#31208"
+msgid "Upcoming episodes"
+msgstr "Propers episodis"
+
+msgctxt "#31300"
+msgid "Current temperature"
+msgstr "Temperatura actual"
+
+msgctxt "#31301"
+msgid "Last updated"
+msgstr "Última actualització"
+
msgctxt "#31303"
msgid "Data provider"
msgstr "Proveïdor de dades"
+msgctxt "#31307"
+msgid "Hide fanart"
+msgstr "Amaga Fanart"
+
+msgctxt "#31308"
+msgid "Movie details"
+msgstr "Detalls de la pel·lícula"
+
+msgctxt "#31309"
+msgid "Memory used:"
+msgstr "Memòria utilitzada:"
+
+msgctxt "#31310"
+msgid "Track number"
+msgstr "Número de pista"
+
msgctxt "#31311"
msgid "Fanart image[CR][CR]Unavailable[CR][CR] Click button to set"
msgstr "Imatge de fanart[CR][CR]No disponible[CR][CR] Feu clic per definir-la"
+msgctxt "#31312"
+msgid "Current scraper"
+msgstr "Scraper actual"
+
+msgctxt "#31313"
+msgid "Choose a scraper"
+msgstr "Trieu un scraper"
+
+msgctxt "#31314"
+msgid "Content scanning options"
+msgstr "Opcions d'escaneig de continguts"
+
+msgctxt "#31317"
+msgid "Set fanart path"
+msgstr "Estableix el camí del fanart"
+
+msgctxt "#31319"
+msgid "Selected profile"
+msgstr "Perfil seleccionat"
+
+msgctxt "#31320"
+msgid "Last logged in"
+msgstr "Últim accés el"
+
msgctxt "#31322"
msgid "Aired"
msgstr "Emès"
+msgctxt "#31325"
+msgid "Playlist options"
+msgstr "Opcions de la llista de reproducció"
+
msgctxt "#31326"
msgid "Created"
msgstr "Creat"
@@ -200,10 +340,22 @@ msgctxt "#31327"
msgid "Resolution"
msgstr "Resolució"
+msgctxt "#31328"
+msgid "Recently added"
+msgstr "Recentment afegits"
+
msgctxt "#31329"
msgid "[B]Timer set![/B] [COLOR=grey2] - System auto shutdown in[/COLOR]"
msgstr "[B]Temporitzador activat[/B] [COLOR=grey2] - El sistema s'apagarà automàticament en[/COLOR]"
+msgctxt "#31330"
+msgid "Click button to play[CR][CR]movie trailer"
+msgstr "Clic per reproduir[CR][CR]tràiler de pel·lícula"
+
+msgctxt "#31331"
+msgid "Album details"
+msgstr "Detalls de l'àlbum"
+
msgctxt "#31351"
msgid "Pause"
msgstr "Pausa"
@@ -212,6 +364,10 @@ msgctxt "#31352"
msgid "Stop"
msgstr "Atura"
+msgctxt "#31353"
+msgid "Fast forward"
+msgstr "Avanç ràpid"
+
msgctxt "#31354"
msgid "Rewind"
msgstr "Rebobina"
@@ -220,6 +376,10 @@ msgctxt "#31355"
msgid "Movie menu"
msgstr "Menú de la pel·lícula"
+msgctxt "#31356"
+msgid "Download subtitles"
+msgstr "Baixa els subtítols"
+
msgctxt "#31360"
msgid "Watch as 2D"
msgstr "Veure en 2D"
@@ -236,6 +396,10 @@ msgctxt "#31390"
msgid "Skin default"
msgstr "Aparença per defecte"
+msgctxt "#31391"
+msgid "Skin default with no caps"
+msgstr "Tema per defecte sense Majúscules"
+
msgctxt "#31392"
msgid "Arial based"
msgstr "Basat en Arial"
@@ -248,10 +412,6 @@ msgctxt "#31401"
msgid "[B]CONFIGURE VIDEO SETTINGS[/B][CR][CR]Manage your video library · Set video playback options · Change video listing options[CR]Set subtitle fonts"
msgstr "[B]CONFIGUREU ELS PARÀMETRES DE VÃDEO[/B][CR][CR]Gestioneu la biblioteca de vídeos · Establiu les opcions de reproducció de vídeo[CR]Canvieu les opcions del llistat de vídeo · Establiu els tipus de lletra dels subtítols"
-msgctxt "#31402"
-msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission · Set karaoke options"
-msgstr "[B]CONFIGUREU ELS PARÀMETRES DE LA MÚSICA[/B][CR][CR]Gestioneu la biblioteca de música · Establiu les opcions de reproducció de la música[CR]Canvieu les opcions del llistat de música · Configureu l'enviament de cançons[CR]Establiu les opcions del karaoke"
-
msgctxt "#31406"
msgid "[B]CONFIGURE SYSTEM SETTINGS[/B][CR][CR]Setup and calibrate displays · Configure audio output · Setup remote controls[CR]Set power saving options · Enable debugging · Setup master lock"
msgstr "[B]CONFIGUREU ELS PARÀMETRES DEL SISTEMA[/B][CR][CR]Configureu i calibreu les pantalles · Configureu la sortida d'àudio[CR]Configureu els comandaments a distància · Establiu les opcions d'estalvi d'energia[CR]Habiliteu la depuració · Configureu el bloqueig mestre"
@@ -264,6 +424,10 @@ msgctxt "#31410"
msgid "[B]CONFIGURE SERVICE SETTINGS[/B][CR][CR]Setup control of Kodi via UPnP and HTTP · Configure file sharing[CR]Enable Zeroconf · Configure AirPlay"
msgstr "[B]CONFIGUREU ELS PARÀMETRES DE SERVEI[/B][CR][CR]Configureu el control del Kodi a través de UPnP i HTTP[CR]Configureu l'ús compartit de fitxers · Habiliteu el Zeroconf · Configureu l'AirPlay"
+msgctxt "#31411"
+msgid "First run help..."
+msgstr "Ajuda per a la primera vegada..."
+
msgctxt "#31413"
msgid "Local subtitle available"
msgstr "Subtítol local disponible"
@@ -272,6 +436,10 @@ msgctxt "#31420"
msgid "Login"
msgstr "Inicia sessió"
+msgctxt "#31421"
+msgid "Select your Kodi user profile[CR]to login and continue"
+msgstr "Seleccioni el seu perfil d'usuari de Kodi[CR]per ingressar i continuar"
+
msgctxt "#31422"
msgid "Show or hide the login screen at startup."
msgstr "Mostra o amaga la pantalla d'inici de sessió a l'inici."
@@ -280,18 +448,66 @@ msgctxt "#31423"
msgid "Select the profile that will be used at startup when the login screen is disabled."
msgstr "Seleccioneu el perfil que serà utilitzat a l'inici quan la pantalla d'entrada d'usuari està deshabilitada."
+msgctxt "#31501"
+msgid "Scheduled time"
+msgstr "Hora programada"
+
msgctxt "#31502"
msgid "TV"
msgstr "TV"
+msgctxt "#31503"
+msgid "Add group"
+msgstr "Afegeix un grup"
+
+msgctxt "#31504"
+msgid "Rename group"
+msgstr "Canvia el nom del grup"
+
+msgctxt "#31505"
+msgid "Delete group"
+msgstr "Elimina el grup"
+
msgctxt "#31506"
msgid "Available[CR]Groups"
msgstr "Grups[CR]disponibles"
+msgctxt "#31509"
+msgid "Channel group"
+msgstr "Grup del canal"
+
+msgctxt "#31510"
+msgid "Timer set"
+msgstr "Establir Temporitzador"
+
+msgctxt "#31511"
+msgid "Channel options"
+msgstr "Opcions del canal"
+
+msgctxt "#31901"
+msgid "36-hour forecast"
+msgstr "Predicció a 36 hores"
+
+msgctxt "#31902"
+msgid "Hourly forecast"
+msgstr "Predicció per hores"
+
+msgctxt "#31903"
+msgid "Weekend forecast"
+msgstr "Predicció del cap de setmana"
+
+msgctxt "#31904"
+msgid "Daily forecast"
+msgstr "Predicció diària"
+
msgctxt "#31905"
msgid "Forecast"
msgstr "Predicció"
+msgctxt "#31908"
+msgid "Chance of precipitation"
+msgstr "Possibilitat de precipitació"
+
msgctxt "#31909"
msgid "Fetching forecast info..."
msgstr "S'està obtenint la informació de la predicció..."
diff --git a/addons/skin.confluence/language/resource.language.cs_cz/strings.po b/addons/skin.confluence/language/resource.language.cs_cz/strings.po
index a6d0d623fa..632a776676 100644
--- a/addons/skin.confluence/language/resource.language.cs_cz/strings.po
+++ b/addons/skin.confluence/language/resource.language.cs_cz/strings.po
@@ -228,14 +228,6 @@ msgctxt "#31125"
msgid "Show background \"Now playing\" visualisation"
msgstr "Zobrazit právě přehrávanou vizualizaci na pozadí"
-msgctxt "#31126"
-msgid "Play TV theme songs in video library (TvTunes add-on)"
-msgstr "Přehrát znělky v knihovně videí (doplněk TvTunes)"
-
-msgctxt "#31127"
-msgid "TvTunes"
-msgstr "TvTunes"
-
msgctxt "#31128"
msgid "Lyrics"
msgstr "Texty písní"
@@ -352,10 +344,6 @@ msgctxt "#31320"
msgid "Last logged in"
msgstr "Naposledy přihlášen"
-msgctxt "#31321"
-msgid "Karaoke song selector"
-msgstr "Výběr karaoke skladby"
-
msgctxt "#31322"
msgid "Aired"
msgstr "Odvysíláno"
@@ -444,10 +432,6 @@ msgctxt "#31401"
msgid "[B]CONFIGURE VIDEO SETTINGS[/B][CR][CR]Manage your video library · Set video playback options · Change video listing options[CR]Set subtitle fonts"
msgstr "[B]NASTAVENà MOŽNOSTà VIDEA[/B][CR][CR]Správa knihovny videí · Možnosti přehrávání videa · Možnosti zobrazení video souborů[CR]Nastavení fontu titulků"
-msgctxt "#31402"
-msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission · Set karaoke options"
-msgstr "[B]NASTAVENà MOŽNOSTà HUDBY[/B][CR][CR]Správa knihovny hudby · Možnosti přehrávání hudby · Možnosti zobrazení hudebních souborů[CR] Nastavení služby odesílání informací o přehrávaných skladbách · Nastavení karaoke"
-
msgctxt "#31403"
msgid "[B]CONFIGURE PICTURE SETTINGS[/B][CR][CR]Set picture listing options · Configure slideshow"
msgstr "[B]NASTAVENà MOŽNOSTà OBRÃZKÅ®[/B][CR][CR]Možnosti zobrazení obrázků · Nastavení prezentace"
@@ -578,7 +562,7 @@ msgstr "OBRÃZKY"
msgctxt "#31952"
msgid "TV"
-msgstr "Televize"
+msgstr "TELEVIZE"
msgctxt "#31953"
msgid "VIDEOS"
diff --git a/addons/skin.confluence/language/resource.language.cy_gb/strings.po b/addons/skin.confluence/language/resource.language.cy_gb/strings.po
index 6367a11db9..1c3436550e 100644
--- a/addons/skin.confluence/language/resource.language.cy_gb/strings.po
+++ b/addons/skin.confluence/language/resource.language.cy_gb/strings.po
@@ -144,14 +144,6 @@ msgctxt "#31112"
msgid "Options"
msgstr "Dewisiadau"
-msgctxt "#31126"
-msgid "Play TV theme songs in video library (TvTunes add-on)"
-msgstr "Chwarae caneuon thema teledu yn y llyfrgell fideo (ychwanegyn TvTunes)"
-
-msgctxt "#31127"
-msgid "TvTunes"
-msgstr "TvTunes"
-
msgctxt "#31128"
msgid "Lyrics"
msgstr "Geiriau Caneuon"
@@ -244,10 +236,6 @@ msgctxt "#31401"
msgid "[B]CONFIGURE VIDEO SETTINGS[/B][CR][CR]Manage your video library · Set video playback options · Change video listing options[CR]Set subtitle fonts"
msgstr "[B]FFURFWEDDU GOSODIADAU FIDEO[/B][CR][CR]Rheoli eich llyfrgell fideo · Gosod dewisiadau chwarae fideo · Newid dewisiadau rhestru fideo[CR]Gosod ffontiau isdeitlau"
-msgctxt "#31402"
-msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission · Set karaoke options"
-msgstr "[B]FFURFWEDDU GOSODIADAU CERDDORIAETH[/B][CR][CR]Rheoli eich llyfrgell cerddoriaeth · Gosod dewisiadau chwarae cerddoriaeth · Newid dewisiadau rhestru cerddoriaeth [CR]Gosod cyflwyno caneuon · Gosod dewisiadau karaoke"
-
msgctxt "#31406"
msgid "[B]CONFIGURE SYSTEM SETTINGS[/B][CR][CR]Setup and calibrate displays · Configure audio output · Setup remote controls[CR]Set power saving options · Enable debugging · Setup master lock"
msgstr "[B]FFURFWEDDU GOSODIADAU'R SYSTEM[/B][CR][CR]Gosod a chalibro dangosyddion · Ffurfweddu allbwn sain · Gosod rheolyddion pell[CR]Gosod dewisiadau pŵer · Galluogi dadfygio · Gosod prif glo"
diff --git a/addons/skin.confluence/language/resource.language.da_dk/strings.po b/addons/skin.confluence/language/resource.language.da_dk/strings.po
index b7fcb3e560..5105403b40 100644
--- a/addons/skin.confluence/language/resource.language.da_dk/strings.po
+++ b/addons/skin.confluence/language/resource.language.da_dk/strings.po
@@ -16,6 +16,10 @@ msgstr ""
"Language: da_DK\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+msgctxt "#31000"
+msgid "Change your"
+msgstr "Ændre din"
+
msgctxt "#31003"
msgid "Power options"
msgstr "Strømstyring"
@@ -24,6 +28,10 @@ msgctxt "#31004"
msgid "Working..."
msgstr "Arbejder..."
+msgctxt "#31005"
+msgid "Hide information"
+msgstr "Skjul information"
+
msgctxt "#31006"
msgid "View options"
msgstr "Visningsindstillinger"
@@ -32,6 +40,10 @@ msgctxt "#31008"
msgid "Full screen"
msgstr "Fuld skærm"
+msgctxt "#31009"
+msgid "Total duration"
+msgstr "Total tid"
+
msgctxt "#31022"
msgid "Music - Files"
msgstr "Musik - Filer"
@@ -48,14 +60,30 @@ msgctxt "#31025"
msgid "Items"
msgstr "Emner"
+msgctxt "#31026"
+msgid "Misc options"
+msgstr "Andre indstillinger"
+
msgctxt "#31027"
msgid "Location"
msgstr "Lokalitet"
+msgctxt "#31028"
+msgid "Poster wrap"
+msgstr "Plakatvæg"
+
msgctxt "#31029"
msgid "Fanart"
msgstr "Fankunst"
+msgctxt "#31031"
+msgid "Pic thumbs"
+msgstr "Blandet"
+
+msgctxt "#31032"
+msgid "Image wrap"
+msgstr "Billedvæg"
+
msgctxt "#31033"
msgid "Info"
msgstr "Info"
@@ -64,6 +92,10 @@ msgctxt "#31039"
msgid "Actions"
msgstr "Handlinger"
+msgctxt "#31040"
+msgid "Now playing"
+msgstr "Spiller nu"
+
msgctxt "#31042"
msgid "PLAYING"
msgstr "AFSPILLER"
@@ -84,6 +116,10 @@ msgctxt "#31046"
msgid "SEEKING"
msgstr "SØGER"
+msgctxt "#31048"
+msgid "Visualisation presets"
+msgstr "Visualiserings-forudindstillinger"
+
msgctxt "#31049"
msgid "End time"
msgstr "Sluttidspunkt"
@@ -120,6 +156,10 @@ msgctxt "#31060"
msgid "This file is stacked, select the part you want to play from."
msgstr "Denne fil er kombineret. Vælg den del du vil afspille fra."
+msgctxt "#31061"
+msgid "Current selected"
+msgstr "Nuværende valgte"
+
msgctxt "#31101"
msgid "Home screen options"
msgstr "Indstillinger til hjemmeskærmen"
@@ -128,10 +168,26 @@ msgctxt "#31102"
msgid "Background"
msgstr "Baggrund"
+msgctxt "#31103"
+msgid "Show \"Paused\" in picture slideshow"
+msgstr "Vis \"PAUSE\" i billeddiasshow"
+
+msgctxt "#31104"
+msgid "Play trailers in a window [COLOR=grey3](Video information dialogue only)[/COLOR]"
+msgstr "Afspil trailere i et vindue [COLOR=grey3](Kun videoinformationsdialog)[/COLOR]"
+
msgctxt "#31106"
msgid "Miscellaneous options"
msgstr "Diverse indstillinger"
+msgctxt "#31107"
+msgid "Hide flagging read from video filenames [COLOR=grey3](e.g. Blu-ray, HD-DVD)[/COLOR]"
+msgstr "Skjul læsning af mærker fra videoers filnavne [COLOR=grey3](Blu-ray, HD-DVD)[/COLOR]"
+
+msgctxt "#31108"
+msgid "Hide main menu buttons"
+msgstr "Skjul knapper i Hovedmenu"
+
msgctxt "#31109"
msgid "Enable custom background"
msgstr "Aktiver brugerdefineret baggrund"
@@ -148,18 +204,54 @@ msgctxt "#31112"
msgid "Options"
msgstr "Indstillinger"
-msgctxt "#31126"
-msgid "Play TV theme songs in video library (TvTunes add-on)"
-msgstr "Afspil kendingsmelodier til TV-serier i videobiblioteket (TvTunes add-on)"
+msgctxt "#31116"
+msgid "Show recently added albums"
+msgstr "Vis nyligt tilføjede Albummer"
+
+msgctxt "#31117"
+msgid "Show recently added videos"
+msgstr "Vis nyligt tilføjede Videoer"
+
+msgctxt "#31118"
+msgid "Home page programs submenu"
+msgstr "Undermenu til programmer på startskærmen"
-msgctxt "#31127"
-msgid "TvTunes"
-msgstr "TvTunes"
+msgctxt "#31119"
+msgid "Hide background fanart"
+msgstr "Skjul baggrundsfankunst"
+
+msgctxt "#31124"
+msgid "Show background \"Now playing\" video"
+msgstr "Vis \"Spiller nu\" i baggrunden for videoer"
+
+msgctxt "#31125"
+msgid "Show background \"Now playing\" visualisation"
+msgstr "Vis \"Spiller nu\" visualisering i baggrunden"
msgctxt "#31128"
msgid "Lyrics"
msgstr "Sangtekster"
+msgctxt "#31129"
+msgid "Hide fanart in full screen visualisation"
+msgstr "Skjul Fanart i fuldskærmsvisning"
+
+msgctxt "#31132"
+msgid "Lyrics add-on"
+msgstr "Add-on til Sangtekster"
+
+msgctxt "#31134"
+msgid "Home page \"Videos\" submenu"
+msgstr "Undermenu til Videoer på Hjemmeskærmen"
+
+msgctxt "#31135"
+msgid "Home page \"Music\" submenu"
+msgstr "Undermenu til Musik på Hjemmeskærmen"
+
+msgctxt "#31136"
+msgid "Home page \"Pictures\" submenu"
+msgstr "Undermenu til Billeder på Hjemmeskærmen"
+
msgctxt "#31140"
msgid "Music OSD"
msgstr "Musik OSD"
@@ -176,22 +268,90 @@ msgctxt "#31200"
msgid "Shortcuts"
msgstr "Genveje"
+msgctxt "#31203"
+msgid "Choose your song"
+msgstr "Vælg din sang"
+
+msgctxt "#31205"
+msgid "Lyrics source"
+msgstr "Kilde til Sangtekster"
+
msgctxt "#31206"
msgid "Found"
msgstr "Fundet"
+msgctxt "#31207"
+msgid "Find more items"
+msgstr "Find flere Emner"
+
+msgctxt "#31208"
+msgid "Upcoming episodes"
+msgstr "Kommende Afsnit"
+
+msgctxt "#31300"
+msgid "Current temperature"
+msgstr "Ønsket temperatur"
+
+msgctxt "#31301"
+msgid "Last updated"
+msgstr "Sidst Opdateret"
+
msgctxt "#31303"
msgid "Data provider"
msgstr "Dataleverandør"
+msgctxt "#31307"
+msgid "Hide fanart"
+msgstr "Skjul Fankunst"
+
+msgctxt "#31308"
+msgid "Movie details"
+msgstr "Filmdetaljer"
+
+msgctxt "#31309"
+msgid "Memory used:"
+msgstr "Hukommelse i brug:"
+
+msgctxt "#31310"
+msgid "Track number"
+msgstr "Spornummer"
+
msgctxt "#31311"
msgid "Fanart image[CR][CR]Unavailable[CR][CR] Click button to set"
msgstr "Fankunstbillede[CR][CR]ikke tilgængeligt[CR][CR] Tryk på knap for at vælge"
+msgctxt "#31312"
+msgid "Current scraper"
+msgstr "Nuværende Scraper"
+
+msgctxt "#31313"
+msgid "Choose a scraper"
+msgstr "Vælg en Scraper"
+
+msgctxt "#31314"
+msgid "Content scanning options"
+msgstr "Indstillinger for indholdsskanning"
+
+msgctxt "#31317"
+msgid "Set fanart path"
+msgstr "Vælg sti til Fankunst"
+
+msgctxt "#31319"
+msgid "Selected profile"
+msgstr "Valgt Profil"
+
+msgctxt "#31320"
+msgid "Last logged in"
+msgstr "Sidst logget ind"
+
msgctxt "#31322"
msgid "Aired"
msgstr "Sendt"
+msgctxt "#31325"
+msgid "Playlist options"
+msgstr "Indstillinger for Afspilningsliste"
+
msgctxt "#31326"
msgid "Created"
msgstr "Oprettet"
@@ -208,6 +368,14 @@ msgctxt "#31329"
msgid "[B]Timer set![/B] [COLOR=grey2] - System auto shutdown in[/COLOR]"
msgstr "[B]Optagelse indstillet![/B] [COLOR=grey2] - Systemet lukker ned om[/COLOR]"
+msgctxt "#31330"
+msgid "Click button to play[CR][CR]movie trailer"
+msgstr "Klik på en knap for at afspille[CR][CR]Filmtrailer"
+
+msgctxt "#31331"
+msgid "Album details"
+msgstr "Albumdetaljer"
+
msgctxt "#31351"
msgid "Pause"
msgstr "Pause"
@@ -216,6 +384,10 @@ msgctxt "#31352"
msgid "Stop"
msgstr "Stop"
+msgctxt "#31353"
+msgid "Fast forward"
+msgstr "Spol Frem"
+
msgctxt "#31354"
msgid "Rewind"
msgstr "Spol Tilbage"
@@ -224,6 +396,10 @@ msgctxt "#31355"
msgid "Movie menu"
msgstr "Filmmenu"
+msgctxt "#31356"
+msgid "Download subtitles"
+msgstr "Hent Undertekster"
+
msgctxt "#31360"
msgid "Watch as 2D"
msgstr "Se i 2D"
@@ -240,6 +416,10 @@ msgctxt "#31390"
msgid "Skin default"
msgstr "Skinnets standard"
+msgctxt "#31391"
+msgid "Skin default with no caps"
+msgstr "Skinnets standard uden store bogstaver"
+
msgctxt "#31392"
msgid "Arial based"
msgstr "Baseret på Arial"
@@ -252,14 +432,22 @@ msgctxt "#31401"
msgid "[B]CONFIGURE VIDEO SETTINGS[/B][CR][CR]Manage your video library · Set video playback options · Change video listing options[CR]Set subtitle fonts"
msgstr "[B]KONFIGURER VIDEOINDSTILLINGER[/B][CR][CR]Administrer dit videobibliotek · Vælg indstillinger for videoafspilning · Skift indstillinger for videooversigt[CR]Vælg skrifttype til undertekster"
-msgctxt "#31402"
-msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission · Set karaoke options"
-msgstr "[B]KONFIGURER MUSIKINDSTILLINGER[/B][CR][CR]Administrer dit musikbibliotek · Vælg indstillinger for musikafspilning · Skift indstillinger for musikoversigt[CR]Opsæt sangindsendelse · Vælg karaoke-indstillinger"
+msgctxt "#31403"
+msgid "[B]CONFIGURE PICTURE SETTINGS[/B][CR][CR]Set picture listing options · Configure slideshow"
+msgstr "[B]KONFIGURER BILLEDEINDSTILLINGER[/B][CR][CR]Vælg indstillinger for billedeoversigt · Konfigurer diasshow"
+
+msgctxt "#31404"
+msgid "[B]CONFIGURE WEATHER SETTINGS[/B][CR][CR]Set various cities to collect weather information"
+msgstr "[B]KONFIGURER VEJRINDSTILLINGER[/B][CR][CR]Du kan vælge tre byer, der skal hentes vejrudsigter for"
msgctxt "#31406"
msgid "[B]CONFIGURE SYSTEM SETTINGS[/B][CR][CR]Setup and calibrate displays · Configure audio output · Setup remote controls[CR]Set power saving options · Enable debugging · Setup master lock"
msgstr "[B]KONFIGURER SYSTEMINDSTILLINGER[/B][CR][CR]Indstil og kalibrer skærme · Konfigurer lydudgang · Opsæt fjernbetjeninger[CR]Opsæt strømstyring · Aktiver fejllogning · Opret hovedlås"
+msgctxt "#31408"
+msgid "[B]CONFIGURE ADD-ONS[/B][CR][CR]Manage your installed add-ons · Browse for and install add-ons from kodi.tv[CR]Modify add-on settings"
+msgstr "[B]KONFIGURER ADD-ONS[/B][CR][CR]Administrer dine installerede Add-ons · Gennemse og installer Add-ons fra kodi.tv[CR]Tilpas indstillinger til Add-ons"
+
msgctxt "#31409"
msgid "[B]CONFIGURE TV SETTINGS[/B][CR][CR]Change full screen info · Manage EPG data settings"
msgstr "[B]KONFIGURER TV-INDSTILLINGER[/B][CR][CR]Skift fuldskærmsinfo · Administrer indstillinger for EPG"
@@ -268,6 +456,14 @@ msgctxt "#31410"
msgid "[B]CONFIGURE SERVICE SETTINGS[/B][CR][CR]Setup control of Kodi via UPnP and HTTP · Configure file sharing[CR]Enable Zeroconf · Configure AirPlay"
msgstr "[B]KONFIGURER TJENESTER[/B][CR][CR]Opsæt styring af Kodi ved hjælp af UPnP og HTTP · Konfigurer fildeling[CR]Aktiver Zeroconf · Konfigurer AirPlay"
+msgctxt "#31411"
+msgid "First run help..."
+msgstr "Prøv først hjælp..."
+
+msgctxt "#31412"
+msgid "This tab signifies that there is a menu off to the side of this window that contains extra options for this section. To access the menu, navigate to the left with your remote control or keyboard or place your mouse pointer over the tab. [CR][CR]Click \"OK\" to close this dialogue. It will not appear again."
+msgstr "Dette faneblad indikerer, at der er en menu i siden af dette vindue, som indeholder ekstra indstillinger til denne sektion.\nFor at få adgang til denne menu, skal du navigere til venstre med din fjernbetjening eller dit tastatur. Du kan også placere din musemarkør over fanebladet. [CR][CR]Tryk \"Ok\" for at lukke denne dialog. Den dukker ikke op igen."
+
msgctxt "#31413"
msgid "Local subtitle available"
msgstr "Undertekster på lokalt sprog tilgængelig"
@@ -276,6 +472,10 @@ msgctxt "#31420"
msgid "Login"
msgstr "Login"
+msgctxt "#31421"
+msgid "Select your Kodi user profile[CR]to login and continue"
+msgstr "Vælg din Kodi brugerprofil[CR]for at logge ind og fortsætte"
+
msgctxt "#31422"
msgid "Show or hide the login screen at startup."
msgstr "Vise eller skjule login-skærmen ved opstart."
@@ -284,18 +484,66 @@ msgctxt "#31423"
msgid "Select the profile that will be used at startup when the login screen is disabled."
msgstr "Vælg den profil, der skal bruges ved opstart, når login-skærmen er deaktiveret."
+msgctxt "#31501"
+msgid "Scheduled time"
+msgstr "Planlagt tid"
+
msgctxt "#31502"
msgid "TV"
msgstr "TV"
+msgctxt "#31503"
+msgid "Add group"
+msgstr "Tilføj Gruppe"
+
+msgctxt "#31504"
+msgid "Rename group"
+msgstr "Omdøb Gruppe"
+
+msgctxt "#31505"
+msgid "Delete group"
+msgstr "Slet Gruppe"
+
msgctxt "#31506"
msgid "Available[CR]Groups"
msgstr "Tilgængelige[CR]Grupper"
+msgctxt "#31509"
+msgid "Channel group"
+msgstr "Kanalgruppe"
+
+msgctxt "#31510"
+msgid "Timer set"
+msgstr "Indstil Optagelse"
+
+msgctxt "#31511"
+msgid "Channel options"
+msgstr "Kanalindstillinger"
+
+msgctxt "#31901"
+msgid "36-hour forecast"
+msgstr "36 timers vejrudsigt"
+
+msgctxt "#31902"
+msgid "Hourly forecast"
+msgstr "Vejrudsigt de næste timer"
+
+msgctxt "#31903"
+msgid "Weekend forecast"
+msgstr "Vejrudsigt for weekenden"
+
+msgctxt "#31904"
+msgid "Daily forecast"
+msgstr "Vejrudsigten for i dag"
+
msgctxt "#31905"
msgid "Forecast"
msgstr "Vejrudsigt"
+msgctxt "#31908"
+msgid "Chance of precipitation"
+msgstr "Risiko for nedbør"
+
msgctxt "#31909"
msgid "Fetching forecast info..."
msgstr "Henter vejrudsigt..."
diff --git a/addons/skin.confluence/language/resource.language.de_de/strings.po b/addons/skin.confluence/language/resource.language.de_de/strings.po
index c1ba7854bc..03aaacf918 100644
--- a/addons/skin.confluence/language/resource.language.de_de/strings.po
+++ b/addons/skin.confluence/language/resource.language.de_de/strings.po
@@ -228,14 +228,6 @@ msgctxt "#31125"
msgid "Show background \"Now playing\" visualisation"
msgstr "Die \"Es läuft\" Hintergrund-Visualisierung anzeigen"
-msgctxt "#31126"
-msgid "Play TV theme songs in video library (TvTunes add-on)"
-msgstr "TV-Titelmusikstücke beim Navigieren in der Video-Bibliothek abspielen (TvTunes Addon)"
-
-msgctxt "#31127"
-msgid "TvTunes"
-msgstr "TvTunes"
-
msgctxt "#31128"
msgid "Lyrics"
msgstr "Liedtexte"
@@ -352,10 +344,6 @@ msgctxt "#31320"
msgid "Last logged in"
msgstr "Zuletzt angemeldet"
-msgctxt "#31321"
-msgid "Karaoke song selector"
-msgstr "Karaoke-Titelauswahl"
-
msgctxt "#31322"
msgid "Aired"
msgstr "Ausgestrahlt"
@@ -444,10 +432,6 @@ msgctxt "#31401"
msgid "[B]CONFIGURE VIDEO SETTINGS[/B][CR][CR]Manage your video library · Set video playback options · Change video listing options[CR]Set subtitle fonts"
msgstr "[B]VIDEO-EINSTELLUNGEN KONFIGURIEREN[/B][CR][CR]Die Video-Bibliothek verwalten · Videoabspieleinstellungen vornehmen · Videoauflistungseinstellungen ändern[CR]Untertitel-Schriftarten einstellen"
-msgctxt "#31402"
-msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission · Set karaoke options"
-msgstr "[B]MUSIK-EINSTELLUNGEN KONFIGURIEREN[/B][CR][CR]Die Musik-Bibliothek verwalten· Musikabspieleinstellungen · Musikauflistungseinstellungen ändern[CR]Musikübertragung einrichten · Karaoke-Einstellungen"
-
msgctxt "#31403"
msgid "[B]CONFIGURE PICTURE SETTINGS[/B][CR][CR]Set picture listing options · Configure slideshow"
msgstr "[B]BILDER-EINSTELLUNGEN KONFIGURIEREN[/B][CR][CR]Bildauflistungseinstellungen · Diashow konfigurieren"
diff --git a/addons/skin.confluence/language/resource.language.el_gr/strings.po b/addons/skin.confluence/language/resource.language.el_gr/strings.po
index d61d30cda2..70fa967e41 100644
--- a/addons/skin.confluence/language/resource.language.el_gr/strings.po
+++ b/addons/skin.confluence/language/resource.language.el_gr/strings.po
@@ -16,10 +16,22 @@ msgstr ""
"Language: el_GR\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+msgctxt "#31000"
+msgid "Change your"
+msgstr "Αλλάξτε"
+
+msgctxt "#31003"
+msgid "Power options"
+msgstr "Επιλογές ΙσχÏος"
+
msgctxt "#31004"
msgid "Working..."
msgstr "Απασχολημένο..."
+msgctxt "#31005"
+msgid "Hide information"
+msgstr "ΑπόκÏυψη πληÏοφοÏιών"
+
msgctxt "#31006"
msgid "View options"
msgstr "Επιλογές Ï€Ïοβολής"
@@ -28,6 +40,10 @@ msgctxt "#31008"
msgid "Full screen"
msgstr "ΠλήÏης οθόνη"
+msgctxt "#31009"
+msgid "Total duration"
+msgstr "Συνολική διάÏκεια"
+
msgctxt "#31022"
msgid "Music - Files"
msgstr "Μουσική - ΑÏχεία"
@@ -44,14 +60,30 @@ msgctxt "#31025"
msgid "Items"
msgstr "Αντικείμενα"
+msgctxt "#31026"
+msgid "Misc options"
+msgstr "ΔιάφοÏες επιλογές"
+
msgctxt "#31027"
msgid "Location"
msgstr "Τοποθεσία"
+msgctxt "#31028"
+msgid "Poster wrap"
+msgstr "Wrap αφίσας"
+
msgctxt "#31029"
msgid "Fanart"
msgstr "Fanart"
+msgctxt "#31031"
+msgid "Pic thumbs"
+msgstr "Εικόνα επισκοπήσεων"
+
+msgctxt "#31032"
+msgid "Image wrap"
+msgstr "Wrap εικόνα"
+
msgctxt "#31033"
msgid "Info"
msgstr "ΠληÏοφοÏίες"
@@ -60,6 +92,10 @@ msgctxt "#31039"
msgid "Actions"
msgstr "ΕνέÏγειες"
+msgctxt "#31040"
+msgid "Now playing"
+msgstr "ΑναπαÏαγωγή σε εκτέλεση"
+
msgctxt "#31042"
msgid "PLAYING"
msgstr "ΑÎΑΠΑΡΑΓΩΓΗ"
@@ -80,9 +116,13 @@ msgctxt "#31046"
msgid "SEEKING"
msgstr "ΑÎΑΖΗΤΗΣΗ"
+msgctxt "#31048"
+msgid "Visualisation presets"
+msgstr "ΠÏοεπιλογές οπτικοποίησης"
+
msgctxt "#31049"
msgid "End time"
-msgstr "Έως ÏŽÏα"
+msgstr "ΧÏόνος Λήξης"
msgctxt "#31050"
msgid "Sort: Ascending"
@@ -116,25 +156,45 @@ msgctxt "#31060"
msgid "This file is stacked, select the part you want to play from."
msgstr "Αυτό το αÏχείο είναι στοιβαγμένο, επιλέξτε από που να γίνει αναπαÏαγωγή."
+msgctxt "#31061"
+msgid "Current selected"
+msgstr "Ï„Ïέχον επιλεγμένο "
+
msgctxt "#31101"
msgid "Home screen options"
msgstr "Επιλογές ΑÏχικής Οθόνης"
msgctxt "#31102"
msgid "Background"
-msgstr "ΥπόβαθÏο"
+msgstr "Φόντο"
+
+msgctxt "#31103"
+msgid "Show \"Paused\" in picture slideshow"
+msgstr "Εμφάνιση \"ΠαÏση\" Ï€Ïοβολής σλάιντ εικόνων"
+
+msgctxt "#31104"
+msgid "Play trailers in a window [COLOR=grey3](Video information dialogue only)[/COLOR]"
+msgstr "ΑναπαÏαγωγή Ï„ÏÎ­Î¹Î»ÎµÏ ÏƒÎµ παÏάθυÏο [COLOR=grey3](ΠληÏοφοÏίες βίντεο διαλόγου μόνο)[/COLOR]"
msgctxt "#31106"
msgid "Miscellaneous options"
msgstr "ΔιάφοÏες επιλογές"
+msgctxt "#31107"
+msgid "Hide flagging read from video filenames [COLOR=grey3](e.g. Blu-ray, HD-DVD)[/COLOR]"
+msgstr "ΑπόκÏυψη των αναγνώσιμων σημαιών από τα ονόματα αÏχείων βίντεο [COLOR=grey3](Ï€.χ Blu-ray, HD-DVD)[/COLOR]"
+
+msgctxt "#31108"
+msgid "Hide main menu buttons"
+msgstr "ΑπόκÏυψη πλήκτÏων κυÏίου μενοÏ"
+
msgctxt "#31109"
msgid "Enable custom background"
-msgstr "ΕνεÏγοποίηση Ï€ÏοσαÏμοσμένου υποβάθÏου"
+msgstr "ΕνεÏγοποίηση Ï€ÏοσαÏμοσμένου φόντου"
msgctxt "#31110"
msgid "Background path:"
-msgstr "ΔιαδÏομή υποβάθÏου:"
+msgstr "ΔιαδÏομή φόντου:"
msgctxt "#31111"
msgid "Hide"
@@ -144,25 +204,61 @@ msgctxt "#31112"
msgid "Options"
msgstr "Επιλογές"
-msgctxt "#31126"
-msgid "Play TV theme songs in video library (TvTunes add-on)"
-msgstr "ΑναπαÏαγωγή μουσικής σειÏών στη συλλογή (Ï€Ïόσθετο TvTunes)"
+msgctxt "#31116"
+msgid "Show recently added albums"
+msgstr "Εμφάνιση Ï€Ïόσφατων Ï€Ïοσθέσεων άλμπουμ"
+
+msgctxt "#31117"
+msgid "Show recently added videos"
+msgstr "Εμφάνιση Ï€Ïόσφατων Ï€Ïοσθέσεων βίντεο"
-msgctxt "#31127"
-msgid "TvTunes"
-msgstr "TvTunes"
+msgctxt "#31118"
+msgid "Home page programs submenu"
+msgstr "ΠÏογÏάμματα Ï…Ï€Î¿Î¼ÎµÎ½Î¿Ï ÎºÏÏιας σελίδας"
+
+msgctxt "#31119"
+msgid "Hide background fanart"
+msgstr "ΑπόκÏυψη φόντου fanart"
+
+msgctxt "#31124"
+msgid "Show background \"Now playing\" video"
+msgstr "Εμφάνηση φόντου βίντεο που \"ΑναπαÏαγωγή σε εκτέλεση\""
+
+msgctxt "#31125"
+msgid "Show background \"Now playing\" visualisation"
+msgstr "Εμφάνηση φόντου οπτικοποίησης που \"ΑναπαÏαγωγή σε εκτέλεση\""
msgctxt "#31128"
msgid "Lyrics"
msgstr "Στίχοι"
+msgctxt "#31129"
+msgid "Hide fanart in full screen visualisation"
+msgstr "ΑπόκÏυψη fanart σε πλήÏης οθόνη απτικοποίηση"
+
+msgctxt "#31132"
+msgid "Lyrics add-on"
+msgstr "Add-on στοίχων"
+
+msgctxt "#31134"
+msgid "Home page \"Videos\" submenu"
+msgstr "Î¥Ï€Î¿Î¼ÎµÎ½Î¿Ï \"Βίντεο\" κÏÏιας σελίδας"
+
+msgctxt "#31135"
+msgid "Home page \"Music\" submenu"
+msgstr "Î¥Ï€Î¿Î¼ÎµÎ½Î¿Ï \"Μουσική\" κÏÏιας σελίδας"
+
+msgctxt "#31136"
+msgid "Home page \"Pictures\" submenu"
+msgstr "Î¥Ï€Î¿Î¼ÎµÎ½Î¿Ï \"ΦωτογÏαφίες\" κÏÏιας σελίδας"
+
msgctxt "#31140"
msgid "Music OSD"
-msgstr "Aπεικονίσεις οθόνης (OSD) Μουσικής"
+msgstr "Aπεικόνιση οθόνης (OSD) Μουσικής"
msgctxt "#31141"
msgid "Video OSD"
-msgstr "Aπεικονίσεις οθόνης (OSD) Βίντεο"
+msgstr "Aπεικόνιση οθόνης (OSD) Βίντεο"
msgctxt "#31142"
msgid "Settings level"
@@ -172,22 +268,90 @@ msgctxt "#31200"
msgid "Shortcuts"
msgstr "ΣυντομεÏσεις"
+msgctxt "#31203"
+msgid "Choose your song"
+msgstr "Επιλογή Ï„ÏαγουδιοÏ"
+
+msgctxt "#31205"
+msgid "Lyrics source"
+msgstr "ΠÏοέλευση στίχων"
+
msgctxt "#31206"
msgid "Found"
msgstr "Î’Ïέθηκαν"
+msgctxt "#31207"
+msgid "Find more items"
+msgstr "ΕÏÏεση πεÏισσότεÏων αντικειμένων"
+
+msgctxt "#31208"
+msgid "Upcoming episodes"
+msgstr "ΑνεÏχόμενα επεισόδια"
+
+msgctxt "#31300"
+msgid "Current temperature"
+msgstr "ΤÏέχουσα θεÏμοκÏασία"
+
+msgctxt "#31301"
+msgid "Last updated"
+msgstr "Τελευταία ανανέωση"
+
msgctxt "#31303"
msgid "Data provider"
msgstr "Πηγή δεδομένων"
+msgctxt "#31307"
+msgid "Hide fanart"
+msgstr "ΑπόκÏυψη fanart"
+
+msgctxt "#31308"
+msgid "Movie details"
+msgstr "ΠληÏοφοÏίες ταινίας"
+
+msgctxt "#31309"
+msgid "Memory used:"
+msgstr "ΧÏήση μνήμης:"
+
+msgctxt "#31310"
+msgid "Track number"
+msgstr "ΑÏιθμός κομματιοÏ"
+
msgctxt "#31311"
msgid "Fanart image[CR][CR]Unavailable[CR][CR] Click button to set"
-msgstr "Εικόνα Fanart[CR][CR]Μη διαθέσιμη[CR][CR] Πιέστε το πλήκτÏο για να οÏίσετε"
+msgstr "Εικόνα Fanart[CR][CR]Μη διαθέσιμη[CR][CR] Επιλέξτε το πλήκτÏο για να οÏίσετε"
+
+msgctxt "#31312"
+msgid "Current scraper"
+msgstr "ΤÏέχον ΞÏστÏα"
+
+msgctxt "#31313"
+msgid "Choose a scraper"
+msgstr "Επιλογή ξÏστÏας"
+
+msgctxt "#31314"
+msgid "Content scanning options"
+msgstr "Επιλογές ΣάÏωσης ΠεÏιεχομένου"
+
+msgctxt "#31317"
+msgid "Set fanart path"
+msgstr "ΟÏισμός ΔιαδÏομής Fanart"
+
+msgctxt "#31319"
+msgid "Selected profile"
+msgstr "Επιλεγμένο ΠÏοφίλ"
+
+msgctxt "#31320"
+msgid "Last logged in"
+msgstr "Τελευταία σÏνδεση"
msgctxt "#31322"
msgid "Aired"
msgstr "ΠÏώτη ΠÏοβολή"
+msgctxt "#31325"
+msgid "Playlist options"
+msgstr "Επιλογές λίστας αναπ/γής"
+
msgctxt "#31326"
msgid "Created"
msgstr "ΔημιουÏγήθηκε"
@@ -196,10 +360,22 @@ msgctxt "#31327"
msgid "Resolution"
msgstr "Ανάλυση"
+msgctxt "#31328"
+msgid "Recently added"
+msgstr "ΠÏόσφατη Ï€Ïοσθήκη"
+
msgctxt "#31329"
msgid "[B]Timer set![/B] [COLOR=grey2] - System auto shutdown in[/COLOR]"
msgstr "[B]ΟÏίστηκε χÏονοδιακόπτης![/B] [COLOR=grey2] - ΤεÏματισμός συστήματος σε[/COLOR]"
+msgctxt "#31330"
+msgid "Click button to play[CR][CR]movie trailer"
+msgstr "Επιλογή πλήκτÏου για αναπαÏαγωγή[CR][CR]Ï„ÏÎ­Î¹Î»ÎµÏ Ï„Î±Î¹Î½Î¯Î±Ï‚"
+
+msgctxt "#31331"
+msgid "Album details"
+msgstr "ΛεπτομέÏειες Άλμπουμ"
+
msgctxt "#31351"
msgid "Pause"
msgstr "ΠαÏση"
@@ -208,6 +384,10 @@ msgctxt "#31352"
msgid "Stop"
msgstr "Διακοπή"
+msgctxt "#31353"
+msgid "Fast forward"
+msgstr "ΜπÏοστά"
+
msgctxt "#31354"
msgid "Rewind"
msgstr "Πίσω"
@@ -216,6 +396,10 @@ msgctxt "#31355"
msgid "Movie menu"
msgstr "ÎœÎµÎ½Î¿Ï Î¤Î±Î¹Î½Î¹ÏŽÎ½"
+msgctxt "#31356"
+msgid "Download subtitles"
+msgstr "Λήψη Υποτίτλων"
+
msgctxt "#31360"
msgid "Watch as 2D"
msgstr "ΠÏοβολή ως 2D"
@@ -230,7 +414,11 @@ msgstr "ΕνεÏγό/ή"
msgctxt "#31390"
msgid "Skin default"
-msgstr "ΠÏοεπιλογή"
+msgstr "ΠÏοεπιλογή αμφίεσης"
+
+msgctxt "#31391"
+msgid "Skin default with no caps"
+msgstr "ΠÏοεπιλογή αμφίεσης χωÏίς Κεφαλαία"
msgctxt "#31392"
msgid "Arial based"
@@ -238,19 +426,27 @@ msgstr "Βασισμένη σε Arial"
msgctxt "#31400"
msgid "[B]CONFIGURE APPEARANCE SETTINGS[/B][CR][CR]Change the skin · Set language and region · Change file listing options[CR]Set up a screensaver"
-msgstr "[B]ΡΥΘΜΙΣΕΙΣ ΕΞΑΤΟΜΙΚΕΥΣΗΣ[/B][CR][CR]Αλλαγή κελÏφους · Αλλαγή χώÏας και γλώσσας συστήματος · Επιλογές καταλόγου αÏχείων[CR]ΠÏοσαÏμογή της Ï€ÏοφÏλαξης οθόνης"
+msgstr "[B]ΡΥΘΜΙΣΕΙΣ ΕΞΑΤΟΜΙΚΕΥΣΗΣ ΕΜΦΑÎΙΣΗΣ[/B][CR][CR]Αλλαγή αμφίεσης · Αλλαγή χώÏας και γλώσσας συστήματος · Επιλογές καταλόγου αÏχείων[CR]ΠÏοσαÏμογή της Ï€ÏοφÏλαξης οθόνης"
msgctxt "#31401"
msgid "[B]CONFIGURE VIDEO SETTINGS[/B][CR][CR]Manage your video library · Set video playback options · Change video listing options[CR]Set subtitle fonts"
-msgstr "[B]ΡΥΘΜΙΣΕΙΣ ΒΙÎΤΕΟ[/B][CR][CR]ΔιαχείÏιση της συλλογής βίντεο · ΡÏθμιση αναπαÏαγωγής βίντεο · Επιλογές καταλόγου ταινιών[CR]ΡÏθμιση γÏαμματοσειÏάς υποτίτλων"
+msgstr "[B]ΡΥΘΜΙΣΕΙΣ ΕΞΑΤΟΜΙΚΕΥΣΗΣ ΒΙÎΤΕΟ[/B][CR][CR]ΔιαχείÏιση της συλλογής βίντεο · ΡÏθμιση αναπαÏαγωγής βίντεο · Επιλογές καταλόγου ταινιών[CR]ΡÏθμιση γÏαμματοσειÏάς υπότιτλου"
+
+msgctxt "#31403"
+msgid "[B]CONFIGURE PICTURE SETTINGS[/B][CR][CR]Set picture listing options · Configure slideshow"
+msgstr "[B]ΔΙΑΜΟΡΦΩΣΗ ΡΥΘΜΙΣΕΩΠΕΙΚΟÎΩÎ[/B][CR][CR]Επιλογές καταλόγου εικόνων · ΡÏθμιση παÏουσίασης σλάιντ"
-msgctxt "#31402"
-msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission · Set karaoke options"
-msgstr "[B]ΡΥΘΜΙΣΕΙΣ ΜΟΥΣΙΚΗΣ[/B][CR][CR]ΔιαχείÏιση της μουσικής συλλογής · ΡÏθμιση αναπαÏαγωγής μουσικής · Επιλογές καταλόγου μουσικής[CR]ΡÏθμιση υποβολής Ï„ÏÎ±Î³Î¿Ï…Î´Î¹Î¿Ï Â· Επιλογές karaoke"
+msgctxt "#31404"
+msgid "[B]CONFIGURE WEATHER SETTINGS[/B][CR][CR]Set various cities to collect weather information"
+msgstr "[B]ΔΙΑΜΟΡΦΩΣΗ ΡΥΘΜΙΣΕΩΠΚΑΙΡΟΥ[/B][CR][CR]ΟÏισμός πολλαπλών πόλεων για την συλλογή πληÏοφοÏιών Ï€Ïόγνωσης καιÏοÏ"
msgctxt "#31406"
msgid "[B]CONFIGURE SYSTEM SETTINGS[/B][CR][CR]Setup and calibrate displays · Configure audio output · Setup remote controls[CR]Set power saving options · Enable debugging · Setup master lock"
-msgstr "[B]ΡΥΘΜΙΣΕΙΣ ΣΥΣΤΗΜΑΤΟΣ[/B][CR][CR]ΔιαμόÏφωση και βαθμονόμηση οθονών · ΡÏθμιση εξόδου ήχου · ΤηλεχειÏιστήÏια · Εξοικονόμηση ενέÏγειας · Εντοπισμός σφαλμάτων (debug) · ΚεντÏικό κλείδωμα"
+msgstr "[B]ΔΙΑΜΟΡΦΩΣΗ ΡΥΘΜΙΣΕΩΠΣΥΣΤΗΜΑΤΟΣ[/B][CR][CR]ΔιαμόÏφωση και βαθμονόμηση οθονών · ΡÏθμιση εξόδου ήχου · ΤηλεχειÏιστήÏια · Εξοικονόμηση ενέÏγειας · Εντοπισμός σφαλμάτων (debug) · ΚεντÏικό κλείδωμα"
+
+msgctxt "#31408"
+msgid "[B]CONFIGURE ADD-ONS[/B][CR][CR]Manage your installed add-ons · Browse for and install add-ons from kodi.tv[CR]Modify add-on settings"
+msgstr "[B]ΡΥΘΜΙΣΕΙΣ ΔΙΑΜΟΡΦΩΣΗΣ ΠΡΟΣΘΕΤΩÎ[/B][CR][CR]ΔιαχείÏιση εγκατεστημένων Ï€Ïοσθέτων · Αναζήτηση και εγκατάσταση Ï€Ïοσθέτων από το kodi.tv[CR]ΤÏοποποίηση Ïυθμίσεων των Ï€Ïοσθέτων"
msgctxt "#31409"
msgid "[B]CONFIGURE TV SETTINGS[/B][CR][CR]Change full screen info · Manage EPG data settings"
@@ -260,6 +456,14 @@ msgctxt "#31410"
msgid "[B]CONFIGURE SERVICE SETTINGS[/B][CR][CR]Setup control of Kodi via UPnP and HTTP · Configure file sharing[CR]Enable Zeroconf · Configure AirPlay"
msgstr "[B]ΡΥΘΜΙΣΕΙΣ ΥΠΗΡΕΣΙΩÎ[/B][CR][CR]ΧειÏισμός του Kodi μέσω UPnP και HTTP · ΡÏθμιση κοινής χÏήσης αÏχείων[CR]ΕνεÏγοποίηση Zeroconf · ΡÏθμιση AirPlay"
+msgctxt "#31411"
+msgid "First run help..."
+msgstr "ΑÏχική βοήθεια...."
+
+msgctxt "#31412"
+msgid "This tab signifies that there is a menu off to the side of this window that contains extra options for this section. To access the menu, navigate to the left with your remote control or keyboard or place your mouse pointer over the tab. [CR][CR]Click \"OK\" to close this dialogue. It will not appear again."
+msgstr "Αυτή η ετικέτα δηλώνει ότι υπάÏχει ένα Î¼ÎµÎ½Î¿Ï ÏƒÏ„Î¿ πλάι του παÏαθÏÏου, με επιπλέον επιλογές. Για να το ανοίξετε επιλέξτε το αντίστοιχο πλήκτÏο κατεÏθυνσης ή μεταφέÏετε εκεί το ποντίκι σας.[CR][CR]Επιλέξτε 'Επιλογή' για να κλείσει αυτό το παÏάθυÏο. Δε θα εμφανιστεί ξανά."
+
msgctxt "#31413"
msgid "Local subtitle available"
msgstr "Διαθέσιμος υπότιτλος τοπικά"
@@ -268,6 +472,10 @@ msgctxt "#31420"
msgid "Login"
msgstr "ΣÏνδεση"
+msgctxt "#31421"
+msgid "Select your Kodi user profile[CR]to login and continue"
+msgstr "Επιλέξτε Ï€Ïοφίλ χÏήστη για το Kodi[CR]για να συνδεθείτε και να συνεχίσετε"
+
msgctxt "#31422"
msgid "Show or hide the login screen at startup."
msgstr "Εμφάνιση ή απόκÏυψη της οθόνης σÏνδεσης κατά την εκκίνηση."
@@ -276,18 +484,66 @@ msgctxt "#31423"
msgid "Select the profile that will be used at startup when the login screen is disabled."
msgstr "Επιλογή του Ï€Ïοφίλ που θα χÏησιμοποιηθεί κατά την εκκίνηση αν έχει απενεÏγοποιηθεί η οθόνη σÏνδεσης."
+msgctxt "#31501"
+msgid "Scheduled time"
+msgstr "ΠÏογÏαμματισμένη ÎÏα"
+
msgctxt "#31502"
msgid "TV"
msgstr "ΤηλεόÏαση"
+msgctxt "#31503"
+msgid "Add group"
+msgstr "ΠÏοσθήκη ΓκÏουπ"
+
+msgctxt "#31504"
+msgid "Rename group"
+msgstr "Μετονομασία ΓκÏουπ"
+
+msgctxt "#31505"
+msgid "Delete group"
+msgstr "ΔιαγÏαφή ΓκÏουπ"
+
msgctxt "#31506"
msgid "Available[CR]Groups"
msgstr "Διαθέσιμα[CR]ΓκÏουπ"
+msgctxt "#31509"
+msgid "Channel group"
+msgstr "ΓκÏουπ Καναλιών"
+
+msgctxt "#31510"
+msgid "Timer set"
+msgstr "ΟÏισμός ΧÏονοδιακόπτη"
+
+msgctxt "#31511"
+msgid "Channel options"
+msgstr "Επιλογές ΚαναλιοÏ"
+
+msgctxt "#31901"
+msgid "36-hour forecast"
+msgstr "36ωÏη Ï€Ïόγνωση"
+
+msgctxt "#31902"
+msgid "Hourly forecast"
+msgstr "ΩÏιαία ΠÏόγνωση"
+
+msgctxt "#31903"
+msgid "Weekend forecast"
+msgstr "ΠÏόγνωση ΣαββατοκÏÏιακου"
+
+msgctxt "#31904"
+msgid "Daily forecast"
+msgstr "ΗμεÏήσια ΠÏόγνωση"
+
msgctxt "#31905"
msgid "Forecast"
msgstr "ΠÏόγνωση"
+msgctxt "#31908"
+msgid "Chance of precipitation"
+msgstr "Πιθανότητα κατακÏήμνισης"
+
msgctxt "#31909"
msgid "Fetching forecast info..."
msgstr "Ανάκτηση Ï€Ïόγνωσης καιÏοÏ..."
diff --git a/addons/skin.confluence/language/resource.language.en_au/strings.po b/addons/skin.confluence/language/resource.language.en_au/strings.po
index db93193c19..67b036e38d 100644
--- a/addons/skin.confluence/language/resource.language.en_au/strings.po
+++ b/addons/skin.confluence/language/resource.language.en_au/strings.po
@@ -144,14 +144,6 @@ msgctxt "#31112"
msgid "Options"
msgstr "Options"
-msgctxt "#31126"
-msgid "Play TV theme songs in video library (TvTunes add-on)"
-msgstr "Play TV theme songs in video library (TvTunes add-on)"
-
-msgctxt "#31127"
-msgid "TvTunes"
-msgstr "TvTunes"
-
msgctxt "#31128"
msgid "Lyrics"
msgstr "Lyrics"
@@ -244,10 +236,6 @@ msgctxt "#31401"
msgid "[B]CONFIGURE VIDEO SETTINGS[/B][CR][CR]Manage your video library · Set video playback options · Change video listing options[CR]Set subtitle fonts"
msgstr "[B]CONFIGURE VIDEO SETTINGS[/B][CR][CR]Manage your video library · Set video playback options · Change video listing options[CR]Set subtitle fonts"
-msgctxt "#31402"
-msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission · Set karaoke options"
-msgstr "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission · Set karaoke options"
-
msgctxt "#31406"
msgid "[B]CONFIGURE SYSTEM SETTINGS[/B][CR][CR]Setup and calibrate displays · Configure audio output · Setup remote controls[CR]Set power saving options · Enable debugging · Setup master lock"
msgstr "[B]CONFIGURE SYSTEM SETTINGS[/B][CR][CR]Setup and calibrate displays · Configure audio output · Setup remote controls[CR]Set power saving options · Enable debugging · Setup master lock"
diff --git a/addons/skin.confluence/language/resource.language.en_gb/strings.po b/addons/skin.confluence/language/resource.language.en_gb/strings.po
index ee8bd48b23..fb22d6585c 100644
--- a/addons/skin.confluence/language/resource.language.en_gb/strings.po
+++ b/addons/skin.confluence/language/resource.language.en_gb/strings.po
@@ -265,7 +265,7 @@ msgctxt "#31122"
msgid "Hide EPG if RDS is present on channel window"
msgstr ""
-#empty string id 31123
+#empty string with id 31123
msgctxt "#31124"
msgid "Show background \"Now playing\" video"
@@ -418,9 +418,7 @@ msgctxt "#31320"
msgid "Last logged in"
msgstr ""
-msgctxt "#31321"
-msgid "Karaoke song selector"
-msgstr ""
+#empty string with id 31321
msgctxt "#31322"
msgid "Aired"
@@ -524,7 +522,7 @@ msgid "[B]CONFIGURE VIDEO SETTINGS[/B][CR][CR]Manage your video library · Set v
msgstr ""
msgctxt "#31402"
-msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission · Set karaoke options"
+msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission"
msgstr ""
msgctxt "#31403"
diff --git a/addons/skin.confluence/language/resource.language.en_nz/strings.po b/addons/skin.confluence/language/resource.language.en_nz/strings.po
index 8b24cea311..7bb346e7f7 100644
--- a/addons/skin.confluence/language/resource.language.en_nz/strings.po
+++ b/addons/skin.confluence/language/resource.language.en_nz/strings.po
@@ -220,6 +220,10 @@ msgctxt "#31119"
msgid "Hide background fanart"
msgstr "Hide background fanart"
+msgctxt "#31122"
+msgid "Hide EPG if RDS is present on channel window"
+msgstr "Hide EPG if RDS is present on channel window"
+
msgctxt "#31124"
msgid "Show background \"Now playing\" video"
msgstr "Show background \"Now playing\" video"
@@ -228,14 +232,6 @@ msgctxt "#31125"
msgid "Show background \"Now playing\" visualisation"
msgstr "Show background \"Now playing\" visualisation"
-msgctxt "#31126"
-msgid "Play TV theme songs in video library (TvTunes add-on)"
-msgstr "Play TV theme songs in video library (TvTunes add-on)"
-
-msgctxt "#31127"
-msgid "TvTunes"
-msgstr "TvTunes"
-
msgctxt "#31128"
msgid "Lyrics"
msgstr "Lyrics"
@@ -352,10 +348,6 @@ msgctxt "#31320"
msgid "Last logged in"
msgstr "Last logged in"
-msgctxt "#31321"
-msgid "Karaoke song selector"
-msgstr "Karaoke song selector"
-
msgctxt "#31322"
msgid "Aired"
msgstr "Aired"
@@ -445,8 +437,8 @@ msgid "[B]CONFIGURE VIDEO SETTINGS[/B][CR][CR]Manage your video library · Set v
msgstr "[B]CONFIGURE VIDEO SETTINGS[/B][CR][CR]Manage your video library · Set video playback options · Change video listing options[CR]Set subtitle fonts"
msgctxt "#31402"
-msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission · Set karaoke options"
-msgstr "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission · Set karaoke options"
+msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission"
+msgstr "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission"
msgctxt "#31403"
msgid "[B]CONFIGURE PICTURE SETTINGS[/B][CR][CR]Set picture listing options · Configure slideshow"
diff --git a/addons/skin.confluence/language/resource.language.en_us/strings.po b/addons/skin.confluence/language/resource.language.en_us/strings.po
index ca94b1b822..147c384eb2 100644
--- a/addons/skin.confluence/language/resource.language.en_us/strings.po
+++ b/addons/skin.confluence/language/resource.language.en_us/strings.po
@@ -228,14 +228,6 @@ msgctxt "#31125"
msgid "Show background \"Now playing\" visualisation"
msgstr "Show background \"Now playing\" visualization"
-msgctxt "#31126"
-msgid "Play TV theme songs in video library (TvTunes add-on)"
-msgstr "Play TV theme songs in video library (TvTunes add-on)"
-
-msgctxt "#31127"
-msgid "TvTunes"
-msgstr "TvTunes"
-
msgctxt "#31128"
msgid "Lyrics"
msgstr "Lyrics"
@@ -352,10 +344,6 @@ msgctxt "#31320"
msgid "Last logged in"
msgstr "Last logged in"
-msgctxt "#31321"
-msgid "Karaoke song selector"
-msgstr "Karaoke song selector"
-
msgctxt "#31322"
msgid "Aired"
msgstr "Aired"
@@ -444,10 +432,6 @@ msgctxt "#31401"
msgid "[B]CONFIGURE VIDEO SETTINGS[/B][CR][CR]Manage your video library · Set video playback options · Change video listing options[CR]Set subtitle fonts"
msgstr "[B]CONFIGURE VIDEO SETTINGS[/B][CR][CR]Manage your video library · Set video playback options · Change video listing options[CR]Set subtitle fonts"
-msgctxt "#31402"
-msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission · Set karaoke options"
-msgstr "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission · Set karaoke options"
-
msgctxt "#31403"
msgid "[B]CONFIGURE PICTURE SETTINGS[/B][CR][CR]Set picture listing options · Configure slideshow"
msgstr "[B]CONFIGURE PICTURE SETTINGS[/B][CR][CR]Set picture listing options · Configure slideshow"
diff --git a/addons/skin.confluence/language/resource.language.es_ar/strings.po b/addons/skin.confluence/language/resource.language.es_ar/strings.po
index da6145df30..1559b2b22b 100644
--- a/addons/skin.confluence/language/resource.language.es_ar/strings.po
+++ b/addons/skin.confluence/language/resource.language.es_ar/strings.po
@@ -16,10 +16,22 @@ msgstr ""
"Language: es_AR\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+msgctxt "#31000"
+msgid "Change your"
+msgstr "Modifique sus"
+
+msgctxt "#31003"
+msgid "Power options"
+msgstr "Opciones de energía"
+
msgctxt "#31004"
msgid "Working..."
msgstr "Cargando..."
+msgctxt "#31005"
+msgid "Hide information"
+msgstr "Ocultar información"
+
msgctxt "#31006"
msgid "View options"
msgstr "Vista"
@@ -28,6 +40,10 @@ msgctxt "#31008"
msgid "Full screen"
msgstr "Pantalla completa"
+msgctxt "#31009"
+msgid "Total duration"
+msgstr "Duración total"
+
msgctxt "#31022"
msgid "Music - Files"
msgstr "Archivos - música"
@@ -44,14 +60,30 @@ msgctxt "#31025"
msgid "Items"
msgstr "Elementos"
+msgctxt "#31026"
+msgid "Misc options"
+msgstr "Opciones varias"
+
msgctxt "#31027"
msgid "Location"
msgstr "Ubicación"
+msgctxt "#31028"
+msgid "Poster wrap"
+msgstr "Flujo de póster"
+
msgctxt "#31029"
msgid "Fanart"
msgstr "Fanart"
+msgctxt "#31031"
+msgid "Pic thumbs"
+msgstr "Miniaturas"
+
+msgctxt "#31032"
+msgid "Image wrap"
+msgstr "Flujo de imagen"
+
msgctxt "#31033"
msgid "Info"
msgstr "Info"
@@ -60,6 +92,10 @@ msgctxt "#31039"
msgid "Actions"
msgstr "Acciones"
+msgctxt "#31040"
+msgid "Now playing"
+msgstr "Reproduciendo"
+
msgctxt "#31042"
msgid "PLAYING"
msgstr "REPRODUCIENDO"
@@ -80,6 +116,10 @@ msgctxt "#31046"
msgid "SEEKING"
msgstr "BUSCANDO"
+msgctxt "#31048"
+msgid "Visualisation presets"
+msgstr "Visualizaciones preestablecidas"
+
msgctxt "#31049"
msgid "End time"
msgstr "Hora de finalización"
@@ -116,6 +156,10 @@ msgctxt "#31060"
msgid "This file is stacked, select the part you want to play from."
msgstr "Este archivo está agrupado, selecciona la parte desde la que desea reproducir."
+msgctxt "#31061"
+msgid "Current selected"
+msgstr "Seleccionado"
+
msgctxt "#31101"
msgid "Home screen options"
msgstr "Opciones de la pantalla principal"
@@ -124,10 +168,26 @@ msgctxt "#31102"
msgid "Background"
msgstr "Fondo"
+msgctxt "#31103"
+msgid "Show \"Paused\" in picture slideshow"
+msgstr "Mostrar \"Pausa\" en modo presentación de imágenes"
+
+msgctxt "#31104"
+msgid "Play trailers in a window [COLOR=grey3](Video information dialogue only)[/COLOR]"
+msgstr "Reproducir avances en ventana [COLOR=grey3](Sólo diálogo de información de video)[/COLOR] "
+
msgctxt "#31106"
msgid "Miscellaneous options"
msgstr "Otras opciones"
+msgctxt "#31107"
+msgid "Hide flagging read from video filenames [COLOR=grey3](e.g. Blu-ray, HD-DVD)[/COLOR]"
+msgstr "Ocultar marcas de lectura de archivos de video [COLOR=grey3](Blu-ray, HD-DVD)[/COLOR]"
+
+msgctxt "#31108"
+msgid "Hide main menu buttons"
+msgstr "Ocultar botones del menú principal"
+
msgctxt "#31109"
msgid "Enable custom background"
msgstr "Habilitar fondo personalizado"
@@ -144,18 +204,54 @@ msgctxt "#31112"
msgid "Options"
msgstr "Opciones"
-msgctxt "#31126"
-msgid "Play TV theme songs in video library (TvTunes add-on)"
-msgstr "Reproducir canciones de series en la colección de video (complemento TvTunes)"
+msgctxt "#31116"
+msgid "Show recently added albums"
+msgstr "Mostrar últimos discos añadidos"
+
+msgctxt "#31117"
+msgid "Show recently added videos"
+msgstr "Mostrar últimos videos añadidos"
-msgctxt "#31127"
-msgid "TvTunes"
-msgstr "TvTunes"
+msgctxt "#31118"
+msgid "Home page programs submenu"
+msgstr "Submenú de programas de la pantalla principal"
+
+msgctxt "#31119"
+msgid "Hide background fanart"
+msgstr "Ocultar el Fanart del fondo"
+
+msgctxt "#31124"
+msgid "Show background \"Now playing\" video"
+msgstr "Mostrar video en reproducción en el fondo"
+
+msgctxt "#31125"
+msgid "Show background \"Now playing\" visualisation"
+msgstr "Mostrar visualización \"Reproduciendo ahora\" en el fondo"
msgctxt "#31128"
msgid "Lyrics"
msgstr "Letras"
+msgctxt "#31129"
+msgid "Hide fanart in full screen visualisation"
+msgstr "Ocultar Fanart con visualizaciones a pantalla completa"
+
+msgctxt "#31132"
+msgid "Lyrics add-on"
+msgstr "Add-on para letras"
+
+msgctxt "#31134"
+msgid "Home page \"Videos\" submenu"
+msgstr "Submenú de videos de la pantalla principal"
+
+msgctxt "#31135"
+msgid "Home page \"Music\" submenu"
+msgstr "Submenú de música de la pantalla principal"
+
+msgctxt "#31136"
+msgid "Home page \"Pictures\" submenu"
+msgstr "Submenú \"Fotos\" de la pantalla principal"
+
msgctxt "#31140"
msgid "Music OSD"
msgstr "OSD de música"
@@ -172,22 +268,90 @@ msgctxt "#31200"
msgid "Shortcuts"
msgstr "Accesos directos"
+msgctxt "#31203"
+msgid "Choose your song"
+msgstr "Elija su canción"
+
+msgctxt "#31205"
+msgid "Lyrics source"
+msgstr "Fuente para letras"
+
msgctxt "#31206"
msgid "Found"
msgstr "Encontrados"
+msgctxt "#31207"
+msgid "Find more items"
+msgstr "Encuentra más elementos"
+
+msgctxt "#31208"
+msgid "Upcoming episodes"
+msgstr "Próximos episodios"
+
+msgctxt "#31300"
+msgid "Current temperature"
+msgstr "Temperatura actual"
+
+msgctxt "#31301"
+msgid "Last updated"
+msgstr "Última actualización"
+
msgctxt "#31303"
msgid "Data provider"
msgstr "Proveedor de datos"
+msgctxt "#31307"
+msgid "Hide fanart"
+msgstr "Ocultar fanart"
+
+msgctxt "#31308"
+msgid "Movie details"
+msgstr "Detalles de la película"
+
+msgctxt "#31309"
+msgid "Memory used:"
+msgstr "Memoria usada:"
+
+msgctxt "#31310"
+msgid "Track number"
+msgstr "Número de pista"
+
msgctxt "#31311"
msgid "Fanart image[CR][CR]Unavailable[CR][CR] Click button to set"
msgstr "Imagen fanart[CR][CR]no disponible[CR][CR]Click para elegir"
+msgctxt "#31312"
+msgid "Current scraper"
+msgstr "Scraper actual"
+
+msgctxt "#31313"
+msgid "Choose a scraper"
+msgstr "Elige un scraper"
+
+msgctxt "#31314"
+msgid "Content scanning options"
+msgstr "Opciones de escanéo de contenido"
+
+msgctxt "#31317"
+msgid "Set fanart path"
+msgstr "Selecciona ruta del fanart"
+
+msgctxt "#31319"
+msgid "Selected profile"
+msgstr "Perfil seleccionado"
+
+msgctxt "#31320"
+msgid "Last logged in"
+msgstr "Último inicio de sesión"
+
msgctxt "#31322"
msgid "Aired"
msgstr "Estrenado"
+msgctxt "#31325"
+msgid "Playlist options"
+msgstr "Opciones de lista de reproducción"
+
msgctxt "#31326"
msgid "Created"
msgstr "Creado"
@@ -196,10 +360,22 @@ msgctxt "#31327"
msgid "Resolution"
msgstr "Resolución"
+msgctxt "#31328"
+msgid "Recently added"
+msgstr "Añadidos/as recientemente"
+
msgctxt "#31329"
msgid "[B]Timer set![/B] [COLOR=grey2] - System auto shutdown in[/COLOR]"
msgstr "[B]Temporizador activado[/B] [COLOR=grey2] - El sistema se apagará en[/COLOR]"
+msgctxt "#31330"
+msgid "Click button to play[CR][CR]movie trailer"
+msgstr "Click para reproducir[CR][CR]trailer de película"
+
+msgctxt "#31331"
+msgid "Album details"
+msgstr "Detalles del disco"
+
msgctxt "#31351"
msgid "Pause"
msgstr "Pausar"
@@ -208,6 +384,10 @@ msgctxt "#31352"
msgid "Stop"
msgstr "Detener"
+msgctxt "#31353"
+msgid "Fast forward"
+msgstr "Avance rápido"
+
msgctxt "#31354"
msgid "Rewind"
msgstr "Retroceder"
@@ -216,6 +396,10 @@ msgctxt "#31355"
msgid "Movie menu"
msgstr "Menú película"
+msgctxt "#31356"
+msgid "Download subtitles"
+msgstr "Descargar subtítulos"
+
msgctxt "#31360"
msgid "Watch as 2D"
msgstr "Mirar como 2D"
@@ -232,6 +416,10 @@ msgctxt "#31390"
msgid "Skin default"
msgstr "Por defecto"
+msgctxt "#31391"
+msgid "Skin default with no caps"
+msgstr "Por defecto sin Mayúsculas"
+
msgctxt "#31392"
msgid "Arial based"
msgstr "Basada en Arial"
@@ -244,14 +432,22 @@ msgctxt "#31401"
msgid "[B]CONFIGURE VIDEO SETTINGS[/B][CR][CR]Manage your video library · Set video playback options · Change video listing options[CR]Set subtitle fonts"
msgstr "[B]Configura las opciones de VIDEO[/B][CR][CR]Administre su colección de video · Ajusta reproducción de video · Cambia opciones de listas de video[CR]Configura tipografía de subtítulos"
-msgctxt "#31402"
-msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission · Set karaoke options"
-msgstr "[B]Configura las opciones de MÚSICA[/B][CR][CR]Administre su colección de música · Ajusta reproducción de música · Cambia opciones de listas de música[CR]Configura envío de canciones · Configura el karaoke"
+msgctxt "#31403"
+msgid "[B]CONFIGURE PICTURE SETTINGS[/B][CR][CR]Set picture listing options · Configure slideshow"
+msgstr "[B]Configura las opciones de IMAGEN[/B][CR][CR]Cambia opciones de listas de imágenes - Configura presentación de diapositivas"
+
+msgctxt "#31404"
+msgid "[B]CONFIGURE WEATHER SETTINGS[/B][CR][CR]Set various cities to collect weather information"
+msgstr "[B]Configura las opciones de EL TIEMPO[/B][CR][CR]Establece varias ciudades para información meteorológica"
msgctxt "#31406"
msgid "[B]CONFIGURE SYSTEM SETTINGS[/B][CR][CR]Setup and calibrate displays · Configure audio output · Setup remote controls[CR]Set power saving options · Enable debugging · Setup master lock"
msgstr "[B]Configura las opciones de SISTEMA[/B][CR][CR]Configura y calibra la pantalla - Configura salida de audio - Configura mandos a distancia[CR]Establece las opciones de ahorro de energía - Habilita depuración de errores - Configura bloqueo maestro"
+msgctxt "#31408"
+msgid "[B]CONFIGURE ADD-ONS[/B][CR][CR]Manage your installed add-ons · Browse for and install add-ons from kodi.tv[CR]Modify add-on settings"
+msgstr "[B]Configura los ADD-ONS[/B][CR][CR]Administre addons instalados · Busca e instala addons desde kodi.tv[CR]Modifica la configuración de los addons"
+
msgctxt "#31409"
msgid "[B]CONFIGURE TV SETTINGS[/B][CR][CR]Change full screen info · Manage EPG data settings"
msgstr "[B]CONFIGURAR OPCIONES DE TV[/B][CR][CR]Cambiar info pantalla completa · Especificar datos de guía GEP"
@@ -260,6 +456,14 @@ msgctxt "#31410"
msgid "[B]CONFIGURE SERVICE SETTINGS[/B][CR][CR]Setup control of Kodi via UPnP and HTTP · Configure file sharing[CR]Enable Zeroconf · Configure AirPlay"
msgstr "[B]AJUSTES DE SERVICIOS[/B][CR][CR]Ajustes para controlar Kodi por UPnP y HTTP - Ajustes de archivos compartidos[CR]Activar Zeroconf - Ajustes de AirPlay"
+msgctxt "#31411"
+msgid "First run help..."
+msgstr "Ayuda para la primera vez..."
+
+msgctxt "#31412"
+msgid "This tab signifies that there is a menu off to the side of this window that contains extra options for this section. To access the menu, navigate to the left with your remote control or keyboard or place your mouse pointer over the tab. [CR][CR]Click \"OK\" to close this dialogue. It will not appear again."
+msgstr "Esta pestaña significa que hay un menú oculto a un lado de esta ventana que contiene opciones adicionales para esta sección. Para acceder al menú, desplácese a la izquierda con el mando a distancia o el teclado o sitúe el puntero del ratón sobre la pestaña. [CR][CR] Haga clic en \"Aceptar\" para cerrar este cuadro de diálogo. Este no volverá a aparecer."
+
msgctxt "#31413"
msgid "Local subtitle available"
msgstr "Subtitulo local disponible"
@@ -268,6 +472,10 @@ msgctxt "#31420"
msgid "Login"
msgstr "Ingresar"
+msgctxt "#31421"
+msgid "Select your Kodi user profile[CR]to login and continue"
+msgstr "Seleccione su perfil de usuario de Kodi[CR]para ingresar y continuar"
+
msgctxt "#31422"
msgid "Show or hide the login screen at startup."
msgstr "Mostrar u ocultar la pantalla de ingreso al iniciar."
@@ -276,18 +484,66 @@ msgctxt "#31423"
msgid "Select the profile that will be used at startup when the login screen is disabled."
msgstr "Seleccionar el perfil que se usará en el inicio cuando la pantalla de ingreso esta deshabilitada."
+msgctxt "#31501"
+msgid "Scheduled time"
+msgstr "Hora programada"
+
msgctxt "#31502"
msgid "TV"
msgstr "TV"
+msgctxt "#31503"
+msgid "Add group"
+msgstr "Añdadir Grupo"
+
+msgctxt "#31504"
+msgid "Rename group"
+msgstr "Renombrar Grupo"
+
+msgctxt "#31505"
+msgid "Delete group"
+msgstr "Borrar Grupo"
+
msgctxt "#31506"
msgid "Available[CR]Groups"
msgstr "Grupos[CR]disponibles"
+msgctxt "#31509"
+msgid "Channel group"
+msgstr "Grupo de canales"
+
+msgctxt "#31510"
+msgid "Timer set"
+msgstr "Programar grabación"
+
+msgctxt "#31511"
+msgid "Channel options"
+msgstr "Opciones de canal"
+
+msgctxt "#31901"
+msgid "36-hour forecast"
+msgstr "Pronóstico de 36 hs"
+
+msgctxt "#31902"
+msgid "Hourly forecast"
+msgstr "Pronóstico por hora"
+
+msgctxt "#31903"
+msgid "Weekend forecast"
+msgstr "Pronóstico para el fin de semana"
+
+msgctxt "#31904"
+msgid "Daily forecast"
+msgstr "Pronóstico diario"
+
msgctxt "#31905"
msgid "Forecast"
msgstr "Pronóstico"
+msgctxt "#31908"
+msgid "Chance of precipitation"
+msgstr "Probabilidad de precipitación"
+
msgctxt "#31909"
msgid "Fetching forecast info..."
msgstr "Obteniendo información meteorológica..."
diff --git a/addons/skin.confluence/language/resource.language.es_es/strings.po b/addons/skin.confluence/language/resource.language.es_es/strings.po
index 2db0e4f959..e3ca6044c1 100644
--- a/addons/skin.confluence/language/resource.language.es_es/strings.po
+++ b/addons/skin.confluence/language/resource.language.es_es/strings.po
@@ -228,14 +228,6 @@ msgctxt "#31125"
msgid "Show background \"Now playing\" visualisation"
msgstr "Mostrar de fondo la visualización \"Ahora reproduciendo\""
-msgctxt "#31126"
-msgid "Play TV theme songs in video library (TvTunes add-on)"
-msgstr "Reproducir sintonías en la colección de vídeo (complemento TvTunes)"
-
-msgctxt "#31127"
-msgid "TvTunes"
-msgstr "TvTunes"
-
msgctxt "#31128"
msgid "Lyrics"
msgstr "Letra"
@@ -352,10 +344,6 @@ msgctxt "#31320"
msgid "Last logged in"
msgstr "Última sesión el"
-msgctxt "#31321"
-msgid "Karaoke song selector"
-msgstr "Selector de canción de karaoke"
-
msgctxt "#31322"
msgid "Aired"
msgstr "Emitido"
@@ -444,10 +432,6 @@ msgctxt "#31401"
msgid "[B]CONFIGURE VIDEO SETTINGS[/B][CR][CR]Manage your video library · Set video playback options · Change video listing options[CR]Set subtitle fonts"
msgstr "[B]Configura las opciones de VÃDEO[/B][CR][CR]Administra tu colección de vídeo - Ajusta reproducción de vídeo - Cambia opciones de listas de vídeo[CR]Configura fuentes de subtítulos"
-msgctxt "#31402"
-msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission · Set karaoke options"
-msgstr "[B]Configura las opciones de MÚSICA[/B][CR][CR]Administra tu colección de música · Ajusta reproducción de música · Cambia opciones de listas de música[CR]Configura sumisión de canciones · Configura el karaoke"
-
msgctxt "#31403"
msgid "[B]CONFIGURE PICTURE SETTINGS[/B][CR][CR]Set picture listing options · Configure slideshow"
msgstr "[B]Configura las opciones de IMAGEN[/B][CR][CR]Establece opciones de listas de imágenes - Configura presentación de diapositivas"
diff --git a/addons/skin.confluence/language/resource.language.es_mx/strings.po b/addons/skin.confluence/language/resource.language.es_mx/strings.po
index 23825f0094..b89250df34 100644
--- a/addons/skin.confluence/language/resource.language.es_mx/strings.po
+++ b/addons/skin.confluence/language/resource.language.es_mx/strings.po
@@ -16,6 +16,10 @@ msgstr ""
"Language: es_MX\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+msgctxt "#31000"
+msgid "Change your"
+msgstr "Cambiar al tuyo"
+
msgctxt "#31004"
msgid "Working..."
msgstr "Trabajando..."
@@ -144,14 +148,6 @@ msgctxt "#31112"
msgid "Options"
msgstr "Opciones"
-msgctxt "#31126"
-msgid "Play TV theme songs in video library (TvTunes add-on)"
-msgstr "Reproducir canciones temáticas de TV en la biblioteca de Video (TvTunes add-on)"
-
-msgctxt "#31127"
-msgid "TvTunes"
-msgstr "TvTunes"
-
msgctxt "#31128"
msgid "Lyrics"
msgstr "Letras"
@@ -244,10 +240,6 @@ msgctxt "#31401"
msgid "[B]CONFIGURE VIDEO SETTINGS[/B][CR][CR]Manage your video library · Set video playback options · Change video listing options[CR]Set subtitle fonts"
msgstr "[B]CONFIGURAR AJUSTES DE VIDEO[/B][CR][CR]Administrar tu biblioteca de video · Configurar las opciones de reproducción de vídeo · Cambiar las opciones de listado de videos[CR]Establecer fuentes de subtítulos"
-msgctxt "#31402"
-msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission · Set karaoke options"
-msgstr "[B]CONFIGURAR AJUSTES DE MÚSICA[/B][CR][CR]Administrar tu biblioteca de música · Configurar las opciones de reproducción de música · Cambiar las opciones de listado de música [CR]Configurar el envío de canciones · Ajustar opciones de karaoke"
-
msgctxt "#31406"
msgid "[B]CONFIGURE SYSTEM SETTINGS[/B][CR][CR]Setup and calibrate displays · Configure audio output · Setup remote controls[CR]Set power saving options · Enable debugging · Setup master lock"
msgstr "[B]CONFIGURAR AJUSTES DE SISTEMA[/B][CR][CR]Configurar y calibrar las pantallas · Configurar salida de audio · Configurar controles remotos[CR]Configurar opciones de ahorro de energía · Habilitar depuración · Configurar Bloqueo Maestro"
diff --git a/addons/skin.confluence/language/resource.language.et_ee/strings.po b/addons/skin.confluence/language/resource.language.et_ee/strings.po
index 9ff3b00669..d92744ab8e 100644
--- a/addons/skin.confluence/language/resource.language.et_ee/strings.po
+++ b/addons/skin.confluence/language/resource.language.et_ee/strings.po
@@ -144,14 +144,6 @@ msgctxt "#31112"
msgid "Options"
msgstr "Valikud"
-msgctxt "#31126"
-msgid "Play TV theme songs in video library (TvTunes add-on)"
-msgstr "Esita videoteegis sarjade tunnusmuusikat (TvTunes lisamoodul)"
-
-msgctxt "#31127"
-msgid "TvTunes"
-msgstr "TvTunes"
-
msgctxt "#31128"
msgid "Lyrics"
msgstr "Laulutekst"
@@ -244,10 +236,6 @@ msgctxt "#31401"
msgid "[B]CONFIGURE VIDEO SETTINGS[/B][CR][CR]Manage your video library · Set video playback options · Change video listing options[CR]Set subtitle fonts"
msgstr "[B]KONFIGUREERI VIDEO SEADEID[/B][CR][CR]Halda enda videoteeki · Määra video esitamise seaded · Muuda videoloendi valikuid[CR]Määra subtiitrite font"
-msgctxt "#31402"
-msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission · Set karaoke options"
-msgstr "[B]KONFIGUREERI MUUSIKA SEADEID[/B][CR][CR]Halda enda muusikateeki · Määra muusika esitamise seaded · Muuda muusikaloendi valikuid[CR]Seadista loo esitamine · Seadista karaoke valikud"
-
msgctxt "#31406"
msgid "[B]CONFIGURE SYSTEM SETTINGS[/B][CR][CR]Setup and calibrate displays · Configure audio output · Setup remote controls[CR]Set power saving options · Enable debugging · Setup master lock"
msgstr "[B]KONFIGUREERI SÜSTEEMI SEADEID[/B][CR][CR]Seadista ja kalibreeri ekraane · Konfigureeri heliväljundit · Seadista kaugjuhtimine[CR]Määra energiasäästu valikud· Luba silumine · Seadista pealukk"
diff --git a/addons/skin.confluence/language/resource.language.fa_ir/strings.po b/addons/skin.confluence/language/resource.language.fa_ir/strings.po
index db58094917..6c52600ae5 100644
--- a/addons/skin.confluence/language/resource.language.fa_ir/strings.po
+++ b/addons/skin.confluence/language/resource.language.fa_ir/strings.po
@@ -60,6 +60,10 @@ msgctxt "#31039"
msgid "Actions"
msgstr "عملیات"
+msgctxt "#31040"
+msgid "Now playing"
+msgstr "در حال پخش"
+
msgctxt "#31042"
msgid "PLAYING"
msgstr "در حال پخش"
@@ -140,18 +144,14 @@ msgctxt "#31112"
msgid "Options"
msgstr "گزینه ها"
-msgctxt "#31126"
-msgid "Play TV theme songs in video library (TvTunes add-on)"
-msgstr "پخش موسیقی تیتر تلویزیون در کتابخانه ویدئویی (اÙزونه TvTunes)"
-
-msgctxt "#31127"
-msgid "TvTunes"
-msgstr "TvTunes"
-
msgctxt "#31128"
msgid "Lyrics"
msgstr "اشعار"
+msgctxt "#31132"
+msgid "Lyrics add-on"
+msgstr "اÙزونه متن ترانه"
+
msgctxt "#31140"
msgid "Music OSD"
msgstr "موسیقی"
@@ -212,6 +212,10 @@ msgctxt "#31355"
msgid "Movie menu"
msgstr "منو Ùیلم"
+msgctxt "#31356"
+msgid "Download subtitles"
+msgstr "دانلود زیر نویس ها"
+
msgctxt "#31360"
msgid "Watch as 2D"
msgstr "تماشا بصورت دو بعدی"
@@ -240,10 +244,6 @@ msgctxt "#31401"
msgid "[B]CONFIGURE VIDEO SETTINGS[/B][CR][CR]Manage your video library · Set video playback options · Change video listing options[CR]Set subtitle fonts"
msgstr "[B] تنظیمات ویدئو[/B] [CR][CR] مرتب سازی کتابخانه ویدئویی. تنظیمات پخش ویدئو. انتخاب گزینه های مرتب سازی ویدئو. [CR] انتخاب قلم زیرنویس ها."
-msgctxt "#31402"
-msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission · Set karaoke options"
-msgstr "[B] تنظیمات موسیقی[/B] [CR][CR] مرتب سازی کتابخانه موسیقی. تنظیمات پخش موسیقی. انتخاب گزینه های مرتب سازی موسیقی . [CR] انتخاب گزینه های همخوانی."
-
msgctxt "#31406"
msgid "[B]CONFIGURE SYSTEM SETTINGS[/B][CR][CR]Setup and calibrate displays · Configure audio output · Setup remote controls[CR]Set power saving options · Enable debugging · Setup master lock"
msgstr "[B] تنظیمات سیستم [/B] [CR][CR] راه اندازی Ùˆ کالیبره کردن نمایشگر ها. تنظیم پخش صدا. تنظیم کنترل از راه دور. [CR] انتخاب گزینه های صرÙÙ‡ جویی در انرژی - Ùعال کردن خطا یابی. تنظیم Ù‚ÙÙ„ اصلی."
@@ -276,10 +276,34 @@ msgctxt "#31502"
msgid "TV"
msgstr "تلویزیون"
+msgctxt "#31503"
+msgid "Add group"
+msgstr "اÙزودن گروه"
+
+msgctxt "#31504"
+msgid "Rename group"
+msgstr "تغییر نام گروه"
+
+msgctxt "#31505"
+msgid "Delete group"
+msgstr "حذ٠گروه"
+
msgctxt "#31506"
msgid "Available[CR]Groups"
msgstr "گروه های [CR]موجود"
+msgctxt "#31901"
+msgid "36-hour forecast"
+msgstr "پیش بینی 36 ساعته"
+
+msgctxt "#31903"
+msgid "Weekend forecast"
+msgstr "پیش بینی Ù‡Ùتگی"
+
+msgctxt "#31904"
+msgid "Daily forecast"
+msgstr "پیش بینی روزانه"
+
msgctxt "#31905"
msgid "Forecast"
msgstr "پیش بینی"
diff --git a/addons/skin.confluence/language/resource.language.fi_fi/strings.po b/addons/skin.confluence/language/resource.language.fi_fi/strings.po
index 324950cd28..8ce4263c00 100644
--- a/addons/skin.confluence/language/resource.language.fi_fi/strings.po
+++ b/addons/skin.confluence/language/resource.language.fi_fi/strings.po
@@ -16,10 +16,22 @@ msgstr ""
"Language: fi_FI\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+msgctxt "#31000"
+msgid "Change your"
+msgstr "Määritä"
+
+msgctxt "#31003"
+msgid "Power options"
+msgstr "Virta-asetukset"
+
msgctxt "#31004"
msgid "Working..."
msgstr "Suoritetaan..."
+msgctxt "#31005"
+msgid "Hide information"
+msgstr "Piilota tiedot"
+
msgctxt "#31006"
msgid "View options"
msgstr "Näkymä valinnat"
@@ -28,6 +40,10 @@ msgctxt "#31008"
msgid "Full screen"
msgstr "Kokoruutu"
+msgctxt "#31009"
+msgid "Total duration"
+msgstr "Kokonaiskesto"
+
msgctxt "#31022"
msgid "Music - Files"
msgstr "Musiikki - Tiedostot"
@@ -44,14 +60,30 @@ msgctxt "#31025"
msgid "Items"
msgstr "Kohdetta"
+msgctxt "#31026"
+msgid "Misc options"
+msgstr "Muut asetukset"
+
msgctxt "#31027"
msgid "Location"
msgstr "Paikkakunta"
+msgctxt "#31028"
+msgid "Poster wrap"
+msgstr "Julistekierto"
+
msgctxt "#31029"
msgid "Fanart"
msgstr "Fanitaide"
+msgctxt "#31031"
+msgid "Pic thumbs"
+msgstr "Kuva pienoiskuvake"
+
+msgctxt "#31032"
+msgid "Image wrap"
+msgstr "Kuvakierto"
+
msgctxt "#31033"
msgid "Info"
msgstr "Tiedot"
@@ -60,6 +92,10 @@ msgctxt "#31039"
msgid "Actions"
msgstr "Toiminnot"
+msgctxt "#31040"
+msgid "Now playing"
+msgstr "Nyt toistetaan"
+
msgctxt "#31042"
msgid "PLAYING"
msgstr "TOISTETAAN"
@@ -80,6 +116,10 @@ msgctxt "#31046"
msgid "SEEKING"
msgstr "HAKEE"
+msgctxt "#31048"
+msgid "Visualisation presets"
+msgstr "Visualisoinnin esiasetukset"
+
msgctxt "#31049"
msgid "End time"
msgstr "Päättymisaika"
@@ -116,6 +156,10 @@ msgctxt "#31060"
msgid "This file is stacked, select the part you want to play from."
msgstr "Tämä tiedosto on pinottu, valitse osa jonka haluat toistaa."
+msgctxt "#31061"
+msgid "Current selected"
+msgstr "Nyt valittuna"
+
msgctxt "#31101"
msgid "Home screen options"
msgstr "Päävalikon asetukset"
@@ -124,10 +168,26 @@ msgctxt "#31102"
msgid "Background"
msgstr "Tausta"
+msgctxt "#31103"
+msgid "Show \"Paused\" in picture slideshow"
+msgstr "Näytä \"Tauko\" kuvaesityksessä"
+
+msgctxt "#31104"
+msgid "Play trailers in a window [COLOR=grey3](Video information dialogue only)[/COLOR]"
+msgstr "Toista trailerit ikkunassa [COLOR=grey3](Vain videon informaatiodialogi)[/COLOR]"
+
msgctxt "#31106"
msgid "Miscellaneous options"
msgstr "Yleiset asetukset"
+msgctxt "#31107"
+msgid "Hide flagging read from video filenames [COLOR=grey3](e.g. Blu-ray, HD-DVD)[/COLOR]"
+msgstr "Piilota tiedostojen nimistä luetut merkinnät [COLOR=grey3](Blu-ray, HD-DVD)[/COLOR]"
+
+msgctxt "#31108"
+msgid "Hide main menu buttons"
+msgstr "Piilota päävalikon painikkeet"
+
msgctxt "#31109"
msgid "Enable custom background"
msgstr "Valinnainen taustakuva käytössä"
@@ -144,18 +204,54 @@ msgctxt "#31112"
msgid "Options"
msgstr "Asetukset"
-msgctxt "#31126"
-msgid "Play TV theme songs in video library (TvTunes add-on)"
-msgstr "Toista TV-tunnusmusiikit videokirjastossa (TvTunes-lisäosa)"
+msgctxt "#31116"
+msgid "Show recently added albums"
+msgstr "Näytä viimeksi lisätyt albumit"
+
+msgctxt "#31117"
+msgid "Show recently added videos"
+msgstr "Näytä viimeksi lisätyt videot"
-msgctxt "#31127"
-msgid "TvTunes"
-msgstr "TvTunes"
+msgctxt "#31118"
+msgid "Home page programs submenu"
+msgstr "Kotisivu Ohjelmat Alavalikko"
+
+msgctxt "#31119"
+msgid "Hide background fanart"
+msgstr "Piilota taustan fanitaide"
+
+msgctxt "#31124"
+msgid "Show background \"Now playing\" video"
+msgstr "Näytä taustalla \"Nyt katsellaan\"-video"
+
+msgctxt "#31125"
+msgid "Show background \"Now playing\" visualisation"
+msgstr "Näytä taustalla \"Nyt soi\"-visualisaatio"
msgctxt "#31128"
msgid "Lyrics"
msgstr "Sanoitukset"
+msgctxt "#31129"
+msgid "Hide fanart in full screen visualisation"
+msgstr "Piilot fanitaide kun visualisointi toistetaan koko ruudussa"
+
+msgctxt "#31132"
+msgid "Lyrics add-on"
+msgstr "Sanoitukset-lisäosa"
+
+msgctxt "#31134"
+msgid "Home page \"Videos\" submenu"
+msgstr "Kotisivu Videot Alavalikko"
+
+msgctxt "#31135"
+msgid "Home page \"Music\" submenu"
+msgstr "Kotisivu Musiikki Alavalikko"
+
+msgctxt "#31136"
+msgid "Home page \"Pictures\" submenu"
+msgstr "Kotisivu Kuvat Alavalikko"
+
msgctxt "#31140"
msgid "Music OSD"
msgstr "Musiikki-OSD"
@@ -172,22 +268,90 @@ msgctxt "#31200"
msgid "Shortcuts"
msgstr "Pikavalinnat"
+msgctxt "#31203"
+msgid "Choose your song"
+msgstr "Valitse kappale"
+
+msgctxt "#31205"
+msgid "Lyrics source"
+msgstr "Sanoitusten lähde"
+
msgctxt "#31206"
msgid "Found"
msgstr "Löytyi"
+msgctxt "#31207"
+msgid "Find more items"
+msgstr "Etsi lisää kohteita"
+
+msgctxt "#31208"
+msgid "Upcoming episodes"
+msgstr "Tulevat jaksot"
+
+msgctxt "#31300"
+msgid "Current temperature"
+msgstr "Tämänhetkinen lämpötila"
+
+msgctxt "#31301"
+msgid "Last updated"
+msgstr "Viimeksi päivitetty"
+
msgctxt "#31303"
msgid "Data provider"
msgstr "Tietojen tarjoaja"
+msgctxt "#31307"
+msgid "Hide fanart"
+msgstr "Piilota fanitaide"
+
+msgctxt "#31308"
+msgid "Movie details"
+msgstr "Elokuvan tiedot"
+
+msgctxt "#31309"
+msgid "Memory used:"
+msgstr "Käytetty muisti:"
+
+msgctxt "#31310"
+msgid "Track number"
+msgstr "Kappalenumero"
+
msgctxt "#31311"
msgid "Fanart image[CR][CR]Unavailable[CR][CR] Click button to set"
msgstr "Fanitaide kuvaa[CR][CR]ei ole saatavilla[CR][CR]Klikkaa asettaaksesi"
+msgctxt "#31312"
+msgid "Current scraper"
+msgstr "Nykyinen hakupaikka"
+
+msgctxt "#31313"
+msgid "Choose a scraper"
+msgstr "Valitse hakupaikka"
+
+msgctxt "#31314"
+msgid "Content scanning options"
+msgstr "Sisällön hakuasetukset"
+
+msgctxt "#31317"
+msgid "Set fanart path"
+msgstr "Aseta fanitaiteen polku"
+
+msgctxt "#31319"
+msgid "Selected profile"
+msgstr "Valittu profiili"
+
+msgctxt "#31320"
+msgid "Last logged in"
+msgstr "Viimeksi kirjauduttu"
+
msgctxt "#31322"
msgid "Aired"
msgstr "Esitetty"
+msgctxt "#31325"
+msgid "Playlist options"
+msgstr "Toistolistan asetukset"
+
msgctxt "#31326"
msgid "Created"
msgstr "Luotu"
@@ -204,6 +368,14 @@ msgctxt "#31329"
msgid "[B]Timer set![/B] [COLOR=grey2] - System auto shutdown in[/COLOR]"
msgstr "[B]Ajastus[/B] [COLOR=grey2] - Aikaa järjestelmän sammuttamiseen[/COLOR]"
+msgctxt "#31330"
+msgid "Click button to play[CR][CR]movie trailer"
+msgstr "Paina painiketta katsoaksesi[CR][CR]elokuvaesittelyn"
+
+msgctxt "#31331"
+msgid "Album details"
+msgstr "Albumin tiedot"
+
msgctxt "#31351"
msgid "Pause"
msgstr "Tauko"
@@ -212,6 +384,10 @@ msgctxt "#31352"
msgid "Stop"
msgstr "Pysäytä"
+msgctxt "#31353"
+msgid "Fast forward"
+msgstr "Kelaa eteenpäin"
+
msgctxt "#31354"
msgid "Rewind"
msgstr "Kelaa taaksepäin"
@@ -220,6 +396,10 @@ msgctxt "#31355"
msgid "Movie menu"
msgstr "Elokuvavalikko"
+msgctxt "#31356"
+msgid "Download subtitles"
+msgstr "Lataa tekstitykset"
+
msgctxt "#31360"
msgid "Watch as 2D"
msgstr "Katso 2D:nä"
@@ -236,6 +416,10 @@ msgctxt "#31390"
msgid "Skin default"
msgstr "Ulkoasun oletus"
+msgctxt "#31391"
+msgid "Skin default with no caps"
+msgstr "Ulkoasun oletus ilman isoja kirjaimia"
+
msgctxt "#31392"
msgid "Arial based"
msgstr "Arial pohjainen"
@@ -248,14 +432,22 @@ msgctxt "#31401"
msgid "[B]CONFIGURE VIDEO SETTINGS[/B][CR][CR]Manage your video library · Set video playback options · Change video listing options[CR]Set subtitle fonts"
msgstr "[B]Muokkaa video-asetuksia[/B][CR][CR]Hallitse videokirjastoa · Aseta videotoiston asetukset · Vaihda videolistauksen asetuksia[CR]Aseta tekstitysasetukset"
-msgctxt "#31402"
-msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission · Set karaoke options"
-msgstr "[B]Muokkaa musiikki-asetuksia[/B][CR][CR]Hallitse musiikkikirjastoa · Aseta musiikkitoiston asetukset · Vaihda musiikkilistauksen[CR]asetuksia · Aseta kappaleen lähetysasetuksia · Aseta karaoke-asetukset"
+msgctxt "#31403"
+msgid "[B]CONFIGURE PICTURE SETTINGS[/B][CR][CR]Set picture listing options · Configure slideshow"
+msgstr "[B]Muokkaa kuva-asetuksia[/B][CR][CR]Aseta kuvalistauksen asetukset · Määritä kuvaesityksiä"
+
+msgctxt "#31404"
+msgid "[B]CONFIGURE WEATHER SETTINGS[/B][CR][CR]Set various cities to collect weather information"
+msgstr "[B]Muokkaa sää-asetuksia[/B][CR][CR]Aseta eri kaupunkeja joista noudetaan säätiedot"
msgctxt "#31406"
msgid "[B]CONFIGURE SYSTEM SETTINGS[/B][CR][CR]Setup and calibrate displays · Configure audio output · Setup remote controls[CR]Set power saving options · Enable debugging · Setup master lock"
msgstr "[B]Muokkaa järjestelmän asetuksia[/B][CR][CR]Aseta ja kalibroi näyttö · Määritä äänilähtö · Aseta kauko-ohjaus[CR]Aseta sähkönsäästöasetukset · Ota debuggaus käyttöön · Muokkaa pääkäyttäjän lukituksia"
+msgctxt "#31408"
+msgid "[B]CONFIGURE ADD-ONS[/B][CR][CR]Manage your installed add-ons · Browse for and install add-ons from kodi.tv[CR]Modify add-on settings"
+msgstr "[B]Muokkaa lisäosia[/B][CR][CR]Hallitse asennettuja lisäosia · Valitse ja asenna lisäosia kodi.tv:stä[CR]Muokkaa lisäosien asetuksia"
+
msgctxt "#31409"
msgid "[B]CONFIGURE TV SETTINGS[/B][CR][CR]Change full screen info · Manage EPG data settings"
msgstr "[B]MÄÄRITÄ TV-ASETUKSET[/B][CR][CR]Vaihda koko ruudun infoa · Hallitse EPG-tietojen asetuksia"
@@ -264,6 +456,14 @@ msgctxt "#31410"
msgid "[B]CONFIGURE SERVICE SETTINGS[/B][CR][CR]Setup control of Kodi via UPnP and HTTP · Configure file sharing[CR]Enable Zeroconf · Configure AirPlay"
msgstr "[B]CONFIGURE SERVICE SETTINGS[/B][CR][CR]Määritä Kodi:n kauko ohjaus käyttäen UPnP:tä ja HTTP:tä · Määritä tiedostonjako[CR]Kytke päälle Zeroconf · Määritä AirPlay"
+msgctxt "#31411"
+msgid "First run help..."
+msgstr "Ensimmäisen käynnistyksen apu..."
+
+msgctxt "#31412"
+msgid "This tab signifies that there is a menu off to the side of this window that contains extra options for this section. To access the menu, navigate to the left with your remote control or keyboard or place your mouse pointer over the tab. [CR][CR]Click \"OK\" to close this dialogue. It will not appear again."
+msgstr "Tämä välilehti merkitsee ikkunan sivussa olevan tämän osaston ekstravalikon. Käyttääksesi valikkoa, siirry vasemmalle kaukosäädintä, näppäimistöä tai hiiren kursoria käyttäen välilehdessä. [CR][CR]Paina \"Ok\" sulkeaksesi tämän ikkunan. Se ei ilmesty tämän jälkeen."
+
msgctxt "#31413"
msgid "Local subtitle available"
msgstr "Paikallinen tekstitys saatavilla"
@@ -272,6 +472,10 @@ msgctxt "#31420"
msgid "Login"
msgstr "Kirjaudu"
+msgctxt "#31421"
+msgid "Select your Kodi user profile[CR]to login and continue"
+msgstr "Valitse Kodi-käyttäjäprofiili[CR]kirjautuaksesi sisään"
+
msgctxt "#31422"
msgid "Show or hide the login screen at startup."
msgstr "Näytä tai piilota kirjautumisruutu käynnistyksessä."
@@ -280,18 +484,66 @@ msgctxt "#31423"
msgid "Select the profile that will be used at startup when the login screen is disabled."
msgstr "Valitse se profiili, jota käytetään käynnistyksessä, kun kirjautumisruutu on poiskytketty."
+msgctxt "#31501"
+msgid "Scheduled time"
+msgstr "Kellonaika"
+
msgctxt "#31502"
msgid "TV"
msgstr "TV"
+msgctxt "#31503"
+msgid "Add group"
+msgstr "Lisää ryhmä"
+
+msgctxt "#31504"
+msgid "Rename group"
+msgstr "Muuta ryhmän nimeä"
+
+msgctxt "#31505"
+msgid "Delete group"
+msgstr "Poista ryhmä"
+
msgctxt "#31506"
msgid "Available[CR]Groups"
msgstr "Saatavilla olevat[CR]ryhmät"
+msgctxt "#31509"
+msgid "Channel group"
+msgstr "Kanavaryhmä"
+
+msgctxt "#31510"
+msgid "Timer set"
+msgstr "Ajastettu"
+
+msgctxt "#31511"
+msgid "Channel options"
+msgstr "Kanavan valinnat"
+
+msgctxt "#31901"
+msgid "36-hour forecast"
+msgstr "36 tunnin ennuste"
+
+msgctxt "#31902"
+msgid "Hourly forecast"
+msgstr "Tunneittainen ennuste"
+
+msgctxt "#31903"
+msgid "Weekend forecast"
+msgstr "Viikonlopun ennuste"
+
+msgctxt "#31904"
+msgid "Daily forecast"
+msgstr "Päivittäinen Ennuste"
+
msgctxt "#31905"
msgid "Forecast"
msgstr "Ennuste"
+msgctxt "#31908"
+msgid "Chance of precipitation"
+msgstr "Sateen mahdollisuus"
+
msgctxt "#31909"
msgid "Fetching forecast info..."
msgstr "Noudetaan ennusteen tietoja..."
diff --git a/addons/skin.confluence/language/resource.language.fo_fo/strings.po b/addons/skin.confluence/language/resource.language.fo_fo/strings.po
index ca05f23095..e8e4f88c97 100644
--- a/addons/skin.confluence/language/resource.language.fo_fo/strings.po
+++ b/addons/skin.confluence/language/resource.language.fo_fo/strings.po
@@ -212,10 +212,6 @@ msgctxt "#31401"
msgid "[B]CONFIGURE VIDEO SETTINGS[/B][CR][CR]Manage your video library · Set video playback options · Change video listing options[CR]Set subtitle fonts"
msgstr "[B]STILLINGAR FYRI VIDEO[/B][CR][CR]Umsit títt video savn · Ãset møguleikar fyri video avspæling · Broyt stilling til vísing av video[CR]Ãset skrivtslag til undirtekstir"
-msgctxt "#31402"
-msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission · Set karaoke options"
-msgstr "[B]STILLINGAR FYRI TÓNLEIK[/B][CR][CR]Umsit títt tónleikasavn · Ãset stillingar fyri spæling av tónleiki · Broyt stilling til vísing av tónleiki[CR]Ãset skráseting av lagi · Ãset stillingar fyri karaoke"
-
msgctxt "#31406"
msgid "[B]CONFIGURE SYSTEM SETTINGS[/B][CR][CR]Setup and calibrate displays · Configure audio output · Setup remote controls[CR]Set power saving options · Enable debugging · Setup master lock"
msgstr "[B]STILLINGAR FYRI SKIPAN[/B][CR][CR]Set upp og stilla skermar · Stilla ljóð · Stilla fjarstýringar[CR]Stilla streymsparing · Tendra debugging · Ãset høvuðslás"
diff --git a/addons/skin.confluence/language/resource.language.fr_ca/strings.po b/addons/skin.confluence/language/resource.language.fr_ca/strings.po
index e035be13ce..1d8776eb9f 100644
--- a/addons/skin.confluence/language/resource.language.fr_ca/strings.po
+++ b/addons/skin.confluence/language/resource.language.fr_ca/strings.po
@@ -18,7 +18,7 @@ msgstr ""
msgctxt "#31000"
msgid "Change your"
-msgstr "Changer vos"
+msgstr "Changez vos"
msgctxt "#31003"
msgid "Power options"
@@ -228,14 +228,6 @@ msgctxt "#31125"
msgid "Show background \"Now playing\" visualisation"
msgstr "Afficher la visualisation d'arrière-plan « Lecture en cours »"
-msgctxt "#31126"
-msgid "Play TV theme songs in video library (TvTunes add-on)"
-msgstr "Jouer les indicatifs musicaux de la télé dans la vidéothèque (addiciel TvTunes)"
-
-msgctxt "#31127"
-msgid "TvTunes"
-msgstr "TvTunes"
-
msgctxt "#31128"
msgid "Lyrics"
msgstr "Paroles"
@@ -352,10 +344,6 @@ msgctxt "#31320"
msgid "Last logged in"
msgstr "Dernière connexion"
-msgctxt "#31321"
-msgid "Karaoke song selector"
-msgstr "Sélecteur de chanson karaoké"
-
msgctxt "#31322"
msgid "Aired"
msgstr "Diffusé"
@@ -444,10 +432,6 @@ msgctxt "#31401"
msgid "[B]CONFIGURE VIDEO SETTINGS[/B][CR][CR]Manage your video library · Set video playback options · Change video listing options[CR]Set subtitle fonts"
msgstr "[B]CONFIGURER LES PARAMÈTRES DES VIDÉOS[/B][CR][CR]Gérer la vidéothèque · Définir les options de lecture · Changer les options de listage des vidéos[CR]Définir la police des sous-titres"
-msgctxt "#31402"
-msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission · Set karaoke options"
-msgstr "[B]CONFIGURER LES PARAMÈTRES DE LA MUSIQUE[/B][CR][CR]Gérer l'audiothèque · Définir les options de lecture · Changer les options de listage de la musique[CR]Paramétrer les envois de chansons · Définir les options de karaoké"
-
msgctxt "#31403"
msgid "[B]CONFIGURE PICTURE SETTINGS[/B][CR][CR]Set picture listing options · Configure slideshow"
msgstr "[B]CONFIGURER LES PARAMÈTRES DES IMAGES[/B][CR][CR]Définir les options de listage des images · Configurer le diaporama"
diff --git a/addons/skin.confluence/language/resource.language.fr_fr/strings.po b/addons/skin.confluence/language/resource.language.fr_fr/strings.po
index 6adbcf260b..c1581f79f0 100644
--- a/addons/skin.confluence/language/resource.language.fr_fr/strings.po
+++ b/addons/skin.confluence/language/resource.language.fr_fr/strings.po
@@ -18,7 +18,7 @@ msgstr ""
msgctxt "#31000"
msgid "Change your"
-msgstr "Changer vos"
+msgstr "Modification des"
msgctxt "#31003"
msgid "Power options"
@@ -34,7 +34,7 @@ msgstr "Masquer les informations"
msgctxt "#31006"
msgid "View options"
-msgstr "Options d'affichage"
+msgstr "Options des vues"
msgctxt "#31008"
msgid "Full screen"
@@ -78,7 +78,7 @@ msgstr "Fanart"
msgctxt "#31031"
msgid "Pic thumbs"
-msgstr "Miniatures"
+msgstr "Galerie de miniatures"
msgctxt "#31032"
msgid "Image wrap"
@@ -86,7 +86,7 @@ msgstr "Galerie d'images"
msgctxt "#31033"
msgid "Info"
-msgstr "Info"
+msgstr "Infos"
msgctxt "#31039"
msgid "Actions"
@@ -102,7 +102,7 @@ msgstr "LECTURE"
msgctxt "#31043"
msgid "PAUSED"
-msgstr "PAUSE"
+msgstr "EN PAUSE"
msgctxt "#31044"
msgid "FAST FORWARD"
@@ -114,11 +114,11 @@ msgstr "RETOUR RAPIDE"
msgctxt "#31046"
msgid "SEEKING"
-msgstr "RECHERCHE"
+msgstr "DÉPLACEMENT"
msgctxt "#31048"
msgid "Visualisation presets"
-msgstr "Préréglages de visualisation"
+msgstr "Présélections de visualisation"
msgctxt "#31049"
msgid "End time"
@@ -126,11 +126,11 @@ msgstr "Heure de fin"
msgctxt "#31050"
msgid "Sort: Ascending"
-msgstr "Tri : Ascendant"
+msgstr "Ordre : Croissant"
msgctxt "#31051"
msgid "Sort: Descending"
-msgstr "Tri : Descendant"
+msgstr "Ordre : Décroissant"
msgctxt "#31055"
msgid "Open playlist"
@@ -154,7 +154,7 @@ msgstr "Liste de lecture actuelle"
msgctxt "#31060"
msgid "This file is stacked, select the part you want to play from."
-msgstr "Ce fichier est empilé, sélectionnez le point à partir duquel vous souhaitez le lire."
+msgstr "Ce fichier est empilé, sélectionner le point à partir duquel le lire."
msgctxt "#31061"
msgid "Current selected"
@@ -162,7 +162,7 @@ msgstr "Sélection actuelle"
msgctxt "#31101"
msgid "Home screen options"
-msgstr "Options de l'écran d'accueil"
+msgstr "Options de la page d'accueil"
msgctxt "#31102"
msgid "Background"
@@ -170,11 +170,11 @@ msgstr "Arrière-plan"
msgctxt "#31103"
msgid "Show \"Paused\" in picture slideshow"
-msgstr "Afficher \"Pause\" dans le diaporama d'images"
+msgstr "Afficher « Pause » dans le diaporama d'images"
msgctxt "#31104"
msgid "Play trailers in a window [COLOR=grey3](Video information dialogue only)[/COLOR]"
-msgstr "Lire les bandes-annonces dans une fenêtre [COLOR=grey3](Juste l'information de la vidéo)[/COLOR]"
+msgstr "Lire les bandes-annonces dans une fenêtre [COLOR=grey3](juste l'information de la vidéo)[/COLOR]"
msgctxt "#31106"
msgid "Miscellaneous options"
@@ -214,12 +214,16 @@ msgstr "Afficher les vidéos ajoutées récemment"
msgctxt "#31118"
msgid "Home page programs submenu"
-msgstr "Sous-menu \"Programmes\" de la page d'accueil"
+msgstr "Sous-menu Programmes de la page d'accueil"
msgctxt "#31119"
msgid "Hide background fanart"
msgstr "Masquer le fanart d'arrière-plan"
+msgctxt "#31122"
+msgid "Hide EPG if RDS is present on channel window"
+msgstr "Masquer le guide des programmes en présence de RDS sur le canal"
+
msgctxt "#31124"
msgid "Show background \"Now playing\" video"
msgstr "Afficher la vidéo en cours de lecture en arrière-plan"
@@ -228,14 +232,6 @@ msgctxt "#31125"
msgid "Show background \"Now playing\" visualisation"
msgstr "Afficher la visualisation en cours de lecture en arrière-plan"
-msgctxt "#31126"
-msgid "Play TV theme songs in video library (TvTunes add-on)"
-msgstr "Jouer les génériques TV dans la vidéothèque (extension TvTunes)"
-
-msgctxt "#31127"
-msgid "TvTunes"
-msgstr "TvTunes"
-
msgctxt "#31128"
msgid "Lyrics"
msgstr "Paroles"
@@ -246,31 +242,31 @@ msgstr "Masquer le fanart en visualisation plein écran"
msgctxt "#31132"
msgid "Lyrics add-on"
-msgstr "Extensions de paroles"
+msgstr "Extension de paroles"
msgctxt "#31134"
msgid "Home page \"Videos\" submenu"
-msgstr "Sous-menu \"Vidéos\" de la page d'accueil"
+msgstr "Sous-menu Vidéos de la page d'accueil"
msgctxt "#31135"
msgid "Home page \"Music\" submenu"
-msgstr "Sous-menu \"Musique\" de la page d'accueil"
+msgstr "Sous-menu Musique de la page d'accueil"
msgctxt "#31136"
msgid "Home page \"Pictures\" submenu"
-msgstr "Sous-menu \"Images\" de la page d'accueil"
+msgstr "Sous-menu Images de la page d'accueil"
msgctxt "#31140"
msgid "Music OSD"
-msgstr "Menu à l'écran Musique"
+msgstr "Incrustation à l'écran Musique"
msgctxt "#31141"
msgid "Video OSD"
-msgstr "Menu à l'écran Vidéo"
+msgstr "Incrustation à l'écran Vidéos"
msgctxt "#31142"
msgid "Settings level"
-msgstr "Niveau de paramètres"
+msgstr "Niveau de paramétrage"
msgctxt "#31200"
msgid "Shortcuts"
@@ -278,7 +274,7 @@ msgstr "Raccourcis"
msgctxt "#31203"
msgid "Choose your song"
-msgstr "Choisir votre morceau"
+msgstr "Choisir une chanson"
msgctxt "#31205"
msgid "Lyrics source"
@@ -322,23 +318,23 @@ msgstr "Mémoire utilisée :"
msgctxt "#31310"
msgid "Track number"
-msgstr "Numéro de la piste"
+msgstr "Numéro de la piste "
msgctxt "#31311"
msgid "Fanart image[CR][CR]Unavailable[CR][CR] Click button to set"
-msgstr "Image Fanart[CR][CR]Indisponible[CR][CR] Cliquer sur le bouton pour définir"
+msgstr "Image fanart[CR][CR]Indisponible[CR][CR]Cliquer sur le bouton pour définir"
msgctxt "#31312"
msgid "Current scraper"
-msgstr "Scraper actuel"
+msgstr "Collecteur actuel"
msgctxt "#31313"
msgid "Choose a scraper"
-msgstr "Choisir un scraper"
+msgstr "Choisir un collecteur"
msgctxt "#31314"
msgid "Content scanning options"
-msgstr "Options de balayage des contenus"
+msgstr "Options d'analyse de contenu"
msgctxt "#31317"
msgid "Set fanart path"
@@ -352,17 +348,13 @@ msgctxt "#31320"
msgid "Last logged in"
msgstr "Dernière connexion"
-msgctxt "#31321"
-msgid "Karaoke song selector"
-msgstr "Sélecteur de chanson Karaoké"
-
msgctxt "#31322"
msgid "Aired"
msgstr "Diffusé"
msgctxt "#31325"
msgid "Playlist options"
-msgstr "Options des listes de lecture"
+msgstr "Options de la liste de lecture"
msgctxt "#31326"
msgid "Created"
@@ -378,7 +370,7 @@ msgstr "Ajouté récemment"
msgctxt "#31329"
msgid "[B]Timer set![/B] [COLOR=grey2] - System auto shutdown in[/COLOR]"
-msgstr "[B]Minuterie programmée ![/B] [COLOR=grey2] - Arrêt automatique du système dans[/COLOR]"
+msgstr "[B]Minuterie programmée ![/B][COLOR=grey2] - Arrêt automatique du système dans[/COLOR]"
msgctxt "#31330"
msgid "Click button to play[CR][CR]movie trailer"
@@ -406,7 +398,7 @@ msgstr "Retour rapide"
msgctxt "#31355"
msgid "Movie menu"
-msgstr "Menu Film"
+msgstr "Menu film"
msgctxt "#31356"
msgid "Download subtitles"
@@ -426,59 +418,59 @@ msgstr "Activé"
msgctxt "#31390"
msgid "Skin default"
-msgstr "Prédéfini par l'habillage"
+msgstr "Par défaut du thème"
msgctxt "#31391"
msgid "Skin default with no caps"
-msgstr "Prédéfini par l'habillage sans majuscules"
+msgstr "Par défaut du thème, sans majuscules"
msgctxt "#31392"
msgid "Arial based"
-msgstr "Basé sur Arial"
+msgstr "Basée sur Arial"
msgctxt "#31400"
msgid "[B]CONFIGURE APPEARANCE SETTINGS[/B][CR][CR]Change the skin · Set language and region · Change file listing options[CR]Set up a screensaver"
-msgstr "[B]CONFIGURATION DES PARAMÈTRES D'APPARENCE[/B][CR][CR]Changer l'habillage · Définir la langue et la région · Changer les options de liste de fichiers[CR]Configurer un économiseur d'écran"
+msgstr "[B]CONFIGURATION DES PARAMÈTRES D'APPARENCE[/B][CR][CR]Changement du thème · Définition de la langue et de la région · Modification des options de listage de fichiers · Configuration d'un économiseur d'écran"
msgctxt "#31401"
msgid "[B]CONFIGURE VIDEO SETTINGS[/B][CR][CR]Manage your video library · Set video playback options · Change video listing options[CR]Set subtitle fonts"
-msgstr "[B]CONFIGURATION DES PARAMÈTRES VIDÉO[/B][CR][CR]Gérer votre médiathèque vidéo · Définir les options de lecture · Changer les options des listes de vidéos[CR]Définir la police des sous-titres"
+msgstr "[B]CONFIGURATION DES PARAMÈTRES DES VIDÉOS[/B][CR][CR]Gestion de la vidéothèque · Définition des options de lecture de vidéos · Modification des options de listage de vidéos · Définition des polices de sous-titres"
msgctxt "#31402"
-msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission · Set karaoke options"
-msgstr "[B]CONFIGURATION DES PARAMÈTRES MUSIQUE[/B][CR][CR]Gérer votre médiathèque musicale · Définir les options de lecture · Changer les options des listes de musique[CR]Paramétrer les soumissions de chansons · Définir les options karaoké"
+msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission"
+msgstr "[B]CONFIGURATION DES PARAMÈTRES DE MUSIQUE[/B][CR][CR]Gestion de l'audiothèque · Définition des options de lecture · Modification des options de listes de musique[CR]Configuration de la soumission de chanson"
msgctxt "#31403"
msgid "[B]CONFIGURE PICTURE SETTINGS[/B][CR][CR]Set picture listing options · Configure slideshow"
-msgstr "[B]CONFIGURATION DES PARAMÈTRES D'IMAGE[/B][CR][CR]Définir les options des listes d'images · Configurer le diaporama"
+msgstr "[B]CONFIGURATION DES PARAMÈTRES DES IMAGES[/B][CR][CR]Définition des options de listage d'images · Configuration du diaporama"
msgctxt "#31404"
msgid "[B]CONFIGURE WEATHER SETTINGS[/B][CR][CR]Set various cities to collect weather information"
-msgstr "[B]CONFIGURATION DES PARAMÈTRES MÉTÉO[/B][CR][CR]Définir les différentes villes pour recueillir des informations météo"
+msgstr "[B]CONFIGURATION DES PARAMÈTRES DE LA MÉTÉO[/B][CR][CR]Définition des différentes villes pour collecter les informations météo"
msgctxt "#31406"
msgid "[B]CONFIGURE SYSTEM SETTINGS[/B][CR][CR]Setup and calibrate displays · Configure audio output · Setup remote controls[CR]Set power saving options · Enable debugging · Setup master lock"
-msgstr "[B]CONFIGURATION DES PARAMÈTRES SYSTÈME[/B][CR][CR]Configurer et calibrer l'affichage · Configurer les sorties audio · Configurer les périphériques[CR]Définir les options de gestion d'énergie · Activer le débogage · Configurer le verrouillage administrateur"
+msgstr "[B]CONFIGURATION DES PARAMÈTRES DU SYSTÈME[/B][CR][CR]Configuration et calibration des écrans · Configuration de la sortie audio · Configuration des télécommandes · Définition des options de gestion d'énergie · Activation du débogage · Configuration du verrou maître"
msgctxt "#31408"
msgid "[B]CONFIGURE ADD-ONS[/B][CR][CR]Manage your installed add-ons · Browse for and install add-ons from kodi.tv[CR]Modify add-on settings"
-msgstr "[B]CONFIGURATION DES EXTENSIONS[/B][CR][CR]Gérer vos extensions installées · Parcourir et installer des extensions depuis kodi.tv[CR]Modifier les paramètres des extensions"
+msgstr "[B]CONFIGURATION DES EXTENSIONS[/B][CR][CR]Gestion des extensions installées · Parcours et installation des extensions depuis kodi.tv · Modification des paramètres des extensions"
msgctxt "#31409"
msgid "[B]CONFIGURE TV SETTINGS[/B][CR][CR]Change full screen info · Manage EPG data settings"
-msgstr "[B]CONFIGURATION DES RÉGLAGES TV[/B][CR][CR]Changer les informations de plein écran · Gérer les données du guide des programmes"
+msgstr "[B]CONFIGURATION DES RÉGLAGES TV[/B][CR][CR]Modification des informations de plein écran · Gestion des données du guide des programmes"
msgctxt "#31410"
msgid "[B]CONFIGURE SERVICE SETTINGS[/B][CR][CR]Setup control of Kodi via UPnP and HTTP · Configure file sharing[CR]Enable Zeroconf · Configure AirPlay"
-msgstr "[B]CONFIGURATION DES PARAMÈTRES DE SERVICE[/B][CR][CR]Configurer le contrôle de Kodi via UPnP et HTTP · Configurer le partage de fichiers[CR]Activer Zeroconf · Configurer AirPlay"
+msgstr "[B]CONFIGURATION DES PARAMÈTRES DES SERVICES[/B][CR][CR]Configuration du contrôle de Kodi via UPnP et HTTP · Configuration du partage de fichiers · Activation Zeroconf · Configuration AirPlay"
msgctxt "#31411"
msgid "First run help..."
-msgstr "Lancer l'aide d'abord..."
+msgstr "Aide au démarrage"
msgctxt "#31412"
msgid "This tab signifies that there is a menu off to the side of this window that contains extra options for this section. To access the menu, navigate to the left with your remote control or keyboard or place your mouse pointer over the tab. [CR][CR]Click \"OK\" to close this dialogue. It will not appear again."
-msgstr "Cet onglet signifie qu'il y a un menu sur le côté de la fenêtre qui contient des options supplémentaires pour cette section. Pour accéder au menu, naviguez vers la gauche avec votre télécommande ou votre clavier ou placez le pointeur de votre souris sur l'onglet.[CR][CR]Cliquez sur \"OK\" pour fermer cette fenêtre. Elle n’apparaîtra plus."
+msgstr "Cet onglet signifie qu'il y a un menu sur le côté de la fenêtre qui contient des options supplémentaires pour cette section. Pour accéder au menu, naviguer vers la gauche avec la télécommande ou le clavier, ou placer le pointeur de la souris sur l'onglet.[CR][CR]Cliquer sur « Ok » pour fermer cette fenêtre. Elle n’apparaîtra plus."
msgctxt "#31413"
msgid "Local subtitle available"
@@ -490,15 +482,15 @@ msgstr "Connexion"
msgctxt "#31421"
msgid "Select your Kodi user profile[CR]to login and continue"
-msgstr "Choisissez votre profil utilisateur Kodi[CR]pour vous identifier et poursuivre"
+msgstr "Choisir le profil utilisateur Kodi[CR]pour s'identifier et poursuivre"
msgctxt "#31422"
msgid "Show or hide the login screen at startup."
-msgstr "Afficher ou masquer l'écran de connexion au démarrage."
+msgstr "Affiche ou masque l'écran de connexion au démarrage."
msgctxt "#31423"
msgid "Select the profile that will be used at startup when the login screen is disabled."
-msgstr "Sélectionner le profil utilisé au démarrage lorsque l'écran de connexion est désactivé."
+msgstr "Sélection du profil utilisé au démarrage lorsque l'écran de connexion est désactivé."
msgctxt "#31501"
msgid "Scheduled time"
@@ -510,15 +502,15 @@ msgstr "TV"
msgctxt "#31503"
msgid "Add group"
-msgstr "Ajouter un groupe"
+msgstr "Ajouter un groupe…"
msgctxt "#31504"
msgid "Rename group"
-msgstr "Renommer un groupe"
+msgstr "Renommer…"
msgctxt "#31505"
msgid "Delete group"
-msgstr "Supprimer un groupe"
+msgstr "Supprimer…"
msgctxt "#31506"
msgid "Available[CR]Groups"
@@ -526,11 +518,11 @@ msgstr "Groupes[CR]disponibles"
msgctxt "#31509"
msgid "Channel group"
-msgstr "Groupe de chaînes"
+msgstr "Groupe de chaînes "
msgctxt "#31510"
msgid "Timer set"
-msgstr "Minuterie définie"
+msgstr "Programmation définie"
msgctxt "#31511"
msgid "Channel options"
@@ -602,7 +594,7 @@ msgstr "PROGRAMMES"
msgctxt "#31958"
msgid "PLAY DISC"
-msgstr "DISQUE"
+msgstr "LIRE DISQUE"
msgctxt "#31959"
msgid "SYSTEM"
diff --git a/addons/skin.confluence/language/resource.language.gl_es/strings.po b/addons/skin.confluence/language/resource.language.gl_es/strings.po
index feff7f768e..4ce5ff46cb 100644
--- a/addons/skin.confluence/language/resource.language.gl_es/strings.po
+++ b/addons/skin.confluence/language/resource.language.gl_es/strings.po
@@ -16,10 +16,22 @@ msgstr ""
"Language: gl_ES\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+msgctxt "#31000"
+msgid "Change your"
+msgstr "Troca o teu"
+
+msgctxt "#31003"
+msgid "Power options"
+msgstr "Opcións de enerxía"
+
msgctxt "#31004"
msgid "Working..."
msgstr "Traballando..."
+msgctxt "#31005"
+msgid "Hide information"
+msgstr "Agochar información"
+
msgctxt "#31006"
msgid "View options"
msgstr "Opcións da vista"
@@ -28,6 +40,10 @@ msgctxt "#31008"
msgid "Full screen"
msgstr "Pantalla completa"
+msgctxt "#31009"
+msgid "Total duration"
+msgstr "Duración total"
+
msgctxt "#31022"
msgid "Music - Files"
msgstr "Música - Ficheiros"
@@ -44,14 +60,30 @@ msgctxt "#31025"
msgid "Items"
msgstr "Elementos"
+msgctxt "#31026"
+msgid "Misc options"
+msgstr "Outras opcións"
+
msgctxt "#31027"
msgid "Location"
msgstr "Localización"
+msgctxt "#31028"
+msgid "Poster wrap"
+msgstr "Envoltorio de cartel"
+
msgctxt "#31029"
msgid "Fanart"
msgstr "Cartel"
+msgctxt "#31031"
+msgid "Pic thumbs"
+msgstr "Miniaturas"
+
+msgctxt "#31032"
+msgid "Image wrap"
+msgstr "Envoltura de Imaxe"
+
msgctxt "#31033"
msgid "Info"
msgstr "Info"
@@ -60,6 +92,10 @@ msgctxt "#31039"
msgid "Actions"
msgstr "Accións"
+msgctxt "#31040"
+msgid "Now playing"
+msgstr "Reproducindo"
+
msgctxt "#31042"
msgid "PLAYING"
msgstr "REPRODUCINDO"
@@ -80,6 +116,10 @@ msgctxt "#31046"
msgid "SEEKING"
msgstr "BUSCANDO"
+msgctxt "#31048"
+msgid "Visualisation presets"
+msgstr "Preconfiguracións de visualizacións"
+
msgctxt "#31049"
msgid "End time"
msgstr "Hora de fin"
@@ -116,6 +156,10 @@ msgctxt "#31060"
msgid "This file is stacked, select the part you want to play from."
msgstr "Este ficheiro esta amontoado, selecione a parte que quere reproducir."
+msgctxt "#31061"
+msgid "Current selected"
+msgstr "Seleccionado actualmente"
+
msgctxt "#31101"
msgid "Home screen options"
msgstr "Opcións da pantalla de inicio"
@@ -124,10 +168,26 @@ msgctxt "#31102"
msgid "Background"
msgstr "Fondo"
+msgctxt "#31103"
+msgid "Show \"Paused\" in picture slideshow"
+msgstr "Amosar \"Pausado\" nunha diapositiva."
+
+msgctxt "#31104"
+msgid "Play trailers in a window [COLOR=grey3](Video information dialogue only)[/COLOR]"
+msgstr "Reproducir avances nunha xanela [COLOR=grey3](Só diálogo de información de vídeo)[/COLOR]"
+
msgctxt "#31106"
msgid "Miscellaneous options"
msgstr "Outras opcións"
+msgctxt "#31107"
+msgid "Hide flagging read from video filenames [COLOR=grey3](e.g. Blu-ray, HD-DVD)[/COLOR]"
+msgstr "Agochar a lectura da marcaxe dende os nomes dos videos [COLOR=grey3](Blu-ray, HD-DVD)[/COLOR]"
+
+msgctxt "#31108"
+msgid "Hide main menu buttons"
+msgstr "Ocultar botóns do menú principal"
+
msgctxt "#31109"
msgid "Enable custom background"
msgstr "Activar fondo personalizado"
@@ -144,18 +204,54 @@ msgctxt "#31112"
msgid "Options"
msgstr "Opcións"
-msgctxt "#31126"
-msgid "Play TV theme songs in video library (TvTunes add-on)"
-msgstr "Reproducir as cancións das series de TV na bibloteca de video (Engadido TVTunes)"
+msgctxt "#31116"
+msgid "Show recently added albums"
+msgstr "Amosar albumes engadidos recentemente"
+
+msgctxt "#31117"
+msgid "Show recently added videos"
+msgstr "Amosar vídeos engadidos recentemente"
-msgctxt "#31127"
-msgid "TvTunes"
-msgstr "TvTunes"
+msgctxt "#31118"
+msgid "Home page programs submenu"
+msgstr "Submenú de Aplicacións da Páxina de Inicio"
+
+msgctxt "#31119"
+msgid "Hide background fanart"
+msgstr "Agochar o fondo do cartel"
+
+msgctxt "#31124"
+msgid "Show background \"Now playing\" video"
+msgstr "Amosar o vídeo reproducíndose actualmente no fondo"
+
+msgctxt "#31125"
+msgid "Show background \"Now playing\" visualisation"
+msgstr "Amosar a visualización 'En Reprodución' no fondo"
msgctxt "#31128"
msgid "Lyrics"
msgstr "Letras"
+msgctxt "#31129"
+msgid "Hide fanart in full screen visualisation"
+msgstr "Agochar cartel na visualización de pantalla completa"
+
+msgctxt "#31132"
+msgid "Lyrics add-on"
+msgstr "Complemento de letras"
+
+msgctxt "#31134"
+msgid "Home page \"Videos\" submenu"
+msgstr "Submenú de Vídeos da Páxina de Inicio"
+
+msgctxt "#31135"
+msgid "Home page \"Music\" submenu"
+msgstr "Submenú de Música da Páxina de Inicio"
+
+msgctxt "#31136"
+msgid "Home page \"Pictures\" submenu"
+msgstr "Submenú de Imaxes da Páxina de Inicio"
+
msgctxt "#31140"
msgid "Music OSD"
msgstr "OSD de Música"
@@ -172,22 +268,90 @@ msgctxt "#31200"
msgid "Shortcuts"
msgstr "Atallos"
+msgctxt "#31203"
+msgid "Choose your song"
+msgstr "Escolle a túa canción"
+
+msgctxt "#31205"
+msgid "Lyrics source"
+msgstr "Fonte das letras"
+
msgctxt "#31206"
msgid "Found"
msgstr "Atopado"
+msgctxt "#31207"
+msgid "Find more items"
+msgstr "Atopar máis elementos"
+
+msgctxt "#31208"
+msgid "Upcoming episodes"
+msgstr "Vindeiros episodios"
+
+msgctxt "#31300"
+msgid "Current temperature"
+msgstr "Temperatura actual"
+
+msgctxt "#31301"
+msgid "Last updated"
+msgstr "Última actualización"
+
msgctxt "#31303"
msgid "Data provider"
msgstr "Provedor de datos"
+msgctxt "#31307"
+msgid "Hide fanart"
+msgstr "Agochar fanart"
+
+msgctxt "#31308"
+msgid "Movie details"
+msgstr "Detalles do filme"
+
+msgctxt "#31309"
+msgid "Memory used:"
+msgstr "Memoria empregada:"
+
+msgctxt "#31310"
+msgid "Track number"
+msgstr "Nº de pista"
+
msgctxt "#31311"
msgid "Fanart image[CR][CR]Unavailable[CR][CR] Click button to set"
msgstr "Imaxe de cartel[CR][CR]Non dispoñible[CR][CR] Preme o botón para estabrecer"
+msgctxt "#31312"
+msgid "Current scraper"
+msgstr "Scraper actual"
+
+msgctxt "#31313"
+msgid "Choose a scraper"
+msgstr "Escoller scraper"
+
+msgctxt "#31314"
+msgid "Content scanning options"
+msgstr "Opcións de escaneado de contidos"
+
+msgctxt "#31317"
+msgid "Set fanart path"
+msgstr "Estabelecer ruta dos Fanart"
+
+msgctxt "#31319"
+msgid "Selected profile"
+msgstr "Selecionar perfíl"
+
+msgctxt "#31320"
+msgid "Last logged in"
+msgstr "Último ingreso"
+
msgctxt "#31322"
msgid "Aired"
msgstr "Emitido"
+msgctxt "#31325"
+msgid "Playlist options"
+msgstr "Opcións da listaxe de reprodución"
+
msgctxt "#31326"
msgid "Created"
msgstr "Creado"
@@ -196,10 +360,22 @@ msgctxt "#31327"
msgid "Resolution"
msgstr "Resolución"
+msgctxt "#31328"
+msgid "Recently added"
+msgstr "Engadidos recentemente"
+
msgctxt "#31329"
msgid "[B]Timer set![/B] [COLOR=grey2] - System auto shutdown in[/COLOR]"
msgstr "[B]Temporizador estabrecido![/B] [COLOR=grey2] - Apagado automático de sistema en[/COLOR]"
+msgctxt "#31330"
+msgid "Click button to play[CR][CR]movie trailer"
+msgstr "Prema o botón para reproducir[CR][CR]Avance do filme"
+
+msgctxt "#31331"
+msgid "Album details"
+msgstr "Detalles do álbum"
+
msgctxt "#31351"
msgid "Pause"
msgstr "Pausa"
@@ -208,6 +384,10 @@ msgctxt "#31352"
msgid "Stop"
msgstr "Parar"
+msgctxt "#31353"
+msgid "Fast forward"
+msgstr "Axiña adiante"
+
msgctxt "#31354"
msgid "Rewind"
msgstr "Atrás"
@@ -216,6 +396,10 @@ msgctxt "#31355"
msgid "Movie menu"
msgstr "Menú do filme"
+msgctxt "#31356"
+msgid "Download subtitles"
+msgstr "Descargar subtítulos"
+
msgctxt "#31360"
msgid "Watch as 2D"
msgstr "Ver como 2D"
@@ -232,25 +416,37 @@ msgctxt "#31390"
msgid "Skin default"
msgstr "Pel predefinida"
+msgctxt "#31391"
+msgid "Skin default with no caps"
+msgstr "Pel predefinida sen maiúsculas"
+
msgctxt "#31392"
msgid "Arial based"
msgstr "Baseado en Arial"
msgctxt "#31400"
msgid "[B]CONFIGURE APPEARANCE SETTINGS[/B][CR][CR]Change the skin · Set language and region · Change file listing options[CR]Set up a screensaver"
-msgstr "[B]CONFIGURAR PARÃMETROS DE APARIENCIA[/B][CR][CR]Trocar a pel · Estabelecer o idioma e a rexión · Trocar as opcións de listado de ficheiros[CR]Estabelecer o protector de pantalla"
+msgstr "[B]CONFIGURAR PARÃMETROS DE APARENCIA[/B][CR][CR]Trocar o tema - Estabelecer lingua e rexión - Trocar opcións de listado de ficheiros[CR]Estabelecer o protector de pantalla"
msgctxt "#31401"
msgid "[B]CONFIGURE VIDEO SETTINGS[/B][CR][CR]Manage your video library · Set video playback options · Change video listing options[CR]Set subtitle fonts"
-msgstr "[B]CONFIGURAR PARÃMETROS DE VÃDEO[/B][CR][CR]Xestionar a bibloteca de vídeo · Estabrecer opcións da reprodución de vídeo · Trocar opcións de listado de vídeos[CR]Estabrecer fontes dos subtítulos"
+msgstr "[B]CONFIGURAR PARÃMETROS DE VÃDEO[/B][CR][CR]Xestionar a biblioteca de vídeo · Estabelecer opcións da reprodución de vídeo · Trocar opcións de listado de vídeos[CR]Estabelecer fontes dos subtítulos"
+
+msgctxt "#31403"
+msgid "[B]CONFIGURE PICTURE SETTINGS[/B][CR][CR]Set picture listing options · Configure slideshow"
+msgstr "[B]CONFIGURAR PARÃMETROS DE IMAXES[/B][CR][CR]Estabelecer opcións do listado de imaxes · Configurar presentacións"
-msgctxt "#31402"
-msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission · Set karaoke options"
-msgstr "[B]CONFIGURAR PARÃMETROS DE MÚSICA[/B][CR][CR]Xestionar a bibloteca de música · Estabrecer as opcións de reprodución de música · Trocar opcións do listado da música[CR]Estabrecer o envío de cancións · Estabrecer as opcións do karaoke"
+msgctxt "#31404"
+msgid "[B]CONFIGURE WEATHER SETTINGS[/B][CR][CR]Set various cities to collect weather information"
+msgstr "[B]CONFIGURAR PARÃMETROS METEOROLÓXICOS[/B][CR][CR]Escoller o complemento de tempo · Estabelecer varias cidade para obter a súa información"
msgctxt "#31406"
msgid "[B]CONFIGURE SYSTEM SETTINGS[/B][CR][CR]Setup and calibrate displays · Configure audio output · Setup remote controls[CR]Set power saving options · Enable debugging · Setup master lock"
-msgstr "[B]CONFIGURAR PARÃMETROS DO SISTEMA[/B][CR][CR]Configurar as pantallas · Configurar a saída de audio · Estabrecer mandos remotos[CR]Estabrecer opcións de aforro enerxético · Activar depuración · Estabrecer bloque mestre"
+msgstr "[B]CONFIGURAR PARÃMETROS DO SISTEMA[/B][CR][CR]Configurar as pantallas · Configurar a saída de son · Estabelecer mandos remotos[CR]Estabelecer opcións de aforro enerxético · Activar depuración · Activar a depuración · Estabelecer bloqueo mestre"
+
+msgctxt "#31408"
+msgid "[B]CONFIGURE ADD-ONS[/B][CR][CR]Manage your installed add-ons · Browse for and install add-ons from kodi.tv[CR]Modify add-on settings"
+msgstr "[B]CONFIGURAR COMPLEMENTOS[/B][CR][CR]Xestionar complementos instalados · Buscar e instalar complementos de kodi.tv[CR]Modificar a configuración dos complementos"
msgctxt "#31409"
msgid "[B]CONFIGURE TV SETTINGS[/B][CR][CR]Change full screen info · Manage EPG data settings"
@@ -258,7 +454,15 @@ msgstr "[B]CONFIGURAR OS AXUSTES DE TV[/B][CR][CR]Trocar info. a pantalla comple
msgctxt "#31410"
msgid "[B]CONFIGURE SERVICE SETTINGS[/B][CR][CR]Setup control of Kodi via UPnP and HTTP · Configure file sharing[CR]Enable Zeroconf · Configure AirPlay"
-msgstr "[B]CONFIGURAR PARÃMETROS DO SERVIZO[/B][CR][CR]Configurar o control de Kodi vía UPnP e HTTP · Configurar compartición de ficheiros[CR]Activar Zeroconf · Configurar AirPlay"
+msgstr "[B]CONFIGURAR PARÃMETROS DOS SERVIZOS[/B][CR][CR]Configurar o control de Kodi vía UPnP e HTTP · Configurar compartición de ficheiros[CR]Activar Zeroconf · Configurar AirPlay"
+
+msgctxt "#31411"
+msgid "First run help..."
+msgstr "Axuda na primeira execución..."
+
+msgctxt "#31412"
+msgid "This tab signifies that there is a menu off to the side of this window that contains extra options for this section. To access the menu, navigate to the left with your remote control or keyboard or place your mouse pointer over the tab. [CR][CR]Click \"OK\" to close this dialogue. It will not appear again."
+msgstr "Esta lapela significa que existe un menú desactivado nesta xanela que contén máis opcións para esta sección. Para acceder ó menú, ir a esquerda co control remoto o teclado ou move o punteiro do rato até a lapela. [CR][CR]Preme en \"Feito\" para pechar a caixa de diálogo. Non aparecerá máis."
msgctxt "#31413"
msgid "Local subtitle available"
@@ -268,6 +472,10 @@ msgctxt "#31420"
msgid "Login"
msgstr "Inicio de sesión"
+msgctxt "#31421"
+msgid "Select your Kodi user profile[CR]to login and continue"
+msgstr "Selecione o seu perfíl de usuario de Kodi[CR]para ingresar e continuar"
+
msgctxt "#31422"
msgid "Show or hide the login screen at startup."
msgstr "Amosar ou agochar a pantalla de inicio de sesión ao iniciar."
@@ -276,18 +484,66 @@ msgctxt "#31423"
msgid "Select the profile that will be used at startup when the login screen is disabled."
msgstr "Usar o perfil a usar no inicio cando a pantalla de inicio de sesión estea desactivada."
+msgctxt "#31501"
+msgid "Scheduled time"
+msgstr "Hora programada"
+
msgctxt "#31502"
msgid "TV"
msgstr "TV"
+msgctxt "#31503"
+msgid "Add group"
+msgstr "Engadir grupo"
+
+msgctxt "#31504"
+msgid "Rename group"
+msgstr "Renomear grupo"
+
+msgctxt "#31505"
+msgid "Delete group"
+msgstr "Eliminar grupo"
+
msgctxt "#31506"
msgid "Available[CR]Groups"
msgstr "Grupos[CR]Dispoñíbeis"
+msgctxt "#31509"
+msgid "Channel group"
+msgstr "Canle do Grupo"
+
+msgctxt "#31510"
+msgid "Timer set"
+msgstr "Axuste do Temporizador"
+
+msgctxt "#31511"
+msgid "Channel options"
+msgstr "Opcións da Canle"
+
+msgctxt "#31901"
+msgid "36-hour forecast"
+msgstr "Predición para 36 horas"
+
+msgctxt "#31902"
+msgid "Hourly forecast"
+msgstr "Predición de hora en hora"
+
+msgctxt "#31903"
+msgid "Weekend forecast"
+msgstr "Predición para a fin de semana"
+
+msgctxt "#31904"
+msgid "Daily forecast"
+msgstr "Predición diaria"
+
msgctxt "#31905"
msgid "Forecast"
msgstr "Predición"
+msgctxt "#31908"
+msgid "Chance of precipitation"
+msgstr "Probabilidade de Chuvia"
+
msgctxt "#31909"
msgid "Fetching forecast info..."
msgstr "Obtendo información da predición..."
diff --git a/addons/skin.confluence/language/resource.language.he_il/strings.po b/addons/skin.confluence/language/resource.language.he_il/strings.po
index 58903403f2..5ba75fb23b 100644
--- a/addons/skin.confluence/language/resource.language.he_il/strings.po
+++ b/addons/skin.confluence/language/resource.language.he_il/strings.po
@@ -16,10 +16,22 @@ msgstr ""
"Language: he_IL\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+msgctxt "#31000"
+msgid "Change your"
+msgstr "שינוי"
+
+msgctxt "#31003"
+msgid "Power options"
+msgstr "×פשרויות חשמל"
+
msgctxt "#31004"
msgid "Working..."
msgstr "עסוק..."
+msgctxt "#31005"
+msgid "Hide information"
+msgstr "הסתר פרטי×"
+
msgctxt "#31006"
msgid "View options"
msgstr "×פשרויות תצוגה"
@@ -28,6 +40,10 @@ msgctxt "#31008"
msgid "Full screen"
msgstr "מסך מל×"
+msgctxt "#31009"
+msgid "Total duration"
+msgstr "×ורך כולל"
+
msgctxt "#31022"
msgid "Music - Files"
msgstr "מוזיקה - קבצי×"
@@ -44,14 +60,30 @@ msgctxt "#31025"
msgid "Items"
msgstr "פריטי×"
+msgctxt "#31026"
+msgid "Misc options"
+msgstr "×פשרויות שונות"
+
msgctxt "#31027"
msgid "Location"
msgstr "מיקו×"
+msgctxt "#31028"
+msgid "Poster wrap"
+msgstr "רצועת פוסטרי×"
+
msgctxt "#31029"
msgid "Fanart"
msgstr "פ×× ×רט"
+msgctxt "#31031"
+msgid "Pic thumbs"
+msgstr "תמונות ממוזערות"
+
+msgctxt "#31032"
+msgid "Image wrap"
+msgstr "רצועת תמונות"
+
msgctxt "#31033"
msgid "Info"
msgstr "פרטי×"
@@ -60,6 +92,10 @@ msgctxt "#31039"
msgid "Actions"
msgstr "פעולות"
+msgctxt "#31040"
+msgid "Now playing"
+msgstr "מנגן כעת"
+
msgctxt "#31042"
msgid "PLAYING"
msgstr "מנגן"
@@ -120,6 +156,10 @@ msgctxt "#31060"
msgid "This file is stacked, select the part you want to play from."
msgstr "קובץ זה שייך לערימה. יש לבחור חלק ממנו יתחיל הניגון."
+msgctxt "#31061"
+msgid "Current selected"
+msgstr "כרגע מסומני×"
+
msgctxt "#31101"
msgid "Home screen options"
msgstr "×פשרויות מסך הבית"
@@ -128,10 +168,26 @@ msgctxt "#31102"
msgid "Background"
msgstr "רקע"
+msgctxt "#31103"
+msgid "Show \"Paused\" in picture slideshow"
+msgstr "הצג \"מושהה\" במצגת תמונות"
+
+msgctxt "#31104"
+msgid "Play trailers in a window [COLOR=grey3](Video information dialogue only)[/COLOR]"
+msgstr "נגן ×§×“×™×ž×•× ×™× ×‘×—×œ×•×Ÿ [COLOR=grey3](די×לוג פרטי ויד×ו בלבד)[/COLOR]"
+
msgctxt "#31106"
msgid "Miscellaneous options"
msgstr "×פשרויות שונות"
+msgctxt "#31107"
+msgid "Hide flagging read from video filenames [COLOR=grey3](e.g. Blu-ray, HD-DVD)[/COLOR]"
+msgstr "הסתר סימון \"נצפה\" משמות קבצי ויד×ו [COLOR=grey3](Blu-ray, HD-DVD)[/COLOR]"
+
+msgctxt "#31108"
+msgid "Hide main menu buttons"
+msgstr "הסתר כפתורי תפריט ר×שי"
+
msgctxt "#31109"
msgid "Enable custom background"
msgstr "×פשר רקע מות×× ×ישית"
@@ -148,18 +204,54 @@ msgctxt "#31112"
msgid "Options"
msgstr "×פשרויות"
-msgctxt "#31126"
-msgid "Play TV theme songs in video library (TvTunes add-on)"
-msgstr "נגן נעימת סדרה בספריית הויד×ו (הרחבת TvTunes)"
+msgctxt "#31116"
+msgid "Show recently added albums"
+msgstr "הצג ××œ×‘×•×ž×™× ×©× ×•×¡×¤×• ל×חרונה"
+
+msgctxt "#31117"
+msgid "Show recently added videos"
+msgstr "הצג ויד×ו שנוסף ל×חרונה"
-msgctxt "#31127"
-msgid "TvTunes"
-msgstr "TvTunes"
+msgctxt "#31118"
+msgid "Home page programs submenu"
+msgstr "תת תפריט תוכנות במסך הבית"
+
+msgctxt "#31119"
+msgid "Hide background fanart"
+msgstr "נטרל הצגת פ×× ×רט כרקע"
+
+msgctxt "#31124"
+msgid "Show background \"Now playing\" video"
+msgstr "הצג ויד×ו \"מנגן כעת\" כרקע"
+
+msgctxt "#31125"
+msgid "Show background \"Now playing\" visualisation"
+msgstr "הצג חיזוי \"מנגן כעת\" כרקע"
msgctxt "#31128"
msgid "Lyrics"
msgstr "מילות שיר"
+msgctxt "#31129"
+msgid "Hide fanart in full screen visualisation"
+msgstr "הסתר פ×× ×רט ×›×שר חיזוי מוצג במסך מל×"
+
+msgctxt "#31132"
+msgid "Lyrics add-on"
+msgstr "הרחבת מילות שירי×"
+
+msgctxt "#31134"
+msgid "Home page \"Videos\" submenu"
+msgstr "תת תפריט ויד×ו במסך הבית"
+
+msgctxt "#31135"
+msgid "Home page \"Music\" submenu"
+msgstr "תת תפריט מוזיקה במסך הבית"
+
+msgctxt "#31136"
+msgid "Home page \"Pictures\" submenu"
+msgstr "תת תפריט תמונות במסך הבית"
+
msgctxt "#31140"
msgid "Music OSD"
msgstr "מוזיקה - תפריט צף (OSD)"
@@ -176,10 +268,30 @@ msgctxt "#31200"
msgid "Shortcuts"
msgstr "קיצורי דרך"
+msgctxt "#31203"
+msgid "Choose your song"
+msgstr "בחירת השיר"
+
+msgctxt "#31205"
+msgid "Lyrics source"
+msgstr "מקור מילות שיר"
+
msgctxt "#31206"
msgid "Found"
msgstr "נמצ×"
+msgctxt "#31207"
+msgid "Find more items"
+msgstr "מצי×ת ×¤×¨×™×˜×™× × ×•×¡×¤×™×"
+
+msgctxt "#31208"
+msgid "Upcoming episodes"
+msgstr "×”×¤×¨×§×™× ×”×§×¨×•×‘×™×"
+
+msgctxt "#31300"
+msgid "Current temperature"
+msgstr "טמפ' נוכחית"
+
msgctxt "#31301"
msgid "Last updated"
msgstr "עודכן ל×חרונה"
@@ -188,14 +300,58 @@ msgctxt "#31303"
msgid "Data provider"
msgstr "ספק מידע"
+msgctxt "#31307"
+msgid "Hide fanart"
+msgstr "הסתר פ×× ×רט"
+
+msgctxt "#31308"
+msgid "Movie details"
+msgstr "פרטי סרט"
+
+msgctxt "#31309"
+msgid "Memory used:"
+msgstr "זכרון בשימוש:"
+
+msgctxt "#31310"
+msgid "Track number"
+msgstr "מספר רצועה"
+
msgctxt "#31311"
msgid "Fanart image[CR][CR]Unavailable[CR][CR] Click button to set"
msgstr "תמונת פ×× ×רט[CR][CR]×œ× ×–×ž×™× ×”[CR][CR]יש ללחוץ לבחירה בתמונה"
+msgctxt "#31312"
+msgid "Current scraper"
+msgstr "סקרייפר נוכחי"
+
+msgctxt "#31313"
+msgid "Choose a scraper"
+msgstr "בחירת סקרייפר"
+
+msgctxt "#31314"
+msgid "Content scanning options"
+msgstr "הגדרות סריקת תוכן"
+
+msgctxt "#31317"
+msgid "Set fanart path"
+msgstr "קביעת נתיב פ×× ×רט"
+
+msgctxt "#31319"
+msgid "Selected profile"
+msgstr "משתמש נבחר"
+
+msgctxt "#31320"
+msgid "Last logged in"
+msgstr "חובר ל×חרונה"
+
msgctxt "#31322"
msgid "Aired"
msgstr "שודר"
+msgctxt "#31325"
+msgid "Playlist options"
+msgstr "×פשרויות רשימת ניגון"
+
msgctxt "#31326"
msgid "Created"
msgstr "נוצר"
@@ -204,10 +360,22 @@ msgctxt "#31327"
msgid "Resolution"
msgstr "×בחנה"
+msgctxt "#31328"
+msgid "Recently added"
+msgstr "נוסף ל×חרונה"
+
msgctxt "#31329"
msgid "[B]Timer set![/B] [COLOR=grey2] - System auto shutdown in[/COLOR]"
msgstr "[B]התזמון נקבע![/B] [COLOR=grey2] - כיבוי מערכת ×וטומטי בעוד[/COLOR]"
+msgctxt "#31330"
+msgid "Click button to play[CR][CR]movie trailer"
+msgstr "יש ללחוץ הכפתור ×¢\"מ לנגן[CR][CR]×ת הקדימון"
+
+msgctxt "#31331"
+msgid "Album details"
+msgstr "פרטי ×לבו×"
+
msgctxt "#31351"
msgid "Pause"
msgstr "השהיה"
@@ -216,6 +384,10 @@ msgctxt "#31352"
msgid "Stop"
msgstr "עצירה"
+msgctxt "#31353"
+msgid "Fast forward"
+msgstr "הרצה קדימה"
+
msgctxt "#31354"
msgid "Rewind"
msgstr "הרצה ×חורה"
@@ -224,9 +396,13 @@ msgctxt "#31355"
msgid "Movie menu"
msgstr "תפריט סרט"
+msgctxt "#31356"
+msgid "Download subtitles"
+msgstr "הורדת כתוביות"
+
msgctxt "#31360"
msgid "Watch as 2D"
-msgstr "צפיה כ־2D"
+msgstr "צפייה כ־2D"
msgctxt "#31361"
msgid "Change mode"
@@ -240,6 +416,10 @@ msgctxt "#31390"
msgid "Skin default"
msgstr "ברירת מחדל של המעטפת"
+msgctxt "#31391"
+msgid "Skin default with no caps"
+msgstr "ברירת מחדל של המעטפת ×œ×œ× ×¨×™×©×™×•×ª"
+
msgctxt "#31392"
msgid "Arial based"
msgstr "מבוסס Arial"
@@ -252,14 +432,22 @@ msgctxt "#31401"
msgid "[B]CONFIGURE VIDEO SETTINGS[/B][CR][CR]Manage your video library · Set video playback options · Change video listing options[CR]Set subtitle fonts"
msgstr "[B]שינוי הגדרות ויד×ו[/B][CR][CR]ניהול ספריית הוויד×ו · קביעת העדפות ניגון ויד×ו · שינוי ×פשרויות תצוגת קבצי ויד×ו[CR]הגדרת גופן כתוביות"
-msgctxt "#31402"
-msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission · Set karaoke options"
-msgstr "[B]שינוי הגדרות מוזיקה[/B][CR][CR]ניהול ספריית המוזיקה · קביעת העדפות ניגון מוזיקה · שינוי ×פשרויות תצוגת קבצי מוזיקה[CR]הגדרת ×פשרויות קריוקי"
+msgctxt "#31403"
+msgid "[B]CONFIGURE PICTURE SETTINGS[/B][CR][CR]Set picture listing options · Configure slideshow"
+msgstr "[B]שינוי הגדרות תמונות[/B][CR][CR]הגדרת ×פשרויות תצוגת קבצי תמונה · הגדרת ×פשרויות מצגת תמונה"
+
+msgctxt "#31404"
+msgid "[B]CONFIGURE WEATHER SETTINGS[/B][CR][CR]Set various cities to collect weather information"
+msgstr "[B]שינוי הגדרות מזג ×וויר[/B][CR][CR]בחירת עד שלוש ×¢×¨×™× ×¢×‘×•×¨×Ÿ תוצג תחזית מזג ×וויר"
msgctxt "#31406"
msgid "[B]CONFIGURE SYSTEM SETTINGS[/B][CR][CR]Setup and calibrate displays · Configure audio output · Setup remote controls[CR]Set power saving options · Enable debugging · Setup master lock"
msgstr "[B]שינוי הגדרות מערכת[/B][CR][CR]הגדרת וכיול התקני תצוגה · הגדרת התקן פלט שמע · הגדרת שלט רחוק[CR]קביעת העדפות חיסכון בחשמל · הפעלת יומן ×¨×™×©×•× ×ž×•×¨×—×‘ · הגדרת קוד נעילה ר×שי"
+msgctxt "#31408"
+msgid "[B]CONFIGURE ADD-ONS[/B][CR][CR]Manage your installed add-ons · Browse for and install add-ons from kodi.tv[CR]Modify add-on settings"
+msgstr "[B]הגדרת הרחבות[/B][CR][CR]ניהול הרחבות מותקנות · עיון בהרחבות מ־kodi.tv והתקנתן[CR]שינוי הגדרות הרחבה"
+
msgctxt "#31409"
msgid "[B]CONFIGURE TV SETTINGS[/B][CR][CR]Change full screen info · Manage EPG data settings"
msgstr "[B]שינוי הגדרות טלוויזיה[/B][CR][CR]שינוי המידע המוצג במסך ×ž×œ× Â· ניהול הגדרות נתוני לוח השידורי×"
@@ -268,6 +456,14 @@ msgctxt "#31410"
msgid "[B]CONFIGURE SERVICE SETTINGS[/B][CR][CR]Setup control of Kodi via UPnP and HTTP · Configure file sharing[CR]Enable Zeroconf · Configure AirPlay"
msgstr "[B]שינוי הגדרות שירותי×[/B][CR][CR]הגדרות שליטה על Kodi דרך UPnP ו־HTTP · הגדרות שיתוף קבצי×[CR]הפעלת Zeroconf · הגדרות AirPlay"
+msgctxt "#31411"
+msgid "First run help..."
+msgstr "סיוע היכרות..."
+
+msgctxt "#31412"
+msgid "This tab signifies that there is a menu off to the side of this window that contains extra options for this section. To access the menu, navigate to the left with your remote control or keyboard or place your mouse pointer over the tab. [CR][CR]Click \"OK\" to close this dialogue. It will not appear again."
+msgstr "לשונית זו מציינת שיש תפריט נוסף לצד חלון ×–×” המכיל הגדרות נוספות עבור מדור ×–×”. ×œ×©× ×’×™×©×” לתפריט, יש לנווט שמ×לה בעזרת השלט ×ו המקלדת ×ו הצבת סמן העכבר מעל הלשונית . [CR][CR] יש ללחוץ על \"×ישור\" ×œ×©× ×¡×’×™×¨×ª די×לוג ×–×”. הודעה זו ×œ× ×ª×•×¦×’ שנית."
+
msgctxt "#31413"
msgid "Local subtitle available"
msgstr "כתובית מקומית זמינה"
@@ -276,6 +472,10 @@ msgctxt "#31420"
msgid "Login"
msgstr "כניסה"
+msgctxt "#31421"
+msgid "Select your Kodi user profile[CR]to login and continue"
+msgstr "יש לבחור חשבון משתמש Kodi[CR]להתחברות והמשך"
+
msgctxt "#31422"
msgid "Show or hide the login screen at startup."
msgstr "הצג ×ו הסתר מסך כניסה בעת ההפעלה."
@@ -284,18 +484,66 @@ msgctxt "#31423"
msgid "Select the profile that will be used at startup when the login screen is disabled."
msgstr "יש לבחור משתמש שיחובר כברירת מחדל בעת ההפעלה ×›×שר מסך כניסה מנוטרל."
+msgctxt "#31501"
+msgid "Scheduled time"
+msgstr "זמן מתוכנן"
+
msgctxt "#31502"
msgid "TV"
msgstr "טלוויזיה"
+msgctxt "#31503"
+msgid "Add group"
+msgstr "הוספת קבוצה"
+
+msgctxt "#31504"
+msgid "Rename group"
+msgstr "שינוי ×©× ×§×‘×•×¦×”"
+
+msgctxt "#31505"
+msgid "Delete group"
+msgstr "מחיקת קבוצה"
+
msgctxt "#31506"
msgid "Available[CR]Groups"
msgstr "קבוצות[CR]זמינות"
+msgctxt "#31509"
+msgid "Channel group"
+msgstr "קבוצת ערוצי×"
+
+msgctxt "#31510"
+msgid "Timer set"
+msgstr "תזמון נקבע"
+
+msgctxt "#31511"
+msgid "Channel options"
+msgstr "×פשרויות ערוץ"
+
+msgctxt "#31901"
+msgid "36-hour forecast"
+msgstr "תחזית ל־36 שעות"
+
+msgctxt "#31902"
+msgid "Hourly forecast"
+msgstr "תחזית לפי שעה"
+
+msgctxt "#31903"
+msgid "Weekend forecast"
+msgstr "תחזית לסופ\"ש"
+
+msgctxt "#31904"
+msgid "Daily forecast"
+msgstr "תחזית יומית"
+
msgctxt "#31905"
msgid "Forecast"
msgstr "תחזית"
+msgctxt "#31908"
+msgid "Chance of precipitation"
+msgstr "סיכוי למשקעי×"
+
msgctxt "#31909"
msgid "Fetching forecast info..."
msgstr "משיג פרטי תחזית..."
diff --git a/addons/skin.confluence/language/resource.language.hr_hr/strings.po b/addons/skin.confluence/language/resource.language.hr_hr/strings.po
index ebd50b5582..d6477539c3 100644
--- a/addons/skin.confluence/language/resource.language.hr_hr/strings.po
+++ b/addons/skin.confluence/language/resource.language.hr_hr/strings.po
@@ -16,10 +16,22 @@ msgstr ""
"Language: hr_HR\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"
+msgctxt "#31000"
+msgid "Change your"
+msgstr "Promijenite vaše"
+
+msgctxt "#31003"
+msgid "Power options"
+msgstr "Mogućnosti energije"
+
msgctxt "#31004"
msgid "Working..."
msgstr "Reprodukcija..."
+msgctxt "#31005"
+msgid "Hide information"
+msgstr "Sakrij informacije"
+
msgctxt "#31006"
msgid "View options"
msgstr "Mogućnosti prikaza"
@@ -28,6 +40,10 @@ msgctxt "#31008"
msgid "Full screen"
msgstr "Cijeli zaslon"
+msgctxt "#31009"
+msgid "Total duration"
+msgstr "Ukupno trajanje"
+
msgctxt "#31022"
msgid "Music - Files"
msgstr "Glazba - Datoteke"
@@ -44,14 +60,30 @@ msgctxt "#31025"
msgid "Items"
msgstr "Stavaka"
+msgctxt "#31026"
+msgid "Misc options"
+msgstr "Ostale mogućnosti"
+
msgctxt "#31027"
msgid "Location"
msgstr "Lokacija"
+msgctxt "#31028"
+msgid "Poster wrap"
+msgstr "Omot postera"
+
msgctxt "#31029"
msgid "Fanart"
msgstr "Slika omota"
+msgctxt "#31031"
+msgid "Pic thumbs"
+msgstr "Minijature"
+
+msgctxt "#31032"
+msgid "Image wrap"
+msgstr "Slika omota"
+
msgctxt "#31033"
msgid "Info"
msgstr "Informacije"
@@ -60,6 +92,10 @@ msgctxt "#31039"
msgid "Actions"
msgstr "Radnje"
+msgctxt "#31040"
+msgid "Now playing"
+msgstr "Trenutno se reproducira"
+
msgctxt "#31042"
msgid "PLAYING"
msgstr "REPRODUKCIJA"
@@ -80,6 +116,10 @@ msgctxt "#31046"
msgid "SEEKING"
msgstr "PREMOTAVANJE"
+msgctxt "#31048"
+msgid "Visualisation presets"
+msgstr "Predlošci vizualizacije"
+
msgctxt "#31049"
msgid "End time"
msgstr "Vrijeme završetka"
@@ -116,6 +156,10 @@ msgctxt "#31060"
msgid "This file is stacked, select the part you want to play from."
msgstr "Ova datoteka je složena, odaberite dio od kojeg želite pokrenuti reprodukciju."
+msgctxt "#31061"
+msgid "Current selected"
+msgstr "Trenutno odabrano"
+
msgctxt "#31101"
msgid "Home screen options"
msgstr "Mogućnosti poÄetnog zaslona"
@@ -124,10 +168,26 @@ msgctxt "#31102"
msgid "Background"
msgstr "Pozadina"
+msgctxt "#31103"
+msgid "Show \"Paused\" in picture slideshow"
+msgstr "Prikaži \"Pauzirano\" u slikovnoj prezentaciji"
+
+msgctxt "#31104"
+msgid "Play trailers in a window [COLOR=grey3](Video information dialogue only)[/COLOR]"
+msgstr "Reproduciraj najave u prozoru [COLOR=grey3](Samo dijalog video informacija)[/COLOR]"
+
msgctxt "#31106"
msgid "Miscellaneous options"
msgstr "Ostale mogućnosti"
+msgctxt "#31107"
+msgid "Hide flagging read from video filenames [COLOR=grey3](e.g. Blu-ray, HD-DVD)[/COLOR]"
+msgstr "Sakrij oznake proÄitane iz naziva video datoteka [COLOR=grey3](npr. Blu-ray, HD-DVD)[/COLOR]"
+
+msgctxt "#31108"
+msgid "Hide main menu buttons"
+msgstr "Sakrij tipke glavnog izbornika"
+
msgctxt "#31109"
msgid "Enable custom background"
msgstr "Omogući prilagođenu pozadinu"
@@ -144,18 +204,54 @@ msgctxt "#31112"
msgid "Options"
msgstr "Mogućnosti"
-msgctxt "#31126"
-msgid "Play TV theme songs in video library (TvTunes add-on)"
-msgstr "Reproduciraj pjesme TV tema iz videoteke (TvTunes dodatak)"
+msgctxt "#31116"
+msgid "Show recently added albums"
+msgstr "Prikaži nedavno dodane albume"
-msgctxt "#31127"
-msgid "TvTunes"
-msgstr "Tv melodije"
+msgctxt "#31117"
+msgid "Show recently added videos"
+msgstr "Prikaži nedavno dodane video snimke"
+
+msgctxt "#31118"
+msgid "Home page programs submenu"
+msgstr "PoÄetna stranica \"Programi\" podizbornika"
+
+msgctxt "#31119"
+msgid "Hide background fanart"
+msgstr "Sakrij pozadinu slike omota"
+
+msgctxt "#31124"
+msgid "Show background \"Now playing\" video"
+msgstr "Prikaži pozadinu \"Trenutno se reproducira\" videa"
+
+msgctxt "#31125"
+msgid "Show background \"Now playing\" visualisation"
+msgstr "Prikaži pozadinu \"Trenutno se reproducira\" vizualizacije"
msgctxt "#31128"
msgid "Lyrics"
msgstr "Tekstovi pjesama"
+msgctxt "#31129"
+msgid "Hide fanart in full screen visualisation"
+msgstr "Sakrij sliku omota u vizualizaciji cijelog zaslona"
+
+msgctxt "#31132"
+msgid "Lyrics add-on"
+msgstr "Dodatak za tekstove pjesama"
+
+msgctxt "#31134"
+msgid "Home page \"Videos\" submenu"
+msgstr "PoÄetna stranica \"Video\" podizbornika"
+
+msgctxt "#31135"
+msgid "Home page \"Music\" submenu"
+msgstr "PoÄetna stranica \"Glazba\" podizbornika"
+
+msgctxt "#31136"
+msgid "Home page \"Pictures\" submenu"
+msgstr "PoÄetna stranica \"Slike\" podizbornika"
+
msgctxt "#31140"
msgid "Music OSD"
msgstr "OSD glazbe"
@@ -172,22 +268,90 @@ msgctxt "#31200"
msgid "Shortcuts"
msgstr "PreÄaci"
+msgctxt "#31203"
+msgid "Choose your song"
+msgstr "Odaberite svoju pjesmu"
+
+msgctxt "#31205"
+msgid "Lyrics source"
+msgstr "Izvor tekstova pjesama"
+
msgctxt "#31206"
msgid "Found"
msgstr "Pronađeno"
+msgctxt "#31207"
+msgid "Find more items"
+msgstr "Potraži više stavki"
+
+msgctxt "#31208"
+msgid "Upcoming episodes"
+msgstr "Nadolazeće epizode"
+
+msgctxt "#31300"
+msgid "Current temperature"
+msgstr "Trenutna temperatura"
+
+msgctxt "#31301"
+msgid "Last updated"
+msgstr "Posljednje ažurirano"
+
msgctxt "#31303"
msgid "Data provider"
msgstr "Pružatelj podataka"
+msgctxt "#31307"
+msgid "Hide fanart"
+msgstr "Sakrij sliku omota"
+
+msgctxt "#31308"
+msgid "Movie details"
+msgstr "Pojedinosti filma"
+
+msgctxt "#31309"
+msgid "Memory used:"
+msgstr "Korištenje memorije:"
+
+msgctxt "#31310"
+msgid "Track number"
+msgstr "Broj pjesme"
+
msgctxt "#31311"
msgid "Fanart image[CR][CR]Unavailable[CR][CR] Click button to set"
msgstr "Slika za omot[CR][CR]je nedostupna[CR][CR] Kliknite tipku za postavljanje"
+msgctxt "#31312"
+msgid "Current scraper"
+msgstr "Trenutni sakupljaÄ"
+
+msgctxt "#31313"
+msgid "Choose a scraper"
+msgstr "Odaberite sakupljaÄa"
+
+msgctxt "#31314"
+msgid "Content scanning options"
+msgstr "Mogućnosti pretraživanja sadržaja"
+
+msgctxt "#31317"
+msgid "Set fanart path"
+msgstr "Postavite putanju slike omota"
+
+msgctxt "#31319"
+msgid "Selected profile"
+msgstr "Odabrani profil"
+
+msgctxt "#31320"
+msgid "Last logged in"
+msgstr "Posljednji prijavljen"
+
msgctxt "#31322"
msgid "Aired"
msgstr "Emitirano"
+msgctxt "#31325"
+msgid "Playlist options"
+msgstr "Mogućnosti popisa izvođenja"
+
msgctxt "#31326"
msgid "Created"
msgstr "Napravljeno"
@@ -204,6 +368,14 @@ msgctxt "#31329"
msgid "[B]Timer set![/B] [COLOR=grey2] - System auto shutdown in[/COLOR]"
msgstr "[B]Vrijeme iskljuÄivanja![/B][COLOR=grey2] - Sustav se automatski iskljuÄuje za[/COLOR]"
+msgctxt "#31330"
+msgid "Click button to play[CR][CR]movie trailer"
+msgstr "Kliknite tipku za reprodukciju[CR][CR]filmskih najava"
+
+msgctxt "#31331"
+msgid "Album details"
+msgstr "Pojedinosti albuma"
+
msgctxt "#31351"
msgid "Pause"
msgstr "Pauza"
@@ -212,6 +384,10 @@ msgctxt "#31352"
msgid "Stop"
msgstr "Zaustavi"
+msgctxt "#31353"
+msgid "Fast forward"
+msgstr "Premotavanje unaprijed"
+
msgctxt "#31354"
msgid "Rewind"
msgstr "Premotavanje unazad"
@@ -220,6 +396,10 @@ msgctxt "#31355"
msgid "Movie menu"
msgstr "Filmski izbornik"
+msgctxt "#31356"
+msgid "Download subtitles"
+msgstr "Preuzmanje podnaslova"
+
msgctxt "#31360"
msgid "Watch as 2D"
msgstr "Gledaj kao 2D"
@@ -236,6 +416,10 @@ msgctxt "#31390"
msgid "Skin default"
msgstr "UobiÄajena presvlaka"
+msgctxt "#31391"
+msgid "Skin default with no caps"
+msgstr "UobiÄajena presvlaka bez velikih slova"
+
msgctxt "#31392"
msgid "Arial based"
msgstr "Temeljen na Arialu "
@@ -248,14 +432,22 @@ msgctxt "#31401"
msgid "[B]CONFIGURE VIDEO SETTINGS[/B][CR][CR]Manage your video library · Set video playback options · Change video listing options[CR]Set subtitle fonts"
msgstr "[B]PRILAGODITE VIDEO POSTAVKE[/B][CR][CR]Upravljajte svojom videotekom · Postavite mogućnosti reprodukcije videa[CR]Promijenite mogućnosti popisivanja video sadržaja · Postavite slova podnaslova"
-msgctxt "#31402"
-msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission · Set karaoke options"
-msgstr "[B]PRILAGODITE POSTAVKE GLAZBE[/B][CR][CR]Upravljajte svojm fonotekom · Postavite mogućnosti reprodukcije glazbe[CR]Promjenite mogućnosti popisivanja glazbenoga sadržaja · Postavite slanje pjesama · Postavite mogućnosti karaoka"
+msgctxt "#31403"
+msgid "[B]CONFIGURE PICTURE SETTINGS[/B][CR][CR]Set picture listing options · Configure slideshow"
+msgstr "[B]PRILAGODITE POSTAVKE SLIKA[/B][CR][CR]Postavljanje mogućnosti popsivanja slika · Postavke slikovne prezentacije"
+
+msgctxt "#31404"
+msgid "[B]CONFIGURE WEATHER SETTINGS[/B][CR][CR]Set various cities to collect weather information"
+msgstr "[B]PRILAGODITE POSTAVKE VREMENSKE PROGNOZE[/B][CR][CR]Postavite razliÄite gradove za prikupljanje informacija vremenske prognoze"
msgctxt "#31406"
msgid "[B]CONFIGURE SYSTEM SETTINGS[/B][CR][CR]Setup and calibrate displays · Configure audio output · Setup remote controls[CR]Set power saving options · Enable debugging · Setup master lock"
msgstr "[B]PRILAGODITE POSTAVKE SUSTAVA[/B][CR][CR]Prilagodite i kalibrirajte zaslon · Prilagodite izlaz zvuka · Postavite daljinsko upravljanje[CR]Postavite mogućnosti uÅ¡tede energije · Omogućite zapise otklanjanja greÅ¡aka · Postavite glavno zakljuÄavanje"
+msgctxt "#31408"
+msgid "[B]CONFIGURE ADD-ONS[/B][CR][CR]Manage your installed add-ons · Browse for and install add-ons from kodi.tv[CR]Modify add-on settings"
+msgstr "[B]PRILAGODITE DODATKE[/B][CR][CR]Upravljajte svojim instaliranim dodacima · Pregledavajte i instalirajte dodatake iz kodi.tv[CR]Mijenjajte postavke dodataka"
+
msgctxt "#31409"
msgid "[B]CONFIGURE TV SETTINGS[/B][CR][CR]Change full screen info · Manage EPG data settings"
msgstr "[B]PRILAGODITE TV POSTAVKE[/B][CR][CR]Promjenite informacije cijelog zaslona · Upravljajte postavkama podataka elektronskog programskog vodiÄa (EPG)"
@@ -264,6 +456,14 @@ msgctxt "#31410"
msgid "[B]CONFIGURE SERVICE SETTINGS[/B][CR][CR]Setup control of Kodi via UPnP and HTTP · Configure file sharing[CR]Enable Zeroconf · Configure AirPlay"
msgstr "[B]PRILAGODITE POSTAVKE USLUGA[/B][CR][CR]Postavite upravljanje Kodijem putem UPnP-a i HTTP-a · Prilagodite dijeljenje datoteka[CR]Omogućite Zeroconf · Prilagodite AirPlay"
+msgctxt "#31411"
+msgid "First run help..."
+msgstr "Pomoć kod prvog pokretanja..."
+
+msgctxt "#31412"
+msgid "This tab signifies that there is a menu off to the side of this window that contains extra options for this section. To access the menu, navigate to the left with your remote control or keyboard or place your mouse pointer over the tab. [CR][CR]Click \"OK\" to close this dialogue. It will not appear again."
+msgstr "Ova kartica oznaÄava da postoji izbornik sa strane ovog prozora koji sadrži dodatne mogućnosti ovog odjeljka. Za pristup izborniku, idite lijevo daljinskim upravljaÄem ili tipkovnicom ili postavite pokazivaÄ miÅ¡a iznad kartice. [CR] [CR] Kliknite na \"U redu\" za zatvaranje ovog dijaloga. Neće se ponovno pojaviti."
+
msgctxt "#31413"
msgid "Local subtitle available"
msgstr "Lokalni podnaslovi dostupni"
@@ -272,6 +472,10 @@ msgctxt "#31420"
msgid "Login"
msgstr "Prijava"
+msgctxt "#31421"
+msgid "Select your Kodi user profile[CR]to login and continue"
+msgstr "Odaberite svoj Kodi korisniÄki profil[CR]za prijavu i nastavak"
+
msgctxt "#31422"
msgid "Show or hide the login screen at startup."
msgstr "Prikaži ili sakrij zaslon prijave pri pokretanju."
@@ -280,18 +484,66 @@ msgctxt "#31423"
msgid "Select the profile that will be used at startup when the login screen is disabled."
msgstr "Odaberite profil koji će se koristiti pri pokretanju kada je zaslon prijave onemogućen."
+msgctxt "#31501"
+msgid "Scheduled time"
+msgstr "Planirano vrijeme"
+
msgctxt "#31502"
msgid "TV"
-msgstr "TELEVIZIJA"
+msgstr "Televizija"
+
+msgctxt "#31503"
+msgid "Add group"
+msgstr "Dodaj grupu"
+
+msgctxt "#31504"
+msgid "Rename group"
+msgstr "Preimenuj grupu"
+
+msgctxt "#31505"
+msgid "Delete group"
+msgstr "Obriši grupu"
msgctxt "#31506"
msgid "Available[CR]Groups"
msgstr "Dostupne[CR]grupe"
+msgctxt "#31509"
+msgid "Channel group"
+msgstr "Grupa programa"
+
+msgctxt "#31510"
+msgid "Timer set"
+msgstr "Postavljanje zakazanog snimanja"
+
+msgctxt "#31511"
+msgid "Channel options"
+msgstr "Mogućnosti programa"
+
+msgctxt "#31901"
+msgid "36-hour forecast"
+msgstr "36-satna prognoza"
+
+msgctxt "#31902"
+msgid "Hourly forecast"
+msgstr "Prognoza za svaki sat"
+
+msgctxt "#31903"
+msgid "Weekend forecast"
+msgstr "Prognoza za vikend"
+
+msgctxt "#31904"
+msgid "Daily forecast"
+msgstr "Dnevna prognoza"
+
msgctxt "#31905"
msgid "Forecast"
msgstr "Prognoza"
+msgctxt "#31908"
+msgid "Chance of precipitation"
+msgstr "Moguće padaline"
+
msgctxt "#31909"
msgid "Fetching forecast info..."
msgstr "Nabavljanje informacija prognoze..."
diff --git a/addons/skin.confluence/language/resource.language.hu_hu/strings.po b/addons/skin.confluence/language/resource.language.hu_hu/strings.po
index e9ddefdb87..7d0e376a89 100644
--- a/addons/skin.confluence/language/resource.language.hu_hu/strings.po
+++ b/addons/skin.confluence/language/resource.language.hu_hu/strings.po
@@ -162,7 +162,7 @@ msgstr "Jelenleg kiválasztott"
msgctxt "#31101"
msgid "Home screen options"
-msgstr "Sajátképernyő lehetőségei"
+msgstr "Főképernyő lehetőségei"
msgctxt "#31102"
msgid "Background"
@@ -228,14 +228,6 @@ msgctxt "#31125"
msgid "Show background \"Now playing\" visualisation"
msgstr "A háttérben az éppen futó vizualizáció megjelenítése"
-msgctxt "#31126"
-msgid "Play TV theme songs in video library (TvTunes add-on)"
-msgstr "TV főtéma dalok játszása a videó médiatárban (TvTunes kiegészítő)"
-
-msgctxt "#31127"
-msgid "TvTunes"
-msgstr "TvTunes"
-
msgctxt "#31128"
msgid "Lyrics"
msgstr "Dalszöveg"
@@ -352,10 +344,6 @@ msgctxt "#31320"
msgid "Last logged in"
msgstr "Utoljára bejelentkezve"
-msgctxt "#31321"
-msgid "Karaoke song selector"
-msgstr "Karaoke dalválasztó"
-
msgctxt "#31322"
msgid "Aired"
msgstr "Játszva"
@@ -444,10 +432,6 @@ msgctxt "#31401"
msgid "[B]CONFIGURE VIDEO SETTINGS[/B][CR][CR]Manage your video library · Set video playback options · Change video listing options[CR]Set subtitle fonts"
msgstr "[B]VIDEÓ BEÃLLÃTÃSOK[/B][CR][CR]Film médiatár kezelése · Videólejátszás beállítása · Videólistázás módjának beállítása[CR]Feliratok karaktertípusának váltása"
-msgctxt "#31402"
-msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission · Set karaoke options"
-msgstr "[B]ZENE BEÃLLÃTÃSOK[/B][CR][CR]Zene médiatár kezelése · Zenelejátszás beállítása · Zenelistázás módjának beállítása[CR]Zene lejátszási szabályok felállítása · Karaoke lehetÅ‘ségek"
-
msgctxt "#31403"
msgid "[B]CONFIGURE PICTURE SETTINGS[/B][CR][CR]Set picture listing options · Configure slideshow"
msgstr "[B]KÉP BEÃLLÃTÃSOK[/B][CR][CR]Képek listázási módjának beállítása · Diavetítés beállítása"
diff --git a/addons/skin.confluence/language/resource.language.hy_am/strings.po b/addons/skin.confluence/language/resource.language.hy_am/strings.po
index 985d9a3e32..d8eb6a9cdc 100644
--- a/addons/skin.confluence/language/resource.language.hy_am/strings.po
+++ b/addons/skin.confluence/language/resource.language.hy_am/strings.po
@@ -128,14 +128,6 @@ msgctxt "#31112"
msgid "Options"
msgstr "ÕÕ¡Ö€Õ¢Õ¥Ö€Õ¡Õ¯Õ¶Õ¥Ö€"
-msgctxt "#31126"
-msgid "Play TV theme songs in video library (TvTunes add-on)"
-msgstr "Õ†Õ¾Õ¡Õ£Õ¡Ö€Õ¯Õ¥Õ¬ TV Õ©Õ¥Õ´Õ¡ÕµÕ« Õ¥Ö€Õ£Õ¥Ö€Õ¨ Õ¿Õ¥Õ½Õ¡Õ¤Õ¡Ö€Õ¡Õ¶Õ¸Ö‚Õ´ (TvTunes add-on)"
-
-msgctxt "#31127"
-msgid "TvTunes"
-msgstr "TV-ÕˆÖ€Õ¸Õ¶Õ¸Ö‚Õ´"
-
msgctxt "#31128"
msgid "Lyrics"
msgstr "ÔµÖ€Õ£Õ« Õ¢Õ¡Õ¼Õ¥Ö€"
diff --git a/addons/skin.confluence/language/resource.language.id_id/strings.po b/addons/skin.confluence/language/resource.language.id_id/strings.po
index a7cb618ae6..58ee693d1f 100644
--- a/addons/skin.confluence/language/resource.language.id_id/strings.po
+++ b/addons/skin.confluence/language/resource.language.id_id/strings.po
@@ -16,10 +16,22 @@ msgstr ""
"Language: id_ID\n"
"Plural-Forms: nplurals=1; plural=0;\n"
+msgctxt "#31000"
+msgid "Change your"
+msgstr "Ubah"
+
+msgctxt "#31003"
+msgid "Power options"
+msgstr "Pilihan daya"
+
msgctxt "#31004"
msgid "Working..."
msgstr "Mengerjakan..."
+msgctxt "#31005"
+msgid "Hide information"
+msgstr "Menyembunyikan informasi"
+
msgctxt "#31006"
msgid "View options"
msgstr "Lihat Pilihan"
@@ -28,6 +40,10 @@ msgctxt "#31008"
msgid "Full screen"
msgstr "Video Mainkan Secara Otomatis"
+msgctxt "#31009"
+msgid "Total duration"
+msgstr "Total durasi"
+
msgctxt "#31022"
msgid "Music - Files"
msgstr "Berkas - Musik"
@@ -44,14 +60,30 @@ msgctxt "#31025"
msgid "Items"
msgstr "Item"
+msgctxt "#31026"
+msgid "Misc options"
+msgstr "Pilihan Misc"
+
msgctxt "#31027"
msgid "Location"
msgstr "Lokasi"
+msgctxt "#31028"
+msgid "Poster wrap"
+msgstr "Mengemas poster"
+
msgctxt "#31029"
msgid "Fanart"
msgstr "Fanart"
+msgctxt "#31031"
+msgid "Pic thumbs"
+msgstr "Tampilan gambar"
+
+msgctxt "#31032"
+msgid "Image wrap"
+msgstr "Mengemas gambar"
+
msgctxt "#31033"
msgid "Info"
msgstr "Info"
@@ -60,6 +92,10 @@ msgctxt "#31039"
msgid "Actions"
msgstr "Aksi"
+msgctxt "#31040"
+msgid "Now playing"
+msgstr "Sedang dimainkan"
+
msgctxt "#31042"
msgid "PLAYING"
msgstr "Mainkan"
@@ -80,6 +116,10 @@ msgctxt "#31046"
msgid "SEEKING"
msgstr "MENCARI"
+msgctxt "#31048"
+msgid "Visualisation presets"
+msgstr "Visualisasi yang telah ditetapkan"
+
msgctxt "#31049"
msgid "End time"
msgstr "Waktu selesai"
@@ -116,6 +156,10 @@ msgctxt "#31060"
msgid "This file is stacked, select the part you want to play from."
msgstr "Berkas ini sudah ditumpuk, pilih bagian yang ingin anda mainkan"
+msgctxt "#31061"
+msgid "Current selected"
+msgstr "Pilihan saat ini"
+
msgctxt "#31101"
msgid "Home screen options"
msgstr "Opsi Home Screen"
@@ -124,10 +168,26 @@ msgctxt "#31102"
msgid "Background"
msgstr "Latar belakang"
+msgctxt "#31103"
+msgid "Show \"Paused\" in picture slideshow"
+msgstr "Tampilkan video dalam daftar berkas gambar."
+
+msgctxt "#31104"
+msgid "Play trailers in a window [COLOR=grey3](Video information dialogue only)[/COLOR]"
+msgstr "Putar Trailer dalam sebuah jendela [COLOR=grey3](Hanya dialog informasi video Saja)[/COLOR]"
+
msgctxt "#31106"
msgid "Miscellaneous options"
msgstr "Opsi Lainnya"
+msgctxt "#31107"
+msgid "Hide flagging read from video filenames [COLOR=grey3](e.g. Blu-ray, HD-DVD)[/COLOR]"
+msgstr "Sembunyikan flagging membaca dari nama file video [COLOR = grey3] (misalnya Blu-ray, HD-DVD) [/ COLOR]"
+
+msgctxt "#31108"
+msgid "Hide main menu buttons"
+msgstr "Sembunyikan tombol menu utama"
+
msgctxt "#31109"
msgid "Enable custom background"
msgstr "Fungsikan background custom"
@@ -144,18 +204,54 @@ msgctxt "#31112"
msgid "Options"
msgstr "Opsi"
-msgctxt "#31126"
-msgid "Play TV theme songs in video library (TvTunes add-on)"
-msgstr "Putar lagu tema TV dalam pustaka video (Pengaya TvTunes)"
+msgctxt "#31116"
+msgid "Show recently added albums"
+msgstr "Tampilkan album baru yang sudah ditambahkan"
+
+msgctxt "#31117"
+msgid "Show recently added videos"
+msgstr "Tampilkan album baru yang sudah ditambahkan"
-msgctxt "#31127"
-msgid "TvTunes"
-msgstr "TvTunes"
+msgctxt "#31118"
+msgid "Home page programs submenu"
+msgstr "Laman Program Submenu"
+
+msgctxt "#31119"
+msgid "Hide background fanart"
+msgstr "Sembunyikan Background Fanart"
+
+msgctxt "#31124"
+msgid "Show background \"Now playing\" video"
+msgstr "Tampilkan Video latar belakang \"Sedang dimainkan\""
+
+msgctxt "#31125"
+msgid "Show background \"Now playing\" visualisation"
+msgstr "Tampilkan latar belakang visualisasi \"Sedang Memainkan\""
msgctxt "#31128"
msgid "Lyrics"
msgstr "Lirik"
+msgctxt "#31129"
+msgid "Hide fanart in full screen visualisation"
+msgstr "Sembunyikan Fanart pada visualisasi layar penuh"
+
+msgctxt "#31132"
+msgid "Lyrics add-on"
+msgstr "Add-on lirik"
+
+msgctxt "#31134"
+msgid "Home page \"Videos\" submenu"
+msgstr "Submenu halaman utama \"Video\""
+
+msgctxt "#31135"
+msgid "Home page \"Music\" submenu"
+msgstr "Submenu halaman utama \"Music\""
+
+msgctxt "#31136"
+msgid "Home page \"Pictures\" submenu"
+msgstr "Submenu halaman utama \"gambar\""
+
msgctxt "#31140"
msgid "Music OSD"
msgstr "OSD Musik"
@@ -172,22 +268,90 @@ msgctxt "#31200"
msgid "Shortcuts"
msgstr "Bookmark"
+msgctxt "#31203"
+msgid "Choose your song"
+msgstr "Pilih lagu Anda"
+
+msgctxt "#31205"
+msgid "Lyrics source"
+msgstr "Sumber lirik"
+
msgctxt "#31206"
msgid "Found"
msgstr "Ditemukan"
+msgctxt "#31207"
+msgid "Find more items"
+msgstr "Cari item"
+
+msgctxt "#31208"
+msgid "Upcoming episodes"
+msgstr "Episode mendatang"
+
+msgctxt "#31300"
+msgid "Current temperature"
+msgstr "Suhu saat ini"
+
+msgctxt "#31301"
+msgid "Last updated"
+msgstr "Pembaharuan terakhir"
+
msgctxt "#31303"
msgid "Data provider"
msgstr "Penyedia data"
+msgctxt "#31307"
+msgid "Hide fanart"
+msgstr "Sembunyikan fanart"
+
+msgctxt "#31308"
+msgid "Movie details"
+msgstr "Rincian film"
+
+msgctxt "#31309"
+msgid "Memory used:"
+msgstr "Memori yang digunakan:"
+
+msgctxt "#31310"
+msgid "Track number"
+msgstr "Nomor track"
+
msgctxt "#31311"
msgid "Fanart image[CR][CR]Unavailable[CR][CR] Click button to set"
msgstr "Gambar Fanart[CR][CR]Tidak tersedia[CR][CR] Klik tombol untuk mengatur"
+msgctxt "#31312"
+msgid "Current scraper"
+msgstr "Scraper saat ini"
+
+msgctxt "#31313"
+msgid "Choose a scraper"
+msgstr "Pilih scraper"
+
+msgctxt "#31314"
+msgid "Content scanning options"
+msgstr "Pilihan pemindaian konten"
+
+msgctxt "#31317"
+msgid "Set fanart path"
+msgstr "Set jalur fanart"
+
+msgctxt "#31319"
+msgid "Selected profile"
+msgstr "Profil pilihan"
+
+msgctxt "#31320"
+msgid "Last logged in"
+msgstr "Login terakhir"
+
msgctxt "#31322"
msgid "Aired"
msgstr "Disiarkan"
+msgctxt "#31325"
+msgid "Playlist options"
+msgstr "Opsi Daftar Main"
+
msgctxt "#31326"
msgid "Created"
msgstr "Dibuat"
@@ -204,6 +368,14 @@ msgctxt "#31329"
msgid "[B]Timer set![/B] [COLOR=grey2] - System auto shutdown in[/COLOR]"
msgstr "[B]Atur Timer![/B] [COLOR=grey2] - Sistem dimatikan secara otomatis dalam[/COLOR]"
+msgctxt "#31330"
+msgid "Click button to play[CR][CR]movie trailer"
+msgstr "Klik tombol untuk mainkan [CR] [CR] trailer film"
+
+msgctxt "#31331"
+msgid "Album details"
+msgstr "Rincian album"
+
msgctxt "#31351"
msgid "Pause"
msgstr "Pause"
@@ -212,6 +384,10 @@ msgctxt "#31352"
msgid "Stop"
msgstr "Berhenti"
+msgctxt "#31353"
+msgid "Fast forward"
+msgstr "Mempercepat"
+
msgctxt "#31354"
msgid "Rewind"
msgstr "Mundurkan"
@@ -220,6 +396,10 @@ msgctxt "#31355"
msgid "Movie menu"
msgstr "Menu film"
+msgctxt "#31356"
+msgid "Download subtitles"
+msgstr "unduh sub judul"
+
msgctxt "#31360"
msgid "Watch as 2D"
msgstr "Tonton sebagai 2D"
@@ -236,6 +416,10 @@ msgctxt "#31390"
msgid "Skin default"
msgstr "Kulit Standar"
+msgctxt "#31391"
+msgid "Skin default with no caps"
+msgstr "Skin standard tanpa topi"
+
msgctxt "#31392"
msgid "Arial based"
msgstr "berbasis Arial"
@@ -248,14 +432,22 @@ msgctxt "#31401"
msgid "[B]CONFIGURE VIDEO SETTINGS[/B][CR][CR]Manage your video library · Set video playback options · Change video listing options[CR]Set subtitle fonts"
msgstr "[B]KONFIGURASI SETELAN VIDEO[/B][CR][CR]Kelola pustaka video Anda · Set opsi pemutaran video · Rubah opsi daftar video[CR]Atur font subtitle"
-msgctxt "#31402"
-msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission · Set karaoke options"
-msgstr "[B]KONFIGURASIKAN SETELAN MUSIK[/B][CR][CR]Kelola pustaka musik Anda · Atur opsi pemutaran musik · Rubah opsi daftar musik[CR]Setel submisi lagu · Setel opsi karaoke"
+msgctxt "#31403"
+msgid "[B]CONFIGURE PICTURE SETTINGS[/B][CR][CR]Set picture listing options · Configure slideshow"
+msgstr "[B] PENGATURAN KONFIGURASI GAMBAR [/ B] [CR] [CR] Mengatur pilihan daftar gambar · Konfigurasi dafra slideshow"
+
+msgctxt "#31404"
+msgid "[B]CONFIGURE WEATHER SETTINGS[/B][CR][CR]Set various cities to collect weather information"
+msgstr "[B] PENGATURAN KONFIGURASI CUACA [/ B] [CR] [CR] Mengatur berbagai kota untuk mengumpulkan informasi cuaca"
msgctxt "#31406"
msgid "[B]CONFIGURE SYSTEM SETTINGS[/B][CR][CR]Setup and calibrate displays · Configure audio output · Setup remote controls[CR]Set power saving options · Enable debugging · Setup master lock"
msgstr "[B]KONFIGURASIKAN SETELAN SISTEM[/B][CR][CR]Setel dan kalibrasi tampilan · Konfigurasi keluaran audio · Setel remote control[CR]Atur opsi hemat daya · Aktifkan debugging · Setel kunci master"
+msgctxt "#31408"
+msgid "[B]CONFIGURE ADD-ONS[/B][CR][CR]Manage your installed add-ons · Browse for and install add-ons from kodi.tv[CR]Modify add-on settings"
+msgstr "[B] KONFIGURASI ADD-ONS [/ B] [CR] [CR] Mengelola add-ons yang telah terintsall · Browse for dan menginstal add-ons dari kodi.tv [CR] Modifikasi pengaturan add-on"
+
msgctxt "#31409"
msgid "[B]CONFIGURE TV SETTINGS[/B][CR][CR]Change full screen info · Manage EPG data settings"
msgstr "[B]KONFIGURASIKAN SETELAN TV[/B][CR][CR]Rubah info layar penuh · Kelola setelan data EPG"
@@ -264,6 +456,14 @@ msgctxt "#31410"
msgid "[B]CONFIGURE SERVICE SETTINGS[/B][CR][CR]Setup control of Kodi via UPnP and HTTP · Configure file sharing[CR]Enable Zeroconf · Configure AirPlay"
msgstr "[B]KONFIGURASIKAN SETELAN LAYANAN[/B][CR][CR]Setel kontrol Kodi melalui UPnP dan HTTP · Konfigurasikan layanan berbagi berkas[CR]Aktifkan Zeroconf · Konfigurasikan AirPlay"
+msgctxt "#31411"
+msgid "First run help..."
+msgstr "Pertama jalankan bantuan..."
+
+msgctxt "#31412"
+msgid "This tab signifies that there is a menu off to the side of this window that contains extra options for this section. To access the menu, navigate to the left with your remote control or keyboard or place your mouse pointer over the tab. [CR][CR]Click \"OK\" to close this dialogue. It will not appear again."
+msgstr "Tab ini menandakan bahwa ada menu off ke sisi jendela ini yang berisi opsi tambahan untuk bagian ini. Untuk mengakses menu, arahkan ke kiri dengan remote control atau keyboard atau tempatkan pointer mouse Anda ke tab. [CR] [CR] Klik \"OK\" untuk menutup dialog ini. Ini tidak akan muncul lagi."
+
msgctxt "#31413"
msgid "Local subtitle available"
msgstr "Subtitle lokal tersedia"
@@ -272,6 +472,10 @@ msgctxt "#31420"
msgid "Login"
msgstr "Login"
+msgctxt "#31421"
+msgid "Select your Kodi user profile[CR]to login and continue"
+msgstr "Pilih profil pengguna Kodi Anda [CR] untuk login dan lanjutkan"
+
msgctxt "#31422"
msgid "Show or hide the login screen at startup."
msgstr "Tampilkan atau sembunyikan layar login pada startup."
@@ -280,18 +484,66 @@ msgctxt "#31423"
msgid "Select the profile that will be used at startup when the login screen is disabled."
msgstr "Pilih profil akan digunakan ketika startup apabila layar login dinonaktifkan."
+msgctxt "#31501"
+msgid "Scheduled time"
+msgstr "Waktu yang telah dijadwalkan"
+
msgctxt "#31502"
msgid "TV"
msgstr "TV"
+msgctxt "#31503"
+msgid "Add group"
+msgstr "Tambah grup"
+
+msgctxt "#31504"
+msgid "Rename group"
+msgstr "Mengubah nama grup"
+
+msgctxt "#31505"
+msgid "Delete group"
+msgstr "Hapus grup"
+
msgctxt "#31506"
msgid "Available[CR]Groups"
msgstr "Grup[CR]Tersedia"
+msgctxt "#31509"
+msgid "Channel group"
+msgstr "Grup saluran"
+
+msgctxt "#31510"
+msgid "Timer set"
+msgstr "Set timer"
+
+msgctxt "#31511"
+msgid "Channel options"
+msgstr "Pilihan saluran"
+
+msgctxt "#31901"
+msgid "36-hour forecast"
+msgstr "Perkiraan 36 jam"
+
+msgctxt "#31902"
+msgid "Hourly forecast"
+msgstr "Perkiraan jam"
+
+msgctxt "#31903"
+msgid "Weekend forecast"
+msgstr "Perkiraan akhir pekan"
+
+msgctxt "#31904"
+msgid "Daily forecast"
+msgstr "Perkiraan harian"
+
msgctxt "#31905"
msgid "Forecast"
msgstr "Ramalan"
+msgctxt "#31908"
+msgid "Chance of precipitation"
+msgstr "Kemungkinan presipitasi"
+
msgctxt "#31909"
msgid "Fetching forecast info..."
msgstr "Mengambil info ramalan..."
diff --git a/addons/skin.confluence/language/resource.language.is_is/strings.po b/addons/skin.confluence/language/resource.language.is_is/strings.po
index 6ab16470af..913fd35075 100644
--- a/addons/skin.confluence/language/resource.language.is_is/strings.po
+++ b/addons/skin.confluence/language/resource.language.is_is/strings.po
@@ -16,10 +16,22 @@ msgstr ""
"Language: is_IS\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+msgctxt "#31000"
+msgid "Change your"
+msgstr "Breyta þínu"
+
+msgctxt "#31003"
+msgid "Power options"
+msgstr "Orkukostir"
+
msgctxt "#31004"
msgid "Working..."
msgstr "Vinnsla..."
+msgctxt "#31005"
+msgid "Hide information"
+msgstr "Fela upplýsingar"
+
msgctxt "#31006"
msgid "View options"
msgstr "Stillingar sjónarhorns"
@@ -28,6 +40,10 @@ msgctxt "#31008"
msgid "Full screen"
msgstr "Fylla skjá"
+msgctxt "#31009"
+msgid "Total duration"
+msgstr "Heildar tímalengd"
+
msgctxt "#31022"
msgid "Music - Files"
msgstr "Tónlist - Skrár"
@@ -44,14 +60,30 @@ msgctxt "#31025"
msgid "Items"
msgstr "Hlutir"
+msgctxt "#31026"
+msgid "Misc options"
+msgstr "Ãmsir valkostir"
+
msgctxt "#31027"
msgid "Location"
msgstr "Staðsetning"
+msgctxt "#31028"
+msgid "Poster wrap"
+msgstr "Veggspjaldafletting"
+
msgctxt "#31029"
msgid "Fanart"
msgstr "Aðdáendamyndir"
+msgctxt "#31031"
+msgid "Pic thumbs"
+msgstr "Smámyndir"
+
+msgctxt "#31032"
+msgid "Image wrap"
+msgstr "Myndafletting"
+
msgctxt "#31033"
msgid "Info"
msgstr "Upplýsingar"
@@ -60,6 +92,10 @@ msgctxt "#31039"
msgid "Actions"
msgstr "Aðgerðir"
+msgctxt "#31040"
+msgid "Now playing"
+msgstr "Ã spilun"
+
msgctxt "#31042"
msgid "PLAYING"
msgstr "SPILA"
@@ -80,6 +116,10 @@ msgctxt "#31046"
msgid "SEEKING"
msgstr "LEITA"
+msgctxt "#31048"
+msgid "Visualisation presets"
+msgstr "Forstillingar myndskreytinga"
+
msgctxt "#31049"
msgid "End time"
msgstr "Lokatími"
@@ -116,6 +156,10 @@ msgctxt "#31060"
msgid "This file is stacked, select the part you want to play from."
msgstr "Þessi skrá er stöfluð, veldu þann part sem þú vilt byrja að spila frá."
+msgctxt "#31061"
+msgid "Current selected"
+msgstr "Núverandi val"
+
msgctxt "#31101"
msgid "Home screen options"
msgstr "Stillingar heimaskjás"
@@ -124,10 +168,26 @@ msgctxt "#31102"
msgid "Background"
msgstr "Bakgrunnur"
+msgctxt "#31103"
+msgid "Show \"Paused\" in picture slideshow"
+msgstr "Sýna \"à bið\" í mynda-glærusýningu"
+
+msgctxt "#31104"
+msgid "Play trailers in a window [COLOR=grey3](Video information dialogue only)[/COLOR]"
+msgstr "Spila kvikmyndasýnishorn í glugga [COLOR=grey3](Aðeins myndbandaupplýsingarglugga)[/COLOR]"
+
msgctxt "#31106"
msgid "Miscellaneous options"
msgstr "Ãmsir valkostir"
+msgctxt "#31107"
+msgid "Hide flagging read from video filenames [COLOR=grey3](e.g. Blu-ray, HD-DVD)[/COLOR]"
+msgstr "Fela flagg lesið frá skráarnöfnum [COLOR=grey3](t.d Blu-ray, HD-DVD)[/COLOR]"
+
+msgctxt "#31108"
+msgid "Hide main menu buttons"
+msgstr "Fela hnappa í aðalvalmynd"
+
msgctxt "#31109"
msgid "Enable custom background"
msgstr "Virkja sérsniðinn bakgrunn"
@@ -144,18 +204,54 @@ msgctxt "#31112"
msgid "Options"
msgstr "Valkostir"
-msgctxt "#31126"
-msgid "Play TV theme songs in video library (TvTunes add-on)"
-msgstr "Spila þema lög í myndbandasafni (TvTunes viðbót)"
+msgctxt "#31116"
+msgid "Show recently added albums"
+msgstr "Sýna hljómplötur sem hefur nýlega verið bætt við"
+
+msgctxt "#31117"
+msgid "Show recently added videos"
+msgstr "Sýna myndbönd sem var nýlega bætt við"
-msgctxt "#31127"
-msgid "TvTunes"
-msgstr "TvTunes"
+msgctxt "#31118"
+msgid "Home page programs submenu"
+msgstr "Undirvalmynd forrita-heimasíðu"
+
+msgctxt "#31119"
+msgid "Hide background fanart"
+msgstr "Fela aðdáendamyndir í bakgrunni"
+
+msgctxt "#31124"
+msgid "Show background \"Now playing\" video"
+msgstr "Sýna \"à spilun\" myndband í bakgrunni"
+
+msgctxt "#31125"
+msgid "Show background \"Now playing\" visualisation"
+msgstr "Sýna \"à spilun\" myndskreytingu í bakgrunni"
msgctxt "#31128"
msgid "Lyrics"
msgstr "Lagatextar"
+msgctxt "#31129"
+msgid "Hide fanart in full screen visualisation"
+msgstr "Fela aðdáendamyndir í myndhrifum fyrir allan skjá"
+
+msgctxt "#31132"
+msgid "Lyrics add-on"
+msgstr "Viðbót fyrir lagatexta"
+
+msgctxt "#31134"
+msgid "Home page \"Videos\" submenu"
+msgstr "Undirvalmynd myndbandasíðu"
+
+msgctxt "#31135"
+msgid "Home page \"Music\" submenu"
+msgstr "Undirvalmynd tónlistarsíðu"
+
+msgctxt "#31136"
+msgid "Home page \"Pictures\" submenu"
+msgstr "Undirvalmynd ljósmyndaasíðu"
+
msgctxt "#31140"
msgid "Music OSD"
msgstr "Tónlistarskjár"
@@ -172,22 +268,90 @@ msgctxt "#31200"
msgid "Shortcuts"
msgstr "Flýtileiðir"
+msgctxt "#31203"
+msgid "Choose your song"
+msgstr "Veldu þitt lag"
+
+msgctxt "#31205"
+msgid "Lyrics source"
+msgstr "Veita lagatexta"
+
msgctxt "#31206"
msgid "Found"
msgstr "Fann"
+msgctxt "#31207"
+msgid "Find more items"
+msgstr "Finna fleiri atriði"
+
+msgctxt "#31208"
+msgid "Upcoming episodes"
+msgstr "Næstu þættir"
+
+msgctxt "#31300"
+msgid "Current temperature"
+msgstr "Núverandi hiti"
+
+msgctxt "#31301"
+msgid "Last updated"
+msgstr "Síðast uppfært"
+
msgctxt "#31303"
msgid "Data provider"
msgstr "Gagnaveita"
+msgctxt "#31307"
+msgid "Hide fanart"
+msgstr "Fela aðdáendamyndir"
+
+msgctxt "#31308"
+msgid "Movie details"
+msgstr "Kvikmyndaupplýsingar"
+
+msgctxt "#31309"
+msgid "Memory used:"
+msgstr "Minni notað:"
+
+msgctxt "#31310"
+msgid "Track number"
+msgstr "Númer lags"
+
msgctxt "#31311"
msgid "Fanart image[CR][CR]Unavailable[CR][CR] Click button to set"
msgstr "Aðdáendamynd[CR][CR]Ekki fáanleg[CR][CR] Smelltu til að breyta"
+msgctxt "#31312"
+msgid "Current scraper"
+msgstr "Núverandi skafa"
+
+msgctxt "#31313"
+msgid "Choose a scraper"
+msgstr "Veldu sköfu"
+
+msgctxt "#31314"
+msgid "Content scanning options"
+msgstr "Stillingar fyrir skönnun innihalds"
+
+msgctxt "#31317"
+msgid "Set fanart path"
+msgstr "Breyta slóð fyrir aðdáendamyndir"
+
+msgctxt "#31319"
+msgid "Selected profile"
+msgstr "Valinn notandi"
+
+msgctxt "#31320"
+msgid "Last logged in"
+msgstr "Síðast skráður inn"
+
msgctxt "#31322"
msgid "Aired"
msgstr "Sýnt"
+msgctxt "#31325"
+msgid "Playlist options"
+msgstr "Valkostir lagalista"
+
msgctxt "#31326"
msgid "Created"
msgstr "Búið til"
@@ -196,10 +360,22 @@ msgctxt "#31327"
msgid "Resolution"
msgstr "Upplausn"
+msgctxt "#31328"
+msgid "Recently added"
+msgstr "Nýlega bætt við"
+
msgctxt "#31329"
msgid "[B]Timer set![/B] [COLOR=grey2] - System auto shutdown in[/COLOR]"
msgstr "[B]Tímamælir virkur![/B] [COLOR=grey2] - Sjálfvirkt Slökkt eftir[/COLOR]"
+msgctxt "#31330"
+msgid "Click button to play[CR][CR]movie trailer"
+msgstr "Smelltu á takka til að spila[CR][CR]Kvikmyndasýnishorn"
+
+msgctxt "#31331"
+msgid "Album details"
+msgstr "Hljómplötuupplýsingar"
+
msgctxt "#31351"
msgid "Pause"
msgstr "Bið"
@@ -208,6 +384,10 @@ msgctxt "#31352"
msgid "Stop"
msgstr "Stöðva"
+msgctxt "#31353"
+msgid "Fast forward"
+msgstr "Hratt áfram"
+
msgctxt "#31354"
msgid "Rewind"
msgstr "Til baka"
@@ -216,6 +396,10 @@ msgctxt "#31355"
msgid "Movie menu"
msgstr "Kvikmyndavalmynd"
+msgctxt "#31356"
+msgid "Download subtitles"
+msgstr "Niðurhala þýðingartextum"
+
msgctxt "#31360"
msgid "Watch as 2D"
msgstr "Horfa á í 2D"
@@ -232,6 +416,10 @@ msgctxt "#31390"
msgid "Skin default"
msgstr "Sjálfgildi útlits"
+msgctxt "#31391"
+msgid "Skin default with no caps"
+msgstr "Sjálfgildi útlits með engum hástöfum"
+
msgctxt "#31392"
msgid "Arial based"
msgstr "Byggt á Arial"
@@ -244,14 +432,22 @@ msgctxt "#31401"
msgid "[B]CONFIGURE VIDEO SETTINGS[/B][CR][CR]Manage your video library · Set video playback options · Change video listing options[CR]Set subtitle fonts"
msgstr "[B]BREYTA SKJÃSTILLINGUM[/B][CR][CR]Sýsla með myndabandasafn · Breyta myndbandaspilun · Breyta stillingum myndbandalista[CR]Breyta leturgerðum þýðingartexta"
-msgctxt "#31402"
-msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission · Set karaoke options"
-msgstr "[B]BREYTA TÓNLISTARSTILLINGUM[/B][CR][CR]Sýsla með tónlistarsafn · Breyta stillingum tónlistarspilara · Breyta stillingum tónlistarlista[CR]Skilgreina laga upphal · Breyta karaoke stillingum"
+msgctxt "#31403"
+msgid "[B]CONFIGURE PICTURE SETTINGS[/B][CR][CR]Set picture listing options · Configure slideshow"
+msgstr "[B]BREYTA LJÓSMYNDASTILLINGUM[/B][CR][CR]Breyta stillingum ljósmyndalista · Stilla myndasýningar"
+
+msgctxt "#31404"
+msgid "[B]CONFIGURE WEATHER SETTINGS[/B][CR][CR]Set various cities to collect weather information"
+msgstr "[B]BREYTA VEÃURSTILLINGUM[/B][CR][CR]Skilgreindu nokkrar borgir til að ná í veðurupplýsingar fyrir"
msgctxt "#31406"
msgid "[B]CONFIGURE SYSTEM SETTINGS[/B][CR][CR]Setup and calibrate displays · Configure audio output · Setup remote controls[CR]Set power saving options · Enable debugging · Setup master lock"
msgstr "[B]BREYTA KERFISSTILLINGUM[/B][CR][CR]Breyta og stilla skjái · Breyta hljóðúttaki · Skilgreina fjarstýringar[CR]Breyta orkukostum · Virkja aflúsun · Skilgreina aðallykilorð"
+msgctxt "#31408"
+msgid "[B]CONFIGURE ADD-ONS[/B][CR][CR]Manage your installed add-ons · Browse for and install add-ons from kodi.tv[CR]Modify add-on settings"
+msgstr "[B]BREYTA VIÃBÓTUM[/B][CR][CR]Breyttu uppsettum viðbótum · Leitaðu að og settu upp viðbætur frá kodi.tv[CR]Breyta stillingum viðbóta"
+
msgctxt "#31409"
msgid "[B]CONFIGURE TV SETTINGS[/B][CR][CR]Change full screen info · Manage EPG data settings"
msgstr "[B]SJÓNVARPSSTILLINGAR[/B][CR][CR]Breyta upplýsingum á fullum skjá · Halda utan um EPG gagnastillingar"
@@ -260,6 +456,14 @@ msgctxt "#31410"
msgid "[B]CONFIGURE SERVICE SETTINGS[/B][CR][CR]Setup control of Kodi via UPnP and HTTP · Configure file sharing[CR]Enable Zeroconf · Configure AirPlay"
msgstr "[B]CONFIGURE SERVICE SETTINGS[/B][CR][CR]Uppsetning á stjórnun Kodi með UPnP og HTTP · Setja upp skráardeilingu[CR]Virkja Zeroconf · Stilla AirPlay"
+msgctxt "#31411"
+msgid "First run help..."
+msgstr "Keyrið hjálp fyrst..."
+
+msgctxt "#31412"
+msgid "This tab signifies that there is a menu off to the side of this window that contains extra options for this section. To access the menu, navigate to the left with your remote control or keyboard or place your mouse pointer over the tab. [CR][CR]Click \"OK\" to close this dialogue. It will not appear again."
+msgstr "Þessi flipi þýðir að það er valblað við hliðina á þessum glugga, sem er með aukastillingum fyrir þennan hluta. Til að komast í valblaðið skaltu fara til vinstri með fjarstýringunni eða lyklaborðinu eða setja músabendilinn á flipann. [CR][CR]Smelltu á \"à lagi\" til að loka þessum texta. Hann birtist ekki aftur."
+
msgctxt "#31413"
msgid "Local subtitle available"
msgstr "Staðvær þýðingartexti tiltækur"
@@ -268,6 +472,10 @@ msgctxt "#31420"
msgid "Login"
msgstr "Innskrá"
+msgctxt "#31421"
+msgid "Select your Kodi user profile[CR]to login and continue"
+msgstr "Veldu Kodi notanda[CR]til að skrá þig inn og halda áfram"
+
msgctxt "#31422"
msgid "Show or hide the login screen at startup."
msgstr "Sýna eða fela innskráningarskjá við ræsingu."
@@ -276,18 +484,66 @@ msgctxt "#31423"
msgid "Select the profile that will be used at startup when the login screen is disabled."
msgstr "Veldu uppsetninguna sem verður notuð í ræsingu þegar innskráningarglugginn hefur verið gerður óvirkur."
+msgctxt "#31501"
+msgid "Scheduled time"
+msgstr "Uppsettur tími"
+
msgctxt "#31502"
msgid "TV"
msgstr "Sjónvarp"
+msgctxt "#31503"
+msgid "Add group"
+msgstr "Bæta við hóp"
+
+msgctxt "#31504"
+msgid "Rename group"
+msgstr "Endurnefna hóp"
+
+msgctxt "#31505"
+msgid "Delete group"
+msgstr "Eyða hóp"
+
msgctxt "#31506"
msgid "Available[CR]Groups"
msgstr "Tiltækir[CR]Hópar"
+msgctxt "#31509"
+msgid "Channel group"
+msgstr "Rásarhópur"
+
+msgctxt "#31510"
+msgid "Timer set"
+msgstr "Stilling teljara"
+
+msgctxt "#31511"
+msgid "Channel options"
+msgstr "Valkostir rásar"
+
+msgctxt "#31901"
+msgid "36-hour forecast"
+msgstr "36 klst veðurspá"
+
+msgctxt "#31902"
+msgid "Hourly forecast"
+msgstr "Klukkustunda veðurspá"
+
+msgctxt "#31903"
+msgid "Weekend forecast"
+msgstr "Veðurspá helgarinnar"
+
+msgctxt "#31904"
+msgid "Daily forecast"
+msgstr "Dagleg veðurspá"
+
msgctxt "#31905"
msgid "Forecast"
msgstr "Veðurspá"
+msgctxt "#31908"
+msgid "Chance of precipitation"
+msgstr "Líkur á úrkomu"
+
msgctxt "#31909"
msgid "Fetching forecast info..."
msgstr "Næ í veðurspá..."
diff --git a/addons/skin.confluence/language/resource.language.it_it/strings.po b/addons/skin.confluence/language/resource.language.it_it/strings.po
index 0b01d469c8..56a6d8dd91 100644
--- a/addons/skin.confluence/language/resource.language.it_it/strings.po
+++ b/addons/skin.confluence/language/resource.language.it_it/strings.po
@@ -42,7 +42,7 @@ msgstr "Schermo Intero"
msgctxt "#31009"
msgid "Total duration"
-msgstr "Durata Totale"
+msgstr "Durata totale"
msgctxt "#31022"
msgid "Music - Files"
@@ -50,7 +50,7 @@ msgstr "Musica - File"
msgctxt "#31023"
msgid "Playing"
-msgstr "In Riproduzione"
+msgstr "In riproduzione"
msgctxt "#31024"
msgid "Page"
@@ -62,7 +62,7 @@ msgstr "Oggetti"
msgctxt "#31026"
msgid "Misc options"
-msgstr "Opzioni Varie"
+msgstr "Opzioni varie"
msgctxt "#31027"
msgid "Location"
@@ -78,7 +78,7 @@ msgstr "Fanart"
msgctxt "#31031"
msgid "Pic thumbs"
-msgstr "Miniature Immagini"
+msgstr "Miniature immagini"
msgctxt "#31032"
msgid "Image wrap"
@@ -94,7 +94,7 @@ msgstr "Azioni"
msgctxt "#31040"
msgid "Now playing"
-msgstr "In Riproduzione"
+msgstr "In riproduzione"
msgctxt "#31042"
msgid "PLAYING"
@@ -134,23 +134,23 @@ msgstr "Ordina: Decrescente"
msgctxt "#31055"
msgid "Open playlist"
-msgstr "Apri Playlist"
+msgstr "Apri la playlist"
msgctxt "#31056"
msgid "Save playlist"
-msgstr "Salva Playlist"
+msgstr "Salva la playlist"
msgctxt "#31057"
msgid "Close playlist"
-msgstr "Chiudi Playlist"
+msgstr "Chiudi la playlist"
msgctxt "#31058"
msgid "System music files"
-msgstr "Suoni di Sistema"
+msgstr "Suoni di sistema"
msgctxt "#31059"
msgid "Current playlist"
-msgstr "Playlist Attuale"
+msgstr "Playlist corrente"
msgctxt "#31060"
msgid "This file is stacked, select the part you want to play from."
@@ -162,7 +162,7 @@ msgstr "Attualmente Selezionato"
msgctxt "#31101"
msgid "Home screen options"
-msgstr "Opzioni Pagina Iniziale"
+msgstr "Opzioni pagina iniziale"
msgctxt "#31102"
msgid "Background"
@@ -170,11 +170,11 @@ msgstr "Sfondo"
msgctxt "#31103"
msgid "Show \"Paused\" in picture slideshow"
-msgstr "Mostra \"In Pausa\" durante la presentazione delle immagini"
+msgstr "Mostra \"In pausa\" durante la presentazione delle immagini"
msgctxt "#31104"
msgid "Play trailers in a window [COLOR=grey3](Video information dialogue only)[/COLOR]"
-msgstr "Mostra trailer in finestra [COLOR=grey3](Solo finestra dialogo informazioni Video)[/COLOR]"
+msgstr "Mostra trailer in una finestra [COLOR=grey3](Solo finestra di dialogo Informazioni video)[/COLOR]"
msgctxt "#31106"
msgid "Miscellaneous options"
@@ -220,6 +220,10 @@ msgctxt "#31119"
msgid "Hide background fanart"
msgstr "Nascondi Sfondo Fanart"
+msgctxt "#31122"
+msgid "Hide EPG if RDS is present on channel window"
+msgstr "Nascondi l'EPG se è presente l'RDS nella finestra del canale"
+
msgctxt "#31124"
msgid "Show background \"Now playing\" video"
msgstr "Mostra Sfondo Video \"In Riproduzione\""
@@ -228,14 +232,6 @@ msgctxt "#31125"
msgid "Show background \"Now playing\" visualisation"
msgstr "Mostra Sfondo Visualizzazione \"In Riproduzione\""
-msgctxt "#31126"
-msgid "Play TV theme songs in video library (TvTunes add-on)"
-msgstr "Riproduci le Sigle TV nella Libreria Video (Add-on TvTunes)"
-
-msgctxt "#31127"
-msgid "TvTunes"
-msgstr "TvTunes"
-
msgctxt "#31128"
msgid "Lyrics"
msgstr "Testi canzoni"
@@ -302,7 +298,7 @@ msgstr "Temperatura attuale"
msgctxt "#31301"
msgid "Last updated"
-msgstr "Ultimo Aggiornamento"
+msgstr "Ultimo aggiornamento"
msgctxt "#31303"
msgid "Data provider"
@@ -322,7 +318,7 @@ msgstr "Memoria usata:"
msgctxt "#31310"
msgid "Track number"
-msgstr "Numero Traccia"
+msgstr "Numero traccia"
msgctxt "#31311"
msgid "Fanart image[CR][CR]Unavailable[CR][CR] Click button to set"
@@ -352,10 +348,6 @@ msgctxt "#31320"
msgid "Last logged in"
msgstr "Ultimo login"
-msgctxt "#31321"
-msgid "Karaoke song selector"
-msgstr "Selettore Canzoni Karaoke"
-
msgctxt "#31322"
msgid "Aired"
msgstr "Trasmessa"
@@ -426,11 +418,11 @@ msgstr "Abilitato"
msgctxt "#31390"
msgid "Skin default"
-msgstr "Predefinito Skin"
+msgstr "Predefinito della skin"
msgctxt "#31391"
msgid "Skin default with no caps"
-msgstr "Predefinito Skin senza maiuscole"
+msgstr "Predefinito della skin senza maiuscole"
msgctxt "#31392"
msgid "Arial based"
@@ -445,8 +437,8 @@ msgid "[B]CONFIGURE VIDEO SETTINGS[/B][CR][CR]Manage your video library · Set v
msgstr "[B]CONFIGURA IMPOSTAZIONI VIDEO[/B][CR][CR]Gestisci la tua Libreria video · Imposta le opzioni di riproduzione dei video · Cambia le opzioni per le liste video[CR]Imposta i font dei sottotitoli"
msgctxt "#31402"
-msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission · Set karaoke options"
-msgstr "[B]CONFIGURA IMPOSTAZIONI MUSICA[/B][CR][CR]Gestisci la tua libreria musicale · Imposta le opzioni di riproduzione della musica · Cambia le impostazioni per le liste audio[CR]Imposta invio canzone · Imposta le opzioni per il karaoke"
+msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission"
+msgstr "[B]CONFIGURA IMPOSTAZIONI MUSICA[/B][CR][CR]Gestisci la tua libreria musicale · Imposta le opzioni di riproduzione musicale · Cambia le impostazioni di ordinamento musicale[CR]Imposta invio canzone"
msgctxt "#31403"
msgid "[B]CONFIGURE PICTURE SETTINGS[/B][CR][CR]Set picture listing options · Configure slideshow"
diff --git a/addons/skin.confluence/language/resource.language.ja_jp/strings.po b/addons/skin.confluence/language/resource.language.ja_jp/strings.po
index cc38a3651a..e4b987e878 100644
--- a/addons/skin.confluence/language/resource.language.ja_jp/strings.po
+++ b/addons/skin.confluence/language/resource.language.ja_jp/strings.po
@@ -144,14 +144,6 @@ msgctxt "#31112"
msgid "Options"
msgstr "オプション"
-msgctxt "#31126"
-msgid "Play TV theme songs in video library (TvTunes add-on)"
-msgstr "ビデオライブラリ㧠TV テーマ曲をå†ç”Ÿ (TvTunes アドオン)"
-
-msgctxt "#31127"
-msgid "TvTunes"
-msgstr "TvTunes"
-
msgctxt "#31128"
msgid "Lyrics"
msgstr "歌詞"
@@ -244,10 +236,6 @@ msgctxt "#31401"
msgid "[B]CONFIGURE VIDEO SETTINGS[/B][CR][CR]Manage your video library · Set video playback options · Change video listing options[CR]Set subtitle fonts"
msgstr "[B]ビデオ設定[/B][CR][CR]ãƒ“ãƒ‡ã‚ªãƒ©ã‚¤ãƒ–ãƒ©ãƒªç®¡ç† - ビデオå†ç”Ÿè¨­å®š - ビデオ一覧設定変更[CR]字幕用フォント変更"
-msgctxt "#31402"
-msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission · Set karaoke options"
-msgstr "[B]ミュージック設定[/B][CR][CR]ãƒŸãƒ¥ãƒ¼ã‚¸ãƒƒã‚¯ãƒ©ã‚¤ãƒ–ãƒ©ãƒªç®¡ç† - ミュージックå†ç”Ÿè¨­å®š - ミュージック一覧設定変更[CR]楽曲é€ä¿¡è¨­å®š - カラオケ設定"
-
msgctxt "#31406"
msgid "[B]CONFIGURE SYSTEM SETTINGS[/B][CR][CR]Setup and calibrate displays · Configure audio output · Setup remote controls[CR]Set power saving options · Enable debugging · Setup master lock"
msgstr "[B]システム設定[/B][CR][CR]ç”»é¢ã®è¨­å®šãƒ»èª¿æ•´ - オーディオ出力設定 - リモートコントローラー設定[CR]çœé›»åŠ›è¨­å®š - デãƒãƒƒã‚°ã®æœ‰åŠ¹åŒ– - マスターロック設定"
diff --git a/addons/skin.confluence/language/resource.language.ko_kr/strings.po b/addons/skin.confluence/language/resource.language.ko_kr/strings.po
index d7b3ecbeca..6c34221b89 100644
--- a/addons/skin.confluence/language/resource.language.ko_kr/strings.po
+++ b/addons/skin.confluence/language/resource.language.ko_kr/strings.po
@@ -228,14 +228,6 @@ msgctxt "#31125"
msgid "Show background \"Now playing\" visualisation"
msgstr "ë°°ê²½ì— \"지금 ìž¬ìƒ ì¤‘\" ì‹œê°í™” 보기"
-msgctxt "#31126"
-msgid "Play TV theme songs in video library (TvTunes add-on)"
-msgstr "ë¼ì´ë¸ŒëŸ¬ë¦¬ 모드ì—ì„œ TV 주제ìŒì•… ìž¬ìƒ (TvTunes 애드온)"
-
-msgctxt "#31127"
-msgid "TvTunes"
-msgstr "TvTunes"
-
msgctxt "#31128"
msgid "Lyrics"
msgstr "가사"
@@ -352,10 +344,6 @@ msgctxt "#31320"
msgid "Last logged in"
msgstr "마지막 로그ì¸"
-msgctxt "#31321"
-msgid "Karaoke song selector"
-msgstr "노래방 노래 ì„ íƒê¸°"
-
msgctxt "#31322"
msgid "Aired"
msgstr "ë°©ì˜"
@@ -444,10 +432,6 @@ msgctxt "#31401"
msgid "[B]CONFIGURE VIDEO SETTINGS[/B][CR][CR]Manage your video library · Set video playback options · Change video listing options[CR]Set subtitle fonts"
msgstr "[B]비디오 설정[/B][CR][CR]비디오 ë¼ì´ë¸ŒëŸ¬ë¦¬ 관리 · 비디오 ìž¬ìƒ ì˜µì…˜ 변경 · 비디오 ëª©ë¡ ì˜µì…˜ 변경[CR]ìžë§‰ 글꼴 설정"
-msgctxt "#31402"
-msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission · Set karaoke options"
-msgstr "[B]ìŒì•… 설정[/B][CR][CR]ìŒì•… ë¼ì´ë¸ŒëŸ¬ë¦¬ 관리 · ìŒì•… ìž¬ìƒ ì˜µì…˜ 변경 · ìŒì•… ëª©ë¡ ì˜µì…˜ 변경[CR]노래 전송 설정 · 노래방 옵션 설정"
-
msgctxt "#31403"
msgid "[B]CONFIGURE PICTURE SETTINGS[/B][CR][CR]Set picture listing options · Configure slideshow"
msgstr "[B]사진 설정[/B][CR][CR]사진 ëª©ë¡ ì˜µì…˜ 변경 · 슬ë¼ì´ë“œì‡¼ 설정"
diff --git a/addons/skin.confluence/language/resource.language.lt_lt/strings.po b/addons/skin.confluence/language/resource.language.lt_lt/strings.po
index 28f119e1dc..75590edd95 100644
--- a/addons/skin.confluence/language/resource.language.lt_lt/strings.po
+++ b/addons/skin.confluence/language/resource.language.lt_lt/strings.po
@@ -220,6 +220,10 @@ msgctxt "#31119"
msgid "Hide background fanart"
msgstr "SlÄ—pti fono Fanart"
+msgctxt "#31122"
+msgid "Hide EPG if RDS is present on channel window"
+msgstr "SlÄ—pti EPG, jei kanalo lange yra RDS"
+
msgctxt "#31124"
msgid "Show background \"Now playing\" video"
msgstr "Rodyti \"Dabar atkuriamą\" vaizdo įrašą fone"
@@ -228,14 +232,6 @@ msgctxt "#31125"
msgid "Show background \"Now playing\" visualisation"
msgstr "Rodyti \"Dabar atkuriamos\" muzikos vizualizacijÄ… fone"
-msgctxt "#31126"
-msgid "Play TV theme songs in video library (TvTunes add-on)"
-msgstr "Atkurti televizijos temų dainas vaizdo bibliotekoje (TvTunes priedas)"
-
-msgctxt "#31127"
-msgid "TvTunes"
-msgstr "TvTunes"
-
msgctxt "#31128"
msgid "Lyrics"
msgstr "Dainų žodžiai"
@@ -352,10 +348,6 @@ msgctxt "#31320"
msgid "Last logged in"
msgstr "Paskutinis prisijungimas"
-msgctxt "#31321"
-msgid "Karaoke song selector"
-msgstr "Karaoke dainos pasirinkimas"
-
msgctxt "#31322"
msgid "Aired"
msgstr "Transliuotas"
@@ -445,8 +437,8 @@ msgid "[B]CONFIGURE VIDEO SETTINGS[/B][CR][CR]Manage your video library · Set v
msgstr "[B]KONFIGŪRUOTI VAIZDO ĮRAŠŲ NUSTATYMUS[/B][CR][CR]Tvarkyti vaizdo biblioteką · Nustatyti vaizdo atkūrimo parinktis[CR]Keisti vaizdo įrašų sąrašo atvaizdavimo parinktis · Nustatyti subtitrų šriftus"
msgctxt "#31402"
-msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission · Set karaoke options"
-msgstr "[B]KONFIGŪRUOTI MUZIKOS NUSTATYMUS[/B][CR][CR]Tvarkyti muzikos biblioteką · Nustatyti dainų įkėlimą · Nustatyti karaoke parinktis[CR]Keisti muzikos sąrašo atvaizdavimo parinktis · Nustatyti muzikos atkūrimo parinktis"
+msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission"
+msgstr "[B]KONFIGŪRUOTI MUZIKOS NUSTATYMUS[/B][CR][CR]Tvarkyti muzikos biblioteką · Nustatyti dainų įkėlimą[CR]Keisti muzikos sąrašo atvaizdavimo parinktis · Nustatyti muzikos atkūrimo parinktis"
msgctxt "#31403"
msgid "[B]CONFIGURE PICTURE SETTINGS[/B][CR][CR]Set picture listing options · Configure slideshow"
diff --git a/addons/skin.confluence/language/resource.language.lv_lv/strings.po b/addons/skin.confluence/language/resource.language.lv_lv/strings.po
index 3e69ca7971..1eaecc80d5 100644
--- a/addons/skin.confluence/language/resource.language.lv_lv/strings.po
+++ b/addons/skin.confluence/language/resource.language.lv_lv/strings.po
@@ -152,14 +152,6 @@ msgctxt "#31112"
msgid "Options"
msgstr "Opcijas"
-msgctxt "#31126"
-msgid "Play TV theme songs in video library (TvTunes add-on)"
-msgstr "Atskaņot TV tÄ“mu dziesmas video bibiliotÄ“kÄ (TvTunes pielikums)"
-
-msgctxt "#31127"
-msgid "TvTunes"
-msgstr "TvTunes"
-
msgctxt "#31128"
msgid "Lyrics"
msgstr "Dziesmu vÄrdi"
@@ -252,10 +244,6 @@ msgctxt "#31401"
msgid "[B]CONFIGURE VIDEO SETTINGS[/B][CR][CR]Manage your video library · Set video playback options · Change video listing options[CR]Set subtitle fonts"
msgstr "[B]KONFIGURÄ’T VIDEO IESTATĪJUMUS[/B][CR][CR]PÄrvaldÄ«t savu video bibliotÄ“ku · IestatÄ«t video atskaņoÅ¡anas opcijas · MainÄ«t video saraksta opcijas[CR]IestatÄ«t subtitru fontus"
-msgctxt "#31402"
-msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission · Set karaoke options"
-msgstr "[B]KONFIGURÄ’T MŪZIKAS IESTATĪJUMUS[/B][CR][CR]PÄrvaldÄ«t savu mÅ«zikas bibiliotÄ“ku · IestatÄ«t mÅ«zikas atskaņoÅ¡anas opcijas · MainÄ«t mÅ«zikas saraksta opcijas[CR]UzstÄdÄ«t dziesmas iesniegÅ¡anu · IestatÄ«t karaoke opcijas"
-
msgctxt "#31406"
msgid "[B]CONFIGURE SYSTEM SETTINGS[/B][CR][CR]Setup and calibrate displays · Configure audio output · Setup remote controls[CR]Set power saving options · Enable debugging · Setup master lock"
msgstr "[B]KONFIGURÄ’T SISTÄ’MAS IESTATĪJUMUS[/B][CR][CR]UzstÄdÄ«t un kalibrÄ“t displejus · KonfigurÄ“t audio izvadi · UzstÄdÄ«t tÄlvadÄ«bas pulti[CR]IestatÄ«t enerÄ£ijas taupÄ«Å¡anas opcijas · IeslÄ“gt atkļūdoÅ¡anu · UzstÄdÄ«t galveno slÄ“dzeni"
diff --git a/addons/skin.confluence/language/resource.language.mk_mk/strings.po b/addons/skin.confluence/language/resource.language.mk_mk/strings.po
index 51cfc62218..3a80f4ceb6 100644
--- a/addons/skin.confluence/language/resource.language.mk_mk/strings.po
+++ b/addons/skin.confluence/language/resource.language.mk_mk/strings.po
@@ -144,14 +144,6 @@ msgctxt "#31112"
msgid "Options"
msgstr "Опции"
-msgctxt "#31126"
-msgid "Play TV theme songs in video library (TvTunes add-on)"
-msgstr "Пуштај TV-theme-songs во видео библиотеката (TvTunes add-on)"
-
-msgctxt "#31127"
-msgid "TvTunes"
-msgstr "TvTunes"
-
msgctxt "#31128"
msgid "Lyrics"
msgstr "Стихови на пеÑни"
@@ -244,10 +236,6 @@ msgctxt "#31401"
msgid "[B]CONFIGURE VIDEO SETTINGS[/B][CR][CR]Manage your video library · Set video playback options · Change video listing options[CR]Set subtitle fonts"
msgstr "[B]КОÐФИГУРИРÐЊЕ ПОСТÐВКИ ЗРФИЛМОВИ[/B][CR][CR]Управувајте Ñо вашата библиотека на видеа · ПоÑтавете опции за изведба на филмови[CR]Изменете опции за прикажување на филмови · ПоÑтавете фонт за преводот"
-msgctxt "#31402"
-msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission · Set karaoke options"
-msgstr "[B]КОÐФИГУРИРÐЊЕ ПОСТÐВКИ ЗРМУЗИКÐ[/B][CR][CR]Управувајте Ñо вашата музичка библиотека · ПоÑтавете опции за изведба на музика[CR]Променете опции за прикажување на музика · ПоÑтавете праќање на пеÑни · ПоÑтавете караоке опции"
-
msgctxt "#31406"
msgid "[B]CONFIGURE SYSTEM SETTINGS[/B][CR][CR]Setup and calibrate displays · Configure audio output · Setup remote controls[CR]Set power saving options · Enable debugging · Setup master lock"
msgstr "[B]КОÐФИГУРИРÐЊЕ СИСТЕМСКИ ПОСТÐВКИ[/B][CR][CR]ПодеÑете и калибрирајте екрани · Конфигурирајте звучен излез · ПодеÑете далечинÑко управување · ПоÑтавете опции за заштеда на енергија[CR]Овозможете евиденција на грешки · ПодеÑете главна лозинка"
diff --git a/addons/skin.confluence/language/resource.language.mn_mn/strings.po b/addons/skin.confluence/language/resource.language.mn_mn/strings.po
index 4dd5622b8e..2123814e42 100644
--- a/addons/skin.confluence/language/resource.language.mn_mn/strings.po
+++ b/addons/skin.confluence/language/resource.language.mn_mn/strings.po
@@ -20,22 +20,106 @@ msgctxt "#31008"
msgid "Full screen"
msgstr "БүтÑн дÑлгÑц"
+msgctxt "#31022"
+msgid "Music - Files"
+msgstr "Дууны Файлууд"
+
+msgctxt "#31023"
+msgid "Playing"
+msgstr "Тоглуулж байна"
+
+msgctxt "#31024"
+msgid "Page"
+msgstr "ХуудаÑ"
+
+msgctxt "#31026"
+msgid "Misc options"
+msgstr "буÑад тохиргоонууд"
+
msgctxt "#31027"
msgid "Location"
msgstr "Байрлал"
+msgctxt "#31033"
+msgid "Info"
+msgstr "мÑдÑÑлÑл"
+
+msgctxt "#31040"
+msgid "Now playing"
+msgstr "Одоо тоглуулж байгаа"
+
+msgctxt "#31042"
+msgid "PLAYING"
+msgstr "ТОГЛУУЛЖ БÐЙÐÐ"
+
+msgctxt "#31043"
+msgid "PAUSED"
+msgstr "ТҮР ЗОГСООСОÐ"
+
+msgctxt "#31044"
+msgid "FAST FORWARD"
+msgstr "УРÐГШ ГҮЙЛГЭХ"
+
+msgctxt "#31045"
+msgid "REWIND"
+msgstr "БУЦÐÐÐ¥"
+
+msgctxt "#31046"
+msgid "SEEKING"
+msgstr "Ð¥ÐЙХ"
+
msgctxt "#31049"
msgid "End time"
msgstr "ДууÑах цаг"
+msgctxt "#31050"
+msgid "Sort: Ascending"
+msgstr "Ó¨ÑÓ©Ñ…Ó©Ó©Ñ€ ÑÑ€ÑмбÑлÑÑ…"
+
+msgctxt "#31051"
+msgid "Sort: Descending"
+msgstr "Уруудахаар ÑÑ€ÑмбÑлÑÑ…"
+
msgctxt "#31102"
msgid "Background"
msgstr "Ðрын Ñ…ÑÑÑг"
+msgctxt "#31111"
+msgid "Hide"
+msgstr "Ðуух"
+
+msgctxt "#31112"
+msgid "Options"
+msgstr "Тохиргоонууд"
+
+msgctxt "#31116"
+msgid "Show recently added albums"
+msgstr "СаÑхан нÑмÑгдÑÑн хуурцаг"
+
+msgctxt "#31117"
+msgid "Show recently added videos"
+msgstr "СаÑхан нÑмÑгдÑÑн видеонууд"
+
+msgctxt "#31128"
+msgid "Lyrics"
+msgstr "Дууны үгÑ"
+
msgctxt "#31200"
msgid "Shortcuts"
msgstr "Дөт зам"
+msgctxt "#31205"
+msgid "Lyrics source"
+msgstr "Дууны үгÑийн ÑÑ… Ò¯Ò¯ÑвÑÑ€"
+
+msgctxt "#31206"
+msgid "Found"
+msgstr "Оллоо"
+
+msgctxt "#31308"
+msgid "Movie details"
+msgstr "Киноны мÑдÑÑлÑл"
+
msgctxt "#31327"
msgid "Resolution"
msgstr "ÐÑгтаршил"
diff --git a/addons/skin.confluence/language/resource.language.ms_my/strings.po b/addons/skin.confluence/language/resource.language.ms_my/strings.po
index 1c0a1dcd6b..40bb8a42a4 100644
--- a/addons/skin.confluence/language/resource.language.ms_my/strings.po
+++ b/addons/skin.confluence/language/resource.language.ms_my/strings.po
@@ -16,10 +16,22 @@ msgstr ""
"Language: ms_MY\n"
"Plural-Forms: nplurals=1; plural=0;\n"
+msgctxt "#31000"
+msgid "Change your"
+msgstr "Ubah"
+
+msgctxt "#31003"
+msgid "Power options"
+msgstr "Pilihan kuasa"
+
msgctxt "#31004"
msgid "Working..."
msgstr "Bekerja..."
+msgctxt "#31005"
+msgid "Hide information"
+msgstr "Sembunyi maklumat"
+
msgctxt "#31006"
msgid "View options"
msgstr "Pilihan paparan"
@@ -28,6 +40,10 @@ msgctxt "#31008"
msgid "Full screen"
msgstr "Skrin Penuh"
+msgctxt "#31009"
+msgid "Total duration"
+msgstr "Tempoh keseluruhan"
+
msgctxt "#31022"
msgid "Music - Files"
msgstr "Muzik - Fail"
@@ -44,14 +60,30 @@ msgctxt "#31025"
msgid "Items"
msgstr "Item"
+msgctxt "#31026"
+msgid "Misc options"
+msgstr "Pilihan lain"
+
msgctxt "#31027"
msgid "Location"
msgstr "Kedudukan"
+msgctxt "#31028"
+msgid "Poster wrap"
+msgstr "Lilit poster"
+
msgctxt "#31029"
msgid "Fanart"
msgstr "Hasil Seni Peminat"
+msgctxt "#31031"
+msgid "Pic thumbs"
+msgstr "Lakaran kecil gambar"
+
+msgctxt "#31032"
+msgid "Image wrap"
+msgstr "Lilit imej"
+
msgctxt "#31033"
msgid "Info"
msgstr "Maklumat"
@@ -60,6 +92,10 @@ msgctxt "#31039"
msgid "Actions"
msgstr "Tindakan"
+msgctxt "#31040"
+msgid "Now playing"
+msgstr "Kini dimainkan"
+
msgctxt "#31042"
msgid "PLAYING"
msgstr "BERMAIN"
@@ -80,29 +116,33 @@ msgctxt "#31046"
msgid "SEEKING"
msgstr "MENCARI"
+msgctxt "#31048"
+msgid "Visualisation presets"
+msgstr "Praset pengvisualan"
+
msgctxt "#31049"
msgid "End time"
msgstr "Masa tamat"
msgctxt "#31050"
msgid "Sort: Ascending"
-msgstr "Susun: Menaik"
+msgstr "Isih: Menaik"
msgctxt "#31051"
msgid "Sort: Descending"
-msgstr "Susun: Menurun"
+msgstr "Isih: Menurun"
msgctxt "#31055"
msgid "Open playlist"
-msgstr "Buka senarai audio video"
+msgstr "Buka senarai main"
msgctxt "#31056"
msgid "Save playlist"
-msgstr "Simpan senarai audio video"
+msgstr "Simpan senarai main"
msgctxt "#31057"
msgid "Close playlist"
-msgstr "Tutup senarai audio video"
+msgstr "Tutup senarai main"
msgctxt "#31058"
msgid "System music files"
@@ -110,27 +150,51 @@ msgstr "Fail muzik sistem"
msgctxt "#31059"
msgid "Current playlist"
-msgstr "Senarai audio video semasa"
+msgstr "Senarai main semasa"
msgctxt "#31060"
msgid "This file is stacked, select the part you want to play from."
-msgstr "Fail ini disusun tindan. Pilih bahagian yang anda ingin mainkan."
+msgstr "Fail ini disusun-tindan. Pilih bahagian yang anda ingin mainkan."
+
+msgctxt "#31061"
+msgid "Current selected"
+msgstr "Terkini dipilih"
msgctxt "#31101"
msgid "Home screen options"
-msgstr "Opsyen skrin utama"
+msgstr "Pilihan skrin utama"
msgctxt "#31102"
msgid "Background"
msgstr "Latar Belakang"
+msgctxt "#31103"
+msgid "Show \"Paused\" in picture slideshow"
+msgstr "Tunjuk \"Dijeda\" dalam paparan slaid gambar"
+
+msgctxt "#31104"
+msgid "Play trailers in a window [COLOR=grey3](Video information dialogue only)[/COLOR]"
+msgstr "Main treler dalam tetingkap [COLOR=grey3](Dialog maklumat video sahaja)[/COLOR]"
+
msgctxt "#31106"
msgid "Miscellaneous options"
-msgstr "Pelbagai opsyen"
+msgstr "Pilihan pelbagai"
+
+msgctxt "#31107"
+msgid "Hide flagging read from video filenames [COLOR=grey3](e.g. Blu-ray, HD-DVD)[/COLOR]"
+msgstr "Sembunyi penanda bacaan dari nama fail video [COLOR=grey3](contoh Blu-ray, HD-DVD)[/COLOR]"
+
+msgctxt "#31108"
+msgid "Hide main menu buttons"
+msgstr "Sembunyi butang menu utama"
+
+msgctxt "#31109"
+msgid "Enable custom background"
+msgstr "Benarkan latar belakang suai"
msgctxt "#31110"
msgid "Background path:"
-msgstr "Laluan Latar Belakang:"
+msgstr "Laluan latar belakang:"
msgctxt "#31111"
msgid "Hide"
@@ -138,20 +202,56 @@ msgstr "Sembunyi"
msgctxt "#31112"
msgid "Options"
-msgstr "Opsyen"
+msgstr "Pilihan"
-msgctxt "#31126"
-msgid "Play TV theme songs in video library (TvTunes add-on)"
-msgstr "Mainkan lagu-lagu tema TV dalam perpustakaan video (perisian tambahan TVTunes)"
+msgctxt "#31116"
+msgid "Show recently added albums"
+msgstr "Tunjuk album ditambah baru-baru ini"
-msgctxt "#31127"
-msgid "TvTunes"
-msgstr "TvTunes"
+msgctxt "#31117"
+msgid "Show recently added videos"
+msgstr "Tunjuk video ditambah baru-baru ini"
+
+msgctxt "#31118"
+msgid "Home page programs submenu"
+msgstr "Submenu program laman rumah"
+
+msgctxt "#31119"
+msgid "Hide background fanart"
+msgstr "Sembunyi seni peminat latar belakang"
+
+msgctxt "#31124"
+msgid "Show background \"Now playing\" video"
+msgstr "Tunjuk video latar belakang \"Kini dimainkan\""
+
+msgctxt "#31125"
+msgid "Show background \"Now playing\" visualisation"
+msgstr "Tunjuk pengvisualan latar belakang \"Kini dimainkan\""
msgctxt "#31128"
msgid "Lyrics"
msgstr "Lirik"
+msgctxt "#31129"
+msgid "Hide fanart in full screen visualisation"
+msgstr "Sembunyi seni peminat dalam pengvisualan skrin penuh"
+
+msgctxt "#31132"
+msgid "Lyrics add-on"
+msgstr "Tambahan lirik"
+
+msgctxt "#31134"
+msgid "Home page \"Videos\" submenu"
+msgstr "Sub-menu \"Video\" laman rumah"
+
+msgctxt "#31135"
+msgid "Home page \"Music\" submenu"
+msgstr "Sub-menu \"Muzik\" laman rumah"
+
+msgctxt "#31136"
+msgid "Home page \"Pictures\" submenu"
+msgstr "Sub-menu \"Gambar\" laman rumah"
+
msgctxt "#31140"
msgid "Music OSD"
msgstr "OSD Muzik"
@@ -168,22 +268,90 @@ msgctxt "#31200"
msgid "Shortcuts"
msgstr "Pintasan"
+msgctxt "#31203"
+msgid "Choose your song"
+msgstr "Pilih lagu anda"
+
+msgctxt "#31205"
+msgid "Lyrics source"
+msgstr "Sumber lirik"
+
msgctxt "#31206"
msgid "Found"
-msgstr "Dijumpai"
+msgstr "Ditemui"
+
+msgctxt "#31207"
+msgid "Find more items"
+msgstr "Cari lagi item"
+
+msgctxt "#31208"
+msgid "Upcoming episodes"
+msgstr "Episod akan datang"
+
+msgctxt "#31300"
+msgid "Current temperature"
+msgstr "Suhu semasa"
+
+msgctxt "#31301"
+msgid "Last updated"
+msgstr "Kemaskini terakhir"
msgctxt "#31303"
msgid "Data provider"
msgstr "Penyedia data"
+msgctxt "#31307"
+msgid "Hide fanart"
+msgstr "Sembunyi seni peminat"
+
+msgctxt "#31308"
+msgid "Movie details"
+msgstr "Perincian cereka"
+
+msgctxt "#31309"
+msgid "Memory used:"
+msgstr "Ingatan digunakan:"
+
+msgctxt "#31310"
+msgid "Track number"
+msgstr "Nombor trek"
+
msgctxt "#31311"
msgid "Fanart image[CR][CR]Unavailable[CR][CR] Click button to set"
msgstr "Imej seni peminat[CR][CR]Tidak Tersedia[CR][CR] Klik butang untuk tetapkan"
+msgctxt "#31312"
+msgid "Current scraper"
+msgstr "Pengikis semasa"
+
+msgctxt "#31313"
+msgid "Choose a scraper"
+msgstr "Pilih pengikis"
+
+msgctxt "#31314"
+msgid "Content scanning options"
+msgstr "Pilihan pengimbasan kandungan"
+
+msgctxt "#31317"
+msgid "Set fanart path"
+msgstr "Tetapkan laluan seni peminat"
+
+msgctxt "#31319"
+msgid "Selected profile"
+msgstr "Profil terpilih"
+
+msgctxt "#31320"
+msgid "Last logged in"
+msgstr "Daftar masuk terakhir"
+
msgctxt "#31322"
msgid "Aired"
msgstr "Disiarkan"
+msgctxt "#31325"
+msgid "Playlist options"
+msgstr "Pilihan senarai main"
+
msgctxt "#31326"
msgid "Created"
msgstr "Dicipta"
@@ -200,6 +368,14 @@ msgctxt "#31329"
msgid "[B]Timer set![/B] [COLOR=grey2] - System auto shutdown in[/COLOR]"
msgstr "[B]Pemasa ditetapkan![/B] [COLOR=grey2] - Sistem dimatikan sendiri dalam tempoh[/COLOR]"
+msgctxt "#31330"
+msgid "Click button to play[CR][CR]movie trailer"
+msgstr "Klik butang untuk main[CR][CR]treler cereka"
+
+msgctxt "#31331"
+msgid "Album details"
+msgstr "Perincian album"
+
msgctxt "#31351"
msgid "Pause"
msgstr "Jeda"
@@ -208,6 +384,10 @@ msgctxt "#31352"
msgid "Stop"
msgstr "Henti"
+msgctxt "#31353"
+msgid "Fast forward"
+msgstr "Maju pantas"
+
msgctxt "#31354"
msgid "Rewind"
msgstr "Undur"
@@ -216,9 +396,13 @@ msgctxt "#31355"
msgid "Movie menu"
msgstr "Menu cereka"
+msgctxt "#31356"
+msgid "Download subtitles"
+msgstr "Muat turun sari kata"
+
msgctxt "#31360"
msgid "Watch as 2D"
-msgstr "Tonton menggunakan 2D"
+msgstr "Tonton sebagai 2D"
msgctxt "#31361"
msgid "Change mode"
@@ -232,6 +416,10 @@ msgctxt "#31390"
msgid "Skin default"
msgstr "Lalai Kulit"
+msgctxt "#31391"
+msgid "Skin default with no caps"
+msgstr "Lalai kulit tanpa penutup"
+
msgctxt "#31392"
msgid "Arial based"
msgstr "Berasaskan Arial"
@@ -244,14 +432,22 @@ msgctxt "#31401"
msgid "[B]CONFIGURE VIDEO SETTINGS[/B][CR][CR]Manage your video library · Set video playback options · Change video listing options[CR]Set subtitle fonts"
msgstr "[B]KONFIGUR TETAPAN VIDEO[/B][CR][CR]Ubah pustaka video anda · Tetapkan pilihan main balik video · Ubah pilihan penyenaraian video[CR]Tetapkan fon sarikata"
-msgctxt "#31402"
-msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission · Set karaoke options"
-msgstr "[B]KONFIGUR TETAPAN MUZIK[/B][CR][CR]Urus pustaka muzik anda · Tetapkan pilihan main balik muzik · Ubah pilihan penyenaraian muzik[CR] Pasang penyerahan lagu · Tetapkan pilihan karaoke"
+msgctxt "#31403"
+msgid "[B]CONFIGURE PICTURE SETTINGS[/B][CR][CR]Set picture listing options · Configure slideshow"
+msgstr "[B]KONFIGUR TETAPAN GAMBAR[/B][CR][CR]Tetapkan pilihan penyenaraian gambar · Konfigur paparan slaid"
+
+msgctxt "#31404"
+msgid "[B]CONFIGURE WEATHER SETTINGS[/B][CR][CR]Set various cities to collect weather information"
+msgstr "[B]KONFIGUR TETAPAN CUACA[/B][CR][CR]Tetapkan bandar-bandar untuk kutip maklumat cuaca"
msgctxt "#31406"
msgid "[B]CONFIGURE SYSTEM SETTINGS[/B][CR][CR]Setup and calibrate displays · Configure audio output · Setup remote controls[CR]Set power saving options · Enable debugging · Setup master lock"
msgstr "[B]KONFIGUR TETAPAN SISTEM[/B][CR][CR]Sedia dan tentukur paparan · Konfigur output audio · Persediaan kawalan jauh[CR]Tetapkan pilihan penjimatan kuasa · Benarkan penyahpepijatan · Persediaan kunci master"
+msgctxt "#31408"
+msgid "[B]CONFIGURE ADD-ONS[/B][CR][CR]Manage your installed add-ons · Browse for and install add-ons from kodi.tv[CR]Modify add-on settings"
+msgstr "[B]KONFIGUR TAMBAHAN[/B][CR][CR]Urus tambahan terpasang anda · Layar dan pasang tambahan dari kodi.tv[CR]Ubahsuai tetapan tambahan"
+
msgctxt "#31409"
msgid "[B]CONFIGURE TV SETTINGS[/B][CR][CR]Change full screen info · Manage EPG data settings"
msgstr "[B]KONFIGUR TETAPAN TV[/B][CR][CR]Ubah maklumat skrin penuh · Urus tetapan data EPG"
@@ -260,14 +456,26 @@ msgctxt "#31410"
msgid "[B]CONFIGURE SERVICE SETTINGS[/B][CR][CR]Setup control of Kodi via UPnP and HTTP · Configure file sharing[CR]Enable Zeroconf · Configure AirPlay"
msgstr "[B]KONFIGUR TETAPAN PERKHIDMATAN[/B][CR][CR]Persediaan kawalan Kodi melalui UPnP dan HTTP · Konfigur perkongsian fail[CR]Benarkan Zeroconf · Konfigur AirPlay"
+msgctxt "#31411"
+msgid "First run help..."
+msgstr "Bantuan kali pertama..."
+
+msgctxt "#31412"
+msgid "This tab signifies that there is a menu off to the side of this window that contains extra options for this section. To access the menu, navigate to the left with your remote control or keyboard or place your mouse pointer over the tab. [CR][CR]Click \"OK\" to close this dialogue. It will not appear again."
+msgstr "Tab ini menjelaskan terdapat menu di luar sisi tetingkap ini yang mengandungi pilihan tambahan untuk seksyen. Untuk mencapai menu, navigasi ke kiri dengan kawalan jauh atau papan kekunci atau letak penuding tetikus anda diatas tab. [CR][CR]Klik \"Ok\" untuk tutup dialog ini. Ia tidak akan muncul lagi."
+
msgctxt "#31413"
msgid "Local subtitle available"
-msgstr "Sarikata tempatan tersedia"
+msgstr "Sarikata setempat tersedia"
msgctxt "#31420"
msgid "Login"
msgstr "Daftar Masuk"
+msgctxt "#31421"
+msgid "Select your Kodi user profile[CR]to login and continue"
+msgstr "Pilih Profil pengguna Kodi anda[CR]untuk daftar masuk dan teruskan"
+
msgctxt "#31422"
msgid "Show or hide the login screen at startup."
msgstr "Tunjuk atau sembunyi skrin daftar masuk ketika permulaan."
@@ -276,18 +484,66 @@ msgctxt "#31423"
msgid "Select the profile that will be used at startup when the login screen is disabled."
msgstr "Pilih profil yang akan digunakan ketika permulaan bila skrin daftar masuk dilumpuhkan."
+msgctxt "#31501"
+msgid "Scheduled time"
+msgstr "Masa terjadual"
+
msgctxt "#31502"
msgid "TV"
msgstr "TV"
+msgctxt "#31503"
+msgid "Add group"
+msgstr "Tambah kumpulan"
+
+msgctxt "#31504"
+msgid "Rename group"
+msgstr "Namakan semula kumpulan"
+
+msgctxt "#31505"
+msgid "Delete group"
+msgstr "Padam kumpulan"
+
msgctxt "#31506"
msgid "Available[CR]Groups"
msgstr "Kumpulan[CR]Tersedia"
+msgctxt "#31509"
+msgid "Channel group"
+msgstr "Kumpulan saluran"
+
+msgctxt "#31510"
+msgid "Timer set"
+msgstr "Pemasa ditetapkan"
+
+msgctxt "#31511"
+msgid "Channel options"
+msgstr "Pilihan saluran"
+
+msgctxt "#31901"
+msgid "36-hour forecast"
+msgstr "Ramalan 36-jam"
+
+msgctxt "#31902"
+msgid "Hourly forecast"
+msgstr "Ramalan sejam"
+
+msgctxt "#31903"
+msgid "Weekend forecast"
+msgstr "Ramalan mingguan"
+
+msgctxt "#31904"
+msgid "Daily forecast"
+msgstr "Ramalan harian"
+
msgctxt "#31905"
msgid "Forecast"
msgstr "Ramalan"
+msgctxt "#31908"
+msgid "Chance of precipitation"
+msgstr "Pembentukan pemendakan"
+
msgctxt "#31909"
msgid "Fetching forecast info..."
msgstr "Mendapatkan maklumat ramalan..."
@@ -334,7 +590,7 @@ msgstr "MAIN CAKERA"
msgctxt "#31959"
msgid "SYSTEM"
-msgstr "Sistem"
+msgstr "SISTEM"
msgctxt "#31960"
msgid "RADIO"
diff --git a/addons/skin.confluence/language/resource.language.mt_mt/strings.po b/addons/skin.confluence/language/resource.language.mt_mt/strings.po
index 7f51b8f838..77d6030750 100644
--- a/addons/skin.confluence/language/resource.language.mt_mt/strings.po
+++ b/addons/skin.confluence/language/resource.language.mt_mt/strings.po
@@ -16,30 +16,482 @@ msgstr ""
"Language: mt_MT\n"
"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : n==0 || ( n%100>1 && n%100<11) ? 1 : (n%100>10 && n%100<20 ) ? 2 : 3);\n"
+msgctxt "#31000"
+msgid "Change your"
+msgstr "Ibdel il-"
+
+msgctxt "#31004"
+msgid "Working..."
+msgstr "Qed jaħdem..."
+
+msgctxt "#31005"
+msgid "Hide information"
+msgstr "Aħbi l-informazzjoni"
+
msgctxt "#31006"
msgid "View options"
-msgstr "View Options"
+msgstr "Ara l-għażliet"
msgctxt "#31008"
msgid "Full screen"
-msgstr "Daħħal u Ara Filmati"
+msgstr "Skrin sħiħ"
+
+msgctxt "#31009"
+msgid "Total duration"
+msgstr "Tul totali"
+
+msgctxt "#31022"
+msgid "Music - Files"
+msgstr "Mużika - Fajls"
+
+msgctxt "#31023"
+msgid "Playing"
+msgstr "Qed jindaqq"
+
+msgctxt "#31024"
+msgid "Page"
+msgstr "Paġna"
+
+msgctxt "#31025"
+msgid "Items"
+msgstr "Affarijiet"
+
+msgctxt "#31026"
+msgid "Misc options"
+msgstr "Għażliet mixxelanji"
+
+msgctxt "#31027"
+msgid "Location"
+msgstr "Post"
+
+msgctxt "#31028"
+msgid "Poster wrap"
+msgstr "Tgeżwira tal-powster"
+
+msgctxt "#31029"
+msgid "Fanart"
+msgstr "Fanart"
+
+msgctxt "#31031"
+msgid "Pic thumbs"
+msgstr "Thumbs tal-istampi"
+
+msgctxt "#31032"
+msgid "Image wrap"
+msgstr "Tgeżwir tal-istampi"
+
+msgctxt "#31033"
+msgid "Info"
+msgstr "Info"
+
+msgctxt "#31039"
+msgid "Actions"
+msgstr "Azzjonijiet"
+
+msgctxt "#31040"
+msgid "Now playing"
+msgstr "Qed jindaqq bħalissa"
+
+msgctxt "#31042"
+msgid "PLAYING"
+msgstr "IDOQQ"
+
+msgctxt "#31043"
+msgid "PAUSED"
+msgstr "IPPAWŻAT"
+
+msgctxt "#31044"
+msgid "FAST FORWARD"
+msgstr "GĦAĠĠEL QUDDIEM"
+
+msgctxt "#31045"
+msgid "REWIND"
+msgstr "B'LURA"
+
+msgctxt "#31046"
+msgid "SEEKING"
+msgstr "IFITTEX"
+
+msgctxt "#31048"
+msgid "Visualisation presets"
+msgstr "Viżwalizzazjoni ssetjata minn qabel"
+
+msgctxt "#31049"
+msgid "End time"
+msgstr "Ħin tat-tmiem"
+
+msgctxt "#31050"
+msgid "Sort: Ascending"
+msgstr "Qassam: Jikbru"
+
+msgctxt "#31051"
+msgid "Sort: Descending"
+msgstr "Qassam: Jiċkienu"
+
+msgctxt "#31055"
+msgid "Open playlist"
+msgstr "Iftaħ il-playlist"
+
+msgctxt "#31056"
+msgid "Save playlist"
+msgstr "Żomm il-playlist"
+
+msgctxt "#31057"
+msgid "Close playlist"
+msgstr "Għalaq il-playlist"
+
+msgctxt "#31058"
+msgid "System music files"
+msgstr "Fajls tal-mużika tas-sistema"
+
+msgctxt "#31059"
+msgid "Current playlist"
+msgstr "Playlist kurrenti"
+
+msgctxt "#31060"
+msgid "This file is stacked, select the part you want to play from."
+msgstr "Dan il-fajl huwa stacked, għażel il-parti minn fejn trid tibda ddoqq."
+
+msgctxt "#31061"
+msgid "Current selected"
+msgstr "Magħżul bħalissa"
+
+msgctxt "#31102"
+msgid "Background"
+msgstr "Sfond"
+
+msgctxt "#31106"
+msgid "Miscellaneous options"
+msgstr "Għażliet varji"
msgctxt "#31109"
msgid "Enable custom background"
-msgstr "Attiva Bakgrawnd Preferut"
+msgstr "Attiva l-isfond preferut"
+
+msgctxt "#31110"
+msgid "Background path:"
+msgstr "Path tal-isfond"
+
+msgctxt "#31111"
+msgid "Hide"
+msgstr "Aħbi"
+
+msgctxt "#31112"
+msgid "Options"
+msgstr "Għażliet"
+
+msgctxt "#31116"
+msgid "Show recently added albums"
+msgstr "Uri l-albums li ġew miżjuda dan l-aħħar"
+
+msgctxt "#31117"
+msgid "Show recently added videos"
+msgstr "Uri vidjos li ġew miżjuda dan l-aħħar"
+
+msgctxt "#31119"
+msgid "Hide background fanart"
+msgstr "Aħbi l-fanart fl-isfond"
+
+msgctxt "#31124"
+msgid "Show background \"Now playing\" video"
+msgstr "Uri l-vidjo li qed jindaqq bħalissa fl-isfond"
+
+msgctxt "#31125"
+msgid "Show background \"Now playing\" visualisation"
+msgstr "Uri l-viżwalizzazjoni fl-isfond"
+
+msgctxt "#31128"
+msgid "Lyrics"
+msgstr "Liriċi"
+
+msgctxt "#31129"
+msgid "Hide fanart in full screen visualisation"
+msgstr "Aħbi l-fanart f'viżwalizzazjonijiet fuq l-iskrin kollu"
+
+msgctxt "#31132"
+msgid "Lyrics add-on"
+msgstr "Add-on tal-lirika"
+
+msgctxt "#31140"
+msgid "Music OSD"
+msgstr "OSD tal-Mużika"
+
+msgctxt "#31141"
+msgid "Video OSD"
+msgstr "OSD tal-Vidjo"
+
+msgctxt "#31142"
+msgid "Settings level"
+msgstr "Livell ta' settings"
msgctxt "#31200"
msgid "Shortcuts"
msgstr "Shortcuts"
+msgctxt "#31203"
+msgid "Choose your song"
+msgstr "AGħżel id-diska tiegħek"
+
+msgctxt "#31205"
+msgid "Lyrics source"
+msgstr "Sors ta' lirika"
+
+msgctxt "#31206"
+msgid "Found"
+msgstr "Misjub"
+
+msgctxt "#31207"
+msgid "Find more items"
+msgstr "Sib aktar affarijiet"
+
+msgctxt "#31208"
+msgid "Upcoming episodes"
+msgstr "Episodji li jmiss"
+
+msgctxt "#31300"
+msgid "Current temperature"
+msgstr "Temperatura kurrenti"
+
+msgctxt "#31301"
+msgid "Last updated"
+msgstr "L-aħħar li ġġedded"
+
+msgctxt "#31303"
+msgid "Data provider"
+msgstr "Fornitur ta' informazzjoni"
+
+msgctxt "#31307"
+msgid "Hide fanart"
+msgstr "Aħbi l-fanart"
+
+msgctxt "#31308"
+msgid "Movie details"
+msgstr "Dettalji tal-film"
+
+msgctxt "#31309"
+msgid "Memory used:"
+msgstr "Memorja użata:"
+
+msgctxt "#31310"
+msgid "Track number"
+msgstr "Numru tad-diska"
+
+msgctxt "#31311"
+msgid "Fanart image[CR][CR]Unavailable[CR][CR] Click button to set"
+msgstr "Stampa tal-fanart[CR][CR]mhux disponibbli[CR][CR] Għafas il-buttuna biex tagħżel"
+
+msgctxt "#31312"
+msgid "Current scraper"
+msgstr "Scraper kurrenti"
+
+msgctxt "#31313"
+msgid "Choose a scraper"
+msgstr "Għażel scraper"
+
+msgctxt "#31314"
+msgid "Content scanning options"
+msgstr "Għażliet ta' kif jitfittex il-kontenut"
+
+msgctxt "#31317"
+msgid "Set fanart path"
+msgstr "Għażel il-path tal-fanart"
+
+msgctxt "#31319"
+msgid "Selected profile"
+msgstr "Profil magħżul"
+
+msgctxt "#31320"
+msgid "Last logged in"
+msgstr "L-aħħar login"
+
+msgctxt "#31322"
+msgid "Aired"
+msgstr "Intwera"
+
+msgctxt "#31325"
+msgid "Playlist options"
+msgstr "Għażliet tal-playlist"
+
+msgctxt "#31326"
+msgid "Created"
+msgstr "Maħluq"
+
msgctxt "#31327"
msgid "Resolution"
-msgstr "Resolution:"
+msgstr "Reżoluzzjoni"
+
+msgctxt "#31328"
+msgid "Recently added"
+msgstr "Miżjud dan l-aħħar"
+
+msgctxt "#31329"
+msgid "[B]Timer set![/B] [COLOR=grey2] - System auto shutdown in[/COLOR]"
+msgstr "[B]Arloġġ issetjat![/B] [COLOR=grey2] - Sistema se tintefa' waħedha f'[/COLOR]"
+
+msgctxt "#31330"
+msgid "Click button to play[CR][CR]movie trailer"
+msgstr "Għafas il-buttuna biex iddoqq it-trejler tal-film[CR][CR]"
+
+msgctxt "#31331"
+msgid "Album details"
+msgstr "Dettalji dwar l-album"
+
+msgctxt "#31351"
+msgid "Pause"
+msgstr "Ippawża"
+
+msgctxt "#31352"
+msgid "Stop"
+msgstr "Waqqaf"
+
+msgctxt "#31353"
+msgid "Fast forward"
+msgstr "Għaġġel quddiem"
+
+msgctxt "#31354"
+msgid "Rewind"
+msgstr "Lura"
+
+msgctxt "#31355"
+msgid "Movie menu"
+msgstr "Menu tal-film"
+
+msgctxt "#31356"
+msgid "Download subtitles"
+msgstr "Niżżel is-sottotitoli"
+
+msgctxt "#31360"
+msgid "Watch as 2D"
+msgstr "Ara bħala 2D"
+
+msgctxt "#31361"
+msgid "Change mode"
+msgstr "Ibdel il-modalita'"
msgctxt "#31362"
msgid "Enabled"
-msgstr "Jintuża"
+msgstr "Attivat"
msgctxt "#31390"
msgid "Skin default"
-msgstr "Qoxra Default"
+msgstr "Dehra normali"
+
+msgctxt "#31391"
+msgid "Skin default with no caps"
+msgstr "Id-derha normal mingħajr ittri kapitali"
+
+msgctxt "#31392"
+msgid "Arial based"
+msgstr "Ibbażat fuq l-Arial"
+
+msgctxt "#31501"
+msgid "Scheduled time"
+msgstr "Ħin skedat"
+
+msgctxt "#31502"
+msgid "TV"
+msgstr "Televixin"
+
+msgctxt "#31503"
+msgid "Add group"
+msgstr "Żid grupp"
+
+msgctxt "#31504"
+msgid "Rename group"
+msgstr "Ibdel l-isem ta' grupp"
+
+msgctxt "#31505"
+msgid "Delete group"
+msgstr "Ħassar grupp"
+
+msgctxt "#31506"
+msgid "Available[CR]Groups"
+msgstr "Gruppi[CR]Disponibbli"
+
+msgctxt "#31509"
+msgid "Channel group"
+msgstr "Grupp ta' stazzjonijiet"
+
+msgctxt "#31510"
+msgid "Timer set"
+msgstr "Issettja l-arloġġ"
+
+msgctxt "#31511"
+msgid "Channel options"
+msgstr "Għażliet tal-istazzjon"
+
+msgctxt "#31901"
+msgid "36-hour forecast"
+msgstr "Tbassir ta' 36 siegħa"
+
+msgctxt "#31902"
+msgid "Hourly forecast"
+msgstr "Tbassir siegħa b'siegħa"
+
+msgctxt "#31903"
+msgid "Weekend forecast"
+msgstr "Tbassir għal tmiem il-ġimgħa"
+
+msgctxt "#31904"
+msgid "Daily forecast"
+msgstr "Tbassir Ä¡urnata b'Ä¡urnata"
+
+msgctxt "#31905"
+msgid "Forecast"
+msgstr "Tbassir tat-temp"
+
+msgctxt "#31908"
+msgid "Chance of precipitation"
+msgstr "ÄŠans ta' xita"
+
+msgctxt "#31909"
+msgid "Fetching forecast info..."
+msgstr "Qed tinstab l-informazzjoni tat-tbassir..."
+
+msgctxt "#31910"
+msgid "Maps"
+msgstr "Mappep"
+
+msgctxt "#31950"
+msgid "WEATHER"
+msgstr "TEMP"
+
+msgctxt "#31951"
+msgid "PICTURES"
+msgstr "STAMPI"
+
+msgctxt "#31952"
+msgid "TV"
+msgstr "Televixin"
+
+msgctxt "#31953"
+msgid "VIDEOS"
+msgstr "VIDJOS"
+
+msgctxt "#31954"
+msgid "MOVIES"
+msgstr "FILMS"
+
+msgctxt "#31955"
+msgid "TV SHOWS"
+msgstr "XOWS TELEVIŻIVI"
+
+msgctxt "#31956"
+msgid "MUSIC"
+msgstr "MUŻIKA"
+
+msgctxt "#31957"
+msgid "PROGRAMS"
+msgstr "PROGRAMMI"
+
+msgctxt "#31958"
+msgid "PLAY DISC"
+msgstr "DOQQ CD"
+
+msgctxt "#31959"
+msgid "SYSTEM"
+msgstr "SISTEMA"
+
+msgctxt "#31960"
+msgid "RADIO"
+msgstr "RADJU"
diff --git a/addons/skin.confluence/language/resource.language.nb_no/strings.po b/addons/skin.confluence/language/resource.language.nb_no/strings.po
index 82ce094dbf..9c89a2244a 100644
--- a/addons/skin.confluence/language/resource.language.nb_no/strings.po
+++ b/addons/skin.confluence/language/resource.language.nb_no/strings.po
@@ -68,6 +68,10 @@ msgctxt "#31027"
msgid "Location"
msgstr "Sted"
+msgctxt "#31028"
+msgid "Poster wrap"
+msgstr "Plakatsvøpe"
+
msgctxt "#31029"
msgid "Fanart"
msgstr "Fanart"
@@ -76,6 +80,10 @@ msgctxt "#31031"
msgid "Pic thumbs"
msgstr "Bildeminiatyrer"
+msgctxt "#31032"
+msgid "Image wrap"
+msgstr "Bildesvøpe"
+
msgctxt "#31033"
msgid "Info"
msgstr "Informasjon"
@@ -108,6 +116,10 @@ msgctxt "#31046"
msgid "SEEKING"
msgstr "SØKER"
+msgctxt "#31048"
+msgid "Visualisation presets"
+msgstr "Visualiseringsforvalg"
+
msgctxt "#31049"
msgid "End time"
msgstr "Ferdig klokken"
@@ -144,6 +156,10 @@ msgctxt "#31060"
msgid "This file is stacked, select the part you want to play from."
msgstr "Denne filen er stablet, velg den delen du vil spille fra."
+msgctxt "#31061"
+msgid "Current selected"
+msgstr "Nåværende valgt"
+
msgctxt "#31101"
msgid "Home screen options"
msgstr "Alternativer for hovedvindu"
@@ -152,10 +168,26 @@ msgctxt "#31102"
msgid "Background"
msgstr "Bakgrunn"
+msgctxt "#31103"
+msgid "Show \"Paused\" in picture slideshow"
+msgstr "Vis «Pause» under lysbildefremvisning"
+
+msgctxt "#31104"
+msgid "Play trailers in a window [COLOR=grey3](Video information dialogue only)[/COLOR]"
+msgstr "Spill trailere i et vindu[COLOR=grey3](Kun videoinformasjonsdialog)[/COLOR]"
+
msgctxt "#31106"
msgid "Miscellaneous options"
msgstr "Øvrige alternativer"
+msgctxt "#31107"
+msgid "Hide flagging read from video filenames [COLOR=grey3](e.g. Blu-ray, HD-DVD)[/COLOR]"
+msgstr "Gjem «sett»-flagg fra videofilnavn [COLOR=grey3](Blu-ray, HD-DVD)[/COLOR]"
+
+msgctxt "#31108"
+msgid "Hide main menu buttons"
+msgstr "Skjul hovedmenyknapper"
+
msgctxt "#31109"
msgid "Enable custom background"
msgstr "Aktiver egendefinert bakgrunn"
@@ -172,18 +204,54 @@ msgctxt "#31112"
msgid "Options"
msgstr "Alternativer"
-msgctxt "#31126"
-msgid "Play TV theme songs in video library (TvTunes add-on)"
-msgstr "Spill av kjenningsmelodier i videobiblioteket (TvTunes-utvidelse)"
+msgctxt "#31116"
+msgid "Show recently added albums"
+msgstr "Vis nylig tilføyde albumer"
+
+msgctxt "#31117"
+msgid "Show recently added videos"
+msgstr "Vis nylig tilføyde videoer"
+
+msgctxt "#31118"
+msgid "Home page programs submenu"
+msgstr "Programundermeny i hovedmeny"
+
+msgctxt "#31119"
+msgid "Hide background fanart"
+msgstr "Skjul fanart-bakgrunn"
-msgctxt "#31127"
-msgid "TvTunes"
-msgstr "TvTunes"
+msgctxt "#31124"
+msgid "Show background \"Now playing\" video"
+msgstr "Vis videoer i bakgrunnen"
+
+msgctxt "#31125"
+msgid "Show background \"Now playing\" visualisation"
+msgstr "Vis «spilles nå» bakgrunnen i visualisering"
msgctxt "#31128"
msgid "Lyrics"
msgstr "Sangtekster"
+msgctxt "#31129"
+msgid "Hide fanart in full screen visualisation"
+msgstr "Gjem Fanart i fullskjermsvisualisering"
+
+msgctxt "#31132"
+msgid "Lyrics add-on"
+msgstr "Sangtekst-utvidelse"
+
+msgctxt "#31134"
+msgid "Home page \"Videos\" submenu"
+msgstr "Hjemmeskjerm video-undermeny"
+
+msgctxt "#31135"
+msgid "Home page \"Music\" submenu"
+msgstr "Hjemmeskjerm musikk-undermeny"
+
+msgctxt "#31136"
+msgid "Home page \"Pictures\" submenu"
+msgstr "Hjemmeskjerm bilder-undermeny"
+
msgctxt "#31140"
msgid "Music OSD"
msgstr "Musikk OSD"
@@ -200,22 +268,90 @@ msgctxt "#31200"
msgid "Shortcuts"
msgstr "Snarveier"
+msgctxt "#31203"
+msgid "Choose your song"
+msgstr "Velg din låt"
+
+msgctxt "#31205"
+msgid "Lyrics source"
+msgstr "Sangtekstskilde"
+
msgctxt "#31206"
msgid "Found"
msgstr "Funnet"
+msgctxt "#31207"
+msgid "Find more items"
+msgstr "Finn flere elementer"
+
+msgctxt "#31208"
+msgid "Upcoming episodes"
+msgstr "Kommende episoder"
+
+msgctxt "#31300"
+msgid "Current temperature"
+msgstr "Været nå"
+
+msgctxt "#31301"
+msgid "Last updated"
+msgstr "Sist oppdatert"
+
msgctxt "#31303"
msgid "Data provider"
msgstr "Datatilbyder"
+msgctxt "#31307"
+msgid "Hide fanart"
+msgstr "Skjul fanart"
+
+msgctxt "#31308"
+msgid "Movie details"
+msgstr "Filmdetaljer"
+
+msgctxt "#31309"
+msgid "Memory used:"
+msgstr "Benyttet minne:"
+
+msgctxt "#31310"
+msgid "Track number"
+msgstr "Spornummer"
+
msgctxt "#31311"
msgid "Fanart image[CR][CR]Unavailable[CR][CR] Click button to set"
msgstr "Fanart-bilde[CR][CR]ikke tilgjengelig[CR][CR]Klikk på knappen for å oppgi"
+msgctxt "#31312"
+msgid "Current scraper"
+msgstr "Nåværende skraper"
+
+msgctxt "#31313"
+msgid "Choose a scraper"
+msgstr "Velg en skraper"
+
+msgctxt "#31314"
+msgid "Content scanning options"
+msgstr "Alternativer for innholdsskraper"
+
+msgctxt "#31317"
+msgid "Set fanart path"
+msgstr "Oppgi søkesti for fanart"
+
+msgctxt "#31319"
+msgid "Selected profile"
+msgstr "Valgt profil"
+
+msgctxt "#31320"
+msgid "Last logged in"
+msgstr "Sist innlogget"
+
msgctxt "#31322"
msgid "Aired"
msgstr "Sendt"
+msgctxt "#31325"
+msgid "Playlist options"
+msgstr "Alternativer for spilleliste"
+
msgctxt "#31326"
msgid "Created"
msgstr "Laget"
@@ -232,6 +368,14 @@ msgctxt "#31329"
msgid "[B]Timer set![/B] [COLOR=grey2] - System auto shutdown in[/COLOR]"
msgstr "[B]Tidsur fastsatt![/B] [COLOR=grey2] - Systemet avsluttes automatisk om[/COLOR]"
+msgctxt "#31330"
+msgid "Click button to play[CR][CR]movie trailer"
+msgstr "Klikk for å spille[CR][CR]filmtrailer"
+
+msgctxt "#31331"
+msgid "Album details"
+msgstr "Albumdetaljer"
+
msgctxt "#31351"
msgid "Pause"
msgstr "Pause"
@@ -240,6 +384,10 @@ msgctxt "#31352"
msgid "Stop"
msgstr "Stopp"
+msgctxt "#31353"
+msgid "Fast forward"
+msgstr "Spol framover"
+
msgctxt "#31354"
msgid "Rewind"
msgstr "Spol bakover"
@@ -248,6 +396,10 @@ msgctxt "#31355"
msgid "Movie menu"
msgstr "Filmmeny"
+msgctxt "#31356"
+msgid "Download subtitles"
+msgstr "Hent undertekster"
+
msgctxt "#31360"
msgid "Watch as 2D"
msgstr "Se som 2D"
@@ -264,6 +416,10 @@ msgctxt "#31390"
msgid "Skin default"
msgstr "Standard for skall"
+msgctxt "#31391"
+msgid "Skin default with no caps"
+msgstr "Skallstandard uten store bokstaver"
+
msgctxt "#31392"
msgid "Arial based"
msgstr "Arial-basert"
@@ -276,14 +432,22 @@ msgctxt "#31401"
msgid "[B]CONFIGURE VIDEO SETTINGS[/B][CR][CR]Manage your video library · Set video playback options · Change video listing options[CR]Set subtitle fonts"
msgstr "[B]ENDRE DINE GRAFIKKINNSTILLINGER:[/B][CR][CR]Håndter ditt filmbibliotek · Oppgi videoavspillingsalternativer · Endre videolistealternativer[CR]Oppgi skrifttype for undertekster"
-msgctxt "#31402"
-msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission · Set karaoke options"
-msgstr "[B]ENDRE DINE MUSIKKINNSTILLINGER:[/B][CR][CR]Håndter ditt musikkbibliotek · Oppgi musikkavspillingsalternativer · Endre lyttealternativer[CR]Oppgi din Last.FM konto · Endre karaokealternativer"
+msgctxt "#31403"
+msgid "[B]CONFIGURE PICTURE SETTINGS[/B][CR][CR]Set picture listing options · Configure slideshow"
+msgstr "[B]KONFIGURER BILDE INSTILLINGER[/B][CR][CR]Forandre bilde opplistings alternativer · Konfigurer bildefremvisning"
+
+msgctxt "#31404"
+msgid "[B]CONFIGURE WEATHER SETTINGS[/B][CR][CR]Set various cities to collect weather information"
+msgstr "[B]KONFIGURER VÆR INSTILLINGER[/B][CR][CR]Skriv inn hvilke byer informasjon skal vises for"
msgctxt "#31406"
msgid "[B]CONFIGURE SYSTEM SETTINGS[/B][CR][CR]Setup and calibrate displays · Configure audio output · Setup remote controls[CR]Set power saving options · Enable debugging · Setup master lock"
msgstr "[B]ENDRE SYSTEMVALG[/B][CR][CR]Oppsett og kalibrering av skjerm · Konfigurer lydmaskinvare · Still inn fjernkontroller[CR]Endre strømsparingsalternativer · Aktiver feilsøking · Sett opp systemlås"
+msgctxt "#31408"
+msgid "[B]CONFIGURE ADD-ONS[/B][CR][CR]Manage your installed add-ons · Browse for and install add-ons from kodi.tv[CR]Modify add-on settings"
+msgstr "[B]KONFIGURER UTVIDELSER[/B][CR][CR]Håndter dine installerte utvidelser · Se etter og installer utvidelser fra kodi.tv[CR]Forandre utvidelses innstillinger"
+
msgctxt "#31409"
msgid "[B]CONFIGURE TV SETTINGS[/B][CR][CR]Change full screen info · Manage EPG data settings"
msgstr "[B]KONFIGURER TV-INNSTILLINGER[/B][CR][CR]Skift fullskjermsinfo · Administrer datainnstillinger for EPG"
@@ -292,6 +456,14 @@ msgctxt "#31410"
msgid "[B]CONFIGURE SERVICE SETTINGS[/B][CR][CR]Setup control of Kodi via UPnP and HTTP · Configure file sharing[CR]Enable Zeroconf · Configure AirPlay"
msgstr "[B]ENDRE DINE TJENESTEINNSTILLINGER[/B][CR][CR]Konfigurer kontroll av Kodi via UPnP og HTTP · Konfigurer fildeling[CR]Aktiver Zeroconf · Konfigurer AirPlay"
+msgctxt "#31411"
+msgid "First run help..."
+msgstr "Førstegangsintroduksjon..."
+
+msgctxt "#31412"
+msgid "This tab signifies that there is a menu off to the side of this window that contains extra options for this section. To access the menu, navigate to the left with your remote control or keyboard or place your mouse pointer over the tab. [CR][CR]Click \"OK\" to close this dialogue. It will not appear again."
+msgstr "Denne fanen viser at det er en meny på siden av vinduet om inneholder ekstra alternativer for denne avdelingen. For å få åpne menyen, trykk til venstre med fjernkontrollen, tastaturet eller plaser musepekeren over fanen. [CR][CR]Trykk \"OK\" for å lukke denne ruten. Den vil ikke vises igjen."
+
msgctxt "#31413"
msgid "Local subtitle available"
msgstr "Lokal tekst tilgjengelig"
@@ -300,6 +472,10 @@ msgctxt "#31420"
msgid "Login"
msgstr "Logg inn"
+msgctxt "#31421"
+msgid "Select your Kodi user profile[CR]to login and continue"
+msgstr "Velg din Kodi brukerprofil[CR]for å logge inn og fortsette"
+
msgctxt "#31422"
msgid "Show or hide the login screen at startup."
msgstr "Vis eller skjul innloggingsskjermen ved oppstart"
@@ -308,18 +484,66 @@ msgctxt "#31423"
msgid "Select the profile that will be used at startup when the login screen is disabled."
msgstr "Velg profil som vil bli brukt ved oppstart når innloggingsskjermen er deaktivert ."
+msgctxt "#31501"
+msgid "Scheduled time"
+msgstr "Planlagt tid"
+
msgctxt "#31502"
msgid "TV"
msgstr "TV"
+msgctxt "#31503"
+msgid "Add group"
+msgstr "Legg til gruppe"
+
+msgctxt "#31504"
+msgid "Rename group"
+msgstr "Gi nytt navn til gruppe"
+
+msgctxt "#31505"
+msgid "Delete group"
+msgstr "Slett gruppe"
+
msgctxt "#31506"
msgid "Available[CR]Groups"
msgstr "Ledige[CR]grupper"
+msgctxt "#31509"
+msgid "Channel group"
+msgstr "Kanalgruppe"
+
+msgctxt "#31510"
+msgid "Timer set"
+msgstr "Tidsur fastsatt"
+
+msgctxt "#31511"
+msgid "Channel options"
+msgstr "Kanal instillinger"
+
+msgctxt "#31901"
+msgid "36-hour forecast"
+msgstr "36-timersvarsel"
+
+msgctxt "#31902"
+msgid "Hourly forecast"
+msgstr "Time for time"
+
+msgctxt "#31903"
+msgid "Weekend forecast"
+msgstr "Helgevarsel"
+
+msgctxt "#31904"
+msgid "Daily forecast"
+msgstr "Langtidsvarsel"
+
msgctxt "#31905"
msgid "Forecast"
msgstr "Værvarsel"
+msgctxt "#31908"
+msgid "Chance of precipitation"
+msgstr "Mulighet for nedbør"
+
msgctxt "#31909"
msgid "Fetching forecast info..."
msgstr "Henter værvarsel..."
diff --git a/addons/skin.confluence/language/resource.language.nl_nl/strings.po b/addons/skin.confluence/language/resource.language.nl_nl/strings.po
index 29c7ef65fd..a0f7f30ab8 100644
--- a/addons/skin.confluence/language/resource.language.nl_nl/strings.po
+++ b/addons/skin.confluence/language/resource.language.nl_nl/strings.po
@@ -220,6 +220,10 @@ msgctxt "#31119"
msgid "Hide background fanart"
msgstr "Fanart achtergronden verbergen"
+msgctxt "#31122"
+msgid "Hide EPG if RDS is present on channel window"
+msgstr "Verberg EPG wanneer RDS is aanwezig op kanaalvenster"
+
msgctxt "#31124"
msgid "Show background \"Now playing\" video"
msgstr "Toon achtergrond \"nu afspelend\" video"
@@ -228,14 +232,6 @@ msgctxt "#31125"
msgid "Show background \"Now playing\" visualisation"
msgstr "Toon achtergrond \"Nu afspelend\" visualisatie"
-msgctxt "#31126"
-msgid "Play TV theme songs in video library (TvTunes add-on)"
-msgstr "Speel de Themasong van de TV serie af in de videobibliotheek. (TvTunes add-on)"
-
-msgctxt "#31127"
-msgid "TvTunes"
-msgstr "TvTunes"
-
msgctxt "#31128"
msgid "Lyrics"
msgstr "Songteksten"
@@ -352,10 +348,6 @@ msgctxt "#31320"
msgid "Last logged in"
msgstr "Laatst ingelogd op"
-msgctxt "#31321"
-msgid "Karaoke song selector"
-msgstr "Karaoke lied kiezer"
-
msgctxt "#31322"
msgid "Aired"
msgstr "Uitgezonden"
@@ -445,8 +437,8 @@ msgid "[B]CONFIGURE VIDEO SETTINGS[/B][CR][CR]Manage your video library · Set v
msgstr "[B]VIDEO-INSTELLINGEN CONFIGUREREN[/B][CR][CR]Beheer uw videobibliotheek · Configureer videoafspeelopties en -bestandslijstsopties · Stel lettertype in voor ondertitels"
msgctxt "#31402"
-msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission · Set karaoke options"
-msgstr "[B]MUZIEKINSTELLINGEN CONFIGUREREN[/B][CR][CR]Beheer uw muziekbibliotheek · Configureer muziekafspeelopties en -bestandslijstopties · Configureer nummer indienen · Configureer karaokeopties"
+msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission"
+msgstr "[B]MUZIEKINSTELLINGEN[/B][CR][CR]Beheer uw muziekbibliotheek · Instellen muziekplayback · Verander muzieklijsten opties[CR]Instellen nummerinstelling"
msgctxt "#31403"
msgid "[B]CONFIGURE PICTURE SETTINGS[/B][CR][CR]Set picture listing options · Configure slideshow"
diff --git a/addons/skin.confluence/language/resource.language.pl_pl/strings.po b/addons/skin.confluence/language/resource.language.pl_pl/strings.po
index 6f680badf3..cfb5b0b0eb 100644
--- a/addons/skin.confluence/language/resource.language.pl_pl/strings.po
+++ b/addons/skin.confluence/language/resource.language.pl_pl/strings.po
@@ -118,7 +118,7 @@ msgstr "PRZEWIJANIE"
msgctxt "#31048"
msgid "Visualisation presets"
-msgstr "Szablony wizualizacji"
+msgstr "Wzorce wizualizacji"
msgctxt "#31049"
msgid "End time"
@@ -186,7 +186,7 @@ msgstr "Ukrywaj etykiety mediów wczytane z nazw pliku [COLOR=grey3](Blu-ray, HD
msgctxt "#31108"
msgid "Hide main menu buttons"
-msgstr "Ukryj przyciski menu"
+msgstr "Ukrywaj przyciski menu"
msgctxt "#31109"
msgid "Enable custom background"
@@ -194,7 +194,7 @@ msgstr "Pokazuj niestandardowe tło"
msgctxt "#31110"
msgid "Background path:"
-msgstr "Ścieżka do folderu obrazów tła:"
+msgstr "Ścieżka do folderu z obrazami tła:"
msgctxt "#31111"
msgid "Hide"
@@ -220,21 +220,17 @@ msgctxt "#31119"
msgid "Hide background fanart"
msgstr "Nie używaj fototapet w roli tła"
+msgctxt "#31122"
+msgid "Hide EPG if RDS is present on channel window"
+msgstr "Ukrywaj przewodnik, gdy dostępne są informacje RDS"
+
msgctxt "#31124"
msgid "Show background \"Now playing\" video"
-msgstr "Wyświetlaj panel Teraz odtwarzane w tle interfejsu"
+msgstr "Wyświetlaj odtwarzane wideo w tle interfejsu"
msgctxt "#31125"
msgid "Show background \"Now playing\" visualisation"
-msgstr "Wyświetlaj wizualizację Teraz odtwarzane w tle interfejsu"
-
-msgctxt "#31126"
-msgid "Play TV theme songs in video library (TvTunes add-on)"
-msgstr "Odtwarzaj motywy muzyczne w bibliotece wideo (dodatek TvTunes)"
-
-msgctxt "#31127"
-msgid "TvTunes"
-msgstr "Dodatek TvTunes"
+msgstr "Wyświetlaj wizualizację muzyki w tle interfejsu"
msgctxt "#31128"
msgid "Lyrics"
@@ -330,11 +326,11 @@ msgstr "Fototapeta[CR][CR]niedostępna[CR][CR]Naciśnij przycisk, aby dodać"
msgctxt "#31312"
msgid "Current scraper"
-msgstr "Aktualny ekstraktor"
+msgstr "Aktualny dostawca"
msgctxt "#31313"
msgid "Choose a scraper"
-msgstr "Wybierz ekstraktor"
+msgstr "Wybierz dostawcÄ™"
msgctxt "#31314"
msgid "Content scanning options"
@@ -342,7 +338,7 @@ msgstr "Opcje skanowania zawartości"
msgctxt "#31317"
msgid "Set fanart path"
-msgstr "Ustaw ścieżkę do folderu tapet"
+msgstr "Ustaw ścieżkę do folderu z tapetami"
msgctxt "#31319"
msgid "Selected profile"
@@ -352,10 +348,6 @@ msgctxt "#31320"
msgid "Last logged in"
msgstr "Ostatnio zalogowany"
-msgctxt "#31321"
-msgid "Karaoke song selector"
-msgstr "Selektor utworów Karaoke"
-
msgctxt "#31322"
msgid "Aired"
msgstr "Premiera"
@@ -445,8 +437,8 @@ msgid "[B]CONFIGURE VIDEO SETTINGS[/B][CR][CR]Manage your video library · Set v
msgstr "[B]KONFIGURACJA WIDEO[/B][CR][CR]Biblioteka wideo · Odtwarzanie · Akceleracja · Listy wideo · Napisy"
msgctxt "#31402"
-msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission · Set karaoke options"
-msgstr "[B]KONFIGURACJA MUZYKI[/B][CR][CR]Biblioteka muzyki · Odtwarzanie · Listy utworów · CD-Audio · Karaoke"
+msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission"
+msgstr "[B]KONFIGURACJA MUZYKI[/B][CR][CR]Biblioteka muzyki · Odtwarzanie · Listy utworów · CD-Audio"
msgctxt "#31403"
msgid "[B]CONFIGURE PICTURE SETTINGS[/B][CR][CR]Set picture listing options · Configure slideshow"
diff --git a/addons/skin.confluence/language/resource.language.pt_br/strings.po b/addons/skin.confluence/language/resource.language.pt_br/strings.po
index 3cf313eb57..b19b636269 100644
--- a/addons/skin.confluence/language/resource.language.pt_br/strings.po
+++ b/addons/skin.confluence/language/resource.language.pt_br/strings.po
@@ -220,6 +220,10 @@ msgctxt "#31119"
msgid "Hide background fanart"
msgstr "Ocultar fanart fundo da visualização"
+msgctxt "#31122"
+msgid "Hide EPG if RDS is present on channel window"
+msgstr "Esconder EPG se RDS está presente na janela do canal"
+
msgctxt "#31124"
msgid "Show background \"Now playing\" video"
msgstr "Exibir vídeo \\\"reproduzindo agora\\\" ao fundo"
@@ -228,14 +232,6 @@ msgctxt "#31125"
msgid "Show background \"Now playing\" visualisation"
msgstr "Apresentar visualização de fundo em \\\"Agora reproduzindo\\\""
-msgctxt "#31126"
-msgid "Play TV theme songs in video library (TvTunes add-on)"
-msgstr "Reproduzir música tema do seriado na biblioteca de vídeo (add-on TvTunes)"
-
-msgctxt "#31127"
-msgid "TvTunes"
-msgstr "TvTunes"
-
msgctxt "#31128"
msgid "Lyrics"
msgstr "Letras"
@@ -352,10 +348,6 @@ msgctxt "#31320"
msgid "Last logged in"
msgstr "última conexão"
-msgctxt "#31321"
-msgid "Karaoke song selector"
-msgstr "Selecionador de música karaoke"
-
msgctxt "#31322"
msgid "Aired"
msgstr "Transmitido"
@@ -445,8 +437,8 @@ msgid "[B]CONFIGURE VIDEO SETTINGS[/B][CR][CR]Manage your video library · Set v
msgstr "[B]AJUSTES DE VÃDEO[/B][CR][CR]Gerencie sua coleção de vídeos · Defina opções de execução de vídeo[CR]Altere opções de listagem de vídeo · Defina fonte para legendas"
msgctxt "#31402"
-msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission · Set karaoke options"
-msgstr "[B]AJUSTES DE MÚSICAS[/B][CR][CR]Gerencie sua coleção de músicas · Defina opções de execução de música[CR]Altere opções de listagem de música · Configure submissão de música · Defina opções de karaokê"
+msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission"
+msgstr "[B]AJUSTES DE MÚSICAS[/B][CR][CR]Gerencie sua coleção de músicas · Defina opções de execução de música[CR]Altere opções de listagem de música · Configure submissão de música"
msgctxt "#31403"
msgid "[B]CONFIGURE PICTURE SETTINGS[/B][CR][CR]Set picture listing options · Configure slideshow"
@@ -518,7 +510,7 @@ msgstr "Renomear grupo"
msgctxt "#31505"
msgid "Delete group"
-msgstr "Deletar gurpo"
+msgstr "Deletar grupo"
msgctxt "#31506"
msgid "Available[CR]Groups"
diff --git a/addons/skin.confluence/language/resource.language.pt_pt/strings.po b/addons/skin.confluence/language/resource.language.pt_pt/strings.po
index 2573a7ccae..65d673b425 100644
--- a/addons/skin.confluence/language/resource.language.pt_pt/strings.po
+++ b/addons/skin.confluence/language/resource.language.pt_pt/strings.po
@@ -80,6 +80,10 @@ msgctxt "#31031"
msgid "Pic thumbs"
msgstr "Miniaturas de imagens"
+msgctxt "#31032"
+msgid "Image wrap"
+msgstr "Envolver a imagem"
+
msgctxt "#31033"
msgid "Info"
msgstr "Informações"
@@ -112,6 +116,10 @@ msgctxt "#31046"
msgid "SEEKING"
msgstr "A PROCURAR"
+msgctxt "#31048"
+msgid "Visualisation presets"
+msgstr "Predefinições de visualização"
+
msgctxt "#31049"
msgid "End time"
msgstr "Hora de fim"
@@ -148,6 +156,10 @@ msgctxt "#31060"
msgid "This file is stacked, select the part you want to play from."
msgstr "Este ficheiro está dividido por partes. Escolha a parte que pretende reproduzir."
+msgctxt "#31061"
+msgid "Current selected"
+msgstr "Seleccionado actualmente"
+
msgctxt "#31101"
msgid "Home screen options"
msgstr "Opções do ecrã inicial"
@@ -168,6 +180,10 @@ msgctxt "#31106"
msgid "Miscellaneous options"
msgstr "Opções variadas"
+msgctxt "#31107"
+msgid "Hide flagging read from video filenames [COLOR=grey3](e.g. Blu-ray, HD-DVD)[/COLOR]"
+msgstr "Ocultar leitura de flags dos ficheiros de vídeo [COLOR=grey3](ex. Blu-ray, HD-DVD)[/COLOR]"
+
msgctxt "#31108"
msgid "Hide main menu buttons"
msgstr "Ocultar botões do menu principal"
@@ -188,18 +204,54 @@ msgctxt "#31112"
msgid "Options"
msgstr "Opções"
-msgctxt "#31126"
-msgid "Play TV theme songs in video library (TvTunes add-on)"
-msgstr "Tocar música de genérico na biblioteca de vídeo (Add-on TvTunes)"
+msgctxt "#31116"
+msgid "Show recently added albums"
+msgstr "Mostrar álbuns adicionados recentemente"
+
+msgctxt "#31117"
+msgid "Show recently added videos"
+msgstr "Mostrar vídeos adicionados recentemente"
+
+msgctxt "#31118"
+msgid "Home page programs submenu"
+msgstr "Submenu \"Programas\" da página inicial"
+
+msgctxt "#31119"
+msgid "Hide background fanart"
+msgstr "Ocultar fanart de fundo"
-msgctxt "#31127"
-msgid "TvTunes"
-msgstr "TvTunes"
+msgctxt "#31124"
+msgid "Show background \"Now playing\" video"
+msgstr "Mostrar vídeo \"A reproduzir\" em fundo"
+
+msgctxt "#31125"
+msgid "Show background \"Now playing\" visualisation"
+msgstr "Mostrar visualização \"A reproduzir\" em fundo"
msgctxt "#31128"
msgid "Lyrics"
msgstr "Letras"
+msgctxt "#31129"
+msgid "Hide fanart in full screen visualisation"
+msgstr "Ocultar o Fanart em ecrã completo"
+
+msgctxt "#31132"
+msgid "Lyrics add-on"
+msgstr "Add-on de letras"
+
+msgctxt "#31134"
+msgid "Home page \"Videos\" submenu"
+msgstr "Submenu \"Vídeos\" da página inicial"
+
+msgctxt "#31135"
+msgid "Home page \"Music\" submenu"
+msgstr "Submenu \"Música\" da página inicial"
+
+msgctxt "#31136"
+msgid "Home page \"Pictures\" submenu"
+msgstr "Submenu \"Imagens\" da página inicial"
+
msgctxt "#31140"
msgid "Music OSD"
msgstr "Controlos de música"
@@ -216,22 +268,90 @@ msgctxt "#31200"
msgid "Shortcuts"
msgstr "Atalhos"
+msgctxt "#31203"
+msgid "Choose your song"
+msgstr "Escolha a sua música"
+
+msgctxt "#31205"
+msgid "Lyrics source"
+msgstr "Fonte das letras"
+
msgctxt "#31206"
msgid "Found"
msgstr "Encontrado"
+msgctxt "#31207"
+msgid "Find more items"
+msgstr "Encontrar mais itens"
+
+msgctxt "#31208"
+msgid "Upcoming episodes"
+msgstr "Proximos episódios"
+
+msgctxt "#31300"
+msgid "Current temperature"
+msgstr "Temperatura actual"
+
+msgctxt "#31301"
+msgid "Last updated"
+msgstr "Última actualização"
+
msgctxt "#31303"
msgid "Data provider"
msgstr "Fornecedor de dados"
+msgctxt "#31307"
+msgid "Hide fanart"
+msgstr "Ocultar o Fanart"
+
+msgctxt "#31308"
+msgid "Movie details"
+msgstr "Detalhes do filme"
+
+msgctxt "#31309"
+msgid "Memory used:"
+msgstr "Memória utilizada:"
+
+msgctxt "#31310"
+msgid "Track number"
+msgstr "Número da faixa"
+
msgctxt "#31311"
msgid "Fanart image[CR][CR]Unavailable[CR][CR] Click button to set"
msgstr "Imagem de Fanart[CR][CR]Indisponível[CR][CR] Clique no botão para seleccionar"
+msgctxt "#31312"
+msgid "Current scraper"
+msgstr "Colector atual"
+
+msgctxt "#31313"
+msgid "Choose a scraper"
+msgstr "Escolha um colector"
+
+msgctxt "#31314"
+msgid "Content scanning options"
+msgstr "Opções de pesquisa de conteúdos"
+
+msgctxt "#31317"
+msgid "Set fanart path"
+msgstr "Defina o caminho fanart"
+
+msgctxt "#31319"
+msgid "Selected profile"
+msgstr "Perfil seleccionado"
+
+msgctxt "#31320"
+msgid "Last logged in"
+msgstr "Última vez ligado"
+
msgctxt "#31322"
msgid "Aired"
msgstr "Transmitido a"
+msgctxt "#31325"
+msgid "Playlist options"
+msgstr "Opções da lista de reprodução"
+
msgctxt "#31326"
msgid "Created"
msgstr "Criado a"
@@ -240,10 +360,22 @@ msgctxt "#31327"
msgid "Resolution"
msgstr "Resolução"
+msgctxt "#31328"
+msgid "Recently added"
+msgstr "Recentemente adicionados"
+
msgctxt "#31329"
msgid "[B]Timer set![/B] [COLOR=grey2] - System auto shutdown in[/COLOR]"
msgstr "[B]Temporizador activado![/B] [COLOR=grey2] - Sistema vai desligar-se em[/COLOR]"
+msgctxt "#31330"
+msgid "Click button to play[CR][CR]movie trailer"
+msgstr "Clique no botão para reproduzir[CR][CR]o trailer do filme"
+
+msgctxt "#31331"
+msgid "Album details"
+msgstr "Detalhes do álbum"
+
msgctxt "#31351"
msgid "Pause"
msgstr "Pausar"
@@ -252,6 +384,10 @@ msgctxt "#31352"
msgid "Stop"
msgstr "Parar"
+msgctxt "#31353"
+msgid "Fast forward"
+msgstr "Avançar"
+
msgctxt "#31354"
msgid "Rewind"
msgstr "Retroceder"
@@ -260,6 +396,10 @@ msgctxt "#31355"
msgid "Movie menu"
msgstr "Menu do filme"
+msgctxt "#31356"
+msgid "Download subtitles"
+msgstr "Transferir Legendas"
+
msgctxt "#31360"
msgid "Watch as 2D"
msgstr "Ver em 2D"
@@ -276,6 +416,10 @@ msgctxt "#31390"
msgid "Skin default"
msgstr "Predefinição do tema"
+msgctxt "#31391"
+msgid "Skin default with no caps"
+msgstr "Predefinição do tema sem maiúsculas"
+
msgctxt "#31392"
msgid "Arial based"
msgstr "Baseada em Arial"
@@ -288,14 +432,22 @@ msgctxt "#31401"
msgid "[B]CONFIGURE VIDEO SETTINGS[/B][CR][CR]Manage your video library · Set video playback options · Change video listing options[CR]Set subtitle fonts"
msgstr "[B]CONFIGURAR DEFINIÇÕES DE VÃDEO[/B][CR][CR]Gerir Biblioteca de Vídeo · Opções de reprodução de vídeo · Opções de listagem de vídeo[CR]Definir tipo de letra das legendas"
-msgctxt "#31402"
-msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission · Set karaoke options"
-msgstr "[B]CONFIGURAR DEFINIÇÕES DE MÚSICA[/B][CR][CR]Gerir Biblioteca de Música · Opções de reprodução · Opções de listagem[CR]Definir envio de músicas · Opções de karaoke"
+msgctxt "#31403"
+msgid "[B]CONFIGURE PICTURE SETTINGS[/B][CR][CR]Set picture listing options · Configure slideshow"
+msgstr "[B]CONFIGURAR DEFINIÇÕES DE IMAGENS[/B][CR][CR]Definir opções de listagem de imagens · Configurar apresentação de slides"
+
+msgctxt "#31404"
+msgid "[B]CONFIGURE WEATHER SETTINGS[/B][CR][CR]Set various cities to collect weather information"
+msgstr "[B]CONFIGURAR DEFINIÇÕES METEOROLÓGICAS[/B][CR][CR]Definir várias cidades para recolher informação meterológica"
msgctxt "#31406"
msgid "[B]CONFIGURE SYSTEM SETTINGS[/B][CR][CR]Setup and calibrate displays · Configure audio output · Setup remote controls[CR]Set power saving options · Enable debugging · Setup master lock"
msgstr "[B]CONFIGURAR DEFINIÇÕES DO SISTEMA[/B][CR][CR]Configurar e calibrar ecrãs · Configurar saída de áudio · Configurar controlo remoto[CR]Configurar poupança de energia · Activar depuração · Configurar bloqueio geral"
+msgctxt "#31408"
+msgid "[B]CONFIGURE ADD-ONS[/B][CR][CR]Manage your installed add-ons · Browse for and install add-ons from kodi.tv[CR]Modify add-on settings"
+msgstr "[B]CONFIGURAR EXTRAS[/B][CR][CR]Gerir os seus extras instalados · Procurar e instalar os extras a partir de kodi.tv[CR]Modificar as definições dos extras"
+
msgctxt "#31409"
msgid "[B]CONFIGURE TV SETTINGS[/B][CR][CR]Change full screen info · Manage EPG data settings"
msgstr "[B]CONFIGURAR DEFINIÇÕES DE TV[/B][CR][CR]Definir informação em ecrã cheio · Gerir definições de dados do EPG"
@@ -304,6 +456,14 @@ msgctxt "#31410"
msgid "[B]CONFIGURE SERVICE SETTINGS[/B][CR][CR]Setup control of Kodi via UPnP and HTTP · Configure file sharing[CR]Enable Zeroconf · Configure AirPlay"
msgstr "[B]CONFIGURAR DEFINIÇÕES DE SERVIÇOS[/B][CR][CR]Configurar controlo do Kodi via UPnP e HTTP · Configurar partilha de ficheiros[CR]Activar ZeroConf · Configurar AirPlay"
+msgctxt "#31411"
+msgid "First run help..."
+msgstr "Ajuda da primeira execução..."
+
+msgctxt "#31412"
+msgid "This tab signifies that there is a menu off to the side of this window that contains extra options for this section. To access the menu, navigate to the left with your remote control or keyboard or place your mouse pointer over the tab. [CR][CR]Click \"OK\" to close this dialogue. It will not appear again."
+msgstr "Este separador significa que existe um menu lateral nesta janela, que contém opções extra para esta seção. Para aceder ao menu, navegue para a esquerda com o controlo remoto ou teclado, ou posicione o ponteiro do rato sobre o separador. [CR][CR]Clique em \"OK\" para fechar este diálogo. Não irá aparecer novamente."
+
msgctxt "#31413"
msgid "Local subtitle available"
msgstr "Legenda local disponível"
@@ -312,6 +472,10 @@ msgctxt "#31420"
msgid "Login"
msgstr "Iniciar sessão"
+msgctxt "#31421"
+msgid "Select your Kodi user profile[CR]to login and continue"
+msgstr "Escolha o seu perfil de utilizador do Kodi[CR]para iniciar sessão e prosseguir"
+
msgctxt "#31422"
msgid "Show or hide the login screen at startup."
msgstr "Mostrar ou ocultar o ecrã de início de sessão ao iniciar o Kodi"
@@ -320,18 +484,66 @@ msgctxt "#31423"
msgid "Select the profile that will be used at startup when the login screen is disabled."
msgstr "Seleccionar o perfil que será usado inicialmente quando o ecrã de início de sessão não é exibido"
+msgctxt "#31501"
+msgid "Scheduled time"
+msgstr "Hora agendado"
+
msgctxt "#31502"
msgid "TV"
-msgstr "TELEVISÃO"
+msgstr "Televisão"
+
+msgctxt "#31503"
+msgid "Add group"
+msgstr "Adicionar grupo"
+
+msgctxt "#31504"
+msgid "Rename group"
+msgstr "Renomear grupo"
+
+msgctxt "#31505"
+msgid "Delete group"
+msgstr "Remover grupo"
msgctxt "#31506"
msgid "Available[CR]Groups"
msgstr "Grupos[CR] disponíveis"
+msgctxt "#31509"
+msgid "Channel group"
+msgstr "Grupo de canais"
+
+msgctxt "#31510"
+msgid "Timer set"
+msgstr "Temporizador definido"
+
+msgctxt "#31511"
+msgid "Channel options"
+msgstr "Opções do canal"
+
+msgctxt "#31901"
+msgid "36-hour forecast"
+msgstr "Previsão para 36 horas"
+
+msgctxt "#31902"
+msgid "Hourly forecast"
+msgstr "Previsão horária"
+
+msgctxt "#31903"
+msgid "Weekend forecast"
+msgstr "Previsão semanal"
+
+msgctxt "#31904"
+msgid "Daily forecast"
+msgstr "Previsão diária"
+
msgctxt "#31905"
msgid "Forecast"
msgstr "Previsão"
+msgctxt "#31908"
+msgid "Chance of precipitation"
+msgstr "Probabilidade de precipitação"
+
msgctxt "#31909"
msgid "Fetching forecast info..."
msgstr "A receber previsões meteorológicas..."
@@ -350,7 +562,7 @@ msgstr "IMAGENS"
msgctxt "#31952"
msgid "TV"
-msgstr "TELEVISÃO"
+msgstr "Televisão"
msgctxt "#31953"
msgid "VIDEOS"
diff --git a/addons/skin.confluence/language/resource.language.ro_ro/strings.po b/addons/skin.confluence/language/resource.language.ro_ro/strings.po
index 3866419243..ca8d8e1c47 100644
--- a/addons/skin.confluence/language/resource.language.ro_ro/strings.po
+++ b/addons/skin.confluence/language/resource.language.ro_ro/strings.po
@@ -220,6 +220,10 @@ msgctxt "#31119"
msgid "Hide background fanart"
msgstr "Ascunde creația artistică de pe fundal"
+msgctxt "#31122"
+msgid "Hide EPG if RDS is present on channel window"
+msgstr "Ascunde EPG dacă RDS este prezent în fereastra canal"
+
msgctxt "#31124"
msgid "Show background \"Now playing\" video"
msgstr "Arată fundal video „Acum în redareâ€"
@@ -228,14 +232,6 @@ msgctxt "#31125"
msgid "Show background \"Now playing\" visualisation"
msgstr "Arată vizualizare „Acum în redare†pe fundal"
-msgctxt "#31126"
-msgid "Play TV theme songs in video library (TvTunes add-on)"
-msgstr "Redă cântece temă TV în mediateca video (supliment TvTunes)"
-
-msgctxt "#31127"
-msgid "TvTunes"
-msgstr "TvTunes"
-
msgctxt "#31128"
msgid "Lyrics"
msgstr "Versuri"
@@ -352,10 +348,6 @@ msgctxt "#31320"
msgid "Last logged in"
msgstr "Ultimul autentificat"
-msgctxt "#31321"
-msgid "Karaoke song selector"
-msgstr "Selector cântece karaoke"
-
msgctxt "#31322"
msgid "Aired"
msgstr "Difuzat pe"
@@ -445,8 +437,8 @@ msgid "[B]CONFIGURE VIDEO SETTINGS[/B][CR][CR]Manage your video library · Set v
msgstr "[B]CONFIGURAȚI SETĂRI VIDEO[/B][CR][CR]Administrați mediateca video · Configurați opțiuni redare video · Modificați opțiuni afișare liste de fișiere video[CR]Alegeți font subtitrare"
msgctxt "#31402"
-msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission · Set karaoke options"
-msgstr "[B]CONFIGURAȚI SETĂRI MUZICĂ[/B][CR][CR]Administrați mediateca audio · Setați opțiuni redare muzică · Modificați opțiuni afișare liste de fișiere audio[CR]Pregătiți trimitere cântec · Configurați opțiuni karaoke"
+msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission"
+msgstr "[B]CONFIGURAȚI SETĂRI MUZICĂ[/B][CR][CR]Administrați mediateca audio · Stabiliți opțiunile de redare a muzicii · Schimbați opțiunile de afișare listă ale muzicii[CR]Configurați trimitere cântece"
msgctxt "#31403"
msgid "[B]CONFIGURE PICTURE SETTINGS[/B][CR][CR]Set picture listing options · Configure slideshow"
diff --git a/addons/skin.confluence/language/resource.language.ru_ru/strings.po b/addons/skin.confluence/language/resource.language.ru_ru/strings.po
index d6612d6e60..e46690e887 100644
--- a/addons/skin.confluence/language/resource.language.ru_ru/strings.po
+++ b/addons/skin.confluence/language/resource.language.ru_ru/strings.po
@@ -228,14 +228,6 @@ msgctxt "#31125"
msgid "Show background \"Now playing\" visualisation"
msgstr "ÐœÑƒÐ·Ñ‹ÐºÐ°Ð»ÑŒÐ½Ð°Ñ Ð²Ð¸Ð·ÑƒÐ°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð² качеÑтве фона"
-msgctxt "#31126"
-msgid "Play TV theme songs in video library (TvTunes add-on)"
-msgstr "Играть мелодию Ñериала в медиатеке (дополнение TvTunes)"
-
-msgctxt "#31127"
-msgid "TvTunes"
-msgstr "TvTunes"
-
msgctxt "#31128"
msgid "Lyrics"
msgstr "ТекÑÑ‚Ñ‹"
@@ -352,10 +344,6 @@ msgctxt "#31320"
msgid "Last logged in"
msgstr "ПоÑледний вход"
-msgctxt "#31321"
-msgid "Karaoke song selector"
-msgstr "Выбор пеÑен Ð´Ð»Ñ ÐºÐ°Ñ€Ð°Ð¾ÐºÐµ"
-
msgctxt "#31322"
msgid "Aired"
msgstr "Премьера"
@@ -444,10 +432,6 @@ msgctxt "#31401"
msgid "[B]CONFIGURE VIDEO SETTINGS[/B][CR][CR]Manage your video library · Set video playback options · Change video listing options[CR]Set subtitle fonts"
msgstr "[B]ÐÐСТРОЙКРПÐРÐМЕТРОВ ВИДЕО[/B][CR][CR]Управление медиатекой видео • Параметры воÑÐ¿Ñ€Ð¾Ð¸Ð·Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð²Ð¸Ð´ÐµÐ¾[CR]ÐаÑтройка ÑпиÑка видео • ÐаÑтройка шрифта Ñубтитров"
-msgctxt "#31402"
-msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission · Set karaoke options"
-msgstr "[B]ÐÐСТРОЙКРПÐРÐМЕТРОВ МУЗЫКИ[/B][CR][CR]Управление медиатекой аудио • Параметры воÑÐ¿Ñ€Ð¾Ð¸Ð·Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð°ÑƒÐ´Ð¸Ð¾[CR]ÐаÑтройка ÑпиÑка аудио • ÐаÑтройка Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿ÐµÑен • ÐаÑтройка караоке"
-
msgctxt "#31403"
msgid "[B]CONFIGURE PICTURE SETTINGS[/B][CR][CR]Set picture listing options · Configure slideshow"
msgstr "[B]ÐÐСТРОЙКРПÐРÐМЕТРОВ ИЗОБРÐЖЕÐИЙ[/B][CR][CR]Параметры ÑпиÑка изображений · ÐаÑтройка Ñлайд-шоу"
diff --git a/addons/skin.confluence/language/resource.language.sk_sk/strings.po b/addons/skin.confluence/language/resource.language.sk_sk/strings.po
index d424ea4096..75f2bbd107 100644
--- a/addons/skin.confluence/language/resource.language.sk_sk/strings.po
+++ b/addons/skin.confluence/language/resource.language.sk_sk/strings.po
@@ -16,10 +16,22 @@ msgstr ""
"Language: sk_SK\n"
"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
+msgctxt "#31000"
+msgid "Change your"
+msgstr "Zmeňte vaše"
+
+msgctxt "#31003"
+msgid "Power options"
+msgstr "Nastavenia napájania"
+
msgctxt "#31004"
msgid "Working..."
msgstr "Pracujem..."
+msgctxt "#31005"
+msgid "Hide information"
+msgstr "Skryť informáciu"
+
msgctxt "#31006"
msgid "View options"
msgstr "Zobrazenie"
@@ -28,6 +40,10 @@ msgctxt "#31008"
msgid "Full screen"
msgstr "Celá obrazovka"
+msgctxt "#31009"
+msgid "Total duration"
+msgstr "Celkové trvanie"
+
msgctxt "#31022"
msgid "Music - Files"
msgstr "Hudba - Súbory"
@@ -44,14 +60,30 @@ msgctxt "#31025"
msgid "Items"
msgstr "Položky"
+msgctxt "#31026"
+msgid "Misc options"
+msgstr "Ďalšie nastavenia"
+
msgctxt "#31027"
msgid "Location"
msgstr "Mesto"
+msgctxt "#31028"
+msgid "Poster wrap"
+msgstr "Obal posteru"
+
msgctxt "#31029"
msgid "Fanart"
msgstr "Fanart"
+msgctxt "#31031"
+msgid "Pic thumbs"
+msgstr "Obrázky náhľadov"
+
+msgctxt "#31032"
+msgid "Image wrap"
+msgstr "Obal obrázku"
+
msgctxt "#31033"
msgid "Info"
msgstr "Informácie"
@@ -60,6 +92,10 @@ msgctxt "#31039"
msgid "Actions"
msgstr "Akcie"
+msgctxt "#31040"
+msgid "Now playing"
+msgstr "Práve hrá"
+
msgctxt "#31042"
msgid "PLAYING"
msgstr "PREHRÃVA SA"
@@ -80,6 +116,10 @@ msgctxt "#31046"
msgid "SEEKING"
msgstr "VYHĽADÃVANIE"
+msgctxt "#31048"
+msgid "Visualisation presets"
+msgstr "Predvoľby vizualizácie"
+
msgctxt "#31049"
msgid "End time"
msgstr "ÄŒas konca"
@@ -116,6 +156,10 @@ msgctxt "#31060"
msgid "This file is stacked, select the part you want to play from."
msgstr "Tento súbor sa skladá z viac Äastí. Vyberte tu, od ktorej chcete spustit prehrávaníe."
+msgctxt "#31061"
+msgid "Current selected"
+msgstr "Aktuálne vybraný"
+
msgctxt "#31101"
msgid "Home screen options"
msgstr "Informácie na Domovskej stránke"
@@ -124,10 +168,26 @@ msgctxt "#31102"
msgid "Background"
msgstr "Pozadie"
+msgctxt "#31103"
+msgid "Show \"Paused\" in picture slideshow"
+msgstr "Zobrazovať \"Pauza\" pri prezentácii obrázkov"
+
+msgctxt "#31104"
+msgid "Play trailers in a window [COLOR=grey3](Video information dialogue only)[/COLOR]"
+msgstr "Prehrávať ukážky v okne [COLOR=grey3](iba z okna Informácie o videu)[/COLOR]"
+
msgctxt "#31106"
msgid "Miscellaneous options"
msgstr "Rôzne nastavenia"
+msgctxt "#31107"
+msgid "Hide flagging read from video filenames [COLOR=grey3](e.g. Blu-ray, HD-DVD)[/COLOR]"
+msgstr "Nezobrazovať ikonky zdroja videa [COLOR=grey3](napr. Blu-ray, HD-DVD)[/COLOR]"
+
+msgctxt "#31108"
+msgid "Hide main menu buttons"
+msgstr "Skryť položky hlavného menu"
+
msgctxt "#31109"
msgid "Enable custom background"
msgstr "Aktivovať vlastné pozadie"
@@ -144,18 +204,58 @@ msgctxt "#31112"
msgid "Options"
msgstr "Možnosti"
-msgctxt "#31126"
-msgid "Play TV theme songs in video library (TvTunes add-on)"
-msgstr "Prehrávať skladbu TV seriálu vo video knižnici (TvTunes doplnok)"
+msgctxt "#31116"
+msgid "Show recently added albums"
+msgstr "Zobraziť naposledy pridané albumy"
+
+msgctxt "#31117"
+msgid "Show recently added videos"
+msgstr "Zobrazovať naposledy pridané videá"
-msgctxt "#31127"
-msgid "TvTunes"
-msgstr "TvTunes"
+msgctxt "#31118"
+msgid "Home page programs submenu"
+msgstr "Domovská stránka / podmenu Programy"
+
+msgctxt "#31119"
+msgid "Hide background fanart"
+msgstr "Skryť Fanart na pozadí"
+
+msgctxt "#31122"
+msgid "Hide EPG if RDS is present on channel window"
+msgstr "Ak je v okne kanálu informácia RDS, skryť EPG"
+
+msgctxt "#31124"
+msgid "Show background \"Now playing\" video"
+msgstr "Zobrazovať práve prehrávané video na pozadí"
+
+msgctxt "#31125"
+msgid "Show background \"Now playing\" visualisation"
+msgstr "Zobrazovať práve prehrávanú vizualizáciu na pozadí"
msgctxt "#31128"
msgid "Lyrics"
msgstr "Texty skladieb"
+msgctxt "#31129"
+msgid "Hide fanart in full screen visualisation"
+msgstr "Skryť Fanart pri vizualizácii na celú obrazovku"
+
+msgctxt "#31132"
+msgid "Lyrics add-on"
+msgstr "Doplnok Texty skladieb"
+
+msgctxt "#31134"
+msgid "Home page \"Videos\" submenu"
+msgstr "Domovská stránka / podmenu Videá"
+
+msgctxt "#31135"
+msgid "Home page \"Music\" submenu"
+msgstr "Domovská stránka / podmenu Hudba"
+
+msgctxt "#31136"
+msgid "Home page \"Pictures\" submenu"
+msgstr "Domovská stránka / podmenu Obrázky"
+
msgctxt "#31140"
msgid "Music OSD"
msgstr "Hudobný OSD"
@@ -172,22 +272,90 @@ msgctxt "#31200"
msgid "Shortcuts"
msgstr "Odkazy"
+msgctxt "#31203"
+msgid "Choose your song"
+msgstr "Vyberte si vašu skladbu"
+
+msgctxt "#31205"
+msgid "Lyrics source"
+msgstr "Zdroj textov skladieb"
+
msgctxt "#31206"
msgid "Found"
msgstr "Nájdené"
+msgctxt "#31207"
+msgid "Find more items"
+msgstr "Hľadať viac položiek"
+
+msgctxt "#31208"
+msgid "Upcoming episodes"
+msgstr "Pripravované Äasti"
+
+msgctxt "#31300"
+msgid "Current temperature"
+msgstr "Aktuálna teplota"
+
+msgctxt "#31301"
+msgid "Last updated"
+msgstr "Naposledy aktualizované"
+
msgctxt "#31303"
msgid "Data provider"
msgstr "PoÄasie Vám prináša"
+msgctxt "#31307"
+msgid "Hide fanart"
+msgstr "Skryť FanArt"
+
+msgctxt "#31308"
+msgid "Movie details"
+msgstr "Podrobnosti o filme"
+
+msgctxt "#31309"
+msgid "Memory used:"
+msgstr "Použitá pamäť:"
+
+msgctxt "#31310"
+msgid "Track number"
+msgstr "Číslo skladby"
+
msgctxt "#31311"
msgid "Fanart image[CR][CR]Unavailable[CR][CR] Click button to set"
msgstr "Fanart obrázok[CR][CR]Nedostupný[CR][CR] Klik pre nastavenie"
+msgctxt "#31312"
+msgid "Current scraper"
+msgstr "Aktuálny sÅ¥ahovaÄ"
+
+msgctxt "#31313"
+msgid "Choose a scraper"
+msgstr "Vyber sÅ¥ahovaÄ"
+
+msgctxt "#31314"
+msgid "Content scanning options"
+msgstr "Možnosti vyhľadávania obsahu"
+
+msgctxt "#31317"
+msgid "Set fanart path"
+msgstr "Nastaviť cestu k FanArt"
+
+msgctxt "#31319"
+msgid "Selected profile"
+msgstr "Vybratý profil"
+
+msgctxt "#31320"
+msgid "Last logged in"
+msgstr "Posledné prihlásenie"
+
msgctxt "#31322"
msgid "Aired"
msgstr "Vysielané"
+msgctxt "#31325"
+msgid "Playlist options"
+msgstr "Nastavenia Playlistu"
+
msgctxt "#31326"
msgid "Created"
msgstr "Vytvorené"
@@ -204,6 +372,14 @@ msgctxt "#31329"
msgid "[B]Timer set![/B] [COLOR=grey2] - System auto shutdown in[/COLOR]"
msgstr "[B]ÄŒasovaÄ nastavený![/B] [COLOR=grey2] - Systém sa automaticky vypne za[/COLOR]"
+msgctxt "#31330"
+msgid "Click button to play[CR][CR]movie trailer"
+msgstr "Pre spustenie ukážky[CR][CR]stlaÄte tlaÄidlo"
+
+msgctxt "#31331"
+msgid "Album details"
+msgstr "Podrobnosti o albume"
+
msgctxt "#31351"
msgid "Pause"
msgstr "Pauza"
@@ -212,6 +388,10 @@ msgctxt "#31352"
msgid "Stop"
msgstr "Zastaviť"
+msgctxt "#31353"
+msgid "Fast forward"
+msgstr "Posunúť dopredu"
+
msgctxt "#31354"
msgid "Rewind"
msgstr "PretoÄiÅ¥ dozadu"
@@ -220,6 +400,10 @@ msgctxt "#31355"
msgid "Movie menu"
msgstr "Menu filmu"
+msgctxt "#31356"
+msgid "Download subtitles"
+msgstr "Stiahnuť titulky"
+
msgctxt "#31360"
msgid "Watch as 2D"
msgstr "Pozerať ako 2D"
@@ -236,6 +420,10 @@ msgctxt "#31390"
msgid "Skin default"
msgstr "Predvolený vzhľad"
+msgctxt "#31391"
+msgid "Skin default with no caps"
+msgstr "Predvolený vzhľad bez veľkých písmen"
+
msgctxt "#31392"
msgid "Arial based"
msgstr "Arial"
@@ -249,13 +437,25 @@ msgid "[B]CONFIGURE VIDEO SETTINGS[/B][CR][CR]Manage your video library · Set v
msgstr "[B]MOŽNOSTI VIDEA[/B][CR][CR]Správa knižnice videí · Možnosti prehrávania videa · Zobrazenie video súborov[CR]Nastavenie titulkov"
msgctxt "#31402"
-msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission · Set karaoke options"
-msgstr "[B]MOŽNOSTI HUDBY[/B][CR][CR]Správa knižnice hudby · Možnosti prehrávania hudby · Zobrazenie hudobných súborov[CR]Služby pre odosielanie informácií o prehrávaných skladbách · Karaoke nastavenia"
+msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission"
+msgstr "[B]KONFIGUROVAŤ NASTAVENIA HUDBY[/B][CR][CR]Spravujte svoju hudobnú zbierku · Nastaviť možnosti prehrávania hudby · Zmeniť možnosti zobrazovania zoznamu[CR]Nastaviť informácie o skladbách"
+
+msgctxt "#31403"
+msgid "[B]CONFIGURE PICTURE SETTINGS[/B][CR][CR]Set picture listing options · Configure slideshow"
+msgstr "[B]MOŽNOSTI OBRÃZKOV[/B][CR][CR]Možnosti zobrazenia obrázkov · Nastavenie prezentácie"
+
+msgctxt "#31404"
+msgid "[B]CONFIGURE WEATHER SETTINGS[/B][CR][CR]Set various cities to collect weather information"
+msgstr "[B]MOŽNOSTI POÄŒASIA[/B][CR][CR]Nastavte rôzne mestá, pre ktoré si prajete získavaÅ¥ predpoveÄ poÄasia"
msgctxt "#31406"
msgid "[B]CONFIGURE SYSTEM SETTINGS[/B][CR][CR]Setup and calibrate displays · Configure audio output · Setup remote controls[CR]Set power saving options · Enable debugging · Setup master lock"
msgstr "[B]MOŽNOSTI SYSTÉMU[/B][CR][CR]Nastavenie obrazovky · Nastavenie zvukového výstupu[CR]Možnosti úsporného režimu · Ukladanie informácií · Konfigurácia rodiÄovského zámku"
+msgctxt "#31408"
+msgid "[B]CONFIGURE ADD-ONS[/B][CR][CR]Manage your installed add-ons · Browse for and install add-ons from kodi.tv[CR]Modify add-on settings"
+msgstr "[B]MOŽNOSTI DOPLNKOV[/B][CR][CR]Správa nainštalovaných doplnkov · Vyhľadávanie a inštalácia doplnkov z kodi.tv[CR]Zmena nastavenia doplnkov"
+
msgctxt "#31409"
msgid "[B]CONFIGURE TV SETTINGS[/B][CR][CR]Change full screen info · Manage EPG data settings"
msgstr "[B]NASTAVENIA TV[/B][CR][CR]Zmeniť informácie zobrazené na celej obrazovke · Spravovať nastavenia EPG dát"
@@ -264,6 +464,14 @@ msgctxt "#31410"
msgid "[B]CONFIGURE SERVICE SETTINGS[/B][CR][CR]Setup control of Kodi via UPnP and HTTP · Configure file sharing[CR]Enable Zeroconf · Configure AirPlay"
msgstr "[B]KONFIGUROVAŤ NASTAVENIA SLUŽBY[/B][CR][CR]Nastaviť ovládanie Kodi pomocou UPnP a HTTP · Konfigurovať zdielanie[CR]Zapnúť Zeroconf · Konfigurovať AirPlay"
+msgctxt "#31411"
+msgid "First run help..."
+msgstr "Pomocník po prvom spustení..."
+
+msgctxt "#31412"
+msgid "This tab signifies that there is a menu off to the side of this window that contains extra options for this section. To access the menu, navigate to the left with your remote control or keyboard or place your mouse pointer over the tab. [CR][CR]Click \"OK\" to close this dialogue. It will not appear again."
+msgstr "Táto záložka zvýrazňuje, že sa na boÄnej strane okna nachádza skryté menu. Aby ste sa k nemu dostali, kurzorovými tlaÄidlami na vaÅ¡om diaľkovom ovládaÄi alebo klávesnici choÄte doľava, prípadne umiestnite kurzor myÅ¡i ponad túto záložku. [CR][CR]Kliknutím na tlaÄidlo \"OK\" sa zavrie toto dialógové okno. V budúcnosti sa už nezobrazí."
+
msgctxt "#31413"
msgid "Local subtitle available"
msgstr "Dostupné lokálne titulky"
@@ -272,6 +480,10 @@ msgctxt "#31420"
msgid "Login"
msgstr "Prihlásiť"
+msgctxt "#31421"
+msgid "Select your Kodi user profile[CR]to login and continue"
+msgstr "Vyberte váš používateľský profil Kodi[CR]pre prihlásenie a pokraÄovanie"
+
msgctxt "#31422"
msgid "Show or hide the login screen at startup."
msgstr "Zobraziť alebo skryť prihlasovaciu obrazovku pri štarte."
@@ -280,18 +492,66 @@ msgctxt "#31423"
msgid "Select the profile that will be used at startup when the login screen is disabled."
msgstr "Zvoľte profil, ktorý bude použitý pri štarte, ak je prihlasovacia obrazovka vypnutá."
+msgctxt "#31501"
+msgid "Scheduled time"
+msgstr "Naplánovaný Äas"
+
msgctxt "#31502"
msgid "TV"
msgstr "TV"
+msgctxt "#31503"
+msgid "Add group"
+msgstr "Pridať skupinu"
+
+msgctxt "#31504"
+msgid "Rename group"
+msgstr "Premenovať skupinu"
+
+msgctxt "#31505"
+msgid "Delete group"
+msgstr "Vymazať skupinu"
+
msgctxt "#31506"
msgid "Available[CR]Groups"
msgstr "Dostupné[CR]skupiny"
+msgctxt "#31509"
+msgid "Channel group"
+msgstr "Skupina kanálov"
+
+msgctxt "#31510"
+msgid "Timer set"
+msgstr "ÄŒasovaÄ nastavený"
+
+msgctxt "#31511"
+msgid "Channel options"
+msgstr "Možnosti kanálu"
+
+msgctxt "#31901"
+msgid "36-hour forecast"
+msgstr "36-hodinová predpoveÄ"
+
+msgctxt "#31902"
+msgid "Hourly forecast"
+msgstr "Hodinová predpoveÄ"
+
+msgctxt "#31903"
+msgid "Weekend forecast"
+msgstr "Víkendová predpoveÄ"
+
+msgctxt "#31904"
+msgid "Daily forecast"
+msgstr "Denná predpoveÄ"
+
msgctxt "#31905"
msgid "Forecast"
msgstr "PredpoveÄ"
+msgctxt "#31908"
+msgid "Chance of precipitation"
+msgstr "Riziko zrážok"
+
msgctxt "#31909"
msgid "Fetching forecast info..."
msgstr "ZisÅ¥ujem informácie o poÄasí..."
diff --git a/addons/skin.confluence/language/resource.language.sl_si/strings.po b/addons/skin.confluence/language/resource.language.sl_si/strings.po
index 7214c550d0..5898be8088 100644
--- a/addons/skin.confluence/language/resource.language.sl_si/strings.po
+++ b/addons/skin.confluence/language/resource.language.sl_si/strings.po
@@ -220,6 +220,10 @@ msgctxt "#31119"
msgid "Hide background fanart"
msgstr "Skrij ozadja"
+msgctxt "#31122"
+msgid "Hide EPG if RDS is present on channel window"
+msgstr "Skrij el. prog. vodnika, Äe je v oknu kanala prisoten RDS"
+
msgctxt "#31124"
msgid "Show background \"Now playing\" video"
msgstr "Prikaži v ozadju \"Zdaj se predvaja\" video"
@@ -228,14 +232,6 @@ msgctxt "#31125"
msgid "Show background \"Now playing\" visualisation"
msgstr "Prikaži v ozadju \"Zdaj se predvaja\" vizualizacija"
-msgctxt "#31126"
-msgid "Play TV theme songs in video library (TvTunes add-on)"
-msgstr "V knjižnici predvajaj uvodne pesmi TV serij (dodatek TvTunes)"
-
-msgctxt "#31127"
-msgid "TvTunes"
-msgstr "TvTunes"
-
msgctxt "#31128"
msgid "Lyrics"
msgstr "Besedilo pesmi"
@@ -352,10 +348,6 @@ msgctxt "#31320"
msgid "Last logged in"
msgstr "Zadnja prijava"
-msgctxt "#31321"
-msgid "Karaoke song selector"
-msgstr "Izbirnik pesmi za karaoke"
-
msgctxt "#31322"
msgid "Aired"
msgstr "Predvajano"
@@ -445,8 +437,8 @@ msgid "[B]CONFIGURE VIDEO SETTINGS[/B][CR][CR]Manage your video library · Set v
msgstr "[B]PRILAGODITE NASTAVITVE VIDEA[/B][CR][CR]Upravljajte s knjižnico videa · Nastavite možnosti predvajanja videa[CR]Spremenite možnosti seznamov · DoloÄite pisavo podnapisov"
msgctxt "#31402"
-msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission · Set karaoke options"
-msgstr "[B]PRILAGODITE NASTAVITVE GLASBE[/B][CR][CR]Upravljajte s knjižnico glasbe · Nastavite možnosti predvajanja glasbe[CR]Spremenite možnosti seznamov · Nastavite objavo pesmi · Nastavite karaoke"
+msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission"
+msgstr "[B]PRILAGODITE NASTAVITVE GLASBE[/B][CR][CR]Upravljajte knjižnico glasbe · Nastavite možnosti predvajanja glasbe · Spremenite možnosti seznamov[CR]Nastavite objavo pesmi"
msgctxt "#31403"
msgid "[B]CONFIGURE PICTURE SETTINGS[/B][CR][CR]Set picture listing options · Configure slideshow"
diff --git a/addons/skin.confluence/language/resource.language.sq_al/strings.po b/addons/skin.confluence/language/resource.language.sq_al/strings.po
index 0f1bf1fe6f..00dc91f0f2 100644
--- a/addons/skin.confluence/language/resource.language.sq_al/strings.po
+++ b/addons/skin.confluence/language/resource.language.sq_al/strings.po
@@ -140,14 +140,6 @@ msgctxt "#31112"
msgid "Options"
msgstr "Opcionet"
-msgctxt "#31126"
-msgid "Play TV theme songs in video library (TvTunes add-on)"
-msgstr "Luaj melodinë kryesore përcjellse së një seriali televiziv ne bibleotekën video (Shtesa TVTunes)"
-
-msgctxt "#31127"
-msgid "TvTunes"
-msgstr "TVTunes"
-
msgctxt "#31128"
msgid "Lyrics"
msgstr "Tekste Këngësh"
@@ -228,10 +220,6 @@ msgctxt "#31401"
msgid "[B]CONFIGURE VIDEO SETTINGS[/B][CR][CR]Manage your video library · Set video playback options · Change video listing options[CR]Set subtitle fonts"
msgstr "[B]KONFIGURO OPCIONET E VIDEOVE[/B][CR][CR]Menaxho video-bibliotekën tënde · Cakto opcionet e video-riprodhimit · Ndrysho pamjen e video-listës[CR]Cakto shkrimin e subtitrave"
-msgctxt "#31402"
-msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission · Set karaoke options"
-msgstr "[B]KONFIGURO OPCIONET E MUZIKËS[/B][CR][CR]Menaxho bibliotekën e muzikës tënde · Cakto opcione të riprodhimit të muzikës · Ndrysho pamjen e listës së muzikës[CR]Cakto opcionet karaoke"
-
msgctxt "#31406"
msgid "[B]CONFIGURE SYSTEM SETTINGS[/B][CR][CR]Setup and calibrate displays · Configure audio output · Setup remote controls[CR]Set power saving options · Enable debugging · Setup master lock"
msgstr "[B]KONFIGURO OPCIONET E SISTEMIT[/B][CR][CR]Konfiguro dhe Kalibro Ekranet · Konfiguro daljen e zërit · Konfiguro telekomandat [CR]Cakto opcionet për kursimin e rrymës · Aktivizo debugging · Konfiguro dryrin përdorues"
diff --git a/addons/skin.confluence/language/resource.language.sr_rs/strings.po b/addons/skin.confluence/language/resource.language.sr_rs/strings.po
index fadc5b012e..fcb695e500 100644
--- a/addons/skin.confluence/language/resource.language.sr_rs/strings.po
+++ b/addons/skin.confluence/language/resource.language.sr_rs/strings.po
@@ -144,14 +144,6 @@ msgctxt "#31112"
msgid "Options"
msgstr "Опције"
-msgctxt "#31126"
-msgid "Play TV theme songs in video library (TvTunes add-on)"
-msgstr "ПуÑти наÑловну музичку тему из видео библиотеке (додатак TvTunes)"
-
-msgctxt "#31127"
-msgid "TvTunes"
-msgstr "ТвМелодије"
-
msgctxt "#31128"
msgid "Lyrics"
msgstr "ТекÑтови пеÑама"
@@ -248,10 +240,6 @@ msgctxt "#31401"
msgid "[B]CONFIGURE VIDEO SETTINGS[/B][CR][CR]Manage your video library · Set video playback options · Change video listing options[CR]Set subtitle fonts"
msgstr "[B]КОÐФИГУРИСÐЊЕ ПОСТÐВКИ ФИЛМОВÐ[/B][CR][CR]Управљајте вашом библиотеком филмова · ПоÑтавите опције репродукције филмова[CR]Промените опције излиÑтавања филмова · ПоÑтавите изглед Ñлова у титловима"
-msgctxt "#31402"
-msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission · Set karaoke options"
-msgstr "[B]КОÐФИГУРИСÐЊЕ ПОСТÐВКИ МУЗИКЕ[/B][CR][CR]Управљајте вашом библиотеком музичких нумера · ПоÑтавите опције репрод. музике[CR]Промените опције излиÑтавања музике · ПоÑтавите Ñлање пеÑама[CR]ПоÑтавите караоке опције"
-
msgctxt "#31406"
msgid "[B]CONFIGURE SYSTEM SETTINGS[/B][CR][CR]Setup and calibrate displays · Configure audio output · Setup remote controls[CR]Set power saving options · Enable debugging · Setup master lock"
msgstr "[B]КОÐФИГУРИСÐЊЕ ПОСТÐВКИ СИСТЕМÐ[/B][CR][CR]ПодеÑите и калибришите екране · Конфигуришите звучни излаз[CR]ПодеÑите даљинÑко управљање · ПоÑтавите опције штедње енергије[CR]Омогућите евиденцију грешака · ПодеÑите главну лозинку"
diff --git a/addons/skin.confluence/language/resource.language.sr_rs@latin/strings.po b/addons/skin.confluence/language/resource.language.sr_rs@latin/strings.po
index 07ff7f3871..fba59b5f0b 100644
--- a/addons/skin.confluence/language/resource.language.sr_rs@latin/strings.po
+++ b/addons/skin.confluence/language/resource.language.sr_rs@latin/strings.po
@@ -16,17 +16,33 @@ msgstr ""
"Language: sr_RS@latin\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"
+msgctxt "#31000"
+msgid "Change your"
+msgstr "Promenite vaše"
+
+msgctxt "#31003"
+msgid "Power options"
+msgstr "Opcije napajanja"
+
msgctxt "#31004"
msgid "Working..."
msgstr "Obrada..."
+msgctxt "#31005"
+msgid "Hide information"
+msgstr "Sakrij informacije"
+
msgctxt "#31006"
msgid "View options"
msgstr "Prikaži opcije"
msgctxt "#31008"
msgid "Full screen"
-msgstr "Ceo Ekran"
+msgstr "Ceo ekran"
+
+msgctxt "#31009"
+msgid "Total duration"
+msgstr "Ukupno trajanje"
msgctxt "#31022"
msgid "Music - Files"
@@ -44,18 +60,42 @@ msgctxt "#31025"
msgid "Items"
msgstr "Stavki"
+msgctxt "#31026"
+msgid "Misc options"
+msgstr "Ostale opcije"
+
msgctxt "#31027"
msgid "Location"
msgstr "Lokacija"
+msgctxt "#31028"
+msgid "Poster wrap"
+msgstr "Umotano u poster"
+
msgctxt "#31029"
msgid "Fanart"
-msgstr "Zan. slika"
+msgstr "Umetnost ljubitelja"
+
+msgctxt "#31031"
+msgid "Pic thumbs"
+msgstr "SliÄice slika"
+
+msgctxt "#31032"
+msgid "Image wrap"
+msgstr "Umotano u sliku"
msgctxt "#31033"
msgid "Info"
msgstr "Informacije"
+msgctxt "#31039"
+msgid "Actions"
+msgstr "Akcije"
+
+msgctxt "#31040"
+msgid "Now playing"
+msgstr "Sada pušteno"
+
msgctxt "#31042"
msgid "PLAYING"
msgstr "REPRODUKOVANjE"
@@ -72,6 +112,18 @@ msgctxt "#31045"
msgid "REWIND"
msgstr "PREMOTAVANjE UNAZAD"
+msgctxt "#31046"
+msgid "SEEKING"
+msgstr "TRAŽENJE"
+
+msgctxt "#31048"
+msgid "Visualisation presets"
+msgstr "Unapred zadate vizualizacije"
+
+msgctxt "#31049"
+msgid "End time"
+msgstr "Vreme kraja"
+
msgctxt "#31050"
msgid "Sort: Ascending"
msgstr "Složi: Uzlazno"
@@ -82,15 +134,15 @@ msgstr "Složi: Silazno"
msgctxt "#31055"
msgid "Open playlist"
-msgstr "Otvori rep. spisak"
+msgstr "Otvori listu za reprodukciju"
msgctxt "#31056"
msgid "Save playlist"
-msgstr "SaÄuvaj rep. spisak"
+msgstr "SaÄuvaj listu za reprodukciju"
msgctxt "#31057"
msgid "Close playlist"
-msgstr "Zatvori rep. spisak"
+msgstr "Zatvori listu za reprodukciju"
msgctxt "#31058"
msgid "System music files"
@@ -98,24 +150,44 @@ msgstr "Sistemske muziÄke datoteke"
msgctxt "#31059"
msgid "Current playlist"
-msgstr "Trenutni rep. spisak"
+msgstr "Trenutna lista za reprodukciju"
msgctxt "#31060"
msgid "This file is stacked, select the part you want to play from."
-msgstr "Ova datoteka je složena, izaberite deo koji želite da reprodukujete."
+msgstr "Ova datoteka je složena, odaberite koji deo želite da reprodukujete iz nje."
+
+msgctxt "#31061"
+msgid "Current selected"
+msgstr "Trenutno odabrano"
msgctxt "#31101"
msgid "Home screen options"
-msgstr "Opcije poÄetnog ekrana"
+msgstr "Opcije glavnog ekrana"
msgctxt "#31102"
msgid "Background"
msgstr "Pozadina"
+msgctxt "#31103"
+msgid "Show \"Paused\" in picture slideshow"
+msgstr "Prikaži \"Pauzirano\" pri reprodukciji slajdova slika"
+
+msgctxt "#31104"
+msgid "Play trailers in a window [COLOR=grey3](Video information dialogue only)[/COLOR]"
+msgstr "Pusti najave u prozoru [COLOR=grey3](Samo dijalog podataka videa)[/COLOR]"
+
msgctxt "#31106"
msgid "Miscellaneous options"
msgstr "Razne opcije"
+msgctxt "#31107"
+msgid "Hide flagging read from video filenames [COLOR=grey3](e.g. Blu-ray, HD-DVD)[/COLOR]"
+msgstr "Sakrij oznake proÄitane iz naziva video datoteka [COLOR=grey3](npr. Blu-ray, HD-DVD)[/COLOR]"
+
+msgctxt "#31108"
+msgid "Hide main menu buttons"
+msgstr "Sakrij tastere glavnog menija"
+
msgctxt "#31109"
msgid "Enable custom background"
msgstr "Omogući prilagođenu pozadinu"
@@ -132,14 +204,54 @@ msgctxt "#31112"
msgid "Options"
msgstr "Opcije"
-msgctxt "#31127"
-msgid "TvTunes"
-msgstr "TvMelodije"
+msgctxt "#31116"
+msgid "Show recently added albums"
+msgstr "Prikaži nedavno dodate albume"
+
+msgctxt "#31117"
+msgid "Show recently added videos"
+msgstr "Prikaži nedavno dodat video materijal"
+
+msgctxt "#31118"
+msgid "Home page programs submenu"
+msgstr "Podmeni programa na poÄetnoj strani"
+
+msgctxt "#31119"
+msgid "Hide background fanart"
+msgstr "Sakrij pozadinsku sliku umetnosti ljubitelja"
+
+msgctxt "#31124"
+msgid "Show background \"Now playing\" video"
+msgstr "Prikaži u pozadini \"Sada Pušteni\" video"
+
+msgctxt "#31125"
+msgid "Show background \"Now playing\" visualisation"
+msgstr "Prikaži u pozadini \"Sada Pušteno\" vizualizaciju"
msgctxt "#31128"
msgid "Lyrics"
msgstr "Tekstovi pesama"
+msgctxt "#31129"
+msgid "Hide fanart in full screen visualisation"
+msgstr "Sakrij umetnost ljubitelja pri vizualizaciji preko celog ekrana"
+
+msgctxt "#31132"
+msgid "Lyrics add-on"
+msgstr "Dodatni program za tekstove pesama"
+
+msgctxt "#31134"
+msgid "Home page \"Videos\" submenu"
+msgstr "Podmeni \"Video materijal\" na glavnom ekranu"
+
+msgctxt "#31135"
+msgid "Home page \"Music\" submenu"
+msgstr "Podmeni \"Muzika\" na glavnom ekranu"
+
+msgctxt "#31136"
+msgid "Home page \"Pictures\" submenu"
+msgstr "Podmeni \"Slike\" na glavnom ekranu"
+
msgctxt "#31140"
msgid "Music OSD"
msgstr "MuziÄki OSD"
@@ -150,24 +262,96 @@ msgstr "Video OSD"
msgctxt "#31142"
msgid "Settings level"
-msgstr "Nivo postavki"
+msgstr "Nivo podešavanja"
msgctxt "#31200"
msgid "Shortcuts"
msgstr "PreÄice"
+msgctxt "#31203"
+msgid "Choose your song"
+msgstr "Izaberite vašu pesmu"
+
+msgctxt "#31205"
+msgid "Lyrics source"
+msgstr "Izvor tekstova pesama"
+
msgctxt "#31206"
msgid "Found"
msgstr "Pronađeno"
+msgctxt "#31207"
+msgid "Find more items"
+msgstr "Potraži još stavki"
+
+msgctxt "#31208"
+msgid "Upcoming episodes"
+msgstr "Predstojeće epizode"
+
+msgctxt "#31300"
+msgid "Current temperature"
+msgstr "Trenutna temperatura"
+
+msgctxt "#31301"
+msgid "Last updated"
+msgstr "Poslednji put ažurirano"
+
+msgctxt "#31303"
+msgid "Data provider"
+msgstr "Provajder podataka"
+
+msgctxt "#31307"
+msgid "Hide fanart"
+msgstr "Sakrij umetnost ljubitelja"
+
+msgctxt "#31308"
+msgid "Movie details"
+msgstr "Detalji filma"
+
+msgctxt "#31309"
+msgid "Memory used:"
+msgstr "Iskorišćenost memorije:"
+
+msgctxt "#31310"
+msgid "Track number"
+msgstr "Broj numere"
+
msgctxt "#31311"
msgid "Fanart image[CR][CR]Unavailable[CR][CR] Click button to set"
-msgstr "Zanimljiva slika[CR]nije dodeljena.[CR][CR]Kliknite na dugme da[CR]biste je dodelili."
+msgstr "Umetnost ljubitelja[CR][CR]Nije dostupna.[CR][CR]Kliknite na tater da biste je postavili."
+
+msgctxt "#31312"
+msgid "Current scraper"
+msgstr "Trenutni dobavljaÄ"
+
+msgctxt "#31313"
+msgid "Choose a scraper"
+msgstr "Izaberite dobavljaÄa"
+
+msgctxt "#31314"
+msgid "Content scanning options"
+msgstr "Opcije analiziranja sadržaja"
+
+msgctxt "#31317"
+msgid "Set fanart path"
+msgstr "Postavite putanju umetnosti ljubitelja"
+
+msgctxt "#31319"
+msgid "Selected profile"
+msgstr "Odabrani profil"
+
+msgctxt "#31320"
+msgid "Last logged in"
+msgstr "Poslednja prijava"
msgctxt "#31322"
msgid "Aired"
msgstr "Emitovano"
+msgctxt "#31325"
+msgid "Playlist options"
+msgstr "Opcije liste za reprodukciju"
+
msgctxt "#31326"
msgid "Created"
msgstr "Napravljeno"
@@ -176,9 +360,21 @@ msgctxt "#31327"
msgid "Resolution"
msgstr "Rezolucija"
+msgctxt "#31328"
+msgid "Recently added"
+msgstr "Nedavno dodato"
+
msgctxt "#31329"
msgid "[B]Timer set![/B] [COLOR=grey2] - System auto shutdown in[/COLOR]"
-msgstr "[B]Odbrojavanje je postavljeno![/B] [COLOR=grey2] - Sistem će se iskljuÄiti za[/COLOR]"
+msgstr "[B]Tajmer je postavljen![/B] [COLOR=grey2] - Sistem će se iskljuÄiti za[/COLOR]"
+
+msgctxt "#31330"
+msgid "Click button to play[CR][CR]movie trailer"
+msgstr "Kliknite na taster za reprodukciju[CR][CR]najave filma"
+
+msgctxt "#31331"
+msgid "Album details"
+msgstr "Detalji albuma"
msgctxt "#31351"
msgid "Pause"
@@ -188,6 +384,10 @@ msgctxt "#31352"
msgid "Stop"
msgstr "Zaustavi"
+msgctxt "#31353"
+msgid "Fast forward"
+msgstr "Premotaj unapred"
+
msgctxt "#31354"
msgid "Rewind"
msgstr "Premotaj unazad"
@@ -196,10 +396,18 @@ msgctxt "#31355"
msgid "Movie menu"
msgstr "Filmski meni"
+msgctxt "#31356"
+msgid "Download subtitles"
+msgstr "Preuzmi titlove"
+
msgctxt "#31360"
msgid "Watch as 2D"
msgstr "Gledaj kao 2D"
+msgctxt "#31361"
+msgid "Change mode"
+msgstr "Promeni režim"
+
msgctxt "#31362"
msgid "Enabled"
msgstr "Omogućeno"
@@ -208,29 +416,53 @@ msgctxt "#31390"
msgid "Skin default"
msgstr "Podrazumevana maska"
+msgctxt "#31391"
+msgid "Skin default with no caps"
+msgstr "Podrazumevana maska bez velikih slova"
+
msgctxt "#31392"
msgid "Arial based"
msgstr "Zasnovano na Arialu"
msgctxt "#31400"
msgid "[B]CONFIGURE APPEARANCE SETTINGS[/B][CR][CR]Change the skin · Set language and region · Change file listing options[CR]Set up a screensaver"
-msgstr "[B]KONFIGURISANjE POSTAVKI PRIKAZA[/B][CR][CR]Promenite masku · Izaberite jezik i oblast gde živite[CR]Promenite opcije izlistavanja datoteka · Izaberite Äuvara ekrana"
+msgstr "[B]PODESITE PODEÅ AVANJA PRIKAZA[/B][CR][CR]Promenite masku · Postavite jezik i regiju - Promenite opcije izlistavanja datoteka[CR]Postavite Äuvara ekrana"
msgctxt "#31401"
msgid "[B]CONFIGURE VIDEO SETTINGS[/B][CR][CR]Manage your video library · Set video playback options · Change video listing options[CR]Set subtitle fonts"
-msgstr "[B]KONFIGURISANjE POSTAVKI FILMOVA[/B][CR][CR]Upravljajte vašom bibliotekom filmova · Postavite opcije reprodukcije filmova[CR]Promenite opcije izlistavanja filmova · Postavite izgled slova u titlovima"
+msgstr "[B]PODESITE VIDEO PODEŠAVANJA[/B][CR][CR]Upravljajte vašom video bibliotekom · Postavite opcije video reprodukcije - Promenite opcije izlistavanja filmova[CR]Postavite slova titlova"
+
+msgctxt "#31403"
+msgid "[B]CONFIGURE PICTURE SETTINGS[/B][CR][CR]Set picture listing options · Configure slideshow"
+msgstr "[B]PODESITE PODEŠAVANJA SLIKA[/B][CR][CR]Postavite opcije izlistavanja slika · Podesite reprodukciju slajdova"
-msgctxt "#31402"
-msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission · Set karaoke options"
-msgstr "[B]KONFIGURISANjE POSTAVKI MUZIKE[/B][CR][CR]Upravljajte vaÅ¡om bibliotekom muziÄkih numera · Postavite opcije reprod. muzike[CR]Promenite opcije izlistavanja muzike · Postavite slanje pesama[CR]Postavite karaoke opcije"
+msgctxt "#31404"
+msgid "[B]CONFIGURE WEATHER SETTINGS[/B][CR][CR]Set various cities to collect weather information"
+msgstr "[B]PODESITE PODEÅ AVANJA VREMENSKE PROGNOZE[/B][CR][CR]Postavite razliÄite gradove za prikupljanje informacija o vremenskim prilikama"
msgctxt "#31406"
msgid "[B]CONFIGURE SYSTEM SETTINGS[/B][CR][CR]Setup and calibrate displays · Configure audio output · Setup remote controls[CR]Set power saving options · Enable debugging · Setup master lock"
-msgstr "[B]KONFIGURISANjE POSTAVKI SISTEMA[/B][CR][CR]Podesite i kalibriÅ¡ite ekrane · KonfiguriÅ¡ite zvuÄni izlaz[CR]Podesite daljinsko upravljanje · Postavite opcije Å¡tednje energije[CR]Omogućite evidenciju greÅ¡aka · Podesite glavnu lozinku"
+msgstr "[B]PODESITE PODEÅ AVANJA SISTEMA[/B][CR][CR]Podesite i kalibriÅ¡ite ekrane · Podesite zvuÄni izlaz - Podesite daljinsko upravljanje[CR]Postavite opcije uÅ¡tede energije - Omogućite evidenciju greÅ¡aka · Podesite glavnu lozinku"
+
+msgctxt "#31408"
+msgid "[B]CONFIGURE ADD-ONS[/B][CR][CR]Manage your installed add-ons · Browse for and install add-ons from kodi.tv[CR]Modify add-on settings"
+msgstr "[B]PODESITE DODATNE PROGRAME[/B][CR][CR]Upravljajte vašim instaliranim dodatnim programima · Potražite i instalirajte dodatne programe sa kodi.tv[CR]Podesite podešavanja dodatnih programa"
msgctxt "#31409"
msgid "[B]CONFIGURE TV SETTINGS[/B][CR][CR]Change full screen info · Manage EPG data settings"
-msgstr "[B]KONFIGURISANJE TV POSTAVKI[/B][CR][CR]Promenite informacije cielog ekrana · Upravljajte postavkama podataka elektronskog programskog vodiÄa (EPG) "
+msgstr "[B]PODESITE TV PODEŠAVANJA[/B][CR][CR]Promenite informacije celog ekrana · Upravljajte podešavanjima EPG podataka "
+
+msgctxt "#31410"
+msgid "[B]CONFIGURE SERVICE SETTINGS[/B][CR][CR]Setup control of Kodi via UPnP and HTTP · Configure file sharing[CR]Enable Zeroconf · Configure AirPlay"
+msgstr "[B]PODESITE PODEŠAVANJA SERVISA[/B][CR][CR]Podesite kontrolu Kodija putem UPnP i HTTP · Podesite deljenje datoteka[CR]Omogućite Zeroconf - Podesite AirPlay"
+
+msgctxt "#31411"
+msgid "First run help..."
+msgstr "Pomoć kod prvog pokretanja...."
+
+msgctxt "#31412"
+msgid "This tab signifies that there is a menu off to the side of this window that contains extra options for this section. To access the menu, navigate to the left with your remote control or keyboard or place your mouse pointer over the tab. [CR][CR]Click \"OK\" to close this dialogue. It will not appear again."
+msgstr "Ovaj tab pokazuje da postoji meni sa strane ovog prozora koji sadrži dodatne opcije za ovaj odeljak. Da bi pristupili ovom meniju, idite na levu stranu vaÅ¡im daljinskim upravljaÄem ili tastaturom ili postavite pointer miÅ¡a preko taba. [CR][CR]Kliknite na \"U redu\" da bi zatvorili ovaj dijalog. Neće se pojaviti ponovo."
msgctxt "#31413"
msgid "Local subtitle available"
@@ -240,6 +472,10 @@ msgctxt "#31420"
msgid "Login"
msgstr "Prijava"
+msgctxt "#31421"
+msgid "Select your Kodi user profile[CR]to login and continue"
+msgstr "Izaberite vaÅ¡ Kodi korisniÄki profil[CR]za prijavu, a potom nastavite dalje"
+
msgctxt "#31422"
msgid "Show or hide the login screen at startup."
msgstr "Prikaži ili sakrij ekran za prijavu pri pokretanju"
@@ -248,29 +484,77 @@ msgctxt "#31423"
msgid "Select the profile that will be used at startup when the login screen is disabled."
msgstr "Izaberite profil koji će se koristiti prilikom pokretanja kada je ekran za prijavu onemogućen"
+msgctxt "#31501"
+msgid "Scheduled time"
+msgstr "Zakazano vreme"
+
msgctxt "#31502"
msgid "TV"
msgstr "TV"
+msgctxt "#31503"
+msgid "Add group"
+msgstr "Dodaj grupu"
+
+msgctxt "#31504"
+msgid "Rename group"
+msgstr "Preimenuj grupu"
+
+msgctxt "#31505"
+msgid "Delete group"
+msgstr "Izbriši grupu"
+
msgctxt "#31506"
msgid "Available[CR]Groups"
msgstr "Dostupne[CR]grupe"
+msgctxt "#31509"
+msgid "Channel group"
+msgstr "Grupa kanala"
+
+msgctxt "#31510"
+msgid "Timer set"
+msgstr "Tajmer podešen"
+
+msgctxt "#31511"
+msgid "Channel options"
+msgstr "Opcije kanala"
+
+msgctxt "#31901"
+msgid "36-hour forecast"
+msgstr "Prognoza za 36 Äasova"
+
+msgctxt "#31902"
+msgid "Hourly forecast"
+msgstr "ÄŒasovna prognoza"
+
+msgctxt "#31903"
+msgid "Weekend forecast"
+msgstr "Prognoza za vikend"
+
+msgctxt "#31904"
+msgid "Daily forecast"
+msgstr "Dnevna prognoza"
+
msgctxt "#31905"
msgid "Forecast"
msgstr "Prognoza"
+msgctxt "#31908"
+msgid "Chance of precipitation"
+msgstr "Moguće padavine"
+
msgctxt "#31909"
msgid "Fetching forecast info..."
-msgstr "Dobavljanje informacija o prognozi..."
+msgstr "Preuzimanje podataka prognoze..."
msgctxt "#31910"
msgid "Maps"
-msgstr "Karta"
+msgstr "Mape"
msgctxt "#31950"
msgid "WEATHER"
-msgstr "VREME"
+msgstr "VREMENSKA PROGNOZA"
msgctxt "#31951"
msgid "PICTURES"
@@ -282,7 +566,7 @@ msgstr "TV"
msgctxt "#31953"
msgid "VIDEOS"
-msgstr "VIDEO"
+msgstr "VIDEO MATERIJAL"
msgctxt "#31954"
msgid "MOVIES"
diff --git a/addons/skin.confluence/language/resource.language.sv_se/strings.po b/addons/skin.confluence/language/resource.language.sv_se/strings.po
index 4038659b94..c22bbf2eb4 100644
--- a/addons/skin.confluence/language/resource.language.sv_se/strings.po
+++ b/addons/skin.confluence/language/resource.language.sv_se/strings.po
@@ -68,10 +68,22 @@ msgctxt "#31027"
msgid "Location"
msgstr "Plats"
+msgctxt "#31028"
+msgid "Poster wrap"
+msgstr "Omslagssvep"
+
msgctxt "#31029"
msgid "Fanart"
msgstr "Fanart"
+msgctxt "#31031"
+msgid "Pic thumbs"
+msgstr "Bildminiatyrer"
+
+msgctxt "#31032"
+msgid "Image wrap"
+msgstr "Bildsvep"
+
msgctxt "#31033"
msgid "Info"
msgstr "Info"
@@ -104,6 +116,10 @@ msgctxt "#31046"
msgid "SEEKING"
msgstr "SÖKER"
+msgctxt "#31048"
+msgid "Visualisation presets"
+msgstr "Visualiseringsval"
+
msgctxt "#31049"
msgid "End time"
msgstr "Sluttid"
@@ -164,6 +180,10 @@ msgctxt "#31106"
msgid "Miscellaneous options"
msgstr "Övriga alternativ"
+msgctxt "#31107"
+msgid "Hide flagging read from video filenames [COLOR=grey3](e.g. Blu-ray, HD-DVD)[/COLOR]"
+msgstr "Dölj flaggläsning från videofilnamn [COLOR=grey3](Blu-ray, HD-DVD)[/COLOR]"
+
msgctxt "#31108"
msgid "Hide main menu buttons"
msgstr "Dölj huvudmenyknappar"
@@ -192,6 +212,10 @@ msgctxt "#31117"
msgid "Show recently added videos"
msgstr "Visa nyligen tillagda videos"
+msgctxt "#31118"
+msgid "Home page programs submenu"
+msgstr "Hemskärmens \"program\"-undermeny"
+
msgctxt "#31119"
msgid "Hide background fanart"
msgstr "Dölj bakgrundsfanart"
@@ -204,22 +228,30 @@ msgctxt "#31125"
msgid "Show background \"Now playing\" visualisation"
msgstr "Visa \"Spelas nu\" backgrundsvisualisering"
-msgctxt "#31126"
-msgid "Play TV theme songs in video library (TvTunes add-on)"
-msgstr "Spela TV-temasånger i videobiblioteket (TVTunes-tillägg)"
-
-msgctxt "#31127"
-msgid "TvTunes"
-msgstr "TvTunes"
-
msgctxt "#31128"
msgid "Lyrics"
msgstr "SÃ¥ngtexter"
+msgctxt "#31129"
+msgid "Hide fanart in full screen visualisation"
+msgstr "Dölj fanart i fullskärmsvisualisering"
+
msgctxt "#31132"
msgid "Lyrics add-on"
msgstr "Sångtextstillägg"
+msgctxt "#31134"
+msgid "Home page \"Videos\" submenu"
+msgstr "Hemskärmens \"video\"-undermeny"
+
+msgctxt "#31135"
+msgid "Home page \"Music\" submenu"
+msgstr "Hemskärmens \"musik\"-undermeny"
+
+msgctxt "#31136"
+msgid "Home page \"Pictures\" submenu"
+msgstr "Hemskärmens \"bilder\"-undermeny"
+
msgctxt "#31140"
msgid "Music OSD"
msgstr "Musik-OSD"
@@ -268,6 +300,10 @@ msgctxt "#31303"
msgid "Data provider"
msgstr "Dataleverantör"
+msgctxt "#31307"
+msgid "Hide fanart"
+msgstr "Dölj fanart"
+
msgctxt "#31308"
msgid "Movie details"
msgstr "Filmdetaljer"
@@ -308,10 +344,6 @@ msgctxt "#31320"
msgid "Last logged in"
msgstr "Senast inloggad"
-msgctxt "#31321"
-msgid "Karaoke song selector"
-msgstr "Låtväljare för kareoke"
-
msgctxt "#31322"
msgid "Aired"
msgstr "Sänt"
@@ -384,6 +416,10 @@ msgctxt "#31390"
msgid "Skin default"
msgstr "Skalets standard"
+msgctxt "#31391"
+msgid "Skin default with no caps"
+msgstr "Skalets standard utan VERSALER"
+
msgctxt "#31392"
msgid "Arial based"
msgstr "Arialbaserad"
@@ -396,14 +432,22 @@ msgctxt "#31401"
msgid "[B]CONFIGURE VIDEO SETTINGS[/B][CR][CR]Manage your video library · Set video playback options · Change video listing options[CR]Set subtitle fonts"
msgstr "[B]KONFIGURERA GRAFIKINSTÄLLNINGAR[/B][CR][CR]Hantera ditt filmbibliotek · Ange filmuppspelningsalternativ[CR]Ändra videoförteckningsalternativ · Konfigurera undertexttypsnitt"
-msgctxt "#31402"
-msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission · Set karaoke options"
-msgstr "[B]KONFIGURERA MUSIKINSTÄLLNINGAR[/B][CR][CR]Hantera ditt musikbibliotek · Ange musikuppspelningsalternativ[CR]Ändra musiklistningsalternativ · Ange låtinskickning · Ange karaoke-alternativ"
+msgctxt "#31403"
+msgid "[B]CONFIGURE PICTURE SETTINGS[/B][CR][CR]Set picture listing options · Configure slideshow"
+msgstr "[B]KONFIGURERA BILDINSTÄLLNINGAR[/B][CR][CR]Ange bildlistningsalternativ · Justera bildspel"
+
+msgctxt "#31404"
+msgid "[B]CONFIGURE WEATHER SETTINGS[/B][CR][CR]Set various cities to collect weather information"
+msgstr "[B]KONFIGURERA VÄDERINSTÄLLNINGAR[/B][CR][CR]Ange tre städer för insamling av väderinformation"
msgctxt "#31406"
msgid "[B]CONFIGURE SYSTEM SETTINGS[/B][CR][CR]Setup and calibrate displays · Configure audio output · Setup remote controls[CR]Set power saving options · Enable debugging · Setup master lock"
msgstr "[B]KONFIGURERA SYSTEMINSTÄLLNINGAR[/B][CR][CR]Ange och kalibrera bildskärmar · Konfigurera ljudutgång · Ställa in fjärrkontroller[CR]Ange energisparalternativ · Aktivera debuggningen · Konfigurera huvudkod och lås"
+msgctxt "#31408"
+msgid "[B]CONFIGURE ADD-ONS[/B][CR][CR]Manage your installed add-ons · Browse for and install add-ons from kodi.tv[CR]Modify add-on settings"
+msgstr "[B]KONFIGURERA TILLÄGG[/B][CR][CR]Hantera installerade tillägg · Visa och installera tillägg från kodi.tv[CR]Ändra inställningar för tillägg"
+
msgctxt "#31409"
msgid "[B]CONFIGURE TV SETTINGS[/B][CR][CR]Change full screen info · Manage EPG data settings"
msgstr "[B]KONFIGURERA TV-INSTÄLLNINGAR[/B][CR][CR]Ändra fullskärmslägesinformation · Hantera EPG-datainställningar"
@@ -416,6 +460,10 @@ msgctxt "#31411"
msgid "First run help..."
msgstr "Förstagångshjälp"
+msgctxt "#31412"
+msgid "This tab signifies that there is a menu off to the side of this window that contains extra options for this section. To access the menu, navigate to the left with your remote control or keyboard or place your mouse pointer over the tab. [CR][CR]Click \"OK\" to close this dialogue. It will not appear again."
+msgstr "Denna flik visar att det finns en meny till sidan om detta fönster som innehåller extra inställningar för denna sektion. För att nå menyn, navigera till vänster med din fjärrkontroll eller tangentbord eller placera din mus ovanför fliken. [CR][CR]Klicka på \"OK\" för att stänga denna dialogruta. Den kommer inte att visas igen."
+
msgctxt "#31413"
msgid "Local subtitle available"
msgstr "Lokal undertext tillgänglig"
@@ -460,6 +508,14 @@ msgctxt "#31506"
msgid "Available[CR]Groups"
msgstr "Tillgängliga[CR]grupper"
+msgctxt "#31509"
+msgid "Channel group"
+msgstr "Kanalgrupp"
+
+msgctxt "#31510"
+msgid "Timer set"
+msgstr "Timer satt"
+
msgctxt "#31511"
msgid "Channel options"
msgstr "Kanalalternativ"
@@ -484,6 +540,10 @@ msgctxt "#31905"
msgid "Forecast"
msgstr "Prognos"
+msgctxt "#31908"
+msgid "Chance of precipitation"
+msgstr "Chans för nederbörd"
+
msgctxt "#31909"
msgid "Fetching forecast info..."
msgstr "Hämtar prognosinfo..."
diff --git a/addons/skin.confluence/language/resource.language.szl/strings.po b/addons/skin.confluence/language/resource.language.szl/strings.po
index 72e39f9eea..cccc819ff1 100644
--- a/addons/skin.confluence/language/resource.language.szl/strings.po
+++ b/addons/skin.confluence/language/resource.language.szl/strings.po
@@ -228,14 +228,6 @@ msgctxt "#31125"
msgid "Show background \"Now playing\" visualisation"
msgstr "PokÅż prawie przegrywanõ wizualizacyjõ na zadku"
-msgctxt "#31126"
-msgid "Play TV theme songs in video library (TvTunes add-on)"
-msgstr "Grej Å›piywki ze programÅw TV we bibliÅtyce wideo (przidÅwka TvTunes)"
-
-msgctxt "#31127"
-msgid "TvTunes"
-msgstr "TvTunes"
-
msgctxt "#31128"
msgid "Lyrics"
msgstr "Teksty śpiywek"
@@ -352,10 +344,6 @@ msgctxt "#31320"
msgid "Last logged in"
msgstr "Ôstatnie logowaniy"
-msgctxt "#31321"
-msgid "Karaoke song selector"
-msgstr "ÔbiyrÅcz Å›piywek karaoke"
-
msgctxt "#31322"
msgid "Aired"
msgstr "EmisyjÅ"
@@ -444,10 +432,6 @@ msgctxt "#31401"
msgid "[B]CONFIGURE VIDEO SETTINGS[/B][CR][CR]Manage your video library · Set video playback options · Change video listing options[CR]Set subtitle fonts"
msgstr "[B]KÅŒNFIGURUJ NASZTALOWANIA WIDEO[/B][CR][CR]Biblioteka wideo · Ôdgrywaniy · Lista wideo · CzciÅnka napisÅw"
-msgctxt "#31402"
-msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission · Set karaoke options"
-msgstr "[B]KŌNFIGURUJ NASZTALOWANIA MUZYKI[/B][CR][CR]Biblioteka muzyki · Ôdgrywaniy · Lista śpiywek · PublikacyjŠśpiywek · Ôpcyje karaoke"
-
msgctxt "#31403"
msgid "[B]CONFIGURE PICTURE SETTINGS[/B][CR][CR]Set picture listing options · Configure slideshow"
msgstr "[B]KÅŒNFIGURUJ NASZTALOWANIA BILDÅŒW[/B][CR][CR]Lista bildÅw · PrezyntacyjÅ"
diff --git a/addons/skin.confluence/language/resource.language.ta_in/strings.po b/addons/skin.confluence/language/resource.language.ta_in/strings.po
index dcd785c502..e0016d26b4 100644
--- a/addons/skin.confluence/language/resource.language.ta_in/strings.po
+++ b/addons/skin.confluence/language/resource.language.ta_in/strings.po
@@ -124,10 +124,6 @@ msgctxt "#31112"
msgid "Options"
msgstr "விரà¯à®ªà¯à®ªà®™à¯à®•à®³à¯"
-msgctxt "#31127"
-msgid "TvTunes"
-msgstr "தொலைராகஙà¯à®•à®³à¯"
-
msgctxt "#31128"
msgid "Lyrics"
msgstr "பாடலà¯à®µà®°à®¿à®•à®³à¯"
@@ -180,10 +176,6 @@ msgctxt "#31401"
msgid "[B]CONFIGURE VIDEO SETTINGS[/B][CR][CR]Manage your video library · Set video playback options · Change video listing options[CR]Set subtitle fonts"
msgstr "[B]நிகழà¯à®ªà®Ÿà®®à¯ அமைபà¯à®ªà¯à®•à®³à¯ கடà¯à®Ÿà®®à¯ˆà®ªà¯à®ªà¯[/B][CR][CR]உஙà¯à®•à®³à¯ வீடியோ நூலக மேலாணà¯à®®à¯ˆ · வீடியோ பினà¯à®©à®£à®¿ விரà¯à®ªà¯à®ªà®™à¯à®•à®³à¯ˆ அமைகà¯à®• · வீடியோ படà¯à®Ÿà®¿à®¯à®²à¯ விரà¯à®ªà¯à®ªà®™à¯à®•à®³à¯ˆ மாறà¯à®±[CR]வசன எழà¯à®¤à¯à®¤à¯à®°à¯à®•à¯à®•à®³à¯ˆ அமைகà¯à®•"
-msgctxt "#31402"
-msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission · Set karaoke options"
-msgstr "[B]இசை அமைபà¯à®ªà¯à®•à®³à¯ கடà¯à®Ÿà®®à¯ˆà®ªà¯à®ªà¯[/B][CR][CR]உஙà¯à®•à®³à¯ இசை நூலகம௠நிரà¯à®µà®•à®¿à®•à¯à®• · இசை பினà¯à®©à®£à®¿ விரà¯à®ªà¯à®ªà®™à¯à®•à®³à¯ˆ அமைகà¯à®• · இசை படà¯à®Ÿà®¿à®¯à®²à¯ விரà¯à®ªà¯à®ªà®™à¯à®•à®³à¯ˆ மாறà¯à®±[CR]சமரà¯à®ªà¯à®ªà®¿à®ªà¯à®ªà¯ பாடல௠அமைபà¯à®ªà¯ · கரோகà¯à®•à¯‡ விரà¯à®ªà¯à®ªà®™à¯à®•à®³à¯ அமைகà¯à®•"
-
msgctxt "#31406"
msgid "[B]CONFIGURE SYSTEM SETTINGS[/B][CR][CR]Setup and calibrate displays · Configure audio output · Setup remote controls[CR]Set power saving options · Enable debugging · Setup master lock"
msgstr "[B]கணினி அமைபà¯à®ªà¯à®•à®³à¯ கடà¯à®Ÿà®®à¯ˆà®ªà¯à®ªà¯[/B][CR][CR]காடà¯à®šà®¿à®•à®³à¯ˆ அமைபà¯à®ªà®¤à¯ மறà¯à®±à¯à®®à¯ அளவீட௠· ஆடியோ வெளியீட௠கடà¯à®Ÿà®®à¯ˆà®•à¯à®• · ரிமோட௠கணà¯à®Ÿà¯à®°à¯‡à®¾à®²à¯à®•à®³à¯ அமைபà¯à®ªà®¤à®±à¯à®•à¯[CR]மின௠ஆறà¯à®±à®²à¯ சேமிபà¯à®ªà¯ விரà¯à®ªà¯à®ªà®™à¯à®•à®³à¯ அமைகà¯à®• · பிழைதà¯à®¤à®¿à®°à¯à®¤à¯à®¤à®®à¯ செயலà¯à®ªà®Ÿà¯à®¤à¯à®¤ · மாஸà¯à®Ÿà®°à¯ பூடà¯à®Ÿà¯ அமைபà¯à®ªà¯"
diff --git a/addons/skin.confluence/language/resource.language.tg_tj/strings.po b/addons/skin.confluence/language/resource.language.tg_tj/strings.po
index 7ebcdff319..7e4ba2c1e7 100644
--- a/addons/skin.confluence/language/resource.language.tg_tj/strings.po
+++ b/addons/skin.confluence/language/resource.language.tg_tj/strings.po
@@ -144,14 +144,6 @@ msgctxt "#31112"
msgid "Options"
msgstr "Имконот"
-msgctxt "#31126"
-msgid "Play TV theme songs in video library (TvTunes add-on)"
-msgstr "Пахш кардани Ñуруди мавзӯи телевизионӣ дар китобхонаи видеоӣ (Барномаи иловагии TvTunes)"
-
-msgctxt "#31127"
-msgid "TvTunes"
-msgstr "TvTunes"
-
msgctxt "#31128"
msgid "Lyrics"
msgstr "Лирика"
@@ -244,10 +236,6 @@ msgctxt "#31401"
msgid "[B]CONFIGURE VIDEO SETTINGS[/B][CR][CR]Manage your video library · Set video playback options · Change video listing options[CR]Set subtitle fonts"
msgstr "[B]ТÐÐЗИМОТИ ПÐРÐМЕТРҲОИ ВИДЕО[/B][CR][CR]Идоракунии китобхонаи видеоӣ • Имконоти пахши видео[CR]Тағйир додани имконоти рӯйхати видеоҳо • Танзимоти шрифтҳои зерунвон"
-msgctxt "#31402"
-msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission · Set karaoke options"
-msgstr "[B]ТÐÐЗИМОТИ ПÐРÐМЕТРҲОИ МУСИҚӢ[/B][CR][CR]Идоракунии китобхонаи муÑиқӣ · Имконоти пахши муÑиқӣ · Тағйир додани имконоти рӯйхати муÑиқӣ[CR]Танзими иловакунии муÑиқӣ · Танзими имконоти караоке"
-
msgctxt "#31406"
msgid "[B]CONFIGURE SYSTEM SETTINGS[/B][CR][CR]Setup and calibrate displays · Configure audio output · Setup remote controls[CR]Set power saving options · Enable debugging · Setup master lock"
msgstr "[B]ТÐÐЗИМОТИ ПÐРÐМЕТРҲОИ СИСТЕМÐ[/B][CR][CR]Танзимот ва Ñанҷиши диÑплейҳо · Танзимоти барориши аудио · Танзимоти идоракунии дурдаÑÑ‚[CR]Танзимоти маÑрафи барқ · Танзимоти иÑлоҳи хатоҳо · Танзимоти қулфкунӣ"
diff --git a/addons/skin.confluence/language/resource.language.th_th/strings.po b/addons/skin.confluence/language/resource.language.th_th/strings.po
index bb80b84c7b..ddd452ec41 100644
--- a/addons/skin.confluence/language/resource.language.th_th/strings.po
+++ b/addons/skin.confluence/language/resource.language.th_th/strings.po
@@ -16,10 +16,22 @@ msgstr ""
"Language: th_TH\n"
"Plural-Forms: nplurals=1; plural=0;\n"
+msgctxt "#31000"
+msgid "Change your"
+msgstr "ปรับเปลี่ยน"
+
+msgctxt "#31003"
+msgid "Power options"
+msgstr "ตัวเลือà¸à¸”้านพลังงาน"
+
msgctxt "#31004"
msgid "Working..."
msgstr "ทำงานอยู่..."
+msgctxt "#31005"
+msgid "Hide information"
+msgstr "ซ่อนรายละเอียดข้อมูล"
+
msgctxt "#31006"
msgid "View options"
msgstr "ตัวเลือà¸à¸à¸²à¸£à¸”ู"
@@ -28,6 +40,10 @@ msgctxt "#31008"
msgid "Full screen"
msgstr "เต็มจอ"
+msgctxt "#31009"
+msgid "Total duration"
+msgstr "รวมระยะเวลา"
+
msgctxt "#31022"
msgid "Music - Files"
msgstr "à¹à¸Ÿà¹‰à¸¡-เพลง"
@@ -44,14 +60,30 @@ msgctxt "#31025"
msgid "Items"
msgstr "รายà¸à¸²à¸£"
+msgctxt "#31026"
+msgid "Misc options"
+msgstr "ตัวเลือà¸à¸­à¸·à¹ˆà¸™à¹†"
+
msgctxt "#31027"
msgid "Location"
msgstr "ที่ตั้ง"
+msgctxt "#31028"
+msgid "Poster wrap"
+msgstr "ย่อโปสเตอร์"
+
msgctxt "#31029"
msgid "Fanart"
msgstr "à¹à¸Ÿà¸™à¸­à¸²à¸£à¹Œà¸•"
+msgctxt "#31031"
+msgid "Pic thumbs"
+msgstr "รูปย่อของภาพ"
+
+msgctxt "#31032"
+msgid "Image wrap"
+msgstr "ย่อส่วนภาพ"
+
msgctxt "#31033"
msgid "Info"
msgstr "ข้อมูล"
@@ -60,6 +92,10 @@ msgctxt "#31039"
msgid "Actions"
msgstr "à¸à¸²à¸£à¸à¸£à¸°à¸—ำ"
+msgctxt "#31040"
+msgid "Now playing"
+msgstr "ขณะนี้à¸à¸³à¸¥à¸±à¸‡à¹€à¸¥à¹ˆà¸™"
+
msgctxt "#31042"
msgid "PLAYING"
msgstr "à¸à¸³à¸¥à¸±à¸‡à¹€à¸¥à¹ˆà¸™"
@@ -80,6 +116,10 @@ msgctxt "#31046"
msgid "SEEKING"
msgstr "ค้นหา"
+msgctxt "#31048"
+msgid "Visualisation presets"
+msgstr "ชุดรูปà¹à¸šà¸šà¸à¸²à¸£à¹à¸ªà¸”งà¹à¸ªà¸‡à¸ªà¸µ"
+
msgctxt "#31049"
msgid "End time"
msgstr "เวลาสิ้นสุด"
@@ -116,6 +156,10 @@ msgctxt "#31060"
msgid "This file is stacked, select the part you want to play from."
msgstr "à¹à¸Ÿà¹‰à¸¡à¸™à¸µà¹‰à¸‹à¹‰à¸­à¸™à¸à¸±à¸™à¸­à¸¢à¸¹à¹ˆà¹€à¸¥à¸·à¸­à¸à¸ªà¹ˆà¸§à¸™à¸—ี่คุณต้องà¸à¸²à¸£à¸ˆà¸°à¹€à¸¥à¹ˆà¸™à¸ˆà¸²à¸"
+msgctxt "#31061"
+msgid "Current selected"
+msgstr "ที่เลือà¸à¹ƒà¸™à¸›à¸±à¸ˆà¸ˆà¸¸à¸šà¸±à¸™"
+
msgctxt "#31101"
msgid "Home screen options"
msgstr "ตัวเลือภหน้าจอหลัà¸"
@@ -124,10 +168,26 @@ msgctxt "#31102"
msgid "Background"
msgstr "พื้นหลัง"
+msgctxt "#31103"
+msgid "Show \"Paused\" in picture slideshow"
+msgstr "à¹à¸ªà¸”ง \"หยุดชั่วขณะ\" ในà¸à¸²à¸£à¸™à¸³à¹€à¸ªà¸™à¸­à¸ à¸²à¸žà¸™à¸´à¹ˆà¸‡"
+
+msgctxt "#31104"
+msgid "Play trailers in a window [COLOR=grey3](Video information dialogue only)[/COLOR]"
+msgstr "เล่นตัวอย่างภาพยนตร์ในหน้าต่าง [COLOR=grey3](à¸à¸¥à¹ˆà¸­à¸‡à¹‚ต้ตอบข้อมูลวิดีโอเท่านั้น)[/COLOR]"
+
msgctxt "#31106"
msgid "Miscellaneous options"
msgstr "ตัวเลือภอื่นๆ"
+msgctxt "#31107"
+msgid "Hide flagging read from video filenames [COLOR=grey3](e.g. Blu-ray, HD-DVD)[/COLOR]"
+msgstr "ซ่อนป้ายà¸à¸³à¸à¸±à¸š ที่อ่านได้จาà¸à¸Šà¸·à¹ˆà¸­à¹à¸Ÿà¹‰à¸¡à¸§à¸´à¸”ีโอ [COLOR=grey3](Blu-ray, HD-DVD)[/COLOR]"
+
+msgctxt "#31108"
+msgid "Hide main menu buttons"
+msgstr "ซ่อนปุ่มเมนูหลัà¸"
+
msgctxt "#31109"
msgid "Enable custom background"
msgstr "เปิดใช้งานปรับà¹à¸•à¹ˆà¸‡à¸žà¸·à¹‰à¸™à¸«à¸¥à¸±à¸‡"
@@ -144,18 +204,54 @@ msgctxt "#31112"
msgid "Options"
msgstr "ตัวเลือà¸"
-msgctxt "#31126"
-msgid "Play TV theme songs in video library (TvTunes add-on)"
-msgstr "เล่นเพลงธีมรายà¸à¸²à¸£à¸—ีวีในคลังข้อมูลวิดีโอ (ส่วนเสริม TvTunes)"
+msgctxt "#31116"
+msgid "Show recently added albums"
+msgstr "à¹à¸ªà¸”งอัลบัมที่เพิ่งเพิ่ม"
+
+msgctxt "#31117"
+msgid "Show recently added videos"
+msgstr "à¹à¸ªà¸”งวิดีโอที่เพิ่งเพิ่ม"
+
+msgctxt "#31118"
+msgid "Home page programs submenu"
+msgstr "หน้าหลัภเมนูย่อยโปรà¹à¸à¸£à¸¡"
-msgctxt "#31127"
-msgid "TvTunes"
-msgstr "TvTunes"
+msgctxt "#31119"
+msgid "Hide background fanart"
+msgstr "ซ่อนพื้นหลังà¹à¸Ÿà¸™à¸­à¸²à¸£à¹Œà¸•"
+
+msgctxt "#31124"
+msgid "Show background \"Now playing\" video"
+msgstr "à¹à¸ªà¸”งพื้นหลังวิดีโอ \"ที่à¸à¸³à¸¥à¸±à¸‡à¹€à¸¥à¹ˆà¸™\""
+
+msgctxt "#31125"
+msgid "Show background \"Now playing\" visualisation"
+msgstr "à¹à¸ªà¸”งพื้นหลังà¹à¸ªà¸‡à¸ªà¸µà¸›à¸£à¸°à¸à¸­à¸šà¹€à¸žà¸¥à¸‡ \"ที่à¸à¸³à¸¥à¸±à¸‡à¹€à¸¥à¹ˆà¸™\""
msgctxt "#31128"
msgid "Lyrics"
msgstr "เนื้อเพลง"
+msgctxt "#31129"
+msgid "Hide fanart in full screen visualisation"
+msgstr "ซ่อนà¹à¸Ÿà¸™à¸­à¸²à¸£à¹Œà¸•à¹ƒà¸™à¸à¸²à¸£à¹à¸ªà¸”งà¹à¸ªà¸‡à¸ªà¸µà¹à¸šà¸šà¹€à¸•à¹‡à¸¡à¸ˆà¸­"
+
+msgctxt "#31132"
+msgid "Lyrics add-on"
+msgstr "ส่วนเสริมเนื้อเพลง"
+
+msgctxt "#31134"
+msgid "Home page \"Videos\" submenu"
+msgstr "หน้าหลัภเมนูย่อย \"วิดีโอ\""
+
+msgctxt "#31135"
+msgid "Home page \"Music\" submenu"
+msgstr "หน้าหลัภเมนูย่อย \"เพลง\""
+
+msgctxt "#31136"
+msgid "Home page \"Pictures\" submenu"
+msgstr "หน้าหลัภเมนูย่อย \"รูปภาพ\""
+
msgctxt "#31140"
msgid "Music OSD"
msgstr "OSD เพลง"
@@ -172,22 +268,90 @@ msgctxt "#31200"
msgid "Shortcuts"
msgstr "ปุ่มลัด"
+msgctxt "#31203"
+msgid "Choose your song"
+msgstr "เลือà¸à¹€à¸žà¸¥à¸‡à¸‚องคุณ"
+
+msgctxt "#31205"
+msgid "Lyrics source"
+msgstr "à¹à¸«à¸¥à¹ˆà¸‡à¹€à¸™à¸·à¹‰à¸­à¹€à¸žà¸¥à¸‡"
+
msgctxt "#31206"
msgid "Found"
msgstr "ค้นพบ"
+msgctxt "#31207"
+msgid "Find more items"
+msgstr "ค้นหารายà¸à¸²à¸£à¹€à¸žà¸´à¹ˆà¸¡à¹€à¸•à¸´à¸¡"
+
+msgctxt "#31208"
+msgid "Upcoming episodes"
+msgstr "ตอนที่à¸à¸³à¸¥à¸±à¸‡à¸ˆà¸°à¸¡à¸²"
+
+msgctxt "#31300"
+msgid "Current temperature"
+msgstr "อุณหภูมิปัจจุบัน"
+
+msgctxt "#31301"
+msgid "Last updated"
+msgstr "ปรับปรุงล่าสุด"
+
msgctxt "#31303"
msgid "Data provider"
msgstr "ผู้ให้บริà¸à¸²à¸£à¸‚้อมูล"
+msgctxt "#31307"
+msgid "Hide fanart"
+msgstr "ซ่อนà¹à¸Ÿà¸™à¸­à¸²à¸£à¹Œà¸•"
+
+msgctxt "#31308"
+msgid "Movie details"
+msgstr "รายละเอียดภาพยนตร์"
+
+msgctxt "#31309"
+msgid "Memory used:"
+msgstr "หน่วยความจำที่ใช้:"
+
+msgctxt "#31310"
+msgid "Track number"
+msgstr "หมายเลขà¹à¸—รค"
+
msgctxt "#31311"
msgid "Fanart image[CR][CR]Unavailable[CR][CR] Click button to set"
msgstr "รูปภาพà¹à¸Ÿà¸™à¸­à¸²à¸£à¹Œà¸•[CR][CR]ไม่มี[CR][CR] คลิà¸à¸›à¸¸à¹ˆà¸¡à¹€à¸žà¸·à¹ˆà¸­à¸•à¸±à¹‰à¸‡à¸„่า"
+msgctxt "#31312"
+msgid "Current scraper"
+msgstr "ตัวดึงข้อมูลปัจจุบัน"
+
+msgctxt "#31313"
+msgid "Choose a scraper"
+msgstr "เลือà¸à¸•à¸±à¸§à¸”ึงข้อมูล"
+
+msgctxt "#31314"
+msgid "Content scanning options"
+msgstr "ตัวเลือà¸à¸à¸²à¸£à¸ªà¸·à¸šà¸„้นเนื้อหา"
+
+msgctxt "#31317"
+msgid "Set fanart path"
+msgstr "à¸à¸³à¸«à¸™à¸”เส้นทางของà¹à¸Ÿà¸™à¸­à¸²à¸£à¹Œà¸•"
+
+msgctxt "#31319"
+msgid "Selected profile"
+msgstr "โปรไฟล์ที่เลือà¸"
+
+msgctxt "#31320"
+msgid "Last logged in"
+msgstr "เข้าระบบล่าสุด"
+
msgctxt "#31322"
msgid "Aired"
msgstr "ออà¸à¸­à¸²à¸à¸²à¸¨"
+msgctxt "#31325"
+msgid "Playlist options"
+msgstr "ตัวเลือà¸à¸‚องรายà¸à¸²à¸£à¹€à¸¥à¹ˆà¸™"
+
msgctxt "#31326"
msgid "Created"
msgstr "สร้างเมื่อ"
@@ -196,10 +360,22 @@ msgctxt "#31327"
msgid "Resolution"
msgstr "ความละเอียดจอ"
+msgctxt "#31328"
+msgid "Recently added"
+msgstr "ที่เพิ่งเพิ่ม"
+
msgctxt "#31329"
msgid "[B]Timer set![/B] [COLOR=grey2] - System auto shutdown in[/COLOR]"
msgstr "[B]ตั้งค่า ตัวจับเวลา![/B] [COLOR=grey2] - ระบบจะปิดอัตโนมัติ ใน[/COLOR]"
+msgctxt "#31330"
+msgid "Click button to play[CR][CR]movie trailer"
+msgstr "คลิà¸à¸›à¸¸à¹ˆà¸¡à¹€à¸žà¸·à¹ˆà¸­à¹€à¸¥à¹ˆà¸™[CR][CR]ตัวอย่างภาพยนตร์"
+
+msgctxt "#31331"
+msgid "Album details"
+msgstr "รายละเอียดอัลบั้ม"
+
msgctxt "#31351"
msgid "Pause"
msgstr "หยุดชั่วขณะ"
@@ -208,6 +384,10 @@ msgctxt "#31352"
msgid "Stop"
msgstr "หยุด"
+msgctxt "#31353"
+msgid "Fast forward"
+msgstr "ไปหน้าà¹à¸šà¸šà¹€à¸£à¹‡à¸§"
+
msgctxt "#31354"
msgid "Rewind"
msgstr "ย้อนà¸à¸¥à¸±à¸šà¹€à¸£à¹‡à¸§"
@@ -216,6 +396,10 @@ msgctxt "#31355"
msgid "Movie menu"
msgstr "เมนู ภาพยนตร์"
+msgctxt "#31356"
+msgid "Download subtitles"
+msgstr "ดาวน์โหลดคำบรรยาย"
+
msgctxt "#31360"
msgid "Watch as 2D"
msgstr "ชมà¹à¸šà¸š 2 มิติ"
@@ -232,6 +416,10 @@ msgctxt "#31390"
msgid "Skin default"
msgstr "หน้าตาพื้นà¸à¸²à¸™"
+msgctxt "#31391"
+msgid "Skin default with no caps"
+msgstr "ค่าเริ่มต้นของสà¸à¸´à¸™à¹‚ดยไม่ใช้ caps"
+
msgctxt "#31392"
msgid "Arial based"
msgstr "ใช้ฟ้อนท์ Arial"
@@ -244,14 +432,22 @@ msgctxt "#31401"
msgid "[B]CONFIGURE VIDEO SETTINGS[/B][CR][CR]Manage your video library · Set video playback options · Change video listing options[CR]Set subtitle fonts"
msgstr "[B]ปรับเปลี่ยนà¸à¸²à¸£à¸•à¸±à¹‰à¸‡à¸„่าวิดีโอ[/B][CR][CR]จัดà¸à¸²à¸£à¸„ลังข้อมูลวิดีโอของคุณ · ตั้งค่าตัวเลือà¸à¸à¸²à¸£à¹€à¸¥à¹ˆà¸™à¸§à¸´à¸”ีโอ · เปลี่ยนตัวเลือà¸à¸ˆà¸±à¸”เรียงรายà¸à¸²à¸£à¸§à¸´à¸”ีโอ[CR]ตั้งค่าà¹à¸šà¸šà¸­à¸±à¸à¸©à¸£à¸„ำบรรยาย"
-msgctxt "#31402"
-msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission · Set karaoke options"
-msgstr "[B]ปรับเปลี่ยนà¸à¸²à¸£à¸•à¸±à¹‰à¸‡à¸„่าเพลง[/B][CR][CR]จัดà¸à¸²à¸£à¸„ลังข้อมูลเพลงของคุณ · ตั้งค่าตัวเลือà¸à¸à¸²à¸£à¹€à¸¥à¹ˆà¸™à¹€à¸žà¸¥à¸‡ · เปลี่ยนตัวเลือà¸à¸ˆà¸±à¸”เรียงรายà¸à¸²à¸£à¹€à¸žà¸¥à¸‡[CR]ตั้งค่าà¸à¸²à¸£à¸ªà¹ˆà¸‡à¹€à¸žà¸¥à¸‡ · ตั้งค่าตัวเลือà¸à¸„าราโอเà¸à¸°"
+msgctxt "#31403"
+msgid "[B]CONFIGURE PICTURE SETTINGS[/B][CR][CR]Set picture listing options · Configure slideshow"
+msgstr "[B]à¸à¸³à¸«à¸™à¸”à¸à¸²à¸£à¸•à¸±à¹‰à¸‡à¸„่ารูปภาพ[/B][CR][CR]ตั้งค่าตัวเลือà¸à¸ˆà¸±à¸”เรียงรายà¸à¸²à¸£à¸£à¸¹à¸›à¸ à¸²à¸ž · à¸à¸³à¸«à¸™à¸”ค่าà¹à¸ªà¸”งภาพนิ่ง"
+
+msgctxt "#31404"
+msgid "[B]CONFIGURE WEATHER SETTINGS[/B][CR][CR]Set various cities to collect weather information"
+msgstr "[B]à¸à¸³à¸«à¸™à¸”à¸à¸²à¸£à¸•à¸±à¹‰à¸‡à¸„่าสภาพอาà¸à¸²à¸¨[/B][CR][CR]à¸à¸³à¸«à¸™à¸”เมืองต่างๆ ในà¸à¸²à¸£à¹€à¸à¹‡à¸šà¸£à¸§à¸šà¸£à¸§à¸¡à¸‚้อมูลสภาพอาà¸à¸²à¸¨"
msgctxt "#31406"
msgid "[B]CONFIGURE SYSTEM SETTINGS[/B][CR][CR]Setup and calibrate displays · Configure audio output · Setup remote controls[CR]Set power saving options · Enable debugging · Setup master lock"
msgstr "[B]ปรับเปลี่ยนà¸à¸²à¸£à¸•à¸±à¹‰à¸‡à¸„่าระบบ[/B][CR][CR]à¸à¸²à¸£à¸•à¸´à¸”ตั้งà¹à¸¥à¸°à¸›à¸£à¸±à¸šà¹€à¸—ียบà¸à¸²à¸£à¹à¸ªà¸”งผล · à¸à¸³à¸«à¸™à¸”ค่าà¸à¸²à¸£à¸ªà¹ˆà¸‡à¸­à¸­à¸à¸ªà¸±à¸à¸à¸²à¸“เสียง · à¸à¸²à¸£à¸•à¸´à¸”ตั้งรีโมทคอนโทรล[CR]ตั้งค่าตัวเลือà¸à¸à¸²à¸£à¸›à¸£à¸°à¸«à¸¢à¸±à¸”พลังงาน · เปิดใช้งานà¸à¸²à¸£à¹à¸à¹‰à¸ˆà¸¸à¸”บà¸à¸žà¸£à¹ˆà¸­à¸‡ · ติดตั้ง à¸à¸¸à¸à¹à¸ˆà¸«à¸¥à¸±à¸"
+msgctxt "#31408"
+msgid "[B]CONFIGURE ADD-ONS[/B][CR][CR]Manage your installed add-ons · Browse for and install add-ons from kodi.tv[CR]Modify add-on settings"
+msgstr "[B]à¸à¸³à¸«à¸™à¸”ค่าส่วนเสริม[/B][CR][CR]จัดà¸à¸²à¸£à¸ªà¹ˆà¸§à¸™à¹€à¸ªà¸£à¸´à¸¡à¸—ี่ติดตั้งไว้ของคุณ · เรียà¸à¸”ูà¹à¸¥à¸°à¸•à¸´à¸”ตั้งส่วนเสริมจาภkodi.tv[CR]ปรับà¹à¸•à¹ˆà¸‡à¸à¸²à¸£à¸•à¸±à¹‰à¸‡à¸„่าส่วนเสริม"
+
msgctxt "#31409"
msgid "[B]CONFIGURE TV SETTINGS[/B][CR][CR]Change full screen info · Manage EPG data settings"
msgstr "[B] ตั้งค่าทีวี [/B][CR][CR]เปลี่ยนà¹à¸›à¸¥à¸‡à¸‚้อมูลà¹à¸šà¸šà¹€à¸•à¹‡à¸¡à¸«à¸™à¹‰à¸²à¸ˆà¸­Â·à¸ˆà¸±à¸”à¸à¸²à¸£à¸à¸²à¸£à¸•à¸±à¹‰à¸‡à¸„่าข้อมูล EPG"
@@ -260,6 +456,14 @@ msgctxt "#31410"
msgid "[B]CONFIGURE SERVICE SETTINGS[/B][CR][CR]Setup control of Kodi via UPnP and HTTP · Configure file sharing[CR]Enable Zeroconf · Configure AirPlay"
msgstr "[B]ปรับเปลี่ยนà¸à¸²à¸£à¸•à¸±à¹‰à¸‡à¸„่าบริà¸à¸²à¸£[/B][CR][CR]à¸à¸²à¸£à¸•à¸±à¹‰à¸‡à¸„่าของ à¸à¸²à¸£à¸„วบคุม Kodi ผ่าน UPnP à¹à¸¥à¸° HTTP · à¸à¸³à¸«à¸™à¸”ค่าใช้ไฟล์ร่วมà¸à¸±à¸™[CR]เปิดใช้ Zeroconf · à¸à¸³à¸«à¸™à¸”ค่า AirPlay"
+msgctxt "#31411"
+msgid "First run help..."
+msgstr "ช่วยเหลือในà¸à¸²à¸£à¹€à¸£à¸´à¹ˆà¸¡à¹ƒà¸Šà¹‰à¸‡à¸²à¸™..."
+
+msgctxt "#31412"
+msgid "This tab signifies that there is a menu off to the side of this window that contains extra options for this section. To access the menu, navigate to the left with your remote control or keyboard or place your mouse pointer over the tab. [CR][CR]Click \"OK\" to close this dialogue. It will not appear again."
+msgstr "à¹à¸—็บนี้มีเครื่องหมายที่à¹à¸ªà¸”งว่า มีเมนูหลบอยู่ข้างของหน้าต่าง ซึ่งมีเมนูà¸à¸²à¸£à¸›à¸£à¸±à¸šà¹à¸•à¹ˆà¸‡à¸žà¸´à¹€à¸¨à¸©à¸ªà¸³à¸«à¸£à¸±à¸šà¸ªà¹ˆà¸§à¸™à¸™à¸µà¹‰ ในà¸à¸²à¸£à¹€à¸‚้าถึงเมนูนี้, ให้เลื่อนลูà¸à¸¨à¸£à¸‹à¹‰à¸²à¸¢à¸”้วยรีโมทหรือคีย์บอร์ด หรือวางตัวชี้ของเมาท์เหนือà¹à¸—็บ [CR][CR]à¸à¸” \"ตà¸à¸¥à¸‡\" เพื่อปิดà¸à¸¥à¹ˆà¸­à¸‡à¹‚ต้ตอบนี้ ซึ่งจะไม่à¹à¸ªà¸”งขึ้นมาอีà¸"
+
msgctxt "#31413"
msgid "Local subtitle available"
msgstr "พบคำบรรยายภายใน"
@@ -268,6 +472,10 @@ msgctxt "#31420"
msgid "Login"
msgstr "ลงชื่อเข้าใช้"
+msgctxt "#31421"
+msgid "Select your Kodi user profile[CR]to login and continue"
+msgstr "เลือà¸à¹‚ปรไฟล์ผู้ใช้ Kodi ของคุณ[CR]เพื่อเข้าสู่ระบบà¹à¸¥à¸°à¸”ำเนินà¸à¸²à¸£à¸•à¹ˆà¸­à¹„ป"
+
msgctxt "#31422"
msgid "Show or hide the login screen at startup."
msgstr "à¹à¸ªà¸”งหรือซ่อน หน้าจอลงชื่อเข้าใช้เมื่อเริ่มต้น"
@@ -276,18 +484,66 @@ msgctxt "#31423"
msgid "Select the profile that will be used at startup when the login screen is disabled."
msgstr "เลือà¸à¹‚ปรไฟล์ที่จะใช้ในตอนเริ่มต้น เมื่อหน้าจอลงชื่อเข้าใช้ถูà¸à¸›à¸´à¸”à¸à¸²à¸£à¹ƒà¸Šà¹‰à¸‡à¸²à¸™"
+msgctxt "#31501"
+msgid "Scheduled time"
+msgstr "เวลาที่à¸à¸³à¸«à¸™à¸”"
+
msgctxt "#31502"
msgid "TV"
msgstr "ทีวี"
+msgctxt "#31503"
+msgid "Add group"
+msgstr "เพิ่มà¸à¸¥à¸¸à¹ˆà¸¡"
+
+msgctxt "#31504"
+msgid "Rename group"
+msgstr "เปลี่ยนชื่อà¸à¸¥à¸¸à¹ˆà¸¡"
+
+msgctxt "#31505"
+msgid "Delete group"
+msgstr "ลบà¸à¸¥à¸¸à¹ˆà¸¡"
+
msgctxt "#31506"
msgid "Available[CR]Groups"
msgstr "à¸à¸¥à¸¸à¹ˆà¸¡à¸—ีมีอยู่"
+msgctxt "#31509"
+msgid "Channel group"
+msgstr "à¸à¸¥à¸¸à¹ˆà¸¡à¸Šà¹ˆà¸­à¸‡à¸ªà¸±à¸à¸à¸²à¸“"
+
+msgctxt "#31510"
+msgid "Timer set"
+msgstr "à¸à¸³à¸«à¸™à¸”ตัวตั้งเวลา"
+
+msgctxt "#31511"
+msgid "Channel options"
+msgstr "ตัวเลือà¸à¸‚องช่อง"
+
+msgctxt "#31901"
+msgid "36-hour forecast"
+msgstr "พยาà¸à¸£à¸“์ใน 36 ชั่วโมง"
+
+msgctxt "#31902"
+msgid "Hourly forecast"
+msgstr "พยาà¸à¸£à¸“์รายชั่วโมง"
+
+msgctxt "#31903"
+msgid "Weekend forecast"
+msgstr "พยาà¸à¸£à¸“์สุดสัปดาห์"
+
+msgctxt "#31904"
+msgid "Daily forecast"
+msgstr "พยาà¸à¸£à¸“์ประจำวัน"
+
msgctxt "#31905"
msgid "Forecast"
msgstr "พยาà¸à¸£à¸“์"
+msgctxt "#31908"
+msgid "Chance of precipitation"
+msgstr "โอà¸à¸²à¸ªà¹€à¸à¸´à¸”à¸à¸™"
+
msgctxt "#31909"
msgid "Fetching forecast info..."
msgstr "à¸à¸³à¸¥à¸±à¸‡à¹€à¸£à¸µà¸¢à¸à¸‚้อมูลà¸à¸²à¸£à¸žà¸¢à¸²à¸à¸£à¸“์ ..."
diff --git a/addons/skin.confluence/language/resource.language.tr_tr/strings.po b/addons/skin.confluence/language/resource.language.tr_tr/strings.po
index f5bd43c8f2..53b2eda066 100644
--- a/addons/skin.confluence/language/resource.language.tr_tr/strings.po
+++ b/addons/skin.confluence/language/resource.language.tr_tr/strings.po
@@ -170,7 +170,7 @@ msgstr "Arka Plan"
msgctxt "#31103"
msgid "Show \"Paused\" in picture slideshow"
-msgstr "Resim slayt gösterisinde \"Duraklatıldı\"yı göster"
+msgstr "Resim slayt gösterisinde \"Duraklatıldı\" mesajını göster"
msgctxt "#31104"
msgid "Play trailers in a window [COLOR=grey3](Video information dialogue only)[/COLOR]"
@@ -222,19 +222,11 @@ msgstr "Arka plan fanartını gizle"
msgctxt "#31124"
msgid "Show background \"Now playing\" video"
-msgstr "\"Video oynatılıyorken\" arka planı göster"
+msgstr "Arkaplanda oynatılan videoyu göster"
msgctxt "#31125"
msgid "Show background \"Now playing\" visualisation"
-msgstr "\"Görsel efektler oynatılıyorken\" arka planı göster"
-
-msgctxt "#31126"
-msgid "Play TV theme songs in video library (TvTunes add-on)"
-msgstr "TV tema şarkılarını video kitaplığında çal (TvTunes eklentisi)"
-
-msgctxt "#31127"
-msgid "TvTunes"
-msgstr "TvTunes"
+msgstr "Arkaplanda görsel öğeyi göster"
msgctxt "#31128"
msgid "Lyrics"
@@ -298,7 +290,7 @@ msgstr "Gelecek bölümler"
msgctxt "#31300"
msgid "Current temperature"
-msgstr "Sıcaklık"
+msgstr "Geçerli sıcaklık"
msgctxt "#31301"
msgid "Last updated"
@@ -352,13 +344,9 @@ msgctxt "#31320"
msgid "Last logged in"
msgstr "Son giriÅŸ yapan"
-msgctxt "#31321"
-msgid "Karaoke song selector"
-msgstr "Karaoke şarkı seçici"
-
msgctxt "#31322"
msgid "Aired"
-msgstr "Gösterim"
+msgstr "Yayınlanma"
msgctxt "#31325"
msgid "Playlist options"
@@ -444,10 +432,6 @@ msgctxt "#31401"
msgid "[B]CONFIGURE VIDEO SETTINGS[/B][CR][CR]Manage your video library · Set video playback options · Change video listing options[CR]Set subtitle fonts"
msgstr "[B]VİDEO AYARLARINI YAPILANDIR[/B][CR][CR]Video kitaplığını yönet · Video oynatma seçeneklerini ayarla · Video listeleme seçeneklerini değiştir[CR]Altyazı yazı tiplerini ayarla"
-msgctxt "#31402"
-msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission · Set karaoke options"
-msgstr "[B]MÜZİK AYARLARINI YAPILANDIR[/B][CR][CR]Müzik kitaplığını yönet · Müzik çalma seçeneklerini ayarla · Müzik listeleme seçeneklerini değiştir · Şarkı sunumu ayarları · Karaoke seçeneklerini ayarla"
-
msgctxt "#31403"
msgid "[B]CONFIGURE PICTURE SETTINGS[/B][CR][CR]Set picture listing options · Configure slideshow"
msgstr "[B]RESİM AYARLARINI YAPILANDIR[/B][CR][CR]Resim listeleme seçeneklerini ayarla · Slayt gösterisi ayarlarını yapılandır"
diff --git a/addons/skin.confluence/language/resource.language.uk_ua/strings.po b/addons/skin.confluence/language/resource.language.uk_ua/strings.po
index e720732a6f..1f1a759749 100644
--- a/addons/skin.confluence/language/resource.language.uk_ua/strings.po
+++ b/addons/skin.confluence/language/resource.language.uk_ua/strings.po
@@ -16,10 +16,22 @@ msgstr ""
"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"
+msgctxt "#31000"
+msgid "Change your"
+msgstr "Змініть"
+
+msgctxt "#31003"
+msgid "Power options"
+msgstr "ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¶Ð¸Ð²Ð»ÐµÐ½Ð½Ñ"
+
msgctxt "#31004"
msgid "Working..."
msgstr "Зачекайте…"
+msgctxt "#31005"
+msgid "Hide information"
+msgstr "Без відомоÑтей"
+
msgctxt "#31006"
msgid "View options"
msgstr "ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿ÐµÑ€ÐµÐ³Ð»Ñду"
@@ -28,6 +40,10 @@ msgctxt "#31008"
msgid "Full screen"
msgstr "Повний екран"
+msgctxt "#31009"
+msgid "Total duration"
+msgstr "Загальна триваліÑÑ‚ÑŒ"
+
msgctxt "#31022"
msgid "Music - Files"
msgstr "Музика - файли"
@@ -44,14 +60,30 @@ msgctxt "#31025"
msgid "Items"
msgstr "у ÑпиÑку"
+msgctxt "#31026"
+msgid "Misc options"
+msgstr "Інші параметри"
+
msgctxt "#31027"
msgid "Location"
msgstr "РозташуваннÑ"
+msgctxt "#31028"
+msgid "Poster wrap"
+msgstr "КаруÑель поÑтерів"
+
msgctxt "#31029"
msgid "Fanart"
msgstr "Фанарт"
+msgctxt "#31031"
+msgid "Pic thumbs"
+msgstr "Мініатюри"
+
+msgctxt "#31032"
+msgid "Image wrap"
+msgstr "КаруÑель картинок"
+
msgctxt "#31033"
msgid "Info"
msgstr "ІнформаціÑ"
@@ -60,6 +92,10 @@ msgctxt "#31039"
msgid "Actions"
msgstr "Дії"
+msgctxt "#31040"
+msgid "Now playing"
+msgstr "ВідтворюєтьÑÑ"
+
msgctxt "#31042"
msgid "PLAYING"
msgstr "ВІДТВОРЕÐÐЯ"
@@ -80,9 +116,13 @@ msgctxt "#31046"
msgid "SEEKING"
msgstr "ПОШУК"
+msgctxt "#31048"
+msgid "Visualisation presets"
+msgstr "ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ñ–Ð·ÑƒÐ°Ð»Ñ–Ð·Ð°Ñ†Ñ–Ñ—"
+
msgctxt "#31049"
msgid "End time"
-msgstr "Ð§Ð°Ñ ÐºÑ–Ð½Ñ†Ñ"
+msgstr "Кінець"
msgctxt "#31050"
msgid "Sort: Ascending"
@@ -116,6 +156,10 @@ msgctxt "#31060"
msgid "This file is stacked, select the part you want to play from."
msgstr "Складений файл; виберіть чаÑтину Ð´Ð»Ñ Ð²Ñ–Ð´Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ."
+msgctxt "#31061"
+msgid "Current selected"
+msgstr "Поточне виділеннÑ"
+
msgctxt "#31101"
msgid "Home screen options"
msgstr "ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð³Ð¾Ð»Ð¾Ð²Ð½Ð¾Ð³Ð¾ екрану"
@@ -124,17 +168,33 @@ msgctxt "#31102"
msgid "Background"
msgstr "Тло"
+msgctxt "#31103"
+msgid "Show \"Paused\" in picture slideshow"
+msgstr "Показувати \"Пауза\" в режими Ñлайдшоу"
+
+msgctxt "#31104"
+msgid "Play trailers in a window [COLOR=grey3](Video information dialogue only)[/COLOR]"
+msgstr "Відтворювати трейлери у вікні [COLOR=grey3](лише Ð´Ð»Ñ Ð²Ñ–ÐºÐ½Ð° відомоÑтей)[/COLOR]"
+
msgctxt "#31106"
msgid "Miscellaneous options"
msgstr "Різні параметри"
+msgctxt "#31107"
+msgid "Hide flagging read from video filenames [COLOR=grey3](e.g. Blu-ray, HD-DVD)[/COLOR]"
+msgstr "Приховати маркуваннÑ, отримані з імен файлів [COLOR = grey3] (наприклад, Blu-Ray, HD-DVD) [/COLOR]"
+
+msgctxt "#31108"
+msgid "Hide main menu buttons"
+msgstr "Приховати кнопки головного меню"
+
msgctxt "#31109"
msgid "Enable custom background"
msgstr "Дозволити вибір фонових зображень"
msgctxt "#31110"
msgid "Background path:"
-msgstr "ШлÑÑ… до тла:"
+msgstr "ШлÑÑ… до зображеннÑ:"
msgctxt "#31111"
msgid "Hide"
@@ -144,18 +204,54 @@ msgctxt "#31112"
msgid "Options"
msgstr "Параметри"
-msgctxt "#31126"
-msgid "Play TV theme songs in video library (TvTunes add-on)"
-msgstr "Грати мелодію Ñеріалу в медіатеці (надбудова TvTunes)"
+msgctxt "#31116"
+msgid "Show recently added albums"
+msgstr "Показати оÑтанні додані альбоми"
+
+msgctxt "#31117"
+msgid "Show recently added videos"
+msgstr "Показати оÑтанні додані альбоми"
+
+msgctxt "#31118"
+msgid "Home page programs submenu"
+msgstr "Субменю Ñторінки програм"
-msgctxt "#31127"
-msgid "TvTunes"
-msgstr "TvTunes"
+msgctxt "#31119"
+msgid "Hide background fanart"
+msgstr "Приховати фоновий фанарт"
+
+msgctxt "#31124"
+msgid "Show background \"Now playing\" video"
+msgstr "Показувати на відео \"ВідтворюєтьÑÑ\""
+
+msgctxt "#31125"
+msgid "Show background \"Now playing\" visualisation"
+msgstr "Показувати на візуалізації \"ВідтворюєтьÑÑ\""
msgctxt "#31128"
msgid "Lyrics"
msgstr "ТекÑти"
+msgctxt "#31129"
+msgid "Hide fanart in full screen visualisation"
+msgstr "Приховати фанарт в режимі візуалізації на веÑÑŒ екран"
+
+msgctxt "#31132"
+msgid "Lyrics add-on"
+msgstr "Ðадбудова \"ТекÑти\""
+
+msgctxt "#31134"
+msgid "Home page \"Videos\" submenu"
+msgstr "Субменю Ñторінки \"Відео\""
+
+msgctxt "#31135"
+msgid "Home page \"Music\" submenu"
+msgstr "Субменю Ñторінки \"Музика\""
+
+msgctxt "#31136"
+msgid "Home page \"Pictures\" submenu"
+msgstr "Субменю Ñторінки \"Фото\""
+
msgctxt "#31140"
msgid "Music OSD"
msgstr "OSD музики"
@@ -172,33 +268,113 @@ msgctxt "#31200"
msgid "Shortcuts"
msgstr "Ярлики"
+msgctxt "#31203"
+msgid "Choose your song"
+msgstr "Виберіть піÑню"
+
+msgctxt "#31205"
+msgid "Lyrics source"
+msgstr "Джерело текÑтів піÑень"
+
msgctxt "#31206"
msgid "Found"
msgstr "Знайдено"
+msgctxt "#31207"
+msgid "Find more items"
+msgstr "Більше об'єктів"
+
+msgctxt "#31208"
+msgid "Upcoming episodes"
+msgstr "ÐаÑтупні Ñерії"
+
+msgctxt "#31300"
+msgid "Current temperature"
+msgstr "Поточна температура"
+
+msgctxt "#31301"
+msgid "Last updated"
+msgstr "ОÑтаннє оновленнÑ"
+
msgctxt "#31303"
msgid "Data provider"
msgstr "Джерело даних"
+msgctxt "#31307"
+msgid "Hide fanart"
+msgstr "Приховати фанарт"
+
+msgctxt "#31308"
+msgid "Movie details"
+msgstr "ВідомоÑÑ‚Ñ– про фільм"
+
+msgctxt "#31309"
+msgid "Memory used:"
+msgstr "ВикориÑтано пам'ÑÑ‚Ñ–"
+
+msgctxt "#31310"
+msgid "Track number"
+msgstr "Ðомер треку"
+
msgctxt "#31311"
msgid "Fanart image[CR][CR]Unavailable[CR][CR] Click button to set"
msgstr "Фанарт[CR][CR]недоÑтупний,[CR][CR]натиÑніть кнопку, щоб вибрати"
+msgctxt "#31312"
+msgid "Current scraper"
+msgstr "Поточний інфореÑурÑ"
+
+msgctxt "#31313"
+msgid "Choose a scraper"
+msgstr "Вибрати інфореÑурÑ"
+
+msgctxt "#31314"
+msgid "Content scanning options"
+msgstr "Параметри ÑÐºÐ°Ð½ÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ð¼Ñ–Ñту"
+
+msgctxt "#31317"
+msgid "Set fanart path"
+msgstr "Вибрати Ñ€Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ Ñ„Ð°Ð½Ð°Ñ€Ñ‚Ñƒ"
+
+msgctxt "#31319"
+msgid "Selected profile"
+msgstr "Обраний профіль"
+
+msgctxt "#31320"
+msgid "Last logged in"
+msgstr "ОÑтанній вхід"
+
msgctxt "#31322"
msgid "Aired"
msgstr "Прем'єра"
+msgctxt "#31325"
+msgid "Playlist options"
+msgstr "Параметри ÑпиÑку відтвореннÑ"
+
msgctxt "#31326"
msgid "Created"
-msgstr "Створений"
+msgstr "Створено"
msgctxt "#31327"
msgid "Resolution"
-msgstr "Розмір"
+msgstr "Роздільна здатніÑÑ‚ÑŒ"
+
+msgctxt "#31328"
+msgid "Recently added"
+msgstr "Додано оÑтанніми"
msgctxt "#31329"
msgid "[B]Timer set![/B] [COLOR=grey2] - System auto shutdown in[/COLOR]"
-msgstr "[B]Ð’Ñтановлено таймер![/B] [COLOR=grey2] - Ðвтоматичне Ð²Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ñ‡ÐµÑ€ÐµÐ·[/COLOR]"
+msgstr "[B]Ð’Ñтановлено таймер![/B] [COLOR=grey2] - Ðвтоматичне Ð²Ð¸Ð¼ÐºÐ½ÐµÐ½Ð½Ñ Ñ‡ÐµÑ€ÐµÐ·[/COLOR]"
+
+msgctxt "#31330"
+msgid "Click button to play[CR][CR]movie trailer"
+msgstr "ÐатиÑніть кнопку,[CR][CR]щоб переглÑнути кино-трейлер"
+
+msgctxt "#31331"
+msgid "Album details"
+msgstr "ВідомоÑÑ‚Ñ– про альбом"
msgctxt "#31351"
msgid "Pause"
@@ -208,6 +384,10 @@ msgctxt "#31352"
msgid "Stop"
msgstr "Стоп"
+msgctxt "#31353"
+msgid "Fast forward"
+msgstr "Перемотка вперед"
+
msgctxt "#31354"
msgid "Rewind"
msgstr "Перемотка назад"
@@ -216,6 +396,10 @@ msgctxt "#31355"
msgid "Movie menu"
msgstr "Меню фільму"
+msgctxt "#31356"
+msgid "Download subtitles"
+msgstr "Завантажити Ñубтитри"
+
msgctxt "#31360"
msgid "Watch as 2D"
msgstr "ПереглÑдати Ñк 2D"
@@ -226,12 +410,16 @@ msgstr "Зміна режиму"
msgctxt "#31362"
msgid "Enabled"
-msgstr "Увімкн."
+msgstr "Увімкнено"
msgctxt "#31390"
msgid "Skin default"
msgstr "Стандартні"
+msgctxt "#31391"
+msgid "Skin default with no caps"
+msgstr "Стандартні без ВЕЛИКИХ"
+
msgctxt "#31392"
msgid "Arial based"
msgstr "Стиль Arial"
@@ -244,14 +432,22 @@ msgctxt "#31401"
msgid "[B]CONFIGURE VIDEO SETTINGS[/B][CR][CR]Manage your video library · Set video playback options · Change video listing options[CR]Set subtitle fonts"
msgstr "[B]ÐÐЛÐШТУВÐÐÐЯ ПÐРÐМЕТРІВ ВІДЕО[/B][CR][CR]ÐšÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð¼ÐµÐ´Ñ–Ð°Ñ‚ÐµÐºÐ¾ÑŽ відео • Параметри Ð²Ñ–Ð´Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð²Ñ–Ð´ÐµÐ¾[CR]ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ ÑпиÑку відео • ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ ÑˆÑ€Ð¸Ñ„Ñ‚Ñƒ Ñубтитрів"
-msgctxt "#31402"
-msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission · Set karaoke options"
-msgstr "[B]ÐÐЛÐШТУВÐÐÐЯ ПÐРÐМЕТРІВ МУЗИКИ[/B][CR][CR]ÐšÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð¼ÐµÐ´Ð¸Ð°Ñ‚ÐµÐºÐ¾ÑŽ аудіо • Параметри Ð²Ñ–Ð´Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð°ÑƒÐ´Ñ–Ð¾[CR]ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ ÑпиÑку аудіо • ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð¾Ð´Ð°Ð²Ð°Ð½Ð½Ñ Ð¿Ñ–Ñень[CR]ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ ÐºÐ°Ñ€Ð°Ð¾ÐºÐµ"
+msgctxt "#31403"
+msgid "[B]CONFIGURE PICTURE SETTINGS[/B][CR][CR]Set picture listing options · Configure slideshow"
+msgstr "[B]ÐÐЛÐШТУВÐÐÐЯ ПÐРÐМЕТРІВ ФОТО[/ B] [CR] [CR]Параметри ÑпиÑку зображень - Параметри Ñлайдшоу"
+
+msgctxt "#31404"
+msgid "[B]CONFIGURE WEATHER SETTINGS[/B][CR][CR]Set various cities to collect weather information"
+msgstr "[B]ÐÐЛÐШТУВÐÐÐЯ ПÐРÐМЕТРІВ ПОГОДИ[/ B] [CR] [CR]Ð’ÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ñ€Ñ–Ð·Ð½Ð¸Ñ… міÑÑ‚ Ð´Ð»Ñ Ð·Ð±Ð¾Ñ€Ñƒ інформації про погоду"
msgctxt "#31406"
msgid "[B]CONFIGURE SYSTEM SETTINGS[/B][CR][CR]Setup and calibrate displays · Configure audio output · Setup remote controls[CR]Set power saving options · Enable debugging · Setup master lock"
msgstr "[B]ÐÐЛÐШТУВÐÐÐЯ ПÐРÐМЕТРІВ СИСТЕМИ[/B][CR][CR]ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñ‚Ð° ÐºÐ°Ð»Ñ–Ð±Ñ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð¸Ñплеїв • ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ð¸Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ð°ÑƒÐ´Ñ–Ð¾[CR]ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð¸Ñтанційного ÐºÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ â€¢ ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñ–Ð² енергозбереженнÑ[CR]Ð£Ð²Ñ–Ð¼ÐºÐ½ÐµÐ½Ð½Ñ Ð½Ð°Ð»Ð°Ð³Ð¾Ð´Ð¶ÐµÐ½Ð½Ñ â€¢ ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ"
+msgctxt "#31408"
+msgid "[B]CONFIGURE ADD-ONS[/B][CR][CR]Manage your installed add-ons · Browse for and install add-ons from kodi.tv[CR]Modify add-on settings"
+msgstr "[B]ÐÐЛÐШТУВÐÐÐЯ ÐÐДБУДОВ[/B][CR][CR]ÐšÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ñтановленими надбудовами • Ð’ÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð½Ð°Ð´Ð±ÑƒÐ´Ð¾Ð² з kodi.tv[CR]Зміна налаштувань надбудов"
+
msgctxt "#31409"
msgid "[B]CONFIGURE TV SETTINGS[/B][CR][CR]Change full screen info · Manage EPG data settings"
msgstr "[B]ÐÐЛÐШТУВÐÐÐЯ ТБ[/B][CR][CR]Параметри повноекранної інформації · ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð¾ÐºÐ°Ð·Ñƒ телепрограми (EPG)"
@@ -260,6 +456,14 @@ msgctxt "#31410"
msgid "[B]CONFIGURE SERVICE SETTINGS[/B][CR][CR]Setup control of Kodi via UPnP and HTTP · Configure file sharing[CR]Enable Zeroconf · Configure AirPlay"
msgstr "[B]ÐÐЛÐШТУВÐÐÐЯ ПÐРÐМЕТРІВ СЛУЖБ[/B][CR][CR]ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ ÐºÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ Kodi за UPnP Ñ– HTTP • ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð¾Ñтупу до файлів[CR]Ð£Ð²Ñ–Ð¼ÐºÐ½ÐµÐ½Ð½Ñ Zeroconf • ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ AirPlay"
+msgctxt "#31411"
+msgid "First run help..."
+msgstr "Допомога під Ñ‡Ð°Ñ Ð¿ÐµÑ€ÑˆÐ¾Ð³Ð¾ запуÑку."
+
+msgctxt "#31412"
+msgid "This tab signifies that there is a menu off to the side of this window that contains extra options for this section. To access the menu, navigate to the left with your remote control or keyboard or place your mouse pointer over the tab. [CR][CR]Click \"OK\" to close this dialogue. It will not appear again."
+msgstr "Вкладка вказує на нÑвніÑÑ‚ÑŒ бічного меню з додатковими налаштуваннÑми розділу. Відкрийте меню ліворуч з допомогою пульта ДК чи клавіатури, або наведіть курÑор миші на вкладку. [CR][CR]ÐатиÑніть ОК, щоб закрити цей діалог. Він більше не з'ÑвитьÑÑ."
+
msgctxt "#31413"
msgid "Local subtitle available"
msgstr "ДоÑтупні локальні Ñубтитри"
@@ -268,6 +472,10 @@ msgctxt "#31420"
msgid "Login"
msgstr "Вхід"
+msgctxt "#31421"
+msgid "Select your Kodi user profile[CR]to login and continue"
+msgstr "Виберіть профіль кориÑтувача Kodi,[CR]щоб увійти до ÑиÑтеми"
+
msgctxt "#31422"
msgid "Show or hide the login screen at startup."
msgstr "Показати або приховати екран входу при запуÑку."
@@ -276,18 +484,66 @@ msgctxt "#31423"
msgid "Select the profile that will be used at startup when the login screen is disabled."
msgstr "Вибрати профіль, що буде викориÑтовуватиÑÑ Ð¿Ñ€Ð¸ запуÑку, коли екран входу вимкнено."
+msgctxt "#31501"
+msgid "Scheduled time"
+msgstr "Запланований чаÑ"
+
msgctxt "#31502"
msgid "TV"
msgstr "ТБ"
+msgctxt "#31503"
+msgid "Add group"
+msgstr "Додати групу"
+
+msgctxt "#31504"
+msgid "Rename group"
+msgstr "Перейменувати групу"
+
+msgctxt "#31505"
+msgid "Delete group"
+msgstr "Видалити групу"
+
msgctxt "#31506"
msgid "Available[CR]Groups"
msgstr "ДоÑтупні[CR]групи"
+msgctxt "#31509"
+msgid "Channel group"
+msgstr "Група каналів"
+
+msgctxt "#31510"
+msgid "Timer set"
+msgstr "Таймер вÑтановлено"
+
+msgctxt "#31511"
+msgid "Channel options"
+msgstr "Параметри канала"
+
+msgctxt "#31901"
+msgid "36-hour forecast"
+msgstr "Прогноз на 36 годин"
+
+msgctxt "#31902"
+msgid "Hourly forecast"
+msgstr "Щогодинний прогноз"
+
+msgctxt "#31903"
+msgid "Weekend forecast"
+msgstr "Прогноз на вихідні"
+
+msgctxt "#31904"
+msgid "Daily forecast"
+msgstr "Щоденний прогноз"
+
msgctxt "#31905"
msgid "Forecast"
msgstr "Прогноз"
+msgctxt "#31908"
+msgid "Chance of precipitation"
+msgstr "Можливі опади"
+
msgctxt "#31909"
msgid "Fetching forecast info..."
msgstr "ÐžÑ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¾Ð³Ð½Ð¾Ð·Ñƒâ€¦"
@@ -330,7 +586,7 @@ msgstr "ПРОГРÐМИ"
msgctxt "#31958"
msgid "PLAY DISC"
-msgstr "ГРÐТИ ДИСК"
+msgstr "ВІДТВОРЕÐÐЯ"
msgctxt "#31959"
msgid "SYSTEM"
diff --git a/addons/skin.confluence/language/resource.language.vi_vn/strings.po b/addons/skin.confluence/language/resource.language.vi_vn/strings.po
index 5228150ac4..823f191f75 100644
--- a/addons/skin.confluence/language/resource.language.vi_vn/strings.po
+++ b/addons/skin.confluence/language/resource.language.vi_vn/strings.po
@@ -140,14 +140,6 @@ msgctxt "#31112"
msgid "Options"
msgstr "Tùy chá»n"
-msgctxt "#31126"
-msgid "Play TV theme songs in video library (TvTunes add-on)"
-msgstr "Phát các bài hát từ TV trong hệ thống thư viện video (add-on TvTunes)"
-
-msgctxt "#31127"
-msgid "TvTunes"
-msgstr "TV Turner"
-
msgctxt "#31128"
msgid "Lyrics"
msgstr "Lá»i Bài Hát"
@@ -240,10 +232,6 @@ msgctxt "#31401"
msgid "[B]CONFIGURE VIDEO SETTINGS[/B][CR][CR]Manage your video library · Set video playback options · Change video listing options[CR]Set subtitle fonts"
msgstr "[B]TUỲ CHỈNH CÀI ÄẶT VIDEO[/B][CR][CR]Quản lý thÆ° viện video · Äặt chế Ä‘á»™ xem video · Thay đổi cách liệt kê video[CR]Äặt font phụ Ä‘á»"
-msgctxt "#31402"
-msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission · Set karaoke options"
-msgstr "[B]TUỲ CHỈNH CÀI ÄẶT NHẠC[/B][CR][CR]Quản lý thÆ° viện nhạc · Äặt chế Ä‘á»™ nghe nhạc · Thay đổi cách liệt kê nhạc[CR]Cài đặt gá»­i và lấy thông tin nhạc · Äặt chế Ä‘á»™ karaoke"
-
msgctxt "#31406"
msgid "[B]CONFIGURE SYSTEM SETTINGS[/B][CR][CR]Setup and calibrate displays · Configure audio output · Setup remote controls[CR]Set power saving options · Enable debugging · Setup master lock"
msgstr "[B]TUỲ CHỈNH CÀI ÄẶT HỆ THá»NG[/B][CR][CR]Cài đặt và Ä‘iá»u chỉnh màn hình · Chỉnh đầu ra audio · Cài đặt Ä‘iá»u khiển từ xa[CR]Äặt chế Ä‘á»™ tiết kiệm năng lượng · Bật chế Ä‘á»™ tìm sá»­a lá»—i · Äặt khoá chủ"
diff --git a/addons/skin.confluence/language/resource.language.zh_cn/strings.po b/addons/skin.confluence/language/resource.language.zh_cn/strings.po
index 8f1d678706..c89ce116f0 100644
--- a/addons/skin.confluence/language/resource.language.zh_cn/strings.po
+++ b/addons/skin.confluence/language/resource.language.zh_cn/strings.po
@@ -228,14 +228,6 @@ msgctxt "#31125"
msgid "Show background \"Now playing\" visualisation"
msgstr "在背景显示“正在播放â€å¯è§†åŒ–效果"
-msgctxt "#31126"
-msgid "Play TV theme songs in video library (TvTunes add-on)"
-msgstr "视频资料库模å¼æ’­æ”¾ç”µè§†ä¸»é¢˜æ›²ï¼ˆTvTunes æ’件)"
-
-msgctxt "#31127"
-msgid "TvTunes"
-msgstr "TvTunes"
-
msgctxt "#31128"
msgid "Lyrics"
msgstr "æ­Œè¯"
@@ -352,10 +344,6 @@ msgctxt "#31320"
msgid "Last logged in"
msgstr "最近登录"
-msgctxt "#31321"
-msgid "Karaoke song selector"
-msgstr "å¡æ‹‰OK歌曲选择器"
-
msgctxt "#31322"
msgid "Aired"
msgstr "首播"
@@ -444,10 +432,6 @@ msgctxt "#31401"
msgid "[B]CONFIGURE VIDEO SETTINGS[/B][CR][CR]Manage your video library · Set video playback options · Change video listing options[CR]Set subtitle fonts"
msgstr "[B]设置视频选项[/B][CR][CR]管ç†è§†é¢‘资料库 · 设置视频播放选项 · 修改视频列表选项 · 设置字幕字体"
-msgctxt "#31402"
-msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission · Set karaoke options"
-msgstr "[B]设置音ä¹é€‰é¡¹[/B][CR][CR]管ç†éŸ³ä¹èµ„料库 · 设置音ä¹æ’­æ”¾é€‰é¡¹ · 修改音ä¹åˆ—表选项 · 设置歌曲æ交 · 设置å¡æ‹‰OK选项"
-
msgctxt "#31403"
msgid "[B]CONFIGURE PICTURE SETTINGS[/B][CR][CR]Set picture listing options · Configure slideshow"
msgstr "[B]设置图片选项[/B][CR][CR]设置图片列表选项 · 设置幻ç¯ç‰‡æ’­æ”¾"
diff --git a/addons/skin.confluence/language/resource.language.zh_tw/strings.po b/addons/skin.confluence/language/resource.language.zh_tw/strings.po
index 974575de9e..dd0aa0d267 100644
--- a/addons/skin.confluence/language/resource.language.zh_tw/strings.po
+++ b/addons/skin.confluence/language/resource.language.zh_tw/strings.po
@@ -16,10 +16,22 @@ msgstr ""
"Language: zh_TW\n"
"Plural-Forms: nplurals=1; plural=0;\n"
+msgctxt "#31000"
+msgid "Change your"
+msgstr "修改你的"
+
+msgctxt "#31003"
+msgid "Power options"
+msgstr "é›»æºé¸é …"
+
msgctxt "#31004"
msgid "Working..."
msgstr "處ç†ä¸­..."
+msgctxt "#31005"
+msgid "Hide information"
+msgstr "éš±è—資訊"
+
msgctxt "#31006"
msgid "View options"
msgstr "ç€è¦½è¨­å®š"
@@ -28,6 +40,10 @@ msgctxt "#31008"
msgid "Full screen"
msgstr "全螢幕"
+msgctxt "#31009"
+msgid "Total duration"
+msgstr "總計時間"
+
msgctxt "#31022"
msgid "Music - Files"
msgstr "音樂 - 檔案"
@@ -44,14 +60,30 @@ msgctxt "#31025"
msgid "Items"
msgstr "個項目"
+msgctxt "#31026"
+msgid "Misc options"
+msgstr "其他é¸é …"
+
msgctxt "#31027"
msgid "Location"
msgstr "ä½ç½®"
+msgctxt "#31028"
+msgid "Poster wrap"
+msgstr "æµ·å ±æ²å‹•"
+
msgctxt "#31029"
msgid "Fanart"
msgstr "Fanart"
+msgctxt "#31031"
+msgid "Pic thumbs"
+msgstr "圖片縮圖"
+
+msgctxt "#31032"
+msgid "Image wrap"
+msgstr "圖片æ²å‹•"
+
msgctxt "#31033"
msgid "Info"
msgstr "資訊"
@@ -60,9 +92,13 @@ msgctxt "#31039"
msgid "Actions"
msgstr "動作"
+msgctxt "#31040"
+msgid "Now playing"
+msgstr "ç¾æ­£æ’­æ”¾"
+
msgctxt "#31042"
msgid "PLAYING"
-msgstr "正在播放"
+msgstr "播放中"
msgctxt "#31043"
msgid "PAUSED"
@@ -80,6 +116,10 @@ msgctxt "#31046"
msgid "SEEKING"
msgstr "查找"
+msgctxt "#31048"
+msgid "Visualisation presets"
+msgstr "視覺效果é è¨­å€¼"
+
msgctxt "#31049"
msgid "End time"
msgstr "çµæŸæ™‚é–“"
@@ -116,6 +156,10 @@ msgctxt "#31060"
msgid "This file is stacked, select the part you want to play from."
msgstr "這個檔案已堆疊,請é¸æ“‡æ‚¨è¦å¾žå“ªå€‹éƒ¨åˆ†é–‹å§‹æ’­æ”¾ã€‚"
+msgctxt "#31061"
+msgid "Current selected"
+msgstr "ç›®å‰æ‰€é¸"
+
msgctxt "#31101"
msgid "Home screen options"
msgstr "首é ä»‹é¢é¸é …"
@@ -124,10 +168,26 @@ msgctxt "#31102"
msgid "Background"
msgstr "背景"
+msgctxt "#31103"
+msgid "Show \"Paused\" in picture slideshow"
+msgstr "在圖片幻燈片秀中顯示\"已暫åœ\"狀態"
+
+msgctxt "#31104"
+msgid "Play trailers in a window [COLOR=grey3](Video information dialogue only)[/COLOR]"
+msgstr "在視窗中播放é å‘Šç‰‡[COLOR=grey3](åªåœ¨å½±ç‰‡è³‡è¨Šå°è©±æ¡†ä¸­)[/COLOR]"
+
msgctxt "#31106"
msgid "Miscellaneous options"
msgstr "其他é¸é …"
+msgctxt "#31107"
+msgid "Hide flagging read from video filenames [COLOR=grey3](e.g. Blu-ray, HD-DVD)[/COLOR]"
+msgstr "éš±è—影片檔案å稱的媒體標示 [COLOR=grey3](Blu-ray, HD-DVD)[/COLOR]"
+
+msgctxt "#31108"
+msgid "Hide main menu buttons"
+msgstr "éš±è—主é¸å–®æŒ‰éˆ•"
+
msgctxt "#31109"
msgid "Enable custom background"
msgstr "啟用 自訂背景"
@@ -144,18 +204,58 @@ msgctxt "#31112"
msgid "Options"
msgstr "é¸é …"
-msgctxt "#31126"
-msgid "Play TV theme songs in video library (TvTunes add-on)"
-msgstr "在影片資料庫中播放電視主題曲(TvTunes 附加元件)"
+msgctxt "#31116"
+msgid "Show recently added albums"
+msgstr "顯示最近加入的專輯"
+
+msgctxt "#31117"
+msgid "Show recently added videos"
+msgstr "顯示最近加入的影片"
-msgctxt "#31127"
-msgid "TvTunes"
-msgstr "TvTunes"
+msgctxt "#31118"
+msgid "Home page programs submenu"
+msgstr "首é ç¨‹å¼å­é¸å–®"
+
+msgctxt "#31119"
+msgid "Hide background fanart"
+msgstr "éš±è—背景 Fanart"
+
+msgctxt "#31122"
+msgid "Hide EPG if RDS is present on channel window"
+msgstr "如果該頻é“ç•«é¢ä¸­æœ‰è‡ªå¸¶RDS訊æ¯ï¼Œå‰‡ä¸é¡¯ç¤ºé›»å­ç¯€ç›®è¡¨"
+
+msgctxt "#31124"
+msgid "Show background \"Now playing\" video"
+msgstr "在背景顯示正在播放的影片"
+
+msgctxt "#31125"
+msgid "Show background \"Now playing\" visualisation"
+msgstr "在背景顯示正在播放的視覺效果"
msgctxt "#31128"
msgid "Lyrics"
msgstr "歌詞"
+msgctxt "#31129"
+msgid "Hide fanart in full screen visualisation"
+msgstr "åœ¨å…¨èž¢å¹•è¦–è¦ºæ•ˆæžœä¸­éš±è— Fanart"
+
+msgctxt "#31132"
+msgid "Lyrics add-on"
+msgstr "歌詞附加元件"
+
+msgctxt "#31134"
+msgid "Home page \"Videos\" submenu"
+msgstr "首é å½±ç‰‡å­é¸å–®"
+
+msgctxt "#31135"
+msgid "Home page \"Music\" submenu"
+msgstr "首é éŸ³æ¨‚å­é¸å–®"
+
+msgctxt "#31136"
+msgid "Home page \"Pictures\" submenu"
+msgstr "首é åœ–片å­é¸å–®"
+
msgctxt "#31140"
msgid "Music OSD"
msgstr "音樂播放工具列"
@@ -172,22 +272,90 @@ msgctxt "#31200"
msgid "Shortcuts"
msgstr "æ·å¾‘"
+msgctxt "#31203"
+msgid "Choose your song"
+msgstr "é¸æ“‡ä½ çš„歌曲"
+
+msgctxt "#31205"
+msgid "Lyrics source"
+msgstr "歌詞來æº"
+
msgctxt "#31206"
msgid "Found"
msgstr "已找到"
+msgctxt "#31207"
+msgid "Find more items"
+msgstr "尋找更多項目"
+
+msgctxt "#31208"
+msgid "Upcoming episodes"
+msgstr "劇集é å‘Š"
+
+msgctxt "#31300"
+msgid "Current temperature"
+msgstr "ç¾åœ¨æº«åº¦"
+
+msgctxt "#31301"
+msgid "Last updated"
+msgstr "最後更新"
+
msgctxt "#31303"
msgid "Data provider"
msgstr "資料æ供者"
+msgctxt "#31307"
+msgid "Hide fanart"
+msgstr "éš±è— Fanart"
+
+msgctxt "#31308"
+msgid "Movie details"
+msgstr "電影詳細資訊"
+
+msgctxt "#31309"
+msgid "Memory used:"
+msgstr "已使用記憶體:"
+
+msgctxt "#31310"
+msgid "Track number"
+msgstr "音軌編號"
+
msgctxt "#31311"
msgid "Fanart image[CR][CR]Unavailable[CR][CR] Click button to set"
msgstr "無法å–å¾—[CR][CR]Fanart 圖片[CR][CR] 請點擊按鈕來設定"
+msgctxt "#31312"
+msgid "Current scraper"
+msgstr "ç›®å‰çš„ç«™å°"
+
+msgctxt "#31313"
+msgid "Choose a scraper"
+msgstr "é¸æ“‡ä¸€å€‹ç«™å°"
+
+msgctxt "#31314"
+msgid "Content scanning options"
+msgstr "內容掃æé¸é …"
+
+msgctxt "#31317"
+msgid "Set fanart path"
+msgstr "設定 Fanart 路徑"
+
+msgctxt "#31319"
+msgid "Selected profile"
+msgstr "é¸æ“‡çš„設定檔"
+
+msgctxt "#31320"
+msgid "Last logged in"
+msgstr "上次登入在"
+
msgctxt "#31322"
msgid "Aired"
msgstr "首播"
+msgctxt "#31325"
+msgid "Playlist options"
+msgstr "播放清單é¸é …"
+
msgctxt "#31326"
msgid "Created"
msgstr "已建立"
@@ -196,10 +364,22 @@ msgctxt "#31327"
msgid "Resolution"
msgstr "解æžåº¦"
+msgctxt "#31328"
+msgid "Recently added"
+msgstr "最近加入的"
+
msgctxt "#31329"
msgid "[B]Timer set![/B] [COLOR=grey2] - System auto shutdown in[/COLOR]"
msgstr "[B]計時器啟動ï¼[/B] [COLOR=grey2] - 系統將自動關機於:[/COLOR]"
+msgctxt "#31330"
+msgid "Click button to play[CR][CR]movie trailer"
+msgstr "點擊按鈕播放[CR][CR]電影é å‘Šç‰‡"
+
+msgctxt "#31331"
+msgid "Album details"
+msgstr "專輯詳細資訊"
+
msgctxt "#31351"
msgid "Pause"
msgstr "æš«åœ"
@@ -208,6 +388,10 @@ msgctxt "#31352"
msgid "Stop"
msgstr "åœæ­¢"
+msgctxt "#31353"
+msgid "Fast forward"
+msgstr "快轉"
+
msgctxt "#31354"
msgid "Rewind"
msgstr "倒轉"
@@ -216,6 +400,10 @@ msgctxt "#31355"
msgid "Movie menu"
msgstr "電影é¸å–®"
+msgctxt "#31356"
+msgid "Download subtitles"
+msgstr "下載字幕"
+
msgctxt "#31360"
msgid "Watch as 2D"
msgstr "以 2D 模å¼è§€è³ž"
@@ -232,6 +420,10 @@ msgctxt "#31390"
msgid "Skin default"
msgstr "主題é è¨­"
+msgctxt "#31391"
+msgid "Skin default with no caps"
+msgstr "佈景主題é è¨­ï¼ˆæ²’有開頭大寫)"
+
msgctxt "#31392"
msgid "Arial based"
msgstr "基於 Arial"
@@ -245,13 +437,25 @@ msgid "[B]CONFIGURE VIDEO SETTINGS[/B][CR][CR]Manage your video library · Set v
msgstr "[B]é…置視訊設定[/B][CR][CR]管ç†ä½ çš„音樂資料庫 · 設定影片播放é¸é … · 修改影片清單é¸é …[CR]設定字幕字型"
msgctxt "#31402"
-msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission · Set karaoke options"
-msgstr "[B]é…置音樂設定[/B][CR][CR]管ç†ä½ çš„音樂資料庫 · 設定音樂播放é¸é … · 修改音樂清單é¸é …[CR]設定歌曲æ交 · 設定å¡æ‹‰OKé¸é …"
+msgid "[B]CONFIGURE MUSIC SETTINGS[/B][CR][CR]Manage your music library · Set music playback options · Change music listing options[CR]Setup song submission"
+msgstr "[B]é…置設定[/B][CR][CR]管ç†ä½ çš„音樂資料庫 · 設定音樂播放é¸é … · 修改音樂清單é¸é …[CR]設定歌曲æ交"
+
+msgctxt "#31403"
+msgid "[B]CONFIGURE PICTURE SETTINGS[/B][CR][CR]Set picture listing options · Configure slideshow"
+msgstr "[B]é…置圖片設定[/B][CR][CR]設定圖片清單é¸é … · 設定幻燈片秀"
+
+msgctxt "#31404"
+msgid "[B]CONFIGURE WEATHER SETTINGS[/B][CR][CR]Set various cities to collect weather information"
+msgstr "[B]é…置天氣設定[/B][CR][CR]設定幾個è¦æ”¶é›†å¤©æ°£è³‡æ–™çš„城市"
msgctxt "#31406"
msgid "[B]CONFIGURE SYSTEM SETTINGS[/B][CR][CR]Setup and calibrate displays · Configure audio output · Setup remote controls[CR]Set power saving options · Enable debugging · Setup master lock"
msgstr "[B]é…置系統設定[/B][CR][CR]設定和校正顯示輸出 · 設定音效輸出 · 設定é™æŽ§å™¨[CR]設定節能é¸é … · 啟用除錯 · 設定鎖定密碼"
+msgctxt "#31408"
+msgid "[B]CONFIGURE ADD-ONS[/B][CR][CR]Manage your installed add-ons · Browse for and install add-ons from kodi.tv[CR]Modify add-on settings"
+msgstr "[B]é…置附加元件[/B][CR][CR]管ç†å·²å®‰è£çš„附加元件 · 從 kodi.tv ç€è¦½ä¸¦å®‰è£é™„加元件[CR]修改附加元件設定"
+
msgctxt "#31409"
msgid "[B]CONFIGURE TV SETTINGS[/B][CR][CR]Change full screen info · Manage EPG data settings"
msgstr "[B]電視設定[/B][CR][CR]修改全螢幕資訊 · 管ç†é›»å­ç¯€ç›®è¡¨è³‡æ–™è¨­å®š"
@@ -260,6 +464,14 @@ msgctxt "#31410"
msgid "[B]CONFIGURE SERVICE SETTINGS[/B][CR][CR]Setup control of Kodi via UPnP and HTTP · Configure file sharing[CR]Enable Zeroconf · Configure AirPlay"
msgstr "[B]é…ç½®æœå‹™è¨­å®š[/B][CR][CR]設定é€éŽ UPnP å’Œ HTTP 控製 Kodi · é…置檔案分享[CR]啟用 Zeroconf · é…ç½® AirPlay"
+msgctxt "#31411"
+msgid "First run help..."
+msgstr "第一次使用說明..."
+
+msgctxt "#31412"
+msgid "This tab signifies that there is a menu off to the side of this window that contains extra options for this section. To access the menu, navigate to the left with your remote control or keyboard or place your mouse pointer over the tab. [CR][CR]Click \"OK\" to close this dialogue. It will not appear again."
+msgstr "這個標籤表示這個部分在視窗的å´é‚Šæœ‰æä¾›é¡å¤–é¸é …çš„é¸å–®ã€‚ä½ å¯ä»¥ä½¿ç”¨é™æŽ§å™¨æˆ–éµç›¤çš„å·¦éµæˆ–者是將滑鼠指標移動到這個標籤的範åœä¾†å­˜å–這個é¸å–®ã€‚[CR][CR]按一下\"Ok\" å¯ä»¥é—œé–‰é€™å€‹å°è©±æ¡†ã€‚它ä¸æœƒå†å‡ºç¾ã€‚"
+
msgctxt "#31413"
msgid "Local subtitle available"
msgstr "有本地語言的字幕å¯é¸ç”¨"
@@ -268,6 +480,10 @@ msgctxt "#31420"
msgid "Login"
msgstr "登入"
+msgctxt "#31421"
+msgid "Select your Kodi user profile[CR]to login and continue"
+msgstr "é¸æ“‡æ‚¨çš„ Kodi 使用者設定檔[CR]登入並繼續"
+
msgctxt "#31422"
msgid "Show or hide the login screen at startup."
msgstr "啟動時顯示或隱è—登入畫é¢"
@@ -276,18 +492,66 @@ msgctxt "#31423"
msgid "Select the profile that will be used at startup when the login screen is disabled."
msgstr "é¸æ“‡ç™»å…¥ç•«é¢åœç”¨æ˜¯è¦ä½¿ç”¨çš„設定檔。"
+msgctxt "#31501"
+msgid "Scheduled time"
+msgstr "已排程的時間"
+
msgctxt "#31502"
msgid "TV"
msgstr "電視"
+msgctxt "#31503"
+msgid "Add group"
+msgstr "新增群組"
+
+msgctxt "#31504"
+msgid "Rename group"
+msgstr "é‡æ–°å‘½å群組"
+
+msgctxt "#31505"
+msgid "Delete group"
+msgstr "刪除群組"
+
msgctxt "#31506"
msgid "Available[CR]Groups"
msgstr "å¯ç”¨çš„[CR]群組"
+msgctxt "#31509"
+msgid "Channel group"
+msgstr "é »é“群組"
+
+msgctxt "#31510"
+msgid "Timer set"
+msgstr "計時器設定"
+
+msgctxt "#31511"
+msgid "Channel options"
+msgstr "é »é“é¸é …"
+
+msgctxt "#31901"
+msgid "36-hour forecast"
+msgstr "36å°æ™‚é å ±"
+
+msgctxt "#31902"
+msgid "Hourly forecast"
+msgstr "æ¯å°æ™‚é å ±"
+
+msgctxt "#31903"
+msgid "Weekend forecast"
+msgstr "一週é å ±"
+
+msgctxt "#31904"
+msgid "Daily forecast"
+msgstr "æ¯æ—¥æ°£è±¡é æ¸¬"
+
msgctxt "#31905"
msgid "Forecast"
msgstr "é å ±"
+msgctxt "#31908"
+msgid "Chance of precipitation"
+msgstr "é™é›¨æ©ŸçŽ‡"
+
msgctxt "#31909"
msgid "Fetching forecast info..."
msgstr "正在擷å–é å ±è³‡è¨Š..."
diff --git a/addons/skin.confluence/media/Makefile.in b/addons/skin.confluence/media/Makefile.in
index 181c2e8824..a4a6312cbd 100644
--- a/addons/skin.confluence/media/Makefile.in
+++ b/addons/skin.confluence/media/Makefile.in
@@ -10,9 +10,9 @@ all: $(TARGET)
$(TARGET): $(IMAGES)
ifeq (@ARCH@,arm)
- @TEXTUREPACKER@ -use_none -input . -output $(TARGET)
+ @TEXTUREPACKER@ -dupecheck -use_none -input . -output $(TARGET)
else
- @TEXTUREPACKER@ -input . -output $(TARGET)
+ @TEXTUREPACKER@ -dupecheck -input . -output $(TARGET)
endif
diff --git a/addons/skin.confluence/media/VideoWindowFO.png b/addons/skin.confluence/media/VideoWindowFO.png
new file mode 100644
index 0000000000..a04571dab8
--- /dev/null
+++ b/addons/skin.confluence/media/VideoWindowFO.png
Binary files differ
diff --git a/addons/skin.re-touched b/addons/skin.re-touched
-Subproject db5f915d02c315d5d23f7de8173f9ec0646cf15
+Subproject 9bf8af09de561307d0eee8dfd1ebe95c1d21897
diff --git a/addons/webinterface.default/addon.xml b/addons/webinterface.default/addon.xml
index 64435a64f0..ff642b7316 100644
--- a/addons/webinterface.default/addon.xml
+++ b/addons/webinterface.default/addon.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<addon
id="webinterface.default"
- version="2.2.24"
+ version="2.2.25"
name="Default webinterface"
provider-name="Team-Kodi">
<requires>
@@ -15,7 +15,7 @@
<summary lang="ar_SA">واجهه Ùريق إكس بي إم سي للشبكة العنكبوتية (واجهه الشبكة العنكبوتية المبدئية لـ إكس بي إم سي)</summary>
<summary lang="be_BY">Team-Kodi Web Interface. (Kodi's default web interface)</summary>
<summary lang="bg_BG">Уеб Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð½Ð° Team-Kodi. (ÑтандартниÑÑ‚ уеб Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð½Ð° Kodi)</summary>
- <summary lang="ca_ES">Interfície web de l'equip Kodi. (Interficie web per defecte del Kodi)</summary>
+ <summary lang="ca_ES">Interfície web de l'equip Kodi. (la interfície web per defecte del Kodi)</summary>
<summary lang="cs_CZ">Webové rozhraní týmu Kodi (Výchozí webové rozhraní Kodi).</summary>
<summary lang="cy_GB">Rhyngwyneb Gwe Team-Kodi (Rhyngwyneb gwe rhagosodedig Kodi)</summary>
<summary lang="da_DK">Team-Kodi Web-grænseflade. (Kodi's standard webgrænseflade)</summary>
@@ -34,7 +34,7 @@
<summary lang="fa_IR">رابط وب تیم Kodi. (رابط وب استاندارد Kodi)</summary>
<summary lang="fi_FI">Team-Kodi:n WWW-käyttöliittymä. (Kodi:n oletus WWW-käyttöliittymä)</summary>
<summary lang="fr_CA">Interface Web de l'équipe-Kodi. (Interface Web par défaut d'Kodi)</summary>
- <summary lang="fr_FR">Interface Web de l'Équipe-Kodi. (Interface Web prédéfinie de Kodi)</summary>
+ <summary lang="fr_FR">Interface internet de l'Équipe-Kodi. (Interface internet par défaut de Kodi)</summary>
<summary lang="gl_ES">Interface web da equipa de Kodi. (Interface web predefinida de Kodi)</summary>
<summary lang="he_IL">ממשק הדפדפן הרשמי של Kodi. (ברירת המחדל)</summary>
<summary lang="hr_HR">Tim Kodi Web suÄelje. (Kodijevo uobiÄajeno web suÄelje)</summary>
@@ -47,7 +47,8 @@
<summary lang="lt_LT">Komandos Kodi Web sąsaja.(Kodi numatytoji žiniatinklio sąsaja)</summary>
<summary lang="lv_LV">Team-Kodi tÄ«mekļa saskarne. (Kodi noklusÄ“tÄ tÄ«mekļa saskarne)</summary>
<summary lang="mk_MK">Веб Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÑ˜Ñ Ð½Ð° Kodi тимот. (Kodi's подразбирачки веб интерфејÑ)</summary>
- <summary lang="ms_MY">Antaramuka web kumpulan Kodi (antaramuka web lalai Kodi) </summary>
+ <summary lang="ms_MY">Antaramuka Sesawang Pasukan-Kodi (antaramuka sesawang lalai Kodi) </summary>
+ <summary lang="mt_MT">Web interface ta' Team-Kodi. (Il-Web interface normali ta' Kodi)</summary>
<summary lang="my_MM">Team-Kodi á€á€€á€ºá€˜á€º အသွင်အပြင် (Kodi á မူရင် á€á€€á€ºá€˜á€º အသွင်အပြင်)</summary>
<summary lang="nb_NO">Team-Kodi nettgrensesnitt. (Kodis standard nettgrensesnitt)</summary>
<summary lang="nl_NL">Team-Kodi Webinterface. (Kodi's standaard webinterface)</summary>
@@ -59,7 +60,7 @@
<summary lang="sk_SK">Webové rozhranie tímu Kodi. (predvolené webové rozhranie pre Kodi)</summary>
<summary lang="sl_SI">Spletni vmesnik ekipe Kodi. (Privzet spletni vmesnik za Kodi)</summary>
<summary lang="sr_RS">Веб Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÑ˜Ñ Ð¾Ð´ програмера Kodi-а (подразумевани веб Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÑ˜Ñ Kodi-а)</summary>
- <summary lang="sr_RS@latin">Веб Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÑ˜Ñ Ð¾Ð´ програмера Kodi-а (подразумевани веб Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÑ˜Ñ Kodi-а)</summary>
+ <summary lang="sr_RS@latin">Web interfejs Kodi Tima (podrazuevani web interfejs Kodia)</summary>
<summary lang="sv_SE">Team-Kodi webbgränsnitt. (Kodi's standardwebbgränssnitt)</summary>
<summary lang="szl">Webowy interfejs ôd Team-Kodi (wychodny webowy interface we Kodi).</summary>
<summary lang="ta_IN">கோடி கà¯à®´à¯à®®à®¤à¯à®¤à®¿à®©à¯ இணைய இடைமà¯à®•à®®à¯. (கோடியின௠நிரநà¯à®¤à®° இணைய இடைமà¯à®•à®®à¯)</summary>
@@ -77,7 +78,7 @@
<description lang="ar_SA">واجهه الشبكة العنكبوتية المبدئية لـ إكس بي إم سي، Ù…Ùصمَمة لتناسب كاÙØ© قياسات أبعاد الشاشات</description>
<description lang="be_BY">Стандартны вÑб-інтÑрфÑÐ¹Ñ Ð´Ð° Kodi; раÑпрацаваны Ð´Ð»Ñ Ð¿Ñ€Ñ‹Ð»Ð°Ð´Ð°Ñž зь любымі разрознаÑьцÑмі</description>
<description lang="bg_BG">Ð¡Ñ‚Ð°Ð½Ð´Ð°Ñ€Ñ‚Ð½Ð¸Ñ ÑƒÐµÐ± Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð½Ð° Kodi; Ðаправен е за уÑтройÑтва Ñ Ð½Ð°Ð¹-различни резолюции</description>
- <description lang="ca_ES">Interfície web per defecte del Kodi; Dissenyada per dispositius de totes les resol·lucions</description>
+ <description lang="ca_ES">Interfície web per defecte del Kodi; Dissenyada per dispositius de totes les resolucions</description>
<description lang="cs_CZ">Výchozí webové rozhraní Kodi navržené pro zařízení s libovolným rozlišením</description>
<description lang="cy_GB">Rhyngwyneb gwe rhagosodedig Kodi. Wedi ei gynllunio ar gyfer cydraniad pob dyfais</description>
<description lang="da_DK">Standard webgrænseflade til Kodi; designet til enheder i alle opløsninger</description>
@@ -96,13 +97,13 @@
<description lang="fa_IR">رابط استاندارد وب برای Kodi. قابل استÙاده برای همه دستگاه ها Ùˆ همه رزولوشن ها</description>
<description lang="fi_FI">Oletus WWW-käyttöliittymä Kodi:lle. Suunniteltu käytettäväksi kaiken kokoisilla laitteilla.</description>
<description lang="fr_CA">Interface Web par défaut d'Kodi - Conçue pour les dispositifs de toutes résolutions</description>
- <description lang="fr_FR">Interface Web prédéfini de Kodi ; adaptée aux appareils de toutes résolutions</description>
+ <description lang="fr_FR">Interface internet par défaut de Kodi ; adaptée aux appareils de toutes résolutions</description>
<description lang="gl_ES">Interface web predefinida para Kodi, deseñada para dispositivos de todas as resolucións</description>
<description lang="he_IL">ממשק דפדפן ברירת המחדל עבור Kodi; מות×× ×œ×ž×›×©×™×¨×™× ×‘×¢×œ×™ ×בחנות שונות</description>
<description lang="hr_HR">UobiÄajeno web suÄelje za Kodi; Dizajnirano za ureÄ‘aje svih razluÄivosti</description>
<description lang="hu_HU">Az Kodi alapértelmezett webes kezelőfelülete; Minden felbontásra alkalmas</description>
<description lang="hy_AM">Õ†Õ¡Õ­Õ¶Õ¡Õ¯Õ¡Õ¶ Õ¿Õ¥Õ½Ö„ Kodi-Õ« Õ°Õ¡Õ´Õ¡Ö€; Õ†Õ¡Õ­Õ¡Õ¿Õ¥Õ½Õ¾Õ¡Õ® Õ§ Õ¢Õ¸Õ¬Õ¸Ö€ Õ¯Ö€Õ«Õ¹Õ¶Õ¥Ö€Õ« Õ°Õ¡Õ´Õ¡Ö€</description>
- <description lang="id_ID">Antar muka web bawaan bagi Kodi; Dirancang bagi perangkat dengan semua resolusi</description>
+ <description lang="id_ID">Antar muka web bawaan bagi Kodi; Dirancang untuk perangkat dengan semua resolusi</description>
<description lang="is_IS">Sjálfgefið vefviðmót fyrir Kodi; Hannað fyrir tæki með allskonar upplausnir</description>
<description lang="it_IT">Interfaccia Web di default per Kodi; Realizzata per periferiche con qualunque risoluzione</description>
<description lang="ja_JP">Kodi ã®ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆ Web インターフェースã§ã™ã€‚ã•ã¾ã–ã¾ãªè§£åƒåº¦ã®ãƒ‡ãƒã‚¤ã‚¹ç”¨ã«ãƒ‡ã‚¶ã‚¤ãƒ³ã•ã‚Œã¦ã„ã¾ã™ã€‚</description>
@@ -110,7 +111,8 @@
<description lang="lt_LT">Numatytoji Kodi Web sąsaja skirta visų rezoliucijų prietaisams</description>
<description lang="lv_LV">NoklusÄ“tÄ Kodi tÄ«mekļa sakarne; PiemÄ“rota visu izÅ¡Ä·irtspÄ“ju iekÄrtÄm</description>
<description lang="mk_MK">Подразбирачки веб Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÑ˜Ñ Ð·Ð° Kodi; Дизајниран за уреди Ñо Ñите резолуции</description>
- <description lang="ms_MY">Antaramuka web lalai untuk Kodi; Di reka untuk peranti pelbagai resolusi</description>
+ <description lang="ms_MY">Antaramuka sesawang lalai untuk Kodi; Direka untuk peranti pelbagai resolusi</description>
+ <description lang="mt_MT">Il-Web interface in-normali ta' Kodi; Iddiżinjata għal apparat ta' kull reżoluzzjoni</description>
<description lang="my_MM">Kodi အá€á€½á€€á€º မူရင်း á€á€€á€ºá€˜á€º အသွင်ပြင် አစက်များ အားလုံးá resolutions အá€á€½á€€á€º ရေးဆွဲထားသည်á‹</description>
<description lang="nb_NO">Standard nettgrensesnitt for Kodi; Laget for alle oppløsninger</description>
<description lang="nl_NL">Standaard Kodi-webinterface; geschikt voor alle resoluties</description>
@@ -123,7 +125,7 @@
<description lang="sk_SK">Predvolené webové rozhranie pre Kodi; Navrhnuté pre zariadenia zobrazujúce v akomkoľvek rozlíšení</description>
<description lang="sl_SI">Privzet spletni vmesnik za Kodi, ustvarjen za naprave vseh loÄljivosti</description>
<description lang="sr_RS">Подразумевани веб Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÑ˜Ñ Kodi-а, намењен уређајима Ñвих резолуција</description>
- <description lang="sr_RS@latin">Подразумевани веб Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÑ˜Ñ Kodi-а, намењен уређајима Ñвих резолуција</description>
+ <description lang="sr_RS@latin">Podrazumevani web interfejs Kodia; Namenjen uređajima svih rezolucija</description>
<description lang="sv_SE">Standardwebbgränssnitt för Kodi; Utformat för alla enheter oavsett skärmupplösning</description>
<description lang="szl">Wychodny webowy interface we Kodi. Zrychtowany dlŠmaszin we wszyjskich rozdziylczościach.</description>
<description lang="ta_IN">கோடி இறà¯à®•à®¾à®© நிரநà¯à®¤à®° இணைய இடைமà¯à®•à®®à¯; சகல சாதனஙà¯à®•à®³à®¿à®©à¯ திரைகளà¯à®•à¯à®•à¯à®®à¯ வடிவமைகà¯à®•à®ªà¯à®ªà®Ÿà¯à®Ÿà®¤à¯</description>
diff --git a/addons/xbmc.gui/addon.xml b/addons/xbmc.gui/addon.xml
index a0800b42cb..2450ed1569 100644
--- a/addons/xbmc.gui/addon.xml
+++ b/addons/xbmc.gui/addon.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<addon id="xbmc.gui" version="5.10.0" provider-name="Team-Kodi">
- <backwards-compatibility abi="5.9.0"/>
+ <backwards-compatibility abi="5.10.0"/>
<requires>
<import addon="xbmc.core" version="0.1.0"/>
</requires>
diff --git a/configure.ac b/configure.ac
index a86ddd94b7..af4b188b5e 100644
--- a/configure.ac
+++ b/configure.ac
@@ -2,7 +2,7 @@
# Process this file with autoconf to produce a configure script.
AC_PREREQ(2.59)
-AC_INIT([kodi], [15.9.703], [http://trac.kodi.tv])
+AC_INIT([kodi], [15.9.803], [http://trac.kodi.tv])
AC_CONFIG_HEADERS([xbmc/config.h])
AH_TOP([#pragma once])
m4_include([m4/ax_prog_cc_for_build.m4])
@@ -1125,7 +1125,7 @@ int main() {
)])
AC_LANG_POP([C++])
-if test "${target_platform}" = "target_linux" || test "${target_platform}" = "target_raspberry_pi"; then
+if test "${target_platform}" = "target_linux" || test "${target_platform}" = "target_raspberry_pi" || test "${target_platform}" = "target_android"; then
PKG_CHECK_MODULES([UUID], [uuid],, AC_MSG_ERROR(libuuid not found))
fi
@@ -1141,9 +1141,6 @@ AC_LINK_IFELSE(
[AC_MSG_ERROR(crossguid not found)])
LIBS="$SAVED_LIBS"
AC_LANG_POP([C++])
-if test "${target_platform}" = "target_android"; then
- CXXFLAGS="$CXXFLAGS -DGUID_ANDROID"
-fi
PKG_CHECK_MODULES([YAJL], [yajl >= 2],
[INCLUDES="$INCLUDES $YAJL_CFLAGS"; LIBS="$LIBS $YAJL_LIBS"; YAJL_FOUND="true"],
@@ -2375,7 +2372,6 @@ OUTPUT_FILES="Makefile \
xbmc/cores/playercorefactory/Makefile \
xbmc/messaging/Makefile \
xbmc/messaging/helpers/Makefile \
- xbmc/music/karaoke/Makefile \
xbmc/osx/Makefile \
xbmc/guilib/Makefile \
xbmc/input/linux/Makefile \
diff --git a/docs/README.android b/docs/README.android
index 9c5cab683f..752ecd7924 100644
--- a/docs/README.android
+++ b/docs/README.android
@@ -13,7 +13,7 @@ TOC
1. Introduction
-----------------------------------------------------------------------------
-We currently recommend Ubuntu "Precise Pangolin" (12.04) 64Bit. This is what our continuous
+We currently recommend Ubuntu "Trusty Tahr" (14.04) 64Bit. This is what our continuous
integration system "jenkins" is using.
Additionally, building from OSX Snow Leopard or Mavericks (others on your own risk ;) ) is working (see 3.1).
diff --git a/media/Splash.png b/media/Splash.png
index 82a697a2a7..f084197595 100644
--- a/media/Splash.png
+++ b/media/Splash.png
Binary files differ
diff --git a/project/VS2010Express/XBMC.vcxproj b/project/VS2010Express/XBMC.vcxproj
index 29ae0dfbc5..c11906f88e 100644
--- a/project/VS2010Express/XBMC.vcxproj
+++ b/project/VS2010Express/XBMC.vcxproj
@@ -658,18 +658,6 @@
<ClCompile Include="..\..\xbmc\music\infoscanner\MusicArtistInfo.cpp" />
<ClCompile Include="..\..\xbmc\music\infoscanner\MusicInfoScanner.cpp" />
<ClCompile Include="..\..\xbmc\music\infoscanner\MusicInfoScraper.cpp" />
- <ClCompile Include="..\..\xbmc\music\karaoke\GUIDialogKaraokeSongSelector.cpp" />
- <ClCompile Include="..\..\xbmc\music\karaoke\GUIWindowKaraokeLyrics.cpp" />
- <ClCompile Include="..\..\xbmc\music\karaoke\karaokelyrics.cpp" />
- <ClCompile Include="..\..\xbmc\music\karaoke\karaokelyricscdg.cpp" />
- <ClCompile Include="..\..\xbmc\music\karaoke\karaokelyricsfactory.cpp" />
- <ClCompile Include="..\..\xbmc\music\karaoke\karaokelyricsmanager.cpp" />
- <ClCompile Include="..\..\xbmc\music\karaoke\karaokelyricstext.cpp" />
- <ClCompile Include="..\..\xbmc\music\karaoke\karaokelyricstextkar.cpp" />
- <ClCompile Include="..\..\xbmc\music\karaoke\karaokelyricstextlrc.cpp" />
- <ClCompile Include="..\..\xbmc\music\karaoke\karaokelyricstextustar.cpp" />
- <ClCompile Include="..\..\xbmc\music\karaoke\karaokewindowbackground.cpp" />
- <ClCompile Include="..\..\xbmc\music\karaoke\karaokevideobackground.cpp" />
<ClCompile Include="..\..\xbmc\music\MusicDatabase.cpp" />
<ClCompile Include="..\..\xbmc\music\MusicDbUrl.cpp" />
<ClCompile Include="..\..\xbmc\music\MusicInfoLoader.cpp" />
@@ -1094,7 +1082,6 @@
<ClInclude Include="..\..\xbmc\messaging\ThreadMessage.h" />
<ClInclude Include="..\..\xbmc\music\CueInfoLoader.h" />
<ClInclude Include="..\..\xbmc\music\EmbeddedArt.h" />
- <ClInclude Include="..\..\xbmc\music\karaoke\karaokevideobackground.h" />
<ClInclude Include="..\..\xbmc\music\tags\MusicInfoTagLoaderFFmpeg.h" />
<ClInclude Include="..\..\xbmc\music\tags\ReplayGain.h" />
<ClInclude Include="..\..\xbmc\network\dacp\dacp.h" />
@@ -2005,18 +1992,6 @@
<ClInclude Include="..\..\xbmc\music\infoscanner\MusicArtistInfo.h" />
<ClInclude Include="..\..\xbmc\music\infoscanner\MusicInfoScanner.h" />
<ClInclude Include="..\..\xbmc\music\infoscanner\MusicInfoScraper.h" />
- <ClInclude Include="..\..\xbmc\music\karaoke\cdgdata.h" />
- <ClInclude Include="..\..\xbmc\music\karaoke\GUIDialogKaraokeSongSelector.h" />
- <ClInclude Include="..\..\xbmc\music\karaoke\GUIWindowKaraokeLyrics.h" />
- <ClInclude Include="..\..\xbmc\music\karaoke\karaokelyrics.h" />
- <ClInclude Include="..\..\xbmc\music\karaoke\karaokelyricscdg.h" />
- <ClInclude Include="..\..\xbmc\music\karaoke\karaokelyricsfactory.h" />
- <ClInclude Include="..\..\xbmc\music\karaoke\karaokelyricsmanager.h" />
- <ClInclude Include="..\..\xbmc\music\karaoke\karaokelyricstext.h" />
- <ClInclude Include="..\..\xbmc\music\karaoke\karaokelyricstextkar.h" />
- <ClInclude Include="..\..\xbmc\music\karaoke\karaokelyricstextlrc.h" />
- <ClInclude Include="..\..\xbmc\music\karaoke\karaokelyricstextustar.h" />
- <ClInclude Include="..\..\xbmc\music\karaoke\karaokewindowbackground.h" />
<ClInclude Include="..\..\xbmc\music\MusicDatabase.h" />
<ClInclude Include="..\..\xbmc\music\MusicInfoLoader.h" />
<ClInclude Include="..\..\xbmc\music\Song.h" />
@@ -3015,4 +2990,4 @@
</VisualStudio>
</ProjectExtensions>
<Import Project="$(SolutionDir)\$(ProjectFileName).targets.user" Condition="Exists('$(SolutionDir)\$(ProjectFileName).targets.user')" />
-</Project> \ No newline at end of file
+</Project>
diff --git a/project/VS2010Express/XBMC.vcxproj.filters b/project/VS2010Express/XBMC.vcxproj.filters
index eb1a3330e7..eaecbbf7af 100644
--- a/project/VS2010Express/XBMC.vcxproj.filters
+++ b/project/VS2010Express/XBMC.vcxproj.filters
@@ -112,9 +112,6 @@
<Filter Include="windowing">
<UniqueIdentifier>{dbf79aa0-53a6-4bec-855b-e8d2cbb73689}</UniqueIdentifier>
</Filter>
- <Filter Include="music\karaoke">
- <UniqueIdentifier>{9d2be696-b6dd-4be1-aa8c-260816b48c12}</UniqueIdentifier>
- </Filter>
<Filter Include="cdrip">
<UniqueIdentifier>{d0d6c121-8cef-4bf9-aba5-bff57ae46e26}</UniqueIdentifier>
</Filter>
@@ -804,39 +801,6 @@
<ClCompile Include="..\..\xbmc\MediaSource.cpp" />
<ClCompile Include="..\..\xbmc\MediaSource.cpp" />
<ClCompile Include="..\..\xbmc\MediaSource.cpp" />
- <ClCompile Include="..\..\xbmc\music\karaoke\GUIDialogKaraokeSongSelector.cpp">
- <Filter>music\karaoke</Filter>
- </ClCompile>
- <ClCompile Include="..\..\xbmc\music\karaoke\GUIWindowKaraokeLyrics.cpp">
- <Filter>music\karaoke</Filter>
- </ClCompile>
- <ClCompile Include="..\..\xbmc\music\karaoke\karaokelyrics.cpp">
- <Filter>music\karaoke</Filter>
- </ClCompile>
- <ClCompile Include="..\..\xbmc\music\karaoke\karaokelyricscdg.cpp">
- <Filter>music\karaoke</Filter>
- </ClCompile>
- <ClCompile Include="..\..\xbmc\music\karaoke\karaokelyricsfactory.cpp">
- <Filter>music\karaoke</Filter>
- </ClCompile>
- <ClCompile Include="..\..\xbmc\music\karaoke\karaokelyricsmanager.cpp">
- <Filter>music\karaoke</Filter>
- </ClCompile>
- <ClCompile Include="..\..\xbmc\music\karaoke\karaokelyricstext.cpp">
- <Filter>music\karaoke</Filter>
- </ClCompile>
- <ClCompile Include="..\..\xbmc\music\karaoke\karaokelyricstextkar.cpp">
- <Filter>music\karaoke</Filter>
- </ClCompile>
- <ClCompile Include="..\..\xbmc\music\karaoke\karaokelyricstextlrc.cpp">
- <Filter>music\karaoke</Filter>
- </ClCompile>
- <ClCompile Include="..\..\xbmc\music\karaoke\karaokelyricstextustar.cpp">
- <Filter>music\karaoke</Filter>
- </ClCompile>
- <ClCompile Include="..\..\xbmc\music\karaoke\karaokewindowbackground.cpp">
- <Filter>music\karaoke</Filter>
- </ClCompile>
<ClCompile Include="..\..\xbmc\music\Album.cpp">
<Filter>music</Filter>
</ClCompile>
@@ -2301,9 +2265,6 @@
<ClCompile Include="..\..\xbmc\utils\DatabaseUtils.cpp">
<Filter>utils</Filter>
</ClCompile>
- <ClCompile Include="..\..\xbmc\music\karaoke\karaokevideobackground.cpp">
- <Filter>music\karaoke</Filter>
- </ClCompile>
<ClCompile Include="..\..\xbmc\utils\EndianSwap.cpp">
<Filter>utils</Filter>
</ClCompile>
@@ -3791,42 +3752,6 @@
<ClInclude Include="..\..\xbmc\guilib\GUIDialog.h">
<Filter>guilib</Filter>
</ClInclude>
- <ClInclude Include="..\..\xbmc\music\karaoke\cdgdata.h">
- <Filter>music\karaoke</Filter>
- </ClInclude>
- <ClInclude Include="..\..\xbmc\music\karaoke\GUIDialogKaraokeSongSelector.h">
- <Filter>music\karaoke</Filter>
- </ClInclude>
- <ClInclude Include="..\..\xbmc\music\karaoke\GUIWindowKaraokeLyrics.h">
- <Filter>music\karaoke</Filter>
- </ClInclude>
- <ClInclude Include="..\..\xbmc\music\karaoke\karaokelyrics.h">
- <Filter>music\karaoke</Filter>
- </ClInclude>
- <ClInclude Include="..\..\xbmc\music\karaoke\karaokelyricscdg.h">
- <Filter>music\karaoke</Filter>
- </ClInclude>
- <ClInclude Include="..\..\xbmc\music\karaoke\karaokelyricsfactory.h">
- <Filter>music\karaoke</Filter>
- </ClInclude>
- <ClInclude Include="..\..\xbmc\music\karaoke\karaokelyricsmanager.h">
- <Filter>music\karaoke</Filter>
- </ClInclude>
- <ClInclude Include="..\..\xbmc\music\karaoke\karaokelyricstext.h">
- <Filter>music\karaoke</Filter>
- </ClInclude>
- <ClInclude Include="..\..\xbmc\music\karaoke\karaokelyricstextkar.h">
- <Filter>music\karaoke</Filter>
- </ClInclude>
- <ClInclude Include="..\..\xbmc\music\karaoke\karaokelyricstextlrc.h">
- <Filter>music\karaoke</Filter>
- </ClInclude>
- <ClInclude Include="..\..\xbmc\music\karaoke\karaokelyricstextustar.h">
- <Filter>music\karaoke</Filter>
- </ClInclude>
- <ClInclude Include="..\..\xbmc\music\karaoke\karaokewindowbackground.h">
- <Filter>music\karaoke</Filter>
- </ClInclude>
<ClInclude Include="..\..\xbmc\music\Album.h">
<Filter>music</Filter>
</ClInclude>
@@ -5650,9 +5575,6 @@
<ClInclude Include="..\..\xbmc\guilib\cximage.h">
<Filter>guilib</Filter>
</ClInclude>
- <ClInclude Include="..\..\xbmc\music\karaoke\karaokevideobackground.h">
- <Filter>music\karaoke</Filter>
- </ClInclude>
<ClInclude Include="..\..\xbmc\video\FFmpegVideoDecoder.h">
<Filter>video</Filter>
</ClInclude>
@@ -6426,4 +6348,4 @@
<Filter>shaders</Filter>
</FxCompile>
</ItemGroup>
-</Project> \ No newline at end of file
+</Project>
diff --git a/project/cmake/addons/CMakeLists.txt b/project/cmake/addons/CMakeLists.txt
index de60ad7610..00db97d8de 100644
--- a/project/cmake/addons/CMakeLists.txt
+++ b/project/cmake/addons/CMakeLists.txt
@@ -385,7 +385,7 @@ foreach(addon ${addons})
# create a forwarding target to the addon-package target
add_custom_target(package-${id}
- COMMAND ${CMAKE_COMMAND} --build ${BUILD_DIR}/${id}-prefix/src/${id}-build --target addon-package
+ COMMAND ${CMAKE_COMMAND} --build ${id}-prefix/src/${id}-build --target addon-package
DEPENDS ${id})
add_dependencies(package-addons package-${id})
diff --git a/project/cmake/scripts/common/addon-helpers.cmake b/project/cmake/scripts/common/addon-helpers.cmake
index c3f52e1235..9541df475e 100644
--- a/project/cmake/scripts/common/addon-helpers.cmake
+++ b/project/cmake/scripts/common/addon-helpers.cmake
@@ -111,6 +111,9 @@ macro (build_addon target prefix libs)
COMPONENT ${target}-${${prefix}_VERSION})
ENDIF()
ELSE(WIN32)
+ if(NOT CPACK_PACKAGE_DIRECTORY)
+ set(CPACK_PACKAGE_DIRECTORY ${CMAKE_BINARY_DIR})
+ endif()
INSTALL(TARGETS ${target} DESTINATION ${target}
COMPONENT ${target}-${${prefix}_VERSION})
ENDIF(WIN32)
diff --git a/system/keyboardlayouts/czech.xml b/system/keyboardlayouts/czech.xml
new file mode 100644
index 0000000000..4c31abd631
--- /dev/null
+++ b/system/keyboardlayouts/czech.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<!--
+Please use English language names instead.
+Default font lacks support for all characters
+-->
+<keyboardlayouts>
+ <layout language="Czech" layout="QWERTZ">
+ <keyboard>
+ <row>ťěšÄřžýáíéó(</row>
+ <row>qwertzuiopú)</row>
+ <row>asdfghjklůÄ_</row>
+ <row>/yxcvbnmň:.-</row>
+ </keyboard>
+ <keyboard modifiers="shift">
+ <row>ŤĚŠČŘŽÃÃÃÉÓ(</row>
+ <row>QWERTZUIOPÚ)</row>
+ <row>ASDFGHJKLŮĎ_</row>
+ <row>\YXCVBNMŇ:.-</row>
+ </keyboard>
+ <keyboard modifiers="symbol,shift+symbol">
+ <row>1234567890%</row>
+ <row>+@#$~^&amp;*{}=</row>
+ <row>[]()/"'`;!</row>
+ <row>\|&lt;&gt;,.?:-_</row>
+ </keyboard>
+ </layout>
+</keyboardlayouts>
diff --git a/system/keymaps/gamepad.xml b/system/keymaps/gamepad.xml
index 0f4422fcd0..1e839ca59d 100644
--- a/system/keymaps/gamepad.xml
+++ b/system/keymaps/gamepad.xml
@@ -18,9 +18,10 @@
<!-- <obc45>Stop</obc45> -->
<!-- </universalremote> -->
-<!-- Note that the action can be a built-in function. -->
-<!-- eg <B>ActivateWindow(MyMusic)</B> -->
-<!-- would automatically go to My Music on the press of the B button. -->
+<!-- Note that the action can be a built-in function. -->
+<!-- eg <B>ActivateWindow(MyMusic)</B> -->
+<!-- would automatically go to My Music on the press of the B button. -->
+<!-- An empty action removes the corresponding mapping from the default keymap -->
<!-- Joysticks / Gamepads: -->
<!-- See the sample PS3 controller configuration below for the format. -->
diff --git a/system/keymaps/joystick.Microsoft.Xbox.360.Controller.xml b/system/keymaps/joystick.Microsoft.Xbox.360.Controller.xml
index b6c7d8545e..5f1ee37112 100644
--- a/system/keymaps/joystick.Microsoft.Xbox.360.Controller.xml
+++ b/system/keymaps/joystick.Microsoft.Xbox.360.Controller.xml
@@ -600,10 +600,10 @@
</ContextMenu>
<Scripts>
<joystick family="Xbox 360 Controller (Windows)">
- <button id="3">Info</button>
+ <button id="3">ContextMenu</button>
</joystick>
<joystick family="Xbox 360 Controller (xpad)">
- <button id="3">Info</button>
+ <button id="3">ContextMenu</button>
</joystick>
</Scripts>
<Settings>
diff --git a/system/keymaps/keyboard.xml b/system/keymaps/keyboard.xml
index 4ca667ee26..f420c48ee8 100644
--- a/system/keymaps/keyboard.xml
+++ b/system/keymaps/keyboard.xml
@@ -18,9 +18,10 @@
<!-- <obc45>Stop</obc45> -->
<!-- </universalremote> -->
-<!-- Note that the action can be a built-in function. -->
-<!-- eg <B>ActivateWindow(MyMusic)</B> -->
-<!-- would automatically go to My Music on the press of the B button. -->
+<!-- Note that the action can be a built-in function. -->
+<!-- eg <B>ActivateWindow(MyMusic)</B> -->
+<!-- would automatically go to My Music on the press of the B button. -->
+<!-- An empty action removes the corresponding mapping from the default keymap -->
<!-- Joysticks / Gamepads: -->
<!-- See the sample PS3 controller configuration below for the format. -->
@@ -72,6 +73,7 @@
<menu>ContextMenu</menu>
<menu mod="longpress">Menu</menu>
<c>ContextMenu</c>
+ <c mod="longpress">Menu</c>
<space>Pause</space>
<x>Stop</x>
<period>SkipNext</period>
@@ -115,6 +117,11 @@
<j>ActivateWindow(RadioChannels)</j>
<k>ActivateWindow(TVRecordings)</k>
<b>ActivateWindow(TVTimers)</b>
+ <!-- PVR -->
+ <red>ActivateWindow(TVChannels)</red>
+ <green>ActivateWindow(MyVideos)</green>
+ <yellow>ActivateWindow(MyMusic)</yellow>
+ <blue>ActivateWindow(MyPictures)</blue>
<!-- Multimedia keyboard keys -->
<browser_back>Back</browser_back>
<browser_forward/>
@@ -122,7 +129,10 @@
<browser_stop/>
<browser_search/>
<browser_favorites>ActivateWindow(Favourites)</browser_favorites>
+ <favorites>ActivateWindow(Favourites)</favorites>
+ <config>ActivateWindow(Settings)</config>
<browser_home>ActivateWindow(Home)</browser_home>
+ <homepage>ActivateWindow(Home)</homepage>
<volume_mute>Mute</volume_mute>
<volume_down>VolumeDown</volume_down>
<volume_up>VolumeUp</volume_up>
@@ -150,6 +160,8 @@
<f mod="ctrl">SkipNext</f> <!-- Skip -->
<b mod="ctrl">SkipPrevious</b> <!-- Replay -->
<d mod="ctrl">Info</d> <!-- MCE Details -->
+ <r mod="ctrl">Record</r> <!-- Record -->
+ <f4 mod="alt">PreviousMenu</f4> <!-- Exit -->
<f10>VolumeUp</f10> <!-- MCE Vol up -->
<f9>VolumeDown</f9> <!-- MCE Vol down -->
<f8>Mute</f8> <!-- MCE mute -->
@@ -179,6 +191,7 @@
<keyboard>
<i>info</i>
<end mod="ctrl">ShutDown()</end>
+ <backspace mod="longpress">ActivateWindow(ShutdownMenu)</backspace>
</keyboard>
</Home>
<VirtualKeyboard>
@@ -189,58 +202,81 @@
<down>Down</down>
<return>Select</return>
<enter>Select</enter>
- <return mod="longpress">Enter</return>
- <enter mod="longpress">Enter</enter>
<left mod="longpress">Backspace</left>
<right mod="longpress">Number0</right> <!-- first entry creates a space -->
<up mod="longpress">Shift</up>
<down mod="longpress">Symbols</down>
<backspace>Backspace</backspace>
<browser_back>Backspace</browser_back>
- <backspace mod="longpress">PreviousMenu</backspace>
<browser_back mod="longpress">PreviousMenu</browser_back>
</keyboard>
</VirtualKeyboard>
<MyTVChannels>
<keyboard>
<m mod="ctrl">Move</m>
+ <h>PreviousMenu</h>
</keyboard>
</MyTVChannels>
<MyTVRecordings>
<keyboard>
<delete>Delete</delete>
<r>Rename</r>
+ <k>PreviousMenu</k>
+ <red>Red</red>
+ <green>Green</green>
+ <yellow>Yellow</yellow>
+ <blue>Blue</blue>
</keyboard>
</MyTVRecordings>
<MyTVTimers>
<keyboard>
<delete>Delete</delete>
<r>Rename</r>
+ <b>PreviousMenu</b>
+ <red>Red</red>
+ <green>Green</green>
+ <yellow>Yellow</yellow>
+ <blue>Blue</blue>
</keyboard>
</MyTVTimers>
<MyRadioChannels>
<keyboard>
<m mod="ctrl">Move</m>
+ <j>PreviousMenu</j>
</keyboard>
</MyRadioChannels>
<MyRadioRecordings>
<keyboard>
<delete>Delete</delete>
<r>Rename</r>
+ <red>Red</red>
+ <green>Green</green>
+ <yellow>Yellow</yellow>
+ <blue>Blue</blue>
</keyboard>
</MyRadioRecordings>
<MyRadioTimers>
<keyboard>
<delete>Delete</delete>
<r>Rename</r>
+ <red>Red</red>
+ <green>Green</green>
+ <yellow>Yellow</yellow>
+ <blue>Blue</blue>
</keyboard>
</MyRadioTimers>
+ <TVGuide>
+ <keyboard>
+ <e>PreviousMenu</e>
+ </keyboard>
+ </TVGuide>
<MyFiles>
<keyboard>
<space>Highlight</space>
<delete>Delete</delete>
<m>Move</m>
<r>Rename</r>
+ <play_pause mod="longpress">Highlight</play_pause>
</keyboard>
</MyFiles>
<MyMusicPlaylist>
@@ -293,6 +329,7 @@
<i>Info</i>
<o>CodecInfo</o>
<z>AspectRatio</z>
+ <zoom>AspectRatio</zoom>
<t>ShowSubtitles</t>
<t mod="ctrl">SubtitleAlign</t>
<l>NextSubtitle</l>
@@ -304,6 +341,7 @@
<escape>Fullscreen</escape>
<c>Playlist</c>
<v>ActivateWindow(Teletext)</v>
+ <text>ActivateWindow(Teletext)</text>
<up mod="ctrl">SubtitleShiftUp</up>
<down mod="ctrl">SubtitleShiftDown</down>
<pageup>SkipNext</pageup>
@@ -352,6 +390,7 @@
<i>Info</i>
<p>ActivateWindow(VisualisationPresetList)</p>
<v>Addon.Default.OpenSettings(xbmc.player.musicviz)</v>
+ <text>Addon.Default.OpenSettings(xbmc.player.musicviz)</text>
<n>ActivateWindow(MusicPlaylist)</n>
<left>StepBack</left>
<right>StepForward</right>
@@ -376,6 +415,7 @@
<o>CodecInfo</o>
<p>ActivateWindow(VisualisationPresetList)</p>
<v>Addon.Default.OpenSettings(xbmc.player.musicviz)</v>
+ <text>Addon.Default.OpenSettings(xbmc.player.musicviz)</text>
<n>ActivateWindow(MusicPlaylist)</n>
</keyboard>
</MusicOSD>
@@ -390,6 +430,7 @@
<o>CodecInfo</o>
<p>ActivateWindow(VisualisationPresetList)</p>
<v>Back</v>
+ <text>Back</text>
<n>ActivateWindow(MusicPlaylist)</n>
</keyboard>
</VisualisationSettings>
@@ -404,6 +445,7 @@
<o>CodecInfo</o>
<p>Back</p>
<v>Back</v>
+ <text>Back</text>
<n>ActivateWindow(MusicPlaylist)</n>
</keyboard>
</VisualisationPresetList>
@@ -463,6 +505,7 @@
<i>Info</i>
<o>CodecInfo</o>
<z>AspectRatio</z>
+ <zoom>AspectRatio</zoom>
<t>ShowSubtitles</t>
<l>NextSubtitle</l>
<a>AudioDelay</a>
@@ -552,6 +595,11 @@
<Teletext>
<keyboard>
<v>Back</v>
+ <text>Back</text>
+ <red>Red</red>
+ <green>Green</green>
+ <yellow>Yellow</yellow>
+ <blue>Blue</blue>
</keyboard>
</Teletext>
<Favourites>
@@ -640,9 +688,13 @@
<Addon>
<keyboard>
<f1>Red</f1>
+ <red>Red</red>
<f2>Green</f2>
+ <green>Green</green>
<f3>Yellow</f3>
+ <yellow>Yellow</yellow>
<f4>Blue</f4>
+ <blue>Blue</blue>
</keyboard>
</Addon>
</keymap>
diff --git a/system/keymaps/mouse.xml b/system/keymaps/mouse.xml
index d83fab0990..c2b39f86d3 100644
--- a/system/keymaps/mouse.xml
+++ b/system/keymaps/mouse.xml
@@ -29,4 +29,11 @@
<wheeldown>NextPicture</wheeldown>
</mouse>
</SlideShow>
+ <FullscreenVideo>
+ <mouse>
+ <rightclick>Info</rightclick>
+ </mouse>
+ </FullscreenVideo>
+
+
</keymap>
diff --git a/system/keymaps/remote.xml b/system/keymaps/remote.xml
index 8e37d0f305..aded72bba4 100644
--- a/system/keymaps/remote.xml
+++ b/system/keymaps/remote.xml
@@ -18,9 +18,10 @@
<!-- <obc45>Stop</obc45> -->
<!-- </universalremote> -->
-<!-- Note that the action can be a built-in function. -->
-<!-- eg <B>ActivateWindow(MyMusic)</B> -->
-<!-- would automatically go to My Music on the press of the B button. -->
+<!-- Note that the action can be a built-in function. -->
+<!-- eg <B>ActivateWindow(MyMusic)</B> -->
+<!-- would automatically go to My Music on the press of the B button. -->
+<!-- An empty action removes the corresponding mapping from the default keymap -->
<!-- Joysticks / Gamepads: -->
<!-- See the sample PS3 controller configuration below for the format. -->
diff --git a/system/keymaps/touchscreen.xml b/system/keymaps/touchscreen.xml
index 576fb273bd..4d16457c2a 100644
--- a/system/keymaps/touchscreen.xml
+++ b/system/keymaps/touchscreen.xml
@@ -11,8 +11,17 @@
<swipe direction="right">SwipeRight</swipe>
<swipe direction="up">SwipeUp</swipe>
<swipe direction="down">SwipeDown</swipe>
+ <swipe direction="up" pointers="3">SwitchPlayer</swipe>
+ <swipe direction="down" pointers="3">ActivateWindow(PlayerControls)</swipe>
</touch>
</global>
+ <MyFiles>
+ <touch>
+ <tap>Select</tap>
+ <swipe direction="left">Highlight</swipe>
+ <swipe direction="right">Highlight</swipe>
+ </touch>
+ </MyFiles>
<FullScreenVideo>
<touch>
<swipe direction="left">StepBack</swipe>
@@ -20,29 +29,39 @@
<swipe direction="up">ChapterOrBigStepForward</swipe>
<swipe direction="down">ChapterOrBigStepBack</swipe>
<swipe direction="left" pointers="2">Seek(-7)</swipe>
+ <swipe direction="up" pointers="2">SkipNext</swipe>
+ <swipe direction="down" pointers="2">SkipPrevious</swipe>
+ <tap pointers="2">Playlist</tap>
+ <tap pointers="3">PlayPause</tap>
</touch>
</FullScreenVideo>
+ <PlayerControls>
+ <touch>
+ <swipe direction="down" pointers="3">Back</swipe>
+ </touch>
+ </PlayerControls>
<Visualisation>
<touch>
<swipe direction="left">StepBack</swipe>
<swipe direction="right">StepForward</swipe>
<swipe direction="up">SkipNext</swipe>
<swipe direction="down">SkipPrevious</swipe>
+ <swipe direction="up" pointers="2">SkipNext</swipe>
+ <swipe direction="down" pointers="2">SkipPrevious</swipe>
+ <tap pointers="2">Playlist</tap>
+ <tap pointers="3">PlayPause</tap>
</touch>
</Visualisation>
<SlideShow>
<touch>
<zoom>ZoomGesture</zoom>
<rotate>RotateGesture</rotate>
+ <swipe direction="right" pointers="2">PreviousPicture</swipe> <!-- right/left are flipped here to make picture flipping feel more natural on touch screens. Two pointers are used in order to avoid conflicting with the panning gesture on zoomed-in images. -->
+ <swipe direction="left" pointers="2">NextPicture</swipe>
+ <tap pointers="2">Pause</tap>
+ <tap pointers="3">Info</tap>
</touch>
</SlideShow>
- <MyFiles>
- <touch>
- <tap>Select</tap>
- <swipe direction="left">Highlight</swipe>
- <swipe direction="right">Highlight</swipe>
- </touch>
- </MyFiles>
<ScreenCalibration>
<touch>
<swipe direction="up">Up</swipe>
@@ -52,4 +71,33 @@
<tap pointers="1">NextCalibration</tap>
</touch>
</ScreenCalibration>
-</keymap>
+ <VideoMenu>
+ <touch>
+ <swipe direction="up" pointers="2">SkipNext</swipe>
+ <swipe direction="down" pointers="2">SkipPrevious</swipe>
+ </touch>
+ </VideoMenu>
+ <ContextMenu>
+ <touch>
+ <swipe direction="left" pointers="3">Back</swipe> <!-- backs out of "switch player" -->
+ <swipe direction="right" pointers="3">Back</swipe>
+ </touch>
+ </ContextMenu>
+ <PictureInfo>
+ <touch>
+ <tap pointers="3">Back</tap>
+ </touch>
+ </PictureInfo>
+ <FullScreenLiveTV>
+ <touch>
+ <swipe direction="up">Up</swipe>
+ <swipe direction="down">Down</swipe>
+ </touch>
+ </FullScreenLiveTV>
+ <FullScreenRadio>
+ <touch>
+ <swipe direction="up">ChannelUp</swipe>
+ <swipe direction="down">ChannelDown</swipe>
+ </touch>
+ </FullScreenRadio>
+</keymap> \ No newline at end of file
diff --git a/system/settings/android.xml b/system/settings/android.xml
index 1c5341b47b..78123c75ba 100644
--- a/system/settings/android.xml
+++ b/system/settings/android.xml
@@ -8,6 +8,13 @@
</category>
</section>
<section id="videos">
+ <category id="videoplayer">
+ <group id="3">
+ <setting id="videoplayer.usedisplayasclock">
+ <visible>false</visible>
+ </setting>
+ </group>
+ </category>
<category id="videoacceleration">
<group id="3">
<setting id="videoplayer.usestagefright" type="boolean" label="13436" help="36260">
diff --git a/system/settings/settings.xml b/system/settings/settings.xml
index a2bd4efc6f..da1b8e7c1a 100644
--- a/system/settings/settings.xml
+++ b/system/settings/settings.xml
@@ -481,6 +481,11 @@
<default>false</default>
<control type="toggle" />
</setting>
+ <setting id="videolibrary.showemptytvshows" type="boolean" label="20471" help="36163">
+ <level>1</level>
+ <default>false</default>
+ <control type="toggle" />
+ </setting>
</group>
<group id="2">
<setting id="videolibrary.updateonstartup" type="boolean" label="22000" help="36146">
@@ -1154,7 +1159,7 @@
</setting>
<setting id="scrapers.musicvideosdefault" type="addon" label="21415" help="36200">
<level>4</level>
- <default>metadata.musicvideos.theaudiodb.com</default>
+ <default>metadata.local</default>
<constraints>
<addontype>xbmc.metadata.scraper.musicvideos</addontype>
</constraints>
@@ -1944,94 +1949,6 @@
</setting>
</group>
</category>
- <category id="karaoke" label="13327" help="36292">
- <requirement>HAS_KARAOKE</requirement>
- <group id="1">
- <setting id="karaoke.enabled" type="boolean" label="13323" help="36293">
- <level>2</level>
- <default>false</default>
- <control type="toggle" />
- </setting>
- <setting id="karaoke.autopopupselector" type="boolean" label="22037" help="36294">
- <level>2</level>
- <default>false</default>
- <dependencies>
- <dependency type="enable" setting="karaoke.enabled">true</dependency>
- </dependencies>
- <control type="toggle" />
- </setting>
- </group>
- <group id="2">
- <setting id="karaoke.font" type="string" label="22030" help="36295">
- <level>2</level>
- <default>arial.ttf</default>
- <constraints>
- <options>fonts</options>
- </constraints>
- <dependencies>
- <dependency type="enable" setting="karaoke.enabled">true</dependency>
- </dependencies>
- <control type="list" format="string" />
- </setting>
- <setting id="karaoke.fontheight" type="integer" parent="karaoke.font" label="22031" help="36296">
- <level>2</level>
- <default>36</default>
- <constraints>
- <minimum>16</minimum>
- <step>2</step>
- <maximum>74</maximum>
- </constraints>
- <dependencies>
- <dependency type="enable" setting="karaoke.enabled">true</dependency>
- <dependency type="update" setting="karaoke.font" />
- </dependencies>
- <control type="spinner" format="string" />
- </setting>
- <setting id="karaoke.fontcolors" type="integer" parent="karaoke.font" label="22032" help="36297">
- <level>2</level>
- <default>0</default> <!-- white/green -->
- <constraints>
- <options>
- <option label="22040">0</option> <!-- white/green -->
- <option label="22041">1</option> <!-- white/red -->
- <option label="22042">2</option> <!-- white/blue -->
- <option label="22043">3</option> <!-- black/white -->
- </options>
- </constraints>
- <dependencies>
- <dependency type="enable" setting="karaoke.enabled">true</dependency>
- </dependencies>
- <control type="list" format="string" />
- </setting>
- <setting id="karaoke.charset" type="string" parent="karaoke.font" label="22033" help="36298">
- <level>2</level>
- <default>DEFAULT</default>
- <constraints>
- <options>charsets</options>
- </constraints>
- <dependencies>
- <dependency type="enable" setting="karaoke.enabled">true</dependency>
- </dependencies>
- <control type="list" format="string" />
- </setting>
- </group>
- <group id="3">
- <setting id="karaoke.export" type="action" label="22038" help="36299">
- <level>2</level>
- <dependencies>
- <dependency type="enable" setting="karaoke.enabled">true</dependency>
- </dependencies>
- <control type="button" format="action" />
- </setting>
- <setting id="karaoke.importcsv" type="action" label="22036" help="36300">
- <level>2</level>
- <dependencies>
- <dependency type="enable" setting="karaoke.enabled">true</dependency>
- </dependencies>
- <control type="button" format="action" />
- </setting>
- </group>
- </category>
<category id="mymusic" label="0" help="0">
<group id="1">
<setting id="mymusic.startwindow" type="integer" label="0" help="36301">
diff --git a/system/settings/win32.xml b/system/settings/win32.xml
index c676390672..ad3c9b4fdd 100644
--- a/system/settings/win32.xml
+++ b/system/settings/win32.xml
@@ -7,15 +7,6 @@
</group>
</category>
</section>
- <section id="videos">
- <category id="videoplayer">
- <group id="3">
- <setting id="videoplayer.usedisplayasclock">
- <requirement negated="true">HAS_GL</requirement>
- </setting>
- </group>
- </category>
- </section>
<section id="services">
<category id="zeroconf">
<group id="1">
diff --git a/tools/android/packaging/xbmc/AndroidManifest.xml.in b/tools/android/packaging/xbmc/AndroidManifest.xml.in
index c10630b99c..5d276bdd33 100644
--- a/tools/android/packaging/xbmc/AndroidManifest.xml.in
+++ b/tools/android/packaging/xbmc/AndroidManifest.xml.in
@@ -82,6 +82,16 @@
android:name="android.app.lib_name"
android:value="@APP_NAME_LC@" />
</activity>
+
+ <receiver android:name=".XBMCBroadcastReceiver" >
+ <intent-filter>
+ <action android:name="android.intent.action.DREAMING_STOPPED" />
+ <action android:name="android.intent.action.HEADSET_PLUG" />
+ <action android:name="android.bluetooth.a2dp.profile.action.CONNECTION_STATE_CHANGED" />
+ <action android:name="android.intent.action.MEDIA_BUTTON" />
+ </intent-filter>
+ </receiver>
+
</application>
</manifest><!-- END_INCLUDE(manifest) -->
diff --git a/tools/android/packaging/xbmc/src/org/xbmc/kodi/Main.java.in b/tools/android/packaging/xbmc/src/org/xbmc/kodi/Main.java.in
index 8b1848396a..bfa7c14419 100644
--- a/tools/android/packaging/xbmc/src/org/xbmc/kodi/Main.java.in
+++ b/tools/android/packaging/xbmc/src/org/xbmc/kodi/Main.java.in
@@ -1,6 +1,7 @@
package org.xbmc.@APP_NAME_LC@;
import android.app.NativeActivity;
+import android.content.ComponentName;
import android.content.Intent;
import android.media.AudioManager;
import android.os.Bundle;
@@ -61,6 +62,18 @@ public class Main extends NativeActivity
}
});
}
+
+ public void registerMediaButtonEventReceiver()
+ {
+ AudioManager manager = (AudioManager) getSystemService(AUDIO_SERVICE);
+ manager.registerMediaButtonEventReceiver(new ComponentName(getPackageName(), XBMCBroadcastReceiver.class.getName()));
+ }
+
+ public void unregisterMediaButtonEventReceiver()
+ {
+ AudioManager manager = (AudioManager) getSystemService(AUDIO_SERVICE);
+ manager.unregisterMediaButtonEventReceiver(new ComponentName(getPackageName(), XBMCBroadcastReceiver.class.getName()));
+ }
@Override
public void onCreate(Bundle savedInstanceState)
diff --git a/tools/android/packaging/xbmc/src/org/xbmc/kodi/Splash.java.in b/tools/android/packaging/xbmc/src/org/xbmc/kodi/Splash.java.in
index 6dc74d4070..47282b4c61 100644
--- a/tools/android/packaging/xbmc/src/org/xbmc/kodi/Splash.java.in
+++ b/tools/android/packaging/xbmc/src/org/xbmc/kodi/Splash.java.in
@@ -683,15 +683,23 @@ public class Splash extends Activity {
mStateMachine.sendEmptyMessage(Checking);
String curArch = "";
- try {
+ String curArch2 = "";
+ try
+ {
curArch = Build.CPU_ABI.substring(0,3);
- } catch (IndexOutOfBoundsException e) {
+ } catch (IndexOutOfBoundsException e)
+ {
mErrorMsg = "Error! Unexpected architecture: " + Build.CPU_ABI;
Log.e(TAG, mErrorMsg);
mState = InError;
- }
+ }
+ try
+ {
+ curArch2 = Build.CPU_ABI2.substring(0,3);
+ } catch (IndexOutOfBoundsException e) {}
- if (mState != InError) {
+ if (mState != InError)
+ {
// Check if we are on the proper arch
// Read the properties
@@ -701,8 +709,10 @@ public class Splash extends Activity {
Properties properties = new Properties();
properties.load(xbmcprop);
- if (!curArch.equalsIgnoreCase(properties.getProperty("native_arch"))) {
- mErrorMsg = "This @APP_NAME@ package is not compatible with your device (" + curArch + " vs. " + properties.getProperty("native_arch") +").\nPlease check the <a href=\"http://wiki.kodi.tv/index.php?title=XBMC_for_Android_specific_FAQ\">Kodi Android wiki</a> for more information.";
+ if (!curArch.equalsIgnoreCase(properties.getProperty("native_arch"))
+ && !curArch2.equalsIgnoreCase(properties.getProperty("native_arch")))
+ {
+ mErrorMsg = "This @APP_NAME@ package is not compatible with your device (device=" + curArch + " vs. package=" + properties.getProperty("native_arch") +").\nPlease check the <a href=\"http://wiki.kodi.tv/index.php?title=XBMC_for_Android_specific_FAQ\">Kodi Android wiki</a> for more information.";
Log.e(TAG, mErrorMsg);
mState = InError;
}
diff --git a/tools/android/packaging/xbmc/src/org/xbmc/kodi/XBMCVideoView.java.in b/tools/android/packaging/xbmc/src/org/xbmc/kodi/XBMCVideoView.java.in
index 432a7cdb01..2980bf5190 100644
--- a/tools/android/packaging/xbmc/src/org/xbmc/kodi/XBMCVideoView.java.in
+++ b/tools/android/packaging/xbmc/src/org/xbmc/kodi/XBMCVideoView.java.in
@@ -46,6 +46,9 @@ public class XBMCVideoView extends SurfaceView implements
*/
public void clearSurface()
{
+ if (!mHasHolder)
+ return;
+
// Have to go EGL to allow reuse of surface
final int EGL_OPENGL_ES2_BIT = 4;
diff --git a/tools/buildsteps/android/make-binary-addons b/tools/buildsteps/android/make-binary-addons
index f6bb1e4c9e..a82e0210cd 100644
--- a/tools/buildsteps/android/make-binary-addons
+++ b/tools/buildsteps/android/make-binary-addons
@@ -8,8 +8,8 @@ XBMC_PLATFORM_DIR=android
rm -f $WORKSPACE/project/cmake/$FAILED_BUILD_FILENAME
ALL_BINARY_ADDONS_BUILT="1"
-#only build binary addons if something in the addons metadata changed
-if [ "$(pathChanged $WORKSPACE/project/cmake)" == "1" ]
+#only build binary addons when requested by env/jenkins
+if [ "$BUILD_BINARY_ADDONS" == "true" ]
then
for addon in $BINARY_ADDONS
do
diff --git a/tools/buildsteps/androidx86/make-binary-addons b/tools/buildsteps/androidx86/make-binary-addons
index 084c372227..e3e189932a 100644
--- a/tools/buildsteps/androidx86/make-binary-addons
+++ b/tools/buildsteps/androidx86/make-binary-addons
@@ -8,8 +8,8 @@ XBMC_PLATFORM_DIR=android
rm -f $WORKSPACE/project/cmake/$FAILED_BUILD_FILENAME
ALL_BINARY_ADDONS_BUILT="1"
-#only build binary addons if something in the addons metadata changed
-if [ "$(pathChanged $WORKSPACE/project/cmake)" == "1" ]
+#only build binary addons when requested by env/jenkins
+if [ "$BUILD_BINARY_ADDONS" == "true" ]
then
for addon in $BINARY_ADDONS
do
diff --git a/tools/buildsteps/defaultenv b/tools/buildsteps/defaultenv
index e8091360e0..e124516d7f 100644
--- a/tools/buildsteps/defaultenv
+++ b/tools/buildsteps/defaultenv
@@ -21,12 +21,6 @@ case $XBMC_PLATFORM_DIR in
DEFAULT_CONFIGURATION="Debug"
;;
- osx32)
- DEFAULT_SDK_VERSION=10.10
- DEFAULT_XBMC_DEPENDS_ROOT=$WORKSPACE/tools/depends/xbmc-depends
- DEFAULT_CONFIGURATION="Debug"
- ;;
-
osx64)
DEFAULT_SDK_VERSION=10.10
DEFAULT_XBMC_DEPENDS_ROOT=$WORKSPACE/tools/depends/xbmc-depends
diff --git a/tools/buildsteps/ios/make-binary-addons b/tools/buildsteps/ios/make-binary-addons
index ae5cf7a8c8..baf9172cf4 100755
--- a/tools/buildsteps/ios/make-binary-addons
+++ b/tools/buildsteps/ios/make-binary-addons
@@ -8,8 +8,8 @@ XBMC_PLATFORM_DIR=ios
rm -f $WORKSPACE/project/cmake/$FAILED_BUILD_FILENAME
ALL_BINARY_ADDONS_BUILT="1"
-#only build binary addons if something in the addons metadata changed
-if [ "$(pathChanged $WORKSPACE/project/cmake)" == "1" ]
+#only build binary addons when requested by env/jenkins
+if [ "$BUILD_BINARY_ADDONS" == "true" ]
then
for addon in $BINARY_ADDONS
do
diff --git a/tools/buildsteps/linux32/configure-depends b/tools/buildsteps/linux32/configure-depends
deleted file mode 100755
index 4e143d6992..0000000000
--- a/tools/buildsteps/linux32/configure-depends
+++ /dev/null
@@ -1,9 +0,0 @@
-WORKSPACE=${WORKSPACE:-$( cd $(dirname $0)/../../.. ; pwd -P )}
-XBMC_PLATFORM_DIR=linux32
-. $WORKSPACE/tools/buildsteps/defaultenv
-
-if [ "$(pathChanged $WORKSPACE/tools/depends)" == "1" ]
-then
- cd $WORKSPACE/tools/depends;./configure \
- --with-toolchain=/usr --prefix=$XBMC_DEPENDS_ROOT --host=i686-linux-gnu --with-tarballs=$TARBALLS
-fi
diff --git a/tools/buildsteps/linux32/configure-xbmc b/tools/buildsteps/linux32/configure-xbmc
deleted file mode 100755
index de0247a9cf..0000000000
--- a/tools/buildsteps/linux32/configure-xbmc
+++ /dev/null
@@ -1,5 +0,0 @@
-WORKSPACE=${WORKSPACE:-$( cd $(dirname $0)/../../.. ; pwd -P )}
-XBMC_PLATFORM_DIR=linux32
-. $WORKSPACE/tools/buildsteps/defaultenv
-
-make -C $WORKSPACE/tools/depends/target/xbmc
diff --git a/tools/buildsteps/linux32/make-binary-addons b/tools/buildsteps/linux32/make-binary-addons
deleted file mode 100755
index a7bb138e42..0000000000
--- a/tools/buildsteps/linux32/make-binary-addons
+++ /dev/null
@@ -1,28 +0,0 @@
-WORKSPACE=${WORKSPACE:-$( cd $(dirname $0)/../../.. ; pwd -P )}
-XBMC_PLATFORM_DIR=linux32
-. $WORKSPACE/tools/buildsteps/defaultenv
-
-. $WORKSPACE/tools/buildsteps/$XBMC_PLATFORM_DIR/make-native-depends
-
-#clear the build failed file
-rm -f $WORKSPACE/project/cmake/$FAILED_BUILD_FILENAME
-
-ALL_BINARY_ADDONS_BUILT="1"
-#only build binary addons if something in the addons metadata changed
-if [ "$(pathChanged $WORKSPACE/project/cmake)" == "1" ]
-then
- for addon in $BINARY_ADDONS
- do
- echo "building $addon"
- git clean -xffd $WORKSPACE/$BINARY_ADDONS_ROOT/$addon
- cd $WORKSPACE/$BINARY_ADDONS_ROOT/$addon;make -j $BUILDTHREADS V=99 VERBOSE=1 || ALL_BINARY_ADDONS_BUILT="0"
- done
-fi
-
-if [ "$ALL_BINARY_ADDONS_BUILT" == "1" ]
-then
- tagSuccessFulBuild $WORKSPACE/project/cmake
-else
- #mark the build failure in the filesystem but leave jenkins running
- tagFailedBuild $WORKSPACE/project/cmake
-fi
diff --git a/tools/buildsteps/linux32/make-depends b/tools/buildsteps/linux32/make-depends
deleted file mode 100755
index d5371e837d..0000000000
--- a/tools/buildsteps/linux32/make-depends
+++ /dev/null
@@ -1,9 +0,0 @@
-WORKSPACE=${WORKSPACE:-$( cd $(dirname $0)/../../.. ; pwd -P )}
-XBMC_PLATFORM_DIR=linux32
-. $WORKSPACE/tools/buildsteps/defaultenv
-
-if [ "$(pathChanged $WORKSPACE/tools/depends)" == "1" ]
-then
- cd $WORKSPACE/tools/depends;make -j $BUILDTHREADS || make && tagSuccessFulBuild $WORKSPACE/tools/depends
-fi
-
diff --git a/tools/buildsteps/linux32/make-native-depends b/tools/buildsteps/linux32/make-native-depends
deleted file mode 100755
index 9afd70b1ab..0000000000
--- a/tools/buildsteps/linux32/make-native-depends
+++ /dev/null
@@ -1,9 +0,0 @@
-WORKSPACE=${WORKSPACE:-$( cd $(dirname $0)/../../.. ; pwd -P )}
-XBMC_PLATFORM_DIR=linux32
-. $WORKSPACE/tools/buildsteps/defaultenv
-
-if [ "$(pathChanged $WORKSPACE/tools/depends)" == "1" ] && [ "$BINARY_ADDONS_CLEAN_NATIVETOOLS" != "0" ]
-then
- git clean -xffd $WORKSPACE/tools/depends/native
- cd $WORKSPACE/tools/depends/native;make -j $BUILDTHREADS && tagSuccessFulBuild $WORKSPACE/tools/depends
-fi \ No newline at end of file
diff --git a/tools/buildsteps/linux32/make-xbmc b/tools/buildsteps/linux32/make-xbmc
deleted file mode 100755
index 79f07e2dc4..0000000000
--- a/tools/buildsteps/linux32/make-xbmc
+++ /dev/null
@@ -1,5 +0,0 @@
-WORKSPACE=${WORKSPACE:-$( cd $(dirname $0)/../../.. ; pwd -P )}
-XBMC_PLATFORM_DIR=linux32
-. $WORKSPACE/tools/buildsteps/defaultenv
-
-cd $WORKSPACE;make -j$BUILDTHREADS || make
diff --git a/tools/buildsteps/linux32/package b/tools/buildsteps/linux32/package
deleted file mode 100755
index b073061176..0000000000
--- a/tools/buildsteps/linux32/package
+++ /dev/null
@@ -1,5 +0,0 @@
-WORKSPACE=${WORKSPACE:-$( cd $(dirname $0)/../../.. ; pwd -P )}
-XBMC_PLATFORM_DIR=linux32
-. $WORKSPACE/tools/buildsteps/defaultenv
-
-#nothing for linux atm
diff --git a/tools/buildsteps/linux32/prepare-depends b/tools/buildsteps/linux32/prepare-depends
deleted file mode 100755
index 525d78b325..0000000000
--- a/tools/buildsteps/linux32/prepare-depends
+++ /dev/null
@@ -1,15 +0,0 @@
-WORKSPACE=${WORKSPACE:-$( cd $(dirname $0)/../../.. ; pwd -P )}
-XBMC_PLATFORM_DIR=linux32
-. $WORKSPACE/tools/buildsteps/defaultenv
-
-#clean without depends for skipping depends build if possible
-#also skip binary addons (pvr, audioencoder) as long as they are deployed in tree
-cd $WORKSPACE;git clean -xfd -e "project/cmake/.last_success_revision" -e "tools/depends" ${DEPLOYED_BINARY_ADDONS}
-
-# if depends path has changed - cleanout everything and do a full rebuild
-if [ "$(pathChanged $WORKSPACE/tools/depends)" == "1" ]
-then
- #clean up the rest too
- cd $WORKSPACE;git clean -xffd
- cd $WORKSPACE/tools/depends/;./bootstrap
-fi
diff --git a/tools/buildsteps/linux32/prepare-xbmc b/tools/buildsteps/linux32/prepare-xbmc
deleted file mode 100755
index f22988a5ee..0000000000
--- a/tools/buildsteps/linux32/prepare-xbmc
+++ /dev/null
@@ -1,9 +0,0 @@
-WORKSPACE=${WORKSPACE:-$( cd $(dirname $0)/../../.. ; pwd -P )}
-XBMC_PLATFORM_DIR=linux32
-. $WORKSPACE/tools/buildsteps/defaultenv
-
-#build binary addons before building xbmc...
-#make sure that binary_addons don't clean the native tools
-#here (e.x. on release builds where pathChanged always returns 1
-BINARY_ADDONS_CLEAN_NATIVETOOLS="0"
-. $WORKSPACE/tools/buildsteps/$XBMC_PLATFORM_DIR/make-binary-addons
diff --git a/tools/buildsteps/linux32/run-tests b/tools/buildsteps/linux32/run-tests
deleted file mode 100755
index 088c21a101..0000000000
--- a/tools/buildsteps/linux32/run-tests
+++ /dev/null
@@ -1,9 +0,0 @@
-WORKSPACE=${WORKSPACE:-$( cd $(dirname $0)/../../.. ; pwd -P )}
-XBMC_PLATFORM_DIR=linux32
-. $WORKSPACE/tools/buildsteps/defaultenv
-
-cd $WORKSPACE;make -j$BUILDTHREADS testsuite
-cd $WORKSPACE;./kodi-test --gtest_output=xml:gtestresults.xml
-awk '{ if ($1 == "<testcase" && match($0, "notrun")) print substr($0,0,length($0)-2) "><skipped/></testcase>"; else print $0;}' gtestresults.xml > gtestresults-skipped.xml
-rm gtestresults.xml
-mv gtestresults-skipped.xml gtestresults.xml
diff --git a/tools/buildsteps/linux64/make-binary-addons b/tools/buildsteps/linux64/make-binary-addons
index 72cf5db6e8..beda7297f0 100755
--- a/tools/buildsteps/linux64/make-binary-addons
+++ b/tools/buildsteps/linux64/make-binary-addons
@@ -8,8 +8,8 @@ XBMC_PLATFORM_DIR=linux64
rm -f $WORKSPACE/project/cmake/$FAILED_BUILD_FILENAME
ALL_BINARY_ADDONS_BUILT="1"
-#only build binary addons if something in the addons metadata changed
-if [ "$(pathChanged $WORKSPACE/project/cmake)" == "1" ]
+#only build binary addons when requested by env/jenkins
+if [ "$BUILD_BINARY_ADDONS" == "true" ]
then
for addon in $BINARY_ADDONS
do
diff --git a/tools/buildsteps/osx32/configure-depends b/tools/buildsteps/osx32/configure-depends
deleted file mode 100755
index 3ccfc3553c..0000000000
--- a/tools/buildsteps/osx32/configure-depends
+++ /dev/null
@@ -1,12 +0,0 @@
-WORKSPACE=${WORKSPACE:-$( cd $(dirname $0)/../../.. ; pwd -P )}
-XBMC_PLATFORM_DIR=osx32
-. $WORKSPACE/tools/buildsteps/defaultenv
-
-if [ "$(pathChanged $WORKSPACE/tools/depends)" == "1" ]
-then
- cd $WORKSPACE/tools/depends;./configure \
- --with-tarballs=/Users/Shared/xbmc-depends/tarballs \
- --host=i386-apple-darwin \
- --with-sdk=$SDK_VERSION \
- --prefix=$XBMC_DEPENDS_ROOT
-fi
diff --git a/tools/buildsteps/osx32/configure-xbmc b/tools/buildsteps/osx32/configure-xbmc
deleted file mode 100755
index b7456ca4fd..0000000000
--- a/tools/buildsteps/osx32/configure-xbmc
+++ /dev/null
@@ -1,5 +0,0 @@
-WORKSPACE=${WORKSPACE:-$( cd $(dirname $0)/../../.. ; pwd -P )}
-XBMC_PLATFORM_DIR=osx32
-. $WORKSPACE/tools/buildsteps/defaultenv
-
-make -C $WORKSPACE/tools/depends/target/xbmc
diff --git a/tools/buildsteps/osx32/make-binary-addons b/tools/buildsteps/osx32/make-binary-addons
deleted file mode 100755
index efde78c410..0000000000
--- a/tools/buildsteps/osx32/make-binary-addons
+++ /dev/null
@@ -1,28 +0,0 @@
-WORKSPACE=${WORKSPACE:-$( cd $(dirname $0)/../../.. ; pwd -P )}
-XBMC_PLATFORM_DIR=osx32
-. $WORKSPACE/tools/buildsteps/defaultenv
-
-. $WORKSPACE/tools/buildsteps/$XBMC_PLATFORM_DIR/make-native-depends
-
-#clear the build failed file
-rm -f $WORKSPACE/project/cmake/$FAILED_BUILD_FILENAME
-
-ALL_BINARY_ADDONS_BUILT="1"
-#only build binary addons if something in the addons metadata changed
-if [ "$(pathChanged $WORKSPACE/project/cmake)" == "1" ]
-then
- for addon in $BINARY_ADDONS
- do
- echo "building $addon"
- git clean -xffd $WORKSPACE/$BINARY_ADDONS_ROOT/$addon
- cd $WORKSPACE/$BINARY_ADDONS_ROOT/$addon;make -j $BUILDTHREADS V=99 VERBOSE=1 || ALL_BINARY_ADDONS_BUILT="0"
- done
-fi
-
-if [ "$ALL_BINARY_ADDONS_BUILT" == "1" ]
-then
- tagSuccessFulBuild $WORKSPACE/project/cmake
-else
- #mark the build failure in the filesystem but leave jenkins running
- tagFailedBuild $WORKSPACE/project/cmake
-fi
diff --git a/tools/buildsteps/osx32/make-depends b/tools/buildsteps/osx32/make-depends
deleted file mode 100755
index ac149d74c3..0000000000
--- a/tools/buildsteps/osx32/make-depends
+++ /dev/null
@@ -1,9 +0,0 @@
-WORKSPACE=${WORKSPACE:-$( cd $(dirname $0)/../../.. ; pwd -P )}
-XBMC_PLATFORM_DIR=osx32
-. $WORKSPACE/tools/buildsteps/defaultenv
-
-if [ "$(pathChanged $WORKSPACE/tools/depends)" == "1" ]
-then
- cd $WORKSPACE/tools/depends;make -j $BUILDTHREADS && tagSuccessFulBuild $WORKSPACE/tools/depends
-fi
-
diff --git a/tools/buildsteps/osx32/make-native-depends b/tools/buildsteps/osx32/make-native-depends
deleted file mode 100755
index 7c0a3f4487..0000000000
--- a/tools/buildsteps/osx32/make-native-depends
+++ /dev/null
@@ -1,9 +0,0 @@
-WORKSPACE=${WORKSPACE:-$( cd $(dirname $0)/../../.. ; pwd -P )}
-XBMC_PLATFORM_DIR=osx32
-. $WORKSPACE/tools/buildsteps/defaultenv
-
-if [ "$(pathChanged $WORKSPACE/tools/depends)" == "1" ] && [ "$BINARY_ADDONS_CLEAN_NATIVETOOLS" != "0" ]
-then
- git clean -xffd $WORKSPACE/tools/depends/native
- cd $WORKSPACE/tools/depends/native;make -j $BUILDTHREADS && tagSuccessFulBuild $WORKSPACE/tools/depends
-fi \ No newline at end of file
diff --git a/tools/buildsteps/osx32/make-xbmc b/tools/buildsteps/osx32/make-xbmc
deleted file mode 100755
index e3d79f6910..0000000000
--- a/tools/buildsteps/osx32/make-xbmc
+++ /dev/null
@@ -1,8 +0,0 @@
-WORKSPACE=${WORKSPACE:-$( cd $(dirname $0)/../../.. ; pwd -P )}
-XBMC_PLATFORM_DIR=osx32
-. $WORKSPACE/tools/buildsteps/defaultenv
-
-cd $WORKSPACE;make -j$BUILDTHREADS xcode_depends
-
-cd $WORKSPACE;xcodebuild -sdk macosx$SDK_VERSION -project Kodi.xcodeproj -target Kodi.app ONLY_ACTIVE_ARCH=YES \
- ARCHS=i386 VALID_ARCHS=i386 XBMC_DEPENDS_ROOT=$XBMC_DEPENDS_ROOT -configuration $Configuration build
diff --git a/tools/buildsteps/osx32/package b/tools/buildsteps/osx32/package
deleted file mode 100755
index 95a7a5b677..0000000000
--- a/tools/buildsteps/osx32/package
+++ /dev/null
@@ -1,10 +0,0 @@
-WORKSPACE=${WORKSPACE:-$( cd $(dirname $0)/../../.. ; pwd -P )}
-XBMC_PLATFORM_DIR=osx32
-. $WORKSPACE/tools/buildsteps/defaultenv
-
-cd $WORKSPACE/tools/darwin/packaging/osx/; sh ./mkdmg-osx.sh $Configuration
-
-#rename for upload
-#e.x. kodi-20130314-8c2fb31-Frodo-i386.dmg
-UPLOAD_FILENAME="kodi-$(getBuildRevDateStr)-i386.dmg"
-mv *.dmg $UPLOAD_FILENAME
diff --git a/tools/buildsteps/osx32/prepare-depends b/tools/buildsteps/osx32/prepare-depends
deleted file mode 100755
index 3feb117e4a..0000000000
--- a/tools/buildsteps/osx32/prepare-depends
+++ /dev/null
@@ -1,15 +0,0 @@
-WORKSPACE=${WORKSPACE:-$( cd $(dirname $0)/../../.. ; pwd -P )}
-XBMC_PLATFORM_DIR=osx32
-. $WORKSPACE/tools/buildsteps/defaultenv
-
-#clean without depends for skipping depends build if possible
-#also skip binary addons (pvr, audioencoder) as long as they are deployed in tree
-cd $WORKSPACE;git clean -xfd -e "project/cmake/.last_success_revision" -e "tools/depends" ${DEPLOYED_BINARY_ADDONS}
-
-# if depends path has changed - cleanout everything and do a full rebuild
-if [ "$(pathChanged $WORKSPACE/tools/depends)" == "1" ]
-then
- #clean up the rest too
- cd $WORKSPACE;git clean -xffd
- cd $WORKSPACE/tools/depends/;./bootstrap
-fi
diff --git a/tools/buildsteps/osx32/prepare-xbmc b/tools/buildsteps/osx32/prepare-xbmc
deleted file mode 100755
index eb1f30bbff..0000000000
--- a/tools/buildsteps/osx32/prepare-xbmc
+++ /dev/null
@@ -1,9 +0,0 @@
-WORKSPACE=${WORKSPACE:-$( cd $(dirname $0)/../../.. ; pwd -P )}
-XBMC_PLATFORM_DIR=osx32
-. $WORKSPACE/tools/buildsteps/defaultenv
-
-#build binary addons before building xbmc...
-#make sure that binary_addons don't clean the native tools
-#here (e.x. on release builds where pathChanged always returns 1
-BINARY_ADDONS_CLEAN_NATIVETOOLS="0"
-. $WORKSPACE/tools/buildsteps/$XBMC_PLATFORM_DIR/make-binary-addons
diff --git a/tools/buildsteps/osx32/run-tests b/tools/buildsteps/osx32/run-tests
deleted file mode 100755
index ca1856272d..0000000000
--- a/tools/buildsteps/osx32/run-tests
+++ /dev/null
@@ -1,9 +0,0 @@
-WORKSPACE=${WORKSPACE:-$( cd $(dirname $0)/../../.. ; pwd -P )}
-XBMC_PLATFORM_DIR=osx32
-. $WORKSPACE/tools/buildsteps/defaultenv
-
-cd $WORKSPACE;make -j$BUILDTHREADS testsuite
-cd $WORKSPACE;./kodi-test --gtest_output=xml:gtestresults.xml
-awk '{ if ($1 == "<testcase" && match($0, "notrun")) print substr($0,0,length($0)-2) "><skipped/></testcase>"; else print $0;}' gtestresults.xml > gtestresults-skipped.xml
-rm gtestresults.xml
-mv gtestresults-skipped.xml gtestresults.xml
diff --git a/tools/buildsteps/osx64/make-binary-addons b/tools/buildsteps/osx64/make-binary-addons
index fe29e78eb0..b27b07ddf6 100755
--- a/tools/buildsteps/osx64/make-binary-addons
+++ b/tools/buildsteps/osx64/make-binary-addons
@@ -8,8 +8,8 @@ XBMC_PLATFORM_DIR=osx64
rm -f $WORKSPACE/project/cmake/$FAILED_BUILD_FILENAME
ALL_BINARY_ADDONS_BUILT="1"
-#only build binary addons if something in the addons metadata changed
-if [ "$(pathChanged $WORKSPACE/project/cmake)" == "1" ]
+#only build binary addons when requested by env/jenkins
+if [ "$BUILD_BINARY_ADDONS" == "true" ]
then
for addon in $BINARY_ADDONS
do
diff --git a/tools/buildsteps/rbpi/make-binary-addons b/tools/buildsteps/rbpi/make-binary-addons
index 2317b5581a..d55f79aba1 100755
--- a/tools/buildsteps/rbpi/make-binary-addons
+++ b/tools/buildsteps/rbpi/make-binary-addons
@@ -8,8 +8,8 @@ XBMC_PLATFORM_DIR=rbpi
rm -f $WORKSPACE/project/cmake/$FAILED_BUILD_FILENAME
ALL_BINARY_ADDONS_BUILT="1"
-#only build binary addons if something in the addons metadata changed
-if [ "$(pathChanged $WORKSPACE/project/cmake)" == "1" ]
+#only build binary addons when requested by env/jenkins
+if [ "$BUILD_BINARY_ADDONS" == "true" ]
then
for addon in $BINARY_ADDONS
do
diff --git a/tools/depends/native/TexturePacker/src/TexturePacker.cpp b/tools/depends/native/TexturePacker/src/TexturePacker.cpp
index e50bb466a5..de3d280b89 100644
--- a/tools/depends/native/TexturePacker/src/TexturePacker.cpp
+++ b/tools/depends/native/TexturePacker/src/TexturePacker.cpp
@@ -286,7 +286,7 @@ void Usage()
puts(" -help Show this screen.");
puts(" -input <dir> Input directory. Default: current dir");
puts(" -output <dir> Output directory/filename. Default: Textures.xpr");
- puts(" -dupecheck Enable duplicate file detection. Reduces output file size. Default: on");
+ puts(" -dupecheck Enable duplicate file detection. Reduces output file size. Default: off");
puts(" -use_lzo Use lz0 packing. Default: on");
puts(" -use_dxt Use DXT compression. Default: on");
puts(" -use_none Use No compression. Default: off");
diff --git a/tools/depends/target/Makefile b/tools/depends/target/Makefile
index a93747cdd7..ed17ca5834 100644
--- a/tools/depends/target/Makefile
+++ b/tools/depends/target/Makefile
@@ -35,7 +35,8 @@ ifeq ($(OS),osx)
endif
ifeq ($(OS),android)
- DEPENDS += mdnsresponder android-sources-ics google-breakpad
+ DEPENDS += mdnsresponder android-sources-ics google-breakpad libuuid
+ CROSSGUID_DEPS = libuuid
endif
DEPENDS := $(filter-out $(EXCLUDED_DEPENDS),$(DEPENDS))
@@ -63,6 +64,7 @@ ifeq ($(OS),linux)
endif
DEPENDS += alsa-lib
ALSA_LIB = alsa-lib
+ CROSSGUID_DEPS = libuuid
endif
.PHONY: $(DEPENDS)
@@ -97,9 +99,7 @@ libsdl2: $(LINUX_SYSTEM_LIBS)
libxslt: libgcrypt
ffmpeg: $(ICONV) $(ZLIB) bzip2 libvorbis $(FFMPEG_DEPENDS)
libcec: platform
-ifeq ($(OS),linux)
-crossguid: libuuid
-endif
+crossguid: $(CROSSGUID_DEPS)
.installed-$(PLATFORM): $(DEPENDS)
touch $@
diff --git a/tools/depends/target/crossguid/Makefile b/tools/depends/target/crossguid/Makefile
index 1a40249e1c..487ab2a617 100644
--- a/tools/depends/target/crossguid/Makefile
+++ b/tools/depends/target/crossguid/Makefile
@@ -26,9 +26,6 @@ endif
# define specifying the native GUID implementation to use
GUID_PLATFORM_DEFINE=GUID_LIBUUID
-ifeq ($(OS),android)
- GUID_PLATFORM_DEFINE=GUID_ANDROID
-endif
ifeq ($(OS),osx)
GUID_PLATFORM_DEFINE=GUID_CFUUID
endif
diff --git a/tools/depends/target/ffmpeg/FFMPEG-VERSION b/tools/depends/target/ffmpeg/FFMPEG-VERSION
index 67cae98066..777f98b9e5 100644
--- a/tools/depends/target/ffmpeg/FFMPEG-VERSION
+++ b/tools/depends/target/ffmpeg/FFMPEG-VERSION
@@ -1,5 +1,5 @@
LIBNAME=ffmpeg
BASE_URL=https://github.com/xbmc/FFmpeg/archive
-VERSION=2.8.1-Jarvis-alpha4-HEVC
+VERSION=2.8.3-Jarvis-beta3
ARCHIVE=$(LIBNAME)-$(VERSION).tar.gz
diff --git a/tools/depends/target/libgpg-error/Makefile b/tools/depends/target/libgpg-error/Makefile
index fa6ffd58ff..271e023b34 100644
--- a/tools/depends/target/libgpg-error/Makefile
+++ b/tools/depends/target/libgpg-error/Makefile
@@ -3,7 +3,7 @@ DEPS= ../../Makefile.include Makefile
# lib name, version
LIBNAME=libgpg-error
-VERSION=1.12
+VERSION=1.20
SOURCE=$(LIBNAME)-$(VERSION)
ARCHIVE=$(SOURCE).tar.bz2
@@ -27,6 +27,14 @@ $(PLATFORM): $(TARBALLS_LOCATION)/$(ARCHIVE) $(DEPS)
cd $(PLATFORM); $(CONFIGURE)
$(LIBDYLIB): $(PLATFORM)
+ifeq ($(OS),osx)
+ $(MAKE) -C $(PLATFORM)/src gen-posix-lock-obj
+ $(PLATFORM)/src/gen-posix-lock-obj > $(PLATFORM)/src/syscfg/tmp.h
+ mv $(PLATFORM)/src/syscfg/tmp.h $(PLATFORM)/src/syscfg/$$(awk 'NR==1 {print $$2}' $(PLATFORM)/src/syscfg/tmp.h)
+endif
+ifeq ($(OS),android)
+ cp $(PLATFORM)/src/syscfg/lock-obj-pub.arm-unknown-linux-androideabi.h $(PLATFORM)/src/syscfg/lock-obj-pub.linux-android.h
+endif
$(MAKE) -C $(PLATFORM)
.installed-$(PLATFORM): $(LIBDYLIB)
diff --git a/tools/depends/target/libssh/Makefile b/tools/depends/target/libssh/Makefile
index 7fb244ecb4..d2f67381eb 100644
--- a/tools/depends/target/libssh/Makefile
+++ b/tools/depends/target/libssh/Makefile
@@ -23,6 +23,7 @@ $(PLATFORM): $(TARBALLS_LOCATION)/$(ARCHIVE) $(DEPS)
cd $(PLATFORM); patch -p0 < ../ntohl.patch
cd $(PLATFORM); patch -p0 < ../md5.patch
cd $(PLATFORM); patch -p1 < ../darwin.patch
+ cd $(PLATFORM); patch -p0 < ../fix-gcc-5-compile.patch
sed -ie "s|-fstack-protector|-fno-stack-protector|" "$(PLATFORM)/cmake/Modules/DefineCompilerFlags.cmake"
sed -ie "s|add_subdirectory(examples)||" "$(PLATFORM)/CMakeLists.txt"
cd $(PLATFORM)/build; $(CMAKE) -DWITH_STATIC_LIB=1 -DWITH_EXAMPLES=0 -DTHREADS_PTHREAD_ARG=0 -DWITH_GSSAPI=0 VERBOSE=1 ..
diff --git a/tools/depends/target/libssh/fix-gcc-5-compile.patch b/tools/depends/target/libssh/fix-gcc-5-compile.patch
new file mode 100644
index 0000000000..d015a9be6c
--- /dev/null
+++ b/tools/depends/target/libssh/fix-gcc-5-compile.patch
@@ -0,0 +1,55 @@
+--- include/libssh/pki_priv.h 2015-11-05 09:39:40.011875890 +0100
++++ include/libssh/pki_priv.h 2015-11-05 09:39:34.151849945 +0100
+@@ -29,7 +29,7 @@
+ #define ECDSA_HEADER_END "-----END EC PRIVATE KEY-----"
+
+ #define ssh_pki_log(...) \
+- _ssh_pki_log(__FUNCTION__, __VA_ARGS__)
++ _ssh_pki_log(__extension__ __FUNCTION__, __VA_ARGS__)
+ void _ssh_pki_log(const char *function,
+ const char *format, ...) PRINTF_ATTRIBUTE(2, 3);
+
+--- include/libssh/priv.h 2015-11-05 09:39:40.011875890 +0100
++++ include/libssh/priv.h 2015-11-05 09:41:01.272239916 +0100
+@@ -179,7 +179,7 @@
+ const char *function,
+ const char *buffer);
+ #define SSH_LOG(priority, ...) \
+- _ssh_log(priority, __FUNCTION__, __VA_ARGS__)
++ _ssh_log(priority, __extension__ __FUNCTION__, __VA_ARGS__)
+
+ /* LEGACY */
+ void ssh_log_common(struct ssh_common_struct *common,
+@@ -197,18 +197,18 @@
+ };
+
+ #define ssh_set_error(error, code, ...) \
+- _ssh_set_error(error, code, __FUNCTION__, __VA_ARGS__)
++ _ssh_set_error(error, code, __extension__ __FUNCTION__, __VA_ARGS__)
+ void _ssh_set_error(void *error,
+ int code,
+ const char *function,
+ const char *descr, ...) PRINTF_ATTRIBUTE(4, 5);
+
+ #define ssh_set_error_oom(error) \
+- _ssh_set_error_oom(error, __FUNCTION__)
++ _ssh_set_error_oom(error, __extension__ __FUNCTION__)
+ void _ssh_set_error_oom(void *error, const char *function);
+
+ #define ssh_set_error_invalid(error) \
+- _ssh_set_error_invalid(error, __FUNCTION__)
++ _ssh_set_error_invalid(error, __extension__ __FUNCTION__)
+ void _ssh_set_error_invalid(void *error, const char *function);
+
+
+--- src/auth.c 2014-12-27 11:30:13.000000000 +0100
++++ src/auth.c 2015-11-05 09:42:41.732698584 +0100
+@@ -1548,7 +1548,7 @@
+ * This should not happen
+ */
+ rc = SSH_AUTH_ERROR;
+- ssh_set_error(session,SSH_FATAL,"Invalid state in %s", __FUNCTION__);
++ ssh_set_error(session,SSH_FATAL,"Invalid state in %s", __extension__ __FUNCTION__);
+ }
+ return rc;
+ }
diff --git a/tools/depends/target/libuuid/Makefile b/tools/depends/target/libuuid/Makefile
index 5dd6747b1f..92c9157242 100644
--- a/tools/depends/target/libuuid/Makefile
+++ b/tools/depends/target/libuuid/Makefile
@@ -1,21 +1,15 @@
include ../../Makefile.include
DEPS= ../../Makefile.include Makefile
+# We use uuid from e2fsprogs since this easily cross-compiles on android, while util-linux does not.
# lib name, version
LIBNAME=libuuid
-VERSION=2.20.0
-SOURCE=util-linux-2.20.1
-ARCHIVE=$(SOURCE).tar.gz
+VERSION=1.42.13
+SOURCE=e2fsprogs-1.42.13
+ARCHIVE=$(SOURCE).tar.xz
-# configuration settings
-CONFIGURE=echo "scanf_cv_type_modifier=as" > config.cache; \
- ./configure --prefix=$(PREFIX) --cache-file=config.cache \
- --disable-shared --disable-mount --disable-fsck --disable-partx --disable-libblkid \
- --disable-libmount --disable-mountpoint --disable-nls --disable-rpath --disable-agetty \
- --disable-cramfs --disable-switch_root --disable-pivot_root --disable-fallocate \
- --disable-unshare --disable-rename --disable-schedutils --disable-wall --without-ncurses
-LIBDYLIB=$(PLATFORM)/libuuid/src/.libs/$(LIBNAME).a
+LIBDYLIB=$(PLATFORM)/lib/$(LIBNAME).a
all: .installed-$(PLATFORM)
@@ -25,17 +19,17 @@ $(TARBALLS_LOCATION)/$(ARCHIVE):
$(PLATFORM): $(TARBALLS_LOCATION)/$(ARCHIVE) $(DEPS)
rm -rf $(PLATFORM)/*; mkdir -p $(PLATFORM)
cd $(PLATFORM); $(ARCHIVE_TOOL) $(ARCHIVE_TOOL_FLAGS) $(TARBALLS_LOCATION)/$(ARCHIVE)
- cd $(PLATFORM); $(CONFIGURE)
+ cd $(PLATFORM); ./configure --prefix=$(PREFIX) --disable-fsck
$(LIBDYLIB): $(PLATFORM)
- $(MAKE) -C $(PLATFORM)/libuuid
+ cd $(PLATFORM)/lib/uuid ; $(MAKE) -j1
.installed-$(PLATFORM): $(LIBDYLIB)
- $(MAKE) -C $(PLATFORM)/libuuid install
+ cd $(PLATFORM)/lib/uuid ; $(MAKE) -j1 install
touch $@
clean:
- $(MAKE) -C $(PLATFORM)/libuuid clean
+ $(MAKE) -C $(PLATFORM) clean
rm -f .installed-$(PLATFORM)
distclean::
diff --git a/version.txt b/version.txt
index e49e714879..79096bec99 100644
--- a/version.txt
+++ b/version.txt
@@ -3,9 +3,9 @@ COMPANY_NAME XBMC-Foundation
WEBSITE http://kodi.tv
VERSION_MAJOR 16
VERSION_MINOR 0
-VERSION_TAG ALPHA4
-VERSION_CODE 159704
-ADDON_API 15.9.704
+VERSION_TAG BETA3
+VERSION_CODE 159803
+ADDON_API 15.9.803
# Notes:
# Change AC_INIT in configure.ac
diff --git a/xbmc/Application.cpp b/xbmc/Application.cpp
index a2475c6c16..bf7932e8c0 100644
--- a/xbmc/Application.cpp
+++ b/xbmc/Application.cpp
@@ -120,9 +120,6 @@
#ifdef HAS_VIDEO_PLAYBACK
#include "cores/VideoRenderers/RenderManager.h"
#endif
-#ifdef HAS_KARAOKE
-#include "music/karaoke/karaokelyricsmanager.h"
-#endif
#include "network/ZeroconfBrowser.h"
#ifndef TARGET_POSIX
#include "threads/platform/win/Win32Exception.h"
@@ -292,9 +289,6 @@ CApplication::CApplication(void)
/* for now always keep this around */
-#ifdef HAS_KARAOKE
- m_pKaraokeMgr = new CKaraokeLyricsManager();
-#endif
m_currentStack = new CFileItemList;
m_bPresentFrame = false;
@@ -329,10 +323,6 @@ CApplication::~CApplication(void)
#endif
delete m_currentStack;
-#ifdef HAS_KARAOKE
- delete m_pKaraokeMgr;
-#endif
-
delete m_dpms;
delete m_pInertialScrollingHandler;
delete m_pPlayer;
@@ -453,7 +443,6 @@ bool CApplication::Create()
CApplicationMessenger::GetInstance().RegisterReceiver(this);
CApplicationMessenger::GetInstance().RegisterReceiver(&g_playlistPlayer);
CApplicationMessenger::GetInstance().RegisterReceiver(&g_infoManager);
- CApplicationMessenger::GetInstance().RegisterReceiver(&g_AEDSPManager);
for (int i = RES_HDTV_1080i; i <= RES_PAL60_16x9; i++)
{
@@ -1493,9 +1482,8 @@ bool CApplication::OnSettingUpdate(CSetting* &setting, const char *oldSettingId,
if (setting == NULL)
return false;
- const std::string &settingId = setting->GetId();
#if defined(HAS_LIBAMCODEC)
- if (settingId == CSettings::SETTING_VIDEOPLAYER_USEAMCODEC)
+ if (setting->GetId() == CSettings::SETTING_VIDEOPLAYER_USEAMCODEC)
{
// Do not permit amcodec to be used on non-aml platforms.
// The setting will be hidden but the default value is true,
@@ -1508,14 +1496,14 @@ bool CApplication::OnSettingUpdate(CSetting* &setting, const char *oldSettingId,
}
#endif
#if defined(TARGET_ANDROID)
- if (settingId == CSettings::SETTING_VIDEOPLAYER_USESTAGEFRIGHT)
+ if (setting->GetId() == CSettings::SETTING_VIDEOPLAYER_USESTAGEFRIGHT)
{
CSettingBool *usestagefright = (CSettingBool*)setting;
return usestagefright->SetValue(false);
}
#endif
#if defined(TARGET_DARWIN_OSX)
- if (settingId == CSettings::SETTING_AUDIOOUTPUT_AUDIODEVICE)
+ if (setting->GetId() == CSettings::SETTING_AUDIOOUTPUT_AUDIODEVICE)
{
CSettingString *audioDevice = (CSettingString*)setting;
// Gotham and older didn't enumerate audio devices per stream on osx
@@ -1591,15 +1579,9 @@ bool CApplication::Load(const TiXmlNode *settings)
const TiXmlElement *audioElement = settings->FirstChildElement("audio");
if (audioElement != NULL)
{
-#ifndef TARGET_ANDROID
XMLUtils::GetBoolean(audioElement, "mute", m_muted);
if (!XMLUtils::GetFloat(audioElement, "fvolumelevel", m_volumeLevel, VOLUME_MINIMUM, VOLUME_MAXIMUM))
m_volumeLevel = VOLUME_MAXIMUM;
-#else
- // Use system volume settings
- m_volumeLevel = CXBMCApp::GetSystemVolume();
- m_muted = (m_volumeLevel == 0);
-#endif
}
return true;
@@ -2333,9 +2315,6 @@ bool CApplication::OnAction(const CAction &action)
if (!m_pPlayer->IsPaused() && m_pPlayer->GetPlaySpeed() != 1)
m_pPlayer->SetPlaySpeed(1, g_application.m_muted);
- #ifdef HAS_KARAOKE
- m_pKaraokeMgr->SetPaused( m_pPlayer->IsPaused() );
-#endif
g_audioManager.Enable(m_pPlayer->IsPaused());
return true;
}
@@ -2589,6 +2568,13 @@ void CApplication::OnApplicationMessage(ThreadMessage* pMsg)
StopPVRManager();
break;
+ case TMSG_SETAUDIODSPSTATE:
+ if(pMsg->param1 == ACTIVE_AE_DSP_STATE_ON)
+ ActiveAE::CActiveAEDSP::GetInstance().Activate(pMsg->param2 == ACTIVE_AE_DSP_ASYNC_ACTIVATE);
+ else if(pMsg->param1 == ACTIVE_AE_DSP_STATE_OFF)
+ ActiveAE::CActiveAEDSP::GetInstance().Deactivate();
+ break;
+
case TMSG_START_ANDROID_ACTIVITY:
{
#if defined(TARGET_ANDROID)
@@ -3483,14 +3469,6 @@ PlayBackRet CApplication::PlayFile(const CFileItem& item, bool bRestart)
// reset VideoStartWindowed as it's a temp setting
CMediaSettings::GetInstance().SetVideoStartWindowed(false);
-#ifdef HAS_KARAOKE
- //We have to stop parsing a cdg before mplayer is deallocated
- // WHY do we have to do this????
- if (m_pKaraokeMgr)
- m_pKaraokeMgr->Stop();
-#endif
-
-
{
CSingleLock lock(m_playStateMutex);
// tell system we are starting a file
@@ -3928,10 +3906,6 @@ void CApplication::StopPlaying()
int iWin = g_windowManager.GetActiveWindow();
if ( m_pPlayer->IsPlaying() )
{
-#ifdef HAS_KARAOKE
- if( m_pKaraokeMgr )
- m_pKaraokeMgr->Stop();
-#endif
m_pPlayer->CloseFile();
// turn off visualisation window when stopping
@@ -4283,30 +4257,6 @@ bool CApplication::OnMessage(CGUIMessage& message)
param["player"]["speed"] = 1;
param["player"]["playerid"] = g_playlistPlayer.GetCurrentPlaylist();
CAnnouncementManager::GetInstance().Announce(Player, "xbmc", "OnPlay", m_itemCurrentFile, param);
-
- if (m_pPlayer->IsPlayingAudio())
- {
- // Start our cdg parser as appropriate
-#ifdef HAS_KARAOKE
- if (m_pKaraokeMgr && CSettings::GetInstance().GetBool(CSettings::SETTING_KARAOKE_ENABLED) && !m_itemCurrentFile->IsInternetStream())
- {
- m_pKaraokeMgr->Stop();
- if (m_itemCurrentFile->IsMusicDb())
- {
- if (!m_itemCurrentFile->HasMusicInfoTag() || !m_itemCurrentFile->GetMusicInfoTag()->Loaded())
- {
- IMusicInfoTagLoader* tagloader = CMusicInfoTagLoaderFactory::CreateLoader(*m_itemCurrentFile);
- tagloader->Load(m_itemCurrentFile->GetPath(),*m_itemCurrentFile->GetMusicInfoTag());
- delete tagloader;
- }
- m_pKaraokeMgr->Start(m_itemCurrentFile->GetMusicInfoTag()->GetURL());
- }
- else
- m_pKaraokeMgr->Start(m_itemCurrentFile->GetPath());
- }
-#endif
- }
-
return true;
}
break;
@@ -4367,10 +4317,6 @@ bool CApplication::OnMessage(CGUIMessage& message)
case GUI_MSG_PLAYBACK_ENDED:
case GUI_MSG_PLAYLISTPLAYER_STOPPED:
{
-#ifdef HAS_KARAOKE
- if (m_pKaraokeMgr )
- m_pKaraokeMgr->Stop();
-#endif
#ifdef TARGET_DARWIN_IOS
CDarwinUtils::SetScheduling(message.GetMessage());
#endif
@@ -4644,11 +4590,6 @@ void CApplication::ProcessSlow()
// check for any idle curl connections
g_curlInterface.CheckIdle();
-#ifdef HAS_KARAOKE
- if ( m_pKaraokeMgr )
- m_pKaraokeMgr->ProcessSlow();
-#endif
-
if (!m_pPlayer->IsPlayingVideo())
g_largeTextureManager.CleanupUnusedImages();
diff --git a/xbmc/Application.h b/xbmc/Application.h
index c9ba273b6c..616bfd51b5 100644
--- a/xbmc/Application.h
+++ b/xbmc/Application.h
@@ -73,7 +73,6 @@ namespace MEDIA_DETECT
#include "interfaces/IActionListener.h"
class CSeekHandler;
-class CKaraokeLyricsManager;
class CInertialScrollingHandler;
class DPMSSupport;
class CSplash;
@@ -319,8 +318,6 @@ public:
PlayState m_ePlayState;
CCriticalSection m_playStateMutex;
- CKaraokeLyricsManager* m_pKaraokeMgr;
-
PLAYERCOREID m_eForcedNextPlayer;
std::string m_strPlayListFile;
diff --git a/xbmc/Autorun.cpp b/xbmc/Autorun.cpp
index 1570f6401c..8454f85e16 100644
--- a/xbmc/Autorun.cpp
+++ b/xbmc/Autorun.cpp
@@ -277,7 +277,8 @@ bool CAutorun::RunDisc(IDirectory* pDir, const std::string& strDrive, int& nAdde
ecount++;
asize = asize + items[j]->m_dwSize;
}
- asize = asize / ecount;
+ if (ecount > 0)
+ asize = asize / ecount;
// Put largest files in alphabetical order to top of new list.
for (int j = 0; j < items.Size(); j++)
if (items[j]->m_dwSize >= asize)
diff --git a/xbmc/FileItem.cpp b/xbmc/FileItem.cpp
index af2b414f64..c5f07acfa3 100644
--- a/xbmc/FileItem.cpp
+++ b/xbmc/FileItem.cpp
@@ -57,7 +57,6 @@
#include "utils/RegExp.h"
#include "utils/log.h"
#include "utils/Variant.h"
-#include "music/karaoke/karaokelyricsfactory.h"
#include "utils/Mime.h"
#include <assert.h>
@@ -403,6 +402,7 @@ const CFileItem& CFileItem::operator=(const CFileItem& item)
m_extrainfo = item.m_extrainfo;
m_specialSort = item.m_specialSort;
m_bIsAlbum = item.m_bIsAlbum;
+ m_doContentLookup = item.m_doContentLookup;
return *this;
}
@@ -492,6 +492,7 @@ void CFileItem::Archive(CArchive& ar)
ar << m_mimetype;
ar << m_extrainfo;
ar << m_specialSort;
+ ar << m_doContentLookup;
if (m_musicInfoTag)
{
@@ -549,6 +550,7 @@ void CFileItem::Archive(CArchive& ar)
ar >> m_extrainfo;
ar >> temp;
m_specialSort = (SortSpecial)temp;
+ ar >> m_doContentLookup;
int iType;
ar >> iType;
@@ -801,14 +803,6 @@ bool CFileItem::IsAudio() const
return URIUtils::HasExtension(m_strPath, g_advancedSettings.GetMusicExtensions());
}
-bool CFileItem::IsKaraoke() const
-{
- if (!IsAudio())
- return false;
-
- return CKaraokeLyricsFactory::HasLyrics( m_strPath );
-}
-
bool CFileItem::IsPicture() const
{
if(StringUtils::StartsWithNoCase(m_mimetype, "image/"))
@@ -1444,6 +1438,19 @@ void CFileItem::SetFromVideoInfoTag(const CVideoInfoTag &video)
FillInMimeType(false);
}
+void CFileItem::SetFromMusicInfoTag(const MUSIC_INFO::CMusicInfoTag &music)
+{
+ if (!music.GetTitle().empty())
+ SetLabel(music.GetTitle());
+ if (!music.GetURL().empty())
+ m_strPath = music.GetURL();
+ m_bIsFolder = URIUtils::HasSlashAtEnd(m_strPath);
+
+ *GetMusicInfoTag() = music;
+ FillInDefaultIcon();
+ FillInMimeType(false);
+}
+
void CFileItem::SetFromAlbum(const CAlbum &album)
{
if (!album.strAlbum.empty())
diff --git a/xbmc/FileItem.h b/xbmc/FileItem.h
index a51d9a3b01..293f979d64 100644
--- a/xbmc/FileItem.h
+++ b/xbmc/FileItem.h
@@ -175,7 +175,6 @@ public:
*/
bool IsAudio() const;
- bool IsKaraoke() const;
bool IsCUESheet() const;
bool IsInternetStream(const bool bStrictCheck = false) const;
bool IsPlayList() const;
@@ -467,6 +466,13 @@ public:
\param video video details to use and set
*/
void SetFromVideoInfoTag(const CVideoInfoTag &video);
+
+ /*! \brief Sets details using the information from the CMusicInfoTag object
+ Sets the musicinfotag and uses its information to set the label and path.
+ \param music music details to use and set
+ */
+ void SetFromMusicInfoTag(const MUSIC_INFO::CMusicInfoTag &music);
+
/*! \brief Sets details using the information from the CAlbum object
Sets the album in the music info tag and uses its information to set the
label and album-specific properties.
diff --git a/xbmc/GUIInfoManager.cpp b/xbmc/GUIInfoManager.cpp
index 41552c0507..458ab86b87 100644
--- a/xbmc/GUIInfoManager.cpp
+++ b/xbmc/GUIInfoManager.cpp
@@ -4132,10 +4132,10 @@ std::string CGUIInfoManager::GetMusicTagLabel(int info, const CFileItem *item)
if (tag.GetAlbum().size()) { return tag.GetAlbum(); }
break;
case MUSICPLAYER_ARTIST:
- if (tag.GetArtist().size()) { return tag.GetArtistString(); }
+ if (tag.GetArtistString().size()) { return tag.GetArtistString(); }
break;
case MUSICPLAYER_ALBUM_ARTIST:
- if (tag.GetAlbumArtist().size()) { return tag.GetAlbumArtistString(); }
+ if (tag.GetAlbumArtistString().size()) { return tag.GetAlbumArtistString(); }
break;
case MUSICPLAYER_YEAR:
if (tag.GetYear()) { return tag.GetYearString(); }
@@ -4548,7 +4548,7 @@ int CGUIInfoManager::GetPlayTimeRemaining() const
float CGUIInfoManager::GetSeekPercent() const
{
- if (g_infoManager.GetTotalPlayTime() == 0)
+ if (GetTotalPlayTime() == 0)
return 0.0f;
float percentPlayTime = static_cast<float>(GetPlayTime()) / GetTotalPlayTime() * 0.1f;
@@ -5224,8 +5224,10 @@ std::string CGUIInfoManager::GetItemLabel(const CFileItem *item, int info, std::
case LISTITEM_USER_RATING:
{
std::string strUserRating;
- if (item->GetVideoInfoTag()->m_iUserRating > 0)
+ if (item->HasVideoInfoTag() && item->GetVideoInfoTag()->m_iUserRating > 0)
strUserRating = StringUtils::Format("%i", item->GetVideoInfoTag()->m_iUserRating);
+ else if (item->HasMusicInfoTag() && item->GetMusicInfoTag()->GetUserrating() > '0')
+ strUserRating.assign(1, item->GetMusicInfoTag()->GetUserrating());
return strUserRating;
}
break;
@@ -5894,9 +5896,9 @@ bool CGUIInfoManager::GetItemBool(const CGUIListItem *item, int condition) const
{
CEpgInfoTagPtr epgTag = pItem->GetEPGInfoTag();
- // Check if the tag has a currently active recording associated
- if (epgTag->HasRecording() && epgTag->IsActive())
- return true;
+ // Check if the tag has a currently recording timer associated
+ if (epgTag->HasTimer())
+ return epgTag->Timer()->IsRecording();
// Search all timers for something that matches the tag
CFileItemPtr timer = g_PVRTimers->GetTimerForEpgTag(pItem);
diff --git a/xbmc/addons/Addon.cpp b/xbmc/addons/Addon.cpp
index 695cc81719..d325d6bee6 100644
--- a/xbmc/addons/Addon.cpp
+++ b/xbmc/addons/Addon.cpp
@@ -389,6 +389,12 @@ void CAddon::BuildLibName(const cp_extension_t *extension)
{
switch (m_props.type)
{
+ case ADDON_PVRDLL:
+ case ADDON_ADSPDLL:
+ case ADDON_AUDIOENCODER:
+ case ADDON_AUDIODECODER:
+ case ADDON_VIZ:
+ case ADDON_SCREENSAVER:
case ADDON_SCRIPT:
case ADDON_SCRIPT_LIBRARY:
case ADDON_SCRIPT_LYRICS:
@@ -406,27 +412,30 @@ void CAddon::BuildLibName(const cp_extension_t *extension)
case ADDON_SERVICE:
case ADDON_REPOSITORY:
case ADDON_CONTEXT_ITEM:
- {
- std::string temp = CAddonMgr::GetInstance().GetExtValue(extension->configuration, "@library");
- m_strLibName = temp;
- }
- break;
- case ADDON_ADSPDLL:
- case ADDON_AUDIODECODER:
- case ADDON_AUDIOENCODER:
- case ADDON_PVRDLL:
- case ADDON_SCREENSAVER:
- case ADDON_VIZ:
- {
- // if library attribute isn't present, look for a system-dependent one
- if (m_strLibName.empty())
- m_strLibName = CAddonMgr::GetInstance().GetPlatformLibraryName(extension->configuration);
- }
+ m_strLibName = CAddonMgr::GetInstance().GetExtValue(extension->configuration, "@library");
break;
default:
m_strLibName.clear();
break;
}
+
+ // if library attribute isn't present, look for a system-dependent one
+ if (m_strLibName.empty())
+ {
+ switch (m_props.type)
+ {
+ case ADDON_ADSPDLL:
+ case ADDON_AUDIODECODER:
+ case ADDON_AUDIOENCODER:
+ case ADDON_PVRDLL:
+ case ADDON_VIZ:
+ case ADDON_SCREENSAVER:
+ m_strLibName = CAddonMgr::GetInstance().GetPlatformLibraryName(extension->configuration);
+ break;
+ default:
+ break;
+ }
+ }
}
}
@@ -717,13 +726,6 @@ void OnPreUnInstall(const AddonPtr& addon)
if (CAddonMgr::GetInstance().GetAddon(addon->ID(), localAddon, ADDON_CONTEXT_ITEM))
CContextMenuManager::GetInstance().Unregister(std::static_pointer_cast<CContextMenuAddon>(localAddon));
- if (CAddonMgr::GetInstance().GetAddon(addon->ID(), localAddon, ADDON_REPOSITORY))
- {
- CAddonDatabase database;
- database.Open();
- database.DeleteRepository(addon->ID());
- }
-
addon->OnPreUnInstall();
}
diff --git a/xbmc/addons/AddonDatabase.cpp b/xbmc/addons/AddonDatabase.cpp
index f2a0083707..d8b3b7e97e 100644
--- a/xbmc/addons/AddonDatabase.cpp
+++ b/xbmc/addons/AddonDatabase.cpp
@@ -20,6 +20,7 @@
#include "AddonDatabase.h"
+#include <algorithm>
#include <utility>
#include "addons/AddonManager.h"
@@ -179,37 +180,23 @@ int CAddonDatabase::AddAddon(const AddonPtr& addon,
return -1;
}
-AddonVersion CAddonDatabase::GetAddonVersion(const std::string &id)
+std::pair<AddonVersion, std::string> CAddonDatabase::GetAddonVersion(const std::string &id)
{
- AddonVersion maxversion("0.0.0");
+ auto empty = std::make_pair(AddonVersion("0.0.0"), "");
try
{
- if (NULL == m_pDB.get()) return maxversion;
- if (NULL == m_pDS2.get()) return maxversion;
+ if (NULL == m_pDB.get()) return empty;
+ if (NULL == m_pDS2.get()) return empty;
- // there may be multiple addons with this id (eg from different repositories) in the database,
- // so we want to retrieve the latest version. Order by version won't work as the database
- // won't know that 1.10 > 1.2, so grab them all and order outside
- std::string sql = PrepareSQL("select version from addon where addonID='%s'",id.c_str());
- m_pDS2->query(sql);
-
- if (m_pDS2->eof())
- return maxversion;
-
- while (!m_pDS2->eof())
- {
- AddonVersion version(m_pDS2->fv(0).get_asString());
- if (version > maxversion)
- maxversion = version;
- m_pDS2->next();
- }
- return maxversion;
+ std::vector<std::pair<ADDON::AddonVersion, std::string>> versions;
+ if (GetAvailableVersions(id, versions) && versions.size() > 0)
+ return *std::max_element(versions.begin(), versions.end());
}
catch (...)
{
CLog::Log(LOGERROR, "%s failed on addon %s", __FUNCTION__, id.c_str());
}
- return maxversion;
+ return empty;
}
bool CAddonDatabase::GetAvailableVersions(const std::string& addonId,
@@ -702,14 +689,6 @@ bool CAddonDatabase::BreakAddon(const std::string &addonID, const std::string& r
addonID.c_str(), reason.c_str()));
}
-bool CAddonDatabase::HasAddon(const std::string &addonID)
-{
- std::string strWhereClause = PrepareSQL("addonID = '%s'", addonID.c_str());
- std::string strHasAddon = GetSingleValue("addon", "id", strWhereClause);
-
- return !strHasAddon.empty();
-}
-
bool CAddonDatabase::IsAddonDisabled(const std::string &addonID)
{
try
@@ -778,38 +757,11 @@ bool CAddonDatabase::GetBlacklisted(std::vector<std::string>& addons)
return false;
}
-bool CAddonDatabase::IsSystemPVRAddonEnabled(const std::string &addonID)
-{
- std::string strWhereClause = PrepareSQL("addonID = '%s'", addonID.c_str());
- std::string strEnabled = GetSingleValue("pvrenabled", "id", strWhereClause);
-
- return !strEnabled.empty();
-}
-
std::string CAddonDatabase::IsAddonBroken(const std::string &addonID)
{
return GetSingleValue(PrepareSQL("SELECT reason FROM broken WHERE addonID='%s'", addonID.c_str()));
}
-bool CAddonDatabase::HasDisabledAddons()
-{
- try
- {
- if (NULL == m_pDB.get()) return false;
- if (NULL == m_pDS.get()) return false;
-
- m_pDS->query("select count(id) from disabled");
- bool ret = !m_pDS->eof() && m_pDS->fv(0).get_asInt() > 0; // have rows -> have disabled addons
- m_pDS->close();
- return ret;
- }
- catch (...)
- {
- CLog::Log(LOGERROR, "%s failed", __FUNCTION__);
- }
- return false;
-}
-
bool CAddonDatabase::BlacklistAddon(const std::string& addonID)
{
try
@@ -917,3 +869,10 @@ bool CAddonDatabase::IsSystemAddonRegistered(const std::string &addonID)
}
return false;
}
+
+void CAddonDatabase::OnPostUnInstall(const std::string& addonId)
+{
+ DisableAddon(addonId, false);
+ RemoveAddonFromBlacklist(addonId);
+ DeleteRepository(addonId);
+}
diff --git a/xbmc/addons/AddonDatabase.h b/xbmc/addons/AddonDatabase.h
index 021fb497dc..7a013ab572 100644
--- a/xbmc/addons/AddonDatabase.h
+++ b/xbmc/addons/AddonDatabase.h
@@ -48,8 +48,8 @@ public:
bool GetAvailableVersions(const std::string& addonId,
std::vector<std::pair<ADDON::AddonVersion, std::string>>& versionsInfo);
- /*! \brief grab the (largest) add-on version for an add-on */
- ADDON::AddonVersion GetAddonVersion(const std::string &id);
+ /*! Get the most recent version for an add-on and the repo id it belongs to*/
+ std::pair<ADDON::AddonVersion, std::string> GetAddonVersion(const std::string &id);
int AddRepository(const std::string& id, const ADDON::VECADDONS& addons, const std::string& checksum, const ADDON::AddonVersion& version);
void DeleteRepository(const std::string& id);
@@ -82,26 +82,12 @@ public:
\sa IsAddonDisabled, HasDisabledAddons */
bool DisableAddon(const std::string &addonID, bool disable = true);
- /*! \brief Checks if an addon is in the database.
- \param addonID id of the addon to be checked
- \return true if addon is in database, false if addon is not in database yet */
- bool HasAddon(const std::string &addonID);
-
/*! \brief Check whether an addon has been disabled via DisableAddon.
\param addonID id of the addon to check
\return true if the addon is disabled, false otherwise
\sa DisableAddon, HasDisabledAddons */
bool IsAddonDisabled(const std::string &addonID);
- /*! \brief Check whether we have disabled addons.
- \return true if we have disabled addons, false otherwise
- \sa DisableAddon, IsAddonDisabled */
- bool HasDisabledAddons();
-
- /*! @deprecated only here to allow clean upgrades from earlier pvr versions
- */
- bool IsSystemPVRAddonEnabled(const std::string &addonID);
-
/*! \brief Mark an addon as broken
Sets a flag that this addon has been marked as broken in the repository.
\param addonID id of the addon to mark as broken
@@ -157,6 +143,9 @@ public:
*/
bool IsSystemAddonRegistered(const std::string &addonID);
+ /*! Clear internal fields that shouldn't be kept around indefinitely */
+ void OnPostUnInstall(const std::string& addonId);
+
protected:
virtual void CreateTables();
virtual void CreateAnalytics();
diff --git a/xbmc/addons/AddonInstaller.cpp b/xbmc/addons/AddonInstaller.cpp
index 65f0815735..901fc308cb 100644
--- a/xbmc/addons/AddonInstaller.cpp
+++ b/xbmc/addons/AddonInstaller.cpp
@@ -269,8 +269,8 @@ bool CAddonInstaller::InstallFromZip(const std::string &path)
if (!CDirectory::GetDirectory(zipDir, items) || items.Size() != 1 || !items[0]->m_bIsFolder)
{
CEventLog::GetInstance().AddWithNotification(
- EventPtr(new CNotificationEvent(EventLevelError, 24045,
- StringUtils::Format(g_localizeStrings.Get(24143).c_str(), path.c_str()))), false);
+ EventPtr(new CNotificationEvent(24045, StringUtils::Format(g_localizeStrings.Get(24143).c_str(), path.c_str()),
+ "special://xbmc/media/icon256x256.png", EventLevelError)));
return false;
}
@@ -290,8 +290,8 @@ bool CAddonInstaller::InstallFromZip(const std::string &path)
}
CEventLog::GetInstance().AddWithNotification(
- EventPtr(new CNotificationEvent(EventLevelError, 24045,
- StringUtils::Format(g_localizeStrings.Get(24143).c_str(), path.c_str()))), false);
+ EventPtr(new CNotificationEvent(24045, StringUtils::Format(g_localizeStrings.Get(24143).c_str(), path.c_str()),
+ "special://xbmc/media/icon256x256.png", EventLevelError)));
return false;
}
@@ -443,12 +443,10 @@ bool CAddonInstaller::GetRepoForAddon(const std::string& addonId, RepositoryPtr&
if (!database.Open())
return false;
- std::vector<std::pair<ADDON::AddonVersion, std::string>> versions;
- if (!database.GetAvailableVersions(addonId, versions) || versions.empty())
+ auto repoId = database.GetAddonVersion(addonId).second;
+ if (repoId.empty())
return false;
- auto repoId = std::min_element(versions.begin(), versions.end())->second;
-
AddonPtr tmp;
if (!CAddonMgr::GetInstance().GetAddon(repoId, tmp, ADDON_REPOSITORY))
return false;
@@ -625,10 +623,8 @@ bool CAddonInstallJob::DoWork()
ADDON::OnPostInstall(m_addon, m_update, IsModal());
- //Clear addon from the disabled table
- CAddonDatabase database;
- database.Open();
- database.DisableAddon(m_addon->ID(), false);
+ //Enable it if it was previously disabled
+ CAddonMgr::GetInstance().EnableAddon(m_addon->ID());
// and we're done!
MarkFinished();
@@ -844,9 +840,9 @@ void CAddonInstallJob::ReportInstallError(const std::string& addonID, const std:
else
{
activity =
- EventPtr(new CNotificationEvent(EventLevelError, 24045,
- !msg.empty() ? msg : StringUtils::Format(g_localizeStrings.Get(24143).c_str(),
- fileName.c_str())));
+ EventPtr(new CNotificationEvent(24045,
+ !msg.empty() ? msg : StringUtils::Format(g_localizeStrings.Get(24143).c_str(), fileName.c_str()),
+ EventLevelError));
if (IsModal())
CGUIDialogOK::ShowAndGetInput(CVariant{fileName}, CVariant{msg});
@@ -896,6 +892,9 @@ bool CAddonUnInstallJob::DoWork()
addon = m_addon;
CEventLog::GetInstance().Add(EventPtr(new CAddonManagementEvent(addon, 24144)));
+ CAddonMgr::GetInstance().OnPostUnInstall(m_addon->ID());
+ database.OnPostUnInstall(m_addon->ID());
+
ADDON::OnPostUnInstall(m_addon);
return true;
}
diff --git a/xbmc/addons/AddonManager.cpp b/xbmc/addons/AddonManager.cpp
index e00db87f0f..ec60036099 100644
--- a/xbmc/addons/AddonManager.cpp
+++ b/xbmc/addons/AddonManager.cpp
@@ -268,6 +268,7 @@ void CAddonMgr::UnregisterAddonMgrCallback(TYPE type)
bool CAddonMgr::Init()
{
+ CSingleLock lock(m_critSection);
m_cpluff = new DllLibCPluff;
m_cpluff->Load();
@@ -460,10 +461,7 @@ VECADDONS CAddonMgr::GetOutdated()
CSingleLock lock(m_critSection);
auto isUpdated = [&](const AddonPtr& addon)
{
- AddonPtr repoVersion;
- if (!m_database.GetAddon(addon->ID(), repoVersion))
- return true;
- return addon->Version() >= repoVersion->Version();
+ return addon->Version() >= m_database.GetAddonVersion(addon->ID()).first;
};
VECADDONS addons;
@@ -646,7 +644,6 @@ void CAddonMgr::FindAddons()
void CAddonMgr::UnregisterAddon(const std::string& ID)
{
CSingleLock lock(m_critSection);
- m_disabled.erase(ID);
if (m_cpluff && m_cp_context)
{
m_cpluff->uninstall_plugin(m_cp_context, ID.c_str());
@@ -656,6 +653,13 @@ void CAddonMgr::UnregisterAddon(const std::string& ID)
}
}
+void CAddonMgr::OnPostUnInstall(const std::string& id)
+{
+ CSingleLock lock(m_critSection);
+ m_disabled.erase(id);
+ m_updateBlacklist.erase(id);
+}
+
bool CAddonMgr::RemoveFromUpdateBlacklist(const std::string& id)
{
CSingleLock lock(m_critSection);
diff --git a/xbmc/addons/AddonManager.h b/xbmc/addons/AddonManager.h
index 1a0465251b..472a51ebea 100644
--- a/xbmc/addons/AddonManager.h
+++ b/xbmc/addons/AddonManager.h
@@ -112,6 +112,9 @@ namespace ADDON
void FindAddons();
void UnregisterAddon(const std::string& ID);
+ /*! Hook for clearing internal state after uninstall. */
+ void OnPostUnInstall(const std::string& id);
+
/*! \brief Disable an addon. Returns true on success, false on failure. */
bool DisableAddon(const std::string& ID);
diff --git a/xbmc/addons/GUIDialogAddonInfo.cpp b/xbmc/addons/GUIDialogAddonInfo.cpp
index b411f6b0c2..91e7c77118 100644
--- a/xbmc/addons/GUIDialogAddonInfo.cpp
+++ b/xbmc/addons/GUIDialogAddonInfo.cpp
@@ -246,6 +246,12 @@ void CGUIDialogAddonInfo::OnUpdate()
}
}
+ if (versions.empty())
+ {
+ CGUIDialogOK::ShowAndGetInput(CVariant{21341}, CVariant{21342});
+ return;
+ }
+
auto* dialog = static_cast<CGUIDialogSelect*>(g_windowManager.GetWindow(WINDOW_DIALOG_SELECT));
dialog->Reset();
dialog->SetHeading(CVariant{21338});
@@ -311,6 +317,9 @@ void CGUIDialogAddonInfo::OnInstall()
if (!g_passwordManager.CheckMenuLock(WINDOW_ADDON_BROWSER))
return;
+ if (!m_addon)
+ return;
+
CAddonInstaller::GetInstance().InstallOrUpdate(m_addon->ID());
Close();
}
diff --git a/xbmc/addons/Repository.cpp b/xbmc/addons/Repository.cpp
index efac86ea9e..2bcb414cf4 100644
--- a/xbmc/addons/Repository.cpp
+++ b/xbmc/addons/Repository.cpp
@@ -32,14 +32,17 @@
#include "events/AddonManagementEvent.h"
#include "events/EventLog.h"
#include "FileItem.h"
+#include "filesystem/CurlFile.h"
#include "filesystem/Directory.h"
#include "filesystem/File.h"
+#include "filesystem/ZipFile.h"
#include "messaging/helpers/DialogHelper.h"
#include "settings/Settings.h"
#include "TextureDatabase.h"
#include "URL.h"
#include "utils/JobManager.h"
#include "utils/log.h"
+#include "utils/Mime.h"
#include "utils/StringUtils.h"
#include "utils/URIUtils.h"
#include "utils/Variant.h"
@@ -162,24 +165,41 @@ std::string CRepository::GetAddonHash(const AddonPtr& addon) const
x = y; \
}
-bool CRepository::Parse(const DirInfo& dir, VECADDONS &result)
+
+bool CRepository::FetchIndex(const std::string& url, VECADDONS& addons)
{
- std::string file = dir.info;
- if (dir.compressed)
+ XFILE::CCurlFile http;
+ http.SetContentEncoding("gzip");
+
+ std::string content;
+ if (!http.Get(url, content))
+ return false;
+
+ if (URIUtils::HasExtension(url, ".gz")
+ || CMime::GetFileTypeFromMime(http.GetMimeType()) == CMime::EFileType::FileTypeGZip)
{
- CURL url(dir.info);
- std::string opts = url.GetProtocolOptions();
- if (!opts.empty())
- opts += "&";
- url.SetProtocolOptions(opts+"Encoding=gzip");
- file = url.Get();
+ CLog::Log(LOGDEBUG, "CRepository '%s' is gzip. decompressing", url.c_str());
+ std::string buffer;
+ if (!CZipFile::DecompressGzip(content, buffer))
+ return false;
+ content = std::move(buffer);
}
- VECADDONS addons;
CXBMCTinyXML doc;
- if (doc.LoadFile(file) && doc.RootElement() &&
- CAddonMgr::GetInstance().AddonsFromRepoXML(doc.RootElement(), addons))
+ if (!doc.Parse(content) || !doc.RootElement()
+ || !CAddonMgr::GetInstance().AddonsFromRepoXML(doc.RootElement(), addons))
{
+ CLog::Log(LOGERROR, "CRepository: Failed to parse addons.xml. Malformated.");
+ return false;
+ }
+ return true;
+}
+
+bool CRepository::Parse(const DirInfo& dir, VECADDONS& addons)
+{
+ if (!FetchIndex(dir.info, addons))
+ return false;
+
for (IVECADDONS i = addons.begin(); i != addons.end(); ++i)
{
AddonPtr addon = *i;
@@ -199,11 +219,8 @@ bool CRepository::Parse(const DirInfo& dir, VECADDONS &result)
SET_IF_NOT_EMPTY(addon->Props().changelog,URIUtils::AddFileToFolder(dir.datadir,addon->ID()+"/changelog.txt"))
SET_IF_NOT_EMPTY(addon->Props().fanart,URIUtils::AddFileToFolder(dir.datadir,addon->ID()+"/fanart.jpg"))
}
- result.push_back(addon);
}
- return true;
- }
- return false;
+ return true;
}
@@ -238,11 +255,7 @@ bool CRepositoryUpdateJob::DoWork()
return true;
}
- database.AddRepository(m_repo->ID(), addons, newChecksum, m_repo->Version());
-
- //Invalidate art. FIXME: this will cause a lot of unnecessary re-caching and
- //unnecessary HEAD requests being sent to server. icons and fanart rarely
- //change, and cannot change if there is no version bump.
+ //Invalidate art.
{
CTextureDatabase textureDB;
textureDB.Open();
@@ -250,14 +263,22 @@ bool CRepositoryUpdateJob::DoWork()
for (const auto& addon : addons)
{
- if (!addon->Props().fanart.empty())
- textureDB.InvalidateCachedTexture(addon->Props().fanart);
- if (!addon->Props().icon.empty())
- textureDB.InvalidateCachedTexture(addon->Props().icon);
+ AddonPtr oldAddon;
+ if (database.GetAddon(addon->ID(), oldAddon) && addon->Version() > oldAddon->Version())
+ {
+ if (!addon->Props().icon.empty() || !addon->Props().fanart.empty())
+ CLog::Log(LOGDEBUG, "CRepository: invalidating cached art for '%s'", addon->ID().c_str());
+ if (!addon->Props().icon.empty())
+ textureDB.InvalidateCachedTexture(addon->Props().icon);
+ if (!addon->Props().fanart.empty())
+ textureDB.InvalidateCachedTexture(addon->Props().fanart);
+ }
}
textureDB.CommitMultipleExecute();
}
+ database.AddRepository(m_repo->ID(), addons, newChecksum, m_repo->Version());
+
//Update broken status
database.BeginMultipleExecute();
for (const auto& addon : addons)
@@ -269,8 +290,8 @@ bool CRepositoryUpdateJob::DoWork()
//We have a newer verison locally
continue;
- if (database.GetAddonVersion(addon->ID()) > addon->Version())
- //Newer verison in db (ie. in a different repo)
+ if (database.GetAddonVersion(addon->ID()).first > addon->Version())
+ //Newer version in db (ie. in a different repo)
continue;
bool depsMet = CAddonInstaller::GetInstance().CheckDependencies(addon);
diff --git a/xbmc/addons/Repository.h b/xbmc/addons/Repository.h
index a17cd0d080..0822144e46 100644
--- a/xbmc/addons/Repository.h
+++ b/xbmc/addons/Repository.h
@@ -59,6 +59,8 @@ namespace ADDON
private:
CRepository(const CRepository &rhs);
+
+ static bool FetchIndex(const std::string& url, VECADDONS& addons);
};
typedef std::shared_ptr<CRepository> RepositoryPtr;
diff --git a/xbmc/addons/RepositoryUpdater.cpp b/xbmc/addons/RepositoryUpdater.cpp
index 6efd95bf1b..4b1acd9dd7 100644
--- a/xbmc/addons/RepositoryUpdater.cpp
+++ b/xbmc/addons/RepositoryUpdater.cpp
@@ -118,7 +118,7 @@ void CRepositoryUpdater::CheckForUpdates(const ADDON::RepositoryPtr& repo, bool
m_doneEvent.Reset();
if (showProgress)
SetProgressIndicator(job);
- CJobManager::GetInstance().AddJob(job, this, CJob::PRIORITY_LOW_PAUSABLE);
+ CJobManager::GetInstance().AddJob(job, this, CJob::PRIORITY_LOW);
}
else
{
@@ -134,6 +134,15 @@ void CRepositoryUpdater::Await()
void CRepositoryUpdater::OnTimeout()
{
+ //workaround
+ if (g_windowManager.GetActiveWindow() == WINDOW_FULLSCREEN_VIDEO ||
+ g_windowManager.GetActiveWindow() == WINDOW_SLIDESHOW)
+ {
+ CLog::Log(LOGDEBUG,"CRepositoryUpdater: busy playing. postponing scheduled update");
+ m_timer.RestartAsync(2 * 60 * 1000);
+ return;
+ }
+
CLog::Log(LOGDEBUG,"CRepositoryUpdater: running scheduled update");
CheckForUpdates();
}
diff --git a/xbmc/android/activity/AndroidKey.cpp b/xbmc/android/activity/AndroidKey.cpp
index 77ee760fd5..19e76191d4 100644
--- a/xbmc/android/activity/AndroidKey.cpp
+++ b/xbmc/android/activity/AndroidKey.cpp
@@ -58,7 +58,7 @@ static KeyMap keyMap[] = {
{ AKEYCODE_DPAD_CENTER , XBMCK_RETURN },
{ AKEYCODE_VOLUME_UP , XBMCK_LAST },
{ AKEYCODE_VOLUME_DOWN , XBMCK_LAST },
- { AKEYCODE_POWER , XBMCK_POWER },
+ { AKEYCODE_POWER , XBMCK_LAST },
{ AKEYCODE_CAMERA , XBMCK_LAST },
{ AKEYCODE_CLEAR , XBMCK_LAST },
{ AKEYCODE_A , XBMCK_a },
@@ -117,12 +117,6 @@ static KeyMap keyMap[] = {
{ AKEYCODE_MENU , XBMCK_MENU },
{ AKEYCODE_NOTIFICATION , XBMCK_LAST },
{ AKEYCODE_SEARCH , XBMCK_LAST },
- { AKEYCODE_MEDIA_PLAY_PAUSE, XBMCK_MEDIA_PLAY_PAUSE },
- { AKEYCODE_MEDIA_STOP , XBMCK_MEDIA_STOP },
- { AKEYCODE_MEDIA_NEXT , XBMCK_MEDIA_NEXT_TRACK },
- { AKEYCODE_MEDIA_PREVIOUS , XBMCK_MEDIA_PREV_TRACK },
- { AKEYCODE_MEDIA_REWIND , XBMCK_MEDIA_REWIND },
- { AKEYCODE_MEDIA_FAST_FORWARD , XBMCK_MEDIA_FASTFORWARD },
{ AKEYCODE_MUTE , XBMCK_LAST },
{ AKEYCODE_PAGE_UP , XBMCK_PAGEUP },
{ AKEYCODE_PAGE_DOWN , XBMCK_PAGEDOWN },
@@ -151,10 +145,6 @@ static KeyMap keyMap[] = {
{ AKEYCODE_SCROLL_LOCK , XBMCK_SCROLLOCK },
{ AKEYCODE_INSERT , XBMCK_INSERT },
{ AKEYCODE_FORWARD , XBMCK_MEDIA_FASTFORWARD },
- { AKEYCODE_MEDIA_PLAY , XBMCK_MEDIA_PLAY_PAUSE },
- { AKEYCODE_MEDIA_PAUSE , XBMCK_MEDIA_PLAY_PAUSE },
- { AKEYCODE_MEDIA_RECORD , XBMCK_RECORD },
- { AKEYCODE_MEDIA_EJECT , XBMCK_EJECT },
{ AKEYCODE_GUIDE , XBMCK_GUIDE },
{ AKEYCODE_SETTINGS , XBMCK_SETTINGS },
{ AKEYCODE_INFO , XBMCK_INFO },
@@ -162,13 +152,43 @@ static KeyMap keyMap[] = {
{ AKEYCODE_PROG_GREEN , XBMCK_GREEN },
{ AKEYCODE_PROG_YELLOW , XBMCK_YELLOW },
{ AKEYCODE_PROG_BLUE , XBMCK_BLUE },
+
+ { AKEYCODE_F1 , XBMCK_F1 },
+ { AKEYCODE_F2 , XBMCK_F2 },
+ { AKEYCODE_F3 , XBMCK_F3 },
+ { AKEYCODE_F4 , XBMCK_F4 },
+ { AKEYCODE_F5 , XBMCK_F5 },
+ { AKEYCODE_F6 , XBMCK_F6 },
+ { AKEYCODE_F7 , XBMCK_F7 },
+ { AKEYCODE_F8 , XBMCK_F8 },
+ { AKEYCODE_F9 , XBMCK_F9 },
+ { AKEYCODE_F10 , XBMCK_F10 },
+ { AKEYCODE_F11 , XBMCK_F11 },
+ { AKEYCODE_F12 , XBMCK_F12 },
};
+static KeyMap MediakeyMap[] = {
+ { AKEYCODE_MEDIA_PLAY_PAUSE, XBMCK_MEDIA_PLAY_PAUSE },
+ { AKEYCODE_MEDIA_STOP , XBMCK_MEDIA_STOP },
+ { AKEYCODE_MEDIA_NEXT , XBMCK_MEDIA_NEXT_TRACK },
+ { AKEYCODE_MEDIA_PREVIOUS , XBMCK_MEDIA_PREV_TRACK },
+ { AKEYCODE_MEDIA_REWIND , XBMCK_MEDIA_REWIND },
+ { AKEYCODE_MEDIA_FAST_FORWARD , XBMCK_MEDIA_FASTFORWARD },
+ { AKEYCODE_MEDIA_PLAY , XBMCK_MEDIA_PLAY_PAUSE },
+ { AKEYCODE_MEDIA_PAUSE , XBMCK_MEDIA_PLAY_PAUSE },
+ { AKEYCODE_MEDIA_RECORD , XBMCK_RECORD },
+ { AKEYCODE_MEDIA_EJECT , XBMCK_EJECT },
+};
+
+bool CAndroidKey::m_handleMediaKeys = false;
+
bool CAndroidKey::onKeyboardEvent(AInputEvent *event)
{
if (event == NULL)
return false;
+ bool ret = true;
+
int32_t flags = AKeyEvent_getFlags(event);
int32_t state = AKeyEvent_getMetaState(event);
int32_t action = AKeyEvent_getAction(event);
@@ -189,6 +209,21 @@ bool CAndroidKey::onKeyboardEvent(AInputEvent *event)
break;
}
}
+ if (sym == XBMCK_UNKNOWN)
+ {
+ for (unsigned int index = 0; index < sizeof(MediakeyMap) / sizeof(KeyMap); index++)
+ {
+ if (keycode == MediakeyMap[index].nativeKey)
+ {
+ sym = MediakeyMap[index].xbmcKey;
+ break;
+ }
+ }
+ if (sym != XBMCK_UNKNOWN)
+ {
+ ret = m_handleMediaKeys;
+ }
+ }
// check if this is a key we don't want to handle
if (sym == XBMCK_LAST || sym == XBMCK_UNKNOWN)
@@ -225,7 +260,7 @@ bool CAndroidKey::onKeyboardEvent(AInputEvent *event)
(state & AMETA_SYM_ON) ? "yes" : "no");
#endif
XBMC_Key((uint8_t)keycode, sym, modifiers, unicode, false);
- return true;
+ break;
case AKEY_EVENT_ACTION_UP:
#if 1
@@ -236,7 +271,7 @@ bool CAndroidKey::onKeyboardEvent(AInputEvent *event)
(state & AMETA_SYM_ON) ? "yes" : "no");
#endif
XBMC_Key((uint8_t)keycode, sym, modifiers, unicode, true);
- return true;
+ break;
case AKEY_EVENT_ACTION_MULTIPLE:
#if 1
@@ -246,6 +281,7 @@ bool CAndroidKey::onKeyboardEvent(AInputEvent *event)
(state & AMETA_SHIFT_ON) ? "yes" : "no",
(state & AMETA_SYM_ON) ? "yes" : "no");
#endif
+ return false;
break;
default:
@@ -256,10 +292,11 @@ bool CAndroidKey::onKeyboardEvent(AInputEvent *event)
(state & AMETA_SHIFT_ON) ? "yes" : "no",
(state & AMETA_SYM_ON) ? "yes" : "no");
#endif
+ return false;
break;
}
- return false;
+ return ret;
}
void CAndroidKey::XBMC_Key(uint8_t code, uint16_t key, uint16_t modifiers, uint16_t unicode, bool up)
diff --git a/xbmc/android/activity/AndroidKey.h b/xbmc/android/activity/AndroidKey.h
index 7ded4e63d2..6de2e9bfbc 100644
--- a/xbmc/android/activity/AndroidKey.h
+++ b/xbmc/android/activity/AndroidKey.h
@@ -32,6 +32,10 @@ public:
~CAndroidKey() {};
bool onKeyboardEvent(AInputEvent *event);
- void XBMC_Key(uint8_t code, uint16_t key, uint16_t modifiers, uint16_t unicode, bool up);
- void XBMC_JoyButton(uint8_t id, uint8_t button, bool up);
+
+ static void SetHandleMediaKeys(bool enable) { m_handleMediaKeys = enable; }
+ static void XBMC_Key(uint8_t code, uint16_t key, uint16_t modifiers, uint16_t unicode, bool up);
+
+protected:
+ static bool m_handleMediaKeys;
};
diff --git a/xbmc/android/activity/EventLoop.cpp b/xbmc/android/activity/EventLoop.cpp
index fdf3358415..2d058909d3 100644
--- a/xbmc/android/activity/EventLoop.cpp
+++ b/xbmc/android/activity/EventLoop.cpp
@@ -160,19 +160,12 @@ int32_t CEventLoop::processInput(AInputEvent* event)
rtn = m_inputHandler->onKeyboardEvent(event);
break;
case AINPUT_EVENT_TYPE_MOTION:
- switch(source)
- {
- case AINPUT_SOURCE_TOUCHSCREEN:
- rtn = m_inputHandler->onTouchEvent(event);
- break;
- case AINPUT_SOURCE_MOUSE:
- rtn = m_inputHandler->onMouseEvent(event);
- break;
- case AINPUT_SOURCE_GAMEPAD:
- case AINPUT_SOURCE_JOYSTICK:
- rtn = m_inputHandler->onJoyStickMotionEvent(event);
- break;
- }
+ if (source & AINPUT_SOURCE_TOUCHSCREEN)
+ rtn = m_inputHandler->onTouchEvent(event);
+ else if (source & AINPUT_SOURCE_MOUSE)
+ rtn = m_inputHandler->onMouseEvent(event);
+ else if (source & (AINPUT_SOURCE_GAMEPAD | AINPUT_SOURCE_JOYSTICK))
+ rtn = m_inputHandler->onJoyStickMotionEvent(event);
break;
}
diff --git a/xbmc/android/activity/JNIMainActivity.cpp b/xbmc/android/activity/JNIMainActivity.cpp
index 1074d0124b..3cdbdec0d3 100644
--- a/xbmc/android/activity/JNIMainActivity.cpp
+++ b/xbmc/android/activity/JNIMainActivity.cpp
@@ -93,3 +93,15 @@ void CJNIMainActivity::setVideoViewSurfaceRect(int l, int t, int r, int b)
call_method<void>(m_context,
"setVideoViewSurfaceRect", "(IIII)V", l, t, r, b);
}
+
+void CJNIMainActivity::registerMediaButtonEventReceiver()
+{
+ call_method<void>(m_context,
+ "registerMediaButtonEventReceiver", "()V");
+}
+
+void CJNIMainActivity::unregisterMediaButtonEventReceiver()
+{
+ call_method<void>(m_context,
+ "unregisterMediaButtonEventReceiver", "()V");
+}
diff --git a/xbmc/android/activity/JNIMainActivity.h b/xbmc/android/activity/JNIMainActivity.h
index 300ea81af7..c03ca86461 100644
--- a/xbmc/android/activity/JNIMainActivity.h
+++ b/xbmc/android/activity/JNIMainActivity.h
@@ -36,6 +36,8 @@ public:
static void _callNative(JNIEnv *env, jobject context, jlong funcAddr, jlong variantAddr);
static void runNativeOnUiThread(void (*callback)(CVariant *), CVariant *variant);
+ static void registerMediaButtonEventReceiver();
+ static void unregisterMediaButtonEventReceiver();
CJNISurface getVideoViewSurface();
void clearVideoView();
diff --git a/xbmc/android/activity/XBMCApp.cpp b/xbmc/android/activity/XBMCApp.cpp
index 638f4f8c71..b4a2036cb6 100644
--- a/xbmc/android/activity/XBMCApp.cpp
+++ b/xbmc/android/activity/XBMCApp.cpp
@@ -65,8 +65,6 @@
#include "android/jni/System.h"
#include "android/jni/ApplicationInfo.h"
#include "android/jni/StatFs.h"
-#include "android/jni/BitmapDrawable.h"
-#include "android/jni/Bitmap.h"
#include "android/jni/CharSequence.h"
#include "android/jni/URI.h"
#include "android/jni/Cursor.h"
@@ -78,6 +76,8 @@
#endif
#include "android/jni/Window.h"
#include "android/jni/WindowManager.h"
+#include "android/jni/KeyEvent.h"
+#include "AndroidKey.h"
#include "CompileInfo.h"
@@ -156,12 +156,11 @@ void CXBMCApp::onStart()
void CXBMCApp::onResume()
{
android_printf("%s: ", __PRETTY_FUNCTION__);
+
+ // Some intent filters MUST be registered in code rather than through the manifest
CJNIIntentFilter intentFilter;
intentFilter.addAction("android.intent.action.BATTERY_CHANGED");
- intentFilter.addAction("android.intent.action.DREAMING_STOPPED");
intentFilter.addAction("android.intent.action.SCREEN_ON");
- intentFilter.addAction("android.intent.action.HEADSET_PLUG");
- intentFilter.addAction("android.bluetooth.a2dp.profile.action.CONNECTION_STATE_CHANGED");
registerReceiver(*this, intentFilter);
if (!g_application.IsInScreenSaver())
@@ -172,6 +171,8 @@ void CXBMCApp::onResume()
CJNIAudioManager audioManager(getSystemService("audio"));
m_headsetPlugged = audioManager.isWiredHeadsetOn() || audioManager.isBluetoothA2dpOn();
+ unregisterMediaButtonEventReceiver();
+
// Clear the applications cache. We could have installed/deinstalled apps
{
CSingleLock lock(m_applicationsMutex);
@@ -182,8 +183,13 @@ void CXBMCApp::onResume()
void CXBMCApp::onPause()
{
android_printf("%s: ", __PRETTY_FUNCTION__);
-
- unregisterReceiver(*this);
+ if (g_application.m_pPlayer->IsPlaying())
+ {
+ if (g_application.m_pPlayer->IsPlayingVideo())
+ CApplicationMessenger::GetInstance().SendMsg(TMSG_GUI_ACTION, WINDOW_INVALID, -1, static_cast<void*>(new CAction(ACTION_STOP)));
+ else
+ registerMediaButtonEventReceiver();
+ }
#if defined(HAS_LIBAMCODEC)
if (aml_permissions())
@@ -254,7 +260,7 @@ void CXBMCApp::onCreateWindow(ANativeWindow* window)
void CXBMCApp::onResizeWindow()
{
android_printf("%s: ", __PRETTY_FUNCTION__);
- m_window=NULL;
+ m_window = NULL;
m_windowCreated.Reset();
// no need to do anything because we are fixed in fullscreen landscape mode
}
@@ -267,6 +273,7 @@ void CXBMCApp::onDestroyWindow()
if (!m_exiting)
{
XBMC_DestroyDisplay();
+ m_window = NULL;
XBMC_Pause(true);
}
}
@@ -412,9 +419,6 @@ void CXBMCApp::run()
void CXBMCApp::XBMC_Pause(bool pause)
{
android_printf("XBMC_Pause(%s)", pause ? "true" : "false");
- // Only send the PAUSE action if we are pausing XBMC and video is currently playing
- if (pause && g_application.m_pPlayer->IsPlayingVideo() && !g_application.m_pPlayer->IsPaused())
- CApplicationMessenger::GetInstance().SendMsg(TMSG_GUI_ACTION, WINDOW_INVALID, -1, static_cast<void*>(new CAction(ACTION_PAUSE)));
}
void CXBMCApp::XBMC_Stop()
@@ -501,6 +505,8 @@ int CXBMCApp::GetDPI()
void CXBMCApp::OnPlayBackStarted()
{
AcquireAudioFocus();
+ registerMediaButtonEventReceiver();
+ CAndroidKey::SetHandleMediaKeys(true);
}
void CXBMCApp::OnPlayBackPaused()
@@ -515,11 +521,15 @@ void CXBMCApp::OnPlayBackResumed()
void CXBMCApp::OnPlayBackStopped()
{
+ CAndroidKey::SetHandleMediaKeys(false);
+ unregisterMediaButtonEventReceiver();
ReleaseAudioFocus();
}
void CXBMCApp::OnPlayBackEnded()
{
+ CAndroidKey::SetHandleMediaKeys(false);
+ unregisterMediaButtonEventReceiver();
ReleaseAudioFocus();
}
@@ -531,16 +541,17 @@ std::vector<androidPackage> CXBMCApp::GetApplications()
CJNIList<CJNIApplicationInfo> packageList = GetPackageManager().getInstalledApplications(CJNIPackageManager::GET_ACTIVITIES);
int numPackages = packageList.size();
for (int i = 0; i < numPackages; i++)
- {
- androidPackage newPackage;
- newPackage.packageName = packageList.get(i).packageName;
- newPackage.packageLabel = GetPackageManager().getApplicationLabel(packageList.get(i)).toString();
- CJNIIntent intent = GetPackageManager().getLaunchIntentForPackage(newPackage.packageName);
+ {
+ CJNIIntent intent = GetPackageManager().getLaunchIntentForPackage(packageList.get(i).packageName);
if (!intent && CJNIBuild::SDK_INT >= 21)
- intent = GetPackageManager().getLeanbackLaunchIntentForPackage(newPackage.packageName);
+ intent = GetPackageManager().getLeanbackLaunchIntentForPackage(packageList.get(i).packageName);
if (!intent)
continue;
+ androidPackage newPackage;
+ newPackage.packageName = packageList.get(i).packageName;
+ newPackage.packageLabel = GetPackageManager().getApplicationLabel(packageList.get(i)).toString();
+ newPackage.icon = packageList.get(i).icon;
m_applications.push_back(newPackage);
}
}
@@ -548,34 +559,6 @@ std::vector<androidPackage> CXBMCApp::GetApplications()
return m_applications;
}
-bool CXBMCApp::GetIconSize(const string &packageName, int *width, int *height)
-{
- JNIEnv* env = xbmc_jnienv();
- AndroidBitmapInfo info;
- CJNIBitmapDrawable drawable = (CJNIBitmapDrawable)GetPackageManager().getApplicationIcon(packageName);
- CJNIBitmap icon(drawable.getBitmap());
- AndroidBitmap_getInfo(env, icon.get_raw(), &info);
- *width = info.width;
- *height = info.height;
- return true;
-}
-
-bool CXBMCApp::GetIcon(const string &packageName, void* buffer, unsigned int bufSize)
-{
- void *bitmapBuf = NULL;
- JNIEnv* env = xbmc_jnienv();
- CJNIBitmapDrawable drawable = (CJNIBitmapDrawable)GetPackageManager().getApplicationIcon(packageName);
- CJNIBitmap bitmap(drawable.getBitmap());
- AndroidBitmap_lockPixels(env, bitmap.get_raw(), &bitmapBuf);
- if (bitmapBuf)
- {
- memcpy(buffer, bitmapBuf, bufSize);
- AndroidBitmap_unlockPixels(env, bitmap.get_raw());
- return true;
- }
- return false;
-}
-
bool CXBMCApp::HasLaunchIntent(const string &package)
{
return GetPackageManager().getLaunchIntentForPackage(package) != NULL;
@@ -769,6 +752,35 @@ void CXBMCApp::onReceive(CJNIIntent intent)
CAEFactory::DeviceChange();
}
}
+ else if (action == "android.intent.action.MEDIA_BUTTON")
+ {
+ CJNIKeyEvent keyevt = (CJNIKeyEvent)intent.getParcelableExtra(CJNIIntent::EXTRA_KEY_EVENT);
+
+ int keycode = keyevt.getKeyCode();
+ bool up = (keyevt.getAction() == CJNIKeyEvent::ACTION_UP);
+
+ CLog::Log(LOGINFO, "Got MEDIA_BUTTON intent: %d, up:%s", keycode, up ? "true" : "false");
+ if (keycode == CJNIKeyEvent::KEYCODE_MEDIA_RECORD)
+ CAndroidKey::XBMC_Key(keycode, XBMCK_RECORD, 0, 0, up);
+ else if (keycode == CJNIKeyEvent::KEYCODE_MEDIA_EJECT)
+ CAndroidKey::XBMC_Key(keycode, XBMCK_EJECT, 0, 0, up);
+ else if (keycode == CJNIKeyEvent::KEYCODE_MEDIA_FAST_FORWARD)
+ CAndroidKey::XBMC_Key(keycode, XBMCK_MEDIA_FASTFORWARD, 0, 0, up);
+ else if (keycode == CJNIKeyEvent::KEYCODE_MEDIA_NEXT)
+ CAndroidKey::XBMC_Key(keycode, XBMCK_MEDIA_NEXT_TRACK, 0, 0, up);
+ else if (keycode == CJNIKeyEvent::KEYCODE_MEDIA_PAUSE)
+ CAndroidKey::XBMC_Key(keycode, XBMCK_MEDIA_PLAY_PAUSE, 0, 0, up);
+ else if (keycode == CJNIKeyEvent::KEYCODE_MEDIA_PLAY)
+ CAndroidKey::XBMC_Key(keycode, XBMCK_MEDIA_PLAY_PAUSE, 0, 0, up);
+ else if (keycode == CJNIKeyEvent::KEYCODE_MEDIA_PLAY_PAUSE)
+ CAndroidKey::XBMC_Key(keycode, XBMCK_MEDIA_PLAY_PAUSE, 0, 0, up);
+ else if (keycode == CJNIKeyEvent::KEYCODE_MEDIA_PREVIOUS)
+ CAndroidKey::XBMC_Key(keycode, XBMCK_MEDIA_PREV_TRACK, 0, 0, up);
+ else if (keycode == CJNIKeyEvent::KEYCODE_MEDIA_REWIND)
+ CAndroidKey::XBMC_Key(keycode, XBMCK_MEDIA_REWIND, 0, 0, up);
+ else if (keycode == CJNIKeyEvent::KEYCODE_MEDIA_STOP)
+ CAndroidKey::XBMC_Key(keycode, XBMCK_MEDIA_STOP, 0, 0, up);
+ }
}
void CXBMCApp::onNewIntent(CJNIIntent intent)
@@ -783,16 +795,22 @@ void CXBMCApp::onNewIntent(CJNIIntent intent)
void CXBMCApp::onVolumeChanged(int volume)
{
- CApplicationMessenger::GetInstance().PostMsg(TMSG_GUI_ACTION, WINDOW_INVALID, -1, static_cast<void*>(
- new CAction(ACTION_VOLUME_SET, static_cast<float>(volume))));
+ // System volume was used; Reset Kodi volume to 100% if it'not, already
+ if (g_application.GetVolume(false) != 1.0)
+ CApplicationMessenger::GetInstance().PostMsg(TMSG_GUI_ACTION, WINDOW_INVALID, -1, static_cast<void*>(
+ new CAction(ACTION_VOLUME_SET, static_cast<float>(CXBMCApp::GetMaxSystemVolume()))));
}
void CXBMCApp::onAudioFocusChange(int focusChange)
{
CXBMCApp::android_printf("Audio Focus changed: %d", focusChange);
- if (focusChange == CJNIAudioManager::AUDIOFOCUS_LOSS && g_application.m_pPlayer->IsPlaying() && !g_application.m_pPlayer->IsPaused())
- CApplicationMessenger::GetInstance().SendMsg(TMSG_GUI_ACTION, WINDOW_INVALID, -1, static_cast<void*>(
- new CAction(ACTION_PAUSE)));
+ if (focusChange == CJNIAudioManager::AUDIOFOCUS_LOSS)
+ {
+ unregisterMediaButtonEventReceiver();
+
+ if (g_application.m_pPlayer->IsPlaying() && !g_application.m_pPlayer->IsPaused())
+ CApplicationMessenger::GetInstance().SendMsg(TMSG_GUI_ACTION, WINDOW_INVALID, -1, static_cast<void*>(new CAction(ACTION_PAUSE)));
+ }
}
void CXBMCApp::SetupEnv()
diff --git a/xbmc/android/activity/XBMCApp.h b/xbmc/android/activity/XBMCApp.h
index 8d4e213c1b..36240fe79c 100644
--- a/xbmc/android/activity/XBMCApp.h
+++ b/xbmc/android/activity/XBMCApp.h
@@ -48,12 +48,13 @@ struct androidIcon
unsigned int width;
unsigned int height;
void *pixels;
-};
+};
struct androidPackage
{
std::string packageName;
std::string packageLabel;
+ int icon;
};
class CXBMCApp : public IActivityHandler, public CJNIMainActivity, public CJNIBroadcastReceiver, public CJNIAudioManagerAudioFocusChangeListener
@@ -96,8 +97,6 @@ public:
static bool StartActivity(const std::string &package, const std::string &intent = std::string(), const std::string &dataType = std::string(), const std::string &dataURI = std::string());
static std::vector <androidPackage> GetApplications();
- static bool GetIconSize(const std::string &packageName, int *width, int *height);
- static bool GetIcon(const std::string &packageName, void* buffer, unsigned int bufSize);
/*!
* \brief If external storage is available, it returns the path for the external storage (for the specified type)
diff --git a/xbmc/android/jni/ApplicationInfo.cpp b/xbmc/android/jni/ApplicationInfo.cpp
index da7ec9d3f6..4f97940b53 100644
--- a/xbmc/android/jni/ApplicationInfo.cpp
+++ b/xbmc/android/jni/ApplicationInfo.cpp
@@ -23,7 +23,7 @@
using namespace jni;
-CJNIApplicationInfo::CJNIApplicationInfo(const jhobject &object) : CJNIBase(object)
+CJNIApplicationInfo::CJNIApplicationInfo(const jhobject &object) : CJNIPackageItemInfo(object)
,sourceDir( jcast<std::string>(get_field<jhstring>(m_object, "sourceDir")))
,publicSourceDir( jcast<std::string>(get_field<jhstring>(m_object, "publicSourceDir")))
,dataDir( jcast<std::string>(get_field<jhstring>(m_object, "dataDir")))
diff --git a/xbmc/android/jni/ApplicationInfo.h b/xbmc/android/jni/ApplicationInfo.h
index 0c4678d758..edf6ccfdde 100644
--- a/xbmc/android/jni/ApplicationInfo.h
+++ b/xbmc/android/jni/ApplicationInfo.h
@@ -20,8 +20,9 @@
*/
#include "JNIBase.h"
+#include "PackageItemInfo.h"
-class CJNIApplicationInfo : public CJNIBase
+class CJNIApplicationInfo : public CJNIPackageItemInfo
{
public:
CJNIApplicationInfo(const jni::jhobject &object);
diff --git a/xbmc/android/jni/Context.cpp b/xbmc/android/jni/Context.cpp
index c45686b59a..8b9b5d79f6 100644
--- a/xbmc/android/jni/Context.cpp
+++ b/xbmc/android/jni/Context.cpp
@@ -45,6 +45,9 @@
#include "Window.h"
#include "View.h"
#include "Build.h"
+#include "DisplayMetrics.h"
+#include "Intent.h"
+#include "KeyEvent.h"
#include <android/native_activity.h>
@@ -84,6 +87,9 @@ void CJNIContext::PopulateStaticFields()
CJNIMediaFormat::PopulateStaticFields();
CJNIView::PopulateStaticFields();
CJNIBuild::PopulateStaticFields();
+ CJNIDisplayMetrics::PopulateStaticFields();
+ CJNIIntent::PopulateStaticFields();
+ CJNIKeyEvent::PopulateStaticFields();
}
CJNIPackageManager CJNIContext::GetPackageManager()
diff --git a/xbmc/android/jni/DisplayMetrics.cpp b/xbmc/android/jni/DisplayMetrics.cpp
new file mode 100644
index 0000000000..0a2c39685d
--- /dev/null
+++ b/xbmc/android/jni/DisplayMetrics.cpp
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2013 Team XBMC
+ * http://xbmc.org
+ *
+ * This Program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This Program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with XBMC; see the file COPYING. If not, see
+ * <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "DisplayMetrics.h"
+#include "jutils/jutils-details.hpp"
+
+using namespace jni;
+const char *CJNIDisplayMetrics::m_classname = "android/util/DisplayMetrics";
+
+int CJNIDisplayMetrics::DENSITY_DEFAULT(-1);
+int CJNIDisplayMetrics::DENSITY_HIGH(-1);
+int CJNIDisplayMetrics::DENSITY_LOW(-1);
+int CJNIDisplayMetrics::DENSITY_MEDIUM(-1);
+int CJNIDisplayMetrics::DENSITY_TV(-1);
+int CJNIDisplayMetrics::DENSITY_XHIGH(-1);
+int CJNIDisplayMetrics::DENSITY_XXHIGH(-1);
+int CJNIDisplayMetrics::DENSITY_XXXHIGH(-1);
+
+void CJNIDisplayMetrics::PopulateStaticFields()
+{
+ jhclass clazz = find_class(m_classname);
+
+ DENSITY_DEFAULT = get_static_field<jint>(clazz, "DENSITY_DEFAULT");
+ DENSITY_HIGH = get_static_field<jint>(clazz, "DENSITY_HIGH");
+ DENSITY_LOW = get_static_field<jint>(clazz, "DENSITY_LOW");
+ DENSITY_MEDIUM = get_static_field<jint>(clazz, "DENSITY_MEDIUM");
+ DENSITY_TV = get_static_field<jint>(clazz, "DENSITY_TV");
+ DENSITY_XHIGH = get_static_field<jint>(clazz, "DENSITY_XHIGH");
+ if(CJNIBase::GetSDKVersion() >= 16)
+ DENSITY_XXHIGH = get_static_field<jint>(clazz, "DENSITY_XXHIGH");
+ if(CJNIBase::GetSDKVersion() >= 18)
+ DENSITY_XXXHIGH = get_static_field<jint>(clazz, "DENSITY_XXXHIGH");
+}
diff --git a/xbmc/android/jni/DisplayMetrics.h b/xbmc/android/jni/DisplayMetrics.h
new file mode 100644
index 0000000000..578ef54b46
--- /dev/null
+++ b/xbmc/android/jni/DisplayMetrics.h
@@ -0,0 +1,42 @@
+#pragma once
+/*
+ * Copyright (C) 2013 Team XBMC
+ * http://xbmc.org
+ *
+ * This Program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This Program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with XBMC; see the file COPYING. If not, see
+ * <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "JNIBase.h"
+
+class CJNIDisplayMetrics
+{
+public:
+ static int DENSITY_DEFAULT;
+ static int DENSITY_HIGH;
+ static int DENSITY_LOW;
+ static int DENSITY_MEDIUM;
+ static int DENSITY_TV;
+ static int DENSITY_XHIGH;
+ static int DENSITY_XXHIGH;
+ static int DENSITY_XXXHIGH;
+
+ static void PopulateStaticFields();
+
+private:
+ CJNIDisplayMetrics();
+ ~CJNIDisplayMetrics() {};
+ static const char *m_classname;
+};
diff --git a/xbmc/android/jni/Intent.cpp b/xbmc/android/jni/Intent.cpp
index eb7eeec8d2..264a629d8c 100644
--- a/xbmc/android/jni/Intent.cpp
+++ b/xbmc/android/jni/Intent.cpp
@@ -24,6 +24,14 @@
using namespace jni;
+std::string CJNIIntent::EXTRA_KEY_EVENT;
+
+void CJNIIntent::PopulateStaticFields()
+{
+ jhclass clazz = find_class("android/content/Intent");
+ EXTRA_KEY_EVENT = jcast<std::string>(get_static_field<jhstring>(clazz,"EXTRA_KEY_EVENT"));
+}
+
CJNIIntent::CJNIIntent(const std::string &action) : CJNIBase("android/content/Intent")
{
if(action.empty())
@@ -72,6 +80,13 @@ std::string CJNIIntent::getStringExtra(const std::string &name) const
jcast<jhstring>(name)));
}
+jni::jhobject CJNIIntent::getParcelableExtra(const std::string &name) const
+{
+ return call_method<jhobject>(m_object,
+ "getParcelableExtra", "(Ljava/lang/String;)Landroid/os/Parcelable;",
+ jcast<jhstring>(name));
+}
+
bool CJNIIntent::hasExtra(const std::string &name) const
{
return call_method<jboolean>(m_object,
diff --git a/xbmc/android/jni/Intent.h b/xbmc/android/jni/Intent.h
index c187642c88..6855fba284 100644
--- a/xbmc/android/jni/Intent.h
+++ b/xbmc/android/jni/Intent.h
@@ -36,6 +36,7 @@ public:
int getIntExtra(const std::string &name, int defaultValue) const;
std::string getStringExtra(const std::string &name) const;
+ jni::jhobject getParcelableExtra(const std::string &name) const;
bool hasExtra(const std::string &name) const;
bool hasCategory(const std::string &category) const;
@@ -53,4 +54,7 @@ public:
void setPackage(const std::string &packageName);
void setType(const std::string &type);
CJNIURI getData() const;
+
+ static void PopulateStaticFields();
+ static std::string EXTRA_KEY_EVENT;
};
diff --git a/xbmc/android/jni/KeyEvent.cpp b/xbmc/android/jni/KeyEvent.cpp
new file mode 100644
index 0000000000..55c38c824d
--- /dev/null
+++ b/xbmc/android/jni/KeyEvent.cpp
@@ -0,0 +1,68 @@
+/*
+ * Copyright (C) 2013 Team XBMC
+ * http://xbmc.org
+ *
+ * This Program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This Program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with XBMC; see the file COPYING. If not, see
+ * <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "KeyEvent.h"
+
+#include "jutils/jutils-details.hpp"
+
+using namespace jni;
+
+int CJNIKeyEvent::ACTION_DOWN;
+int CJNIKeyEvent::ACTION_UP;
+
+int CJNIKeyEvent::KEYCODE_MEDIA_RECORD;
+int CJNIKeyEvent::KEYCODE_MEDIA_EJECT;
+int CJNIKeyEvent::KEYCODE_MEDIA_FAST_FORWARD;
+int CJNIKeyEvent::KEYCODE_MEDIA_NEXT ;
+int CJNIKeyEvent::KEYCODE_MEDIA_PAUSE;
+int CJNIKeyEvent::KEYCODE_MEDIA_PLAY;
+int CJNIKeyEvent::KEYCODE_MEDIA_PLAY_PAUSE;
+int CJNIKeyEvent::KEYCODE_MEDIA_PREVIOUS;
+int CJNIKeyEvent::KEYCODE_MEDIA_REWIND;
+int CJNIKeyEvent::KEYCODE_MEDIA_STOP;
+
+void CJNIKeyEvent::PopulateStaticFields()
+{
+ jhclass clazz = find_class("android/view/KeyEvent");
+ ACTION_DOWN = (get_static_field<int>(clazz, "ACTION_DOWN"));
+ ACTION_UP = (get_static_field<int>(clazz, "ACTION_UP"));
+ KEYCODE_MEDIA_RECORD = (get_static_field<int>(clazz, "KEYCODE_MEDIA_RECORD"));
+ KEYCODE_MEDIA_EJECT = (get_static_field<int>(clazz, "KEYCODE_MEDIA_EJECT"));
+ KEYCODE_MEDIA_FAST_FORWARD = (get_static_field<int>(clazz, "KEYCODE_MEDIA_FAST_FORWARD"));
+ KEYCODE_MEDIA_NEXT = (get_static_field<int>(clazz, "KEYCODE_MEDIA_NEXT"));
+ KEYCODE_MEDIA_PAUSE = (get_static_field<int>(clazz, "KEYCODE_MEDIA_PAUSE"));
+ KEYCODE_MEDIA_PLAY = (get_static_field<int>(clazz, "KEYCODE_MEDIA_PLAY"));
+ KEYCODE_MEDIA_PLAY_PAUSE = (get_static_field<int>(clazz, "KEYCODE_MEDIA_PLAY_PAUSE"));
+ KEYCODE_MEDIA_PREVIOUS = (get_static_field<int>(clazz, "KEYCODE_MEDIA_PREVIOUS"));
+ KEYCODE_MEDIA_REWIND = (get_static_field<int>(clazz, "KEYCODE_MEDIA_REWIND"));
+ KEYCODE_MEDIA_STOP = (get_static_field<int>(clazz, "KEYCODE_MEDIA_STOP"));
+}
+
+int CJNIKeyEvent::getKeyCode()
+{
+ return call_method<jint>(m_object,
+ "getKeyCode", "()I");
+}
+
+int CJNIKeyEvent::getAction()
+{
+ return call_method<jint>(m_object,
+ "getAction", "()I");
+}
diff --git a/xbmc/android/jni/KeyEvent.h b/xbmc/android/jni/KeyEvent.h
new file mode 100644
index 0000000000..5ad8474610
--- /dev/null
+++ b/xbmc/android/jni/KeyEvent.h
@@ -0,0 +1,68 @@
+#pragma once
+/*
+ * Copyright (C) 2013 Team XBMC
+ * http://xbmc.org
+ *
+ * This Program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This Program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with XBMC; see the file COPYING. If not, see
+ * <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "JNIBase.h"
+
+class CJNIKeyEventAudioFocusChangeListener : public CJNIBase
+{
+public:
+ CJNIKeyEventAudioFocusChangeListener(const jni::jhobject &object) : CJNIBase(object) {};
+ virtual ~CJNIKeyEventAudioFocusChangeListener() {};
+
+ static void _onAudioFocusChange(JNIEnv *env, jobject context, jint focusChange);
+
+protected:
+ CJNIKeyEventAudioFocusChangeListener();
+
+ virtual void onAudioFocusChange(int focusChange)=0;
+
+private:
+ static CJNIKeyEventAudioFocusChangeListener *m_listenerInstance;
+};
+
+class CJNIKeyEvent : public CJNIBase
+{
+public:
+ CJNIKeyEvent(const jni::jhobject &object) : CJNIBase(object) {};
+ ~CJNIKeyEvent() {};
+
+ int getKeyCode();
+ int getAction();
+
+ static void PopulateStaticFields();
+ static int ACTION_DOWN;
+ static int ACTION_UP;
+
+ static int KEYCODE_MEDIA_RECORD;
+ static int KEYCODE_MEDIA_EJECT;
+ static int KEYCODE_MEDIA_FAST_FORWARD;
+ static int KEYCODE_MEDIA_NEXT ;
+ static int KEYCODE_MEDIA_PAUSE;
+ static int KEYCODE_MEDIA_PLAY;
+ static int KEYCODE_MEDIA_PLAY_PAUSE;
+ static int KEYCODE_MEDIA_PREVIOUS;
+ static int KEYCODE_MEDIA_REWIND;
+ static int KEYCODE_MEDIA_STOP;
+
+private:
+ CJNIKeyEvent();
+};
+
diff --git a/xbmc/android/jni/Makefile.in b/xbmc/android/jni/Makefile.in
index 7e7a58431a..7e1eeff619 100644
--- a/xbmc/android/jni/Makefile.in
+++ b/xbmc/android/jni/Makefile.in
@@ -54,6 +54,10 @@ SRCS += Activity.cpp
SRCS += SystemProperties.cpp
SRCS += Display.cpp
SRCS += WindowManager.cpp
+SRCS += Resources.cpp
+SRCS += PackageItemInfo.cpp
+SRCS += DisplayMetrics.cpp
+SRCS += KeyEvent.cpp
LIB = jni.a
diff --git a/xbmc/android/jni/PackageItemInfo.cpp b/xbmc/android/jni/PackageItemInfo.cpp
new file mode 100644
index 0000000000..c0d4f2ccff
--- /dev/null
+++ b/xbmc/android/jni/PackageItemInfo.cpp
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2013 Team XBMC
+ * http://xbmc.org
+ *
+ * This Program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This Program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with XBMC; see the file COPYING. If not, see
+ * <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "PackageItemInfo.h"
+#include "jutils/jutils-details.hpp"
+
+using namespace jni;
+const char *CJNIPackageItemInfo::m_classname = "android/content/pm/PackageItemInfo";
+
+CJNIPackageItemInfo::CJNIPackageItemInfo(const jhobject &object) : CJNIBase(object)
+ ,icon( get_field<int>(m_object, "icon"))
+{
+}
diff --git a/xbmc/android/jni/PackageItemInfo.h b/xbmc/android/jni/PackageItemInfo.h
new file mode 100644
index 0000000000..2924ef006a
--- /dev/null
+++ b/xbmc/android/jni/PackageItemInfo.h
@@ -0,0 +1,36 @@
+#pragma once
+/*
+ * Copyright (C) 2013 Team XBMC
+ * http://xbmc.org
+ *
+ * This Program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This Program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with XBMC; see the file COPYING. If not, see
+ * <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "JNIBase.h"
+
+class CJNIPackageItemInfo : public CJNIBase
+{
+public:
+ CJNIPackageItemInfo(const jni::jhobject &object);
+
+ int icon;
+
+protected:
+ CJNIPackageItemInfo();
+ ~CJNIPackageItemInfo() {};
+ static const char *m_classname;
+
+};
diff --git a/xbmc/android/jni/PackageManager.cpp b/xbmc/android/jni/PackageManager.cpp
index ddec8a72e6..b9d510ef5c 100644
--- a/xbmc/android/jni/PackageManager.cpp
+++ b/xbmc/android/jni/PackageManager.cpp
@@ -24,6 +24,7 @@
#include "List.h"
#include "CharSequence.h"
#include "ApplicationInfo.h"
+#include "Resources.h"
#include "jutils/jutils-details.hpp"
using namespace jni;
@@ -71,3 +72,16 @@ CJNIList<CJNIApplicationInfo> CJNIPackageManager::getInstalledApplications(int f
flags);
}
+CJNIResources CJNIPackageManager::getResourcesForApplication(const std::string &package)
+{
+ return call_method<jhobject>(m_object,
+ "getResourcesForApplication", "(Ljava/lang/String;)Landroid/content/res/Resources;",
+ jcast<jhstring>(package));
+}
+
+CJNIResources CJNIPackageManager::getResourcesForApplication(const CJNIApplicationInfo &info)
+{
+ return call_method<jhobject>(m_object,
+ "getResourcesForApplication", "(Landroid/content/pm/ApplicationInfo;)Landroid/content/res/Resources;",
+ info.get_raw());
+}
diff --git a/xbmc/android/jni/PackageManager.h b/xbmc/android/jni/PackageManager.h
index 5477b84008..bf22c33120 100644
--- a/xbmc/android/jni/PackageManager.h
+++ b/xbmc/android/jni/PackageManager.h
@@ -26,6 +26,7 @@ class CJNIIntent;
class CJNIDrawable;
class CJNIApplicationInfo;
class CJNICharSequence;
+class CJNIResources;
class CJNIPackageManager : public CJNIBase
{
@@ -38,6 +39,8 @@ public:
CJNIDrawable getApplicationIcon(const std::string &package);
CJNIList<CJNIApplicationInfo> getInstalledApplications(int flags);
CJNICharSequence getApplicationLabel(const CJNIApplicationInfo &info);
+ CJNIResources getResourcesForApplication(const std::string &package);
+ CJNIResources getResourcesForApplication(const CJNIApplicationInfo &info);
static void PopulateStaticFields();
static int GET_ACTIVITIES;
diff --git a/xbmc/android/jni/Resources.cpp b/xbmc/android/jni/Resources.cpp
new file mode 100644
index 0000000000..55e2a49389
--- /dev/null
+++ b/xbmc/android/jni/Resources.cpp
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2013 Team XBMC
+ * http://xbmc.org
+ *
+ * This Program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This Program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with XBMC; see the file COPYING. If not, see
+ * <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "Resources.h"
+#include "Drawable.h"
+#include "jutils/jutils-details.hpp"
+
+using namespace jni;
+
+CJNIDrawable CJNIResources::getDrawableForDensity(int id, int density)
+{
+ return call_method<jhobject>(m_object,
+ "getDrawableForDensity", "(II)Landroid/graphics/drawable/Drawable;",
+ id, density);
+}
+
diff --git a/xbmc/android/jni/Resources.h b/xbmc/android/jni/Resources.h
new file mode 100644
index 0000000000..bb6751ab9c
--- /dev/null
+++ b/xbmc/android/jni/Resources.h
@@ -0,0 +1,37 @@
+#pragma once
+/*
+ * Copyright (C) 2013 Team XBMC
+ * http://xbmc.org
+ *
+ * This Program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This Program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with XBMC; see the file COPYING. If not, see
+ * <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "JNIBase.h"
+#include "List.h"
+
+class CJNIDrawable;
+
+class CJNIResources : public CJNIBase
+{
+public:
+ CJNIResources(const jni::jhobject &object) : CJNIBase(object) {};
+ ~CJNIResources() {};
+
+ CJNIDrawable getDrawableForDensity(int id, int density);
+
+private:
+ CJNIResources();
+};
diff --git a/xbmc/cores/AudioEngine/DSPAddons/ActiveAEDSP.cpp b/xbmc/cores/AudioEngine/DSPAddons/ActiveAEDSP.cpp
index 37c4c7d500..1b230e4242 100644
--- a/xbmc/cores/AudioEngine/DSPAddons/ActiveAEDSP.cpp
+++ b/xbmc/cores/AudioEngine/DSPAddons/ActiveAEDSP.cpp
@@ -86,42 +86,6 @@ CActiveAEDSP &CActiveAEDSP::GetInstance()
}
//@}
-/*! @name message handling methods */
-//@{
-void CActiveAEDSP::OnApplicationMessage(KODI::MESSAGING::ThreadMessage* pMsg)
-{
- switch(pMsg->dwMessage)
- {
- case TMSG_SETAUDIODSPSTATE:
- if(pMsg->param1 == ACTIVE_AE_DSP_STATE_ON)
- {
- if(pMsg->param2 == ACTIVE_AE_DSP_ASYNC_ACTIVATE)
- {
- Activate(true);
- }
- else
- {
- Activate();
- }
- }
- else if(pMsg->param1 == ACTIVE_AE_DSP_STATE_OFF)
- {
- Deactivate();
- }
- break;
-
- default:
- CLog::Log(LOGERROR, "CActiveAEDSP received a invalid message! Nothing is processed.");
- break;
- }
-}
-
-int CActiveAEDSP::GetMessageMask()
-{
- return TMSG_MASK_AUDIO_DSP;
-}
-//@}
-
/*! @name initialization and configuration methods */
//@{
class CActiveAEDSPStartJob : public CJob
@@ -146,11 +110,11 @@ void CActiveAEDSP::Activate(bool bAsync /* = false */)
return;
}
- CSingleLock lock(m_critSection);
-
/* first stop and remove any audio dsp add-on's */
Deactivate();
+ CSingleLock lock(m_critSection);
+
CLog::Log(LOGNOTICE, "ActiveAE DSP - starting");
/* don't start if Settings->System->Audio->Audio DSP isn't checked */
@@ -214,29 +178,29 @@ void CActiveAEDSP::TriggerModeUpdate(bool bAsync /* = true */)
void CActiveAEDSP::Deactivate(void)
{
- CSingleLock lock(m_critSection);
-
/* check whether the audio dsp is loaded */
if (!m_isActive)
return;
- CLog::Log(LOGNOTICE, "ActiveAE DSP - stopping");
-
/* stop thread */
- StopThread(false);
+ StopThread();
- /* unload all data */
- Cleanup();
+ CSingleLock lock(m_critSection);
- /* close database */
- if (m_databaseDSP.IsOpen())
- m_databaseDSP.Close();
+ CLog::Log(LOGNOTICE, "ActiveAE DSP - stopping");
/* destroy all addons */
for (AE_DSP_ADDONMAP_ITR itr = m_addonMap.begin(); itr != m_addonMap.end(); ++itr)
itr->second->Destroy();
m_addonMap.clear();
+
+ /* unload all data */
+ Cleanup();
+
+ /* close database */
+ if (m_databaseDSP.IsOpen())
+ m_databaseDSP.Close();
}
void CActiveAEDSP::Cleanup(void)
@@ -758,8 +722,7 @@ bool CActiveAEDSP::UpdateAddons(void)
{
dspAddon = std::dynamic_pointer_cast<CActiveAEDSPAddon>(*itr);
- bool newRegistration = false;
- if (RegisterAudioDSPAddon(dspAddon, &newRegistration) < 0 || newRegistration)
+ if (RegisterAudioDSPAddon(dspAddon) < 0)
{
CAddonMgr::GetInstance().DisableAddon(dspAddon->ID());
--usableAddons;
@@ -812,8 +775,10 @@ void CActiveAEDSP::Process(void)
else if (!m_noAddonWarningDisplayed)
ShowDialogNoAddonsEnabled();
}
-
- Sleep(1000);
+ else
+ {
+ Sleep(1000);
+ }
}
m_isActive = false;
@@ -832,13 +797,10 @@ void CActiveAEDSP::ShowDialogNoAddonsEnabled(void)
g_windowManager.ActivateWindow(WINDOW_ADDON_BROWSER, params);
}
-int CActiveAEDSP::RegisterAudioDSPAddon(AddonPtr addon, bool* newRegistration/*=NULL*/)
+int CActiveAEDSP::RegisterAudioDSPAddon(AddonPtr addon)
{
int iAddonId(-1);
- if (newRegistration)
- *newRegistration = false;
-
if (!addon->Enabled())
return -1;
@@ -861,8 +823,6 @@ int CActiveAEDSP::RegisterAudioDSPAddon(AddonPtr addon, bool* newRegistration/*=
CLog::Log(LOGERROR, "ActiveAE DSP - %s - can't add dsp addon '%s' to the database", __FUNCTION__, addon->Name().c_str());
return -1;
}
- else if (newRegistration)
- *newRegistration = true;
}
AE_DSP_ADDON dspAddon;
diff --git a/xbmc/cores/AudioEngine/DSPAddons/ActiveAEDSP.h b/xbmc/cores/AudioEngine/DSPAddons/ActiveAEDSP.h
index 74f7ab630f..f023ee16da 100644
--- a/xbmc/cores/AudioEngine/DSPAddons/ActiveAEDSP.h
+++ b/xbmc/cores/AudioEngine/DSPAddons/ActiveAEDSP.h
@@ -31,9 +31,10 @@
#include "ActiveAEDSPDatabase.h"
#include "ActiveAEDSPMode.h"
-#define ACTIVE_AE_DSP_STATE_ON 0
-#define ACTIVE_AE_DSP_STATE_OFF 1
-#define ACTIVE_AE_DSP_SYNC_ACTIVATE 0
+#define ACTIVE_AE_DSP_STATE_OFF 0
+#define ACTIVE_AE_DSP_STATE_ON 1
+
+#define ACTIVE_AE_DSP_SYNC_ACTIVATE 0
#define ACTIVE_AE_DSP_ASYNC_ACTIVATE 1
extern "C" {
@@ -61,7 +62,6 @@ namespace ActiveAE
class CActiveAEDSP : public ADDON::IAddonMgrCallback,
public ISettingCallback,
public Observer,
- public KODI::MESSAGING::IMessageTarget,
private CThread
{
/*! @name Master audio dsp control class */
@@ -85,12 +85,6 @@ namespace ActiveAE
static CActiveAEDSP &GetInstance();
//@}
- /*! @name message handling methods */
- //@{
- virtual void OnApplicationMessage(KODI::MESSAGING::ThreadMessage* pMsg) override;
- virtual int GetMessageMask() override;
- //@}
-
/*! @name initialization and configuration methods */
//@{
/*!
@@ -438,7 +432,7 @@ namespace ActiveAE
* @param newRegistration pass in pointer to bool to return whether the client was newly registered.
* @return The id of the addon if it was created or found in the existing addon map, -1 otherwise.
*/
- int RegisterAudioDSPAddon(ADDON::AddonPtr addon, bool* newRegistration = NULL);
+ int RegisterAudioDSPAddon(ADDON::AddonPtr addon);
/*!
* @brief Get the instance of the dsp addon, if it's ready.
diff --git a/xbmc/cores/AudioEngine/DSPAddons/ActiveAEDSPDatabase.cpp b/xbmc/cores/AudioEngine/DSPAddons/ActiveAEDSPDatabase.cpp
index 322d2509c3..bd9ff55d88 100644
--- a/xbmc/cores/AudioEngine/DSPAddons/ActiveAEDSPDatabase.cpp
+++ b/xbmc/cores/AudioEngine/DSPAddons/ActiveAEDSPDatabase.cpp
@@ -91,8 +91,6 @@ void CActiveAEDSPDatabase::CreateTables()
// disable all Audio DSP add-on when started the first time
ADDON::VECADDONS addons;
if (CAddonMgr::GetInstance().GetAddons(ADDON_ADSPDLL, addons, true))
- CLog::Log(LOGERROR, "Audio DSP - %s - failed to get add-ons from the add-on manager", __FUNCTION__);
- else
{
for (IVECADDONS it = addons.begin(); it != addons.end(); ++it)
CAddonMgr::GetInstance().DisableAddon(it->get()->ID());
diff --git a/xbmc/cores/AudioEngine/Sinks/AESinkAUDIOTRACK.cpp b/xbmc/cores/AudioEngine/Sinks/AESinkAUDIOTRACK.cpp
index 6ed6b5dbf7..7001112e3b 100644
--- a/xbmc/cores/AudioEngine/Sinks/AESinkAUDIOTRACK.cpp
+++ b/xbmc/cores/AudioEngine/Sinks/AESinkAUDIOTRACK.cpp
@@ -217,7 +217,7 @@ bool CAESinkAUDIOTRACK::Initialize(AEAudioFormat &format, std::string &device)
m_passthrough = false;
#if defined(HAS_LIBAMCODEC)
- if (CSettings::GetInstance().GetBool(CSettings::SETTING_VIDEOPLAYER_USEAMCODEC))
+ if (aml_present() && CSettings::GetInstance().GetBool(CSettings::SETTING_VIDEOPLAYER_USEAMCODEC))
aml_set_audio_passthrough(m_passthrough);
#endif
@@ -364,23 +364,6 @@ void CAESinkAUDIOTRACK::Drain()
m_frames_written = 0;
}
-bool CAESinkAUDIOTRACK::HasVolume()
-{
- return true;
-}
-
-void CAESinkAUDIOTRACK::SetVolume(float scale)
-{
- // Ignore in passthrough
- if (m_passthrough)
- return;
-
- if (!m_at_jni)
- return;
-
- CXBMCApp::SetSystemVolume(scale);
-}
-
void CAESinkAUDIOTRACK::EnumerateDevicesEx(AEDeviceInfoList &list, bool force)
{
m_info.m_channels.Reset();
diff --git a/xbmc/cores/AudioEngine/Sinks/AESinkAUDIOTRACK.h b/xbmc/cores/AudioEngine/Sinks/AESinkAUDIOTRACK.h
index 8927e707ff..d1e188657e 100644
--- a/xbmc/cores/AudioEngine/Sinks/AESinkAUDIOTRACK.h
+++ b/xbmc/cores/AudioEngine/Sinks/AESinkAUDIOTRACK.h
@@ -45,8 +45,6 @@ public:
virtual double GetCacheTotal ();
virtual unsigned int AddPackets (uint8_t **data, unsigned int frames, unsigned int offset);
virtual void Drain ();
- virtual bool HasVolume ();
- virtual void SetVolume (float scale);
static void EnumerateDevicesEx(AEDeviceInfoList &list, bool force = false);
protected:
diff --git a/xbmc/cores/AudioEngine/Sinks/AESinkDirectSound.cpp b/xbmc/cores/AudioEngine/Sinks/AESinkDirectSound.cpp
index 452a96f59a..a8ee8293ae 100644
--- a/xbmc/cores/AudioEngine/Sinks/AESinkDirectSound.cpp
+++ b/xbmc/cores/AudioEngine/Sinks/AESinkDirectSound.cpp
@@ -192,7 +192,7 @@ bool CAESinkDirectSound::Initialize(AEAudioFormat &format, std::string &device)
else
tmp_hWnd = g_hWnd;
- CLog::Log(LOGDEBUG, __FUNCTION__": Using Window handle: %d", tmp_hWnd);
+ CLog::Log(LOGDEBUG, __FUNCTION__": Using Window handle: %p", tmp_hWnd);
hr = m_pDSound->SetCooperativeLevel(tmp_hWnd, DSSCL_PRIORITY);
diff --git a/xbmc/cores/AudioEngine/Sinks/AESinkPULSE.cpp b/xbmc/cores/AudioEngine/Sinks/AESinkPULSE.cpp
index ca295496bf..67b7b90f0d 100644
--- a/xbmc/cores/AudioEngine/Sinks/AESinkPULSE.cpp
+++ b/xbmc/cores/AudioEngine/Sinks/AESinkPULSE.cpp
@@ -181,7 +181,7 @@ static void SinkInputInfoCallback(pa_context *c, const pa_sink_input_info *i, in
if (!p || !p->IsInitialized())
return;
- if(i && i->has_volume)
+ if(i && i->has_volume && !i->corked)
p->UpdateInternalVolume(&(i->volume));
}
diff --git a/xbmc/cores/AudioEngine/Utils/AEUtil.cpp b/xbmc/cores/AudioEngine/Utils/AEUtil.cpp
index 6d6b0e19ca..90f6c44431 100644
--- a/xbmc/cores/AudioEngine/Utils/AEUtil.cpp
+++ b/xbmc/cores/AudioEngine/Utils/AEUtil.cpp
@@ -38,21 +38,22 @@ unsigned int CAEUtil::m_seed = (unsigned int)(CurrentHostCounter() / 1000.0f);
MEMALIGN(16, __m128i CAEUtil::m_sseSeed) = _mm_set_epi32(CAEUtil::m_seed, CAEUtil::m_seed+1, CAEUtil::m_seed, CAEUtil::m_seed+1);
#endif
-void AEDelayStatus::SetDelay(double d)
+void AEDelayStatus::SetDelay(double d)
{
delay = d;
- tick = CurrentHostCounter();
+ maxcorrection = d;
+ tick = CurrentHostCounter();
}
double AEDelayStatus::GetDelay()
{
- double d = delay;
- if(tick)
- d -= (double)(CurrentHostCounter() - tick) / CurrentHostFrequency();
- if(d < 0)
- return 0.0;
- else
- return d;
+ double d = 0;
+ if (tick)
+ d = (double)(CurrentHostCounter() - tick) / CurrentHostFrequency();
+ if (d > maxcorrection)
+ d = maxcorrection;
+
+ return delay - d;
}
CAEChannelInfo CAEUtil::GuessChLayout(const unsigned int channels)
diff --git a/xbmc/cores/AudioEngine/Utils/AEUtil.h b/xbmc/cores/AudioEngine/Utils/AEUtil.h
index edc920ee64..56c0a1f038 100644
--- a/xbmc/cores/AudioEngine/Utils/AEUtil.h
+++ b/xbmc/cores/AudioEngine/Utils/AEUtil.h
@@ -64,14 +64,16 @@ struct AEDelayStatus
{
AEDelayStatus()
: delay(0.0)
+ , maxcorrection(0.0)
, tick(0)
{}
void SetDelay(double d);
double GetDelay();
- double delay; /*!< delay in sink currently */
- int64_t tick; /*!< timestamp when delay was calculated */
+ double delay; // delay in sink currently
+ double maxcorrection; // time correction must not be greater than sink delay
+ int64_t tick; // timestamp when delay was calculated
};
/**
diff --git a/xbmc/cores/DllLoader/Win32DllLoader.cpp b/xbmc/cores/DllLoader/Win32DllLoader.cpp
index e9b25a39f1..13b21c5e91 100644
--- a/xbmc/cores/DllLoader/Win32DllLoader.cpp
+++ b/xbmc/cores/DllLoader/Win32DllLoader.cpp
@@ -249,7 +249,7 @@ void Win32DllLoader::OverrideImports(const std::string &dll)
if (!image_base)
{
- CLog::Log(LOGERROR, "%s - unable to GetModuleHandle for dll %s", dll.c_str());
+ CLog::Log(LOGERROR, "%s - unable to GetModuleHandle for dll %s", __FUNCTION__, dll.c_str());
return;
}
@@ -261,7 +261,7 @@ void Win32DllLoader::OverrideImports(const std::string &dll)
if (!imp_desc)
{
- CLog::Log(LOGERROR, "%s - unable to get import directory for dll %s", dll.c_str());
+ CLog::Log(LOGERROR, "%s - unable to get import directory for dll %s", __FUNCTION__, dll.c_str());
return;
}
diff --git a/xbmc/cores/DllLoader/exports/emu_kernel32.cpp b/xbmc/cores/DllLoader/exports/emu_kernel32.cpp
index 0ab0c309f3..aad5fb0def 100644
--- a/xbmc/cores/DllLoader/exports/emu_kernel32.cpp
+++ b/xbmc/cores/DllLoader/exports/emu_kernel32.cpp
@@ -272,8 +272,8 @@ static void DumpSystemInfo(const SYSTEM_INFO* si)
{
CLog::Log(LOGDEBUG, " Processor architecture %d\n", si->wProcessorArchitecture);
CLog::Log(LOGDEBUG, " Page size: %d\n", si->dwPageSize);
- CLog::Log(LOGDEBUG, " Minimum app address: %d\n", si->lpMinimumApplicationAddress);
- CLog::Log(LOGDEBUG, " Maximum app address: %d\n", si->lpMaximumApplicationAddress);
+ CLog::Log(LOGDEBUG, " Minimum app address: %p\n", si->lpMinimumApplicationAddress);
+ CLog::Log(LOGDEBUG, " Maximum app address: %p\n", si->lpMaximumApplicationAddress);
CLog::Log(LOGDEBUG, " Active processor mask: 0x%x\n", si->dwActiveProcessorMask);
CLog::Log(LOGDEBUG, " Number of processors: %d\n", si->dwNumberOfProcessors);
CLog::Log(LOGDEBUG, " Processor type: 0x%x\n", si->dwProcessorType);
diff --git a/xbmc/cores/VideoRenderers/DXVAHD.cpp b/xbmc/cores/VideoRenderers/DXVAHD.cpp
index fa5559b7e8..c8fd6717ee 100644
--- a/xbmc/cores/VideoRenderers/DXVAHD.cpp
+++ b/xbmc/cores/VideoRenderers/DXVAHD.cpp
@@ -176,7 +176,7 @@ bool CProcessorHD::InitProcessor()
m_bStereoEnabled = true;
if (0 != (m_vcaps.FeatureCaps & D3D11_VIDEO_PROCESSOR_FEATURE_CAPS_LEGACY))
- CLog::Log(LOGWARNING, "%s - The video driver does not support full video processing capabilities.", __FUNCTION__, m_vcaps.RateConversionCapsCount);
+ CLog::Log(LOGWARNING, "%s - The video driver does not support full video processing capabilities.", __FUNCTION__);
m_max_back_refs = 0;
m_max_fwd_refs = 0;
diff --git a/xbmc/cores/VideoRenderers/VideoShaders/WinVideoFilter.cpp b/xbmc/cores/VideoRenderers/VideoShaders/WinVideoFilter.cpp
index 133a5937cd..2aafd0ef4b 100644
--- a/xbmc/cores/VideoRenderers/VideoShaders/WinVideoFilter.cpp
+++ b/xbmc/cores/VideoRenderers/VideoShaders/WinVideoFilter.cpp
@@ -20,16 +20,17 @@
#ifdef HAS_DX
-#include <DirectXPackedVector.h>
#include "WinVideoFilter.h"
-#include "windowing/WindowingFactory.h"
-#include "../../../utils/log.h"
-#include "../../../FileSystem/File.h"
-#include <map>
#include "ConvolutionKernels.h"
-#include "YUV2RGBShader.h"
-#include "win32/WIN32Util.h"
+#include <DirectXPackedVector.h>
+#include "FileSystem/File.h"
+#include "guilib/GraphicContext.h"
#include "Util.h"
+#include "utils/log.h"
+#include "win32/WIN32Util.h"
+#include "windowing/WindowingFactory.h"
+#include "YUV2RGBShader.h"
+#include <map>
using namespace DirectX::PackedVector;
@@ -314,10 +315,6 @@ void CYUV2RGBShader::Render(CRect sourceRect, CRect destRect,
contrast, brightness, flags);
SetShaderParameters(YUVbuf);
Execute(nullptr, 4);
-
- // we changed view port, so we need to restore our real viewport.
- g_Windowing.RestoreViewPort();
-
}
CYUV2RGBShader::~CYUV2RGBShader()
@@ -390,32 +387,9 @@ void CYUV2RGBShader::SetShaderParameters(YUVBuffer* YUVbuf)
m_effect.SetTexture("g_VTexture", YUVbuf->planes[2].texture);
m_effect.SetFloatArray("g_StepXY", m_texSteps, ARRAY_SIZE(m_texSteps));
- // we need to set view port to the full size of current render target
- ID3D11RenderTargetView* rtView = nullptr;
- g_Windowing.Get3D11Context()->OMGetRenderTargets(1, &rtView, nullptr);
-
- // get dimention of render target
- ID3D11Resource* rtResource = nullptr;
- rtView->GetResource(&rtResource);
- ID3D11Texture2D* rtTexture = nullptr;
- HRESULT hr = rtResource->QueryInterface(__uuidof(ID3D11Texture2D), reinterpret_cast<void**>(&rtTexture));
-
- float viewPortWidth = 0.0f, viewPortHeight = 0.0f;
-
- if (S_OK == hr && rtTexture)
- {
- D3D11_TEXTURE2D_DESC rtDescr = {};
- rtTexture->GetDesc(&rtDescr);
- viewPortWidth = static_cast<float>(rtDescr.Width);
- viewPortHeight = static_cast<float>(rtDescr.Height);
- }
-
- SAFE_RELEASE(rtTexture);
- SAFE_RELEASE(rtResource);
- SAFE_RELEASE(rtView);
-
- D3D11_VIEWPORT viewPort = { 0.0f, 0.0f, viewPortWidth, viewPortHeight, 0.0, 1.0f };
- g_Windowing.Get3D11Context()->RSSetViewports(1, &viewPort);
+ UINT numPorts = 1;
+ D3D11_VIEWPORT viewPort;
+ g_Windowing.Get3D11Context()->RSGetViewports(&numPorts, &viewPort);
m_effect.SetFloatArray("g_viewPort", &viewPort.Width, 2);
}
@@ -844,48 +818,57 @@ void CConvolutionShaderSeparable::SetShaderParameters(CD3DTexture &sourceTexture
void CConvolutionShaderSeparable::SetStepParams(UINT iPass)
{
- float viewPortWidth = 0.0f, viewPortHeight = 0.0f;
+ CD3D11_VIEWPORT viewPort(.0f, .0f, .0f, .0f);
ID3D11DeviceContext* pContext = g_Windowing.Get3D11Context();
if (iPass == 0)
{
// store old RT
pContext->OMGetRenderTargets(1, &m_oldRenderTarget, nullptr);
- viewPortWidth = (float)m_IntermediateTarget.GetWidth();
- viewPortHeight = (float)m_IntermediateTarget.GetHeight();
-
// setting new RT
ID3D11RenderTargetView* newRT = m_IntermediateTarget.GetRenderTarget();
pContext->OMSetRenderTargets(1, &newRT, nullptr);
+ // new viewport
+ viewPort = CD3D11_VIEWPORT(0.0f, 0.0f,
+ static_cast<float>(m_IntermediateTarget.GetWidth()),
+ static_cast<float>(m_IntermediateTarget.GetHeight()));
+ // reset scissor
+ g_Windowing.ResetScissors();
}
else if (iPass == 1)
{
- // get dimention of old render target
- ID3D11Resource* rtResource = nullptr;
- m_oldRenderTarget->GetResource(&rtResource);
- ID3D11Texture2D* rtTexture = nullptr;
- HRESULT hr = rtResource->QueryInterface(__uuidof(ID3D11Texture2D), reinterpret_cast<void**>(&rtTexture));
-
- if (S_OK == hr && rtTexture)
+ if (m_oldRenderTarget)
{
- D3D11_TEXTURE2D_DESC rtDescr = {};
- rtTexture->GetDesc(&rtDescr);
- viewPortWidth = static_cast<float>(rtDescr.Width);
- viewPortHeight = static_cast<float>(rtDescr.Height);
+ // get dimention of old render target
+ ID3D11Resource* rtResource = nullptr;
+ m_oldRenderTarget->GetResource(&rtResource);
+ ID3D11Texture2D* rtTexture = nullptr;
+ if (SUCCEEDED(rtResource->QueryInterface(__uuidof(ID3D11Texture2D), reinterpret_cast<void**>(&rtTexture))))
+ {
+ D3D11_TEXTURE2D_DESC rtDescr = {};
+ rtTexture->GetDesc(&rtDescr);
+ viewPort = CD3D11_VIEWPORT(0.0f, 0.0f,
+ static_cast<float>(rtDescr.Width),
+ static_cast<float>(rtDescr.Height));
+ }
+ SAFE_RELEASE(rtTexture);
+ SAFE_RELEASE(rtResource);
+ }
+ else
+ {
+ // current RT is null so try to restore viewport
+ CRect winViewPort;
+ g_Windowing.GetViewPort(winViewPort);
+ viewPort = CD3D11_VIEWPORT(winViewPort.x1, winViewPort.y1, winViewPort.Width(), winViewPort.Height());
}
-
- SAFE_RELEASE(rtTexture);
- SAFE_RELEASE(rtResource);
-
pContext->OMSetRenderTargets(1, &m_oldRenderTarget, nullptr);
SAFE_RELEASE(m_oldRenderTarget);
-
// at the second pass m_IntermediateTarget is a source of data
m_effect.SetTexture("g_Texture", m_IntermediateTarget);
+ // restore scissor
+ g_Windowing.SetScissors(g_graphicsContext.StereoCorrection(g_graphicsContext.GetScissors()));
}
-
- // setting view port to the full size of the current render target
- CD3D11_VIEWPORT viewPort(0.0f, 0.0f, viewPortWidth, viewPortHeight);
+ // seting view port
pContext->RSSetViewports(1, &viewPort);
// pass viewport dimention to the shaders
m_effect.SetFloatArray("g_viewPort", &viewPort.Width, 2);
diff --git a/xbmc/cores/VideoRenderers/WinRenderer.cpp b/xbmc/cores/VideoRenderers/WinRenderer.cpp
index 1dea24febb..e7e82a2009 100644
--- a/xbmc/cores/VideoRenderers/WinRenderer.cpp
+++ b/xbmc/cores/VideoRenderers/WinRenderer.cpp
@@ -510,7 +510,7 @@ bool CWinRenderer::CreateIntermediateRenderTarget(unsigned int width, unsigned i
if(!m_IntermediateTarget.Create(width, height, 1, D3D11_USAGE_DEFAULT, format))
{
- CLog::Log(LOGERROR, __FUNCTION__": intermediate render target creation failed.", format);
+ CLog::Log(LOGERROR, __FUNCTION__": intermediate render target creation failed.");
return false;
}
return true;
@@ -814,92 +814,62 @@ void CWinRenderer::RenderPS()
void CWinRenderer::Stage1()
{
+ CD3D11_VIEWPORT viewPort(0.0f, 0.0f, 0.0f, 0.0f);
ID3D11DeviceContext* pContext = g_Windowing.Get3D11Context();
- g_Windowing.ResetScissors();
- // Store current render target and depth view.
- ID3D11RenderTargetView *oldRT = nullptr; ID3D11DepthStencilView* oldDS = nullptr;
- pContext->OMGetRenderTargets(1, &oldRT, &oldDS);
-
- if (!m_bUseHQScaler)
- {
- // disable depth
- pContext->OMSetRenderTargets(1, &oldRT, nullptr);
- // render video frame
- m_colorShader->Render(m_sourceRect, g_graphicsContext.StereoCorrection(m_destRect),
- CMediaSettings::GetInstance().GetCurrentVideoSettings().m_Contrast,
- CMediaSettings::GetInstance().GetCurrentVideoSettings().m_Brightness,
- m_iFlags, (YUVBuffer*)m_VideoBuffers[m_iYV12RenderBuffer]);
- }
- else
+ // store current render target and depth view.
+ ID3D11RenderTargetView *oldRTView = nullptr; ID3D11DepthStencilView* oldDSView = nullptr;
+ pContext->OMGetRenderTargets(1, &oldRTView, &oldDSView);
+ // select destination rectangle
+ CRect destRect = m_bUseHQScaler ? m_sourceRect : g_graphicsContext.StereoCorrection(m_destRect);
+ // select target view
+ ID3D11RenderTargetView* pRTView = m_bUseHQScaler ? m_IntermediateTarget.GetRenderTarget() : oldRTView;
+ // set destination render target
+ pContext->OMSetRenderTargets(1, &pRTView, nullptr);
+ // get rendertarget's dimension
+ if (pRTView)
{
- // At DX9 setting a new render target will cause the viewport
- // to be set to the full size of the new render target.
- // In DX11 we should do this manualy
- CD3D11_VIEWPORT viewPort(0.0f, 0.0f, static_cast<float>(m_IntermediateTarget.GetWidth()), static_cast<float>(m_IntermediateTarget.GetHeight()));
- pContext->RSSetViewports(1, &viewPort);
-
- ID3D11RenderTargetView *newRT = m_IntermediateTarget.GetRenderTarget();
-
- // this needs to avoid binding m_IntermediateTarget as shader resource and as render target at the same time
- CD3DHelper::PSClearShaderResources(pContext);
- // Switch the render target to the temporary destination
- pContext->OMSetRenderTargets(1, &newRT, nullptr);
-
- CRect srcRect(0.0f, 0.0f, static_cast<float>(m_sourceWidth), static_cast<float>(m_sourceHeight));
+ ID3D11Resource* pResource = nullptr;
+ ID3D11Texture2D* pTexture = nullptr;
- m_colorShader->Render(srcRect, srcRect,
- CMediaSettings::GetInstance().GetCurrentVideoSettings().m_Contrast,
- CMediaSettings::GetInstance().GetCurrentVideoSettings().m_Brightness,
- m_iFlags, (YUVBuffer*)m_VideoBuffers[m_iYV12RenderBuffer]);
-
- // Restore our view port.
- g_Windowing.RestoreViewPort();
+ pRTView->GetResource(&pResource);
+ if (SUCCEEDED(pResource->QueryInterface(__uuidof(ID3D11Texture2D), reinterpret_cast<void**>(&pTexture))))
+ {
+ D3D11_TEXTURE2D_DESC desc;
+ pTexture->GetDesc(&desc);
+ viewPort = CD3D11_VIEWPORT(0.0f, 0.0f, desc.Width, desc.Height);
+ }
+ SAFE_RELEASE(pResource);
+ SAFE_RELEASE(pTexture);
}
-
+ // reset scissors for HQ scaler
+ if (m_bUseHQScaler)
+ g_Windowing.ResetScissors();
+ // reset view port
+ pContext->RSSetViewports(1, &viewPort);
+ // render video frame
+ m_colorShader->Render(m_sourceRect, destRect,
+ CMediaSettings::GetInstance().GetCurrentVideoSettings().m_Contrast,
+ CMediaSettings::GetInstance().GetCurrentVideoSettings().m_Brightness,
+ m_iFlags, (YUVBuffer*)m_VideoBuffers[m_iYV12RenderBuffer]);
+ // Restore our view port.
+ g_Windowing.RestoreViewPort();
// Restore the render target and depth view.
- pContext->OMSetRenderTargets(1, &oldRT, oldDS);
- SAFE_RELEASE(oldRT);
- SAFE_RELEASE(oldDS);
+ pContext->OMSetRenderTargets(1, &oldRTView, oldDSView);
+ SAFE_RELEASE(oldRTView);
+ SAFE_RELEASE(oldDSView);
}
void CWinRenderer::Stage2()
{
- g_Windowing.ResetScissors();
-
- CRect sourceRect;
-
- // fixup stereo+dxva+hq scaling issue
- if (m_renderMethod == RENDER_DXVA)
- {
- sourceRect.y1 = 0.0f;
- sourceRect.y2 = static_cast<float>(m_sourceHeight);
- sourceRect.x1 = 0.0f;
- sourceRect.x2 = static_cast<float>(m_sourceWidth);
- }
- else
- sourceRect = m_sourceRect;
-
- m_scalerShader->Render(m_IntermediateTarget, m_sourceWidth, m_sourceHeight, m_destWidth, m_destHeight, sourceRect, g_graphicsContext.StereoCorrection(m_destRect));
+ m_scalerShader->Render(m_IntermediateTarget, m_sourceWidth, m_sourceHeight, m_destWidth, m_destHeight, m_sourceRect, g_graphicsContext.StereoCorrection(m_destRect));
}
void CWinRenderer::RenderProcessor(DWORD flags)
{
CSingleLock lock(g_graphicsContext);
- CRect destRect;
-
- if (m_bUseHQScaler)
- {
- destRect.y1 = 0.0f;
- destRect.y2 = static_cast<float>(m_sourceHeight);
- destRect.x1 = 0.0f;
- destRect.x2 = static_cast<float>(m_sourceWidth);
- }
- else
- destRect = g_graphicsContext.StereoCorrection(m_destRect);
-
+ CRect destRect = m_bUseHQScaler ? m_sourceRect : g_graphicsContext.StereoCorrection(m_destRect);
DXVABuffer *image = (DXVABuffer*)m_VideoBuffers[m_iYV12RenderBuffer];
-
if (!image->pic)
return;
@@ -911,14 +881,17 @@ void CWinRenderer::RenderProcessor(DWORD flags)
|| true /* workaround for some GPUs */)
{
target = m_IntermediateTarget.Get();
- //target->AddRef(); // uncomment when workaround removed
+ target->AddRef();
}
else // dead code.
{
ID3D11RenderTargetView* rtv = nullptr;
g_Windowing.Get3D11Context()->OMGetRenderTargets(1, &rtv, nullptr);
- rtv->GetResource(&target);
- rtv->Release();
+ if (rtv)
+ {
+ rtv->GetResource(&target);
+ rtv->Release();
+ }
}
int past = 0;
@@ -964,7 +937,6 @@ void CWinRenderer::RenderProcessor(DWORD flags)
}
m_processor->Render(m_sourceRect, destRect, target, views, flags, image->frameIdx);
- //target->Release(); // uncomment when workaround removed
if (m_bUseHQScaler)
{
@@ -979,6 +951,7 @@ void CWinRenderer::RenderProcessor(DWORD flags)
CRect tu = { destRect.x1 / m_destWidth, destRect.y1 / m_destHeight, destRect.x2 / m_destWidth, destRect.y2 / m_destHeight };
CD3DTexture::DrawQuad(m_destRect, 0, &m_IntermediateTarget, &tu, SHADER_METHOD_RENDER_TEXTURE_NOBLEND);
}
+ SAFE_RELEASE(target);
}
bool CWinRenderer::RenderCapture(CRenderCapture* capture)
diff --git a/xbmc/cores/dvdplayer/DVDCodecs/DVDFactoryCodec.cpp b/xbmc/cores/dvdplayer/DVDCodecs/DVDFactoryCodec.cpp
index 84e9ef1700..33638951e9 100644
--- a/xbmc/cores/dvdplayer/DVDCodecs/DVDFactoryCodec.cpp
+++ b/xbmc/cores/dvdplayer/DVDCodecs/DVDFactoryCodec.cpp
@@ -270,6 +270,8 @@ CDVDVideoCodec* CDVDFactoryCodec::CreateVideoCodec(CDVDStreamInfo &hint, const C
case AV_CODEC_ID_MPEG4:
case AV_CODEC_ID_MSMPEG4V2:
case AV_CODEC_ID_MSMPEG4V3:
+ case AV_CODEC_ID_MPEG1VIDEO:
+ case AV_CODEC_ID_MPEG2VIDEO:
// Avoid h/w decoder for SD; Those files might use features
// not supported and can easily be soft-decoded
if (hint.width <= 800)
@@ -286,6 +288,8 @@ CDVDVideoCodec* CDVDFactoryCodec::CreateVideoCodec(CDVDStreamInfo &hint, const C
case AV_CODEC_ID_MPEG4:
case AV_CODEC_ID_MSMPEG4V2:
case AV_CODEC_ID_MSMPEG4V3:
+ case AV_CODEC_ID_MPEG1VIDEO:
+ case AV_CODEC_ID_MPEG2VIDEO:
// Avoid h/w decoder for SD; Those files might use features
// not supported and can easily be soft-decoded
if (hint.width <= 800)
@@ -328,6 +332,8 @@ CDVDVideoCodec* CDVDFactoryCodec::CreateVideoCodec(CDVDStreamInfo &hint, const C
case AV_CODEC_ID_MPEG4:
case AV_CODEC_ID_MSMPEG4V2:
case AV_CODEC_ID_MSMPEG4V3:
+ case AV_CODEC_ID_MPEG1VIDEO:
+ case AV_CODEC_ID_MPEG2VIDEO:
// Avoid h/w decoder for SD; Those files might use features
// not supported and can easily be soft-decoded
if (hint.width <= 800)
diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Overlay/contrib/cc_decoder708.cpp b/xbmc/cores/dvdplayer/DVDCodecs/Overlay/contrib/cc_decoder708.cpp
index 05dd9db01c..61a3acf099 100644
--- a/xbmc/cores/dvdplayer/DVDCodecs/Overlay/contrib/cc_decoder708.cpp
+++ b/xbmc/cores/dvdplayer/DVDCodecs/Overlay/contrib/cc_decoder708.cpp
@@ -990,6 +990,25 @@ void process_service_block (cc708_service_decoder *decoder, unsigned char *data,
}
}
+bool check_current_packet_complete (cc708_service_decoder *decoders)
+{
+ int len = decoders[0].parent->m_current_packet[0] & 0x3F; // 6 least significants bits
+ if (decoders[0].parent->m_current_packet_length == 0)
+ return false;
+
+ if (len==0) // This is well defined in EIA-708; no magic.
+ len=128;
+ else
+ len=len*2;
+
+ // Note that len here is the length including the header
+ if (decoders[0].parent->m_current_packet_length == len) // Is this possible?
+ {
+ return true;
+ }
+ return false;
+}
+
void process_current_packet (cc708_service_decoder *decoders)
{
int seq = (decoders[0].parent->m_current_packet[0] & 0xC0) >> 6; // Two most significants bits
@@ -1077,8 +1096,13 @@ void decode_708 (const unsigned char *data, int datalength, cc708_service_decode
decode_cc(decoders[0].parent->m_cc608decoder, (uint8_t*)data+i, 3);
break;
case 2:
- if (cc_valid==0) // This ends the previous packet
- process_current_packet(decoders);
+ if (cc_valid==0) // This ends the previous packet if complete
+ {
+ if (check_current_packet_complete(decoders))
+ {
+ process_current_packet(decoders);
+ }
+ }
else
{
if (decoders[0].parent->m_current_packet_length < 254)
diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/AMLCodec.cpp b/xbmc/cores/dvdplayer/DVDCodecs/Video/AMLCodec.cpp
index e843bd94db..6677ba4812 100644
--- a/xbmc/cores/dvdplayer/DVDCodecs/Video/AMLCodec.cpp
+++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/AMLCodec.cpp
@@ -41,6 +41,10 @@
#include "utils/BitstreamConverter.h"
#endif
+extern "C" {
+#include "libavutil/avutil.h"
+} // extern "C"
+
#include <unistd.h>
#include <queue>
#include <vector>
@@ -92,18 +96,11 @@ public:
virtual int codec_set_cntl_mode(codec_para_t *pcodec, unsigned int mode)=0;
virtual int codec_set_cntl_avthresh(codec_para_t *pcodec, unsigned int avthresh)=0;
virtual int codec_set_cntl_syncthresh(codec_para_t *pcodec, unsigned int syncthresh)=0;
-
- // grab these from libamplayer
- virtual int h263vld(unsigned char *inbuf, unsigned char *outbuf, int inbuf_len, int s263)=0;
- virtual int decodeble_h263(unsigned char *buf)=0;
-
- // grab this from amffmpeg so we do not have to load DllAvUtil
- virtual AVRational av_d2q(double d, int max)=0;
};
class DllLibAmCodec : public DllDynamic, DllLibamCodecInterface
{
- // libamcodec is static linked into libamplayer.so
+ // libamcodec is static linked into libamplayer.so or libamcodec.so
DECLARE_DLL_WRAPPER(DllLibAmCodec, "libamplayer.so")
DEFINE_METHOD1(int, codec_init, (codec_para_t *p1))
@@ -122,11 +119,6 @@ class DllLibAmCodec : public DllDynamic, DllLibamCodecInterface
DEFINE_METHOD2(int, codec_set_cntl_avthresh, (codec_para_t *p1, unsigned int p2))
DEFINE_METHOD2(int, codec_set_cntl_syncthresh,(codec_para_t *p1, unsigned int p2))
- DEFINE_METHOD4(int, h263vld, (unsigned char *p1, unsigned char *p2, int p3, int p4))
- DEFINE_METHOD1(int, decodeble_h263, (unsigned char *p1))
-
- DEFINE_METHOD2(AVRational, av_d2q, (double p1, int p2))
-
BEGIN_METHOD_RESOLVE()
RESOLVE_METHOD(codec_init)
RESOLVE_METHOD(codec_close)
@@ -143,11 +135,6 @@ class DllLibAmCodec : public DllDynamic, DllLibamCodecInterface
RESOLVE_METHOD(codec_set_cntl_mode)
RESOLVE_METHOD(codec_set_cntl_avthresh)
RESOLVE_METHOD(codec_set_cntl_syncthresh)
-
- RESOLVE_METHOD(h263vld)
- RESOLVE_METHOD(decodeble_h263)
-
- RESOLVE_METHOD(av_d2q)
END_METHOD_RESOLVE()
public:
@@ -335,8 +322,6 @@ typedef struct am_private_t
unsigned int video_ratio64;
unsigned int video_rate;
unsigned int video_rotation_degree;
- int flv_flag;
- int h263_decodable;
int extrasize;
uint8_t *extradata;
DllLibAmCodec *m_dll;
@@ -1250,47 +1235,6 @@ int set_header_info(am_private_t *para)
else if (para->video_codec_type == VIDEO_DEC_FORMAT_H263)
{
return PLAYER_UNSUPPORT;
- unsigned char *vld_buf;
- int vld_len, vld_buf_size = para->video_width * para->video_height * 2;
-
- if (!pkt->data_size) {
- return PLAYER_SUCCESS;
- }
-
- if ((pkt->data[0] == 0) && (pkt->data[1] == 0) && (pkt->data[2] == 1) && (pkt->data[3] == 0xb6)) {
- return PLAYER_SUCCESS;
- }
-
- vld_buf = (unsigned char*)malloc(vld_buf_size);
- if (!vld_buf) {
- return PLAYER_NOMEM;
- }
-
- if (para->flv_flag) {
- vld_len = para->m_dll->h263vld(pkt->data, vld_buf, pkt->data_size, 1);
- } else {
- if (0 == para->h263_decodable) {
- para->h263_decodable = para->m_dll->decodeble_h263(pkt->data);
- if (0 == para->h263_decodable) {
- CLog::Log(LOGDEBUG, "[%s]h263 unsupport video and audio, exit", __FUNCTION__);
- return PLAYER_UNSUPPORT;
- }
- }
- vld_len = para->m_dll->h263vld(pkt->data, vld_buf, pkt->data_size, 0);
- }
-
- if (vld_len > 0) {
- if (pkt->buf) {
- free(pkt->buf);
- }
- pkt->buf = vld_buf;
- pkt->buf_size = vld_buf_size;
- pkt->data = pkt->buf;
- pkt->data_size = vld_len;
- } else {
- free(vld_buf);
- pkt->data_size = 0;
- }
}
} else if (para->video_format == VFORMAT_VC1) {
if (para->video_codec_type == VIDEO_DEC_FORMAT_WMV3) {
@@ -1438,7 +1382,12 @@ CAMLCodec::CAMLCodec() : CThread("CAMLCodec")
am_private = new am_private_t;
memset(am_private, 0, sizeof(am_private_t));
m_dll = new DllLibAmCodec;
- m_dll->Load();
+ if(!m_dll->Load())
+ {
+ CLog::Log(LOGWARNING, "CAMLCodec::CAMLCodec libamplayer.so not found, trying libamcodec.so instead");
+ m_dll->SetFile("libamcodec.so");
+ m_dll->Load();
+ }
am_private->m_dll = m_dll;
}
@@ -1484,9 +1433,9 @@ bool CAMLCodec::OpenDecoder(CDVDStreamInfo &hints)
am_private->video_pid = hints.pid;
// handle video ratio
- AVRational video_ratio = m_dll->av_d2q(1, SHRT_MAX);
+ AVRational video_ratio = av_d2q(1, SHRT_MAX);
//if (!hints.forced_aspect)
- // video_ratio = m_dll->av_d2q(hints.aspect, SHRT_MAX);
+ // video_ratio = av_d2q(hints.aspect, SHRT_MAX);
am_private->video_ratio = ((int32_t)video_ratio.num << 16) | video_ratio.den;
am_private->video_ratio64 = ((int64_t)video_ratio.num << 32) | video_ratio.den;
@@ -1561,13 +1510,6 @@ bool CAMLCodec::OpenDecoder(CDVDStreamInfo &hints)
if (am_private->video_codec_type == VIDEO_DEC_FORMAT_UNKNOW)
am_private->video_codec_type = codec_tag_to_vdec_type(am_private->video_codec_id);
- am_private->flv_flag = 0;
- if (am_private->video_codec_id == AV_CODEC_ID_FLV1)
- {
- am_private->video_codec_tag = CODEC_TAG_F263;
- am_private->flv_flag = 1;
- }
-
CLog::Log(LOGDEBUG, "CAMLCodec::OpenDecoder "
"hints.width(%d), hints.height(%d), hints.codec(%d), hints.codec_tag(%d), hints.pid(%d)",
hints.width, hints.height, hints.codec, hints.codec_tag, hints.pid);
@@ -1834,7 +1776,8 @@ int CAMLCodec::Decode(uint8_t *pData, size_t iSize, double dts, double pts)
// loop until we write all into codec, am_pkt.isvalid
// will get set to zero once everything is consumed.
// PLAYER_SUCCESS means all is ok, not all bytes were written.
- while (am_private->am_pkt.isvalid)
+ int loop = 0;
+ while (am_private->am_pkt.isvalid && loop < 100)
{
// abort on any errors.
if (write_av_packet(am_private, &am_private->am_pkt) != PLAYER_SUCCESS)
@@ -1842,6 +1785,12 @@ int CAMLCodec::Decode(uint8_t *pData, size_t iSize, double dts, double pts)
if (am_private->am_pkt.isvalid)
CLog::Log(LOGDEBUG, "CAMLCodec::Decode: write_av_packet looping");
+ loop++;
+ }
+ if (loop == 100)
+ {
+ // Decoder got stuck; Reset
+ Reset();
}
// if we seek, then GetTimeSize is wrong as
diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecAmlogic.cpp b/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecAmlogic.cpp
index 44cf9633fe..8f2e516d44 100644
--- a/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecAmlogic.cpp
+++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecAmlogic.cpp
@@ -90,7 +90,7 @@ bool CDVDVideoCodecAmlogic::Open(CDVDStreamInfo &hints, CDVDCodecOptions &option
m_pFormatName = "am-mpeg2";
break;
case AV_CODEC_ID_H264:
- if ((aml_get_device_type() != AML_DEVICE_TYPE_M8 && aml_get_device_type() != AML_DEVICE_TYPE_M8M2) && ((m_hints.width > 1920) || (m_hints.height > 1088)))
+ if ((!aml_support_h264_4k2k()) && ((m_hints.width > 1920) || (m_hints.height > 1088)))
{
// 4K is supported only on Amlogic S802/S812 chip
return false;
@@ -144,8 +144,8 @@ bool CDVDVideoCodecAmlogic::Open(CDVDStreamInfo &hints, CDVDCodecOptions &option
m_pFormatName = "am-avs";
break;
case AV_CODEC_ID_HEVC:
- if ((aml_get_device_type() == AML_DEVICE_TYPE_M8B) || (aml_get_device_type() == AML_DEVICE_TYPE_M8M2)) {
- if ((aml_get_device_type() == AML_DEVICE_TYPE_M8B) && ((m_hints.width > 1920) || (m_hints.height > 1088)))
+ if (aml_support_hevc()) {
+ if (!aml_support_hevc_4k2k() && ((m_hints.width > 1920) || (m_hints.height > 1088)))
{
// 4K HEVC is supported only on Amlogic S812 chip
return false;
diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecAndroidMediaCodec.cpp b/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecAndroidMediaCodec.cpp
index 3ef826550a..4ae4039001 100644
--- a/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecAndroidMediaCodec.cpp
+++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecAndroidMediaCodec.cpp
@@ -309,9 +309,12 @@ void CDVDMediaCodecInfo::RenderUpdate(const CRect &SrcRect, const CRect &DestRec
{
CXBMCApp::get()->setVideoViewSurfaceRect(DestRect.x1, DestRect.y1, DestRect.x2, DestRect.y2);
cur_rect = DestRect;
+
+ // setVideoViewSurfaceRect is async, so skip rendering this frame
+ ReleaseOutputBuffer(false);
}
-
- ReleaseOutputBuffer(true);
+ else
+ ReleaseOutputBuffer(true);
}
@@ -472,6 +475,13 @@ bool CDVDVideoCodecAndroidMediaCodec::Open(CDVDStreamInfo &hints, CDVDCodecOptio
}
if (m_render_surface)
+ {
+ m_videosurface = CXBMCApp::get()->getVideoViewSurface();
+ if (!m_videosurface)
+ return false;
+ }
+
+ if (m_render_surface)
m_formatname += "(S)";
// CJNIMediaCodec::createDecoderByXXX doesn't handle errors nicely,
@@ -707,7 +717,7 @@ int CDVDVideoCodecAndroidMediaCodec::Decode(uint8_t *pData, int iSize, double dt
{
case AV_CODEC_ID_VC1:
{
- if (pData[0] == 0x00 && pData[1] == 0x00 && pData[2] == 0x01 && pData[3] == 0x0d)
+ if (iSize >= 4 && pData[0] == 0x00 && pData[1] == 0x00 && pData[2] == 0x01 && (pData[3] == 0x0d || pData[3] == 0x0f))
memcpy(dst_ptr, pData, iSize);
else
{
@@ -917,8 +927,6 @@ bool CDVDVideoCodecAndroidMediaCodec::ConfigureMediaCodec(void)
}
InitSurfaceTexture();
- if (m_render_surface)
- m_videosurface = CXBMCApp::get()->getVideoViewSurface();
// configure and start the codec.
// use the MediaFormat that we have setup.
diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/DXVA.cpp b/xbmc/cores/dvdplayer/DVDCodecs/Video/DXVA.cpp
index 85bca2ae7b..1fc5061ef8 100644
--- a/xbmc/cores/dvdplayer/DVDCodecs/Video/DXVA.cpp
+++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/DXVA.cpp
@@ -235,10 +235,10 @@ STDMETHODIMP_(ULONG) CDXVADecoderWrapper::AddRef(void)
STDMETHODIMP_(ULONG) CDXVADecoderWrapper::Release(void)
{
- AtomicDecrement(&m_refs);
- assert(m_refs >= 0);
- if (m_refs == 0) delete this;
- return m_refs;
+ long refs = AtomicDecrement(&m_refs);
+ assert(refs >= 0);
+ if (refs == 0) delete this;
+ return refs;
};
STDMETHODIMP CDXVADecoderWrapper::GetBuffer(UINT BufferType, void **ppBuffer, UINT *pBufferSize)
@@ -770,7 +770,7 @@ CDecoder::CDecoder()
CDecoder::~CDecoder()
{
- CLog::Log(LOGDEBUG, "%s - destructing decoder, %ld", __FUNCTION__, this);
+ CLog::Log(LOGDEBUG, "%s - destructing decoder, %p", __FUNCTION__, this);
g_Windowing.Unregister(this);
Close();
free(m_context->surface);
@@ -1167,7 +1167,7 @@ int CDecoder::GetBuffer(AVCodecContext *avctx, AVFrame *pic, int flags)
view = m_surface_context->GetFree(view != nullptr ? view : nullptr);
if (view == nullptr)
{
- CLog::Log(LOGERROR, "%s - no surface available - dec: %d, render: %d", __FUNCTION__);
+ CLog::Log(LOGERROR, "%s - no surface available", __FUNCTION__);
m_state = DXVA_LOST;
return -1;
}
diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/OpenMaxVideo.cpp b/xbmc/cores/dvdplayer/DVDCodecs/Video/OpenMaxVideo.cpp
index 87e90ba436..87d97afd8f 100644
--- a/xbmc/cores/dvdplayer/DVDCodecs/Video/OpenMaxVideo.cpp
+++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/OpenMaxVideo.cpp
@@ -751,10 +751,7 @@ OMX_ERRORTYPE COpenMaxVideo::AllocOMXOutputBuffers(void)
callbackData.callback = &CallbackAllocOMXEGLTextures;
callbackData.userptr = (void *)this;
- tMsg.dwMessage = TMSG_CALLBACK;
- tMsg.lpVoid = (void*)&callbackData;
-
- CApplicationMessenger::GetInstance().SendMsg(TMSG_CALLBACK, -1, -1 static_cast<void*>(&callbackData));
+ CApplicationMessenger::GetInstance().SendMsg(TMSG_CALLBACK, -1, -1, static_cast<void*>(&callbackData));
omx_err = OMX_ErrorNone;
}
@@ -1227,7 +1224,7 @@ void OpenMaxVideoBuffer::ReleaseTexture()
deleteInfo->callback.userptr = (void *)deleteInfo;
// HACK, this should be synchronous, but it's not possible since Stop blocks the GUI thread.
- CApplicationMessenger::GetInstance().PostMsg(TMSG_CALLBACK, -1, -1 static_cast<void*>(deleteInfo));
+ CApplicationMessenger::GetInstance().PostMsg(TMSG_CALLBACK, -1, -1, static_cast<void*>(deleteInfo));
}
}
diff --git a/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemux.h b/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemux.h
index 76f79321cf..e380056d5a 100644
--- a/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemux.h
+++ b/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemux.h
@@ -92,7 +92,6 @@ public:
disabled = false;
changes = 0;
flags = FLAG_NONE;
- orig_type = 0;
}
virtual ~CDemuxStream()
@@ -129,8 +128,6 @@ public:
int changes; // increment on change which player may need to know about
- int orig_type; // type of original source
-
enum EFlags
{ FLAG_NONE = 0x0000
, FLAG_DEFAULT = 0x0001
diff --git a/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp b/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp
index 88c45a3f1e..88d486befa 100644
--- a/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp
+++ b/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemuxFFmpeg.cpp
@@ -1291,9 +1291,6 @@ CDemuxStream* CDVDDemuxFFmpeg::AddStream(int iId)
}
}
- // set ffmpeg type
- stream->orig_type = pStream->codec->codec_type;
-
// generic stuff
if (pStream->duration != (int64_t)AV_NOPTS_VALUE)
stream->iDuration = (int)((pStream->duration / AV_TIME_BASE) & 0xFFFFFFFF);
@@ -1560,9 +1557,9 @@ bool CDVDDemuxFFmpeg::IsProgramChange()
{
int idx = m_pFormatContext->programs[m_program]->stream_index[i];
CDemuxStream *stream = GetStreamInternal(idx);
- if(!stream)
+ if (!stream)
return true;
- if(m_pFormatContext->streams[idx]->codec->codec_type != stream->orig_type)
+ if (m_pFormatContext->streams[idx]->codec->codec_id != stream->codec)
return true;
}
return false;
diff --git a/xbmc/cores/dvdplayer/DVDPlayer.cpp b/xbmc/cores/dvdplayer/DVDPlayer.cpp
index 2e7ad75c53..884a95d7b8 100644
--- a/xbmc/cores/dvdplayer/DVDPlayer.cpp
+++ b/xbmc/cores/dvdplayer/DVDPlayer.cpp
@@ -2128,8 +2128,7 @@ void CDVDPlayer::CheckContinuity(CCurrentStream& current, DemuxPacket* pPacket)
}
/* if it's large scale jump, correct for it after having confirmed the jump */
- if(pPacket->dts + DVD_MSEC_TO_TIME(100) < current.dts_end() &&
- current.lastdts + DVD_MSEC_TO_TIME(100) < current.dts_end())
+ if(pPacket->dts + DVD_MSEC_TO_TIME(100) < current.dts_end())
{
CLog::Log(LOGDEBUG, "CDVDPlayer::CheckContinuity - resync backward :%d, prev:%f, curr:%f, diff:%f"
, current.type, current.dts, pPacket->dts, pPacket->dts - current.dts);
diff --git a/xbmc/cores/dvdplayer/DVDTSCorrection.cpp b/xbmc/cores/dvdplayer/DVDTSCorrection.cpp
index a72c1e5fd8..43c052c051 100644
--- a/xbmc/cores/dvdplayer/DVDTSCorrection.cpp
+++ b/xbmc/cores/dvdplayer/DVDTSCorrection.cpp
@@ -38,6 +38,7 @@ void CPullupCorrection::ResetVFRDetection(void)
m_minframeduration = DVD_NOPTS_VALUE;
m_maxframeduration = DVD_NOPTS_VALUE;
m_VFRCounter = 0;
+ m_patternCounter = 0;
}
void CPullupCorrection::Flush()
@@ -89,6 +90,7 @@ void CPullupCorrection::Add(double pts)
if (m_haspattern)
{
m_VFRCounter++;
+ m_lastPattern = m_pattern;
CLog::Log(LOGDEBUG, "CPullupCorrection: pattern lost on diff %f, number of losses %i", GetDiff(0), m_VFRCounter);
Flush();
}
@@ -113,6 +115,11 @@ void CPullupCorrection::Add(double pts)
m_haspattern = true;
m_patternlength = m_pattern.size();
+ if (!CheckPattern(m_lastPattern))
+ {
+ m_patternCounter++;
+ }
+
double frameduration = CalcFrameDuration();
CLog::Log(LOGDEBUG, "CPullupCorrection: detected pattern of length %i: %s, frameduration: %f",
(int)pattern.size(), GetPatternStr().c_str(), frameduration);
diff --git a/xbmc/cores/dvdplayer/DVDTSCorrection.h b/xbmc/cores/dvdplayer/DVDTSCorrection.h
index 85a07e2f1f..7f6376dad0 100644
--- a/xbmc/cores/dvdplayer/DVDTSCorrection.h
+++ b/xbmc/cores/dvdplayer/DVDTSCorrection.h
@@ -25,6 +25,7 @@
#define DIFFRINGSIZE 120
#define VFR_DETECTION_THRESHOLD 3
+#define VFR_PATTERN_THRESHOLD 2
class CPullupCorrection
{
@@ -40,7 +41,7 @@ class CPullupCorrection
double GetMaxFrameDuration(void) { return m_maxframeduration; }
double GetMinFrameDuration(void) { return m_minframeduration; }
bool HasFullBuffer() { return m_ringfill == DIFFRINGSIZE; }
- bool VFRDetection(void) { return (m_VFRCounter >= VFR_DETECTION_THRESHOLD); }
+ bool VFRDetection(void) { return ((m_VFRCounter >= VFR_DETECTION_THRESHOLD) && (m_patternCounter >= VFR_PATTERN_THRESHOLD)); }
private:
double m_prevpts; //last pts added
@@ -63,15 +64,16 @@ class CPullupCorrection
double CalcFrameDuration(); //calculates the frame duration from m_pattern
- std::vector<double> m_pattern; //the last saved pattern
- int m_patternpos; //the position of the pattern in the ringbuffer, moves one to the past each time a pts is added
+ std::vector<double> m_pattern, m_lastPattern; //the last saved pattern
+ int m_patternpos; //the position of the pattern in the ringbuffer, moves one to the past each time a pts is added
double m_ptscorrection; //the correction needed for the last added pts
double m_trackingpts; //tracked pts for smoothing the timestamps
double m_frameduration; //frameduration exposed to dvdplayer, used for calculating the fps
double m_maxframeduration; //Max value detected for frame duration (for VFR files case)
double m_minframeduration; //Min value detected for frame duration (for VFR files case)
- bool m_haspattern; //for the log and detecting VFR files case
- int m_patternlength; //for the codec info
- int m_VFRCounter; //retry counter for VFR detection
- std::string GetPatternStr(); //also for the log
+ bool m_haspattern; //for the log and detecting VFR files case
+ int m_patternlength; //for the codec info
+ int m_VFRCounter; //retry counter for VFR detection
+ int m_patternCounter;
+ std::string GetPatternStr(); //also for the log
};
diff --git a/xbmc/cores/paplayer/PAPlayer.cpp b/xbmc/cores/paplayer/PAPlayer.cpp
index a18e56f26e..29af933ed3 100644
--- a/xbmc/cores/paplayer/PAPlayer.cpp
+++ b/xbmc/cores/paplayer/PAPlayer.cpp
@@ -455,7 +455,8 @@ bool PAPlayer::QueueNextFileEx(const CFileItem &file, bool fadeIn/* = true */, b
void PAPlayer::UpdateStreamInfoPlayNextAtFrame(StreamInfo *si, unsigned int crossFadingTime)
{
- if (si)
+ // if no crossfading or cue sheet, wait for eof
+ if (si && (crossFadingTime || si->m_endOffset))
{
int64_t streamTotalTime = si->m_decoder.TotalTime();
if (si->m_endOffset)
diff --git a/xbmc/dbwrappers/mysqldataset.cpp b/xbmc/dbwrappers/mysqldataset.cpp
index ec8eb0f60b..1dbc7d3ced 100644
--- a/xbmc/dbwrappers/mysqldataset.cpp
+++ b/xbmc/dbwrappers/mysqldataset.cpp
@@ -27,6 +27,7 @@
#include "system.h" // for GetLastError()
#include "network/WakeOnAccess.h"
#include "Util.h"
+#include "utils/StringUtils.h"
#ifdef HAS_MYSQL
#include "mysqldataset.h"
@@ -97,6 +98,7 @@ int MysqlDatabase::setErr(int err_code, const char * qry) {
snprintf(err, 256, "Undefined MySQL error: Code (%d)", err_code);
error = err;
}
+ error = "[" + db + "] " + error;
error += "\nQuery: ";
error += qry;
error += "\n";
@@ -107,6 +109,45 @@ const char *MysqlDatabase::getErrorMsg() {
return error.c_str();
}
+void MysqlDatabase::configure_connection() {
+ char sqlcmd[512];
+ int ret;
+
+ // MySQL 5.7.5+: See #8393
+ strcpy(sqlcmd, "SET SESSION sql_mode = (SELECT REPLACE(@@SESSION.sql_mode,'ONLY_FULL_GROUP_BY',''))");
+ if ((ret = mysql_real_query(conn, sqlcmd, strlen(sqlcmd))) != MYSQL_OK)
+ throw DbErrors("Can't disable sql_mode ONLY_FULL_GROUP_BY: '%s' (%d)", db.c_str(), ret);
+
+ // MySQL 5.7.6+: See #8393
+ strcpy(sqlcmd, "SELECT @@SESSION.optimizer_switch");
+ if ((ret = mysql_real_query(conn, sqlcmd, strlen(sqlcmd))) != MYSQL_OK)
+ throw DbErrors("Can't query optimizer_switch: '%s' (%d)", db.c_str(), ret);
+
+ MYSQL_RES* res = mysql_store_result(conn);
+ MYSQL_ROW row;
+
+ if (res)
+ {
+ if ((row = mysql_fetch_row(res)) != NULL)
+ {
+ std::string column = row[0];
+ std::vector<std::string> split = StringUtils::Split(column, ',');
+
+ for (std::vector<std::string>::iterator itIn = split.begin(); itIn != split.end(); ++itIn)
+ {
+ if (StringUtils::Trim(*itIn) == "derived_merge=on")
+ {
+ strcpy(sqlcmd, "SET SESSION optimizer_switch = 'derived_merge=off'");
+ if ((ret = mysql_real_query(conn, sqlcmd, strlen(sqlcmd))) != MYSQL_OK)
+ throw DbErrors("Can't set optimizer_switch = '%s': '%s' (%d)", StringUtils::Trim(*itIn).c_str(), db.c_str(), ret);
+ break;
+ }
+ }
+ }
+ mysql_free_result(res);
+ }
+}
+
int MysqlDatabase::connect(bool create_new) {
if (host.empty() || db.empty())
return DB_CONNECTION_NONE;
@@ -151,6 +192,8 @@ int MysqlDatabase::connect(bool create_new) {
db.c_str(), mysql_errno(conn), mysql_error(conn));
}
+ configure_connection();
+
// check existence
if (exists())
{
diff --git a/xbmc/dbwrappers/mysqldataset.h b/xbmc/dbwrappers/mysqldataset.h
index c73f0d99c1..7292776511 100644
--- a/xbmc/dbwrappers/mysqldataset.h
+++ b/xbmc/dbwrappers/mysqldataset.h
@@ -85,6 +85,7 @@ public:
bool in_transaction() {return _in_transaction;};
int query_with_reconnect(const char* query);
+ void configure_connection();
private:
diff --git a/xbmc/dbwrappers/sqlitedataset.cpp b/xbmc/dbwrappers/sqlitedataset.cpp
index c567f591bc..b0dc6d490a 100644
--- a/xbmc/dbwrappers/sqlitedataset.cpp
+++ b/xbmc/dbwrappers/sqlitedataset.cpp
@@ -192,6 +192,7 @@ int SqliteDatabase::setErr(int err_code, const char * qry){
break;
default : error = "Undefined SQLite error";
}
+ error = "[" + db + "] " + error;
error += "\nQuery: ";
error += qry;
error += "\n";
diff --git a/xbmc/dialogs/GUIDialogContextMenu.h b/xbmc/dialogs/GUIDialogContextMenu.h
index 88b34a51fc..2ce98af6ba 100644
--- a/xbmc/dialogs/GUIDialogContextMenu.h
+++ b/xbmc/dialogs/GUIDialogContextMenu.h
@@ -105,8 +105,9 @@ enum CONTEXT_BUTTON { CONTEXT_BUTTON_CANCELLED = 0,
CONTEXT_BUTTON_ADD,
CONTEXT_BUTTON_ACTIVATE,
CONTEXT_BUTTON_START_RECORD,
- CONTEXT_BUTTON_ADVANCED_RECORD,
+ CONTEXT_BUTTON_ADD_TIMER,
CONTEXT_BUTTON_STOP_RECORD,
+ CONTEXT_BUTTON_DELETE_TIMER,
CONTEXT_BUTTON_GROUP_MANAGER,
CONTEXT_BUTTON_CHANNEL_MANAGER,
CONTEXT_BUTTON_FILTER,
@@ -125,7 +126,6 @@ enum CONTEXT_BUTTON { CONTEXT_BUTTON_CANCELLED = 0,
CONTEXT_BUTTON_PLAY_AND_QUEUE,
CONTEXT_BUTTON_PLAY_ONLY_THIS,
CONTEXT_BUTTON_UPDATE_EPG,
- CONTEXT_BUTTON_RECORD_ITEM,
CONTEXT_BUTTON_TAGS_ADD_ITEMS,
CONTEXT_BUTTON_TAGS_REMOVE_ITEMS,
CONTEXT_BUTTON_SET_MOVIESET,
diff --git a/xbmc/dialogs/GUIDialogKeyboardGeneric.cpp b/xbmc/dialogs/GUIDialogKeyboardGeneric.cpp
index e49c83946a..8c943bda03 100644
--- a/xbmc/dialogs/GUIDialogKeyboardGeneric.cpp
+++ b/xbmc/dialogs/GUIDialogKeyboardGeneric.cpp
@@ -194,37 +194,32 @@ bool CGUIDialogKeyboardGeneric::OnAction(const CAction &action)
handled = false;
else
{
- handled = false;
- wchar_t unicode = action.GetUnicode();
- if (unicode)
+ std::wstring wch = L"";
+ wch.insert(wch.begin(), action.GetUnicode());
+ std::string ch;
+ g_charsetConverter.wToUTF8(wch, ch);
+ handled = CodingCharacter(ch);
+ if (!handled)
{
- std::wstring wch = L"";
- wch.insert(wch.begin(), unicode);
- std::string ch;
- g_charsetConverter.wToUTF8(wch, ch);
- handled = CodingCharacter(ch);
- if (!handled)
+ // send action to edit control
+ CGUIControl *edit = GetControl(CTL_EDIT);
+ if (edit)
+ handled = edit->OnAction(action);
+ if (!handled && action.GetID() >= KEY_VKEY && action.GetID() < KEY_ASCII)
{
- // send action to edit control
- CGUIControl *edit = GetControl(CTL_EDIT);
- if (edit)
- handled = edit->OnAction(action);
- if (!handled && action.GetID() >= KEY_VKEY && action.GetID() < KEY_ASCII)
+ BYTE b = action.GetID() & 0xFF;
+ if (b == XBMCVK_TAB)
{
- BYTE b = action.GetID() & 0xFF;
- if (b == XBMCVK_TAB)
+ // Toggle left/right key mode
+ m_isKeyboardNavigationMode = !m_isKeyboardNavigationMode;
+ if (m_isKeyboardNavigationMode)
{
- // Toggle left/right key mode
- m_isKeyboardNavigationMode = !m_isKeyboardNavigationMode;
- if (m_isKeyboardNavigationMode)
- {
- m_previouslyFocusedButton = GetFocusedControlID();
- SET_CONTROL_FOCUS(edit->GetID(), 0);
- }
- else
- SET_CONTROL_FOCUS(m_previouslyFocusedButton, 0);
- handled = true;
+ m_previouslyFocusedButton = GetFocusedControlID();
+ SET_CONTROL_FOCUS(edit->GetID(), 0);
}
+ else
+ SET_CONTROL_FOCUS(m_previouslyFocusedButton, 0);
+ handled = true;
}
}
}
@@ -717,9 +712,13 @@ bool CGUIDialogKeyboardGeneric::CodingCharacter(const std::string &ch)
switch (m_codingtable->GetType())
{
case IInputCodingTable::TYPE_CONVERT_STRING:
- m_hzcode += ch;
- SetEditText(m_codingtable->ConvertString(m_hzcode));
- return true;
+ if (!ch.empty() && ch[0] != 0)
+ {
+ m_hzcode += ch;
+ SetEditText(m_codingtable->ConvertString(m_hzcode));
+ return true;
+ }
+ break;
case IInputCodingTable::TYPE_WORD_LIST:
if (m_codingtable->GetCodeChars().find(ch) != std::string::npos)
diff --git a/xbmc/dialogs/GUIDialogMediaSource.cpp b/xbmc/dialogs/GUIDialogMediaSource.cpp
index 70aff453c6..2fc7fd37ef 100644
--- a/xbmc/dialogs/GUIDialogMediaSource.cpp
+++ b/xbmc/dialogs/GUIDialogMediaSource.cpp
@@ -23,6 +23,7 @@
#include "guilib/GUIKeyboardFactory.h"
#include "GUIDialogFileBrowser.h"
#include "video/windows/GUIWindowVideoBase.h"
+#include "music/windows/GUIWindowMusicBase.h"
#include "guilib/GUIWindowManager.h"
#include "input/Key.h"
#include "Util.h"
@@ -61,7 +62,7 @@ CGUIDialogMediaSource::CGUIDialogMediaSource(void)
, m_confirmed(false)
, m_bNameChanged(false)
{
- m_paths = new CFileItemList;
+ m_paths = new CFileItemList;
m_loadType = KEEP_IN_MEMORY;
}
@@ -78,43 +79,43 @@ bool CGUIDialogMediaSource::OnBack(int actionID)
bool CGUIDialogMediaSource::OnMessage(CGUIMessage& message)
{
- switch ( message.GetMessage() )
+ switch (message.GetMessage())
{
case GUI_MSG_CLICKED:
+ {
+ int iControl = message.GetSenderId();
+ int iAction = message.GetParam1();
+ if (iControl == CONTROL_PATH && (iAction == ACTION_SELECT_ITEM || iAction == ACTION_MOUSE_LEFT_CLICK))
+ OnPath(GetSelectedItem());
+ else if (iControl == CONTROL_PATH_BROWSE)
+ OnPathBrowse(GetSelectedItem());
+ else if (iControl == CONTROL_PATH_ADD)
+ OnPathAdd();
+ else if (iControl == CONTROL_PATH_REMOVE)
+ OnPathRemove(GetSelectedItem());
+ else if (iControl == CONTROL_NAME)
{
- int iControl = message.GetSenderId();
- int iAction = message.GetParam1();
- if (iControl == CONTROL_PATH && (iAction == ACTION_SELECT_ITEM || iAction == ACTION_MOUSE_LEFT_CLICK))
- OnPath(GetSelectedItem());
- else if (iControl == CONTROL_PATH_BROWSE)
- OnPathBrowse(GetSelectedItem());
- else if (iControl == CONTROL_PATH_ADD)
- OnPathAdd();
- else if (iControl == CONTROL_PATH_REMOVE)
- OnPathRemove(GetSelectedItem());
- else if (iControl == CONTROL_NAME)
- {
- OnEditChanged(iControl, m_name);
- UpdateButtons();
- }
- else if (iControl == CONTROL_OK)
- OnOK();
- else if (iControl == CONTROL_CANCEL)
- OnCancel();
- else
- break;
- return true;
- }
- break;
- case GUI_MSG_WINDOW_INIT:
- {
+ OnEditChanged(iControl, m_name);
UpdateButtons();
}
- break;
+ else if (iControl == CONTROL_OK)
+ OnOK();
+ else if (iControl == CONTROL_CANCEL)
+ OnCancel();
+ else
+ break;
+ return true;
+ }
+ break;
+ case GUI_MSG_WINDOW_INIT:
+ {
+ UpdateButtons();
+ }
+ break;
case GUI_MSG_SETFOCUS:
if (message.GetControlId() == CONTROL_PATH_BROWSE ||
- message.GetControlId() == CONTROL_PATH_ADD ||
- message.GetControlId() == CONTROL_PATH_REMOVE)
+ message.GetControlId() == CONTROL_PATH_ADD ||
+ message.GetControlId() == CONTROL_PATH_REMOVE)
{
HighlightItem(GetSelectedItem());
}
@@ -139,13 +140,13 @@ bool CGUIDialogMediaSource::ShowAndAddMediaSource(const std::string &type)
if (confirmed)
{ // yay, add this share
CMediaSource share;
- unsigned int i,j=2;
- bool bConfirmed=false;
+ unsigned int i, j = 2;
+ bool bConfirmed = false;
VECSOURCES* pShares = CMediaSourceSettings::GetInstance().GetSources(type);
std::string strName = dialog->m_name;
while (!bConfirmed)
{
- for (i=0;i<pShares->size();++i)
+ for (i = 0;i<pShares->size();++i)
{
if (StringUtils::EqualsNoCase((*pShares)[i].strName, strName))
break;
@@ -170,10 +171,10 @@ bool CGUIDialogMediaSource::ShowAndEditMediaSource(const std::string &type, cons
VECSOURCES* pShares = CMediaSourceSettings::GetInstance().GetSources(type);
if (pShares)
{
- for (unsigned int i=0;i<pShares->size();++i)
+ for (unsigned int i = 0;i<pShares->size();++i)
{
if (StringUtils::EqualsNoCase((*pShares)[i].strName, share))
- return ShowAndEditMediaSource(type,(*pShares)[i]);
+ return ShowAndEditMediaSource(type, (*pShares)[i]);
}
}
return false;
@@ -191,13 +192,13 @@ bool CGUIDialogMediaSource::ShowAndEditMediaSource(const std::string &type, cons
bool confirmed(dialog->IsConfirmed());
if (confirmed)
{ // yay, add this share
- unsigned int i,j=2;
- bool bConfirmed=false;
+ unsigned int i, j = 2;
+ bool bConfirmed = false;
VECSOURCES* pShares = CMediaSourceSettings::GetInstance().GetSources(type);
std::string strName = dialog->m_name;
while (!bConfirmed)
{
- for (i=0;i<pShares->size();++i)
+ for (i = 0;i<pShares->size();++i)
{
if (StringUtils::EqualsNoCase((*pShares)[i].strName, strName))
break;
@@ -226,7 +227,7 @@ void CGUIDialogMediaSource::OnPathBrowse(int item)
VECSOURCES extraShares;
if (m_name != CUtil::GetTitleFromPath(m_paths->Get(item)->GetPath()))
- m_bNameChanged=true;
+ m_bNameChanged = true;
std::string strStreams = g_localizeStrings.Get(33039); //"% Streams"
std::string strDevices = g_localizeStrings.Get(33040); //"% Devices"
@@ -262,7 +263,7 @@ void CGUIDialogMediaSource::OnPathBrowse(int item)
share1.strName = g_localizeStrings.Get(21883);
extraShares.push_back(share1);
}
- }
+ }
else if (m_type == "video")
{
CMediaSource share1;
@@ -308,7 +309,7 @@ void CGUIDialogMediaSource::OnPathBrowse(int item)
#if defined(TARGET_ANDROID)
// add the default android music directory
std::string path;
- if (CXBMCApp::GetExternalStorage(path, "pictures") && !path.empty() && CFile::Exists(path))
+ if (CXBMCApp::GetExternalStorage(path, "pictures") && !path.empty() && CFile::Exists(path))
{
share1.strPath = path;
share1.strName = g_localizeStrings.Get(20242);
@@ -317,7 +318,7 @@ void CGUIDialogMediaSource::OnPathBrowse(int item)
}
path.clear();
- if (CXBMCApp::GetExternalStorage(path, "photos") && !path.empty() && CFile::Exists(path))
+ if (CXBMCApp::GetExternalStorage(path, "photos") && !path.empty() && CFile::Exists(path))
{
share1.strPath = path;
share1.strName = g_localizeStrings.Get(20243);
@@ -338,7 +339,7 @@ void CGUIDialogMediaSource::OnPathBrowse(int item)
{
// nothing to add
}
- if (CGUIDialogFileBrowser::ShowAndGetSource(path, allowNetworkShares, extraShares.size()==0?NULL:&extraShares))
+ if (CGUIDialogFileBrowser::ShowAndGetSource(path, allowNetworkShares, extraShares.size() == 0 ? NULL : &extraShares))
{
if (item < m_paths->Size()) // if the skin does funky things, m_paths may have been cleared
m_paths->Get(item)->SetPath(path);
@@ -358,10 +359,10 @@ void CGUIDialogMediaSource::OnPath(int item)
if (item < 0 || item > m_paths->Size()) return;
if (m_name != CUtil::GetTitleFromPath(m_paths->Get(item)->GetPath()))
- m_bNameChanged=true;
+ m_bNameChanged = true;
std::string path(m_paths->Get(item)->GetPath());
- CGUIKeyboardFactory::ShowAndGetInput(path, CVariant{g_localizeStrings.Get(1021)}, false);
+ CGUIKeyboardFactory::ShowAndGetInput(path, CVariant{ g_localizeStrings.Get(1021) }, false);
m_paths->Get(item)->SetPath(path);
if (!m_bNameChanged || m_name.empty())
@@ -385,15 +386,17 @@ void CGUIDialogMediaSource::OnOK()
VECSOURCES *shares = CMediaSourceSettings::GetInstance().GetSources(m_type);
if (shares)
shares->push_back(share);
- if (StringUtils::StartsWithNoCase(share.strPath, "plugin://") || CDirectory::GetDirectory(share.strPath, items, "", DIR_FLAG_NO_FILE_DIRS | DIR_FLAG_ALLOW_PROMPT) || CGUIDialogYesNo::ShowAndGetInput(CVariant{1001}, CVariant{1025}))
+ if (StringUtils::StartsWithNoCase(share.strPath, "plugin://") || CDirectory::GetDirectory(share.strPath, items, "", DIR_FLAG_NO_FILE_DIRS | DIR_FLAG_ALLOW_PROMPT) || CGUIDialogYesNo::ShowAndGetInput(CVariant{ 1001 }, CVariant{ 1025 }))
{
m_confirmed = true;
Close();
- if (m_type == "video" && !URIUtils::IsLiveTV(share.strPath) &&
- !StringUtils::StartsWithNoCase(share.strPath, "rss://") &&
- !StringUtils::StartsWithNoCase(share.strPath, "upnp://"))
+ if (!StringUtils::StartsWithNoCase(share.strPath, "rss://") &&
+ !StringUtils::StartsWithNoCase(share.strPath, "upnp://"))
{
- CGUIWindowVideoBase::OnAssignContent(share.strPath);
+ if (m_type == "video" && !URIUtils::IsLiveTV(share.strPath))
+ CGUIWindowVideoBase::OnAssignContent(share.strPath);
+ else if (m_type == "music")
+ CGUIWindowMusicBase::OnAssignContent(share.strPath);
}
}
@@ -428,7 +431,7 @@ void CGUIDialogMediaSource::UpdateButtons()
std::string path;
CURL url(item->GetPath());
path = url.GetWithoutUserDetails();
- if (path.empty()) path = "<"+g_localizeStrings.Get(231)+">"; // <None>
+ if (path.empty()) path = "<" + g_localizeStrings.Get(231) + ">"; // <None>
item->SetLabel(path);
}
CGUIMessage msg(GUI_MSG_LABEL_BIND, GetID(), CONTROL_PATH, 0, 0, m_paths);
diff --git a/xbmc/dialogs/GUIDialogYesNo.cpp b/xbmc/dialogs/GUIDialogYesNo.cpp
index 04d5194c7f..779909c710 100644
--- a/xbmc/dialogs/GUIDialogYesNo.cpp
+++ b/xbmc/dialogs/GUIDialogYesNo.cpp
@@ -146,6 +146,7 @@ int CGUIDialogYesNo::ShowAndGetInput(const KODI::MESSAGING::HELPERS::DialogYesNo
SetChoice(1, options.yesLabel);
if (options.autoclose > 0)
SetAutoClose(options.autoclose);
+ m_bCanceled = false;
for (size_t i = 0; i < 3; ++i)
{
diff --git a/xbmc/epg/Epg.cpp b/xbmc/epg/Epg.cpp
index c4d781f0d4..d766b8f0e2 100644
--- a/xbmc/epg/Epg.cpp
+++ b/xbmc/epg/Epg.cpp
@@ -392,6 +392,8 @@ bool CEpg::UpdateEntries(const CEpg &epg, bool bStoreInDb /* = true */)
m_bUpdateLastScanTime = true;
SetChanged(true);
+ lock.Leave();
+
NotifyObservers(ObservableMessageEpg);
return true;
diff --git a/xbmc/epg/EpgContainer.cpp b/xbmc/epg/EpgContainer.cpp
index 4db9d06ed5..e50523dfa3 100644
--- a/xbmc/epg/EpgContainer.cpp
+++ b/xbmc/epg/EpgContainer.cpp
@@ -175,9 +175,6 @@ void CEpgContainer::Start(bool bAsync)
LoadFromDB();
- if (g_PVRManager.IsStarted())
- g_PVRManager.Recordings()->UpdateEpgTags();
-
CSingleLock lock(m_critSection);
if (!m_bStop)
{
@@ -618,8 +615,6 @@ bool CEpgContainer::UpdateEPG(bool bOnlyPending /* = false */)
m_updateEvent.Set();
}
- g_PVRManager.Recordings()->UpdateEpgTags();
-
if (bShowProgress && !bOnlyPending)
CloseProgressDialog();
@@ -675,6 +670,9 @@ bool CEpgContainer::UpdateEPG(bool bOnlyPending /* = false */)
}
else
{
+ if (g_PVRManager.IsStarted())
+ g_PVRManager.Recordings()->UpdateEpgTags();
+
CSingleLock lock(m_critSection);
CDateTime::GetCurrentDateTime().GetAsUTCDateTime().GetAsTime(m_iNextEpgUpdate);
m_iNextEpgUpdate += g_advancedSettings.m_iEpgUpdateCheckInterval;
diff --git a/xbmc/epg/GUIEPGGridContainer.cpp b/xbmc/epg/GUIEPGGridContainer.cpp
index 9416301423..51a3ea4e67 100644
--- a/xbmc/epg/GUIEPGGridContainer.cpp
+++ b/xbmc/epg/GUIEPGGridContainer.cpp
@@ -594,6 +594,7 @@ void CGUIEPGGridContainer::RenderProgressIndicator()
{
if (g_graphicsContext.SetClipRegion(m_rulerPosX, m_rulerPosY, m_gridWidth, m_height))
{
+ m_guiProgressIndicatorTexture.SetDiffuseColor(m_diffuseColor);
m_guiProgressIndicatorTexture.Render();
g_graphicsContext.RestoreClipRegion();
}
diff --git a/xbmc/events/EventLog.cpp b/xbmc/events/EventLog.cpp
index b7d25396ba..d0dff45b38 100644
--- a/xbmc/events/EventLog.cpp
+++ b/xbmc/events/EventLog.cpp
@@ -173,18 +173,10 @@ void CEventLog::AddWithNotification(const EventPtr& eventPtr, bool withSound)
void CEventLog::Remove(const EventPtr& eventPtr)
{
- if (eventPtr == nullptr || eventPtr->GetIdentifier().empty())
- return;
-
- CSingleLock lock(m_critical);
- const auto& itEvent = m_eventsMap.find(eventPtr->GetIdentifier());
- if (itEvent == m_eventsMap.end())
+ if (eventPtr == nullptr)
return;
- m_eventsMap.erase(itEvent);
- std::remove_if(m_events.begin(), m_events.end(), [eventPtr](const EventPtr& otherEvent) { return eventPtr == otherEvent; });
-
- SendMessage(eventPtr, GUI_MSG_EVENT_REMOVED);
+ Remove(eventPtr->GetIdentifier());
}
void CEventLog::Remove(const std::string& eventPtrIdentifier)
@@ -199,7 +191,7 @@ void CEventLog::Remove(const std::string& eventPtrIdentifier)
EventPtr eventPtr = itEvent->second;
m_eventsMap.erase(itEvent);
- std::remove_if(m_events.begin(), m_events.end(), [eventPtr](const EventPtr& otherEvent) { return eventPtr == otherEvent; });
+ m_events.erase(std::remove(m_events.begin(), m_events.end(), eventPtr), m_events.end());
SendMessage(eventPtr, GUI_MSG_EVENT_REMOVED);
}
diff --git a/xbmc/filesystem/AddonsDirectory.cpp b/xbmc/filesystem/AddonsDirectory.cpp
index e375b4e10e..e099d7997b 100644
--- a/xbmc/filesystem/AddonsDirectory.cpp
+++ b/xbmc/filesystem/AddonsDirectory.cpp
@@ -128,21 +128,16 @@ static bool IsOrphaned(const AddonPtr& addon, const VECADDONS& all)
static void SetUpdateAvailProperties(CFileItemList &items)
{
- CAddonDatabase database;
- database.Open();
+ std::set<std::string> outdated;
+ for (const auto& addon : CAddonMgr::GetInstance().GetOutdated())
+ outdated.insert(addon->ID());
+
for (int i = 0; i < items.Size(); ++i)
{
- const std::string addonId = items[i]->GetProperty("Addon.ID").asString();
- if (!CAddonMgr::GetInstance().IsAddonDisabled(addonId))
+ if (outdated.find(items[i]->GetProperty("Addon.ID").asString()) != outdated.end())
{
- const AddonVersion installedVersion = AddonVersion(items[i]->GetProperty("Addon.Version").asString());
- AddonPtr repoAddon;
- database.GetAddon(addonId, repoAddon);
- if (repoAddon && repoAddon->Version() > installedVersion)
- {
- items[i]->SetProperty("Addon.Status", g_localizeStrings.Get(24068));
- items[i]->SetProperty("Addon.UpdateAvail", true);
- }
+ items[i]->SetProperty("Addon.Status", g_localizeStrings.Get(24068));
+ items[i]->SetProperty("Addon.UpdateAvail", true);
}
}
}
diff --git a/xbmc/filesystem/AndroidAppDirectory.cpp b/xbmc/filesystem/AndroidAppDirectory.cpp
index 3317eb7c0e..69732bda57 100644
--- a/xbmc/filesystem/AndroidAppDirectory.cpp
+++ b/xbmc/filesystem/AndroidAppDirectory.cpp
@@ -69,6 +69,7 @@ bool CAndroidAppDirectory::GetDirectory(const CURL& url, CFileItemList &items)
pItem->SetPath(path);
pItem->SetLabel((*i).packageLabel);
pItem->SetArt("thumb", path+".png");
+ pItem->m_dwSize = -1; // No size
items.Add(pItem);
}
return true;
diff --git a/xbmc/filesystem/AndroidAppFile.cpp b/xbmc/filesystem/AndroidAppFile.cpp
index 439780db52..7df2026b84 100644
--- a/xbmc/filesystem/AndroidAppFile.cpp
+++ b/xbmc/filesystem/AndroidAppFile.cpp
@@ -23,13 +23,21 @@
#if defined(TARGET_ANDROID)
#include "AndroidAppFile.h"
+#include "android/activity/XBMCApp.h"
#include <sys/stat.h>
#include "Util.h"
#include "URL.h"
#include "utils/log.h"
#include "utils/URIUtils.h"
#include <jni.h>
-#include "android/activity/XBMCApp.h"
+#include <android/bitmap.h>
+#include "android/jni/Context.h"
+#include "android/jni/Build.h"
+#include "android/jni/DisplayMetrics.h"
+#include "android/jni/Resources.h"
+#include "android/jni/Bitmap.h"
+#include "android/jni/BitmapDrawable.h"
+#include "android/jni/PackageManager.h"
using namespace XFILE;
CFileAndroidApp::CFileAndroidApp(void)
@@ -46,14 +54,18 @@ CFileAndroidApp::~CFileAndroidApp(void)
bool CFileAndroidApp::Open(const CURL& url)
{
m_url = url;
- m_appname = URIUtils::GetFileName(url.Get());
- m_appname = m_appname.substr(0, m_appname.size() - 4);
+ m_packageName = URIUtils::GetFileName(url.Get());
+ m_packageName = m_packageName.substr(0, m_packageName.size() - 4);
std::vector<androidPackage> applications = CXBMCApp::GetApplications();
for(std::vector<androidPackage>::iterator i = applications.begin(); i != applications.end(); ++i)
{
- if ((*i).packageName == m_appname)
+ if ((*i).packageName == m_packageName)
+ {
+ m_packageLabel = i->packageLabel;
+ m_icon = i->icon;
return true;
+ }
}
return false;
@@ -74,31 +86,50 @@ bool CFileAndroidApp::Exists(const CURL& url)
return false;
}
-ssize_t CFileAndroidApp::Read(void* lpBuf, size_t uiBufSize)
+unsigned int CFileAndroidApp::ReadIcon(unsigned char** lpBuf, unsigned int* width, unsigned int* height)
{
- if(CXBMCApp::GetIcon(m_appname, lpBuf, uiBufSize))
- return uiBufSize; // FIXME: not full buffer may be used
- return -1;
-}
+ JNIEnv* env = xbmc_jnienv();
+ void *bitmapBuf = NULL;
-void CFileAndroidApp::Close()
-{
-}
+ CJNIBitmapDrawable bmp;
+ if (CJNIBuild::SDK_INT >= 15 && m_icon)
+ {
+ int density = CJNIDisplayMetrics::DENSITY_XHIGH;
+ if (CJNIBuild::SDK_INT >= 18)
+ density = CJNIDisplayMetrics::DENSITY_XXXHIGH;
+ else if (CJNIBuild::SDK_INT >= 16)
+ density = CJNIDisplayMetrics::DENSITY_XXHIGH;
+ CJNIResources res = CJNIContext::GetPackageManager().getResourcesForApplication(m_packageName);
+ if (res)
+ bmp = res.getDrawableForDensity(m_icon, density);
+ }
+ else
+ bmp = (CJNIBitmapDrawable)CJNIContext::GetPackageManager().getApplicationIcon(m_packageName);
-int64_t CFileAndroidApp::GetLength()
-{
- CXBMCApp::GetIconSize(m_appname, &m_iconWidth, &m_iconHeight);
- return m_iconWidth * m_iconHeight * 4;
-}
+ CJNIBitmap bitmap(bmp.getBitmap());
+ AndroidBitmapInfo info;
+ AndroidBitmap_getInfo(env, bitmap.get_raw(), &info);
+ if (!info.width || !info.height)
+ return 0;
-unsigned int CFileAndroidApp::GetIconWidth()
-{
- return m_iconWidth;
+ *width = info.width;
+ *height = info.height;
+
+ int imgsize = *width * *height * 4;
+ *lpBuf = new unsigned char[imgsize];
+
+ AndroidBitmap_lockPixels(env, bitmap.get_raw(), &bitmapBuf);
+ if (bitmapBuf)
+ {
+ memcpy(*lpBuf, bitmapBuf, imgsize);
+ AndroidBitmap_unlockPixels(env, bitmap.get_raw());
+ return imgsize;
+ }
+ return 0;
}
-unsigned int CFileAndroidApp::GetIconHeight()
+void CFileAndroidApp::Close()
{
- return m_iconHeight;
}
int CFileAndroidApp::GetChunkSize()
diff --git a/xbmc/filesystem/AndroidAppFile.h b/xbmc/filesystem/AndroidAppFile.h
index a7099fd7ad..25b6a5a600 100644
--- a/xbmc/filesystem/AndroidAppFile.h
+++ b/xbmc/filesystem/AndroidAppFile.h
@@ -24,6 +24,8 @@
#if defined(TARGET_ANDROID)
#include "IFile.h"
#include "URL.h"
+#include "string.h"
+
namespace XFILE
{
class CFileAndroidApp : public IFile
@@ -37,25 +39,24 @@ public:
virtual int Stat(const CURL& url, struct __stat64* buffer);
/*! \brief Return 32bit rgba raw bitmap. */
- virtual ssize_t Read(void* lpBuf, size_t uiBufSize);
+ virtual ssize_t Read(void* lpBuf, size_t uiBufSize) {return 0;}
virtual void Close();
- virtual int64_t GetLength();
- virtual int64_t Seek(int64_t, int) {return -1;};
- virtual int64_t GetPosition() {return 0;};
+ virtual int64_t GetLength() {return 0;}
+ virtual int64_t Seek(int64_t, int) {return -1;}
+ virtual int64_t GetPosition() {return 0;}
virtual int GetChunkSize();
virtual int IoControl(EIoControl request, void* param);
- /*! \brief Only valid after GetLength() has been called, usually by Open(). */
- unsigned int GetIconWidth();
- /*! \brief Only valid after GetLength() has been called, usually by Open(). */
- unsigned int GetIconHeight();
+ virtual unsigned int ReadIcon(unsigned char **lpBuf, unsigned int* width, unsigned int* height);
protected:
bool IsValidFile(const CURL& url);
private:
CURL m_url;
- std::string m_appname;
+ std::string m_packageName;
+ std::string m_packageLabel;
+ int m_icon;
int m_iconWidth;
int m_iconHeight;
};
diff --git a/xbmc/filesystem/DirectoryCache.cpp b/xbmc/filesystem/DirectoryCache.cpp
index a6dd061160..fe0fe898c9 100644
--- a/xbmc/filesystem/DirectoryCache.cpp
+++ b/xbmc/filesystem/DirectoryCache.cpp
@@ -28,6 +28,9 @@
#include <algorithm>
+// Maximum number of directories to keep in our cache
+#define MAX_CACHED_DIRS 50
+
using namespace XFILE;
CDirectoryCache::CDir::CDir(DIR_CACHE_TYPE cacheType)
@@ -232,7 +235,6 @@ void CDirectoryCache::ClearCache(std::set<std::string>& dirs)
void CDirectoryCache::CheckIfFull()
{
CSingleLock lock (m_cs);
- static const unsigned int max_cached_dirs = 10;
// find the last accessed folder, and remove if the number of cached folders is too many
iCache lastAccessed = m_cache.end();
@@ -247,7 +249,7 @@ void CDirectoryCache::CheckIfFull()
numCached++;
}
}
- if (lastAccessed != m_cache.end() && numCached >= max_cached_dirs)
+ if (lastAccessed != m_cache.end() && numCached >= MAX_CACHED_DIRS)
Delete(lastAccessed);
}
diff --git a/xbmc/filesystem/MusicDatabaseDirectory.cpp b/xbmc/filesystem/MusicDatabaseDirectory.cpp
index 4413e7a316..4eafeaabcf 100644
--- a/xbmc/filesystem/MusicDatabaseDirectory.cpp
+++ b/xbmc/filesystem/MusicDatabaseDirectory.cpp
@@ -45,6 +45,8 @@ bool CMusicDatabaseDirectory::GetDirectory(const CURL& url, CFileItemList &items
{
std::string path = CLegacyPathTranslation::TranslateMusicDbPath(url);
items.SetPath(path);
+ items.m_dwSize = -1; // No size
+
std::unique_ptr<CDirectoryNode> pNode(CDirectoryNode::ParseURL(path));
if (!pNode.get())
diff --git a/xbmc/filesystem/SMBFile.cpp b/xbmc/filesystem/SMBFile.cpp
index 5a9f910fdb..b4db511121 100644
--- a/xbmc/filesystem/SMBFile.cpp
+++ b/xbmc/filesystem/SMBFile.cpp
@@ -172,8 +172,8 @@ void CSMB::Init()
m_context->timeout = g_advancedSettings.m_sambaclienttimeout * 1000;
// we need to strdup these, they will get free'ed on smbc_free_context
if (CSettings::GetInstance().GetString(CSettings::SETTING_SMB_WORKGROUP).length() > 0)
- m_context->workgroup = strdup(CSettings::GetInstance().GetString(CSettings::SETTING_SMB_WORKGROUP).c_str()));
- m_context->user = strdup("guest"));
+ m_context->workgroup = strdup(CSettings::GetInstance().GetString(CSettings::SETTING_SMB_WORKGROUP).c_str());
+ m_context->user = strdup("guest");
#endif
// initialize samba and do some hacking into the settings
@@ -332,7 +332,7 @@ bool CSMBFile::Open(const CURL& url)
// if a file matches the if below return false, it can't exist on a samba share.
if (!IsValidFile(url.GetFileName()))
{
- CLog::Log(LOGNOTICE,"SMBFile->Open: Bad URL : '%s'",url.GetFileName().c_str());
+ CLog::Log(LOGNOTICE,"SMBFile->Open: Bad URL : '%s'",url.GetRedacted().c_str());
return false;
}
m_url = url;
@@ -344,7 +344,7 @@ bool CSMBFile::Open(const CURL& url)
std::string strFileName;
m_fd = OpenFile(url, strFileName);
- CLog::Log(LOGDEBUG,"CSMBFile::Open - opened %s, fd=%d",url.GetFileName().c_str(), m_fd);
+ CLog::Log(LOGDEBUG,"CSMBFile::Open - opened %s, fd=%d",url.GetRedacted().c_str(), m_fd);
if (m_fd == -1)
{
// write error to logfile
@@ -605,7 +605,7 @@ bool CSMBFile::OpenForWrite(const CURL& url, bool bOverWrite)
if (bOverWrite)
{
- CLog::Log(LOGWARNING, "SMBFile::OpenForWrite() called with overwriting enabled! - %s", strFileName.c_str());
+ CLog::Log(LOGWARNING, "SMBFile::OpenForWrite() called with overwriting enabled! - %s", CURL::GetRedacted(strFileName).c_str());
m_fd = smbc_creat(strFileName.c_str(), 0);
}
else
@@ -616,7 +616,7 @@ bool CSMBFile::OpenForWrite(const CURL& url, bool bOverWrite)
if (m_fd == -1)
{
// write error to logfile
- CLog::Log(LOGERROR, "SMBFile->Open: Unable to open file : '%s'\nunix_err:'%x' error : '%s'", strFileName.c_str(), errno, strerror(errno));
+ CLog::Log(LOGERROR, "SMBFile->Open: Unable to open file : '%s'\nunix_err:'%x' error : '%s'", CURL::GetRedacted(strFileName).c_str(), errno, strerror(errno));
return false;
}
diff --git a/xbmc/filesystem/VideoDatabaseDirectory.cpp b/xbmc/filesystem/VideoDatabaseDirectory.cpp
index ede4b24f74..96716fa7cb 100644
--- a/xbmc/filesystem/VideoDatabaseDirectory.cpp
+++ b/xbmc/filesystem/VideoDatabaseDirectory.cpp
@@ -46,6 +46,7 @@ bool CVideoDatabaseDirectory::GetDirectory(const CURL& url, CFileItemList &items
{
std::string path = CLegacyPathTranslation::TranslateVideoDbPath(url);
items.SetPath(path);
+ items.m_dwSize = -1; // No size
std::unique_ptr<CDirectoryNode> pNode(CDirectoryNode::ParseURL(path));
if (!pNode.get())
diff --git a/xbmc/filesystem/ZipFile.cpp b/xbmc/filesystem/ZipFile.cpp
index a9af977b89..a3a6900ed5 100644
--- a/xbmc/filesystem/ZipFile.cpp
+++ b/xbmc/filesystem/ZipFile.cpp
@@ -525,4 +525,49 @@ int CZipFile::UnpackFromMemory(std::string& strDest, const std::string& strInput
return iResult;
}
+bool CZipFile::DecompressGzip(const std::string& in, std::string& out)
+{
+ const int windowBits = MAX_WBITS + 16;
+
+ z_stream strm;
+ strm.zalloc = Z_NULL;
+ strm.zfree = Z_NULL;
+ strm.opaque = Z_NULL;
+
+ int err = inflateInit2(&strm, windowBits);
+ if (err != Z_OK)
+ {
+ CLog::Log(LOGERROR, "FileZip: zlib error %d", err);
+ return false;
+ }
+
+ const int bufferSize = 16384;
+ unsigned char buffer[bufferSize];
+
+ strm.avail_in = in.size();
+ strm.next_in = (unsigned char*)in.c_str();
+ do
+ {
+ strm.avail_out = bufferSize;
+ strm.next_out = buffer;
+ int err = inflate(&strm, Z_NO_FLUSH);
+ switch (err)
+ {
+ case Z_NEED_DICT:
+ err = Z_DATA_ERROR;
+ case Z_DATA_ERROR:
+ case Z_MEM_ERROR:
+ case Z_STREAM_ERROR:
+ CLog::Log(LOGERROR, "FileZip: failed to decompress. zlib error %d", err);
+ inflateEnd(&strm);
+ return false;
+ }
+ int read = bufferSize - strm.avail_out;
+ out.append((char*)buffer, read);
+ }
+ while (strm.avail_out == 0);
+
+ inflateEnd(&strm);
+ return true;
+}
diff --git a/xbmc/filesystem/ZipFile.h b/xbmc/filesystem/ZipFile.h
index 8b5505214e..3486d7a922 100644
--- a/xbmc/filesystem/ZipFile.h
+++ b/xbmc/filesystem/ZipFile.h
@@ -44,7 +44,12 @@ namespace XFILE
virtual int64_t Seek(int64_t iFilePosition, int iWhence = SEEK_SET);
virtual void Close();
+ //NOTE: gzip doesn't work. use DecompressGzip() instead
int UnpackFromMemory(std::string& strDest, const std::string& strInput, bool isGZ=false);
+
+ /*! Decompress gzip encoded buffer in-memory */
+ static bool DecompressGzip(const std::string& in, std::string& out);
+
private:
bool InitDecompress();
bool FillBuffer();
diff --git a/xbmc/guilib/GUIAction.cpp b/xbmc/guilib/GUIAction.cpp
index 4d1cb20020..2dbe300cea 100644
--- a/xbmc/guilib/GUIAction.cpp
+++ b/xbmc/guilib/GUIAction.cpp
@@ -58,7 +58,7 @@ bool CGUIAction::ExecuteActions(int controlID, int parentID, const CGUIListItemP
g_windowManager.SendThreadMessage(msg);
else
g_windowManager.SendMessage(msg);
- retval |= true;
+ retval = true;
}
return retval;
}
diff --git a/xbmc/guilib/GUIControlFactory.cpp b/xbmc/guilib/GUIControlFactory.cpp
index 01b077325e..28e9fc58e4 100644
--- a/xbmc/guilib/GUIControlFactory.cpp
+++ b/xbmc/guilib/GUIControlFactory.cpp
@@ -100,7 +100,6 @@ static const ControlMapping controls[] =
{"resize", CGUIControl::GUICONTROL_RESIZE},
{"edit", CGUIControl::GUICONTROL_EDIT},
{"visualisation", CGUIControl::GUICONTROL_VISUALISATION},
- {"karvisualisation", CGUIControl::GUICONTROL_VISUALISATION},
{"renderaddon", CGUIControl::GUICONTROL_RENDERADDON},
{"multiimage", CGUIControl::GUICONTROL_MULTI_IMAGE},
{"grouplist", CGUIControl::GUICONTROL_GROUPLIST},
diff --git a/xbmc/guilib/GUIEditControl.cpp b/xbmc/guilib/GUIEditControl.cpp
index b45bff038a..7e86b4ce2e 100644
--- a/xbmc/guilib/GUIEditControl.cpp
+++ b/xbmc/guilib/GUIEditControl.cpp
@@ -652,7 +652,6 @@ void CGUIEditControl::SetCursorPosition(unsigned int iPosition)
void CGUIEditControl::OnSMSCharacter(unsigned int key)
{
assert(key < 10);
- bool sendUpdate = false;
if (m_smsTimer.IsRunning())
{
// we're already entering an SMS character
@@ -660,7 +659,6 @@ void CGUIEditControl::OnSMSCharacter(unsigned int key)
{ // a different key was clicked than last time, or we have timed out
m_smsLastKey = key;
m_smsKeyIndex = 0;
- sendUpdate = true;
}
else
{ // same key as last time within the appropriate time period
@@ -678,7 +676,7 @@ void CGUIEditControl::OnSMSCharacter(unsigned int key)
m_smsKeyIndex = m_smsKeyIndex % strlen(smsLetters[key]);
m_text2.insert(m_text2.begin() + m_cursorPos++, smsLetters[key][m_smsKeyIndex]);
- UpdateText(sendUpdate);
+ UpdateText();
m_smsTimer.StartZero();
}
diff --git a/xbmc/guilib/GUIFont.h b/xbmc/guilib/GUIFont.h
index bac08f20f9..38846ac328 100644
--- a/xbmc/guilib/GUIFont.h
+++ b/xbmc/guilib/GUIFont.h
@@ -78,6 +78,8 @@ public:
// privates:
m_averageFrameTime = 1000.f / fabs((float)defaultSpeed);
m_lastFrameTime = 0;
+ m_textWidth = 0;
+ m_totalWidth = 0;
m_widthValid = false;
}
float GetPixelsPerFrame();
diff --git a/xbmc/guilib/GUIFontTTF.cpp b/xbmc/guilib/GUIFontTTF.cpp
index 2ce749dd96..4293b81f6f 100644
--- a/xbmc/guilib/GUIFontTTF.cpp
+++ b/xbmc/guilib/GUIFontTTF.cpp
@@ -458,7 +458,7 @@ void CGUIFontTTFBase::DrawTextInternal(float x, float y, const vecColors &colors
characters.push(*ch);
if (maxPixelWidth > 0 &&
- cursorX + (alignment & XBFONT_TRUNCATED ? ch->advance + 3 * m_ellipsesWidth : 0) > maxPixelWidth)
+ cursorX + ((alignment & XBFONT_TRUNCATED) ? ch->advance + 3 * m_ellipsesWidth : 0) > maxPixelWidth)
break;
cursorX += ch->advance;
}
diff --git a/xbmc/guilib/GUIToggleButtonControl.cpp b/xbmc/guilib/GUIToggleButtonControl.cpp
index 976f4842b1..dac7596eed 100644
--- a/xbmc/guilib/GUIToggleButtonControl.cpp
+++ b/xbmc/guilib/GUIToggleButtonControl.cpp
@@ -38,14 +38,8 @@ CGUIToggleButtonControl::~CGUIToggleButtonControl(void)
void CGUIToggleButtonControl::Process(unsigned int currentTime, CDirtyRegionList &dirtyregions)
{
// ask our infoManager whether we are selected or not...
- bool selected = m_bSelected;
if (m_toggleSelect)
- selected = m_toggleSelect->Get();
- if (selected != m_bSelected)
- {
- MarkDirtyRegion();
- m_bSelected = selected;
- }
+ m_bSelected = m_toggleSelect->Get();
if (m_bSelected)
{
@@ -54,9 +48,25 @@ void CGUIToggleButtonControl::Process(unsigned int currentTime, CDirtyRegionList
m_selectButton.SetVisible(IsVisible());
m_selectButton.SetEnabled(!IsDisabled());
m_selectButton.SetPulseOnSelect(m_pulseOnSelect);
+ ProcessToggle(currentTime);
m_selectButton.DoProcess(currentTime, dirtyregions);
}
- CGUIButtonControl::Process(currentTime, dirtyregions);
+ else
+ CGUIButtonControl::Process(currentTime, dirtyregions);
+}
+
+void CGUIToggleButtonControl::ProcessToggle(unsigned int currentTime)
+{
+ bool changed = false;
+
+ changed |= m_label.SetMaxRect(m_posX, m_posY, GetWidth(), m_height);
+ changed |= m_label.SetText(GetDescription());
+ changed |= m_label.SetColor(GetTextColor());
+ changed |= m_label.SetScrolling(HasFocus());
+ changed |= m_label.Process(currentTime);
+
+ if (changed)
+ MarkDirtyRegion();
}
void CGUIToggleButtonControl::Render()
@@ -139,10 +149,10 @@ bool CGUIToggleButtonControl::UpdateColors()
return changed;
}
-void CGUIToggleButtonControl::SetLabel(const std::string &strLabel)
+void CGUIToggleButtonControl::SetLabel(const std::string &label)
{
- CGUIButtonControl::SetLabel(strLabel);
- m_selectButton.SetLabel(strLabel);
+ CGUIButtonControl::SetLabel(label);
+ m_selectButton.SetLabel(label);
}
void CGUIToggleButtonControl::SetAltLabel(const std::string &label)
diff --git a/xbmc/guilib/GUIToggleButtonControl.h b/xbmc/guilib/GUIToggleButtonControl.h
index a8248f0a13..e2d0d696b4 100644
--- a/xbmc/guilib/GUIToggleButtonControl.h
+++ b/xbmc/guilib/GUIToggleButtonControl.h
@@ -52,7 +52,7 @@ public:
virtual void SetWidth(float width);
virtual void SetHeight(float height);
virtual void SetMinWidth(float minWidth);
- void SetLabel(const std::string& strLabel);
+ virtual void SetLabel(const std::string& label);
void SetAltLabel(const std::string& label);
virtual std::string GetDescription() const;
void SetToggleSelect(const std::string &toggleSelect);
@@ -63,5 +63,9 @@ protected:
virtual void OnClick();
CGUIButtonControl m_selectButton;
INFO::InfoPtr m_toggleSelect;
+
+private:
+ void ProcessToggle(unsigned int currentTime);
+ std::string m_altLabel;
};
#endif
diff --git a/xbmc/guilib/GUIWindowManager.cpp b/xbmc/guilib/GUIWindowManager.cpp
index b420084900..455feac391 100644
--- a/xbmc/guilib/GUIWindowManager.cpp
+++ b/xbmc/guilib/GUIWindowManager.cpp
@@ -139,11 +139,6 @@
#include "settings/dialogs/GUIDialogAudioDSPManager.h"
#include "settings/dialogs/GUIDialogAudioDSPSettings.h"
-#ifdef HAS_KARAOKE
-#include "music/karaoke/GUIDialogKaraokeSongSelector.h"
-#include "music/karaoke/GUIWindowKaraokeLyrics.h"
-#endif
-
#include "peripherals/dialogs/GUIDialogPeripheralSettings.h"
#include "addons/AddonCallbacksGUI.h"
@@ -212,10 +207,6 @@ void CGUIWindowManager::CreateWindows()
Add(new CGUIDialogButtonMenu);
Add(new CGUIDialogMuteBug);
Add(new CGUIDialogPlayerControls);
-#ifdef HAS_KARAOKE
- Add(new CGUIDialogKaraokeSongSelectorSmall);
- Add(new CGUIDialogKaraokeSongSelectorLarge);
-#endif
Add(new CGUIDialogSlider);
Add(new CGUIDialogMusicOSD);
Add(new CGUIDialogVisualisationPresetList);
@@ -286,9 +277,6 @@ void CGUIWindowManager::CreateWindows()
Add(new CGUIWindowFullScreen);
Add(new CGUIWindowVisualisation);
Add(new CGUIWindowSlideShow);
-#ifdef HAS_KARAOKE
- Add(new CGUIWindowKaraokeLyrics);
-#endif
Add(new CGUIDialogVideoOSD);
Add(new CGUIWindowScreensaver);
@@ -322,8 +310,6 @@ bool CGUIWindowManager::DestroyWindows()
Delete(WINDOW_DIALOG_BUTTON_MENU);
Delete(WINDOW_DIALOG_CONTEXT_MENU);
Delete(WINDOW_DIALOG_PLAYER_CONTROLS);
- Delete(WINDOW_DIALOG_KARAOKE_SONGSELECT);
- Delete(WINDOW_DIALOG_KARAOKE_SELECTOR);
Delete(WINDOW_DIALOG_MUSIC_OSD);
Delete(WINDOW_DIALOG_VIS_PRESET_LIST);
Delete(WINDOW_DIALOG_SELECT);
@@ -383,7 +369,6 @@ bool CGUIWindowManager::DestroyWindows()
Delete(WINDOW_STARTUP_ANIM);
Delete(WINDOW_LOGIN_SCREEN);
Delete(WINDOW_VISUALISATION);
- Delete(WINDOW_KARAOKELYRICS);
Delete(WINDOW_SETTINGS_MENU);
Delete(WINDOW_SETTINGS_PROFILES);
Delete(WINDOW_SETTINGS_MYPICTURES); // all the settings categories
@@ -860,7 +845,7 @@ void CGUIWindowManager::OnApplicationMessage(ThreadMessage* pMsg)
{
CGUIWindow *window = static_cast<CGUIWindow *>(pMsg->lpVoid);
if (window)
- window->Close(pMsg->param1 & 0x1 ? true : false, pMsg->param1, pMsg->param1 & 0x2 ? true : false);
+ window->Close((pMsg->param1 & 0x1) ? true : false, pMsg->param1, (pMsg->param1 & 0x2) ? true : false);
}
break;
diff --git a/xbmc/guilib/Gif.cpp b/xbmc/guilib/Gif.cpp
index 6d81b824b9..02f0c6e7bc 100644
--- a/xbmc/guilib/Gif.cpp
+++ b/xbmc/guilib/Gif.cpp
@@ -363,11 +363,12 @@ bool Gif::ExtractFrames(unsigned int count)
frame->m_left = imageDesc.Left;
if (frame->m_top + frame->m_height > m_height || frame->m_left + frame->m_width > m_width
- || !frame->m_width || !frame->m_height)
+ || !frame->m_width || !frame->m_height
+ || frame->m_width > m_width || frame->m_height > m_height)
{
CLog::Log(LOGDEBUG, "Gif::ExtractFrames(): Illegal frame dimensions: width: %d, height: %d, left: %d, top: %d instead of (%d,%d)",
frame->m_width, frame->m_height, frame->m_left, frame->m_top, m_width, m_height);
- return false;
+ continue;
}
if (imageDesc.ColorMap)
@@ -534,27 +535,36 @@ bool Gif::LoadImageFromMemory(unsigned char* buffer, unsigned int bufSize, unsig
return true;
}
-bool Gif::Decode(unsigned char* const pixels, unsigned int pitch, unsigned int format)
+bool Gif::Decode(unsigned char* const pixels, unsigned int width, unsigned int height, unsigned int pitch, unsigned int format)
{
if (m_width == 0 || m_height == 0
|| !m_dll.IsLoaded() || !m_gif
|| format != XB_FMT_A8R8G8B8 || !m_numFrames)
return false;
+ if (m_frames.empty() || !m_frames[0]->m_pImage)
+ return false;
+
const unsigned char *src = m_frames[0]->m_pImage;
unsigned char* dst = pixels;
- if (pitch == m_pitch)
+ unsigned int copyHeight = std::min(m_height, height);
+ unsigned int copyPitch = std::min(m_pitch, pitch);
+
+ if (pitch == m_pitch && copyHeight == m_height)
+ {
memcpy(dst, src, m_imageSize);
+ }
else
{
- for (unsigned int y = 0; y < m_height; y++)
+ for (unsigned int y = 0; y < copyHeight; y++)
{
- memcpy(dst, src, m_pitch);
+ memcpy(dst, src, copyPitch);
src += m_pitch;
dst += pitch;
}
}
+
return true;
}
diff --git a/xbmc/guilib/Gif.h b/xbmc/guilib/Gif.h
index b9741503f3..d144504c0f 100644
--- a/xbmc/guilib/Gif.h
+++ b/xbmc/guilib/Gif.h
@@ -74,7 +74,7 @@ public:
bool LoadGif(const char* file);
virtual bool LoadImageFromMemory(unsigned char* buffer, unsigned int bufSize, unsigned int width, unsigned int height);
- virtual bool Decode(unsigned char* const pixels, unsigned int pitch, unsigned int format);
+ virtual bool Decode(unsigned char* const pixels, unsigned int width, unsigned int height, unsigned int pitch, unsigned int format);
virtual bool CreateThumbnailFromSurface(unsigned char* bufferin, unsigned int width, unsigned int height, unsigned int format, unsigned int pitch, const std::string& destFile,
unsigned char* &bufferout, unsigned int &bufferoutSize);
bool IsAnimated(const char* file);
diff --git a/xbmc/guilib/GraphicContext.h b/xbmc/guilib/GraphicContext.h
index bafd60a0a5..c04386e1f0 100644
--- a/xbmc/guilib/GraphicContext.h
+++ b/xbmc/guilib/GraphicContext.h
@@ -296,6 +296,6 @@ private:
\brief
*/
-XBMC_GLOBAL(CGraphicContext,g_graphicsContext);
-
+XBMC_GLOBAL_REF(CGraphicContext,g_graphicsContext);
+#define g_graphicsContext XBMC_GLOBAL_USE(CGraphicContext)
#endif
diff --git a/xbmc/guilib/JpegIO.cpp b/xbmc/guilib/JpegIO.cpp
index 074f20aa06..8ea5286d70 100644
--- a/xbmc/guilib/JpegIO.cpp
+++ b/xbmc/guilib/JpegIO.cpp
@@ -340,9 +340,11 @@ bool CJpegIO::Read(unsigned char* buffer, unsigned int bufSize, unsigned int min
}
}
-bool CJpegIO::Decode(unsigned char* const pixels, unsigned int pitch, unsigned int format)
+bool CJpegIO::Decode(unsigned char* const pixels, unsigned int width, unsigned int height, unsigned int pitch, unsigned int format)
{
unsigned char *dst = (unsigned char*)pixels;
+ unsigned int copyWidth = std::min(m_width, width);
+ unsigned int copyHeight = std::min(m_height, height);
struct my_error_mgr jerr;
m_cinfo.err = jpeg_std_error(&jerr.pub);
@@ -359,7 +361,7 @@ bool CJpegIO::Decode(unsigned char* const pixels, unsigned int pitch, unsigned i
if (format == XB_FMT_RGB8)
{
- while (m_cinfo.output_scanline < m_height)
+ while (m_cinfo.output_scanline < copyHeight)
{
jpeg_read_scanlines(&m_cinfo, &dst, 1);
dst += pitch;
@@ -368,12 +370,12 @@ bool CJpegIO::Decode(unsigned char* const pixels, unsigned int pitch, unsigned i
else if (format == XB_FMT_A8R8G8B8)
{
unsigned char* row = new unsigned char[m_width * 3];
- while (m_cinfo.output_scanline < m_height)
+ while (m_cinfo.output_scanline < copyHeight)
{
jpeg_read_scanlines(&m_cinfo, &row, 1);
unsigned char *src2 = row;
unsigned char *dst2 = dst;
- for (unsigned int x = 0; x < m_width; x++, src2 += 3)
+ for (unsigned int x = 0; x < copyWidth; x++, src2 += 3)
{
*dst2++ = src2[2];
*dst2++ = src2[1];
@@ -416,7 +418,7 @@ bool CJpegIO::CreateThumbnailFromMemory(unsigned char* buffer, unsigned int bufS
pitch = Width() * 3;
sourceBuf = new unsigned char [Height() * pitch];
- if (!Decode(sourceBuf,pitch,XB_FMT_RGB8))
+ if (!Decode(sourceBuf, Width(), Height(),pitch,XB_FMT_RGB8))
{
delete [] sourceBuf;
return false;
diff --git a/xbmc/guilib/JpegIO.h b/xbmc/guilib/JpegIO.h
index a58c7dbb0c..f15454745a 100644
--- a/xbmc/guilib/JpegIO.h
+++ b/xbmc/guilib/JpegIO.h
@@ -42,7 +42,7 @@ public:
static bool CreateThumbnailFromSurface(unsigned char* buffer, unsigned int width, unsigned int height, unsigned int format, unsigned int pitch, const std::string& destFile);
void Close();
// methods for the imagefactory
- virtual bool Decode(unsigned char* const pixels, unsigned int pitch, unsigned int format);
+ virtual bool Decode(unsigned char* const pixels, unsigned int width, unsigned int height, unsigned int pitch, unsigned int format);
virtual bool LoadImageFromMemory(unsigned char* buffer, unsigned int bufSize, unsigned int width, unsigned int height);
virtual bool CreateThumbnailFromSurface(unsigned char* bufferin, unsigned int width, unsigned int height, unsigned int format, unsigned int pitch, const std::string& destFile,
unsigned char* &bufferout, unsigned int &bufferoutSize);
diff --git a/xbmc/guilib/Texture.cpp b/xbmc/guilib/Texture.cpp
index 5cca9a0a9f..7d8ce02291 100644
--- a/xbmc/guilib/Texture.cpp
+++ b/xbmc/guilib/Texture.cpp
@@ -184,18 +184,15 @@ CBaseTexture *CBaseTexture::LoadFromFile(const std::string& texturePath, unsigne
XFILE::CFileAndroidApp file;
if (file.Open(url))
{
- unsigned int imgsize = (unsigned int)file.GetLength();
- unsigned char* inputBuff = new unsigned char[imgsize];
- unsigned int inputBuffSize = file.Read(inputBuff, imgsize);
+ unsigned char* inputBuff;
+ unsigned int width;
+ unsigned int height;
+ unsigned int inputBuffSize = file.ReadIcon(&inputBuff, &width, &height);
file.Close();
- if (inputBuffSize != imgsize)
- {
- delete [] inputBuff;
+ if (!inputBuffSize)
return NULL;
- }
+
CTexture *texture = new CTexture();
- unsigned int width = file.GetIconWidth();
- unsigned int height = file.GetIconHeight();
texture->LoadFromMemory(width, height, width*4, XB_FMT_RGBA8, true, inputBuff);
delete [] inputBuff;
return texture;
@@ -314,7 +311,7 @@ bool CBaseTexture::LoadIImage(IImage *pImage, unsigned char* buffer, unsigned in
if (pImage->Width() > 0 && pImage->Height() > 0)
{
Allocate(pImage->Width(), pImage->Height(), XB_FMT_A8R8G8B8);
- if (pImage->Decode(m_pixels, GetPitch(), XB_FMT_A8R8G8B8))
+ if (pImage->Decode(m_pixels, GetTextureWidth(), GetRows(), GetPitch(), XB_FMT_A8R8G8B8))
{
if (pImage->Orientation())
m_orientation = pImage->Orientation() - 1;
diff --git a/xbmc/guilib/TextureManager.cpp b/xbmc/guilib/TextureManager.cpp
index a89b086b3b..d172d88481 100644
--- a/xbmc/guilib/TextureManager.cpp
+++ b/xbmc/guilib/TextureManager.cpp
@@ -199,6 +199,16 @@ void CTextureMap::FreeTexture()
m_texture.Free();
}
+void CTextureMap::SetHeight(int height)
+{
+ m_texture.m_height = (int) height;
+}
+
+void CTextureMap::SetWidth(int height)
+{
+ m_texture.m_width = height;
+}
+
bool CTextureMap::IsEmpty() const
{
return m_texture.m_textures.size() == 0;
@@ -343,12 +353,19 @@ const CTextureArray& CGUITextureManager::Load(const std::string& strTextureName,
return emptyTexture;
}
+ unsigned int maxWidth = 0;
+ unsigned int maxHeight = 0;
pMap = new CTextureMap(strTextureName, width, height, nLoops);
for (int iImage = 0; iImage < nImages; ++iImage)
{
pMap->Add(pTextures[iImage], Delay[iImage]);
+ maxWidth = std::max(maxWidth, pTextures[iImage]->GetWidth());
+ maxHeight = std::max(maxHeight, pTextures[iImage]->GetHeight());
}
+ pMap->SetWidth((int)maxWidth);
+ pMap->SetHeight((int)maxHeight);
+
delete [] pTextures;
delete [] Delay;
}
@@ -363,6 +380,8 @@ const CTextureArray& CGUITextureManager::Load(const std::string& strTextureName,
return emptyTexture;
}
+ unsigned int maxWidth = 0;
+ unsigned int maxHeight = 0;
pMap = new CTextureMap(strTextureName, gif.Width(), gif.Height(), gif.GetNumLoops());
for (auto frame : gif.GetFrames())
@@ -372,8 +391,14 @@ const CTextureArray& CGUITextureManager::Load(const std::string& strTextureName,
{
glTexture->LoadFromMemory(gif.Width(), gif.Height(), gif.GetPitch(), XB_FMT_A8R8G8B8, false, frame->m_pImage);
pMap->Add(glTexture, frame->m_delay);
+ maxWidth = std::max(maxWidth, glTexture->GetWidth());
+ maxHeight = std::max(maxHeight, glTexture->GetHeight());
}
}
+
+ pMap->SetWidth((int)maxWidth);
+ pMap->SetHeight((int)maxHeight);
+
#endif//HAS_GIFLIB
}
diff --git a/xbmc/guilib/TextureManager.h b/xbmc/guilib/TextureManager.h
index df5697c1a4..f52aa0f22e 100644
--- a/xbmc/guilib/TextureManager.h
+++ b/xbmc/guilib/TextureManager.h
@@ -83,6 +83,8 @@ public:
uint32_t GetMemoryUsage() const;
void Flush();
bool IsEmpty() const;
+ void SetHeight(int height);
+ void SetWidth(int height);
protected:
void FreeTexture();
diff --git a/xbmc/guilib/WindowIDs.h b/xbmc/guilib/WindowIDs.h
index 60f9c88b48..58d6ddb9b5 100644
--- a/xbmc/guilib/WindowIDs.h
+++ b/xbmc/guilib/WindowIDs.h
@@ -95,8 +95,6 @@
#define WINDOW_DIALOG_ADDON_SETTINGS 10140
#define WINDOW_DIALOG_ACCESS_POINTS 10141
#define WINDOW_DIALOG_FULLSCREEN_INFO 10142
-#define WINDOW_DIALOG_KARAOKE_SONGSELECT 10143
-#define WINDOW_DIALOG_KARAOKE_SELECTOR 10144
#define WINDOW_DIALOG_SLIDER 10145
#define WINDOW_DIALOG_ADDON_INFO 10146
#define WINDOW_DIALOG_TEXT_VIEWER 10147
@@ -150,14 +148,11 @@
#define WINDOW_FULLSCREEN_VIDEO 12005
#define WINDOW_VISUALISATION 12006
#define WINDOW_SLIDESHOW 12007
-#define WINDOW_KARAOKELYRICS 12009
#define WINDOW_WEATHER 12600
#define WINDOW_SCREENSAVER 12900
#define WINDOW_DIALOG_VIDEO_OSD 12901
#define WINDOW_VIDEO_MENU 12902
-#define WINDOW_DIALOG_MUSIC_OVERLAY 12903
-#define WINDOW_DIALOG_VIDEO_OVERLAY 12904
#define WINDOW_VIDEO_TIME_SEEK 12905 // virtual window for time seeking during fullscreen video
#define WINDOW_SPLASH 12997 // splash window
diff --git a/xbmc/guilib/cximage.cpp b/xbmc/guilib/cximage.cpp
index 87fed30701..d057ce9a8b 100644
--- a/xbmc/guilib/cximage.cpp
+++ b/xbmc/guilib/cximage.cpp
@@ -20,6 +20,7 @@
*/
#include "cximage.h"
#include "utils/log.h"
+#include <algorithm>
CXImage::CXImage(const std::string& strMimeType): m_strMimeType(strMimeType), m_thumbnailbuffer(NULL)
{
@@ -65,22 +66,25 @@ bool CXImage::LoadImageFromMemory(unsigned char* buffer, unsigned int bufSize, u
return true;
}
-bool CXImage::Decode(unsigned char* const pixels, unsigned int pitch, unsigned int format)
+bool CXImage::Decode(unsigned char* const pixels, unsigned int width, unsigned int height, unsigned int pitch, unsigned int format)
{
if (m_image.width == 0 || m_image.height == 0 || !m_dll.IsLoaded())
return false;
+ unsigned int copyWidth = std::min(m_width, width);
+ unsigned int copyHeight = std::min(m_height, height);
+
unsigned int dstPitch = pitch;
unsigned int srcPitch = ((m_image.width + 1)* 3 / 4) * 4; // bitmap row length is aligned to 4 bytes
unsigned char *dst = (unsigned char*)pixels;
unsigned char *src = m_image.texture + (m_height - 1) * srcPitch;
- for (unsigned int y = 0; y < m_height; y++)
+ for (unsigned int y = 0; y < copyHeight; y++)
{
unsigned char *dst2 = dst;
unsigned char *src2 = src;
- for (unsigned int x = 0; x < m_width; x++, dst2 += 4, src2 += 3)
+ for (unsigned int x = 0; x < copyWidth; x++, dst2 += 4, src2 += 3)
{
dst2[0] = src2[0];
dst2[1] = src2[1];
@@ -96,12 +100,12 @@ bool CXImage::Decode(unsigned char* const pixels, unsigned int pitch, unsigned i
dst = (unsigned char*)pixels + 3;
src = m_image.alpha + (m_height - 1) * m_width;
- for (unsigned int y = 0; y < m_height; y++)
+ for (unsigned int y = 0; y < copyHeight; y++)
{
unsigned char *dst2 = dst;
unsigned char *src2 = src;
- for (unsigned int x = 0; x < m_width; x++, dst2+=4, src2++)
+ for (unsigned int x = 0; x < copyWidth; x++, dst2+=4, src2++)
*dst2 = *src2;
src -= m_width;
dst += dstPitch;
diff --git a/xbmc/guilib/cximage.h b/xbmc/guilib/cximage.h
index 6de32504a8..818fbb9281 100644
--- a/xbmc/guilib/cximage.h
+++ b/xbmc/guilib/cximage.h
@@ -29,7 +29,7 @@ public:
~CXImage();
virtual bool LoadImageFromMemory(unsigned char* buffer, unsigned int bufSize, unsigned int width, unsigned int height);
- virtual bool Decode(unsigned char* const pixels, unsigned int pitch, unsigned int format);
+ virtual bool Decode(unsigned char* const pixels, unsigned int width, unsigned int height, unsigned int pitch, unsigned int format);
virtual bool CreateThumbnailFromSurface(unsigned char* bufferin, unsigned int width, unsigned int height, unsigned int format, unsigned int pitch, const std::string& destFile,
unsigned char* &bufferout, unsigned int &bufferoutSize);
virtual void ReleaseThumbnailBuffer();
diff --git a/xbmc/guilib/iimage.h b/xbmc/guilib/iimage.h
index 8a89e142a4..0bb07741b4 100644
--- a/xbmc/guilib/iimage.h
+++ b/xbmc/guilib/iimage.h
@@ -43,7 +43,7 @@ public:
\param format The format of the output buffer (JpegIO only)
\return true if the image data could be decoded to the output buffer
*/
- virtual bool Decode(unsigned char* const pixels, unsigned int pitch, unsigned int format)=0;
+ virtual bool Decode(unsigned char* const pixels, unsigned int width, unsigned int height, unsigned int pitch, unsigned int format)=0;
/*!
\brief Encodes an thumbnail from raw bits of given memory location
\remarks Caller need to call ReleaseThumbnailBuffer() afterwards to free the output buffer
diff --git a/xbmc/input/ButtonTranslator.cpp b/xbmc/input/ButtonTranslator.cpp
index 6477606f96..0efbddae58 100644
--- a/xbmc/input/ButtonTranslator.cpp
+++ b/xbmc/input/ButtonTranslator.cpp
@@ -364,8 +364,6 @@ static const ActionMapping windows[] =
{ "pictureinfo" , WINDOW_DIALOG_PICTURE_INFO },
{ "accesspoints" , WINDOW_DIALOG_ACCESS_POINTS },
{ "fullscreeninfo" , WINDOW_DIALOG_FULLSCREEN_INFO },
- { "karaokeselector" , WINDOW_DIALOG_KARAOKE_SONGSELECT },
- { "karaokelargeselector" , WINDOW_DIALOG_KARAOKE_SELECTOR },
{ "sliderdialog" , WINDOW_DIALOG_SLIDER },
{ "addoninformation" , WINDOW_DIALOG_ADDON_INFO },
{ "subtitlesearch" , WINDOW_DIALOG_SUBTITLES },
@@ -384,7 +382,6 @@ static const ActionMapping windows[] =
{ "fullscreenradio" , WINDOW_FULLSCREEN_RADIO }, // virtual window for fullscreen radio, uses WINDOW_VISUALISATION as fallback
{ "visualisation" , WINDOW_VISUALISATION },
{ "slideshow" , WINDOW_SLIDESHOW },
- { "karaoke" , WINDOW_KARAOKELYRICS },
{ "weather" , WINDOW_WEATHER },
{ "screensaver" , WINDOW_SCREENSAVER },
{ "videoosd" , WINDOW_DIALOG_VIDEO_OSD },
@@ -1328,8 +1325,20 @@ void CButtonTranslator::MapWindowActions(TiXmlNode *pWindow, int windowID)
else if (type == "appcommand")
buttonCode = TranslateAppCommand(pButton->Value());
- if (buttonCode && pButton->FirstChild())
- MapAction(buttonCode, pButton->FirstChild()->Value(), map);
+ if (buttonCode)
+ {
+ if (pButton->FirstChild() && pButton->FirstChild()->Value()[0])
+ MapAction(buttonCode, pButton->FirstChild()->Value(), map);
+ else
+ {
+ buttonMap::iterator it = map.find(buttonCode);
+ while (it != map.end())
+ {
+ map.erase(it);
+ it = map.find(buttonCode);
+ }
+ }
+ }
pButton = pButton->NextSiblingElement();
}
diff --git a/xbmc/input/InputCodingTableKorean.cpp b/xbmc/input/InputCodingTableKorean.cpp
index ee747121ea..69d0582c18 100644
--- a/xbmc/input/InputCodingTableKorean.cpp
+++ b/xbmc/input/InputCodingTableKorean.cpp
@@ -52,11 +52,16 @@ int CInputCodingTableKorean::MergeCode(int choseong, int jungseong, int jongseon
std::wstring CInputCodingTableKorean::InputToKorean(const std::wstring& input)
{
- std::wstring dicEnglish = L"rRseEfaqQtTdwWczxvgkoiOjpuPhynbml";
- std::wstring dicKorean = L"ㄱㄲㄴㄷㄸㄹã…ㅂㅃㅅㅆㅇㅈㅉㅊㅋㅌã…ã…Žã…ã…ㅑㅒㅓㅔㅕㅖㅗㅛㅜㅠㅡㅣ";
- std::wstring dicChoseong = L"ㄱㄲㄴㄷㄸㄹã…ㅂㅃㅅㅆㅇㅈㅉㅊㅋㅌã…ã…Ž";
- std::wstring dicJungseong = L"ã…ã…ㅑㅒㅓㅔㅕㅖㅗㅘㅙㅚㅛㅜã…ㅞㅟㅠㅡㅢㅣ";
- std::wstring dicJongseong = L"ㄱㄲㄳㄴㄵㄶㄷㄹㄺㄻㄼㄽㄾㄿㅀã…ㅂㅄㅅㅆㅇㅈㅊㅋㅌã…ã…Ž";
+ std::wstring dicEnglish = //L"rRseEfaqQtTdwWczxvgkoiOjpuPhynbml";
+ { 0x72, 0x52, 0x73, 0x65, 0x45, 0x66, 0x61, 0x71, 0x51, 0x74, 0x54, 0x64, 0x77, 0x57, 0x63, 0x7A, 0x78, 0x76, 0x67, 0x6B, 0x6F, 0x69, 0x4F, 0x6A, 0x70, 0x75, 0x50, 0x68, 0x79, 0x6E, 0x62, 0x6D, 0x6C };
+ std::wstring dicKorean = //L"ㄱㄲㄴㄷㄸㄹã…ㅂㅃㅅㅆㅇㅈㅉㅊㅋㅌã…ã…Žã…ã…ㅑㅒㅓㅔㅕㅖㅗㅛㅜㅠㅡㅣ";
+ { 0x3131, 0x3132, 0x3134, 0x3137, 0x3138, 0x3139, 0x3141, 0x3142, 0x3143, 0x3145, 0x3146, 0x3147, 0x3148, 0x3149, 0x314a, 0x314b, 0x314c, 0x314d, 0x314e, 0x314f, 0x3150, 0x3151, 0x3152, 0x3153, 0x3154, 0x3155, 0x3156, 0x3157, 0x315b, 0x315c, 0x3160, 0x3161, 0x3163 };
+ std::wstring dicChoseong = //L"ㄱㄲㄴㄷㄸㄹã…ㅂㅃㅅㅆㅇㅈㅉㅊㅋㅌã…ã…Ž";
+ { 0x3131, 0x3132, 0x3134, 0x3137, 0x3138, 0x3139, 0x3141, 0x3142, 0x3143, 0x3145, 0x3146, 0x3147, 0x3148, 0x3149, 0x314a, 0x314b, 0x314c, 0x314d, 0x314e };
+ std::wstring dicJungseong = //L"ã…ã…ㅑㅒㅓㅔㅕㅖㅗㅘㅙㅚㅛㅜã…ㅞㅟㅠㅡㅢㅣ";
+ { 0x314f, 0x3150, 0x3151, 0x3152, 0x3153, 0x3154, 0x3155, 0x3156, 0x3157, 0x3158, 0x3159, 0x315a, 0x315b, 0x315c, 0x315d, 0x315e, 0x315f, 0x3160, 0x3161, 0x3162, 0x3163 };
+ std::wstring dicJongseong = //L"ㄱㄲㄳㄴㄵㄶㄷㄹㄺㄻㄼㄽㄾㄿㅀã…ㅂㅄㅅㅆㅇㅈㅊㅋㅌã…ã…Ž";
+ { 0x3131, 0x3132, 0x3133, 0x3134, 0x3135, 0x3136, 0x3137, 0x3139, 0x313a, 0x313b, 0x313c, 0x313d, 0x313e, 0x313f, 0x3140, 0x3141, 0x3142, 0x3144, 0x3145, 0x3146, 0x3147, 0x3148, 0x314a, 0x314b, 0x314c, 0x314d, 0x314e };
std::wstring korean;
@@ -114,34 +119,34 @@ std::wstring CInputCodingTableKorean::InputToKorean(const std::wstring& input)
if (jongseong == -1) // Chongseong can have two consonant. So this is first consonant of chongseong.
{
jongseong = dicJongseong.find(dicKorean.at(key));
- if (jongseong == -1) // This consonant cannot be jongseong. ex) ㄸ, ㅃ, ㅉ
+ if (jongseong == -1) // This consonant cannot be jongseong. ex) "ㄸ", "ㅃ", "ㅉ"
{
korean += MergeCode(choseong, jungseong, jongseong);
choseong = dicChoseong.find(dicKorean.at(key));
jungseong = -1;
}
}
- else if (jongseong == 0 && key == 9) // ㄳ
+ else if (jongseong == 0 && key == 9) // "ㄳ"
jongseong = 2;
- else if (jongseong == 3 && key == 12) // ㄵ
+ else if (jongseong == 3 && key == 12) // "ㄵ"
jongseong = 4;
- else if (jongseong == 3 && key == 18) // ㄶ
+ else if (jongseong == 3 && key == 18) // "ㄶ"
jongseong = 5;
- else if (jongseong == 7 && key == 0) // ㄺ
+ else if (jongseong == 7 && key == 0) // "ㄺ"
jongseong = 8;
- else if (jongseong == 7 && key == 6) // ã„»
+ else if (jongseong == 7 && key == 6) // "ã„»"
jongseong = 9;
- else if (jongseong == 7 && key == 7) // ㄼ
+ else if (jongseong == 7 && key == 7) // "ㄼ"
jongseong = 10;
- else if (jongseong == 7 && key == 9) // ㄽ
+ else if (jongseong == 7 && key == 9) // "ㄽ"
jongseong = 11;
- else if (jongseong == 7 && key == 16) // ㄾ
+ else if (jongseong == 7 && key == 16) // "ㄾ"
jongseong = 12;
- else if (jongseong == 7 && key == 17) // ã„¿
+ else if (jongseong == 7 && key == 17) // "ã„¿"
jongseong = 13;
- else if (jongseong == 7 && key == 18) // ã…€
+ else if (jongseong == 7 && key == 18) // "ã…€"
jongseong = 14;
- else if (jongseong == 16 && key == 9) // ã…„
+ else if (jongseong == 16 && key == 9) // "ã…„"
jongseong = 17;
else // Jongseong is completed. So new consonant is choseong.
{
@@ -165,57 +170,57 @@ std::wstring CInputCodingTableKorean::InputToKorean(const std::wstring& input)
choseong = dicChoseong.find(dicKorean.at(key));
}
// Find double consonant of chongseong
- else if (choseong == 0 && key == 9) // ㄳ
+ else if (choseong == 0 && key == 9) // "ㄳ"
{
choseong = -1;
jongseong = 2;
}
- else if (choseong == 2 && key == 12) // ㄵ
+ else if (choseong == 2 && key == 12) // "ㄵ"
{
choseong = -1;
jongseong = 4;
}
- else if (choseong == 2 && key == 18) // ㄶ
+ else if (choseong == 2 && key == 18) // "ㄶ"
{
choseong = -1;
jongseong = 5;
}
- else if (choseong == 5 && key == 0) // ㄺ
+ else if (choseong == 5 && key == 0) // "ㄺ"
{
choseong = -1;
jongseong = 8;
}
- else if (choseong == 5 && key == 6) // ã„»
+ else if (choseong == 5 && key == 6) // "ã„»"
{
choseong = -1;
jongseong = 9;
}
- else if (choseong == 5 && key == 7) // ㄼ
+ else if (choseong == 5 && key == 7) // "ㄼ"
{
choseong = -1;
jongseong = 10;
}
- else if (choseong == 5 && key == 9) // ㄽ
+ else if (choseong == 5 && key == 9) // "ㄽ"
{
choseong = -1;
jongseong = 11;
}
- else if (choseong == 5 && key == 16) // ㄾ
+ else if (choseong == 5 && key == 16) // "ㄾ"
{
choseong = -1;
jongseong = 12;
}
- else if (choseong == 5 && key == 17) // ã„¿
+ else if (choseong == 5 && key == 17) // "ã„¿"
{
choseong = -1;
jongseong = 13;
}
- else if (choseong == 5 && key == 18) // ã…€
+ else if (choseong == 5 && key == 18) // "ã…€"
{
choseong = -1;
jongseong = 14;
}
- else if (choseong == 7 && key == 9) // ã…„
+ else if (choseong == 7 && key == 9) // "ã…„"
{
choseong = -1;
jongseong = 17;
@@ -236,57 +241,57 @@ std::wstring CInputCodingTableKorean::InputToKorean(const std::wstring& input)
// First part of double consonant is jongseong of previous character.
// Second part of double consonant is choseong of current character.
int newCho;
- if (jongseong == 2) // ㄱ, ㅅ
+ if (jongseong == 2) // "ㄱ, ㅅ"
{
jongseong = 0;
newCho = 9;
}
- else if (jongseong == 4) // ã„´, ã…ˆ
+ else if (jongseong == 4) // "ã„´, ã…ˆ"
{
jongseong = 3;
newCho = 12;
}
- else if (jongseong == 5) // ã„´, ã…Ž
+ else if (jongseong == 5) // "ã„´, ã…Ž"
{
jongseong = 3;
newCho = 18;
}
- else if (jongseong == 8) // ㄹ, ㄱ
+ else if (jongseong == 8) // "ㄹ, ㄱ"
{
jongseong = 7;
newCho = 0;
}
- else if (jongseong == 9) // ㄹ, ã…
+ else if (jongseong == 9) // "ㄹ, ã…"
{
jongseong = 7;
newCho = 6;
}
- else if (jongseong == 10) // ㄹ, ㅂ
+ else if (jongseong == 10) // "ㄹ, ㅂ"
{
jongseong = 7;
newCho = 7;
}
- else if (jongseong == 11) // ㄹ, ㅅ
+ else if (jongseong == 11) // "ㄹ, ㅅ"
{
jongseong = 7;
newCho = 9;
}
- else if (jongseong == 12) // ㄹ, ㅌ
+ else if (jongseong == 12) // "ㄹ, ㅌ"
{
jongseong = 7;
newCho = 16;
}
- else if (jongseong == 13) // ㄹ, ã…
+ else if (jongseong == 13) // "ㄹ, ã…"
{
jongseong = 7;
newCho = 17;
}
- else if (jongseong == 14) // ㄹ, ㅎ
+ else if (jongseong == 14) // "ㄹ, ㅎ"
{
jongseong = 7;
newCho = 18;
}
- else if (jongseong == 17) // ã…‚, ã……
+ else if (jongseong == 17) // "ã…‚, ã……"
{
jongseong = 16;
newCho = 9;
@@ -311,19 +316,19 @@ std::wstring CInputCodingTableKorean::InputToKorean(const std::wstring& input)
jungseong = dicJungseong.find(dicKorean.at(key));
}
// If there is jungseong already, jungseong is double vowel.
- else if (jungseong == 8 && key == 19) // ã…˜
+ else if (jungseong == 8 && key == 19) // "ã…˜"
jungseong = 9;
- else if (jungseong == 8 && key == 20) // ã…™
+ else if (jungseong == 8 && key == 20) // "ã…™"
jungseong = 10;
- else if (jungseong == 8 && key == 32) // ã…š
+ else if (jungseong == 8 && key == 32) // "ã…š"
jungseong = 11;
- else if (jungseong == 13 && key == 23) // ã…
+ else if (jungseong == 13 && key == 23) // "ã…"
jungseong = 14;
- else if (jungseong == 13 && key == 24) // ã…ž
+ else if (jungseong == 13 && key == 24) // "ã…ž"
jungseong = 15;
- else if (jungseong == 13 && key == 32) // ã…Ÿ
+ else if (jungseong == 13 && key == 32) // "ã…Ÿ"
jungseong = 16;
- else if (jungseong == 18 && key == 32) // ã…¢
+ else if (jungseong == 18 && key == 32) // "ã…¢"
jungseong = 19;
else // If two vowel cannot be double vowel.
{
diff --git a/xbmc/input/XBMC_keysym.h b/xbmc/input/XBMC_keysym.h
index 873ed8a813..89c21f5c60 100644
--- a/xbmc/input/XBMC_keysym.h
+++ b/xbmc/input/XBMC_keysym.h
@@ -224,6 +224,11 @@ typedef enum {
XBMCK_GREEN = 0x148,
XBMCK_YELLOW = 0x149,
XBMCK_BLUE = 0x14a,
+ XBMCK_ZOOM = 0x14b,
+ XBMCK_TEXT = 0x14c,
+ XBMCK_FAVORITES = 0x14d,
+ XBMCK_HOMEPAGE = 0x14e,
+ XBMCK_CONFIG = 0x14f,
// Add any other keys here
diff --git a/xbmc/input/XBMC_keytable.cpp b/xbmc/input/XBMC_keytable.cpp
index dc46204838..4d05464722 100644
--- a/xbmc/input/XBMC_keytable.cpp
+++ b/xbmc/input/XBMC_keytable.cpp
@@ -238,6 +238,11 @@ static const XBMCKEYTABLE XBMCKeyTable[] =
, { XBMCK_GREEN, 0, 0, XBMCVK_GREEN, "green" }
, { XBMCK_YELLOW, 0, 0, XBMCVK_YELLOW, "yellow" }
, { XBMCK_BLUE, 0, 0, XBMCVK_BLUE, "blue" }
+, { XBMCK_ZOOM, 0, 0, XBMCVK_ZOOM, "zoom" }
+, { XBMCK_TEXT, 0, 0, XBMCVK_TEXT, "text" }
+, { XBMCK_FAVORITES, 0, 0, XBMCVK_FAVORITES, "favorites" }
+, { XBMCK_HOMEPAGE , 0, 0, XBMCVK_HOMEPAGE, "homepage" }
+, { XBMCK_CONFIG, 0, 0, XBMCVK_CONFIG, "config" }
};
static int XBMCKeyTableSize = sizeof(XBMCKeyTable)/sizeof(XBMCKEYTABLE);
diff --git a/xbmc/input/XBMC_vkeys.h b/xbmc/input/XBMC_vkeys.h
index 7fd8a8647d..af114c976e 100644
--- a/xbmc/input/XBMC_vkeys.h
+++ b/xbmc/input/XBMC_vkeys.h
@@ -216,6 +216,11 @@ typedef enum {
XBMCVK_GREEN = 0xE4,
XBMCVK_YELLOW = 0xE5,
XBMCVK_BLUE = 0xE6,
+ XBMCVK_ZOOM = 0xE7,
+ XBMCVK_TEXT = 0xE8,
+ XBMCVK_FAVORITES = 0xE9,
+ XBMCVK_HOMEPAGE = 0xEA,
+ XBMCVK_CONFIG = 0xEB,
XBMCVK_LAST = 0xFF
} XBMCVKey;
diff --git a/xbmc/input/linux/LinuxInputDevices.cpp b/xbmc/input/linux/LinuxInputDevices.cpp
index 723f7ae80a..9f3e866248 100644
--- a/xbmc/input/linux/LinuxInputDevices.cpp
+++ b/xbmc/input/linux/LinuxInputDevices.cpp
@@ -255,13 +255,24 @@ KeyMap keyMap[] = {
{ KEY_PRINT , XBMCK_PRINT },
{ KEY_QUESTION , XBMCK_HELP },
{ KEY_BACK , XBMCK_BACKSPACE },
+ { KEY_ZOOM , XBMCK_ZOOM },
+ { KEY_TEXT , XBMCK_TEXT },
+ { KEY_FAVORITES , XBMCK_FAVORITES },
+ { KEY_RED , XBMCK_RED },
+ { KEY_GREEN , XBMCK_GREEN },
+ { KEY_YELLOW , XBMCK_YELLOW },
+ { KEY_BLUE , XBMCK_BLUE },
+ { KEY_HOMEPAGE , XBMCK_HOMEPAGE },
+ { KEY_MAIL , XBMCK_LAUNCH_MAIL },
+ { KEY_SEARCH , XBMCK_BROWSER_SEARCH},
+ { KEY_FILE , XBMCK_LAUNCH_FILE_BROWSER},
+ { KEY_SELECT , XBMCK_RETURN },
+ { KEY_CONFIG , XBMCK_CONFIG },
// The Little Black Box Remote Additions
{ 384 , XBMCK_LEFT }, // Red
{ 378 , XBMCK_RIGHT }, // Green
{ 381 , XBMCK_UP }, // Yellow
{ 366 , XBMCK_DOWN }, // Blue
- // Rii i7 Home button / wetek openelec remote (code 172)
- { KEY_HOMEPAGE , XBMCK_HOME },
};
typedef enum
@@ -886,26 +897,6 @@ void CLinuxInputDevice::SetupKeyboardAutoRepeat(int fd)
{
bool enable = true;
-#if defined(HAS_LIBAMCODEC)
- if (aml_get_device_type() == AML_DEVICE_TYPE_M1 || aml_get_device_type() == AML_DEVICE_TYPE_M3)
- {
- // ignore the native aml driver named 'key_input',
- // it is the dedicated power key handler (am_key_input)
- if (strncmp(m_deviceName, "key_input", strlen("key_input")) == 0)
- return;
- // ignore the native aml driver named 'aml_keypad',
- // it is the dedicated IR remote handler (amremote)
- else if (strncmp(m_deviceName, "aml_keypad", strlen("aml_keypad")) == 0)
- return;
-
- // turn off any keyboard autorepeat, there is a kernel bug
- // where if the cpu is max'ed then key up is missed and
- // we get a flood of EV_REP that never stop until next
- // key down/up. Very nasty when seeking during video playback.
- enable = false;
- }
-#endif
-
if (enable)
{
int kbdrep[2] = { 400, 80 };
diff --git a/xbmc/interfaces/builtins/GUIContainerBuiltins.cpp b/xbmc/interfaces/builtins/GUIContainerBuiltins.cpp
index c3921838f9..2f81fcb388 100644
--- a/xbmc/interfaces/builtins/GUIContainerBuiltins.cpp
+++ b/xbmc/interfaces/builtins/GUIContainerBuiltins.cpp
@@ -1,6 +1,6 @@
/*
- * Copyright (C) 2005-2015 Team XBMC
- * http://xbmc.org
+ * Copyright (C) 2005-2015 Team Kodi
+ * http://kodi.tv
*
* This Program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -62,7 +62,7 @@ static int Refresh(const std::vector<std::string>& params)
{ // NOTE: These messages require a media window, thus they're sent to the current activewindow.
// This shouldn't stop a dialog intercepting it though.
CGUIMessage message(GUI_MSG_NOTIFY_ALL, g_windowManager.GetActiveWindow(), 0, GUI_MSG_UPDATE, 1); // 1 to reset the history
- message.SetStringParam(params[0]);
+ message.SetStringParam(!params.empty() ? params[0] : "");
g_windowManager.SendMessage(message);
return 0;
@@ -126,7 +126,7 @@ CBuiltins::CommandMap CGUIContainerBuiltins::GetOperations() const
{"container.nextviewmode", {"Move to the next view type (and refresh the listing)", 0, ChangeViewMode<1>}},
{"container.previoussortmethod", {"Change to the previous sort method", 0, ChangeSortMethod<-1>}},
{"container.previousviewmode", {"Move to the previous view type (and refresh the listing)", 0, ChangeViewMode<-1>}},
- {"container.refresh", {"Refresh current listing", 1, Refresh}},
+ {"container.refresh", {"Refresh current listing", 0, Refresh}},
{"container.setsortdirection", {"Toggle the sort direction", 0, ToggleSortDirection}},
{"container.setsortmethod", {"Change to the specified sort method", 1, SetSortMethod}},
{"container.setviewmode", {"Move to the view with the given id", 1, SetViewMode}},
diff --git a/xbmc/interfaces/builtins/LibraryBuiltins.cpp b/xbmc/interfaces/builtins/LibraryBuiltins.cpp
index 444628727e..9f2e379725 100644
--- a/xbmc/interfaces/builtins/LibraryBuiltins.cpp
+++ b/xbmc/interfaces/builtins/LibraryBuiltins.cpp
@@ -89,7 +89,7 @@ static int ExportLibrary(const std::vector<std::string>& params)
bool cancelled=false;
if (params.size() > 1)
- singleFile = StringUtils::EqualsNoCase(params[1], "true");
+ singleFile = StringUtils::EqualsNoCase(params[1], "false");
else
{
HELPERS::DialogResponse result = HELPERS::ShowYesNoDialogText(CVariant{iHeading}, CVariant{20426}, CVariant{20428}, CVariant{20429});
@@ -100,7 +100,7 @@ static int ExportLibrary(const std::vector<std::string>& params)
if (cancelled)
return -1;
- if (singleFile)
+ if (!singleFile)
{
if (params.size() > 2)
thumbs = StringUtils::EqualsNoCase(params[2], "true");
@@ -130,7 +130,7 @@ static int ExportLibrary(const std::vector<std::string>& params)
if (cancelled)
return -1;
- if (singleFile)
+ if (!singleFile)
{
if (params.size() > 3)
overwrite = StringUtils::EqualsNoCase(params[3], "true");
@@ -147,7 +147,7 @@ static int ExportLibrary(const std::vector<std::string>& params)
if (params.size() > 2)
path=params[2];
- if ((singleFile && !path.empty()) ||
+ if (!singleFile || !path.empty() ||
CGUIDialogFileBrowser::ShowAndGetDirectory(shares, g_localizeStrings.Get(661),
path, true))
{
diff --git a/xbmc/interfaces/json-rpc/AudioLibrary.cpp b/xbmc/interfaces/json-rpc/AudioLibrary.cpp
index b52b106253..d5d3d6b7f3 100644
--- a/xbmc/interfaces/json-rpc/AudioLibrary.cpp
+++ b/xbmc/interfaces/json-rpc/AudioLibrary.cpp
@@ -137,18 +137,16 @@ JSONRPC_STATUS CAudioLibrary::GetAlbums(const std::string &method, ITransportLay
if (!musicUrl.FromString("musicdb://albums/"))
return InternalError;
-
if (parameterObject["includesingles"].asBoolean())
musicUrl.AddOption("show_singles", true);
- int artistID = -1, genreID = -1;
const CVariant &filter = parameterObject["filter"];
if (filter.isMember("artistid"))
- artistID = (int)filter["artistid"].asInteger();
+ musicUrl.AddOption("artistid", (int)filter["artistid"].asInteger());
else if (filter.isMember("artist"))
musicUrl.AddOption("artist", filter["artist"].asString());
else if (filter.isMember("genreid"))
- genreID = (int)filter["genreid"].asInteger();
+ musicUrl.AddOption("genreid", (int)filter["genreid"].asInteger());
else if (filter.isMember("genre"))
musicUrl.AddOption("genre", filter["genre"].asString());
else if (filter.isObject())
@@ -165,17 +163,32 @@ JSONRPC_STATUS CAudioLibrary::GetAlbums(const std::string &method, ITransportLay
if (!ParseSorting(parameterObject, sorting.sortBy, sorting.sortOrder, sorting.sortAttributes))
return InvalidParams;
- CFileItemList items;
- if (!musicdatabase.GetAlbumsNav(musicUrl.ToString(), items, genreID, artistID, CDatabase::Filter(), sorting))
+ int total;
+ VECALBUMS albums;
+ if (!musicdatabase.GetAlbumsByWhere(musicUrl.ToString(), CDatabase::Filter(), albums, total, sorting))
return InternalError;
+ CFileItemList items;
+ items.Reserve(albums.size());
+ for (unsigned int index = 0; index < albums.size(); index++)
+ {
+ CMusicDbUrl itemUrl = musicUrl;
+ std::string path = StringUtils::Format("%i/", albums[index].idAlbum);
+ itemUrl.AppendPath(path);
+
+ CFileItemPtr pItem;
+ FillAlbumItem(albums[index], itemUrl.ToString(), pItem);
+ items.Add(pItem);
+ }
+
+ //Get Genre IDs
JSONRPC_STATUS ret = GetAdditionalAlbumDetails(parameterObject, items, musicdatabase);
if (ret != OK)
return ret;
int size = items.Size();
- if (items.HasProperty("total") && items.GetProperty("total").asInteger() > size)
- size = (int)items.GetProperty("total").asInteger();
+ if (total > size)
+ size = total;
HandleFileItemList("albumid", false, "albums", items, parameterObject, result, size, false);
return OK;
@@ -221,22 +234,20 @@ JSONRPC_STATUS CAudioLibrary::GetSongs(const std::string &method, ITransportLaye
if (!musicUrl.FromString("musicdb://songs/"))
return InternalError;
-
if (!parameterObject["includesingles"].asBoolean())
musicUrl.AddOption("singles", false);
- int genreID = -1, albumID = -1, artistID = -1;
const CVariant &filter = parameterObject["filter"];
if (filter.isMember("artistid"))
- artistID = (int)filter["artistid"].asInteger();
+ musicUrl.AddOption("artistid", (int)filter["artistid"].asInteger());
else if (filter.isMember("artist"))
musicUrl.AddOption("artist", filter["artist"].asString());
else if (filter.isMember("genreid"))
- genreID = (int)filter["genreid"].asInteger();
+ musicUrl.AddOption("genreid", (int)filter["genreid"].asInteger());
else if (filter.isMember("genre"))
musicUrl.AddOption("genre", filter["genre"].asString());
else if (filter.isMember("albumid"))
- albumID = (int)filter["albumid"].asInteger();
+ musicUrl.AddOption("albumid", (int)filter["albumid"].asInteger());
else if (filter.isMember("album"))
musicUrl.AddOption("album", filter["album"].asString());
else if (filter.isObject())
@@ -254,8 +265,8 @@ JSONRPC_STATUS CAudioLibrary::GetSongs(const std::string &method, ITransportLaye
return InvalidParams;
CFileItemList items;
- if (!musicdatabase.GetSongsNav(musicUrl.ToString(), items, genreID, artistID, albumID, sorting))
- return InternalError;
+ if (!musicdatabase.GetSongsFullByWhere(musicUrl.ToString(), CDatabase::Filter(), items, sorting, true))
+ return InternalError;
JSONRPC_STATUS ret = GetAdditionalSongDetails(parameterObject, items, musicdatabase);
if (ret != OK)
@@ -282,7 +293,10 @@ JSONRPC_STATUS CAudioLibrary::GetSongDetails(const std::string &method, ITranspo
return InvalidParams;
CFileItemList items;
- items.Add(CFileItemPtr(new CFileItem(song)));
+ CFileItemPtr item = CFileItemPtr(new CFileItem(song));
+ FillItemArtistIDs(song.GetArtistIDArray(), item);
+ items.Add(item);
+
JSONRPC_STATUS ret = GetAdditionalSongDetails(parameterObject, items, musicdatabase);
if (ret != OK)
return ret;
@@ -601,9 +615,11 @@ bool CAudioLibrary::FillFileItem(const std::string &strFilename, CFileItemPtr &i
if (musicdatabase.GetAlbum(albumid, album, false))
{
item->SetFromAlbum(album);
+ FillItemArtistIDs(album.GetArtistIDArray(), item);
CFileItemList items;
items.Add(item);
+
if (GetAdditionalAlbumDetails(parameterObject, items, musicdatabase) == OK)
filled = true;
}
@@ -614,6 +630,7 @@ bool CAudioLibrary::FillFileItem(const std::string &strFilename, CFileItemPtr &i
if (musicdatabase.GetSongByFileName(strFilename, song))
{
item->SetFromSong(song);
+ FillItemArtistIDs(song.GetArtistIDArray(), item);
CFileItemList items;
items.Add(item);
@@ -685,9 +702,22 @@ bool CAudioLibrary::FillFileItemList(const CVariant &parameterObject, CFileItemL
return success;
}
+void CAudioLibrary::FillItemArtistIDs(const std::vector<int> artistids, CFileItemPtr &item)
+{
+ // Add artistIds as separate property as not part of CMusicInfoTag
+ CVariant artistidObj(CVariant::VariantTypeArray);
+ for (std::vector<int>::const_iterator artistid = artistids.begin(); artistid != artistids.end(); ++artistid)
+ artistidObj.push_back(*artistid);
+
+ item->SetProperty("artistid", artistidObj);
+}
+
void CAudioLibrary::FillAlbumItem(const CAlbum &album, const std::string &path, CFileItemPtr &item)
{
item = CFileItemPtr(new CFileItem(path, album));
+ // Add album artistIds as separate property as not part of CMusicInfoTag
+ std::vector<int> artistids = album.GetArtistIDArray();
+ FillItemArtistIDs(artistids, item);
}
JSONRPC_STATUS CAudioLibrary::GetAdditionalDetails(const CVariant &parameterObject, CFileItemList &items)
@@ -711,7 +741,6 @@ JSONRPC_STATUS CAudioLibrary::GetAdditionalAlbumDetails(const CVariant &paramete
std::set<std::string> checkProperties;
checkProperties.insert("genreid");
- checkProperties.insert("artistid");
std::set<std::string> additionalProperties;
if (!CheckForAdditionalProperties(parameterObject["properties"], checkProperties, additionalProperties))
return OK;
@@ -731,18 +760,7 @@ JSONRPC_STATUS CAudioLibrary::GetAdditionalAlbumDetails(const CVariant &paramete
item->SetProperty("genreid", genreidObj);
}
}
- if (additionalProperties.find("artistid") != additionalProperties.end())
- {
- std::vector<int> artistids;
- if (musicdatabase.GetArtistsByAlbum(item->GetMusicInfoTag()->GetDatabaseId(), true, artistids))
- {
- CVariant artistidObj(CVariant::VariantTypeArray);
- for (std::vector<int>::const_iterator artistid = artistids.begin(); artistid != artistids.end(); ++artistid)
- artistidObj.push_back(*artistid);
-
- item->SetProperty("artistid", artistidObj);
- }
- }
+
}
return OK;
@@ -755,8 +773,12 @@ JSONRPC_STATUS CAudioLibrary::GetAdditionalSongDetails(const CVariant &parameter
std::set<std::string> checkProperties;
checkProperties.insert("genreid");
- checkProperties.insert("artistid");
+ // Query (songview join songartistview) returns song.strAlbumArtists = CMusicInfoTag.m_strAlbumArtistDesc only
+ // Actual album artist data, if required, comes from album_artist and artist tables.
+ // It may differ from just splitting album artist description string
+ checkProperties.insert("albumartist");
checkProperties.insert("albumartistid");
+ checkProperties.insert("musicbrainzalbumartistid");
std::set<std::string> additionalProperties;
if (!CheckForAdditionalProperties(parameterObject["properties"], checkProperties, additionalProperties))
return OK;
@@ -776,28 +798,13 @@ JSONRPC_STATUS CAudioLibrary::GetAdditionalSongDetails(const CVariant &parameter
item->SetProperty("genreid", genreidObj);
}
}
- if (additionalProperties.find("artistid") != additionalProperties.end())
- {
- std::vector<int> artistids;
- if (musicdatabase.GetArtistsBySong(item->GetMusicInfoTag()->GetDatabaseId(), true, artistids))
- {
- CVariant artistidObj(CVariant::VariantTypeArray);
- for (std::vector<int>::const_iterator artistid = artistids.begin(); artistid != artistids.end(); ++artistid)
- artistidObj.push_back(*artistid);
-
- item->SetProperty("artistid", artistidObj);
- }
- }
- if (additionalProperties.find("albumartistid") != additionalProperties.end() && item->GetMusicInfoTag()->GetAlbumId() > 0)
+ if (item->GetMusicInfoTag()->GetAlbumId() > 0)
{
- std::vector<int> albumartistids;
- if (musicdatabase.GetArtistsByAlbum(item->GetMusicInfoTag()->GetAlbumId(), true, albumartistids))
+ if (additionalProperties.find("albumartist") != additionalProperties.end() ||
+ additionalProperties.find("albumartistid") != additionalProperties.end() ||
+ additionalProperties.find("musicbrainzalbumartistid") != additionalProperties.end())
{
- CVariant albumartistidObj(CVariant::VariantTypeArray);
- for (std::vector<int>::const_iterator albumartistid = albumartistids.begin(); albumartistid != albumartistids.end(); ++albumartistid)
- albumartistidObj.push_back(*albumartistid);
-
- item->SetProperty("albumartistid", albumartistidObj);
+ musicdatabase.GetArtistsByAlbum(item->GetMusicInfoTag()->GetAlbumId(), item.get());
}
}
}
diff --git a/xbmc/interfaces/json-rpc/AudioLibrary.h b/xbmc/interfaces/json-rpc/AudioLibrary.h
index c44dddb9bf..73cbd25db9 100644
--- a/xbmc/interfaces/json-rpc/AudioLibrary.h
+++ b/xbmc/interfaces/json-rpc/AudioLibrary.h
@@ -62,6 +62,7 @@ namespace JSONRPC
private:
static void FillAlbumItem(const CAlbum &album, const std::string &path, CFileItemPtr &item);
+ static void FillItemArtistIDs(const std::vector<int> artistids, CFileItemPtr &item);
static bool CheckForAdditionalProperties(const CVariant &properties, const std::set<std::string> &checkProperties, std::set<std::string> &foundProperties);
};
diff --git a/xbmc/interfaces/json-rpc/PlayerOperations.cpp b/xbmc/interfaces/json-rpc/PlayerOperations.cpp
index b0ee2c8a9b..f30416176d 100644
--- a/xbmc/interfaces/json-rpc/PlayerOperations.cpp
+++ b/xbmc/interfaces/json-rpc/PlayerOperations.cpp
@@ -193,7 +193,7 @@ JSONRPC_STATUS CPlayerOperations::GetItem(const std::string &method, ITransportL
if (currentMusicTag != NULL)
{
std::string originalLabel = fileItem->GetLabel();
- fileItem = CFileItemPtr(new CFileItem(*currentMusicTag));
+ fileItem->SetFromMusicInfoTag(*currentMusicTag);
if (fileItem->GetLabel().empty())
fileItem->SetLabel(originalLabel);
}
diff --git a/xbmc/interfaces/json-rpc/schema/types.json b/xbmc/interfaces/json-rpc/schema/types.json
index 1cc5d1ed8f..1c6fb46953 100644
--- a/xbmc/interfaces/json-rpc/schema/types.json
+++ b/xbmc/interfaces/json-rpc/schema/types.json
@@ -782,6 +782,41 @@
{ "type": "string", "enum": [ "alltv", "allradio" ], "required": true }
]
},
+ "PVR.Fields.Broadcast": {
+ "extends": "Item.Fields.Base",
+ "items": { "type": "string",
+ "enum": [ "title", "plot", "plotoutline", "starttime",
+ "endtime", "runtime", "progress", "progresspercentage",
+ "genre", "episodename", "episodenum", "episodepart",
+ "firstaired", "hastimer", "isactive", "parentalrating",
+ "wasactive", "thumbnail", "rating" ]
+ }
+ },
+ "PVR.Details.Broadcast": {
+ "extends": "Item.Details.Base",
+ "properties": {
+ "broadcastid": { "$ref": "Library.Id", "required": true },
+ "title": { "type": "string" },
+ "plot": { "type": "string" },
+ "plotoutline": { "type": "string" },
+ "starttime": { "type": "string" },
+ "endtime": { "type": "string" },
+ "runtime": { "type": "integer" },
+ "progress": { "type": "integer" },
+ "progresspercentage": { "type": "number" },
+ "genre": { "type": "string" },
+ "episodename": { "type": "string" },
+ "episodenum": { "type": "integer" },
+ "episodepart": { "type": "integer" },
+ "firstaired": { "type": "string" },
+ "hastimer": { "type": "boolean" },
+ "isactive": { "type": "boolean" },
+ "parentalrating": { "type": "integer" },
+ "wasactive": { "type": "boolean" },
+ "thumbnail": { "type": "string" },
+ "rating": { "type": "integer" }
+ }
+ },
"PVR.Fields.Channel": {
"extends": "Item.Fields.Base",
"items": { "type": "string",
@@ -818,41 +853,6 @@
}
}
},
- "PVR.Fields.Broadcast": {
- "extends": "Item.Fields.Base",
- "items": { "type": "string",
- "enum": [ "title", "plot", "plotoutline", "starttime",
- "endtime", "runtime", "progress", "progresspercentage",
- "genre", "episodename", "episodenum", "episodepart",
- "firstaired", "hastimer", "isactive", "parentalrating",
- "wasactive", "thumbnail", "rating" ]
- }
- },
- "PVR.Details.Broadcast": {
- "extends": "Item.Details.Base",
- "properties": {
- "broadcastid": { "$ref": "Library.Id", "required": true },
- "title": { "type": "string" },
- "plot": { "type": "string" },
- "plotoutline": { "type": "string" },
- "starttime": { "type": "string" },
- "endtime": { "type": "string" },
- "runtime": { "type": "integer" },
- "progress": { "type": "integer" },
- "progresspercentage": { "type": "number" },
- "genre": { "type": "string" },
- "episodename": { "type": "string" },
- "episodenum": { "type": "integer" },
- "episodepart": { "type": "integer" },
- "firstaired": { "type": "string" },
- "hastimer": { "type": "boolean" },
- "isactive": { "type": "boolean" },
- "parentalrating": { "type": "integer" },
- "wasactive": { "type": "boolean" },
- "thumbnail": { "type": "string" },
- "rating": { "type": "integer" }
- }
- },
"PVR.TimerState": {
"type": "string",
"enum": [ "unknown", "new", "scheduled", "recording", "completed",
@@ -1369,6 +1369,13 @@
"enabled": { "type": "boolean" }
}
},
+ "GUI.Stereoscopy.Mode": {
+ "type": "object",
+ "properties": {
+ "mode": { "type": "string", "required": true, "enum": [ "off", "split_vertical", "split_horizontal", "row_interleaved", "hardware_based", "anaglyph_cyan_red", "anaglyph_green_magenta", "anaglyph_yellow_blue", "monoscopic" ] },
+ "label": { "type": "string", "required": true }
+ }
+ },
"GUI.Property.Name": {
"type": "string",
"enum": [ "currentwindow", "currentcontrol", "skin", "fullscreen", "stereoscopicmode" ]
@@ -1397,13 +1404,6 @@
"stereoscopicmode": { "$ref": "GUI.Stereoscopy.Mode" }
}
},
- "GUI.Stereoscopy.Mode": {
- "type": "object",
- "properties": {
- "mode": { "type": "string", "required": true, "enum": [ "off", "split_vertical", "split_horizontal", "row_interleaved", "hardware_based", "anaglyph_cyan_red", "anaglyph_green_magenta", "anaglyph_yellow_blue", "monoscopic" ] },
- "label": { "type": "string", "required": true }
- }
- },
"System.Property.Name": {
"type": "string",
"enum": [ "canshutdown", "cansuspend", "canhibernate", "canreboot" ]
diff --git a/xbmc/interfaces/json-rpc/schema/version.txt b/xbmc/interfaces/json-rpc/schema/version.txt
index d2715cd5ce..b02bea9d2b 100644
--- a/xbmc/interfaces/json-rpc/schema/version.txt
+++ b/xbmc/interfaces/json-rpc/schema/version.txt
@@ -1 +1 @@
-6.31.0
+6.32.2
diff --git a/xbmc/interfaces/legacy/InfoTagMusic.cpp b/xbmc/interfaces/legacy/InfoTagMusic.cpp
index fe01cba12b..6b6e416948 100644
--- a/xbmc/interfaces/legacy/InfoTagMusic.cpp
+++ b/xbmc/interfaces/legacy/InfoTagMusic.cpp
@@ -54,12 +54,12 @@ namespace XBMCAddon
String InfoTagMusic::getArtist()
{
- return StringUtils::Join(infoTag->GetArtist(), g_advancedSettings.m_musicItemSeparator);
+ return infoTag->GetArtistString();
}
String InfoTagMusic::getAlbumArtist()
{
- return StringUtils::Join(infoTag->GetAlbumArtist(), g_advancedSettings.m_musicItemSeparator);
+ return infoTag->GetAlbumArtistString();
}
String InfoTagMusic::getAlbum()
diff --git a/xbmc/interfaces/legacy/ModuleXbmc.h b/xbmc/interfaces/legacy/ModuleXbmc.h
index 9817525b5d..09169dde7c 100644
--- a/xbmc/interfaces/legacy/ModuleXbmc.h
+++ b/xbmc/interfaces/legacy/ModuleXbmc.h
@@ -50,7 +50,7 @@ namespace XBMCAddon
* See pydocs for valid values for level.\n
*
* example:
- * - xbmc.log(msg='This is a test string.', level=xbmc.LOGDEBUG));
+ * - xbmc.log(msg='This is a test string.', level=xbmc.LOGDEBUG);
*/
void log(const char* msg, int level = lLOGNOTICE);
diff --git a/xbmc/interfaces/python/AddonPythonInvoker.cpp b/xbmc/interfaces/python/AddonPythonInvoker.cpp
index c5b1731421..9f96ce5a80 100644
--- a/xbmc/interfaces/python/AddonPythonInvoker.cpp
+++ b/xbmc/interfaces/python/AddonPythonInvoker.cpp
@@ -38,7 +38,7 @@
"import " MODULE "\n" \
"xbmc.abortRequested = False\n" \
"class xbmcout:\n" \
- " def __init__(self, loglevel=" MODULE ".LOGNOTICE):\n" \
+ " def __init__(self, loglevel=" MODULE ".LOGDEBUG):\n" \
" self.ll=loglevel\n" \
" def write(self, data):\n" \
" " MODULE ".log(data,self.ll)\n" \
diff --git a/xbmc/main/win32/WinMain.cpp b/xbmc/main/win32/WinMain.cpp
index 954d5d15fb..38488a0564 100644
--- a/xbmc/main/win32/WinMain.cpp
+++ b/xbmc/main/win32/WinMain.cpp
@@ -21,8 +21,9 @@
#include "CompileInfo.h"
#include "threads/Thread.h"
#include "threads/platform/win/Win32Exception.h"
-#include "utils/CPUInfo.h"
#include "xbmc.h"
+#include "utils/CPUInfo.h"
+#include "utils/Environment.h"
#include <dbghelp.h>
#include <shellapi.h>
@@ -44,6 +45,9 @@ LONG WINAPI CreateMiniDump(EXCEPTION_POINTERS* pEp)
//-----------------------------------------------------------------------------
INT WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR commandLine, INT)
{
+ // this fixes crash if OPENSSL_CONF is set to existed openssl.cfg
+ // need to set it as soon as possible
+ CEnvironment::unsetenv("OPENSSL_CONF");
// Initializes CreateMiniDump to handle exceptions.
char ver[100];
diff --git a/xbmc/messaging/ApplicationMessenger.h b/xbmc/messaging/ApplicationMessenger.h
index 4db94b7a94..b54b1c88f9 100644
--- a/xbmc/messaging/ApplicationMessenger.h
+++ b/xbmc/messaging/ApplicationMessenger.h
@@ -36,7 +36,6 @@
#define TMSG_MASK_GUIINFOMANAGER (1<<28)
#define TMSG_MASK_WINDOWMANAGER (1<<27)
#define TMSG_MASK_PERIPHERALS (1<<26)
-#define TMSG_MASK_AUDIO_DSP (1<<25)
// defines here
#define TMSG_PLAYLISTPLAYER_PLAY TMSG_MASK_PLAYLISTPLAYER + 0
@@ -90,8 +89,7 @@
#define TMSG_PICTURE_SLIDESHOW TMSG_MASK_APPLICATION + 26
#define TMSG_LOADPROFILE TMSG_MASK_APPLICATION + 27
#define TMSG_VIDEORESIZE TMSG_MASK_APPLICATION + 28
-
-#define TMSG_SETAUDIODSPSTATE TMSG_MASK_AUDIO_DSP + 0
+#define TMSG_SETAUDIODSPSTATE TMSG_MASK_APPLICATION + 29
#define TMSG_GUI_INFOLABEL TMSG_MASK_GUIINFOMANAGER + 0
#define TMSG_GUI_INFOBOOL TMSG_MASK_GUIINFOMANAGER + 1
diff --git a/xbmc/music/Album.cpp b/xbmc/music/Album.cpp
index 866959e321..540c05ec7d 100644
--- a/xbmc/music/Album.cpp
+++ b/xbmc/music/Album.cpp
@@ -178,11 +178,6 @@ const std::vector<std::string> CAlbum::GetAlbumArtist() const
{
albumartists.push_back(artistCredit->GetArtist());
}
- //When artist credits have not been populated attempt to build an artist vector from the descrpition string
- //This is a tempory fix, in the longer term other areas should query the album_artist table and populate
- //artist credits. Note that splitting the string may not give the same artists as held in the album_artist table
- if (albumartists.empty() && !strArtistDesc.empty())
- albumartists = StringUtils::Split(strArtistDesc, g_advancedSettings.m_musicItemSeparator);
return albumartists;
}
@@ -209,6 +204,15 @@ const std::string CAlbum::GetAlbumArtistString() const
return artistString;
}
+const std::vector<int> CAlbum::GetArtistIDArray() const
+{
+ // Get album artist IDs for json rpc
+ std::vector<int> artistids;
+ for (VECARTISTCREDITS::const_iterator artistCredit = artistCredits.begin(); artistCredit != artistCredits.end(); ++artistCredit)
+ artistids.push_back(artistCredit->GetArtistId());
+ return artistids;
+}
+
std::string CAlbum::GetReleaseType() const
{
return ReleaseTypeToString(releaseType);
diff --git a/xbmc/music/Album.h b/xbmc/music/Album.h
index fee9116958..b771b2a547 100644
--- a/xbmc/music/Album.h
+++ b/xbmc/music/Album.h
@@ -37,7 +37,13 @@ class CAlbum
{
public:
CAlbum(const CFileItem& item);
- CAlbum() { idAlbum = 0; iRating = 0; iYear = 0; iTimesPlayed = 0; dateAdded.Reset(); lastPlayed.Reset(); releaseType = Album; };
+ CAlbum() : idAlbum{0}
+ , iRating{0}
+ , iYear{0}
+ , bCompilation{false}
+ , iTimesPlayed{0}
+ , releaseType{Album}
+ {};
bool operator<(const CAlbum &a) const;
void MergeScrapedAlbum(const CAlbum& album, bool override = true);
@@ -87,6 +93,11 @@ public:
*/
const std::string GetAlbumArtistString() const;
+ /*! \brief Get album artist IDs (for json rpc) from the vector of artistcredits objects
+ \return album artist IDs as a vector of integers
+ */
+ const std::vector<int> GetArtistIDArray() const;
+
typedef enum ReleaseType {
Album = 0,
Single
diff --git a/xbmc/music/MusicDatabase.cpp b/xbmc/music/MusicDatabase.cpp
index c10fedaf84..1e29e06789 100644
--- a/xbmc/music/MusicDatabase.cpp
+++ b/xbmc/music/MusicDatabase.cpp
@@ -67,10 +67,6 @@
#include "dbwrappers/dataset.h"
#include "utils/XMLUtils.h"
-#ifdef HAS_KARAOKE
-#include "karaoke/karaokelyricsfactory.h"
-#endif
-
using namespace XFILE;
using namespace MUSICDATABASEDIRECTORY;
using namespace KODI::MESSAGING;
@@ -175,10 +171,6 @@ void CMusicDatabase::CreateTables()
CLog::Log(LOGINFO, "create discography table");
m_pDS->exec("CREATE TABLE discography (idArtist integer, strAlbum text, strYear text)");
- CLog::Log(LOGINFO, "create karaokedata table");
- m_pDS->exec("CREATE TABLE karaokedata (iKaraNumber integer, idSong integer, iKaraDelay integer, strKaraEncoding text, "
- "strKaralyrics text, strKaraLyrFileCRC text)");
-
CLog::Log(LOGINFO, "create art table");
m_pDS->exec("CREATE TABLE art(art_id INTEGER PRIMARY KEY, media_id INTEGER, media_type TEXT, type TEXT, url TEXT)");
@@ -223,9 +215,6 @@ void CMusicDatabase::CreateAnalytics()
m_pDS->exec("CREATE INDEX idxAlbumInfoSong_1 ON albuminfosong ( idAlbumInfo )");
- m_pDS->exec("CREATE INDEX idxKaraNumber on karaokedata(iKaraNumber)");
- m_pDS->exec("CREATE INDEX idxKarSong on karaokedata(idSong)");
-
m_pDS->exec("CREATE INDEX idxDiscography_1 ON discography ( idArtist )");
m_pDS->exec("CREATE INDEX ix_art ON art(media_id, media_type(20), type(20))");
@@ -249,7 +238,6 @@ void CMusicDatabase::CreateAnalytics()
m_pDS->exec("CREATE TRIGGER tgrDeleteSong AFTER delete ON song FOR EACH ROW BEGIN"
" DELETE FROM song_artist WHERE song_artist.idSong = old.idSong;"
" DELETE FROM song_genre WHERE song_genre.idSong = old.idSong;"
- " DELETE FROM karaokedata WHERE karaokedata.idSong = old.idSong;"
" DELETE FROM art WHERE media_id=old.idSong AND media_type='song';"
" END");
m_pDS->exec("CREATE TRIGGER tgrDeletePath AFTER delete ON path FOR EACH ROW BEGIN"
@@ -277,7 +265,6 @@ void CMusicDatabase::CreateViews()
" song.idAlbum AS idAlbum, "
" strAlbum, "
" strPath, "
- " iKaraNumber, iKaraDelay, strKaraEncoding,"
" album.bCompilation AS bCompilation,"
" album.strArtists AS strAlbumArtists,"
" album.strReleaseType AS strAlbumReleaseType,"
@@ -287,9 +274,7 @@ void CMusicDatabase::CreateViews()
" JOIN album ON"
" song.idAlbum=album.idAlbum"
" JOIN path ON"
- " song.idPath=path.idPath"
- " LEFT OUTER JOIN karaokedata ON"
- " song.idSong=karaokedata.idSong");
+ " song.idPath=path.idPath");
CLog::Log(LOGINFO, "create album view");
m_pDS->exec("CREATE VIEW albumview AS SELECT "
@@ -509,8 +494,7 @@ bool CMusicDatabase::AddAlbum(CAlbum& album)
song->iTimesPlayed, song->iStartOffset,
song->iEndOffset,
song->lastPlayed,
- song->rating,
- song->iKaraokeNumber);
+ song->rating);
for (VECARTISTCREDITS::iterator artistCredit = song->artistCredits.begin(); artistCredit != song->artistCredits.end(); ++artistCredit)
@@ -586,8 +570,7 @@ bool CMusicDatabase::UpdateAlbum(CAlbum& album)
song->iStartOffset,
song->iEndOffset,
song->lastPlayed,
- song->rating,
- song->iKaraokeNumber);
+ song->rating);
DeleteSongArtistsBySong(song->idSong);
for (VECARTISTCREDITS::iterator artistCredit = song->artistCredits.begin(); artistCredit != song->artistCredits.end(); ++artistCredit)
{
@@ -620,7 +603,7 @@ int CMusicDatabase::AddSong(const int idAlbum,
const std::string &artistString, const std::vector<std::string>& genres,
int iTrack, int iDuration, int iYear,
const int iTimesPlayed, int iStartOffset, int iEndOffset,
- const CDateTime& dtLastPlayed, char rating, int iKaraokeNumber)
+ const CDateTime& dtLastPlayed, char rating)
{
int idSong = -1;
std::string strSQL;
@@ -637,11 +620,6 @@ int CMusicDatabase::AddSong(const int idAlbum,
URIUtils::Split(strPathAndFileName, strPath, strFileName);
int idPath = AddPath(strPath);
- bool bHasKaraoke = false;
-#ifdef HAS_KARAOKE
- bHasKaraoke = CKaraokeLyricsFactory::HasLyrics(strPathAndFileName);
-#endif
-
if (!strMusicBrainzTrackID.empty())
strSQL = PrepareSQL("SELECT * FROM song WHERE idAlbum = %i AND strMusicBrainzTrackID = '%s'",
idAlbum,
@@ -686,20 +664,13 @@ int CMusicDatabase::AddSong(const int idAlbum,
{
idSong = m_pDS->fv("idSong").get_asInt();
m_pDS->close();
- UpdateSong(idSong, strTitle, strMusicBrainzTrackID, strPathAndFileName, strComment, strMood, strThumb, artistString, genres, iTrack, iDuration, iYear, iTimesPlayed, iStartOffset, iEndOffset, dtLastPlayed, rating, iKaraokeNumber);
+ UpdateSong(idSong, strTitle, strMusicBrainzTrackID, strPathAndFileName, strComment, strMood, strThumb, artistString, genres, iTrack, iDuration, iYear, iTimesPlayed, iStartOffset, iEndOffset, dtLastPlayed, rating);
}
if (!strThumb.empty())
SetArtForItem(idSong, MediaTypeSong, "thumb", strThumb);
unsigned int index = 0;
- // If this is karaoke song, change the genre to 'Karaoke' (and add it if it's not there)
- if ( bHasKaraoke && g_advancedSettings.m_karaokeChangeGenreForKaraokeSongs )
- {
- int idGenre = AddGenre("Karaoke");
- AddSongGenre(idGenre, idSong, index);
- AddAlbumGenre(idGenre, idAlbum, index++);
- }
for (std::vector<std::string>::const_iterator i = genres.begin(); i != genres.end(); ++i)
{
// index will be wrong for albums, but ordering is not all that relevant
@@ -709,10 +680,6 @@ int CMusicDatabase::AddSong(const int idAlbum,
AddAlbumGenre(idGenre, idAlbum, index++);
}
- // Add karaoke information (if any)
- if (bHasKaraoke)
- AddKaraokeData(idSong, iKaraokeNumber);
-
UpdateFileDateAdded(idSong, strPathAndFileName);
AnnounceUpdate(MediaTypeSong, idSong);
@@ -791,8 +758,7 @@ int CMusicDatabase::UpdateSong(int idSong, const CSong &song)
song.iStartOffset,
song.iEndOffset,
song.lastPlayed,
- song.rating,
- song.iKaraokeNumber);
+ song.rating);
}
int CMusicDatabase::UpdateSong(int idSong,
@@ -802,7 +768,7 @@ int CMusicDatabase::UpdateSong(int idSong,
const std::string& artistString, const std::vector<std::string>& genres,
int iTrack, int iDuration, int iYear,
int iTimesPlayed, int iStartOffset, int iEndOffset,
- const CDateTime& dtLastPlayed, char rating, int iKaraokeNumber)
+ const CDateTime& dtLastPlayed, char rating)
{
if (idSong < 0)
return -1;
@@ -1455,17 +1421,13 @@ bool CMusicDatabase::GetAlbumsByArtist(int idArtist, bool includeFeatured, std::
return false;
}
-bool CMusicDatabase::GetArtistsByAlbum(int idAlbum, bool includeFeatured, std::vector<int> &artists)
+bool CMusicDatabase::GetArtistsByAlbum(int idAlbum, CFileItem* item)
{
try
{
std::string strSQL, strPrepSQL;
-
- strPrepSQL = "select idArtist from album_artist where idAlbum=%i";
- if (includeFeatured == false)
- strPrepSQL += " AND boolFeatured = 0";
-
- strSQL=PrepareSQL(strPrepSQL, idAlbum);
+
+ strSQL = PrepareSQL("SELECT * FROM albumartistview WHERE idAlbum = %i", idAlbum);
if (!m_pDS->query(strSQL))
return false;
if (m_pDS->num_rows() == 0)
@@ -1474,12 +1436,31 @@ bool CMusicDatabase::GetArtistsByAlbum(int idAlbum, bool includeFeatured, std::v
return false;
}
+ // Get album artist credits
+ VECARTISTCREDITS artistCredits;
while (!m_pDS->eof())
{
- artists.push_back(m_pDS->fv("idArtist").get_asInt());
+ artistCredits.push_back(GetArtistCreditFromDataset(m_pDS->get_sql_record(), 0));
m_pDS->next();
}
m_pDS->close();
+
+ // Populate item with song albumartist credits
+ std::vector<std::string> musicBrainzID;
+ std::vector<std::string> albumartists;
+ CVariant artistidObj(CVariant::VariantTypeArray);
+ for (VECARTISTCREDITS::const_iterator artistCredit = artistCredits.begin(); artistCredit != artistCredits.end(); ++artistCredit)
+ {
+ artistidObj.push_back(artistCredit->GetArtistId());
+ albumartists.push_back(artistCredit->GetArtist());
+ if (!artistCredit->GetMusicBrainzArtistID().empty())
+ musicBrainzID.push_back(artistCredit->GetMusicBrainzArtistID());
+ }
+ item->GetMusicInfoTag()->SetAlbumArtist(albumartists);
+ item->GetMusicInfoTag()->SetMusicBrainzAlbumArtistID(musicBrainzID);
+ // Add song albumartistIds as separate property as not part of CMusicInfoTag
+ item->SetProperty("albumartistid", artistidObj);
+
return true;
}
catch (...)
@@ -1692,9 +1673,6 @@ CSong CMusicDatabase::GetSongFromDataset(const dbiplus::sql_record* const record
song.rating = record->at(offset + song_userrating).get_asChar();
song.strComment = record->at(offset + song_comment).get_asString();
song.strMood = record->at(offset + song_mood).get_asString();
- song.iKaraokeNumber = record->at(offset + song_iKarNumber).get_asInt();
- song.strKaraokeLyrEncoding = record->at(offset + song_strKarEncoding).get_asString();
- song.iKaraokeDelay = record->at(offset + song_iKarDelay).get_asInt();
song.bCompilation = record->at(offset + song_bCompilation).get_asInt() == 1;
// Get filename with full path
@@ -1709,8 +1687,8 @@ void CMusicDatabase::GetFileItemFromDataset(CFileItem* item, const CMusicDbUrl &
void CMusicDatabase::GetFileItemFromDataset(const dbiplus::sql_record* const record, CFileItem* item, const CMusicDbUrl &baseUrl)
{
- // get the artist string from song (not the song_artist and artist tables)
- item->GetMusicInfoTag()->SetArtist(record->at(song_strArtists).get_asString());
+ // get the artist string from songview (not the song_artist and artist tables)
+ item->GetMusicInfoTag()->SetArtistDesc(record->at(song_strArtists).get_asString());
// and the full genre string
item->GetMusicInfoTag()->SetGenre(record->at(song_strGenres).get_asString());
// and the rest...
@@ -1737,6 +1715,7 @@ void CMusicDatabase::GetFileItemFromDataset(const dbiplus::sql_record* const rec
std::string strRealPath = URIUtils::AddFileToFolder(record->at(song_strPath).get_asString(), record->at(song_strFileName).get_asString());
item->GetMusicInfoTag()->SetURL(strRealPath);
item->GetMusicInfoTag()->SetCompilation(record->at(song_bCompilation).get_asInt() == 1);
+ // get the album artist string from songview (not the album_artist and artist tables)
item->GetMusicInfoTag()->SetAlbumArtist(record->at(song_strAlbumArtists).get_asString());
item->GetMusicInfoTag()->SetAlbumReleaseType(CAlbum::ReleaseTypeFromString(record->at(song_strAlbumReleaseType).get_asString()));
item->GetMusicInfoTag()->SetLoaded(true);
@@ -1754,6 +1733,25 @@ void CMusicDatabase::GetFileItemFromDataset(const dbiplus::sql_record* const rec
}
}
+void CMusicDatabase::GetFileItemFromArtistCredits(VECARTISTCREDITS& artistCredits, CFileItem* item)
+{
+ // Populate fileitem with artists from vector of artist credits
+ std::vector<std::string> musicBrainzID;
+ std::vector<std::string> songartists;
+ CVariant artistidObj(CVariant::VariantTypeArray);
+ for (VECARTISTCREDITS::const_iterator artistCredit = artistCredits.begin(); artistCredit != artistCredits.end(); ++artistCredit)
+ {
+ artistidObj.push_back(artistCredit->GetArtistId());
+ songartists.push_back(artistCredit->GetArtist());
+ if (!artistCredit->GetMusicBrainzArtistID().empty())
+ musicBrainzID.push_back(artistCredit->GetMusicBrainzArtistID());
+ }
+ item->GetMusicInfoTag()->SetArtist(songartists);
+ item->GetMusicInfoTag()->SetMusicBrainzArtistID(musicBrainzID);
+ // Add album artistIds as separate property as not part of CMusicInfoTag
+ item->SetProperty("artistid", artistidObj);
+}
+
CAlbum CMusicDatabase::GetAlbumFromDataset(dbiplus::Dataset* pDS, int offset /* = 0 */, bool imageURL /* = false*/)
{
return GetAlbumFromDataset(pDS->get_sql_record(), offset, imageURL);
@@ -2024,12 +2022,14 @@ bool CMusicDatabase::GetTop100Albums(VECALBUMS& albums)
if (NULL == m_pDB.get()) return false;
if (NULL == m_pDS.get()) return false;
- // NOTE: The song.idAlbum is needed for the group by, as for some reason group by albumview.idAlbum doesn't work
- // consistently - possibly an SQLite bug, as it works fine in SQLiteSpy (v3.3.17)
- std::string strSQL = "select albumview.* from albumview "
- "where albumview.iTimesPlayed>0 and albumview.strAlbum != '' "
- "order by albumview.iTimesPlayed desc "
- "limit 100 ";
+ // Get data from album and album_artist tables to fully populate albums
+ std::string strSQL = "SELECT albumview.*, albumartistview.* FROM albumview "
+ "LEFT JOIN albumartistview ON albumview.idAlbum = albumartistview.idAlbum "
+ "WHERE albumartistview.idAlbum in "
+ "(SELECT albumview.idAlbum FROM albumview "
+ "WHERE albumview.strAlbum != '' AND albumview.iTimesPlayed>0 "
+ "ORDER BY albumview.iTimesPlayed DESC LIMIT 100) "
+ "ORDER BY albumview.iTimesPlayed DESC, albumartistview.iOrder";
CLog::Log(LOGDEBUG, "%s query: %s", __FUNCTION__, strSQL.c_str());
if (!m_pDS->query(strSQL)) return false;
@@ -2039,9 +2039,21 @@ bool CMusicDatabase::GetTop100Albums(VECALBUMS& albums)
m_pDS->close();
return true;
}
+
+ int albumArtistOffset = album_enumCount;
+ int albumId = -1;
while (!m_pDS->eof())
{
- albums.push_back(GetAlbumFromDataset(m_pDS.get()));
+ const dbiplus::sql_record* const record = m_pDS->get_sql_record();
+
+ if (albumId != record->at(album_idAlbum).get_asInt())
+ { // New album
+ albumId = record->at(album_idAlbum).get_asInt();
+ albums.push_back(GetAlbumFromDataset(record));
+ }
+ // Get artist details
+ albums.back().artistCredits.push_back(GetArtistCreditFromDataset(record, albumArtistOffset));
+
m_pDS->next();
}
@@ -2107,7 +2119,14 @@ bool CMusicDatabase::GetRecentlyPlayedAlbums(VECALBUMS& albums)
if (NULL == m_pDB.get()) return false;
if (NULL == m_pDS.get()) return false;
- std::string strSQL = StringUtils::Format("select distinct albumview.* from song join albumview on albumview.idAlbum=song.idAlbum where song.lastplayed IS NOT NULL order by song.lastplayed desc limit %i", RECENTLY_PLAYED_LIMIT);
+ // Get data from album and album_artist tables to fully populate albums
+ std::string strSQL = PrepareSQL("SELECT albumview.*, albumartistview.* FROM "
+ "(SELECT idAlbum FROM albumview WHERE albumview.lastplayed IS NOT NULL "
+ "ORDER BY albumview.lastplayed DESC LIMIT %u) as playedalbums "
+ "JOIN albumview ON albumview.idAlbum = playedalbums.idAlbum "
+ "LEFT JOIN albumartistview ON albumview.idAlbum = albumartistview.idAlbum "
+ "ORDER BY albumview.lastplayed DESC, albumartistview.iorder ", RECENTLY_PLAYED_LIMIT);
+
CLog::Log(LOGDEBUG, "%s query: %s", __FUNCTION__, strSQL.c_str());
if (!m_pDS->query(strSQL)) return false;
int iRowsFound = m_pDS->num_rows();
@@ -2116,12 +2135,23 @@ bool CMusicDatabase::GetRecentlyPlayedAlbums(VECALBUMS& albums)
m_pDS->close();
return true;
}
+
+ int albumArtistOffset = album_enumCount;
+ int albumId = -1;
while (!m_pDS->eof())
{
- albums.push_back(GetAlbumFromDataset(m_pDS.get()));
+ const dbiplus::sql_record* const record = m_pDS->get_sql_record();
+
+ if (albumId != record->at(album_idAlbum).get_asInt())
+ { // New album
+ albumId = record->at(album_idAlbum).get_asInt();
+ albums.push_back(GetAlbumFromDataset(record));
+ }
+ // Get artist details
+ albums.back().artistCredits.push_back(GetArtistCreditFromDataset(record, albumArtistOffset));
+
m_pDS->next();
}
-
m_pDS->close(); // cleanup recordset data
return true;
}
@@ -2144,7 +2174,12 @@ bool CMusicDatabase::GetRecentlyPlayedAlbumSongs(const std::string& strBaseDir,
if (!strBaseDir.empty() && !baseUrl.FromString(strBaseDir))
return false;
- std::string strSQL = StringUtils::Format("SELECT songview.*, albumview.* FROM songview JOIN albumview ON (songview.idAlbum = albumview.idAlbum) JOIN (SELECT DISTINCT album.idAlbum FROM album JOIN song ON album.idAlbum = song.idAlbum WHERE song.lastplayed IS NOT NULL ORDER BY song.lastplayed DESC LIMIT %i) AS _albumlimit ON (albumview.idAlbum = _albumlimit.idAlbum)", g_advancedSettings.m_iMusicLibraryRecentlyAddedItems);
+ std::string strSQL = PrepareSQL("SELECT songview.*, songartistview.* FROM "
+ "(SELECT idAlbum FROM albumview WHERE albumview.lastplayed IS NOT NULL "
+ "ORDER BY albumview.lastplayed DESC LIMIT %u) as playedalbums "
+ "JOIN songview ON songview.idAlbum = playedalbums.idAlbum "
+ "LEFT JOIN songartistview ON songview.idSong = songartistview.idSong ",
+ g_advancedSettings.m_iMusicLibraryRecentlyAddedItems);
CLog::Log(LOGDEBUG,"GetRecentlyPlayedAlbumSongs() query: %s", strSQL.c_str());
if (!m_pDS->query(strSQL)) return false;
@@ -2155,15 +2190,38 @@ bool CMusicDatabase::GetRecentlyPlayedAlbumSongs(const std::string& strBaseDir,
return true;
}
- // get data from returned rows
- items.Reserve(iRowsFound);
+ // Needs a separate query to determine number of songs to set items size.
+ // Get songs from returned rows. Join means there is a row for every song artist
+ int songArtistOffset = song_enumCount;
+ int songId = -1;
+ VECARTISTCREDITS artistCredits;
while (!m_pDS->eof())
{
- CFileItemPtr item(new CFileItem);
- GetFileItemFromDataset(item.get(), baseUrl);
- items.Add(item);
+ const dbiplus::sql_record* const record = m_pDS->get_sql_record();
+
+ if (songId != record->at(song_idSong).get_asInt())
+ { //New song
+ if (songId > 0 && !artistCredits.empty())
+ {
+ //Store artist credits for previous song
+ GetFileItemFromArtistCredits(artistCredits, items[items.Size() - 1].get());
+ artistCredits.clear();
+ }
+ songId = record->at(song_idSong).get_asInt();
+ CFileItemPtr item(new CFileItem);
+ GetFileItemFromDataset(record, item.get(), baseUrl);
+ items.Add(item);
+ }
+ // Get song artist credits
+ artistCredits.push_back(GetArtistCreditFromDataset(record, songArtistOffset));
m_pDS->next();
}
+ if (!artistCredits.empty())
+ {
+ //Store artist credits for final song
+ GetFileItemFromArtistCredits(artistCredits, items[items.Size() - 1].get());
+ artistCredits.clear();
+ }
// cleanup
m_pDS->close();
@@ -2184,7 +2242,15 @@ bool CMusicDatabase::GetRecentlyAddedAlbums(VECALBUMS& albums, unsigned int limi
if (NULL == m_pDB.get()) return false;
if (NULL == m_pDS.get()) return false;
- std::string strSQL = StringUtils::Format("select * from albumview where strAlbum != '' order by idAlbum desc limit %u", limit ? limit : g_advancedSettings.m_iMusicLibraryRecentlyAddedItems);
+ // Get data from album and album_artist tables to fully populate albums
+ // Use idAlbum to determine the recently added albums
+ // (not "dateAdded" as this is file time stamp and nothing to do with when albums added to library)
+ std::string strSQL = PrepareSQL("SELECT albumview.*, albumartistview.* FROM "
+ "(SELECT idAlbum FROM album WHERE strAlbum != '' ORDER BY idAlbum DESC LIMIT %u) AS recentalbums "
+ "JOIN albumview ON albumview.idAlbum = recentalbums.idAlbum "
+ "LEFT JOIN albumartistview ON albumview.idAlbum = albumartistview.idAlbum "
+ "ORDER BY albumview.idAlbum desc, albumartistview.iOrder ",
+ limit ? limit : g_advancedSettings.m_iMusicLibraryRecentlyAddedItems);
CLog::Log(LOGDEBUG, "%s query: %s", __FUNCTION__, strSQL.c_str());
if (!m_pDS->query(strSQL)) return false;
@@ -2195,12 +2261,22 @@ bool CMusicDatabase::GetRecentlyAddedAlbums(VECALBUMS& albums, unsigned int limi
return true;
}
+ int albumArtistOffset = album_enumCount;
+ int albumId = -1;
while (!m_pDS->eof())
{
- albums.push_back(GetAlbumFromDataset(m_pDS.get()));
+ const dbiplus::sql_record* const record = m_pDS->get_sql_record();
+
+ if (albumId != record->at(album_idAlbum).get_asInt())
+ { // New album
+ albumId = record->at(album_idAlbum).get_asInt();
+ albums.push_back(GetAlbumFromDataset(record));
+ }
+ // Get artist details
+ albums.back().artistCredits.push_back(GetArtistCreditFromDataset(record, albumArtistOffset));
+
m_pDS->next();
}
-
m_pDS->close(); // cleanup recordset data
return true;
}
@@ -2223,8 +2299,16 @@ bool CMusicDatabase::GetRecentlyAddedAlbumSongs(const std::string& strBaseDir, C
if (!strBaseDir.empty() && !baseUrl.FromString(strBaseDir))
return false;
+ // Get data from song and song_artist tables to fully populate songs
+ // Use idAlbum to determine the recently added albums
+ // (not "dateAdded" as this is file time stamp and nothing to do with when albums added to library)
std::string strSQL;
- strSQL = PrepareSQL("SELECT songview.* FROM (SELECT idAlbum FROM albumview ORDER BY idAlbum DESC LIMIT %u) AS recentalbums JOIN songview ON songview.idAlbum=recentalbums.idAlbum", limit ? limit : g_advancedSettings.m_iMusicLibraryRecentlyAddedItems);
+ strSQL = PrepareSQL("SELECT songview.*, songartistview.* FROM "
+ "(SELECT idAlbum FROM album ORDER BY idAlbum DESC LIMIT %u) AS recentalbums "
+ "JOIN songview ON songview.idAlbum = recentalbums.idAlbum "
+ "JOIN songartistview ON songview.idSong = songartistview.idSong "
+ "ORDER BY songview.idAlbum desc, songview.itrack, songartistview.iOrder ",
+ limit ? limit : g_advancedSettings.m_iMusicLibraryRecentlyAddedItems);
CLog::Log(LOGDEBUG,"GetRecentlyAddedAlbumSongs() query: %s", strSQL.c_str());
if (!m_pDS->query(strSQL)) return false;
@@ -2235,15 +2319,39 @@ bool CMusicDatabase::GetRecentlyAddedAlbumSongs(const std::string& strBaseDir, C
return true;
}
- // get data from returned rows
- items.Reserve(iRowsFound);
+ // Needs a separate query to determine number of songs to set items size.
+ // Get songs from returned rows. Join means there is a row for every song artist
+ int songArtistOffset = song_enumCount;
+ int songId = -1;
+ VECARTISTCREDITS artistCredits;
while (!m_pDS->eof())
{
- CFileItemPtr item(new CFileItem);
- GetFileItemFromDataset(item.get(), baseUrl);
- items.Add(item);
+ const dbiplus::sql_record* const record = m_pDS->get_sql_record();
+
+ if (songId != record->at(song_idSong).get_asInt())
+ { //New song
+ if (songId > 0 && !artistCredits.empty())
+ {
+ //Store artist credits for previous song
+ GetFileItemFromArtistCredits(artistCredits, items[items.Size() - 1].get());
+ artistCredits.clear();
+ }
+ songId = record->at(song_idSong).get_asInt();
+ CFileItemPtr item(new CFileItem);
+ GetFileItemFromDataset(record, item.get(), baseUrl);
+ items.Add(item);
+ }
+ // Get song artist credits
+ artistCredits.push_back(GetArtistCreditFromDataset(record, songArtistOffset));
+
m_pDS->next();
}
+ if (!artistCredits.empty())
+ {
+ //Store artist credits for final song
+ GetFileItemFromArtistCredits(artistCredits, items[items.Size() - 1].get());
+ artistCredits.clear();
+ }
// cleanup
m_pDS->close();
@@ -2451,7 +2559,7 @@ bool CMusicDatabase::CleanupSongsByIds(const std::string &strSongIds)
URIUtils::RemoveSlashAtEnd(strFileName);
}
- if (!CFile::Exists(strFileName))
+ if (!CFile::Exists(strFileName, false))
{ // file no longer exists, so add to deletion list
songsToDelete.push_back(m_pDS->fv("song.idSong").get_asString());
}
@@ -3570,6 +3678,239 @@ bool CMusicDatabase::GetAlbumsByWhere(const std::string &baseDir, const Filter &
return false;
}
+bool CMusicDatabase::GetAlbumsByWhere(const std::string &baseDir, const Filter &filter, VECALBUMS& albums, int& total, const SortDescription &sortDescription /* = SortDescription() */, bool countOnly /* = false */)
+{
+ albums.erase(albums.begin(), albums.end());
+ if (NULL == m_pDB.get()) return false;
+ if (NULL == m_pDS.get()) return false;
+
+ try
+ {
+ total = -1;
+ // Get data from album and album_artist tables to fully populate albums
+ std::string strSQL = "SELECT %s FROM albumview LEFT JOIN albumartistview on albumartistview.idalbum = albumview.idalbum ";
+
+ Filter extFilter = filter;
+ CMusicDbUrl musicUrl;
+ SortDescription sorting = sortDescription;
+ if (!musicUrl.FromString(baseDir) || !GetFilter(musicUrl, extFilter, sorting))
+ return false;
+
+ // if there are extra WHERE conditions we might need access
+ // to songview for these conditions
+ if (extFilter.where.find("songview") != std::string::npos)
+ {
+ extFilter.AppendJoin("JOIN songview ON songview.idAlbum = albumview.idAlbum");
+ extFilter.AppendGroup("albumview.idAlbum");
+ }
+
+ std::string strSQLExtra;
+ if (!BuildSQL(strSQLExtra, extFilter, strSQLExtra))
+ return false;
+
+ // Count and return number of albums that satisfy selection criteria
+ total = (int)strtol(GetSingleValue("SELECT COUNT(1) FROM albumview " + strSQLExtra, m_pDS).c_str(), NULL, 10);
+ if (countOnly)
+ return true;
+
+ // Apply the limiting directly here if there's no special sorting but limiting
+ if (extFilter.limit.empty() &&
+ sortDescription.sortBy == SortByNone &&
+ (sortDescription.limitStart > 0 || sortDescription.limitEnd > 0))
+ {
+ strSQLExtra += DatabaseUtils::BuildLimitClause(sortDescription.limitEnd, sortDescription.limitStart);
+ albums.reserve(sortDescription.limitEnd - sortDescription.limitStart);
+ }
+ else
+ albums.reserve(total);
+
+ strSQL = PrepareSQL(strSQL, !filter.fields.empty() && filter.fields.compare("*") != 0 ? filter.fields.c_str() : "albumview.*, albumartistview.* ") + strSQLExtra;
+
+ CLog::Log(LOGDEBUG, "%s query: %s", __FUNCTION__, strSQL.c_str());
+ // run query
+ unsigned int time = XbmcThreads::SystemClockMillis();
+ if (!m_pDS->query(strSQL))
+ return false;
+ CLog::Log(LOGDEBUG, "%s - query took %i ms",
+ __FUNCTION__, XbmcThreads::SystemClockMillis() - time); time = XbmcThreads::SystemClockMillis();
+
+ int iRowsFound = m_pDS->num_rows();
+ if (iRowsFound <= 0)
+ {
+ m_pDS->close();
+ return true;
+ }
+
+ //Sort the results set - need to add sort by iOrder to maintain artist name order??
+ DatabaseResults results;
+ results.reserve(iRowsFound);
+ if (!SortUtils::SortFromDataset(sortDescription, MediaTypeAlbum, m_pDS, results))
+ return false;
+
+ // Get albums from returned rows. Join means there is a row for every album artist
+ int albumArtistOffset = album_enumCount;
+ int albumId = -1;
+
+ const dbiplus::query_data &data = m_pDS->get_result_set().records;
+ for (DatabaseResults::const_iterator it = results.begin(); it != results.end(); ++it)
+ {
+ unsigned int targetRow = (unsigned int)it->at(FieldRow).asInteger();
+ const dbiplus::sql_record* const record = data.at(targetRow);
+
+ if (albumId != record->at(album_idAlbum).get_asInt())
+ { // New album
+ albumId = record->at(album_idAlbum).get_asInt();
+ albums.push_back(GetAlbumFromDataset(record));
+ }
+ // Get album artist credits
+ albums.back().artistCredits.push_back(GetArtistCreditFromDataset(record, albumArtistOffset));
+ }
+
+ m_pDS->close(); // cleanup recordset data
+ return true;
+ }
+ catch (...)
+ {
+ m_pDS->close();
+ CLog::Log(LOGERROR, "%s (%s) failed", __FUNCTION__, filter.where.c_str());
+ }
+ return false;
+}
+
+bool CMusicDatabase::GetSongsFullByWhere(const std::string &baseDir, const Filter &filter, CFileItemList &items, const SortDescription &sortDescription /* = SortDescription() */, bool artistData /* = false*/)
+{
+ if (m_pDB.get() == NULL || m_pDS.get() == NULL)
+ return false;
+
+ try
+ {
+ unsigned int time = XbmcThreads::SystemClockMillis();
+ int total = -1;
+
+ std::string strSQL = "SELECT %s FROM songview ";
+ if (artistData) // Get data from song and song_artist tables to fully populate songs with artists
+ strSQL = "SELECT %s FROM songview JOIN songartistview on songartistview.idsong = songview.idsong ";
+
+ Filter extFilter = filter;
+ CMusicDbUrl musicUrl;
+ SortDescription sorting = sortDescription;
+ if (!musicUrl.FromString(baseDir) || !GetFilter(musicUrl, extFilter, sorting))
+ return false;
+
+ // if there are extra WHERE conditions we might need access
+ // to songview for these conditions
+ if (extFilter.where.find("albumview") != std::string::npos)
+ {
+ extFilter.AppendJoin("JOIN albumview ON albumview.idAlbum = songview.idAlbum");
+ extFilter.AppendGroup("songview.idSong");
+ }
+
+ std::string strSQLExtra;
+ if (!BuildSQL(strSQLExtra, extFilter, strSQLExtra))
+ return false;
+
+ // Count number of songs that satisfy selection criteria
+ total = (int)strtol(GetSingleValue("SELECT COUNT(1) FROM songview " + strSQLExtra, m_pDS).c_str(), NULL, 10);
+
+ // Apply the limiting directly here if there's no special sorting but limiting
+ if (extFilter.limit.empty() &&
+ sortDescription.sortBy == SortByNone &&
+ (sortDescription.limitStart > 0 || sortDescription.limitEnd > 0))
+ strSQLExtra += DatabaseUtils::BuildLimitClause(sortDescription.limitEnd, sortDescription.limitStart);
+
+ if (artistData)
+ strSQL = PrepareSQL(strSQL, !filter.fields.empty() && filter.fields.compare("*") != 0 ? filter.fields.c_str() : "songview.*, songartistview.* ") + strSQLExtra;
+ else
+ strSQL = PrepareSQL(strSQL, !filter.fields.empty() && filter.fields.compare("*") != 0 ? filter.fields.c_str() : "songview.* ") + strSQLExtra;
+
+ CLog::Log(LOGDEBUG, "%s query = %s", __FUNCTION__, strSQL.c_str());
+ // run query
+ if (!m_pDS->query(strSQL))
+ return false;
+
+ int iRowsFound = m_pDS->num_rows();
+ if (iRowsFound == 0)
+ {
+ m_pDS->close();
+ return true;
+ }
+
+ // Store the total number of songs as a property
+ items.SetProperty("total", total);
+
+ DatabaseResults results;
+ results.reserve(iRowsFound);
+ if (!SortUtils::SortFromDataset(sortDescription, MediaTypeSong, m_pDS, results))
+ return false;
+
+ // Get songs from returned rows. If join songartistview then there is a row for every album artist
+ items.Reserve(total);
+ int songArtistOffset = song_enumCount;
+ int songId = -1;
+ VECARTISTCREDITS artistCredits;
+ const dbiplus::query_data &data = m_pDS->get_result_set().records;
+ int count = 0;
+ for (DatabaseResults::const_iterator it = results.begin(); it != results.end(); ++it)
+ {
+ unsigned int targetRow = (unsigned int)it->at(FieldRow).asInteger();
+ const dbiplus::sql_record* const record = data.at(targetRow);
+
+ try
+ {
+ if (songId != record->at(song_idSong).get_asInt())
+ { //New song
+ if (songId > 0 && !artistCredits.empty())
+ {
+ //Store artist credits for previous song
+ GetFileItemFromArtistCredits(artistCredits, items[items.Size()-1].get());
+ artistCredits.clear();
+ }
+ songId = record->at(song_idSong).get_asInt();
+ CFileItemPtr item(new CFileItem);
+ GetFileItemFromDataset(record, item.get(), musicUrl);
+ // HACK for sorting by database returned order
+ item->m_iprogramCount = ++count;
+ items.Add(item);
+ }
+ // Get song artist credits
+ if (artistData)
+ artistCredits.push_back(GetArtistCreditFromDataset(record, songArtistOffset));
+ }
+ catch (...)
+ {
+ m_pDS->close();
+ CLog::Log(LOGERROR, "%s: out of memory loading query: %s", __FUNCTION__, filter.where.c_str());
+ return (items.Size() > 0);
+ }
+
+
+ }
+ if (!artistCredits.empty())
+ {
+ //Store artist credits for final song
+ GetFileItemFromArtistCredits(artistCredits, items[items.Size() - 1].get());
+ artistCredits.clear();
+ }
+ // cleanup
+ m_pDS->close();
+
+ // Load some info from embedded cuesheet if present (now only ReplayGain)
+ CueInfoLoader cueLoader;
+ for (int i = 0; i < items.Size(); ++i)
+ cueLoader.Load(LoadCuesheet(items[i]->GetMusicInfoTag()->GetURL()), items[i]);
+
+ CLog::Log(LOGDEBUG, "%s(%s) - took %d ms", __FUNCTION__, filter.where.c_str(), XbmcThreads::SystemClockMillis() - time);
+ return true;
+ }
+ catch (...)
+ {
+ // cleanup
+ m_pDS->close();
+ CLog::Log(LOGERROR, "%s(%s) failed", __FUNCTION__, filter.where.c_str());
+ }
+ return false;
+}
+
bool CMusicDatabase::GetSongsByWhere(const std::string &baseDir, const Filter &filter, CFileItemList &items, const SortDescription &sortDescription /* = SortDescription() */)
{
if (m_pDB.get() == NULL || m_pDS.get() == NULL)
@@ -3845,7 +4186,6 @@ void CMusicDatabase::UpdateTables(int version)
if (version < 48)
{ // null out columns that are no longer used
m_pDS->exec("UPDATE song SET dwFileNameCRC=NULL, idThumb=NULL");
- m_pDS->exec("UPDATE karaokedata SET strKaraLyrFileCRC=NULL");
m_pDS->exec("UPDATE album SET idThumb=NULL");
}
if (version < 49)
@@ -3934,11 +4274,15 @@ void CMusicDatabase::UpdateTables(int version)
m_pDS->exec("DROP TABLE album");
m_pDS->exec("ALTER TABLE album_new RENAME TO album");
}
+ if (version < 55)
+ {
+ m_pDS->exec("DROP TABLE karaokedata");
+ }
}
int CMusicDatabase::GetSchemaVersion() const
{
- return 55;
+ return 56;
}
unsigned int CMusicDatabase::GetSongIDs(const Filter &filter, std::vector<std::pair<int,int> > &songIDs)
@@ -4963,7 +5307,7 @@ void CMusicDatabase::ImportFromXML(const std::string &xmlFile)
CAlbum importedAlbum;
importedAlbum.Load(entry);
strTitle = importedAlbum.strAlbum;
- int idAlbum = GetAlbumByName(importedAlbum.strAlbum, importedAlbum.GetAlbumArtist());
+ int idAlbum = GetAlbumByName(importedAlbum.strAlbum, importedAlbum.GetAlbumArtistString());
if (idAlbum > -1)
{
CAlbum album;
@@ -5001,358 +5345,6 @@ void CMusicDatabase::ImportFromXML(const std::string &xmlFile)
progress->Close();
}
-void CMusicDatabase::AddKaraokeData(int idSong, int iKaraokeNumber)
-{
- try
- {
- std::string strSQL;
-
- // If song.iKaraokeNumber is non-zero, we already have it in the database. Just replace the song ID.
- if (iKaraokeNumber > 0)
- {
- std::string strSQL = PrepareSQL("UPDATE karaokedata SET idSong=%i WHERE iKaraNumber=%i", idSong, iKaraokeNumber);
- m_pDS->exec(strSQL);
- return;
- }
-
- // Get the maximum number allocated
- strSQL=PrepareSQL( "SELECT MAX(iKaraNumber) FROM karaokedata" );
- if (!m_pDS->query(strSQL)) return;
-
- int iKaraokeNumber = g_advancedSettings.m_karaokeStartIndex;
-
- if ( m_pDS->num_rows() == 1 )
- iKaraokeNumber = m_pDS->fv("MAX(iKaraNumber)").get_asInt() + 1;
-
- // Add the data
- strSQL=PrepareSQL( "INSERT INTO karaokedata (iKaraNumber, idSong, iKaraDelay, strKaraEncoding, strKaralyrics) "
- "VALUES( %i, %i, 0, NULL, NULL)", iKaraokeNumber, idSong );
-
- m_pDS->exec(strSQL);
- }
- catch (...)
- {
- CLog::Log(LOGERROR, "%s -(%i, %i) failed", __FUNCTION__, idSong, iKaraokeNumber);
- }
-}
-
-bool CMusicDatabase::GetSongByKaraokeNumber(int number, CSong & song)
-{
- try
- {
- // Get info from karaoke db
- if (NULL == m_pDB.get()) return false;
- if (NULL == m_pDS.get()) return false;
-
- std::string strSQL=PrepareSQL("SELECT * FROM karaokedata where iKaraNumber=%ld", number);
-
- if (!m_pDS->query(strSQL)) return false;
- if (m_pDS->num_rows() == 0)
- {
- m_pDS->close();
- return false;
- }
-
- int idSong = m_pDS->fv("karaokedata.idSong").get_asInt();
- m_pDS->close();
-
- return GetSong( idSong, song );
- }
- catch (...)
- {
- CLog::Log(LOGERROR, "%s(%i) failed", __FUNCTION__, number);
- }
-
- return false;
-}
-
-void CMusicDatabase::ExportKaraokeInfo(const std::string & outFile, bool asHTML)
-{
- try
- {
- if (NULL == m_pDB.get()) return;
- if (NULL == m_pDS.get()) return;
-
- // find all karaoke songs
- std::string sql = "SELECT * FROM songview WHERE iKaraNumber > 0 ORDER BY strFileName";
-
- m_pDS->query(sql);
-
- int total = m_pDS->num_rows();
- int current = 0;
-
- if ( total == 0 )
- {
- m_pDS->close();
- return;
- }
-
- // Write the document
- XFILE::CFile file;
-
- if ( !file.OpenForWrite( outFile, true ) )
- return;
-
- CGUIDialogProgress *progress = (CGUIDialogProgress *)g_windowManager.GetWindow(WINDOW_DIALOG_PROGRESS);
- if (progress)
- {
- progress->SetHeading(CVariant{asHTML ? 22034 : 22035});
- progress->SetLine(0, CVariant{650});
- progress->SetLine(1, CVariant{""});
- progress->SetLine(2, CVariant{""});
- progress->SetPercentage(0);
- progress->Open();
- progress->ShowProgressBar(true);
- }
-
- std::string outdoc;
- if ( asHTML )
- {
- outdoc = "<html><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\"></meta></head>\n"
- "<body>\n<table>\n";
-
- if (file.Write(outdoc.c_str(), outdoc.size()) != static_cast<ssize_t>(outdoc.size()))
- return; // error
- }
-
- while (!m_pDS->eof())
- {
- CSong song = GetSongFromDataset();
- std::string songnum = StringUtils::Format("%06ld", song.iKaraokeNumber);
-
- if ( asHTML )
- outdoc = "<tr><td>" + songnum + "</td><td>" + song.GetArtistString() + "</td><td>" + song.strTitle + "</td></tr>\r\n";
- else
- outdoc = songnum + '\t' + song.GetArtistString() + '\t' + song.strTitle + '\t' + song.strFileName + "\r\n";
-
- if (file.Write(outdoc.c_str(), outdoc.size()) != static_cast<ssize_t>(outdoc.size()))
- return; // error
-
- if ((current % 50) == 0 && progress)
- {
- progress->SetPercentage(current * 100 / total);
- progress->Progress();
- if (progress->IsCanceled())
- {
- progress->Close();
- m_pDS->close();
- return;
- }
- }
- m_pDS->next();
- current++;
- }
-
- m_pDS->close();
-
- if ( asHTML )
- {
- outdoc = "</table>\n</body>\n</html>\n";
- if (file.Write(outdoc.c_str(), outdoc.size()) != static_cast<ssize_t>(outdoc.size()))
- return; // error
- }
-
- file.Close();
-
- if (progress)
- progress->Close();
- }
- catch (...)
- {
- CLog::Log(LOGERROR, "%s failed", __FUNCTION__);
- }
-}
-
-void CMusicDatabase::ImportKaraokeInfo(const std::string & inputFile)
-{
- CGUIDialogProgress *progress = (CGUIDialogProgress *)g_windowManager.GetWindow(WINDOW_DIALOG_PROGRESS);
-
- try
- {
- if (NULL == m_pDB.get()) return;
-
- XFILE::CFile file;
- XFILE::auto_buffer buf;
-
- if (file.LoadFile(inputFile, buf) <= 0)
- {
- CLog::Log(LOGERROR, "%s: Cannot read karaoke import file \"%s\"", __FUNCTION__, inputFile.c_str());
- return;
- }
-
- // Null-terminate content
- buf.resize(buf.size() + 1);
- buf.get()[buf.size() - 1] = 0;
-
- file.Close();
-
- if (progress)
- {
- progress->SetHeading(CVariant{22036});
- progress->SetLine(0, CVariant{649});
- progress->SetLine(1, CVariant{""});
- progress->SetLine(2, CVariant{""});
- progress->SetPercentage(0);
- progress->Open();
- progress->ShowProgressBar(true);
- }
-
- if (NULL == m_pDS.get()) return;
- BeginTransaction();
-
- //
- // A simple state machine to parse the file
- //
- char * linestart = buf.get();
- unsigned int offset = 0, lastpercentage = 0;
-
- for (char * p = buf.get(); *p; p++, offset++)
- {
- // Skip \r
- if ( *p == 0x0D )
- {
- *p = '\0';
- continue;
- }
-
- // Line number
- if ( *p == 0x0A )
- {
- *p = '\0';
-
- unsigned int tabs = 0;
- char * songpath, *artist = 0, *title = 0;
- for ( songpath = linestart; *songpath; songpath++ )
- {
- if ( *songpath == '\t' )
- {
- tabs++;
- *songpath = '\0';
-
- switch( tabs )
- {
- case 1: // the number end
- artist = songpath + 1;
- break;
-
- case 2: // the artist end
- title = songpath + 1;
- break;
-
- case 3: // the title end
- break;
- }
- }
- }
-
- int num = atoi( linestart );
- if ( num <= 0 || tabs < 3 || *artist == '\0' || *title == '\0' )
- {
- CLog::Log( LOGERROR, "Karaoke import: error in line %s", linestart );
- linestart = p + 1;
- continue;
- }
-
- linestart = p + 1;
- std::string strSQL=PrepareSQL("select idSong from songview "
- "where strArtists like '%s' and strTitle like '%s'", artist, title );
-
- if ( !m_pDS->query(strSQL) )
- {
- RollbackTransaction();
- if (progress)
- progress->Close();
- m_pDS->close();
- return;
- }
-
- int iRowsFound = m_pDS->num_rows();
- if (iRowsFound == 0)
- {
- CLog::Log( LOGERROR, "Karaoke import: song %s by %s #%d is not found in the database, skipped",
- title, artist, num );
- continue;
- }
-
- int lResult = m_pDS->fv(0).get_asInt();
- strSQL = PrepareSQL("UPDATE karaokedata SET iKaraNumber=%i WHERE idSong=%i", num, lResult );
- m_pDS->exec(strSQL);
-
- if ( progress && (offset * 100 / buf.size()) != lastpercentage )
- {
- lastpercentage = offset * 100 / buf.size();
- progress->SetPercentage( lastpercentage);
- progress->Progress();
- if ( progress->IsCanceled() )
- {
- RollbackTransaction();
- progress->Close();
- m_pDS->close();
- return;
- }
- }
- }
- }
-
- CommitTransaction();
- CLog::Log( LOGNOTICE, "Karaoke import: file '%s' was imported successfully", inputFile.c_str() );
- }
- catch (...)
- {
- CLog::Log(LOGERROR, "%s failed", __FUNCTION__);
- RollbackTransaction();
- }
-
- if (progress)
- progress->Close();
-}
-
-bool CMusicDatabase::SetKaraokeSongDelay(int idSong, int delay)
-{
- try
- {
- if (NULL == m_pDB.get()) return false;
- if (NULL == m_pDS.get()) return false;
-
- std::string strSQL = PrepareSQL("UPDATE karaokedata SET iKaraDelay=%i WHERE idSong=%i", delay, idSong);
- m_pDS->exec(strSQL);
-
- return true;
- }
- catch (...)
- {
- CLog::Log(LOGERROR, "%s failed", __FUNCTION__);
- }
-
- return false;
-}
-
-int CMusicDatabase::GetKaraokeSongsCount()
-{
- try
- {
- if (NULL == m_pDB.get()) return 0;
- if (NULL == m_pDS.get()) return 0;
-
- if (!m_pDS->query( "select count(idSong) as NumSongs from karaokedata")) return 0;
- if (m_pDS->num_rows() == 0)
- {
- m_pDS->close();
- return 0;
- }
-
- int iNumSongs = m_pDS->fv("NumSongs").get_asInt();
- // cleanup
- m_pDS->close();
- return iNumSongs;
- }
- catch (...)
- {
- CLog::Log(LOGERROR, "%s failed", __FUNCTION__);
- }
- return 0;
-}
-
void CMusicDatabase::SetPropertiesFromArtist(CFileItem& item, const CArtist& artist)
{
item.SetProperty("artist_instrument", StringUtils::Join(artist.instruments, g_advancedSettings.m_musicItemSeparator));
@@ -5407,7 +5399,7 @@ void CMusicDatabase::SetPropertiesForFileItem(CFileItem& item)
int idAlbum = item.GetMusicInfoTag()->GetAlbumId();
if (idAlbum <= 0)
idAlbum = GetAlbumByName(item.GetMusicInfoTag()->GetAlbum(),
- item.GetMusicInfoTag()->GetArtist());
+ item.GetMusicInfoTag()->GetArtistString());
if (idAlbum > -1)
{
CAlbum album;
diff --git a/xbmc/music/MusicDatabase.h b/xbmc/music/MusicDatabase.h
index 0925dd216b..0d1cfdf711 100644
--- a/xbmc/music/MusicDatabase.h
+++ b/xbmc/music/MusicDatabase.h
@@ -125,7 +125,6 @@ public:
\param iEndOffset [in] the end offset of the song (when using a single audio file with .cue)
\param dtLastPlayed [in] the time the song was last played
\param rating [in] a rating for the song
- \param iKaraokeNumber [in] the karaoke id of the song
\return the id of the song
*/
int AddSong(const int idAlbum,
@@ -138,8 +137,7 @@ public:
const std::string &artistString, const std::vector<std::string>& genres,
int iTrack, int iDuration, int iYear,
const int iTimesPlayed, int iStartOffset, int iEndOffset,
- const CDateTime& dtLastPlayed,
- char rating, int iKaraokeNumber);
+ const CDateTime& dtLastPlayed, char rating);
bool GetSong(int idSong, CSong& song);
/*! \brief Update a song in the database.
@@ -173,7 +171,6 @@ public:
\param iEndOffset [in] the end offset of the song (when using a single audio file with .cue)
\param dtLastPlayed [in] the time the song was last played
\param rating [in] a rating for the song
- \param iKaraokeNumber [in] the karaoke id of the song
\return the id of the song
*/
int UpdateSong(int idSong,
@@ -183,8 +180,7 @@ public:
const std::string& artistString, const std::vector<std::string>& genres,
int iTrack, int iDuration, int iYear,
int iTimesPlayed, int iStartOffset, int iEndOffset,
- const CDateTime& dtLastPlayed,
- char rating, int iKaraokeNumber);
+ const CDateTime& dtLastPlayed, char rating);
//// Misc Song
bool GetSongByFileName(const std::string& strFileName, CSong& song, int startOffset = 0);
@@ -297,7 +293,7 @@ public:
/////////////////////////////////////////////////
bool AddAlbumArtist(int idArtist, int idAlbum, std::string strArtist, std::string joinPhrase, bool featured, int iOrder);
bool GetAlbumsByArtist(int idArtist, bool includeFeatured, std::vector<int>& albums);
- bool GetArtistsByAlbum(int idAlbum, bool includeFeatured, std::vector<int>& artists);
+ bool GetArtistsByAlbum(int idAlbum, CFileItem* item);
bool DeleteAlbumArtistsByAlbum(int idAlbum);
bool AddSongArtist(int idArtist, int idSong, std::string strArtist, std::string joinPhrase, bool featured, int iOrder);
@@ -358,7 +354,9 @@ public:
bool GetSongsNav(const std::string& strBaseDir, CFileItemList& items, int idGenre, int idArtist,int idAlbum, const SortDescription &sortDescription = SortDescription());
bool GetSongsByYear(const std::string& baseDir, CFileItemList& items, int year);
bool GetSongsByWhere(const std::string &baseDir, const Filter &filter, CFileItemList& items, const SortDescription &sortDescription = SortDescription());
+ bool GetSongsFullByWhere(const std::string &baseDir, const Filter &filter, CFileItemList& items, const SortDescription &sortDescription = SortDescription(), bool artistData = false);
bool GetAlbumsByWhere(const std::string &baseDir, const Filter &filter, CFileItemList &items, const SortDescription &sortDescription = SortDescription(), bool countOnly = false);
+ bool GetAlbumsByWhere(const std::string &baseDir, const Filter &filter, VECALBUMS& albums, int& total, const SortDescription &sortDescription = SortDescription(), bool countOnly = false);
bool GetArtistsByWhere(const std::string& strBaseDir, const Filter &filter, CFileItemList& items, const SortDescription &sortDescription = SortDescription(), bool countOnly = false);
bool GetRandomSong(CFileItem* item, int& idSong, const Filter &filter);
int GetSongsCount(const Filter &filter = Filter());
@@ -378,16 +376,6 @@ public:
bool ScraperInUse(const std::string &scraperID) const;
/////////////////////////////////////////////////
- // Karaoke
- /////////////////////////////////////////////////
- void AddKaraokeData(int idSong, int iKaraokeNumber);
- bool GetSongByKaraokeNumber( int number, CSong& song );
- bool SetKaraokeSongDelay( int idSong, int delay );
- int GetKaraokeSongsCount();
- void ExportKaraokeInfo(const std::string &outFile, bool asHTML );
- void ImportKaraokeInfo(const std::string &inputFile );
-
- /////////////////////////////////////////////////
// Filters
/////////////////////////////////////////////////
bool GetItems(const std::string &strBaseDir, CFileItemList &items, const Filter &filter = Filter(), const SortDescription &sortDescription = SortDescription());
@@ -507,6 +495,7 @@ private:
void UpdateFileDateAdded(int songId, const std::string& strFileNameAndPath);
void GetFileItemFromDataset(CFileItem* item, const CMusicDbUrl &baseUrl);
void GetFileItemFromDataset(const dbiplus::sql_record* const record, CFileItem* item, const CMusicDbUrl &baseUrl);
+ void GetFileItemFromArtistCredits(VECARTISTCREDITS& artistCredits, CFileItem* item);
CSong GetAlbumInfoSongFromDataset(const dbiplus::sql_record* const record, int offset = 0);
bool CleanupSongs();
bool CleanupSongsByIds(const std::string &strSongIds);
@@ -522,7 +511,7 @@ private:
// Fields should be ordered as they
// appear in the songview
- enum _SongFields
+ static enum _SongFields
{
song_idSong=0,
song_strArtists,
@@ -542,9 +531,6 @@ private:
song_idAlbum,
song_strAlbum,
song_strPath,
- song_iKarNumber,
- song_iKarDelay,
- song_strKarEncoding,
song_bCompilation,
song_strAlbumArtists,
song_strAlbumReleaseType,
@@ -555,7 +541,7 @@ private:
// Fields should be ordered as they
// appear in the albumview
- enum _AlbumFields
+ static enum _AlbumFields
{
album_idAlbum=0,
album_strAlbum,
@@ -579,7 +565,7 @@ private:
album_enumCount // end of the enum, do not add past here
} AlbumFields;
- enum _ArtistCreditFields
+ static enum _ArtistCreditFields
{
// used for GetAlbum to get the cascaded album/song artist credits
artistCredit_idEntity = 0, // can be idSong or idAlbum depending on context
@@ -592,7 +578,7 @@ private:
artistCredit_enumCount
} ArtistCreditFields;
- enum _ArtistFields
+ static enum _ArtistFields
{
artist_idArtist=0,
artist_strArtist,
@@ -613,7 +599,7 @@ private:
artist_enumCount // end of the enum, do not add past here
} ArtistFields;
- enum _AlbumInfoSongFields
+ static enum _AlbumInfoSongFields
{
albumInfoSong_idAlbumInfoSong=0,
albumInfoSong_idAlbumInfo,
diff --git a/xbmc/music/MusicInfoLoader.cpp b/xbmc/music/MusicInfoLoader.cpp
index 2ebe3c5e13..a6a9e893aa 100644
--- a/xbmc/music/MusicInfoLoader.cpp
+++ b/xbmc/music/MusicInfoLoader.cpp
@@ -38,7 +38,10 @@ using namespace XFILE;
using namespace MUSIC_INFO;
// HACK until we make this threadable - specify 1 thread only for now
-CMusicInfoLoader::CMusicInfoLoader() : CBackgroundInfoLoader()
+CMusicInfoLoader::CMusicInfoLoader()
+ : CBackgroundInfoLoader()
+ , m_databaseHits{0}
+ , m_tagReads{0}
{
m_mapFileItems = new CFileItemList;
diff --git a/xbmc/music/Song.cpp b/xbmc/music/Song.cpp
index c03ae91a83..01ea30accb 100644
--- a/xbmc/music/Song.cpp
+++ b/xbmc/music/Song.cpp
@@ -87,8 +87,6 @@ CSong::CSong(CFileItem& item)
iEndOffset = item.m_lEndOffset;
idSong = -1;
iTimesPlayed = 0;
- iKaraokeNumber = 0;
- iKaraokeDelay = 0; //! Karaoke song lyrics-music delay in 1/10 seconds.
idAlbum = -1;
}
@@ -128,7 +126,6 @@ void CSong::Serialize(CVariant& value) const
value["timesplayed"] = iTimesPlayed;
value["lastplayed"] = lastPlayed.IsValid() ? lastPlayed.GetAsDBDateTime() : "";
value["dateadded"] = dateAdded.IsValid() ? dateAdded.GetAsDBDateTime() : "";
- value["karaokenumber"] = (int64_t) iKaraokeNumber;
value["albumid"] = idAlbum;
}
@@ -153,9 +150,6 @@ void CSong::Clear()
iTimesPlayed = 0;
lastPlayed.Reset();
dateAdded.Reset();
- iKaraokeNumber = 0;
- strKaraokeLyrEncoding.clear();
- iKaraokeDelay = 0;
idAlbum = -1;
bCompilation = false;
embeddedArt.clear();
@@ -168,11 +162,6 @@ const std::vector<std::string> CSong::GetArtist() const
{
songartists.push_back(artistCredit->GetArtist());
}
- //When artist credits have not been populated attempt to build an artist vector from the descrpition string
- //This is a tempory fix, in the longer term other areas should query the song_artist table and populate
- //artist credits. Note that splitting the string may not give the same artists as held in the song_artist table
- if (songartists.empty() && !strArtistDesc.empty())
- songartists = StringUtils::Split(strArtistDesc, g_advancedSettings.m_musicItemSeparator);
return songartists;
}
@@ -199,6 +188,15 @@ const std::string CSong::GetArtistString() const
return artistString;
}
+const std::vector<int> CSong::GetArtistIDArray() const
+{
+ // Get song artist IDs for json rpc
+ std::vector<int> artistids;
+ for (VECARTISTCREDITS::const_iterator artistCredit = artistCredits.begin(); artistCredit != artistCredits.end(); ++artistCredit)
+ artistids.push_back(artistCredit->GetArtistId());
+ return artistids;
+}
+
bool CSong::HasArt() const
{
if (!strThumb.empty()) return true;
diff --git a/xbmc/music/Song.h b/xbmc/music/Song.h
index 2c6d7f1d02..5caf404ee0 100644
--- a/xbmc/music/Song.h
+++ b/xbmc/music/Song.h
@@ -88,6 +88,11 @@ public:
*/
const std::string GetArtistString() const;
+ /*! \brief Get song artist IDs (for json rpc) from the vector of artistcredits objects
+ \return album artist IDs as a vector of integers
+ */
+ const std::vector<int> GetArtistIDArray() const;
+
/*! \brief Get album artist names associated with song from tag data
Note for initial album processing only, normalised album artist data belongs to album
and is stored in album artist credits
@@ -143,10 +148,6 @@ public:
int iEndOffset;
bool bCompilation;
- // Karaoke-specific information
- long iKaraokeNumber; //! Karaoke song number to "select by number". 0 for non-karaoke
- std::string strKaraokeLyrEncoding; //! Karaoke song lyrics encoding if known. Empty if unknown.
- int iKaraokeDelay; //! Karaoke song lyrics-music delay in 1/10 seconds.
ReplayGain replayGain;
private:
diff --git a/xbmc/music/infoscanner/MusicInfoScanner.cpp b/xbmc/music/infoscanner/MusicInfoScanner.cpp
index 78b8ee1aa7..9d541d5007 100644
--- a/xbmc/music/infoscanner/MusicInfoScanner.cpp
+++ b/xbmc/music/infoscanner/MusicInfoScanner.cpp
@@ -587,7 +587,6 @@ void CMusicInfoScanner::FileItemsToAlbums(CFileItemList& items, VECALBUMS& album
{
song.iTimesPlayed = it->second.iTimesPlayed;
song.lastPlayed = it->second.lastPlayed;
- song.iKaraokeNumber = it->second.iKaraokeNumber;
if (song.rating == '0') song.rating = it->second.rating;
if (song.strThumb.empty()) song.strThumb = it->second.strThumb;
}
diff --git a/xbmc/music/karaoke/GUIDialogKaraokeSongSelector.cpp b/xbmc/music/karaoke/GUIDialogKaraokeSongSelector.cpp
deleted file mode 100644
index 1554c4ddd8..0000000000
--- a/xbmc/music/karaoke/GUIDialogKaraokeSongSelector.cpp
+++ /dev/null
@@ -1,270 +0,0 @@
-/*
- * Copyright (C) 2005-2013 Team XBMC
- * http://xbmc.org
- *
- * This Program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2, or (at your option)
- * any later version.
- *
- * This Program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with XBMC; see the file COPYING. If not, see
- * <http://www.gnu.org/licenses/>.
- *
- */
-
-#include "GUIDialogKaraokeSongSelector.h"
-#include "PlayListPlayer.h"
-#include "playlists/PlayList.h"
-#include "input/Key.h"
-#include "guilib/LocalizeStrings.h"
-#include "utils/log.h"
-#include "utils/StringUtils.h"
-
-#define CONTROL_LABEL_SONGNUMBER 401
-#define CONTROL_LABEL_SONGNAME 402
-
-static const unsigned int MAX_SONG_ID = 100000;
-
-
-CGUIDialogKaraokeSongSelector::CGUIDialogKaraokeSongSelector( int id, const char *xmlFile )
- : CGUIDialog( id, xmlFile )
-{
- m_selectedNumber = 0;
- m_songSelected = false;
- m_updateData = false;
-}
-
-CGUIDialogKaraokeSongSelector::~CGUIDialogKaraokeSongSelector(void)
-{
-}
-
-void CGUIDialogKaraokeSongSelector::OnButtonNumeric( unsigned int code, bool reset_autotimer )
-{
-
- // Add the number
- m_selectedNumber = m_selectedNumber * 10 + code;
- CLog::Log( LOGDEBUG, "CGUIDialogKaraokeSongSelector::OnButtonNumeric %d / %d" , code, m_selectedNumber);
-
- // If overflow (a typical way to delete the old number is add zeros), handle it
- if ( m_selectedNumber >= MAX_SONG_ID )
- m_selectedNumber %= MAX_SONG_ID;
-
- // Reset activity timer
- if ( reset_autotimer )
- SetAutoClose( m_autoCloseTimeout );
-
- m_updateData = true;
-}
-
-void CGUIDialogKaraokeSongSelector::OnButtonSelect()
-{
- // We only handle "select" if a song is selected
- if ( m_songSelected )
- {
- std::string path = m_karaokeSong.strFileName;
- CFileItemPtr pItem( new CFileItem( path, false) );
- m_songSelected = false;
-
- if ( m_startPlaying )
- {
- g_playlistPlayer.ClearPlaylist(PLAYLIST_MUSIC);
- g_playlistPlayer.SetRepeat( PLAYLIST_MUSIC, PLAYLIST::REPEAT_NONE );
- g_playlistPlayer.SetShuffle(PLAYLIST_MUSIC, false );
- g_playlistPlayer.Add( PLAYLIST_MUSIC, pItem );
- g_playlistPlayer.SetCurrentPlaylist(PLAYLIST_MUSIC);
- g_playlistPlayer.Play();
-
- CLog::Log(LOGDEBUG, "Karaoke song selector: playing song %s [%d]", path.c_str(), m_selectedNumber);
- }
- else
- {
- g_playlistPlayer.Add( PLAYLIST_MUSIC, pItem );
- CLog::Log(LOGDEBUG, "Karaoke song selector: adding song %s [%d]", path.c_str(), m_selectedNumber);
- }
-
- Close();
- }
-}
-
-int CGUIDialogKaraokeSongSelector::GetKeyNumber( int actionid )
-{
- switch( actionid )
- {
- case REMOTE_0:
- return 0;
-
- case REMOTE_1:
- return 1;
-
- case REMOTE_2:
- case ACTION_JUMP_SMS2:
- return 2;
-
- case REMOTE_3:
- case ACTION_JUMP_SMS3:
- return 3;
-
- case REMOTE_4:
- case ACTION_JUMP_SMS4:
- return 4;
-
- case REMOTE_5:
- case ACTION_JUMP_SMS5:
- return 5;
-
- case REMOTE_6:
- case ACTION_JUMP_SMS6:
- return 6;
-
- case REMOTE_7:
- case ACTION_JUMP_SMS7:
- return 7;
-
- case REMOTE_8:
- case ACTION_JUMP_SMS8:
- return 8;
-
- case REMOTE_9:
- case ACTION_JUMP_SMS9:
- return 9;
- }
-
- return -1;
-}
-
-bool CGUIDialogKaraokeSongSelector::OnAction(const CAction & action)
-{
- CLog::Log( LOGDEBUG, "CGUIDialogKaraokeSongSelector::OnAction %d" , action.GetID());
-
- if ( GetKeyNumber( action.GetID() ) != -1 )
- {
- OnButtonNumeric( GetKeyNumber( action.GetID() ) );
- return true;
- }
-
- switch(action.GetID())
- {
- case ACTION_SELECT_ITEM:
- OnButtonSelect();
- break;
-
- case ACTION_DELETE_ITEM:
- case ACTION_BACKSPACE:
- OnBackspace();
- break;
- }
-
- return CGUIDialog::OnAction( action );
-}
-
-void CGUIDialogKaraokeSongSelector::UpdateData()
-{
- if ( m_updateData )
- {
- // Update on-screen labels
- std::string message = StringUtils::Format("%06d", m_selectedNumber);
- message = g_localizeStrings.Get(179) + ": " + message; // Translated "Song"
-
- SET_CONTROL_LABEL(CONTROL_LABEL_SONGNUMBER, message);
-
- // Now try to find this song in the database
- m_songSelected = m_musicdatabase.GetSongByKaraokeNumber( m_selectedNumber, m_karaokeSong );
-
- if ( m_songSelected )
- message = m_karaokeSong.strTitle;
- else
- message = "* " + g_localizeStrings.Get(13205) + " *"; // Unknown
-
- SET_CONTROL_LABEL(CONTROL_LABEL_SONGNAME, message);
- }
-
- m_updateData = false;
-}
-
-void CGUIDialogKaraokeSongSelector::FrameMove()
-{
- if ( m_updateData )
- UpdateData();
-
- CGUIDialog::FrameMove();
-}
-
-
-void CGUIDialogKaraokeSongSelector::OnBackspace()
-{
- // Clear the number
- m_selectedNumber /= 10;
-
- // Reset activity timer
- SetAutoClose( m_autoCloseTimeout );
- m_updateData = true;
-}
-
-
-CGUIDialogKaraokeSongSelectorSmall::CGUIDialogKaraokeSongSelectorSmall()
- : CGUIDialogKaraokeSongSelector( WINDOW_DIALOG_KARAOKE_SONGSELECT, "DialogKaraokeSongSelector.xml" )
-{
- m_autoCloseTimeout = 30000; // 30 sec
- m_startPlaying = false;
-}
-
-
-CGUIDialogKaraokeSongSelectorLarge::CGUIDialogKaraokeSongSelectorLarge()
- : CGUIDialogKaraokeSongSelector( WINDOW_DIALOG_KARAOKE_SELECTOR, "DialogKaraokeSongSelectorLarge.xml" )
-{
- m_autoCloseTimeout = 180000; // 180 sec
- m_startPlaying = true;
-}
-
-void CGUIDialogKaraokeSongSelector::OnInitWindow()
-{
- CGUIDialog::OnInitWindow();
-
- // Check if there are any karaoke songs in the database
- if ( !m_musicdatabase.Open() )
- {
- Close();
- return;
- }
-
- if ( m_musicdatabase.GetKaraokeSongsCount() == 0 )
- {
- Close();
- return;
- }
-
- SetAutoClose( m_autoCloseTimeout );
-}
-
-
-void CGUIDialogKaraokeSongSelector::OnDeinitWindow(int nextWindowID)
-{
- CGUIDialog::OnDeinitWindow(nextWindowID);
- m_musicdatabase.Close();
-}
-
-
-void CGUIDialogKaraokeSongSelectorSmall::Open(unsigned int startcode)
-{
- m_songSelected = false;
- m_selectedNumber = 0;
-
- OnButtonNumeric( startcode, false );
- CGUIDialog::Open();
-}
-
-
-void CGUIDialogKaraokeSongSelectorLarge::Open()
-{
- m_songSelected = false;
- m_selectedNumber = 0;
-
- OnButtonNumeric( 0, false );
- CGUIDialog::Open();
-}
diff --git a/xbmc/music/karaoke/GUIDialogKaraokeSongSelector.h b/xbmc/music/karaoke/GUIDialogKaraokeSongSelector.h
deleted file mode 100644
index 487ccff001..0000000000
--- a/xbmc/music/karaoke/GUIDialogKaraokeSongSelector.h
+++ /dev/null
@@ -1,87 +0,0 @@
-#pragma once
-
-/*
- * Copyright (C) 2005-2013 Team XBMC
- * http://xbmc.org
- *
- * This Program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2, or (at your option)
- * any later version.
- *
- * This Program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with XBMC; see the file COPYING. If not, see
- * <http://www.gnu.org/licenses/>.
- *
- */
-
-#include "guilib/GUIDialog.h"
-#include "music/MusicDatabase.h"
-#include "music/Song.h"
-
-
-class CGUIDialogKaraokeSongSelector: public CGUIDialog
-{
-public:
- CGUIDialogKaraokeSongSelector( int id, const char *xmlFile );
- virtual ~CGUIDialogKaraokeSongSelector(void);
-
- //! Key/button parser; returns 0-9 for a numeric button action, and -1 for anything else
- static int GetKeyNumber( int actionid );
-
-protected:
- // Those functions control the selection process
- virtual void OnInitWindow();
- virtual void OnDeinitWindow(int nextWindowID);
- virtual bool OnAction(const CAction &action);
- virtual void FrameMove();
-
- void OnButtonNumeric( unsigned int code, bool reset_autotimer = true ); // 0x00 - 0x09
- void OnButtonSelect(); // Song is selected
- void OnBackspace(); // Backspace pressed
- void UpdateData();
-
- // Configuration
- //! Auto-close timeout
- unsigned int m_autoCloseTimeout;
-
- //! Start playing song as soon as it's selected?
- bool m_startPlaying;
-
-protected:
- //! Currently selected number
- unsigned int m_selectedNumber;
-
- //! True if the number above did select some song and the info is in m_karaokeData
- bool m_songSelected;
-
- //! True if we need to update fields before rendering
- bool m_updateData;
-
- //! Database stuff
- CMusicDatabase m_musicdatabase;
- CSong m_karaokeSong;
-};
-
-
-// A 'small' version of dialog using DialogKaraokeSongSelector.xml
-class CGUIDialogKaraokeSongSelectorSmall : public CGUIDialogKaraokeSongSelector
-{
- public:
- CGUIDialogKaraokeSongSelectorSmall();
- void Open(unsigned int startcode);
-};
-
-
-// A 'large' version of dialog using DialogKaraokeSongSelectorLarge.xml
-class CGUIDialogKaraokeSongSelectorLarge : public CGUIDialogKaraokeSongSelector
-{
- public:
- CGUIDialogKaraokeSongSelectorLarge();
- void Open();
-};
diff --git a/xbmc/music/karaoke/GUIWindowKaraokeLyrics.cpp b/xbmc/music/karaoke/GUIWindowKaraokeLyrics.cpp
deleted file mode 100644
index 99456b4b71..0000000000
--- a/xbmc/music/karaoke/GUIWindowKaraokeLyrics.cpp
+++ /dev/null
@@ -1,174 +0,0 @@
-/*
- * Copyright (C) 2005-2013 Team XBMC
- * http://xbmc.org
- *
- * This Program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2, or (at your option)
- * any later version.
- *
- * This Program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with XBMC; see the file COPYING. If not, see
- * <http://www.gnu.org/licenses/>.
- *
- */
-
-#include "Application.h"
-#include "guilib/GUIWindowManager.h"
-#include "input/Key.h"
-#include "settings/AdvancedSettings.h"
-
-#include "GUIDialogKaraokeSongSelector.h"
-#include "GUIWindowKaraokeLyrics.h"
-#include "karaokelyrics.h"
-#include "karaokewindowbackground.h"
-#include "threads/SingleLock.h"
-
-
-CGUIWindowKaraokeLyrics::CGUIWindowKaraokeLyrics(void)
- : CGUIWindow(WINDOW_KARAOKELYRICS, "MusicKaraokeLyrics.xml")
-{
- m_Lyrics = 0;
- m_Background = new CKaraokeWindowBackground();
-}
-
-
-CGUIWindowKaraokeLyrics::~ CGUIWindowKaraokeLyrics(void )
-{
- delete m_Background;
-}
-
-
-bool CGUIWindowKaraokeLyrics::OnAction(const CAction &action)
-{
- CSingleLock lock (m_CritSection);
-
- if ( !m_Lyrics || !g_application.m_pPlayer->IsPlayingAudio() )
- return false;
-
- CGUIDialogKaraokeSongSelectorSmall * songSelector = (CGUIDialogKaraokeSongSelectorSmall *)
- g_windowManager.GetWindow( WINDOW_DIALOG_KARAOKE_SONGSELECT );
-
- switch(action.GetID())
- {
- case ACTION_SUBTITLE_DELAY_MIN:
- m_Lyrics->lyricsDelayDecrease();
- return true;
-
- case ACTION_SUBTITLE_DELAY_PLUS:
- m_Lyrics->lyricsDelayIncrease();
- return true;
-
- default:
- if ( CGUIDialogKaraokeSongSelector::GetKeyNumber( action.GetID() ) != -1 && songSelector && !songSelector->IsActive() )
- songSelector->Open( CGUIDialogKaraokeSongSelector::GetKeyNumber( action.GetID() ) );
-
- break;
- }
-
- // If our background control could handle the action, let it do it
- if ( m_Background && m_Background->OnAction(action) )
- return true;
-
- return CGUIWindow::OnAction(action);
-}
-
-
-bool CGUIWindowKaraokeLyrics::OnMessage(CGUIMessage& message)
-{
- switch ( message.GetMessage() )
- {
- case GUI_MSG_WINDOW_INIT:
- {
- // Must be called here so we get our window ID and controls
- if ( !CGUIWindow::OnMessage(message) )
- return false;
-
- m_Background->Init( this );
- return true;
- }
- break;
-
- case GUI_MSG_WINDOW_DEINIT:
- {
- CSingleLock lock (m_CritSection);
-
- // Close the song selector dialog if shown
- CGUIDialogKaraokeSongSelectorSmall * songSelector = (CGUIDialogKaraokeSongSelectorSmall *)
- g_windowManager.GetWindow( WINDOW_DIALOG_KARAOKE_SONGSELECT );
-
- if ( songSelector && songSelector->IsActive() )
- songSelector->Close();
- }
- break;
- }
-
- return CGUIWindow::OnMessage(message);
-}
-
-void CGUIWindowKaraokeLyrics::Process(unsigned int currentTime, CDirtyRegionList &dirtyregions)
-{
- dirtyregions.push_back(CRect(0.0f, 0.0f, (float)g_graphicsContext.GetWidth(), (float)g_graphicsContext.GetHeight()));
-}
-
-void CGUIWindowKaraokeLyrics::Render()
-{
- g_application.ResetScreenSaver();
- CGUIWindow::Render();
-
- CSingleLock lock (m_CritSection);
-
- if ( m_Lyrics )
- {
- m_Background->Render();
- m_Lyrics->Render();
- }
-}
-
-
-void CGUIWindowKaraokeLyrics::newSong(CKaraokeLyrics * lyrics)
-{
- CSingleLock lock (m_CritSection);
- m_Lyrics = lyrics;
-
- m_Lyrics->InitGraphics();
-
- // Set up current background mode
- if ( m_Lyrics->HasVideo() )
- {
- std::string path;
- int64_t offset;
-
- // Start the required video
- m_Lyrics->GetVideoParameters( path, offset );
- m_Background->StartVideo( path );
- }
- else if ( m_Lyrics->HasBackground() && g_advancedSettings.m_karaokeAlwaysEmptyOnCdgs )
- {
- m_Background->StartEmpty();
- }
- else
- {
- m_Background->StartDefault();
- }
-}
-
-
-void CGUIWindowKaraokeLyrics::stopSong()
-{
- CSingleLock lock (m_CritSection);
- m_Lyrics = 0;
-
- m_Background->Stop();
-}
-
-void CGUIWindowKaraokeLyrics::pauseSong(bool now_paused)
-{
- CSingleLock lock (m_CritSection);
- m_Background->Pause( now_paused );
-}
diff --git a/xbmc/music/karaoke/GUIWindowKaraokeLyrics.h b/xbmc/music/karaoke/GUIWindowKaraokeLyrics.h
deleted file mode 100644
index 434d003e67..0000000000
--- a/xbmc/music/karaoke/GUIWindowKaraokeLyrics.h
+++ /dev/null
@@ -1,53 +0,0 @@
-#pragma once
-
-/*
- * Copyright (C) 2005-2013 Team XBMC
- * http://xbmc.org
- *
- * This Program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2, or (at your option)
- * any later version.
- *
- * This Program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with XBMC; see the file COPYING. If not, see
- * <http://www.gnu.org/licenses/>.
- *
- */
-
-#include "guilib/GUIWindow.h"
-
-class CKaraokeLyrics;
-class CKaraokeWindowBackground;
-
-
-class CGUIWindowKaraokeLyrics : public CGUIWindow
-{
-public:
- CGUIWindowKaraokeLyrics(void);
- virtual ~CGUIWindowKaraokeLyrics(void);
- virtual bool OnMessage(CGUIMessage& message);
- virtual bool OnAction(const CAction &action);
- virtual void Render();
- virtual void Process(unsigned int currentTime, CDirtyRegionList &dirtyregions);
-
- void newSong( CKaraokeLyrics * lyrics );
- void pauseSong( bool now_paused );
- void stopSong();
-
-protected:
-
- //! Critical section protects this class from requests from different threads
- CCriticalSection m_CritSection;
-
- //! Pointer to karaoke lyrics renderer
- CKaraokeLyrics * m_Lyrics;
-
- //! Pointer to background object
- CKaraokeWindowBackground * m_Background;
-};
diff --git a/xbmc/music/karaoke/Makefile.in b/xbmc/music/karaoke/Makefile.in
deleted file mode 100644
index 579ffe0964..0000000000
--- a/xbmc/music/karaoke/Makefile.in
+++ /dev/null
@@ -1,17 +0,0 @@
-SRCS = GUIDialogKaraokeSongSelector.cpp
-SRCS += GUIWindowKaraokeLyrics.cpp
-SRCS += karaokelyrics.cpp
-SRCS += karaokelyricscdg.cpp
-SRCS += karaokelyricsfactory.cpp
-SRCS += karaokelyricsmanager.cpp
-SRCS += karaokelyricstext.cpp
-SRCS += karaokelyricstextkar.cpp
-SRCS += karaokelyricstextlrc.cpp
-SRCS += karaokelyricstextustar.cpp
-SRCS += karaokevideobackground.cpp
-SRCS += karaokewindowbackground.cpp
-
-LIB = karaoke.a
-
-include @abs_top_srcdir@/Makefile.include
--include $(patsubst %.cpp,%.P,$(patsubst %.c,%.P,$(SRCS)))
diff --git a/xbmc/music/karaoke/cdgdata.h b/xbmc/music/karaoke/cdgdata.h
deleted file mode 100644
index 30d8255631..0000000000
--- a/xbmc/music/karaoke/cdgdata.h
+++ /dev/null
@@ -1,73 +0,0 @@
-#ifndef CDGDATA_H
-#define CDGDATA_H
-
-// CDG Command Code
-static const unsigned int CDG_COMMAND = 0x09;
-
-// CDG Instruction Codes
-static const unsigned int CDG_INST_MEMORY_PRESET = 1;
-static const unsigned int CDG_INST_BORDER_PRESET = 2;
-static const unsigned int CDG_INST_TILE_BLOCK = 6;
-static const unsigned int CDG_INST_SCROLL_PRESET = 20;
-static const unsigned int CDG_INST_SCROLL_COPY = 24;
-static const unsigned int CDG_INST_DEF_TRANSP_COL = 28;
-static const unsigned int CDG_INST_LOAD_COL_TBL_0_7 = 30;
-static const unsigned int CDG_INST_LOAD_COL_TBL_8_15 = 31;
-static const unsigned int CDG_INST_TILE_BLOCK_XOR = 38;
-
-// Bitmask for all CDG fields
-static const unsigned int CDG_MASK = 0x3F;
-
-// This is the size of the display as defined by the CDG specification.
-// The pixels in this region can be painted, and scrolling operations
-// rotate through this number of pixels.
-static const unsigned int CDG_FULL_WIDTH = 300;
-static const unsigned int CDG_FULL_HEIGHT = 216;
-static const unsigned int CDG_BORDER_WIDTH = 6;
-static const unsigned int CDG_BORDER_HEIGHT = 12;
-
-typedef struct
-{
- char command;
- char instruction;
- char parityQ[2];
- char data[16];
- char parityP[4];
-} SubCode;
-
-typedef struct
-{
- char color; // Only lower 4 bits are used, mask with 0x0F
- char repeat; // Only lower 4 bits are used, mask with 0x0F
- char filler[14];
-} CDG_MemPreset;
-
-typedef struct
-{
- char color; // Only lower 4 bits are used, mask with 0x0F
- char filler[15];
-} CDG_BorderPreset;
-
-typedef struct
-{
- char color0; // Only lower 4 bits are used, mask with 0x0F
- char color1; // Only lower 4 bits are used, mask with 0x0F
- char row; // Only lower 5 bits are used, mask with 0x1F
- char column; // Only lower 6 bits are used, mask with 0x3F
- char tilePixels[12]; // Only lower 6 bits of each byte are used
-} CDG_Tile;
-
-typedef struct
-{
- char colorSpec[16]; // AND with 0x3F3F to clear P and Q channel
-} CDG_LoadColorTable;
-
-typedef struct
-{
- char color; // Only lower 4 bits are used, mask with 0x0F
- char hScroll; // Only lower 6 bits are used, mask with 0x3F
- char vScroll; // Only lower 6 bits are used, mask with 0x3F
-}
-CDG_Scroll;
-
-#endif // CDG_H
diff --git a/xbmc/music/karaoke/karaokelyrics.cpp b/xbmc/music/karaoke/karaokelyrics.cpp
deleted file mode 100644
index c61908aad4..0000000000
--- a/xbmc/music/karaoke/karaokelyrics.cpp
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
- * Copyright (C) 2005-2013 Team XBMC
- * http://xbmc.org
- *
- * This Program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2, or (at your option)
- * any later version.
- *
- * This Program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with XBMC; see the file COPYING. If not, see
- * <http://www.gnu.org/licenses/>.
- *
- */
-
-// C++ Implementation: karaokelyrics
-
-#include <math.h>
-
-#include "utils/MathUtils.h"
-#include "Application.h"
-#include "music/MusicDatabase.h"
-#include "settings/AdvancedSettings.h"
-#include "utils/log.h"
-
-#include "karaokelyrics.h"
-
-CKaraokeLyrics::CKaraokeLyrics()
-{
- m_avOrigDelay = 0;
- m_avDelay = 0;
- m_idSong = 0;
-}
-
-
-CKaraokeLyrics::~CKaraokeLyrics()
-{
-}
-
-void CKaraokeLyrics::Shutdown()
-{
- // Update the song-specific delay in the database
- if ( m_idSong && m_avOrigDelay != m_avDelay && g_advancedSettings.m_karaokeKeepDelay )
- {
- // If the song is in karaoke db, get the delay
- CMusicDatabase musicdatabase;
- if ( musicdatabase.Open() )
- {
- int delayval = MathUtils::round_int( m_avDelay * 10.0 );
- musicdatabase.SetKaraokeSongDelay( m_idSong, delayval );
- CLog::Log( LOGDEBUG, "Karaoke timing correction: set new delay %d for song %ld", delayval, m_idSong );
- }
-
- musicdatabase.Close();
- }
-
- m_idSong = 0;
-}
-
-bool CKaraokeLyrics::InitGraphics()
-{
- return true;
-}
-
-void CKaraokeLyrics::initData( const std::string & songPath )
-{
- m_songPath = songPath;
-
- // Reset AV delay
- m_avOrigDelay = m_avDelay = 0;
-
- // Get song ID if available
- m_idSong = 0;
- CMusicDatabase musicdatabase;
-
- // Get song-specific delay from the database
- if ( g_advancedSettings.m_karaokeKeepDelay && musicdatabase.Open() )
- {
- CSong song;
- if ( musicdatabase.GetSongByFileName( songPath, song) )
- {
- m_idSong = song.idSong;
- if ( song.iKaraokeDelay != 0 )
- {
- m_avOrigDelay = m_avDelay = (double) song.iKaraokeDelay / 10.0;
- CLog::Log( LOGDEBUG, "Karaoke timing correction: restored lyrics delay from database to %g", m_avDelay );
- }
- }
-
- musicdatabase.Close();
- }
-}
-
-void CKaraokeLyrics::lyricsDelayIncrease()
-{
- m_avDelay += 0.05; // 50ms
-}
-
-void CKaraokeLyrics::lyricsDelayDecrease()
-{
- m_avDelay -= 0.05; // 50ms
-}
-
-double CKaraokeLyrics::getSongTime() const
-{
- // m_avDelay may be negative
- double songtime = g_application.GetTime() + m_avDelay;
- return songtime >= 0 ? songtime : 0.0;
-}
-
-std::string CKaraokeLyrics::getSongFile() const
-{
- return m_songPath;
-}
diff --git a/xbmc/music/karaoke/karaokelyrics.h b/xbmc/music/karaoke/karaokelyrics.h
deleted file mode 100644
index cf8f6aa638..0000000000
--- a/xbmc/music/karaoke/karaokelyrics.h
+++ /dev/null
@@ -1,92 +0,0 @@
-#ifndef KARAOKELYRICS_H
-#define KARAOKELYRICS_H
-
-/*
- * Copyright (C) 2005-2013 Team XBMC
- * http://xbmc.org
- *
- * This Program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2, or (at your option)
- * any later version.
- *
- * This Program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with XBMC; see the file COPYING. If not, see
- * <http://www.gnu.org/licenses/>.
- *
- */
-
-#include <string>
-
-// C++ Interface: karaokelyrics
-
-// Abstract interface class for all Karaoke lyrics
-class CKaraokeLyrics
-{
- public:
- CKaraokeLyrics();
- virtual ~CKaraokeLyrics();
-
- //! Parses the lyrics or song file, and loads the lyrics into memory. This function
- //! returns true if the lyrics are successfully loaded, or loading is in progress,
- //! and false otherwise.
- virtual bool Load() = 0;
-
- //! Should return true if the lyrics have background, and therefore should not use
- //! predefined background.
- virtual bool HasBackground() = 0;
-
- //! Should return true if the lyrics have video file to play
- virtual bool HasVideo() = 0;
-
- //! Should return video parameters if HasVideo() returned true
- virtual void GetVideoParameters( std::string& path, int64_t& offset ) = 0;
-
- //! This function is called when the karoke visualisation window created. It may
- //! be called after Start(), but is guaranteed to be called before Render()
- //! Default implementation does nothing and returns true.
- virtual bool InitGraphics();
-
- //! This function is called to render the lyrics (each frame(?))
- virtual void Render() = 0;
-
- //! This function is called before the object is destroyed. Default implementation does nothing.
- //! You must override it if your lyrics class starts threads which need to be stopped, and stop
- //! all of them before returning back.
- virtual void Shutdown();
-
- //! This function gets 'real' time since the moment song begins, corrected by using remote control
- //! to increase/decrease lyrics delays. All lyric show functions must use it to properly calculate
- //! the offset.
- double getSongTime() const;
-
- //! This function gets 'real' time since the moment song begins, corrected by using remote control
- //! to increase/decrease lyrics delays. All lyric show functions must use it to properly calculate
- //! the offset.
- std::string getSongFile() const;
-
- //! Sets the path to the lyrics file, and restores musicdb values
- void initData( const std::string& songPath );
-
- //! Adjusts lyrics delay
- void lyricsDelayIncrease();
- void lyricsDelayDecrease();
-
- private:
- //! Number of milliseconds the lyrics are delayed to compensate.
- double m_avDelay;
-
- //! Original m_avDelay to see if it was changed
- double m_avOrigDelay;
-
- //! Current playing song
- std::string m_songPath;
- long m_idSong;
-};
-
-#endif
diff --git a/xbmc/music/karaoke/karaokelyricscdg.cpp b/xbmc/music/karaoke/karaokelyricscdg.cpp
deleted file mode 100644
index d21aa9424e..0000000000
--- a/xbmc/music/karaoke/karaokelyricscdg.cpp
+++ /dev/null
@@ -1,610 +0,0 @@
-/*
- * Copyright (C) 2005-2013 Team XBMC
- * http://xbmc.org
- *
- * This Program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2, or (at your option)
- * any later version.
- *
- * This Program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with XBMC; see the file COPYING. If not, see
- * <http://www.gnu.org/licenses/>.
- *
- */
-
-#include "system.h"
-#include "filesystem/File.h"
-#include "settings/DisplaySettings.h"
-#include "guilib/GraphicContext.h"
-#include "guilib/Texture.h"
-#include "guilib/GUITexture.h"
-#include "settings/AdvancedSettings.h"
-#include "utils/MathUtils.h"
-#include "utils/log.h"
-#include "utils/auto_buffer.h"
-#include "karaokelyricscdg.h"
-
-
-CKaraokeLyricsCDG::CKaraokeLyricsCDG( const std::string& cdgFile )
- : CKaraokeLyrics()
- , m_cdgFile(cdgFile)
-{
- m_pCdgTexture = 0;
- m_streamIdx = -1;
- m_bgAlpha = 0xff000000;
- m_fgAlpha = 0xff000000;
- m_hOffset = 0;
- m_vOffset = 0;
- m_borderColor = 0;
- m_bgColor = 0;
-
- memset( m_cdgScreen, 0, sizeof(m_cdgScreen) );
-
- for ( int i = 0; i < 16; i++ )
- m_colorTable[i] = 0;
-}
-
-CKaraokeLyricsCDG::~CKaraokeLyricsCDG()
-{
- Shutdown();
-}
-
-bool CKaraokeLyricsCDG::HasBackground()
-{
- return true;
-}
-
-bool CKaraokeLyricsCDG::HasVideo()
-{
- return false;
-}
-
-void CKaraokeLyricsCDG::GetVideoParameters(std::string& path, int64_t & offset)
-{
- // no bg video
-}
-
-BYTE CKaraokeLyricsCDG::getPixel( int x, int y )
-{
- unsigned int offset = x + y * CDG_FULL_WIDTH;
-
- if ( x >= (int) CDG_FULL_WIDTH || y >= (int) CDG_FULL_HEIGHT )
- return m_borderColor;
-
- if ( x < 0 || y < 0 || offset >= CDG_FULL_HEIGHT * CDG_FULL_WIDTH )
- {
- CLog::Log( LOGERROR, "CDG renderer: requested pixel (%d,%d) is out of boundary", x, y );
- return 0;
- }
-
- return m_cdgScreen[offset];
-}
-
-void CKaraokeLyricsCDG::setPixel( int x, int y, BYTE color )
-{
- unsigned int offset = x + y * CDG_FULL_WIDTH;
-
- if ( x < 0 || y < 0 || offset >= CDG_FULL_HEIGHT * CDG_FULL_WIDTH )
- {
- CLog::Log( LOGERROR, "CDG renderer: set pixel (%d,%d) is out of boundary", x, y );
- return;
- }
-
- m_cdgScreen[offset] = color;
-}
-
-
-bool CKaraokeLyricsCDG::InitGraphics()
-{
- // set the background to be completely transparent if we use visualisations, or completely solid if not
- if ( g_advancedSettings.m_karaokeAlwaysEmptyOnCdgs )
- m_bgAlpha = 0xff000000;
- else
- m_bgAlpha = 0;
-
- if (!m_pCdgTexture)
- {
- m_pCdgTexture = new CTexture( CDG_FULL_WIDTH, CDG_FULL_HEIGHT, XB_FMT_A8R8G8B8 );
- }
-
- if ( !m_pCdgTexture )
- {
- CLog::Log(LOGERROR, "CDG renderer: failed to create texture" );
- return false;
- }
-
- return true;
-}
-
-void CKaraokeLyricsCDG::Shutdown()
-{
- m_cdgStream.clear();
-
- if ( m_pCdgTexture )
- {
- delete m_pCdgTexture;
- m_pCdgTexture = NULL;
- }
-}
-
-
-void CKaraokeLyricsCDG::Render()
-{
- // Do not render if we have no texture
- if ( !m_pCdgTexture )
- return;
-
- // Time to update?
- unsigned int songTime = (unsigned int) MathUtils::round_int( (getSongTime() + g_advancedSettings.m_karaokeSyncDelayCDG) * 1000 );
- unsigned int packets_due = songTime * 300 / 1000;
-
- if ( UpdateBuffer( packets_due ) )
- {
- XUTILS::auto_buffer buf(CDG_FULL_HEIGHT * CDG_FULL_WIDTH*sizeof(DWORD));
- DWORD* const pixelbuf = (DWORD*)buf.get();
-
- // Update our texture content
- for ( UINT y = 0; y < CDG_FULL_HEIGHT; y++ )
- {
- DWORD *texel = (DWORD *) (pixelbuf + y * CDG_FULL_WIDTH);
-
- for ( UINT x = 0; x < CDG_FULL_WIDTH; x++ )
- {
- BYTE colorindex = getPixel( x + m_hOffset, y + m_vOffset );
- DWORD TexColor = m_colorTable[ colorindex ];
-
- // Is it transparent color?
- if ( TexColor != 0xFFFFFFFF )
- {
- TexColor &= 0x00FFFFFF;
-
- if ( colorindex == m_bgColor )
- TexColor |= m_bgAlpha;
- else
- TexColor |= m_fgAlpha;
- }
- else
- TexColor = 0x00000000;
-
- *texel++ = TexColor;
- }
- }
-
- m_pCdgTexture->Update( CDG_FULL_WIDTH, CDG_FULL_HEIGHT, CDG_FULL_WIDTH * 4, XB_FMT_A8R8G8B8, (BYTE*) pixelbuf, false );
- }
-
- // Convert texture coordinates to (0..1)
- CRect texCoords((float)CDG_BORDER_WIDTH / CDG_FULL_WIDTH,
- (float)CDG_BORDER_HEIGHT / CDG_FULL_HEIGHT,
- (float)(CDG_FULL_WIDTH - CDG_BORDER_WIDTH) / CDG_FULL_WIDTH,
- (float)(CDG_FULL_HEIGHT - CDG_BORDER_HEIGHT) / CDG_FULL_HEIGHT);
-
- // Get screen coordinates
- const RESOLUTION_INFO info = g_graphicsContext.GetResInfo();
- CRect vertCoords((float)info.Overscan.left,
- (float)info.Overscan.top,
- (float)info.Overscan.right,
- (float)info.Overscan.bottom);
-
- CGUITexture::DrawQuad(vertCoords, 0xffffffff, m_pCdgTexture, &texCoords);
-}
-
-void CKaraokeLyricsCDG::cmdMemoryPreset( const char * data )
-{
- CDG_MemPreset* preset = (CDG_MemPreset*) data;
-
- if ( preset->repeat & 0x0F )
- return; // No need for multiple clearings
-
- m_bgColor = preset->color & 0x0F;
-
- for ( unsigned int i = CDG_BORDER_WIDTH; i < CDG_FULL_WIDTH - CDG_BORDER_WIDTH; i++ )
- for ( unsigned int j = CDG_BORDER_HEIGHT; j < CDG_FULL_HEIGHT - CDG_BORDER_HEIGHT; j++ )
- setPixel( i, j, m_bgColor );
-
- //CLog::Log( LOGDEBUG, "CDG: screen color set to %d", m_bgColor );
-}
-
-void CKaraokeLyricsCDG::cmdBorderPreset( const char * data )
-{
- CDG_BorderPreset* preset = (CDG_BorderPreset*) data;
-
- m_borderColor = preset->color & 0x0F;
-
- for ( unsigned int i = 0; i < CDG_BORDER_WIDTH; i++ )
- {
- for ( unsigned int j = 0; j < CDG_FULL_HEIGHT; j++ )
- {
- setPixel( i, j, m_borderColor );
- setPixel( CDG_FULL_WIDTH - i - 1, j, m_borderColor );
- }
- }
-
- for ( unsigned int i = 0; i < CDG_FULL_WIDTH; i++ )
- {
- for ( unsigned int j = 0; j < CDG_BORDER_HEIGHT; j++ )
- {
- setPixel( i, j, m_borderColor );
- setPixel( i, CDG_FULL_HEIGHT - j - 1, m_borderColor );
- }
- }
-
- //CLog::Log( LOGDEBUG, "CDG: border color set to %d", borderColor );
-}
-
-void CKaraokeLyricsCDG::cmdTransparentColor( const char * data )
-{
- int index = data[0] & 0x0F;
- m_colorTable[index] = 0xFFFFFFFF;
-}
-
-void CKaraokeLyricsCDG::cmdLoadColorTable( const char * data, int index )
-{
- CDG_LoadColorTable* table = (CDG_LoadColorTable*) data;
-
- for ( int i = 0; i < 8; i++ )
- {
- UINT colourEntry = ((table->colorSpec[2 * i] & CDG_MASK) << 8);
- colourEntry = colourEntry + (table->colorSpec[(2 * i) + 1] & CDG_MASK);
- colourEntry = ((colourEntry & 0x3F00) >> 2) | (colourEntry & 0x003F);
-
- BYTE red = ((colourEntry & 0x0F00) >> 8) * 17;
- BYTE green = ((colourEntry & 0x00F0) >> 4) * 17;
- BYTE blue = ((colourEntry & 0x000F)) * 17;
-
- m_colorTable[index+i] = (red << 16) | (green << 8) | blue;
-
- //CLog::Log( LOGDEBUG, "CDG: loadColors: color %d -> %02X %02X %02X (%08X)", index + i, red, green, blue, m_colorTable[index+i] );
- }
-}
-
-void CKaraokeLyricsCDG::cmdTileBlock( const char * data )
-{
- CDG_Tile* tile = (CDG_Tile*) data;
- UINT offset_y = (tile->row & 0x1F) * 12;
- UINT offset_x = (tile->column & 0x3F) * 6;
-
- //CLog::Log( LOGERROR, "TileBlockXor: %d, %d", offset_x, offset_y );
-
- if ( offset_x + 6 >= CDG_FULL_WIDTH || offset_y + 12 >= CDG_FULL_HEIGHT )
- return;
-
- // In the XOR variant, the color values are combined with the color values that are
- // already onscreen using the XOR operator. Since CD+G only allows a maximum of 16
- // colors, we are XORing the pixel values (0-15) themselves, which correspond to
- // indexes into a color lookup table. We are not XORing the actual R,G,B values.
- BYTE color_0 = tile->color0 & 0x0F;
- BYTE color_1 = tile->color1 & 0x0F;
-
- BYTE mask[6] = { 0x20, 0x10, 0x08, 0x04, 0x02, 0x01 };
-
- for ( int i = 0; i < 12; i++ )
- {
- BYTE bTemp = tile->tilePixels[i] & 0x3F;
-
- for ( int j = 0; j < 6; j++ )
- {
- if ( bTemp & mask[j] )
- setPixel( offset_x + j, offset_y + i, color_1 );
- else
- setPixel( offset_x + j, offset_y + i, color_0 );
- }
- }
-}
-
-void CKaraokeLyricsCDG::cmdTileBlockXor( const char * data )
-{
- CDG_Tile* tile = (CDG_Tile*) data;
- UINT offset_y = (tile->row & 0x1F) * 12;
- UINT offset_x = (tile->column & 0x3F) * 6;
-
- //CLog::Log( LOGERROR, "TileBlockXor: %d, %d", offset_x, offset_y );
-
- if ( offset_x + 6 >= CDG_FULL_WIDTH || offset_y + 12 >= CDG_FULL_HEIGHT )
- return;
-
- // In the XOR variant, the color values are combined with the color values that are
- // already onscreen using the XOR operator. Since CD+G only allows a maximum of 16
- // colors, we are XORing the pixel values (0-15) themselves, which correspond to
- // indexes into a color lookup table. We are not XORing the actual R,G,B values.
- BYTE color_0 = tile->color0 & 0x0F;
- BYTE color_1 = tile->color1 & 0x0F;
-
- BYTE mask[6] = { 0x20, 0x10, 0x08, 0x04, 0x02, 0x01 };
-
- for ( int i = 0; i < 12; i++ )
- {
- BYTE bTemp = tile->tilePixels[i] & 0x3F;
-
- for ( int j = 0; j < 6; j++ )
- {
- // Find the original color index
- BYTE origindex = getPixel( offset_x + j, offset_y + i );
-
- if ( bTemp & mask[j] ) //pixel xored with color1
- setPixel( offset_x + j, offset_y + i, origindex ^ color_1 );
- else
- setPixel( offset_x + j, offset_y + i, origindex ^ color_0 );
- }
- }
-}
-
-// Based on http://cdg2video.googlecode.com/svn/trunk/cdgfile.cpp
-void CKaraokeLyricsCDG::cmdScroll( const char * data, bool copy )
-{
- int colour, hScroll, vScroll;
- int hSCmd, hOffset, vSCmd, vOffset;
- int vScrollPixels, hScrollPixels;
-
- // Decode the scroll command parameters
- colour = data[0] & 0x0F;
- hScroll = data[1] & 0x3F;
- vScroll = data[2] & 0x3F;
-
- hSCmd = (hScroll & 0x30) >> 4;
- hOffset = (hScroll & 0x07);
- vSCmd = (vScroll & 0x30) >> 4;
- vOffset = (vScroll & 0x0F);
-
- m_hOffset = hOffset < 5 ? hOffset : 5;
- m_vOffset = vOffset < 11 ? vOffset : 11;
-
- // Scroll Vertical - Calculate number of pixels
- vScrollPixels = 0;
-
- if (vSCmd == 2)
- {
- vScrollPixels = - 12;
- }
- else if (vSCmd == 1)
- {
- vScrollPixels = 12;
- }
-
- // Scroll Horizontal- Calculate number of pixels
- hScrollPixels = 0;
-
- if (hSCmd == 2)
- {
- hScrollPixels = - 6;
- }
- else if (hSCmd == 1)
- {
- hScrollPixels = 6;
- }
-
- if (hScrollPixels == 0 && vScrollPixels == 0)
- {
- return;
- }
-
- // Perform the actual scroll.
- unsigned char temp[CDG_FULL_HEIGHT][CDG_FULL_WIDTH];
- int vInc = vScrollPixels + CDG_FULL_HEIGHT;
- int hInc = hScrollPixels + CDG_FULL_WIDTH;
- unsigned int ri; // row index
- unsigned int ci; // column index
-
- for (ri = 0; ri < CDG_FULL_HEIGHT; ++ri)
- {
- for (ci = 0; ci < CDG_FULL_WIDTH; ++ci)
- {
- temp[(ri + vInc) % CDG_FULL_HEIGHT][(ci + hInc) % CDG_FULL_WIDTH] = getPixel( ci, ri );
- }
- }
-
- // if copy is false, we were supposed to fill in the new pixels
- // with a new colour. Go back and do that now.
-
- if (!copy)
- {
- if (vScrollPixels > 0)
- {
- for (ci = 0; ci < CDG_FULL_WIDTH; ++ci)
- {
- for (ri = 0; ri < (unsigned int)vScrollPixels; ++ri) {
- temp[ri][ci] = colour;
- }
- }
- }
- else if (vScrollPixels < 0)
- {
- for (ci = 0; ci < CDG_FULL_WIDTH; ++ci)
- {
- for (ri = CDG_FULL_HEIGHT + vScrollPixels; ri < CDG_FULL_HEIGHT; ++ri) {
- temp[ri][ci] = colour;
- }
- }
- }
-
- if (hScrollPixels > 0)
- {
- for (ci = 0; ci < (unsigned int)hScrollPixels; ++ci)
- {
- for (ri = 0; ri < CDG_FULL_HEIGHT; ++ri) {
- temp[ri][ci] = colour;
- }
- }
- }
- else if (hScrollPixels < 0)
- {
- for (ci = CDG_FULL_WIDTH + hScrollPixels; ci < CDG_FULL_WIDTH; ++ci)
- {
- for (ri = 0; ri < CDG_FULL_HEIGHT; ++ri) {
- temp[ri][ci] = colour;
- }
- }
- }
- }
-
- // Now copy the temporary buffer back to our array
- for (ri = 0; ri < CDG_FULL_HEIGHT; ++ri)
- {
- for (ci = 0; ci < CDG_FULL_WIDTH; ++ci)
- {
- setPixel( ci, ri, temp[ri][ci] );
- }
- }
-}
-
-bool CKaraokeLyricsCDG::UpdateBuffer( unsigned int packets_due )
-{
- bool screen_changed = false;
-
- // Are we done?
- if ( m_streamIdx == -1 )
- return false;
-
- // Was the stream position reversed? In this case we have to "replay" the whole stream
- // as the screen is a state machine, and "clear" may not be there.
- if ( m_streamIdx > 0 && m_cdgStream[ m_streamIdx-1 ].packetnum > packets_due )
- {
- CLog::Log( LOGDEBUG, "CDG renderer: packet number changed backward (%d played, %d asked", m_cdgStream[ m_streamIdx-1 ].packetnum, packets_due );
- m_streamIdx = 0;
- }
-
- // Process all packets already due
- while ( m_cdgStream[ m_streamIdx ].packetnum <= packets_due )
- {
- SubCode& sc = m_cdgStream[ m_streamIdx ].subcode;
-
- // Execute the instruction
- switch ( sc.instruction & CDG_MASK )
- {
- case CDG_INST_MEMORY_PRESET:
- cmdMemoryPreset( sc.data );
- screen_changed = true;
- break;
-
- case CDG_INST_BORDER_PRESET:
- cmdBorderPreset( sc.data );
- screen_changed = true;
- break;
-
- case CDG_INST_LOAD_COL_TBL_0_7:
- cmdLoadColorTable( sc.data, 0 );
- break;
-
- case CDG_INST_LOAD_COL_TBL_8_15:
- cmdLoadColorTable( sc.data, 8 );
- break;
-
- case CDG_INST_DEF_TRANSP_COL:
- cmdTransparentColor( sc.data );
- break;
-
- case CDG_INST_TILE_BLOCK:
- cmdTileBlock( sc.data );
- screen_changed = true;
- break;
-
- case CDG_INST_TILE_BLOCK_XOR:
- cmdTileBlockXor( sc.data );
- screen_changed = true;
- break;
-
- case CDG_INST_SCROLL_PRESET:
- cmdScroll( sc.data, false );
- screen_changed = true;
- break;
-
- case CDG_INST_SCROLL_COPY:
- cmdScroll( sc.data, true );
- screen_changed = true;
- break;
-
- default: // this shouldn't happen as we validated the stream in Load()
- break;
- }
-
- m_streamIdx++;
-
- if ( m_streamIdx >= (int) m_cdgStream.size() )
- {
- m_streamIdx = -1;
- break;
- }
- }
-
- return screen_changed;
-}
-
-bool CKaraokeLyricsCDG::Load()
-{
- // Read the whole CD+G file into memory array
- XFILE::CFile file;
-
- m_cdgStream.clear();
-
- XFILE::auto_buffer buf;
- if (file.LoadFile(m_cdgFile, buf) <= 0)
- {
- CLog::Log(LOGERROR, "CDG loader: can't load CDG file \"%s\"", m_cdgFile.c_str());
- return false;
- }
-
- file.Close();
-
- // Parse the CD+G stream
- int buggy_commands = 0;
-
- for (unsigned int offset = 0; offset < buf.size(); offset += sizeof(SubCode))
- {
- SubCode * sc = (SubCode *)(buf.get() + offset);
-
- if ( ( sc->command & CDG_MASK) == CDG_COMMAND )
- {
- CDGPacket packet;
-
- // Validate the command and instruction
- switch ( sc->instruction & CDG_MASK )
- {
- case CDG_INST_MEMORY_PRESET:
- case CDG_INST_BORDER_PRESET:
- case CDG_INST_LOAD_COL_TBL_0_7:
- case CDG_INST_LOAD_COL_TBL_8_15:
- case CDG_INST_TILE_BLOCK_XOR:
- case CDG_INST_TILE_BLOCK:
- case CDG_INST_DEF_TRANSP_COL:
- case CDG_INST_SCROLL_PRESET:
- case CDG_INST_SCROLL_COPY:
- memcpy( &packet.subcode, sc, sizeof(SubCode) );
- packet.packetnum = offset / sizeof( SubCode );
- m_cdgStream.push_back( packet );
- break;
-
- default:
- buggy_commands++;
- break;
- }
- }
- }
-
- // Init the screen
- memset( m_cdgScreen, 0, sizeof(m_cdgScreen) );
-
- // Init color table
- for ( int i = 0; i < 16; i++ )
- m_colorTable[i] = 0;
-
- m_streamIdx = 0;
- m_borderColor = 0;
- m_bgColor = 0;
- m_hOffset = 0;
- m_vOffset = 0;
-
- if ( buggy_commands == 0 )
- CLog::Log( LOGDEBUG, "CDG loader: CDG file %s has been loading successfully, %d useful packets, %dKb used",
- m_cdgFile.c_str(), (int)m_cdgStream.size(), (int)(m_cdgStream.size() * sizeof(CDGPacket) / 1024) );
- else
- CLog::Log( LOGDEBUG, "CDG loader: CDG file %s was damaged, %d errors ignored, %d useful packets, %dKb used",
- m_cdgFile.c_str(), buggy_commands, (int)m_cdgStream.size(), (int)(m_cdgStream.size() * sizeof(CDGPacket) / 1024) );
-
- return true;
-}
diff --git a/xbmc/music/karaoke/karaokelyricscdg.h b/xbmc/music/karaoke/karaokelyricscdg.h
deleted file mode 100644
index 2b3b5bbc48..0000000000
--- a/xbmc/music/karaoke/karaokelyricscdg.h
+++ /dev/null
@@ -1,114 +0,0 @@
-#ifndef KARAOKELYRICSCDG_H
-#define KARAOKELYRICSCDG_H
-
-/*
- * Copyright (C) 2005-2013 Team XBMC
- * http://xbmc.org
- *
- * This Program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2, or (at your option)
- * any later version.
- *
- * This Program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with XBMC; see the file COPYING. If not, see
- * <http://www.gnu.org/licenses/>.
- *
- */
-
-// C++ Interface: karaokelyricscdg
-
-#include "cdgdata.h"
-#include "karaokelyrics.h"
-
-class CBaseTexture;
-typedef uint32_t color_t;
-
-class CKaraokeLyricsCDG : public CKaraokeLyrics
-{
- public:
- CKaraokeLyricsCDG( const std::string& cdgFile );
- ~CKaraokeLyricsCDG();
-
- //! Parses the lyrics or song file, and loads the lyrics into memory. Returns true if the
- //! lyrics are successfully loaded, false otherwise.
- bool Load();
-
- //! Virtually all CDG lyrics have some kind of background
- virtual bool HasBackground();
-
- //! Should return true if the lyrics have video file to play
- virtual bool HasVideo();
-
- //! Should return video parameters if HasVideo() returned true
- virtual void GetVideoParameters(std::string& path, int64_t& offset);
-
- //! This function is called when the karoke visualisation window created. It may
- //! be called after Start(), but is guaranteed to be called before Render()
- //! Default implementation does nothing.
- virtual bool InitGraphics();
-
- //! This function is called when the karoke visualisation window is destroyed.
- //! Default implementation does nothing.
- virtual void Shutdown();
-
- //! This function is called to render the lyrics (each frame(?))
- virtual void Render();
-
- protected:
- void cmdMemoryPreset( const char * data );
- void cmdBorderPreset( const char * data );
- void cmdLoadColorTable( const char * data, int index );
- void cmdTileBlock( const char * data );
- void cmdTileBlockXor( const char * data );
- void cmdTransparentColor( const char * data );
-
- void cmdScroll( const char * data, bool loop );
- void scrollLeft( int color );
- void scrollRight( int color );
- void scrollUp( int color );
- void scrollDown( int color );
-
- bool UpdateBuffer( unsigned int packets_due );
- void RenderIntoBuffer( unsigned char *pixels, unsigned int width, unsigned int height, unsigned int pitch ) const;
-
- private:
- BYTE getPixel( int x, int y );
- void setPixel( int x, int y, BYTE color );
-
- //! CDG file name
- std::string m_cdgFile;
-
- typedef struct
- {
- unsigned int packetnum;
- SubCode subcode;
- } CDGPacket;
-
- std::vector<CDGPacket> m_cdgStream; //!< Parsed CD+G stream storage
- int m_streamIdx; //!< Packet about to be rendered
- DWORD m_colorTable[16]; //!< CD+G color table; color format is A8R8G8B8
- BYTE m_bgColor; //!< Background color index
- BYTE m_borderColor; //!< Border color index
- BYTE m_cdgScreen[CDG_FULL_WIDTH*CDG_FULL_HEIGHT]; //!< Image state for CD+G stream
-
- // These values are used to implement screen shifting. The CDG specification allows the entire
- // screen to be shifted, up to 5 pixels right and 11 pixels down. This shift is persistent
- // until it is reset to a different value. In practice, this is used in conjunction with
- // scrolling (which always jumps in integer blocks of 6x12 pixels) to perform
- // one-pixel-at-a-time scrolls.
- BYTE m_hOffset;
- BYTE m_vOffset;
-
- //! Rendering stuff
- CBaseTexture * m_pCdgTexture;
- color_t m_bgAlpha; //!< background alpha
- color_t m_fgAlpha; //!< foreground alpha
-};
-
-#endif
diff --git a/xbmc/music/karaoke/karaokelyricsfactory.cpp b/xbmc/music/karaoke/karaokelyricsfactory.cpp
deleted file mode 100644
index bd44d55f04..0000000000
--- a/xbmc/music/karaoke/karaokelyricsfactory.cpp
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * Copyright (C) 2005-2013 Team XBMC
- * http://xbmc.org
- *
- * This Program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2, or (at your option)
- * any later version.
- *
- * This Program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with XBMC; see the file COPYING. If not, see
- * <http://www.gnu.org/licenses/>.
- *
- */
-
-// C++ Implementation: karaokelyricsfactory
-
-#include "utils/StringUtils.h"
-#include "utils/URIUtils.h"
-#include "filesystem/File.h"
-
-#include "karaokelyricscdg.h"
-#include "karaokelyricstextkar.h"
-#include "karaokelyricstextlrc.h"
-#include "karaokelyricstextustar.h"
-#include "karaokelyricsfactory.h"
-
-
-// A helper function to have all the checks in a single place
-bool CheckAndCreateLyrics( const std::string & songName, CKaraokeLyrics ** lyricptr )
-{
- std::string filename = songName;
- URIUtils::RemoveExtension( filename );
- std::string ext = URIUtils::GetExtension(songName);
-
- // LRC lyrics have .lrc extension
- if ( XFILE::CFile::Exists( filename + ".lrc" ) )
- {
- if ( lyricptr )
- *lyricptr = new CKaraokeLyricsTextLRC( filename + ".lrc" );
-
- return true;
- }
-
- // MIDI/KAR files keep lyrics inside
- if (StringUtils::StartsWith(ext, ".mid") ||
- StringUtils::StartsWith(ext, ".kar"))
- {
- if ( lyricptr )
- *lyricptr = new CKaraokeLyricsTextKAR( songName );
-
- return true;
- }
-
- // CD-G lyrics have .cdg extension
- if ( XFILE::CFile::Exists( filename + ".cdg" ) )
- {
- if ( lyricptr )
- *lyricptr = new CKaraokeLyricsCDG( filename + ".cdg" );
-
- return true;
- }
-
- // UltraStar lyrics have .txt extension
- if ( XFILE::CFile::Exists( filename + ".txt" ) && CKaraokeLyricsTextUStar::isValidFile( filename + ".txt" ) )
- {
- if ( lyricptr )
- *lyricptr = new CKaraokeLyricsTextUStar( filename + ".txt" );
-
- return true;
- }
-
- if ( lyricptr )
- *lyricptr = 0;
-
- return false;
-}
-
-
-CKaraokeLyrics * CKaraokeLyricsFactory::CreateLyrics( const std::string & songName )
-{
- CKaraokeLyrics * lyricptr = 0;
-
- CheckAndCreateLyrics( songName, &lyricptr );
- return lyricptr;
-}
-
-
-bool CKaraokeLyricsFactory::HasLyrics(const std::string & songName)
-{
- return CheckAndCreateLyrics( songName, 0 );
-}
diff --git a/xbmc/music/karaoke/karaokelyricsfactory.h b/xbmc/music/karaoke/karaokelyricsfactory.h
deleted file mode 100644
index 658f5bc00e..0000000000
--- a/xbmc/music/karaoke/karaokelyricsfactory.h
+++ /dev/null
@@ -1,45 +0,0 @@
-#ifndef KARAOKELYRICSFACTORY_H
-#define KARAOKELYRICSFACTORY_H
-
-/*
- * Copyright (C) 2005-2013 Team XBMC
- * http://xbmc.org
- *
- * This Program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2, or (at your option)
- * any later version.
- *
- * This Program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with XBMC; see the file COPYING. If not, see
- * <http://www.gnu.org/licenses/>.
- *
- */
-
-// C++ Interface: karaokelyricsfactory
-
-#include "karaokelyrics.h"
-
-class CKaraokeLyricsFactory
-{
- public:
- CKaraokeLyricsFactory() {};
- ~CKaraokeLyricsFactory() {};
-
- //! This function will be called to check if there are any classes which could load lyrics
- //! for the song played. The action will be executed in a single thread, and therefore
- //! should be limited to simple checks like whether the specific filename exists.
- //! If the loader needs more than that to make sure lyrics are there, it must create this
- //! loader, which should handle the processing in load().
- static CKaraokeLyrics * CreateLyrics( const std::string& songName );
-
- //! This function returns true if the lyrics are (or might be) available for this song.
- static bool HasLyrics( const std::string& songName );
-};
-
-#endif
diff --git a/xbmc/music/karaoke/karaokelyricsmanager.cpp b/xbmc/music/karaoke/karaokelyricsmanager.cpp
deleted file mode 100644
index d698d5ff8e..0000000000
--- a/xbmc/music/karaoke/karaokelyricsmanager.cpp
+++ /dev/null
@@ -1,170 +0,0 @@
-/*
- * Copyright (C) 2005-2013 Team XBMC
- * http://xbmc.org
- *
- * This Program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2, or (at your option)
- * any later version.
- *
- * This Program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with XBMC; see the file COPYING. If not, see
- * <http://www.gnu.org/licenses/>.
- *
- */
-
-// C++ Implementation: karaokelyricsmanager
-
-#include "threads/SystemClock.h"
-#include "Application.h"
-#include "guilib/GUIWindowManager.h"
-#include "settings/Settings.h"
-
-#include "karaokelyrics.h"
-#include "karaokelyricsfactory.h"
-#include "karaokelyricsmanager.h"
-
-#include "GUIDialogKaraokeSongSelector.h"
-#include "GUIWindowKaraokeLyrics.h"
-#include "threads/SingleLock.h"
-#include "utils/log.h"
-
-CKaraokeLyricsManager::CKaraokeLyricsManager()
-{
- m_Lyrics = 0;
- m_karaokeSongPlaying = false;
- m_karaokeSongPlayed = false;
- m_lastPlayedTime = 0;
-}
-
-CKaraokeLyricsManager::~ CKaraokeLyricsManager()
-{
- if ( m_Lyrics )
- {
- m_Lyrics->Shutdown();
- delete m_Lyrics;
- }
-}
-
-bool CKaraokeLyricsManager::Start(const std::string & strSongPath)
-{
- CSingleLock lock (m_CritSection);
-
- // Init to false
- m_karaokeSongPlayed = false;
- m_lastPlayedTime = 0;
-
- if ( m_Lyrics )
- Stop(); // shouldn't happen, but...
-
- // If disabled by configuration, do nothing
- if ( !CSettings::GetInstance().GetBool(CSettings::SETTING_KARAOKE_ENABLED) )
- return false;
-
- m_Lyrics = CKaraokeLyricsFactory::CreateLyrics( strSongPath );
-
- if ( !m_Lyrics )
- {
- CLog::Log( LOGDEBUG, "Karaoke: lyrics for song %s not found", strSongPath.c_str() );
- return false;
- }
-
- m_Lyrics->initData( strSongPath );
-
- // Load the lyrics
- if ( !m_Lyrics->Load() )
- {
- CLog::Log( LOGWARNING, "Karaoke: lyrics for song %s found but cannot be loaded", strSongPath.c_str() );
- delete m_Lyrics;
- m_Lyrics = 0;
- return false;
- }
-
- CLog::Log( LOGDEBUG, "Karaoke: lyrics for song %s loaded successfully", strSongPath.c_str() );
-
- CGUIWindowKaraokeLyrics *window = (CGUIWindowKaraokeLyrics*) g_windowManager.GetWindow(WINDOW_KARAOKELYRICS);
-
- if ( !window )
- {
- CLog::Log( LOGERROR, "Karaoke window is not found" );
- return false;
- }
-
- // Activate karaoke window
- g_windowManager.ActivateWindow(WINDOW_KARAOKELYRICS);
-
- // Start the song
- window->newSong( m_Lyrics );
-
- m_karaokeSongPlaying = true;
- m_karaokeSongPlayed = true;
- return true;
-}
-
-void CKaraokeLyricsManager::Stop()
-{
- CSingleLock lock (m_CritSection);
-
- m_karaokeSongPlaying = false;
-
- if ( !m_Lyrics )
- return;
-
- // Clean up and close karaoke window when stopping
- CGUIWindowKaraokeLyrics *window = (CGUIWindowKaraokeLyrics*) g_windowManager.GetWindow(WINDOW_KARAOKELYRICS);
-
- if ( window )
- window->stopSong();
-
- // turn off visualisation window when stopping
- if (g_windowManager.GetActiveWindow() == WINDOW_KARAOKELYRICS)
- g_windowManager.PreviousWindow();
-
- m_Lyrics->Shutdown();
- delete m_Lyrics;
- m_Lyrics = 0;
-}
-
-
-void CKaraokeLyricsManager::ProcessSlow()
-{
- CSingleLock lock (m_CritSection);
-
- if ( g_application.m_pPlayer->IsPlaying() )
- {
- if ( m_karaokeSongPlaying )
- m_lastPlayedTime = XbmcThreads::SystemClockMillis();
-
- return;
- }
-
- if ( !m_karaokeSongPlayed || !CSettings::GetInstance().GetBool(CSettings::SETTING_KARAOKE_AUTOPOPUPSELECTOR) )
- return;
-
- // If less than 750ms passed return; we're still processing STOP events
- if ( !m_lastPlayedTime || XbmcThreads::SystemClockMillis() - m_lastPlayedTime < 750 )
- return;
-
- m_karaokeSongPlayed = false; // so it won't popup again
-
- CGUIDialogKaraokeSongSelectorLarge * selector =
- (CGUIDialogKaraokeSongSelectorLarge*)g_windowManager.GetWindow( WINDOW_DIALOG_KARAOKE_SELECTOR );
-
- selector->Open();
-}
-
-void CKaraokeLyricsManager::SetPaused(bool now_paused)
-{
- CSingleLock lock (m_CritSection);
-
- // Clean up and close karaoke window when stopping
- CGUIWindowKaraokeLyrics *window = (CGUIWindowKaraokeLyrics*) g_windowManager.GetWindow(WINDOW_KARAOKELYRICS);
-
- if ( window )
- window->pauseSong( now_paused );
-}
diff --git a/xbmc/music/karaoke/karaokelyricsmanager.h b/xbmc/music/karaoke/karaokelyricsmanager.h
deleted file mode 100644
index 68d06a4ca9..0000000000
--- a/xbmc/music/karaoke/karaokelyricsmanager.h
+++ /dev/null
@@ -1,74 +0,0 @@
-#ifndef KARAOKELYRICSMANAGER_H
-#define KARAOKELYRICSMANAGER_H
-
-/*
- * Copyright (C) 2005-2013 Team XBMC
- * http://xbmc.org
- *
- * This Program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2, or (at your option)
- * any later version.
- *
- * This Program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with XBMC; see the file COPYING. If not, see
- * <http://www.gnu.org/licenses/>.
- *
- */
-
-// C++ Interface: karaokelyricsmanager
-//
-#include <string>
-
-class CKaraokeLyrics;
-class CGUIDialogKaraokeSongSelectorSmall;
-
-
-//! This is the main lyrics manager class, which is called from XBMC code.
-class CKaraokeLyricsManager
-{
- public:
- //! The class instance created only once during the application life,
- //! and is destroyed when the app shuts down.
- CKaraokeLyricsManager();
- ~CKaraokeLyricsManager();
-
- //! A new song is started playing
- bool Start( const std::string& strSongPath );
-
- //! Called when the current song is being paused or unpaused
- void SetPaused( bool now_paused );
-
- //! Called when the current song is being stopped. Changing to a new song
- //! in the queue generates Stop() with followed Start() calls. May be called even if
- //! Start() was not called before, so please check.
- void Stop();
-
- //! Might pop up a selection dialog if playback is ended
- void ProcessSlow();
-
- private:
- //! Critical section protects this class from requests from different threads
- CCriticalSection m_CritSection;
-
- //! A class which handles loading and rendering for this specific karaoke song.
- //! Obtained from KaraokeLyricsFactory
- CKaraokeLyrics * m_Lyrics;
-
- //! True if we're playing a karaoke song
- bool m_karaokeSongPlaying;
-
- //! True if we played a karaoke song
- bool m_karaokeSongPlayed;
-
- //! Stores the last time the song was still played
- unsigned int m_lastPlayedTime;
-};
-
-
-#endif
diff --git a/xbmc/music/karaoke/karaokelyricstext.cpp b/xbmc/music/karaoke/karaokelyricstext.cpp
deleted file mode 100644
index 067cecabb9..0000000000
--- a/xbmc/music/karaoke/karaokelyricstext.cpp
+++ /dev/null
@@ -1,748 +0,0 @@
-/*
- * Copyright (C) 2005-2013 Team XBMC
- * http://xbmc.org
- *
- * This Program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2, or (at your option)
- * any later version.
- *
- * This Program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with XBMC; see the file COPYING. If not, see
- * <http://www.gnu.org/licenses/>.
- *
- */
-
-// C++ Implementation: karaokelyricstext
-
-#include <math.h>
-
-#include "utils/CharsetConverter.h"
-#include "settings/DisplaySettings.h"
-#include "settings/Settings.h"
-#include "guilib/GUITextLayout.h"
-#include "guilib/GUIFont.h"
-#include "karaokelyricstext.h"
-#include "utils/URIUtils.h"
-#include "filesystem/File.h"
-#include "guilib/GUIFontManager.h"
-#include "addons/Skin.h"
-#include "utils/MathUtils.h"
-#include "utils/log.h"
-#include "utils/StringUtils.h"
-
-typedef struct
-{
- unsigned int text;
- unsigned int active;
- unsigned int outline;
-
-} LyricColors;
-
-// Must be synchronized with strings.xml and GUISettings.cpp!
-static LyricColors gLyricColors[] =
-{
- // <string id="22040">white/green</string>
- // First 0xFF is alpha!
- { 0xFFDADADA, 0xFF00FF00, 0xFF000000 },
-
- // <string id="22041">white/red</string>
- { 0xFFDADADA, 0xFFFF0000, 0xFF000000 },
-
- // <string id="22042">white/blue</string>
- { 0xFFDADADA, 0xFF0000FF, 0xFF000000 },
-
- // <string id="22043">black/white</string>
- { 0xFF000000, 0xFFDADADA, 0xFFFFFFFF },
-};
-
-
-CKaraokeLyricsText::CKaraokeLyricsText()
- : CKaraokeLyrics()
-{
- m_karaokeLayout = 0;
- m_preambleLayout = 0;
- m_karaokeFont = 0;
-
- int coloridx = CSettings::GetInstance().GetInt(CSettings::SETTING_KARAOKE_FONTCOLORS);
- if ( coloridx < KARAOKE_COLOR_START || coloridx >= KARAOKE_COLOR_END )
- coloridx = 0;
-
- m_colorLyrics = gLyricColors[coloridx].text;
- m_colorLyricsOutline = gLyricColors[coloridx].outline;
- m_colorSinging = StringUtils::Format("%08X", gLyricColors[coloridx].active);
-
- m_delayAfter = 50; // 5 seconds
- m_showLyricsBeforeStart = 50; // 7.5 seconds
- m_showPreambleBeforeStart = 35; // 5.5 seconds
- m_paragraphBreakTime = 50; // 5 seconds; for autodetection paragraph breaks
- m_mergeLines = true;
- m_hasPitch = false;
- m_videoOffset = 0;
-
- m_lyricsState = STATE_END_SONG;
-}
-
-
-CKaraokeLyricsText::~CKaraokeLyricsText()
-{
-}
-
-void CKaraokeLyricsText::clearLyrics()
-{
- m_lyrics.clear();
- m_songName.clear();
- m_artist.clear();
- m_hasPitch = false;
- m_videoFile.clear();
- m_videoOffset = 0;
-}
-
-
-void CKaraokeLyricsText::addLyrics(const std::string & text, unsigned int timing, unsigned int flags, unsigned int pitch)
-{
- Lyric line;
-
- if ( flags & LYRICS_CONVERT_UTF8 )
- {
- // Reset the flag
- flags &= ~LYRICS_CONVERT_UTF8;
- g_charsetConverter.unknownToUTF8(text, line.text);
- }
- else
- {
- line.text = text;
- }
-
- line.flags = flags;
- line.timing = timing;
- line.pitch = pitch;
-
- // If this is the first entry, remove LYRICS_NEW_LINE and LYRICS_NEW_PARAGRAPH flags
- if ( m_lyrics.size() == 0 )
- line.flags &= ~(LYRICS_NEW_LINE | LYRICS_NEW_PARAGRAPH );
-
- // 'New paragraph' includes new line as well
- if ( line.flags & LYRICS_NEW_PARAGRAPH )
- line.flags &= ~LYRICS_NEW_LINE;
-
- m_lyrics.push_back( line );
-}
-
-
-bool CKaraokeLyricsText::InitGraphics()
-{
- if ( m_lyrics.empty() )
- return false;
-
- std::string fontPath = URIUtils::AddFileToFolder("special://home/media/Fonts/", CSettings::GetInstance().GetString(CSettings::SETTING_KARAOKE_FONT));
- if (!XFILE::CFile::Exists(fontPath))
- fontPath = URIUtils::AddFileToFolder("special://xbmc/media/Fonts/", CSettings::GetInstance().GetString(CSettings::SETTING_KARAOKE_FONT));
- m_karaokeFont = g_fontManager.LoadTTF("__karaoke__", fontPath,
- m_colorLyrics, 0, CSettings::GetInstance().GetInt(CSettings::SETTING_KARAOKE_FONTHEIGHT), FONT_STYLE_BOLD );
- CGUIFont *karaokeBorder = g_fontManager.LoadTTF("__karaokeborder__", fontPath,
- m_colorLyrics, 0, CSettings::GetInstance().GetInt(CSettings::SETTING_KARAOKE_FONTHEIGHT), FONT_STYLE_BOLD, true );
-
- if ( !m_karaokeFont )
- {
- CLog::Log(LOGERROR, "CKaraokeLyricsText::PrepareGraphicsData - Unable to load subtitle font");
- return false;
- }
-
- m_karaokeLayout = new CGUITextLayout( m_karaokeFont, true, 0, karaokeBorder );
- m_preambleLayout = new CGUITextLayout( m_karaokeFont, true, 0, karaokeBorder );
-
- if ( !m_karaokeLayout || !m_preambleLayout )
- {
- delete m_preambleLayout;
- delete m_karaokeLayout;
- m_karaokeLayout = m_preambleLayout = 0;
-
- CLog::Log(LOGERROR, "CKaraokeLyricsText::PrepareGraphicsData - cannot create layout");
- return false;
- }
-
- rescanLyrics();
-
- m_indexNextPara = 0;
-
- // Generate next paragraph
- nextParagraph();
-
- m_lyricsState = STATE_WAITING;
- return true;
-}
-
-
-void CKaraokeLyricsText::Shutdown()
-{
- CKaraokeLyrics::Shutdown();
-
- delete m_preambleLayout;
- m_preambleLayout = 0;
-
- if ( m_karaokeLayout )
- {
- g_fontManager.Unload("__karaoke__");
- g_fontManager.Unload("__karaokeborder__");
- delete m_karaokeLayout;
- m_karaokeLayout = NULL;
- }
-
- m_lyricsState = STATE_END_SONG;
-}
-
-
-void CKaraokeLyricsText::Render()
-{
- if ( !m_karaokeLayout )
- return;
-
- // Get the current song timing
- unsigned int songTime = (unsigned int) MathUtils::round_int( (getSongTime() * 10) );
-
- bool updatePreamble = false;
- bool updateText = false;
-
- // No returns in switch if anything needs to be drawn! Just break!
- switch ( m_lyricsState )
- {
- // the next paragraph lyrics are not shown yet. Screen is clear.
- // m_index points to the first entry.
- case STATE_WAITING:
- if ( songTime + m_showLyricsBeforeStart < m_lyrics[ m_index ].timing )
- return;
-
- // Is it time to play already?
- if ( songTime >= m_lyrics[ m_index ].timing )
- {
- m_lyricsState = STATE_PLAYING_PARAGRAPH;
- }
- else
- {
- m_lyricsState = STATE_PREAMBLE;
- m_lastPreambleUpdate = songTime;
- }
-
- updateText = true;
- break;
-
- // the next paragraph lyrics are shown, but the paragraph hasn't start yet.
- // Using m_lastPreambleUpdate, we redraw the marker each second.
- case STATE_PREAMBLE:
- if ( songTime < m_lyrics[ m_index ].timing )
- {
- // Time to redraw preamble?
- if ( songTime + m_showPreambleBeforeStart >= m_lyrics[ m_index ].timing )
- {
- if ( songTime - m_lastPreambleUpdate >= 10 )
- {
- // Fall through out of switch() to redraw
- m_lastPreambleUpdate = songTime;
- updatePreamble = true;
- }
- }
- }
- else
- {
- updateText = true;
- m_lyricsState = STATE_PLAYING_PARAGRAPH;
- }
- break;
-
- // The lyrics are shown, but nothing is colored or no color is changed yet.
- // m_indexStart, m_indexEnd and m_index are set, m_index timing shows when to color.
- case STATE_PLAYING_PARAGRAPH:
- if ( songTime >= m_lyrics[ m_index ].timing )
- {
- while ( songTime >= m_lyrics[ m_index ].timing && m_index <= m_indexEndPara )
- m_index++;
-
- updateText = true;
-
- if ( m_index > m_indexEndPara )
- m_lyricsState = STATE_END_PARAGRAPH;
- }
- break;
-
- // the whole paragraph is colored, but still shown, waiting until it's time to clear the lyrics.
- // m_index still points to the last entry, and m_indexNextPara points to the first entry of next
- // paragraph, or to LYRICS_END. When the next paragraph is about to start (which is
- // m_indexNextPara timing - m_showLyricsBeforeStart), the state switches to STATE_START_PARAGRAPH. When time
- // goes after m_index timing + m_delayAfter, the state switches to STATE_WAITING,
- case STATE_END_PARAGRAPH:
- {
- unsigned int paraEnd = m_lyrics[ m_indexEndPara ].timing + m_delayAfter;
-
- // If the next paragraph starts before current ends, use its start time as our end
- if ( m_indexNextPara != LYRICS_END && m_lyrics[ m_indexNextPara ].timing <= paraEnd + m_showLyricsBeforeStart )
- {
- if ( m_lyrics[ m_indexNextPara ].timing > m_showLyricsBeforeStart )
- paraEnd = m_lyrics[ m_indexNextPara ].timing - m_showLyricsBeforeStart;
- else
- paraEnd = 0;
- }
-
- if ( songTime >= paraEnd )
- {
- // Is the song ended?
- if ( m_indexNextPara != LYRICS_END )
- {
- // Are we still waiting?
- if ( songTime >= m_lyrics[ m_indexNextPara ].timing )
- m_lyricsState = STATE_PLAYING_PARAGRAPH;
- else
- m_lyricsState = STATE_WAITING;
-
- // Get next paragraph
- nextParagraph();
- updateText = true;
- }
- else
- {
- m_lyricsState = STATE_END_SONG;
- return;
- }
- }
- }
- break;
-
- case STATE_END_SONG:
- // the song is completed, there are no more lyrics to show. This state is finita la comedia.
- return;
- }
-
- // Calculate drawing parameters
- const RESOLUTION_INFO info = g_graphicsContext.GetResInfo();
- g_graphicsContext.SetRenderingResolution(info, false);
- float maxWidth = (float) info.Overscan.right - info.Overscan.left;
-
- // We must only fall through for STATE_DRAW_SYLLABLE or STATE_PREAMBLE
- if ( updateText )
- {
- // So we need to update the layout with current paragraph text, optionally colored according to index
- bool color_used = false;
- m_currentLyrics = "";
-
- // Draw the current paragraph test if needed
- if ( songTime + m_showLyricsBeforeStart >= m_lyrics[ m_indexStartPara ].timing )
- {
- for ( unsigned int i = m_indexStartPara; i <= m_indexEndPara; i++ )
- {
- if ( m_lyrics[i].flags & LYRICS_NEW_LINE )
- m_currentLyrics += "[CR]";
-
- if ( i == m_indexStartPara && songTime >= m_lyrics[ m_indexStartPara ].timing )
- {
- color_used = true;
- m_currentLyrics += "[COLOR " + m_colorSinging + "]";
- }
-
- if ( songTime < m_lyrics[ i ].timing && color_used )
- {
- color_used = false;
- m_currentLyrics += "[/COLOR]";
- }
-
- m_currentLyrics += m_lyrics[i].text;
- }
-
- if ( color_used )
- m_currentLyrics += "[/COLOR]";
-
-// CLog::Log( LOGERROR, "Updating text: state %d, time %d, start %d, index %d (time %d) [%s], text %s",
-// m_lyricsState, songTime, m_lyrics[ m_indexStartPara ].timing, m_index, m_lyrics[ m_index ].timing,
-// m_lyrics[ m_index ].text.c_str(), m_currentLyrics.c_str());
- }
-
- m_karaokeLayout->Update(m_currentLyrics, maxWidth * 0.9f);
- updateText = false;
- }
-
- if ( updatePreamble )
- {
- m_currentPreamble = "";
-
- // Get number of seconds left to the song start
- if ( m_lyrics[ m_indexStartPara ].timing >= songTime )
- {
- unsigned int seconds = (m_lyrics[ m_indexStartPara ].timing - songTime) / 10;
-
- while ( seconds-- > 0 )
- m_currentPreamble += "- ";
- }
-
- m_preambleLayout->Update( m_currentPreamble, maxWidth * 0.9f );
- }
-
- float x = maxWidth * 0.5f + info.Overscan.left;
- float y = (float)info.Overscan.top +
- (info.Overscan.bottom - info.Overscan.top) / 8;
-
- float textWidth, textHeight;
- m_karaokeLayout->GetTextExtent(textWidth, textHeight);
- m_karaokeLayout->RenderOutline(x, y, 0, m_colorLyricsOutline, XBFONT_CENTER_X, maxWidth);
-
- if ( !m_currentPreamble.empty() )
- {
- float pretextWidth, pretextHeight;
- m_preambleLayout->GetTextExtent(pretextWidth, pretextHeight);
- m_preambleLayout->RenderOutline(x - textWidth / 2, y - pretextHeight, 0, m_colorLyricsOutline, XBFONT_LEFT, maxWidth);
- }
-}
-
-
-void CKaraokeLyricsText::nextParagraph()
-{
- if ( m_indexNextPara == LYRICS_END )
- return;
-
- bool new_para_found = false;
- m_indexStartPara = m_index = m_indexNextPara;
-
- for ( m_indexEndPara = m_index + 1; m_indexEndPara < m_lyrics.size(); m_indexEndPara++ )
- {
- if ( m_lyrics[ m_indexEndPara ].flags & LYRICS_NEW_PARAGRAPH
- || ( m_lyrics[ m_indexEndPara ].timing - m_lyrics[ m_indexEndPara - 1 ].timing ) > m_paragraphBreakTime )
- {
- new_para_found = true;
- break;
- }
- }
-
- // Is this the end of array?
- if ( new_para_found )
- m_indexNextPara = m_indexEndPara;
- else
- m_indexNextPara = LYRICS_END;
-
- m_indexEndPara--;
-}
-
-
-typedef struct
-{
- float width; // total screen width of all lyrics in this line
- int timediff; // time difference between prev line ends and this line starts
- bool upper_start; // true if this line started with a capital letter
- int offset_start; // offset points to a 'new line' flag entry of the current line
-
-} LyricTimingData;
-
-void CKaraokeLyricsText::rescanLyrics()
-{
- // Rescan fixes the following things:
- // - lyrics without spaces;
- // - lyrics without paragraphs
- std::vector<LyricTimingData> lyricdata;
- unsigned int spaces = 0, syllables = 0, paragraph_lines = 0, max_lines_per_paragraph = 0;
-
- // First get some statistics from the lyrics: number of paragraphs, number of spaces
- // and time difference between one line ends and second starts
- for ( unsigned int i = 0; i < m_lyrics.size(); i++ )
- {
- if (m_lyrics[i].text.find(" ") != std::string::npos)
- spaces++;
-
- if ( m_lyrics[i].flags & LYRICS_NEW_LINE )
- paragraph_lines++;
-
- if ( m_lyrics[i].flags & LYRICS_NEW_PARAGRAPH )
- {
- if ( max_lines_per_paragraph < paragraph_lines )
- max_lines_per_paragraph = paragraph_lines;
-
- paragraph_lines = 0;
- }
-
- syllables++;
- }
-
- // Second, add spaces if less than 5%, and rescan to gather more data.
- bool add_spaces = (syllables && (spaces * 100 / syllables < 5)) ? true : false;
- const RESOLUTION_INFO info = g_graphicsContext.GetResInfo();
- float maxWidth = (float) info.Overscan.right - info.Overscan.left;
-
- std::string line_text;
- int prev_line_idx = -1;
- int prev_line_timediff = -1;
-
- for ( unsigned int i = 0; i < m_lyrics.size(); i++ )
- {
- if ( add_spaces )
- m_lyrics[i].text += " ";
-
- // We split the lyric when it is end of line, end of array, or current string is too long already
- if ( i == (m_lyrics.size() - 1)
- || (m_lyrics[i+1].flags & (LYRICS_NEW_LINE | LYRICS_NEW_PARAGRAPH)) != 0
- || getStringWidth( line_text + m_lyrics[i].text ) >= maxWidth )
- {
- // End of line, or end of array. Add current string.
- line_text += m_lyrics[i].text;
-
- // Reparagraph if we're out of screen width
- if ( getStringWidth( line_text ) >= maxWidth )
- max_lines_per_paragraph = 0;
-
- LyricTimingData ld;
- ld.width = getStringWidth( line_text );
- ld.timediff = prev_line_timediff;
- ld.offset_start = prev_line_idx;
-
- // This piece extracts the first character of a new string and makes it uppercase in Unicode way
- std::wstring temptext;
- g_charsetConverter.utf8ToW( line_text, temptext );
-
- // This is pretty ugly upper/lowercase for Russian unicode character set
- if ( temptext[0] >= 0x410 && temptext[0] <= 0x44F )
- ld.upper_start = temptext[0] <= 0x42F;
- else
- {
- std::string lower = m_lyrics[i].text;
- StringUtils::ToLower(lower);
- ld.upper_start = (m_lyrics[i].text == lower);
- }
-
- lyricdata.push_back( ld );
-
- // Reset the params
- line_text = "";
- prev_line_idx = i + 1;
- prev_line_timediff = (i == m_lyrics.size() - 1) ? -1 : m_lyrics[i+1].timing - m_lyrics[i].timing;
- }
- else
- {
- // Handle incorrect lyrics with no line feeds in the condition statement above
- line_text += m_lyrics[i].text;
- }
- }
-
- // Now see if we need to re-paragraph. Basically we reasonably need a paragraph
- // to have no more than 8 lines
- if ( max_lines_per_paragraph == 0 || max_lines_per_paragraph > 8 )
- {
- // Reparagraph
- unsigned int paragraph_lines = 0;
- float total_width = 0;
-
- CLog::Log( LOGDEBUG, "CKaraokeLyricsText: lines need to be reparagraphed" );
-
- for ( unsigned int i = 0; i < lyricdata.size(); i++ )
- {
- // Is this the first line?
- if ( lyricdata[i].timediff == -1 )
- {
- total_width = lyricdata[i].width;
- continue;
- }
-
- // Do we merge the current line with previous? We do it if:
- // - there is a room on the screen for those lines combined
- // - the time difference between line ends and new starts is less than 1.5 sec
- // - the first character in the new line is not uppercase (i.e. new logic line)
- if ( m_mergeLines && total_width + lyricdata[i].width < maxWidth && !lyricdata[i].upper_start && lyricdata[i].timediff < 15 )
- {
- // Merge
- m_lyrics[ lyricdata[i].offset_start ].flags &= ~(LYRICS_NEW_LINE | LYRICS_NEW_PARAGRAPH);
-
- // Since we merged the line, add the extra space. It will be removed later if not necessary.
- m_lyrics[ lyricdata[i].offset_start ].text = " " + m_lyrics[ lyricdata[i].offset_start ].text;
- total_width += lyricdata[i].width;
-
-// CLog::Log(LOGERROR, "Line merged; diff %d width %g, start %d, offset %d, max %g",
-// lyricdata[i].timediff, lyricdata[i].width, lyricdata[i].upper_start, lyricdata[i].offset_start, maxWidth );
- }
- else
- {
- // Do not merge; reset width and add counter
- total_width = lyricdata[i].width;
- paragraph_lines++;
-
-// CLog::Log(LOGERROR, "Line not merged; diff %d width %g, start %d, offset %d, max %g",
-// lyricdata[i].timediff, lyricdata[i].width, lyricdata[i].upper_start, lyricdata[i].offset_start, maxWidth );
- }
-
- // Set paragraph
- if ( paragraph_lines > 3 )
- {
- m_lyrics[ lyricdata[i].offset_start ].flags &= ~LYRICS_NEW_LINE;
- m_lyrics[ lyricdata[i].offset_start ].flags |= LYRICS_NEW_PARAGRAPH;
- paragraph_lines = 0;
- line_text = "";
- }
- }
- }
-
- // Prepare a new first lyric entry with song name and artist.
- if ( m_songName.empty() )
- {
- m_songName = URIUtils::GetFileName( getSongFile() );
- URIUtils::RemoveExtension( m_songName );
- }
-
- // Split the lyrics into per-character array
- std::vector<Lyric> newlyrics;
- bool title_entry = false;
-
- if ( m_lyrics.size() > 0 && m_lyrics[0].timing >= 50 )
- {
- // Add a new title/artist entry
- Lyric ltitle;
- ltitle.flags = 0;
- ltitle.timing = 0;
- ltitle.text = m_songName;
-
- if ( !m_artist.empty() )
- ltitle.text += "[CR][CR]" + m_artist;
-
- newlyrics.push_back( ltitle );
- title_entry = true;
- }
-
- bool last_was_space = false;
- bool invalid_timing_reported = false;
- for ( unsigned int i = 0; i < m_lyrics.size(); i++ )
- {
- std::wstring utf16;
- g_charsetConverter.utf8ToW( m_lyrics[i].text, utf16 );
-
- // Skip empty lyrics
- if ( utf16.size() == 0 )
- continue;
-
- // Use default timing for the last note
- unsigned int next_timing = m_lyrics[ i ].timing + m_delayAfter;
-
- if ( i < (m_lyrics.size() - 1) )
- {
- // Set the lenght for the syllable to the length of prev syllable if:
- // - this is not the first lyric (as there is no prev otherwise)
- // - this is the last lyric on this line (otherwise use next);
- // - this is not the ONLY lyric on this line (otherwise the calculation is wrong)
- // - lyrics size is the same as previous (currently removed).
- if ( i > 0
- && m_lyrics[ i + 1 ].flags & (LYRICS_NEW_LINE | LYRICS_NEW_PARAGRAPH)
- && ! (m_lyrics[ i ].flags & (LYRICS_NEW_LINE | LYRICS_NEW_PARAGRAPH) ) )
-// && m_lyrics[ i ].text.size() == m_lyrics[ i -1 ].text.size() )
- next_timing = m_lyrics[ i ].timing + (m_lyrics[ i ].timing - m_lyrics[ i -1 ].timing );
-
- // Sanity check
- if ( m_lyrics[ i+1 ].timing < m_lyrics[ i ].timing )
- {
- if ( !invalid_timing_reported )
- CLog::Log( LOGERROR, "Karaoke lyrics normalizer: time went backward, enabling workaround" );
-
- invalid_timing_reported = true;
- m_lyrics[ i ].timing = m_lyrics[ i+1 ].timing;
- }
-
- if ( m_lyrics[ i+1 ].timing < next_timing )
- next_timing = m_lyrics[ i+1 ].timing;
- }
-
- // Calculate how many 1/10 seconds we have per lyric character
- double time_per_char = ((double) next_timing - m_lyrics[ i ].timing) / utf16.size();
-
- // Convert to characters
- for ( unsigned int j = 0; j < utf16.size(); j++ )
- {
- Lyric l;
-
- // Copy flags only to the first character
- if ( j == 0 )
- l.flags = m_lyrics[i].flags;
- else
- l.flags = 0;
- l.timing = (unsigned int) MathUtils::round_int( m_lyrics[ i ].timing + j * time_per_char );
-
- g_charsetConverter.wToUTF8( utf16.substr(j, 1), l.text);
-
- if ( l.text == " " )
- {
- if ( last_was_space )
- continue;
-
- last_was_space = true;
- }
- else
- last_was_space = false;
-
- newlyrics.push_back( l );
- }
- }
-
- m_lyrics = newlyrics;
-
- // Set the NEW PARAGRAPH flag on the first real lyric entry since we changed it
- if ( title_entry )
- m_lyrics[1].flags |= LYRICS_NEW_PARAGRAPH;
-
- saveLyrics();
-}
-
-
-float CKaraokeLyricsText::getStringWidth(const std::string & text)
-{
- std::wstring utf16;
- vecText utf32;
-
- g_charsetConverter.utf8ToW(text, utf16);
-
- utf32.resize( utf16.size() );
- for ( unsigned int i = 0; i < utf16.size(); i++ )
- utf32[i] = utf16[i];
-
- return m_karaokeFont->GetTextWidth(utf32);
-}
-
-void CKaraokeLyricsText::saveLyrics()
-{
- XFILE::CFile file;
-
- std::string out;
-
- for ( unsigned int i = 0; i < m_lyrics.size(); i++ )
- {
- std::string timing = StringUtils::Format("%02d:%02d.%d",
- m_lyrics[i].timing / 600,
- (m_lyrics[i].timing % 600) / 10,
- (m_lyrics[i].timing % 10));
-
- if ( (m_lyrics[i].flags & LYRICS_NEW_PARAGRAPH) != 0 )
- out += "\n\n";
-
- if ( (m_lyrics[i].flags & LYRICS_NEW_LINE) != 0 )
- out += "\n";
-
- out += "[" + timing + "]" + m_lyrics[i].text;
- }
-
- out += "\n";
-
- if ( !file.OpenForWrite( "special://temp/tmp.lrc", true ) )
- return;
-
- file.Write( out.c_str(), out.size() );
-}
-
-
-bool CKaraokeLyricsText::HasBackground()
-{
- return false;
-}
-
-bool CKaraokeLyricsText::HasVideo()
-{
- return m_videoFile.empty() ? false : true;
-}
-
-void CKaraokeLyricsText::GetVideoParameters(std::string& path, int64_t& offset)
-{
- path = m_videoFile;
- offset = m_videoOffset;
-}
diff --git a/xbmc/music/karaoke/karaokelyricstext.h b/xbmc/music/karaoke/karaokelyricstext.h
deleted file mode 100644
index 015a120412..0000000000
--- a/xbmc/music/karaoke/karaokelyricstext.h
+++ /dev/null
@@ -1,205 +0,0 @@
-#ifndef KARAOKELYRICSTEXT_H
-#define KARAOKELYRICSTEXT_H
-
-/*
- * Copyright (C) 2005-2013 Team XBMC
- * http://xbmc.org
- *
- * This Program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2, or (at your option)
- * any later version.
- *
- * This Program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with XBMC; see the file COPYING. If not, see
- * <http://www.gnu.org/licenses/>.
- *
- */
-
-// C++ Interface: karaokelyricstext
-
-#include "karaokelyrics.h"
-
-// Karaoke colours
-// If you want to add more colors, it should be done the following way:
-// 1. Increase KARAOKE_COLOR_END
-// 2. Add a new color description in language/English/strings.xml in block
-// with id 22040 + KARAOKE_COLOR_END value
-// 3. Add a new color hex mask into gLyricColors structure in karaoke/karaokelyricstext.cpp
-#define KARAOKE_COLOR_START 0
-#define KARAOKE_COLOR_END 4
-
-class CGUITextLayout;
-class CGUIFont;
-
-//! This class is a base abstract class for all lyric loaders which provide text-based lyrics.
-//! Once the lyrics are properly transferred to this class, it will take care of rendering.
-//! Therefore the Render() function in the derived class might be empty, but must still call
-//! the parent function to function properly.
-class CKaraokeLyricsText : public CKaraokeLyrics
-{
- public:
- CKaraokeLyricsText();
- virtual ~CKaraokeLyricsText();
-
- //! Parses the lyrics or song file, and loads the lyrics into memory.
- //! Done in derived classes, this class only takes care of rendering.
- virtual bool Load() = 0;
-
- //! Most of text lyrics do not have any backgrounds
- virtual bool HasBackground();
-
- //! UStar lyrics might have video
- virtual bool HasVideo();
- virtual void GetVideoParameters(std::string& path, int64_t& offset );
-
- protected:
- enum
- {
- LYRICS_NONE = 0,
- LYRICS_NEW_LINE = 0x0001,
- LYRICS_NEW_PARAGRAPH = 0x0002,
- LYRICS_CONVERT_UTF8 = 0x0010,
- LYRICS_INVALID_PITCH = 0xFFFFFFFE,
- LYRICS_END = 0xFFFFFFFF
- };
-
- //! Render functionality from the parent class is handled here
- virtual void Render();
-
- //! This function is called when the karoke visualisation window created. It may
- //! be called after Start(), but is guaranteed to be called before Render()
- //! Default implementation does nothing and returns true.
- virtual bool InitGraphics();
-
- //! This function is called when the karoke visualisation window is destroyed.
- //! Default implementation does nothing.
- virtual void Shutdown();
-
- //! The loader should call this function to add each separate lyrics syllable.
- //! timing is in 1/10 seconds; if you have time in milliseconds, multiple by 100.
- //! flags could be 0 (regular), LYRICS_NEW_LINE (this syllable should start on a new line),
- //! and LYRICS_NEW_PARAGRAPH (this syllable should start on a new paragraph).
- //! If the lyrics support pitch (i.e. Ultrastar), it also should be specified.
- void addLyrics( const std::string& text, unsigned int timing, unsigned int flags = 0, unsigned int pitch = LYRICS_INVALID_PITCH );
-
- //! This function clears the lyrics array and resets song information
- void clearLyrics();
-
- //! This function calculares next paragraph of lyrics which will be shown. Returns true if indexes change
- void nextParagraph();
-
- //! Rescan lyrics, fix typical issues
- void rescanLyrics();
-
- //! Returns string width if rendered using current font
- float getStringWidth( const std::string& text );
-
- //! Saves parsed lyrics into a temporary file for debugging
- void saveLyrics();
-
- //! Those variables keep the song information if available, parsed from the lyrics file.
- //! It should not be based on filename, as this case will be handled internally.
- //! Should be set to "" if no information available.
- std::string m_songName;
- std::string m_artist;
- bool m_hasPitch;
- std::string m_videoFile;
- int64_t m_videoOffset;
-
- private:
-
- //! Lyrics render state machine
- enum
- {
- //! the next paragraph lyrics are not shown yet. Screen is clear.
- //! All indexes are set, m_index points to the first element.
- //! m_index timing - m_delayBefore shows when the state changes to STATE_DRAW_SYLLABLE
- STATE_WAITING,
-
- //! the next paragraph lyrics are shown, but the paragraph hasn't start yet.
- //! Using m_preambleTime, we redraw the marker each second.
- STATE_PREAMBLE,
-
- //! the lyrics are played, the end of paragraph is not reached.
- STATE_PLAYING_PARAGRAPH,
-
- //! the whole paragraph is colored, but still shown, waiting until it's time to clear the lyrics.
- //! m_index still points to the last entry, and m_indexNextPara points to the first entry of next
- //! paragraph, or to LYRICS_END. When the next paragraph is about to start (which is
- //! m_indexNextPara timing - m_delayBefore), the state switches to STATE_START_PARAGRAPH. When time
- //! goes after m_index timing + m_delayAfter, the state switches to STATE_WAITING,
- STATE_END_PARAGRAPH,
-
- //!< the song is completed, there are no more lyrics to show. This state is finita la comedia.
- STATE_END_SONG
- };
-
- typedef struct
- {
- std::string text;
- unsigned int timing;
- unsigned int flags;
- unsigned int pitch;
-
- } Lyric;
-
- std::vector<Lyric> m_lyrics;
-
- //! Text layout for lyrics
- CGUITextLayout * m_karaokeLayout;
-
- //! Text layout for preamble
- CGUITextLayout * m_preambleLayout;
-
- //! Fond for lyrics
- CGUIFont * m_karaokeFont;
-
- //! Lyrics colors
- unsigned int m_colorLyrics;
- unsigned int m_colorLyricsOutline;
- std::string m_colorSinging;
-
- //! This is index in m_lyrics pointing to current paragraph first, last and current elements
- unsigned int m_indexEndPara;
- unsigned int m_indexStartPara;
- unsigned int m_index;
-
- //! This is preamble timing, used to update preamble each second
- unsigned int m_lastPreambleUpdate;
-
- //! This is index in m_lyrics pointing to next paragraph.
- //! If LYRICS_END - there is no next paragraph
- unsigned int m_indexNextPara;
-
- //! Current lyrics rendering state
- unsigned int m_lyricsState;
-
- //! Lyrics text on screen
- std::string m_currentLyrics;
-
- //! Preamble text on screen
- std::string m_currentPreamble;
-
- //
- // Configuration settings
- //
- //! Number of 1/10 seconds between the lyrics are shown and start singing. 50 means 5 seconds
- unsigned int m_showLyricsBeforeStart;
- unsigned int m_showPreambleBeforeStart;
- bool m_mergeLines;
-
- //! Autosplitter uses this value to split paragraphs. If a new line starts in more than
- //! m_paragraphBreakTime after current line ends, it's a new paragraph.
- unsigned int m_paragraphBreakTime;
-
- //! Number of 1/10 seconds after the lyrics are sung. 50 means 5 seconds
- unsigned int m_delayAfter;
-};
-
-#endif
diff --git a/xbmc/music/karaoke/karaokelyricstextkar.cpp b/xbmc/music/karaoke/karaokelyricstextkar.cpp
deleted file mode 100644
index 98ffd9aa42..0000000000
--- a/xbmc/music/karaoke/karaokelyricstextkar.cpp
+++ /dev/null
@@ -1,597 +0,0 @@
-/*
- * Copyright (C) 2005-2013 Team XBMC
- * http://xbmc.org
- *
- * This Program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2, or (at your option)
- * any later version.
- *
- * This Program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with XBMC; see the file COPYING. If not, see
- * <http://www.gnu.org/licenses/>.
- *
- */
-
-// C++ Implementation: karaokelyricstextkar
-
-#include "utils/CharsetConverter.h"
-#include "filesystem/File.h"
-#include "settings/Settings.h"
-#include "utils/log.h"
-#include "utils/Utf8Utils.h"
-#include <math.h>
-
-#include "karaokelyricstextkar.h"
-
-
-// Parsed lyrics
-typedef struct
-{
- unsigned int clocks;
- unsigned int track;
- std::string text;
- unsigned int flags;
-
-} MidiLyrics;
-
-
-// Parsed tempo change structure
-typedef struct
-{
- unsigned int clocks;
- unsigned int tempo;
-
-} MidiTempo;
-
-
-// Parsed per-channel info
-typedef struct
-{
- unsigned int total_lyrics;
- unsigned int total_lyrics_space;
-
-} MidiChannelInfo;
-
-
-// Based entirely on class MidiTimestamp from pyKaraoke
-// Based entirely on class MidiTimestamp from pyKaraoke
-class MidiTimestamp
-{
- private:
- const std::vector<MidiTempo>& m_tempo;
- double m_currentMs;
- unsigned int m_currentClick;
- unsigned int m_tempoIndex;
- unsigned int m_division;
-
- public:
- MidiTimestamp( const std::vector<MidiTempo>& tempo, unsigned int division )
- : m_tempo (tempo), m_division (division)
- {
- reset();
- }
-
- void reset()
- {
- m_currentMs = 0.0;
- m_currentClick = 0;
- m_tempoIndex = 0;
- }
-
- double getTimeForClicks( unsigned int click, unsigned int tempo )
- {
- double microseconds = ( ( float(click) / m_division ) * tempo );
- return microseconds / 1000.0;
- }
-
- // Returns the "advanced" clock value in ms.
- double advanceClocks( unsigned int click )
- {
- // Moves time forward to the indicated click number.
- if ( m_currentClick > click )
- throw("Malformed lyrics timing");
-
- unsigned int clicks = click - m_currentClick;
-
- while ( clicks > 0 && m_tempoIndex < m_tempo.size() )
- {
- // How many clicks remain at the current tempo?
- unsigned int clicksRemaining = 0;
-
- if ( m_tempo[ m_tempoIndex ].clocks - m_currentClick > 0 )
- clicksRemaining = m_tempo[ m_tempoIndex ].clocks - m_currentClick;
-
- unsigned int clicksUsed = clicks < clicksRemaining ? clicks : clicksRemaining;
-
- if ( clicksUsed > 0 && m_tempoIndex > 0 )
- m_currentMs += getTimeForClicks( clicksUsed, m_tempo[ m_tempoIndex - 1 ].tempo );
-
- m_currentClick += clicksUsed;
- clicks -= clicksUsed;
- clicksRemaining -= clicksUsed;
-
- if ( clicksRemaining == 0 )
- m_tempoIndex++;
- }
-
- if ( clicks > 0 )
- {
- // We have reached the last tempo mark of the song, so this tempo holds forever.
- m_currentMs += getTimeForClicks( clicks, m_tempo[ m_tempoIndex - 1 ].tempo );
- m_currentClick += clicks;
- }
-
- return m_currentMs;
- }
-};
-
-
-
-CKaraokeLyricsTextKAR::CKaraokeLyricsTextKAR( const std::string & midiFile )
- : CKaraokeLyricsText()
- , m_midiFile(midiFile)
-{
-}
-
-
-CKaraokeLyricsTextKAR::~CKaraokeLyricsTextKAR()
-{
-}
-
-
-bool CKaraokeLyricsTextKAR::Load()
-{
- XFILE::CFile file;
- bool succeed = true;
- m_reportedInvalidVarField = false;
-
- // Clear the lyrics array
- clearLyrics();
-
- if (file.LoadFile(m_midiFile, m_midiData) <= 0)
- return false;
-
- file.Close();
-
- // Parse MIDI
- try
- {
- parseMIDI();
- }
- catch ( const char * p )
- {
- CLog::Log( LOGERROR, "KAR lyrics loader: cannot load file: %s", p );
- succeed = false;
- }
-
- m_midiData.clear();
- return succeed;
-}
-
-
-//
-// Got a lot of good ideas from pykaraoke by Kelvin Lawson (kelvinl@users.sf.net). Thanks!
-//
-void CKaraokeLyricsTextKAR::parseMIDI()
-{
- m_midiOffset = 0;
-
- // Bytes 0-4: header
- unsigned int header = readDword();
-
- // If we get MS RIFF header, skip it
- if ( header == 0x52494646 )
- {
- setPos( currentPos() + 16 );
- header = readDword();
- }
-
- // MIDI header
- if ( header != 0x4D546864 )
- throw( "Not a MIDI file" );
-
- // Bytes 5-8: header length
- unsigned int header_length = readDword();
-
- // Bytes 9-10: format
- unsigned short format = readWord();
-
- if ( format > 2 )
- throw( "Unsupported format" );
-
- // Bytes 11-12: tracks
- unsigned short tracks = readWord();
-
- // Bytes 13-14: divisious
- unsigned short divisions = readWord();
-
- if ( divisions > 32768 )
- throw( "Unsupported division" );
-
- // Number of tracks is always 1 if format is 0
- if ( format == 0 )
- tracks = 1;
-
- // Parsed per-channel info
- std::vector<MidiLyrics> lyrics;
- std::vector<MidiTempo> tempos;
- std::vector<MidiChannelInfo> channels;
-
- channels.resize( tracks );
-
- // Set up default tempo
- MidiTempo te;
- te.clocks = 0;
- te.tempo = 500000;
- tempos.push_back( te );
-
- int preferred_lyrics_track = -1;
- int lastchannel = 0;
- int laststatus = 0;
- unsigned int firstNoteClocks = 1000000000; // arbitrary large value
- unsigned int next_line_flag = 0;
-
- // Point to first byte after MIDI header
- setPos( 8 + header_length );
-
- // Parse all tracks
- for ( int track = 0; track < tracks; track++ )
- {
- char tempbuf[1024];
- unsigned int clocks = 0;
-
- channels[track].total_lyrics = 0;
- channels[track].total_lyrics_space = 0;
-
- // Skip malformed files
- if ( readDword() != 0x4D54726B )
- throw( "Malformed track header" );
-
- // Next track position
- int tracklen = readDword();
- unsigned int nexttrackstart = tracklen + currentPos();
-
- // Parse track until end of track event
- while ( currentPos() < nexttrackstart )
- {
- // field length
- clocks += readVarLen();
- unsigned char msgtype = readByte();
-
- //
- // Meta event
- //
- if ( msgtype == 0xFF )
- {
- unsigned char metatype = readByte();
- unsigned int metalength = readVarLen();
-
- if ( metatype == 3 )
- {
- // Track title metatype
- if ( metalength >= sizeof( tempbuf ) )
- throw( "Meta event too long" );
-
- readData( tempbuf, metalength );
- tempbuf[metalength] = '\0';
-
- if ( !strcmp( tempbuf, "Words" ) )
- preferred_lyrics_track = track;
- }
- else if ( metatype == 5 || metatype == 1 )
- {
- // Lyrics metatype
- if ( metalength >= sizeof( tempbuf ) )
- throw( "Meta event too long" );
-
- readData( tempbuf, metalength );
- tempbuf[metalength] = '\0';
-
- if ( (tempbuf[0] == '@' && tempbuf[1] >= 'A' && tempbuf[1] <= 'Z')
- || strstr( tempbuf, " SYX" ) || strstr( tempbuf, "Track-" )
- || strstr( tempbuf, "%-" ) || strstr( tempbuf, "%+" ) )
- {
- // Keywords
- if ( tempbuf[0] == '@' && tempbuf[1] == 'T' && strlen( tempbuf + 2 ) > 0 )
- {
- if ( m_songName.empty() )
- m_songName = convertText( tempbuf + 2 );
- else
- {
- if ( !m_artist.empty() )
- m_artist += "[CR]";
-
- m_artist += convertText( tempbuf + 2 );
- }
- }
- }
- else
- {
- MidiLyrics lyric;
- lyric.clocks = clocks;
- lyric.track = track;
- lyric.flags = next_line_flag;
-
- if ( tempbuf[0] == '\\' )
- {
- lyric.flags = CKaraokeLyricsText::LYRICS_NEW_PARAGRAPH;
- lyric.text = convertText( tempbuf + 1 );
- }
- else if ( tempbuf[0] == '/' )
- {
- lyric.flags = CKaraokeLyricsText::LYRICS_NEW_LINE;
- lyric.text = convertText( tempbuf + 1 );
- }
- else if ( tempbuf[1] == '\0' && (tempbuf[0] == '\n' || tempbuf[0] == '\r' ) )
- {
- // An empty line; do not add it but set the flag
- if ( next_line_flag == CKaraokeLyricsText::LYRICS_NEW_LINE )
- next_line_flag = CKaraokeLyricsText::LYRICS_NEW_PARAGRAPH;
- else
- next_line_flag = CKaraokeLyricsText::LYRICS_NEW_LINE;
- }
- else
- {
- next_line_flag = (strchr(tempbuf, '\n') || strchr(tempbuf, '\r')) ? CKaraokeLyricsText::LYRICS_NEW_LINE : CKaraokeLyricsText::LYRICS_NONE;
- lyric.text = convertText( tempbuf );
- }
-
- lyrics.push_back( lyric );
-
- // Calculate the number of spaces in current syllable
- for ( unsigned int j = 0; j < metalength; j++ )
- {
- channels[ track ].total_lyrics++;
-
- if ( tempbuf[j] == 0x20 )
- channels[ track ].total_lyrics_space++;
- }
- }
- }
- else if ( metatype == 0x51 )
- {
- // Set tempo event
- if ( metalength != 3 )
- throw( "Invalid tempo" );
-
- unsigned char a1 = readByte();
- unsigned char a2 = readByte();
- unsigned char a3 = readByte();
- unsigned int tempo = (a1 << 16) | (a2 << 8) | a3;
-
- // MIDI spec says tempo could only be on the first track...
- // but some MIDI editors still put it on second. Shouldn't break anything anyway, but let's see
- //if ( track != 0 )
- // throw( "Invalid tempo track" );
-
- // Check tempo array. If previous tempo has higher clocks, abort.
- if ( tempos.size() > 0 && tempos[ tempos.size() - 1 ].clocks > clocks )
- throw( "Invalid tempo" );
-
- // If previous tempo has the same clocks value, override it. Otherwise add new.
- if ( tempos.size() > 0 && tempos[ tempos.size() - 1 ].clocks == clocks )
- tempos[ tempos.size() - 1 ].tempo = tempo;
- else
- {
- MidiTempo mt;
- mt.clocks = clocks;
- mt.tempo = tempo;
-
- tempos.push_back( mt );
- }
- }
- else
- {
- // Skip the event completely
- setPos( currentPos() + metalength );
- }
- }
- else if ( msgtype== 0xF0 || msgtype == 0xF7 )
- {
- // SysEx event
- unsigned int length = readVarLen();
- setPos( currentPos() + length );
- }
- else
- {
- // Regular MIDI event
- if ( msgtype & 0x80 )
- {
- // Status byte
- laststatus = ( msgtype >> 4) & 0x07;
- lastchannel = msgtype & 0x0F;
-
- if ( laststatus != 0x07 )
- msgtype = readByte() & 0x7F;
- }
-
- switch ( laststatus )
- {
- case 0: // Note off
- readByte();
- break;
-
- case 1: // Note on
- if ( (readByte() & 0x7F) != 0 ) // this would be in fact Note off
- {
- // Remember the time the first note played
- if ( firstNoteClocks > clocks )
- firstNoteClocks = clocks;
- }
- break;
-
- case 2: // Key Pressure
- case 3: // Control change
- case 6: // Pitch wheel
- readByte();
- break;
-
- case 4: // Program change
- case 5: // Channel pressure
- break;
-
- default: // case 7: Ignore this event
- if ( (lastchannel & 0x0F) == 2 ) // Sys Com Song Position Pntr
- readWord();
- else if ( (lastchannel & 0x0F) == 3 ) // Sys Com Song Select(Song #)
- readByte();
- break;
- }
- }
- }
- }
-
- // The MIDI file is parsed. Now try to find the preferred lyric track
- if ( preferred_lyrics_track == -1 || channels[preferred_lyrics_track].total_lyrics == 0 )
- {
- unsigned int max_lyrics = 0;
-
- for ( unsigned int t = 0; t < tracks; t++ )
- {
- if ( channels[t].total_lyrics > max_lyrics )
- {
- preferred_lyrics_track = t;
- max_lyrics = channels[t].total_lyrics;
- }
- }
- }
-
- if ( preferred_lyrics_track == -1 )
- throw( "No lyrics found" );
-
- // We found the lyrics track. Dump some debug information.
- MidiTimestamp mts( tempos, divisions );
- double firstNoteTime = mts.advanceClocks( firstNoteClocks );
-
- CLog::Log( LOGDEBUG, "KAR lyric loader: found lyric track %d, first offset %d (%g ms)", preferred_lyrics_track, firstNoteClocks, firstNoteTime );
-
- // Now go through all lyrics on this track, convert them into time.
- mts.reset();
-
- for ( unsigned int i = 0; i < lyrics.size(); i++ )
- {
- if ( (int) lyrics[i].track != preferred_lyrics_track )
- continue;
-
- double lyrics_timing = mts.advanceClocks( lyrics[i].clocks );
-
- // Skip lyrics which start before the first note
- if ( lyrics_timing < firstNoteTime )
- continue;
-
- unsigned int mstime = (unsigned int)ceil( (lyrics_timing - firstNoteTime) / 100);
- addLyrics( lyrics[i].text, mstime, lyrics[i].flags );
- }
-}
-
-
-unsigned char CKaraokeLyricsTextKAR::readByte()
-{
- if (m_midiOffset >= m_midiData.size())
- throw( "Cannot read byte: premature end of file" );
-
- return (unsigned char) m_midiData.get()[m_midiOffset++];
-}
-
-unsigned short CKaraokeLyricsTextKAR::readWord()
-{
- if (m_midiOffset + 1 >= m_midiData.size())
- throw( "Cannot read word: premature end of file" );
-
- m_midiOffset += 2;
- return ((unsigned int)((unsigned char)m_midiData.get()[m_midiOffset-2])) << 8 |
- ((unsigned int)((unsigned char)m_midiData.get()[m_midiOffset-1]));
-}
-
-
-unsigned int CKaraokeLyricsTextKAR::readDword()
-{
- if (m_midiOffset + 3 >= m_midiData.size())
- throw( "Cannot read dword: premature end of file" );
-
- m_midiOffset += 4;
- return ((unsigned int)((unsigned char)m_midiData.get()[m_midiOffset-4])) << 24 |
- ((unsigned int)((unsigned char)m_midiData.get()[m_midiOffset-3])) << 16 |
- ((unsigned int)((unsigned char)m_midiData.get()[m_midiOffset-2])) << 8 |
- ((unsigned int)((unsigned char)m_midiData.get()[m_midiOffset-1]));
-}
-
-int CKaraokeLyricsTextKAR::readVarLen()
-{
- int l = 0, c;
-
- c = readByte();
-
- if ( !(c & 0x80) )
- return l | c;
-
- l = (l | (c & 0x7f)) << 7;
- c = readByte();
-
- if ( !(c & 0x80) )
- return l | c;
-
- l = (l | (c & 0x7f)) << 7;
- c = readByte();
-
- if ( !(c & 0x80) )
- return l | c;
-
- l = (l | (c & 0x7f)) << 7;
- c = readByte();
-
- if ( !(c & 0x80) )
- return l | c;
-
- if ( !m_reportedInvalidVarField )
- {
- m_reportedInvalidVarField = true;
- CLog::Log( LOGWARNING, "Warning: invalid MIDI file, workaround enabled but MIDI might not sound as expected" );
- }
-
- l = (l | (c & 0x7f)) << 7;
- c = readByte();
-
- if ( !(c & 0x80) )
- return l | c;
-
- throw( "Cannot read variable field" );
-}
-
-unsigned int CKaraokeLyricsTextKAR::currentPos() const
-{
- return m_midiOffset;
-}
-
-void CKaraokeLyricsTextKAR::setPos(unsigned int offset)
-{
- m_midiOffset = offset;
-}
-
-void CKaraokeLyricsTextKAR::readData(void * buf, unsigned int length)
-{
- for ( unsigned int i = 0; i < length; i++ )
- *((char*)buf + i) = readByte();
-}
-
-std::string CKaraokeLyricsTextKAR::convertText( const char * data )
-{
- std::string strUTF8;
-
- // Use some heuristics; need to replace by real detection stuff later
- if (CUtf8Utils::isValidUtf8(data) || CSettings::GetInstance().GetString(CSettings::SETTING_KARAOKE_CHARSET) == "DEFAULT")
- strUTF8 = data;
- else
- g_charsetConverter.ToUtf8( CSettings::GetInstance().GetString(CSettings::SETTING_KARAOKE_CHARSET), data, strUTF8 );
-
- if ( strUTF8.size() == 0 )
- strUTF8 = " ";
-
- return strUTF8;
-}
diff --git a/xbmc/music/karaoke/karaokelyricstextkar.h b/xbmc/music/karaoke/karaokelyricstextkar.h
deleted file mode 100644
index 8301e8b725..0000000000
--- a/xbmc/music/karaoke/karaokelyricstextkar.h
+++ /dev/null
@@ -1,62 +0,0 @@
-#ifndef KARAOKELYRICSTEXTKAR_H
-#define KARAOKELYRICSTEXTKAR_H
-
-/*
- * Copyright (C) 2005-2013 Team XBMC
- * http://xbmc.org
- *
- * This Program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2, or (at your option)
- * any later version.
- *
- * This Program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with XBMC; see the file COPYING. If not, see
- * <http://www.gnu.org/licenses/>.
- *
- */
-
-// C++ Interface: karaokelyricstextkar
-
-#include "karaokelyricstext.h"
-#include "utils/auto_buffer.h"
-
-//! This class loads MIDI/KAR format lyrics
-class CKaraokeLyricsTextKAR : public CKaraokeLyricsText
-{
- public:
- CKaraokeLyricsTextKAR( const std::string & midiFile );
- ~CKaraokeLyricsTextKAR();
-
- //! Parses the lyrics or song file, and loads the lyrics into memory.
- //! Returns true if the lyrics are successfully loaded, false otherwise.
- bool Load();
-
- private:
- void parseMIDI();
- std::string convertText( const char * data );
-
- unsigned char readByte();
- unsigned short readWord();
- unsigned int readDword();
- int readVarLen();
- void readData( void * buf, unsigned int length );
-
- unsigned int currentPos() const;
- void setPos( unsigned int offset );
-
- // MIDI file name
- std::string m_midiFile;
-
- // MIDI in-memory information
- XUTILS::auto_buffer m_midiData;
- size_t m_midiOffset;
- bool m_reportedInvalidVarField;
-};
-
-#endif
diff --git a/xbmc/music/karaoke/karaokelyricstextlrc.cpp b/xbmc/music/karaoke/karaokelyricstextlrc.cpp
deleted file mode 100644
index e8ed4157ad..0000000000
--- a/xbmc/music/karaoke/karaokelyricstextlrc.cpp
+++ /dev/null
@@ -1,541 +0,0 @@
-/*
- * Copyright (C) 2005-2013 Team XBMC
- * http://xbmc.org
- *
- * This Program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2, or (at your option)
- * any later version.
- *
- * This Program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with XBMC; see the file COPYING. If not, see
- * <http://www.gnu.org/licenses/>.
- *
- */
-
-// C++ Implementation: karaokelyricstextlrc
-
-#include <math.h>
-
-#include "filesystem/File.h"
-#include "settings/AdvancedSettings.h"
-#include "utils/MathUtils.h"
-#include "utils/log.h"
-
-#include "karaokelyricstextlrc.h"
-
-enum ParserState
-{
- PARSER_INIT, // looking for time
- PARSER_IN_TIME, // processing time
- PARSER_IN_LYRICS // processing lyrics
-};
-
-// Used in multi-time lyric loader
-typedef struct
-{
- std::string text;
- unsigned int timing;
- unsigned int flags;
-} MtLyric;
-
-CKaraokeLyricsTextLRC::CKaraokeLyricsTextLRC( const std::string & lyricsFile )
- : CKaraokeLyricsText()
- , m_lyricsFile(lyricsFile)
-{
-}
-
-
-CKaraokeLyricsTextLRC::~CKaraokeLyricsTextLRC()
-{
-}
-
-bool CKaraokeLyricsTextLRC::Load()
-{
- XFILE::CFile file;
-
- // Clear the lyrics array
- clearLyrics();
-
- XFILE::auto_buffer buf;
- if (file.LoadFile(m_lyricsFile, buf) <= 0)
- {
- CLog::Log(LOGERROR, "%s: can't load \"%s\" file", __FUNCTION__, m_lyricsFile.c_str());
- return false;
- }
-
- file.Close();
-
- // Parse the correction value
- int timing_correction = MathUtils::round_int( g_advancedSettings.m_karaokeSyncDelayLRC * 10 );
-
- unsigned int offset = 0;
-
- std::string songfilename = getSongFile();
-
- // Skip windoze UTF8 file prefix, if any, and reject UTF16 files
- if (buf.size() > 3)
- {
- if ((unsigned char)buf.get()[0] == 0xFF && (unsigned char)buf.get()[1] == 0xFE)
- {
- CLog::Log( LOGERROR, "LRC lyric loader: lyrics file is in UTF16 encoding, must be in UTF8" );
- return false;
- }
-
- // UTF8 prefix added by some windoze apps
- if ((unsigned char)buf.get()[0] == 0xEF && (unsigned char)buf.get()[1] == 0xBB && (unsigned char)buf.get()[2] == 0xBF)
- offset = 3;
- }
-
- if (checkMultiTime(buf.get() + offset, buf.size() - offset))
- return ParserMultiTime(buf.get() + offset, buf.size() - offset, timing_correction);
- else
- return ParserNormal(buf.get() + offset, buf.size() - offset, timing_correction);
-}
-
-bool CKaraokeLyricsTextLRC::checkMultiTime(char *lyricData, unsigned int lyricSize)
-{
- // return true only when find lines like:
- // [02:24][01:40][00:51][00:05]I'm a big big girl
- // but not like:
- // [00:01.10]I [00:01.09]just [00:01.50]call
- bool inTime = false;
- bool newLine = true;
- bool maybeMultiTime = false;
- unsigned int i = 0;
- for ( char * p = lyricData; i < lyricSize; i++, p++ )
- {
- if (inTime)
- {
- if (*p == ']')
- inTime = false;
- }
- else
- {
- if (*p == '[')
- {
- inTime = true;
- if (newLine)
- {
- newLine = false;
- }
- else
- {
- if (*(p - 1) != ']')
- return false;
- else
- maybeMultiTime = true;
- }
- }
- if (*p == '\n')
- newLine = true;
- }
- }
- return maybeMultiTime;
-}
-
-bool CKaraokeLyricsTextLRC::ParserNormal(char *lyricData, unsigned int lyricSize, int timing_correction)
-{
- CLog::Log( LOGDEBUG, "LRC lyric loader: parser normal lyrics file" );
- //
- // A simple state machine to parse the file
- //
- ParserState state = PARSER_INIT;
- unsigned int state_offset = 0;
- unsigned int lyric_flags = 0;
- int lyric_time = -1;
- int start_offset = 0;
- unsigned int offset = 0;
-
- for ( char * p = lyricData; offset < lyricSize; offset++, p++ )
- {
- // Skip \r
- if ( *p == 0x0D )
- continue;
-
- if ( state == PARSER_IN_LYRICS )
- {
- // Lyrics are terminated either by \n or by [
- if ( *p == '\n' || *p == '[' || *p == '<' )
- {
- // Time must be there
- if ( lyric_time == -1 )
- {
- CLog::Log( LOGERROR, "LRC lyric loader: lyrics file has no time before lyrics" );
- return false;
- }
-
- // Add existing lyrics
- char current = *p;
- std::string text;
-
- if ( offset > state_offset )
- {
- // null-terminate string, we saved current char anyway
- *p = '\0';
- text = &lyricData[0] + state_offset;
- }
- else
- text = " "; // add a single space for empty lyric
-
- // If this was end of line, set the flags accordingly
- if ( current == '\n' )
- {
- // Add space after the trailing lyric in lrc
- text += " ";
- addLyrics( text, lyric_time, lyric_flags | LYRICS_CONVERT_UTF8 );
- state_offset = -1;
- lyric_flags = CKaraokeLyricsText::LYRICS_NEW_LINE;
- state = PARSER_INIT;
- }
- else
- {
- // No conversion needed as the file should be in UTF8 already
- addLyrics( text, lyric_time, lyric_flags | LYRICS_CONVERT_UTF8 );
- lyric_flags = 0;
- state_offset = offset + 1;
- state = PARSER_IN_TIME;
- }
-
- lyric_time = -1;
- }
- }
- else if ( state == PARSER_IN_TIME )
- {
- // Time is terminated by ] or >
- if ( *p == ']' || *p == '>' )
- {
- int mins, secs, htenths, ltenths = 0;
-
- if ( offset == state_offset )
- {
- CLog::Log( LOGERROR, "LRC lyric loader: empty time" );
- return false; // [] - empty time
- }
-
- // null-terminate string
- char * timestr = &lyricData[0] + state_offset;
- *p = '\0';
-
- // Now check if this is time field or info tag. Info tags are like [ar:Pink Floyd]
- char * fieldptr = strchr( timestr, ':' );
- if ( timestr[0] >= 'a' && timestr[0] <= 'z' && timestr[1] >= 'a' && timestr[1] <= 'z' && fieldptr )
- {
- // Null-terminate the field name and switch to the field value
- *fieldptr = '\0';
- fieldptr++;
-
- while ( isspace( *fieldptr ) )
- fieldptr++;
-
- // Check the info field
- if ( !strcmp( timestr, "ar" ) )
- m_artist += fieldptr;
- else if ( !strcmp( timestr, "sr" ) )
- {
- // m_artist += "[CR]" + std::string( fieldptr ); // Add source to the artist name as a separate line
- }
- else if ( !strcmp( timestr, "ti" ) )
- m_songName = fieldptr;
- else if ( !strcmp( timestr, "offset" ) )
- {
- if ( sscanf( fieldptr, "%d", &start_offset ) != 1 )
- {
- CLog::Log( LOGERROR, "LRC lyric loader: invalid [offset:] value '%s'", fieldptr );
- return false; // [] - empty time
- }
-
- // Offset is in milliseconds; convert to 1/10 seconds
- start_offset /= 100;
- }
-
- state_offset = -1;
- state = PARSER_INIT;
- continue;
- }
- else if ( sscanf( timestr, "%d:%d.%1d%1d", &mins, &secs, &htenths, &ltenths ) == 4 )
- lyric_time = mins * 600 + secs * 10 + htenths + MathUtils::round_int( ltenths / 10 );
- else if ( sscanf( timestr, "%d:%d.%1d", &mins, &secs, &htenths ) == 3 )
- lyric_time = mins * 600 + secs * 10 + htenths;
- else if ( sscanf( timestr, "%d:%d", &mins, &secs ) == 2 )
- lyric_time = mins * 600 + secs * 10;
- else
- {
- // bad time
- CLog::Log( LOGERROR, "LRC lyric loader: lyrics file has no proper time field: '%s'", timestr );
- return false;
- }
-
- // Correct timing if necessary
- lyric_time += start_offset;
- lyric_time += timing_correction;
-
- if ( lyric_time < 0 )
- lyric_time = 0;
-
- // Set to next char
- state_offset = offset + 1;
- state = PARSER_IN_LYRICS;
- }
- }
- else if ( state == PARSER_INIT )
- {
- // Ignore spaces
- if ( *p == ' ' || *p == '\t' )
- continue;
-
- // We're looking for [ or <
- if ( *p == '[' || *p == '<' )
- {
- // Set to next char
- state_offset = offset + 1;
- state = PARSER_IN_TIME;
- lyric_time = -1;
- }
- else if ( *p == '\n' )
- {
- // If we get a newline and we're not paragraph, set it
- if ( lyric_flags & CKaraokeLyricsText::LYRICS_NEW_LINE )
- lyric_flags = CKaraokeLyricsText::LYRICS_NEW_PARAGRAPH;
- }
- else
- {
- // Everything else is error
- CLog::Log( LOGERROR, "LRC lyric loader: lyrics file does not start from time" );
- return false;
- }
- }
- }
- return true;
-}
-
-bool CKaraokeLyricsTextLRC::ParserMultiTime(char *lyricData, unsigned int lyricSize, int timing_correction)
-{
- CLog::Log( LOGDEBUG, "LRC lyric loader: parser mult-time lyrics file" );
- ParserState state = PARSER_INIT;
- unsigned int state_offset = 0;
- unsigned int lyric_flags = 0;
- std::vector<int> lyric_time(1, -1);
- int time_num = 0;
- std::vector<MtLyric> mtline;
- MtLyric line;
- int start_offset = 0;
- unsigned int offset = 0;
-
- for ( char * p = lyricData; offset < lyricSize; offset++, p++ )
- {
- // Skip \r
- if ( *p == 0x0D )
- continue;
-
- if ( state == PARSER_IN_LYRICS )
- {
- // Lyrics are terminated either by \n or by [
- if ( *p == '\n' || *p == '[' )
- {
- // Time must be there
- if ( lyric_time[0] == -1 )
- {
- CLog::Log( LOGERROR, "LRC lyric loader: lyrics file has no time before lyrics" );
- return false;
- }
-
- // Add existing lyrics
- char current = *p;
- std::string text;
-
- if ( offset > state_offset )
- {
- // null-terminate string, we saved current char anyway
- *p = '\0';
- text = &lyricData[0] + state_offset;
- }
- else
- text = " "; // add a single space for empty lyric
-
- // If this was end of line, set the flags accordingly
- if ( current == '\n' )
- {
- // Add space after the trailing lyric in lrc
- text += " ";
- for ( int i = 0; i <= time_num; i++ )
- {
- line.text = text;
- line.flags = lyric_flags | LYRICS_CONVERT_UTF8;
- line.timing = lyric_time[i];
- mtline.push_back( line );
- }
- state_offset = -1;
- lyric_flags = CKaraokeLyricsText::LYRICS_NEW_LINE;
- state = PARSER_INIT;
- }
- else
- {
- // No conversion needed as the file should be in UTF8 already
- for ( int i = 0; i <= time_num; i++ )
- {
- line.text = text;
- line.flags = lyric_flags | LYRICS_CONVERT_UTF8;
- line.timing = lyric_time[i];
- mtline.push_back( line );
- }
- lyric_flags = 0;
- state_offset = offset + 1;
- state = PARSER_IN_TIME;
- }
-
- time_num = 0;
- lyric_time.resize(1);
- lyric_time[0] = -1;
- }
- }
- else if ( state == PARSER_IN_TIME )
- {
- // Time is terminated by ] or >
- if ( *p == ']' || *p == '>' )
- {
- int mins, secs, htenths, ltenths = 0;
-
- if ( offset == state_offset )
- {
- CLog::Log( LOGERROR, "LRC lyric loader: empty time" );
- return false; // [] - empty time
- }
-
- // null-terminate string
- char * timestr = &lyricData[0] + state_offset;
- *p = '\0';
-
- // Now check if this is time field or info tag. Info tags are like [ar:Pink Floyd]
- char * fieldptr = strchr( timestr, ':' );
- if ( timestr[0] >= 'a' && timestr[0] <= 'z' && timestr[1] >= 'a' && timestr[1] <= 'z' && fieldptr )
- {
- // Null-terminate the field name and switch to the field value
- *fieldptr = '\0';
- fieldptr++;
-
- while ( isspace( *fieldptr ) )
- fieldptr++;
-
- // Check the info field
- if ( !strcmp( timestr, "ar" ) )
- m_artist += fieldptr;
- else if ( !strcmp( timestr, "sr" ) )
- {
- // m_artist += "[CR]" + std::string( fieldptr ); // Add source to the artist name as a separate line
- }
- else if ( !strcmp( timestr, "ti" ) )
- m_songName = fieldptr;
- else if ( !strcmp( timestr, "offset" ) )
- {
- if ( sscanf( fieldptr, "%d", &start_offset ) != 1 )
- {
- CLog::Log( LOGERROR, "LRC lyric loader: invalid [offset:] value '%s'", fieldptr );
- return false; // [] - empty time
- }
-
- // Offset is in milliseconds; convert to 1/10 seconds
- start_offset /= 100;
- }
-
- state_offset = -1;
- state = PARSER_INIT;
- continue;
- }
- else if ( sscanf( timestr, "%d:%d.%1d%1d", &mins, &secs, &htenths, &ltenths ) == 4 )
- lyric_time[time_num] = mins * 600 + secs * 10 + htenths + MathUtils::round_int( ltenths / 10 );
- else if ( sscanf( timestr, "%d:%d.%1d", &mins, &secs, &htenths ) == 3 )
- lyric_time[time_num] = mins * 600 + secs * 10 + htenths;
- else if ( sscanf( timestr, "%d:%d", &mins, &secs ) == 2 )
- lyric_time[time_num] = mins * 600 + secs * 10;
- else
- {
- // bad time
- CLog::Log( LOGERROR, "LRC lyric loader: lyrics file has no proper time field: '%s'", timestr );
- return false;
- }
-
- // Correct timing if necessary
- lyric_time[time_num] += start_offset;
- lyric_time[time_num] += timing_correction;
-
- if ( lyric_time[time_num] < 0 )
- lyric_time[time_num] = 0;
-
- // Multi-time line
- if ( *(p + 1) == '[' )
- {
- offset++;
- p++;
- state_offset = offset + 1;
- state = PARSER_IN_TIME;
- time_num++;
- lyric_time.push_back(-1);
- }
- else
- {
- // Set to next char
- state_offset = offset + 1;
- state = PARSER_IN_LYRICS;
- }
- }
- }
- else if ( state == PARSER_INIT )
- {
- // Ignore spaces
- if ( *p == ' ' || *p == '\t' )
- continue;
-
- // We're looking for [ or <
- if ( *p == '[' || *p == '<' )
- {
- // Set to next char
- state_offset = offset + 1;
- state = PARSER_IN_TIME;
-
- time_num = 0;
- lyric_time.resize(1);
- lyric_time[0] = -1;
- }
- else if ( *p == '\n' )
- {
- // If we get a newline and we're not paragraph, set it
- if ( lyric_flags & CKaraokeLyricsText::LYRICS_NEW_LINE )
- lyric_flags = CKaraokeLyricsText::LYRICS_NEW_PARAGRAPH;
- }
- else
- {
- // Everything else is error
- CLog::Log( LOGERROR, "LRC lyric loader: lyrics file does not start from time" );
- return false;
- }
- }
- }
-
- unsigned int lyricsNum = mtline.size();
- if ( lyricsNum >= 2 )
- {
- for ( unsigned int i = 0; i < lyricsNum - 1; i++ )
- {
- for ( unsigned int j = i + 1; j < lyricsNum; j++ )
- {
- if ( mtline[i].timing > mtline[j].timing )
- {
- line = mtline[i];
- mtline[i] = mtline[j];
- mtline[j] = line;
- }
- }
- }
- }
- for ( unsigned int i=0; i < lyricsNum; i++ )
- addLyrics( mtline[i].text, mtline[i].timing, mtline[i].flags );
-
- return true;
-}
-
diff --git a/xbmc/music/karaoke/karaokelyricstextlrc.h b/xbmc/music/karaoke/karaokelyricstextlrc.h
deleted file mode 100644
index 07f8e855fd..0000000000
--- a/xbmc/music/karaoke/karaokelyricstextlrc.h
+++ /dev/null
@@ -1,48 +0,0 @@
-#ifndef KARAOKELYRICSTEXTLRC_H
-#define KARAOKELYRICSTEXTLRC_H
-
-/*
- * Copyright (C) 2005-2013 Team XBMC
- * http://xbmc.org
- *
- * This Program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2, or (at your option)
- * any later version.
- *
- * This Program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with XBMC; see the file COPYING. If not, see
- * <http://www.gnu.org/licenses/>.
- *
- */
-
-// C++ Interface: karaokelyricstextlrc
-
-#include "karaokelyricstext.h"
-
-
-//! This class loads LRC format lyrics
-class CKaraokeLyricsTextLRC : public CKaraokeLyricsText
-{
- public:
- CKaraokeLyricsTextLRC( const std::string & lyricsFile );
- ~CKaraokeLyricsTextLRC();
-
- //! Parses the lyrics or song file, and loads the lyrics into memory. Returns true if the
- //! lyrics are successfully loaded, false otherwise.
- bool Load();
-
- private:
- bool checkMultiTime(char *lyricData, unsigned int lyricSize);
- bool ParserNormal(char *lyricData, unsigned int lyricSize, int timing_correction);
- bool ParserMultiTime(char *lyricData, unsigned int lyricSize, int timing_correction);
-
- std::string m_lyricsFile;
-};
-
-#endif
diff --git a/xbmc/music/karaoke/karaokelyricstextustar.cpp b/xbmc/music/karaoke/karaokelyricstextustar.cpp
deleted file mode 100644
index 7aba9eb8ed..0000000000
--- a/xbmc/music/karaoke/karaokelyricstextustar.cpp
+++ /dev/null
@@ -1,271 +0,0 @@
-/*
- * Copyright (C) 2005-2013 Team XBMC
- * http://xbmc.org
- *
- * This Program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2, or (at your option)
- * any later version.
- *
- * This Program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with XBMC; see the file COPYING. If not, see
- * <http://www.gnu.org/licenses/>.
- *
- */
-
-// C++ Implementation: karaokelyricstextlrc
-
-#include <cstdlib>
-#include <math.h>
-
-#include "filesystem/File.h"
-#include "utils/log.h"
-#include "utils/URIUtils.h"
-#include "utils/StringUtils.h"
-#include "karaokelyricstextustar.h"
-
-
-CKaraokeLyricsTextUStar::CKaraokeLyricsTextUStar( const std::string & lyricsFile )
- : CKaraokeLyricsText()
- , m_lyricsFile(lyricsFile)
-{
-}
-
-
-CKaraokeLyricsTextUStar::~CKaraokeLyricsTextUStar()
-{
-}
-
-
-std::vector< std::string > CKaraokeLyricsTextUStar::readFile(const std::string & lyricsFile, bool report_errors )
-{
- std::vector< std::string > lines;
-
- XFILE::CFile file;
- XFILE::auto_buffer buf;
-
- if (file.LoadFile(lyricsFile, buf) <= 0)
- {
- if (report_errors)
- CLog::Log(LOGERROR, "%s: can't load \"%s\" file", __FUNCTION__, lyricsFile.c_str());
-
- return std::vector< std::string >();
- }
- file.Close();
-
- const size_t lyricSize = buf.size();
-
- // Parse into the string array
- size_t offset = 0;
- size_t lineoffset = 0;
-
- while ( offset < lyricSize )
- {
- // End of line?
- if (buf.get()[offset] == 0x0D || buf.get()[offset] == 0x0A)
- {
- // An empty line?
- if ( lineoffset != offset )
- lines.push_back(std::string(buf.get() + lineoffset, offset - lineoffset));
-
- // Point to the next symbol
- lineoffset = offset + 1;
- }
-
- offset++;
- }
-
- // Last line, if any
- if ( lineoffset < lyricSize )
- lines.push_back(std::string(buf.get() + lineoffset, buf.size() - lineoffset));
-
- return lines;
-}
-
-
-bool CKaraokeLyricsTextUStar::isValidFile(const std::string & lyricsFile)
-{
- std::vector< std::string > lines = readFile( lyricsFile, false );
-
- if ( lines.size() == 0 )
- return false;
-
- // Generally the first line should start with '#' and the last line should start with 'E'
- return ( lines[0][0] == '#' && lines[lines.size()-1][0] == 'E' );
-}
-
-
-bool CKaraokeLyricsTextUStar::Load()
-{
- // Header parameters
- std::string coverimage, bgimage;
- int bpm = 0, startoffsetms = 0;
- bool relative = false;
-
- // Read the text file
- std::vector< std::string > lines = readFile( m_lyricsFile, true );
-
- if ( lines.size() == 0 )
- return false;
-
- // Clear the lyrics array
- clearLyrics();
-
- // Parse and validate the header according to
- // http://ultrastardeluxe.xtremeweb-hosting.net/wiki/doku.php?id=editor:txt_file
- unsigned int idx = 0;
-
- for ( ; idx < lines.size() && lines[idx][0] == '#'; idx++ )
- {
- // Parse into key:value
- size_t offset = lines[idx].find(':');
- if (offset == std::string::npos)
- {
- CLog::Log( LOGERROR, "UStar lyric loader: invalid line '%s', no semicolon", lines[idx].c_str() );
- return false;
- }
-
- std::string key = lines[idx].substr(1, offset - 1);
- std::string value = lines[idx].substr(offset + 1);
-
- if ( key == "TITLE" )
- m_songName = value;
- else if ( key == "ARTIST" )
- m_artist = value;
- else if ( key == "VIDEO" )
- {
- m_videoFile = URIUtils::GetDirectory(m_lyricsFile);
- m_videoFile = URIUtils::AddFileToFolder(m_videoFile, value);
-
- if ( !XFILE::CFile::Exists( m_videoFile ) )
- {
- CLog::Log( LOGERROR, "UStar lyric loader: VIDEO entry is present, but video file %s is not found", m_videoFile.c_str() );
- m_videoFile.clear();
- }
- }
- else if ( key == "COVER" )
- coverimage = value;
- else if ( key == "BACKGROUND" )
- bgimage = value;
- else if ( key == "VIDEOGAP" )
- m_videoOffset = atoi( value.c_str() );
- else if ( key == "BPM" )
- bpm = atoi( value.c_str() );
- else if ( key == "GAP" )
- startoffsetms = atoi( value.c_str() );
- else if ( key == "RELATIVE" )
- relative = StringUtils::EqualsNoCase(value, "YES");
- else if ( key == "LANGUAGE" || key == "EDITION" || key == "GENRE" || key == "YEAR" || key == "MP3" )
- {
- ; // do nothing
- }
- else
- CLog::Log( LOGWARNING, "UStar lyric loader: unsupported keyword '%s'", key.c_str() );
- }
-
- // BPM must be defined
- if ( bpm == 0 )
- {
- CLog::Log( LOGERROR, "UStar lyric loader: BPM is not defined, file is invalid" );
- return false;
- }
-
- // Should be more lines
- if ( idx == lines.size() )
- {
- CLog::Log( LOGERROR, "UStar lyric loader: no lyrics found besides the header" );
- return false;
- }
-
- double beatstep = 60.0 / bpm / 4.0;
- CLog::Log( LOGDEBUG, "UStar lyric loader: found valid lyrics, BPM is %d (%g)", bpm, beatstep );
-
- // Now parse the words/notes part
- int lyric_flags = 0;
-
- for ( ; idx < lines.size() && lines[idx][0] != 'E'; idx++ )
- {
- char type = lines[idx][0];
-
- // A valid type should be followed by space
- if ( type != 'F' && type != ':' && type != '*' && type != '-' && lines[idx][1] != ' ' )
- {
- CLog::Log( LOGERROR, "UStar lyric loader: invalid line '%s', bad note type or no tail space", lines[idx].c_str() );
- return false;
- }
-
- // Parse the numbers in the line into the vector
- int numbercount = (type == '-') ? 1 : 3;
- char * p = &(lines[idx][1]);
- std::vector< int > numbers;
-
- while ( numbercount > 0 )
- {
- unsigned int length = 0;
-
- // Skip all leading space
- while ( isspace( *p ) )
- p++;
-
- // skip non-space
- while ( p[length] && !isspace( p[length] ) )
- {
- if ( !isdigit( p[length] ) )
- {
- CLog::Log( LOGERROR, "UStar lyric loader: invalid line '%s', bad digit at back-position %d", lines[idx].c_str(), numbercount );
- return false;
- }
-
- length++;
- }
-
- p[length++] = '\0';
-
- if ( strlen(p) == 0 )
- {
- CLog::Log( LOGERROR, "UStar lyric loader: invalid line '%s', empty digit at back-position %d", lines[idx].c_str(), numbercount );
- return false;
- }
-
- numbers.push_back( atoi( p ) );
-
- // Adjust p
- p += length;
- numbercount--;
- }
-
- int notestart_timing = (int)((numbers[0] * beatstep) * 10 + (startoffsetms / 100));
-
- if ( type != '-' )
- {
- // Pitch is not used yet; notelenght will not be used at all
- //int notelength = numbers[1] * beatstep * 10;
- //int notepitch = numbers[2];
-
- addLyrics( p, notestart_timing, lyric_flags | LYRICS_CONVERT_UTF8 );
- lyric_flags = 0;
-
- //CLog::Log( LOGDEBUG, ":: %d %d [%d - %d] %d '%s'", numbers[0], numbers[1], notestart_timing, notelength, notepitch, text );
- }
- else
- {
- lyric_flags = CKaraokeLyricsText::LYRICS_NEW_LINE;
- addLyrics( " ", notestart_timing, lyric_flags | LYRICS_CONVERT_UTF8 );
-
- // If we're relative, adjust to the pause start
- if ( relative )
- startoffsetms += (int)((numbers[0] * beatstep) * 10);
-
- //CLog::Log( LOGERROR, ":: [stop] %d [%d]", numbers[0], notestart_timing );
- }
- }
-
- // Indicate that lyrics have pitch
- m_hasPitch = true;
- return true;
-}
diff --git a/xbmc/music/karaoke/karaokelyricstextustar.h b/xbmc/music/karaoke/karaokelyricstextustar.h
deleted file mode 100644
index 8e2aced3e8..0000000000
--- a/xbmc/music/karaoke/karaokelyricstextustar.h
+++ /dev/null
@@ -1,49 +0,0 @@
-#ifndef KARAOKELYRICSTEXTUSTAR_H
-#define KARAOKELYRICSTEXTUSTAR_H
-
-/*
- * Copyright (C) 2005-2013 Team XBMC
- * http://xbmc.org
- *
- * This Program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2, or (at your option)
- * any later version.
- *
- * This Program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with XBMC; see the file COPYING. If not, see
- * <http://www.gnu.org/licenses/>.
- *
- */
-
-// C++ Interface: karaokelyricstextlrc
-
-#include "karaokelyricstext.h"
-
-
-//! This class loads UltraStar format lyrics
-class CKaraokeLyricsTextUStar : public CKaraokeLyricsText
-{
- public:
- CKaraokeLyricsTextUStar( const std::string & lyricsFile );
- ~CKaraokeLyricsTextUStar();
-
- //! Parses the lyrics or song file, and loads the lyrics into memory. Returns true if the
- //! lyrics are successfully loaded, false otherwise.
- bool Load();
-
- static bool isValidFile( const std::string & lyricsFile );
-
- private:
- static std::vector<std::string> readFile( const std::string & lyricsFile, bool report_errors );
-
- private:
- std::string m_lyricsFile;
-};
-
-#endif
diff --git a/xbmc/music/karaoke/karaokevideobackground.cpp b/xbmc/music/karaoke/karaokevideobackground.cpp
deleted file mode 100644
index dae59ac251..0000000000
--- a/xbmc/music/karaoke/karaokevideobackground.cpp
+++ /dev/null
@@ -1,186 +0,0 @@
-/*
- * Copyright (C) 2005-2013 Team XBMC
- * http://xbmc.org
- *
- * This Program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2, or (at your option)
- * any later version.
- *
- * This Program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with XBMC; see the file COPYING. If not, see
- * <http://www.gnu.org/licenses/>.
- *
- */
-
-#include "karaokevideobackground.h"
-
-#include "guilib/GraphicContext.h"
-#include "guilib/Texture.h"
-#include "guilib/GUITexture.h"
-#include "Application.h"
-#include "filesystem/SpecialProtocol.h"
-#include "settings/AdvancedSettings.h"
-#include "video/FFmpegVideoDecoder.h"
-#include "system.h"
-#include "utils/log.h"
-
-KaraokeVideoBackground::KaraokeVideoBackground()
-{
- m_decoder = new FFmpegVideoDecoder();
- m_timeFromPrevSong = 0.0;
- m_texture = 0;
-}
-
-KaraokeVideoBackground::~KaraokeVideoBackground()
-{
- delete m_decoder;
- delete m_texture;
-}
-
-bool KaraokeVideoBackground::openVideoFile( const std::string& filename )
-{
- std::string realPath = CSpecialProtocol::TranslatePath( filename );
-
- if ( !m_decoder->open( realPath ) )
- {
- CLog::Log( LOGERROR, "Karaoke Video Background: %s, video file %s (%s)", m_decoder->getErrorMsg().c_str(), filename.c_str(), realPath.c_str() );
- return false;
- }
-
- m_videoWidth = m_decoder->getWidth();
- m_videoHeight = m_decoder->getHeight();
- m_curVideoFile = filename;
-
- // Find out the necessary aspect ratio for height (assuming fit by width) and width (assuming fit by height)
- const RESOLUTION_INFO info = g_graphicsContext.GetResInfo();
- m_displayLeft = info.Overscan.left;
- m_displayRight = info.Overscan.right;
- m_displayTop = info.Overscan.top;
- m_displayBottom = info.Overscan.bottom;
-
- int screen_width = m_displayRight - m_displayLeft;
- int screen_height = m_displayBottom - m_displayTop;
-
- // Do we need to modify the output video size? This could happen in two cases:
- // 1. Either video dimension is larger than the screen - video needs to be downscaled
- // 2. Both video dimensions are smaller than the screen - video needs to be upscaled
- if ( ( m_videoWidth > 0 && m_videoHeight > 0 )
- && ( ( m_videoWidth > screen_width || m_videoHeight > screen_height )
- || ( m_videoWidth < screen_width && m_videoHeight < screen_height ) ) )
- {
- // Calculate the scale coefficients for width/height separately
- double scale_width = (double) screen_width / (double) m_videoWidth;
- double scale_height = (double) screen_height / (double) m_videoHeight;
-
- // And apply the smallest
- double scale = scale_width < scale_height ? scale_width : scale_height;
- m_videoWidth = (int) (m_videoWidth * scale);
- m_videoHeight = (int) (m_videoHeight * scale);
- }
-
- // Calculate the desktop dimensions to show the video
- if ( m_videoWidth < screen_width || m_videoHeight < screen_height )
- {
- m_displayLeft = (screen_width - m_videoWidth) / 2;
- m_displayRight -= m_displayLeft;
-
- m_displayTop = (screen_height - m_videoHeight) / 2;
- m_displayBottom -= m_displayTop;
- }
-
- m_millisecondsPerFrame = 1.0 / m_decoder->getFramesPerSecond();
-
- CLog::Log( LOGDEBUG, "Karaoke Video Background: Video file %s (%dx%d) length %g seconds opened successfully, will be shown as %dx%d at (%d, %d - %d, %d) rectangle",
- filename.c_str(),
- m_decoder->getWidth(), m_decoder->getHeight(),
- m_decoder->getDuration(),
- m_videoWidth, m_videoHeight,
- m_displayLeft, m_displayTop, m_displayRight, m_displayBottom );
-
- return true;
-}
-
-void KaraokeVideoBackground::closeVideoFile()
-{
- m_decoder->close();
-}
-
-void KaraokeVideoBackground::Render()
-{
- // Just in case
- if ( !m_texture )
- return;
-
- // Get the current song timing in ms.
- // This will only fit songs up to 71,000 hours, so if you got a larger one, change to int64
- double current = g_application.GetTime();
-
- // We're supposed to show m_decoder->getFramesPerSecond() frames in one second.
- if ( current >= m_nextFrameTime )
- {
- // We don't care to adjust for the exact timing as we don't worry about the exact frame rate
- m_nextFrameTime = current + m_millisecondsPerFrame - (current - m_nextFrameTime);
-
- while ( true )
- {
- if ( !m_decoder->nextFrame( m_texture ) )
- {
- // End of video; restart
- m_decoder->seek( 0.0 );
- m_nextFrameTime = 0.0;
- continue;
- }
-
- break;
- }
- }
-
- // We got a frame. Draw it.
- CRect vertCoords((float) m_displayLeft, (float) m_displayTop, (float) m_displayRight, (float) m_displayBottom );
- CGUITexture::DrawQuad(vertCoords, 0xffffffff, m_texture );
-}
-
-bool KaraokeVideoBackground::Start( const std::string& filename )
-{
- if ( !filename.empty() )
- {
- if ( !openVideoFile( filename ) )
- return false;
-
- m_timeFromPrevSong = 0;
- }
- else
- {
- if ( !openVideoFile( g_advancedSettings.m_karaokeDefaultBackgroundFilePath ) )
- return false;
-
- if ( m_timeFromPrevSong != 0.0 && !m_decoder->seek( m_timeFromPrevSong ) )
- m_timeFromPrevSong = 0;
- }
-
- // Allocate the texture
- m_texture = new CTexture( m_videoWidth, m_videoHeight, XB_FMT_A8R8G8B8 );
-
- if ( !m_texture )
- {
- CLog::Log( LOGERROR, "Karaoke Video Background: Could not allocate texture" );
- return false;
- }
-
- m_nextFrameTime = 0.0;
- return true;
-}
-
-void KaraokeVideoBackground::Stop()
-{
- delete m_texture;
- m_texture = 0;
-
- m_timeFromPrevSong = m_decoder->getLastFrameTime();
-}
diff --git a/xbmc/music/karaoke/karaokevideobackground.h b/xbmc/music/karaoke/karaokevideobackground.h
deleted file mode 100644
index 146cdaae43..0000000000
--- a/xbmc/music/karaoke/karaokevideobackground.h
+++ /dev/null
@@ -1,85 +0,0 @@
-#ifndef KARAOKEVIDEOFFMPEG_H
-#define KARAOKEVIDEOFFMPEG_H
-
-/*
- * Copyright (C) 2005-2013 Team XBMC
- * http://xbmc.org
- *
- * This Program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2, or (at your option)
- * any later version.
- *
- * This Program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with XBMC; see the file COPYING. If not, see
- * <http://www.gnu.org/licenses/>.
- *
- */
-
-#include <string>
-
-class CBaseTexture;
-class FFmpegVideoDecoder;
-
-// C++ Interface: karaokevideoffmpeg
-// Contact: oldnemesis
-//
-// FFMpeg-based background video decoder for Karaoke background.
-// We are not using DVDPlayer for this because:
-// 1. DVDPlayer was not designed to run at the same time when music is being played and other things (like lyrics) rendered.
-// While this setup works from time to time, it constantly gets broken. Some modes, like VDPAU, lead to crash right away.
-//
-// 2. We do not need to decode audio, hence we don't have to use extra CPU.
-//
-// 3. We do not really care about frame rate. Jerky video is fine for the background. Lyrics sync is much more important.
-//
-class KaraokeVideoBackground
-{
-public:
- KaraokeVideoBackground();
- ~KaraokeVideoBackground();
-
- // Start playing the video. It is called each time a new song is being played. Should continue playing existing
- // video from the position it was paused. If it returns false, the video rendering is disabled and
- // KaraokeVideoFFMpeg object is deleted. Must write the reason for failure into the log file.
- bool Start( const std::string& filename = "" );
-
- // Render the current frame into the screen. This function also must handle video loops and
- // switching to the next video when necessary. Hence it shouldn't take too long.
- void Render();
-
- // Stops playing the video. It is called once the song is finished and the Render() is not going to be called anymore.
- // The object, however, is kept and should keep its state because it must continue on next Start() call.
- void Stop();
-
-private:
- // Initialize the object. This function is called only once when the object is created or after it has been dismissed.
- // If it returns false, the video rendering is disabled and KaraokeVideoFFMpeg object is deleted
- bool Init();
-
- // Dismisses the object, freeing all the memory and unloading the libraries. The object must be inited before using again.
- void Dismiss();
-
- bool openVideoFile( const std::string& filename );
- void closeVideoFile();
-
- // FFMpeg objects
- FFmpegVideoDecoder * m_decoder;
-
- std::string m_curVideoFile;
- int m_videoWidth; // shown video width, i.e. upscaled or downscaled as necessary
- int m_videoHeight; // shown video height, i.e. upscaled or downscaled as necessary
- int m_displayLeft, m_displayRight, m_displayTop, m_displayBottom; // Video as shown at the display
- double m_millisecondsPerFrame;
- double m_nextFrameTime;
- double m_timeFromPrevSong;
-
- CBaseTexture *m_texture;
-};
-
-#endif
diff --git a/xbmc/music/karaoke/karaokewindowbackground.cpp b/xbmc/music/karaoke/karaokewindowbackground.cpp
deleted file mode 100644
index 4af54822c2..0000000000
--- a/xbmc/music/karaoke/karaokewindowbackground.cpp
+++ /dev/null
@@ -1,258 +0,0 @@
-/*
- * Copyright (C) 2005-2013 Team XBMC
- * http://xbmc.org
- *
- * This Program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2, or (at your option)
- * any later version.
- *
- * This Program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with XBMC; see the file COPYING. If not, see
- * <http://www.gnu.org/licenses/>.
- *
- */
-
-// C++ Implementation: karaokewindowbackground
-
-#include "system.h"
-#include "settings/AdvancedSettings.h"
-#include "guilib/GUIWindowManager.h"
-#include "Application.h"
-#include "GUIUserMessages.h"
-#include "guilib/GUIVisualisationControl.h"
-#include "guilib/GUIImage.h"
-#include "threads/SingleLock.h"
-#include "utils/log.h"
-
-#include "karaokewindowbackground.h"
-#include "karaokevideobackground.h"
-
-
-#define CONTROL_ID_VIS 1
-#define CONTROL_ID_IMG 2
-
-
-CKaraokeWindowBackground::CKaraokeWindowBackground()
-{
- m_currentMode = BACKGROUND_NONE;
- m_defaultMode = BACKGROUND_NONE;
- m_parentWindow = 0;
-
- m_VisControl = 0;
- m_ImgControl = 0;
-
- m_videoPlayer = 0;
- m_parentWindow = 0;
-}
-
-
-CKaraokeWindowBackground::~CKaraokeWindowBackground()
-{
- if ( m_videoPlayer )
- delete m_videoPlayer;
-}
-
-
-void CKaraokeWindowBackground::Init(CGUIWindow * wnd)
-{
- // Init controls
- m_VisControl = (CGUIVisualisationControl*) wnd->GetControl( CONTROL_ID_VIS );
- m_ImgControl = (CGUIImage*) wnd->GetControl( CONTROL_ID_IMG );
-
- // Init visialisation variables
- std::string defBkgType = g_advancedSettings.m_karaokeDefaultBackgroundType;
-
- if ( defBkgType.empty() || defBkgType == "none" )
- {
- CLog::Log( LOGDEBUG, "Karaoke default background is set to none" );
- m_defaultMode = BACKGROUND_NONE;
- }
- else if ( defBkgType == "vis" || defBkgType == "viz" )
- {
- CLog::Log( LOGDEBUG, "Karaoke default background is visualisation" );
- m_defaultMode = BACKGROUND_VISUALISATION;
- }
- else if ( defBkgType == "image" && !g_advancedSettings.m_karaokeDefaultBackgroundFilePath.empty() )
- {
- CLog::Log( LOGDEBUG, "Karaoke default background is image %s", g_advancedSettings.m_karaokeDefaultBackgroundFilePath.c_str() );
- m_defaultMode = BACKGROUND_IMAGE;
- m_path = g_advancedSettings.m_karaokeDefaultBackgroundFilePath;
- }
- else if ( defBkgType == "video" && !g_advancedSettings.m_karaokeDefaultBackgroundFilePath.empty() )
- {
- CLog::Log( LOGDEBUG, "Karaoke default background is video %s", g_advancedSettings.m_karaokeDefaultBackgroundFilePath.c_str() );
- m_defaultMode = BACKGROUND_VIDEO;
- }
-}
-
-
-bool CKaraokeWindowBackground::OnAction(const CAction & action)
-{
- CSingleLock lock (m_CritSectionShared);
-
- // Send it to the visualisation if we have one
- if ( m_currentMode == BACKGROUND_VISUALISATION )
- return m_VisControl->OnAction(action);
-
- return false;
-}
-
-
-bool CKaraokeWindowBackground::OnMessage(CGUIMessage & message)
-{
- CSingleLock lock (m_CritSectionShared);
-
- // Forward visualisation control messages
- switch ( message.GetMessage() )
- {
- case GUI_MSG_PLAYBACK_STARTED:
- if ( m_currentMode == BACKGROUND_VISUALISATION )
- return m_VisControl->OnMessage(message);
- break;
-
- case GUI_MSG_GET_VISUALISATION:
- if ( m_currentMode == BACKGROUND_VISUALISATION )
- return m_VisControl->OnMessage(message);
- break;
-
- case GUI_MSG_VISUALISATION_ACTION:
- if ( m_currentMode == BACKGROUND_VISUALISATION )
- return m_VisControl->OnMessage(message);
- break;
- }
-
- return false;
-}
-
-
-void CKaraokeWindowBackground::Render()
-{
- CSingleLock lock (m_CritSectionShared);
-
- // Proceed with video rendering
- if ( m_currentMode == BACKGROUND_VIDEO && m_videoPlayer )
- {
- m_videoPlayer->Render();
- }
-
- // For other visualisations just disable the screen saver
- g_application.ResetScreenSaver();
-}
-
-
-void CKaraokeWindowBackground::StartEmpty()
-{
- m_VisControl->SetVisible( false );
- m_ImgControl->SetVisible( false );
- m_currentMode = BACKGROUND_NONE;
- CLog::Log( LOGDEBUG, "Karaoke background started using BACKGROUND_NONE mode" );
-}
-
-
-void CKaraokeWindowBackground::StartVisualisation()
-{
- // Showing controls
- m_ImgControl->SetVisible( false );
- m_VisControl->SetVisible( true );
-
- m_currentMode = BACKGROUND_VISUALISATION;
- CLog::Log( LOGDEBUG, "Karaoke background started using BACKGROUND_VISUALISATION mode" );
-}
-
-
-void CKaraokeWindowBackground::StartImage( const std::string& path )
-{
- // Showing controls
- m_ImgControl->SetVisible( true );
- m_VisControl->SetVisible( false );
-
- m_ImgControl->SetFileName( path );
-
- m_currentMode = BACKGROUND_IMAGE;
- CLog::Log( LOGDEBUG, "Karaoke background started using BACKGROUND_IMAGE mode using image %s", path.c_str() );
-}
-
-
-void CKaraokeWindowBackground::StartVideo( const std::string& path )
-{
- if ( !m_videoPlayer )
- m_videoPlayer = new KaraokeVideoBackground();
-
- if ( !m_videoPlayer->Start( path ) )
- {
- delete m_videoPlayer;
- m_videoPlayer = 0;
- m_currentMode = BACKGROUND_NONE;
- return;
- }
-
- m_ImgControl->SetVisible( false );
- m_VisControl->SetVisible( false );
- m_currentMode = BACKGROUND_VIDEO;
-}
-
-
-void CKaraokeWindowBackground::StartDefault()
-{
- // just in case
- m_ImgControl->SetVisible( false );
- m_VisControl->SetVisible( false );
-
- switch ( m_defaultMode )
- {
- case BACKGROUND_VISUALISATION:
- StartVisualisation();
- break;
-
- case BACKGROUND_IMAGE:
- StartImage( m_path );
- break;
-
- case BACKGROUND_VIDEO:
- StartVideo();
- break;
-
- default:
- StartEmpty();
- break;
- }
-}
-
-
-void CKaraokeWindowBackground::Stop()
-{
- CSingleLock lock (m_CritSectionShared);
- m_currentMode = BACKGROUND_NONE;
-
- if ( m_videoPlayer )
- m_videoPlayer->Stop();
-
- CLog::Log( LOGDEBUG, "Karaoke background stopped" );
-}
-
-
-void CKaraokeWindowBackground::OnPlayBackEnded()
-{
-}
-
-void CKaraokeWindowBackground::OnPlayBackStarted()
-{
-}
-
-void CKaraokeWindowBackground::OnPlayBackStopped()
-{
-}
-
-void CKaraokeWindowBackground::OnQueueNextItem()
-{
-}
-
-void CKaraokeWindowBackground::Pause(bool now_paused)
-{
-}
diff --git a/xbmc/music/karaoke/karaokewindowbackground.h b/xbmc/music/karaoke/karaokewindowbackground.h
deleted file mode 100644
index e799716af9..0000000000
--- a/xbmc/music/karaoke/karaokewindowbackground.h
+++ /dev/null
@@ -1,102 +0,0 @@
-#ifndef KARAOKEWINDOWBACKGROUND_H
-#define KARAOKEWINDOWBACKGROUND_H
-
-/*
- * Copyright (C) 2005-2013 Team XBMC
- * http://xbmc.org
- *
- * This Program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2, or (at your option)
- * any later version.
- *
- * This Program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with XBMC; see the file COPYING. If not, see
- * <http://www.gnu.org/licenses/>.
- *
- */
-
-// C++ Interface: karaokewindowbackground
-
-#include "cores/IPlayerCallback.h"
-
-class CGUIWindow;
-class CGUIImage;
-class CGUIVisualisationControl;
-class KaraokeVideoBackground;
-
-class CKaraokeWindowBackground : public IPlayerCallback
-{
-public:
- CKaraokeWindowBackground();
- ~CKaraokeWindowBackground();
-
- virtual void Init(CGUIWindow * wnd);
-
- // Start with empty background
- virtual void StartEmpty();
-
- // Start with visualisation background
- virtual void StartVisualisation();
-
- // Start with song-specific still image background
- virtual void StartImage( const std::string& path );
-
- // Start with song-specific video background
- virtual void StartVideo( const std::string& path = "" );
-
- // Start with default (setting-specific) background
- virtual void StartDefault();
-
- // Pause or continue the background
- virtual void Pause( bool now_paused );
-
- // Stop any kind of background
- virtual void Stop();
-
- // Function forwarders
- virtual bool OnAction(const CAction &action);
- virtual bool OnMessage(CGUIMessage& message);
- virtual void Render();
-
- // IPlayer callbacks
- virtual void OnPlayBackEnded();
- virtual void OnPlayBackStarted();
- virtual void OnPlayBackStopped();
- virtual void OnQueueNextItem();
-
-private:
- enum BackgroundMode
- {
- BACKGROUND_NONE,
- BACKGROUND_VISUALISATION,
- BACKGROUND_IMAGE,
- BACKGROUND_VIDEO
- };
-
- // This critical section protects all variables except m_videoEnded
- CCriticalSection m_CritSectionShared;
-
- // for visualization background
- CGUIVisualisationControl * m_VisControl;
- CGUIImage * m_ImgControl;
-
- BackgroundMode m_currentMode;
-
- // Parent window pointer
- CGUIWindow * m_parentWindow;
-
- // Video player pointer
- KaraokeVideoBackground * m_videoPlayer;
-
- // For default visualisation mode
- BackgroundMode m_defaultMode;
- std::string m_path; // image
-};
-
-#endif
diff --git a/xbmc/music/tags/MusicInfoTag.cpp b/xbmc/music/tags/MusicInfoTag.cpp
index 08ac5f0f26..edb102ade4 100644
--- a/xbmc/music/tags/MusicInfoTag.cpp
+++ b/xbmc/music/tags/MusicInfoTag.cpp
@@ -18,6 +18,8 @@
*
*/
+#include <algorithm>
+
#include "MusicInfoTag.h"
#include "music/Album.h"
#include "music/Artist.h"
@@ -343,10 +345,10 @@ void CMusicInfoTag::SetArtist(const std::string& strArtist)
}
}
-void CMusicInfoTag::SetArtist(const std::vector<std::string>& artists)
+void CMusicInfoTag::SetArtist(const std::vector<std::string>& artists, bool FillDesc /* = false*/)
{
m_artist = artists;
- if (m_strArtistDesc.empty())
+ if (m_strArtistDesc.empty() || FillDesc)
{
SetArtistDesc(StringUtils::Join(artists, g_advancedSettings.m_musicItemSeparator));
}
@@ -381,10 +383,10 @@ void CMusicInfoTag::SetAlbumArtist(const std::string& strAlbumArtist)
}
}
-void CMusicInfoTag::SetAlbumArtist(const std::vector<std::string>& albumArtists)
+void CMusicInfoTag::SetAlbumArtist(const std::vector<std::string>& albumArtists, bool FillDesc /* = false*/)
{
m_albumArtist = albumArtists;
- if (m_strAlbumArtistDesc.empty())
+ if (m_strAlbumArtistDesc.empty() || FillDesc)
SetAlbumArtistDesc(StringUtils::Join(albumArtists, g_advancedSettings.m_musicItemSeparator));
}
@@ -470,7 +472,7 @@ void CMusicInfoTag::SetUserrating(char rating)
void CMusicInfoTag::SetListeners(int listeners)
{
- m_listeners = listeners;
+ m_listeners = std::max(listeners, 0);
}
void CMusicInfoTag::SetPlayCount(int playcount)
@@ -672,7 +674,7 @@ void CMusicInfoTag::SetSong(const CSong& song)
SYSTEMTIME stTime;
stTime.wYear = song.iYear;
SetReleaseDate(stTime);
- SetTrackNumber(song.iTrack);
+ SetTrackAndDiscNumber(song.iTrack);
SetDuration(song.iDuration);
SetMood(song.strMood);
SetCompilation(song.bCompilation);
@@ -706,12 +708,12 @@ void CMusicInfoTag::Serialize(CVariant& value) const
value["loaded"] = m_bLoaded;
value["year"] = m_dwReleaseDate.wYear;
value["musicbrainztrackid"] = m_strMusicBrainzTrackID;
- value["musicbrainzartistid"] = StringUtils::Join(m_musicBrainzArtistID, " / ");
+ value["musicbrainzartistid"] = m_musicBrainzArtistID;
value["musicbrainzalbumid"] = m_strMusicBrainzAlbumID;
- value["musicbrainzalbumartistid"] = StringUtils::Join(m_musicBrainzAlbumArtistID, " / ");
+ value["musicbrainzalbumartistid"] = m_musicBrainzAlbumArtistID;
value["musicbrainztrmid"] = m_strMusicBrainzTRMID;
value["comment"] = m_strComment;
- value["mood"] = m_strMood;
+ value["mood"] = StringUtils::Split(m_strMood, g_advancedSettings.m_musicItemSeparator);
value["rating"] = (int)(m_rating - '0');
value["playcount"] = m_iTimesPlayed;
value["lastplayed"] = m_lastPlayed.IsValid() ? m_lastPlayed.GetAsDBDateTime() : StringUtils::Empty;
@@ -738,9 +740,9 @@ void CMusicInfoTag::ToSortable(SortItem& sortable, Field field) const
sortable[FieldTitle] = title;
break;
}
- case FieldArtist: sortable[FieldArtist] = m_artist; break;
+ case FieldArtist: sortable[FieldArtist] = m_strArtistDesc; break;
case FieldAlbum: sortable[FieldAlbum] = m_strAlbum; break;
- case FieldAlbumArtist: sortable[FieldAlbumArtist] = m_albumArtist; break;
+ case FieldAlbumArtist: sortable[FieldAlbumArtist] = m_strAlbumArtistDesc; break;
case FieldGenre: sortable[FieldGenre] = m_genre; break;
case FieldTime: sortable[FieldTime] = m_iDuration; break;
case FieldTrackNumber: sortable[FieldTrackNumber] = m_iTrack; break;
@@ -764,8 +766,10 @@ void CMusicInfoTag::Archive(CArchive& ar)
ar << m_strURL;
ar << m_strTitle;
ar << m_artist;
+ ar << m_strArtistDesc;
ar << m_strAlbum;
ar << m_albumArtist;
+ ar << m_strAlbumArtistDesc;
ar << m_genre;
ar << m_iDuration;
ar << m_iTrack;
@@ -797,8 +801,10 @@ void CMusicInfoTag::Archive(CArchive& ar)
ar >> m_strURL;
ar >> m_strTitle;
ar >> m_artist;
+ ar >> m_strArtistDesc;
ar >> m_strAlbum;
ar >> m_albumArtist;
+ ar >> m_strAlbumArtistDesc;
ar >> m_genre;
ar >> m_iDuration;
ar >> m_iTrack;
@@ -861,6 +867,7 @@ void CMusicInfoTag::Clear()
m_coverArt.clear();
m_replayGain = ReplayGain();
m_albumReleaseType = CAlbum::Album;
+ m_listeners = 0;
}
void CMusicInfoTag::AppendArtist(const std::string &artist)
diff --git a/xbmc/music/tags/MusicInfoTag.h b/xbmc/music/tags/MusicInfoTag.h
index e6261d1b66..63ee82135b 100644
--- a/xbmc/music/tags/MusicInfoTag.h
+++ b/xbmc/music/tags/MusicInfoTag.h
@@ -90,12 +90,12 @@ public:
void SetURL(const std::string& strURL);
void SetTitle(const std::string& strTitle);
void SetArtist(const std::string& strArtist);
- void SetArtist(const std::vector<std::string>& artists);
+ void SetArtist(const std::vector<std::string>& artists, bool FillDesc = false);
void SetArtistDesc(const std::string& strArtistDesc);
void SetAlbum(const std::string& strAlbum);
void SetAlbumId(const int iAlbumId);
void SetAlbumArtist(const std::string& strAlbumArtist);
- void SetAlbumArtist(const std::vector<std::string>& albumArtists);
+ void SetAlbumArtist(const std::vector<std::string>& albumArtists, bool FillDesc = false);
void SetAlbumArtistDesc(const std::string& strAlbumArtistDesc);
void SetGenre(const std::string& strGenre);
void SetGenre(const std::vector<std::string>& genres);
diff --git a/xbmc/music/tags/TagLoaderTagLib.cpp b/xbmc/music/tags/TagLoaderTagLib.cpp
index 1ccd36ab17..b0dbf3f70f 100644
--- a/xbmc/music/tags/TagLoaderTagLib.cpp
+++ b/xbmc/music/tags/TagLoaderTagLib.cpp
@@ -25,6 +25,7 @@
#include <taglib/id3v1tag.h>
#include <taglib/id3v2tag.h>
#include <taglib/apetag.h>
+#include <taglib/asftag.h>
#include <taglib/xiphcomment.h>
#include <taglib/id3v1genres.h>
@@ -76,7 +77,6 @@ CTagLoaderTagLib::CTagLoaderTagLib()
CTagLoaderTagLib::~CTagLoaderTagLib()
{
-
}
static const std::vector<std::string> StringListToVectorString(const StringList& stringList)
@@ -92,177 +92,9 @@ bool CTagLoaderTagLib::Load(const std::string& strFileName, MUSIC_INFO::CMusicIn
return Load(strFileName, tag, "", art);
}
-bool CTagLoaderTagLib::Load(const std::string& strFileName, CMusicInfoTag& tag, const std::string& fallbackFileExtension, MUSIC_INFO::EmbeddedArt *art /* = NULL */)
-{
- std::string strExtension = URIUtils::GetExtension(strFileName);
- StringUtils::ToLower(strExtension);
- StringUtils::TrimLeft(strExtension, ".");
-
- if (strExtension.empty())
- {
- strExtension = fallbackFileExtension;
- if (strExtension.empty())
- return false;
- StringUtils::ToLower(strExtension);
- }
-
- TagLibVFSStream* stream = new TagLibVFSStream(strFileName, true);
- if (!stream)
- {
- CLog::Log(LOGERROR, "could not create TagLib VFS stream for: %s", strFileName.c_str());
- return false;
- }
-
- ID3v1::Tag::setStringHandler(&ID3v1StringHandler);
- ID3v2::Tag::setLatin1StringHandler(&ID3v2StringHandler);
- TagLib::File* file = NULL;
- TagLib::APE::File* apeFile = NULL;
- TagLib::ASF::File* asfFile = NULL;
- TagLib::FLAC::File* flacFile = NULL;
- TagLib::IT::File* itFile = NULL;
- TagLib::Mod::File* modFile = NULL;
- TagLib::MP4::File* mp4File = NULL;
- TagLib::MPC::File* mpcFile = NULL;
- TagLib::MPEG::File* mpegFile = NULL;
- TagLib::Ogg::Vorbis::File* oggVorbisFile = NULL;
- TagLib::Ogg::FLAC::File* oggFlacFile = NULL;
- TagLib::S3M::File* s3mFile = NULL;
- TagLib::TrueAudio::File* ttaFile = NULL;
- TagLib::WavPack::File* wvFile = NULL;
- TagLib::XM::File* xmFile = NULL;
- TagLib::RIFF::WAV::File * wavFile = NULL;
- TagLib::RIFF::AIFF::File * aiffFile = NULL;
-
- if (strExtension == "ape")
- file = apeFile = new APE::File(stream);
- else if (strExtension == "asf" || strExtension == "wmv" || strExtension == "wma")
- file = asfFile = new ASF::File(stream);
- else if (strExtension == "flac")
- file = flacFile = new FLAC::File(stream, ID3v2::FrameFactory::instance());
- else if (strExtension == "it")
- file = itFile = new IT::File(stream);
- else if (strExtension == "mod" || strExtension == "module" || strExtension == "nst" || strExtension == "wow")
- file = modFile = new Mod::File(stream);
- else if (strExtension == "mp4" || strExtension == "m4a" ||
- strExtension == "m4r" || strExtension == "m4b" ||
- strExtension == "m4p" || strExtension == "3g2")
- file = mp4File = new MP4::File(stream);
- else if (strExtension == "mpc")
- file = mpcFile = new MPC::File(stream);
- else if (strExtension == "mp3" || strExtension == "aac")
- file = mpegFile = new MPEG::File(stream, ID3v2::FrameFactory::instance());
- else if (strExtension == "s3m")
- file = s3mFile = new S3M::File(stream);
- else if (strExtension == "tta")
- file = ttaFile = new TrueAudio::File(stream, ID3v2::FrameFactory::instance());
- else if (strExtension == "wv")
- file = wvFile = new WavPack::File(stream);
- else if (strExtension == "aif" || strExtension == "aiff")
- file = aiffFile = new RIFF::AIFF::File(stream);
- else if (strExtension == "wav")
- file = wavFile = new RIFF::WAV::File(stream);
- else if (strExtension == "xm")
- file = xmFile = new XM::File(stream);
- else if (strExtension == "ogg")
- file = oggVorbisFile = new Ogg::Vorbis::File(stream);
- else if (strExtension == "oga") // Leave this madness until last - oga container can have Vorbis or FLAC
- {
- file = oggFlacFile = new Ogg::FLAC::File(stream);
- if (!file || !file->isValid())
- {
- delete file;
- oggFlacFile = NULL;
- file = oggVorbisFile = new Ogg::Vorbis::File(stream);
- }
- }
-
- if (!file || !file->isOpen())
- {
- delete file;
- delete stream;
- CLog::Log(LOGDEBUG, "file could not be opened for tag reading");
- return false;
- }
-
- APE::Tag *ape = NULL;
- ASF::Tag *asf = NULL;
- MP4::Tag *mp4 = NULL;
- ID3v1::Tag *id3v1 = NULL;
- ID3v2::Tag *id3v2 = NULL;
- Ogg::XiphComment *xiph = NULL;
- Tag *generic = NULL;
-
- if (apeFile)
- ape = apeFile->APETag(false);
- else if (asfFile)
- asf = asfFile->tag();
- else if (flacFile)
- {
- xiph = flacFile->xiphComment(false);
- id3v2 = flacFile->ID3v2Tag(false);
- }
- else if (mp4File)
- mp4 = mp4File->tag();
- else if (mpegFile)
- {
- id3v1 = mpegFile->ID3v1Tag(false);
- id3v2 = mpegFile->ID3v2Tag(false);
- ape = mpegFile->APETag(false);
- }
- else if (oggFlacFile)
- xiph = dynamic_cast<Ogg::XiphComment *>(oggFlacFile->tag());
- else if (oggVorbisFile)
- xiph = dynamic_cast<Ogg::XiphComment *>(oggVorbisFile->tag());
- else if (ttaFile)
- id3v2 = ttaFile->ID3v2Tag(false);
- else if (aiffFile)
- id3v2 = aiffFile->tag();
- else if (wavFile)
-#if TAGLIB_MAJOR_VERSION > 1 || TAGLIB_MINOR_VERSION > 8
- id3v2 = wavFile->ID3v2Tag();
-#else
- id3v2 = wavFile->tag();
-#endif
- else if (wvFile)
- ape = wvFile->APETag(false);
- else if (mpcFile)
- ape = mpcFile->APETag(false);
- else // This is a catch all to get generic information for other files types (s3m, xm, it, mod, etc)
- generic = file->tag();
- if (file->audioProperties())
- tag.SetDuration(file->audioProperties()->length());
-
- if (asf)
- ParseASF(asf, art, tag);
- if (id3v1)
- ParseID3v1Tag(id3v1, art, tag);
- if (id3v2)
- ParseID3v2Tag(id3v2, art, tag);
- if (generic)
- ParseGenericTag(generic, art, tag);
- if (mp4)
- ParseMP4Tag(mp4, art, tag);
- if (xiph) // xiph tags override id3v2 tags in badly tagged FLACs
- ParseXiphComment(xiph, art, tag);
- if (ape && (!id3v2 || g_advancedSettings.m_prioritiseAPEv2tags)) // ape tags override id3v2 if we're prioritising them
- ParseAPETag(ape, art, tag);
-
- // art for flac files is outside the tag
- if (flacFile)
- SetFlacArt(flacFile, art, tag);
-
- if (!tag.GetTitle().empty() || !tag.GetArtist().empty() || !tag.GetAlbum().empty())
- tag.SetLoaded();
- tag.SetURL(strFileName);
-
- delete file;
- delete stream;
-
- return true;
-}
-
-bool CTagLoaderTagLib::ParseASF(ASF::Tag *asf, EmbeddedArt *art, CMusicInfoTag& tag)
+template<>
+bool CTagLoaderTagLib::ParseTag(ASF::Tag *asf, EmbeddedArt *art, CMusicInfoTag& tag)
{
if (!asf)
return false;
@@ -338,12 +170,14 @@ bool CTagLoaderTagLib::ParseASF(ASF::Tag *asf, EmbeddedArt *art, CMusicInfoTag&
if (tag.GetArtist().empty())
tag.SetArtist(asf->artist().toCString(true));
+ if (asf->comment() != String::null)
+ tag.SetComment(asf->comment().toCString(true));
tag.SetReplayGain(replayGainInfo);
tag.SetLoaded(true);
return true;
}
-char POPMtoXBMC(int popm)
+char CTagLoaderTagLib::POPMtoXBMC(int popm)
{
// Ratings:
// FROM: http://thiagoarrais.com/repos/banshee/src/Core/Banshee.Core/Banshee.Streaming/StreamRatingTagger.cs
@@ -364,7 +198,8 @@ char POPMtoXBMC(int popm)
return '5';
}
-bool CTagLoaderTagLib::ParseID3v1Tag(ID3v1::Tag *id3v1, EmbeddedArt *art, CMusicInfoTag& tag)
+template<>
+bool CTagLoaderTagLib::ParseTag(ID3v1::Tag *id3v1, EmbeddedArt *art, CMusicInfoTag& tag)
{
if (!id3v1) return false;
tag.SetTitle(id3v1->title().to8Bit(true));
@@ -377,17 +212,20 @@ bool CTagLoaderTagLib::ParseID3v1Tag(ID3v1::Tag *id3v1, EmbeddedArt *art, CMusic
return true;
}
-bool CTagLoaderTagLib::ParseID3v2Tag(ID3v2::Tag *id3v2, EmbeddedArt *art, CMusicInfoTag& tag)
+template<>
+bool CTagLoaderTagLib::ParseTag(ID3v2::Tag *id3v2, MUSIC_INFO::EmbeddedArt *art, MUSIC_INFO::CMusicInfoTag& tag)
{
- // tag.SetURL(strFile);
if (!id3v2) return false;
-
ReplayGain replayGainInfo;
ID3v2::AttachedPictureFrame *pictures[3] = {};
const ID3v2::FrameListMap& frameListMap = id3v2->frameListMap();
for (ID3v2::FrameListMap::ConstIterator it = frameListMap.begin(); it != frameListMap.end(); ++it)
{
+ // It is possible that the taglist is empty. In that case no useable values can be extracted.
+ // and we should skip the tag.
+ if (it->second.isEmpty()) continue;
+
if (it->first == "TPE1") SetArtist(tag, GetID3v2StringList(it->second));
else if (it->first == "TALB") tag.SetAlbum(it->second.front()->toString().to8Bit(true));
else if (it->first == "TPE2") SetAlbumArtist(tag, GetID3v2StringList(it->second));
@@ -409,7 +247,7 @@ bool CTagLoaderTagLib::ParseID3v2Tag(ID3v2::Tag *id3v2, EmbeddedArt *art, CMusic
for (ID3v2::FrameList::ConstIterator lt = it->second.begin(); lt != it->second.end(); ++lt)
{
ID3v2::UnsynchronizedLyricsFrame *lyricsFrame = dynamic_cast<ID3v2::UnsynchronizedLyricsFrame *> (*lt);
- if (lyricsFrame)
+ if (lyricsFrame)
tag.SetLyrics(lyricsFrame->text().to8Bit(true));
}
else if (it->first == "COMM")
@@ -426,9 +264,10 @@ bool CTagLoaderTagLib::ParseID3v2Tag(ID3v2::Tag *id3v2, EmbeddedArt *art, CMusic
{
ID3v2::UserTextIdentificationFrame *frame = dynamic_cast<ID3v2::UserTextIdentificationFrame *> (*ut);
if (!frame) continue;
-
+
// First field is the same as the description
- StringList stringList = frame->fieldList();
+ StringList stringList = frame->fieldList();
+ if (stringList.size() == 1) continue;
stringList.erase(stringList.begin());
String desc = frame->description().upper();
if (desc == "MUSICBRAINZ ARTIST ID")
@@ -489,7 +328,7 @@ bool CTagLoaderTagLib::ParseID3v2Tag(ID3v2::Tag *id3v2, EmbeddedArt *art, CMusic
{
ID3v2::AttachedPictureFrame *pictureFrame = dynamic_cast<ID3v2::AttachedPictureFrame *> (*pi);
if (!pictureFrame) continue;
-
+
if (pictureFrame->type() == ID3v2::AttachedPictureFrame::FrontCover) pictures[0] = pictureFrame;
else if (pictureFrame->type() == ID3v2::AttachedPictureFrame::Other) pictures[1] = pictureFrame;
else if (pi == it->second.begin()) pictures[2] = pictureFrame;
@@ -500,7 +339,7 @@ bool CTagLoaderTagLib::ParseID3v2Tag(ID3v2::Tag *id3v2, EmbeddedArt *art, CMusic
{
ID3v2::PopularimeterFrame *popFrame = dynamic_cast<ID3v2::PopularimeterFrame *> (*ct);
if (!popFrame) continue;
-
+
// @xbmc.org ratings trump others (of course)
if (popFrame->email() == "ratings@xbmc.org")
tag.SetUserrating(popFrame->rating() / 51 + '0');
@@ -528,16 +367,21 @@ bool CTagLoaderTagLib::ParseID3v2Tag(ID3v2::Tag *id3v2, EmbeddedArt *art, CMusic
tag.SetCoverArtInfo(size, mime);
if (art)
art->set((const uint8_t*)pictures[i]->picture().data(), size, mime);
-
+
// Stop after we find the first picture for now.
break;
}
+
+ if (id3v2->comment() != String::null)
+ tag.SetComment(id3v2->comment().toCString(true));
+
tag.SetReplayGain(replayGainInfo);
return true;
}
-bool CTagLoaderTagLib::ParseAPETag(APE::Tag *ape, EmbeddedArt *art, CMusicInfoTag& tag)
+template<>
+bool CTagLoaderTagLib::ParseTag(APE::Tag *ape, EmbeddedArt *art, CMusicInfoTag& tag)
{
if (!ape)
return false;
@@ -602,7 +446,8 @@ bool CTagLoaderTagLib::ParseAPETag(APE::Tag *ape, EmbeddedArt *art, CMusicInfoTa
return true;
}
-bool CTagLoaderTagLib::ParseXiphComment(Ogg::XiphComment *xiph, EmbeddedArt *art, CMusicInfoTag& tag)
+template<>
+bool CTagLoaderTagLib::ParseTag(Ogg::XiphComment *xiph, EmbeddedArt *art, CMusicInfoTag& tag)
{
if (!xiph)
return false;
@@ -685,7 +530,7 @@ bool CTagLoaderTagLib::ParseXiphComment(Ogg::XiphComment *xiph, EmbeddedArt *art
if (pictureFrame->type() == FLAC::Picture::FrontCover) pictures[0].parse(bv);
else if (pictureFrame->type() == FLAC::Picture::Other) pictures[1].parse(bv);
-
+
delete pictureFrame;
}
else if (it->first == "COVERART")
@@ -721,11 +566,15 @@ bool CTagLoaderTagLib::ParseXiphComment(Ogg::XiphComment *xiph, EmbeddedArt *art
break;
}
+ if (xiph->comment() != String::null)
+ tag.SetComment(xiph->comment().toCString(true));
+
tag.SetReplayGain(replayGainInfo);
return true;
}
-bool CTagLoaderTagLib::ParseMP4Tag(MP4::Tag *mp4, EmbeddedArt *art, CMusicInfoTag& tag)
+template<>
+bool CTagLoaderTagLib::ParseTag(MP4::Tag *mp4, EmbeddedArt *art, CMusicInfoTag& tag)
{
if (!mp4)
return false;
@@ -803,11 +652,15 @@ bool CTagLoaderTagLib::ParseMP4Tag(MP4::Tag *mp4, EmbeddedArt *art, CMusicInfoTa
}
}
+ if (mp4->comment() != String::null)
+ tag.SetComment(mp4->comment().toCString(true));
+
tag.SetReplayGain(replayGainInfo);
return true;
}
-bool CTagLoaderTagLib::ParseGenericTag(Tag *generic, EmbeddedArt *art, CMusicInfoTag& tag)
+template<>
+bool CTagLoaderTagLib::ParseTag(Tag *generic, EmbeddedArt *art, CMusicInfoTag& tag)
{
if (!generic)
return false;
@@ -866,7 +719,7 @@ const std::vector<std::string> CTagLoaderTagLib::GetASFStringList(const List<ASF
return values;
}
-const std::vector<std::string> CTagLoaderTagLib::GetID3v2StringList(const ID3v2::FrameList& frameList) const
+const std::vector<std::string> CTagLoaderTagLib::GetID3v2StringList(const ID3v2::FrameList& frameList)
{
const ID3v2::TextIdentificationFrame *frame = dynamic_cast<ID3v2::TextIdentificationFrame *>(frameList.front());
if (frame)
@@ -874,12 +727,15 @@ const std::vector<std::string> CTagLoaderTagLib::GetID3v2StringList(const ID3v2:
return std::vector<std::string>();
}
+
void CTagLoaderTagLib::SetArtist(CMusicInfoTag &tag, const std::vector<std::string> &values)
{
if (values.size() == 1)
tag.SetArtist(values[0]);
else
- tag.SetArtist(values);
+ // Fill both artist vector and artist desc from tag value.
+ // Note desc may not be empty as it could have been set by previous parsing of ID3v2 before APE
+ tag.SetArtist(values, true);
}
const std::vector<std::string> CTagLoaderTagLib::SplitMBID(const std::vector<std::string> &values)
@@ -907,7 +763,9 @@ void CTagLoaderTagLib::SetAlbumArtist(CMusicInfoTag &tag, const std::vector<std:
if (values.size() == 1)
tag.SetAlbumArtist(values[0]);
else
- tag.SetAlbumArtist(values);
+ // Fill both artist vector and artist desc from tag value.
+ // Note desc may not be empty as it could have been set by previous parsing of ID3v2 before APE
+ tag.SetAlbumArtist(values, true);
}
void CTagLoaderTagLib::SetGenre(CMusicInfoTag &tag, const std::vector<std::string> &values)
@@ -933,3 +791,172 @@ void CTagLoaderTagLib::SetGenre(CMusicInfoTag &tag, const std::vector<std::strin
else
tag.SetGenre(genres);
}
+
+bool CTagLoaderTagLib::Load(const std::string& strFileName, CMusicInfoTag& tag, const std::string& fallbackFileExtension, MUSIC_INFO::EmbeddedArt *art /* = NULL */)
+{
+ std::string strExtension = URIUtils::GetExtension(strFileName);
+ StringUtils::TrimLeft(strExtension, ".");
+
+ if (strExtension.empty())
+ {
+ strExtension = fallbackFileExtension;
+ if (strExtension.empty())
+ return false;
+ }
+
+ StringUtils::ToLower(strExtension);
+ TagLibVFSStream* stream = new TagLibVFSStream(strFileName, true);
+ if (!stream)
+ {
+ CLog::Log(LOGERROR, "could not create TagLib VFS stream for: %s", strFileName.c_str());
+ return false;
+ }
+
+ ID3v1::Tag::setStringHandler(&ID3v1StringHandler);
+ ID3v2::Tag::setLatin1StringHandler(&ID3v2StringHandler);
+ TagLib::File* file = NULL;
+ TagLib::APE::File* apeFile = NULL;
+ TagLib::ASF::File* asfFile = NULL;
+ TagLib::FLAC::File* flacFile = NULL;
+ TagLib::IT::File* itFile = NULL;
+ TagLib::Mod::File* modFile = NULL;
+ TagLib::MP4::File* mp4File = NULL;
+ TagLib::MPC::File* mpcFile = NULL;
+ TagLib::MPEG::File* mpegFile = NULL;
+ TagLib::Ogg::Vorbis::File* oggVorbisFile = NULL;
+ TagLib::Ogg::FLAC::File* oggFlacFile = NULL;
+ TagLib::S3M::File* s3mFile = NULL;
+ TagLib::TrueAudio::File* ttaFile = NULL;
+ TagLib::WavPack::File* wvFile = NULL;
+ TagLib::XM::File* xmFile = NULL;
+ TagLib::RIFF::WAV::File * wavFile = NULL;
+ TagLib::RIFF::AIFF::File * aiffFile = NULL;
+
+ if (strExtension == "ape")
+ file = apeFile = new APE::File(stream);
+ else if (strExtension == "asf" || strExtension == "wmv" || strExtension == "wma")
+ file = asfFile = new ASF::File(stream);
+ else if (strExtension == "flac")
+ file = flacFile = new FLAC::File(stream, ID3v2::FrameFactory::instance());
+ else if (strExtension == "it")
+ file = itFile = new IT::File(stream);
+ else if (strExtension == "mod" || strExtension == "module" || strExtension == "nst" || strExtension == "wow")
+ file = modFile = new Mod::File(stream);
+ else if (strExtension == "mp4" || strExtension == "m4a" ||
+ strExtension == "m4r" || strExtension == "m4b" ||
+ strExtension == "m4p" || strExtension == "3g2")
+ file = mp4File = new MP4::File(stream);
+ else if (strExtension == "mpc")
+ file = mpcFile = new MPC::File(stream);
+ else if (strExtension == "mp3" || strExtension == "aac")
+ file = mpegFile = new MPEG::File(stream, ID3v2::FrameFactory::instance());
+ else if (strExtension == "s3m")
+ file = s3mFile = new S3M::File(stream);
+ else if (strExtension == "tta")
+ file = ttaFile = new TrueAudio::File(stream, ID3v2::FrameFactory::instance());
+ else if (strExtension == "wv")
+ file = wvFile = new WavPack::File(stream);
+ else if (strExtension == "aif" || strExtension == "aiff")
+ file = aiffFile = new RIFF::AIFF::File(stream);
+ else if (strExtension == "wav")
+ file = wavFile = new RIFF::WAV::File(stream);
+ else if (strExtension == "xm")
+ file = xmFile = new XM::File(stream);
+ else if (strExtension == "ogg")
+ file = oggVorbisFile = new Ogg::Vorbis::File(stream);
+ else if (strExtension == "oga") // Leave this madness until last - oga container can have Vorbis or FLAC
+ {
+ file = oggFlacFile = new Ogg::FLAC::File(stream);
+ if (!file || !file->isValid())
+ {
+ delete file;
+ oggFlacFile = NULL;
+ file = oggVorbisFile = new Ogg::Vorbis::File(stream);
+ }
+ }
+
+ if (!file || !file->isOpen())
+ {
+ delete file;
+ delete stream;
+ CLog::Log(LOGDEBUG, "file could not be opened for tag reading");
+ return false;
+ }
+
+ APE::Tag *ape = NULL;
+ ASF::Tag *asf = NULL;
+ MP4::Tag *mp4 = NULL;
+ ID3v1::Tag *id3v1 = NULL;
+ ID3v2::Tag *id3v2 = NULL;
+ Ogg::XiphComment *xiph = NULL;
+ Tag *generic = NULL;
+
+ if (apeFile)
+ ape = apeFile->APETag(false);
+ else if (asfFile)
+ asf = asfFile->tag();
+ else if (flacFile)
+ {
+ xiph = flacFile->xiphComment(false);
+ id3v2 = flacFile->ID3v2Tag(false);
+ }
+ else if (mp4File)
+ mp4 = mp4File->tag();
+ else if (mpegFile)
+ {
+ id3v1 = mpegFile->ID3v1Tag(false);
+ id3v2 = mpegFile->ID3v2Tag(false);
+ ape = mpegFile->APETag(false);
+ }
+ else if (oggFlacFile)
+ xiph = dynamic_cast<Ogg::XiphComment *>(oggFlacFile->tag());
+ else if (oggVorbisFile)
+ xiph = dynamic_cast<Ogg::XiphComment *>(oggVorbisFile->tag());
+ else if (ttaFile)
+ id3v2 = ttaFile->ID3v2Tag(false);
+ else if (aiffFile)
+ id3v2 = aiffFile->tag();
+ else if (wavFile)
+#if TAGLIB_MAJOR_VERSION > 1 || TAGLIB_MINOR_VERSION > 8
+ id3v2 = wavFile->ID3v2Tag();
+#else
+ id3v2 = wavFile->tag();
+#endif
+ else if (wvFile)
+ ape = wvFile->APETag(false);
+ else if (mpcFile)
+ ape = mpcFile->APETag(false);
+ else // This is a catch all to get generic information for other files types (s3m, xm, it, mod, etc)
+ generic = file->tag();
+
+ if (file->audioProperties())
+ tag.SetDuration(file->audioProperties()->length());
+
+ if (asf)
+ ParseTag(asf, art, tag);
+ if (id3v1)
+ ParseTag(id3v1, art, tag);
+ if (id3v2)
+ ParseTag(id3v2, art, tag);
+ if (generic)
+ ParseTag(generic, art, tag);
+ if (mp4)
+ ParseTag(mp4, art, tag);
+ if (xiph) // xiph tags override id3v2 tags in badly tagged FLACs
+ ParseTag(xiph, art, tag);
+ if (ape && (!id3v2 || g_advancedSettings.m_prioritiseAPEv2tags)) // ape tags override id3v2 if we're prioritising them
+ ParseTag(ape, art, tag);
+
+ // art for flac files is outside the tag
+ if (flacFile)
+ SetFlacArt(flacFile, art, tag);
+
+ if (!tag.GetTitle().empty() || !tag.GetArtist().empty() || !tag.GetAlbum().empty())
+ tag.SetLoaded();
+ tag.SetURL(strFileName);
+
+ delete file;
+ delete stream;
+
+ return true;
+}
diff --git a/xbmc/music/tags/TagLoaderTagLib.h b/xbmc/music/tags/TagLoaderTagLib.h
index b648e7b82e..de41c0b4e1 100644
--- a/xbmc/music/tags/TagLoaderTagLib.h
+++ b/xbmc/music/tags/TagLoaderTagLib.h
@@ -56,24 +56,21 @@ public:
CTagLoaderTagLib();
virtual ~CTagLoaderTagLib();
virtual bool Load(const std::string& strFileName, MUSIC_INFO::CMusicInfoTag& tag, MUSIC_INFO::EmbeddedArt *art = NULL);
-
bool Load(const std::string& strFileName, MUSIC_INFO::CMusicInfoTag& tag, const std::string& fallbackFileExtension, MUSIC_INFO::EmbeddedArt *art = NULL);
- const std::vector<std::string> SplitMBID(const std::vector<std::string> &values);
+ static const std::vector<std::string> SplitMBID(const std::vector<std::string> &values);
+protected:
+ static void SetArtist(MUSIC_INFO::CMusicInfoTag &tag, const std::vector<std::string> &values);
+ static void SetAlbumArtist(MUSIC_INFO::CMusicInfoTag &tag, const std::vector<std::string> &values);
+ static void SetGenre(MUSIC_INFO::CMusicInfoTag &tag, const std::vector<std::string> &values);
+ static char POPMtoXBMC(int popm);
+
+template<typename T>
+ static bool ParseTag(T *tag, MUSIC_INFO::EmbeddedArt *art, MUSIC_INFO::CMusicInfoTag& infoTag);
private:
bool Open(const std::string& strFileName, bool readOnly);
- const std::vector<std::string> GetASFStringList(const TagLib::List<TagLib::ASF::Attribute>& list);
- const std::vector<std::string> GetID3v2StringList(const TagLib::ID3v2::FrameList& frameList) const;
-
- bool ParseAPETag(TagLib::APE::Tag *ape, MUSIC_INFO::EmbeddedArt *art, MUSIC_INFO::CMusicInfoTag& tag);
- bool ParseASF(TagLib::ASF::Tag *asf, MUSIC_INFO::EmbeddedArt *art, MUSIC_INFO::CMusicInfoTag& tag);
- bool ParseID3v1Tag(TagLib::ID3v1::Tag *id3v1, MUSIC_INFO::EmbeddedArt *art, MUSIC_INFO::CMusicInfoTag& tag);
- bool ParseID3v2Tag(TagLib::ID3v2::Tag *id3v2, MUSIC_INFO::EmbeddedArt *art, MUSIC_INFO::CMusicInfoTag& tag);
- bool ParseXiphComment(TagLib::Ogg::XiphComment *id3v2, MUSIC_INFO::EmbeddedArt *art, MUSIC_INFO::CMusicInfoTag& tag);
- bool ParseMP4Tag(TagLib::MP4::Tag *mp4, MUSIC_INFO::EmbeddedArt *art, MUSIC_INFO::CMusicInfoTag& tag);
- bool ParseGenericTag(TagLib::Tag *generic, MUSIC_INFO::EmbeddedArt *art, MUSIC_INFO::CMusicInfoTag& tag);
+ static const std::vector<std::string> GetASFStringList(const TagLib::List<TagLib::ASF::Attribute>& list);
+ static const std::vector<std::string> GetID3v2StringList(const TagLib::ID3v2::FrameList& frameList);
void SetFlacArt(TagLib::FLAC::File *flacFile, MUSIC_INFO::EmbeddedArt *art, MUSIC_INFO::CMusicInfoTag &tag);
- void SetArtist(MUSIC_INFO::CMusicInfoTag &tag, const std::vector<std::string> &values);
- void SetAlbumArtist(MUSIC_INFO::CMusicInfoTag &tag, const std::vector<std::string> &values);
- void SetGenre(MUSIC_INFO::CMusicInfoTag &tag, const std::vector<std::string> &values);
};
+
diff --git a/xbmc/music/tags/test/TestTagLoaderTagLib.cpp b/xbmc/music/tags/test/TestTagLoaderTagLib.cpp
index be0f012d0d..5ef462611d 100644
--- a/xbmc/music/tags/test/TestTagLoaderTagLib.cpp
+++ b/xbmc/music/tags/test/TestTagLoaderTagLib.cpp
@@ -20,6 +20,154 @@
#include "gtest/gtest.h"
#include "music/tags/TagLoaderTagLib.h"
+#include "music/tags/MusicInfoTag.h"
+#include <taglib/tpropertymap.h>
+#include <taglib/id3v1tag.h>
+#include <taglib/id3v2tag.h>
+#include <taglib/apetag.h>
+#include <taglib/xiphcomment.h>
+#include <taglib/id3v1genres.h>
+
+using namespace TagLib;
+using namespace MUSIC_INFO;
+
+template <typename T>
+class TestTagParser : public ::testing::Test, public CTagLoaderTagLib {
+ public:
+ T value_;
+};
+
+
+typedef ::testing::Types<ID3v2::Tag, ID3v1::Tag, ASF::Tag, APE::Tag, Ogg::XiphComment, MP4::Tag> TagTypes;
+TYPED_TEST_CASE(TestTagParser, TagTypes);
+
+TYPED_TEST(TestTagParser, ParsesBasicTag) {
+ // Create a basic tag
+ TypeParam *tg = &this->value_;
+ // Configure a basic tag..
+ tg->setTitle ("title");
+ tg->setArtist ("artist");
+ tg->setAlbum ("album");
+ tg->setComment("comment");
+ tg->setGenre("Jazz");
+ tg->setYear (1985);
+ tg->setTrack (2);
+
+ CMusicInfoTag tag;
+ EXPECT_TRUE(CTagLoaderTagLib::ParseTag<TypeParam>(tg, NULL, tag));
+
+ EXPECT_EQ(1985, tag.GetYear());
+ EXPECT_EQ(2, tag.GetTrackNumber());
+ EXPECT_EQ(1u, tag.GetArtist().size());
+ if (tag.GetArtist().size() > 0) EXPECT_EQ("artist", tag.GetArtist().front());
+ EXPECT_EQ("album", tag.GetAlbum());
+ EXPECT_EQ("comment", tag.GetComment());
+ EXPECT_EQ(1u, tag.GetGenre().size());
+ if (tag.GetGenre().size() > 0) EXPECT_EQ("Jazz", tag.GetGenre().front());
+ EXPECT_EQ("title", tag.GetTitle());
+}
+
+
+TYPED_TEST(TestTagParser, HandleNullTag) {
+ // A Null tag should not parse, and not break us either
+ CMusicInfoTag tag;
+ EXPECT_FALSE(CTagLoaderTagLib::ParseTag<TypeParam>(NULL, NULL, tag));
+}
+
+template<typename T, size_t N>
+T * end(T (&ra)[N]) {
+ return ra + N;
+}
+
+const char *tags[] = { "APIC", "ASPI", "COMM", "COMR", "ENCR", "EQU2",
+ "ETCO", "GEOB", "GRID", "LINK", "MCDI", "MLLT", "OWNE", "PRIV", "PCNT",
+ "POPM", "POSS", "RBUF", "RVA2", "RVRB", "SEEK", "SIGN", "SYLT",
+ "SYTC", "TALB", "TBPM", "TCOM", "TCON", "TCOP", "TDEN", "TDLY", "TDOR",
+ "TDRC", "TDRL", "TDTG", "TENC", "TEXT", "TFLT", "TIPL", "TIT1", "TIT2",
+ "TIT3", "TKEY", "TLAN", "TLEN", "TMCL", "TMED", "TMOO", "TOAL", "TOFN",
+ "TOLY", "TOPE", "TOWN", "TPE1", "TPE2", "TPE3", "TPE4", "TPOS", "TPRO",
+ "TPUB", "TRCK", "TRSN", "TRSO", "TSOA", "TSOP", "TSOT", "TSRC", "TSSE",
+ "TSST", "TXXX", "UFID", "USER", "USLT", "WCOM", "WCOP", "WOAF", "WOAR",
+ "WOAS", "WORS", "WPAY", "WPUB", "WXXX", "ARTIST", "ARTISTS",
+ "ALBUMARTIST" , "ALBUM ARTIST", "ALBUMARTISTS" , "ALBUM ARTISTS", "ALBUM",
+ "TITLE", "TRACKNUMBER" "TRACK", "DISCNUMBER" "DISC", "YEAR", "GENRE",
+ "COMMENT", "CUESHEET", "ENCODEDBY", "COMPILATION", "LYRICS",
+ "REPLAYGAIN_TRACK_GAIN", "REPLAYGAIN_ALBUM_GAIN", "REPLAYGAIN_TRACK_PEAK",
+ "REPLAYGAIN_ALBUM_PEAK", "MUSICBRAINZ_ARTISTID",
+ "MUSICBRAINZ_ALBUMARTISTID", "RATING", "MUSICBRAINZ_ALBUMARTIST",
+ "MUSICBRAINZ_ALBUMID", "MUSICBRAINZ_TRACKID", "METADATA_BLOCK_PICTURE",
+ "COVERART"
+};
+
+
+// This test exposes a bug in taglib library (#670) so for now we will not run it for all tag types
+// See https://github.com/taglib/taglib/issues/670 for details.
+typedef ::testing::Types<ID3v2::Tag, ID3v1::Tag, ASF::Tag, APE::Tag, Ogg::XiphComment> EmptyPropertiesTagTypes;
+template <typename T>
+class EmptyTagParser : public ::testing::Test, public CTagLoaderTagLib {
+ public:
+ T value_;
+};
+TYPED_TEST_CASE(EmptyTagParser, EmptyPropertiesTagTypes);
+
+TYPED_TEST(EmptyTagParser, EmptyProperties) {
+ TypeParam *tg = &this->value_;
+ CMusicInfoTag tag;
+ PropertyMap props;
+ int tagcount = end(tags) - tags;
+ for(int i = 0; i < tagcount; i++) {
+ props.insert(tags[i], StringList());
+ }
+
+ // Even though all the properties are empty, we shouldn't
+ // crash
+ EXPECT_TRUE(CTagLoaderTagLib::ParseTag<TypeParam>(tg, NULL, tag));
+}
+
+
+
+TYPED_TEST(TestTagParser, FooProperties) {
+ TypeParam *tg = &this->value_;
+ CMusicInfoTag tag;
+ PropertyMap props;
+ int tagcount = end(tags) - tags;
+ for(int i = 0; i < tagcount; i++) {
+ props.insert(tags[i], String("foo"));
+ }
+ tg->setProperties(props);
+
+ EXPECT_TRUE(CTagLoaderTagLib::ParseTag<TypeParam>(tg, NULL, tag));
+ EXPECT_EQ(0, tag.GetYear());
+ EXPECT_EQ(0, tag.GetTrackNumber());
+ EXPECT_EQ(1u, tag.GetArtist().size());
+ if (tag.GetArtist().size() > 0) EXPECT_EQ("foo", tag.GetArtist().front());
+ EXPECT_EQ("foo", tag.GetAlbum());
+ EXPECT_EQ("foo", tag.GetComment());
+ if (tag.GetGenre().size() > 0) EXPECT_EQ("foo", tag.GetGenre().front());
+ EXPECT_EQ("foo", tag.GetTitle());
+}
+
+class TestCTagLoaderTagLib : public ::testing::Test, public CTagLoaderTagLib {};
+TEST_F(TestCTagLoaderTagLib, SetGenre)
+{
+ CMusicInfoTag tag, tag2;
+ const char *genre_nr[] = {"0", "2", "4"};
+ const char *names[] = { "Jazz", "Funk", "Ska" };
+ std::vector<std::string> genres(genre_nr, end(genre_nr));
+ std::vector<std::string> named_genre(names, end(names));
+
+ CTagLoaderTagLib::SetGenre(tag, genres);
+ EXPECT_EQ(3u, tag.GetGenre().size());
+ EXPECT_EQ("Blues", tag.GetGenre()[0]);
+ EXPECT_EQ("Country", tag.GetGenre()[1]);
+ EXPECT_EQ("Disco", tag.GetGenre()[2]);
+
+ CTagLoaderTagLib::SetGenre(tag2, named_genre);
+ EXPECT_EQ(3u, tag2.GetGenre().size());
+ for(int i = 0; i < 3; i++)
+ EXPECT_EQ(names[i], tag2.GetGenre()[i]);
+
+}
TEST(TestTagLoaderTagLib, SplitMBID)
{
diff --git a/xbmc/music/windows/GUIWindowMusicBase.cpp b/xbmc/music/windows/GUIWindowMusicBase.cpp
index 3d99f624c9..39c8e2cd15 100644
--- a/xbmc/music/windows/GUIWindowMusicBase.cpp
+++ b/xbmc/music/windows/GUIWindowMusicBase.cpp
@@ -1160,9 +1160,7 @@ bool CGUIWindowMusicBase::OnPlayMedia(int iItem)
{ // single music file - if we get here then we have autoplaynextitem turned off or queuebydefault
// turned on, but we still want to use the playlist player in order to handle more queued items
// following etc.
- // Karaoke items also can be added in runtime (while the song is played), so it should be queued too.
- if ( (CSettings::GetInstance().GetBool(CSettings::SETTING_MUSICPLAYER_QUEUEBYDEFAULT) && g_windowManager.GetActiveWindow() != WINDOW_MUSIC_PLAYLIST_EDITOR)
- || pItem->IsKaraoke() )
+ if ( (CSettings::GetInstance().GetBool(CSettings::SETTING_MUSICPLAYER_QUEUEBYDEFAULT) && g_windowManager.GetActiveWindow() != WINDOW_MUSIC_PLAYLIST_EDITOR) )
{
// TODO: Should the playlist be cleared if nothing is already playing?
OnQueueItem(iItem);
@@ -1461,3 +1459,13 @@ void CGUIWindowMusicBase::OnPrepareFileItems(CFileItemList &items)
if (!items.IsMusicDb())
RetrieveMusicInfo();
}
+
+void CGUIWindowMusicBase::OnAssignContent(const std::string &path)
+{
+ // Add content selection logic here, if music is ready for that some day
+
+ // This won't ask you to clean/delete your content, when you change the scraper to none (if music gets this), might ne nice in the future
+ if (CGUIDialogYesNo::ShowAndGetInput(CVariant{ 20444 }, CVariant{ 20447 }))
+ g_application.StartMusicScan(path, true);
+}
+
diff --git a/xbmc/music/windows/GUIWindowMusicBase.h b/xbmc/music/windows/GUIWindowMusicBase.h
index 1e2bdce052..12410404b7 100644
--- a/xbmc/music/windows/GUIWindowMusicBase.h
+++ b/xbmc/music/windows/GUIWindowMusicBase.h
@@ -49,6 +49,11 @@ public:
void OnItemInfo(CFileItem *pItem, bool bShowInfo = false);
void DoScan(const std::string &strPath);
+
+ /*! \brief Prompt the user if he wants to start a scan for this folder
+ \param path the path to assign content for
+ */
+ static void OnAssignContent(const std::string &path);
protected:
virtual void OnInitWindow();
/*!
@@ -101,8 +106,6 @@ protected:
typedef std::vector <CFileItem*>::iterator ivecItems; ///< CFileItem* vector Iterator
CGUIDialogProgress* m_dlgProgress; ///< Progress dialog
- // member variables to save frequently used CSettings (which is slow)
- bool m_hideExtensions;
CMusicDatabase m_musicdatabase;
MUSIC_INFO::CMusicInfoLoader m_musicInfoLoader;
diff --git a/xbmc/music/windows/GUIWindowMusicNav.cpp b/xbmc/music/windows/GUIWindowMusicNav.cpp
index c50f601d81..64a7743fd2 100644
--- a/xbmc/music/windows/GUIWindowMusicNav.cpp
+++ b/xbmc/music/windows/GUIWindowMusicNav.cpp
@@ -265,7 +265,10 @@ bool CGUIWindowMusicNav::Update(const std::string &strDirectory, bool updateFilt
if (CGUIWindowMusicBase::Update(strDirectory, updateFilterPath))
{
- if (m_vecItems->GetContent().empty())
+
+ if (m_vecItems->GetContent().empty() &&
+ !m_vecItems->IsSourcesPath() &&
+ !m_vecItems->IsVirtualDirectoryRoot())
m_vecItems->SetContent("files");
m_thumbLoader.Load(*m_unfilteredItems);
@@ -287,10 +290,6 @@ bool CGUIWindowMusicNav::GetDirectory(const std::string &strDirectory, CFileItem
OnRetrieveMusicInfo(items);
}
- //Navigating music files so default content to "songs" unless in sources folder.
- //This content allows view type to include media info so that file tag data can be displayed
- if (!URIUtils::IsSourcesPath(strDirectory))
- items.SetContent("songs");
// update our content in the info manager
if (StringUtils::StartsWithNoCase(strDirectory, "videodb://") || items.IsVideoDb())
{
@@ -315,6 +314,8 @@ bool CGUIWindowMusicNav::GetDirectory(const std::string &strDirectory, CFileItem
items.SetContent("albums");
else if (node == VIDEODATABASEDIRECTORY::NODE_TYPE_TAGS)
items.SetContent("tags");
+ else
+ items.SetContent("");
}
else if (StringUtils::StartsWithNoCase(strDirectory, "musicdb://") || items.IsMusicDb())
{
@@ -342,13 +343,18 @@ bool CGUIWindowMusicNav::GetDirectory(const std::string &strDirectory, CFileItem
items.SetContent("genres");
else if (node == NODE_TYPE_YEAR)
items.SetContent("years");
+ else
+ items.SetContent("");
}
- else if (URIUtils::PathEquals(strDirectory, "special://musicplaylists/"))
+ else if (items.IsPlayList())
+ items.SetContent("songs");
+ else if (URIUtils::PathEquals(strDirectory, "special://musicplaylists/") ||
+ URIUtils::PathEquals(strDirectory, "library://music/playlists.xml/"))
items.SetContent("playlists");
else if (URIUtils::PathEquals(strDirectory, "plugin://music/"))
items.SetContent("plugins");
- else if (items.IsPlayList())
- items.SetContent("songs");
+ else if (items.IsAddonsPath())
+ items.SetContent("addons");
return bResult;
}
@@ -516,9 +522,11 @@ void CGUIWindowMusicNav::GetContextButtons(int itemNumber, CContextButtons &butt
item->m_bIsFolder && !item->IsVideoDb())
{
ADDON::ScraperPtr info;
- m_musicdatabase.GetScraperForPath(item->GetPath(), info, ADDON::ADDON_SCRAPER_ARTISTS);
- if (info && info->Supports(CONTENT_ARTISTS))
- buttons.Add(CONTEXT_BUTTON_INFO_ALL, 21884);
+ if(m_musicdatabase.GetScraperForPath(item->GetPath(), info, ADDON::ADDON_SCRAPER_ARTISTS))
+ {
+ if (info && info->Supports(CONTENT_ARTISTS))
+ buttons.Add(CONTEXT_BUTTON_INFO_ALL, 21884);
+ }
}
//Set default or clear default
@@ -548,16 +556,16 @@ void CGUIWindowMusicNav::GetContextButtons(int itemNumber, CContextButtons &butt
// 4. specific per album
buttons.Add(CONTEXT_BUTTON_SET_CONTENT, 20195);
}
- if (item->HasMusicInfoTag() && item->GetMusicInfoTag()->GetArtist().size() > 0)
+ if (item->HasMusicInfoTag() && !item->GetMusicInfoTag()->GetArtistString().empty())
{
CVideoDatabase database;
database.Open();
if (database.GetMatchingMusicVideo(item->GetMusicInfoTag()->GetArtistString()) > -1)
buttons.Add(CONTEXT_BUTTON_GO_TO_ARTIST, 20400);
}
- if (item->HasMusicInfoTag() && item->GetMusicInfoTag()->GetArtist().size() > 0 &&
- item->GetMusicInfoTag()->GetAlbum().size() > 0 &&
- item->GetMusicInfoTag()->GetTitle().size() > 0)
+ if (item->HasMusicInfoTag() && !item->GetMusicInfoTag()->GetArtistString().empty() &&
+ !item->GetMusicInfoTag()->GetAlbum().empty() &&
+ !item->GetMusicInfoTag()->GetTitle().empty())
{
CVideoDatabase database;
database.Open();
@@ -753,8 +761,8 @@ bool CGUIWindowMusicNav::OnContextButton(int itemNumber, CONTEXT_BUTTON button)
{
OnItemInfoAll(itemNumber,true,true);
}
-
}
+
return true;
}
diff --git a/xbmc/music/windows/GUIWindowMusicPlaylist.cpp b/xbmc/music/windows/GUIWindowMusicPlaylist.cpp
index 2470e943e0..a8197ce2b6 100644
--- a/xbmc/music/windows/GUIWindowMusicPlaylist.cpp
+++ b/xbmc/music/windows/GUIWindowMusicPlaylist.cpp
@@ -447,7 +447,6 @@ void CGUIWindowMusicPlayList::OnItemLoaded(CFileItem* pItem)
{
if (pItem->HasMusicInfoTag() && pItem->GetMusicInfoTag()->Loaded())
{ // set label 1+2 from tags
- if (m_guiState.get()) m_hideExtensions = m_guiState->HideExtensions();
std::string strTrack=CSettings::GetInstance().GetString(CSettings::SETTING_MUSICFILES_NOWPLAYINGTRACKFORMAT);
if (strTrack.empty())
strTrack = CSettings::GetInstance().GetString(CSettings::SETTING_MUSICFILES_TRACKFORMAT);
diff --git a/xbmc/network/httprequesthandler/HTTPWebinterfaceHandler.cpp b/xbmc/network/httprequesthandler/HTTPWebinterfaceHandler.cpp
index 15f51f77a8..652cd966f6 100644
--- a/xbmc/network/httprequesthandler/HTTPWebinterfaceHandler.cpp
+++ b/xbmc/network/httprequesthandler/HTTPWebinterfaceHandler.cpp
@@ -121,5 +121,12 @@ bool CHTTPWebinterfaceHandler::ResolveAddon(const std::string &url, ADDON::Addon
// append the path within the addon to the path of the addon
addonPath = URIUtils::AddFileToFolder(addonPath, path);
+ // ensure that we don't have a directory traversal hack here
+ // by checking if the resolved absolute path is inside the addon path
+ std::string realPath = URIUtils::GetRealPath(addonPath);
+ std::string realAddonPath = URIUtils::GetRealPath(addon->Path());
+ if (!URIUtils::IsInPath(realPath, realAddonPath))
+ return false;
+
return true;
}
diff --git a/xbmc/osx/XBMCHelper.cpp b/xbmc/osx/XBMCHelper.cpp
index 5b0f5906f9..4e3104cf12 100644
--- a/xbmc/osx/XBMCHelper.cpp
+++ b/xbmc/osx/XBMCHelper.cpp
@@ -262,7 +262,7 @@ void XBMCHelper::Configure()
void XBMCHelper::HandleLaunchAgent()
{
- int oldAlwaysOn = m_alwaysOn;
+ bool oldAlwaysOn = m_alwaysOn;
m_alwaysOn = CSettings::GetInstance().GetBool(CSettings::SETTING_INPUT_APPLEREMOTEALWAYSON);
// Installation/uninstallation.
diff --git a/xbmc/osx/ios/XBMCController.mm b/xbmc/osx/ios/XBMCController.mm
index c73ac6e41d..1e4c01690d 100644
--- a/xbmc/osx/ios/XBMCController.mm
+++ b/xbmc/osx/ios/XBMCController.mm
@@ -1006,36 +1006,36 @@ AnnounceReceiver *AnnounceReceiver::g_announceReceiver = NULL;
switch (receivedEvent.subtype)
{
case UIEventSubtypeRemoteControlTogglePlayPause:
- CApplicationMessenger::GetInstance().SendMsg(TMSG_GUI_ACTION, -1, -1, static_cast<void*>(new CAction(ACTION_PLAYER_PLAYPAUSE)));
+ CApplicationMessenger::GetInstance().SendMsg(TMSG_GUI_ACTION, WINDOW_INVALID, -1, static_cast<void*>(new CAction(ACTION_PLAYER_PLAYPAUSE)));
break;
case UIEventSubtypeRemoteControlPlay:
- CApplicationMessenger::GetInstance().SendMsg(TMSG_GUI_ACTION, -1, -1, static_cast<void*>(new CAction(ACTION_PLAYER_PLAY)));
+ CApplicationMessenger::GetInstance().SendMsg(TMSG_GUI_ACTION, WINDOW_INVALID, -1, static_cast<void*>(new CAction(ACTION_PLAYER_PLAY)));
break;
case UIEventSubtypeRemoteControlPause:
// ACTION_PAUSE sometimes cause unpause, use MediaPauseIfPlaying to make sure pause only
CApplicationMessenger::GetInstance().SendMsg(TMSG_MEDIA_PAUSE_IF_PLAYING);
break;
case UIEventSubtypeRemoteControlNextTrack:
- CApplicationMessenger::GetInstance().SendMsg(TMSG_GUI_ACTION, -1, -1, static_cast<void*>(new CAction(ACTION_NEXT_ITEM)));
+ CApplicationMessenger::GetInstance().SendMsg(TMSG_GUI_ACTION, WINDOW_INVALID, -1, static_cast<void*>(new CAction(ACTION_NEXT_ITEM)));
break;
case UIEventSubtypeRemoteControlPreviousTrack:
- CApplicationMessenger::GetInstance().SendMsg(TMSG_GUI_ACTION, -1, -1, static_cast<void*>(new CAction(ACTION_PREV_ITEM)));
+ CApplicationMessenger::GetInstance().SendMsg(TMSG_GUI_ACTION, WINDOW_INVALID, -1, static_cast<void*>(new CAction(ACTION_PREV_ITEM)));
break;
case UIEventSubtypeRemoteControlBeginSeekingForward:
// use 4X speed forward.
- CApplicationMessenger::GetInstance().SendMsg(TMSG_GUI_ACTION, -1, -1, static_cast<void*>(new CAction(ACTION_PLAYER_FORWARD)));
- CApplicationMessenger::GetInstance().SendMsg(TMSG_GUI_ACTION, -1, -1, static_cast<void*>(new CAction(ACTION_PLAYER_FORWARD)));
+ CApplicationMessenger::GetInstance().SendMsg(TMSG_GUI_ACTION, WINDOW_INVALID, -1, static_cast<void*>(new CAction(ACTION_PLAYER_FORWARD)));
+ CApplicationMessenger::GetInstance().SendMsg(TMSG_GUI_ACTION, WINDOW_INVALID, -1, static_cast<void*>(new CAction(ACTION_PLAYER_FORWARD)));
break;
case UIEventSubtypeRemoteControlBeginSeekingBackward:
// use 4X speed rewind.
- CApplicationMessenger::GetInstance().SendMsg(TMSG_GUI_ACTION, -1, -1, static_cast<void*>(new CAction(ACTION_PLAYER_REWIND)));
- CApplicationMessenger::GetInstance().SendMsg(TMSG_GUI_ACTION, -1, -1, static_cast<void*>(new CAction(ACTION_PLAYER_REWIND)));
+ CApplicationMessenger::GetInstance().SendMsg(TMSG_GUI_ACTION, WINDOW_INVALID, -1, static_cast<void*>(new CAction(ACTION_PLAYER_REWIND)));
+ CApplicationMessenger::GetInstance().SendMsg(TMSG_GUI_ACTION, WINDOW_INVALID, -1, static_cast<void*>(new CAction(ACTION_PLAYER_REWIND)));
break;
case UIEventSubtypeRemoteControlEndSeekingForward:
case UIEventSubtypeRemoteControlEndSeekingBackward:
// restore to normal playback speed.
if (g_application.m_pPlayer->IsPlaying() && !g_application.m_pPlayer->IsPaused())
- CApplicationMessenger::GetInstance().SendMsg(TMSG_GUI_ACTION, -1, -1, static_cast<void*>(new CAction(ACTION_PLAYER_PLAY)));
+ CApplicationMessenger::GetInstance().SendMsg(TMSG_GUI_ACTION, WINDOW_INVALID, -1, static_cast<void*>(new CAction(ACTION_PLAYER_PLAY)));
break;
default:
LOG(@"unhandled subtype: %d", receivedEvent.subtype);
diff --git a/xbmc/pictures/GUIWindowSlideShow.cpp b/xbmc/pictures/GUIWindowSlideShow.cpp
index bb8e551dcd..39039ab758 100644
--- a/xbmc/pictures/GUIWindowSlideShow.cpp
+++ b/xbmc/pictures/GUIWindowSlideShow.cpp
@@ -72,10 +72,15 @@ using namespace KODI::MESSAGING;
static float zoomamount[10] = { 1.0f, 1.2f, 1.5f, 2.0f, 2.8f, 4.0f, 6.0f, 9.0f, 13.5f, 20.0f };
-CBackgroundPicLoader::CBackgroundPicLoader() : CThread("BgPicLoader")
+CBackgroundPicLoader::CBackgroundPicLoader()
+ : CThread("BgPicLoader")
+ , m_iPic{0}
+ , m_iSlideNumber{0}
+ , m_maxWidth{0}
+ , m_maxHeight{0}
+ , m_isLoading{false}
+ , m_pCallback{nullptr}
{
- m_pCallback = NULL;
- m_isLoading = false;
}
CBackgroundPicLoader::~CBackgroundPicLoader()
@@ -148,6 +153,7 @@ CGUIWindowSlideShow::CGUIWindowSlideShow(void)
m_slides = new CFileItemList;
m_Resolution = RES_INVALID;
m_loadType = KEEP_IN_MEMORY;
+ m_bLoadNextPic = false;
Reset();
}
diff --git a/xbmc/pictures/PictureInfoLoader.cpp b/xbmc/pictures/PictureInfoLoader.cpp
index 0e87ca8b86..dd3347277c 100644
--- a/xbmc/pictures/PictureInfoLoader.cpp
+++ b/xbmc/pictures/PictureInfoLoader.cpp
@@ -26,6 +26,7 @@
CPictureInfoLoader::CPictureInfoLoader()
{
m_mapFileItems = new CFileItemList;
+ m_tagReads = 0;
}
CPictureInfoLoader::~CPictureInfoLoader()
diff --git a/xbmc/powermanagement/DPMSSupport.cpp b/xbmc/powermanagement/DPMSSupport.cpp
index 47e4bcaa4e..b3540b190c 100644
--- a/xbmc/powermanagement/DPMSSupport.cpp
+++ b/xbmc/powermanagement/DPMSSupport.cpp
@@ -103,7 +103,7 @@ bool DPMSSupport::DisablePowerSaving()
///////// Platform-specific support
-#if defined(HAS_GLX)
+#if defined(HAVE_X11)
//// X Windows
// Here's a sad story: our Windows-inspired BOOL type from linux/PlatformDefs.h
diff --git a/xbmc/powermanagement/PowerManager.cpp b/xbmc/powermanagement/PowerManager.cpp
index 7c5604d70a..850fabe385 100644
--- a/xbmc/powermanagement/PowerManager.cpp
+++ b/xbmc/powermanagement/PowerManager.cpp
@@ -72,6 +72,8 @@ CPowerManager::~CPowerManager()
void CPowerManager::Initialize()
{
+ SAFE_DELETE(m_instance);
+
#if defined(TARGET_DARWIN)
m_instance = new CCocoaPowerSyscall();
#elif defined(TARGET_ANDROID)
diff --git a/xbmc/pvr/PVRDatabase.cpp b/xbmc/pvr/PVRDatabase.cpp
index 8ecdd2fc71..5b19bfff39 100644
--- a/xbmc/pvr/PVRDatabase.cpp
+++ b/xbmc/pvr/PVRDatabase.cpp
@@ -562,7 +562,13 @@ bool CPVRDatabase::PersistChannels(CPVRChannelGroup &group)
for (PVR_CHANNEL_GROUP_MEMBERS::iterator it = group.m_members.begin(); it != group.m_members.end(); ++it)
{
if (it->second.channel->IsChanged() || it->second.channel->IsNew())
- bReturn &= Persist(*it->second.channel);
+ {
+ if (Persist(*it->second.channel))
+ {
+ it->second.channel->Persisted();
+ bReturn = true;
+ }
+ }
}
bReturn &= CommitInsertQueries();
diff --git a/xbmc/pvr/PVRGUIInfo.cpp b/xbmc/pvr/PVRGUIInfo.cpp
index b174ceb038..b551664994 100644
--- a/xbmc/pvr/PVRGUIInfo.cpp
+++ b/xbmc/pvr/PVRGUIInfo.cpp
@@ -89,6 +89,12 @@ void CPVRGUIInfo::ResetProperties(void)
m_bHasTVChannels = false;
m_bHasRadioChannels = false;
m_bIsTimeshifting = false;
+ m_iTimeshiftStartTime = time_t(0);
+ m_iTimeshiftEndTime = time_t(0);
+ m_iTimeshiftPlayTime = time_t(0);
+ m_strTimeshiftStartTime.clear();
+ m_strTimeshiftEndTime.clear();
+ m_strTimeshiftPlayTime.clear();
ResetPlayingTag();
ClearQualityInfo(m_qualityInfo);
diff --git a/xbmc/pvr/PVRManager.cpp b/xbmc/pvr/PVRManager.cpp
index 2f5397005e..a5f90b4d86 100644
--- a/xbmc/pvr/PVRManager.cpp
+++ b/xbmc/pvr/PVRManager.cpp
@@ -400,8 +400,6 @@ public:
g_PVRManager.Start(false);
return true;
}
-private:
- int m_openWindowId;
};
void CPVRManager::Start(bool bAsync /* = false */)
diff --git a/xbmc/pvr/channels/PVRChannel.cpp b/xbmc/pvr/channels/PVRChannel.cpp
index f1d3b70945..99575374be 100644
--- a/xbmc/pvr/channels/PVRChannel.cpp
+++ b/xbmc/pvr/channels/PVRChannel.cpp
@@ -731,6 +731,12 @@ bool CPVRChannel::IsChanged() const
return m_bChanged;
}
+void CPVRChannel::Persisted()
+{
+ CSingleLock lock(m_critSection);
+ m_bChanged = false;
+}
+
int CPVRChannel::UniqueID(void) const
{
return m_iUniqueId;
diff --git a/xbmc/pvr/channels/PVRChannel.h b/xbmc/pvr/channels/PVRChannel.h
index cbec810369..6f591e16da 100644
--- a/xbmc/pvr/channels/PVRChannel.h
+++ b/xbmc/pvr/channels/PVRChannel.h
@@ -251,6 +251,11 @@ namespace PVR
bool IsEmpty() const;
bool IsChanged() const;
+
+ /*!
+ * @brief reset changed flag after persist
+ */
+ void Persisted();
//@}
/*! @name Client related channel methods
diff --git a/xbmc/pvr/channels/PVRChannelGroup.cpp b/xbmc/pvr/channels/PVRChannelGroup.cpp
index f94ee7885c..8a2af488df 100644
--- a/xbmc/pvr/channels/PVRChannelGroup.cpp
+++ b/xbmc/pvr/channels/PVRChannelGroup.cpp
@@ -890,10 +890,14 @@ bool CPVRChannelGroup::Persist(void)
bool bReturn(true);
CSingleLock lock(m_critSection);
- /* don't persist until the group is fully loaded and has changes */
- if (!HasChanges() || !m_bLoaded)
+ /* only persist if the group has changes and is fully loaded or never has been saved before */
+ if (!HasChanges() || (!m_bLoaded && m_iGroupId != -1))
return bReturn;
+ // Mark newly created groups as loaded so future updates will also be persisted...
+ if (m_iGroupId == -1)
+ m_bLoaded = true;
+
if (CPVRDatabase *database = GetPVRDatabase())
{
CLog::Log(LOGDEBUG, "CPVRChannelGroup - %s - persisting channel group '%s' with %d channels",
diff --git a/xbmc/pvr/dialogs/GUIDialogPVRGuideInfo.cpp b/xbmc/pvr/dialogs/GUIDialogPVRGuideInfo.cpp
index f9b07cf975..bd1d211711 100644
--- a/xbmc/pvr/dialogs/GUIDialogPVRGuideInfo.cpp
+++ b/xbmc/pvr/dialogs/GUIDialogPVRGuideInfo.cpp
@@ -60,36 +60,26 @@ bool CGUIDialogPVRGuideInfo::ActionStartTimer(const CEpgInfoTagPtr &tag)
{
bool bReturn = false;
- if (!tag)
- return false;
-
- CPVRChannelPtr channel = tag->ChannelTag();
- if (!channel || !g_PVRManager.CheckParentalLock(channel))
- return false;
-
- Close();
+ CFileItemPtr item(new CFileItem(tag));
+ bReturn = CGUIWindowPVRBase::AddTimer(item.get(), false);
- CPVRTimerInfoTagPtr newTimer = CPVRTimerInfoTag::CreateFromEpg(tag);
- if (newTimer)
- bReturn = CPVRTimers::AddTimer(newTimer);
- else
- bReturn = false;
+ if (bReturn)
+ Close();
return bReturn;
}
-bool CGUIDialogPVRGuideInfo::ActionCancelTimer(CFileItemPtr timer)
+bool CGUIDialogPVRGuideInfo::ActionCancelTimer(const CFileItemPtr &timer)
{
- bool bReturn(false);
- if (!timer || !timer->HasPVRTimerInfoTag())
- return bReturn;
+ bool bReturn = false;
- bool bDeleteSchedule(false);
- if (CGUIWindowPVRBase::ConfirmDeleteTimer(timer.get(), bDeleteSchedule))
- {
+ if (timer->GetPVRTimerInfoTag()->IsRecording())
+ bReturn = CGUIWindowPVRBase::StopRecordFile(timer.get());
+ else
+ bReturn = CGUIWindowPVRBase::DeleteTimer(timer.get());
+
+ if (bReturn)
Close();
- bReturn = CPVRTimers::DeleteTimer(*timer, false, bDeleteSchedule);
- }
return bReturn;
}
@@ -234,29 +224,26 @@ void CGUIDialogPVRGuideInfo::OnInitWindow()
SET_CONTROL_HIDDEN(CONTROL_BTN_PLAY_RECORDING);
}
- if (tag->EndAsLocalTime() <= CDateTime::GetCurrentDateTime())
+ bool bHideRecord(true);
+ if (tag->HasTimer())
{
- /* event has passed. hide the record button */
- SET_CONTROL_HIDDEN(CONTROL_BTN_RECORD);
- return;
- }
-
- CFileItemPtr match = g_PVRTimers->GetTimerForEpgTag(m_progItem.get());
- if (!match || !match->HasPVRTimerInfoTag())
- {
- /* no timer present on this tag */
- SET_CONTROL_LABEL(CONTROL_BTN_RECORD, 264); // Record
+ if (tag->Timer()->IsRecording())
+ {
+ SET_CONTROL_LABEL(CONTROL_BTN_RECORD, 19059); /* Stop recording */
+ bHideRecord = false;
+ }
+ else if (tag->Timer()->HasTimerType() && !tag->Timer()->GetTimerType()->IsReadOnly())
+ {
+ SET_CONTROL_LABEL(CONTROL_BTN_RECORD, 19060); /* Delete timer */
+ bHideRecord = false;
+ }
}
- else
+ else if (tag->EndAsLocalTime() > CDateTime::GetCurrentDateTime())
{
- /* timer present on this tag */
- if (tag->StartAsLocalTime() < CDateTime::GetCurrentDateTime())
- SET_CONTROL_LABEL(CONTROL_BTN_RECORD, 19059); // Stop recording
- else if (match->HasPVRTimerInfoTag() &&
- match->GetPVRTimerInfoTag()->HasTimerType() &&
- !match->GetPVRTimerInfoTag()->GetTimerType()->IsReadOnly())
- SET_CONTROL_LABEL(CONTROL_BTN_RECORD, 19060); // Delete timer
- else
- SET_CONTROL_HIDDEN(CONTROL_BTN_RECORD);
+ SET_CONTROL_LABEL(CONTROL_BTN_RECORD, 264); /* Record */
+ bHideRecord = false;
}
+
+ if (bHideRecord)
+ SET_CONTROL_HIDDEN(CONTROL_BTN_RECORD);
}
diff --git a/xbmc/pvr/dialogs/GUIDialogPVRGuideInfo.h b/xbmc/pvr/dialogs/GUIDialogPVRGuideInfo.h
index 39fc09fbd7..e3a0581824 100644
--- a/xbmc/pvr/dialogs/GUIDialogPVRGuideInfo.h
+++ b/xbmc/pvr/dialogs/GUIDialogPVRGuideInfo.h
@@ -47,7 +47,7 @@ namespace PVR
virtual void OnInitWindow();
bool ActionStartTimer(const EPG::CEpgInfoTagPtr &tag);
- bool ActionCancelTimer(CFileItemPtr timer);
+ bool ActionCancelTimer(const CFileItemPtr &timer);
bool OnClickButtonOK(CGUIMessage &message);
bool OnClickButtonRecord(CGUIMessage &message);
diff --git a/xbmc/pvr/dialogs/GUIDialogPVRRadioRDSInfo.cpp b/xbmc/pvr/dialogs/GUIDialogPVRRadioRDSInfo.cpp
index 3451b90731..c83d8c19e1 100644
--- a/xbmc/pvr/dialogs/GUIDialogPVRRadioRDSInfo.cpp
+++ b/xbmc/pvr/dialogs/GUIDialogPVRRadioRDSInfo.cpp
@@ -51,6 +51,16 @@ using namespace PVR;
CGUIDialogPVRRadioRDSInfo::CGUIDialogPVRRadioRDSInfo(void)
: CGUIDialog(WINDOW_DIALOG_PVR_RADIO_RDS_INFO, "DialogPVRRadioRDSInfo.xml")
, m_rdsItem(new CFileItem)
+ , m_InfoPresent(false)
+ , m_LabelInfoNewsPresent(false)
+ , m_LabelInfoNewsLocalPresent(false)
+ , m_LabelInfoWeatherPresent(false)
+ , m_LabelInfoLotteryPresent(false)
+ , m_LabelInfoSportPresent(false)
+ , m_LabelInfoStockPresent(false)
+ , m_LabelInfoOtherPresent(false)
+ , m_LabelInfoCinemaPresent(false)
+ , m_LabelInfoHoroscopePresent(false)
{
}
diff --git a/xbmc/pvr/dialogs/GUIDialogPVRTimerSettings.cpp b/xbmc/pvr/dialogs/GUIDialogPVRTimerSettings.cpp
index 7a839e13ea..e49e8bb3a2 100644
--- a/xbmc/pvr/dialogs/GUIDialogPVRTimerSettings.cpp
+++ b/xbmc/pvr/dialogs/GUIDialogPVRTimerSettings.cpp
@@ -237,7 +237,7 @@ void CGUIDialogPVRTimerSettings::InitializeSettings()
AddTypeDependentEnableCondition(setting, SETTING_TMR_TYPE);
// Timer enabled/disabled
- setting = AddToggle(group, SETTING_TMR_ACTIVE, 19074, 0, m_bTimerActive);
+ setting = AddToggle(group, SETTING_TMR_ACTIVE, 305, 0, m_bTimerActive);
AddTypeDependentVisibilityCondition(setting, SETTING_TMR_ACTIVE);
AddTypeDependentEnableCondition(setting, SETTING_TMR_ACTIVE);
@@ -923,6 +923,21 @@ void CGUIDialogPVRTimerSettings::PrioritiesFiller(
list.clear();
pThis->m_timerType->GetPriorityValues(list);
current = pThis->m_iPriority;
+
+ auto it = list.begin();
+ while (it != list.end())
+ {
+ if (it->second == current)
+ break; // value already in list
+
+ ++it;
+ }
+
+ if (it == list.end())
+ {
+ // PVR backend supplied value is not in the list of predefined values. Insert it.
+ list.insert(it, std::make_pair(StringUtils::Format("%d", current), current));
+ }
}
else
CLog::Log(LOGERROR, "CGUIDialogPVRTimerSettings::PrioritiesFiller - No dialog");
@@ -937,6 +952,21 @@ void CGUIDialogPVRTimerSettings::LifetimesFiller(
list.clear();
pThis->m_timerType->GetLifetimeValues(list);
current = pThis->m_iLifetime;
+
+ auto it = list.begin();
+ while (it != list.end())
+ {
+ if (it->second == current)
+ break; // value already in list
+
+ ++it;
+ }
+
+ if (it == list.end())
+ {
+ // PVR backend supplied value is not in the list of predefined values. Insert it.
+ list.insert(it, std::make_pair(StringUtils::Format(g_localizeStrings.Get(17999).c_str(), current) /* %i days */, current));
+ }
}
else
CLog::Log(LOGERROR, "CGUIDialogPVRTimerSettings::LifetimesFiller - No dialog");
@@ -951,6 +981,21 @@ void CGUIDialogPVRTimerSettings::MaxRecordingsFiller(
list.clear();
pThis->m_timerType->GetMaxRecordingsValues(list);
current = pThis->m_iMaxRecordings;
+
+ auto it = list.begin();
+ while (it != list.end())
+ {
+ if (it->second == current)
+ break; // value already in list
+
+ ++it;
+ }
+
+ if (it == list.end())
+ {
+ // PVR backend supplied value is not in the list of predefined values. Insert it.
+ list.insert(it, std::make_pair(StringUtils::Format("%d", current), current));
+ }
}
else
CLog::Log(LOGERROR, "CGUIDialogPVRTimerSettings::MaxRecordingsFiller - No dialog");
diff --git a/xbmc/pvr/timers/PVRTimerInfoTag.cpp b/xbmc/pvr/timers/PVRTimerInfoTag.cpp
index ba3b1dd9f3..576309e0e5 100644
--- a/xbmc/pvr/timers/PVRTimerInfoTag.cpp
+++ b/xbmc/pvr/timers/PVRTimerInfoTag.cpp
@@ -420,7 +420,7 @@ std::string CPVRTimerInfoTag::GetStatus() const
else if (m_state == PVR_TIMER_STATE_ERROR)
strReturn = g_localizeStrings.Get(257);
else if (m_state == PVR_TIMER_STATE_DISABLED)
- strReturn = g_localizeStrings.Get(825);
+ strReturn = g_localizeStrings.Get(13106);
return strReturn;
}
@@ -808,7 +808,7 @@ void CPVRTimerInfoTag::GetNotificationText(std::string &strText) const
break;
case PVR_TIMER_STATE_SCHEDULED:
if (IsRepeating())
- stringID = 826; // Timer activated
+ stringID = 19058; // Timer enabled
else
stringID = 19225; // Recording scheduled
break;
@@ -826,7 +826,7 @@ void CPVRTimerInfoTag::GetNotificationText(std::string &strText) const
stringID = 19278; // Recording error
break;
case PVR_TIMER_STATE_DISABLED:
- stringID = 827; // Timer deactivated
+ stringID = 19057; // Timer disabled
break;
default:
break;
diff --git a/xbmc/pvr/timers/PVRTimerInfoTag.h b/xbmc/pvr/timers/PVRTimerInfoTag.h
index 7a09a738f5..89bdf31055 100644
--- a/xbmc/pvr/timers/PVRTimerInfoTag.h
+++ b/xbmc/pvr/timers/PVRTimerInfoTag.h
@@ -127,6 +127,15 @@ namespace PVR
|| m_state == PVR_TIMER_STATE_ERROR;
}
+ /*!
+ * @return True if this timer won't result in a recording because it is broken for some reason, false otherwise
+ */
+ bool IsBroken(void) const
+ {
+ return m_state == PVR_TIMER_STATE_CONFLICT_NOK
+ || m_state == PVR_TIMER_STATE_ERROR;
+ }
+
bool IsRecording(void) const { return m_state == PVR_TIMER_STATE_RECORDING; }
/*!
diff --git a/xbmc/pvr/timers/PVRTimerType.cpp b/xbmc/pvr/timers/PVRTimerType.cpp
index 014c40a5d3..3335fc1d33 100644
--- a/xbmc/pvr/timers/PVRTimerType.cpp
+++ b/xbmc/pvr/timers/PVRTimerType.cpp
@@ -222,9 +222,7 @@ void CPVRTimerType::InitMaxRecordingsValues(const PVR_TIMER_TYPE &type)
if (strDescr.size() == 0)
{
// No description given by addon. Create one from value.
- strDescr = StringUtils::Format("%s %d",
- g_localizeStrings.Get(817).c_str(), // Max Recordings
- type.maxRecordings[i].iValue);
+ strDescr = StringUtils::Format("%d", type.maxRecordings[i].iValue);
}
m_maxRecordingsValues.push_back(std::make_pair(strDescr, type.maxRecordings[i].iValue));
}
diff --git a/xbmc/pvr/timers/PVRTimers.cpp b/xbmc/pvr/timers/PVRTimers.cpp
index a2714d3f32..aea42bc6eb 100644
--- a/xbmc/pvr/timers/PVRTimers.cpp
+++ b/xbmc/pvr/timers/PVRTimers.cpp
@@ -143,11 +143,11 @@ bool CPVRTimers::UpdateEntries(const CPVRTimers &timers)
UpdateEpgEvent(newTimer);
VecTimerInfoTag* addEntry = NULL;
- MapTags::iterator itr = m_tags.find(newTimer->StartAsUTC());
+ MapTags::iterator itr = m_tags.find(newTimer->m_bStartAnyTime ? CDateTime() : newTimer->StartAsUTC());
if (itr == m_tags.end())
{
addEntry = new VecTimerInfoTag;
- m_tags.insert(std::make_pair(newTimer->StartAsUTC(), addEntry));
+ m_tags.insert(std::make_pair(newTimer->m_bStartAnyTime ? CDateTime() : newTimer->StartAsUTC(), addEntry));
}
else
{
@@ -198,7 +198,8 @@ bool CPVRTimers::UpdateEntries(const CPVRTimers &timers)
bChanged = true;
bAddedOrDeleted = true;
}
- else if (timer->StartAsUTC() != it->first)
+ else if ((timer->m_bStartAnyTime && it->first != CDateTime()) ||
+ (!timer->m_bStartAnyTime && timer->StartAsUTC() != it->first))
{
/* timer start has changed */
CLog::Log(LOGDEBUG,"PVRTimers - %s - changed start time timer %d on client %d",
@@ -230,11 +231,11 @@ bool CPVRTimers::UpdateEntries(const CPVRTimers &timers)
for (VecTimerInfoTag::const_iterator timerIt = timersToMove.begin(); timerIt != timersToMove.end(); ++timerIt)
{
VecTimerInfoTag* addEntry = NULL;
- MapTags::const_iterator itr = m_tags.find((*timerIt)->StartAsUTC());
+ MapTags::const_iterator itr = m_tags.find((*timerIt)->m_bStartAnyTime ? CDateTime() : (*timerIt)->StartAsUTC());
if (itr == m_tags.end())
{
addEntry = new VecTimerInfoTag;
- m_tags.insert(std::make_pair((*timerIt)->StartAsUTC(), addEntry));
+ m_tags.insert(std::make_pair((*timerIt)->m_bStartAnyTime ? CDateTime() : (*timerIt)->StartAsUTC(), addEntry));
}
else
{
@@ -277,11 +278,11 @@ bool CPVRTimers::UpdateFromClient(const CPVRTimerInfoTagPtr &timer)
{
tag = CPVRTimerInfoTagPtr(new CPVRTimerInfoTag());
VecTimerInfoTag* addEntry = NULL;
- MapTags::iterator itr = m_tags.find(timer->StartAsUTC());
+ MapTags::iterator itr = m_tags.find(timer->m_bStartAnyTime ? CDateTime() : timer->StartAsUTC());
if (itr == m_tags.end())
{
addEntry = new VecTimerInfoTag;
- m_tags.insert(std::make_pair(timer->StartAsUTC(), addEntry));
+ m_tags.insert(std::make_pair(timer->m_bStartAnyTime ? CDateTime() : timer->StartAsUTC(), addEntry));
}
else
{
@@ -306,7 +307,7 @@ CFileItemPtr CPVRTimers::GetNextActiveTimer(void) const
for (VecTimerInfoTag::const_iterator timerIt = it->second->begin(); timerIt != it->second->end(); ++timerIt)
{
CPVRTimerInfoTagPtr current = *timerIt;
- if (current->IsActive() && !current->IsRecording() && !current->IsRepeating())
+ if (current->IsActive() && !current->IsRecording() && !current->IsRepeating() && !current->IsBroken())
{
CFileItemPtr fileItem(new CFileItem(current));
return fileItem;
@@ -362,7 +363,7 @@ std::vector<CFileItemPtr> CPVRTimers::GetActiveRecordings(void) const
for (VecTimerInfoTag::const_iterator timerIt = it->second->begin(); timerIt != it->second->end(); ++timerIt)
{
CPVRTimerInfoTagPtr current = *timerIt;
- if (current->IsRecording())
+ if (current->IsRecording() && !current->IsRepeating())
{
CFileItemPtr fileItem(new CFileItem(current));
tags.push_back(fileItem);
@@ -380,7 +381,7 @@ int CPVRTimers::AmountActiveRecordings(void) const
for (MapTags::const_iterator it = m_tags.begin(); it != m_tags.end(); ++it)
for (VecTimerInfoTag::const_iterator timerIt = it->second->begin(); timerIt != it->second->end(); ++timerIt)
- if ((*timerIt)->IsRecording())
+ if ((*timerIt)->IsRecording() && !(*timerIt)->IsRepeating())
++iReturn;
return iReturn;
@@ -446,6 +447,9 @@ bool CPVRTimers::GetSubDirectory(const CPVRTimersPath &path, CFileItemList &item
(timer->m_iParentClientIndex == iParentId))
{
item.reset(new CFileItem(timer));
+ std::string strItemPath(
+ CPVRTimersPath(path.GetPath(), timer->m_iClientId, timer->m_iClientIndex).GetPath());
+ item->SetPath(strItemPath);
items.Add(item);
}
}
diff --git a/xbmc/pvr/windows/GUIWindowPVRBase.cpp b/xbmc/pvr/windows/GUIWindowPVRBase.cpp
index c082484263..6c905f0f28 100644
--- a/xbmc/pvr/windows/GUIWindowPVRBase.cpp
+++ b/xbmc/pvr/windows/GUIWindowPVRBase.cpp
@@ -456,10 +456,27 @@ bool CGUIWindowPVRBase::ShowTimerSettings(CFileItem *item)
bool CGUIWindowPVRBase::AddTimer(CFileItem *item, bool bAdvanced)
{
- if (!item->HasEPGInfoTag())
- return false;
+ CFileItemPtr epgTag;
+ if (item->IsEPG())
+ {
+ epgTag.reset(new CFileItem(*item));
+ if (!epgTag->GetEPGInfoTag()->HasPVRChannel())
+ return false;
+ }
+ else if (item->IsPVRChannel())
+ {
+ CPVRChannelPtr channel(item->GetPVRChannelInfoTag());
+ if (!channel)
+ return false;
- const CEpgInfoTagPtr tag = item->GetEPGInfoTag();
+ CEpgInfoTagPtr epgNow(channel->GetEPGNow());
+ if (!epgNow)
+ return false;
+
+ epgTag.reset(new CFileItem(epgNow));
+ }
+
+ const CEpgInfoTagPtr tag = epgTag->GetEPGInfoTag();
CPVRChannelPtr channel = tag->ChannelTag();
if (!channel || !g_PVRManager.CheckParentalLock(channel))
@@ -497,23 +514,56 @@ bool CGUIWindowPVRBase::AddTimer(CFileItem *item, bool bAdvanced)
return bReturn;
}
+bool CGUIWindowPVRBase::DeleteTimer(CFileItem *item)
+{
+ return DeleteTimer(item, false);
+}
+
bool CGUIWindowPVRBase::StopRecordFile(CFileItem *item)
{
- if (!item->HasEPGInfoTag())
- return false;
+ return DeleteTimer(item, true);
+}
- const CEpgInfoTagPtr tag(item->GetEPGInfoTag());
- if (!tag || !tag->HasPVRChannel())
- return false;
+bool CGUIWindowPVRBase::DeleteTimer(CFileItem *item, bool bIsRecording)
+{
+ CFileItemPtr timer;
+
+ if (item->IsPVRTimer())
+ {
+ timer.reset(new CFileItem(*item));
+ }
+ else if (item->IsEPG())
+ {
+ timer = g_PVRTimers->GetTimerForEpgTag(item);
+ }
+ else if (item->IsPVRChannel())
+ {
+ CPVRChannelPtr channel(item->GetPVRChannelInfoTag());
+ if (!channel)
+ return false;
+
+ CFileItemPtr epgNow(new CFileItem(channel->GetEPGNow()));
+ timer = g_PVRTimers->GetTimerForEpgTag(epgNow.get());
+ }
- CFileItemPtr timer = g_PVRTimers->GetTimerForEpgTag(item);
if (!timer || !timer->HasPVRTimerInfoTag())
return false;
- bool bDeleteSchedule(false);
- if (ConfirmDeleteTimer(timer.get(), bDeleteSchedule))
- return CPVRTimers::DeleteTimer(*timer, false, bDeleteSchedule);
+ if (timer->GetPVRTimerInfoTag()->HasTimerType() &&
+ timer->GetPVRTimerInfoTag()->GetTimerType()->IsReadOnly())
+ return false;
+ if (bIsRecording)
+ {
+ if (ConfirmStopRecording(timer.get()))
+ return CPVRTimers::DeleteTimer(*timer, true, false);
+ }
+ else
+ {
+ bool bDeleteSchedule(false);
+ if (ConfirmDeleteTimer(timer.get(), bDeleteSchedule))
+ return CPVRTimers::DeleteTimer(*timer, false, bDeleteSchedule);
+ }
return false;
}
@@ -692,6 +742,18 @@ bool CGUIWindowPVRBase::ActionInputChannelNumber(int input)
return false;
}
+bool CGUIWindowPVRBase::ActionToggleTimer(CFileItem *item)
+{
+ if (!item->HasEPGInfoTag())
+ return false;
+
+ CPVRTimerInfoTagPtr timer(item->GetEPGInfoTag()->Timer());
+ if (timer)
+ return DeleteTimer(item, timer->IsRecording());
+ else
+ return AddTimer(item, false);
+}
+
bool CGUIWindowPVRBase::ActionPlayChannel(CFileItem *item)
{
return PlayFile(item, CSettings::GetInstance().GetBool(CSettings::SETTING_PVRPLAYBACK_PLAYMINIMIZED));
@@ -756,39 +818,6 @@ bool CGUIWindowPVRBase::ActionDeleteChannel(CFileItem *item)
return true;
}
-bool CGUIWindowPVRBase::ActionRecord(CFileItem *item)
-{
- bool bReturn = false;
-
- CEpgInfoTagPtr epgTag(item->GetEPGInfoTag());
- if (!epgTag)
- return bReturn;
-
- CPVRChannelPtr channel = epgTag->ChannelTag();
- if (!channel || !g_PVRManager.CheckParentalLock(channel))
- return bReturn;
-
- if (epgTag->Timer() == NULL)
- {
- CPVRTimerInfoTagPtr newTimer = CPVRTimerInfoTag::CreateFromEpg(epgTag);
- if (newTimer)
- {
- bReturn = g_PVRTimers->AddTimer(newTimer);
- }
- else
- {
- bReturn = false;
- }
- }
- else
- {
- CGUIDialogOK::ShowAndGetInput(CVariant{19033}, CVariant{19034});
- bReturn = true;
- }
-
- return bReturn;
-}
-
bool CGUIWindowPVRBase::UpdateEpgForChannel(CFileItem *item)
{
CPVRChannelPtr channel(item->GetPVRChannelInfoTag());
@@ -847,3 +876,12 @@ bool CGUIWindowPVRBase::ConfirmDeleteTimer(CFileItem *item, bool &bDeleteSchedul
return bConfirmed;
}
+
+bool CGUIWindowPVRBase::ConfirmStopRecording(CFileItem *item)
+{
+ return CGUIDialogYesNo::ShowAndGetInput(
+ CVariant{847}, // "Confirm stop recording"
+ CVariant{848}, // "Are you sure you want to stop this recording?"
+ CVariant{""},
+ CVariant{item->GetPVRTimerInfoTag()->Title()});
+}
diff --git a/xbmc/pvr/windows/GUIWindowPVRBase.h b/xbmc/pvr/windows/GUIWindowPVRBase.h
index 4253543bbc..0807568497 100644
--- a/xbmc/pvr/windows/GUIWindowPVRBase.h
+++ b/xbmc/pvr/windows/GUIWindowPVRBase.h
@@ -76,16 +76,10 @@ namespace PVR
static std::string GetSelectedItemPath(bool bRadio);
static void SetSelectedItemPath(bool bRadio, const std::string &path);
- /*!
- * @brief Open a dialog to confirm timer delete.
- * @param item the timer to delete.
- * @param bDeleteSchedule in: ignored
- * out, for one shot timer scheduled by a repeating timer: true to also delete the
- * repeating timer that has scheduled this timer, false to only delete the one shot timer.
- * out, for one shot timer not scheduled by a repeating timer: ignored
- * @return true, to proceed with delete, false otherwise.
- */
- static bool ConfirmDeleteTimer(CFileItem *item, bool &bDeleteSchedule);
+ static bool ShowTimerSettings(CFileItem *item);
+ static bool AddTimer(CFileItem *item, bool bAdvanced);
+ static bool DeleteTimer(CFileItem *item);
+ static bool StopRecordFile(CFileItem *item);
protected:
CGUIWindowPVRBase(bool bRadio, int id, const std::string &xmlFile);
@@ -94,7 +88,7 @@ namespace PVR
virtual CPVRChannelGroupPtr GetGroup(void);
virtual void SetGroup(CPVRChannelGroupPtr group);
- virtual bool ActionRecord(CFileItem *item);
+ virtual bool ActionToggleTimer(CFileItem *item);
virtual bool ActionPlayChannel(CFileItem *item);
virtual bool ActionPlayEpg(CFileItem *item, bool bPlayRecording);
virtual bool ActionDeleteChannel(CFileItem *item);
@@ -102,9 +96,6 @@ namespace PVR
virtual bool PlayRecording(CFileItem *item, bool bPlayMinimized = false, bool bCheckResume = true);
virtual bool PlayFile(CFileItem *item, bool bPlayMinimized = false, bool bCheckResume = true);
- virtual bool ShowTimerSettings(CFileItem *item);
- virtual bool AddTimer(CFileItem *item, bool bAdvanced = false);
- virtual bool StopRecordFile(CFileItem *item);
virtual void ShowEPGInfo(CFileItem *item);
virtual void ShowRecordingInfo(CFileItem *item);
virtual bool UpdateEpgForChannel(CFileItem *item);
@@ -118,6 +109,26 @@ namespace PVR
bool m_bRadio;
private:
+ /*!
+ * @brief Open a dialog to confirm timer delete.
+ * @param item the timer to delete.
+ * @param bDeleteSchedule in: ignored
+ * out, for one shot timer scheduled by a repeating timer: true to also delete the
+ * repeating timer that has scheduled this timer, false to only delete the one shot timer.
+ * out, for one shot timer not scheduled by a repeating timer: ignored
+ * @return true, to proceed with delete, false otherwise.
+ */
+ static bool ConfirmDeleteTimer(CFileItem *item, bool &bDeleteSchedule);
+
+ /*!
+ * @brief Open a dialog to confirm stop recording.
+ * @param item the recording to stop (actually the timer to delete).
+ * @return true, to proceed with delete, false otherwise.
+ */
+ static bool ConfirmStopRecording(CFileItem *item);
+
+ static bool DeleteTimer(CFileItem *item, bool bIsRecording);
+
CPVRChannelGroupPtr m_group;
XbmcThreads::EndTime m_refreshTimeout;
};
diff --git a/xbmc/pvr/windows/GUIWindowPVRChannels.cpp b/xbmc/pvr/windows/GUIWindowPVRChannels.cpp
index d16f187f8c..5d89d1e4c1 100644
--- a/xbmc/pvr/windows/GUIWindowPVRChannels.cpp
+++ b/xbmc/pvr/windows/GUIWindowPVRChannels.cpp
@@ -77,14 +77,21 @@ void CGUIWindowPVRChannels::GetContextButtons(int itemNumber, CContextButtons &b
CFileItemPtr pItem = m_vecItems->Get(itemNumber);
CPVRChannelPtr channel(pItem->GetPVRChannelInfoTag());
+ if (channel->GetEPGNow())
+ {
+ buttons.Add(CONTEXT_BUTTON_INFO, 19047); /* Programme information */
+ buttons.Add(CONTEXT_BUTTON_FIND, 19003); /* Find similar */
+ }
+
+ if (channel->IsRecording())
+ buttons.Add(CONTEXT_BUTTON_STOP_RECORD, 19059); /* Stop recording */
+ else
+ buttons.Add(CONTEXT_BUTTON_START_RECORD, 264); /* Record */
+
if (ActiveAE::CActiveAEDSP::GetInstance().IsProcessing())
buttons.Add(CONTEXT_BUTTON_ACTIVE_ADSP_SETTINGS, 15047); /* Audio DSP settings */
- buttons.Add(CONTEXT_BUTTON_INFO, 19047); /* Programme information */
- buttons.Add(CONTEXT_BUTTON_FIND, 19003); /* Find similar */
- buttons.Add(CONTEXT_BUTTON_RECORD_ITEM, !channel->IsRecording() ? 264 : 19059); /* Record / Stop recording */
-
- if (g_PVRClients->HasMenuHooks(pItem->GetPVRChannelInfoTag()->ClientID(), PVR_MENUHOOK_CHANNEL))
+ if (g_PVRClients->HasMenuHooks(channel->ClientID(), PVR_MENUHOOK_CHANNEL))
buttons.Add(CONTEXT_BUTTON_MENU_HOOKS, 19195); /* PVR client specific action */
// Add parent buttons before the Manage button
@@ -112,7 +119,8 @@ bool CGUIWindowPVRChannels::OnContextButton(int itemNumber, CONTEXT_BUTTON butto
OnContextButtonInfo(pItem.get(), button) ||
OnContextButtonGroupManager(pItem.get(), button) ||
OnContextButtonUpdateEpg(pItem.get(), button) ||
- OnContextButtonRecord(pItem.get(), button) ||
+ OnContextButtonStartRecord(pItem.get(), button) ||
+ OnContextButtonStopRecord(pItem.get(), button) ||
OnContextButtonManage(pItem.get(), button) ||
OnContextButtonActiveAEDSPSettings(pItem.get(), button) ||
CGUIWindowPVRBase::OnContextButton(itemNumber, button);
@@ -335,16 +343,28 @@ bool CGUIWindowPVRChannels::OnContextButtonManage(CFileItem *item, CONTEXT_BUTTO
return bReturn;
}
-bool CGUIWindowPVRChannels::OnContextButtonRecord(CFileItem *item, CONTEXT_BUTTON button)
+bool CGUIWindowPVRChannels::OnContextButtonStartRecord(CFileItem *item, CONTEXT_BUTTON button)
{
- bool bReturn(false);
+ bool bReturn = false;
- if (button == CONTEXT_BUTTON_RECORD_ITEM)
+ if ((button == CONTEXT_BUTTON_START_RECORD) ||
+ (button == CONTEXT_BUTTON_ADD_TIMER))
{
- CPVRChannelPtr channel(item->GetPVRChannelInfoTag());
+ AddTimer(item, button == CONTEXT_BUTTON_ADD_TIMER);
+ bReturn = true;
+ }
- if (channel)
- return g_PVRManager.ToggleRecordingOnChannel(channel->ChannelID());
+ return bReturn;
+}
+
+bool CGUIWindowPVRChannels::OnContextButtonStopRecord(CFileItem *item, CONTEXT_BUTTON button)
+{
+ bool bReturn = false;
+
+ if (button == CONTEXT_BUTTON_STOP_RECORD)
+ {
+ StopRecordFile(item);
+ bReturn = true;
}
return bReturn;
diff --git a/xbmc/pvr/windows/GUIWindowPVRChannels.h b/xbmc/pvr/windows/GUIWindowPVRChannels.h
index 1d5d89eefe..049e518394 100644
--- a/xbmc/pvr/windows/GUIWindowPVRChannels.h
+++ b/xbmc/pvr/windows/GUIWindowPVRChannels.h
@@ -47,7 +47,8 @@ namespace PVR
bool OnContextButtonInfo(CFileItem *item, CONTEXT_BUTTON button);
bool OnContextButtonManage(CFileItem *item, CONTEXT_BUTTON button);
bool OnContextButtonUpdateEpg(CFileItem *item, CONTEXT_BUTTON button);
- bool OnContextButtonRecord(CFileItem *item, CONTEXT_BUTTON button);
+ bool OnContextButtonStartRecord(CFileItem *item, CONTEXT_BUTTON button);
+ bool OnContextButtonStopRecord(CFileItem *item, CONTEXT_BUTTON button);
void ShowChannelManager();
void ShowGroupManager(void);
diff --git a/xbmc/pvr/windows/GUIWindowPVRGuide.cpp b/xbmc/pvr/windows/GUIWindowPVRGuide.cpp
index 440e688acf..83ef780734 100644
--- a/xbmc/pvr/windows/GUIWindowPVRGuide.cpp
+++ b/xbmc/pvr/windows/GUIWindowPVRGuide.cpp
@@ -83,27 +83,33 @@ void CGUIWindowPVRGuide::GetContextButtons(int itemNumber, CContextButtons &butt
CFileItemPtr pItem = m_vecItems->Get(itemNumber);
buttons.Add(CONTEXT_BUTTON_PLAY_ITEM, 19000); /* Switch channel */
+ buttons.Add(CONTEXT_BUTTON_INFO, 19047); /* Programme information */
+ buttons.Add(CONTEXT_BUTTON_FIND, 19003); /* Find similar */
- if (pItem->HasEPGInfoTag() && pItem->GetEPGInfoTag()->HasRecording())
- buttons.Add(CONTEXT_BUTTON_PLAY_OTHER, 19687); /* Play recording */
-
- CFileItemPtr timer = g_PVRTimers->GetTimerForEpgTag(pItem.get());
- if (timer && timer->HasPVRTimerInfoTag())
+ CEpgInfoTagPtr epg(pItem->GetEPGInfoTag());
+ if (epg)
{
- if (timer->GetPVRTimerInfoTag()->IsRecording())
- buttons.Add(CONTEXT_BUTTON_STOP_RECORD, 19059); /* Stop recording */
- else if (timer->GetPVRTimerInfoTag()->HasTimerType() &&
- !timer->GetPVRTimerInfoTag()->GetTimerType()->IsReadOnly())
- buttons.Add(CONTEXT_BUTTON_STOP_RECORD, 19060); /* Delete timer */
- }
- else if (pItem->HasEPGInfoTag() && pItem->GetEPGInfoTag()->EndAsLocalTime() > CDateTime::GetCurrentDateTime())
- {
- buttons.Add(CONTEXT_BUTTON_START_RECORD, 264); /* Record */
- buttons.Add(CONTEXT_BUTTON_ADVANCED_RECORD, 19061); /* Add timer */
- }
+ CPVRTimerInfoTagPtr timer(epg->Timer());
+ if (timer)
+ {
+ if (timer->IsRecording())
+ buttons.Add(CONTEXT_BUTTON_STOP_RECORD, 19059); /* Stop recording */
+ else
+ {
+ CPVRTimerTypePtr timerType(timer->GetTimerType());
+ if (timerType && !timerType->IsReadOnly())
+ buttons.Add(CONTEXT_BUTTON_DELETE_TIMER, 19060); /* Delete timer */
+ }
+ }
+ else if (epg->EndAsLocalTime() > CDateTime::GetCurrentDateTime())
+ {
+ buttons.Add(CONTEXT_BUTTON_START_RECORD, 264); /* Record */
+ buttons.Add(CONTEXT_BUTTON_ADD_TIMER, 19061); /* Add timer */
+ }
- buttons.Add(CONTEXT_BUTTON_INFO, 19047); /* Programme information */
- buttons.Add(CONTEXT_BUTTON_FIND, 19003); /* Find similar */
+ if (epg->HasRecording())
+ buttons.Add(CONTEXT_BUTTON_PLAY_OTHER, 19687); /* Play recording */
+ }
if (m_viewControl.GetCurrentControl() == GUIDE_VIEW_TIMELINE)
{
@@ -112,10 +118,12 @@ void CGUIWindowPVRGuide::GetContextButtons(int itemNumber, CContextButtons &butt
buttons.Add(CONTEXT_BUTTON_END, 19064); /* Go to end */
}
- if (pItem->HasEPGInfoTag() &&
- pItem->GetEPGInfoTag()->HasPVRChannel() &&
- g_PVRClients->HasMenuHooks(pItem->GetEPGInfoTag()->ChannelTag()->ClientID(), PVR_MENUHOOK_EPG))
- buttons.Add(CONTEXT_BUTTON_MENU_HOOKS, 19195); /* PVR client specific action */
+ if (epg)
+ {
+ CPVRChannelPtr channel(epg->ChannelTag());
+ if (channel && g_PVRClients->HasMenuHooks(channel->ClientID(), PVR_MENUHOOK_EPG))
+ buttons.Add(CONTEXT_BUTTON_MENU_HOOKS, 19195); /* PVR client specific action */
+ }
CGUIWindowPVRBase::GetContextButtons(itemNumber, buttons);
CContextMenuManager::GetInstance().AddVisibleItems(pItem, buttons);
@@ -223,7 +231,7 @@ bool CGUIWindowPVRGuide::OnMessage(CGUIMessage& message)
bReturn = true;
break;
case EPG_SELECT_ACTION_RECORD:
- ActionRecord(pItem.get());
+ ActionToggleTimer(pItem.get());
bReturn = true;
break;
}
@@ -237,7 +245,7 @@ bool CGUIWindowPVRGuide::OnMessage(CGUIMessage& message)
bReturn = true;
break;
case ACTION_RECORD:
- ActionRecord(pItem.get());
+ ActionToggleTimer(pItem.get());
bReturn = true;
break;
case ACTION_CONTEXT_MENU:
@@ -334,6 +342,7 @@ bool CGUIWindowPVRGuide::OnContextButton(int itemNumber, CONTEXT_BUTTON button)
OnContextButtonInfo(pItem.get(), button) ||
OnContextButtonStartRecord(pItem.get(), button) ||
OnContextButtonStopRecord(pItem.get(), button) ||
+ OnContextButtonDeleteTimer(pItem.get(), button) ||
OnContextButtonBegin(pItem.get(), button) ||
OnContextButtonEnd(pItem.get(), button) ||
OnContextButtonNow(pItem.get(), button) ||
@@ -512,9 +521,9 @@ bool CGUIWindowPVRGuide::OnContextButtonStartRecord(CFileItem *item, CONTEXT_BUT
bool bReturn = false;
if ((button == CONTEXT_BUTTON_START_RECORD) ||
- (button == CONTEXT_BUTTON_ADVANCED_RECORD))
+ (button == CONTEXT_BUTTON_ADD_TIMER))
{
- AddTimer(item, button == CONTEXT_BUTTON_ADVANCED_RECORD);
+ AddTimer(item, button == CONTEXT_BUTTON_ADD_TIMER);
bReturn = true;
}
@@ -533,3 +542,16 @@ bool CGUIWindowPVRGuide::OnContextButtonStopRecord(CFileItem *item, CONTEXT_BUTT
return bReturn;
}
+
+bool CGUIWindowPVRGuide::OnContextButtonDeleteTimer(CFileItem *item, CONTEXT_BUTTON button)
+{
+ bool bReturn = false;
+
+ if (button == CONTEXT_BUTTON_DELETE_TIMER)
+ {
+ DeleteTimer(item);
+ bReturn = true;
+ }
+
+ return bReturn;
+}
diff --git a/xbmc/pvr/windows/GUIWindowPVRGuide.h b/xbmc/pvr/windows/GUIWindowPVRGuide.h
index fbfacab2af..311580a144 100644
--- a/xbmc/pvr/windows/GUIWindowPVRGuide.h
+++ b/xbmc/pvr/windows/GUIWindowPVRGuide.h
@@ -55,6 +55,7 @@ namespace PVR
bool OnContextButtonPlay(CFileItem *item, CONTEXT_BUTTON button);
bool OnContextButtonStartRecord(CFileItem *item, CONTEXT_BUTTON button);
bool OnContextButtonStopRecord(CFileItem *item, CONTEXT_BUTTON button);
+ bool OnContextButtonDeleteTimer(CFileItem *item, CONTEXT_BUTTON button);
void GetViewChannelItems(CFileItemList &items);
void GetViewNowItems(CFileItemList &items);
diff --git a/xbmc/pvr/windows/GUIWindowPVRRecordings.cpp b/xbmc/pvr/windows/GUIWindowPVRRecordings.cpp
index aafc79bddf..1223df59c3 100644
--- a/xbmc/pvr/windows/GUIWindowPVRRecordings.cpp
+++ b/xbmc/pvr/windows/GUIWindowPVRRecordings.cpp
@@ -118,12 +118,10 @@ void CGUIWindowPVRRecordings::GetContextButtons(int itemNumber, CContextButtons
bool isDeletedRecording = false;
- if (ActiveAE::CActiveAEDSP::GetInstance().IsProcessing())
- buttons.Add(CONTEXT_BUTTON_ACTIVE_ADSP_SETTINGS, 15047); /* Audio DSP settings */
-
- if (pItem->HasPVRRecordingInfoTag())
+ CPVRRecordingPtr recording(pItem->GetPVRRecordingInfoTag());
+ if (recording)
{
- isDeletedRecording = pItem->GetPVRRecordingInfoTag()->IsDeleted();
+ isDeletedRecording = recording->IsDeleted();
buttons.Add(CONTEXT_BUTTON_INFO, 19053); /* Recording Information */
if (!isDeletedRecording)
@@ -132,9 +130,7 @@ void CGUIWindowPVRRecordings::GetContextButtons(int itemNumber, CContextButtons
buttons.Add(CONTEXT_BUTTON_PLAY_ITEM, 12021); /* Start from beginning */
std::string resumeString = GetResumeString(*pItem);
if (!resumeString.empty())
- {
buttons.Add(CONTEXT_BUTTON_RESUME_ITEM, resumeString);
- }
}
else
{
@@ -152,9 +148,9 @@ void CGUIWindowPVRRecordings::GetContextButtons(int itemNumber, CContextButtons
buttons.Add(CONTEXT_BUTTON_MARK_UNWATCHED, 16104); /* Mark as unwatched */
buttons.Add(CONTEXT_BUTTON_MARK_WATCHED, 16103); /* Mark as watched */
}
- if (pItem->HasPVRRecordingInfoTag())
+ if (recording)
{
- if (pItem->GetPVRRecordingInfoTag()->m_playCount > 0)
+ if (recording->m_playCount > 0)
buttons.Add(CONTEXT_BUTTON_MARK_UNWATCHED, 16104); /* Mark as unwatched */
else
buttons.Add(CONTEXT_BUTTON_MARK_WATCHED, 16103); /* Mark as watched */
@@ -165,11 +161,13 @@ void CGUIWindowPVRRecordings::GetContextButtons(int itemNumber, CContextButtons
buttons.Add(CONTEXT_BUTTON_DELETE, 117); /* Delete */
}
- if (pItem->HasPVRRecordingInfoTag())
+ if (ActiveAE::CActiveAEDSP::GetInstance().IsProcessing())
+ buttons.Add(CONTEXT_BUTTON_ACTIVE_ADSP_SETTINGS, 15047); /* Audio DSP settings */
+
+ if (recording)
{
- if (!isDeletedRecording && g_PVRClients->HasMenuHooks(pItem->GetPVRRecordingInfoTag()->m_iClientId, PVR_MENUHOOK_RECORDING))
- buttons.Add(CONTEXT_BUTTON_MENU_HOOKS, 19195); /* PVR client specific action */
- else if (isDeletedRecording && g_PVRClients->HasMenuHooks(pItem->GetPVRRecordingInfoTag()->m_iClientId, PVR_MENUHOOK_DELETED_RECORDING))
+ if ((!isDeletedRecording && g_PVRClients->HasMenuHooks(recording->m_iClientId, PVR_MENUHOOK_RECORDING)) ||
+ (isDeletedRecording && g_PVRClients->HasMenuHooks(recording->m_iClientId, PVR_MENUHOOK_DELETED_RECORDING)))
buttons.Add(CONTEXT_BUTTON_MENU_HOOKS, 19195); /* PVR client specific action */
}
diff --git a/xbmc/pvr/windows/GUIWindowPVRSearch.cpp b/xbmc/pvr/windows/GUIWindowPVRSearch.cpp
index 8becc708aa..d782025773 100644
--- a/xbmc/pvr/windows/GUIWindowPVRSearch.cpp
+++ b/xbmc/pvr/windows/GUIWindowPVRSearch.cpp
@@ -48,37 +48,40 @@ void CGUIWindowPVRSearch::GetContextButtons(int itemNumber, CContextButtons &but
return;
CFileItemPtr pItem = m_vecItems->Get(itemNumber);
- if (pItem->HasEPGInfoTag())
+ buttons.Add(CONTEXT_BUTTON_CLEAR, 19232); /* Clear search results */
+
+ CEpgInfoTagPtr epg(pItem->GetEPGInfoTag());
+ if (epg)
{
- if (pItem->GetEPGInfoTag()->EndAsLocalTime() > CDateTime::GetCurrentDateTime())
+ buttons.Add(CONTEXT_BUTTON_INFO, 19047); /* Programme information */
+
+ CPVRTimerInfoTagPtr timer(epg->Timer());
+ if (timer)
{
- if (!pItem->GetEPGInfoTag()->HasTimer())
- {
- buttons.Add(CONTEXT_BUTTON_START_RECORD, 264); /* Record */
- buttons.Add(CONTEXT_BUTTON_ADVANCED_RECORD, 19061); /* Add timer */
- }
+ if (timer->IsRecording())
+ buttons.Add(CONTEXT_BUTTON_STOP_RECORD, 19059); /* Stop recording */
else
{
- if (pItem->GetEPGInfoTag()->StartAsLocalTime() < CDateTime::GetCurrentDateTime())
- buttons.Add(CONTEXT_BUTTON_STOP_RECORD, 19059); /* Stop recording */
- else if (pItem->GetEPGInfoTag()->Timer()->HasTimerType())
- {
- if (!pItem->GetEPGInfoTag()->Timer()->GetTimerType()->IsReadOnly())
- buttons.Add(CONTEXT_BUTTON_STOP_RECORD, 19060); /* Delete timer */
- }
+ CPVRTimerTypePtr timerType(timer->GetTimerType());
+ if (timerType && !timerType->IsReadOnly())
+ buttons.Add(CONTEXT_BUTTON_DELETE_TIMER, 19060); /* Delete timer */
}
}
- if (pItem->GetEPGInfoTag()->HasRecording())
+ else if (epg->EndAsLocalTime() > CDateTime::GetCurrentDateTime())
+ {
+ buttons.Add(CONTEXT_BUTTON_START_RECORD, 264); /* Record */
+ buttons.Add(CONTEXT_BUTTON_ADD_TIMER, 19061); /* Add timer */
+ }
+
+ if (epg->HasRecording())
buttons.Add(CONTEXT_BUTTON_PLAY_ITEM, 19687); /* Play recording */
- buttons.Add(CONTEXT_BUTTON_INFO, 19047); /* Programme information */
- if (pItem->GetEPGInfoTag()->HasPVRChannel() &&
- g_PVRClients->HasMenuHooks(pItem->GetEPGInfoTag()->ChannelTag()->ClientID(), PVR_MENUHOOK_EPG))
+ CPVRChannelPtr channel(epg->ChannelTag());
+ if (channel &&
+ g_PVRClients->HasMenuHooks(channel->ClientID(), PVR_MENUHOOK_EPG))
buttons.Add(CONTEXT_BUTTON_MENU_HOOKS, 19195); /* PVR client specific action */
}
- buttons.Add(CONTEXT_BUTTON_CLEAR, 19232); /* Clear search results */
-
CGUIWindowPVRBase::GetContextButtons(itemNumber, buttons);
CContextMenuManager::GetInstance().AddVisibleItems(pItem, buttons);
}
@@ -97,8 +100,9 @@ bool CGUIWindowPVRSearch::OnContextButton(int itemNumber, CONTEXT_BUTTON button)
return OnContextButtonClear(pItem.get(), button) ||
OnContextButtonInfo(pItem.get(), button) ||
- OnContextButtonStopRecord(pItem.get(), button) ||
OnContextButtonStartRecord(pItem.get(), button) ||
+ OnContextButtonStopRecord(pItem.get(), button) ||
+ OnContextButtonDeleteTimer(pItem.get(), button) ||
OnContextButtonPlay(pItem.get(), button) ||
CGUIWindowPVRBase::OnContextButton(itemNumber, button);
}
@@ -219,7 +223,7 @@ bool CGUIWindowPVRSearch::OnMessage(CGUIMessage &message)
return true;
case ACTION_RECORD:
- ActionRecord(pItem.get());
+ ActionToggleTimer(pItem.get());
return true;
}
}
@@ -278,9 +282,9 @@ bool CGUIWindowPVRSearch::OnContextButtonStartRecord(CFileItem *item, CONTEXT_BU
bool bReturn = false;
if ((button == CONTEXT_BUTTON_START_RECORD) ||
- (button == CONTEXT_BUTTON_ADVANCED_RECORD))
+ (button == CONTEXT_BUTTON_ADD_TIMER))
{
- AddTimer(item, button == CONTEXT_BUTTON_ADVANCED_RECORD);
+ AddTimer(item, button == CONTEXT_BUTTON_ADD_TIMER);
bReturn = true;
}
@@ -300,6 +304,19 @@ bool CGUIWindowPVRSearch::OnContextButtonStopRecord(CFileItem *item, CONTEXT_BUT
return bReturn;
}
+bool CGUIWindowPVRSearch::OnContextButtonDeleteTimer(CFileItem *item, CONTEXT_BUTTON button)
+{
+ bool bReturn = false;
+
+ if (button == CONTEXT_BUTTON_DELETE_TIMER)
+ {
+ DeleteTimer(item);
+ bReturn = true;
+ }
+
+ return bReturn;
+}
+
void CGUIWindowPVRSearch::OpenDialogSearch()
{
CGUIDialogPVRGuideSearch* dlgSearch = (CGUIDialogPVRGuideSearch*)g_windowManager.GetWindow(WINDOW_DIALOG_PVR_GUIDE_SEARCH);
diff --git a/xbmc/pvr/windows/GUIWindowPVRSearch.h b/xbmc/pvr/windows/GUIWindowPVRSearch.h
index ea41549803..a7bd311c52 100644
--- a/xbmc/pvr/windows/GUIWindowPVRSearch.h
+++ b/xbmc/pvr/windows/GUIWindowPVRSearch.h
@@ -45,6 +45,7 @@ namespace PVR
bool OnContextButtonPlay(CFileItem *item, CONTEXT_BUTTON button);
bool OnContextButtonStartRecord(CFileItem *item, CONTEXT_BUTTON button);
bool OnContextButtonStopRecord(CFileItem *item, CONTEXT_BUTTON button);
+ bool OnContextButtonDeleteTimer(CFileItem *item, CONTEXT_BUTTON button);
void OpenDialogSearch();
diff --git a/xbmc/pvr/windows/GUIWindowPVRTimers.cpp b/xbmc/pvr/windows/GUIWindowPVRTimers.cpp
index 388dfba17a..bd5ea749a3 100644
--- a/xbmc/pvr/windows/GUIWindowPVRTimers.cpp
+++ b/xbmc/pvr/windows/GUIWindowPVRTimers.cpp
@@ -73,44 +73,43 @@ void CGUIWindowPVRTimers::GetContextButtons(int itemNumber, CContextButtons &but
return;
CFileItemPtr pItem = m_vecItems->Get(itemNumber);
- /* Check for a empty file item list, means only a
- file item with the name "Add timer..." is present */
- if (URIUtils::PathEquals(pItem->GetPath(), CPVRTimersPath::PATH_ADDTIMER))
+ if (!URIUtils::PathEquals(pItem->GetPath(), CPVRTimersPath::PATH_ADDTIMER))
{
- buttons.Add(CONTEXT_BUTTON_ADD, 19056); /* New timer */
- }
- else
- {
- if (pItem->GetPVRTimerInfoTag()->GetEpgInfoTag())
- buttons.Add(CONTEXT_BUTTON_INFO, 19047); /* Programme information */
-
- buttons.Add(CONTEXT_BUTTON_FIND, 19003); /* Find similar */
-
- if (pItem->GetPVRTimerInfoTag()->HasTimerType())
+ CPVRTimerInfoTagPtr timer(pItem->GetPVRTimerInfoTag());
+ if (timer)
{
- if (pItem->GetPVRTimerInfoTag()->GetTimerType()->SupportsEnableDisable())
- {
- if (pItem->GetPVRTimerInfoTag()->m_state == PVR_TIMER_STATE_DISABLED)
- buttons.Add(CONTEXT_BUTTON_ACTIVATE, 843); /* Activate */
- else
- buttons.Add(CONTEXT_BUTTON_ACTIVATE, 844); /* Deactivate */
- }
+ if (timer->HasEpgInfoTag())
+ buttons.Add(CONTEXT_BUTTON_INFO, 19047); /* Programme information */
- if (!pItem->GetPVRTimerInfoTag()->GetTimerType()->IsReadOnly())
+ CPVRTimerTypePtr timerType(timer->GetTimerType());
+ if (timerType)
{
- buttons.Add(CONTEXT_BUTTON_DELETE, 117); /* Delete */
- buttons.Add(CONTEXT_BUTTON_EDIT, 19057); /* Edit settings */
+ if (timerType->SupportsEnableDisable())
+ {
+ if (timer->m_state == PVR_TIMER_STATE_DISABLED)
+ buttons.Add(CONTEXT_BUTTON_ACTIVATE, 843); /* Activate */
+ else
+ buttons.Add(CONTEXT_BUTTON_ACTIVATE, 844); /* Deactivate */
+ }
- // As epg-based timers will get it's title from the epg tag, they should not be renamable.
- if (pItem->GetPVRTimerInfoTag()->IsManual())
- buttons.Add(CONTEXT_BUTTON_RENAME, 118); /* Rename */
- }
- }
+ if (!timerType->IsReadOnly())
+ {
+ buttons.Add(CONTEXT_BUTTON_EDIT, 21450); /* Edit */
- buttons.Add(CONTEXT_BUTTON_ADD, 19056); /* New timer */
+ // As epg-based timers will get it's title from the epg tag, they should not be renamable.
+ if (timer->IsManual())
+ buttons.Add(CONTEXT_BUTTON_RENAME, 118); /* Rename */
- if (g_PVRClients->HasMenuHooks(pItem->GetPVRTimerInfoTag()->m_iClientId, PVR_MENUHOOK_TIMER))
- buttons.Add(CONTEXT_BUTTON_MENU_HOOKS, 19195); /* PVR client specific action */
+ if (timer->IsRecording())
+ buttons.Add(CONTEXT_BUTTON_STOP_RECORD, 19059); /* Stop recording */
+ else
+ buttons.Add(CONTEXT_BUTTON_DELETE, 117); /* Delete */
+ }
+ }
+
+ if (g_PVRClients->HasMenuHooks(timer->m_iClientId, PVR_MENUHOOK_TIMER))
+ buttons.Add(CONTEXT_BUTTON_MENU_HOOKS, 19195); /* PVR client specific action */
+ }
}
CGUIWindowPVRBase::GetContextButtons(itemNumber, buttons);
@@ -142,6 +141,7 @@ bool CGUIWindowPVRTimers::OnContextButton(int itemNumber, CONTEXT_BUTTON button)
return OnContextButtonActivate(pItem.get(), button) ||
OnContextButtonAdd(pItem.get(), button) ||
OnContextButtonDelete(pItem.get(), button) ||
+ OnContextButtonStopRecord(pItem.get(), button) ||
OnContextButtonEdit(pItem.get(), button) ||
OnContextButtonRename(pItem.get(), button) ||
OnContextButtonInfo(pItem.get(), button) ||
@@ -289,14 +289,21 @@ bool CGUIWindowPVRTimers::OnContextButtonDelete(CFileItem *item, CONTEXT_BUTTON
if (button == CONTEXT_BUTTON_DELETE)
{
+ DeleteTimer(item);
bReturn = true;
+ }
- if (!item->HasPVRTimerInfoTag())
- return bReturn;
+ return bReturn;
+}
- bool bDeleteSchedule(false);
- if (ConfirmDeleteTimer(item, bDeleteSchedule))
- CPVRTimers::DeleteTimer(*item, false, bDeleteSchedule);
+bool CGUIWindowPVRTimers::OnContextButtonStopRecord(CFileItem *item, CONTEXT_BUTTON button)
+{
+ bool bReturn = false;
+
+ if (button == CONTEXT_BUTTON_STOP_RECORD)
+ {
+ StopRecordFile(item);
+ bReturn = true;
}
return bReturn;
@@ -312,7 +319,7 @@ bool CGUIWindowPVRTimers::OnContextButtonEdit(CFileItem *item, CONTEXT_BUTTON bu
if (!item->HasPVRTimerInfoTag())
return bReturn;
- if (ShowTimerSettings(item))
+ if (ShowTimerSettings(item) && !item->GetPVRTimerInfoTag()->GetTimerType()->IsReadOnly())
g_PVRTimers->UpdateTimer(*item);
}
@@ -353,17 +360,7 @@ bool CGUIWindowPVRTimers::OnContextButtonInfo(CFileItem *item, CONTEXT_BUTTON bu
bool CGUIWindowPVRTimers::ActionDeleteTimer(CFileItem *item)
{
- /* check if the timer tag is valid */
- CPVRTimerInfoTagPtr timerTag = item->GetPVRTimerInfoTag();
- if (!timerTag || (timerTag->m_iClientIndex == PVR_TIMER_NO_CLIENT_INDEX))
- return false;
-
- bool bDeleteSchedule(false);
- if (!ConfirmDeleteTimer(item, bDeleteSchedule))
- return false;
-
- /* delete the timer */
- bool bReturn = CPVRTimers::DeleteTimer(*item, false, bDeleteSchedule);
+ bool bReturn = DeleteTimer(item);
if (bReturn && (m_vecItems->GetObjectCount() == 0))
{
@@ -391,7 +388,7 @@ bool CGUIWindowPVRTimers::ActionShowTimer(CFileItem *item)
}
else
{
- if (ShowTimerSettings(item))
+ if (ShowTimerSettings(item) && !item->GetPVRTimerInfoTag()->GetTimerType()->IsReadOnly())
{
/* Update timer on pvr backend */
bReturn = g_PVRTimers->UpdateTimer(*item);
@@ -418,28 +415,3 @@ bool CGUIWindowPVRTimers::ShowNewTimerDialog(void)
return bReturn;
}
-
-bool CGUIWindowPVRTimers::ShowTimerSettings(CFileItem *item)
-{
- /* Check item is TV timer information tag */
- if (!item->IsPVRTimer())
- {
- CLog::Log(LOGERROR, "CGUIWindowPVRTimers: Can't open timer settings dialog, no timer info tag!");
- return false;
- }
-
- /* Load timer settings dialog */
- CGUIDialogPVRTimerSettings* pDlgInfo = (CGUIDialogPVRTimerSettings*)g_windowManager.GetWindow(WINDOW_DIALOG_PVR_TIMER_SETTING);
-
- if (!pDlgInfo)
- return false;
-
- /* inform dialog about the file item */
- pDlgInfo->SetTimer(item);
-
- /* Open dialog window */
- pDlgInfo->Open();
-
- /* Get modify flag from window and return it to caller */
- return pDlgInfo->IsConfirmed();
-}
diff --git a/xbmc/pvr/windows/GUIWindowPVRTimers.h b/xbmc/pvr/windows/GUIWindowPVRTimers.h
index 9480edab59..e6dbd8a22c 100644
--- a/xbmc/pvr/windows/GUIWindowPVRTimers.h
+++ b/xbmc/pvr/windows/GUIWindowPVRTimers.h
@@ -49,12 +49,12 @@ namespace PVR
private:
bool ActionDeleteTimer(CFileItem *item);
bool ActionShowTimer(CFileItem *item);
- bool ShowTimerSettings(CFileItem *item);
bool ShowNewTimerDialog(void);
bool OnContextButtonActivate(CFileItem *item, CONTEXT_BUTTON button);
bool OnContextButtonAdd(CFileItem *item, CONTEXT_BUTTON button);
bool OnContextButtonDelete(CFileItem *item, CONTEXT_BUTTON button);
+ bool OnContextButtonStopRecord(CFileItem *item, CONTEXT_BUTTON button);
bool OnContextButtonEdit(CFileItem *item, CONTEXT_BUTTON button);
bool OnContextButtonRename(CFileItem *item, CONTEXT_BUTTON button);
bool OnContextButtonInfo(CFileItem *item, CONTEXT_BUTTON button);
diff --git a/xbmc/rendering/dx/RenderSystemDX.cpp b/xbmc/rendering/dx/RenderSystemDX.cpp
index e3795e2af6..36a6bb4eb1 100644
--- a/xbmc/rendering/dx/RenderSystemDX.cpp
+++ b/xbmc/rendering/dx/RenderSystemDX.cpp
@@ -158,7 +158,7 @@ void CRenderSystemDX::SetMonitor(HMONITOR monitor)
{
pAdapter->GetDesc(&m_adapterDesc);
- CLog::Log(LOGDEBUG, __FUNCTION__" - Selected %S adapter. ", m_adapterDesc.Description, outputDesc.DeviceName);
+ CLog::Log(LOGDEBUG, __FUNCTION__" - Selected %S adapter. ", m_adapterDesc.Description);
SAFE_RELEASE(m_adapter);
m_adapter = pAdapter;
@@ -490,14 +490,16 @@ void CRenderSystemDX::OnDeviceReset()
if (m_needNewDevice)
CreateDevice();
- else
- { // we're back
+
+ if (m_bRenderCreated)
+ {
+ // we're back
for (std::vector<ID3DResource *>::iterator i = m_resources.begin(); i != m_resources.end(); ++i)
(*i)->OnResetDevice();
- }
- g_renderManager.Flush();
- g_windowManager.SendMessage(GUI_MSG_NOTIFY_ALL, 0, 0, GUI_MSG_RENDERER_RESET);
+ g_renderManager.Flush();
+ g_windowManager.SendMessage(GUI_MSG_NOTIFY_ALL, 0, 0, GUI_MSG_RENDERER_RESET);
+ }
}
bool CRenderSystemDX::CreateDevice()
@@ -1248,9 +1250,7 @@ bool CRenderSystemDX::ClearBuffers(color_t color)
if (m_stereoView == RENDER_STEREO_VIEW_RIGHT)
{
// execute command's queue
- if ( m_stereoMode != RENDER_STEREO_MODE_SPLIT_HORIZONTAL
- && m_stereoMode != RENDER_STEREO_MODE_SPLIT_VERTICAL)
- FinishCommandList();
+ FinishCommandList();
// do not clear RT for anaglyph modes
if ( m_stereoMode == RENDER_STEREO_MODE_ANAGLYPH_GREEN_MAGENTA
diff --git a/xbmc/settings/AdvancedSettings.cpp b/xbmc/settings/AdvancedSettings.cpp
index 19451afa53..bc3aa8cec8 100644
--- a/xbmc/settings/AdvancedSettings.cpp
+++ b/xbmc/settings/AdvancedSettings.cpp
@@ -124,14 +124,6 @@ void CAdvancedSettings::Initialize()
m_omxHWAudioDecode = false;
m_omxDecodeStartWithValidFrame = true;
- m_karaokeSyncDelayCDG = 0.0f;
- m_karaokeSyncDelayLRC = 0.0f;
- m_karaokeChangeGenreForKaraokeSongs = false;
- m_karaokeKeepDelay = true;
- m_karaokeStartIndex = 1;
- m_karaokeAlwaysEmptyOnCdgs = 1;
- m_karaokeUseSongSpecificBackground = 0;
-
m_audioDefaultPlayer = "paplayer";
m_audioPlayCountMinimumPercent = 90.0f;
@@ -282,7 +274,6 @@ void CAdvancedSettings::Initialize()
m_bVideoLibraryAllItemsOnBottom = false;
m_iVideoLibraryRecentlyAddedItems = 25;
- m_bVideoLibraryHideEmptySeries = false;
m_bVideoLibraryCleanOnUpdate = false;
m_bVideoLibraryUseFastHash = true;
m_bVideoLibraryExportAutoThumbs = false;
@@ -504,25 +495,6 @@ void CAdvancedSettings::ParseSettingsFile(const std::string &file)
XMLUtils::GetBoolean(pElement, "omxdecodestartwithvalidframe", m_omxDecodeStartWithValidFrame);
}
- pElement = pRootElement->FirstChildElement("karaoke");
- if (pElement)
- {
- XMLUtils::GetFloat(pElement, "syncdelaycdg", m_karaokeSyncDelayCDG, -3.0f, 3.0f); // keep the old name for comp
- XMLUtils::GetFloat(pElement, "syncdelaylrc", m_karaokeSyncDelayLRC, -3.0f, 3.0f);
- XMLUtils::GetBoolean(pElement, "alwaysreplacegenre", m_karaokeChangeGenreForKaraokeSongs );
- XMLUtils::GetBoolean(pElement, "storedelay", m_karaokeKeepDelay );
- XMLUtils::GetInt(pElement, "autoassignstartfrom", m_karaokeStartIndex, 1, 2000000000);
- XMLUtils::GetBoolean(pElement, "nocdgbackground", m_karaokeAlwaysEmptyOnCdgs );
- XMLUtils::GetBoolean(pElement, "lookupsongbackground", m_karaokeUseSongSpecificBackground );
-
- TiXmlElement* pKaraokeBackground = pElement->FirstChildElement("defaultbackground");
- if (pKaraokeBackground)
- {
- pKaraokeBackground->QueryStringAttribute("type", &m_karaokeDefaultBackgroundType);
- pKaraokeBackground->QueryStringAttribute("path", &m_karaokeDefaultBackgroundFilePath);
- }
- }
-
pElement = pRootElement->FirstChildElement("video");
if (pElement)
{
@@ -747,7 +719,6 @@ void CAdvancedSettings::ParseSettingsFile(const std::string &file)
{
XMLUtils::GetBoolean(pElement, "allitemsonbottom", m_bVideoLibraryAllItemsOnBottom);
XMLUtils::GetInt(pElement, "recentlyaddeditems", m_iVideoLibraryRecentlyAddedItems, 1, INT_MAX);
- XMLUtils::GetBoolean(pElement, "hideemptyseries", m_bVideoLibraryHideEmptySeries);
XMLUtils::GetBoolean(pElement, "cleanonupdate", m_bVideoLibraryCleanOnUpdate);
XMLUtils::GetBoolean(pElement, "usefasthash", m_bVideoLibraryUseFastHash);
XMLUtils::GetString(pElement, "itemseparator", m_videoItemSeparator);
diff --git a/xbmc/settings/AdvancedSettings.h b/xbmc/settings/AdvancedSettings.h
index 35754a4038..6475350c42 100644
--- a/xbmc/settings/AdvancedSettings.h
+++ b/xbmc/settings/AdvancedSettings.h
@@ -279,7 +279,6 @@ class CAdvancedSettings : public ISettingCallback, public ISettingsHandler
bool m_bVideoLibraryAllItemsOnBottom;
int m_iVideoLibraryRecentlyAddedItems;
- bool m_bVideoLibraryHideEmptySeries;
bool m_bVideoLibraryCleanOnUpdate;
bool m_bVideoLibraryUseFastHash;
bool m_bVideoLibraryExportAutoThumbs;
@@ -331,16 +330,6 @@ class CAdvancedSettings : public ISettingCallback, public ISettingsHandler
bool m_bVirtualShares;
bool m_bAllowDeferredRendering;
- float m_karaokeSyncDelayCDG; // seems like different delay is needed for CDG and MP3s
- float m_karaokeSyncDelayLRC;
- bool m_karaokeChangeGenreForKaraokeSongs;
- bool m_karaokeKeepDelay; // store user-changed song delay in the database
- int m_karaokeStartIndex; // auto-assign numbering start from this value
- bool m_karaokeAlwaysEmptyOnCdgs; // always have empty background on CDG files
- bool m_karaokeUseSongSpecificBackground; // use song-specific video or image if available instead of default
- std::string m_karaokeDefaultBackgroundType; // empty string or "vis", "image" or "video"
- std::string m_karaokeDefaultBackgroundFilePath; // only for "image" or "video" types above
-
std::string m_cpuTempCmd;
std::string m_gpuTempCmd;
@@ -411,4 +400,5 @@ class CAdvancedSettings : public ISettingCallback, public ISettingsHandler
void setExtraLogLevel(const std::vector<CVariant> &components);
};
-XBMC_GLOBAL(CAdvancedSettings,g_advancedSettings);
+XBMC_GLOBAL_REF(CAdvancedSettings,g_advancedSettings);
+#define g_advancedSettings XBMC_GLOBAL_USE(CAdvancedSettings)
diff --git a/xbmc/settings/MediaSettings.cpp b/xbmc/settings/MediaSettings.cpp
index ceed26d3fc..4b17ef678d 100644
--- a/xbmc/settings/MediaSettings.cpp
+++ b/xbmc/settings/MediaSettings.cpp
@@ -318,51 +318,7 @@ void CMediaSettings::OnSettingAction(const CSetting *setting)
return;
const std::string &settingId = setting->GetId();
- if (settingId == CSettings::SETTING_KARAOKE_EXPORT)
- {
- CContextButtons choices;
- choices.Add(1, g_localizeStrings.Get(22034));
- choices.Add(2, g_localizeStrings.Get(22035));
-
- int retVal = CGUIDialogContextMenu::ShowAndGetChoice(choices);
- if ( retVal > 0 )
- {
- std::string path(CProfilesManager::GetInstance().GetDatabaseFolder());
- VECSOURCES shares;
- g_mediaManager.GetLocalDrives(shares);
- if (CGUIDialogFileBrowser::ShowAndGetDirectory(shares, g_localizeStrings.Get(661), path, true))
- {
- CMusicDatabase musicdatabase;
- musicdatabase.Open();
-
- if ( retVal == 1 )
- {
- path = URIUtils::AddFileToFolder(path, "karaoke.html");
- musicdatabase.ExportKaraokeInfo( path, true );
- }
- else
- {
- path = URIUtils::AddFileToFolder(path, "karaoke.csv");
- musicdatabase.ExportKaraokeInfo( path, false );
- }
- musicdatabase.Close();
- }
- }
- }
- else if (settingId == CSettings::SETTING_KARAOKE_IMPORTCSV)
- {
- std::string path(CProfilesManager::GetInstance().GetDatabaseFolder());
- VECSOURCES shares;
- g_mediaManager.GetLocalDrives(shares);
- if (CGUIDialogFileBrowser::ShowAndGetFile(shares, "karaoke.csv", g_localizeStrings.Get(651) , path))
- {
- CMusicDatabase musicdatabase;
- musicdatabase.Open();
- musicdatabase.ImportKaraokeInfo(path);
- musicdatabase.Close();
- }
- }
- else if (settingId == CSettings::SETTING_MUSICLIBRARY_CLEANUP)
+ if (settingId == CSettings::SETTING_MUSICLIBRARY_CLEANUP)
{
if (HELPERS::ShowYesNoDialogText(CVariant{313}, CVariant{333}) == DialogResponse::YES)
g_application.StartMusicCleanup(true);
diff --git a/xbmc/settings/SettingConditions.cpp b/xbmc/settings/SettingConditions.cpp
index c7f23105b0..ed62e4287c 100644
--- a/xbmc/settings/SettingConditions.cpp
+++ b/xbmc/settings/SettingConditions.cpp
@@ -206,9 +206,6 @@ void CSettingConditions::Initialize()
#if HAS_GLES == 2
m_simpleConditions.insert("has_glesv2");
#endif
-#ifdef HAS_KARAOKE
- m_simpleConditions.insert("has_karaoke");
-#endif
#ifdef HAS_SDL_JOYSTICK
m_simpleConditions.insert("has_sdl_joystick");
#endif
diff --git a/xbmc/settings/Settings.cpp b/xbmc/settings/Settings.cpp
index aeed0b17d2..ecd155d965 100644
--- a/xbmc/settings/Settings.cpp
+++ b/xbmc/settings/Settings.cpp
@@ -143,6 +143,7 @@ const std::string CSettings::SETTING_VIDEOLIBRARY_BACKGROUNDUPDATE = "videolibra
const std::string CSettings::SETTING_VIDEOLIBRARY_CLEANUP = "videolibrary.cleanup";
const std::string CSettings::SETTING_VIDEOLIBRARY_EXPORT = "videolibrary.export";
const std::string CSettings::SETTING_VIDEOLIBRARY_IMPORT = "videolibrary.import";
+const std::string CSettings::SETTING_VIDEOLIBRARY_SHOWEMPTYTVSHOWS = "videolibrary.showemptytvshows";
const std::string CSettings::SETTING_LOCALE_AUDIOLANGUAGE = "locale.audiolanguage";
const std::string CSettings::SETTING_VIDEOPLAYER_PREFERDEFAULTFLAG = "videoplayer.preferdefaultflag";
const std::string CSettings::SETTING_VIDEOPLAYER_AUTOPLAYNEXTITEM = "videoplayer.autoplaynextitem";
@@ -293,14 +294,6 @@ const std::string CSettings::SETTING_AUDIOCDS_TRACKPATHFORMAT = "audiocds.trackp
const std::string CSettings::SETTING_AUDIOCDS_ENCODER = "audiocds.encoder";
const std::string CSettings::SETTING_AUDIOCDS_SETTINGS = "audiocds.settings";
const std::string CSettings::SETTING_AUDIOCDS_EJECTONRIP = "audiocds.ejectonrip";
-const std::string CSettings::SETTING_KARAOKE_ENABLED = "karaoke.enabled";
-const std::string CSettings::SETTING_KARAOKE_AUTOPOPUPSELECTOR = "karaoke.autopopupselector";
-const std::string CSettings::SETTING_KARAOKE_FONT = "karaoke.font";
-const std::string CSettings::SETTING_KARAOKE_FONTHEIGHT = "karaoke.fontheight";
-const std::string CSettings::SETTING_KARAOKE_FONTCOLORS = "karaoke.fontcolors";
-const std::string CSettings::SETTING_KARAOKE_CHARSET = "karaoke.charset";
-const std::string CSettings::SETTING_KARAOKE_EXPORT = "karaoke.export";
-const std::string CSettings::SETTING_KARAOKE_IMPORTCSV = "karaoke.importcsv";
const std::string CSettings::SETTING_MYMUSIC_STARTWINDOW = "mymusic.startwindow";
const std::string CSettings::SETTING_MYMUSIC_SONGTHUMBINVIS = "mymusic.songthumbinvis";
const std::string CSettings::SETTING_MYMUSIC_DEFAULTLIBVIEW = "mymusic.defaultlibview";
@@ -1026,8 +1019,6 @@ void CSettings::InitializeISettingCallbacks()
m_settingsManager->RegisterCallback(&g_advancedSettings, settingSet);
settingSet.clear();
- settingSet.insert(CSettings::SETTING_KARAOKE_EXPORT);
- settingSet.insert(CSettings::SETTING_KARAOKE_IMPORTCSV);
settingSet.insert(CSettings::SETTING_MUSICLIBRARY_CLEANUP);
settingSet.insert(CSettings::SETTING_MUSICLIBRARY_EXPORT);
settingSet.insert(CSettings::SETTING_MUSICLIBRARY_IMPORT);
@@ -1108,7 +1099,6 @@ void CSettings::InitializeISettingCallbacks()
settingSet.clear();
settingSet.insert(CSettings::SETTING_SUBTITLES_CHARSET);
- settingSet.insert(CSettings::SETTING_KARAOKE_CHARSET);
settingSet.insert(CSettings::SETTING_LOCALE_CHARSET);
m_settingsManager->RegisterCallback(&g_charsetConverter, settingSet);
diff --git a/xbmc/settings/Settings.h b/xbmc/settings/Settings.h
index 415ed3b869..55e150dc62 100644
--- a/xbmc/settings/Settings.h
+++ b/xbmc/settings/Settings.h
@@ -99,6 +99,7 @@ public:
static const std::string SETTING_VIDEOLIBRARY_CLEANUP;
static const std::string SETTING_VIDEOLIBRARY_EXPORT;
static const std::string SETTING_VIDEOLIBRARY_IMPORT;
+ static const std::string SETTING_VIDEOLIBRARY_SHOWEMPTYTVSHOWS;
static const std::string SETTING_LOCALE_AUDIOLANGUAGE;
static const std::string SETTING_VIDEOPLAYER_PREFERDEFAULTFLAG;
static const std::string SETTING_VIDEOPLAYER_AUTOPLAYNEXTITEM;
@@ -249,14 +250,6 @@ public:
static const std::string SETTING_AUDIOCDS_ENCODER;
static const std::string SETTING_AUDIOCDS_SETTINGS;
static const std::string SETTING_AUDIOCDS_EJECTONRIP;
- static const std::string SETTING_KARAOKE_ENABLED;
- static const std::string SETTING_KARAOKE_AUTOPOPUPSELECTOR;
- static const std::string SETTING_KARAOKE_FONT;
- static const std::string SETTING_KARAOKE_FONTHEIGHT;
- static const std::string SETTING_KARAOKE_FONTCOLORS;
- static const std::string SETTING_KARAOKE_CHARSET;
- static const std::string SETTING_KARAOKE_EXPORT;
- static const std::string SETTING_KARAOKE_IMPORTCSV;
static const std::string SETTING_MYMUSIC_STARTWINDOW;
static const std::string SETTING_MYMUSIC_SONGTHUMBINVIS;
static const std::string SETTING_MYMUSIC_DEFAULTLIBVIEW;
diff --git a/xbmc/settings/dialogs/GUIDialogAudioDSPSettings.cpp b/xbmc/settings/dialogs/GUIDialogAudioDSPSettings.cpp
index b18db5c6e5..ed60a339cd 100644
--- a/xbmc/settings/dialogs/GUIDialogAudioDSPSettings.cpp
+++ b/xbmc/settings/dialogs/GUIDialogAudioDSPSettings.cpp
@@ -379,7 +379,7 @@ void CGUIDialogAudioDSPSettings::Save()
return;
// prompt user if they are sure
- if (!CGUIDialogYesNo::ShowAndGetInput(12376, 750, 0, 12377))
+ if (!CGUIDialogYesNo::ShowAndGetInput(CVariant{12376}, CVariant{12377}))
return;
// reset the settings
diff --git a/xbmc/storage/linux/UDevProvider.cpp b/xbmc/storage/linux/UDevProvider.cpp
index 0ca370bbac..ffd5e00ce0 100644
--- a/xbmc/storage/linux/UDevProvider.cpp
+++ b/xbmc/storage/linux/UDevProvider.cpp
@@ -243,7 +243,6 @@ bool CUDevProvider::PumpDriveChangeEvents(IStorageEventsCallback *callback)
return false;
const char *action = udev_device_get_action(dev);
- const char *devtype = udev_device_get_devtype(dev);
if (action)
{
std::string label;
@@ -254,20 +253,37 @@ bool CUDevProvider::PumpDriveChangeEvents(IStorageEventsCallback *callback)
else if (mountpoint)
label = URIUtils::GetFileName(mountpoint);
- if (!strcmp(action, "add") && !strcmp(devtype, "partition"))
+ const char *fs_usage = udev_device_get_property_value(dev, "ID_FS_USAGE");
+ if (mountpoint && strcmp(action, "add") == 0 && (fs_usage && strcmp(fs_usage, "filesystem") == 0))
{
CLog::Log(LOGNOTICE, "UDev: Added %s", mountpoint);
if (callback)
callback->OnStorageAdded(label, mountpoint);
changed = true;
}
- if (!strcmp(action, "remove") && !strcmp(devtype, "partition"))
+ if (strcmp(action, "remove") == 0 && (fs_usage && strcmp(fs_usage, "filesystem") == 0))
{
- CLog::Log(LOGNOTICE, "UDev: Removed %s", mountpoint);
if (callback)
callback->OnStorageSafelyRemoved(label);
changed = true;
}
+ if (strcmp(action, "change") == 0)
+ {
+ if (mountpoint)
+ {
+ CLog::Log(LOGNOTICE, "UDev: Changed / Added %s", mountpoint);
+ if (callback)
+ callback->OnStorageAdded(label, mountpoint);
+ changed = true;
+ }
+ const char *eject_request = udev_device_get_property_value(dev, "DISK_EJECT_REQUEST");
+ if (eject_request && strcmp(eject_request, "1") == 0)
+ {
+ if (callback)
+ callback->OnStorageSafelyRemoved(label);
+ changed = true;
+ }
+ }
}
udev_device_unref(dev);
}
diff --git a/xbmc/system.h b/xbmc/system.h
index 02ac222b54..52255189fb 100644
--- a/xbmc/system.h
+++ b/xbmc/system.h
@@ -31,7 +31,6 @@
#define HAS_DVD_SWSCALE
#define HAS_DVDPLAYER
#define HAS_EVENT_SERVER
-#define HAS_KARAOKE
#define HAS_SCREENSAVER
#define HAS_PYTHON
#define HAS_VIDEO_PLAYBACK
diff --git a/xbmc/threads/Thread.cpp b/xbmc/threads/Thread.cpp
index b7343751c0..ea03bb246d 100644
--- a/xbmc/threads/Thread.cpp
+++ b/xbmc/threads/Thread.cpp
@@ -123,7 +123,7 @@ THREADFUNC CThread::staticThread(void* data)
pThread->SetThreadInfo();
- LOG(LOGNOTICE,"Thread %s start, auto delete: %s", name.c_str(), (autodelete ? "true" : "false"));
+ LOG(LOGDEBUG,"Thread %s start, auto delete: %s", name.c_str(), (autodelete ? "true" : "false"));
currentThread.set(pThread);
pThread->m_StartEvent.Set();
diff --git a/xbmc/threads/Timer.cpp b/xbmc/threads/Timer.cpp
index 4eddc37efd..de4db9c43c 100644
--- a/xbmc/threads/Timer.cpp
+++ b/xbmc/threads/Timer.cpp
@@ -60,6 +60,13 @@ bool CTimer::Stop(bool wait /* = false */)
return true;
}
+void CTimer::RestartAsync(uint32_t timeout)
+{
+ m_timeout = timeout;
+ m_endTime = XbmcThreads::SystemClockMillis() + timeout;
+ m_eventTimeout.Set();
+}
+
bool CTimer::Restart()
{
if (!IsRunning())
@@ -84,11 +91,11 @@ float CTimer::GetElapsedMilliseconds() const
void CTimer::Process()
{
- uint32_t currentTime = XbmcThreads::SystemClockMillis();
- m_endTime = currentTime + m_timeout;
-
while (!m_bStop)
{
+ uint32_t currentTime = XbmcThreads::SystemClockMillis();
+ m_endTime = currentTime + m_timeout;
+
// wait the necessary time
if (!m_eventTimeout.WaitMSec(m_endTime - currentTime))
{
@@ -98,11 +105,9 @@ void CTimer::Process()
// execute OnTimeout() callback
m_callback->OnTimeout();
- // stop if this is not an interval timer
- if (!m_interval)
+ // continue if this is an interval timer, or if it was restarted during callback
+ if (!m_interval && m_endTime <= currentTime)
break;
-
- m_endTime = currentTime + m_timeout;
}
}
}
diff --git a/xbmc/threads/Timer.h b/xbmc/threads/Timer.h
index 1921b64e29..8c90853d14 100644
--- a/xbmc/threads/Timer.h
+++ b/xbmc/threads/Timer.h
@@ -39,6 +39,7 @@ public:
bool Start(uint32_t timeout, bool interval = false);
bool Stop(bool wait = false);
bool Restart();
+ void RestartAsync(uint32_t timeout);
bool IsRunning() const { return CThread::IsRunning(); }
diff --git a/xbmc/threads/platform/win/Win32Exception.cpp b/xbmc/threads/platform/win/Win32Exception.cpp
index 5eb1f01ddf..2b79ce0c3e 100644
--- a/xbmc/threads/platform/win/Win32Exception.cpp
+++ b/xbmc/threads/platform/win/Win32Exception.cpp
@@ -121,7 +121,7 @@ bool win32_exception::write_minidump(EXCEPTION_POINTERS* pEp)
SYSTEMTIME stLocalTime;
GetLocalTime(&stLocalTime);
- dumpFileName = StringUtils::Format("xbmc_crashlog-%s-%04d%02d%02d-%02d%02d%02d.dmp",
+ dumpFileName = StringUtils::Format("kodi_crashlog-%s-%04d%02d%02d-%02d%02d%02d.dmp",
mVersion.c_str(),
stLocalTime.wYear, stLocalTime.wMonth, stLocalTime.wDay,
stLocalTime.wHour, stLocalTime.wMinute, stLocalTime.wSecond);
@@ -224,7 +224,7 @@ bool win32_exception::write_stacktrace(EXCEPTION_POINTERS* pEp)
pSFTA == NULL || pSGMB == NULL)
goto cleanup;
- dumpFileName = StringUtils::Format("xbmc_stacktrace-%s-%04d%02d%02d-%02d%02d%02d.txt",
+ dumpFileName = StringUtils::Format("kodi_stacktrace-%s-%04d%02d%02d-%02d%02d%02d.txt",
mVersion.c_str(),
stLocalTime.wYear, stLocalTime.wMonth, stLocalTime.wDay,
stLocalTime.wHour, stLocalTime.wMinute, stLocalTime.wSecond);
diff --git a/xbmc/utils/AMLUtils.cpp b/xbmc/utils/AMLUtils.cpp
index 7f7ab622bb..1b54435837 100644
--- a/xbmc/utils/AMLUtils.cpp
+++ b/xbmc/utils/AMLUtils.cpp
@@ -32,6 +32,7 @@
#include "utils/StringUtils.h"
#include "utils/AMLUtils.h"
#include "guilib/gui3d.h"
+#include "utils/RegExp.h"
bool aml_present()
{
@@ -146,85 +147,55 @@ bool aml_permissions()
bool aml_support_hevc()
{
- std::string valstr;
- if(SysfsUtils::GetString("/sys/class/amstream/vcodec_profile", valstr) != 0)
- {
- return false;
- }
- return (valstr.find("hevc:") != std::string::npos);
-}
+ static int has_hevc = -1;
-enum AML_DEVICE_TYPE aml_get_device_type()
-{
- static enum AML_DEVICE_TYPE aml_device_type = AML_DEVICE_TYPE_UNINIT;
- if (aml_device_type == AML_DEVICE_TYPE_UNINIT)
- {
- std::string cpu_hardware = g_cpuInfo.getCPUHardware();
-
- if (cpu_hardware.find("MESON-M1") != std::string::npos)
- aml_device_type = AML_DEVICE_TYPE_M1;
- else if (cpu_hardware.find("MESON-M3") != std::string::npos
- || cpu_hardware.find("MESON3") != std::string::npos)
- aml_device_type = AML_DEVICE_TYPE_M3;
- else if (cpu_hardware.find("Meson6") != std::string::npos)
- aml_device_type = AML_DEVICE_TYPE_M6;
- else if ((cpu_hardware.find("Meson8") != std::string::npos) && (cpu_hardware.find("Meson8B") == std::string::npos))
- {
- if (aml_support_hevc())
- aml_device_type = AML_DEVICE_TYPE_M8M2;
- else
- aml_device_type = AML_DEVICE_TYPE_M8;
- } else if (cpu_hardware.find("Meson8B") != std::string::npos)
- aml_device_type = AML_DEVICE_TYPE_M8B;
+ if (has_hevc == -1)
+ {
+ std::string valstr;
+ if(SysfsUtils::GetString("/sys/class/amstream/vcodec_profile", valstr) != 0)
+ has_hevc = 0;
else
- aml_device_type = AML_DEVICE_TYPE_UNKNOWN;
+ has_hevc = (valstr.find("hevc:") != std::string::npos) ? 1: 0;
}
-
- return aml_device_type;
+ return (has_hevc == 1);
}
-void aml_cpufreq_min(bool limit)
+bool aml_support_hevc_4k2k()
{
-// do not touch scaling_min_freq on android
-#if !defined(TARGET_ANDROID)
- // only needed for m1/m3 SoCs
- if ( aml_get_device_type() != AML_DEVICE_TYPE_UNKNOWN
- && aml_get_device_type() <= AML_DEVICE_TYPE_M3)
- {
- int cpufreq = 300000;
- if (limit)
- cpufreq = 600000;
+ static int has_hevc_4k2k = -1;
- SysfsUtils::SetInt("/sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq", cpufreq);
+ if (has_hevc_4k2k == -1)
+ {
+ CRegExp regexp;
+ regexp.RegComp("hevc:.*4k");
+ std::string valstr;
+ if (SysfsUtils::GetString("/sys/class/amstream/vcodec_profile", valstr) != 0)
+ has_hevc_4k2k = 0;
+ else
+ has_hevc_4k2k = (regexp.RegFind(valstr) >= 0) ? 1 : 0;
}
-#endif
+ return (has_hevc_4k2k == 1);
}
-void aml_cpufreq_max(bool limit)
+bool aml_support_h264_4k2k()
{
- if (!aml_wired_present() && aml_get_device_type() == AML_DEVICE_TYPE_M6)
- {
- // this is a MX Stick, they cannot substain 1GHz
- // operation without overheating so limit them to 800MHz.
- int cpufreq = 1000000;
- if (limit)
- cpufreq = 800000;
+ static int has_h264_4k2k = -1;
- SysfsUtils::SetInt("/sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq", cpufreq);
- SysfsUtils::SetString("/sys/devices/system/cpu/cpu0/cpufreq/scaling_governor", "ondemand");
+ if (has_h264_4k2k == -1)
+ {
+ std::string valstr;
+ if (SysfsUtils::GetString("/sys/class/amstream/vcodec_profile", valstr) != 0)
+ {
+ return false;
+ }
+ return (valstr.find("h264_4k2k:") != std::string::npos);
}
+ return (has_h264_4k2k == 1);
}
void aml_set_audio_passthrough(bool passthrough)
{
- if ( aml_present()
- && aml_get_device_type() != AML_DEVICE_TYPE_UNKNOWN
- && aml_get_device_type() <= AML_DEVICE_TYPE_M8)
- {
- // m1 uses 1, m3 and above uses 2
- int raw = aml_get_device_type() == AML_DEVICE_TYPE_M1 ? 1:2;
- SysfsUtils::SetInt("/sys/class/audiodsp/digital_raw", passthrough ? raw:0);
- }
+ SysfsUtils::SetInt("/sys/class/audiodsp/digital_raw", passthrough ? 2:0);
}
void aml_probe_hdmi_audio()
@@ -306,7 +277,7 @@ bool aml_IsHdmiConnected()
{
int hpd_state;
SysfsUtils::GetInt("/sys/class/amhdmitx/amhdmitx0/hpd_state", hpd_state);
- if (hpd_state == 2);
+ if (hpd_state == 2)
{
return 1;
}
@@ -377,7 +348,7 @@ bool aml_mode_to_resolution(const char *mode, RESOLUTION_INFO *res)
res->fRefreshRate = 50;
res->dwFlags = D3DPRESENTFLAG_PROGRESSIVE;
}
- else if (StringUtils::EqualsNoCase(fromMode, "720p"))
+ else if (StringUtils::EqualsNoCase(fromMode, "720p") || StringUtils::EqualsNoCase(fromMode, "720p60hz"))
{
res->iWidth = 1280;
res->iHeight= 720;
@@ -395,7 +366,7 @@ bool aml_mode_to_resolution(const char *mode, RESOLUTION_INFO *res)
res->fRefreshRate = 50;
res->dwFlags = D3DPRESENTFLAG_PROGRESSIVE;
}
- else if (StringUtils::EqualsNoCase(fromMode, "1080p"))
+ else if (StringUtils::EqualsNoCase(fromMode, "1080p") || StringUtils::EqualsNoCase(fromMode, "1080p60hz"))
{
res->iWidth = 1920;
res->iHeight= 1080;
@@ -449,7 +420,7 @@ bool aml_mode_to_resolution(const char *mode, RESOLUTION_INFO *res)
res->fRefreshRate = 59.940;
res->dwFlags = D3DPRESENTFLAG_PROGRESSIVE;
}
- else if (StringUtils::EqualsNoCase(fromMode, "1080i"))
+ else if (StringUtils::EqualsNoCase(fromMode, "1080i") || StringUtils::EqualsNoCase(fromMode, "1080i60hz"))
{
res->iWidth = 1920;
res->iHeight= 1080;
@@ -476,7 +447,7 @@ bool aml_mode_to_resolution(const char *mode, RESOLUTION_INFO *res)
res->fRefreshRate = 59.940;
res->dwFlags = D3DPRESENTFLAG_INTERLACED;
}
- else if (StringUtils::EqualsNoCase(fromMode, "4k2ksmpte"))
+ else if (StringUtils::EqualsNoCase(fromMode, "4k2ksmpte") || StringUtils::EqualsNoCase(fromMode, "smpte24hz"))
{
res->iWidth = 1920;
res->iHeight= 1080;
@@ -485,7 +456,7 @@ bool aml_mode_to_resolution(const char *mode, RESOLUTION_INFO *res)
res->fRefreshRate = 24;
res->dwFlags = D3DPRESENTFLAG_PROGRESSIVE;
}
- else if (StringUtils::EqualsNoCase(fromMode, "4k2k23hz"))
+ else if (StringUtils::EqualsNoCase(fromMode, "4k2k23hz") || StringUtils::EqualsNoCase(fromMode, "2160p23hz"))
{
res->iWidth = 1920;
res->iHeight= 1080;
@@ -494,7 +465,7 @@ bool aml_mode_to_resolution(const char *mode, RESOLUTION_INFO *res)
res->fRefreshRate = 23.976;
res->dwFlags = D3DPRESENTFLAG_PROGRESSIVE;
}
- else if (StringUtils::EqualsNoCase(fromMode, "4k2k24hz"))
+ else if (StringUtils::EqualsNoCase(fromMode, "4k2k24hz") || StringUtils::EqualsNoCase(fromMode, "2160p24hz"))
{
res->iWidth = 1920;
res->iHeight= 1080;
@@ -503,7 +474,7 @@ bool aml_mode_to_resolution(const char *mode, RESOLUTION_INFO *res)
res->fRefreshRate = 24;
res->dwFlags = D3DPRESENTFLAG_PROGRESSIVE;
}
- else if (StringUtils::EqualsNoCase(fromMode, "4k2k25hz"))
+ else if (StringUtils::EqualsNoCase(fromMode, "4k2k25hz") || StringUtils::EqualsNoCase(fromMode, "2160p25hz"))
{
res->iWidth = 1920;
res->iHeight= 1080;
@@ -512,7 +483,7 @@ bool aml_mode_to_resolution(const char *mode, RESOLUTION_INFO *res)
res->fRefreshRate = 25;
res->dwFlags = D3DPRESENTFLAG_PROGRESSIVE;
}
- else if (StringUtils::EqualsNoCase(fromMode, "4k2k29hz"))
+ else if (StringUtils::EqualsNoCase(fromMode, "4k2k29hz") || StringUtils::EqualsNoCase(fromMode, "2160p29hz"))
{
res->iWidth = 1920;
res->iHeight= 1080;
@@ -521,7 +492,7 @@ bool aml_mode_to_resolution(const char *mode, RESOLUTION_INFO *res)
res->fRefreshRate = 29.970;
res->dwFlags = D3DPRESENTFLAG_PROGRESSIVE;
}
- else if (StringUtils::EqualsNoCase(fromMode, "4k2k30hz"))
+ else if (StringUtils::EqualsNoCase(fromMode, "4k2k30hz") || StringUtils::EqualsNoCase(fromMode, "2160p30hz"))
{
res->iWidth = 1920;
res->iHeight= 1080;
@@ -530,6 +501,24 @@ bool aml_mode_to_resolution(const char *mode, RESOLUTION_INFO *res)
res->fRefreshRate = 30;
res->dwFlags = D3DPRESENTFLAG_PROGRESSIVE;
}
+ else if (StringUtils::EqualsNoCase(fromMode, "2160p50hz420"))
+ {
+ res->iWidth = 1920;
+ res->iHeight= 1080;
+ res->iScreenWidth = 3840;
+ res->iScreenHeight= 2160;
+ res->fRefreshRate = 50;
+ res->dwFlags = D3DPRESENTFLAG_PROGRESSIVE;
+ }
+ else if (StringUtils::EqualsNoCase(fromMode, "2160p60hz420"))
+ {
+ res->iWidth = 1920;
+ res->iHeight= 1080;
+ res->iScreenWidth = 3840;
+ res->iScreenHeight= 2160;
+ res->fRefreshRate = 60;
+ res->dwFlags = D3DPRESENTFLAG_PROGRESSIVE;
+ }
else
{
return false;
diff --git a/xbmc/utils/AMLUtils.h b/xbmc/utils/AMLUtils.h
index 81d4d077e3..6ba1ff774a 100644
--- a/xbmc/utils/AMLUtils.h
+++ b/xbmc/utils/AMLUtils.h
@@ -46,9 +46,8 @@ bool aml_permissions();
bool aml_hw3d_present();
bool aml_wired_present();
bool aml_support_hevc();
-enum AML_DEVICE_TYPE aml_get_device_type();
-void aml_cpufreq_min(bool limit);
-void aml_cpufreq_max(bool limit);
+bool aml_support_hevc_4k2k();
+bool aml_support_h264_4k2k();
void aml_set_audio_passthrough(bool passthrough);
bool aml_IsHdmiConnected();
bool aml_mode_to_resolution(const char *mode, RESOLUTION_INFO *res);
diff --git a/xbmc/utils/CharsetConverter.cpp b/xbmc/utils/CharsetConverter.cpp
index b56760ca08..6fa02f9eae 100644
--- a/xbmc/utils/CharsetConverter.cpp
+++ b/xbmc/utils/CharsetConverter.cpp
@@ -90,7 +90,6 @@ enum SpecialCharset
SystemCharset,
UserCharset /* locale.charset */,
SubtitleCharset /* subtitles.charset */,
- KaraokeCharset /* karaoke.charset */
};
@@ -252,14 +251,6 @@ std::string CConverterType::ResolveSpecialCharset(enum SpecialCharset charset)
return g_langInfo.GetGuiCharSet();
case SubtitleCharset:
return g_langInfo.GetSubtitleCharSet();
- case KaraokeCharset:
- {
- CSetting* karaokeSetting = CSettings::GetInstance().GetSetting(CSettings::SETTING_KARAOKE_CHARSET);
- if (karaokeSetting == NULL || ((CSettingString*)karaokeSetting)->GetValue() == "DEFAULT")
- return g_langInfo.GetGuiCharSet();
-
- return ((CSettingString*)karaokeSetting)->GetValue();
- }
case NotSpecialCharset:
default:
return "UTF-8"; /* dummy value */
@@ -598,8 +589,6 @@ void CCharsetConverter::OnSettingChanged(const CSetting* setting)
resetUserCharset();
else if (settingId == CSettings::SETTING_SUBTITLES_CHARSET)
resetSubtitleCharset();
- else if (settingId == CSettings::SETTING_KARAOKE_CHARSET)
- resetKaraokeCharset();
}
void CCharsetConverter::clear()
@@ -655,7 +644,6 @@ void CCharsetConverter::resetUserCharset(void)
CInnerConverter::m_stdConversion[UserCharsetToUtf8].Reset();
CInnerConverter::m_stdConversion[Utf32ToUserCharset].Reset();
resetSubtitleCharset();
- resetKaraokeCharset();
}
void CCharsetConverter::resetSubtitleCharset(void)
@@ -663,13 +651,9 @@ void CCharsetConverter::resetSubtitleCharset(void)
CInnerConverter::m_stdConversion[SubtitleCharsetToUtf8].Reset();
}
-void CCharsetConverter::resetKaraokeCharset(void)
-{
-}
-
void CCharsetConverter::reinitCharsetsFromSettings(void)
{
- resetUserCharset(); // this will also reinit Subtitle and Karaoke charsets
+ resetUserCharset(); // this will also reinit Subtitle charsets
}
bool CCharsetConverter::utf8ToUtf32(const std::string& utf8StringSrc, std::u32string& utf32StringDst, bool failOnBadChar /*= true*/)
diff --git a/xbmc/utils/CharsetConverter.h b/xbmc/utils/CharsetConverter.h
index 91c2a76aea..ab504099dc 100644
--- a/xbmc/utils/CharsetConverter.h
+++ b/xbmc/utils/CharsetConverter.h
@@ -168,12 +168,11 @@ public:
private:
static void resetUserCharset(void);
static void resetSubtitleCharset(void);
- static void resetKaraokeCharset(void);
static const int m_Utf8CharMinSize, m_Utf8CharMaxSize;
class CInnerConverter;
};
-XBMC_GLOBAL(CCharsetConverter,g_charsetConverter);
-
+XBMC_GLOBAL_REF(CCharsetConverter,g_charsetConverter);
+#define g_charsetConverter XBMC_GLOBAL_USE(CCharsetConverter)
#endif
diff --git a/xbmc/utils/GlobalsHandling.h b/xbmc/utils/GlobalsHandling.h
index ab46c58538..1e18ede49e 100644
--- a/xbmc/utils/GlobalsHandling.h
+++ b/xbmc/utils/GlobalsHandling.h
@@ -212,13 +212,3 @@ namespace xbmcutil
* #define g_variable XBMC_GLOBAL_USE(classname)
*/
#define XBMC_GLOBAL_USE(classname) (*(xbmcutil::GlobalsSingleton<classname>::getQuick()))
-
-/**
- * For pattern (1) above, you can use the following macro. WARNING: This should only
- * be used when the global in question is never accessed, directly or indirectly, from
- * a static method called (again, directly or indirectly) during startup or shutdown.
- */
-#define XBMC_GLOBAL(classname,g_variable) \
- XBMC_GLOBAL_REF(classname,g_variable); \
- static classname & g_variable = (*(g_variable##Ref.get()))
-
diff --git a/xbmc/utils/LabelFormatter.cpp b/xbmc/utils/LabelFormatter.cpp
index 2ec0e91a83..7b0b4e5109 100644
--- a/xbmc/utils/LabelFormatter.cpp
+++ b/xbmc/utils/LabelFormatter.cpp
@@ -238,7 +238,7 @@ std::string CLabelFormatter::GetMaskContent(const CMaskString &mask, const CFile
}
break;
case 'I': // size
- if( !item->m_bIsFolder || item->m_dwSize != 0 )
+ if( (item->m_bIsFolder && item->m_dwSize != 0) || item->m_dwSize >= 0 )
value = StringUtils::SizeToString(item->m_dwSize);
break;
case 'J': // date
diff --git a/xbmc/utils/Splash.cpp b/xbmc/utils/Splash.cpp
index c6988d67b4..440a26e109 100644
--- a/xbmc/utils/Splash.cpp
+++ b/xbmc/utils/Splash.cpp
@@ -30,6 +30,7 @@
using namespace XFILE;
CSplash::CSplash()
+ : m_image(nullptr)
{
}
diff --git a/xbmc/utils/StringUtils.cpp b/xbmc/utils/StringUtils.cpp
index 34b23218ad..df7a85a631 100644
--- a/xbmc/utils/StringUtils.cpp
+++ b/xbmc/utils/StringUtils.cpp
@@ -1081,11 +1081,7 @@ void StringUtils::WordToDigits(std::string &word)
std::string StringUtils::CreateUUID()
{
-#if !defined(TARGET_ANDROID)
static GuidGenerator guidGenerator;
-#else
- static GuidGenerator guidGenerator(xbmc_jnienv());
-#endif
auto guid = guidGenerator.newGuid();
std::stringstream strGuid; strGuid << guid;
diff --git a/xbmc/utils/win32/memcpy_sse2.h b/xbmc/utils/win32/memcpy_sse2.h
index c585136547..d5c5844b58 100644
--- a/xbmc/utils/win32/memcpy_sse2.h
+++ b/xbmc/utils/win32/memcpy_sse2.h
@@ -77,37 +77,49 @@ inline void convert_yuv420_nv12(uint8_t *const src[], const int srcStride[], int
uint8_t * u = src[1] + line * srcStride[1];
uint8_t * v = src[2] + line * srcStride[2];
uint8_t * d = dst[1] + line * dstStride[1];
- for (i = 0; i < (chromaWidth - 31); i += 32)
+ // if memory is not aligned use memcpy
+ if (((size_t)(u) | (size_t)(v) | (size_t)(d)) & 0xF)
{
- xmm0 = _mm_load_si128((__m128i*)(v + i));
- xmm1 = _mm_load_si128((__m128i*)(u + i));
- xmm2 = _mm_load_si128((__m128i*)(v + i + 16));
- xmm3 = _mm_load_si128((__m128i*)(u + i + 16));
+ for (i = 0; i < chromaWidth; ++i)
+ {
+ *d++ = *u++;
+ *d++ = *v++;
+ }
+ }
+ else
+ {
+ for (i = 0; i < (chromaWidth - 31); i += 32)
+ {
+ xmm0 = _mm_load_si128((__m128i*)(v + i));
+ xmm1 = _mm_load_si128((__m128i*)(u + i));
+ xmm2 = _mm_load_si128((__m128i*)(v + i + 16));
+ xmm3 = _mm_load_si128((__m128i*)(u + i + 16));
- xmm4 = xmm0;
- xmm0 = _mm_unpacklo_epi8(xmm1, xmm0);
- xmm4 = _mm_unpackhi_epi8(xmm1, xmm4);
+ xmm4 = xmm0;
+ xmm0 = _mm_unpacklo_epi8(xmm1, xmm0);
+ xmm4 = _mm_unpackhi_epi8(xmm1, xmm4);
- xmm1 = xmm2;
- xmm2 = _mm_unpacklo_epi8(xmm3, xmm2);
- xmm1 = _mm_unpackhi_epi8(xmm3, xmm1);
+ xmm1 = xmm2;
+ xmm2 = _mm_unpacklo_epi8(xmm3, xmm2);
+ xmm1 = _mm_unpackhi_epi8(xmm3, xmm1);
- _mm_stream_si128((__m128i *)(d + (i << 1) + 0), xmm0);
- _mm_stream_si128((__m128i *)(d + (i << 1) + 16), xmm4);
- _mm_stream_si128((__m128i *)(d + (i << 1) + 32), xmm2);
- _mm_stream_si128((__m128i *)(d + (i << 1) + 48), xmm1);
- }
- for (; i < chromaWidth; i += 16)
- {
- xmm0 = _mm_load_si128((__m128i*)(v + i));
- xmm1 = _mm_load_si128((__m128i*)(u + i));
+ _mm_stream_si128((__m128i *)(d + (i << 1) + 0), xmm0);
+ _mm_stream_si128((__m128i *)(d + (i << 1) + 16), xmm4);
+ _mm_stream_si128((__m128i *)(d + (i << 1) + 32), xmm2);
+ _mm_stream_si128((__m128i *)(d + (i << 1) + 48), xmm1);
+ }
+ for (; i < chromaWidth; i += 16)
+ {
+ xmm0 = _mm_load_si128((__m128i*)(v + i));
+ xmm1 = _mm_load_si128((__m128i*)(u + i));
- xmm2 = xmm0;
- xmm0 = _mm_unpacklo_epi8(xmm1, xmm0);
- xmm2 = _mm_unpackhi_epi8(xmm1, xmm2);
+ xmm2 = xmm0;
+ xmm0 = _mm_unpacklo_epi8(xmm1, xmm0);
+ xmm2 = _mm_unpackhi_epi8(xmm1, xmm2);
- _mm_stream_si128((__m128i *)(d + (i << 1) + 0), xmm0);
- _mm_stream_si128((__m128i *)(d + (i << 1) + 16), xmm2);
+ _mm_stream_si128((__m128i *)(d + (i << 1) + 0), xmm0);
+ _mm_stream_si128((__m128i *)(d + (i << 1) + 16), xmm2);
+ }
}
}
}
diff --git a/xbmc/video/Teletext.cpp b/xbmc/video/Teletext.cpp
index 765c75b98e..c5230d22ff 100644
--- a/xbmc/video/Teletext.cpp
+++ b/xbmc/video/Teletext.cpp
@@ -2854,7 +2854,7 @@ TextPageinfo_t* CTeletextDecoder::DecodePage(bool showl25, // 1=deco
PageAtrb[i] = atr;
/* decode parity/hamming */
- for (unsigned int i = 40; i < sizeof(PageChar); i++)
+ for (unsigned int i = 40; i < TELETEXT_PAGE_SIZE; i++)
{
PageAtrb[i] = atr;
p = PageChar + i;
diff --git a/xbmc/video/TeletextDefines.h b/xbmc/video/TeletextDefines.h
index 74e674ed73..2a519f59b5 100644
--- a/xbmc/video/TeletextDefines.h
+++ b/xbmc/video/TeletextDefines.h
@@ -24,6 +24,7 @@
#define FLOFSIZE 4
#define SUBTITLE_CACHESIZE 50
+#define TELETEXT_PAGE_SIZE (40 * 25)
#define number2char(c) ((c) + (((c) <= 9) ? '0' : ('A' - 10)))
@@ -393,8 +394,8 @@ typedef struct
{
bool Valid;
long Timestamp;
- unsigned char PageChar[40 * 25];
- TextPageAttr_t PageAtrb[40 * 25];
+ unsigned char PageChar[TELETEXT_PAGE_SIZE];
+ TextPageAttr_t PageAtrb[TELETEXT_PAGE_SIZE];
} TextSubtitleCache_t;
/* main data structure */
diff --git a/xbmc/video/VideoDatabase.cpp b/xbmc/video/VideoDatabase.cpp
index af6cf3750f..b56e2e8f88 100644
--- a/xbmc/video/VideoDatabase.cpp
+++ b/xbmc/video/VideoDatabase.cpp
@@ -6280,7 +6280,7 @@ bool CVideoDatabase::GetTvShowsByWhere(const std::string& strBaseDir, const Filt
if ((CProfilesManager::GetInstance().GetMasterProfile().getLockMode() == LOCK_MODE_EVERYONE ||
g_passwordManager.bMasterUser ||
g_passwordManager.IsDatabasePathUnlocked(movie.m_strPath, *CMediaSourceSettings::GetInstance().GetSources("video"))) &&
- (!g_advancedSettings.m_bVideoLibraryHideEmptySeries || movie.m_iEpisode > 0))
+ (CSettings::GetInstance().GetBool(CSettings::SETTING_VIDEOLIBRARY_SHOWEMPTYTVSHOWS) || movie.m_iEpisode > 0))
{
pItem->SetFromVideoInfoTag(movie);
diff --git a/xbmc/video/dialogs/GUIDialogVideoInfo.cpp b/xbmc/video/dialogs/GUIDialogVideoInfo.cpp
index 9ad7cb72e3..8da21b7a08 100644
--- a/xbmc/video/dialogs/GUIDialogVideoInfo.cpp
+++ b/xbmc/video/dialogs/GUIDialogVideoInfo.cpp
@@ -1567,7 +1567,7 @@ bool CGUIDialogVideoInfo::GetItemsForTag(const std::string &strHeading, const st
if (!showAll)
videoUrl.AddOption("tagid", idTag);
else
- filter.where = videodb.PrepareSQL("%s_view.%s NOT IN (SELECT tag_link.media_type FROM tag_link WHERE tag_link.tag_id = %d AND tag_link.media_type = '%s')", type.c_str(), idColumn.c_str(), idTag, type.c_str());
+ filter.where = videodb.PrepareSQL("%s_view.%s NOT IN (SELECT tag_link.media_id FROM tag_link WHERE tag_link.tag_id = %d AND tag_link.media_type = '%s')", type.c_str(), idColumn.c_str(), idTag, type.c_str());
}
CFileItemList listItems;
diff --git a/xbmc/video/windows/GUIWindowVideoBase.cpp b/xbmc/video/windows/GUIWindowVideoBase.cpp
index 2c39178be0..d19d3c3473 100644
--- a/xbmc/video/windows/GUIWindowVideoBase.cpp
+++ b/xbmc/video/windows/GUIWindowVideoBase.cpp
@@ -738,7 +738,10 @@ bool CGUIWindowVideoBase::OnItemInfo(int iItem)
OnItemInfo(item.get(), scraper);
- return true;
+ // Return whether or not we have information to display.
+ // Note: This will cause the default select action to start
+ // playback in case it's set to "Show information".
+ return item->HasVideoInfoTag();
}
void CGUIWindowVideoBase::OnRestartItem(int iItem)
diff --git a/xbmc/video/windows/GUIWindowVideoNav.cpp b/xbmc/video/windows/GUIWindowVideoNav.cpp
index 5d57344151..80f87352cd 100644
--- a/xbmc/video/windows/GUIWindowVideoNav.cpp
+++ b/xbmc/video/windows/GUIWindowVideoNav.cpp
@@ -473,7 +473,7 @@ bool CGUIWindowVideoNav::GetDirectory(const std::string &strDirectory, CFileItem
std::string label;
if (items.GetLabel().empty() && m_rootDir.IsSource(items.GetPath(), CMediaSourceSettings::GetInstance().GetSources("video"), &label))
items.SetLabel(label);
- if (!items.IsSourcesPath())
+ if (!items.IsSourcesPath() && !items.IsLibraryFolder())
LoadVideoInfo(items);
}
diff --git a/xbmc/windowing/X11/WinSystemX11.cpp b/xbmc/windowing/X11/WinSystemX11.cpp
index 27da16378d..134c4984c9 100644
--- a/xbmc/windowing/X11/WinSystemX11.cpp
+++ b/xbmc/windowing/X11/WinSystemX11.cpp
@@ -1149,8 +1149,19 @@ bool CWinSystemX11::SetWindow(int width, int height, bool fullscreen, const std:
XChangeProperty(m_dpy, m_mainWindow, XInternAtom(m_dpy, "_NET_WM_STATE", True), XA_ATOM, 32, PropModeReplace, (unsigned char *) &fs, 1);
// disable desktop compositing for KDE, when Kodi is in full-screen mode
int one = 1;
- XChangeProperty(m_dpy, m_mainWindow, XInternAtom(m_dpy, "_KDE_NET_WM_BLOCK_COMPOSITING", True), XA_CARDINAL, 32,
- PropModeReplace, (unsigned char*) &one, 1);
+ Atom composite = XInternAtom(m_dpy, "_KDE_NET_WM_BLOCK_COMPOSITING", True);
+ if (composite != None)
+ {
+ XChangeProperty(m_dpy, m_mainWindow, XInternAtom(m_dpy, "_KDE_NET_WM_BLOCK_COMPOSITING", True), XA_CARDINAL, 32,
+ PropModeReplace, (unsigned char*) &one, 1);
+ }
+ composite = XInternAtom(m_dpy, "_NET_WM_BYPASS_COMPOSITOR", True);
+ if (composite != None)
+ {
+ // standard way for Gnome 3
+ XChangeProperty(m_dpy, m_mainWindow, XInternAtom(m_dpy, "_NET_WM_BYPASS_COMPOSITOR", True), XA_CARDINAL, 32,
+ PropModeReplace, (unsigned char*) &one, 1);
+ }
}
// define invisible cursor
diff --git a/xbmc/windowing/egl/EGLNativeTypeAmlogic.cpp b/xbmc/windowing/egl/EGLNativeTypeAmlogic.cpp
index fe315a5107..21256ef953 100644
--- a/xbmc/windowing/egl/EGLNativeTypeAmlogic.cpp
+++ b/xbmc/windowing/egl/EGLNativeTypeAmlogic.cpp
@@ -64,14 +64,10 @@ bool CEGLNativeTypeAmlogic::CheckCompatibility()
void CEGLNativeTypeAmlogic::Initialize()
{
aml_permissions();
- aml_cpufreq_min(true);
- aml_cpufreq_max(true);
DisableFreeScale();
}
void CEGLNativeTypeAmlogic::Destroy()
{
- aml_cpufreq_min(false);
- aml_cpufreq_max(false);
return;
}
diff --git a/xbmc/windowing/egl/EGLNativeTypeAndroid.cpp b/xbmc/windowing/egl/EGLNativeTypeAndroid.cpp
index 5f9de94972..8b7b695c03 100644
--- a/xbmc/windowing/egl/EGLNativeTypeAndroid.cpp
+++ b/xbmc/windowing/egl/EGLNativeTypeAndroid.cpp
@@ -97,8 +97,8 @@ bool CEGLNativeTypeAndroid::GetNativeWindow(XBNativeWindowType **nativeWindow) c
{
if (!nativeWindow)
return false;
- *nativeWindow = (XBNativeWindowType*) CXBMCApp::GetNativeWindow(30000);
- return (*nativeWindow != NULL);
+ *nativeWindow = (XBNativeWindowType*) CXBMCApp::GetNativeWindow(2000);
+ return (*nativeWindow != NULL && **nativeWindow != NULL);
}
bool CEGLNativeTypeAndroid::DestroyNativeDisplay()
@@ -117,7 +117,7 @@ static float currentRefreshRate()
if (window)
{
float preferredRate = window.getAttributes().getpreferredRefreshRate();
- if (preferredRate > 20.0 && preferredRate < 61.0)
+ if (preferredRate > 20.0 && preferredRate < 70.0)
{
CLog::Log(LOGDEBUG, "CEGLNativeTypeAndroid: Preferred refresh rate: %f", preferredRate);
return preferredRate;
@@ -128,7 +128,7 @@ static float currentRefreshRate()
if (display)
{
float reportedRate = display.getRefreshRate();
- if (reportedRate > 20.0 && reportedRate < 61.0)
+ if (reportedRate > 20.0 && reportedRate < 70.0)
{
CLog::Log(LOGDEBUG, "CEGLNativeTypeAndroid: Current display refresh rate: %f", reportedRate);
return reportedRate;
diff --git a/xbmc/windows/GUIMediaWindow.cpp b/xbmc/windows/GUIMediaWindow.cpp
index b7b357767b..08aa7a86f4 100644
--- a/xbmc/windows/GUIMediaWindow.cpp
+++ b/xbmc/windows/GUIMediaWindow.cpp
@@ -777,7 +777,7 @@ bool CGUIMediaWindow::Update(const std::string &strDirectory, bool updateFilterP
showLabel = 997;
else if (iWindow == WINDOW_MUSIC_FILES)
showLabel = 998;
- else if (iWindow == WINDOW_FILES || iWindow == WINDOW_PROGRAMS)
+ else if (iWindow == WINDOW_FILES)
showLabel = 1026;
}
if (m_vecItems->IsPath("sources://video/"))
@@ -786,8 +786,7 @@ bool CGUIMediaWindow::Update(const std::string &strDirectory, bool updateFilterP
showLabel = 998;
else if (m_vecItems->IsPath("sources://pictures/"))
showLabel = 997;
- else if (m_vecItems->IsPath("sources://programs/") ||
- m_vecItems->IsPath("sources://files/"))
+ else if (m_vecItems->IsPath("sources://files/"))
showLabel = 1026;
if (showLabel && (m_vecItems->Size() == 0 || !m_guiState->DisableAddSourceButtons())) // add 'add source button'
{
@@ -1017,9 +1016,6 @@ bool CGUIMediaWindow::OnClick(int iItem)
return true;
}
- // If karaoke song is being played AND popup autoselector is enabled, the playlist should not be added
- bool do_not_add_karaoke = CSettings::GetInstance().GetBool(CSettings::SETTING_KARAOKE_ENABLED) &&
- CSettings::GetInstance().GetBool(CSettings::SETTING_KARAOKE_AUTOPOPUPSELECTOR) && pItem->IsKaraoke();
bool autoplay = m_guiState.get() && m_guiState->AutoPlayNextItem();
if (m_vecItems->IsPlugin())
@@ -1039,7 +1035,7 @@ bool CGUIMediaWindow::OnClick(int iItem)
}
if (autoplay && !g_partyModeManager.IsEnabled() &&
- !pItem->IsPlayList() && !do_not_add_karaoke)
+ !pItem->IsPlayList())
{
return OnPlayAndQueueMedia(pItem);
}
diff --git a/xbmc/windows/GUIWindowFileManager.cpp b/xbmc/windows/GUIWindowFileManager.cpp
index 29860bcb16..a3632df4e2 100644
--- a/xbmc/windows/GUIWindowFileManager.cpp
+++ b/xbmc/windows/GUIWindowFileManager.cpp
@@ -309,6 +309,10 @@ bool CGUIWindowFileManager::OnMessage(CGUIMessage& message)
}
}
break;
+ // prevent touch/gesture unfocussing ..
+ case GUI_MSG_GESTURE_NOTIFY:
+ case GUI_MSG_UNFOCUS_ALL:
+ return true;
}
return CGUIWindow::OnMessage(message);
}
diff --git a/xbmc/windows/GUIWindowLoginScreen.cpp b/xbmc/windows/GUIWindowLoginScreen.cpp
index 4e93e455e5..3cbca001d2 100644
--- a/xbmc/windows/GUIWindowLoginScreen.cpp
+++ b/xbmc/windows/GUIWindowLoginScreen.cpp
@@ -18,38 +18,40 @@
*
*/
+#include "GUIWindowLoginScreen.h"
+
#include "system.h"
+
#include "Application.h"
-#include "messaging/ApplicationMessenger.h"
-#include "GUIWindowLoginScreen.h"
-#include "profiles/Profile.h"
-#include "profiles/ProfilesManager.h"
-#include "profiles/dialogs/GUIDialogProfileSettings.h"
-#include "dialogs/GUIDialogContextMenu.h"
+#include "ContextMenuManager.h"
+#include "FileItem.h"
#include "GUIPassword.h"
+#include "addons/AddonManager.h"
+#include "addons/Skin.h"
+#include "cores/AudioEngine/DSPAddons/ActiveAEDSP.h"
+#include "dialogs/GUIDialogContextMenu.h"
+#include "dialogs/GUIDialogOK.h"
+#include "guilib/GUIMessage.h"
+#include "guilib/GUIWindowManager.h"
+#include "guilib/LocalizeStrings.h"
+#include "guilib/StereoscopicsManager.h"
+#include "input/Key.h"
+#include "interfaces/builtins/Builtins.h"
#ifdef HAS_JSONRPC
#include "interfaces/json-rpc/JSONRPC.h"
#endif
-#include "interfaces/builtins/Builtins.h"
+#include "messaging/ApplicationMessenger.h"
+#include "network/Network.h"
+#include "profiles/Profile.h"
+#include "profiles/ProfilesManager.h"
+#include "profiles/dialogs/GUIDialogProfileSettings.h"
+#include "pvr/PVRManager.h"
+#include "settings/Settings.h"
#include "utils/log.h"
-#include "utils/Weather.h"
#include "utils/StringUtils.h"
+#include "utils/Weather.h"
#include "utils/Variant.h"
-#include "network/Network.h"
-#include "addons/Skin.h"
-#include "guilib/GUIMessage.h"
-#include "guilib/GUIWindowManager.h"
-#include "guilib/StereoscopicsManager.h"
-#include "dialogs/GUIDialogOK.h"
-#include "settings/Settings.h"
-#include "FileItem.h"
-#include "input/Key.h"
-#include "guilib/LocalizeStrings.h"
-#include "addons/AddonManager.h"
#include "view/ViewState.h"
-#include "pvr/PVRManager.h"
-#include "ContextMenuManager.h"
-#include "cores/AudioEngine/DSPAddons/ActiveAEDSP.h"
using namespace KODI::MESSAGING;
@@ -58,7 +60,7 @@ using namespace KODI::MESSAGING;
#define CONTROL_LABEL_SELECTED_PROFILE 3
CGUIWindowLoginScreen::CGUIWindowLoginScreen(void)
-: CGUIWindow(WINDOW_LOGIN_SCREEN, "LoginScreen.xml")
+ : CGUIWindow(WINDOW_LOGIN_SCREEN, "LoginScreen.xml")
{
watch.StartZero();
m_vecItems = new CFileItemList;
@@ -251,7 +253,7 @@ bool CGUIWindowLoginScreen::OnPopupMenu(int iItem)
// Edit the profile after checking if the correct master lock password was given.
if (choice == 1 && g_passwordManager.IsMasterLockUnlocked(true))
CGUIDialogProfileSettings::ShowForProfile(m_viewControl.GetSelectedItem());
-
+
//NOTE: this can potentially (de)select the wrong item if the filelisting has changed because of an action above.
if (iItem < (int)CProfilesManager::GetInstance().GetNumberOfProfiles())
m_vecItems->Get(iItem)->Select(bSelect);
@@ -321,7 +323,7 @@ void CGUIWindowLoginScreen::LoadProfile(unsigned int profile)
JSONRPC::CJSONRPC::Initialize();
#endif
- // start services which should run on login
+ // start services which should run on login
ADDON::CAddonMgr::GetInstance().StartServices(false);
// start PVR related services
diff --git a/xbmc/windows/GUIWindowLoginScreen.h b/xbmc/windows/GUIWindowLoginScreen.h
index e94ec183ab..fba195bc00 100644
--- a/xbmc/windows/GUIWindowLoginScreen.h
+++ b/xbmc/windows/GUIWindowLoginScreen.h
@@ -21,8 +21,8 @@
*/
#include "guilib/GUIDialog.h"
-#include "view/GUIViewControl.h"
#include "utils/Stopwatch.h"
+#include "view/GUIViewControl.h"
class CFileItemList;
diff --git a/xbmc/windows/GUIWindowScreensaverDim.cpp b/xbmc/windows/GUIWindowScreensaverDim.cpp
index 249ee22514..ed54dc2511 100644
--- a/xbmc/windows/GUIWindowScreensaverDim.cpp
+++ b/xbmc/windows/GUIWindowScreensaverDim.cpp
@@ -28,6 +28,7 @@ CGUIWindowScreensaverDim::CGUIWindowScreensaverDim(void)
{
m_needsScaling = false;
m_dimLevel = 100.0f;
+ m_newDimLevel = 100.0f;
m_animations.push_back(CAnimation::CreateFader(0, 100, 0, 1000, ANIM_TYPE_WINDOW_OPEN));
m_animations.push_back(CAnimation::CreateFader(100, 0, 0, 1000, ANIM_TYPE_WINDOW_CLOSE));
m_renderOrder = RENDER_ORDER_WINDOW_SCREENSAVER;
@@ -39,8 +40,8 @@ CGUIWindowScreensaverDim::~CGUIWindowScreensaverDim(void)
void CGUIWindowScreensaverDim::UpdateVisibility()
{
- m_dimLevel = g_application.GetDimScreenSaverLevel();
- if (m_dimLevel)
+ m_newDimLevel = g_application.GetDimScreenSaverLevel();
+ if (m_newDimLevel)
Open();
else
Close();
@@ -48,6 +49,8 @@ void CGUIWindowScreensaverDim::UpdateVisibility()
void CGUIWindowScreensaverDim::Process(unsigned int currentTime, CDirtyRegionList &dirtyregions)
{
+ if (m_newDimLevel != m_dimLevel && !IsAnimating(ANIM_TYPE_WINDOW_CLOSE))
+ m_dimLevel = m_newDimLevel;
CGUIDialog::Process(currentTime, dirtyregions);
m_renderRegion.SetRect(0, 0, (float)g_graphicsContext.GetWidth(), (float)g_graphicsContext.GetHeight());
}
diff --git a/xbmc/windows/GUIWindowScreensaverDim.h b/xbmc/windows/GUIWindowScreensaverDim.h
index e0db07d105..8da9f0b918 100644
--- a/xbmc/windows/GUIWindowScreensaverDim.h
+++ b/xbmc/windows/GUIWindowScreensaverDim.h
@@ -34,4 +34,5 @@ protected:
virtual void UpdateVisibility();
private:
float m_dimLevel;
+ float m_newDimLevel;
};