diff --git a/plugin.video.youtube/addon.xml b/plugin.video.youtube/addon.xml index e7831b0ef3..dfe97971da 100644 --- a/plugin.video.youtube/addon.xml +++ b/plugin.video.youtube/addon.xml @@ -1,10 +1,11 @@ - + + video @@ -31,6 +32,7 @@ Plugin für YouTube Πρόσθετο YouTube Plugin for YouTube + Aldonaĵo por YouTube Complemento para YouTube Complemento para YouTube YouTube-lisäosa @@ -108,9 +110,33 @@ Plugin này không được xác nhận bởi Google 此插件未被谷歌认可 此附加元件未由Google支持 - ## v7.0.9.2 + ## v7.1.1.4 ### Fixed -- Fix various Kodi 18 listitem setInfo compatibility issues -- Additional fixes and compatibility shims for playing AudioItems -- Fix early thread loop termination in My Subscriptions +- Fix http server not listening on any interface if listen IP is 0.0.0.0 +- Standardise return type of LoginClient.refresh_token +- Fix curl headers not being used when set on path of setResolvedUrl listitem +- Fix HEAD requests to MPD manifests +- Fix various Python2 incompatible changes +- Properly distinguish between VP9 and VP9.2 with HDR info +- Fix http server not running when script shows client IP +- Fix not listing full stream details in selection dialog +- Fix translated subtitles not being available for some videos +- Fix labelling for auto dubbed audio tracks +- Fix regressions in handling VP9.2 video streams +- Fix error handling items without headers +- Fix incorrectly determining Kodi release name +- Fix search window history navigation when using direct links +- Fix Python2/Android incompatibilty when checking CPU count +- Fix method used to determine address of local network interface +- Fix potential infinite loop with corrupted access_manager.json +- Various improvements to multiple busy dialog crash workarounds +- Fallback to search listing when search query is empty +- Fix debug log string formatting error +- Fix duplicated separators in context menu +- Fix Kodi builtin using wrong playlist type +- Ensure http server is started prior to creating MPD for playback +- Fix shuffle play of playlists not working +- Fix plugin category label not being applied if content type not set +- Fix Kodi navigating to root path of Video window if plugin listing fails +- Fix l diff --git a/plugin.video.youtube/changelog.txt b/plugin.video.youtube/changelog.txt index a467213599..4655d741a2 100644 --- a/plugin.video.youtube/changelog.txt +++ b/plugin.video.youtube/changelog.txt @@ -1,3 +1,358 @@ +## v7.1.1.4 +### Fixed +- Fix http server not listening on any interface if listen IP is 0.0.0.0 #927 +- Standardise return type of LoginClient.refresh_token #932 +- Fix curl headers not being used when set on path of setResolvedUrl listitem +- Fix HEAD requests to MPD manifests +- Fix various Python2 incompatible changes +- Properly distinguish between VP9 and VP9.2 with HDR info +- Fix http server not running when script shows client IP +- Fix not listing full stream details in selection dialog +- Fix translated subtitles not being available for some videos #945 +- Fix labelling for auto dubbed audio tracks +- Fix regressions in handling VP9.2 video streams +- Fix error handling items without headers #946 +- Fix incorrectly determining Kodi release name +- Fix search window history navigation when using direct links +- Fix Python2/Android incompatibilty when checking CPU count #958 +- Fix method used to determine address of local network interface #938 +- Fix potential infinite loop with corrupted access_manager.json +- Various improvements to multiple busy dialog crash workarounds #938 +- Fallback to search listing when search query is empty +- Fix debug log string formatting error #938 +- Fix duplicated separators in context menu +- Fix Kodi builtin using wrong playlist type #938 +- Ensure http server is started prior to creating MPD for playback #961 +- Fix shuffle play of playlists not working +- Fix plugin category label not being applied if content type not set +- Fix Kodi navigating to root path of Video window if plugin listing fails +- Fix loading of Watch Later playlist #971 + - Also fix other incorrect/missing parameter names +- Fix possible exception if plugin navigation fails #976 +- Fix sign in when one or more access token requests fail #979 +- Attempt to fix possible deadlock on http server shutdown +- Fix potential infinite loop with old data from access_manager.json #980 +- Reduce unnecessary window navigation fallback attempts +- Fix incorrect duration display in Kodi 18 and Kodi 19 #999 +- Fix possible error with getting names of bookmarks that have not been updated with info +- Fix missing "Live" label in Kodi 18 +- Fix uncaught exception when sign-in does not succeed #985 +- Fix missing "Ask" translation string +- Fix incorrect parameter name breaking auto-remove from Watch Later #993 +- Fix processing of "q" and "channelId" search query params #1004 +- Fix errors with progress dialogs in Kodi 18 #1000 +- Fix remote watch history not updating #1008 + +### Changed +- Improve display and update of bookmarks +- Explicitly set http server protocol version to HTTP/1.1 +- Improve logging +- Use alternative streams to improve compatibility with external players +- Improve https server sleep and wakeup #810 #951 +- Update Setup Wizard to disable all alternative player settings if not required #938 +- Improve support for optional search API parameters #689 +- Ensure changing sort order of search replaces existing search +- Use redirect in multiple busy dialog crash workaround #938 +- Disable unusable alternate players #966 +- Standardise plugin URIs for routing + - path parameters used for folders and sub-folders + - query parameters used for changing display modes, filtering, sorting and inputs +- Don't retry server wakeup on error unless settings change +- Allow ISA and MPD in 720p performance preset in Setup Wizard +- Only use OAuth tokens if necessary #994 #996 + +### New +- Explicitly enable TCP keep alive #913 +- Add localised title and description for videos, channels and playlists +- Update display of playlists to show the following details: + - item count + - date + - channel name + - description + - web url + - podcast status +- Update display of channels to show the following details: + - view count + - subscriber count + - video count + - date + - description + - channel name in description + - web url +- Add View all and Shuffle context menu items for playlists +- New setting to enable debug logging for addon + - Setting > Advanced > Logging > Enable debug logging +- Improvements to searching + - Add context menu items for changing sort order of saved searches #172 + - Allow search parameters to be stored per search #172 #689 + - Allow additional optional search parameters to be used #689 + - Improve parsing of date offset when searching for completed live events +- Add additional search type links to search results #689 +- Add ability to replace window when rerouting using window_replace query parameter +- Add search sort context menu items to search results #172 +- Add prompts and notifications for deleting items and clearing lists +- Add Quick Search and search management context menu items to Search folders +- Add context menu items to Clear and Play All/Shuffle in Bookmarks/Watch Later/Watch History folders +- Add progress dialog to My Subscription loading + +## v7.1.1+beta.7 +### Fixed +- Fix loading of Watch Later playlist #971 + - Also fix other incorrect/missing parameter names + +### Changed +- Don't retry server wakeup on error unless settings change + +## v7.1.1+beta.6 +### Fixed +- Ensure http server is started prior to creating MPD for playback #961 +- Fix shuffle play of playlists not working +- Fix plugin category label not being applied if content type not set +- Fix Kodi navigating to root path of Video window if plugin listing fails + +### Changed +- Use redirect in multiple busy dialog crash workaround #938 +- Disable unusable alternate players #966 +- Standardise plugin URIs for routing + - path parameters used for folders and sub-folders + - query parameters used for changing display modes, filtering, sorting and inputs + +### New +- Add Quick Search and search management context menu items to Search folders +- Add context menu items to Clear and Play All/Shuffle in Bookmarks/Watch Later/Watch History folders +- Add progress dialog to My Subscription loading + +## v7.1.1+beta.5 +### Fixed +- Fix Python2/Android incompatibilty when checking CPU count #958 +- Fix method used to determine address of local network interface #938 +- Fix potential infinite loop with corrupted access_manager.json +- Various improvements to multiple busy dialog crash workarounds #938 +- Fallback to search listing when search query is empty +- Fix debug log string formatting error #938 +- Fix duplicated separators in context menu +- Fix Kodi builtin using wrong playlist type #938 + +### Changed +- Improve support for optional search API parameters #689 +- Ensure changing sort order of search replaces existing search + +### New +- Add additional search type links to search results #689 +- Add ability to replace window when rerouting using window_replace query parameter +- Add search sort context menu items to search results #172 +- Add prompts and notifications for deleting items and clearing lists + +## v7.1.1+beta.4 +### Fixed +- Fix incorrectly determining Kodi release name +- Fix search window history navigation when using direct links + +### Changed +- Improve https server sleep and wakeup #810 #951 +- Update Setup Wizard to disable all alternative player settings if not required #938 + +### New +- Improvements to searching + - Add context menu items for changing sort order of saved searches #172 + - Allow search parameters to be stored per search #172 #689 + - Allow additional optional search parameters to be used #689 + - Improve parsing of date offset when searching for completed live events + +## v7.1.1+beta.3 +### Fixed +- Fix not listing full stream details in selection dialog +- Fix translated subtitles not being available for some videos #945 +- Fix labelling for auto dubbed audio tracks +- Fix regressions in handling VP9.2 video streams +- Fix error handling items without headers #946 + +### Changed +- Use alternative streams to improve compatibility with external players + +## v7.1.1+beta.2 +### Fixed +- Standardise return type of LoginClient.refresh_token #932 +- Fix curl headers not being used when set on path of setResolvedUrl listitem +- Fix HEAD requests to MPD manifests +- Fix various Python2 incompatible changes +- Properly distinguish between VP9 and VP9.2 with HDR info +- Fix http server not running when script shows client IP + +### Changed +- Improve display and update of bookmarks +- Explicitly set http server protocol version to HTTP/1.1 +- Improve logging + +### New +- Add View all and Shuffle context menu items for playlists +- New setting to enable debug logging for addon + - Setting > Advanced > Logging > Enable debug logging + +## v7.1.1+beta.1 +### Fixed +- Fix http server not listening on any interface if listen IP is 0.0.0.0 #927 + +### New +- Explicitly enable TCP keep alive #913 +- Add localised title and description for videos, channels and playlists +- Update display of playlists to show the following details: + - item count + - date + - channel name + - description + - web url + - podcast status +- Update display of channels to show the following details: + - view count + - subscriber count + - video count + - date + - description + - channel name in description + - web url + +## v7.1.0.1 +### Fixed +- Fix logging/retry of sqlite3.OperationalError +- Fix trying to use ISA for progressive live streams +- Retain list position when refreshing listings +- Add workarounds for trying to play videos using RunPlugin rather PlayMedia +- Fix possible regression causing 6s delay on first play +- Fix regression in building client details causing wrong referer to be used +- Only reroute to new window if container was not filled by the plugin #896 +- Only reroute to new window if modal dialog is not open #896 +- Fix various timing and sync issues with script, service, plugin and Kodi settings +- Fix playback history related context menu items not being shown #904 +- Fix new resume details not being saved in plugin local playback history #904 +- Fix default thumbnails not being updated if available +- Fix login to personal project only #910 +- Fix regression with not using content type when routing after f239764 #922 +- Partially revert eb0f81c to avoid merge error in unofficial version #924 +- Only attempt to import InputStream Helper if necessary #923 + +### Changed +- Update multiple busy dialog crash workaround #891 +- Use all playable codecs but deprioritise if not selected in stream features +- Change default live stream type to suit ISA and Youtube stream availability +- Use a CommandItem that opens the Info dialog for comments to avoid log spam +- Revert old workaround for Kodi treating a non-folder listitem as playable +- Improve parsing of plugin url query parameters to allow empty values +- Move IP location lookup to script and add to settings dialog +- Move language and region selection to script and add to settings dialog +- Allow default thumbnail selection fallbacks for all results +- Simplify handling of local history + - Incognito will no longer prevent existing local history from being shown + - Incognito will continue to prevent any update to local history +- Remove revoked API credentials #905 +- Improve handling of "forbidden - The caller does not have permission" errors #905 +- Allow retries on POST requests #913 + +### New +- Allow ask for quality from context menu to override audio only setting +- Add items_per_page query parameter to allow number of items in widgets to be customised #896 +- Add item_filter query parameter to override "Hide videos from listings" setting #896 + - Comma seperated string of item types to be filtered out of listing + - "?item_filter=shorts" will remove shorts from listing + - "?item_filter=shorts,live" will remove shorts and live streams from listing + - "?item_filter" will show all item types + - Allowable item types: + - shorts + - upcoming + - upcoming_live + - live + - premieres + - completed + - vod +- Add hide_next_page query parameter to hide plugin Next page item #896 +- Add new input_prompt command for search endpoint to bypass Kodi window caching + - plugin://plugin.video.youtube/kodion/search/input_prompt +- Add support for proxy settings #884 +- Preliminary support for /watch_videos YouTube urls +- Player client updates + +## v7.1.0+beta.5 +### Fixed +- Fix default thumbnails not being updated if available + +### Changed +- Remove revoked API credentials #905 +- Improve handling of "forbidden - The caller does not have permission" errors #905 + +### New +- Preliminary support for /watch_videos YouTube urls +- Player client updates + +## v7.1.0+beta.4 +### Fixed +- Fix playback history related context menu items not being shown #904 +- Fix new resume details not being saved in plugin local playback history #904 + +### Changed +- Allow default thumbnail selection fallbacks for all results +- Simplify handling of local history + - Incognito will no longer prevent existing local history from being shown + - Incognito will continue to prevent any update to local history + +### New +- Add support for proxy settings #884 + +## v7.1.0+beta.3 +### Fixed +- Fix various timing and sync issues with script, service, plugin and Kodi settings + +### Changed +- Move IP location lookup to script and add to settings dialog +- Move language and region selection to script and add to settings dialog + +### New +- Add hide_next_page query parameter to hide plugin Next page item #896 +- Add new input_prompt command for search endpoint to bypass Kodi window caching + - plugin://plugin.video.youtube/kodion/search/input_prompt + +## v7.1.0+beta.2 +### Fixed +- Fix possible regression causing 6s delay on first play +- Fix regression in building client details causing wrong referer to be used +- Only reroute to new window if container was not filled by the plugin #896 +- Only reroute to new window if modal dialog is not open #896 + +### Changed +- Use a CommandItem that opens the Info dialog for comments to avoid log spam +- Revert old workaround for Kodi treating a non-folder listitem as playable +- Improve parsing of plugin url query parameters to allow empty values + +### New +- Add items_per_page query parameter to allow number of items in widgets to be customised #896 +- Add item_filter query parameter to override "Hide videos from listings" setting #896 + - Comma seperated string of item types to be filtered out of listing + - "?item_filter=shorts" will remove shorts from listing + - "?item_filter=shorts,live" will remove shorts and live streams from listing + - "?item_filter" will show all item types + - Allowable item types: + - shorts + - upcoming + - upcoming_live + - live + - premieres + - completed + - vod + +## v7.1.0+beta.1 +### Fixed +- Fix logging/retry of sqlite3.OperationalError +- Fix trying to use ISA for progressive live streams +- Retain list position when refreshing listings +- Add workarounds for trying to play videos using RunPlugin rather PlayMedia + +### Changed +- Update multiple busy dialog crash workaround #891 +- Use all playable codecs but deprioritise if not selected in stream features +- Change default live stream type to suit ISA and Youtube stream availability + +### New +- Allow ask for quality from context menu to override audio only setting + ## v7.0.9.2 ### Fixed - Fix various Kodi 18 listitem setInfo compatibility issues diff --git a/plugin.video.youtube/resources/language/resource.language.af_za/strings.po b/plugin.video.youtube/resources/language/resource.language.af_za/strings.po index 7219c2f1d9..d13f2915aa 100644 --- a/plugin.video.youtube/resources/language/resource.language.af_za/strings.po +++ b/plugin.video.youtube/resources/language/resource.language.af_za/strings.po @@ -37,7 +37,7 @@ msgstr "" # msgstr "" # Kodion Settings msgctxt "#30000" -msgid "General" +msgid "" msgstr "" msgctxt "#30001" @@ -151,7 +151,7 @@ msgid "Configure %s?" msgstr "" msgctxt "#30031" -msgid "Advanced" +msgid "" msgstr "" msgctxt "#30032" @@ -217,7 +217,7 @@ msgid "Watch Later" msgstr "" msgctxt "#30108" -msgid "Remove" +msgid "" msgstr "" msgctxt "#30109" @@ -237,7 +237,7 @@ msgid "Sign Out" msgstr "" msgctxt "#30113" -msgid "Rename" +msgid "" msgstr "" msgctxt "#30114" @@ -257,7 +257,7 @@ msgid "Remove \"%s\"?" msgstr "" msgctxt "#30118" -msgid "Delete" +msgid "" msgstr "" msgctxt "#30119" @@ -301,11 +301,11 @@ msgstr "" # YouTube # empty strings from id 30206 to 30499 msgctxt "#30500" -msgid "Channels" +msgid "" msgstr "" msgctxt "#30501" -msgid "Playlists" +msgid "" msgstr "" msgctxt "#30502" @@ -361,7 +361,7 @@ msgid "Related Videos" msgstr "" msgctxt "#30515" -msgid "Auto-Remove from 'Watch Later'" +msgid "Auto-Remove from Watch Later" msgstr "" msgctxt "#30516" @@ -385,15 +385,15 @@ msgid "Add to..." msgstr "" msgctxt "#30521" -msgid "Select playlist" +msgid "" msgstr "" msgctxt "#30522" -msgid "New playlist..." +msgid "" msgstr "" msgctxt "#30523" -msgid "Language" +msgid "" msgstr "" msgctxt "#30524" @@ -425,11 +425,11 @@ msgid "I dislike this" msgstr "" msgctxt "#30531" -msgid "Play all" +msgid "" msgstr "" msgctxt "#30532" -msgid "Default" +msgid "" msgstr "" msgctxt "#30533" @@ -437,7 +437,7 @@ msgid "Reverse" msgstr "" msgctxt "#30534" -msgid "Shuffle" +msgid "" msgstr "" msgctxt "#30535" @@ -457,7 +457,7 @@ msgid "Disliked Videos" msgstr "" msgctxt "#30539" -msgid "Live" +msgid "" msgstr "" msgctxt "#30540" @@ -473,7 +473,7 @@ msgid "rtmpe streams are not supported" msgstr "" msgctxt "#30543" -msgid "Refresh" +msgid "" msgstr "" msgctxt "#30544" @@ -485,15 +485,15 @@ msgid "No further links found." msgstr "" msgctxt "#30546" -msgid "Please log in twice!" +msgid "Please complete all login prompts" msgstr "" msgctxt "#30547" -msgid "You must enable two applications so that YouTube is functioning properly." +msgid "You may be prompted to enable two applications so that YouTube is functioning properly." msgstr "" msgctxt "#30548" -msgid "More..." +msgid "" msgstr "" msgctxt "#30549" @@ -501,7 +501,7 @@ msgid "No videos streams found" msgstr "" msgctxt "#30550" -msgid "Region" +msgid "" msgstr "" msgctxt "#30551" @@ -541,15 +541,15 @@ msgid "Delete settings.xml" msgstr "" msgctxt "#30560" -msgid "Subtitle language" +msgid "" msgstr "" msgctxt "#30561" -msgid "None" +msgid "" msgstr "" msgctxt "#30562" -msgid "" +msgid "View all" msgstr "" msgctxt "#30563" @@ -565,7 +565,7 @@ msgid "" msgstr "" msgctxt "#30566" -msgid "Prompt" +msgid "" msgstr "" msgctxt "#30567" @@ -577,11 +577,11 @@ msgid "Remove as Watch Later" msgstr "" msgctxt "#30569" -msgid "Are you sure you want to remove '%s' as your Watch Later list?" +msgid "Are you sure you want to remove \"%s\" as your Watch Later list?" msgstr "" msgctxt "#30570" -msgid "Are you sure you want to replace your current Watch Later list with '%s'?" +msgid "Are you sure you want to replace your current Watch Later list with \"%s\"?" msgstr "" msgctxt "#30571" @@ -593,11 +593,11 @@ msgid "Remove as History" msgstr "" msgctxt "#30573" -msgid "Are you sure you want to remove '%s' as your History list?" +msgid "Are you sure you want to remove \"%s\" as your History list?" msgstr "" msgctxt "#30574" -msgid "Are you sure you want to replace your current History list with '%s'?" +msgid "Are you sure you want to replace your current History list with \"%s\"?" msgstr "" msgctxt "#30575" @@ -609,7 +609,7 @@ msgid "Failed" msgstr "" msgctxt "#30577" -msgid "Settings" +msgid "" msgstr "" msgctxt "#30578" @@ -633,7 +633,7 @@ msgid "Autoplay suggested videos" msgstr "" msgctxt "#30583" -msgid "Automatic" +msgid "" msgstr "" msgctxt "#30584" @@ -693,7 +693,7 @@ msgid "Updated: %s" msgstr "" msgctxt "#30598" -msgid "Personal API keys enabled" +msgid "" msgstr "" msgctxt "#30599" @@ -701,7 +701,7 @@ msgid "Failed to enable personal API keys. Missing: %s" msgstr "" msgctxt "#30600" -msgid "Subtitles" +msgid "" msgstr "" msgctxt "#30601" @@ -761,7 +761,7 @@ msgid "" msgstr "" msgctxt "#30615" -msgid "Cancel" +msgid "" msgstr "" msgctxt "#30616" @@ -777,7 +777,7 @@ msgid "" msgstr "" msgctxt "#30619" -msgid "Port" +msgid "" msgstr "" msgctxt "#30620" @@ -821,7 +821,7 @@ msgid "IP whitelist (comma delimited)" msgstr "" msgctxt "#30630" -msgid "Save" +msgid "" msgstr "" msgctxt "#30631" @@ -937,7 +937,7 @@ msgid "Enter a name for this user" msgstr "" msgctxt "#30659" -msgid "User is now '%s'" +msgid "User is now \"%s\"" msgstr "" msgctxt "#30660" @@ -961,15 +961,15 @@ msgid "Switch user" msgstr "" msgctxt "#30665" -msgid "Switch to '%s' now?" +msgid "Switch to \"%s\" now?" msgstr "" msgctxt "#30666" -msgid "%s removed" +msgid "\"%s\" removed" msgstr "" msgctxt "#30667" -msgid "Renamed '%s' to '%s'" +msgid "Renamed \"%s\" to \"%s\"" msgstr "" msgctxt "#30668" @@ -1113,7 +1113,7 @@ msgid "Play with subtitles" msgstr "" msgctxt "#30703" -msgid "Are you sure?" +msgid "" msgstr "" msgctxt "#30704" @@ -1257,7 +1257,7 @@ msgid "" msgstr "" msgctxt "#30739" -msgid "" +msgid "Subscribers" msgstr "" msgctxt "#30740" @@ -1477,11 +1477,11 @@ msgid "Views count display colour" msgstr "" msgctxt "#30794" -msgid "Likes count display colour" +msgid "Subscriber/Likes count display colour" msgstr "" msgctxt "#30795" -msgid "Comments count display colour" +msgid "Videos/Comments count display colour" msgstr "" msgctxt "#30796" @@ -1579,3 +1579,7 @@ msgstr "" msgctxt "#30819" msgid "Play from start" msgstr "" + +msgctxt "#30820" +msgid "Podcast" +msgstr "" diff --git a/plugin.video.youtube/resources/language/resource.language.am_et/strings.po b/plugin.video.youtube/resources/language/resource.language.am_et/strings.po index c15e195f9b..9d48850485 100644 --- a/plugin.video.youtube/resources/language/resource.language.am_et/strings.po +++ b/plugin.video.youtube/resources/language/resource.language.am_et/strings.po @@ -37,7 +37,7 @@ msgstr "" # msgstr "" # Kodion Settings msgctxt "#30000" -msgid "General" +msgid "" msgstr "" msgctxt "#30001" @@ -151,7 +151,7 @@ msgid "Configure %s?" msgstr "" msgctxt "#30031" -msgid "Advanced" +msgid "" msgstr "" msgctxt "#30032" @@ -217,7 +217,7 @@ msgid "Watch Later" msgstr "" msgctxt "#30108" -msgid "Remove" +msgid "" msgstr "" msgctxt "#30109" @@ -237,7 +237,7 @@ msgid "Sign Out" msgstr "" msgctxt "#30113" -msgid "Rename" +msgid "" msgstr "" msgctxt "#30114" @@ -257,7 +257,7 @@ msgid "Remove \"%s\"?" msgstr "" msgctxt "#30118" -msgid "Delete" +msgid "" msgstr "" msgctxt "#30119" @@ -301,11 +301,11 @@ msgstr "" # YouTube # empty strings from id 30206 to 30499 msgctxt "#30500" -msgid "Channels" +msgid "" msgstr "" msgctxt "#30501" -msgid "Playlists" +msgid "" msgstr "" msgctxt "#30502" @@ -361,7 +361,7 @@ msgid "Related Videos" msgstr "" msgctxt "#30515" -msgid "Auto-Remove from 'Watch Later'" +msgid "Auto-Remove from Watch Later" msgstr "" msgctxt "#30516" @@ -385,15 +385,15 @@ msgid "Add to..." msgstr "" msgctxt "#30521" -msgid "Select playlist" +msgid "" msgstr "" msgctxt "#30522" -msgid "New playlist..." +msgid "" msgstr "" msgctxt "#30523" -msgid "Language" +msgid "" msgstr "" msgctxt "#30524" @@ -425,11 +425,11 @@ msgid "I dislike this" msgstr "" msgctxt "#30531" -msgid "Play all" +msgid "" msgstr "" msgctxt "#30532" -msgid "Default" +msgid "" msgstr "" msgctxt "#30533" @@ -437,7 +437,7 @@ msgid "Reverse" msgstr "" msgctxt "#30534" -msgid "Shuffle" +msgid "" msgstr "" msgctxt "#30535" @@ -457,7 +457,7 @@ msgid "Disliked Videos" msgstr "" msgctxt "#30539" -msgid "Live" +msgid "" msgstr "" msgctxt "#30540" @@ -473,7 +473,7 @@ msgid "rtmpe streams are not supported" msgstr "" msgctxt "#30543" -msgid "Refresh" +msgid "" msgstr "" msgctxt "#30544" @@ -485,15 +485,15 @@ msgid "No further links found." msgstr "" msgctxt "#30546" -msgid "Please log in twice!" +msgid "Please complete all login prompts" msgstr "" msgctxt "#30547" -msgid "You must enable two applications so that YouTube is functioning properly." +msgid "You may be prompted to enable two applications so that YouTube is functioning properly." msgstr "" msgctxt "#30548" -msgid "More..." +msgid "" msgstr "" msgctxt "#30549" @@ -501,7 +501,7 @@ msgid "No videos streams found" msgstr "" msgctxt "#30550" -msgid "Region" +msgid "" msgstr "" msgctxt "#30551" @@ -541,15 +541,15 @@ msgid "Delete settings.xml" msgstr "" msgctxt "#30560" -msgid "Subtitle language" +msgid "" msgstr "" msgctxt "#30561" -msgid "None" +msgid "" msgstr "" msgctxt "#30562" -msgid "" +msgid "View all" msgstr "" msgctxt "#30563" @@ -565,7 +565,7 @@ msgid "" msgstr "" msgctxt "#30566" -msgid "Prompt" +msgid "" msgstr "" msgctxt "#30567" @@ -577,11 +577,11 @@ msgid "Remove as Watch Later" msgstr "" msgctxt "#30569" -msgid "Are you sure you want to remove '%s' as your Watch Later list?" +msgid "Are you sure you want to remove \"%s\" as your Watch Later list?" msgstr "" msgctxt "#30570" -msgid "Are you sure you want to replace your current Watch Later list with '%s'?" +msgid "Are you sure you want to replace your current Watch Later list with \"%s\"?" msgstr "" msgctxt "#30571" @@ -593,11 +593,11 @@ msgid "Remove as History" msgstr "" msgctxt "#30573" -msgid "Are you sure you want to remove '%s' as your History list?" +msgid "Are you sure you want to remove \"%s\" as your History list?" msgstr "" msgctxt "#30574" -msgid "Are you sure you want to replace your current History list with '%s'?" +msgid "Are you sure you want to replace your current History list with \"%s\"?" msgstr "" msgctxt "#30575" @@ -609,7 +609,7 @@ msgid "Failed" msgstr "" msgctxt "#30577" -msgid "Settings" +msgid "" msgstr "" msgctxt "#30578" @@ -633,7 +633,7 @@ msgid "Autoplay suggested videos" msgstr "" msgctxt "#30583" -msgid "Automatic" +msgid "" msgstr "" msgctxt "#30584" @@ -693,7 +693,7 @@ msgid "Updated: %s" msgstr "" msgctxt "#30598" -msgid "Personal API keys enabled" +msgid "" msgstr "" msgctxt "#30599" @@ -701,7 +701,7 @@ msgid "Failed to enable personal API keys. Missing: %s" msgstr "" msgctxt "#30600" -msgid "Subtitles" +msgid "" msgstr "" msgctxt "#30601" @@ -761,7 +761,7 @@ msgid "" msgstr "" msgctxt "#30615" -msgid "Cancel" +msgid "" msgstr "" msgctxt "#30616" @@ -777,7 +777,7 @@ msgid "" msgstr "" msgctxt "#30619" -msgid "Port" +msgid "" msgstr "" msgctxt "#30620" @@ -821,7 +821,7 @@ msgid "IP whitelist (comma delimited)" msgstr "" msgctxt "#30630" -msgid "Save" +msgid "" msgstr "" msgctxt "#30631" @@ -937,7 +937,7 @@ msgid "Enter a name for this user" msgstr "" msgctxt "#30659" -msgid "User is now '%s'" +msgid "User is now \"%s\"" msgstr "" msgctxt "#30660" @@ -961,15 +961,15 @@ msgid "Switch user" msgstr "" msgctxt "#30665" -msgid "Switch to '%s' now?" +msgid "Switch to \"%s\" now?" msgstr "" msgctxt "#30666" -msgid "%s removed" +msgid "\"%s\" removed" msgstr "" msgctxt "#30667" -msgid "Renamed '%s' to '%s'" +msgid "Renamed \"%s\" to \"%s\"" msgstr "" msgctxt "#30668" @@ -1113,7 +1113,7 @@ msgid "Play with subtitles" msgstr "" msgctxt "#30703" -msgid "Are you sure?" +msgid "" msgstr "" msgctxt "#30704" @@ -1257,7 +1257,7 @@ msgid "" msgstr "" msgctxt "#30739" -msgid "" +msgid "Subscribers" msgstr "" msgctxt "#30740" @@ -1477,11 +1477,11 @@ msgid "Views count display colour" msgstr "" msgctxt "#30794" -msgid "Likes count display colour" +msgid "Subscriber/Likes count display colour" msgstr "" msgctxt "#30795" -msgid "Comments count display colour" +msgid "Videos/Comments count display colour" msgstr "" msgctxt "#30796" @@ -1579,3 +1579,7 @@ msgstr "" msgctxt "#30819" msgid "Play from start" msgstr "" + +msgctxt "#30820" +msgid "Podcast" +msgstr "" diff --git a/plugin.video.youtube/resources/language/resource.language.ar_sa/strings.po b/plugin.video.youtube/resources/language/resource.language.ar_sa/strings.po index 5d739fc667..b05d61149f 100644 --- a/plugin.video.youtube/resources/language/resource.language.ar_sa/strings.po +++ b/plugin.video.youtube/resources/language/resource.language.ar_sa/strings.po @@ -37,7 +37,7 @@ msgstr "" # msgstr "" # Kodion Settings msgctxt "#30000" -msgid "General" +msgid "" msgstr "" msgctxt "#30001" @@ -151,7 +151,7 @@ msgid "Configure %s?" msgstr "" msgctxt "#30031" -msgid "Advanced" +msgid "" msgstr "" msgctxt "#30032" @@ -217,7 +217,7 @@ msgid "Watch Later" msgstr "" msgctxt "#30108" -msgid "Remove" +msgid "" msgstr "" msgctxt "#30109" @@ -237,7 +237,7 @@ msgid "Sign Out" msgstr "" msgctxt "#30113" -msgid "Rename" +msgid "" msgstr "" msgctxt "#30114" @@ -257,7 +257,7 @@ msgid "Remove \"%s\"?" msgstr "" msgctxt "#30118" -msgid "Delete" +msgid "" msgstr "" msgctxt "#30119" @@ -301,11 +301,11 @@ msgstr "" # YouTube # empty strings from id 30206 to 30499 msgctxt "#30500" -msgid "Channels" +msgid "" msgstr "" msgctxt "#30501" -msgid "Playlists" +msgid "" msgstr "" msgctxt "#30502" @@ -361,7 +361,7 @@ msgid "Related Videos" msgstr "" msgctxt "#30515" -msgid "Auto-Remove from 'Watch Later'" +msgid "Auto-Remove from Watch Later" msgstr "" msgctxt "#30516" @@ -385,15 +385,15 @@ msgid "Add to..." msgstr "" msgctxt "#30521" -msgid "Select playlist" +msgid "" msgstr "" msgctxt "#30522" -msgid "New playlist..." +msgid "" msgstr "" msgctxt "#30523" -msgid "Language" +msgid "" msgstr "" msgctxt "#30524" @@ -425,11 +425,11 @@ msgid "I dislike this" msgstr "" msgctxt "#30531" -msgid "Play all" +msgid "" msgstr "" msgctxt "#30532" -msgid "Default" +msgid "" msgstr "" msgctxt "#30533" @@ -437,7 +437,7 @@ msgid "Reverse" msgstr "" msgctxt "#30534" -msgid "Shuffle" +msgid "" msgstr "" msgctxt "#30535" @@ -457,7 +457,7 @@ msgid "Disliked Videos" msgstr "" msgctxt "#30539" -msgid "Live" +msgid "" msgstr "" msgctxt "#30540" @@ -473,7 +473,7 @@ msgid "rtmpe streams are not supported" msgstr "" msgctxt "#30543" -msgid "Refresh" +msgid "" msgstr "" msgctxt "#30544" @@ -485,15 +485,15 @@ msgid "No further links found." msgstr "" msgctxt "#30546" -msgid "Please log in twice!" +msgid "Please complete all login prompts" msgstr "" msgctxt "#30547" -msgid "You must enable two applications so that YouTube is functioning properly." +msgid "You may be prompted to enable two applications so that YouTube is functioning properly." msgstr "" msgctxt "#30548" -msgid "More..." +msgid "" msgstr "" msgctxt "#30549" @@ -501,7 +501,7 @@ msgid "No videos streams found" msgstr "" msgctxt "#30550" -msgid "Region" +msgid "" msgstr "" msgctxt "#30551" @@ -541,15 +541,15 @@ msgid "Delete settings.xml" msgstr "" msgctxt "#30560" -msgid "Subtitle language" +msgid "" msgstr "" msgctxt "#30561" -msgid "None" +msgid "" msgstr "" msgctxt "#30562" -msgid "" +msgid "View all" msgstr "" msgctxt "#30563" @@ -565,7 +565,7 @@ msgid "" msgstr "" msgctxt "#30566" -msgid "Prompt" +msgid "" msgstr "" msgctxt "#30567" @@ -577,11 +577,11 @@ msgid "Remove as Watch Later" msgstr "" msgctxt "#30569" -msgid "Are you sure you want to remove '%s' as your Watch Later list?" +msgid "Are you sure you want to remove \"%s\" as your Watch Later list?" msgstr "" msgctxt "#30570" -msgid "Are you sure you want to replace your current Watch Later list with '%s'?" +msgid "Are you sure you want to replace your current Watch Later list with \"%s\"?" msgstr "" msgctxt "#30571" @@ -593,11 +593,11 @@ msgid "Remove as History" msgstr "" msgctxt "#30573" -msgid "Are you sure you want to remove '%s' as your History list?" +msgid "Are you sure you want to remove \"%s\" as your History list?" msgstr "" msgctxt "#30574" -msgid "Are you sure you want to replace your current History list with '%s'?" +msgid "Are you sure you want to replace your current History list with \"%s\"?" msgstr "" msgctxt "#30575" @@ -609,7 +609,7 @@ msgid "Failed" msgstr "" msgctxt "#30577" -msgid "Settings" +msgid "" msgstr "" msgctxt "#30578" @@ -633,7 +633,7 @@ msgid "Autoplay suggested videos" msgstr "" msgctxt "#30583" -msgid "Automatic" +msgid "" msgstr "" msgctxt "#30584" @@ -693,7 +693,7 @@ msgid "Updated: %s" msgstr "" msgctxt "#30598" -msgid "Personal API keys enabled" +msgid "" msgstr "" msgctxt "#30599" @@ -701,7 +701,7 @@ msgid "Failed to enable personal API keys. Missing: %s" msgstr "" msgctxt "#30600" -msgid "Subtitles" +msgid "" msgstr "" msgctxt "#30601" @@ -761,7 +761,7 @@ msgid "" msgstr "" msgctxt "#30615" -msgid "Cancel" +msgid "" msgstr "" msgctxt "#30616" @@ -777,7 +777,7 @@ msgid "" msgstr "" msgctxt "#30619" -msgid "Port" +msgid "" msgstr "" msgctxt "#30620" @@ -821,7 +821,7 @@ msgid "IP whitelist (comma delimited)" msgstr "" msgctxt "#30630" -msgid "Save" +msgid "" msgstr "" msgctxt "#30631" @@ -937,7 +937,7 @@ msgid "Enter a name for this user" msgstr "" msgctxt "#30659" -msgid "User is now '%s'" +msgid "User is now \"%s\"" msgstr "" msgctxt "#30660" @@ -961,15 +961,15 @@ msgid "Switch user" msgstr "" msgctxt "#30665" -msgid "Switch to '%s' now?" +msgid "Switch to \"%s\" now?" msgstr "" msgctxt "#30666" -msgid "%s removed" +msgid "\"%s\" removed" msgstr "" msgctxt "#30667" -msgid "Renamed '%s' to '%s'" +msgid "Renamed \"%s\" to \"%s\"" msgstr "" msgctxt "#30668" @@ -1113,7 +1113,7 @@ msgid "Play with subtitles" msgstr "" msgctxt "#30703" -msgid "Are you sure?" +msgid "" msgstr "" msgctxt "#30704" @@ -1257,7 +1257,7 @@ msgid "" msgstr "" msgctxt "#30739" -msgid "" +msgid "Subscribers" msgstr "" msgctxt "#30740" @@ -1477,11 +1477,11 @@ msgid "Views count display colour" msgstr "" msgctxt "#30794" -msgid "Likes count display colour" +msgid "Subscriber/Likes count display colour" msgstr "" msgctxt "#30795" -msgid "Comments count display colour" +msgid "Videos/Comments count display colour" msgstr "" msgctxt "#30796" @@ -1579,3 +1579,7 @@ msgstr "" msgctxt "#30819" msgid "Play from start" msgstr "" + +msgctxt "#30820" +msgid "Podcast" +msgstr "" diff --git a/plugin.video.youtube/resources/language/resource.language.ast_es/strings.po b/plugin.video.youtube/resources/language/resource.language.ast_es/strings.po index 0727a96c7a..0bbc3256b7 100644 --- a/plugin.video.youtube/resources/language/resource.language.ast_es/strings.po +++ b/plugin.video.youtube/resources/language/resource.language.ast_es/strings.po @@ -37,7 +37,7 @@ msgstr "" # msgstr "" # Kodion Settings msgctxt "#30000" -msgid "General" +msgid "" msgstr "" msgctxt "#30001" @@ -151,7 +151,7 @@ msgid "Configure %s?" msgstr "" msgctxt "#30031" -msgid "Advanced" +msgid "" msgstr "" msgctxt "#30032" @@ -217,7 +217,7 @@ msgid "Watch Later" msgstr "" msgctxt "#30108" -msgid "Remove" +msgid "" msgstr "" msgctxt "#30109" @@ -237,7 +237,7 @@ msgid "Sign Out" msgstr "" msgctxt "#30113" -msgid "Rename" +msgid "" msgstr "" msgctxt "#30114" @@ -257,7 +257,7 @@ msgid "Remove \"%s\"?" msgstr "" msgctxt "#30118" -msgid "Delete" +msgid "" msgstr "" msgctxt "#30119" @@ -301,11 +301,11 @@ msgstr "" # YouTube # empty strings from id 30206 to 30499 msgctxt "#30500" -msgid "Channels" +msgid "" msgstr "" msgctxt "#30501" -msgid "Playlists" +msgid "" msgstr "" msgctxt "#30502" @@ -361,7 +361,7 @@ msgid "Related Videos" msgstr "" msgctxt "#30515" -msgid "Auto-Remove from 'Watch Later'" +msgid "Auto-Remove from Watch Later" msgstr "" msgctxt "#30516" @@ -385,15 +385,15 @@ msgid "Add to..." msgstr "" msgctxt "#30521" -msgid "Select playlist" +msgid "" msgstr "" msgctxt "#30522" -msgid "New playlist..." +msgid "" msgstr "" msgctxt "#30523" -msgid "Language" +msgid "" msgstr "" msgctxt "#30524" @@ -425,11 +425,11 @@ msgid "I dislike this" msgstr "" msgctxt "#30531" -msgid "Play all" +msgid "" msgstr "" msgctxt "#30532" -msgid "Default" +msgid "" msgstr "" msgctxt "#30533" @@ -437,7 +437,7 @@ msgid "Reverse" msgstr "" msgctxt "#30534" -msgid "Shuffle" +msgid "" msgstr "" msgctxt "#30535" @@ -457,7 +457,7 @@ msgid "Disliked Videos" msgstr "" msgctxt "#30539" -msgid "Live" +msgid "" msgstr "" msgctxt "#30540" @@ -473,7 +473,7 @@ msgid "rtmpe streams are not supported" msgstr "" msgctxt "#30543" -msgid "Refresh" +msgid "" msgstr "" msgctxt "#30544" @@ -485,15 +485,15 @@ msgid "No further links found." msgstr "" msgctxt "#30546" -msgid "Please log in twice!" +msgid "Please complete all login prompts" msgstr "" msgctxt "#30547" -msgid "You must enable two applications so that YouTube is functioning properly." +msgid "You may be prompted to enable two applications so that YouTube is functioning properly." msgstr "" msgctxt "#30548" -msgid "More..." +msgid "" msgstr "" msgctxt "#30549" @@ -501,7 +501,7 @@ msgid "No videos streams found" msgstr "" msgctxt "#30550" -msgid "Region" +msgid "" msgstr "" msgctxt "#30551" @@ -541,15 +541,15 @@ msgid "Delete settings.xml" msgstr "" msgctxt "#30560" -msgid "Subtitle language" +msgid "" msgstr "" msgctxt "#30561" -msgid "None" +msgid "" msgstr "" msgctxt "#30562" -msgid "" +msgid "View all" msgstr "" msgctxt "#30563" @@ -565,7 +565,7 @@ msgid "" msgstr "" msgctxt "#30566" -msgid "Prompt" +msgid "" msgstr "" msgctxt "#30567" @@ -577,11 +577,11 @@ msgid "Remove as Watch Later" msgstr "" msgctxt "#30569" -msgid "Are you sure you want to remove '%s' as your Watch Later list?" +msgid "Are you sure you want to remove \"%s\" as your Watch Later list?" msgstr "" msgctxt "#30570" -msgid "Are you sure you want to replace your current Watch Later list with '%s'?" +msgid "Are you sure you want to replace your current Watch Later list with \"%s\"?" msgstr "" msgctxt "#30571" @@ -593,11 +593,11 @@ msgid "Remove as History" msgstr "" msgctxt "#30573" -msgid "Are you sure you want to remove '%s' as your History list?" +msgid "Are you sure you want to remove \"%s\" as your History list?" msgstr "" msgctxt "#30574" -msgid "Are you sure you want to replace your current History list with '%s'?" +msgid "Are you sure you want to replace your current History list with \"%s\"?" msgstr "" msgctxt "#30575" @@ -609,7 +609,7 @@ msgid "Failed" msgstr "" msgctxt "#30577" -msgid "Settings" +msgid "" msgstr "" msgctxt "#30578" @@ -633,7 +633,7 @@ msgid "Autoplay suggested videos" msgstr "" msgctxt "#30583" -msgid "Automatic" +msgid "" msgstr "" msgctxt "#30584" @@ -693,7 +693,7 @@ msgid "Updated: %s" msgstr "" msgctxt "#30598" -msgid "Personal API keys enabled" +msgid "" msgstr "" msgctxt "#30599" @@ -701,7 +701,7 @@ msgid "Failed to enable personal API keys. Missing: %s" msgstr "" msgctxt "#30600" -msgid "Subtitles" +msgid "" msgstr "" msgctxt "#30601" @@ -761,7 +761,7 @@ msgid "" msgstr "" msgctxt "#30615" -msgid "Cancel" +msgid "" msgstr "" msgctxt "#30616" @@ -777,7 +777,7 @@ msgid "" msgstr "" msgctxt "#30619" -msgid "Port" +msgid "" msgstr "" msgctxt "#30620" @@ -821,7 +821,7 @@ msgid "IP whitelist (comma delimited)" msgstr "" msgctxt "#30630" -msgid "Save" +msgid "" msgstr "" msgctxt "#30631" @@ -937,7 +937,7 @@ msgid "Enter a name for this user" msgstr "" msgctxt "#30659" -msgid "User is now '%s'" +msgid "User is now \"%s\"" msgstr "" msgctxt "#30660" @@ -961,15 +961,15 @@ msgid "Switch user" msgstr "" msgctxt "#30665" -msgid "Switch to '%s' now?" +msgid "Switch to \"%s\" now?" msgstr "" msgctxt "#30666" -msgid "%s removed" +msgid "\"%s\" removed" msgstr "" msgctxt "#30667" -msgid "Renamed '%s' to '%s'" +msgid "Renamed \"%s\" to \"%s\"" msgstr "" msgctxt "#30668" @@ -1113,7 +1113,7 @@ msgid "Play with subtitles" msgstr "" msgctxt "#30703" -msgid "Are you sure?" +msgid "" msgstr "" msgctxt "#30704" @@ -1257,7 +1257,7 @@ msgid "" msgstr "" msgctxt "#30739" -msgid "" +msgid "Subscribers" msgstr "" msgctxt "#30740" @@ -1477,11 +1477,11 @@ msgid "Views count display colour" msgstr "" msgctxt "#30794" -msgid "Likes count display colour" +msgid "Subscriber/Likes count display colour" msgstr "" msgctxt "#30795" -msgid "Comments count display colour" +msgid "Videos/Comments count display colour" msgstr "" msgctxt "#30796" @@ -1579,3 +1579,7 @@ msgstr "" msgctxt "#30819" msgid "Play from start" msgstr "" + +msgctxt "#30820" +msgid "Podcast" +msgstr "" diff --git a/plugin.video.youtube/resources/language/resource.language.az_az/strings.po b/plugin.video.youtube/resources/language/resource.language.az_az/strings.po index f444a1f9d4..edb0dfb238 100644 --- a/plugin.video.youtube/resources/language/resource.language.az_az/strings.po +++ b/plugin.video.youtube/resources/language/resource.language.az_az/strings.po @@ -37,7 +37,7 @@ msgstr "" # msgstr "" # Kodion Settings msgctxt "#30000" -msgid "General" +msgid "" msgstr "" msgctxt "#30001" @@ -151,7 +151,7 @@ msgid "Configure %s?" msgstr "" msgctxt "#30031" -msgid "Advanced" +msgid "" msgstr "" msgctxt "#30032" @@ -217,7 +217,7 @@ msgid "Watch Later" msgstr "" msgctxt "#30108" -msgid "Remove" +msgid "" msgstr "" msgctxt "#30109" @@ -237,7 +237,7 @@ msgid "Sign Out" msgstr "" msgctxt "#30113" -msgid "Rename" +msgid "" msgstr "" msgctxt "#30114" @@ -257,7 +257,7 @@ msgid "Remove \"%s\"?" msgstr "" msgctxt "#30118" -msgid "Delete" +msgid "" msgstr "" msgctxt "#30119" @@ -301,11 +301,11 @@ msgstr "" # YouTube # empty strings from id 30206 to 30499 msgctxt "#30500" -msgid "Channels" +msgid "" msgstr "" msgctxt "#30501" -msgid "Playlists" +msgid "" msgstr "" msgctxt "#30502" @@ -361,7 +361,7 @@ msgid "Related Videos" msgstr "" msgctxt "#30515" -msgid "Auto-Remove from 'Watch Later'" +msgid "Auto-Remove from Watch Later" msgstr "" msgctxt "#30516" @@ -385,15 +385,15 @@ msgid "Add to..." msgstr "" msgctxt "#30521" -msgid "Select playlist" +msgid "" msgstr "" msgctxt "#30522" -msgid "New playlist..." +msgid "" msgstr "" msgctxt "#30523" -msgid "Language" +msgid "" msgstr "" msgctxt "#30524" @@ -425,11 +425,11 @@ msgid "I dislike this" msgstr "" msgctxt "#30531" -msgid "Play all" +msgid "" msgstr "" msgctxt "#30532" -msgid "Default" +msgid "" msgstr "" msgctxt "#30533" @@ -437,7 +437,7 @@ msgid "Reverse" msgstr "" msgctxt "#30534" -msgid "Shuffle" +msgid "" msgstr "" msgctxt "#30535" @@ -457,7 +457,7 @@ msgid "Disliked Videos" msgstr "" msgctxt "#30539" -msgid "Live" +msgid "" msgstr "" msgctxt "#30540" @@ -473,7 +473,7 @@ msgid "rtmpe streams are not supported" msgstr "" msgctxt "#30543" -msgid "Refresh" +msgid "" msgstr "" msgctxt "#30544" @@ -485,15 +485,15 @@ msgid "No further links found." msgstr "" msgctxt "#30546" -msgid "Please log in twice!" +msgid "Please complete all login prompts" msgstr "" msgctxt "#30547" -msgid "You must enable two applications so that YouTube is functioning properly." +msgid "You may be prompted to enable two applications so that YouTube is functioning properly." msgstr "" msgctxt "#30548" -msgid "More..." +msgid "" msgstr "" msgctxt "#30549" @@ -501,7 +501,7 @@ msgid "No videos streams found" msgstr "" msgctxt "#30550" -msgid "Region" +msgid "" msgstr "" msgctxt "#30551" @@ -541,15 +541,15 @@ msgid "Delete settings.xml" msgstr "" msgctxt "#30560" -msgid "Subtitle language" +msgid "" msgstr "" msgctxt "#30561" -msgid "None" +msgid "" msgstr "" msgctxt "#30562" -msgid "" +msgid "View all" msgstr "" msgctxt "#30563" @@ -565,7 +565,7 @@ msgid "" msgstr "" msgctxt "#30566" -msgid "Prompt" +msgid "" msgstr "" msgctxt "#30567" @@ -577,11 +577,11 @@ msgid "Remove as Watch Later" msgstr "" msgctxt "#30569" -msgid "Are you sure you want to remove '%s' as your Watch Later list?" +msgid "Are you sure you want to remove \"%s\" as your Watch Later list?" msgstr "" msgctxt "#30570" -msgid "Are you sure you want to replace your current Watch Later list with '%s'?" +msgid "Are you sure you want to replace your current Watch Later list with \"%s\"?" msgstr "" msgctxt "#30571" @@ -593,11 +593,11 @@ msgid "Remove as History" msgstr "" msgctxt "#30573" -msgid "Are you sure you want to remove '%s' as your History list?" +msgid "Are you sure you want to remove \"%s\" as your History list?" msgstr "" msgctxt "#30574" -msgid "Are you sure you want to replace your current History list with '%s'?" +msgid "Are you sure you want to replace your current History list with \"%s\"?" msgstr "" msgctxt "#30575" @@ -609,7 +609,7 @@ msgid "Failed" msgstr "" msgctxt "#30577" -msgid "Settings" +msgid "" msgstr "" msgctxt "#30578" @@ -633,7 +633,7 @@ msgid "Autoplay suggested videos" msgstr "" msgctxt "#30583" -msgid "Automatic" +msgid "" msgstr "" msgctxt "#30584" @@ -693,7 +693,7 @@ msgid "Updated: %s" msgstr "" msgctxt "#30598" -msgid "Personal API keys enabled" +msgid "" msgstr "" msgctxt "#30599" @@ -701,7 +701,7 @@ msgid "Failed to enable personal API keys. Missing: %s" msgstr "" msgctxt "#30600" -msgid "Subtitles" +msgid "" msgstr "" msgctxt "#30601" @@ -761,7 +761,7 @@ msgid "" msgstr "" msgctxt "#30615" -msgid "Cancel" +msgid "" msgstr "" msgctxt "#30616" @@ -777,7 +777,7 @@ msgid "" msgstr "" msgctxt "#30619" -msgid "Port" +msgid "" msgstr "" msgctxt "#30620" @@ -821,7 +821,7 @@ msgid "IP whitelist (comma delimited)" msgstr "" msgctxt "#30630" -msgid "Save" +msgid "" msgstr "" msgctxt "#30631" @@ -937,7 +937,7 @@ msgid "Enter a name for this user" msgstr "" msgctxt "#30659" -msgid "User is now '%s'" +msgid "User is now \"%s\"" msgstr "" msgctxt "#30660" @@ -961,15 +961,15 @@ msgid "Switch user" msgstr "" msgctxt "#30665" -msgid "Switch to '%s' now?" +msgid "Switch to \"%s\" now?" msgstr "" msgctxt "#30666" -msgid "%s removed" +msgid "\"%s\" removed" msgstr "" msgctxt "#30667" -msgid "Renamed '%s' to '%s'" +msgid "Renamed \"%s\" to \"%s\"" msgstr "" msgctxt "#30668" @@ -1113,7 +1113,7 @@ msgid "Play with subtitles" msgstr "" msgctxt "#30703" -msgid "Are you sure?" +msgid "" msgstr "" msgctxt "#30704" @@ -1257,7 +1257,7 @@ msgid "" msgstr "" msgctxt "#30739" -msgid "" +msgid "Subscribers" msgstr "" msgctxt "#30740" @@ -1477,11 +1477,11 @@ msgid "Views count display colour" msgstr "" msgctxt "#30794" -msgid "Likes count display colour" +msgid "Subscriber/Likes count display colour" msgstr "" msgctxt "#30795" -msgid "Comments count display colour" +msgid "Videos/Comments count display colour" msgstr "" msgctxt "#30796" @@ -1579,3 +1579,7 @@ msgstr "" msgctxt "#30819" msgid "Play from start" msgstr "" + +msgctxt "#30820" +msgid "Podcast" +msgstr "" diff --git a/plugin.video.youtube/resources/language/resource.language.be_by/strings.po b/plugin.video.youtube/resources/language/resource.language.be_by/strings.po index 3f0c181406..de77dc99e6 100644 --- a/plugin.video.youtube/resources/language/resource.language.be_by/strings.po +++ b/plugin.video.youtube/resources/language/resource.language.be_by/strings.po @@ -37,8 +37,8 @@ msgstr "" # msgstr "" # Kodion Settings msgctxt "#30000" -msgid "General" -msgstr "Асноўныя" +msgid "" +msgstr "" msgctxt "#30001" msgid "" @@ -151,7 +151,7 @@ msgid "Configure %s?" msgstr "" msgctxt "#30031" -msgid "Advanced" +msgid "" msgstr "" msgctxt "#30032" @@ -217,7 +217,7 @@ msgid "Watch Later" msgstr "" msgctxt "#30108" -msgid "Remove" +msgid "" msgstr "" msgctxt "#30109" @@ -237,7 +237,7 @@ msgid "Sign Out" msgstr "" msgctxt "#30113" -msgid "Rename" +msgid "" msgstr "" msgctxt "#30114" @@ -257,7 +257,7 @@ msgid "Remove \"%s\"?" msgstr "" msgctxt "#30118" -msgid "Delete" +msgid "" msgstr "" msgctxt "#30119" @@ -301,11 +301,11 @@ msgstr "" # YouTube # empty strings from id 30206 to 30499 msgctxt "#30500" -msgid "Channels" +msgid "" msgstr "" msgctxt "#30501" -msgid "Playlists" +msgid "" msgstr "" msgctxt "#30502" @@ -361,7 +361,7 @@ msgid "Related Videos" msgstr "" msgctxt "#30515" -msgid "Auto-Remove from 'Watch Later'" +msgid "Auto-Remove from Watch Later" msgstr "" msgctxt "#30516" @@ -385,15 +385,15 @@ msgid "Add to..." msgstr "" msgctxt "#30521" -msgid "Select playlist" +msgid "" msgstr "" msgctxt "#30522" -msgid "New playlist..." +msgid "" msgstr "" msgctxt "#30523" -msgid "Language" +msgid "" msgstr "" msgctxt "#30524" @@ -425,11 +425,11 @@ msgid "I dislike this" msgstr "" msgctxt "#30531" -msgid "Play all" +msgid "" msgstr "" msgctxt "#30532" -msgid "Default" +msgid "" msgstr "" msgctxt "#30533" @@ -437,7 +437,7 @@ msgid "Reverse" msgstr "" msgctxt "#30534" -msgid "Shuffle" +msgid "" msgstr "" msgctxt "#30535" @@ -457,7 +457,7 @@ msgid "Disliked Videos" msgstr "" msgctxt "#30539" -msgid "Live" +msgid "" msgstr "" msgctxt "#30540" @@ -473,7 +473,7 @@ msgid "rtmpe streams are not supported" msgstr "" msgctxt "#30543" -msgid "Refresh" +msgid "" msgstr "" msgctxt "#30544" @@ -485,15 +485,15 @@ msgid "No further links found." msgstr "" msgctxt "#30546" -msgid "Please log in twice!" +msgid "Please complete all login prompts" msgstr "" msgctxt "#30547" -msgid "You must enable two applications so that YouTube is functioning properly." +msgid "You may be prompted to enable two applications so that YouTube is functioning properly." msgstr "" msgctxt "#30548" -msgid "More..." +msgid "" msgstr "" msgctxt "#30549" @@ -501,7 +501,7 @@ msgid "No videos streams found" msgstr "" msgctxt "#30550" -msgid "Region" +msgid "" msgstr "" msgctxt "#30551" @@ -541,15 +541,15 @@ msgid "Delete settings.xml" msgstr "" msgctxt "#30560" -msgid "Subtitle language" +msgid "" msgstr "" msgctxt "#30561" -msgid "None" +msgid "" msgstr "" msgctxt "#30562" -msgid "" +msgid "View all" msgstr "" msgctxt "#30563" @@ -565,7 +565,7 @@ msgid "" msgstr "" msgctxt "#30566" -msgid "Prompt" +msgid "" msgstr "" msgctxt "#30567" @@ -577,11 +577,11 @@ msgid "Remove as Watch Later" msgstr "" msgctxt "#30569" -msgid "Are you sure you want to remove '%s' as your Watch Later list?" +msgid "Are you sure you want to remove \"%s\" as your Watch Later list?" msgstr "" msgctxt "#30570" -msgid "Are you sure you want to replace your current Watch Later list with '%s'?" +msgid "Are you sure you want to replace your current Watch Later list with \"%s\"?" msgstr "" msgctxt "#30571" @@ -593,11 +593,11 @@ msgid "Remove as History" msgstr "" msgctxt "#30573" -msgid "Are you sure you want to remove '%s' as your History list?" +msgid "Are you sure you want to remove \"%s\" as your History list?" msgstr "" msgctxt "#30574" -msgid "Are you sure you want to replace your current History list with '%s'?" +msgid "Are you sure you want to replace your current History list with \"%s\"?" msgstr "" msgctxt "#30575" @@ -609,7 +609,7 @@ msgid "Failed" msgstr "" msgctxt "#30577" -msgid "Settings" +msgid "" msgstr "" msgctxt "#30578" @@ -633,7 +633,7 @@ msgid "Autoplay suggested videos" msgstr "" msgctxt "#30583" -msgid "Automatic" +msgid "" msgstr "" msgctxt "#30584" @@ -693,7 +693,7 @@ msgid "Updated: %s" msgstr "" msgctxt "#30598" -msgid "Personal API keys enabled" +msgid "" msgstr "" msgctxt "#30599" @@ -701,7 +701,7 @@ msgid "Failed to enable personal API keys. Missing: %s" msgstr "" msgctxt "#30600" -msgid "Subtitles" +msgid "" msgstr "" msgctxt "#30601" @@ -761,7 +761,7 @@ msgid "" msgstr "" msgctxt "#30615" -msgid "Cancel" +msgid "" msgstr "" msgctxt "#30616" @@ -777,7 +777,7 @@ msgid "" msgstr "" msgctxt "#30619" -msgid "Port" +msgid "" msgstr "" msgctxt "#30620" @@ -821,7 +821,7 @@ msgid "IP whitelist (comma delimited)" msgstr "" msgctxt "#30630" -msgid "Save" +msgid "" msgstr "" msgctxt "#30631" @@ -937,7 +937,7 @@ msgid "Enter a name for this user" msgstr "" msgctxt "#30659" -msgid "User is now '%s'" +msgid "User is now \"%s\"" msgstr "" msgctxt "#30660" @@ -961,15 +961,15 @@ msgid "Switch user" msgstr "" msgctxt "#30665" -msgid "Switch to '%s' now?" +msgid "Switch to \"%s\" now?" msgstr "" msgctxt "#30666" -msgid "%s removed" +msgid "\"%s\" removed" msgstr "" msgctxt "#30667" -msgid "Renamed '%s' to '%s'" +msgid "Renamed \"%s\" to \"%s\"" msgstr "" msgctxt "#30668" @@ -1113,7 +1113,7 @@ msgid "Play with subtitles" msgstr "" msgctxt "#30703" -msgid "Are you sure?" +msgid "" msgstr "" msgctxt "#30704" @@ -1257,7 +1257,7 @@ msgid "" msgstr "" msgctxt "#30739" -msgid "" +msgid "Subscribers" msgstr "" msgctxt "#30740" @@ -1477,11 +1477,11 @@ msgid "Views count display colour" msgstr "" msgctxt "#30794" -msgid "Likes count display colour" +msgid "Subscriber/Likes count display colour" msgstr "" msgctxt "#30795" -msgid "Comments count display colour" +msgid "Videos/Comments count display colour" msgstr "" msgctxt "#30796" @@ -1579,3 +1579,18 @@ msgstr "" msgctxt "#30819" msgid "Play from start" msgstr "" + +msgctxt "#30820" +msgid "Podcast" +msgstr "" + +# msgctxt "Addon Summary" +# msgid "Plugin for YouTube" +# msgstr "" +# msgctxt "Addon Description" +# msgid "YouTube is a one of the biggest video-sharing websites of the world." +# msgstr "" +# Kodion Settings +#~ msgctxt "#30000" +#~ msgid "General" +#~ msgstr "Асноўныя" diff --git a/plugin.video.youtube/resources/language/resource.language.bg_bg/strings.po b/plugin.video.youtube/resources/language/resource.language.bg_bg/strings.po index 977a22a9a9..559bb8d3a7 100644 --- a/plugin.video.youtube/resources/language/resource.language.bg_bg/strings.po +++ b/plugin.video.youtube/resources/language/resource.language.bg_bg/strings.po @@ -31,13 +31,14 @@ msgstr "" # msgctxt "Addon Summary" # msgid "Plugin for YouTube" -# msgstr "Добавка за YouTube" +# msgstr "" # msgctxt "Addon Description" # msgid "YouTube is a one of the biggest video-sharing websites of the world." -# msgstr "YouTube е един от най-големите уеб сайтове за споделяне на видео в целия свят." +# msgstr "" +# Kodion Settings msgctxt "#30000" -msgid "General" -msgstr "Общи" +msgid "" +msgstr "" msgctxt "#30001" msgid "" @@ -149,8 +150,8 @@ msgid "Configure %s?" msgstr "" msgctxt "#30031" -msgid "Advanced" -msgstr "Допълнителни" +msgid "" +msgstr "" msgctxt "#30032" msgid "View: TV Shows" @@ -215,8 +216,8 @@ msgid "Watch Later" msgstr "За гледане по-късно" msgctxt "#30108" -msgid "Remove" -msgstr "Премахни" +msgid "" +msgstr "" msgctxt "#30109" msgid "" @@ -235,8 +236,8 @@ msgid "Sign Out" msgstr "Изход" msgctxt "#30113" -msgid "Rename" -msgstr "Преименуване" +msgid "" +msgstr "" msgctxt "#30114" msgid "Confirm delete" @@ -255,8 +256,8 @@ msgid "Remove \"%s\"?" msgstr "Премахване на \"%s\"?" msgctxt "#30118" -msgid "Delete" -msgstr "Изтрий" +msgid "" +msgstr "" msgctxt "#30119" msgid "Please wait..." @@ -299,12 +300,12 @@ msgstr "" # YouTube # empty strings from id 30206 to 30499 msgctxt "#30500" -msgid "Channels" -msgstr "Канали" +msgid "" +msgstr "" msgctxt "#30501" -msgid "Playlists" -msgstr "Плейлисти" +msgid "" +msgstr "" msgctxt "#30502" msgid "Go to %s" @@ -359,8 +360,8 @@ msgid "Related Videos" msgstr "Сродни видеоклипове" msgctxt "#30515" -msgid "Auto-Remove from 'Watch Later'" -msgstr "Премахвай автоматично от 'Watch Later'" +msgid "Auto-Remove from Watch Later" +msgstr "" msgctxt "#30516" msgid "Folders" @@ -383,16 +384,16 @@ msgid "Add to..." msgstr "Добавяне към..." msgctxt "#30521" -msgid "Select playlist" -msgstr "Създаване на плейлист" +msgid "" +msgstr "" msgctxt "#30522" -msgid "New playlist..." -msgstr "Нов плейлист..." +msgid "" +msgstr "" msgctxt "#30523" -msgid "Language" -msgstr "Език" +msgid "" +msgstr "" msgctxt "#30524" msgid "Select language" @@ -423,20 +424,20 @@ msgid "I dislike this" msgstr "Това не ми харесва" msgctxt "#30531" -msgid "Play all" -msgstr "Пускане на всички" +msgid "" +msgstr "" msgctxt "#30532" -msgid "Default" -msgstr "Стандартно" +msgid "" +msgstr "" msgctxt "#30533" msgid "Reverse" msgstr "Обръщане" msgctxt "#30534" -msgid "Shuffle" -msgstr "Разбъркване" +msgid "" +msgstr "" msgctxt "#30535" msgid "Select the order of the playlist" @@ -455,8 +456,8 @@ msgid "Disliked Videos" msgstr "Нехаресани видеоклипове" msgctxt "#30539" -msgid "Live" -msgstr "На живо" +msgid "" +msgstr "" msgctxt "#30540" msgid "Play with..." @@ -471,8 +472,8 @@ msgid "rtmpe streams are not supported" msgstr "Потоци тип rtmpe не се поддържат" msgctxt "#30543" -msgid "Refresh" -msgstr "Опресни" +msgid "" +msgstr "" msgctxt "#30544" msgid "More Links from the description" @@ -483,24 +484,24 @@ msgid "No further links found." msgstr "Не са намерени повече връзки." msgctxt "#30546" -msgid "Please log in twice!" -msgstr "Моля, влезте два пъти!" +msgid "Please complete all login prompts" +msgstr "" msgctxt "#30547" -msgid "You must enable two applications so that YouTube is functioning properly." -msgstr "За да функционира добавката YouTube е необходимо да се активират две програми." +msgid "You may be prompted to enable two applications so that YouTube is functioning properly." +msgstr "" msgctxt "#30548" -msgid "More..." -msgstr "Още..." +msgid "" +msgstr "" msgctxt "#30549" msgid "No videos streams found" msgstr "Не са открити видео потоци" msgctxt "#30550" -msgid "Region" -msgstr "държава" +msgid "" +msgstr "" msgctxt "#30551" msgid "Recommendations" @@ -539,15 +540,15 @@ msgid "Delete settings.xml" msgstr "" msgctxt "#30560" -msgid "Subtitle language" +msgid "" msgstr "" msgctxt "#30561" -msgid "None" +msgid "" msgstr "" msgctxt "#30562" -msgid "" +msgid "View all" msgstr "" msgctxt "#30563" @@ -563,7 +564,7 @@ msgid "" msgstr "" msgctxt "#30566" -msgid "Prompt" +msgid "" msgstr "" msgctxt "#30567" @@ -575,11 +576,11 @@ msgid "Remove as Watch Later" msgstr "" msgctxt "#30569" -msgid "Are you sure you want to remove '%s' as your Watch Later list?" +msgid "Are you sure you want to remove \"%s\" as your Watch Later list?" msgstr "" msgctxt "#30570" -msgid "Are you sure you want to replace your current Watch Later list with '%s'?" +msgid "Are you sure you want to replace your current Watch Later list with \"%s\"?" msgstr "" msgctxt "#30571" @@ -591,11 +592,11 @@ msgid "Remove as History" msgstr "" msgctxt "#30573" -msgid "Are you sure you want to remove '%s' as your History list?" +msgid "Are you sure you want to remove \"%s\" as your History list?" msgstr "" msgctxt "#30574" -msgid "Are you sure you want to replace your current History list with '%s'?" +msgid "Are you sure you want to replace your current History list with \"%s\"?" msgstr "" msgctxt "#30575" @@ -607,7 +608,7 @@ msgid "Failed" msgstr "" msgctxt "#30577" -msgid "Settings" +msgid "" msgstr "" msgctxt "#30578" @@ -631,7 +632,7 @@ msgid "Autoplay suggested videos" msgstr "" msgctxt "#30583" -msgid "Automatic" +msgid "" msgstr "" msgctxt "#30584" @@ -691,7 +692,7 @@ msgid "Updated: %s" msgstr "" msgctxt "#30598" -msgid "Personal API keys enabled" +msgid "" msgstr "" msgctxt "#30599" @@ -699,7 +700,7 @@ msgid "Failed to enable personal API keys. Missing: %s" msgstr "" msgctxt "#30600" -msgid "Subtitles" +msgid "" msgstr "" msgctxt "#30601" @@ -759,7 +760,7 @@ msgid "" msgstr "" msgctxt "#30615" -msgid "Cancel" +msgid "" msgstr "" msgctxt "#30616" @@ -775,7 +776,7 @@ msgid "" msgstr "" msgctxt "#30619" -msgid "Port" +msgid "" msgstr "" msgctxt "#30620" @@ -819,7 +820,7 @@ msgid "IP whitelist (comma delimited)" msgstr "" msgctxt "#30630" -msgid "Save" +msgid "" msgstr "" msgctxt "#30631" @@ -935,7 +936,7 @@ msgid "Enter a name for this user" msgstr "" msgctxt "#30659" -msgid "User is now '%s'" +msgid "User is now \"%s\"" msgstr "" msgctxt "#30660" @@ -959,15 +960,15 @@ msgid "Switch user" msgstr "" msgctxt "#30665" -msgid "Switch to '%s' now?" +msgid "Switch to \"%s\" now?" msgstr "" msgctxt "#30666" -msgid "%s removed" +msgid "\"%s\" removed" msgstr "" msgctxt "#30667" -msgid "Renamed '%s' to '%s'" +msgid "Renamed \"%s\" to \"%s\"" msgstr "" msgctxt "#30668" @@ -1111,7 +1112,7 @@ msgid "Play with subtitles" msgstr "" msgctxt "#30703" -msgid "Are you sure?" +msgid "" msgstr "" msgctxt "#30704" @@ -1255,7 +1256,7 @@ msgid "" msgstr "" msgctxt "#30739" -msgid "" +msgid "Subscribers" msgstr "" msgctxt "#30740" @@ -1475,11 +1476,11 @@ msgid "Views count display colour" msgstr "" msgctxt "#30794" -msgid "Likes count display colour" +msgid "Subscriber/Likes count display colour" msgstr "" msgctxt "#30795" -msgid "Comments count display colour" +msgid "Videos/Comments count display colour" msgstr "" msgctxt "#30796" @@ -1578,6 +1579,98 @@ msgctxt "#30819" msgid "Play from start" msgstr "" +msgctxt "#30820" +msgid "Podcast" +msgstr "" + +#~ msgctxt "#30515" +#~ msgid "Auto-Remove from 'Watch Later'" +#~ msgstr "Премахвай автоматично от 'Watch Later'" + +# msgctxt "Addon Summary" +# msgid "Plugin for YouTube" +# msgstr "Добавка за YouTube" +# msgctxt "Addon Description" +# msgid "YouTube is a one of the biggest video-sharing websites of the world." +# msgstr "YouTube е един от най-големите уеб сайтове за споделяне на видео в целия свят." +#~ msgctxt "#30000" +#~ msgid "General" +#~ msgstr "Общи" + +#~ msgctxt "#30031" +#~ msgid "Advanced" +#~ msgstr "Допълнителни" + +#~ msgctxt "#30108" +#~ msgid "Remove" +#~ msgstr "Премахни" + +#~ msgctxt "#30113" +#~ msgid "Rename" +#~ msgstr "Преименуване" + +#~ msgctxt "#30118" +#~ msgid "Delete" +#~ msgstr "Изтрий" + +# YouTube +# empty strings from id 30206 to 30499 +#~ msgctxt "#30500" +#~ msgid "Channels" +#~ msgstr "Канали" + +#~ msgctxt "#30501" +#~ msgid "Playlists" +#~ msgstr "Плейлисти" + +#~ msgctxt "#30521" +#~ msgid "Select playlist" +#~ msgstr "Създаване на плейлист" + +#~ msgctxt "#30522" +#~ msgid "New playlist..." +#~ msgstr "Нов плейлист..." + +#~ msgctxt "#30523" +#~ msgid "Language" +#~ msgstr "Език" + +#~ msgctxt "#30531" +#~ msgid "Play all" +#~ msgstr "Пускане на всички" + +#~ msgctxt "#30532" +#~ msgid "Default" +#~ msgstr "Стандартно" + +#~ msgctxt "#30534" +#~ msgid "Shuffle" +#~ msgstr "Разбъркване" + +#~ msgctxt "#30539" +#~ msgid "Live" +#~ msgstr "На живо" + +#~ msgctxt "#30543" +#~ msgid "Refresh" +#~ msgstr "Опресни" + +#~ msgctxt "#30548" +#~ msgid "More..." +#~ msgstr "Още..." + +#~ msgctxt "#30550" +#~ msgid "Region" +#~ msgstr "държава" + +#~ msgctxt "#30546" +#~ msgid "Please log in twice!" +#~ msgstr "Моля, влезте два пъти!" + +#~ msgctxt "#30547" +#~ msgid "You must enable two applications so that YouTube is functioning properly." +#~ msgstr "За да функционира добавката YouTube е необходимо да се активират две програми." + #~ msgctxt "#30001" #~ msgid "Username" #~ msgstr "Потребител" diff --git a/plugin.video.youtube/resources/language/resource.language.bs_ba/strings.po b/plugin.video.youtube/resources/language/resource.language.bs_ba/strings.po index 6325c8f82e..a69e23adec 100644 --- a/plugin.video.youtube/resources/language/resource.language.bs_ba/strings.po +++ b/plugin.video.youtube/resources/language/resource.language.bs_ba/strings.po @@ -37,7 +37,7 @@ msgstr "" # msgstr "" # Kodion Settings msgctxt "#30000" -msgid "General" +msgid "" msgstr "" msgctxt "#30001" @@ -151,7 +151,7 @@ msgid "Configure %s?" msgstr "" msgctxt "#30031" -msgid "Advanced" +msgid "" msgstr "" msgctxt "#30032" @@ -217,7 +217,7 @@ msgid "Watch Later" msgstr "" msgctxt "#30108" -msgid "Remove" +msgid "" msgstr "" msgctxt "#30109" @@ -237,7 +237,7 @@ msgid "Sign Out" msgstr "" msgctxt "#30113" -msgid "Rename" +msgid "" msgstr "" msgctxt "#30114" @@ -257,7 +257,7 @@ msgid "Remove \"%s\"?" msgstr "" msgctxt "#30118" -msgid "Delete" +msgid "" msgstr "" msgctxt "#30119" @@ -301,11 +301,11 @@ msgstr "" # YouTube # empty strings from id 30206 to 30499 msgctxt "#30500" -msgid "Channels" +msgid "" msgstr "" msgctxt "#30501" -msgid "Playlists" +msgid "" msgstr "" msgctxt "#30502" @@ -361,7 +361,7 @@ msgid "Related Videos" msgstr "" msgctxt "#30515" -msgid "Auto-Remove from 'Watch Later'" +msgid "Auto-Remove from Watch Later" msgstr "" msgctxt "#30516" @@ -385,15 +385,15 @@ msgid "Add to..." msgstr "" msgctxt "#30521" -msgid "Select playlist" +msgid "" msgstr "" msgctxt "#30522" -msgid "New playlist..." +msgid "" msgstr "" msgctxt "#30523" -msgid "Language" +msgid "" msgstr "" msgctxt "#30524" @@ -425,11 +425,11 @@ msgid "I dislike this" msgstr "" msgctxt "#30531" -msgid "Play all" +msgid "" msgstr "" msgctxt "#30532" -msgid "Default" +msgid "" msgstr "" msgctxt "#30533" @@ -437,7 +437,7 @@ msgid "Reverse" msgstr "" msgctxt "#30534" -msgid "Shuffle" +msgid "" msgstr "" msgctxt "#30535" @@ -457,7 +457,7 @@ msgid "Disliked Videos" msgstr "" msgctxt "#30539" -msgid "Live" +msgid "" msgstr "" msgctxt "#30540" @@ -473,7 +473,7 @@ msgid "rtmpe streams are not supported" msgstr "" msgctxt "#30543" -msgid "Refresh" +msgid "" msgstr "" msgctxt "#30544" @@ -485,15 +485,15 @@ msgid "No further links found." msgstr "" msgctxt "#30546" -msgid "Please log in twice!" +msgid "Please complete all login prompts" msgstr "" msgctxt "#30547" -msgid "You must enable two applications so that YouTube is functioning properly." +msgid "You may be prompted to enable two applications so that YouTube is functioning properly." msgstr "" msgctxt "#30548" -msgid "More..." +msgid "" msgstr "" msgctxt "#30549" @@ -501,7 +501,7 @@ msgid "No videos streams found" msgstr "" msgctxt "#30550" -msgid "Region" +msgid "" msgstr "" msgctxt "#30551" @@ -541,15 +541,15 @@ msgid "Delete settings.xml" msgstr "" msgctxt "#30560" -msgid "Subtitle language" +msgid "" msgstr "" msgctxt "#30561" -msgid "None" +msgid "" msgstr "" msgctxt "#30562" -msgid "" +msgid "View all" msgstr "" msgctxt "#30563" @@ -565,7 +565,7 @@ msgid "" msgstr "" msgctxt "#30566" -msgid "Prompt" +msgid "" msgstr "" msgctxt "#30567" @@ -577,11 +577,11 @@ msgid "Remove as Watch Later" msgstr "" msgctxt "#30569" -msgid "Are you sure you want to remove '%s' as your Watch Later list?" +msgid "Are you sure you want to remove \"%s\" as your Watch Later list?" msgstr "" msgctxt "#30570" -msgid "Are you sure you want to replace your current Watch Later list with '%s'?" +msgid "Are you sure you want to replace your current Watch Later list with \"%s\"?" msgstr "" msgctxt "#30571" @@ -593,11 +593,11 @@ msgid "Remove as History" msgstr "" msgctxt "#30573" -msgid "Are you sure you want to remove '%s' as your History list?" +msgid "Are you sure you want to remove \"%s\" as your History list?" msgstr "" msgctxt "#30574" -msgid "Are you sure you want to replace your current History list with '%s'?" +msgid "Are you sure you want to replace your current History list with \"%s\"?" msgstr "" msgctxt "#30575" @@ -609,7 +609,7 @@ msgid "Failed" msgstr "" msgctxt "#30577" -msgid "Settings" +msgid "" msgstr "" msgctxt "#30578" @@ -633,7 +633,7 @@ msgid "Autoplay suggested videos" msgstr "" msgctxt "#30583" -msgid "Automatic" +msgid "" msgstr "" msgctxt "#30584" @@ -693,7 +693,7 @@ msgid "Updated: %s" msgstr "" msgctxt "#30598" -msgid "Personal API keys enabled" +msgid "" msgstr "" msgctxt "#30599" @@ -701,7 +701,7 @@ msgid "Failed to enable personal API keys. Missing: %s" msgstr "" msgctxt "#30600" -msgid "Subtitles" +msgid "" msgstr "" msgctxt "#30601" @@ -761,7 +761,7 @@ msgid "" msgstr "" msgctxt "#30615" -msgid "Cancel" +msgid "" msgstr "" msgctxt "#30616" @@ -777,7 +777,7 @@ msgid "" msgstr "" msgctxt "#30619" -msgid "Port" +msgid "" msgstr "" msgctxt "#30620" @@ -821,7 +821,7 @@ msgid "IP whitelist (comma delimited)" msgstr "" msgctxt "#30630" -msgid "Save" +msgid "" msgstr "" msgctxt "#30631" @@ -937,7 +937,7 @@ msgid "Enter a name for this user" msgstr "" msgctxt "#30659" -msgid "User is now '%s'" +msgid "User is now \"%s\"" msgstr "" msgctxt "#30660" @@ -961,15 +961,15 @@ msgid "Switch user" msgstr "" msgctxt "#30665" -msgid "Switch to '%s' now?" +msgid "Switch to \"%s\" now?" msgstr "" msgctxt "#30666" -msgid "%s removed" +msgid "\"%s\" removed" msgstr "" msgctxt "#30667" -msgid "Renamed '%s' to '%s'" +msgid "Renamed \"%s\" to \"%s\"" msgstr "" msgctxt "#30668" @@ -1113,7 +1113,7 @@ msgid "Play with subtitles" msgstr "" msgctxt "#30703" -msgid "Are you sure?" +msgid "" msgstr "" msgctxt "#30704" @@ -1257,7 +1257,7 @@ msgid "" msgstr "" msgctxt "#30739" -msgid "" +msgid "Subscribers" msgstr "" msgctxt "#30740" @@ -1477,11 +1477,11 @@ msgid "Views count display colour" msgstr "" msgctxt "#30794" -msgid "Likes count display colour" +msgid "Subscriber/Likes count display colour" msgstr "" msgctxt "#30795" -msgid "Comments count display colour" +msgid "Videos/Comments count display colour" msgstr "" msgctxt "#30796" @@ -1579,3 +1579,7 @@ msgstr "" msgctxt "#30819" msgid "Play from start" msgstr "" + +msgctxt "#30820" +msgid "Podcast" +msgstr "" diff --git a/plugin.video.youtube/resources/language/resource.language.ca_es/strings.po b/plugin.video.youtube/resources/language/resource.language.ca_es/strings.po index 888d2de972..cd36d2d2c2 100644 --- a/plugin.video.youtube/resources/language/resource.language.ca_es/strings.po +++ b/plugin.video.youtube/resources/language/resource.language.ca_es/strings.po @@ -37,7 +37,7 @@ msgstr "" # msgstr "" # Kodion Settings msgctxt "#30000" -msgid "General" +msgid "" msgstr "" msgctxt "#30001" @@ -151,7 +151,7 @@ msgid "Configure %s?" msgstr "" msgctxt "#30031" -msgid "Advanced" +msgid "" msgstr "" msgctxt "#30032" @@ -217,7 +217,7 @@ msgid "Watch Later" msgstr "" msgctxt "#30108" -msgid "Remove" +msgid "" msgstr "" msgctxt "#30109" @@ -237,7 +237,7 @@ msgid "Sign Out" msgstr "" msgctxt "#30113" -msgid "Rename" +msgid "" msgstr "" msgctxt "#30114" @@ -257,7 +257,7 @@ msgid "Remove \"%s\"?" msgstr "" msgctxt "#30118" -msgid "Delete" +msgid "" msgstr "" msgctxt "#30119" @@ -301,11 +301,11 @@ msgstr "" # YouTube # empty strings from id 30206 to 30499 msgctxt "#30500" -msgid "Channels" -msgstr "Canals" +msgid "" +msgstr "" msgctxt "#30501" -msgid "Playlists" +msgid "" msgstr "" msgctxt "#30502" @@ -361,7 +361,7 @@ msgid "Related Videos" msgstr "" msgctxt "#30515" -msgid "Auto-Remove from 'Watch Later'" +msgid "Auto-Remove from Watch Later" msgstr "" msgctxt "#30516" @@ -385,15 +385,15 @@ msgid "Add to..." msgstr "" msgctxt "#30521" -msgid "Select playlist" +msgid "" msgstr "" msgctxt "#30522" -msgid "New playlist..." +msgid "" msgstr "" msgctxt "#30523" -msgid "Language" +msgid "" msgstr "" msgctxt "#30524" @@ -425,11 +425,11 @@ msgid "I dislike this" msgstr "" msgctxt "#30531" -msgid "Play all" +msgid "" msgstr "" msgctxt "#30532" -msgid "Default" +msgid "" msgstr "" msgctxt "#30533" @@ -437,7 +437,7 @@ msgid "Reverse" msgstr "" msgctxt "#30534" -msgid "Shuffle" +msgid "" msgstr "" msgctxt "#30535" @@ -457,7 +457,7 @@ msgid "Disliked Videos" msgstr "" msgctxt "#30539" -msgid "Live" +msgid "" msgstr "" msgctxt "#30540" @@ -473,7 +473,7 @@ msgid "rtmpe streams are not supported" msgstr "" msgctxt "#30543" -msgid "Refresh" +msgid "" msgstr "" msgctxt "#30544" @@ -485,15 +485,15 @@ msgid "No further links found." msgstr "" msgctxt "#30546" -msgid "Please log in twice!" +msgid "Please complete all login prompts" msgstr "" msgctxt "#30547" -msgid "You must enable two applications so that YouTube is functioning properly." +msgid "You may be prompted to enable two applications so that YouTube is functioning properly." msgstr "" msgctxt "#30548" -msgid "More..." +msgid "" msgstr "" msgctxt "#30549" @@ -501,7 +501,7 @@ msgid "No videos streams found" msgstr "" msgctxt "#30550" -msgid "Region" +msgid "" msgstr "" msgctxt "#30551" @@ -541,15 +541,15 @@ msgid "Delete settings.xml" msgstr "" msgctxt "#30560" -msgid "Subtitle language" +msgid "" msgstr "" msgctxt "#30561" -msgid "None" +msgid "" msgstr "" msgctxt "#30562" -msgid "" +msgid "View all" msgstr "" msgctxt "#30563" @@ -565,7 +565,7 @@ msgid "" msgstr "" msgctxt "#30566" -msgid "Prompt" +msgid "" msgstr "" msgctxt "#30567" @@ -577,11 +577,11 @@ msgid "Remove as Watch Later" msgstr "" msgctxt "#30569" -msgid "Are you sure you want to remove '%s' as your Watch Later list?" +msgid "Are you sure you want to remove \"%s\" as your Watch Later list?" msgstr "" msgctxt "#30570" -msgid "Are you sure you want to replace your current Watch Later list with '%s'?" +msgid "Are you sure you want to replace your current Watch Later list with \"%s\"?" msgstr "" msgctxt "#30571" @@ -593,11 +593,11 @@ msgid "Remove as History" msgstr "" msgctxt "#30573" -msgid "Are you sure you want to remove '%s' as your History list?" +msgid "Are you sure you want to remove \"%s\" as your History list?" msgstr "" msgctxt "#30574" -msgid "Are you sure you want to replace your current History list with '%s'?" +msgid "Are you sure you want to replace your current History list with \"%s\"?" msgstr "" msgctxt "#30575" @@ -609,8 +609,8 @@ msgid "Failed" msgstr "" msgctxt "#30577" -msgid "Settings" -msgstr "Paràmetres" +msgid "" +msgstr "" msgctxt "#30578" msgid "Force SSL certificate verification" @@ -633,7 +633,7 @@ msgid "Autoplay suggested videos" msgstr "" msgctxt "#30583" -msgid "Automatic" +msgid "" msgstr "" msgctxt "#30584" @@ -693,7 +693,7 @@ msgid "Updated: %s" msgstr "" msgctxt "#30598" -msgid "Personal API keys enabled" +msgid "" msgstr "" msgctxt "#30599" @@ -701,7 +701,7 @@ msgid "Failed to enable personal API keys. Missing: %s" msgstr "" msgctxt "#30600" -msgid "Subtitles" +msgid "" msgstr "" msgctxt "#30601" @@ -761,7 +761,7 @@ msgid "" msgstr "" msgctxt "#30615" -msgid "Cancel" +msgid "" msgstr "" msgctxt "#30616" @@ -777,7 +777,7 @@ msgid "" msgstr "" msgctxt "#30619" -msgid "Port" +msgid "" msgstr "" msgctxt "#30620" @@ -821,7 +821,7 @@ msgid "IP whitelist (comma delimited)" msgstr "" msgctxt "#30630" -msgid "Save" +msgid "" msgstr "" msgctxt "#30631" @@ -937,7 +937,7 @@ msgid "Enter a name for this user" msgstr "" msgctxt "#30659" -msgid "User is now '%s'" +msgid "User is now \"%s\"" msgstr "" msgctxt "#30660" @@ -961,15 +961,15 @@ msgid "Switch user" msgstr "" msgctxt "#30665" -msgid "Switch to '%s' now?" +msgid "Switch to \"%s\" now?" msgstr "" msgctxt "#30666" -msgid "%s removed" +msgid "\"%s\" removed" msgstr "" msgctxt "#30667" -msgid "Renamed '%s' to '%s'" +msgid "Renamed \"%s\" to \"%s\"" msgstr "" msgctxt "#30668" @@ -1113,7 +1113,7 @@ msgid "Play with subtitles" msgstr "" msgctxt "#30703" -msgid "Are you sure?" +msgid "" msgstr "" msgctxt "#30704" @@ -1257,7 +1257,7 @@ msgid "" msgstr "" msgctxt "#30739" -msgid "" +msgid "Subscribers" msgstr "" msgctxt "#30740" @@ -1477,11 +1477,11 @@ msgid "Views count display colour" msgstr "" msgctxt "#30794" -msgid "Likes count display colour" +msgid "Subscriber/Likes count display colour" msgstr "" msgctxt "#30795" -msgid "Comments count display colour" +msgid "Videos/Comments count display colour" msgstr "" msgctxt "#30796" @@ -1579,3 +1579,17 @@ msgstr "" msgctxt "#30819" msgid "Play from start" msgstr "" + +msgctxt "#30820" +msgid "Podcast" +msgstr "" + +# YouTube +# empty strings from id 30206 to 30499 +#~ msgctxt "#30500" +#~ msgid "Channels" +#~ msgstr "Canals" + +#~ msgctxt "#30577" +#~ msgid "Settings" +#~ msgstr "Paràmetres" diff --git a/plugin.video.youtube/resources/language/resource.language.cs_cz/strings.po b/plugin.video.youtube/resources/language/resource.language.cs_cz/strings.po index 67e96b5d98..2a95098c51 100644 --- a/plugin.video.youtube/resources/language/resource.language.cs_cz/strings.po +++ b/plugin.video.youtube/resources/language/resource.language.cs_cz/strings.po @@ -31,14 +31,14 @@ msgstr "Tento plugin není schválen společností Google" # msgctxt "Addon Summary" # msgid "Plugin for YouTube" -# msgstr "Plugin pro YouTube" +# msgstr "" # msgctxt "Addon Description" # msgid "YouTube is a one of the biggest video-sharing websites of the world." -# msgstr "YouTube je jedna z největších webových stránek světa sdílející video." +# msgstr "" # Kodion Settings msgctxt "#30000" -msgid "General" -msgstr "Obecné" +msgid "" +msgstr "" msgctxt "#30001" msgid "" @@ -151,8 +151,8 @@ msgid "Configure %s?" msgstr "" msgctxt "#30031" -msgid "Advanced" -msgstr "Pokročilé" +msgid "" +msgstr "" msgctxt "#30032" msgid "View: TV Shows" @@ -217,8 +217,8 @@ msgid "Watch Later" msgstr "Shlédnout později" msgctxt "#30108" -msgid "Remove" -msgstr "Odstranit" +msgid "" +msgstr "" msgctxt "#30109" msgid "" @@ -237,8 +237,8 @@ msgid "Sign Out" msgstr "Odhlásit" msgctxt "#30113" -msgid "Rename" -msgstr "Přejmenovat" +msgid "" +msgstr "" msgctxt "#30114" msgid "Confirm delete" @@ -257,8 +257,8 @@ msgid "Remove \"%s\"?" msgstr "Přesunout \"%s\"?" msgctxt "#30118" -msgid "Delete" -msgstr "Smazat" +msgid "" +msgstr "" msgctxt "#30119" msgid "Please wait..." @@ -301,12 +301,12 @@ msgstr "" # YouTube # empty strings from id 30206 to 30499 msgctxt "#30500" -msgid "Channels" -msgstr "Kanály" +msgid "" +msgstr "" msgctxt "#30501" -msgid "Playlists" -msgstr "Seznamy přehrávání" +msgid "" +msgstr "" msgctxt "#30502" msgid "Go to %s" @@ -361,8 +361,8 @@ msgid "Related Videos" msgstr "Související videa" msgctxt "#30515" -msgid "Auto-Remove from 'Watch Later'" -msgstr "Automaticky odstranit ze 'Shlédnout později'" +msgid "Auto-Remove from Watch Later" +msgstr "" msgctxt "#30516" msgid "Folders" @@ -385,16 +385,16 @@ msgid "Add to..." msgstr "Přidat do..." msgctxt "#30521" -msgid "Select playlist" -msgstr "Vyberte seznam přehrávání" +msgid "" +msgstr "" msgctxt "#30522" -msgid "New playlist..." -msgstr "Nový seznam přehrávání..." +msgid "" +msgstr "" msgctxt "#30523" -msgid "Language" -msgstr "Jazyk" +msgid "" +msgstr "" msgctxt "#30524" msgid "Select language" @@ -425,20 +425,20 @@ msgid "I dislike this" msgstr "Nelíbí se mi to" msgctxt "#30531" -msgid "Play all" -msgstr "Přehrát vše" +msgid "" +msgstr "" msgctxt "#30532" -msgid "Default" -msgstr "Výchozí" +msgid "" +msgstr "" msgctxt "#30533" msgid "Reverse" msgstr "Obráceně" msgctxt "#30534" -msgid "Shuffle" -msgstr "Náhodně" +msgid "" +msgstr "" msgctxt "#30535" msgid "Select the order of the playlist" @@ -457,8 +457,8 @@ msgid "Disliked Videos" msgstr "Videa, která se nelíbí" msgctxt "#30539" -msgid "Live" -msgstr "Živě" +msgid "" +msgstr "" msgctxt "#30540" msgid "Play with..." @@ -473,8 +473,8 @@ msgid "rtmpe streams are not supported" msgstr "RTMPE stream není podporován" msgctxt "#30543" -msgid "Refresh" -msgstr "Obnovit" +msgid "" +msgstr "" msgctxt "#30544" msgid "More Links from the description" @@ -485,24 +485,24 @@ msgid "No further links found." msgstr "Žádné další odkazy nenalezeny." msgctxt "#30546" -msgid "Please log in twice!" -msgstr "Přihlaste se dvakrát!" +msgid "Please complete all login prompts" +msgstr "" msgctxt "#30547" -msgid "You must enable two applications so that YouTube is functioning properly." -msgstr "Je zapotřebí povolit dvě aplikace pro správnou funkci doplňku." +msgid "You may be prompted to enable two applications so that YouTube is functioning properly." +msgstr "" msgctxt "#30548" -msgid "More..." -msgstr "Více..." +msgid "" +msgstr "" msgctxt "#30549" msgid "No videos streams found" msgstr "Žádné streamy nenalezeny" msgctxt "#30550" -msgid "Region" -msgstr "Region" +msgid "" +msgstr "" msgctxt "#30551" msgid "Recommendations" @@ -541,15 +541,15 @@ msgid "Delete settings.xml" msgstr "Odstranit settings.xml" msgctxt "#30560" -msgid "Subtitle language" -msgstr "Jazyk titulků" +msgid "" +msgstr "" msgctxt "#30561" -msgid "None" -msgstr "Žádné" +msgid "" +msgstr "" msgctxt "#30562" -msgid "" +msgid "View all" msgstr "" msgctxt "#30563" @@ -565,8 +565,8 @@ msgid "" msgstr "" msgctxt "#30566" -msgid "Prompt" -msgstr "Přizpůsobit" +msgid "" +msgstr "" msgctxt "#30567" msgid "Set as Watch Later" @@ -577,12 +577,12 @@ msgid "Remove as Watch Later" msgstr "Odstranit 'Shlédnout později'" msgctxt "#30569" -msgid "Are you sure you want to remove '%s' as your Watch Later list?" -msgstr "Chcete odstranit '%s' ze seznamu 'Shlédnout později'?" +msgid "Are you sure you want to remove \"%s\" as your Watch Later list?" +msgstr "" msgctxt "#30570" -msgid "Are you sure you want to replace your current Watch Later list with '%s'?" -msgstr "Chcete nahradit aktuální seznam 'Shlédnout později' s '%s'?" +msgid "Are you sure you want to replace your current Watch Later list with \"%s\"?" +msgstr "" msgctxt "#30571" msgid "Set as History" @@ -593,12 +593,12 @@ msgid "Remove as History" msgstr "Odstranit historii" msgctxt "#30573" -msgid "Are you sure you want to remove '%s' as your History list?" -msgstr "Chcete odstranit '%s'ze seznamu historie?" +msgid "Are you sure you want to remove \"%s\" as your History list?" +msgstr "" msgctxt "#30574" -msgid "Are you sure you want to replace your current History list with '%s'?" -msgstr "Chcete nahradit aktuální seznam historie s '%s'?" +msgid "Are you sure you want to replace your current History list with \"%s\"?" +msgstr "" msgctxt "#30575" msgid "Succeeded" @@ -609,8 +609,8 @@ msgid "Failed" msgstr "Neúspěšně" msgctxt "#30577" -msgid "Settings" -msgstr "Nastavení" +msgid "" +msgstr "" msgctxt "#30578" msgid "Force SSL certificate verification" @@ -633,8 +633,8 @@ msgid "Autoplay suggested videos" msgstr "Automatické přehrávání doporučeného videa" msgctxt "#30583" -msgid "Automatic" -msgstr "Automaticky" +msgid "" +msgstr "" msgctxt "#30584" msgid "My Subscriptions (Filtered)" @@ -693,15 +693,15 @@ msgid "Updated: %s" msgstr "Aktualizováno: %s" msgctxt "#30598" -msgid "Personal API keys enabled" -msgstr "Povolit osobní API KEY" +msgid "" +msgstr "" msgctxt "#30599" msgid "Failed to enable personal API keys. Missing: %s" msgstr "Chyba povolení osobního API KEY. Chybí: %s" msgctxt "#30600" -msgid "Subtitles" +msgid "" msgstr "" msgctxt "#30601" @@ -761,8 +761,8 @@ msgid "" msgstr "" msgctxt "#30615" -msgid "Cancel" -msgstr "Zrušit" +msgid "" +msgstr "" msgctxt "#30616" msgid "" @@ -777,8 +777,8 @@ msgid "" msgstr "" msgctxt "#30619" -msgid "Port" -msgstr "Port" +msgid "" +msgstr "" msgctxt "#30620" msgid "Port %s already in use. Cannot start http server." @@ -821,8 +821,8 @@ msgid "IP whitelist (comma delimited)" msgstr "IP bílého seznamu (vymezeno čárkou)" msgctxt "#30630" -msgid "Save" -msgstr "Uložit" +msgid "" +msgstr "" msgctxt "#30631" msgid "Successfully updated: %s" @@ -937,8 +937,8 @@ msgid "Enter a name for this user" msgstr "Vložte jméno uživatele" msgctxt "#30659" -msgid "User is now '%s'" -msgstr "Uživatelem je nyní '%s'" +msgid "User is now \"%s\"" +msgstr "" msgctxt "#30660" msgid "Users" @@ -961,16 +961,16 @@ msgid "Switch user" msgstr "Přepnout uživatele" msgctxt "#30665" -msgid "Switch to '%s' now?" -msgstr "Přepnout nyní na '%s'?" +msgid "Switch to \"%s\" now?" +msgstr "" msgctxt "#30666" -msgid "%s removed" +msgid "\"%s\" removed" msgstr "" msgctxt "#30667" -msgid "Renamed '%s' to '%s'" -msgstr "Přejmenován z '%s' na '%s" +msgid "Renamed \"%s\" to \"%s\"" +msgstr "" msgctxt "#30668" msgid "Play count minimum percent" @@ -1113,8 +1113,8 @@ msgid "Play with subtitles" msgstr "Přehrát s titulky" msgctxt "#30703" -msgid "Are you sure?" -msgstr "Opravdu chcete?" +msgid "" +msgstr "" msgctxt "#30704" msgid "Use YouTube website urls with default player" @@ -1257,7 +1257,7 @@ msgid "" msgstr "" msgctxt "#30739" -msgid "" +msgid "Subscribers" msgstr "" msgctxt "#30740" @@ -1477,11 +1477,11 @@ msgid "Views count display colour" msgstr "" msgctxt "#30794" -msgid "Likes count display colour" +msgid "Subscriber/Likes count display colour" msgstr "" msgctxt "#30795" -msgid "Comments count display colour" +msgid "Videos/Comments count display colour" msgstr "" msgctxt "#30796" @@ -1580,6 +1580,167 @@ msgctxt "#30819" msgid "Play from start" msgstr "" +msgctxt "#30820" +msgid "Podcast" +msgstr "" + +#~ msgctxt "#30515" +#~ msgid "Auto-Remove from 'Watch Later'" +#~ msgstr "Automaticky odstranit ze 'Shlédnout později'" + +#~ msgctxt "#30569" +#~ msgid "Are you sure you want to remove '%s' as your Watch Later list?" +#~ msgstr "Chcete odstranit '%s' ze seznamu 'Shlédnout později'?" + +#~ msgctxt "#30570" +#~ msgid "Are you sure you want to replace your current Watch Later list with '%s'?" +#~ msgstr "Chcete nahradit aktuální seznam 'Shlédnout později' s '%s'?" + +#~ msgctxt "#30573" +#~ msgid "Are you sure you want to remove '%s' as your History list?" +#~ msgstr "Chcete odstranit '%s'ze seznamu historie?" + +#~ msgctxt "#30574" +#~ msgid "Are you sure you want to replace your current History list with '%s'?" +#~ msgstr "Chcete nahradit aktuální seznam historie s '%s'?" + +#~ msgctxt "#30659" +#~ msgid "User is now '%s'" +#~ msgstr "Uživatelem je nyní '%s'" + +#~ msgctxt "#30665" +#~ msgid "Switch to '%s' now?" +#~ msgstr "Přepnout nyní na '%s'?" + +#~ msgctxt "#30667" +#~ msgid "Renamed '%s' to '%s'" +#~ msgstr "Přejmenován z '%s' na '%s" + +# msgctxt "Addon Summary" +# msgid "Plugin for YouTube" +# msgstr "Plugin pro YouTube" +# msgctxt "Addon Description" +# msgid "YouTube is a one of the biggest video-sharing websites of the world." +# msgstr "YouTube je jedna z největších webových stránek světa sdílející video." +# Kodion Settings +#~ msgctxt "#30000" +#~ msgid "General" +#~ msgstr "Obecné" + +#~ msgctxt "#30031" +#~ msgid "Advanced" +#~ msgstr "Pokročilé" + +#~ msgctxt "#30108" +#~ msgid "Remove" +#~ msgstr "Odstranit" + +#~ msgctxt "#30113" +#~ msgid "Rename" +#~ msgstr "Přejmenovat" + +#~ msgctxt "#30118" +#~ msgid "Delete" +#~ msgstr "Smazat" + +# YouTube +# empty strings from id 30206 to 30499 +#~ msgctxt "#30500" +#~ msgid "Channels" +#~ msgstr "Kanály" + +#~ msgctxt "#30501" +#~ msgid "Playlists" +#~ msgstr "Seznamy přehrávání" + +#~ msgctxt "#30521" +#~ msgid "Select playlist" +#~ msgstr "Vyberte seznam přehrávání" + +#~ msgctxt "#30522" +#~ msgid "New playlist..." +#~ msgstr "Nový seznam přehrávání..." + +#~ msgctxt "#30523" +#~ msgid "Language" +#~ msgstr "Jazyk" + +#~ msgctxt "#30531" +#~ msgid "Play all" +#~ msgstr "Přehrát vše" + +#~ msgctxt "#30532" +#~ msgid "Default" +#~ msgstr "Výchozí" + +#~ msgctxt "#30534" +#~ msgid "Shuffle" +#~ msgstr "Náhodně" + +#~ msgctxt "#30539" +#~ msgid "Live" +#~ msgstr "Živě" + +#~ msgctxt "#30543" +#~ msgid "Refresh" +#~ msgstr "Obnovit" + +#~ msgctxt "#30548" +#~ msgid "More..." +#~ msgstr "Více..." + +#~ msgctxt "#30550" +#~ msgid "Region" +#~ msgstr "Region" + +#~ msgctxt "#30560" +#~ msgid "Subtitle language" +#~ msgstr "Jazyk titulků" + +#~ msgctxt "#30561" +#~ msgid "None" +#~ msgstr "Žádné" + +#~ msgctxt "#30566" +#~ msgid "Prompt" +#~ msgstr "Přizpůsobit" + +#~ msgctxt "#30577" +#~ msgid "Settings" +#~ msgstr "Nastavení" + +#~ msgctxt "#30583" +#~ msgid "Automatic" +#~ msgstr "Automaticky" + +#~ msgctxt "#30598" +#~ msgid "Personal API keys enabled" +#~ msgstr "Povolit osobní API KEY" + +#~ msgctxt "#30615" +#~ msgid "Cancel" +#~ msgstr "Zrušit" + +#~ msgctxt "#30619" +#~ msgid "Port" +#~ msgstr "Port" + +#~ msgctxt "#30630" +#~ msgid "Save" +#~ msgstr "Uložit" + +#~ msgctxt "#30703" +#~ msgid "Are you sure?" +#~ msgstr "Opravdu chcete?" + +#~ msgctxt "#30546" +#~ msgid "Please log in twice!" +#~ msgstr "Přihlaste se dvakrát!" + +#~ msgctxt "#30547" +#~ msgid "You must enable two applications so that YouTube is functioning properly." +#~ msgstr "Je zapotřebí povolit dvě aplikace pro správnou funkci doplňku." + #~ msgctxt "#30001" #~ msgid "Username" #~ msgstr "Jméno" diff --git a/plugin.video.youtube/resources/language/resource.language.cy_gb/strings.po b/plugin.video.youtube/resources/language/resource.language.cy_gb/strings.po index d24b9f5dd8..b08cff4a2a 100644 --- a/plugin.video.youtube/resources/language/resource.language.cy_gb/strings.po +++ b/plugin.video.youtube/resources/language/resource.language.cy_gb/strings.po @@ -37,7 +37,7 @@ msgstr "" # msgstr "" # Kodion Settings msgctxt "#30000" -msgid "General" +msgid "" msgstr "" msgctxt "#30001" @@ -151,7 +151,7 @@ msgid "Configure %s?" msgstr "" msgctxt "#30031" -msgid "Advanced" +msgid "" msgstr "" msgctxt "#30032" @@ -217,7 +217,7 @@ msgid "Watch Later" msgstr "" msgctxt "#30108" -msgid "Remove" +msgid "" msgstr "" msgctxt "#30109" @@ -237,7 +237,7 @@ msgid "Sign Out" msgstr "" msgctxt "#30113" -msgid "Rename" +msgid "" msgstr "" msgctxt "#30114" @@ -257,7 +257,7 @@ msgid "Remove \"%s\"?" msgstr "" msgctxt "#30118" -msgid "Delete" +msgid "" msgstr "" msgctxt "#30119" @@ -301,11 +301,11 @@ msgstr "" # YouTube # empty strings from id 30206 to 30499 msgctxt "#30500" -msgid "Channels" +msgid "" msgstr "" msgctxt "#30501" -msgid "Playlists" +msgid "" msgstr "" msgctxt "#30502" @@ -361,7 +361,7 @@ msgid "Related Videos" msgstr "" msgctxt "#30515" -msgid "Auto-Remove from 'Watch Later'" +msgid "Auto-Remove from Watch Later" msgstr "" msgctxt "#30516" @@ -385,15 +385,15 @@ msgid "Add to..." msgstr "" msgctxt "#30521" -msgid "Select playlist" +msgid "" msgstr "" msgctxt "#30522" -msgid "New playlist..." +msgid "" msgstr "" msgctxt "#30523" -msgid "Language" +msgid "" msgstr "" msgctxt "#30524" @@ -425,11 +425,11 @@ msgid "I dislike this" msgstr "" msgctxt "#30531" -msgid "Play all" +msgid "" msgstr "" msgctxt "#30532" -msgid "Default" +msgid "" msgstr "" msgctxt "#30533" @@ -437,7 +437,7 @@ msgid "Reverse" msgstr "" msgctxt "#30534" -msgid "Shuffle" +msgid "" msgstr "" msgctxt "#30535" @@ -457,7 +457,7 @@ msgid "Disliked Videos" msgstr "" msgctxt "#30539" -msgid "Live" +msgid "" msgstr "" msgctxt "#30540" @@ -473,7 +473,7 @@ msgid "rtmpe streams are not supported" msgstr "" msgctxt "#30543" -msgid "Refresh" +msgid "" msgstr "" msgctxt "#30544" @@ -485,15 +485,15 @@ msgid "No further links found." msgstr "" msgctxt "#30546" -msgid "Please log in twice!" +msgid "Please complete all login prompts" msgstr "" msgctxt "#30547" -msgid "You must enable two applications so that YouTube is functioning properly." +msgid "You may be prompted to enable two applications so that YouTube is functioning properly." msgstr "" msgctxt "#30548" -msgid "More..." +msgid "" msgstr "" msgctxt "#30549" @@ -501,7 +501,7 @@ msgid "No videos streams found" msgstr "" msgctxt "#30550" -msgid "Region" +msgid "" msgstr "" msgctxt "#30551" @@ -541,15 +541,15 @@ msgid "Delete settings.xml" msgstr "" msgctxt "#30560" -msgid "Subtitle language" +msgid "" msgstr "" msgctxt "#30561" -msgid "None" +msgid "" msgstr "" msgctxt "#30562" -msgid "" +msgid "View all" msgstr "" msgctxt "#30563" @@ -565,7 +565,7 @@ msgid "" msgstr "" msgctxt "#30566" -msgid "Prompt" +msgid "" msgstr "" msgctxt "#30567" @@ -577,11 +577,11 @@ msgid "Remove as Watch Later" msgstr "" msgctxt "#30569" -msgid "Are you sure you want to remove '%s' as your Watch Later list?" +msgid "Are you sure you want to remove \"%s\" as your Watch Later list?" msgstr "" msgctxt "#30570" -msgid "Are you sure you want to replace your current Watch Later list with '%s'?" +msgid "Are you sure you want to replace your current Watch Later list with \"%s\"?" msgstr "" msgctxt "#30571" @@ -593,11 +593,11 @@ msgid "Remove as History" msgstr "" msgctxt "#30573" -msgid "Are you sure you want to remove '%s' as your History list?" +msgid "Are you sure you want to remove \"%s\" as your History list?" msgstr "" msgctxt "#30574" -msgid "Are you sure you want to replace your current History list with '%s'?" +msgid "Are you sure you want to replace your current History list with \"%s\"?" msgstr "" msgctxt "#30575" @@ -609,7 +609,7 @@ msgid "Failed" msgstr "" msgctxt "#30577" -msgid "Settings" +msgid "" msgstr "" msgctxt "#30578" @@ -633,7 +633,7 @@ msgid "Autoplay suggested videos" msgstr "" msgctxt "#30583" -msgid "Automatic" +msgid "" msgstr "" msgctxt "#30584" @@ -693,7 +693,7 @@ msgid "Updated: %s" msgstr "" msgctxt "#30598" -msgid "Personal API keys enabled" +msgid "" msgstr "" msgctxt "#30599" @@ -701,7 +701,7 @@ msgid "Failed to enable personal API keys. Missing: %s" msgstr "" msgctxt "#30600" -msgid "Subtitles" +msgid "" msgstr "" msgctxt "#30601" @@ -761,7 +761,7 @@ msgid "" msgstr "" msgctxt "#30615" -msgid "Cancel" +msgid "" msgstr "" msgctxt "#30616" @@ -777,7 +777,7 @@ msgid "" msgstr "" msgctxt "#30619" -msgid "Port" +msgid "" msgstr "" msgctxt "#30620" @@ -821,7 +821,7 @@ msgid "IP whitelist (comma delimited)" msgstr "" msgctxt "#30630" -msgid "Save" +msgid "" msgstr "" msgctxt "#30631" @@ -937,7 +937,7 @@ msgid "Enter a name for this user" msgstr "" msgctxt "#30659" -msgid "User is now '%s'" +msgid "User is now \"%s\"" msgstr "" msgctxt "#30660" @@ -961,15 +961,15 @@ msgid "Switch user" msgstr "" msgctxt "#30665" -msgid "Switch to '%s' now?" +msgid "Switch to \"%s\" now?" msgstr "" msgctxt "#30666" -msgid "%s removed" +msgid "\"%s\" removed" msgstr "" msgctxt "#30667" -msgid "Renamed '%s' to '%s'" +msgid "Renamed \"%s\" to \"%s\"" msgstr "" msgctxt "#30668" @@ -1113,7 +1113,7 @@ msgid "Play with subtitles" msgstr "" msgctxt "#30703" -msgid "Are you sure?" +msgid "" msgstr "" msgctxt "#30704" @@ -1257,7 +1257,7 @@ msgid "" msgstr "" msgctxt "#30739" -msgid "" +msgid "Subscribers" msgstr "" msgctxt "#30740" @@ -1477,11 +1477,11 @@ msgid "Views count display colour" msgstr "" msgctxt "#30794" -msgid "Likes count display colour" +msgid "Subscriber/Likes count display colour" msgstr "" msgctxt "#30795" -msgid "Comments count display colour" +msgid "Videos/Comments count display colour" msgstr "" msgctxt "#30796" @@ -1579,3 +1579,7 @@ msgstr "" msgctxt "#30819" msgid "Play from start" msgstr "" + +msgctxt "#30820" +msgid "Podcast" +msgstr "" diff --git a/plugin.video.youtube/resources/language/resource.language.da_dk/strings.po b/plugin.video.youtube/resources/language/resource.language.da_dk/strings.po index 784d12768e..563db5bca8 100644 --- a/plugin.video.youtube/resources/language/resource.language.da_dk/strings.po +++ b/plugin.video.youtube/resources/language/resource.language.da_dk/strings.po @@ -37,8 +37,8 @@ msgstr "Dette plugin er ikke godkendt af Google" # msgstr "" # Kodion Settings msgctxt "#30000" -msgid "General" -msgstr "Generel" +msgid "" +msgstr "" msgctxt "#30001" msgid "" @@ -151,8 +151,8 @@ msgid "Configure %s?" msgstr "" msgctxt "#30031" -msgid "Advanced" -msgstr "Avanceret" +msgid "" +msgstr "" msgctxt "#30032" msgid "View: TV Shows" @@ -217,8 +217,8 @@ msgid "Watch Later" msgstr "Se senere" msgctxt "#30108" -msgid "Remove" -msgstr "Fjern" +msgid "" +msgstr "" msgctxt "#30109" msgid "" @@ -237,8 +237,8 @@ msgid "Sign Out" msgstr "Log ud" msgctxt "#30113" -msgid "Rename" -msgstr "Omdøb" +msgid "" +msgstr "" msgctxt "#30114" msgid "Confirm delete" @@ -257,8 +257,8 @@ msgid "Remove \"%s\"?" msgstr "Fjern \"(%s)\"?" msgctxt "#30118" -msgid "Delete" -msgstr "Slet" +msgid "" +msgstr "" msgctxt "#30119" msgid "Please wait..." @@ -301,12 +301,12 @@ msgstr "" # YouTube # empty strings from id 30206 to 30499 msgctxt "#30500" -msgid "Channels" -msgstr "Kanaler" +msgid "" +msgstr "" msgctxt "#30501" -msgid "Playlists" -msgstr "Playlister" +msgid "" +msgstr "" msgctxt "#30502" msgid "Go to %s" @@ -361,8 +361,8 @@ msgid "Related Videos" msgstr "Lignende videoer" msgctxt "#30515" -msgid "Auto-Remove from 'Watch Later'" -msgstr "Fjern automatisk fra 'Se senere'" +msgid "Auto-Remove from Watch Later" +msgstr "" msgctxt "#30516" msgid "Folders" @@ -385,16 +385,16 @@ msgid "Add to..." msgstr "Tilføj til..." msgctxt "#30521" -msgid "Select playlist" -msgstr "Vælg playliste" +msgid "" +msgstr "" msgctxt "#30522" -msgid "New playlist..." -msgstr "Ny playliste..." +msgid "" +msgstr "" msgctxt "#30523" -msgid "Language" -msgstr "Sprog" +msgid "" +msgstr "" msgctxt "#30524" msgid "Select language" @@ -425,20 +425,20 @@ msgid "I dislike this" msgstr "Jeg kan ikke lide dette" msgctxt "#30531" -msgid "Play all" -msgstr "Afspil alle" +msgid "" +msgstr "" msgctxt "#30532" -msgid "Default" -msgstr "Standard" +msgid "" +msgstr "" msgctxt "#30533" msgid "Reverse" msgstr "Omvendt" msgctxt "#30534" -msgid "Shuffle" -msgstr "Bland" +msgid "" +msgstr "" msgctxt "#30535" msgid "Select the order of the playlist" @@ -457,8 +457,8 @@ msgid "Disliked Videos" msgstr "Videoer du ikke synes godt om" msgctxt "#30539" -msgid "Live" -msgstr "Direkte" +msgid "" +msgstr "" msgctxt "#30540" msgid "Play with..." @@ -473,8 +473,8 @@ msgid "rtmpe streams are not supported" msgstr "rtmpe-streams understøttes ikke" msgctxt "#30543" -msgid "Refresh" -msgstr "Opdater" +msgid "" +msgstr "" msgctxt "#30544" msgid "More Links from the description" @@ -485,24 +485,24 @@ msgid "No further links found." msgstr "Ingen yderligere links fundet." msgctxt "#30546" -msgid "Please log in twice!" -msgstr "Log venligst ind to gange!" +msgid "Please complete all login prompts" +msgstr "" msgctxt "#30547" -msgid "You must enable two applications so that YouTube is functioning properly." -msgstr "Du skal aktivere to applikationer, så YouTube fungerer korrekt." +msgid "You may be prompted to enable two applications so that YouTube is functioning properly." +msgstr "" msgctxt "#30548" -msgid "More..." -msgstr "Mere..." +msgid "" +msgstr "" msgctxt "#30549" msgid "No videos streams found" msgstr "Ingen videostreams fundet" msgctxt "#30550" -msgid "Region" -msgstr "Område" +msgid "" +msgstr "" msgctxt "#30551" msgid "Recommendations" @@ -541,15 +541,15 @@ msgid "Delete settings.xml" msgstr "Slet settings.xml" msgctxt "#30560" -msgid "Subtitle language" -msgstr "Undertekstsprog" +msgid "" +msgstr "" msgctxt "#30561" -msgid "None" -msgstr "Ingen" +msgid "" +msgstr "" msgctxt "#30562" -msgid "" +msgid "View all" msgstr "" msgctxt "#30563" @@ -565,8 +565,8 @@ msgid "" msgstr "" msgctxt "#30566" -msgid "Prompt" -msgstr "Forespørg" +msgid "" +msgstr "" msgctxt "#30567" msgid "Set as Watch Later" @@ -577,12 +577,12 @@ msgid "Remove as Watch Later" msgstr "Fjern fra 'Se senere'" msgctxt "#30569" -msgid "Are you sure you want to remove '%s' as your Watch Later list?" -msgstr "Er du sikker på, at du vil fjerne '%s' som din 'Se senere'-liste?" +msgid "Are you sure you want to remove \"%s\" as your Watch Later list?" +msgstr "" msgctxt "#30570" -msgid "Are you sure you want to replace your current Watch Later list with '%s'?" -msgstr "Er du sikker på, at du vil erstatte din nuværende 'Se senere'-liste med '%s'?" +msgid "Are you sure you want to replace your current Watch Later list with \"%s\"?" +msgstr "" msgctxt "#30571" msgid "Set as History" @@ -593,12 +593,12 @@ msgid "Remove as History" msgstr "Fjern fra 'Historie'" msgctxt "#30573" -msgid "Are you sure you want to remove '%s' as your History list?" -msgstr "Er du sikker på, at du vil fjerne '%s' som din 'Historie'-liste?" +msgid "Are you sure you want to remove \"%s\" as your History list?" +msgstr "" msgctxt "#30574" -msgid "Are you sure you want to replace your current History list with '%s'?" -msgstr "Er du sikker på, at du vil erstatte din nuværende 'Historie'-liste med '%s'?" +msgid "Are you sure you want to replace your current History list with \"%s\"?" +msgstr "" msgctxt "#30575" msgid "Succeeded" @@ -609,8 +609,8 @@ msgid "Failed" msgstr "Mislykkedes" msgctxt "#30577" -msgid "Settings" -msgstr "Indstillinger" +msgid "" +msgstr "" msgctxt "#30578" msgid "Force SSL certificate verification" @@ -633,8 +633,8 @@ msgid "Autoplay suggested videos" msgstr "Automatisk afspilning af foreslåede videoer" msgctxt "#30583" -msgid "Automatic" -msgstr "Automatisk" +msgid "" +msgstr "" msgctxt "#30584" msgid "My Subscriptions (Filtered)" @@ -693,16 +693,16 @@ msgid "Updated: %s" msgstr "Opdateret: %s" msgctxt "#30598" -msgid "Personal API keys enabled" -msgstr "Personlige API-nøgler aktiveret" +msgid "" +msgstr "" msgctxt "#30599" msgid "Failed to enable personal API keys. Missing: %s" msgstr "Kunne ikke aktivere personlige API-nøgler. Mangler: %s" msgctxt "#30600" -msgid "Subtitles" -msgstr "Undertekster" +msgid "" +msgstr "" msgctxt "#30601" msgid "%s with Original/%s fallback" @@ -761,8 +761,8 @@ msgid "" msgstr "" msgctxt "#30615" -msgid "Cancel" -msgstr "Annuller" +msgid "" +msgstr "" msgctxt "#30616" msgid "" @@ -777,8 +777,8 @@ msgid "" msgstr "" msgctxt "#30619" -msgid "Port" -msgstr "Port" +msgid "" +msgstr "" msgctxt "#30620" msgid "Port %s already in use. Cannot start http server." @@ -821,8 +821,8 @@ msgid "IP whitelist (comma delimited)" msgstr "IP-hvidliste (kommasepareret)" msgctxt "#30630" -msgid "Save" -msgstr "Gem" +msgid "" +msgstr "" msgctxt "#30631" msgid "Successfully updated: %s" @@ -937,8 +937,8 @@ msgid "Enter a name for this user" msgstr "Indtast et navn til denne bruger" msgctxt "#30659" -msgid "User is now '%s'" -msgstr "Bruger er nu '%s'" +msgid "User is now \"%s\"" +msgstr "" msgctxt "#30660" msgid "Users" @@ -961,16 +961,16 @@ msgid "Switch user" msgstr "Skift bruger" msgctxt "#30665" -msgid "Switch to '%s' now?" -msgstr "Skift til '%s' nu?" +msgid "Switch to \"%s\" now?" +msgstr "" msgctxt "#30666" -msgid "%s removed" +msgid "\"%s\" removed" msgstr "" msgctxt "#30667" -msgid "Renamed '%s' to '%s'" -msgstr "Omdøbte '%s' til '%s'" +msgid "Renamed \"%s\" to \"%s\"" +msgstr "" msgctxt "#30668" msgid "Play count minimum percent" @@ -1113,8 +1113,8 @@ msgid "Play with subtitles" msgstr "Afspil med undertekster" msgctxt "#30703" -msgid "Are you sure?" -msgstr "Er du sikker?" +msgid "" +msgstr "" msgctxt "#30704" msgid "Use YouTube website urls with default player" @@ -1257,7 +1257,7 @@ msgid "" msgstr "" msgctxt "#30739" -msgid "" +msgid "Subscribers" msgstr "" msgctxt "#30740" @@ -1477,11 +1477,11 @@ msgid "Views count display colour" msgstr "" msgctxt "#30794" -msgid "Likes count display colour" +msgid "Subscriber/Likes count display colour" msgstr "" msgctxt "#30795" -msgid "Comments count display colour" +msgid "Videos/Comments count display colour" msgstr "" msgctxt "#30796" @@ -1580,6 +1580,171 @@ msgctxt "#30819" msgid "Play from start" msgstr "" +msgctxt "#30820" +msgid "Podcast" +msgstr "" + +#~ msgctxt "#30515" +#~ msgid "Auto-Remove from 'Watch Later'" +#~ msgstr "Fjern automatisk fra 'Se senere'" + +#~ msgctxt "#30569" +#~ msgid "Are you sure you want to remove '%s' as your Watch Later list?" +#~ msgstr "Er du sikker på, at du vil fjerne '%s' som din 'Se senere'-liste?" + +#~ msgctxt "#30570" +#~ msgid "Are you sure you want to replace your current Watch Later list with '%s'?" +#~ msgstr "Er du sikker på, at du vil erstatte din nuværende 'Se senere'-liste med '%s'?" + +#~ msgctxt "#30573" +#~ msgid "Are you sure you want to remove '%s' as your History list?" +#~ msgstr "Er du sikker på, at du vil fjerne '%s' som din 'Historie'-liste?" + +#~ msgctxt "#30574" +#~ msgid "Are you sure you want to replace your current History list with '%s'?" +#~ msgstr "Er du sikker på, at du vil erstatte din nuværende 'Historie'-liste med '%s'?" + +#~ msgctxt "#30659" +#~ msgid "User is now '%s'" +#~ msgstr "Bruger er nu '%s'" + +#~ msgctxt "#30665" +#~ msgid "Switch to '%s' now?" +#~ msgstr "Skift til '%s' nu?" + +#~ msgctxt "#30667" +#~ msgid "Renamed '%s' to '%s'" +#~ msgstr "Omdøbte '%s' til '%s'" + +# msgctxt "Addon Summary" +# msgid "Plugin for YouTube" +# msgstr "" +# msgctxt "Addon Description" +# msgid "YouTube is a one of the biggest video-sharing websites of the world." +# msgstr "" +# Kodion Settings +#~ msgctxt "#30000" +#~ msgid "General" +#~ msgstr "Generel" + +#~ msgctxt "#30031" +#~ msgid "Advanced" +#~ msgstr "Avanceret" + +#~ msgctxt "#30108" +#~ msgid "Remove" +#~ msgstr "Fjern" + +#~ msgctxt "#30113" +#~ msgid "Rename" +#~ msgstr "Omdøb" + +#~ msgctxt "#30118" +#~ msgid "Delete" +#~ msgstr "Slet" + +# YouTube +# empty strings from id 30206 to 30499 +#~ msgctxt "#30500" +#~ msgid "Channels" +#~ msgstr "Kanaler" + +#~ msgctxt "#30501" +#~ msgid "Playlists" +#~ msgstr "Playlister" + +#~ msgctxt "#30521" +#~ msgid "Select playlist" +#~ msgstr "Vælg playliste" + +#~ msgctxt "#30522" +#~ msgid "New playlist..." +#~ msgstr "Ny playliste..." + +#~ msgctxt "#30523" +#~ msgid "Language" +#~ msgstr "Sprog" + +#~ msgctxt "#30531" +#~ msgid "Play all" +#~ msgstr "Afspil alle" + +#~ msgctxt "#30532" +#~ msgid "Default" +#~ msgstr "Standard" + +#~ msgctxt "#30534" +#~ msgid "Shuffle" +#~ msgstr "Bland" + +#~ msgctxt "#30539" +#~ msgid "Live" +#~ msgstr "Direkte" + +#~ msgctxt "#30543" +#~ msgid "Refresh" +#~ msgstr "Opdater" + +#~ msgctxt "#30548" +#~ msgid "More..." +#~ msgstr "Mere..." + +#~ msgctxt "#30550" +#~ msgid "Region" +#~ msgstr "Område" + +#~ msgctxt "#30560" +#~ msgid "Subtitle language" +#~ msgstr "Undertekstsprog" + +#~ msgctxt "#30561" +#~ msgid "None" +#~ msgstr "Ingen" + +#~ msgctxt "#30566" +#~ msgid "Prompt" +#~ msgstr "Forespørg" + +#~ msgctxt "#30577" +#~ msgid "Settings" +#~ msgstr "Indstillinger" + +#~ msgctxt "#30583" +#~ msgid "Automatic" +#~ msgstr "Automatisk" + +#~ msgctxt "#30598" +#~ msgid "Personal API keys enabled" +#~ msgstr "Personlige API-nøgler aktiveret" + +#~ msgctxt "#30600" +#~ msgid "Subtitles" +#~ msgstr "Undertekster" + +#~ msgctxt "#30615" +#~ msgid "Cancel" +#~ msgstr "Annuller" + +#~ msgctxt "#30619" +#~ msgid "Port" +#~ msgstr "Port" + +#~ msgctxt "#30630" +#~ msgid "Save" +#~ msgstr "Gem" + +#~ msgctxt "#30703" +#~ msgid "Are you sure?" +#~ msgstr "Er du sikker?" + +#~ msgctxt "#30546" +#~ msgid "Please log in twice!" +#~ msgstr "Log venligst ind to gange!" + +#~ msgctxt "#30547" +#~ msgid "You must enable two applications so that YouTube is functioning properly." +#~ msgstr "Du skal aktivere to applikationer, så YouTube fungerer korrekt." + #~ msgctxt "#30001" #~ msgid "Username" #~ msgstr "Brugernavn" diff --git a/plugin.video.youtube/resources/language/resource.language.de_de/strings.po b/plugin.video.youtube/resources/language/resource.language.de_de/strings.po index b5fe84bd49..99f6fd3b4f 100644 --- a/plugin.video.youtube/resources/language/resource.language.de_de/strings.po +++ b/plugin.video.youtube/resources/language/resource.language.de_de/strings.po @@ -7,7 +7,7 @@ msgstr "" "Project-Id-Version: XBMC-Addons\n" "Report-Msgid-Bugs-To: translations@kodi.tv\n" "POT-Creation-Date: 2015-09-21 11:01+0000\n" -"PO-Revision-Date: 2024-08-06 06:27+0000\n" +"PO-Revision-Date: 2024-11-08 16:39+0000\n" "Last-Translator: Kai Sommerfeld \n" "Language-Team: German \n" "Language: de_de\n" @@ -15,7 +15,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 5.6.2\n" +"X-Generator: Weblate 5.8.2\n" msgctxt "Addon Summary" msgid "Plugin for YouTube" @@ -31,14 +31,14 @@ msgstr "Dieses Plugin ist nicht von Google befürwortet" # msgctxt "Addon Summary" # msgid "Plugin for YouTube" -# msgstr "Plugin für YouTube" +# msgstr "" # msgctxt "Addon Description" # msgid "YouTube is a one of the biggest video-sharing websites of the world." -# msgstr "YouTube ist eines der größten Video-Sharing-Websites der Welt." +# msgstr "" # Kodion Settings msgctxt "#30000" -msgid "General" -msgstr "Allgemein" +msgid "" +msgstr "" msgctxt "#30001" msgid "" @@ -151,8 +151,8 @@ msgid "Configure %s?" msgstr "%s konfigurieren?" msgctxt "#30031" -msgid "Advanced" -msgstr "Fortgeschritten" +msgid "" +msgstr "" msgctxt "#30032" msgid "View: TV Shows" @@ -217,8 +217,8 @@ msgid "Watch Later" msgstr "Später ansehen" msgctxt "#30108" -msgid "Remove" -msgstr "Entfernen" +msgid "" +msgstr "" msgctxt "#30109" msgid "" @@ -237,8 +237,8 @@ msgid "Sign Out" msgstr "Abmelden" msgctxt "#30113" -msgid "Rename" -msgstr "Umbenennen" +msgid "" +msgstr "" msgctxt "#30114" msgid "Confirm delete" @@ -257,8 +257,8 @@ msgid "Remove \"%s\"?" msgstr "Soll \"%s\" entfernt werden?" msgctxt "#30118" -msgid "Delete" -msgstr "Löschen" +msgid "" +msgstr "" msgctxt "#30119" msgid "Please wait..." @@ -301,12 +301,12 @@ msgstr "" # YouTube # empty strings from id 30206 to 30499 msgctxt "#30500" -msgid "Channels" -msgstr "Kanäle" +msgid "" +msgstr "" msgctxt "#30501" -msgid "Playlists" -msgstr "Wiedergabelisten" +msgid "" +msgstr "" msgctxt "#30502" msgid "Go to %s" @@ -361,8 +361,8 @@ msgid "Related Videos" msgstr "Ähnliche Videos" msgctxt "#30515" -msgid "Auto-Remove from 'Watch Later'" -msgstr "Auto-Entfernen für „Später ansehen“" +msgid "Auto-Remove from Watch Later" +msgstr "Auto-Entfernen aus „Später ansehen“" msgctxt "#30516" msgid "Folders" @@ -385,16 +385,16 @@ msgid "Add to..." msgstr "Hinzufügen zu ..." msgctxt "#30521" -msgid "Select playlist" -msgstr "Wiedergabeliste auswählen" +msgid "" +msgstr "" msgctxt "#30522" -msgid "New playlist..." -msgstr "Neue Wiedergabeliste ..." +msgid "" +msgstr "" msgctxt "#30523" -msgid "Language" -msgstr "Sprache" +msgid "" +msgstr "" msgctxt "#30524" msgid "Select language" @@ -425,20 +425,20 @@ msgid "I dislike this" msgstr "Gefällt mir nicht" msgctxt "#30531" -msgid "Play all" -msgstr "Alle wiedergeben" +msgid "" +msgstr "" msgctxt "#30532" -msgid "Default" -msgstr "Standard" +msgid "" +msgstr "" msgctxt "#30533" msgid "Reverse" msgstr "Rückwärts" msgctxt "#30534" -msgid "Shuffle" -msgstr "Zufall" +msgid "" +msgstr "" msgctxt "#30535" msgid "Select the order of the playlist" @@ -457,8 +457,8 @@ msgid "Disliked Videos" msgstr "Negativ bewertete Videos" msgctxt "#30539" -msgid "Live" -msgstr "Live" +msgid "" +msgstr "" msgctxt "#30540" msgid "Play with..." @@ -473,8 +473,8 @@ msgid "rtmpe streams are not supported" msgstr "RTMPE-Streams werden nicht unterstützt" msgctxt "#30543" -msgid "Refresh" -msgstr "Aktualisieren" +msgid "" +msgstr "" msgctxt "#30544" msgid "More Links from the description" @@ -485,24 +485,24 @@ msgid "No further links found." msgstr "Keine weiteren Links gefunden." msgctxt "#30546" -msgid "Please log in twice!" -msgstr "Bitte zweimal anmelden!" +msgid "Please complete all login prompts" +msgstr "Bitte alle Anmeldeaufforderungen abschliessen" msgctxt "#30547" -msgid "You must enable two applications so that YouTube is functioning properly." -msgstr "Es müssen zwei Anwendungen aktiviert sein, damit YouTube funktioniert." +msgid "You may be prompted to enable two applications so that YouTube is functioning properly." +msgstr "Es kann zum Aktivieren on zwei Anwendungen aufgefordert werden, damit YouTube korrekt funktioniert." msgctxt "#30548" -msgid "More..." -msgstr "Mehr ..." +msgid "" +msgstr "" msgctxt "#30549" msgid "No videos streams found" msgstr "Keine Video-Streams gefunden" msgctxt "#30550" -msgid "Region" -msgstr "Region" +msgid "" +msgstr "" msgctxt "#30551" msgid "Recommendations" @@ -541,17 +541,17 @@ msgid "Delete settings.xml" msgstr "settings.xml löschen" msgctxt "#30560" -msgid "Subtitle language" -msgstr "Untertitelsprache" +msgid "" +msgstr "" msgctxt "#30561" -msgid "None" -msgstr "Keine" - -msgctxt "#30562" msgid "" msgstr "" +msgctxt "#30562" +msgid "View all" +msgstr "Alle ansehen" + msgctxt "#30563" msgid "" msgstr "" @@ -565,8 +565,8 @@ msgid "" msgstr "" msgctxt "#30566" -msgid "Prompt" -msgstr "Nachfragen" +msgid "" +msgstr "" msgctxt "#30567" msgid "Set as Watch Later" @@ -577,12 +577,12 @@ msgid "Remove as Watch Later" msgstr "Aus „Später ansehen“ entfernen" msgctxt "#30569" -msgid "Are you sure you want to remove '%s' as your Watch Later list?" -msgstr "‚%s‘ wirklich aus Später-Ansehen-Liste entfernen?" +msgid "Are you sure you want to remove \"%s\" as your Watch Later list?" +msgstr "„%s“ wirklich als „Später ansehen“-Liste entfernen?" msgctxt "#30570" -msgid "Are you sure you want to replace your current Watch Later list with '%s'?" -msgstr "Die aktuelle Später-Ansehen-Liste wirklich durch ‚%s‘ ersetzen?" +msgid "Are you sure you want to replace your current Watch Later list with \"%s\"?" +msgstr "Die aktuelle „Später ansehen“-Liste wirklich durch „%s“ ersetzen?" msgctxt "#30571" msgid "Set as History" @@ -593,12 +593,12 @@ msgid "Remove as History" msgstr "Aus Verlauf entfernen" msgctxt "#30573" -msgid "Are you sure you want to remove '%s' as your History list?" -msgstr "‚%s‘ wirklich aus dem Verlauf entfernen?" +msgid "Are you sure you want to remove \"%s\" as your History list?" +msgstr "„%s“ wirklich als Verlaufsliste entfernen?" msgctxt "#30574" -msgid "Are you sure you want to replace your current History list with '%s'?" -msgstr "Den aktuellen Verlauf wirklich durch ‚%s‘ ersetzen?" +msgid "Are you sure you want to replace your current History list with \"%s\"?" +msgstr "Die aktuelle Verlaufsliste wirklich durch „%s“ ersetzen?" msgctxt "#30575" msgid "Succeeded" @@ -609,8 +609,8 @@ msgid "Failed" msgstr "Fehlgeschlagen" msgctxt "#30577" -msgid "Settings" -msgstr "Einstellungen" +msgid "" +msgstr "" msgctxt "#30578" msgid "Force SSL certificate verification" @@ -633,8 +633,8 @@ msgid "Autoplay suggested videos" msgstr "Vorgeschlagene Videos automatisch wiedergeben" msgctxt "#30583" -msgid "Automatic" -msgstr "Automatisch" +msgid "" +msgstr "" msgctxt "#30584" msgid "My Subscriptions (Filtered)" @@ -693,16 +693,16 @@ msgid "Updated: %s" msgstr "Aktualisiert: %s" msgctxt "#30598" -msgid "Personal API keys enabled" -msgstr "Persönliche API-Schlüssel aktiviert" +msgid "" +msgstr "" msgctxt "#30599" msgid "Failed to enable personal API keys. Missing: %s" msgstr "Aktivierung persönlicher API-Schlüssel fehlgeschlagen. Folgendes fehlt: %s" msgctxt "#30600" -msgid "Subtitles" -msgstr "Untertitel" +msgid "" +msgstr "" msgctxt "#30601" msgid "%s with Original/%s fallback" @@ -761,8 +761,8 @@ msgid "" msgstr "" msgctxt "#30615" -msgid "Cancel" -msgstr "Abbrechen" +msgid "" +msgstr "" msgctxt "#30616" msgid "" @@ -777,8 +777,8 @@ msgid "" msgstr "" msgctxt "#30619" -msgid "Port" -msgstr "Port" +msgid "" +msgstr "" msgctxt "#30620" msgid "Port %s already in use. Cannot start http server." @@ -821,8 +821,8 @@ msgid "IP whitelist (comma delimited)" msgstr "IP-Whitelist (durch Komma getrennt)" msgctxt "#30630" -msgid "Save" -msgstr "Speichern" +msgid "" +msgstr "" msgctxt "#30631" msgid "Successfully updated: %s" @@ -937,8 +937,8 @@ msgid "Enter a name for this user" msgstr "Einen Namen für diesen Benutzer eingeben" msgctxt "#30659" -msgid "User is now '%s'" -msgstr "Der aktuelle Benutzer ist nun ‚%s‘" +msgid "User is now \"%s\"" +msgstr "Benutzer ist nun „%s“" msgctxt "#30660" msgid "Users" @@ -961,16 +961,16 @@ msgid "Switch user" msgstr "Benutzer wechseln" msgctxt "#30665" -msgid "Switch to '%s' now?" -msgstr "Zu ‚%s‘ wechseln?" +msgid "Switch to \"%s\" now?" +msgstr "Jetzt zu „%s“ wechseln?" msgctxt "#30666" -msgid "%s removed" -msgstr "%s entfernt" +msgid "\"%s\" removed" +msgstr "„%s“ entfernt" msgctxt "#30667" -msgid "Renamed '%s' to '%s'" -msgstr "‚%s‘ zu ‚%s‘ umbenannt" +msgid "Renamed \"%s\" to \"%s\"" +msgstr "„%s“ zu „%s“ umbenannt" msgctxt "#30668" msgid "Play count minimum percent" @@ -1113,8 +1113,8 @@ msgid "Play with subtitles" msgstr "Mit Unteriteln wiedergeben" msgctxt "#30703" -msgid "Are you sure?" -msgstr "Ganz sicher?" +msgid "" +msgstr "" msgctxt "#30704" msgid "Use YouTube website urls with default player" @@ -1166,7 +1166,7 @@ msgstr "Aus Wiedergabeliste entfernt" msgctxt "#30716" msgid "Liked video" -msgstr "Positiv bewertete Videos" +msgstr "Positiv bewertetes Video" msgctxt "#30717" msgid "Disliked video" @@ -1234,7 +1234,7 @@ msgstr "Kommentare" msgctxt "#30733" msgid "Likes" -msgstr "Anzahl von positiven Bewertungen" +msgstr "Positive Bewertungen" msgctxt "#30734" msgid "Replies" @@ -1257,8 +1257,8 @@ msgid "" msgstr "" msgctxt "#30739" -msgid "" -msgstr "" +msgid "Subscribers" +msgstr "Abonnenten" msgctxt "#30740" msgid "HLS" @@ -1477,12 +1477,12 @@ msgid "Views count display colour" msgstr "Farbe für „Aufrufe“" msgctxt "#30794" -msgid "Likes count display colour" -msgstr "Farbe für „Positive Bewertungen“" +msgid "Subscriber/Likes count display colour" +msgstr "Anzeigefarbe für Abonnenten-/Likes-Anzahl" msgctxt "#30795" -msgid "Comments count display colour" -msgstr "Farbe für „Kommentare“" +msgid "Videos/Comments count display colour" +msgstr "Anzeigefarbe für Video-/Kommentaranzahl" msgctxt "#30796" msgid "1080p/60 fps | Raspberry Pi 4, or similar" @@ -1580,6 +1580,191 @@ msgctxt "#30819" msgid "Play from start" msgstr "Wiedergabe vom Anfang" +msgctxt "#30820" +msgid "Podcast" +msgstr "Podcast" + +#~ msgctxt "#30515" +#~ msgid "Auto-Remove from 'Watch Later'" +#~ msgstr "Auto-Entfernen für „Später ansehen“" + +#~ msgctxt "#30569" +#~ msgid "Are you sure you want to remove '%s' as your Watch Later list?" +#~ msgstr "‚%s‘ wirklich aus Später-Ansehen-Liste entfernen?" + +#~ msgctxt "#30570" +#~ msgid "Are you sure you want to replace your current Watch Later list with '%s'?" +#~ msgstr "Die aktuelle Später-Ansehen-Liste wirklich durch ‚%s‘ ersetzen?" + +#~ msgctxt "#30573" +#~ msgid "Are you sure you want to remove '%s' as your History list?" +#~ msgstr "‚%s‘ wirklich aus dem Verlauf entfernen?" + +#~ msgctxt "#30574" +#~ msgid "Are you sure you want to replace your current History list with '%s'?" +#~ msgstr "Den aktuellen Verlauf wirklich durch ‚%s‘ ersetzen?" + +#~ msgctxt "#30659" +#~ msgid "User is now '%s'" +#~ msgstr "Der aktuelle Benutzer ist nun ‚%s‘" + +#~ msgctxt "#30665" +#~ msgid "Switch to '%s' now?" +#~ msgstr "Zu ‚%s‘ wechseln?" + +#~ msgctxt "#30666" +#~ msgid "%s removed" +#~ msgstr "%s entfernt" + +#~ msgctxt "#30667" +#~ msgid "Renamed '%s' to '%s'" +#~ msgstr "‚%s‘ zu ‚%s‘ umbenannt" + +# msgctxt "Addon Summary" +# msgid "Plugin for YouTube" +# msgstr "Plugin für YouTube" +# msgctxt "Addon Description" +# msgid "YouTube is a one of the biggest video-sharing websites of the world." +# msgstr "YouTube ist eines der größten Video-Sharing-Websites der Welt." +# Kodion Settings +#~ msgctxt "#30000" +#~ msgid "General" +#~ msgstr "Allgemein" + +#~ msgctxt "#30031" +#~ msgid "Advanced" +#~ msgstr "Fortgeschritten" + +#~ msgctxt "#30108" +#~ msgid "Remove" +#~ msgstr "Entfernen" + +#~ msgctxt "#30113" +#~ msgid "Rename" +#~ msgstr "Umbenennen" + +#~ msgctxt "#30118" +#~ msgid "Delete" +#~ msgstr "Löschen" + +# YouTube +# empty strings from id 30206 to 30499 +#~ msgctxt "#30500" +#~ msgid "Channels" +#~ msgstr "Kanäle" + +#~ msgctxt "#30501" +#~ msgid "Playlists" +#~ msgstr "Wiedergabelisten" + +#~ msgctxt "#30521" +#~ msgid "Select playlist" +#~ msgstr "Wiedergabeliste auswählen" + +#~ msgctxt "#30522" +#~ msgid "New playlist..." +#~ msgstr "Neue Wiedergabeliste ..." + +#~ msgctxt "#30523" +#~ msgid "Language" +#~ msgstr "Sprache" + +#~ msgctxt "#30531" +#~ msgid "Play all" +#~ msgstr "Alle wiedergeben" + +#~ msgctxt "#30532" +#~ msgid "Default" +#~ msgstr "Standard" + +#~ msgctxt "#30534" +#~ msgid "Shuffle" +#~ msgstr "Zufall" + +#~ msgctxt "#30539" +#~ msgid "Live" +#~ msgstr "Live" + +#~ msgctxt "#30543" +#~ msgid "Refresh" +#~ msgstr "Aktualisieren" + +#~ msgctxt "#30548" +#~ msgid "More..." +#~ msgstr "Mehr ..." + +#~ msgctxt "#30550" +#~ msgid "Region" +#~ msgstr "Region" + +#~ msgctxt "#30560" +#~ msgid "Subtitle language" +#~ msgstr "Untertitelsprache" + +#~ msgctxt "#30561" +#~ msgid "None" +#~ msgstr "Keine" + +#~ msgctxt "#30566" +#~ msgid "Prompt" +#~ msgstr "Nachfragen" + +#~ msgctxt "#30577" +#~ msgid "Settings" +#~ msgstr "Einstellungen" + +#~ msgctxt "#30583" +#~ msgid "Automatic" +#~ msgstr "Automatisch" + +#~ msgctxt "#30598" +#~ msgid "Personal API keys enabled" +#~ msgstr "Persönliche API-Schlüssel aktiviert" + +#~ msgctxt "#30600" +#~ msgid "Subtitles" +#~ msgstr "Untertitel" + +#~ msgctxt "#30615" +#~ msgid "Cancel" +#~ msgstr "Abbrechen" + +#~ msgctxt "#30619" +#~ msgid "Port" +#~ msgstr "Port" + +#~ msgctxt "#30630" +#~ msgid "Save" +#~ msgstr "Speichern" + +#~ msgctxt "#30703" +#~ msgid "Are you sure?" +#~ msgstr "Ganz sicher?" + +#~ msgctxt "#30737" +#~ msgid "Episodes" +#~ msgstr "Episoden" + +#~ msgctxt "#30738" +#~ msgid "Videos" +#~ msgstr "Videos" + +#~ msgctxt "#30794" +#~ msgid "Likes count display colour" +#~ msgstr "Farbe für „Positive Bewertungen“" + +#~ msgctxt "#30795" +#~ msgid "Comments count display colour" +#~ msgstr "Farbe für „Kommentare“" + +#~ msgctxt "#30546" +#~ msgid "Please log in twice!" +#~ msgstr "Bitte zweimal anmelden!" + +#~ msgctxt "#30547" +#~ msgid "You must enable two applications so that YouTube is functioning properly." +#~ msgstr "Es müssen zwei Anwendungen aktiviert sein, damit YouTube funktioniert." + #~ msgctxt "#30001" #~ msgid "Username" #~ msgstr "Benutzername" diff --git a/plugin.video.youtube/resources/language/resource.language.el_gr/strings.po b/plugin.video.youtube/resources/language/resource.language.el_gr/strings.po index d7ac8f08ba..d6eeba67b9 100644 --- a/plugin.video.youtube/resources/language/resource.language.el_gr/strings.po +++ b/plugin.video.youtube/resources/language/resource.language.el_gr/strings.po @@ -31,14 +31,14 @@ msgstr "Η παρούσα μικροεφαρμογή δεν έχει υϊοθε # msgctxt "Addon Summary" # msgid "Plugin for YouTube" -# msgstr "Πρόσθετο Youtube" +# msgstr "" # msgctxt "Addon Description" # msgid "YouTube is a one of the biggest video-sharing websites of the world." -# msgstr "Το Youtube είναι μία από τις μεγαλύτερες ιστοσελίδες διαμοιρασμού βίντεο στον κόσμο" +# msgstr "" # Kodion Settings msgctxt "#30000" -msgid "General" -msgstr "Γενικά" +msgid "" +msgstr "" msgctxt "#30001" msgid "" @@ -151,8 +151,8 @@ msgid "Configure %s?" msgstr "" msgctxt "#30031" -msgid "Advanced" -msgstr "Για προχωρημένους" +msgid "" +msgstr "" msgctxt "#30032" msgid "View: TV Shows" @@ -217,8 +217,8 @@ msgid "Watch Later" msgstr "Δείτε αργότερα" msgctxt "#30108" -msgid "Remove" -msgstr "Αφαίρεση" +msgid "" +msgstr "" msgctxt "#30109" msgid "" @@ -237,8 +237,8 @@ msgid "Sign Out" msgstr "Έξοδος" msgctxt "#30113" -msgid "Rename" -msgstr "Μετονομασία" +msgid "" +msgstr "" msgctxt "#30114" msgid "Confirm delete" @@ -257,8 +257,8 @@ msgid "Remove \"%s\"?" msgstr "Αφαίρεση \"%s\"?" msgctxt "#30118" -msgid "Delete" -msgstr "Διαγραφή" +msgid "" +msgstr "" msgctxt "#30119" msgid "Please wait..." @@ -301,12 +301,12 @@ msgstr "" # YouTube # empty strings from id 30206 to 30499 msgctxt "#30500" -msgid "Channels" -msgstr "Κανάλια" +msgid "" +msgstr "" msgctxt "#30501" -msgid "Playlists" -msgstr "Λίστες αναπαραγωγής" +msgid "" +msgstr "" msgctxt "#30502" msgid "Go to %s" @@ -361,8 +361,8 @@ msgid "Related Videos" msgstr "Σχετικά βίντεο" msgctxt "#30515" -msgid "Auto-Remove from 'Watch Later'" -msgstr "Αυτόματη αφαίρεση από την λίστα 'Δείτε αργότερα'" +msgid "Auto-Remove from Watch Later" +msgstr "" msgctxt "#30516" msgid "Folders" @@ -385,16 +385,16 @@ msgid "Add to..." msgstr "Προσθέστε στο..." msgctxt "#30521" -msgid "Select playlist" -msgstr "Επιλογή λίστας αναπαραγωγής" +msgid "" +msgstr "" msgctxt "#30522" -msgid "New playlist..." -msgstr "Νέα λίστα αναπαραγωγής..." +msgid "" +msgstr "" msgctxt "#30523" -msgid "Language" -msgstr "Γλώσσα" +msgid "" +msgstr "" msgctxt "#30524" msgid "Select language" @@ -425,20 +425,20 @@ msgid "I dislike this" msgstr "Δεν μου αρέσει αυτό" msgctxt "#30531" -msgid "Play all" -msgstr "Αναπαραγωγή όλων" +msgid "" +msgstr "" msgctxt "#30532" -msgid "Default" -msgstr "Προεπιλογή" +msgid "" +msgstr "" msgctxt "#30533" msgid "Reverse" msgstr "Προς τα πίσω" msgctxt "#30534" -msgid "Shuffle" -msgstr "Τυχαία σειρά" +msgid "" +msgstr "" msgctxt "#30535" msgid "Select the order of the playlist" @@ -457,8 +457,8 @@ msgid "Disliked Videos" msgstr "Βίντεο που δεν σας αρέσουν" msgctxt "#30539" -msgid "Live" -msgstr "Ζωντανά" +msgid "" +msgstr "" msgctxt "#30540" msgid "Play with..." @@ -473,8 +473,8 @@ msgid "rtmpe streams are not supported" msgstr "Οι ροές rtmpe δεν υποστηρίζονται" msgctxt "#30543" -msgid "Refresh" -msgstr "Ανανέωση" +msgid "" +msgstr "" msgctxt "#30544" msgid "More Links from the description" @@ -485,24 +485,24 @@ msgid "No further links found." msgstr "Δεν βρέθηκαν άλλοι σύνδεσμοι." msgctxt "#30546" -msgid "Please log in twice!" -msgstr "Παρακαλώ πραγματοποιήστε είσοδο δύο φορές!" +msgid "Please complete all login prompts" +msgstr "" msgctxt "#30547" -msgid "You must enable two applications so that YouTube is functioning properly." -msgstr "Πρέπει να επιτρέψετε δύο εφαρμογές του πρόσθετου Youtube ώστε να λειτουργεί σωστά" +msgid "You may be prompted to enable two applications so that YouTube is functioning properly." +msgstr "" msgctxt "#30548" -msgid "More..." -msgstr "Περισσότερα..." +msgid "" +msgstr "" msgctxt "#30549" msgid "No videos streams found" msgstr "Δεν βρέθηκαν άλλες ροές" msgctxt "#30550" -msgid "Region" -msgstr "Περιοχή" +msgid "" +msgstr "" msgctxt "#30551" msgid "Recommendations" @@ -541,15 +541,15 @@ msgid "Delete settings.xml" msgstr "Διαγραφή του settings.xml" msgctxt "#30560" -msgid "Subtitle language" -msgstr "Γλώσσα υποτίτλων" +msgid "" +msgstr "" msgctxt "#30561" -msgid "None" -msgstr "Καμία" +msgid "" +msgstr "" msgctxt "#30562" -msgid "" +msgid "View all" msgstr "" msgctxt "#30563" @@ -565,8 +565,8 @@ msgid "" msgstr "" msgctxt "#30566" -msgid "Prompt" -msgstr "Ερώτηση" +msgid "" +msgstr "" msgctxt "#30567" msgid "Set as Watch Later" @@ -577,12 +577,12 @@ msgid "Remove as Watch Later" msgstr "Αφαίρεση από το Δείτε Αργότερα" msgctxt "#30569" -msgid "Are you sure you want to remove '%s' as your Watch Later list?" -msgstr "Είστε βέβαιοι ότι θέλετε να αφαιρέσετε το '%s' από το 'Δείτε Αργότερα'?" +msgid "Are you sure you want to remove \"%s\" as your Watch Later list?" +msgstr "" msgctxt "#30570" -msgid "Are you sure you want to replace your current Watch Later list with '%s'?" -msgstr "Είστε βέβαιοι ότι θέλετε να αντικαταστήσετε την τρέχουσα λίστα 'Δείτε Αργότερα' με το '%s'?" +msgid "Are you sure you want to replace your current Watch Later list with \"%s\"?" +msgstr "" msgctxt "#30571" msgid "Set as History" @@ -593,12 +593,12 @@ msgid "Remove as History" msgstr "Αφαίρεση από ιστορικό" msgctxt "#30573" -msgid "Are you sure you want to remove '%s' as your History list?" -msgstr "Είστε βέβαιοι ότι θέλετε να αφαιρέσετε το '%s' ως την λίστα ιστορικού σας?" +msgid "Are you sure you want to remove \"%s\" as your History list?" +msgstr "" msgctxt "#30574" -msgid "Are you sure you want to replace your current History list with '%s'?" -msgstr "Είστε βέβαιοι ότι θέλετε να αντικαταστήσετε την τρέχουσα λίστα ιστορικού με το '%s'?" +msgid "Are you sure you want to replace your current History list with \"%s\"?" +msgstr "" msgctxt "#30575" msgid "Succeeded" @@ -609,8 +609,8 @@ msgid "Failed" msgstr "Αποτυχία" msgctxt "#30577" -msgid "Settings" -msgstr "Ρυθμίσεις" +msgid "" +msgstr "" msgctxt "#30578" msgid "Force SSL certificate verification" @@ -633,8 +633,8 @@ msgid "Autoplay suggested videos" msgstr "Αυτόματη αναπαραγωγή προτεινόμενων βίντεο" msgctxt "#30583" -msgid "Automatic" -msgstr "Αυτόματο" +msgid "" +msgstr "" msgctxt "#30584" msgid "My Subscriptions (Filtered)" @@ -693,15 +693,15 @@ msgid "Updated: %s" msgstr "Ενημερωθηκε: %s" msgctxt "#30598" -msgid "Personal API keys enabled" -msgstr "Προσωπικά κλειδιά API ενεργοποιήθηκαν" +msgid "" +msgstr "" msgctxt "#30599" msgid "Failed to enable personal API keys. Missing: %s" msgstr "Αποτυχία ενεργοποίησης προσωπικών κλειδιών API. Λείπει: %s" msgctxt "#30600" -msgid "Subtitles" +msgid "" msgstr "" msgctxt "#30601" @@ -761,8 +761,8 @@ msgid "" msgstr "" msgctxt "#30615" -msgid "Cancel" -msgstr "Ακύρωση" +msgid "" +msgstr "" msgctxt "#30616" msgid "" @@ -777,8 +777,8 @@ msgid "" msgstr "" msgctxt "#30619" -msgid "Port" -msgstr "Θύρα" +msgid "" +msgstr "" msgctxt "#30620" msgid "Port %s already in use. Cannot start http server." @@ -821,8 +821,8 @@ msgid "IP whitelist (comma delimited)" msgstr "Λίστα επιτρεπομένων IP (διαχωρισμένες με κόμμα)" msgctxt "#30630" -msgid "Save" -msgstr "Αποθήκευση" +msgid "" +msgstr "" msgctxt "#30631" msgid "Successfully updated: %s" @@ -937,8 +937,8 @@ msgid "Enter a name for this user" msgstr "Εισαγωγή ονόματος για αυτόν τον χρήστη" msgctxt "#30659" -msgid "User is now '%s'" -msgstr "Τωρινός χρήστης '%s'" +msgid "User is now \"%s\"" +msgstr "" msgctxt "#30660" msgid "Users" @@ -961,16 +961,16 @@ msgid "Switch user" msgstr "Αλλαγή χρήστη" msgctxt "#30665" -msgid "Switch to '%s' now?" -msgstr "Αλλαγή στον/στην '%s' τώρα;" +msgid "Switch to \"%s\" now?" +msgstr "" msgctxt "#30666" -msgid "%s removed" +msgid "\"%s\" removed" msgstr "" msgctxt "#30667" -msgid "Renamed '%s' to '%s'" -msgstr "Αλλαγή '%s' σε '%s'" +msgid "Renamed \"%s\" to \"%s\"" +msgstr "" msgctxt "#30668" msgid "Play count minimum percent" @@ -1113,8 +1113,8 @@ msgid "Play with subtitles" msgstr "Αναπαραγωγή με υπότιτλους" msgctxt "#30703" -msgid "Are you sure?" -msgstr "Είστε σίγουροι;" +msgid "" +msgstr "" msgctxt "#30704" msgid "Use YouTube website urls with default player" @@ -1257,7 +1257,7 @@ msgid "" msgstr "" msgctxt "#30739" -msgid "" +msgid "Subscribers" msgstr "" msgctxt "#30740" @@ -1477,11 +1477,11 @@ msgid "Views count display colour" msgstr "" msgctxt "#30794" -msgid "Likes count display colour" +msgid "Subscriber/Likes count display colour" msgstr "" msgctxt "#30795" -msgid "Comments count display colour" +msgid "Videos/Comments count display colour" msgstr "" msgctxt "#30796" @@ -1580,6 +1580,167 @@ msgctxt "#30819" msgid "Play from start" msgstr "" +msgctxt "#30820" +msgid "Podcast" +msgstr "" + +#~ msgctxt "#30515" +#~ msgid "Auto-Remove from 'Watch Later'" +#~ msgstr "Αυτόματη αφαίρεση από την λίστα 'Δείτε αργότερα'" + +#~ msgctxt "#30569" +#~ msgid "Are you sure you want to remove '%s' as your Watch Later list?" +#~ msgstr "Είστε βέβαιοι ότι θέλετε να αφαιρέσετε το '%s' από το 'Δείτε Αργότερα'?" + +#~ msgctxt "#30570" +#~ msgid "Are you sure you want to replace your current Watch Later list with '%s'?" +#~ msgstr "Είστε βέβαιοι ότι θέλετε να αντικαταστήσετε την τρέχουσα λίστα 'Δείτε Αργότερα' με το '%s'?" + +#~ msgctxt "#30573" +#~ msgid "Are you sure you want to remove '%s' as your History list?" +#~ msgstr "Είστε βέβαιοι ότι θέλετε να αφαιρέσετε το '%s' ως την λίστα ιστορικού σας?" + +#~ msgctxt "#30574" +#~ msgid "Are you sure you want to replace your current History list with '%s'?" +#~ msgstr "Είστε βέβαιοι ότι θέλετε να αντικαταστήσετε την τρέχουσα λίστα ιστορικού με το '%s'?" + +#~ msgctxt "#30659" +#~ msgid "User is now '%s'" +#~ msgstr "Τωρινός χρήστης '%s'" + +#~ msgctxt "#30665" +#~ msgid "Switch to '%s' now?" +#~ msgstr "Αλλαγή στον/στην '%s' τώρα;" + +#~ msgctxt "#30667" +#~ msgid "Renamed '%s' to '%s'" +#~ msgstr "Αλλαγή '%s' σε '%s'" + +# msgctxt "Addon Summary" +# msgid "Plugin for YouTube" +# msgstr "Πρόσθετο Youtube" +# msgctxt "Addon Description" +# msgid "YouTube is a one of the biggest video-sharing websites of the world." +# msgstr "Το Youtube είναι μία από τις μεγαλύτερες ιστοσελίδες διαμοιρασμού βίντεο στον κόσμο" +# Kodion Settings +#~ msgctxt "#30000" +#~ msgid "General" +#~ msgstr "Γενικά" + +#~ msgctxt "#30031" +#~ msgid "Advanced" +#~ msgstr "Για προχωρημένους" + +#~ msgctxt "#30108" +#~ msgid "Remove" +#~ msgstr "Αφαίρεση" + +#~ msgctxt "#30113" +#~ msgid "Rename" +#~ msgstr "Μετονομασία" + +#~ msgctxt "#30118" +#~ msgid "Delete" +#~ msgstr "Διαγραφή" + +# YouTube +# empty strings from id 30206 to 30499 +#~ msgctxt "#30500" +#~ msgid "Channels" +#~ msgstr "Κανάλια" + +#~ msgctxt "#30501" +#~ msgid "Playlists" +#~ msgstr "Λίστες αναπαραγωγής" + +#~ msgctxt "#30521" +#~ msgid "Select playlist" +#~ msgstr "Επιλογή λίστας αναπαραγωγής" + +#~ msgctxt "#30522" +#~ msgid "New playlist..." +#~ msgstr "Νέα λίστα αναπαραγωγής..." + +#~ msgctxt "#30523" +#~ msgid "Language" +#~ msgstr "Γλώσσα" + +#~ msgctxt "#30531" +#~ msgid "Play all" +#~ msgstr "Αναπαραγωγή όλων" + +#~ msgctxt "#30532" +#~ msgid "Default" +#~ msgstr "Προεπιλογή" + +#~ msgctxt "#30534" +#~ msgid "Shuffle" +#~ msgstr "Τυχαία σειρά" + +#~ msgctxt "#30539" +#~ msgid "Live" +#~ msgstr "Ζωντανά" + +#~ msgctxt "#30543" +#~ msgid "Refresh" +#~ msgstr "Ανανέωση" + +#~ msgctxt "#30548" +#~ msgid "More..." +#~ msgstr "Περισσότερα..." + +#~ msgctxt "#30550" +#~ msgid "Region" +#~ msgstr "Περιοχή" + +#~ msgctxt "#30560" +#~ msgid "Subtitle language" +#~ msgstr "Γλώσσα υποτίτλων" + +#~ msgctxt "#30561" +#~ msgid "None" +#~ msgstr "Καμία" + +#~ msgctxt "#30566" +#~ msgid "Prompt" +#~ msgstr "Ερώτηση" + +#~ msgctxt "#30577" +#~ msgid "Settings" +#~ msgstr "Ρυθμίσεις" + +#~ msgctxt "#30583" +#~ msgid "Automatic" +#~ msgstr "Αυτόματο" + +#~ msgctxt "#30598" +#~ msgid "Personal API keys enabled" +#~ msgstr "Προσωπικά κλειδιά API ενεργοποιήθηκαν" + +#~ msgctxt "#30615" +#~ msgid "Cancel" +#~ msgstr "Ακύρωση" + +#~ msgctxt "#30619" +#~ msgid "Port" +#~ msgstr "Θύρα" + +#~ msgctxt "#30630" +#~ msgid "Save" +#~ msgstr "Αποθήκευση" + +#~ msgctxt "#30703" +#~ msgid "Are you sure?" +#~ msgstr "Είστε σίγουροι;" + +#~ msgctxt "#30546" +#~ msgid "Please log in twice!" +#~ msgstr "Παρακαλώ πραγματοποιήστε είσοδο δύο φορές!" + +#~ msgctxt "#30547" +#~ msgid "You must enable two applications so that YouTube is functioning properly." +#~ msgstr "Πρέπει να επιτρέψετε δύο εφαρμογές του πρόσθετου Youtube ώστε να λειτουργεί σωστά" + #~ msgctxt "#30001" #~ msgid "Username" #~ msgstr "Όνομα χρήστη" diff --git a/plugin.video.youtube/resources/language/resource.language.en_au/strings.po b/plugin.video.youtube/resources/language/resource.language.en_au/strings.po index 2783e3ed12..958f0a89d4 100644 --- a/plugin.video.youtube/resources/language/resource.language.en_au/strings.po +++ b/plugin.video.youtube/resources/language/resource.language.en_au/strings.po @@ -37,7 +37,7 @@ msgstr "" # msgstr "" # Kodion Settings msgctxt "#30000" -msgid "General" +msgid "" msgstr "" msgctxt "#30001" @@ -150,7 +150,7 @@ msgid "Configure %s?" msgstr "" msgctxt "#30031" -msgid "Advanced" +msgid "" msgstr "" msgctxt "#30032" @@ -216,7 +216,7 @@ msgid "Watch Later" msgstr "" msgctxt "#30108" -msgid "Remove" +msgid "" msgstr "" msgctxt "#30109" @@ -236,7 +236,7 @@ msgid "Sign Out" msgstr "" msgctxt "#30113" -msgid "Rename" +msgid "" msgstr "" msgctxt "#30114" @@ -256,7 +256,7 @@ msgid "Remove \"%s\"?" msgstr "" msgctxt "#30118" -msgid "Delete" +msgid "" msgstr "" msgctxt "#30119" @@ -300,11 +300,11 @@ msgstr "" # YouTube # empty strings from id 30206 to 30499 msgctxt "#30500" -msgid "Channels" +msgid "" msgstr "" msgctxt "#30501" -msgid "Playlists" +msgid "" msgstr "" msgctxt "#30502" @@ -360,7 +360,7 @@ msgid "Related Videos" msgstr "" msgctxt "#30515" -msgid "Auto-Remove from 'Watch Later'" +msgid "Auto-Remove from Watch Later" msgstr "" msgctxt "#30516" @@ -384,15 +384,15 @@ msgid "Add to..." msgstr "" msgctxt "#30521" -msgid "Select playlist" +msgid "" msgstr "" msgctxt "#30522" -msgid "New playlist..." +msgid "" msgstr "" msgctxt "#30523" -msgid "Language" +msgid "" msgstr "" msgctxt "#30524" @@ -424,11 +424,11 @@ msgid "I dislike this" msgstr "" msgctxt "#30531" -msgid "Play all" +msgid "" msgstr "" msgctxt "#30532" -msgid "Default" +msgid "" msgstr "" msgctxt "#30533" @@ -436,7 +436,7 @@ msgid "Reverse" msgstr "" msgctxt "#30534" -msgid "Shuffle" +msgid "" msgstr "" msgctxt "#30535" @@ -456,7 +456,7 @@ msgid "Disliked Videos" msgstr "" msgctxt "#30539" -msgid "Live" +msgid "" msgstr "" msgctxt "#30540" @@ -472,7 +472,7 @@ msgid "rtmpe streams are not supported" msgstr "" msgctxt "#30543" -msgid "Refresh" +msgid "" msgstr "" msgctxt "#30544" @@ -484,15 +484,15 @@ msgid "No further links found." msgstr "" msgctxt "#30546" -msgid "Please log in twice!" +msgid "Please complete all login prompts" msgstr "" msgctxt "#30547" -msgid "You must enable two applications so that YouTube is functioning properly." +msgid "You may be prompted to enable two applications so that YouTube is functioning properly." msgstr "" msgctxt "#30548" -msgid "More..." +msgid "" msgstr "" msgctxt "#30549" @@ -500,7 +500,7 @@ msgid "No videos streams found" msgstr "" msgctxt "#30550" -msgid "Region" +msgid "" msgstr "" msgctxt "#30551" @@ -540,15 +540,15 @@ msgid "Delete settings.xml" msgstr "" msgctxt "#30560" -msgid "Subtitle language" +msgid "" msgstr "" msgctxt "#30561" -msgid "None" +msgid "" msgstr "" msgctxt "#30562" -msgid "" +msgid "View all" msgstr "" msgctxt "#30563" @@ -564,7 +564,7 @@ msgid "" msgstr "" msgctxt "#30566" -msgid "Prompt" +msgid "" msgstr "" msgctxt "#30567" @@ -576,11 +576,11 @@ msgid "Remove as Watch Later" msgstr "" msgctxt "#30569" -msgid "Are you sure you want to remove '%s' as your Watch Later list?" +msgid "Are you sure you want to remove \"%s\" as your Watch Later list?" msgstr "" msgctxt "#30570" -msgid "Are you sure you want to replace your current Watch Later list with '%s'?" +msgid "Are you sure you want to replace your current Watch Later list with \"%s\"?" msgstr "" msgctxt "#30571" @@ -592,11 +592,11 @@ msgid "Remove as History" msgstr "" msgctxt "#30573" -msgid "Are you sure you want to remove '%s' as your History list?" +msgid "Are you sure you want to remove \"%s\" as your History list?" msgstr "" msgctxt "#30574" -msgid "Are you sure you want to replace your current History list with '%s'?" +msgid "Are you sure you want to replace your current History list with \"%s\"?" msgstr "" msgctxt "#30575" @@ -608,7 +608,7 @@ msgid "Failed" msgstr "" msgctxt "#30577" -msgid "Settings" +msgid "" msgstr "" msgctxt "#30578" @@ -632,7 +632,7 @@ msgid "Autoplay suggested videos" msgstr "" msgctxt "#30583" -msgid "Automatic" +msgid "" msgstr "" msgctxt "#30584" @@ -692,7 +692,7 @@ msgid "Updated: %s" msgstr "" msgctxt "#30598" -msgid "Personal API keys enabled" +msgid "" msgstr "" msgctxt "#30599" @@ -700,7 +700,7 @@ msgid "Failed to enable personal API keys. Missing: %s" msgstr "" msgctxt "#30600" -msgid "Subtitles" +msgid "" msgstr "" msgctxt "#30601" @@ -760,7 +760,7 @@ msgid "" msgstr "" msgctxt "#30615" -msgid "Cancel" +msgid "" msgstr "" msgctxt "#30616" @@ -776,7 +776,7 @@ msgid "" msgstr "" msgctxt "#30619" -msgid "Port" +msgid "" msgstr "" msgctxt "#30620" @@ -820,7 +820,7 @@ msgid "IP whitelist (comma delimited)" msgstr "" msgctxt "#30630" -msgid "Save" +msgid "" msgstr "" msgctxt "#30631" @@ -936,7 +936,7 @@ msgid "Enter a name for this user" msgstr "" msgctxt "#30659" -msgid "User is now '%s'" +msgid "User is now \"%s\"" msgstr "" msgctxt "#30660" @@ -960,15 +960,15 @@ msgid "Switch user" msgstr "" msgctxt "#30665" -msgid "Switch to '%s' now?" +msgid "Switch to \"%s\" now?" msgstr "" msgctxt "#30666" -msgid "%s removed" +msgid "\"%s\" removed" msgstr "" msgctxt "#30667" -msgid "Renamed '%s' to '%s'" +msgid "Renamed \"%s\" to \"%s\"" msgstr "" msgctxt "#30668" @@ -1112,7 +1112,7 @@ msgid "Play with subtitles" msgstr "" msgctxt "#30703" -msgid "Are you sure?" +msgid "" msgstr "" msgctxt "#30704" @@ -1256,7 +1256,7 @@ msgid "" msgstr "" msgctxt "#30739" -msgid "" +msgid "Subscribers" msgstr "" msgctxt "#30740" @@ -1476,11 +1476,11 @@ msgid "Views count display colour" msgstr "" msgctxt "#30794" -msgid "Likes count display colour" +msgid "Subscriber/Likes count display colour" msgstr "" msgctxt "#30795" -msgid "Comments count display colour" +msgid "Videos/Comments count display colour" msgstr "" msgctxt "#30796" @@ -1578,3 +1578,7 @@ msgstr "" msgctxt "#30819" msgid "Play from start" msgstr "" + +msgctxt "#30820" +msgid "Podcast" +msgstr "" diff --git a/plugin.video.youtube/resources/language/resource.language.en_gb/strings.po b/plugin.video.youtube/resources/language/resource.language.en_gb/strings.po index 34a1942970..789273eb85 100644 --- a/plugin.video.youtube/resources/language/resource.language.en_gb/strings.po +++ b/plugin.video.youtube/resources/language/resource.language.en_gb/strings.po @@ -39,7 +39,7 @@ msgstr "" # Kodion Settings msgctxt "#30000" -msgid "General" +msgid "" msgstr "" msgctxt "#30001" @@ -153,7 +153,7 @@ msgid "Configure %s?" msgstr "" msgctxt "#30031" -msgid "Advanced" +msgid "" msgstr "" msgctxt "#30032" @@ -220,7 +220,7 @@ msgid "Watch Later" msgstr "" msgctxt "#30108" -msgid "Remove" +msgid "" msgstr "" msgctxt "#30109" @@ -240,7 +240,7 @@ msgid "Sign Out" msgstr "" msgctxt "#30113" -msgid "Rename" +msgid "" msgstr "" msgctxt "#30114" @@ -260,7 +260,7 @@ msgid "Remove \"%s\"?" msgstr "" msgctxt "#30118" -msgid "Delete" +msgid "" msgstr "" msgctxt "#30119" @@ -306,11 +306,11 @@ msgstr "" # empty strings from id 30206 to 30499 msgctxt "#30500" -msgid "Channels" +msgid "" msgstr "" msgctxt "#30501" -msgid "Playlists" +msgid "" msgstr "" msgctxt "#30502" @@ -366,7 +366,7 @@ msgid "Related Videos" msgstr "" msgctxt "#30515" -msgid "Auto-Remove from 'Watch Later'" +msgid "Auto-Remove from Watch Later" msgstr "" msgctxt "#30516" @@ -390,15 +390,15 @@ msgid "Add to..." msgstr "" msgctxt "#30521" -msgid "Select playlist" +msgid "" msgstr "" msgctxt "#30522" -msgid "New playlist..." +msgid "" msgstr "" msgctxt "#30523" -msgid "Language" +msgid "" msgstr "" msgctxt "#30524" @@ -430,11 +430,11 @@ msgid "I dislike this" msgstr "" msgctxt "#30531" -msgid "Play all" +msgid "" msgstr "" msgctxt "#30532" -msgid "Default" +msgid "" msgstr "" msgctxt "#30533" @@ -442,7 +442,7 @@ msgid "Reverse" msgstr "" msgctxt "#30534" -msgid "Shuffle" +msgid "" msgstr "" msgctxt "#30535" @@ -462,7 +462,7 @@ msgid "Disliked Videos" msgstr "" msgctxt "#30539" -msgid "Live" +msgid "" msgstr "" msgctxt "#30540" @@ -478,7 +478,7 @@ msgid "rtmpe streams are not supported" msgstr "" msgctxt "#30543" -msgid "Refresh" +msgid "" msgstr "" msgctxt "#30544" @@ -490,15 +490,15 @@ msgid "No further links found." msgstr "" msgctxt "#30546" -msgid "Please log in twice!" +msgid "Please complete all login prompts" msgstr "" msgctxt "#30547" -msgid "You must enable two applications so that YouTube is functioning properly." +msgid "You may be prompted to enable two applications so that YouTube is functioning properly." msgstr "" msgctxt "#30548" -msgid "More..." +msgid "" msgstr "" msgctxt "#30549" @@ -506,7 +506,7 @@ msgid "No videos streams found" msgstr "" msgctxt "#30550" -msgid "Region" +msgid "" msgstr "" msgctxt "#30551" @@ -546,15 +546,15 @@ msgid "Delete settings.xml" msgstr "" msgctxt "#30560" -msgid "Subtitle language" +msgid "" msgstr "" msgctxt "#30561" -msgid "None" +msgid "" msgstr "" msgctxt "#30562" -msgid "" +msgid "View all" msgstr "" msgctxt "#30563" @@ -570,7 +570,7 @@ msgid "" msgstr "" msgctxt "#30566" -msgid "Prompt" +msgid "" msgstr "" msgctxt "#30567" @@ -582,11 +582,11 @@ msgid "Remove as Watch Later" msgstr "" msgctxt "#30569" -msgid "Are you sure you want to remove '%s' as your Watch Later list?" +msgid "Are you sure you want to remove \"%s\" as your Watch Later list?" msgstr "" msgctxt "#30570" -msgid "Are you sure you want to replace your current Watch Later list with '%s'?" +msgid "Are you sure you want to replace your current Watch Later list with \"%s\"?" msgstr "" msgctxt "#30571" @@ -598,11 +598,11 @@ msgid "Remove as History" msgstr "" msgctxt "#30573" -msgid "Are you sure you want to remove '%s' as your History list?" +msgid "Are you sure you want to remove \"%s\" as your History list?" msgstr "" msgctxt "#30574" -msgid "Are you sure you want to replace your current History list with '%s'?" +msgid "Are you sure you want to replace your current History list with \"%s\"?" msgstr "" msgctxt "#30575" @@ -614,7 +614,7 @@ msgid "Failed" msgstr "" msgctxt "#30577" -msgid "Settings" +msgid "" msgstr "" msgctxt "#30578" @@ -638,7 +638,7 @@ msgid "Autoplay suggested videos" msgstr "" msgctxt "#30583" -msgid "Automatic" +msgid "" msgstr "" msgctxt "#30584" @@ -698,7 +698,7 @@ msgid "Updated: %s" msgstr "" msgctxt "#30598" -msgid "Personal API keys enabled" +msgid "" msgstr "" msgctxt "#30599" @@ -706,7 +706,7 @@ msgid "Failed to enable personal API keys. Missing: %s" msgstr "" msgctxt "#30600" -msgid "Subtitles" +msgid "" msgstr "" msgctxt "#30601" @@ -766,7 +766,7 @@ msgid "" msgstr "" msgctxt "#30615" -msgid "Cancel" +msgid "" msgstr "" msgctxt "#30616" @@ -782,7 +782,7 @@ msgid "" msgstr "" msgctxt "#30619" -msgid "Port" +msgid "" msgstr "" msgctxt "#30620" @@ -826,7 +826,7 @@ msgid "IP whitelist (comma delimited)" msgstr "" msgctxt "#30630" -msgid "Save" +msgid "" msgstr "" msgctxt "#30631" @@ -942,7 +942,7 @@ msgid "Enter a name for this user" msgstr "" msgctxt "#30659" -msgid "User is now '%s'" +msgid "User is now \"%s\"" msgstr "" msgctxt "#30660" @@ -966,15 +966,15 @@ msgid "Switch user" msgstr "" msgctxt "#30665" -msgid "Switch to '%s' now?" +msgid "Switch to \"%s\" now?" msgstr "" msgctxt "#30666" -msgid "%s removed" +msgid "\"%s\" removed" msgstr "" msgctxt "#30667" -msgid "Renamed '%s' to '%s'" +msgid "Renamed \"%s\" to \"%s\"" msgstr "" msgctxt "#30668" @@ -1118,7 +1118,7 @@ msgid "Play with subtitles" msgstr "" msgctxt "#30703" -msgid "Are you sure?" +msgid "" msgstr "" msgctxt "#30704" @@ -1262,7 +1262,7 @@ msgid "" msgstr "" msgctxt "#30739" -msgid "" +msgid "Subscribers" msgstr "" msgctxt "#30740" @@ -1482,11 +1482,11 @@ msgid "Views count display colour" msgstr "" msgctxt "#30794" -msgid "Likes count display colour" +msgid "Subscriber/Likes count display colour" msgstr "" msgctxt "#30795" -msgid "Comments count display colour" +msgid "Videos/Comments count display colour" msgstr "" msgctxt "#30796" @@ -1584,3 +1584,7 @@ msgstr "" msgctxt "#30819" msgid "Play from start" msgstr "" + +msgctxt "#30820" +msgid "Podcast" +msgstr "" diff --git a/plugin.video.youtube/resources/language/resource.language.en_nz/strings.po b/plugin.video.youtube/resources/language/resource.language.en_nz/strings.po index 94c7e942f4..d3c9754d43 100644 --- a/plugin.video.youtube/resources/language/resource.language.en_nz/strings.po +++ b/plugin.video.youtube/resources/language/resource.language.en_nz/strings.po @@ -37,7 +37,7 @@ msgstr "" # msgstr "" # Kodion Settings msgctxt "#30000" -msgid "General" +msgid "" msgstr "" msgctxt "#30001" @@ -150,7 +150,7 @@ msgid "Configure %s?" msgstr "" msgctxt "#30031" -msgid "Advanced" +msgid "" msgstr "" msgctxt "#30032" @@ -216,7 +216,7 @@ msgid "Watch Later" msgstr "" msgctxt "#30108" -msgid "Remove" +msgid "" msgstr "" msgctxt "#30109" @@ -236,7 +236,7 @@ msgid "Sign Out" msgstr "" msgctxt "#30113" -msgid "Rename" +msgid "" msgstr "" msgctxt "#30114" @@ -256,7 +256,7 @@ msgid "Remove \"%s\"?" msgstr "" msgctxt "#30118" -msgid "Delete" +msgid "" msgstr "" msgctxt "#30119" @@ -300,11 +300,11 @@ msgstr "" # YouTube # empty strings from id 30206 to 30499 msgctxt "#30500" -msgid "Channels" +msgid "" msgstr "" msgctxt "#30501" -msgid "Playlists" +msgid "" msgstr "" msgctxt "#30502" @@ -360,7 +360,7 @@ msgid "Related Videos" msgstr "" msgctxt "#30515" -msgid "Auto-Remove from 'Watch Later'" +msgid "Auto-Remove from Watch Later" msgstr "" msgctxt "#30516" @@ -384,15 +384,15 @@ msgid "Add to..." msgstr "" msgctxt "#30521" -msgid "Select playlist" +msgid "" msgstr "" msgctxt "#30522" -msgid "New playlist..." +msgid "" msgstr "" msgctxt "#30523" -msgid "Language" +msgid "" msgstr "" msgctxt "#30524" @@ -424,11 +424,11 @@ msgid "I dislike this" msgstr "" msgctxt "#30531" -msgid "Play all" +msgid "" msgstr "" msgctxt "#30532" -msgid "Default" +msgid "" msgstr "" msgctxt "#30533" @@ -436,7 +436,7 @@ msgid "Reverse" msgstr "" msgctxt "#30534" -msgid "Shuffle" +msgid "" msgstr "" msgctxt "#30535" @@ -456,7 +456,7 @@ msgid "Disliked Videos" msgstr "" msgctxt "#30539" -msgid "Live" +msgid "" msgstr "" msgctxt "#30540" @@ -472,7 +472,7 @@ msgid "rtmpe streams are not supported" msgstr "" msgctxt "#30543" -msgid "Refresh" +msgid "" msgstr "" msgctxt "#30544" @@ -484,15 +484,15 @@ msgid "No further links found." msgstr "" msgctxt "#30546" -msgid "Please log in twice!" +msgid "Please complete all login prompts" msgstr "" msgctxt "#30547" -msgid "You must enable two applications so that YouTube is functioning properly." +msgid "You may be prompted to enable two applications so that YouTube is functioning properly." msgstr "" msgctxt "#30548" -msgid "More..." +msgid "" msgstr "" msgctxt "#30549" @@ -500,7 +500,7 @@ msgid "No videos streams found" msgstr "" msgctxt "#30550" -msgid "Region" +msgid "" msgstr "" msgctxt "#30551" @@ -540,15 +540,15 @@ msgid "Delete settings.xml" msgstr "" msgctxt "#30560" -msgid "Subtitle language" +msgid "" msgstr "" msgctxt "#30561" -msgid "None" +msgid "" msgstr "" msgctxt "#30562" -msgid "" +msgid "View all" msgstr "" msgctxt "#30563" @@ -564,7 +564,7 @@ msgid "" msgstr "" msgctxt "#30566" -msgid "Prompt" +msgid "" msgstr "" msgctxt "#30567" @@ -576,11 +576,11 @@ msgid "Remove as Watch Later" msgstr "" msgctxt "#30569" -msgid "Are you sure you want to remove '%s' as your Watch Later list?" +msgid "Are you sure you want to remove \"%s\" as your Watch Later list?" msgstr "" msgctxt "#30570" -msgid "Are you sure you want to replace your current Watch Later list with '%s'?" +msgid "Are you sure you want to replace your current Watch Later list with \"%s\"?" msgstr "" msgctxt "#30571" @@ -592,11 +592,11 @@ msgid "Remove as History" msgstr "" msgctxt "#30573" -msgid "Are you sure you want to remove '%s' as your History list?" +msgid "Are you sure you want to remove \"%s\" as your History list?" msgstr "" msgctxt "#30574" -msgid "Are you sure you want to replace your current History list with '%s'?" +msgid "Are you sure you want to replace your current History list with \"%s\"?" msgstr "" msgctxt "#30575" @@ -608,7 +608,7 @@ msgid "Failed" msgstr "" msgctxt "#30577" -msgid "Settings" +msgid "" msgstr "" msgctxt "#30578" @@ -632,7 +632,7 @@ msgid "Autoplay suggested videos" msgstr "" msgctxt "#30583" -msgid "Automatic" +msgid "" msgstr "" msgctxt "#30584" @@ -692,7 +692,7 @@ msgid "Updated: %s" msgstr "" msgctxt "#30598" -msgid "Personal API keys enabled" +msgid "" msgstr "" msgctxt "#30599" @@ -700,7 +700,7 @@ msgid "Failed to enable personal API keys. Missing: %s" msgstr "" msgctxt "#30600" -msgid "Subtitles" +msgid "" msgstr "" msgctxt "#30601" @@ -760,7 +760,7 @@ msgid "" msgstr "" msgctxt "#30615" -msgid "Cancel" +msgid "" msgstr "" msgctxt "#30616" @@ -776,7 +776,7 @@ msgid "" msgstr "" msgctxt "#30619" -msgid "Port" +msgid "" msgstr "" msgctxt "#30620" @@ -820,7 +820,7 @@ msgid "IP whitelist (comma delimited)" msgstr "" msgctxt "#30630" -msgid "Save" +msgid "" msgstr "" msgctxt "#30631" @@ -936,7 +936,7 @@ msgid "Enter a name for this user" msgstr "" msgctxt "#30659" -msgid "User is now '%s'" +msgid "User is now \"%s\"" msgstr "" msgctxt "#30660" @@ -960,15 +960,15 @@ msgid "Switch user" msgstr "" msgctxt "#30665" -msgid "Switch to '%s' now?" +msgid "Switch to \"%s\" now?" msgstr "" msgctxt "#30666" -msgid "%s removed" +msgid "\"%s\" removed" msgstr "" msgctxt "#30667" -msgid "Renamed '%s' to '%s'" +msgid "Renamed \"%s\" to \"%s\"" msgstr "" msgctxt "#30668" @@ -1112,7 +1112,7 @@ msgid "Play with subtitles" msgstr "" msgctxt "#30703" -msgid "Are you sure?" +msgid "" msgstr "" msgctxt "#30704" @@ -1256,7 +1256,7 @@ msgid "" msgstr "" msgctxt "#30739" -msgid "" +msgid "Subscribers" msgstr "" msgctxt "#30740" @@ -1476,11 +1476,11 @@ msgid "Views count display colour" msgstr "" msgctxt "#30794" -msgid "Likes count display colour" +msgid "Subscriber/Likes count display colour" msgstr "" msgctxt "#30795" -msgid "Comments count display colour" +msgid "Videos/Comments count display colour" msgstr "" msgctxt "#30796" @@ -1578,3 +1578,7 @@ msgstr "" msgctxt "#30819" msgid "Play from start" msgstr "" + +msgctxt "#30820" +msgid "Podcast" +msgstr "" diff --git a/plugin.video.youtube/resources/language/resource.language.en_us/strings.po b/plugin.video.youtube/resources/language/resource.language.en_us/strings.po index 6be56d35c7..9f4754b45b 100644 --- a/plugin.video.youtube/resources/language/resource.language.en_us/strings.po +++ b/plugin.video.youtube/resources/language/resource.language.en_us/strings.po @@ -37,8 +37,8 @@ msgstr "" # msgstr "" # Kodion Settings msgctxt "#30000" -msgid "General" -msgstr "General" +msgid "" +msgstr "" msgctxt "#30001" msgid "" @@ -150,8 +150,8 @@ msgid "Configure %s?" msgstr "" msgctxt "#30031" -msgid "Advanced" -msgstr "Advanced" +msgid "" +msgstr "" msgctxt "#30032" msgid "View: TV Shows" @@ -216,7 +216,7 @@ msgid "Watch Later" msgstr "" msgctxt "#30108" -msgid "Remove" +msgid "" msgstr "" msgctxt "#30109" @@ -236,7 +236,7 @@ msgid "Sign Out" msgstr "" msgctxt "#30113" -msgid "Rename" +msgid "" msgstr "" msgctxt "#30114" @@ -256,7 +256,7 @@ msgid "Remove \"%s\"?" msgstr "" msgctxt "#30118" -msgid "Delete" +msgid "" msgstr "" msgctxt "#30119" @@ -300,11 +300,11 @@ msgstr "" # YouTube # empty strings from id 30206 to 30499 msgctxt "#30500" -msgid "Channels" -msgstr "Channels" +msgid "" +msgstr "" msgctxt "#30501" -msgid "Playlists" +msgid "" msgstr "" msgctxt "#30502" @@ -360,7 +360,7 @@ msgid "Related Videos" msgstr "" msgctxt "#30515" -msgid "Auto-Remove from 'Watch Later'" +msgid "Auto-Remove from Watch Later" msgstr "" msgctxt "#30516" @@ -384,15 +384,15 @@ msgid "Add to..." msgstr "" msgctxt "#30521" -msgid "Select playlist" +msgid "" msgstr "" msgctxt "#30522" -msgid "New playlist..." +msgid "" msgstr "" msgctxt "#30523" -msgid "Language" +msgid "" msgstr "" msgctxt "#30524" @@ -424,11 +424,11 @@ msgid "I dislike this" msgstr "" msgctxt "#30531" -msgid "Play all" +msgid "" msgstr "" msgctxt "#30532" -msgid "Default" +msgid "" msgstr "" msgctxt "#30533" @@ -436,7 +436,7 @@ msgid "Reverse" msgstr "" msgctxt "#30534" -msgid "Shuffle" +msgid "" msgstr "" msgctxt "#30535" @@ -456,7 +456,7 @@ msgid "Disliked Videos" msgstr "" msgctxt "#30539" -msgid "Live" +msgid "" msgstr "" msgctxt "#30540" @@ -472,7 +472,7 @@ msgid "rtmpe streams are not supported" msgstr "" msgctxt "#30543" -msgid "Refresh" +msgid "" msgstr "" msgctxt "#30544" @@ -484,15 +484,15 @@ msgid "No further links found." msgstr "" msgctxt "#30546" -msgid "Please log in twice!" +msgid "Please complete all login prompts" msgstr "" msgctxt "#30547" -msgid "You must enable two applications so that YouTube is functioning properly." +msgid "You may be prompted to enable two applications so that YouTube is functioning properly." msgstr "" msgctxt "#30548" -msgid "More..." +msgid "" msgstr "" msgctxt "#30549" @@ -500,7 +500,7 @@ msgid "No videos streams found" msgstr "" msgctxt "#30550" -msgid "Region" +msgid "" msgstr "" msgctxt "#30551" @@ -540,15 +540,15 @@ msgid "Delete settings.xml" msgstr "" msgctxt "#30560" -msgid "Subtitle language" +msgid "" msgstr "" msgctxt "#30561" -msgid "None" -msgstr "None" +msgid "" +msgstr "" msgctxt "#30562" -msgid "" +msgid "View all" msgstr "" msgctxt "#30563" @@ -564,7 +564,7 @@ msgid "" msgstr "" msgctxt "#30566" -msgid "Prompt" +msgid "" msgstr "" msgctxt "#30567" @@ -576,11 +576,11 @@ msgid "Remove as Watch Later" msgstr "" msgctxt "#30569" -msgid "Are you sure you want to remove '%s' as your Watch Later list?" +msgid "Are you sure you want to remove \"%s\" as your Watch Later list?" msgstr "" msgctxt "#30570" -msgid "Are you sure you want to replace your current Watch Later list with '%s'?" +msgid "Are you sure you want to replace your current Watch Later list with \"%s\"?" msgstr "" msgctxt "#30571" @@ -592,11 +592,11 @@ msgid "Remove as History" msgstr "" msgctxt "#30573" -msgid "Are you sure you want to remove '%s' as your History list?" +msgid "Are you sure you want to remove \"%s\" as your History list?" msgstr "" msgctxt "#30574" -msgid "Are you sure you want to replace your current History list with '%s'?" +msgid "Are you sure you want to replace your current History list with \"%s\"?" msgstr "" msgctxt "#30575" @@ -608,8 +608,8 @@ msgid "Failed" msgstr "" msgctxt "#30577" -msgid "Settings" -msgstr "Settings" +msgid "" +msgstr "" msgctxt "#30578" msgid "Force SSL certificate verification" @@ -632,7 +632,7 @@ msgid "Autoplay suggested videos" msgstr "" msgctxt "#30583" -msgid "Automatic" +msgid "" msgstr "" msgctxt "#30584" @@ -692,7 +692,7 @@ msgid "Updated: %s" msgstr "" msgctxt "#30598" -msgid "Personal API keys enabled" +msgid "" msgstr "" msgctxt "#30599" @@ -700,7 +700,7 @@ msgid "Failed to enable personal API keys. Missing: %s" msgstr "" msgctxt "#30600" -msgid "Subtitles" +msgid "" msgstr "" msgctxt "#30601" @@ -760,7 +760,7 @@ msgid "" msgstr "" msgctxt "#30615" -msgid "Cancel" +msgid "" msgstr "" msgctxt "#30616" @@ -776,8 +776,8 @@ msgid "" msgstr "" msgctxt "#30619" -msgid "Port" -msgstr "Port" +msgid "" +msgstr "" msgctxt "#30620" msgid "Port %s already in use. Cannot start http server." @@ -820,7 +820,7 @@ msgid "IP whitelist (comma delimited)" msgstr "" msgctxt "#30630" -msgid "Save" +msgid "" msgstr "" msgctxt "#30631" @@ -936,7 +936,7 @@ msgid "Enter a name for this user" msgstr "" msgctxt "#30659" -msgid "User is now '%s'" +msgid "User is now \"%s\"" msgstr "" msgctxt "#30660" @@ -960,15 +960,15 @@ msgid "Switch user" msgstr "" msgctxt "#30665" -msgid "Switch to '%s' now?" +msgid "Switch to \"%s\" now?" msgstr "" msgctxt "#30666" -msgid "%s removed" +msgid "\"%s\" removed" msgstr "" msgctxt "#30667" -msgid "Renamed '%s' to '%s'" +msgid "Renamed \"%s\" to \"%s\"" msgstr "" msgctxt "#30668" @@ -1112,7 +1112,7 @@ msgid "Play with subtitles" msgstr "" msgctxt "#30703" -msgid "Are you sure?" +msgid "" msgstr "" msgctxt "#30704" @@ -1256,7 +1256,7 @@ msgid "" msgstr "" msgctxt "#30739" -msgid "" +msgid "Subscribers" msgstr "" msgctxt "#30740" @@ -1476,11 +1476,11 @@ msgid "Views count display colour" msgstr "" msgctxt "#30794" -msgid "Likes count display colour" +msgid "Subscriber/Likes count display colour" msgstr "" msgctxt "#30795" -msgid "Comments count display colour" +msgid "Videos/Comments count display colour" msgstr "" msgctxt "#30796" @@ -1579,6 +1579,43 @@ msgctxt "#30819" msgid "Play from start" msgstr "" +msgctxt "#30820" +msgid "Podcast" +msgstr "" + +# msgctxt "Addon Summary" +# msgid "Plugin for YouTube" +# msgstr "" +# msgctxt "Addon Description" +# msgid "YouTube is a one of the biggest video-sharing websites of the world." +# msgstr "" +# Kodion Settings +#~ msgctxt "#30000" +#~ msgid "General" +#~ msgstr "General" + +#~ msgctxt "#30031" +#~ msgid "Advanced" +#~ msgstr "Advanced" + +# YouTube +# empty strings from id 30206 to 30499 +#~ msgctxt "#30500" +#~ msgid "Channels" +#~ msgstr "Channels" + +#~ msgctxt "#30561" +#~ msgid "None" +#~ msgstr "None" + +#~ msgctxt "#30577" +#~ msgid "Settings" +#~ msgstr "Settings" + +#~ msgctxt "#30619" +#~ msgid "Port" +#~ msgstr "Port" + #~ msgctxt "#30001" #~ msgid "Username" #~ msgstr "Username" diff --git a/plugin.video.youtube/resources/language/resource.language.eo/strings.po b/plugin.video.youtube/resources/language/resource.language.eo/strings.po index 1e5763df3d..c36b02b307 100644 --- a/plugin.video.youtube/resources/language/resource.language.eo/strings.po +++ b/plugin.video.youtube/resources/language/resource.language.eo/strings.po @@ -7,19 +7,19 @@ msgstr "" "Project-Id-Version: XBMC-Addons\n" "Report-Msgid-Bugs-To: alanwww1@xbmc.org\n" "POT-Creation-Date: 2015-09-21 11:01+0000\n" -"PO-Revision-Date: 2024-04-12 14:59+0000\n" -"Last-Translator: Anonymous \n" +"PO-Revision-Date: 2024-09-26 19:52+0000\n" +"Last-Translator: Jakub Fabijan \n" "Language-Team: Esperanto \n" "Language: eo\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 5.4.3\n" +"X-Generator: Weblate 5.7.2\n" msgctxt "Addon Summary" msgid "Plugin for YouTube" -msgstr "" +msgstr "Aldonaĵo por YouTube" msgctxt "Addon Description" msgid "YouTube is one of the biggest video-sharing websites of the world." @@ -37,7 +37,7 @@ msgstr "" # msgstr "" # Kodion Settings msgctxt "#30000" -msgid "General" +msgid "" msgstr "" msgctxt "#30001" @@ -50,65 +50,65 @@ msgstr "" msgctxt "#30003" msgid "YouTube" -msgstr "" +msgstr "YouTube" # empty strings from id 30004 to 30006 msgctxt "#30007" msgid "Use InputStream.Adaptive" -msgstr "" +msgstr "Uzi InputStream.Adaptive" msgctxt "#30008" msgid "Configure InputStream.Adaptive" -msgstr "" +msgstr "Konfiguri InputStream.Adaptive" msgctxt "#30009" msgid "Always ask for the video quality" -msgstr "" +msgstr "Ĉiam demandi la kvaliton de video" msgctxt "#30010" msgid "Maximum video quality" -msgstr "" +msgstr "Maksimuma videa kvalito" msgctxt "#30011" msgid "480p" -msgstr "" +msgstr "480p" msgctxt "#30012" msgid "720p (HD)" -msgstr "" +msgstr "720p (HD)" msgctxt "#30013" msgid "1080p (FHD)" -msgstr "" +msgstr "1080p (FHD)" msgctxt "#30014" msgid "2160p (4K)" -msgstr "" +msgstr "2160p (4K)" msgctxt "#30015" msgid "4320p (8K)" -msgstr "" +msgstr "4320p (8K)" msgctxt "#30016" msgid "240p" -msgstr "" +msgstr "240p" msgctxt "#30017" msgid "360p" -msgstr "" +msgstr "360p" msgctxt "#30018" msgid "1080p Live / 720p (HD)" -msgstr "" +msgstr "1080p Realtempe / 720p (HD)" msgctxt "#30019" msgid "144p" -msgstr "" +msgstr "144p" # empty strings 30019 msgctxt "#30020" msgid "Allow 3D" -msgstr "" +msgstr "Permesi 3D" msgctxt "#30021" msgid "Show fanart" @@ -116,7 +116,7 @@ msgstr "" msgctxt "#30022" msgid "Items per page" -msgstr "" +msgstr "Eroj paĝe" msgctxt "#30023" msgid "Search history size" @@ -136,39 +136,39 @@ msgstr "" msgctxt "#30027" msgid "View: Default" -msgstr "" +msgstr "Vido: Apriora" msgctxt "#30028" msgid "View: Episodes" -msgstr "" +msgstr "Vido: Epizodoj" msgctxt "#30029" msgid "View: Movies" -msgstr "" +msgstr "Vido: Filmoj" msgctxt "#30030" msgid "Configure %s?" -msgstr "" +msgstr "Ĉu konfiguri %s?" msgctxt "#30031" -msgid "Advanced" +msgid "" msgstr "" msgctxt "#30032" msgid "View: TV Shows" -msgstr "" +msgstr "Vido: Televidserioj" msgctxt "#30033" msgid "View: Songs" -msgstr "" +msgstr "Vido: Kantoj" msgctxt "#30034" msgid "View: Artists" -msgstr "" +msgstr "Vido: Artistoj" msgctxt "#30035" msgid "View: Albums" -msgstr "" +msgstr "Vido: Albumoj" msgctxt "#30036" msgid "Support alternative player" @@ -186,15 +186,15 @@ msgstr "" # empty strings from id 30039 to 30099 msgctxt "#30100" msgid "Bookmarks" -msgstr "" +msgstr "Legosignoj" msgctxt "#30101" msgid "Bookmark" -msgstr "" +msgstr "Legosigno" msgctxt "#30102" msgid "Search" -msgstr "" +msgstr "Serĉi" msgctxt "#30103" msgid "" @@ -210,14 +210,14 @@ msgstr "" msgctxt "#30106" msgid "Next Page (%d)" -msgstr "" +msgstr "Sekva paĝo (%d)" msgctxt "#30107" msgid "Watch Later" -msgstr "" +msgstr "Spekti poste" msgctxt "#30108" -msgid "Remove" +msgid "" msgstr "" msgctxt "#30109" @@ -226,23 +226,23 @@ msgstr "" msgctxt "#30110" msgid "New Search" -msgstr "" +msgstr "Nova serĉo" msgctxt "#30111" msgid "Sign In" -msgstr "" +msgstr "Ensaluti" msgctxt "#30112" msgid "Sign Out" -msgstr "" +msgstr "Elsaluti" msgctxt "#30113" -msgid "Rename" +msgid "" msgstr "" msgctxt "#30114" msgid "Confirm delete" -msgstr "" +msgstr "Konfirmi forigon" msgctxt "#30115" msgid "Confirm remove" @@ -250,19 +250,19 @@ msgstr "" msgctxt "#30116" msgid "Delete \"%s\"?" -msgstr "" +msgstr "Ĉu forigi \"%s\"?" msgctxt "#30117" msgid "Remove \"%s\"?" msgstr "" msgctxt "#30118" -msgid "Delete" +msgid "" msgstr "" msgctxt "#30119" msgid "Please wait..." -msgstr "" +msgstr "Bonvolu atendi…" msgctxt "#30120" msgid "Confirm clear" @@ -276,11 +276,11 @@ msgstr "" # empty strings from id 30121 to 30199 msgctxt "#30200" msgid "API" -msgstr "" +msgstr "API" msgctxt "#30201" msgid "API Key" -msgstr "" +msgstr "API-ŝlosilo" msgctxt "#30202" msgid "API Id" @@ -288,7 +288,7 @@ msgstr "" msgctxt "#30203" msgid "API Secret" -msgstr "" +msgstr "API-sekreto" msgctxt "#30204" msgid "" @@ -301,16 +301,16 @@ msgstr "" # YouTube # empty strings from id 30206 to 30499 msgctxt "#30500" -msgid "Channels" +msgid "" msgstr "" msgctxt "#30501" -msgid "Playlists" +msgid "" msgstr "" msgctxt "#30502" msgid "Go to %s" -msgstr "" +msgstr "Iri al %s" msgctxt "#30503" msgid "Channel fanart" @@ -318,31 +318,31 @@ msgstr "" msgctxt "#30504" msgid "Subscriptions" -msgstr "" +msgstr "Abonoj" msgctxt "#30505" msgid "Unsubscribe" -msgstr "" +msgstr "Malaboni" msgctxt "#30506" msgid "Subscribe" -msgstr "" +msgstr "Aboni" msgctxt "#30507" msgid "My Channel" -msgstr "" +msgstr "Mia kanalo" msgctxt "#30508" msgid "Liked Videos" -msgstr "" +msgstr "Ŝatitaj videaĵoj" msgctxt "#30509" msgid "History" -msgstr "" +msgstr "Historio" msgctxt "#30510" msgid "My Subscriptions" -msgstr "" +msgstr "Miaj abonoj" msgctxt "#30511" msgid "Queue video" @@ -361,7 +361,7 @@ msgid "Related Videos" msgstr "" msgctxt "#30515" -msgid "Auto-Remove from 'Watch Later'" +msgid "Auto-Remove from Watch Later" msgstr "" msgctxt "#30516" @@ -385,15 +385,15 @@ msgid "Add to..." msgstr "" msgctxt "#30521" -msgid "Select playlist" +msgid "" msgstr "" msgctxt "#30522" -msgid "New playlist..." +msgid "" msgstr "" msgctxt "#30523" -msgid "Language" +msgid "" msgstr "" msgctxt "#30524" @@ -425,11 +425,11 @@ msgid "I dislike this" msgstr "" msgctxt "#30531" -msgid "Play all" +msgid "" msgstr "" msgctxt "#30532" -msgid "Default" +msgid "" msgstr "" msgctxt "#30533" @@ -437,7 +437,7 @@ msgid "Reverse" msgstr "" msgctxt "#30534" -msgid "Shuffle" +msgid "" msgstr "" msgctxt "#30535" @@ -457,7 +457,7 @@ msgid "Disliked Videos" msgstr "" msgctxt "#30539" -msgid "Live" +msgid "" msgstr "" msgctxt "#30540" @@ -473,7 +473,7 @@ msgid "rtmpe streams are not supported" msgstr "" msgctxt "#30543" -msgid "Refresh" +msgid "" msgstr "" msgctxt "#30544" @@ -485,15 +485,15 @@ msgid "No further links found." msgstr "" msgctxt "#30546" -msgid "Please log in twice!" +msgid "Please complete all login prompts" msgstr "" msgctxt "#30547" -msgid "You must enable two applications so that YouTube is functioning properly." +msgid "You may be prompted to enable two applications so that YouTube is functioning properly." msgstr "" msgctxt "#30548" -msgid "More..." +msgid "" msgstr "" msgctxt "#30549" @@ -501,7 +501,7 @@ msgid "No videos streams found" msgstr "" msgctxt "#30550" -msgid "Region" +msgid "" msgstr "" msgctxt "#30551" @@ -541,15 +541,15 @@ msgid "Delete settings.xml" msgstr "" msgctxt "#30560" -msgid "Subtitle language" +msgid "" msgstr "" msgctxt "#30561" -msgid "None" +msgid "" msgstr "" msgctxt "#30562" -msgid "" +msgid "View all" msgstr "" msgctxt "#30563" @@ -565,7 +565,7 @@ msgid "" msgstr "" msgctxt "#30566" -msgid "Prompt" +msgid "" msgstr "" msgctxt "#30567" @@ -577,11 +577,11 @@ msgid "Remove as Watch Later" msgstr "" msgctxt "#30569" -msgid "Are you sure you want to remove '%s' as your Watch Later list?" +msgid "Are you sure you want to remove \"%s\" as your Watch Later list?" msgstr "" msgctxt "#30570" -msgid "Are you sure you want to replace your current Watch Later list with '%s'?" +msgid "Are you sure you want to replace your current Watch Later list with \"%s\"?" msgstr "" msgctxt "#30571" @@ -593,11 +593,11 @@ msgid "Remove as History" msgstr "" msgctxt "#30573" -msgid "Are you sure you want to remove '%s' as your History list?" +msgid "Are you sure you want to remove \"%s\" as your History list?" msgstr "" msgctxt "#30574" -msgid "Are you sure you want to replace your current History list with '%s'?" +msgid "Are you sure you want to replace your current History list with \"%s\"?" msgstr "" msgctxt "#30575" @@ -609,7 +609,7 @@ msgid "Failed" msgstr "" msgctxt "#30577" -msgid "Settings" +msgid "" msgstr "" msgctxt "#30578" @@ -633,7 +633,7 @@ msgid "Autoplay suggested videos" msgstr "" msgctxt "#30583" -msgid "Automatic" +msgid "" msgstr "" msgctxt "#30584" @@ -693,7 +693,7 @@ msgid "Updated: %s" msgstr "" msgctxt "#30598" -msgid "Personal API keys enabled" +msgid "" msgstr "" msgctxt "#30599" @@ -701,7 +701,7 @@ msgid "Failed to enable personal API keys. Missing: %s" msgstr "" msgctxt "#30600" -msgid "Subtitles" +msgid "" msgstr "" msgctxt "#30601" @@ -761,7 +761,7 @@ msgid "" msgstr "" msgctxt "#30615" -msgid "Cancel" +msgid "" msgstr "" msgctxt "#30616" @@ -777,7 +777,7 @@ msgid "" msgstr "" msgctxt "#30619" -msgid "Port" +msgid "" msgstr "" msgctxt "#30620" @@ -821,7 +821,7 @@ msgid "IP whitelist (comma delimited)" msgstr "" msgctxt "#30630" -msgid "Save" +msgid "" msgstr "" msgctxt "#30631" @@ -937,7 +937,7 @@ msgid "Enter a name for this user" msgstr "" msgctxt "#30659" -msgid "User is now '%s'" +msgid "User is now \"%s\"" msgstr "" msgctxt "#30660" @@ -961,15 +961,15 @@ msgid "Switch user" msgstr "" msgctxt "#30665" -msgid "Switch to '%s' now?" +msgid "Switch to \"%s\" now?" msgstr "" msgctxt "#30666" -msgid "%s removed" +msgid "\"%s\" removed" msgstr "" msgctxt "#30667" -msgid "Renamed '%s' to '%s'" +msgid "Renamed \"%s\" to \"%s\"" msgstr "" msgctxt "#30668" @@ -1113,7 +1113,7 @@ msgid "Play with subtitles" msgstr "" msgctxt "#30703" -msgid "Are you sure?" +msgid "" msgstr "" msgctxt "#30704" @@ -1257,7 +1257,7 @@ msgid "" msgstr "" msgctxt "#30739" -msgid "" +msgid "Subscribers" msgstr "" msgctxt "#30740" @@ -1477,11 +1477,11 @@ msgid "Views count display colour" msgstr "" msgctxt "#30794" -msgid "Likes count display colour" +msgid "Subscriber/Likes count display colour" msgstr "" msgctxt "#30795" -msgid "Comments count display colour" +msgid "Videos/Comments count display colour" msgstr "" msgctxt "#30796" @@ -1579,3 +1579,44 @@ msgstr "" msgctxt "#30819" msgid "Play from start" msgstr "" + +msgctxt "#30820" +msgid "Podcast" +msgstr "" + +# msgctxt "Addon Summary" +# msgid "Plugin for YouTube" +# msgstr "" +# msgctxt "Addon Description" +# msgid "YouTube is a one of the biggest video-sharing websites of the world." +# msgstr "" +# Kodion Settings +#~ msgctxt "#30000" +#~ msgid "General" +#~ msgstr "Ĝeneralaj" + +#~ msgctxt "#30031" +#~ msgid "Advanced" +#~ msgstr "Altnivelaj" + +#~ msgctxt "#30108" +#~ msgid "Remove" +#~ msgstr "Forigi" + +#~ msgctxt "#30113" +#~ msgid "Rename" +#~ msgstr "Alinomi" + +#~ msgctxt "#30118" +#~ msgid "Delete" +#~ msgstr "Forigi" + +# YouTube +# empty strings from id 30206 to 30499 +#~ msgctxt "#30500" +#~ msgid "Channels" +#~ msgstr "Kanaloj" + +#~ msgctxt "#30501" +#~ msgid "Playlists" +#~ msgstr "Ludlistoj" diff --git a/plugin.video.youtube/resources/language/resource.language.es_ar/strings.po b/plugin.video.youtube/resources/language/resource.language.es_ar/strings.po index 030a631c53..24c3c98343 100644 --- a/plugin.video.youtube/resources/language/resource.language.es_ar/strings.po +++ b/plugin.video.youtube/resources/language/resource.language.es_ar/strings.po @@ -37,7 +37,7 @@ msgstr "" # msgstr "" # Kodion Settings msgctxt "#30000" -msgid "General" +msgid "" msgstr "" msgctxt "#30001" @@ -151,7 +151,7 @@ msgid "Configure %s?" msgstr "" msgctxt "#30031" -msgid "Advanced" +msgid "" msgstr "" msgctxt "#30032" @@ -217,7 +217,7 @@ msgid "Watch Later" msgstr "" msgctxt "#30108" -msgid "Remove" +msgid "" msgstr "" msgctxt "#30109" @@ -237,7 +237,7 @@ msgid "Sign Out" msgstr "" msgctxt "#30113" -msgid "Rename" +msgid "" msgstr "" msgctxt "#30114" @@ -257,7 +257,7 @@ msgid "Remove \"%s\"?" msgstr "" msgctxt "#30118" -msgid "Delete" +msgid "" msgstr "" msgctxt "#30119" @@ -301,11 +301,11 @@ msgstr "" # YouTube # empty strings from id 30206 to 30499 msgctxt "#30500" -msgid "Channels" +msgid "" msgstr "" msgctxt "#30501" -msgid "Playlists" +msgid "" msgstr "" msgctxt "#30502" @@ -361,7 +361,7 @@ msgid "Related Videos" msgstr "" msgctxt "#30515" -msgid "Auto-Remove from 'Watch Later'" +msgid "Auto-Remove from Watch Later" msgstr "" msgctxt "#30516" @@ -385,15 +385,15 @@ msgid "Add to..." msgstr "" msgctxt "#30521" -msgid "Select playlist" +msgid "" msgstr "" msgctxt "#30522" -msgid "New playlist..." +msgid "" msgstr "" msgctxt "#30523" -msgid "Language" +msgid "" msgstr "" msgctxt "#30524" @@ -425,11 +425,11 @@ msgid "I dislike this" msgstr "" msgctxt "#30531" -msgid "Play all" +msgid "" msgstr "" msgctxt "#30532" -msgid "Default" +msgid "" msgstr "" msgctxt "#30533" @@ -437,7 +437,7 @@ msgid "Reverse" msgstr "" msgctxt "#30534" -msgid "Shuffle" +msgid "" msgstr "" msgctxt "#30535" @@ -457,7 +457,7 @@ msgid "Disliked Videos" msgstr "" msgctxt "#30539" -msgid "Live" +msgid "" msgstr "" msgctxt "#30540" @@ -473,7 +473,7 @@ msgid "rtmpe streams are not supported" msgstr "" msgctxt "#30543" -msgid "Refresh" +msgid "" msgstr "" msgctxt "#30544" @@ -485,15 +485,15 @@ msgid "No further links found." msgstr "" msgctxt "#30546" -msgid "Please log in twice!" +msgid "Please complete all login prompts" msgstr "" msgctxt "#30547" -msgid "You must enable two applications so that YouTube is functioning properly." +msgid "You may be prompted to enable two applications so that YouTube is functioning properly." msgstr "" msgctxt "#30548" -msgid "More..." +msgid "" msgstr "" msgctxt "#30549" @@ -501,7 +501,7 @@ msgid "No videos streams found" msgstr "" msgctxt "#30550" -msgid "Region" +msgid "" msgstr "" msgctxt "#30551" @@ -541,15 +541,15 @@ msgid "Delete settings.xml" msgstr "" msgctxt "#30560" -msgid "Subtitle language" +msgid "" msgstr "" msgctxt "#30561" -msgid "None" +msgid "" msgstr "" msgctxt "#30562" -msgid "" +msgid "View all" msgstr "" msgctxt "#30563" @@ -565,7 +565,7 @@ msgid "" msgstr "" msgctxt "#30566" -msgid "Prompt" +msgid "" msgstr "" msgctxt "#30567" @@ -577,11 +577,11 @@ msgid "Remove as Watch Later" msgstr "" msgctxt "#30569" -msgid "Are you sure you want to remove '%s' as your Watch Later list?" +msgid "Are you sure you want to remove \"%s\" as your Watch Later list?" msgstr "" msgctxt "#30570" -msgid "Are you sure you want to replace your current Watch Later list with '%s'?" +msgid "Are you sure you want to replace your current Watch Later list with \"%s\"?" msgstr "" msgctxt "#30571" @@ -593,11 +593,11 @@ msgid "Remove as History" msgstr "" msgctxt "#30573" -msgid "Are you sure you want to remove '%s' as your History list?" +msgid "Are you sure you want to remove \"%s\" as your History list?" msgstr "" msgctxt "#30574" -msgid "Are you sure you want to replace your current History list with '%s'?" +msgid "Are you sure you want to replace your current History list with \"%s\"?" msgstr "" msgctxt "#30575" @@ -609,7 +609,7 @@ msgid "Failed" msgstr "" msgctxt "#30577" -msgid "Settings" +msgid "" msgstr "" msgctxt "#30578" @@ -633,7 +633,7 @@ msgid "Autoplay suggested videos" msgstr "" msgctxt "#30583" -msgid "Automatic" +msgid "" msgstr "" msgctxt "#30584" @@ -693,7 +693,7 @@ msgid "Updated: %s" msgstr "" msgctxt "#30598" -msgid "Personal API keys enabled" +msgid "" msgstr "" msgctxt "#30599" @@ -701,7 +701,7 @@ msgid "Failed to enable personal API keys. Missing: %s" msgstr "" msgctxt "#30600" -msgid "Subtitles" +msgid "" msgstr "" msgctxt "#30601" @@ -761,7 +761,7 @@ msgid "" msgstr "" msgctxt "#30615" -msgid "Cancel" +msgid "" msgstr "" msgctxt "#30616" @@ -777,7 +777,7 @@ msgid "" msgstr "" msgctxt "#30619" -msgid "Port" +msgid "" msgstr "" msgctxt "#30620" @@ -821,7 +821,7 @@ msgid "IP whitelist (comma delimited)" msgstr "" msgctxt "#30630" -msgid "Save" +msgid "" msgstr "" msgctxt "#30631" @@ -937,7 +937,7 @@ msgid "Enter a name for this user" msgstr "" msgctxt "#30659" -msgid "User is now '%s'" +msgid "User is now \"%s\"" msgstr "" msgctxt "#30660" @@ -961,15 +961,15 @@ msgid "Switch user" msgstr "" msgctxt "#30665" -msgid "Switch to '%s' now?" +msgid "Switch to \"%s\" now?" msgstr "" msgctxt "#30666" -msgid "%s removed" +msgid "\"%s\" removed" msgstr "" msgctxt "#30667" -msgid "Renamed '%s' to '%s'" +msgid "Renamed \"%s\" to \"%s\"" msgstr "" msgctxt "#30668" @@ -1113,7 +1113,7 @@ msgid "Play with subtitles" msgstr "" msgctxt "#30703" -msgid "Are you sure?" +msgid "" msgstr "" msgctxt "#30704" @@ -1257,7 +1257,7 @@ msgid "" msgstr "" msgctxt "#30739" -msgid "" +msgid "Subscribers" msgstr "" msgctxt "#30740" @@ -1477,11 +1477,11 @@ msgid "Views count display colour" msgstr "" msgctxt "#30794" -msgid "Likes count display colour" +msgid "Subscriber/Likes count display colour" msgstr "" msgctxt "#30795" -msgid "Comments count display colour" +msgid "Videos/Comments count display colour" msgstr "" msgctxt "#30796" @@ -1579,3 +1579,7 @@ msgstr "" msgctxt "#30819" msgid "Play from start" msgstr "" + +msgctxt "#30820" +msgid "Podcast" +msgstr "" diff --git a/plugin.video.youtube/resources/language/resource.language.es_es/strings.po b/plugin.video.youtube/resources/language/resource.language.es_es/strings.po index e2c6973d89..01f176e91e 100644 --- a/plugin.video.youtube/resources/language/resource.language.es_es/strings.po +++ b/plugin.video.youtube/resources/language/resource.language.es_es/strings.po @@ -7,15 +7,15 @@ msgstr "" "Project-Id-Version: XBMC-Addons\n" "Report-Msgid-Bugs-To: translations@kodi.tv\n" "POT-Creation-Date: 2015-09-21 11:01+0000\n" -"PO-Revision-Date: 2024-08-15 18:26+0000\n" -"Last-Translator: José Antonio Alvarado \n" +"PO-Revision-Date: 2024-11-08 16:39+0000\n" +"Last-Translator: Alfonso Cachero \n" "Language-Team: Spanish (Spain) \n" "Language: es_es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 5.6.2\n" +"X-Generator: Weblate 5.8.2\n" msgctxt "Addon Summary" msgid "Plugin for YouTube" @@ -31,14 +31,14 @@ msgstr "Este add-on no está respaldado por Google" # msgctxt "Addon Summary" # msgid "Plugin for YouTube" -# msgstr "Plugin para YouTube" +# msgstr "" # msgctxt "Addon Description" # msgid "YouTube is a one of the biggest video-sharing websites of the world." -# msgstr "YouTube es uno de los sitios web más grandes para compartir videos del mundo." +# msgstr "" # Kodion Settings msgctxt "#30000" -msgid "General" -msgstr "General" +msgid "" +msgstr " " msgctxt "#30001" msgid "" @@ -151,8 +151,8 @@ msgid "Configure %s?" msgstr "¿Configurar %s?" msgctxt "#30031" -msgid "Advanced" -msgstr "Avanzado" +msgid "" +msgstr " " msgctxt "#30032" msgid "View: TV Shows" @@ -217,8 +217,8 @@ msgid "Watch Later" msgstr "Ver más tarde" msgctxt "#30108" -msgid "Remove" -msgstr "Borrar" +msgid "" +msgstr " " msgctxt "#30109" msgid "" @@ -237,8 +237,8 @@ msgid "Sign Out" msgstr "Cerrar sesión" msgctxt "#30113" -msgid "Rename" -msgstr "Renombrar" +msgid "" +msgstr " " msgctxt "#30114" msgid "Confirm delete" @@ -257,8 +257,8 @@ msgid "Remove \"%s\"?" msgstr "¿Está seguro de que desea borrar \"%s\"?" msgctxt "#30118" -msgid "Delete" -msgstr "Eliminar" +msgid "" +msgstr " " msgctxt "#30119" msgid "Please wait..." @@ -301,12 +301,12 @@ msgstr " " # YouTube # empty strings from id 30206 to 30499 msgctxt "#30500" -msgid "Channels" -msgstr "Canales" +msgid "" +msgstr " " msgctxt "#30501" -msgid "Playlists" -msgstr "Listas de reproducción" +msgid "" +msgstr " " msgctxt "#30502" msgid "Go to %s" @@ -361,8 +361,8 @@ msgid "Related Videos" msgstr "Vídeos relacionados" msgctxt "#30515" -msgid "Auto-Remove from 'Watch Later'" -msgstr "Borrar automáticamente de 'Ver más tarde'" +msgid "Auto-Remove from Watch Later" +msgstr "Quitar automáticamente de Ver Mas Tarde" msgctxt "#30516" msgid "Folders" @@ -385,16 +385,16 @@ msgid "Add to..." msgstr "Añadir a..." msgctxt "#30521" -msgid "Select playlist" -msgstr "Seleccionar lista de reproducción" +msgid "" +msgstr " " msgctxt "#30522" -msgid "New playlist..." -msgstr "Nueva lista de reproducción..." +msgid "" +msgstr " " msgctxt "#30523" -msgid "Language" -msgstr "Idioma" +msgid "" +msgstr " " msgctxt "#30524" msgid "Select language" @@ -425,20 +425,20 @@ msgid "I dislike this" msgstr "No me gusta" msgctxt "#30531" -msgid "Play all" -msgstr "Reproducir todo" +msgid "" +msgstr " " msgctxt "#30532" -msgid "Default" -msgstr "Por defecto" +msgid "" +msgstr " " msgctxt "#30533" msgid "Reverse" msgstr "Inverso" msgctxt "#30534" -msgid "Shuffle" -msgstr "Mezclar" +msgid "" +msgstr " " msgctxt "#30535" msgid "Select the order of the playlist" @@ -457,8 +457,8 @@ msgid "Disliked Videos" msgstr "No me gustó el vídeo" msgctxt "#30539" -msgid "Live" -msgstr "En directo" +msgid "" +msgstr " " msgctxt "#30540" msgid "Play with..." @@ -473,8 +473,8 @@ msgid "rtmpe streams are not supported" msgstr "Las transmisiones rtmpe no están soportadas" msgctxt "#30543" -msgid "Refresh" -msgstr "Actualizar" +msgid "" +msgstr " " msgctxt "#30544" msgid "More Links from the description" @@ -485,24 +485,24 @@ msgid "No further links found." msgstr "No se encontraron más enlaces." msgctxt "#30546" -msgid "Please log in twice!" -msgstr "¡Por favor, inicie sesión dos veces!" +msgid "Please complete all login prompts" +msgstr "Por favor, complete todas las peticiones de inicio de sesión" msgctxt "#30547" -msgid "You must enable two applications so that YouTube is functioning properly." -msgstr "Debe habilitar dos aplicaciones para que YouTube funcione correctamente." +msgid "You may be prompted to enable two applications so that YouTube is functioning properly." +msgstr "Puede que se pidan activar dos aplicaciones para que YouTube funcione correctamente." msgctxt "#30548" -msgid "More..." -msgstr "Más..." +msgid "" +msgstr " " msgctxt "#30549" msgid "No videos streams found" msgstr "No se han encontrados vídeos" msgctxt "#30550" -msgid "Region" -msgstr "Región" +msgid "" +msgstr " " msgctxt "#30551" msgid "Recommendations" @@ -541,17 +541,17 @@ msgid "Delete settings.xml" msgstr "Eliminar settings.xml" msgctxt "#30560" -msgid "Subtitle language" -msgstr "Idioma para subtítulos" +msgid "" +msgstr " " msgctxt "#30561" -msgid "None" -msgstr "Ninguno" - -msgctxt "#30562" msgid "" msgstr " " +msgctxt "#30562" +msgid "View all" +msgstr "Ver todo" + msgctxt "#30563" msgid "" msgstr " " @@ -565,8 +565,8 @@ msgid "" msgstr " " msgctxt "#30566" -msgid "Prompt" -msgstr "Generados" +msgid "" +msgstr " " msgctxt "#30567" msgid "Set as Watch Later" @@ -577,12 +577,12 @@ msgid "Remove as Watch Later" msgstr "Borrar como 'Ver más tarde'" msgctxt "#30569" -msgid "Are you sure you want to remove '%s' as your Watch Later list?" -msgstr "¿Está seguro de que desea borrar '%s' de su lista 'Ver más tarde'?" +msgid "Are you sure you want to remove \"%s\" as your Watch Later list?" +msgstr "¿Seguro de que quieres quitar \"%s\" de la lista Ver Mas Tarde?" msgctxt "#30570" -msgid "Are you sure you want to replace your current Watch Later list with '%s'?" -msgstr "¿Está seguro de que desea reemplazar su lista actual 'Ver más tarde'?" +msgid "Are you sure you want to replace your current Watch Later list with \"%s\"?" +msgstr "¿Seguro de que quieres reemplazar la lista Ver Mas Tarde con \"%s\"?" msgctxt "#30571" msgid "Set as History" @@ -593,12 +593,12 @@ msgid "Remove as History" msgstr "Borrar como 'Historial'" msgctxt "#30573" -msgid "Are you sure you want to remove '%s' as your History list?" -msgstr "¿Está seguro de que quiere borrar '%s' como su lista 'Historial'?" +msgid "Are you sure you want to remove \"%s\" as your History list?" +msgstr "¿Seguro de que quieres quitar \"%s\" como lista Historial?" msgctxt "#30574" -msgid "Are you sure you want to replace your current History list with '%s'?" -msgstr "¿Está seguro de que quiere remplazar su actual lista 'Historial' por '%s'?" +msgid "Are you sure you want to replace your current History list with \"%s\"?" +msgstr "¿Seguro de que quieres reemplazar la lista Historial con \"%s\"?" msgctxt "#30575" msgid "Succeeded" @@ -609,8 +609,8 @@ msgid "Failed" msgstr "¡Vaya! Algo ha fallado" msgctxt "#30577" -msgid "Settings" -msgstr "Ajustes" +msgid "" +msgstr " " msgctxt "#30578" msgid "Force SSL certificate verification" @@ -633,8 +633,8 @@ msgid "Autoplay suggested videos" msgstr "Reproducir vídeos sugeridos automáticamente" msgctxt "#30583" -msgid "Automatic" -msgstr "Automático" +msgid "" +msgstr " " msgctxt "#30584" msgid "My Subscriptions (Filtered)" @@ -693,16 +693,16 @@ msgid "Updated: %s" msgstr "Actualizado: %s" msgctxt "#30598" -msgid "Personal API keys enabled" -msgstr "Claves API personales habilitadas" +msgid "" +msgstr " " msgctxt "#30599" msgid "Failed to enable personal API keys. Missing: %s" msgstr "Error al habilitar claves API personales. No encontrado: %s" msgctxt "#30600" -msgid "Subtitles" -msgstr "Subtítulos" +msgid "" +msgstr " " msgctxt "#30601" msgid "%s with Original/%s fallback" @@ -761,8 +761,8 @@ msgid "" msgstr " " msgctxt "#30615" -msgid "Cancel" -msgstr "Cancelar" +msgid "" +msgstr " " msgctxt "#30616" msgid "" @@ -777,8 +777,8 @@ msgid "" msgstr " " msgctxt "#30619" -msgid "Port" -msgstr "Puerto" +msgid "" +msgstr " " msgctxt "#30620" msgid "Port %s already in use. Cannot start http server." @@ -821,8 +821,8 @@ msgid "IP whitelist (comma delimited)" msgstr "Lista blanca IP (utilice comas como separador)" msgctxt "#30630" -msgid "Save" -msgstr "Guardar" +msgid "" +msgstr " " msgctxt "#30631" msgid "Successfully updated: %s" @@ -937,8 +937,8 @@ msgid "Enter a name for this user" msgstr "Introduzca un nombre para este usuario" msgctxt "#30659" -msgid "User is now '%s'" -msgstr "El nombre de usuario es ahora '%s'" +msgid "User is now \"%s\"" +msgstr "El usuario ahora es \"%s\"" msgctxt "#30660" msgid "Users" @@ -961,16 +961,16 @@ msgid "Switch user" msgstr "Cambiar de usuario" msgctxt "#30665" -msgid "Switch to '%s' now?" -msgstr "¿Desea cambiar a '%s' ahora?" +msgid "Switch to \"%s\" now?" +msgstr "¿Cambiar a \"%s\" ahora?" msgctxt "#30666" -msgid "%s removed" -msgstr "%s eliminado" +msgid "\"%s\" removed" +msgstr "\"%s\" quitado" msgctxt "#30667" -msgid "Renamed '%s' to '%s'" -msgstr "'$s' renombrado a '%s'" +msgid "Renamed \"%s\" to \"%s\"" +msgstr "\"%s\" renombrado como \"%s\"" msgctxt "#30668" msgid "Play count minimum percent" @@ -1113,8 +1113,8 @@ msgid "Play with subtitles" msgstr "Reproducir con subtítulos" msgctxt "#30703" -msgid "Are you sure?" -msgstr "¿Está seguro?" +msgid "" +msgstr " " msgctxt "#30704" msgid "Use YouTube website urls with default player" @@ -1257,8 +1257,8 @@ msgid "" msgstr " " msgctxt "#30739" -msgid "" -msgstr " " +msgid "Subscribers" +msgstr "Suscriptores" msgctxt "#30740" msgid "HLS" @@ -1477,12 +1477,12 @@ msgid "Views count display colour" msgstr "Color de visualización del recuento de visitas" msgctxt "#30794" -msgid "Likes count display colour" -msgstr "Color de visualización del recuento de Me gusta" +msgid "Subscriber/Likes count display colour" +msgstr "Color del contador de Suscriptores/Me Gusta" msgctxt "#30795" -msgid "Comments count display colour" -msgstr "Color de visualización del recuento de comentarios" +msgid "Videos/Comments count display colour" +msgstr "Color del contador Vídeos/Comentarios" msgctxt "#30796" msgid "1080p/60 fps | Raspberry Pi 4, or similar" @@ -1542,27 +1542,27 @@ msgstr "Todos los próximos vídeos" msgctxt "#30810" msgid "All previously streamed (completed) videos" -msgstr "Todos los vídeos transmitidos (completados) anteriormente" +msgstr "Todos los vídeos transmitidos previamente (completados)" msgctxt "#30811" msgid "Filter Live folders" -msgstr "Filtrar carpetas en directo" +msgstr "Filtrar carpetas activas" msgctxt "#30812" msgid "Clear subscription feed history" -msgstr "Limpiar historial del hilo de suscripciones" +msgstr "Limpiar historial de suscripciones" msgctxt "#30813" msgid "Delete subscription feed history database" -msgstr "Borrar base de datos del hilo de subscripciones" +msgstr "Eliminar base de datos del historial de suscripciones" msgctxt "#30814" msgid "feed history" -msgstr "Historial del hilo" +msgstr "Historial" msgctxt "#30815" msgid "Go back..." -msgstr "Retrocede..." +msgstr "Volver..." msgctxt "#30816" msgid "List is empty.[CR][CR]Refresh from context menu or try again later." @@ -1580,6 +1580,199 @@ msgctxt "#30819" msgid "Play from start" msgstr "Reproducir desde el inicio" +msgctxt "#30820" +msgid "Podcast" +msgstr "Podcast" + +#~ msgctxt "#30515" +#~ msgid "Auto-Remove from 'Watch Later'" +#~ msgstr "Borrar automáticamente de 'Ver más tarde'" + +#~ msgctxt "#30569" +#~ msgid "Are you sure you want to remove '%s' as your Watch Later list?" +#~ msgstr "¿Está seguro de que desea borrar '%s' de su lista 'Ver más tarde'?" + +#~ msgctxt "#30570" +#~ msgid "Are you sure you want to replace your current Watch Later list with '%s'?" +#~ msgstr "¿Está seguro de que desea reemplazar su lista actual 'Ver más tarde'?" + +#~ msgctxt "#30573" +#~ msgid "Are you sure you want to remove '%s' as your History list?" +#~ msgstr "¿Está seguro de que quiere borrar '%s' como su lista 'Historial'?" + +#~ msgctxt "#30574" +#~ msgid "Are you sure you want to replace your current History list with '%s'?" +#~ msgstr "¿Está seguro de que quiere remplazar su actual lista 'Historial' por '%s'?" + +#~ msgctxt "#30659" +#~ msgid "User is now '%s'" +#~ msgstr "El nombre de usuario es ahora '%s'" + +#~ msgctxt "#30665" +#~ msgid "Switch to '%s' now?" +#~ msgstr "¿Desea cambiar a '%s' ahora?" + +#~ msgctxt "#30666" +#~ msgid "%s removed" +#~ msgstr "%s eliminado" + +#~ msgctxt "#30667" +#~ msgid "Renamed '%s' to '%s'" +#~ msgstr "'$s' renombrado a '%s'" + +# msgctxt "Addon Summary" +# msgid "Plugin for YouTube" +# msgstr "Plugin para YouTube" +# msgctxt "Addon Description" +# msgid "YouTube is a one of the biggest video-sharing websites of the world." +# msgstr "YouTube es uno de los sitios web más grandes para compartir videos del mundo." +# Kodion Settings +#~ msgctxt "#30000" +#~ msgid "General" +#~ msgstr "General" + +#~ msgctxt "#30031" +#~ msgid "Advanced" +#~ msgstr "Avanzado" + +#~ msgctxt "#30108" +#~ msgid "Remove" +#~ msgstr "Borrar" + +#~ msgctxt "#30113" +#~ msgid "Rename" +#~ msgstr "Renombrar" + +#~ msgctxt "#30118" +#~ msgid "Delete" +#~ msgstr "Eliminar" + +# YouTube +# empty strings from id 30206 to 30499 +#~ msgctxt "#30500" +#~ msgid "Channels" +#~ msgstr "Canales" + +#~ msgctxt "#30501" +#~ msgid "Playlists" +#~ msgstr "Listas de reproducción" + +#~ msgctxt "#30521" +#~ msgid "Select playlist" +#~ msgstr "Seleccionar lista de reproducción" + +#~ msgctxt "#30522" +#~ msgid "New playlist..." +#~ msgstr "Nueva lista de reproducción..." + +#~ msgctxt "#30523" +#~ msgid "Language" +#~ msgstr "Idioma" + +#~ msgctxt "#30531" +#~ msgid "Play all" +#~ msgstr "Reproducir todo" + +#~ msgctxt "#30532" +#~ msgid "Default" +#~ msgstr "Por defecto" + +#~ msgctxt "#30534" +#~ msgid "Shuffle" +#~ msgstr "Mezclar" + +#~ msgctxt "#30539" +#~ msgid "Live" +#~ msgstr "En directo" + +#~ msgctxt "#30543" +#~ msgid "Refresh" +#~ msgstr "Actualizar" + +#~ msgctxt "#30548" +#~ msgid "More..." +#~ msgstr "Más..." + +#~ msgctxt "#30550" +#~ msgid "Region" +#~ msgstr "Región" + +#~ msgctxt "#30560" +#~ msgid "Subtitle language" +#~ msgstr "Idioma para subtítulos" + +#~ msgctxt "#30561" +#~ msgid "None" +#~ msgstr "Ninguno" + +#~ msgctxt "#30566" +#~ msgid "Prompt" +#~ msgstr "Generados" + +#~ msgctxt "#30577" +#~ msgid "Settings" +#~ msgstr "Ajustes" + +#~ msgctxt "#30583" +#~ msgid "Automatic" +#~ msgstr "Automático" + +#~ msgctxt "#30598" +#~ msgid "Personal API keys enabled" +#~ msgstr "Claves API personales habilitadas" + +#~ msgctxt "#30600" +#~ msgid "Subtitles" +#~ msgstr "Subtítulos" + +#~ msgctxt "#30615" +#~ msgid "Cancel" +#~ msgstr "Cancelar" + +#~ msgctxt "#30619" +#~ msgid "Port" +#~ msgstr "Puerto" + +#~ msgctxt "#30630" +#~ msgid "Save" +#~ msgstr "Guardar" + +#~ msgctxt "#30703" +#~ msgid "Are you sure?" +#~ msgstr "¿Está seguro?" + +#~ msgctxt "#30737" +#~ msgid "Episodes" +#~ msgstr "Episodios" + +#~ msgctxt "#30738" +#~ msgid "Videos" +#~ msgstr "Vídeos" + +#~ msgctxt "#30562" +#~ msgid "" +#~ msgstr " " + +#~ msgctxt "#30739" +#~ msgid "" +#~ msgstr " " + +#~ msgctxt "#30794" +#~ msgid "Likes count display colour" +#~ msgstr "Color de visualización del recuento de Me gusta" + +#~ msgctxt "#30795" +#~ msgid "Comments count display colour" +#~ msgstr "Color de visualización del recuento de comentarios" + +#~ msgctxt "#30546" +#~ msgid "Please log in twice!" +#~ msgstr "¡Por favor, inicie sesión dos veces!" + +#~ msgctxt "#30547" +#~ msgid "You must enable two applications so that YouTube is functioning properly." +#~ msgstr "Debe habilitar dos aplicaciones para que YouTube funcione correctamente." + #~ msgctxt "#30001" #~ msgid "Username" #~ msgstr "Nombre de usuario" diff --git a/plugin.video.youtube/resources/language/resource.language.es_mx/strings.po b/plugin.video.youtube/resources/language/resource.language.es_mx/strings.po index 6f63137de1..8863ac2053 100644 --- a/plugin.video.youtube/resources/language/resource.language.es_mx/strings.po +++ b/plugin.video.youtube/resources/language/resource.language.es_mx/strings.po @@ -31,14 +31,14 @@ msgstr "Este complemento no está respaldado por Google" # msgctxt "Addon Summary" # msgid "Plugin for YouTube" -# msgstr "Plugin para YouTube" +# msgstr "" # msgctxt "Addon Description" # msgid "YouTube is a one of the biggest video-sharing websites of the world." -# msgstr "YouTube es uno de los mayores sitios web de intercambio de videos del mundo." +# msgstr "" # Kodion Settings msgctxt "#30000" -msgid "General" -msgstr "General" +msgid "" +msgstr "" msgctxt "#30001" msgid "" @@ -151,8 +151,8 @@ msgid "Configure %s?" msgstr "" msgctxt "#30031" -msgid "Advanced" -msgstr "Avanzado" +msgid "" +msgstr "" msgctxt "#30032" msgid "View: TV Shows" @@ -217,8 +217,8 @@ msgid "Watch Later" msgstr "Ver más tarde" msgctxt "#30108" -msgid "Remove" -msgstr "Borrar" +msgid "" +msgstr "" msgctxt "#30109" msgid "" @@ -237,8 +237,8 @@ msgid "Sign Out" msgstr "Cerrar sesión" msgctxt "#30113" -msgid "Rename" -msgstr "Renombrar" +msgid "" +msgstr "" msgctxt "#30114" msgid "Confirm delete" @@ -257,8 +257,8 @@ msgid "Remove \"%s\"?" msgstr "¿Estás seguro de que quieres borrar \"%s\"?" msgctxt "#30118" -msgid "Delete" -msgstr "Eliminar" +msgid "" +msgstr "" msgctxt "#30119" msgid "Please wait..." @@ -301,12 +301,12 @@ msgstr "" # YouTube # empty strings from id 30206 to 30499 msgctxt "#30500" -msgid "Channels" -msgstr "Canales" +msgid "" +msgstr "" msgctxt "#30501" -msgid "Playlists" -msgstr "Listas de reproducción" +msgid "" +msgstr "" msgctxt "#30502" msgid "Go to %s" @@ -361,8 +361,8 @@ msgid "Related Videos" msgstr "Videos relacionados" msgctxt "#30515" -msgid "Auto-Remove from 'Watch Later'" -msgstr "Auto-eliminar de 'Ver más tarde'" +msgid "Auto-Remove from Watch Later" +msgstr "" msgctxt "#30516" msgid "Folders" @@ -385,16 +385,16 @@ msgid "Add to..." msgstr "Añadir a..." msgctxt "#30521" -msgid "Select playlist" -msgstr "Selecciona una lista de reproducción" +msgid "" +msgstr "" msgctxt "#30522" -msgid "New playlist..." -msgstr "Nueva lista de reproducción..." +msgid "" +msgstr "" msgctxt "#30523" -msgid "Language" -msgstr "Idioma" +msgid "" +msgstr "" msgctxt "#30524" msgid "Select language" @@ -425,20 +425,20 @@ msgid "I dislike this" msgstr "No me gusta" msgctxt "#30531" -msgid "Play all" -msgstr "Reproducir todo" +msgid "" +msgstr "" msgctxt "#30532" -msgid "Default" -msgstr "Predeterminado" +msgid "" +msgstr "" msgctxt "#30533" msgid "Reverse" msgstr "Inverso" msgctxt "#30534" -msgid "Shuffle" -msgstr "Mezclar" +msgid "" +msgstr "" msgctxt "#30535" msgid "Select the order of the playlist" @@ -457,8 +457,8 @@ msgid "Disliked Videos" msgstr "Videos que no me gustan" msgctxt "#30539" -msgid "Live" -msgstr "En vivo" +msgid "" +msgstr "" msgctxt "#30540" msgid "Play with..." @@ -473,8 +473,8 @@ msgid "rtmpe streams are not supported" msgstr "Los streams rtmpe no estan soportados" msgctxt "#30543" -msgid "Refresh" -msgstr "Refrescar lista" +msgid "" +msgstr "" msgctxt "#30544" msgid "More Links from the description" @@ -485,24 +485,24 @@ msgid "No further links found." msgstr "No se encontraron enlaces." msgctxt "#30546" -msgid "Please log in twice!" -msgstr "¡Por favor, inicia sesión dos veces!" +msgid "Please complete all login prompts" +msgstr "" msgctxt "#30547" -msgid "You must enable two applications so that YouTube is functioning properly." -msgstr "Debes permitir dos aplicaciones para que YouTube funcione correctamente." +msgid "You may be prompted to enable two applications so that YouTube is functioning properly." +msgstr "" msgctxt "#30548" -msgid "More..." -msgstr "Más..." +msgid "" +msgstr "" msgctxt "#30549" msgid "No videos streams found" msgstr "No se han encontrados videos" msgctxt "#30550" -msgid "Region" -msgstr "Región" +msgid "" +msgstr "" msgctxt "#30551" msgid "Recommendations" @@ -541,15 +541,15 @@ msgid "Delete settings.xml" msgstr "Eliminar settings.xml" msgctxt "#30560" -msgid "Subtitle language" -msgstr "Idioma para subtítulos" +msgid "" +msgstr "" msgctxt "#30561" -msgid "None" -msgstr "Ninguno" +msgid "" +msgstr "" msgctxt "#30562" -msgid "" +msgid "View all" msgstr "" msgctxt "#30563" @@ -565,8 +565,8 @@ msgid "" msgstr "" msgctxt "#30566" -msgid "Prompt" -msgstr "Generados" +msgid "" +msgstr "" msgctxt "#30567" msgid "Set as Watch Later" @@ -577,12 +577,12 @@ msgid "Remove as Watch Later" msgstr "Eliminar como lista de 'Ver más tarde'" msgctxt "#30569" -msgid "Are you sure you want to remove '%s' as your Watch Later list?" -msgstr "¿Estás seguro que quieres eliminar '%s' como tu lista de 'Ver más tarde'?" +msgid "Are you sure you want to remove \"%s\" as your Watch Later list?" +msgstr "" msgctxt "#30570" -msgid "Are you sure you want to replace your current Watch Later list with '%s'?" -msgstr "¿Estás seguro que quieres reemplazar tu lista actual de 'Ver más tarde'?" +msgid "Are you sure you want to replace your current Watch Later list with \"%s\"?" +msgstr "" msgctxt "#30571" msgid "Set as History" @@ -593,12 +593,12 @@ msgid "Remove as History" msgstr "Eliminar como 'Historial'" msgctxt "#30573" -msgid "Are you sure you want to remove '%s' as your History list?" -msgstr "¿Estás seguro que quieres eliminar '%s' como tu lista de 'Historial'?" +msgid "Are you sure you want to remove \"%s\" as your History list?" +msgstr "" msgctxt "#30574" -msgid "Are you sure you want to replace your current History list with '%s'?" -msgstr "¿Estás seguro que quieres remplazar tu actual lista de 'Historial' por '%s'?" +msgid "Are you sure you want to replace your current History list with \"%s\"?" +msgstr "" msgctxt "#30575" msgid "Succeeded" @@ -609,8 +609,8 @@ msgid "Failed" msgstr "Ocurrió un error" msgctxt "#30577" -msgid "Settings" -msgstr "Configuración" +msgid "" +msgstr "" msgctxt "#30578" msgid "Force SSL certificate verification" @@ -633,8 +633,8 @@ msgid "Autoplay suggested videos" msgstr "Reproducir videos sugeridos automáticamente" msgctxt "#30583" -msgid "Automatic" -msgstr "Automático" +msgid "" +msgstr "" msgctxt "#30584" msgid "My Subscriptions (Filtered)" @@ -693,16 +693,16 @@ msgid "Updated: %s" msgstr "Actualizado: %s" msgctxt "#30598" -msgid "Personal API keys enabled" -msgstr "Claves API personales habilitadas" +msgid "" +msgstr "" msgctxt "#30599" msgid "Failed to enable personal API keys. Missing: %s" msgstr "Error al habilitar claves API personales. Falta: %s" msgctxt "#30600" -msgid "Subtitles" -msgstr "Subtítulos" +msgid "" +msgstr "" msgctxt "#30601" msgid "%s with Original/%s fallback" @@ -761,8 +761,8 @@ msgid "" msgstr "" msgctxt "#30615" -msgid "Cancel" -msgstr "Cancelar" +msgid "" +msgstr "" msgctxt "#30616" msgid "" @@ -777,8 +777,8 @@ msgid "" msgstr "" msgctxt "#30619" -msgid "Port" -msgstr "Puerto" +msgid "" +msgstr "" msgctxt "#30620" msgid "Port %s already in use. Cannot start http server." @@ -821,8 +821,8 @@ msgid "IP whitelist (comma delimited)" msgstr "Lista blanca de IP (utilice comas como separador)" msgctxt "#30630" -msgid "Save" -msgstr "Guardar" +msgid "" +msgstr "" msgctxt "#30631" msgid "Successfully updated: %s" @@ -937,8 +937,8 @@ msgid "Enter a name for this user" msgstr "Ingresa un nombre para este usuario" msgctxt "#30659" -msgid "User is now '%s'" -msgstr "El nombre de usuario es ahora '%s'" +msgid "User is now \"%s\"" +msgstr "" msgctxt "#30660" msgid "Users" @@ -961,16 +961,16 @@ msgid "Switch user" msgstr "Cambiar de usuario" msgctxt "#30665" -msgid "Switch to '%s' now?" -msgstr "¿Quieres cambiar a '%s' ahora?" +msgid "Switch to \"%s\" now?" +msgstr "" msgctxt "#30666" -msgid "%s removed" +msgid "\"%s\" removed" msgstr "" msgctxt "#30667" -msgid "Renamed '%s' to '%s'" -msgstr "Renombrado '%s' a '%s'" +msgid "Renamed \"%s\" to \"%s\"" +msgstr "" msgctxt "#30668" msgid "Play count minimum percent" @@ -1113,8 +1113,8 @@ msgid "Play with subtitles" msgstr "Reproducir con subtítulos" msgctxt "#30703" -msgid "Are you sure?" -msgstr "¿Estás seguro?" +msgid "" +msgstr "" msgctxt "#30704" msgid "Use YouTube website urls with default player" @@ -1257,7 +1257,7 @@ msgid "" msgstr "" msgctxt "#30739" -msgid "" +msgid "Subscribers" msgstr "" msgctxt "#30740" @@ -1477,11 +1477,11 @@ msgid "Views count display colour" msgstr "" msgctxt "#30794" -msgid "Likes count display colour" +msgid "Subscriber/Likes count display colour" msgstr "" msgctxt "#30795" -msgid "Comments count display colour" +msgid "Videos/Comments count display colour" msgstr "" msgctxt "#30796" @@ -1580,6 +1580,171 @@ msgctxt "#30819" msgid "Play from start" msgstr "" +msgctxt "#30820" +msgid "Podcast" +msgstr "" + +#~ msgctxt "#30515" +#~ msgid "Auto-Remove from 'Watch Later'" +#~ msgstr "Auto-eliminar de 'Ver más tarde'" + +#~ msgctxt "#30569" +#~ msgid "Are you sure you want to remove '%s' as your Watch Later list?" +#~ msgstr "¿Estás seguro que quieres eliminar '%s' como tu lista de 'Ver más tarde'?" + +#~ msgctxt "#30570" +#~ msgid "Are you sure you want to replace your current Watch Later list with '%s'?" +#~ msgstr "¿Estás seguro que quieres reemplazar tu lista actual de 'Ver más tarde'?" + +#~ msgctxt "#30573" +#~ msgid "Are you sure you want to remove '%s' as your History list?" +#~ msgstr "¿Estás seguro que quieres eliminar '%s' como tu lista de 'Historial'?" + +#~ msgctxt "#30574" +#~ msgid "Are you sure you want to replace your current History list with '%s'?" +#~ msgstr "¿Estás seguro que quieres remplazar tu actual lista de 'Historial' por '%s'?" + +#~ msgctxt "#30659" +#~ msgid "User is now '%s'" +#~ msgstr "El nombre de usuario es ahora '%s'" + +#~ msgctxt "#30665" +#~ msgid "Switch to '%s' now?" +#~ msgstr "¿Quieres cambiar a '%s' ahora?" + +#~ msgctxt "#30667" +#~ msgid "Renamed '%s' to '%s'" +#~ msgstr "Renombrado '%s' a '%s'" + +# msgctxt "Addon Summary" +# msgid "Plugin for YouTube" +# msgstr "Plugin para YouTube" +# msgctxt "Addon Description" +# msgid "YouTube is a one of the biggest video-sharing websites of the world." +# msgstr "YouTube es uno de los mayores sitios web de intercambio de videos del mundo." +# Kodion Settings +#~ msgctxt "#30000" +#~ msgid "General" +#~ msgstr "General" + +#~ msgctxt "#30031" +#~ msgid "Advanced" +#~ msgstr "Avanzado" + +#~ msgctxt "#30108" +#~ msgid "Remove" +#~ msgstr "Borrar" + +#~ msgctxt "#30113" +#~ msgid "Rename" +#~ msgstr "Renombrar" + +#~ msgctxt "#30118" +#~ msgid "Delete" +#~ msgstr "Eliminar" + +# YouTube +# empty strings from id 30206 to 30499 +#~ msgctxt "#30500" +#~ msgid "Channels" +#~ msgstr "Canales" + +#~ msgctxt "#30501" +#~ msgid "Playlists" +#~ msgstr "Listas de reproducción" + +#~ msgctxt "#30521" +#~ msgid "Select playlist" +#~ msgstr "Selecciona una lista de reproducción" + +#~ msgctxt "#30522" +#~ msgid "New playlist..." +#~ msgstr "Nueva lista de reproducción..." + +#~ msgctxt "#30523" +#~ msgid "Language" +#~ msgstr "Idioma" + +#~ msgctxt "#30531" +#~ msgid "Play all" +#~ msgstr "Reproducir todo" + +#~ msgctxt "#30532" +#~ msgid "Default" +#~ msgstr "Predeterminado" + +#~ msgctxt "#30534" +#~ msgid "Shuffle" +#~ msgstr "Mezclar" + +#~ msgctxt "#30539" +#~ msgid "Live" +#~ msgstr "En vivo" + +#~ msgctxt "#30543" +#~ msgid "Refresh" +#~ msgstr "Refrescar lista" + +#~ msgctxt "#30548" +#~ msgid "More..." +#~ msgstr "Más..." + +#~ msgctxt "#30550" +#~ msgid "Region" +#~ msgstr "Región" + +#~ msgctxt "#30560" +#~ msgid "Subtitle language" +#~ msgstr "Idioma para subtítulos" + +#~ msgctxt "#30561" +#~ msgid "None" +#~ msgstr "Ninguno" + +#~ msgctxt "#30566" +#~ msgid "Prompt" +#~ msgstr "Generados" + +#~ msgctxt "#30577" +#~ msgid "Settings" +#~ msgstr "Configuración" + +#~ msgctxt "#30583" +#~ msgid "Automatic" +#~ msgstr "Automático" + +#~ msgctxt "#30598" +#~ msgid "Personal API keys enabled" +#~ msgstr "Claves API personales habilitadas" + +#~ msgctxt "#30600" +#~ msgid "Subtitles" +#~ msgstr "Subtítulos" + +#~ msgctxt "#30615" +#~ msgid "Cancel" +#~ msgstr "Cancelar" + +#~ msgctxt "#30619" +#~ msgid "Port" +#~ msgstr "Puerto" + +#~ msgctxt "#30630" +#~ msgid "Save" +#~ msgstr "Guardar" + +#~ msgctxt "#30703" +#~ msgid "Are you sure?" +#~ msgstr "¿Estás seguro?" + +#~ msgctxt "#30546" +#~ msgid "Please log in twice!" +#~ msgstr "¡Por favor, inicia sesión dos veces!" + +#~ msgctxt "#30547" +#~ msgid "You must enable two applications so that YouTube is functioning properly." +#~ msgstr "Debes permitir dos aplicaciones para que YouTube funcione correctamente." + #~ msgctxt "#30001" #~ msgid "Username" #~ msgstr "Nombre de usuario" diff --git a/plugin.video.youtube/resources/language/resource.language.et_ee/strings.po b/plugin.video.youtube/resources/language/resource.language.et_ee/strings.po index 9c768f5f89..0e56487d2e 100644 --- a/plugin.video.youtube/resources/language/resource.language.et_ee/strings.po +++ b/plugin.video.youtube/resources/language/resource.language.et_ee/strings.po @@ -37,7 +37,7 @@ msgstr "" # msgstr "" # Kodion Settings msgctxt "#30000" -msgid "General" +msgid "" msgstr "" msgctxt "#30001" @@ -151,7 +151,7 @@ msgid "Configure %s?" msgstr "" msgctxt "#30031" -msgid "Advanced" +msgid "" msgstr "" msgctxt "#30032" @@ -217,7 +217,7 @@ msgid "Watch Later" msgstr "" msgctxt "#30108" -msgid "Remove" +msgid "" msgstr "" msgctxt "#30109" @@ -237,7 +237,7 @@ msgid "Sign Out" msgstr "" msgctxt "#30113" -msgid "Rename" +msgid "" msgstr "" msgctxt "#30114" @@ -257,7 +257,7 @@ msgid "Remove \"%s\"?" msgstr "" msgctxt "#30118" -msgid "Delete" +msgid "" msgstr "" msgctxt "#30119" @@ -301,11 +301,11 @@ msgstr "" # YouTube # empty strings from id 30206 to 30499 msgctxt "#30500" -msgid "Channels" +msgid "" msgstr "" msgctxt "#30501" -msgid "Playlists" +msgid "" msgstr "" msgctxt "#30502" @@ -361,7 +361,7 @@ msgid "Related Videos" msgstr "" msgctxt "#30515" -msgid "Auto-Remove from 'Watch Later'" +msgid "Auto-Remove from Watch Later" msgstr "" msgctxt "#30516" @@ -385,15 +385,15 @@ msgid "Add to..." msgstr "" msgctxt "#30521" -msgid "Select playlist" +msgid "" msgstr "" msgctxt "#30522" -msgid "New playlist..." +msgid "" msgstr "" msgctxt "#30523" -msgid "Language" +msgid "" msgstr "" msgctxt "#30524" @@ -425,11 +425,11 @@ msgid "I dislike this" msgstr "" msgctxt "#30531" -msgid "Play all" +msgid "" msgstr "" msgctxt "#30532" -msgid "Default" +msgid "" msgstr "" msgctxt "#30533" @@ -437,7 +437,7 @@ msgid "Reverse" msgstr "" msgctxt "#30534" -msgid "Shuffle" +msgid "" msgstr "" msgctxt "#30535" @@ -457,7 +457,7 @@ msgid "Disliked Videos" msgstr "" msgctxt "#30539" -msgid "Live" +msgid "" msgstr "" msgctxt "#30540" @@ -473,7 +473,7 @@ msgid "rtmpe streams are not supported" msgstr "" msgctxt "#30543" -msgid "Refresh" +msgid "" msgstr "" msgctxt "#30544" @@ -485,15 +485,15 @@ msgid "No further links found." msgstr "" msgctxt "#30546" -msgid "Please log in twice!" +msgid "Please complete all login prompts" msgstr "" msgctxt "#30547" -msgid "You must enable two applications so that YouTube is functioning properly." +msgid "You may be prompted to enable two applications so that YouTube is functioning properly." msgstr "" msgctxt "#30548" -msgid "More..." +msgid "" msgstr "" msgctxt "#30549" @@ -501,7 +501,7 @@ msgid "No videos streams found" msgstr "" msgctxt "#30550" -msgid "Region" +msgid "" msgstr "" msgctxt "#30551" @@ -541,15 +541,15 @@ msgid "Delete settings.xml" msgstr "" msgctxt "#30560" -msgid "Subtitle language" +msgid "" msgstr "" msgctxt "#30561" -msgid "None" +msgid "" msgstr "" msgctxt "#30562" -msgid "" +msgid "View all" msgstr "" msgctxt "#30563" @@ -565,7 +565,7 @@ msgid "" msgstr "" msgctxt "#30566" -msgid "Prompt" +msgid "" msgstr "" msgctxt "#30567" @@ -577,11 +577,11 @@ msgid "Remove as Watch Later" msgstr "" msgctxt "#30569" -msgid "Are you sure you want to remove '%s' as your Watch Later list?" +msgid "Are you sure you want to remove \"%s\" as your Watch Later list?" msgstr "" msgctxt "#30570" -msgid "Are you sure you want to replace your current Watch Later list with '%s'?" +msgid "Are you sure you want to replace your current Watch Later list with \"%s\"?" msgstr "" msgctxt "#30571" @@ -593,11 +593,11 @@ msgid "Remove as History" msgstr "" msgctxt "#30573" -msgid "Are you sure you want to remove '%s' as your History list?" +msgid "Are you sure you want to remove \"%s\" as your History list?" msgstr "" msgctxt "#30574" -msgid "Are you sure you want to replace your current History list with '%s'?" +msgid "Are you sure you want to replace your current History list with \"%s\"?" msgstr "" msgctxt "#30575" @@ -609,7 +609,7 @@ msgid "Failed" msgstr "" msgctxt "#30577" -msgid "Settings" +msgid "" msgstr "" msgctxt "#30578" @@ -633,7 +633,7 @@ msgid "Autoplay suggested videos" msgstr "" msgctxt "#30583" -msgid "Automatic" +msgid "" msgstr "" msgctxt "#30584" @@ -693,7 +693,7 @@ msgid "Updated: %s" msgstr "" msgctxt "#30598" -msgid "Personal API keys enabled" +msgid "" msgstr "" msgctxt "#30599" @@ -701,7 +701,7 @@ msgid "Failed to enable personal API keys. Missing: %s" msgstr "" msgctxt "#30600" -msgid "Subtitles" +msgid "" msgstr "" msgctxt "#30601" @@ -761,7 +761,7 @@ msgid "" msgstr "" msgctxt "#30615" -msgid "Cancel" +msgid "" msgstr "" msgctxt "#30616" @@ -777,7 +777,7 @@ msgid "" msgstr "" msgctxt "#30619" -msgid "Port" +msgid "" msgstr "" msgctxt "#30620" @@ -821,7 +821,7 @@ msgid "IP whitelist (comma delimited)" msgstr "" msgctxt "#30630" -msgid "Save" +msgid "" msgstr "" msgctxt "#30631" @@ -937,7 +937,7 @@ msgid "Enter a name for this user" msgstr "" msgctxt "#30659" -msgid "User is now '%s'" +msgid "User is now \"%s\"" msgstr "" msgctxt "#30660" @@ -961,15 +961,15 @@ msgid "Switch user" msgstr "" msgctxt "#30665" -msgid "Switch to '%s' now?" +msgid "Switch to \"%s\" now?" msgstr "" msgctxt "#30666" -msgid "%s removed" +msgid "\"%s\" removed" msgstr "" msgctxt "#30667" -msgid "Renamed '%s' to '%s'" +msgid "Renamed \"%s\" to \"%s\"" msgstr "" msgctxt "#30668" @@ -1113,7 +1113,7 @@ msgid "Play with subtitles" msgstr "" msgctxt "#30703" -msgid "Are you sure?" +msgid "" msgstr "" msgctxt "#30704" @@ -1257,7 +1257,7 @@ msgid "" msgstr "" msgctxt "#30739" -msgid "" +msgid "Subscribers" msgstr "" msgctxt "#30740" @@ -1477,11 +1477,11 @@ msgid "Views count display colour" msgstr "" msgctxt "#30794" -msgid "Likes count display colour" +msgid "Subscriber/Likes count display colour" msgstr "" msgctxt "#30795" -msgid "Comments count display colour" +msgid "Videos/Comments count display colour" msgstr "" msgctxt "#30796" @@ -1579,3 +1579,7 @@ msgstr "" msgctxt "#30819" msgid "Play from start" msgstr "" + +msgctxt "#30820" +msgid "Podcast" +msgstr "" diff --git a/plugin.video.youtube/resources/language/resource.language.eu_es/strings.po b/plugin.video.youtube/resources/language/resource.language.eu_es/strings.po index 5741a3d0be..e1d6d83d9f 100644 --- a/plugin.video.youtube/resources/language/resource.language.eu_es/strings.po +++ b/plugin.video.youtube/resources/language/resource.language.eu_es/strings.po @@ -37,7 +37,7 @@ msgstr "" # msgstr "" # Kodion Settings msgctxt "#30000" -msgid "General" +msgid "" msgstr "" msgctxt "#30001" @@ -151,7 +151,7 @@ msgid "Configure %s?" msgstr "" msgctxt "#30031" -msgid "Advanced" +msgid "" msgstr "" msgctxt "#30032" @@ -217,7 +217,7 @@ msgid "Watch Later" msgstr "" msgctxt "#30108" -msgid "Remove" +msgid "" msgstr "" msgctxt "#30109" @@ -237,7 +237,7 @@ msgid "Sign Out" msgstr "" msgctxt "#30113" -msgid "Rename" +msgid "" msgstr "" msgctxt "#30114" @@ -257,7 +257,7 @@ msgid "Remove \"%s\"?" msgstr "" msgctxt "#30118" -msgid "Delete" +msgid "" msgstr "" msgctxt "#30119" @@ -301,11 +301,11 @@ msgstr "" # YouTube # empty strings from id 30206 to 30499 msgctxt "#30500" -msgid "Channels" +msgid "" msgstr "" msgctxt "#30501" -msgid "Playlists" +msgid "" msgstr "" msgctxt "#30502" @@ -361,7 +361,7 @@ msgid "Related Videos" msgstr "" msgctxt "#30515" -msgid "Auto-Remove from 'Watch Later'" +msgid "Auto-Remove from Watch Later" msgstr "" msgctxt "#30516" @@ -385,15 +385,15 @@ msgid "Add to..." msgstr "" msgctxt "#30521" -msgid "Select playlist" +msgid "" msgstr "" msgctxt "#30522" -msgid "New playlist..." +msgid "" msgstr "" msgctxt "#30523" -msgid "Language" +msgid "" msgstr "" msgctxt "#30524" @@ -425,11 +425,11 @@ msgid "I dislike this" msgstr "" msgctxt "#30531" -msgid "Play all" +msgid "" msgstr "" msgctxt "#30532" -msgid "Default" +msgid "" msgstr "" msgctxt "#30533" @@ -437,7 +437,7 @@ msgid "Reverse" msgstr "" msgctxt "#30534" -msgid "Shuffle" +msgid "" msgstr "" msgctxt "#30535" @@ -457,7 +457,7 @@ msgid "Disliked Videos" msgstr "" msgctxt "#30539" -msgid "Live" +msgid "" msgstr "" msgctxt "#30540" @@ -473,7 +473,7 @@ msgid "rtmpe streams are not supported" msgstr "" msgctxt "#30543" -msgid "Refresh" +msgid "" msgstr "" msgctxt "#30544" @@ -485,15 +485,15 @@ msgid "No further links found." msgstr "" msgctxt "#30546" -msgid "Please log in twice!" +msgid "Please complete all login prompts" msgstr "" msgctxt "#30547" -msgid "You must enable two applications so that YouTube is functioning properly." +msgid "You may be prompted to enable two applications so that YouTube is functioning properly." msgstr "" msgctxt "#30548" -msgid "More..." +msgid "" msgstr "" msgctxt "#30549" @@ -501,7 +501,7 @@ msgid "No videos streams found" msgstr "" msgctxt "#30550" -msgid "Region" +msgid "" msgstr "" msgctxt "#30551" @@ -541,15 +541,15 @@ msgid "Delete settings.xml" msgstr "" msgctxt "#30560" -msgid "Subtitle language" +msgid "" msgstr "" msgctxt "#30561" -msgid "None" +msgid "" msgstr "" msgctxt "#30562" -msgid "" +msgid "View all" msgstr "" msgctxt "#30563" @@ -565,7 +565,7 @@ msgid "" msgstr "" msgctxt "#30566" -msgid "Prompt" +msgid "" msgstr "" msgctxt "#30567" @@ -577,11 +577,11 @@ msgid "Remove as Watch Later" msgstr "" msgctxt "#30569" -msgid "Are you sure you want to remove '%s' as your Watch Later list?" +msgid "Are you sure you want to remove \"%s\" as your Watch Later list?" msgstr "" msgctxt "#30570" -msgid "Are you sure you want to replace your current Watch Later list with '%s'?" +msgid "Are you sure you want to replace your current Watch Later list with \"%s\"?" msgstr "" msgctxt "#30571" @@ -593,11 +593,11 @@ msgid "Remove as History" msgstr "" msgctxt "#30573" -msgid "Are you sure you want to remove '%s' as your History list?" +msgid "Are you sure you want to remove \"%s\" as your History list?" msgstr "" msgctxt "#30574" -msgid "Are you sure you want to replace your current History list with '%s'?" +msgid "Are you sure you want to replace your current History list with \"%s\"?" msgstr "" msgctxt "#30575" @@ -609,7 +609,7 @@ msgid "Failed" msgstr "" msgctxt "#30577" -msgid "Settings" +msgid "" msgstr "" msgctxt "#30578" @@ -633,7 +633,7 @@ msgid "Autoplay suggested videos" msgstr "" msgctxt "#30583" -msgid "Automatic" +msgid "" msgstr "" msgctxt "#30584" @@ -693,7 +693,7 @@ msgid "Updated: %s" msgstr "" msgctxt "#30598" -msgid "Personal API keys enabled" +msgid "" msgstr "" msgctxt "#30599" @@ -701,7 +701,7 @@ msgid "Failed to enable personal API keys. Missing: %s" msgstr "" msgctxt "#30600" -msgid "Subtitles" +msgid "" msgstr "" msgctxt "#30601" @@ -761,7 +761,7 @@ msgid "" msgstr "" msgctxt "#30615" -msgid "Cancel" +msgid "" msgstr "" msgctxt "#30616" @@ -777,7 +777,7 @@ msgid "" msgstr "" msgctxt "#30619" -msgid "Port" +msgid "" msgstr "" msgctxt "#30620" @@ -821,7 +821,7 @@ msgid "IP whitelist (comma delimited)" msgstr "" msgctxt "#30630" -msgid "Save" +msgid "" msgstr "" msgctxt "#30631" @@ -937,7 +937,7 @@ msgid "Enter a name for this user" msgstr "" msgctxt "#30659" -msgid "User is now '%s'" +msgid "User is now \"%s\"" msgstr "" msgctxt "#30660" @@ -961,15 +961,15 @@ msgid "Switch user" msgstr "" msgctxt "#30665" -msgid "Switch to '%s' now?" +msgid "Switch to \"%s\" now?" msgstr "" msgctxt "#30666" -msgid "%s removed" +msgid "\"%s\" removed" msgstr "" msgctxt "#30667" -msgid "Renamed '%s' to '%s'" +msgid "Renamed \"%s\" to \"%s\"" msgstr "" msgctxt "#30668" @@ -1113,7 +1113,7 @@ msgid "Play with subtitles" msgstr "" msgctxt "#30703" -msgid "Are you sure?" +msgid "" msgstr "" msgctxt "#30704" @@ -1257,7 +1257,7 @@ msgid "" msgstr "" msgctxt "#30739" -msgid "" +msgid "Subscribers" msgstr "" msgctxt "#30740" @@ -1477,11 +1477,11 @@ msgid "Views count display colour" msgstr "" msgctxt "#30794" -msgid "Likes count display colour" +msgid "Subscriber/Likes count display colour" msgstr "" msgctxt "#30795" -msgid "Comments count display colour" +msgid "Videos/Comments count display colour" msgstr "" msgctxt "#30796" @@ -1579,3 +1579,7 @@ msgstr "" msgctxt "#30819" msgid "Play from start" msgstr "" + +msgctxt "#30820" +msgid "Podcast" +msgstr "" diff --git a/plugin.video.youtube/resources/language/resource.language.fa_af/strings.po b/plugin.video.youtube/resources/language/resource.language.fa_af/strings.po index cd07e9232e..86d025ade2 100644 --- a/plugin.video.youtube/resources/language/resource.language.fa_af/strings.po +++ b/plugin.video.youtube/resources/language/resource.language.fa_af/strings.po @@ -37,7 +37,7 @@ msgstr "" # msgstr "" # Kodion Settings msgctxt "#30000" -msgid "General" +msgid "" msgstr "" msgctxt "#30001" @@ -151,7 +151,7 @@ msgid "Configure %s?" msgstr "" msgctxt "#30031" -msgid "Advanced" +msgid "" msgstr "" msgctxt "#30032" @@ -217,7 +217,7 @@ msgid "Watch Later" msgstr "" msgctxt "#30108" -msgid "Remove" +msgid "" msgstr "" msgctxt "#30109" @@ -237,7 +237,7 @@ msgid "Sign Out" msgstr "" msgctxt "#30113" -msgid "Rename" +msgid "" msgstr "" msgctxt "#30114" @@ -257,7 +257,7 @@ msgid "Remove \"%s\"?" msgstr "" msgctxt "#30118" -msgid "Delete" +msgid "" msgstr "" msgctxt "#30119" @@ -301,11 +301,11 @@ msgstr "" # YouTube # empty strings from id 30206 to 30499 msgctxt "#30500" -msgid "Channels" +msgid "" msgstr "" msgctxt "#30501" -msgid "Playlists" +msgid "" msgstr "" msgctxt "#30502" @@ -361,7 +361,7 @@ msgid "Related Videos" msgstr "" msgctxt "#30515" -msgid "Auto-Remove from 'Watch Later'" +msgid "Auto-Remove from Watch Later" msgstr "" msgctxt "#30516" @@ -385,15 +385,15 @@ msgid "Add to..." msgstr "" msgctxt "#30521" -msgid "Select playlist" +msgid "" msgstr "" msgctxt "#30522" -msgid "New playlist..." +msgid "" msgstr "" msgctxt "#30523" -msgid "Language" +msgid "" msgstr "" msgctxt "#30524" @@ -425,11 +425,11 @@ msgid "I dislike this" msgstr "" msgctxt "#30531" -msgid "Play all" +msgid "" msgstr "" msgctxt "#30532" -msgid "Default" +msgid "" msgstr "" msgctxt "#30533" @@ -437,7 +437,7 @@ msgid "Reverse" msgstr "" msgctxt "#30534" -msgid "Shuffle" +msgid "" msgstr "" msgctxt "#30535" @@ -457,7 +457,7 @@ msgid "Disliked Videos" msgstr "" msgctxt "#30539" -msgid "Live" +msgid "" msgstr "" msgctxt "#30540" @@ -473,7 +473,7 @@ msgid "rtmpe streams are not supported" msgstr "" msgctxt "#30543" -msgid "Refresh" +msgid "" msgstr "" msgctxt "#30544" @@ -485,15 +485,15 @@ msgid "No further links found." msgstr "" msgctxt "#30546" -msgid "Please log in twice!" +msgid "Please complete all login prompts" msgstr "" msgctxt "#30547" -msgid "You must enable two applications so that YouTube is functioning properly." +msgid "You may be prompted to enable two applications so that YouTube is functioning properly." msgstr "" msgctxt "#30548" -msgid "More..." +msgid "" msgstr "" msgctxt "#30549" @@ -501,7 +501,7 @@ msgid "No videos streams found" msgstr "" msgctxt "#30550" -msgid "Region" +msgid "" msgstr "" msgctxt "#30551" @@ -541,15 +541,15 @@ msgid "Delete settings.xml" msgstr "" msgctxt "#30560" -msgid "Subtitle language" +msgid "" msgstr "" msgctxt "#30561" -msgid "None" +msgid "" msgstr "" msgctxt "#30562" -msgid "" +msgid "View all" msgstr "" msgctxt "#30563" @@ -565,7 +565,7 @@ msgid "" msgstr "" msgctxt "#30566" -msgid "Prompt" +msgid "" msgstr "" msgctxt "#30567" @@ -577,11 +577,11 @@ msgid "Remove as Watch Later" msgstr "" msgctxt "#30569" -msgid "Are you sure you want to remove '%s' as your Watch Later list?" +msgid "Are you sure you want to remove \"%s\" as your Watch Later list?" msgstr "" msgctxt "#30570" -msgid "Are you sure you want to replace your current Watch Later list with '%s'?" +msgid "Are you sure you want to replace your current Watch Later list with \"%s\"?" msgstr "" msgctxt "#30571" @@ -593,11 +593,11 @@ msgid "Remove as History" msgstr "" msgctxt "#30573" -msgid "Are you sure you want to remove '%s' as your History list?" +msgid "Are you sure you want to remove \"%s\" as your History list?" msgstr "" msgctxt "#30574" -msgid "Are you sure you want to replace your current History list with '%s'?" +msgid "Are you sure you want to replace your current History list with \"%s\"?" msgstr "" msgctxt "#30575" @@ -609,7 +609,7 @@ msgid "Failed" msgstr "" msgctxt "#30577" -msgid "Settings" +msgid "" msgstr "" msgctxt "#30578" @@ -633,7 +633,7 @@ msgid "Autoplay suggested videos" msgstr "" msgctxt "#30583" -msgid "Automatic" +msgid "" msgstr "" msgctxt "#30584" @@ -693,7 +693,7 @@ msgid "Updated: %s" msgstr "" msgctxt "#30598" -msgid "Personal API keys enabled" +msgid "" msgstr "" msgctxt "#30599" @@ -701,7 +701,7 @@ msgid "Failed to enable personal API keys. Missing: %s" msgstr "" msgctxt "#30600" -msgid "Subtitles" +msgid "" msgstr "" msgctxt "#30601" @@ -761,7 +761,7 @@ msgid "" msgstr "" msgctxt "#30615" -msgid "Cancel" +msgid "" msgstr "" msgctxt "#30616" @@ -777,7 +777,7 @@ msgid "" msgstr "" msgctxt "#30619" -msgid "Port" +msgid "" msgstr "" msgctxt "#30620" @@ -821,7 +821,7 @@ msgid "IP whitelist (comma delimited)" msgstr "" msgctxt "#30630" -msgid "Save" +msgid "" msgstr "" msgctxt "#30631" @@ -937,7 +937,7 @@ msgid "Enter a name for this user" msgstr "" msgctxt "#30659" -msgid "User is now '%s'" +msgid "User is now \"%s\"" msgstr "" msgctxt "#30660" @@ -961,15 +961,15 @@ msgid "Switch user" msgstr "" msgctxt "#30665" -msgid "Switch to '%s' now?" +msgid "Switch to \"%s\" now?" msgstr "" msgctxt "#30666" -msgid "%s removed" +msgid "\"%s\" removed" msgstr "" msgctxt "#30667" -msgid "Renamed '%s' to '%s'" +msgid "Renamed \"%s\" to \"%s\"" msgstr "" msgctxt "#30668" @@ -1113,7 +1113,7 @@ msgid "Play with subtitles" msgstr "" msgctxt "#30703" -msgid "Are you sure?" +msgid "" msgstr "" msgctxt "#30704" @@ -1257,7 +1257,7 @@ msgid "" msgstr "" msgctxt "#30739" -msgid "" +msgid "Subscribers" msgstr "" msgctxt "#30740" @@ -1477,11 +1477,11 @@ msgid "Views count display colour" msgstr "" msgctxt "#30794" -msgid "Likes count display colour" +msgid "Subscriber/Likes count display colour" msgstr "" msgctxt "#30795" -msgid "Comments count display colour" +msgid "Videos/Comments count display colour" msgstr "" msgctxt "#30796" @@ -1579,3 +1579,7 @@ msgstr "" msgctxt "#30819" msgid "Play from start" msgstr "" + +msgctxt "#30820" +msgid "Podcast" +msgstr "" diff --git a/plugin.video.youtube/resources/language/resource.language.fa_ir/strings.po b/plugin.video.youtube/resources/language/resource.language.fa_ir/strings.po index b82aba20e8..0d70f8fb3d 100644 --- a/plugin.video.youtube/resources/language/resource.language.fa_ir/strings.po +++ b/plugin.video.youtube/resources/language/resource.language.fa_ir/strings.po @@ -37,7 +37,7 @@ msgstr "" # msgstr "" # Kodion Settings msgctxt "#30000" -msgid "General" +msgid "" msgstr "" msgctxt "#30001" @@ -151,7 +151,7 @@ msgid "Configure %s?" msgstr "" msgctxt "#30031" -msgid "Advanced" +msgid "" msgstr "" msgctxt "#30032" @@ -217,7 +217,7 @@ msgid "Watch Later" msgstr "" msgctxt "#30108" -msgid "Remove" +msgid "" msgstr "" msgctxt "#30109" @@ -237,7 +237,7 @@ msgid "Sign Out" msgstr "" msgctxt "#30113" -msgid "Rename" +msgid "" msgstr "" msgctxt "#30114" @@ -257,7 +257,7 @@ msgid "Remove \"%s\"?" msgstr "" msgctxt "#30118" -msgid "Delete" +msgid "" msgstr "" msgctxt "#30119" @@ -301,11 +301,11 @@ msgstr "" # YouTube # empty strings from id 30206 to 30499 msgctxt "#30500" -msgid "Channels" +msgid "" msgstr "" msgctxt "#30501" -msgid "Playlists" +msgid "" msgstr "" msgctxt "#30502" @@ -361,7 +361,7 @@ msgid "Related Videos" msgstr "" msgctxt "#30515" -msgid "Auto-Remove from 'Watch Later'" +msgid "Auto-Remove from Watch Later" msgstr "" msgctxt "#30516" @@ -385,15 +385,15 @@ msgid "Add to..." msgstr "" msgctxt "#30521" -msgid "Select playlist" +msgid "" msgstr "" msgctxt "#30522" -msgid "New playlist..." +msgid "" msgstr "" msgctxt "#30523" -msgid "Language" +msgid "" msgstr "" msgctxt "#30524" @@ -425,11 +425,11 @@ msgid "I dislike this" msgstr "" msgctxt "#30531" -msgid "Play all" +msgid "" msgstr "" msgctxt "#30532" -msgid "Default" +msgid "" msgstr "" msgctxt "#30533" @@ -437,7 +437,7 @@ msgid "Reverse" msgstr "" msgctxt "#30534" -msgid "Shuffle" +msgid "" msgstr "" msgctxt "#30535" @@ -457,7 +457,7 @@ msgid "Disliked Videos" msgstr "" msgctxt "#30539" -msgid "Live" +msgid "" msgstr "" msgctxt "#30540" @@ -473,7 +473,7 @@ msgid "rtmpe streams are not supported" msgstr "" msgctxt "#30543" -msgid "Refresh" +msgid "" msgstr "" msgctxt "#30544" @@ -485,15 +485,15 @@ msgid "No further links found." msgstr "" msgctxt "#30546" -msgid "Please log in twice!" +msgid "Please complete all login prompts" msgstr "" msgctxt "#30547" -msgid "You must enable two applications so that YouTube is functioning properly." +msgid "You may be prompted to enable two applications so that YouTube is functioning properly." msgstr "" msgctxt "#30548" -msgid "More..." +msgid "" msgstr "" msgctxt "#30549" @@ -501,7 +501,7 @@ msgid "No videos streams found" msgstr "" msgctxt "#30550" -msgid "Region" +msgid "" msgstr "" msgctxt "#30551" @@ -541,15 +541,15 @@ msgid "Delete settings.xml" msgstr "" msgctxt "#30560" -msgid "Subtitle language" +msgid "" msgstr "" msgctxt "#30561" -msgid "None" +msgid "" msgstr "" msgctxt "#30562" -msgid "" +msgid "View all" msgstr "" msgctxt "#30563" @@ -565,7 +565,7 @@ msgid "" msgstr "" msgctxt "#30566" -msgid "Prompt" +msgid "" msgstr "" msgctxt "#30567" @@ -577,11 +577,11 @@ msgid "Remove as Watch Later" msgstr "" msgctxt "#30569" -msgid "Are you sure you want to remove '%s' as your Watch Later list?" +msgid "Are you sure you want to remove \"%s\" as your Watch Later list?" msgstr "" msgctxt "#30570" -msgid "Are you sure you want to replace your current Watch Later list with '%s'?" +msgid "Are you sure you want to replace your current Watch Later list with \"%s\"?" msgstr "" msgctxt "#30571" @@ -593,11 +593,11 @@ msgid "Remove as History" msgstr "" msgctxt "#30573" -msgid "Are you sure you want to remove '%s' as your History list?" +msgid "Are you sure you want to remove \"%s\" as your History list?" msgstr "" msgctxt "#30574" -msgid "Are you sure you want to replace your current History list with '%s'?" +msgid "Are you sure you want to replace your current History list with \"%s\"?" msgstr "" msgctxt "#30575" @@ -609,7 +609,7 @@ msgid "Failed" msgstr "" msgctxt "#30577" -msgid "Settings" +msgid "" msgstr "" msgctxt "#30578" @@ -633,7 +633,7 @@ msgid "Autoplay suggested videos" msgstr "" msgctxt "#30583" -msgid "Automatic" +msgid "" msgstr "" msgctxt "#30584" @@ -693,7 +693,7 @@ msgid "Updated: %s" msgstr "" msgctxt "#30598" -msgid "Personal API keys enabled" +msgid "" msgstr "" msgctxt "#30599" @@ -701,7 +701,7 @@ msgid "Failed to enable personal API keys. Missing: %s" msgstr "" msgctxt "#30600" -msgid "Subtitles" +msgid "" msgstr "" msgctxt "#30601" @@ -761,7 +761,7 @@ msgid "" msgstr "" msgctxt "#30615" -msgid "Cancel" +msgid "" msgstr "" msgctxt "#30616" @@ -777,7 +777,7 @@ msgid "" msgstr "" msgctxt "#30619" -msgid "Port" +msgid "" msgstr "" msgctxt "#30620" @@ -821,7 +821,7 @@ msgid "IP whitelist (comma delimited)" msgstr "" msgctxt "#30630" -msgid "Save" +msgid "" msgstr "" msgctxt "#30631" @@ -937,7 +937,7 @@ msgid "Enter a name for this user" msgstr "" msgctxt "#30659" -msgid "User is now '%s'" +msgid "User is now \"%s\"" msgstr "" msgctxt "#30660" @@ -961,15 +961,15 @@ msgid "Switch user" msgstr "" msgctxt "#30665" -msgid "Switch to '%s' now?" +msgid "Switch to \"%s\" now?" msgstr "" msgctxt "#30666" -msgid "%s removed" +msgid "\"%s\" removed" msgstr "" msgctxt "#30667" -msgid "Renamed '%s' to '%s'" +msgid "Renamed \"%s\" to \"%s\"" msgstr "" msgctxt "#30668" @@ -1113,7 +1113,7 @@ msgid "Play with subtitles" msgstr "" msgctxt "#30703" -msgid "Are you sure?" +msgid "" msgstr "" msgctxt "#30704" @@ -1257,7 +1257,7 @@ msgid "" msgstr "" msgctxt "#30739" -msgid "" +msgid "Subscribers" msgstr "" msgctxt "#30740" @@ -1477,11 +1477,11 @@ msgid "Views count display colour" msgstr "" msgctxt "#30794" -msgid "Likes count display colour" +msgid "Subscriber/Likes count display colour" msgstr "" msgctxt "#30795" -msgid "Comments count display colour" +msgid "Videos/Comments count display colour" msgstr "" msgctxt "#30796" @@ -1579,3 +1579,7 @@ msgstr "" msgctxt "#30819" msgid "Play from start" msgstr "" + +msgctxt "#30820" +msgid "Podcast" +msgstr "" diff --git a/plugin.video.youtube/resources/language/resource.language.fi_fi/strings.po b/plugin.video.youtube/resources/language/resource.language.fi_fi/strings.po index 12e4429431..dd933d9142 100644 --- a/plugin.video.youtube/resources/language/resource.language.fi_fi/strings.po +++ b/plugin.video.youtube/resources/language/resource.language.fi_fi/strings.po @@ -31,13 +31,14 @@ msgstr "Google ei tue tätä lisäosaa" # msgctxt "Addon Summary" # msgid "Plugin for YouTube" -# msgstr "YouTube-lisäosa" +# msgstr "" # msgctxt "Addon Description" # msgid "YouTube is a one of the biggest video-sharing websites of the world." -# msgstr "YouTube on yksi suurimmista videonjakosivustoista maailmassa." +# msgstr "" +# Kodion Settings msgctxt "#30000" -msgid "General" -msgstr "Yleistä" +msgid "" +msgstr "" msgctxt "#30001" msgid "" @@ -149,8 +150,8 @@ msgid "Configure %s?" msgstr "Määritetäänkö %s?" msgctxt "#30031" -msgid "Advanced" -msgstr "Lisäasetukset" +msgid "" +msgstr "" msgctxt "#30032" msgid "View: TV Shows" @@ -215,8 +216,8 @@ msgid "Watch Later" msgstr "Katso myöhemmin" msgctxt "#30108" -msgid "Remove" -msgstr "Poista" +msgid "" +msgstr "" msgctxt "#30109" msgid "" @@ -235,8 +236,8 @@ msgid "Sign Out" msgstr "Kirjaudu ulos" msgctxt "#30113" -msgid "Rename" -msgstr "Nimeä uudelleen" +msgid "" +msgstr "" msgctxt "#30114" msgid "Confirm delete" @@ -255,8 +256,8 @@ msgid "Remove \"%s\"?" msgstr "Poistetaanko \"%s\"?" msgctxt "#30118" -msgid "Delete" -msgstr "Poista" +msgid "" +msgstr "" msgctxt "#30119" msgid "Please wait..." @@ -296,13 +297,15 @@ msgctxt "#30205" msgid "" msgstr "" +# YouTube +# empty strings from id 30206 to 30499 msgctxt "#30500" -msgid "Channels" -msgstr "Kanavat" +msgid "" +msgstr "" msgctxt "#30501" -msgid "Playlists" -msgstr "Soittolistat" +msgid "" +msgstr "" msgctxt "#30502" msgid "Go to %s" @@ -357,8 +360,8 @@ msgid "Related Videos" msgstr "Aiheeseen liittyvät videot" msgctxt "#30515" -msgid "Auto-Remove from 'Watch Later'" -msgstr "Poista \"Katso myöhemmin\" -listalta automaattisesti" +msgid "Auto-Remove from Watch Later" +msgstr "" msgctxt "#30516" msgid "Folders" @@ -381,16 +384,16 @@ msgid "Add to..." msgstr "Lisää soittolistalle..." msgctxt "#30521" -msgid "Select playlist" -msgstr "Valitse soittolista" +msgid "" +msgstr "" msgctxt "#30522" -msgid "New playlist..." -msgstr "Uusi soittolista..." +msgid "" +msgstr "" msgctxt "#30523" -msgid "Language" -msgstr "Kieli" +msgid "" +msgstr "" msgctxt "#30524" msgid "Select language" @@ -421,20 +424,20 @@ msgid "I dislike this" msgstr "En tykkää tästä" msgctxt "#30531" -msgid "Play all" -msgstr "Toista kaikki" +msgid "" +msgstr "" msgctxt "#30532" -msgid "Default" -msgstr "Oletus" +msgid "" +msgstr "" msgctxt "#30533" msgid "Reverse" msgstr "Käänteinen" msgctxt "#30534" -msgid "Shuffle" -msgstr "Sekoitettu" +msgid "" +msgstr "" msgctxt "#30535" msgid "Select the order of the playlist" @@ -453,8 +456,8 @@ msgid "Disliked Videos" msgstr "Ei-tykätyt videot" msgctxt "#30539" -msgid "Live" -msgstr "Live" +msgid "" +msgstr "" msgctxt "#30540" msgid "Play with..." @@ -469,8 +472,8 @@ msgid "rtmpe streams are not supported" msgstr "RTMPE-suoratoistoa ei tueta" msgctxt "#30543" -msgid "Refresh" -msgstr "Päivitä" +msgid "" +msgstr "" msgctxt "#30544" msgid "More Links from the description" @@ -481,24 +484,24 @@ msgid "No further links found." msgstr "Enempää linkkejä ei löytynyt." msgctxt "#30546" -msgid "Please log in twice!" -msgstr "Kirjaudu sisään kahdesti!" +msgid "Please complete all login prompts" +msgstr "" msgctxt "#30547" -msgid "You must enable two applications so that YouTube is functioning properly." -msgstr "YouTube-lisäosan oikea toiminta edellyttää kahden sovelluksen käyttöönoton." +msgid "You may be prompted to enable two applications so that YouTube is functioning properly." +msgstr "" msgctxt "#30548" -msgid "More..." -msgstr "Lisävalinnat..." +msgid "" +msgstr "" msgctxt "#30549" msgid "No videos streams found" msgstr "Videovirtoja ei löytynyt" msgctxt "#30550" -msgid "Region" -msgstr "Alue" +msgid "" +msgstr "" msgctxt "#30551" msgid "Recommendations" @@ -537,15 +540,15 @@ msgid "Delete settings.xml" msgstr "Poista \"settings.xml\" -tiedosto" msgctxt "#30560" -msgid "Subtitle language" -msgstr "Tekstityskieli" +msgid "" +msgstr "" msgctxt "#30561" -msgid "None" -msgstr "Ei mitään" +msgid "" +msgstr "" msgctxt "#30562" -msgid "" +msgid "View all" msgstr "" msgctxt "#30563" @@ -561,8 +564,8 @@ msgid "" msgstr "" msgctxt "#30566" -msgid "Prompt" -msgstr "Kysy" +msgid "" +msgstr "" msgctxt "#30567" msgid "Set as Watch Later" @@ -573,12 +576,12 @@ msgid "Remove as Watch Later" msgstr "Poista \"Katso myöhemmin\" -määritys" msgctxt "#30569" -msgid "Are you sure you want to remove '%s' as your Watch Later list?" -msgstr "Haluatko varmasti poistaa \"%s\" -listan \"Katso myöhemmin\" -määrityksen?" +msgid "Are you sure you want to remove \"%s\" as your Watch Later list?" +msgstr "" msgctxt "#30570" -msgid "Are you sure you want to replace your current Watch Later list with '%s'?" -msgstr "Haluatko varmasti korvata nykyisen \"Katso myöhemmin\" -listan listalla \"%s\"?" +msgid "Are you sure you want to replace your current Watch Later list with \"%s\"?" +msgstr "" msgctxt "#30571" msgid "Set as History" @@ -589,12 +592,12 @@ msgid "Remove as History" msgstr "Poista \"Historia\" -määritys" msgctxt "#30573" -msgid "Are you sure you want to remove '%s' as your History list?" -msgstr "Haluatko varmasti poistaa \"%s\" -listan \"Historia\" -määrityksen?" +msgid "Are you sure you want to remove \"%s\" as your History list?" +msgstr "" msgctxt "#30574" -msgid "Are you sure you want to replace your current History list with '%s'?" -msgstr "Haluatko varmasti korvata nykyisen \"Historia\" -listan listalla \"%s\"?" +msgid "Are you sure you want to replace your current History list with \"%s\"?" +msgstr "" msgctxt "#30575" msgid "Succeeded" @@ -605,8 +608,8 @@ msgid "Failed" msgstr "Epäonnistui" msgctxt "#30577" -msgid "Settings" -msgstr "Asetukset" +msgid "" +msgstr "" msgctxt "#30578" msgid "Force SSL certificate verification" @@ -629,8 +632,8 @@ msgid "Autoplay suggested videos" msgstr "Toista ehdotetut videot automaattisesti" msgctxt "#30583" -msgid "Automatic" -msgstr "Automaattinen" +msgid "" +msgstr "" msgctxt "#30584" msgid "My Subscriptions (Filtered)" @@ -689,16 +692,16 @@ msgid "Updated: %s" msgstr "Päivitetty: %s" msgctxt "#30598" -msgid "Personal API keys enabled" -msgstr "Henkilökohtaiset API-avaimet otettiin käyttöön" +msgid "" +msgstr "" msgctxt "#30599" msgid "Failed to enable personal API keys. Missing: %s" msgstr "Henkilökohtaisten API-avainten käyttöönotto epäonnistui. Puuttuu: %s" msgctxt "#30600" -msgid "Subtitles" -msgstr "Tekstitykset" +msgid "" +msgstr "" msgctxt "#30601" msgid "%s with Original/%s fallback" @@ -757,8 +760,8 @@ msgid "" msgstr "" msgctxt "#30615" -msgid "Cancel" -msgstr "Peruuta" +msgid "" +msgstr "" msgctxt "#30616" msgid "" @@ -773,8 +776,8 @@ msgid "" msgstr "" msgctxt "#30619" -msgid "Port" -msgstr "Portti" +msgid "" +msgstr "" msgctxt "#30620" msgid "Port %s already in use. Cannot start http server." @@ -817,8 +820,8 @@ msgid "IP whitelist (comma delimited)" msgstr "Sallitut IP-osoitteet (pilkuilla eroteltuina)" msgctxt "#30630" -msgid "Save" -msgstr "Tallenna" +msgid "" +msgstr "" msgctxt "#30631" msgid "Successfully updated: %s" @@ -933,8 +936,8 @@ msgid "Enter a name for this user" msgstr "Syötä käyttäjän nimi" msgctxt "#30659" -msgid "User is now '%s'" -msgstr "Käyttäjä on nyt \"%s\"" +msgid "User is now \"%s\"" +msgstr "" msgctxt "#30660" msgid "Users" @@ -957,16 +960,16 @@ msgid "Switch user" msgstr "Vaihda käyttäjä" msgctxt "#30665" -msgid "Switch to '%s' now?" -msgstr "Vaihdetaanko käyttäjään \"%s\" nyt?" +msgid "Switch to \"%s\" now?" +msgstr "" msgctxt "#30666" -msgid "%s removed" -msgstr "%s poistettiin" +msgid "\"%s\" removed" +msgstr "" msgctxt "#30667" -msgid "Renamed '%s' to '%s'" -msgstr "Käyttäjän \"%s\" uusi nimi on \"%s\"" +msgid "Renamed \"%s\" to \"%s\"" +msgstr "" msgctxt "#30668" msgid "Play count minimum percent" @@ -1109,8 +1112,8 @@ msgid "Play with subtitles" msgstr "Toista tekstityksillä" msgctxt "#30703" -msgid "Are you sure?" -msgstr "Oletko varma?" +msgid "" +msgstr "" msgctxt "#30704" msgid "Use YouTube website urls with default player" @@ -1253,7 +1256,7 @@ msgid "" msgstr "" msgctxt "#30739" -msgid "" +msgid "Subscribers" msgstr "" msgctxt "#30740" @@ -1473,12 +1476,12 @@ msgid "Views count display colour" msgstr "Katselumäärän väri" msgctxt "#30794" -msgid "Likes count display colour" -msgstr "Tykkäysmäärän väri" +msgid "Subscriber/Likes count display colour" +msgstr "" msgctxt "#30795" -msgid "Comments count display colour" -msgstr "Kommenttimäärän väri" +msgid "Videos/Comments count display colour" +msgstr "" msgctxt "#30796" msgid "1080p/60 fps | Raspberry Pi 4, or similar" @@ -1576,6 +1579,180 @@ msgctxt "#30819" msgid "Play from start" msgstr "" +msgctxt "#30820" +msgid "Podcast" +msgstr "" + +#~ msgctxt "#30515" +#~ msgid "Auto-Remove from 'Watch Later'" +#~ msgstr "Poista \"Katso myöhemmin\" -listalta automaattisesti" + +#~ msgctxt "#30569" +#~ msgid "Are you sure you want to remove '%s' as your Watch Later list?" +#~ msgstr "Haluatko varmasti poistaa \"%s\" -listan \"Katso myöhemmin\" -määrityksen?" + +#~ msgctxt "#30570" +#~ msgid "Are you sure you want to replace your current Watch Later list with '%s'?" +#~ msgstr "Haluatko varmasti korvata nykyisen \"Katso myöhemmin\" -listan listalla \"%s\"?" + +#~ msgctxt "#30573" +#~ msgid "Are you sure you want to remove '%s' as your History list?" +#~ msgstr "Haluatko varmasti poistaa \"%s\" -listan \"Historia\" -määrityksen?" + +#~ msgctxt "#30574" +#~ msgid "Are you sure you want to replace your current History list with '%s'?" +#~ msgstr "Haluatko varmasti korvata nykyisen \"Historia\" -listan listalla \"%s\"?" + +#~ msgctxt "#30659" +#~ msgid "User is now '%s'" +#~ msgstr "Käyttäjä on nyt \"%s\"" + +#~ msgctxt "#30665" +#~ msgid "Switch to '%s' now?" +#~ msgstr "Vaihdetaanko käyttäjään \"%s\" nyt?" + +#~ msgctxt "#30666" +#~ msgid "%s removed" +#~ msgstr "%s poistettiin" + +#~ msgctxt "#30667" +#~ msgid "Renamed '%s' to '%s'" +#~ msgstr "Käyttäjän \"%s\" uusi nimi on \"%s\"" + +# msgctxt "Addon Summary" +# msgid "Plugin for YouTube" +# msgstr "YouTube-lisäosa" +# msgctxt "Addon Description" +# msgid "YouTube is a one of the biggest video-sharing websites of the world." +# msgstr "YouTube on yksi suurimmista videonjakosivustoista maailmassa." +#~ msgctxt "#30000" +#~ msgid "General" +#~ msgstr "Yleistä" + +#~ msgctxt "#30031" +#~ msgid "Advanced" +#~ msgstr "Lisäasetukset" + +#~ msgctxt "#30108" +#~ msgid "Remove" +#~ msgstr "Poista" + +#~ msgctxt "#30113" +#~ msgid "Rename" +#~ msgstr "Nimeä uudelleen" + +#~ msgctxt "#30118" +#~ msgid "Delete" +#~ msgstr "Poista" + +#~ msgctxt "#30500" +#~ msgid "Channels" +#~ msgstr "Kanavat" + +#~ msgctxt "#30501" +#~ msgid "Playlists" +#~ msgstr "Soittolistat" + +#~ msgctxt "#30521" +#~ msgid "Select playlist" +#~ msgstr "Valitse soittolista" + +#~ msgctxt "#30522" +#~ msgid "New playlist..." +#~ msgstr "Uusi soittolista..." + +#~ msgctxt "#30523" +#~ msgid "Language" +#~ msgstr "Kieli" + +#~ msgctxt "#30531" +#~ msgid "Play all" +#~ msgstr "Toista kaikki" + +#~ msgctxt "#30532" +#~ msgid "Default" +#~ msgstr "Oletus" + +#~ msgctxt "#30534" +#~ msgid "Shuffle" +#~ msgstr "Sekoitettu" + +#~ msgctxt "#30539" +#~ msgid "Live" +#~ msgstr "Live" + +#~ msgctxt "#30543" +#~ msgid "Refresh" +#~ msgstr "Päivitä" + +#~ msgctxt "#30548" +#~ msgid "More..." +#~ msgstr "Lisävalinnat..." + +#~ msgctxt "#30550" +#~ msgid "Region" +#~ msgstr "Alue" + +#~ msgctxt "#30560" +#~ msgid "Subtitle language" +#~ msgstr "Tekstityskieli" + +#~ msgctxt "#30561" +#~ msgid "None" +#~ msgstr "Ei mitään" + +#~ msgctxt "#30566" +#~ msgid "Prompt" +#~ msgstr "Kysy" + +#~ msgctxt "#30577" +#~ msgid "Settings" +#~ msgstr "Asetukset" + +#~ msgctxt "#30583" +#~ msgid "Automatic" +#~ msgstr "Automaattinen" + +#~ msgctxt "#30598" +#~ msgid "Personal API keys enabled" +#~ msgstr "Henkilökohtaiset API-avaimet otettiin käyttöön" + +#~ msgctxt "#30600" +#~ msgid "Subtitles" +#~ msgstr "Tekstitykset" + +#~ msgctxt "#30615" +#~ msgid "Cancel" +#~ msgstr "Peruuta" + +#~ msgctxt "#30619" +#~ msgid "Port" +#~ msgstr "Portti" + +#~ msgctxt "#30630" +#~ msgid "Save" +#~ msgstr "Tallenna" + +#~ msgctxt "#30703" +#~ msgid "Are you sure?" +#~ msgstr "Oletko varma?" + +#~ msgctxt "#30794" +#~ msgid "Likes count display colour" +#~ msgstr "Tykkäysmäärän väri" + +#~ msgctxt "#30795" +#~ msgid "Comments count display colour" +#~ msgstr "Kommenttimäärän väri" + +#~ msgctxt "#30546" +#~ msgid "Please log in twice!" +#~ msgstr "Kirjaudu sisään kahdesti!" + +#~ msgctxt "#30547" +#~ msgid "You must enable two applications so that YouTube is functioning properly." +#~ msgstr "YouTube-lisäosan oikea toiminta edellyttää kahden sovelluksen käyttöönoton." + #~ msgctxt "#30001" #~ msgid "Username" #~ msgstr "Käyttäjänimi" diff --git a/plugin.video.youtube/resources/language/resource.language.fo_fo/strings.po b/plugin.video.youtube/resources/language/resource.language.fo_fo/strings.po index 1ef16439b5..e5186094ff 100644 --- a/plugin.video.youtube/resources/language/resource.language.fo_fo/strings.po +++ b/plugin.video.youtube/resources/language/resource.language.fo_fo/strings.po @@ -37,7 +37,7 @@ msgstr "" # msgstr "" # Kodion Settings msgctxt "#30000" -msgid "General" +msgid "" msgstr "" msgctxt "#30001" @@ -151,7 +151,7 @@ msgid "Configure %s?" msgstr "" msgctxt "#30031" -msgid "Advanced" +msgid "" msgstr "" msgctxt "#30032" @@ -217,7 +217,7 @@ msgid "Watch Later" msgstr "" msgctxt "#30108" -msgid "Remove" +msgid "" msgstr "" msgctxt "#30109" @@ -237,7 +237,7 @@ msgid "Sign Out" msgstr "" msgctxt "#30113" -msgid "Rename" +msgid "" msgstr "" msgctxt "#30114" @@ -257,7 +257,7 @@ msgid "Remove \"%s\"?" msgstr "" msgctxt "#30118" -msgid "Delete" +msgid "" msgstr "" msgctxt "#30119" @@ -301,11 +301,11 @@ msgstr "" # YouTube # empty strings from id 30206 to 30499 msgctxt "#30500" -msgid "Channels" +msgid "" msgstr "" msgctxt "#30501" -msgid "Playlists" +msgid "" msgstr "" msgctxt "#30502" @@ -361,7 +361,7 @@ msgid "Related Videos" msgstr "" msgctxt "#30515" -msgid "Auto-Remove from 'Watch Later'" +msgid "Auto-Remove from Watch Later" msgstr "" msgctxt "#30516" @@ -385,15 +385,15 @@ msgid "Add to..." msgstr "" msgctxt "#30521" -msgid "Select playlist" +msgid "" msgstr "" msgctxt "#30522" -msgid "New playlist..." +msgid "" msgstr "" msgctxt "#30523" -msgid "Language" +msgid "" msgstr "" msgctxt "#30524" @@ -425,11 +425,11 @@ msgid "I dislike this" msgstr "" msgctxt "#30531" -msgid "Play all" +msgid "" msgstr "" msgctxt "#30532" -msgid "Default" +msgid "" msgstr "" msgctxt "#30533" @@ -437,7 +437,7 @@ msgid "Reverse" msgstr "" msgctxt "#30534" -msgid "Shuffle" +msgid "" msgstr "" msgctxt "#30535" @@ -457,7 +457,7 @@ msgid "Disliked Videos" msgstr "" msgctxt "#30539" -msgid "Live" +msgid "" msgstr "" msgctxt "#30540" @@ -473,7 +473,7 @@ msgid "rtmpe streams are not supported" msgstr "" msgctxt "#30543" -msgid "Refresh" +msgid "" msgstr "" msgctxt "#30544" @@ -485,15 +485,15 @@ msgid "No further links found." msgstr "" msgctxt "#30546" -msgid "Please log in twice!" +msgid "Please complete all login prompts" msgstr "" msgctxt "#30547" -msgid "You must enable two applications so that YouTube is functioning properly." +msgid "You may be prompted to enable two applications so that YouTube is functioning properly." msgstr "" msgctxt "#30548" -msgid "More..." +msgid "" msgstr "" msgctxt "#30549" @@ -501,7 +501,7 @@ msgid "No videos streams found" msgstr "" msgctxt "#30550" -msgid "Region" +msgid "" msgstr "" msgctxt "#30551" @@ -541,15 +541,15 @@ msgid "Delete settings.xml" msgstr "" msgctxt "#30560" -msgid "Subtitle language" +msgid "" msgstr "" msgctxt "#30561" -msgid "None" +msgid "" msgstr "" msgctxt "#30562" -msgid "" +msgid "View all" msgstr "" msgctxt "#30563" @@ -565,7 +565,7 @@ msgid "" msgstr "" msgctxt "#30566" -msgid "Prompt" +msgid "" msgstr "" msgctxt "#30567" @@ -577,11 +577,11 @@ msgid "Remove as Watch Later" msgstr "" msgctxt "#30569" -msgid "Are you sure you want to remove '%s' as your Watch Later list?" +msgid "Are you sure you want to remove \"%s\" as your Watch Later list?" msgstr "" msgctxt "#30570" -msgid "Are you sure you want to replace your current Watch Later list with '%s'?" +msgid "Are you sure you want to replace your current Watch Later list with \"%s\"?" msgstr "" msgctxt "#30571" @@ -593,11 +593,11 @@ msgid "Remove as History" msgstr "" msgctxt "#30573" -msgid "Are you sure you want to remove '%s' as your History list?" +msgid "Are you sure you want to remove \"%s\" as your History list?" msgstr "" msgctxt "#30574" -msgid "Are you sure you want to replace your current History list with '%s'?" +msgid "Are you sure you want to replace your current History list with \"%s\"?" msgstr "" msgctxt "#30575" @@ -609,7 +609,7 @@ msgid "Failed" msgstr "" msgctxt "#30577" -msgid "Settings" +msgid "" msgstr "" msgctxt "#30578" @@ -633,7 +633,7 @@ msgid "Autoplay suggested videos" msgstr "" msgctxt "#30583" -msgid "Automatic" +msgid "" msgstr "" msgctxt "#30584" @@ -693,7 +693,7 @@ msgid "Updated: %s" msgstr "" msgctxt "#30598" -msgid "Personal API keys enabled" +msgid "" msgstr "" msgctxt "#30599" @@ -701,7 +701,7 @@ msgid "Failed to enable personal API keys. Missing: %s" msgstr "" msgctxt "#30600" -msgid "Subtitles" +msgid "" msgstr "" msgctxt "#30601" @@ -761,7 +761,7 @@ msgid "" msgstr "" msgctxt "#30615" -msgid "Cancel" +msgid "" msgstr "" msgctxt "#30616" @@ -777,7 +777,7 @@ msgid "" msgstr "" msgctxt "#30619" -msgid "Port" +msgid "" msgstr "" msgctxt "#30620" @@ -821,7 +821,7 @@ msgid "IP whitelist (comma delimited)" msgstr "" msgctxt "#30630" -msgid "Save" +msgid "" msgstr "" msgctxt "#30631" @@ -937,7 +937,7 @@ msgid "Enter a name for this user" msgstr "" msgctxt "#30659" -msgid "User is now '%s'" +msgid "User is now \"%s\"" msgstr "" msgctxt "#30660" @@ -961,15 +961,15 @@ msgid "Switch user" msgstr "" msgctxt "#30665" -msgid "Switch to '%s' now?" +msgid "Switch to \"%s\" now?" msgstr "" msgctxt "#30666" -msgid "%s removed" +msgid "\"%s\" removed" msgstr "" msgctxt "#30667" -msgid "Renamed '%s' to '%s'" +msgid "Renamed \"%s\" to \"%s\"" msgstr "" msgctxt "#30668" @@ -1113,7 +1113,7 @@ msgid "Play with subtitles" msgstr "" msgctxt "#30703" -msgid "Are you sure?" +msgid "" msgstr "" msgctxt "#30704" @@ -1257,7 +1257,7 @@ msgid "" msgstr "" msgctxt "#30739" -msgid "" +msgid "Subscribers" msgstr "" msgctxt "#30740" @@ -1477,11 +1477,11 @@ msgid "Views count display colour" msgstr "" msgctxt "#30794" -msgid "Likes count display colour" +msgid "Subscriber/Likes count display colour" msgstr "" msgctxt "#30795" -msgid "Comments count display colour" +msgid "Videos/Comments count display colour" msgstr "" msgctxt "#30796" @@ -1579,3 +1579,7 @@ msgstr "" msgctxt "#30819" msgid "Play from start" msgstr "" + +msgctxt "#30820" +msgid "Podcast" +msgstr "" diff --git a/plugin.video.youtube/resources/language/resource.language.fr_ca/strings.po b/plugin.video.youtube/resources/language/resource.language.fr_ca/strings.po index 392f5dcdfd..11c7484332 100644 --- a/plugin.video.youtube/resources/language/resource.language.fr_ca/strings.po +++ b/plugin.video.youtube/resources/language/resource.language.fr_ca/strings.po @@ -37,7 +37,7 @@ msgstr "" # msgstr "" # Kodion Settings msgctxt "#30000" -msgid "General" +msgid "" msgstr "" msgctxt "#30001" @@ -151,7 +151,7 @@ msgid "Configure %s?" msgstr "" msgctxt "#30031" -msgid "Advanced" +msgid "" msgstr "" msgctxt "#30032" @@ -217,7 +217,7 @@ msgid "Watch Later" msgstr "" msgctxt "#30108" -msgid "Remove" +msgid "" msgstr "" msgctxt "#30109" @@ -237,7 +237,7 @@ msgid "Sign Out" msgstr "" msgctxt "#30113" -msgid "Rename" +msgid "" msgstr "" msgctxt "#30114" @@ -257,7 +257,7 @@ msgid "Remove \"%s\"?" msgstr "" msgctxt "#30118" -msgid "Delete" +msgid "" msgstr "" msgctxt "#30119" @@ -301,11 +301,11 @@ msgstr "" # YouTube # empty strings from id 30206 to 30499 msgctxt "#30500" -msgid "Channels" +msgid "" msgstr "" msgctxt "#30501" -msgid "Playlists" +msgid "" msgstr "" msgctxt "#30502" @@ -361,7 +361,7 @@ msgid "Related Videos" msgstr "" msgctxt "#30515" -msgid "Auto-Remove from 'Watch Later'" +msgid "Auto-Remove from Watch Later" msgstr "" msgctxt "#30516" @@ -385,15 +385,15 @@ msgid "Add to..." msgstr "" msgctxt "#30521" -msgid "Select playlist" +msgid "" msgstr "" msgctxt "#30522" -msgid "New playlist..." +msgid "" msgstr "" msgctxt "#30523" -msgid "Language" +msgid "" msgstr "" msgctxt "#30524" @@ -425,11 +425,11 @@ msgid "I dislike this" msgstr "" msgctxt "#30531" -msgid "Play all" +msgid "" msgstr "" msgctxt "#30532" -msgid "Default" +msgid "" msgstr "" msgctxt "#30533" @@ -437,7 +437,7 @@ msgid "Reverse" msgstr "" msgctxt "#30534" -msgid "Shuffle" +msgid "" msgstr "" msgctxt "#30535" @@ -457,7 +457,7 @@ msgid "Disliked Videos" msgstr "" msgctxt "#30539" -msgid "Live" +msgid "" msgstr "" msgctxt "#30540" @@ -473,7 +473,7 @@ msgid "rtmpe streams are not supported" msgstr "" msgctxt "#30543" -msgid "Refresh" +msgid "" msgstr "" msgctxt "#30544" @@ -485,15 +485,15 @@ msgid "No further links found." msgstr "" msgctxt "#30546" -msgid "Please log in twice!" +msgid "Please complete all login prompts" msgstr "" msgctxt "#30547" -msgid "You must enable two applications so that YouTube is functioning properly." +msgid "You may be prompted to enable two applications so that YouTube is functioning properly." msgstr "" msgctxt "#30548" -msgid "More..." +msgid "" msgstr "" msgctxt "#30549" @@ -501,7 +501,7 @@ msgid "No videos streams found" msgstr "" msgctxt "#30550" -msgid "Region" +msgid "" msgstr "" msgctxt "#30551" @@ -541,15 +541,15 @@ msgid "Delete settings.xml" msgstr "" msgctxt "#30560" -msgid "Subtitle language" +msgid "" msgstr "" msgctxt "#30561" -msgid "None" +msgid "" msgstr "" msgctxt "#30562" -msgid "" +msgid "View all" msgstr "" msgctxt "#30563" @@ -565,7 +565,7 @@ msgid "" msgstr "" msgctxt "#30566" -msgid "Prompt" +msgid "" msgstr "" msgctxt "#30567" @@ -577,11 +577,11 @@ msgid "Remove as Watch Later" msgstr "" msgctxt "#30569" -msgid "Are you sure you want to remove '%s' as your Watch Later list?" +msgid "Are you sure you want to remove \"%s\" as your Watch Later list?" msgstr "" msgctxt "#30570" -msgid "Are you sure you want to replace your current Watch Later list with '%s'?" +msgid "Are you sure you want to replace your current Watch Later list with \"%s\"?" msgstr "" msgctxt "#30571" @@ -593,11 +593,11 @@ msgid "Remove as History" msgstr "" msgctxt "#30573" -msgid "Are you sure you want to remove '%s' as your History list?" +msgid "Are you sure you want to remove \"%s\" as your History list?" msgstr "" msgctxt "#30574" -msgid "Are you sure you want to replace your current History list with '%s'?" +msgid "Are you sure you want to replace your current History list with \"%s\"?" msgstr "" msgctxt "#30575" @@ -609,7 +609,7 @@ msgid "Failed" msgstr "" msgctxt "#30577" -msgid "Settings" +msgid "" msgstr "" msgctxt "#30578" @@ -633,7 +633,7 @@ msgid "Autoplay suggested videos" msgstr "" msgctxt "#30583" -msgid "Automatic" +msgid "" msgstr "" msgctxt "#30584" @@ -693,7 +693,7 @@ msgid "Updated: %s" msgstr "" msgctxt "#30598" -msgid "Personal API keys enabled" +msgid "" msgstr "" msgctxt "#30599" @@ -701,7 +701,7 @@ msgid "Failed to enable personal API keys. Missing: %s" msgstr "" msgctxt "#30600" -msgid "Subtitles" +msgid "" msgstr "" msgctxt "#30601" @@ -761,7 +761,7 @@ msgid "" msgstr "" msgctxt "#30615" -msgid "Cancel" +msgid "" msgstr "" msgctxt "#30616" @@ -777,7 +777,7 @@ msgid "" msgstr "" msgctxt "#30619" -msgid "Port" +msgid "" msgstr "" msgctxt "#30620" @@ -821,7 +821,7 @@ msgid "IP whitelist (comma delimited)" msgstr "" msgctxt "#30630" -msgid "Save" +msgid "" msgstr "" msgctxt "#30631" @@ -937,7 +937,7 @@ msgid "Enter a name for this user" msgstr "" msgctxt "#30659" -msgid "User is now '%s'" +msgid "User is now \"%s\"" msgstr "" msgctxt "#30660" @@ -961,15 +961,15 @@ msgid "Switch user" msgstr "" msgctxt "#30665" -msgid "Switch to '%s' now?" +msgid "Switch to \"%s\" now?" msgstr "" msgctxt "#30666" -msgid "%s removed" +msgid "\"%s\" removed" msgstr "" msgctxt "#30667" -msgid "Renamed '%s' to '%s'" +msgid "Renamed \"%s\" to \"%s\"" msgstr "" msgctxt "#30668" @@ -1113,7 +1113,7 @@ msgid "Play with subtitles" msgstr "" msgctxt "#30703" -msgid "Are you sure?" +msgid "" msgstr "" msgctxt "#30704" @@ -1257,7 +1257,7 @@ msgid "" msgstr "" msgctxt "#30739" -msgid "" +msgid "Subscribers" msgstr "" msgctxt "#30740" @@ -1477,11 +1477,11 @@ msgid "Views count display colour" msgstr "" msgctxt "#30794" -msgid "Likes count display colour" +msgid "Subscriber/Likes count display colour" msgstr "" msgctxt "#30795" -msgid "Comments count display colour" +msgid "Videos/Comments count display colour" msgstr "" msgctxt "#30796" @@ -1579,3 +1579,7 @@ msgstr "" msgctxt "#30819" msgid "Play from start" msgstr "" + +msgctxt "#30820" +msgid "Podcast" +msgstr "" diff --git a/plugin.video.youtube/resources/language/resource.language.fr_fr/strings.po b/plugin.video.youtube/resources/language/resource.language.fr_fr/strings.po index 82552f4434..167f0df043 100644 --- a/plugin.video.youtube/resources/language/resource.language.fr_fr/strings.po +++ b/plugin.video.youtube/resources/language/resource.language.fr_fr/strings.po @@ -31,13 +31,14 @@ msgstr "Ce module n'est pas validé par Google" # msgctxt "Addon Summary" # msgid "Plugin for YouTube" -# msgstr "Plugin pour YouTube" +# msgstr "" # msgctxt "Addon Description" # msgid "YouTube is a one of the biggest video-sharing websites of the world." -# msgstr "YouTube est l'un des plus grands sites de partage de vidéos du monde." +# msgstr "" +# Kodion Settings msgctxt "#30000" -msgid "General" -msgstr "Général" +msgid "" +msgstr "" msgctxt "#30001" msgid "" @@ -149,8 +150,8 @@ msgid "Configure %s?" msgstr "Configurer %s ?" msgctxt "#30031" -msgid "Advanced" -msgstr "Avancé" +msgid "" +msgstr "" msgctxt "#30032" msgid "View: TV Shows" @@ -215,8 +216,8 @@ msgid "Watch Later" msgstr "Regarder plus tard" msgctxt "#30108" -msgid "Remove" -msgstr "Supprimer" +msgid "" +msgstr "" msgctxt "#30109" msgid "" @@ -235,8 +236,8 @@ msgid "Sign Out" msgstr "Déconnexion" msgctxt "#30113" -msgid "Rename" -msgstr "Renommer" +msgid "" +msgstr "" msgctxt "#30114" msgid "Confirm delete" @@ -255,8 +256,8 @@ msgid "Remove \"%s\"?" msgstr "Supprimer \"%s\" ?" msgctxt "#30118" -msgid "Delete" -msgstr "Supprimer" +msgid "" +msgstr "" msgctxt "#30119" msgid "Please wait..." @@ -296,13 +297,15 @@ msgctxt "#30205" msgid "" msgstr "" +# YouTube +# empty strings from id 30206 to 30499 msgctxt "#30500" -msgid "Channels" -msgstr "Chaînes" +msgid "" +msgstr "" msgctxt "#30501" -msgid "Playlists" -msgstr "Listes de lecture" +msgid "" +msgstr "" msgctxt "#30502" msgid "Go to %s" @@ -357,8 +360,8 @@ msgid "Related Videos" msgstr "Vidéos similaires" msgctxt "#30515" -msgid "Auto-Remove from 'Watch Later'" -msgstr "Auto suppression de 'Regarder plus tard'" +msgid "Auto-Remove from Watch Later" +msgstr "" msgctxt "#30516" msgid "Folders" @@ -381,16 +384,16 @@ msgid "Add to..." msgstr "Ajouter à..." msgctxt "#30521" -msgid "Select playlist" -msgstr "Sélectionner la liste de lecture" +msgid "" +msgstr "" msgctxt "#30522" -msgid "New playlist..." -msgstr "Nouvelle liste de lecture…" +msgid "" +msgstr "" msgctxt "#30523" -msgid "Language" -msgstr "Langue" +msgid "" +msgstr "" msgctxt "#30524" msgid "Select language" @@ -421,20 +424,20 @@ msgid "I dislike this" msgstr "Je n'aime pas" msgctxt "#30531" -msgid "Play all" -msgstr "Tout lire" +msgid "" +msgstr "" msgctxt "#30532" -msgid "Default" -msgstr "Défaut" +msgid "" +msgstr "" msgctxt "#30533" msgid "Reverse" msgstr "Inverser" msgctxt "#30534" -msgid "Shuffle" -msgstr "Aléatoire" +msgid "" +msgstr "" msgctxt "#30535" msgid "Select the order of the playlist" @@ -453,8 +456,8 @@ msgid "Disliked Videos" msgstr "Vidéos que vous n'aimez pas" msgctxt "#30539" -msgid "Live" -msgstr "En direct" +msgid "" +msgstr "" msgctxt "#30540" msgid "Play with..." @@ -469,8 +472,8 @@ msgid "rtmpe streams are not supported" msgstr "le streaming rtmpe n'est pas supporté" msgctxt "#30543" -msgid "Refresh" -msgstr "Actualiser" +msgid "" +msgstr "" msgctxt "#30544" msgid "More Links from the description" @@ -481,24 +484,24 @@ msgid "No further links found." msgstr "Aucun autre lien trouvé." msgctxt "#30546" -msgid "Please log in twice!" -msgstr "Veuillez vous connecter en deux fois !" +msgid "Please complete all login prompts" +msgstr "" msgctxt "#30547" -msgid "You must enable two applications so that YouTube is functioning properly." -msgstr "Vous devez activer les deux applications pour que YouTube fonctionne correctement." +msgid "You may be prompted to enable two applications so that YouTube is functioning properly." +msgstr "" msgctxt "#30548" -msgid "More..." -msgstr "Plus…" +msgid "" +msgstr "" msgctxt "#30549" msgid "No videos streams found" msgstr "Aucun flux vidéos trouvé" msgctxt "#30550" -msgid "Region" -msgstr "Région" +msgid "" +msgstr "" msgctxt "#30551" msgid "Recommendations" @@ -537,15 +540,15 @@ msgid "Delete settings.xml" msgstr "Supprimer settings.xml" msgctxt "#30560" -msgid "Subtitle language" -msgstr "Sous-titre langue" +msgid "" +msgstr "" msgctxt "#30561" -msgid "None" -msgstr "Aucun" +msgid "" +msgstr "" msgctxt "#30562" -msgid "" +msgid "View all" msgstr "" msgctxt "#30563" @@ -561,8 +564,8 @@ msgid "" msgstr "" msgctxt "#30566" -msgid "Prompt" -msgstr "Sélection langue" +msgid "" +msgstr "" msgctxt "#30567" msgid "Set as Watch Later" @@ -573,12 +576,12 @@ msgid "Remove as Watch Later" msgstr "Supprimer 'Regarder plus tard'" msgctxt "#30569" -msgid "Are you sure you want to remove '%s' as your Watch Later list?" -msgstr "Êtes-vous sûr de vouloir supprimer '%s' comme liste 'Regarder plus tard' ?" +msgid "Are you sure you want to remove \"%s\" as your Watch Later list?" +msgstr "" msgctxt "#30570" -msgid "Are you sure you want to replace your current Watch Later list with '%s'?" -msgstr "Êtes-vous sûr de vouloir remplacer votre liste 'Regarder plus tard' avec \"%s\" ?" +msgid "Are you sure you want to replace your current Watch Later list with \"%s\"?" +msgstr "" msgctxt "#30571" msgid "Set as History" @@ -589,12 +592,12 @@ msgid "Remove as History" msgstr "Supprimer l'historique" msgctxt "#30573" -msgid "Are you sure you want to remove '%s' as your History list?" -msgstr "Êtes-vous sûr de vouloir supprimer l'historique '%s' de votre liste ?" +msgid "Are you sure you want to remove \"%s\" as your History list?" +msgstr "" msgctxt "#30574" -msgid "Are you sure you want to replace your current History list with '%s'?" -msgstr "Êtes-vous sûr que vous voulez remplacer votre liste historique avec '%s' ?" +msgid "Are you sure you want to replace your current History list with \"%s\"?" +msgstr "" msgctxt "#30575" msgid "Succeeded" @@ -605,8 +608,8 @@ msgid "Failed" msgstr "Échoué" msgctxt "#30577" -msgid "Settings" -msgstr "Paramètres" +msgid "" +msgstr "" msgctxt "#30578" msgid "Force SSL certificate verification" @@ -629,8 +632,8 @@ msgid "Autoplay suggested videos" msgstr "Jouer automatiquement les vidéos suggérées" msgctxt "#30583" -msgid "Automatic" -msgstr "Automatique" +msgid "" +msgstr "" msgctxt "#30584" msgid "My Subscriptions (Filtered)" @@ -689,16 +692,16 @@ msgid "Updated: %s" msgstr "Actualisé: %s" msgctxt "#30598" -msgid "Personal API keys enabled" -msgstr "Clés API personnelles activées" +msgid "" +msgstr "" msgctxt "#30599" msgid "Failed to enable personal API keys. Missing: %s" msgstr "Impossible d'activer les clés API personnelles. Disparu : %s" msgctxt "#30600" -msgid "Subtitles" -msgstr "Sous-titres" +msgid "" +msgstr "" msgctxt "#30601" msgid "%s with Original/%s fallback" @@ -757,8 +760,8 @@ msgid "" msgstr "" msgctxt "#30615" -msgid "Cancel" -msgstr "Annuler" +msgid "" +msgstr "" msgctxt "#30616" msgid "" @@ -773,8 +776,8 @@ msgid "" msgstr "" msgctxt "#30619" -msgid "Port" -msgstr "Port" +msgid "" +msgstr "" msgctxt "#30620" msgid "Port %s already in use. Cannot start http server." @@ -817,8 +820,8 @@ msgid "IP whitelist (comma delimited)" msgstr "Liste IP blanche (délimitée par des virgules)" msgctxt "#30630" -msgid "Save" -msgstr "Sauvegarder" +msgid "" +msgstr "" msgctxt "#30631" msgid "Successfully updated: %s" @@ -933,8 +936,8 @@ msgid "Enter a name for this user" msgstr "Entrer un nom pour cet utilisateur" msgctxt "#30659" -msgid "User is now '%s'" -msgstr "L'Utilisateur courant est maintenant '%s'" +msgid "User is now \"%s\"" +msgstr "" msgctxt "#30660" msgid "Users" @@ -957,16 +960,16 @@ msgid "Switch user" msgstr "Changer d'utilisateur" msgctxt "#30665" -msgid "Switch to '%s' now?" -msgstr "Changer pour '%s' maintenant ?" +msgid "Switch to \"%s\" now?" +msgstr "" msgctxt "#30666" -msgid "%s removed" +msgid "\"%s\" removed" msgstr "" msgctxt "#30667" -msgid "Renamed '%s' to '%s'" -msgstr "'%s' renommer en '%s'" +msgid "Renamed \"%s\" to \"%s\"" +msgstr "" msgctxt "#30668" msgid "Play count minimum percent" @@ -1109,8 +1112,8 @@ msgid "Play with subtitles" msgstr "Lire avec les sous-titres" msgctxt "#30703" -msgid "Are you sure?" -msgstr "Êtes-vous sûr ?" +msgid "" +msgstr "" msgctxt "#30704" msgid "Use YouTube website urls with default player" @@ -1253,7 +1256,7 @@ msgid "" msgstr "" msgctxt "#30739" -msgid "" +msgid "Subscribers" msgstr "" msgctxt "#30740" @@ -1473,11 +1476,11 @@ msgid "Views count display colour" msgstr "" msgctxt "#30794" -msgid "Likes count display colour" +msgid "Subscriber/Likes count display colour" msgstr "" msgctxt "#30795" -msgid "Comments count display colour" +msgid "Videos/Comments count display colour" msgstr "" msgctxt "#30796" @@ -1576,6 +1579,168 @@ msgctxt "#30819" msgid "Play from start" msgstr "" +msgctxt "#30820" +msgid "Podcast" +msgstr "" + +#~ msgctxt "#30515" +#~ msgid "Auto-Remove from 'Watch Later'" +#~ msgstr "Auto suppression de 'Regarder plus tard'" + +#~ msgctxt "#30569" +#~ msgid "Are you sure you want to remove '%s' as your Watch Later list?" +#~ msgstr "Êtes-vous sûr de vouloir supprimer '%s' comme liste 'Regarder plus tard' ?" + +#~ msgctxt "#30570" +#~ msgid "Are you sure you want to replace your current Watch Later list with '%s'?" +#~ msgstr "Êtes-vous sûr de vouloir remplacer votre liste 'Regarder plus tard' avec \"%s\" ?" + +#~ msgctxt "#30573" +#~ msgid "Are you sure you want to remove '%s' as your History list?" +#~ msgstr "Êtes-vous sûr de vouloir supprimer l'historique '%s' de votre liste ?" + +#~ msgctxt "#30574" +#~ msgid "Are you sure you want to replace your current History list with '%s'?" +#~ msgstr "Êtes-vous sûr que vous voulez remplacer votre liste historique avec '%s' ?" + +#~ msgctxt "#30659" +#~ msgid "User is now '%s'" +#~ msgstr "L'Utilisateur courant est maintenant '%s'" + +#~ msgctxt "#30665" +#~ msgid "Switch to '%s' now?" +#~ msgstr "Changer pour '%s' maintenant ?" + +#~ msgctxt "#30667" +#~ msgid "Renamed '%s' to '%s'" +#~ msgstr "'%s' renommer en '%s'" + +# msgctxt "Addon Summary" +# msgid "Plugin for YouTube" +# msgstr "Plugin pour YouTube" +# msgctxt "Addon Description" +# msgid "YouTube is a one of the biggest video-sharing websites of the world." +# msgstr "YouTube est l'un des plus grands sites de partage de vidéos du monde." +#~ msgctxt "#30000" +#~ msgid "General" +#~ msgstr "Général" + +#~ msgctxt "#30031" +#~ msgid "Advanced" +#~ msgstr "Avancé" + +#~ msgctxt "#30108" +#~ msgid "Remove" +#~ msgstr "Supprimer" + +#~ msgctxt "#30113" +#~ msgid "Rename" +#~ msgstr "Renommer" + +#~ msgctxt "#30118" +#~ msgid "Delete" +#~ msgstr "Supprimer" + +#~ msgctxt "#30500" +#~ msgid "Channels" +#~ msgstr "Chaînes" + +#~ msgctxt "#30501" +#~ msgid "Playlists" +#~ msgstr "Listes de lecture" + +#~ msgctxt "#30521" +#~ msgid "Select playlist" +#~ msgstr "Sélectionner la liste de lecture" + +#~ msgctxt "#30522" +#~ msgid "New playlist..." +#~ msgstr "Nouvelle liste de lecture…" + +#~ msgctxt "#30523" +#~ msgid "Language" +#~ msgstr "Langue" + +#~ msgctxt "#30531" +#~ msgid "Play all" +#~ msgstr "Tout lire" + +#~ msgctxt "#30532" +#~ msgid "Default" +#~ msgstr "Défaut" + +#~ msgctxt "#30534" +#~ msgid "Shuffle" +#~ msgstr "Aléatoire" + +#~ msgctxt "#30539" +#~ msgid "Live" +#~ msgstr "En direct" + +#~ msgctxt "#30543" +#~ msgid "Refresh" +#~ msgstr "Actualiser" + +#~ msgctxt "#30548" +#~ msgid "More..." +#~ msgstr "Plus…" + +#~ msgctxt "#30550" +#~ msgid "Region" +#~ msgstr "Région" + +#~ msgctxt "#30560" +#~ msgid "Subtitle language" +#~ msgstr "Sous-titre langue" + +#~ msgctxt "#30561" +#~ msgid "None" +#~ msgstr "Aucun" + +#~ msgctxt "#30566" +#~ msgid "Prompt" +#~ msgstr "Sélection langue" + +#~ msgctxt "#30577" +#~ msgid "Settings" +#~ msgstr "Paramètres" + +#~ msgctxt "#30583" +#~ msgid "Automatic" +#~ msgstr "Automatique" + +#~ msgctxt "#30598" +#~ msgid "Personal API keys enabled" +#~ msgstr "Clés API personnelles activées" + +#~ msgctxt "#30600" +#~ msgid "Subtitles" +#~ msgstr "Sous-titres" + +#~ msgctxt "#30615" +#~ msgid "Cancel" +#~ msgstr "Annuler" + +#~ msgctxt "#30619" +#~ msgid "Port" +#~ msgstr "Port" + +#~ msgctxt "#30630" +#~ msgid "Save" +#~ msgstr "Sauvegarder" + +#~ msgctxt "#30703" +#~ msgid "Are you sure?" +#~ msgstr "Êtes-vous sûr ?" + +#~ msgctxt "#30546" +#~ msgid "Please log in twice!" +#~ msgstr "Veuillez vous connecter en deux fois !" + +#~ msgctxt "#30547" +#~ msgid "You must enable two applications so that YouTube is functioning properly." +#~ msgstr "Vous devez activer les deux applications pour que YouTube fonctionne correctement." + #~ msgctxt "#30001" #~ msgid "Username" #~ msgstr "Identifiant" diff --git a/plugin.video.youtube/resources/language/resource.language.gl_es/strings.po b/plugin.video.youtube/resources/language/resource.language.gl_es/strings.po index 47dfcac844..e37505d45f 100644 --- a/plugin.video.youtube/resources/language/resource.language.gl_es/strings.po +++ b/plugin.video.youtube/resources/language/resource.language.gl_es/strings.po @@ -37,7 +37,7 @@ msgstr "" # msgstr "" # Kodion Settings msgctxt "#30000" -msgid "General" +msgid "" msgstr "" msgctxt "#30001" @@ -151,7 +151,7 @@ msgid "Configure %s?" msgstr "" msgctxt "#30031" -msgid "Advanced" +msgid "" msgstr "" msgctxt "#30032" @@ -217,7 +217,7 @@ msgid "Watch Later" msgstr "" msgctxt "#30108" -msgid "Remove" +msgid "" msgstr "" msgctxt "#30109" @@ -237,7 +237,7 @@ msgid "Sign Out" msgstr "" msgctxt "#30113" -msgid "Rename" +msgid "" msgstr "" msgctxt "#30114" @@ -257,7 +257,7 @@ msgid "Remove \"%s\"?" msgstr "" msgctxt "#30118" -msgid "Delete" +msgid "" msgstr "" msgctxt "#30119" @@ -301,11 +301,11 @@ msgstr "" # YouTube # empty strings from id 30206 to 30499 msgctxt "#30500" -msgid "Channels" +msgid "" msgstr "" msgctxt "#30501" -msgid "Playlists" +msgid "" msgstr "" msgctxt "#30502" @@ -361,7 +361,7 @@ msgid "Related Videos" msgstr "" msgctxt "#30515" -msgid "Auto-Remove from 'Watch Later'" +msgid "Auto-Remove from Watch Later" msgstr "" msgctxt "#30516" @@ -385,15 +385,15 @@ msgid "Add to..." msgstr "" msgctxt "#30521" -msgid "Select playlist" +msgid "" msgstr "" msgctxt "#30522" -msgid "New playlist..." +msgid "" msgstr "" msgctxt "#30523" -msgid "Language" +msgid "" msgstr "" msgctxt "#30524" @@ -425,11 +425,11 @@ msgid "I dislike this" msgstr "" msgctxt "#30531" -msgid "Play all" +msgid "" msgstr "" msgctxt "#30532" -msgid "Default" +msgid "" msgstr "" msgctxt "#30533" @@ -437,7 +437,7 @@ msgid "Reverse" msgstr "" msgctxt "#30534" -msgid "Shuffle" +msgid "" msgstr "" msgctxt "#30535" @@ -457,7 +457,7 @@ msgid "Disliked Videos" msgstr "" msgctxt "#30539" -msgid "Live" +msgid "" msgstr "" msgctxt "#30540" @@ -473,7 +473,7 @@ msgid "rtmpe streams are not supported" msgstr "" msgctxt "#30543" -msgid "Refresh" +msgid "" msgstr "" msgctxt "#30544" @@ -485,15 +485,15 @@ msgid "No further links found." msgstr "" msgctxt "#30546" -msgid "Please log in twice!" +msgid "Please complete all login prompts" msgstr "" msgctxt "#30547" -msgid "You must enable two applications so that YouTube is functioning properly." +msgid "You may be prompted to enable two applications so that YouTube is functioning properly." msgstr "" msgctxt "#30548" -msgid "More..." +msgid "" msgstr "" msgctxt "#30549" @@ -501,7 +501,7 @@ msgid "No videos streams found" msgstr "" msgctxt "#30550" -msgid "Region" +msgid "" msgstr "" msgctxt "#30551" @@ -541,15 +541,15 @@ msgid "Delete settings.xml" msgstr "" msgctxt "#30560" -msgid "Subtitle language" +msgid "" msgstr "" msgctxt "#30561" -msgid "None" +msgid "" msgstr "" msgctxt "#30562" -msgid "" +msgid "View all" msgstr "" msgctxt "#30563" @@ -565,7 +565,7 @@ msgid "" msgstr "" msgctxt "#30566" -msgid "Prompt" +msgid "" msgstr "" msgctxt "#30567" @@ -577,11 +577,11 @@ msgid "Remove as Watch Later" msgstr "" msgctxt "#30569" -msgid "Are you sure you want to remove '%s' as your Watch Later list?" +msgid "Are you sure you want to remove \"%s\" as your Watch Later list?" msgstr "" msgctxt "#30570" -msgid "Are you sure you want to replace your current Watch Later list with '%s'?" +msgid "Are you sure you want to replace your current Watch Later list with \"%s\"?" msgstr "" msgctxt "#30571" @@ -593,11 +593,11 @@ msgid "Remove as History" msgstr "" msgctxt "#30573" -msgid "Are you sure you want to remove '%s' as your History list?" +msgid "Are you sure you want to remove \"%s\" as your History list?" msgstr "" msgctxt "#30574" -msgid "Are you sure you want to replace your current History list with '%s'?" +msgid "Are you sure you want to replace your current History list with \"%s\"?" msgstr "" msgctxt "#30575" @@ -609,7 +609,7 @@ msgid "Failed" msgstr "" msgctxt "#30577" -msgid "Settings" +msgid "" msgstr "" msgctxt "#30578" @@ -633,7 +633,7 @@ msgid "Autoplay suggested videos" msgstr "" msgctxt "#30583" -msgid "Automatic" +msgid "" msgstr "" msgctxt "#30584" @@ -693,7 +693,7 @@ msgid "Updated: %s" msgstr "" msgctxt "#30598" -msgid "Personal API keys enabled" +msgid "" msgstr "" msgctxt "#30599" @@ -701,7 +701,7 @@ msgid "Failed to enable personal API keys. Missing: %s" msgstr "" msgctxt "#30600" -msgid "Subtitles" +msgid "" msgstr "" msgctxt "#30601" @@ -761,7 +761,7 @@ msgid "" msgstr "" msgctxt "#30615" -msgid "Cancel" +msgid "" msgstr "" msgctxt "#30616" @@ -777,7 +777,7 @@ msgid "" msgstr "" msgctxt "#30619" -msgid "Port" +msgid "" msgstr "" msgctxt "#30620" @@ -821,7 +821,7 @@ msgid "IP whitelist (comma delimited)" msgstr "" msgctxt "#30630" -msgid "Save" +msgid "" msgstr "" msgctxt "#30631" @@ -937,7 +937,7 @@ msgid "Enter a name for this user" msgstr "" msgctxt "#30659" -msgid "User is now '%s'" +msgid "User is now \"%s\"" msgstr "" msgctxt "#30660" @@ -961,15 +961,15 @@ msgid "Switch user" msgstr "" msgctxt "#30665" -msgid "Switch to '%s' now?" +msgid "Switch to \"%s\" now?" msgstr "" msgctxt "#30666" -msgid "%s removed" +msgid "\"%s\" removed" msgstr "" msgctxt "#30667" -msgid "Renamed '%s' to '%s'" +msgid "Renamed \"%s\" to \"%s\"" msgstr "" msgctxt "#30668" @@ -1113,7 +1113,7 @@ msgid "Play with subtitles" msgstr "" msgctxt "#30703" -msgid "Are you sure?" +msgid "" msgstr "" msgctxt "#30704" @@ -1257,7 +1257,7 @@ msgid "" msgstr "" msgctxt "#30739" -msgid "" +msgid "Subscribers" msgstr "" msgctxt "#30740" @@ -1477,11 +1477,11 @@ msgid "Views count display colour" msgstr "" msgctxt "#30794" -msgid "Likes count display colour" +msgid "Subscriber/Likes count display colour" msgstr "" msgctxt "#30795" -msgid "Comments count display colour" +msgid "Videos/Comments count display colour" msgstr "" msgctxt "#30796" @@ -1579,3 +1579,7 @@ msgstr "" msgctxt "#30819" msgid "Play from start" msgstr "" + +msgctxt "#30820" +msgid "Podcast" +msgstr "" diff --git a/plugin.video.youtube/resources/language/resource.language.he_il/strings.po b/plugin.video.youtube/resources/language/resource.language.he_il/strings.po index f401112a9b..74e084c97a 100644 --- a/plugin.video.youtube/resources/language/resource.language.he_il/strings.po +++ b/plugin.video.youtube/resources/language/resource.language.he_il/strings.po @@ -31,14 +31,14 @@ msgstr "" # msgctxt "Addon Summary" # msgid "Plugin for YouTube" -# msgstr "תוסף עבור-YouTube" +# msgstr "" # msgctxt "Addon Description" # msgid "YouTube is a one of the biggest video-sharing websites of the world." -# msgstr "YouTube הוא אחד מאתרי שיתוף הווידאו הגדולים בעולם." +# msgstr "" # Kodion Settings msgctxt "#30000" -msgid "General" -msgstr "כללי" +msgid "" +msgstr "" msgctxt "#30001" msgid "" @@ -151,8 +151,8 @@ msgid "Configure %s?" msgstr "" msgctxt "#30031" -msgid "Advanced" -msgstr "מתקדם" +msgid "" +msgstr "" msgctxt "#30032" msgid "View: TV Shows" @@ -217,8 +217,8 @@ msgid "Watch Later" msgstr "צפה בהמשך" msgctxt "#30108" -msgid "Remove" -msgstr "הסר" +msgid "" +msgstr "" msgctxt "#30109" msgid "" @@ -237,8 +237,8 @@ msgid "Sign Out" msgstr "התנתק" msgctxt "#30113" -msgid "Rename" -msgstr "שינוי שם" +msgid "" +msgstr "" msgctxt "#30114" msgid "Confirm delete" @@ -257,8 +257,8 @@ msgid "Remove \"%s\"?" msgstr "הסר \"%s\"?" msgctxt "#30118" -msgid "Delete" -msgstr "מחק" +msgid "" +msgstr "" msgctxt "#30119" msgid "Please wait..." @@ -301,12 +301,12 @@ msgstr "" # YouTube # empty strings from id 30206 to 30499 msgctxt "#30500" -msgid "Channels" -msgstr "ערוצים" +msgid "" +msgstr "" msgctxt "#30501" -msgid "Playlists" -msgstr "רשימות השמעה" +msgid "" +msgstr "" msgctxt "#30502" msgid "Go to %s" @@ -361,8 +361,8 @@ msgid "Related Videos" msgstr "סרטונים קשורים" msgctxt "#30515" -msgid "Auto-Remove from 'Watch Later'" -msgstr "הסרה אוטומטית מצפייה בהמשך" +msgid "Auto-Remove from Watch Later" +msgstr "" msgctxt "#30516" msgid "Folders" @@ -385,16 +385,16 @@ msgid "Add to..." msgstr "הוסף אל..." msgctxt "#30521" -msgid "Select playlist" -msgstr "בחר רשימת השמעה" +msgid "" +msgstr "" msgctxt "#30522" -msgid "New playlist..." -msgstr "רשימת השמעה חדשה..." +msgid "" +msgstr "" msgctxt "#30523" -msgid "Language" -msgstr "שפה" +msgid "" +msgstr "" msgctxt "#30524" msgid "Select language" @@ -425,20 +425,20 @@ msgid "I dislike this" msgstr "לא אהבתי את זה" msgctxt "#30531" -msgid "Play all" -msgstr "נגן הכל" +msgid "" +msgstr "" msgctxt "#30532" -msgid "Default" -msgstr "ברירת מחדל" +msgid "" +msgstr "" msgctxt "#30533" msgid "Reverse" msgstr "הפוך" msgctxt "#30534" -msgid "Shuffle" -msgstr "אקראי" +msgid "" +msgstr "" msgctxt "#30535" msgid "Select the order of the playlist" @@ -457,8 +457,8 @@ msgid "Disliked Videos" msgstr "בטל סימון אהבתי לוידיאו" msgctxt "#30539" -msgid "Live" -msgstr "שידור חי" +msgid "" +msgstr "" msgctxt "#30540" msgid "Play with..." @@ -473,8 +473,8 @@ msgid "rtmpe streams are not supported" msgstr "הזרמה של rtmpe לא נתמכת" msgctxt "#30543" -msgid "Refresh" -msgstr "רענן" +msgid "" +msgstr "" msgctxt "#30544" msgid "More Links from the description" @@ -485,24 +485,24 @@ msgid "No further links found." msgstr "לא נמצאו קישורים נוספים." msgctxt "#30546" -msgid "Please log in twice!" -msgstr "אנא היכנס פעמיים!" +msgid "Please complete all login prompts" +msgstr "" msgctxt "#30547" -msgid "You must enable two applications so that YouTube is functioning properly." -msgstr "עליך לאפשר את שני היישומים כך שיו-טיוב יפעל כהלכה." +msgid "You may be prompted to enable two applications so that YouTube is functioning properly." +msgstr "" msgctxt "#30548" -msgid "More..." -msgstr "עוד..." +msgid "" +msgstr "" msgctxt "#30549" msgid "No videos streams found" msgstr "לא נמצאה הזרמה של וידיאו" msgctxt "#30550" -msgid "Region" -msgstr "אזור" +msgid "" +msgstr "" msgctxt "#30551" msgid "Recommendations" @@ -541,15 +541,15 @@ msgid "Delete settings.xml" msgstr "מחיקת settings.xml" msgctxt "#30560" -msgid "Subtitle language" -msgstr "שפת כתוביות" +msgid "" +msgstr "" msgctxt "#30561" -msgid "None" -msgstr "ללא" +msgid "" +msgstr "" msgctxt "#30562" -msgid "" +msgid "View all" msgstr "" msgctxt "#30563" @@ -565,8 +565,8 @@ msgid "" msgstr "" msgctxt "#30566" -msgid "Prompt" -msgstr "התראה" +msgid "" +msgstr "" msgctxt "#30567" msgid "Set as Watch Later" @@ -577,12 +577,12 @@ msgid "Remove as Watch Later" msgstr "הסרה מצפייה בהמשך" msgctxt "#30569" -msgid "Are you sure you want to remove '%s' as your Watch Later list?" -msgstr "האם אתה בטוח שברצונך להסיר את \\'%s\\' מהרשימה לצפייה בהמשך?" +msgid "Are you sure you want to remove \"%s\" as your Watch Later list?" +msgstr "" msgctxt "#30570" -msgid "Are you sure you want to replace your current Watch Later list with '%s'?" -msgstr "האם אתה בטוח שברצונך להחליף את הרשימה לצפייה בהמשך הנוכחית עם \\'%s\\'?" +msgid "Are you sure you want to replace your current Watch Later list with \"%s\"?" +msgstr "" msgctxt "#30571" msgid "Set as History" @@ -593,12 +593,12 @@ msgid "Remove as History" msgstr "הסר כהיסטוריה" msgctxt "#30573" -msgid "Are you sure you want to remove '%s' as your History list?" -msgstr "האם אתה בטוח שברצונך להסיר את \\'%s\\' כרשימת ההיסטוריה שלך?" +msgid "Are you sure you want to remove \"%s\" as your History list?" +msgstr "" msgctxt "#30574" -msgid "Are you sure you want to replace your current History list with '%s'?" -msgstr "האם אתה בטוח שברצונך להחליף את הרשימה הנוכחית של ההיסטוריה עם \\'%s\\'?" +msgid "Are you sure you want to replace your current History list with \"%s\"?" +msgstr "" msgctxt "#30575" msgid "Succeeded" @@ -609,8 +609,8 @@ msgid "Failed" msgstr "נכשל" msgctxt "#30577" -msgid "Settings" -msgstr "הגדרות" +msgid "" +msgstr "" msgctxt "#30578" msgid "Force SSL certificate verification" @@ -633,8 +633,8 @@ msgid "Autoplay suggested videos" msgstr "הפעלה אוטומטית של סרטונים מוצעים" msgctxt "#30583" -msgid "Automatic" -msgstr "אוטומטי" +msgid "" +msgstr "" msgctxt "#30584" msgid "My Subscriptions (Filtered)" @@ -693,15 +693,15 @@ msgid "Updated: %s" msgstr "עודכן: %s" msgctxt "#30598" -msgid "Personal API keys enabled" -msgstr "אפשר מפתח API אישי" +msgid "" +msgstr "" msgctxt "#30599" msgid "Failed to enable personal API keys. Missing: %s" msgstr "נכשל בהפעלת מפתח ה-API האישי. חסר: %s" msgctxt "#30600" -msgid "Subtitles" +msgid "" msgstr "" msgctxt "#30601" @@ -761,7 +761,7 @@ msgid "" msgstr "" msgctxt "#30615" -msgid "Cancel" +msgid "" msgstr "" msgctxt "#30616" @@ -777,7 +777,7 @@ msgid "" msgstr "" msgctxt "#30619" -msgid "Port" +msgid "" msgstr "" msgctxt "#30620" @@ -821,7 +821,7 @@ msgid "IP whitelist (comma delimited)" msgstr "" msgctxt "#30630" -msgid "Save" +msgid "" msgstr "" msgctxt "#30631" @@ -937,7 +937,7 @@ msgid "Enter a name for this user" msgstr "" msgctxt "#30659" -msgid "User is now '%s'" +msgid "User is now \"%s\"" msgstr "" msgctxt "#30660" @@ -961,15 +961,15 @@ msgid "Switch user" msgstr "" msgctxt "#30665" -msgid "Switch to '%s' now?" +msgid "Switch to \"%s\" now?" msgstr "" msgctxt "#30666" -msgid "%s removed" +msgid "\"%s\" removed" msgstr "" msgctxt "#30667" -msgid "Renamed '%s' to '%s'" +msgid "Renamed \"%s\" to \"%s\"" msgstr "" msgctxt "#30668" @@ -1113,7 +1113,7 @@ msgid "Play with subtitles" msgstr "" msgctxt "#30703" -msgid "Are you sure?" +msgid "" msgstr "" msgctxt "#30704" @@ -1257,7 +1257,7 @@ msgid "" msgstr "" msgctxt "#30739" -msgid "" +msgid "Subscribers" msgstr "" msgctxt "#30740" @@ -1477,11 +1477,11 @@ msgid "Views count display colour" msgstr "" msgctxt "#30794" -msgid "Likes count display colour" +msgid "Subscriber/Likes count display colour" msgstr "" msgctxt "#30795" -msgid "Comments count display colour" +msgid "Videos/Comments count display colour" msgstr "" msgctxt "#30796" @@ -1580,6 +1580,139 @@ msgctxt "#30819" msgid "Play from start" msgstr "" +msgctxt "#30820" +msgid "Podcast" +msgstr "" + +#~ msgctxt "#30515" +#~ msgid "Auto-Remove from 'Watch Later'" +#~ msgstr "הסרה אוטומטית מצפייה בהמשך" + +#~ msgctxt "#30569" +#~ msgid "Are you sure you want to remove '%s' as your Watch Later list?" +#~ msgstr "האם אתה בטוח שברצונך להסיר את \\'%s\\' מהרשימה לצפייה בהמשך?" + +#~ msgctxt "#30570" +#~ msgid "Are you sure you want to replace your current Watch Later list with '%s'?" +#~ msgstr "האם אתה בטוח שברצונך להחליף את הרשימה לצפייה בהמשך הנוכחית עם \\'%s\\'?" + +#~ msgctxt "#30573" +#~ msgid "Are you sure you want to remove '%s' as your History list?" +#~ msgstr "האם אתה בטוח שברצונך להסיר את \\'%s\\' כרשימת ההיסטוריה שלך?" + +#~ msgctxt "#30574" +#~ msgid "Are you sure you want to replace your current History list with '%s'?" +#~ msgstr "האם אתה בטוח שברצונך להחליף את הרשימה הנוכחית של ההיסטוריה עם \\'%s\\'?" + +# msgctxt "Addon Summary" +# msgid "Plugin for YouTube" +# msgstr "תוסף עבור-YouTube" +# msgctxt "Addon Description" +# msgid "YouTube is a one of the biggest video-sharing websites of the world." +# msgstr "YouTube הוא אחד מאתרי שיתוף הווידאו הגדולים בעולם." +# Kodion Settings +#~ msgctxt "#30000" +#~ msgid "General" +#~ msgstr "כללי" + +#~ msgctxt "#30031" +#~ msgid "Advanced" +#~ msgstr "מתקדם" + +#~ msgctxt "#30108" +#~ msgid "Remove" +#~ msgstr "הסר" + +#~ msgctxt "#30113" +#~ msgid "Rename" +#~ msgstr "שינוי שם" + +#~ msgctxt "#30118" +#~ msgid "Delete" +#~ msgstr "מחק" + +# YouTube +# empty strings from id 30206 to 30499 +#~ msgctxt "#30500" +#~ msgid "Channels" +#~ msgstr "ערוצים" + +#~ msgctxt "#30501" +#~ msgid "Playlists" +#~ msgstr "רשימות השמעה" + +#~ msgctxt "#30521" +#~ msgid "Select playlist" +#~ msgstr "בחר רשימת השמעה" + +#~ msgctxt "#30522" +#~ msgid "New playlist..." +#~ msgstr "רשימת השמעה חדשה..." + +#~ msgctxt "#30523" +#~ msgid "Language" +#~ msgstr "שפה" + +#~ msgctxt "#30531" +#~ msgid "Play all" +#~ msgstr "נגן הכל" + +#~ msgctxt "#30532" +#~ msgid "Default" +#~ msgstr "ברירת מחדל" + +#~ msgctxt "#30534" +#~ msgid "Shuffle" +#~ msgstr "אקראי" + +#~ msgctxt "#30539" +#~ msgid "Live" +#~ msgstr "שידור חי" + +#~ msgctxt "#30543" +#~ msgid "Refresh" +#~ msgstr "רענן" + +#~ msgctxt "#30548" +#~ msgid "More..." +#~ msgstr "עוד..." + +#~ msgctxt "#30550" +#~ msgid "Region" +#~ msgstr "אזור" + +#~ msgctxt "#30560" +#~ msgid "Subtitle language" +#~ msgstr "שפת כתוביות" + +#~ msgctxt "#30561" +#~ msgid "None" +#~ msgstr "ללא" + +#~ msgctxt "#30566" +#~ msgid "Prompt" +#~ msgstr "התראה" + +#~ msgctxt "#30577" +#~ msgid "Settings" +#~ msgstr "הגדרות" + +#~ msgctxt "#30583" +#~ msgid "Automatic" +#~ msgstr "אוטומטי" + +#~ msgctxt "#30598" +#~ msgid "Personal API keys enabled" +#~ msgstr "אפשר מפתח API אישי" + +#~ msgctxt "#30546" +#~ msgid "Please log in twice!" +#~ msgstr "אנא היכנס פעמיים!" + +#~ msgctxt "#30547" +#~ msgid "You must enable two applications so that YouTube is functioning properly." +#~ msgstr "עליך לאפשר את שני היישומים כך שיו-טיוב יפעל כהלכה." + #~ msgctxt "#30001" #~ msgid "Username" #~ msgstr "שם משתמש" diff --git a/plugin.video.youtube/resources/language/resource.language.hi_in/strings.po b/plugin.video.youtube/resources/language/resource.language.hi_in/strings.po index d0e360a26a..70a7befbbc 100644 --- a/plugin.video.youtube/resources/language/resource.language.hi_in/strings.po +++ b/plugin.video.youtube/resources/language/resource.language.hi_in/strings.po @@ -37,7 +37,7 @@ msgstr "" # msgstr "" # Kodion Settings msgctxt "#30000" -msgid "General" +msgid "" msgstr "" msgctxt "#30001" @@ -151,7 +151,7 @@ msgid "Configure %s?" msgstr "" msgctxt "#30031" -msgid "Advanced" +msgid "" msgstr "" msgctxt "#30032" @@ -217,7 +217,7 @@ msgid "Watch Later" msgstr "" msgctxt "#30108" -msgid "Remove" +msgid "" msgstr "" msgctxt "#30109" @@ -237,7 +237,7 @@ msgid "Sign Out" msgstr "" msgctxt "#30113" -msgid "Rename" +msgid "" msgstr "" msgctxt "#30114" @@ -257,7 +257,7 @@ msgid "Remove \"%s\"?" msgstr "" msgctxt "#30118" -msgid "Delete" +msgid "" msgstr "" msgctxt "#30119" @@ -301,11 +301,11 @@ msgstr "" # YouTube # empty strings from id 30206 to 30499 msgctxt "#30500" -msgid "Channels" +msgid "" msgstr "" msgctxt "#30501" -msgid "Playlists" +msgid "" msgstr "" msgctxt "#30502" @@ -361,7 +361,7 @@ msgid "Related Videos" msgstr "" msgctxt "#30515" -msgid "Auto-Remove from 'Watch Later'" +msgid "Auto-Remove from Watch Later" msgstr "" msgctxt "#30516" @@ -385,15 +385,15 @@ msgid "Add to..." msgstr "" msgctxt "#30521" -msgid "Select playlist" +msgid "" msgstr "" msgctxt "#30522" -msgid "New playlist..." +msgid "" msgstr "" msgctxt "#30523" -msgid "Language" +msgid "" msgstr "" msgctxt "#30524" @@ -425,11 +425,11 @@ msgid "I dislike this" msgstr "" msgctxt "#30531" -msgid "Play all" +msgid "" msgstr "" msgctxt "#30532" -msgid "Default" +msgid "" msgstr "" msgctxt "#30533" @@ -437,7 +437,7 @@ msgid "Reverse" msgstr "" msgctxt "#30534" -msgid "Shuffle" +msgid "" msgstr "" msgctxt "#30535" @@ -457,7 +457,7 @@ msgid "Disliked Videos" msgstr "" msgctxt "#30539" -msgid "Live" +msgid "" msgstr "" msgctxt "#30540" @@ -473,7 +473,7 @@ msgid "rtmpe streams are not supported" msgstr "" msgctxt "#30543" -msgid "Refresh" +msgid "" msgstr "" msgctxt "#30544" @@ -485,15 +485,15 @@ msgid "No further links found." msgstr "" msgctxt "#30546" -msgid "Please log in twice!" +msgid "Please complete all login prompts" msgstr "" msgctxt "#30547" -msgid "You must enable two applications so that YouTube is functioning properly." +msgid "You may be prompted to enable two applications so that YouTube is functioning properly." msgstr "" msgctxt "#30548" -msgid "More..." +msgid "" msgstr "" msgctxt "#30549" @@ -501,7 +501,7 @@ msgid "No videos streams found" msgstr "" msgctxt "#30550" -msgid "Region" +msgid "" msgstr "" msgctxt "#30551" @@ -541,15 +541,15 @@ msgid "Delete settings.xml" msgstr "" msgctxt "#30560" -msgid "Subtitle language" +msgid "" msgstr "" msgctxt "#30561" -msgid "None" +msgid "" msgstr "" msgctxt "#30562" -msgid "" +msgid "View all" msgstr "" msgctxt "#30563" @@ -565,7 +565,7 @@ msgid "" msgstr "" msgctxt "#30566" -msgid "Prompt" +msgid "" msgstr "" msgctxt "#30567" @@ -577,11 +577,11 @@ msgid "Remove as Watch Later" msgstr "" msgctxt "#30569" -msgid "Are you sure you want to remove '%s' as your Watch Later list?" +msgid "Are you sure you want to remove \"%s\" as your Watch Later list?" msgstr "" msgctxt "#30570" -msgid "Are you sure you want to replace your current Watch Later list with '%s'?" +msgid "Are you sure you want to replace your current Watch Later list with \"%s\"?" msgstr "" msgctxt "#30571" @@ -593,11 +593,11 @@ msgid "Remove as History" msgstr "" msgctxt "#30573" -msgid "Are you sure you want to remove '%s' as your History list?" +msgid "Are you sure you want to remove \"%s\" as your History list?" msgstr "" msgctxt "#30574" -msgid "Are you sure you want to replace your current History list with '%s'?" +msgid "Are you sure you want to replace your current History list with \"%s\"?" msgstr "" msgctxt "#30575" @@ -609,7 +609,7 @@ msgid "Failed" msgstr "" msgctxt "#30577" -msgid "Settings" +msgid "" msgstr "" msgctxt "#30578" @@ -633,7 +633,7 @@ msgid "Autoplay suggested videos" msgstr "" msgctxt "#30583" -msgid "Automatic" +msgid "" msgstr "" msgctxt "#30584" @@ -693,7 +693,7 @@ msgid "Updated: %s" msgstr "" msgctxt "#30598" -msgid "Personal API keys enabled" +msgid "" msgstr "" msgctxt "#30599" @@ -701,7 +701,7 @@ msgid "Failed to enable personal API keys. Missing: %s" msgstr "" msgctxt "#30600" -msgid "Subtitles" +msgid "" msgstr "" msgctxt "#30601" @@ -761,7 +761,7 @@ msgid "" msgstr "" msgctxt "#30615" -msgid "Cancel" +msgid "" msgstr "" msgctxt "#30616" @@ -777,7 +777,7 @@ msgid "" msgstr "" msgctxt "#30619" -msgid "Port" +msgid "" msgstr "" msgctxt "#30620" @@ -821,7 +821,7 @@ msgid "IP whitelist (comma delimited)" msgstr "" msgctxt "#30630" -msgid "Save" +msgid "" msgstr "" msgctxt "#30631" @@ -937,7 +937,7 @@ msgid "Enter a name for this user" msgstr "" msgctxt "#30659" -msgid "User is now '%s'" +msgid "User is now \"%s\"" msgstr "" msgctxt "#30660" @@ -961,15 +961,15 @@ msgid "Switch user" msgstr "" msgctxt "#30665" -msgid "Switch to '%s' now?" +msgid "Switch to \"%s\" now?" msgstr "" msgctxt "#30666" -msgid "%s removed" +msgid "\"%s\" removed" msgstr "" msgctxt "#30667" -msgid "Renamed '%s' to '%s'" +msgid "Renamed \"%s\" to \"%s\"" msgstr "" msgctxt "#30668" @@ -1113,7 +1113,7 @@ msgid "Play with subtitles" msgstr "" msgctxt "#30703" -msgid "Are you sure?" +msgid "" msgstr "" msgctxt "#30704" @@ -1257,7 +1257,7 @@ msgid "" msgstr "" msgctxt "#30739" -msgid "" +msgid "Subscribers" msgstr "" msgctxt "#30740" @@ -1477,11 +1477,11 @@ msgid "Views count display colour" msgstr "" msgctxt "#30794" -msgid "Likes count display colour" +msgid "Subscriber/Likes count display colour" msgstr "" msgctxt "#30795" -msgid "Comments count display colour" +msgid "Videos/Comments count display colour" msgstr "" msgctxt "#30796" @@ -1579,3 +1579,7 @@ msgstr "" msgctxt "#30819" msgid "Play from start" msgstr "" + +msgctxt "#30820" +msgid "Podcast" +msgstr "" diff --git a/plugin.video.youtube/resources/language/resource.language.hr_hr/strings.po b/plugin.video.youtube/resources/language/resource.language.hr_hr/strings.po index a20154abd2..7fb1c25934 100644 --- a/plugin.video.youtube/resources/language/resource.language.hr_hr/strings.po +++ b/plugin.video.youtube/resources/language/resource.language.hr_hr/strings.po @@ -37,8 +37,8 @@ msgstr "Ovaj dodatak nije podržan od strane Googlea" # msgstr "" # Kodion Settings msgctxt "#30000" -msgid "General" -msgstr "Općenito" +msgid "" +msgstr "" msgctxt "#30001" msgid "" @@ -151,8 +151,8 @@ msgid "Configure %s?" msgstr "" msgctxt "#30031" -msgid "Advanced" -msgstr "Napredno" +msgid "" +msgstr "" msgctxt "#30032" msgid "View: TV Shows" @@ -217,8 +217,8 @@ msgid "Watch Later" msgstr "Gledat ću kasnije" msgctxt "#30108" -msgid "Remove" -msgstr "Ukloni" +msgid "" +msgstr "" msgctxt "#30109" msgid "" @@ -237,8 +237,8 @@ msgid "Sign Out" msgstr "Odjava" msgctxt "#30113" -msgid "Rename" -msgstr "Preimenuj" +msgid "" +msgstr "" msgctxt "#30114" msgid "Confirm delete" @@ -257,8 +257,8 @@ msgid "Remove \"%s\"?" msgstr "Ukloni \"%s\"?" msgctxt "#30118" -msgid "Delete" -msgstr "Obriši" +msgid "" +msgstr "" msgctxt "#30119" msgid "Please wait..." @@ -301,12 +301,12 @@ msgstr "" # YouTube # empty strings from id 30206 to 30499 msgctxt "#30500" -msgid "Channels" -msgstr "Kanali" +msgid "" +msgstr "" msgctxt "#30501" -msgid "Playlists" -msgstr "Popis izvođenja" +msgid "" +msgstr "" msgctxt "#30502" msgid "Go to %s" @@ -361,8 +361,8 @@ msgid "Related Videos" msgstr "Slični videzapisi" msgctxt "#30515" -msgid "Auto-Remove from 'Watch Later'" -msgstr "Automatsko uklanjanje iz 'Gledat ću kasnije'" +msgid "Auto-Remove from Watch Later" +msgstr "" msgctxt "#30516" msgid "Folders" @@ -385,16 +385,16 @@ msgid "Add to..." msgstr "Dodaj u..." msgctxt "#30521" -msgid "Select playlist" -msgstr "Odaberi popis izvođenja" +msgid "" +msgstr "" msgctxt "#30522" -msgid "New playlist..." -msgstr "Novi popis izvođenja..." +msgid "" +msgstr "" msgctxt "#30523" -msgid "Language" -msgstr "Jezik" +msgid "" +msgstr "" msgctxt "#30524" msgid "Select language" @@ -425,20 +425,20 @@ msgid "I dislike this" msgstr "Ne sviđa mi se" msgctxt "#30531" -msgid "Play all" -msgstr "Reproduciraj sve" +msgid "" +msgstr "" msgctxt "#30532" -msgid "Default" -msgstr "Zadano" +msgid "" +msgstr "" msgctxt "#30533" msgid "Reverse" msgstr "Obrnuto" msgctxt "#30534" -msgid "Shuffle" -msgstr "Naizmjenično" +msgid "" +msgstr "" msgctxt "#30535" msgid "Select the order of the playlist" @@ -457,8 +457,8 @@ msgid "Disliked Videos" msgstr "Videozapisi koji mi se ne sviđaju" msgctxt "#30539" -msgid "Live" -msgstr "Emitiranja uživo" +msgid "" +msgstr "" msgctxt "#30540" msgid "Play with..." @@ -473,8 +473,8 @@ msgid "rtmpe streams are not supported" msgstr "rtmpe strujanja nisu podržana" msgctxt "#30543" -msgid "Refresh" -msgstr "Osvježi" +msgid "" +msgstr "" msgctxt "#30544" msgid "More Links from the description" @@ -485,24 +485,24 @@ msgid "No further links found." msgstr "Nema pronađenih daljnjih poveznica." msgctxt "#30546" -msgid "Please log in twice!" -msgstr "Prijavite se dva puta!" +msgid "Please complete all login prompts" +msgstr "" msgctxt "#30547" -msgid "You must enable two applications so that YouTube is functioning properly." -msgstr "Morate omogućiti dvije aplikacije kako bi YouTube ispravno funkcionirao." +msgid "You may be prompted to enable two applications so that YouTube is functioning properly." +msgstr "" msgctxt "#30548" -msgid "More..." -msgstr "Više..." +msgid "" +msgstr "" msgctxt "#30549" msgid "No videos streams found" msgstr "Nije pronađen nijedan videozapis" msgctxt "#30550" -msgid "Region" -msgstr "Regija" +msgid "" +msgstr "" msgctxt "#30551" msgid "Recommendations" @@ -541,15 +541,15 @@ msgid "Delete settings.xml" msgstr "Obriši settings.xml datoteku" msgctxt "#30560" -msgid "Subtitle language" -msgstr "Jezik podnaslova" +msgid "" +msgstr "" msgctxt "#30561" -msgid "None" -msgstr "Nijedno" +msgid "" +msgstr "" msgctxt "#30562" -msgid "" +msgid "View all" msgstr "" msgctxt "#30563" @@ -565,8 +565,8 @@ msgid "" msgstr "" msgctxt "#30566" -msgid "Prompt" -msgstr "Upitaj" +msgid "" +msgstr "" msgctxt "#30567" msgid "Set as Watch Later" @@ -577,12 +577,12 @@ msgid "Remove as Watch Later" msgstr "Ukloni iz Gledat ću kasnije" msgctxt "#30569" -msgid "Are you sure you want to remove '%s' as your Watch Later list?" -msgstr "Sigurno želite ukloniti '%s' iz popisa 'Gledat ću kasnije'?" +msgid "Are you sure you want to remove \"%s\" as your Watch Later list?" +msgstr "" msgctxt "#30570" -msgid "Are you sure you want to replace your current Watch Later list with '%s'?" -msgstr "Sigurno želite zamijeniti trenutni popis 'Gledat ću kasnije' s '%s'?" +msgid "Are you sure you want to replace your current Watch Later list with \"%s\"?" +msgstr "" msgctxt "#30571" msgid "Set as History" @@ -593,12 +593,12 @@ msgid "Remove as History" msgstr "Ukloni iz Povijest" msgctxt "#30573" -msgid "Are you sure you want to remove '%s' as your History list?" -msgstr "Sigurni želite ukloniti '%s' iz svoga popisa Povijesti?" +msgid "Are you sure you want to remove \"%s\" as your History list?" +msgstr "" msgctxt "#30574" -msgid "Are you sure you want to replace your current History list with '%s'?" -msgstr "Sigurno želite zamijeniti svoj trenutni popis Povijest s '%s'?" +msgid "Are you sure you want to replace your current History list with \"%s\"?" +msgstr "" msgctxt "#30575" msgid "Succeeded" @@ -609,8 +609,8 @@ msgid "Failed" msgstr "Neuspješno" msgctxt "#30577" -msgid "Settings" -msgstr "Postavke" +msgid "" +msgstr "" msgctxt "#30578" msgid "Force SSL certificate verification" @@ -633,8 +633,8 @@ msgid "Autoplay suggested videos" msgstr "Automatski reproduciraj predložene videozapise" msgctxt "#30583" -msgid "Automatic" -msgstr "Automatski" +msgid "" +msgstr "" msgctxt "#30584" msgid "My Subscriptions (Filtered)" @@ -693,15 +693,15 @@ msgid "Updated: %s" msgstr "Nadopunjeno: %s" msgctxt "#30598" -msgid "Personal API keys enabled" -msgstr "Osobni API ključevi omogućeni" +msgid "" +msgstr "" msgctxt "#30599" msgid "Failed to enable personal API keys. Missing: %s" msgstr "Neuspjelo omogućavanje osobnih API ključeva. Nedostaje: %s" msgctxt "#30600" -msgid "Subtitles" +msgid "" msgstr "" msgctxt "#30601" @@ -761,8 +761,8 @@ msgid "" msgstr "" msgctxt "#30615" -msgid "Cancel" -msgstr "Odustani" +msgid "" +msgstr "" msgctxt "#30616" msgid "" @@ -777,8 +777,8 @@ msgid "" msgstr "" msgctxt "#30619" -msgid "Port" -msgstr "Ulaz" +msgid "" +msgstr "" msgctxt "#30620" msgid "Port %s already in use. Cannot start http server." @@ -821,8 +821,8 @@ msgid "IP whitelist (comma delimited)" msgstr "IP dopušteni (zarezom odvojeni)" msgctxt "#30630" -msgid "Save" -msgstr "Spremi" +msgid "" +msgstr "" msgctxt "#30631" msgid "Successfully updated: %s" @@ -937,8 +937,8 @@ msgid "Enter a name for this user" msgstr "Upišite ime za ovog korisnika" msgctxt "#30659" -msgid "User is now '%s'" -msgstr "Korisnik je sada '%s'" +msgid "User is now \"%s\"" +msgstr "" msgctxt "#30660" msgid "Users" @@ -961,16 +961,16 @@ msgid "Switch user" msgstr "Promijeni korisnika" msgctxt "#30665" -msgid "Switch to '%s' now?" -msgstr "Promijeni na korisnika '%s' odmah?" +msgid "Switch to \"%s\" now?" +msgstr "" msgctxt "#30666" -msgid "%s removed" +msgid "\"%s\" removed" msgstr "" msgctxt "#30667" -msgid "Renamed '%s' to '%s'" -msgstr "'%s' je preimenovan u '%s'" +msgid "Renamed \"%s\" to \"%s\"" +msgstr "" msgctxt "#30668" msgid "Play count minimum percent" @@ -1113,8 +1113,8 @@ msgid "Play with subtitles" msgstr "Gledaj s podnaslovima" msgctxt "#30703" -msgid "Are you sure?" -msgstr "Jeste li sigurni?" +msgid "" +msgstr "" msgctxt "#30704" msgid "Use YouTube website urls with default player" @@ -1257,7 +1257,7 @@ msgid "" msgstr "" msgctxt "#30739" -msgid "" +msgid "Subscribers" msgstr "" msgctxt "#30740" @@ -1477,11 +1477,11 @@ msgid "Views count display colour" msgstr "" msgctxt "#30794" -msgid "Likes count display colour" +msgid "Subscriber/Likes count display colour" msgstr "" msgctxt "#30795" -msgid "Comments count display colour" +msgid "Videos/Comments count display colour" msgstr "" msgctxt "#30796" @@ -1580,6 +1580,167 @@ msgctxt "#30819" msgid "Play from start" msgstr "" +msgctxt "#30820" +msgid "Podcast" +msgstr "" + +#~ msgctxt "#30515" +#~ msgid "Auto-Remove from 'Watch Later'" +#~ msgstr "Automatsko uklanjanje iz 'Gledat ću kasnije'" + +#~ msgctxt "#30569" +#~ msgid "Are you sure you want to remove '%s' as your Watch Later list?" +#~ msgstr "Sigurno želite ukloniti '%s' iz popisa 'Gledat ću kasnije'?" + +#~ msgctxt "#30570" +#~ msgid "Are you sure you want to replace your current Watch Later list with '%s'?" +#~ msgstr "Sigurno želite zamijeniti trenutni popis 'Gledat ću kasnije' s '%s'?" + +#~ msgctxt "#30573" +#~ msgid "Are you sure you want to remove '%s' as your History list?" +#~ msgstr "Sigurni želite ukloniti '%s' iz svoga popisa Povijesti?" + +#~ msgctxt "#30574" +#~ msgid "Are you sure you want to replace your current History list with '%s'?" +#~ msgstr "Sigurno želite zamijeniti svoj trenutni popis Povijest s '%s'?" + +#~ msgctxt "#30659" +#~ msgid "User is now '%s'" +#~ msgstr "Korisnik je sada '%s'" + +#~ msgctxt "#30665" +#~ msgid "Switch to '%s' now?" +#~ msgstr "Promijeni na korisnika '%s' odmah?" + +#~ msgctxt "#30667" +#~ msgid "Renamed '%s' to '%s'" +#~ msgstr "'%s' je preimenovan u '%s'" + +# msgctxt "Addon Summary" +# msgid "Plugin for YouTube" +# msgstr "" +# msgctxt "Addon Description" +# msgid "YouTube is a one of the biggest video-sharing websites of the world." +# msgstr "" +# Kodion Settings +#~ msgctxt "#30000" +#~ msgid "General" +#~ msgstr "Općenito" + +#~ msgctxt "#30031" +#~ msgid "Advanced" +#~ msgstr "Napredno" + +#~ msgctxt "#30108" +#~ msgid "Remove" +#~ msgstr "Ukloni" + +#~ msgctxt "#30113" +#~ msgid "Rename" +#~ msgstr "Preimenuj" + +#~ msgctxt "#30118" +#~ msgid "Delete" +#~ msgstr "Obriši" + +# YouTube +# empty strings from id 30206 to 30499 +#~ msgctxt "#30500" +#~ msgid "Channels" +#~ msgstr "Kanali" + +#~ msgctxt "#30501" +#~ msgid "Playlists" +#~ msgstr "Popis izvođenja" + +#~ msgctxt "#30521" +#~ msgid "Select playlist" +#~ msgstr "Odaberi popis izvođenja" + +#~ msgctxt "#30522" +#~ msgid "New playlist..." +#~ msgstr "Novi popis izvođenja..." + +#~ msgctxt "#30523" +#~ msgid "Language" +#~ msgstr "Jezik" + +#~ msgctxt "#30531" +#~ msgid "Play all" +#~ msgstr "Reproduciraj sve" + +#~ msgctxt "#30532" +#~ msgid "Default" +#~ msgstr "Zadano" + +#~ msgctxt "#30534" +#~ msgid "Shuffle" +#~ msgstr "Naizmjenično" + +#~ msgctxt "#30539" +#~ msgid "Live" +#~ msgstr "Emitiranja uživo" + +#~ msgctxt "#30543" +#~ msgid "Refresh" +#~ msgstr "Osvježi" + +#~ msgctxt "#30548" +#~ msgid "More..." +#~ msgstr "Više..." + +#~ msgctxt "#30550" +#~ msgid "Region" +#~ msgstr "Regija" + +#~ msgctxt "#30560" +#~ msgid "Subtitle language" +#~ msgstr "Jezik podnaslova" + +#~ msgctxt "#30561" +#~ msgid "None" +#~ msgstr "Nijedno" + +#~ msgctxt "#30566" +#~ msgid "Prompt" +#~ msgstr "Upitaj" + +#~ msgctxt "#30577" +#~ msgid "Settings" +#~ msgstr "Postavke" + +#~ msgctxt "#30583" +#~ msgid "Automatic" +#~ msgstr "Automatski" + +#~ msgctxt "#30598" +#~ msgid "Personal API keys enabled" +#~ msgstr "Osobni API ključevi omogućeni" + +#~ msgctxt "#30615" +#~ msgid "Cancel" +#~ msgstr "Odustani" + +#~ msgctxt "#30619" +#~ msgid "Port" +#~ msgstr "Ulaz" + +#~ msgctxt "#30630" +#~ msgid "Save" +#~ msgstr "Spremi" + +#~ msgctxt "#30703" +#~ msgid "Are you sure?" +#~ msgstr "Jeste li sigurni?" + +#~ msgctxt "#30546" +#~ msgid "Please log in twice!" +#~ msgstr "Prijavite se dva puta!" + +#~ msgctxt "#30547" +#~ msgid "You must enable two applications so that YouTube is functioning properly." +#~ msgstr "Morate omogućiti dvije aplikacije kako bi YouTube ispravno funkcionirao." + #~ msgctxt "#30001" #~ msgid "Username" #~ msgstr "Korisničko ime" diff --git a/plugin.video.youtube/resources/language/resource.language.hu_hu/strings.po b/plugin.video.youtube/resources/language/resource.language.hu_hu/strings.po index c4f775255c..adcd7abefa 100644 --- a/plugin.video.youtube/resources/language/resource.language.hu_hu/strings.po +++ b/plugin.video.youtube/resources/language/resource.language.hu_hu/strings.po @@ -31,13 +31,14 @@ msgstr "" # msgctxt "Addon Summary" # msgid "Plugin for YouTube" -# msgstr "YouTube kiegészítő" +# msgstr "" # msgctxt "Addon Description" # msgid "YouTube is a one of the biggest video-sharing websites of the world." -# msgstr "A YouTube a világ egyik legnagyobb videómegosztó weboldala." +# msgstr "" +# Kodion Settings msgctxt "#30000" -msgid "General" -msgstr "Általános" +msgid "" +msgstr "" msgctxt "#30001" msgid "" @@ -149,8 +150,8 @@ msgid "Configure %s?" msgstr "" msgctxt "#30031" -msgid "Advanced" -msgstr "Részletes" +msgid "" +msgstr "" msgctxt "#30032" msgid "View: TV Shows" @@ -215,8 +216,8 @@ msgid "Watch Later" msgstr "Megnézendő videók" msgctxt "#30108" -msgid "Remove" -msgstr "Eltávolítás" +msgid "" +msgstr "" msgctxt "#30109" msgid "" @@ -235,8 +236,8 @@ msgid "Sign Out" msgstr "Kijelentkezés" msgctxt "#30113" -msgid "Rename" -msgstr "Átnevezés" +msgid "" +msgstr "" msgctxt "#30114" msgid "Confirm delete" @@ -255,8 +256,8 @@ msgid "Remove \"%s\"?" msgstr "Eltávolítja ezt: \"%s\"?" msgctxt "#30118" -msgid "Delete" -msgstr "Törlés" +msgid "" +msgstr "" msgctxt "#30119" msgid "Please wait..." @@ -299,12 +300,12 @@ msgstr "" # YouTube # empty strings from id 30206 to 30499 msgctxt "#30500" -msgid "Channels" -msgstr "Csatornák" +msgid "" +msgstr "" msgctxt "#30501" -msgid "Playlists" -msgstr "Lejátszási listák" +msgid "" +msgstr "" msgctxt "#30502" msgid "Go to %s" @@ -359,8 +360,8 @@ msgid "Related Videos" msgstr "Kapcsolódó videók" msgctxt "#30515" -msgid "Auto-Remove from 'Watch Later'" -msgstr "Automatikus eltávolítás a megnézendő videók közül" +msgid "Auto-Remove from Watch Later" +msgstr "" msgctxt "#30516" msgid "Folders" @@ -383,16 +384,16 @@ msgid "Add to..." msgstr "Hozzáadás..." msgctxt "#30521" -msgid "Select playlist" -msgstr "Lejátszási lista kiválasztása" +msgid "" +msgstr "" msgctxt "#30522" -msgid "New playlist..." -msgstr "Új lejátszási lista..." +msgid "" +msgstr "" msgctxt "#30523" -msgid "Language" -msgstr "Nyelv" +msgid "" +msgstr "" msgctxt "#30524" msgid "Select language" @@ -423,20 +424,20 @@ msgid "I dislike this" msgstr "Ez nem tetszik nekem" msgctxt "#30531" -msgid "Play all" -msgstr "Összes lejátszása" +msgid "" +msgstr "" msgctxt "#30532" -msgid "Default" -msgstr "Alapértelmezett" +msgid "" +msgstr "" msgctxt "#30533" msgid "Reverse" msgstr "Ellentétes" msgctxt "#30534" -msgid "Shuffle" -msgstr "Keverés" +msgid "" +msgstr "" msgctxt "#30535" msgid "Select the order of the playlist" @@ -455,8 +456,8 @@ msgid "Disliked Videos" msgstr "Nem kedvelt videók" msgctxt "#30539" -msgid "Live" -msgstr "Élő" +msgid "" +msgstr "" msgctxt "#30540" msgid "Play with..." @@ -471,8 +472,8 @@ msgid "rtmpe streams are not supported" msgstr "az rtmpe streamek nem támogatottak" msgctxt "#30543" -msgid "Refresh" -msgstr "Frissítés" +msgid "" +msgstr "" msgctxt "#30544" msgid "More Links from the description" @@ -483,24 +484,24 @@ msgid "No further links found." msgstr "Nem találhatók további hivatkozások." msgctxt "#30546" -msgid "Please log in twice!" -msgstr "Kérjük, jelentkezzen be kétszer!" +msgid "Please complete all login prompts" +msgstr "" msgctxt "#30547" -msgid "You must enable two applications so that YouTube is functioning properly." -msgstr "Engedélyeznie kell két alkalmazás használatát, hogy a YouTube megfelelően működjön." +msgid "You may be prompted to enable two applications so that YouTube is functioning properly." +msgstr "" msgctxt "#30548" -msgid "More..." -msgstr "Részletek..." +msgid "" +msgstr "" msgctxt "#30549" msgid "No videos streams found" msgstr "Videó streamek nem találhatók" msgctxt "#30550" -msgid "Region" -msgstr "Ország" +msgid "" +msgstr "" msgctxt "#30551" msgid "Recommendations" @@ -539,15 +540,15 @@ msgid "Delete settings.xml" msgstr "Az settings.xml törlése" msgctxt "#30560" -msgid "Subtitle language" -msgstr "Felirat nyelve" +msgid "" +msgstr "" msgctxt "#30561" -msgid "None" -msgstr "Nincs" +msgid "" +msgstr "" msgctxt "#30562" -msgid "" +msgid "View all" msgstr "" msgctxt "#30563" @@ -563,8 +564,8 @@ msgid "" msgstr "" msgctxt "#30566" -msgid "Prompt" -msgstr "Súgás" +msgid "" +msgstr "" msgctxt "#30567" msgid "Set as Watch Later" @@ -575,12 +576,12 @@ msgid "Remove as Watch Later" msgstr "Eltávolítás a megtekintendő videók közül" msgctxt "#30569" -msgid "Are you sure you want to remove '%s' as your Watch Later list?" -msgstr "Biztos benne, hogy eltávolítja a megtekintendő videók közül: \"%s\"?" +msgid "Are you sure you want to remove \"%s\" as your Watch Later list?" +msgstr "" msgctxt "#30570" -msgid "Are you sure you want to replace your current Watch Later list with '%s'?" -msgstr "Biztos benne, hogy az aktuális megtekintési listát a(z) '%s' helyettesíti?" +msgid "Are you sure you want to replace your current Watch Later list with \"%s\"?" +msgstr "" msgctxt "#30571" msgid "Set as History" @@ -591,12 +592,12 @@ msgid "Remove as History" msgstr "Eltávolítás az előzményekből" msgctxt "#30573" -msgid "Are you sure you want to remove '%s' as your History list?" -msgstr "Biztos benne, hogy eltávolítja az előzményekből \"%s\" videót?" +msgid "Are you sure you want to remove \"%s\" as your History list?" +msgstr "" msgctxt "#30574" -msgid "Are you sure you want to replace your current History list with '%s'?" -msgstr "Biztos benne, hogy lecseréli az aktuális előzmények listát erre a kifelyezésre: '%s'?" +msgid "Are you sure you want to replace your current History list with \"%s\"?" +msgstr "" msgctxt "#30575" msgid "Succeeded" @@ -607,8 +608,8 @@ msgid "Failed" msgstr "Nem sikerült" msgctxt "#30577" -msgid "Settings" -msgstr "Beállítások" +msgid "" +msgstr "" msgctxt "#30578" msgid "Force SSL certificate verification" @@ -631,8 +632,8 @@ msgid "Autoplay suggested videos" msgstr "Javasolt videók automatikus lejátszása" msgctxt "#30583" -msgid "Automatic" -msgstr "Automatikus" +msgid "" +msgstr "" msgctxt "#30584" msgid "My Subscriptions (Filtered)" @@ -691,15 +692,15 @@ msgid "Updated: %s" msgstr "Frissítve: %s" msgctxt "#30598" -msgid "Personal API keys enabled" -msgstr "Személyes API Kulcsok engedélyezve" +msgid "" +msgstr "" msgctxt "#30599" msgid "Failed to enable personal API keys. Missing: %s" msgstr "Nem sikerült engedélyezni a személyes API-kulcsokat. Hiányzik: %s" msgctxt "#30600" -msgid "Subtitles" +msgid "" msgstr "" msgctxt "#30601" @@ -759,8 +760,8 @@ msgid "" msgstr "" msgctxt "#30615" -msgid "Cancel" -msgstr "Mégse" +msgid "" +msgstr "" msgctxt "#30616" msgid "" @@ -775,8 +776,8 @@ msgid "" msgstr "" msgctxt "#30619" -msgid "Port" -msgstr "Port" +msgid "" +msgstr "" msgctxt "#30620" msgid "Port %s already in use. Cannot start http server." @@ -819,8 +820,8 @@ msgid "IP whitelist (comma delimited)" msgstr "IP fehérlista (vesszővel elválasztva)" msgctxt "#30630" -msgid "Save" -msgstr "Mentés" +msgid "" +msgstr "" msgctxt "#30631" msgid "Successfully updated: %s" @@ -935,8 +936,8 @@ msgid "Enter a name for this user" msgstr "Adja meg a felhasználónevét" msgctxt "#30659" -msgid "User is now '%s'" -msgstr "Jelenlegi felhasználó '%s'" +msgid "User is now \"%s\"" +msgstr "" msgctxt "#30660" msgid "Users" @@ -959,16 +960,16 @@ msgid "Switch user" msgstr "Felhasználó váltás" msgctxt "#30665" -msgid "Switch to '%s' now?" -msgstr "Felhasználóváltás '%s' most?" +msgid "Switch to \"%s\" now?" +msgstr "" msgctxt "#30666" -msgid "%s removed" +msgid "\"%s\" removed" msgstr "" msgctxt "#30667" -msgid "Renamed '%s' to '%s'" -msgstr "Átnevezve '%s' - '%s'" +msgid "Renamed \"%s\" to \"%s\"" +msgstr "" msgctxt "#30668" msgid "Play count minimum percent" @@ -1111,8 +1112,8 @@ msgid "Play with subtitles" msgstr "Lejátszás felirattal" msgctxt "#30703" -msgid "Are you sure?" -msgstr "Biztos benne?" +msgid "" +msgstr "" msgctxt "#30704" msgid "Use YouTube website urls with default player" @@ -1255,7 +1256,7 @@ msgid "" msgstr "" msgctxt "#30739" -msgid "" +msgid "Subscribers" msgstr "" msgctxt "#30740" @@ -1475,11 +1476,11 @@ msgid "Views count display colour" msgstr "" msgctxt "#30794" -msgid "Likes count display colour" +msgid "Subscriber/Likes count display colour" msgstr "" msgctxt "#30795" -msgid "Comments count display colour" +msgid "Videos/Comments count display colour" msgstr "" msgctxt "#30796" @@ -1578,6 +1579,166 @@ msgctxt "#30819" msgid "Play from start" msgstr "" +msgctxt "#30820" +msgid "Podcast" +msgstr "" + +#~ msgctxt "#30515" +#~ msgid "Auto-Remove from 'Watch Later'" +#~ msgstr "Automatikus eltávolítás a megnézendő videók közül" + +#~ msgctxt "#30569" +#~ msgid "Are you sure you want to remove '%s' as your Watch Later list?" +#~ msgstr "Biztos benne, hogy eltávolítja a megtekintendő videók közül: \"%s\"?" + +#~ msgctxt "#30570" +#~ msgid "Are you sure you want to replace your current Watch Later list with '%s'?" +#~ msgstr "Biztos benne, hogy az aktuális megtekintési listát a(z) '%s' helyettesíti?" + +#~ msgctxt "#30573" +#~ msgid "Are you sure you want to remove '%s' as your History list?" +#~ msgstr "Biztos benne, hogy eltávolítja az előzményekből \"%s\" videót?" + +#~ msgctxt "#30574" +#~ msgid "Are you sure you want to replace your current History list with '%s'?" +#~ msgstr "Biztos benne, hogy lecseréli az aktuális előzmények listát erre a kifelyezésre: '%s'?" + +#~ msgctxt "#30659" +#~ msgid "User is now '%s'" +#~ msgstr "Jelenlegi felhasználó '%s'" + +#~ msgctxt "#30665" +#~ msgid "Switch to '%s' now?" +#~ msgstr "Felhasználóváltás '%s' most?" + +#~ msgctxt "#30667" +#~ msgid "Renamed '%s' to '%s'" +#~ msgstr "Átnevezve '%s' - '%s'" + +# msgctxt "Addon Summary" +# msgid "Plugin for YouTube" +# msgstr "YouTube kiegészítő" +# msgctxt "Addon Description" +# msgid "YouTube is a one of the biggest video-sharing websites of the world." +# msgstr "A YouTube a világ egyik legnagyobb videómegosztó weboldala." +#~ msgctxt "#30000" +#~ msgid "General" +#~ msgstr "Általános" + +#~ msgctxt "#30031" +#~ msgid "Advanced" +#~ msgstr "Részletes" + +#~ msgctxt "#30108" +#~ msgid "Remove" +#~ msgstr "Eltávolítás" + +#~ msgctxt "#30113" +#~ msgid "Rename" +#~ msgstr "Átnevezés" + +#~ msgctxt "#30118" +#~ msgid "Delete" +#~ msgstr "Törlés" + +# YouTube +# empty strings from id 30206 to 30499 +#~ msgctxt "#30500" +#~ msgid "Channels" +#~ msgstr "Csatornák" + +#~ msgctxt "#30501" +#~ msgid "Playlists" +#~ msgstr "Lejátszási listák" + +#~ msgctxt "#30521" +#~ msgid "Select playlist" +#~ msgstr "Lejátszási lista kiválasztása" + +#~ msgctxt "#30522" +#~ msgid "New playlist..." +#~ msgstr "Új lejátszási lista..." + +#~ msgctxt "#30523" +#~ msgid "Language" +#~ msgstr "Nyelv" + +#~ msgctxt "#30531" +#~ msgid "Play all" +#~ msgstr "Összes lejátszása" + +#~ msgctxt "#30532" +#~ msgid "Default" +#~ msgstr "Alapértelmezett" + +#~ msgctxt "#30534" +#~ msgid "Shuffle" +#~ msgstr "Keverés" + +#~ msgctxt "#30539" +#~ msgid "Live" +#~ msgstr "Élő" + +#~ msgctxt "#30543" +#~ msgid "Refresh" +#~ msgstr "Frissítés" + +#~ msgctxt "#30548" +#~ msgid "More..." +#~ msgstr "Részletek..." + +#~ msgctxt "#30550" +#~ msgid "Region" +#~ msgstr "Ország" + +#~ msgctxt "#30560" +#~ msgid "Subtitle language" +#~ msgstr "Felirat nyelve" + +#~ msgctxt "#30561" +#~ msgid "None" +#~ msgstr "Nincs" + +#~ msgctxt "#30566" +#~ msgid "Prompt" +#~ msgstr "Súgás" + +#~ msgctxt "#30577" +#~ msgid "Settings" +#~ msgstr "Beállítások" + +#~ msgctxt "#30583" +#~ msgid "Automatic" +#~ msgstr "Automatikus" + +#~ msgctxt "#30598" +#~ msgid "Personal API keys enabled" +#~ msgstr "Személyes API Kulcsok engedélyezve" + +#~ msgctxt "#30615" +#~ msgid "Cancel" +#~ msgstr "Mégse" + +#~ msgctxt "#30619" +#~ msgid "Port" +#~ msgstr "Port" + +#~ msgctxt "#30630" +#~ msgid "Save" +#~ msgstr "Mentés" + +#~ msgctxt "#30703" +#~ msgid "Are you sure?" +#~ msgstr "Biztos benne?" + +#~ msgctxt "#30546" +#~ msgid "Please log in twice!" +#~ msgstr "Kérjük, jelentkezzen be kétszer!" + +#~ msgctxt "#30547" +#~ msgid "You must enable two applications so that YouTube is functioning properly." +#~ msgstr "Engedélyeznie kell két alkalmazás használatát, hogy a YouTube megfelelően működjön." + #~ msgctxt "#30001" #~ msgid "Username" #~ msgstr "Felhasználónév" diff --git a/plugin.video.youtube/resources/language/resource.language.hy_am/strings.po b/plugin.video.youtube/resources/language/resource.language.hy_am/strings.po index 93b027f181..02326dacef 100644 --- a/plugin.video.youtube/resources/language/resource.language.hy_am/strings.po +++ b/plugin.video.youtube/resources/language/resource.language.hy_am/strings.po @@ -37,7 +37,7 @@ msgstr "" # msgstr "" # Kodion Settings msgctxt "#30000" -msgid "General" +msgid "" msgstr "" msgctxt "#30001" @@ -151,7 +151,7 @@ msgid "Configure %s?" msgstr "" msgctxt "#30031" -msgid "Advanced" +msgid "" msgstr "" msgctxt "#30032" @@ -217,7 +217,7 @@ msgid "Watch Later" msgstr "" msgctxt "#30108" -msgid "Remove" +msgid "" msgstr "" msgctxt "#30109" @@ -237,7 +237,7 @@ msgid "Sign Out" msgstr "" msgctxt "#30113" -msgid "Rename" +msgid "" msgstr "" msgctxt "#30114" @@ -257,7 +257,7 @@ msgid "Remove \"%s\"?" msgstr "" msgctxt "#30118" -msgid "Delete" +msgid "" msgstr "" msgctxt "#30119" @@ -301,11 +301,11 @@ msgstr "" # YouTube # empty strings from id 30206 to 30499 msgctxt "#30500" -msgid "Channels" +msgid "" msgstr "" msgctxt "#30501" -msgid "Playlists" +msgid "" msgstr "" msgctxt "#30502" @@ -361,7 +361,7 @@ msgid "Related Videos" msgstr "" msgctxt "#30515" -msgid "Auto-Remove from 'Watch Later'" +msgid "Auto-Remove from Watch Later" msgstr "" msgctxt "#30516" @@ -385,15 +385,15 @@ msgid "Add to..." msgstr "" msgctxt "#30521" -msgid "Select playlist" +msgid "" msgstr "" msgctxt "#30522" -msgid "New playlist..." +msgid "" msgstr "" msgctxt "#30523" -msgid "Language" +msgid "" msgstr "" msgctxt "#30524" @@ -425,11 +425,11 @@ msgid "I dislike this" msgstr "" msgctxt "#30531" -msgid "Play all" +msgid "" msgstr "" msgctxt "#30532" -msgid "Default" +msgid "" msgstr "" msgctxt "#30533" @@ -437,7 +437,7 @@ msgid "Reverse" msgstr "" msgctxt "#30534" -msgid "Shuffle" +msgid "" msgstr "" msgctxt "#30535" @@ -457,7 +457,7 @@ msgid "Disliked Videos" msgstr "" msgctxt "#30539" -msgid "Live" +msgid "" msgstr "" msgctxt "#30540" @@ -473,7 +473,7 @@ msgid "rtmpe streams are not supported" msgstr "" msgctxt "#30543" -msgid "Refresh" +msgid "" msgstr "" msgctxt "#30544" @@ -485,15 +485,15 @@ msgid "No further links found." msgstr "" msgctxt "#30546" -msgid "Please log in twice!" +msgid "Please complete all login prompts" msgstr "" msgctxt "#30547" -msgid "You must enable two applications so that YouTube is functioning properly." +msgid "You may be prompted to enable two applications so that YouTube is functioning properly." msgstr "" msgctxt "#30548" -msgid "More..." +msgid "" msgstr "" msgctxt "#30549" @@ -501,7 +501,7 @@ msgid "No videos streams found" msgstr "" msgctxt "#30550" -msgid "Region" +msgid "" msgstr "" msgctxt "#30551" @@ -541,15 +541,15 @@ msgid "Delete settings.xml" msgstr "" msgctxt "#30560" -msgid "Subtitle language" +msgid "" msgstr "" msgctxt "#30561" -msgid "None" +msgid "" msgstr "" msgctxt "#30562" -msgid "" +msgid "View all" msgstr "" msgctxt "#30563" @@ -565,7 +565,7 @@ msgid "" msgstr "" msgctxt "#30566" -msgid "Prompt" +msgid "" msgstr "" msgctxt "#30567" @@ -577,11 +577,11 @@ msgid "Remove as Watch Later" msgstr "" msgctxt "#30569" -msgid "Are you sure you want to remove '%s' as your Watch Later list?" +msgid "Are you sure you want to remove \"%s\" as your Watch Later list?" msgstr "" msgctxt "#30570" -msgid "Are you sure you want to replace your current Watch Later list with '%s'?" +msgid "Are you sure you want to replace your current Watch Later list with \"%s\"?" msgstr "" msgctxt "#30571" @@ -593,11 +593,11 @@ msgid "Remove as History" msgstr "" msgctxt "#30573" -msgid "Are you sure you want to remove '%s' as your History list?" +msgid "Are you sure you want to remove \"%s\" as your History list?" msgstr "" msgctxt "#30574" -msgid "Are you sure you want to replace your current History list with '%s'?" +msgid "Are you sure you want to replace your current History list with \"%s\"?" msgstr "" msgctxt "#30575" @@ -609,7 +609,7 @@ msgid "Failed" msgstr "" msgctxt "#30577" -msgid "Settings" +msgid "" msgstr "" msgctxt "#30578" @@ -633,7 +633,7 @@ msgid "Autoplay suggested videos" msgstr "" msgctxt "#30583" -msgid "Automatic" +msgid "" msgstr "" msgctxt "#30584" @@ -693,7 +693,7 @@ msgid "Updated: %s" msgstr "" msgctxt "#30598" -msgid "Personal API keys enabled" +msgid "" msgstr "" msgctxt "#30599" @@ -701,7 +701,7 @@ msgid "Failed to enable personal API keys. Missing: %s" msgstr "" msgctxt "#30600" -msgid "Subtitles" +msgid "" msgstr "" msgctxt "#30601" @@ -761,7 +761,7 @@ msgid "" msgstr "" msgctxt "#30615" -msgid "Cancel" +msgid "" msgstr "" msgctxt "#30616" @@ -777,7 +777,7 @@ msgid "" msgstr "" msgctxt "#30619" -msgid "Port" +msgid "" msgstr "" msgctxt "#30620" @@ -821,7 +821,7 @@ msgid "IP whitelist (comma delimited)" msgstr "" msgctxt "#30630" -msgid "Save" +msgid "" msgstr "" msgctxt "#30631" @@ -937,7 +937,7 @@ msgid "Enter a name for this user" msgstr "" msgctxt "#30659" -msgid "User is now '%s'" +msgid "User is now \"%s\"" msgstr "" msgctxt "#30660" @@ -961,15 +961,15 @@ msgid "Switch user" msgstr "" msgctxt "#30665" -msgid "Switch to '%s' now?" +msgid "Switch to \"%s\" now?" msgstr "" msgctxt "#30666" -msgid "%s removed" +msgid "\"%s\" removed" msgstr "" msgctxt "#30667" -msgid "Renamed '%s' to '%s'" +msgid "Renamed \"%s\" to \"%s\"" msgstr "" msgctxt "#30668" @@ -1113,7 +1113,7 @@ msgid "Play with subtitles" msgstr "" msgctxt "#30703" -msgid "Are you sure?" +msgid "" msgstr "" msgctxt "#30704" @@ -1257,7 +1257,7 @@ msgid "" msgstr "" msgctxt "#30739" -msgid "" +msgid "Subscribers" msgstr "" msgctxt "#30740" @@ -1477,11 +1477,11 @@ msgid "Views count display colour" msgstr "" msgctxt "#30794" -msgid "Likes count display colour" +msgid "Subscriber/Likes count display colour" msgstr "" msgctxt "#30795" -msgid "Comments count display colour" +msgid "Videos/Comments count display colour" msgstr "" msgctxt "#30796" @@ -1579,3 +1579,7 @@ msgstr "" msgctxt "#30819" msgid "Play from start" msgstr "" + +msgctxt "#30820" +msgid "Podcast" +msgstr "" diff --git a/plugin.video.youtube/resources/language/resource.language.id_id/strings.po b/plugin.video.youtube/resources/language/resource.language.id_id/strings.po index 55be9e6908..5a650d6635 100644 --- a/plugin.video.youtube/resources/language/resource.language.id_id/strings.po +++ b/plugin.video.youtube/resources/language/resource.language.id_id/strings.po @@ -37,8 +37,8 @@ msgstr "Plugin ini tidak didukung oleh Google" # msgstr "" # Kodion Settings msgctxt "#30000" -msgid "General" -msgstr "Umum" +msgid "" +msgstr "" msgctxt "#30001" msgid "" @@ -151,8 +151,8 @@ msgid "Configure %s?" msgstr "" msgctxt "#30031" -msgid "Advanced" -msgstr "Lanjutan" +msgid "" +msgstr "" msgctxt "#30032" msgid "View: TV Shows" @@ -217,8 +217,8 @@ msgid "Watch Later" msgstr "Nonton Nanti" msgctxt "#30108" -msgid "Remove" -msgstr "Hapus" +msgid "" +msgstr "" msgctxt "#30109" msgid "" @@ -237,8 +237,8 @@ msgid "Sign Out" msgstr "Keluar" msgctxt "#30113" -msgid "Rename" -msgstr "Nama ulang" +msgid "" +msgstr "" msgctxt "#30114" msgid "Confirm delete" @@ -257,8 +257,8 @@ msgid "Remove \"%s\"?" msgstr "Hapus \"%s\"?" msgctxt "#30118" -msgid "Delete" -msgstr "Hapus" +msgid "" +msgstr "" msgctxt "#30119" msgid "Please wait..." @@ -301,12 +301,12 @@ msgstr "" # YouTube # empty strings from id 30206 to 30499 msgctxt "#30500" -msgid "Channels" -msgstr "Saluran" +msgid "" +msgstr "" msgctxt "#30501" -msgid "Playlists" -msgstr "Daftarputar" +msgid "" +msgstr "" msgctxt "#30502" msgid "Go to %s" @@ -361,8 +361,8 @@ msgid "Related Videos" msgstr "Video Terkait" msgctxt "#30515" -msgid "Auto-Remove from 'Watch Later'" -msgstr "Hapus Otomatis dari 'Tonton Nanti'" +msgid "Auto-Remove from Watch Later" +msgstr "" msgctxt "#30516" msgid "Folders" @@ -385,16 +385,16 @@ msgid "Add to..." msgstr "Tambahkan ke..." msgctxt "#30521" -msgid "Select playlist" -msgstr "Pilih daftar putar" +msgid "" +msgstr "" msgctxt "#30522" -msgid "New playlist..." -msgstr "Daftar putar baru..." +msgid "" +msgstr "" msgctxt "#30523" -msgid "Language" -msgstr "Bahasa" +msgid "" +msgstr "" msgctxt "#30524" msgid "Select language" @@ -425,20 +425,20 @@ msgid "I dislike this" msgstr "Tidak suka" msgctxt "#30531" -msgid "Play all" -msgstr "Putar semua" +msgid "" +msgstr "" msgctxt "#30532" -msgid "Default" -msgstr "Bawaan" +msgid "" +msgstr "" msgctxt "#30533" msgid "Reverse" msgstr "Balik" msgctxt "#30534" -msgid "Shuffle" -msgstr "Acak" +msgid "" +msgstr "" msgctxt "#30535" msgid "Select the order of the playlist" @@ -457,8 +457,8 @@ msgid "Disliked Videos" msgstr "Video yang tak disukai" msgctxt "#30539" -msgid "Live" -msgstr "Langsung" +msgid "" +msgstr "" msgctxt "#30540" msgid "Play with..." @@ -473,8 +473,8 @@ msgid "rtmpe streams are not supported" msgstr "aliran rtmpe tidak didukung" msgctxt "#30543" -msgid "Refresh" -msgstr "Segarkan" +msgid "" +msgstr "" msgctxt "#30544" msgid "More Links from the description" @@ -485,24 +485,24 @@ msgid "No further links found." msgstr "Tidak ada tautan lebih lanjut yang ditemukan." msgctxt "#30546" -msgid "Please log in twice!" -msgstr "Silakan masuk dua kali!" +msgid "Please complete all login prompts" +msgstr "" msgctxt "#30547" -msgid "You must enable two applications so that YouTube is functioning properly." -msgstr "Anda harus mengaktifkan dua aplikasi agar YouTube berfungsi dengan baik." +msgid "You may be prompted to enable two applications so that YouTube is functioning properly." +msgstr "" msgctxt "#30548" -msgid "More..." -msgstr "Lebih..." +msgid "" +msgstr "" msgctxt "#30549" msgid "No videos streams found" msgstr "Aliran video tidak ditemukan" msgctxt "#30550" -msgid "Region" -msgstr "Wilayah" +msgid "" +msgstr "" msgctxt "#30551" msgid "Recommendations" @@ -541,15 +541,15 @@ msgid "Delete settings.xml" msgstr "Hapus settings.xml" msgctxt "#30560" -msgid "Subtitle language" -msgstr "Bahasa takarir" +msgid "" +msgstr "" msgctxt "#30561" -msgid "None" -msgstr "Nihil" +msgid "" +msgstr "" msgctxt "#30562" -msgid "" +msgid "View all" msgstr "" msgctxt "#30563" @@ -565,8 +565,8 @@ msgid "" msgstr "" msgctxt "#30566" -msgid "Prompt" -msgstr "Perintah" +msgid "" +msgstr "" msgctxt "#30567" msgid "Set as Watch Later" @@ -577,12 +577,12 @@ msgid "Remove as Watch Later" msgstr "Hapus sebagai Tonton Nanti" msgctxt "#30569" -msgid "Are you sure you want to remove '%s' as your Watch Later list?" -msgstr "Yakin ingin menghapus '%s' sebagai daftar Tonton Nanti?" +msgid "Are you sure you want to remove \"%s\" as your Watch Later list?" +msgstr "" msgctxt "#30570" -msgid "Are you sure you want to replace your current Watch Later list with '%s'?" -msgstr "Yakin ingin mengganti daftar Tonton Nanti Anda saat ini dengan '%s'?" +msgid "Are you sure you want to replace your current Watch Later list with \"%s\"?" +msgstr "" msgctxt "#30571" msgid "Set as History" @@ -593,12 +593,12 @@ msgid "Remove as History" msgstr "Hapus sebagai Riwayat" msgctxt "#30573" -msgid "Are you sure you want to remove '%s' as your History list?" -msgstr "Yakin ingin menghapus '%s' sebagai daftar Riwayat Anda?" +msgid "Are you sure you want to remove \"%s\" as your History list?" +msgstr "" msgctxt "#30574" -msgid "Are you sure you want to replace your current History list with '%s'?" -msgstr "Yakin ingin mengganti daftar Riwayat Anda saat ini dengan '%s'?" +msgid "Are you sure you want to replace your current History list with \"%s\"?" +msgstr "" msgctxt "#30575" msgid "Succeeded" @@ -609,8 +609,8 @@ msgid "Failed" msgstr "Gagal" msgctxt "#30577" -msgid "Settings" -msgstr "Pengaturan" +msgid "" +msgstr "" msgctxt "#30578" msgid "Force SSL certificate verification" @@ -633,8 +633,8 @@ msgid "Autoplay suggested videos" msgstr "Putar otomatis video yang disarankan" msgctxt "#30583" -msgid "Automatic" -msgstr "Otomatis" +msgid "" +msgstr "" msgctxt "#30584" msgid "My Subscriptions (Filtered)" @@ -693,15 +693,15 @@ msgid "Updated: %s" msgstr "Diperbarui: %s" msgctxt "#30598" -msgid "Personal API keys enabled" -msgstr "Kunci API pribadi diaktifkan" +msgid "" +msgstr "" msgctxt "#30599" msgid "Failed to enable personal API keys. Missing: %s" msgstr "Gagal mengaktifkan kunci API pribadi. Tidak ada: %s" msgctxt "#30600" -msgid "Subtitles" +msgid "" msgstr "" msgctxt "#30601" @@ -761,8 +761,8 @@ msgid "" msgstr "" msgctxt "#30615" -msgid "Cancel" -msgstr "Batal" +msgid "" +msgstr "" msgctxt "#30616" msgid "" @@ -777,8 +777,8 @@ msgid "" msgstr "" msgctxt "#30619" -msgid "Port" -msgstr "Port" +msgid "" +msgstr "" msgctxt "#30620" msgid "Port %s already in use. Cannot start http server." @@ -821,8 +821,8 @@ msgid "IP whitelist (comma delimited)" msgstr "Daftar putih IP (dibatasi koma)" msgctxt "#30630" -msgid "Save" -msgstr "Simpan" +msgid "" +msgstr "" msgctxt "#30631" msgid "Successfully updated: %s" @@ -937,8 +937,8 @@ msgid "Enter a name for this user" msgstr "Masukkan nama untuk pengguna ini" msgctxt "#30659" -msgid "User is now '%s'" -msgstr "Pengguna sekarang adalah '%s'" +msgid "User is now \"%s\"" +msgstr "" msgctxt "#30660" msgid "Users" @@ -961,16 +961,16 @@ msgid "Switch user" msgstr "Ganti pengguna" msgctxt "#30665" -msgid "Switch to '%s' now?" -msgstr "Beralih ke '%s' sekarang?" +msgid "Switch to \"%s\" now?" +msgstr "" msgctxt "#30666" -msgid "%s removed" +msgid "\"%s\" removed" msgstr "" msgctxt "#30667" -msgid "Renamed '%s' to '%s'" -msgstr "Menamakan ulang '%s' ke '%s'" +msgid "Renamed \"%s\" to \"%s\"" +msgstr "" msgctxt "#30668" msgid "Play count minimum percent" @@ -1113,8 +1113,8 @@ msgid "Play with subtitles" msgstr "Bermain dengan takarir" msgctxt "#30703" -msgid "Are you sure?" -msgstr "Yakin?" +msgid "" +msgstr "" msgctxt "#30704" msgid "Use YouTube website urls with default player" @@ -1257,7 +1257,7 @@ msgid "" msgstr "" msgctxt "#30739" -msgid "" +msgid "Subscribers" msgstr "" msgctxt "#30740" @@ -1477,11 +1477,11 @@ msgid "Views count display colour" msgstr "" msgctxt "#30794" -msgid "Likes count display colour" +msgid "Subscriber/Likes count display colour" msgstr "" msgctxt "#30795" -msgid "Comments count display colour" +msgid "Videos/Comments count display colour" msgstr "" msgctxt "#30796" @@ -1580,6 +1580,167 @@ msgctxt "#30819" msgid "Play from start" msgstr "" +msgctxt "#30820" +msgid "Podcast" +msgstr "" + +#~ msgctxt "#30515" +#~ msgid "Auto-Remove from 'Watch Later'" +#~ msgstr "Hapus Otomatis dari 'Tonton Nanti'" + +#~ msgctxt "#30569" +#~ msgid "Are you sure you want to remove '%s' as your Watch Later list?" +#~ msgstr "Yakin ingin menghapus '%s' sebagai daftar Tonton Nanti?" + +#~ msgctxt "#30570" +#~ msgid "Are you sure you want to replace your current Watch Later list with '%s'?" +#~ msgstr "Yakin ingin mengganti daftar Tonton Nanti Anda saat ini dengan '%s'?" + +#~ msgctxt "#30573" +#~ msgid "Are you sure you want to remove '%s' as your History list?" +#~ msgstr "Yakin ingin menghapus '%s' sebagai daftar Riwayat Anda?" + +#~ msgctxt "#30574" +#~ msgid "Are you sure you want to replace your current History list with '%s'?" +#~ msgstr "Yakin ingin mengganti daftar Riwayat Anda saat ini dengan '%s'?" + +#~ msgctxt "#30659" +#~ msgid "User is now '%s'" +#~ msgstr "Pengguna sekarang adalah '%s'" + +#~ msgctxt "#30665" +#~ msgid "Switch to '%s' now?" +#~ msgstr "Beralih ke '%s' sekarang?" + +#~ msgctxt "#30667" +#~ msgid "Renamed '%s' to '%s'" +#~ msgstr "Menamakan ulang '%s' ke '%s'" + +# msgctxt "Addon Summary" +# msgid "Plugin for YouTube" +# msgstr "" +# msgctxt "Addon Description" +# msgid "YouTube is a one of the biggest video-sharing websites of the world." +# msgstr "" +# Kodion Settings +#~ msgctxt "#30000" +#~ msgid "General" +#~ msgstr "Umum" + +#~ msgctxt "#30031" +#~ msgid "Advanced" +#~ msgstr "Lanjutan" + +#~ msgctxt "#30108" +#~ msgid "Remove" +#~ msgstr "Hapus" + +#~ msgctxt "#30113" +#~ msgid "Rename" +#~ msgstr "Nama ulang" + +#~ msgctxt "#30118" +#~ msgid "Delete" +#~ msgstr "Hapus" + +# YouTube +# empty strings from id 30206 to 30499 +#~ msgctxt "#30500" +#~ msgid "Channels" +#~ msgstr "Saluran" + +#~ msgctxt "#30501" +#~ msgid "Playlists" +#~ msgstr "Daftarputar" + +#~ msgctxt "#30521" +#~ msgid "Select playlist" +#~ msgstr "Pilih daftar putar" + +#~ msgctxt "#30522" +#~ msgid "New playlist..." +#~ msgstr "Daftar putar baru..." + +#~ msgctxt "#30523" +#~ msgid "Language" +#~ msgstr "Bahasa" + +#~ msgctxt "#30531" +#~ msgid "Play all" +#~ msgstr "Putar semua" + +#~ msgctxt "#30532" +#~ msgid "Default" +#~ msgstr "Bawaan" + +#~ msgctxt "#30534" +#~ msgid "Shuffle" +#~ msgstr "Acak" + +#~ msgctxt "#30539" +#~ msgid "Live" +#~ msgstr "Langsung" + +#~ msgctxt "#30543" +#~ msgid "Refresh" +#~ msgstr "Segarkan" + +#~ msgctxt "#30548" +#~ msgid "More..." +#~ msgstr "Lebih..." + +#~ msgctxt "#30550" +#~ msgid "Region" +#~ msgstr "Wilayah" + +#~ msgctxt "#30560" +#~ msgid "Subtitle language" +#~ msgstr "Bahasa takarir" + +#~ msgctxt "#30561" +#~ msgid "None" +#~ msgstr "Nihil" + +#~ msgctxt "#30566" +#~ msgid "Prompt" +#~ msgstr "Perintah" + +#~ msgctxt "#30577" +#~ msgid "Settings" +#~ msgstr "Pengaturan" + +#~ msgctxt "#30583" +#~ msgid "Automatic" +#~ msgstr "Otomatis" + +#~ msgctxt "#30598" +#~ msgid "Personal API keys enabled" +#~ msgstr "Kunci API pribadi diaktifkan" + +#~ msgctxt "#30615" +#~ msgid "Cancel" +#~ msgstr "Batal" + +#~ msgctxt "#30619" +#~ msgid "Port" +#~ msgstr "Port" + +#~ msgctxt "#30630" +#~ msgid "Save" +#~ msgstr "Simpan" + +#~ msgctxt "#30703" +#~ msgid "Are you sure?" +#~ msgstr "Yakin?" + +#~ msgctxt "#30546" +#~ msgid "Please log in twice!" +#~ msgstr "Silakan masuk dua kali!" + +#~ msgctxt "#30547" +#~ msgid "You must enable two applications so that YouTube is functioning properly." +#~ msgstr "Anda harus mengaktifkan dua aplikasi agar YouTube berfungsi dengan baik." + #~ msgctxt "#30001" #~ msgid "Username" #~ msgstr "Nama pengguna" diff --git a/plugin.video.youtube/resources/language/resource.language.is_is/strings.po b/plugin.video.youtube/resources/language/resource.language.is_is/strings.po index fa823c8ea7..e8895244f0 100644 --- a/plugin.video.youtube/resources/language/resource.language.is_is/strings.po +++ b/plugin.video.youtube/resources/language/resource.language.is_is/strings.po @@ -37,7 +37,7 @@ msgstr "" # msgstr "" # Kodion Settings msgctxt "#30000" -msgid "General" +msgid "" msgstr "" msgctxt "#30001" @@ -151,7 +151,7 @@ msgid "Configure %s?" msgstr "" msgctxt "#30031" -msgid "Advanced" +msgid "" msgstr "" msgctxt "#30032" @@ -217,7 +217,7 @@ msgid "Watch Later" msgstr "" msgctxt "#30108" -msgid "Remove" +msgid "" msgstr "" msgctxt "#30109" @@ -237,7 +237,7 @@ msgid "Sign Out" msgstr "" msgctxt "#30113" -msgid "Rename" +msgid "" msgstr "" msgctxt "#30114" @@ -257,7 +257,7 @@ msgid "Remove \"%s\"?" msgstr "" msgctxt "#30118" -msgid "Delete" +msgid "" msgstr "" msgctxt "#30119" @@ -301,11 +301,11 @@ msgstr "" # YouTube # empty strings from id 30206 to 30499 msgctxt "#30500" -msgid "Channels" +msgid "" msgstr "" msgctxt "#30501" -msgid "Playlists" +msgid "" msgstr "" msgctxt "#30502" @@ -361,7 +361,7 @@ msgid "Related Videos" msgstr "" msgctxt "#30515" -msgid "Auto-Remove from 'Watch Later'" +msgid "Auto-Remove from Watch Later" msgstr "" msgctxt "#30516" @@ -385,15 +385,15 @@ msgid "Add to..." msgstr "" msgctxt "#30521" -msgid "Select playlist" +msgid "" msgstr "" msgctxt "#30522" -msgid "New playlist..." +msgid "" msgstr "" msgctxt "#30523" -msgid "Language" +msgid "" msgstr "" msgctxt "#30524" @@ -425,11 +425,11 @@ msgid "I dislike this" msgstr "" msgctxt "#30531" -msgid "Play all" +msgid "" msgstr "" msgctxt "#30532" -msgid "Default" +msgid "" msgstr "" msgctxt "#30533" @@ -437,7 +437,7 @@ msgid "Reverse" msgstr "" msgctxt "#30534" -msgid "Shuffle" +msgid "" msgstr "" msgctxt "#30535" @@ -457,7 +457,7 @@ msgid "Disliked Videos" msgstr "" msgctxt "#30539" -msgid "Live" +msgid "" msgstr "" msgctxt "#30540" @@ -473,7 +473,7 @@ msgid "rtmpe streams are not supported" msgstr "" msgctxt "#30543" -msgid "Refresh" +msgid "" msgstr "" msgctxt "#30544" @@ -485,15 +485,15 @@ msgid "No further links found." msgstr "" msgctxt "#30546" -msgid "Please log in twice!" +msgid "Please complete all login prompts" msgstr "" msgctxt "#30547" -msgid "You must enable two applications so that YouTube is functioning properly." +msgid "You may be prompted to enable two applications so that YouTube is functioning properly." msgstr "" msgctxt "#30548" -msgid "More..." +msgid "" msgstr "" msgctxt "#30549" @@ -501,7 +501,7 @@ msgid "No videos streams found" msgstr "" msgctxt "#30550" -msgid "Region" +msgid "" msgstr "" msgctxt "#30551" @@ -541,15 +541,15 @@ msgid "Delete settings.xml" msgstr "" msgctxt "#30560" -msgid "Subtitle language" +msgid "" msgstr "" msgctxt "#30561" -msgid "None" +msgid "" msgstr "" msgctxt "#30562" -msgid "" +msgid "View all" msgstr "" msgctxt "#30563" @@ -565,7 +565,7 @@ msgid "" msgstr "" msgctxt "#30566" -msgid "Prompt" +msgid "" msgstr "" msgctxt "#30567" @@ -577,11 +577,11 @@ msgid "Remove as Watch Later" msgstr "" msgctxt "#30569" -msgid "Are you sure you want to remove '%s' as your Watch Later list?" +msgid "Are you sure you want to remove \"%s\" as your Watch Later list?" msgstr "" msgctxt "#30570" -msgid "Are you sure you want to replace your current Watch Later list with '%s'?" +msgid "Are you sure you want to replace your current Watch Later list with \"%s\"?" msgstr "" msgctxt "#30571" @@ -593,11 +593,11 @@ msgid "Remove as History" msgstr "" msgctxt "#30573" -msgid "Are you sure you want to remove '%s' as your History list?" +msgid "Are you sure you want to remove \"%s\" as your History list?" msgstr "" msgctxt "#30574" -msgid "Are you sure you want to replace your current History list with '%s'?" +msgid "Are you sure you want to replace your current History list with \"%s\"?" msgstr "" msgctxt "#30575" @@ -609,7 +609,7 @@ msgid "Failed" msgstr "" msgctxt "#30577" -msgid "Settings" +msgid "" msgstr "" msgctxt "#30578" @@ -633,7 +633,7 @@ msgid "Autoplay suggested videos" msgstr "" msgctxt "#30583" -msgid "Automatic" +msgid "" msgstr "" msgctxt "#30584" @@ -693,7 +693,7 @@ msgid "Updated: %s" msgstr "" msgctxt "#30598" -msgid "Personal API keys enabled" +msgid "" msgstr "" msgctxt "#30599" @@ -701,7 +701,7 @@ msgid "Failed to enable personal API keys. Missing: %s" msgstr "" msgctxt "#30600" -msgid "Subtitles" +msgid "" msgstr "" msgctxt "#30601" @@ -761,7 +761,7 @@ msgid "" msgstr "" msgctxt "#30615" -msgid "Cancel" +msgid "" msgstr "" msgctxt "#30616" @@ -777,7 +777,7 @@ msgid "" msgstr "" msgctxt "#30619" -msgid "Port" +msgid "" msgstr "" msgctxt "#30620" @@ -821,7 +821,7 @@ msgid "IP whitelist (comma delimited)" msgstr "" msgctxt "#30630" -msgid "Save" +msgid "" msgstr "" msgctxt "#30631" @@ -937,7 +937,7 @@ msgid "Enter a name for this user" msgstr "" msgctxt "#30659" -msgid "User is now '%s'" +msgid "User is now \"%s\"" msgstr "" msgctxt "#30660" @@ -961,15 +961,15 @@ msgid "Switch user" msgstr "" msgctxt "#30665" -msgid "Switch to '%s' now?" +msgid "Switch to \"%s\" now?" msgstr "" msgctxt "#30666" -msgid "%s removed" +msgid "\"%s\" removed" msgstr "" msgctxt "#30667" -msgid "Renamed '%s' to '%s'" +msgid "Renamed \"%s\" to \"%s\"" msgstr "" msgctxt "#30668" @@ -1113,7 +1113,7 @@ msgid "Play with subtitles" msgstr "" msgctxt "#30703" -msgid "Are you sure?" +msgid "" msgstr "" msgctxt "#30704" @@ -1257,7 +1257,7 @@ msgid "" msgstr "" msgctxt "#30739" -msgid "" +msgid "Subscribers" msgstr "" msgctxt "#30740" @@ -1477,11 +1477,11 @@ msgid "Views count display colour" msgstr "" msgctxt "#30794" -msgid "Likes count display colour" +msgid "Subscriber/Likes count display colour" msgstr "" msgctxt "#30795" -msgid "Comments count display colour" +msgid "Videos/Comments count display colour" msgstr "" msgctxt "#30796" @@ -1579,3 +1579,7 @@ msgstr "" msgctxt "#30819" msgid "Play from start" msgstr "" + +msgctxt "#30820" +msgid "Podcast" +msgstr "" diff --git a/plugin.video.youtube/resources/language/resource.language.it_it/strings.po b/plugin.video.youtube/resources/language/resource.language.it_it/strings.po index 3fa5cc0ab8..88d1b102ac 100644 --- a/plugin.video.youtube/resources/language/resource.language.it_it/strings.po +++ b/plugin.video.youtube/resources/language/resource.language.it_it/strings.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: XBMC-Addons\n" "Report-Msgid-Bugs-To: translations@kodi.tv\n" "POT-Creation-Date: 2015-09-21 11:01+0000\n" -"PO-Revision-Date: 2024-08-05 00:28+0000\n" +"PO-Revision-Date: 2024-11-08 16:39+0000\n" "Last-Translator: Massimo Pissarello \n" "Language-Team: Italian \n" "Language: it_it\n" @@ -16,7 +16,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 5.6.2\n" +"X-Generator: Weblate 5.8.2\n" msgctxt "Addon Summary" msgid "Plugin for YouTube" @@ -32,15 +32,14 @@ msgstr "Questo plugin non è approvato da Google" # msgctxt "Addon Summary" # msgid "Plugin for YouTube" -# msgstr "Plugin per YouTube" +# msgstr "" # msgctxt "Addon Description" # msgid "YouTube is a one of the biggest video-sharing websites of the world." -# msgstr "YouTube è uno dei siti di video-sharing più grandi del mondo" # msgstr "" # Kodion Settings msgctxt "#30000" -msgid "General" -msgstr "Generale" +msgid "" +msgstr " " msgctxt "#30001" msgid "" @@ -153,8 +152,8 @@ msgid "Configure %s?" msgstr "Configurare %s?" msgctxt "#30031" -msgid "Advanced" -msgstr "Avanzate" +msgid "" +msgstr " " msgctxt "#30032" msgid "View: TV Shows" @@ -219,8 +218,8 @@ msgid "Watch Later" msgstr "Guarda più tardi" msgctxt "#30108" -msgid "Remove" -msgstr "Rimuovi" +msgid "" +msgstr " " msgctxt "#30109" msgid "" @@ -239,8 +238,8 @@ msgid "Sign Out" msgstr "Disconnessione" msgctxt "#30113" -msgid "Rename" -msgstr "Rinomina" +msgid "" +msgstr " " msgctxt "#30114" msgid "Confirm delete" @@ -259,8 +258,8 @@ msgid "Remove \"%s\"?" msgstr "Rimuovere \"%s\"?" msgctxt "#30118" -msgid "Delete" -msgstr "Elimina" +msgid "" +msgstr " " msgctxt "#30119" msgid "Please wait..." @@ -303,12 +302,12 @@ msgstr " " # YouTube # empty strings from id 30206 to 30499 msgctxt "#30500" -msgid "Channels" -msgstr "Canali" +msgid "" +msgstr " " msgctxt "#30501" -msgid "Playlists" -msgstr "Playlist" +msgid "" +msgstr " " msgctxt "#30502" msgid "Go to %s" @@ -363,8 +362,8 @@ msgid "Related Videos" msgstr "Video correlati" msgctxt "#30515" -msgid "Auto-Remove from 'Watch Later'" -msgstr "Rimozione automatica da Guarda più tardi" +msgid "Auto-Remove from Watch Later" +msgstr "Rimuovi automaticamente da Guarda più tardi" msgctxt "#30516" msgid "Folders" @@ -387,16 +386,16 @@ msgid "Add to..." msgstr "Aggiungi a..." msgctxt "#30521" -msgid "Select playlist" -msgstr "Seleziona playlist" +msgid "" +msgstr " " msgctxt "#30522" -msgid "New playlist..." -msgstr "Nuova playlist..." +msgid "" +msgstr " " msgctxt "#30523" -msgid "Language" -msgstr "Lingua" +msgid "" +msgstr " " msgctxt "#30524" msgid "Select language" @@ -427,20 +426,20 @@ msgid "I dislike this" msgstr "Non mi piace" msgctxt "#30531" -msgid "Play all" -msgstr "Riproduci tutti" +msgid "" +msgstr " " msgctxt "#30532" -msgid "Default" -msgstr "Predefinito" +msgid "" +msgstr " " msgctxt "#30533" msgid "Reverse" msgstr "Inversione" msgctxt "#30534" -msgid "Shuffle" -msgstr "Mescola" +msgid "" +msgstr " " msgctxt "#30535" msgid "Select the order of the playlist" @@ -459,8 +458,8 @@ msgid "Disliked Videos" msgstr "Video non piaciuti" msgctxt "#30539" -msgid "Live" -msgstr "Live" +msgid "" +msgstr " " msgctxt "#30540" msgid "Play with..." @@ -475,8 +474,8 @@ msgid "rtmpe streams are not supported" msgstr "i flussi RTMPE non sono supportati" msgctxt "#30543" -msgid "Refresh" -msgstr "Aggiorna" +msgid "" +msgstr " " msgctxt "#30544" msgid "More Links from the description" @@ -487,24 +486,24 @@ msgid "No further links found." msgstr "Nessun ulteriore collegamento trovato." msgctxt "#30546" -msgid "Please log in twice!" -msgstr "Accedi due volte!" +msgid "Please complete all login prompts" +msgstr "Completa tutte le richieste di accesso" msgctxt "#30547" -msgid "You must enable two applications so that YouTube is functioning properly." -msgstr "Devi abilitare due applicazioni in modo che YouTube funzioni correttamente." +msgid "You may be prompted to enable two applications so that YouTube is functioning properly." +msgstr "Potrebbe esserti richiesto di abilitare due applicazioni affinché YouTube funzioni correttamente." msgctxt "#30548" -msgid "More..." -msgstr "Più..." +msgid "" +msgstr " " msgctxt "#30549" msgid "No videos streams found" msgstr "Nessun flusso video trovato" msgctxt "#30550" -msgid "Region" -msgstr "Regione" +msgid "" +msgstr " " msgctxt "#30551" msgid "Recommendations" @@ -543,17 +542,17 @@ msgid "Delete settings.xml" msgstr "Elimina settings.xml" msgctxt "#30560" -msgid "Subtitle language" -msgstr "Lingua dei sottotitoli" +msgid "" +msgstr " " msgctxt "#30561" -msgid "None" -msgstr "Nessuno" - -msgctxt "#30562" msgid "" msgstr " " +msgctxt "#30562" +msgid "View all" +msgstr "Visualizza tutto" + msgctxt "#30563" msgid "" msgstr " " @@ -567,8 +566,8 @@ msgid "" msgstr " " msgctxt "#30566" -msgid "Prompt" -msgstr "Richiesta" +msgid "" +msgstr " " msgctxt "#30567" msgid "Set as Watch Later" @@ -579,12 +578,12 @@ msgid "Remove as Watch Later" msgstr "Rimuovi da Guarda più tardi" msgctxt "#30569" -msgid "Are you sure you want to remove '%s' as your Watch Later list?" -msgstr "Sei sicuro di voler rimuovere '%s' dall'elenco Guarda più tardi?" +msgid "Are you sure you want to remove \"%s\" as your Watch Later list?" +msgstr "Vuoi davvero rimuovere \"%s\" dall'elenco Guarda più tardi?" msgctxt "#30570" -msgid "Are you sure you want to replace your current Watch Later list with '%s'?" -msgstr "Sei sicuro di voler sostituire l'attuale elenco Guarda più tardi con l'elenco '%s'?" +msgid "Are you sure you want to replace your current Watch Later list with \"%s\"?" +msgstr "Vuoi davvero sostituire l'elenco Guarda più tardi con \"%s\"?" msgctxt "#30571" msgid "Set as History" @@ -595,12 +594,12 @@ msgid "Remove as History" msgstr "Rimuovi come cronologia" msgctxt "#30573" -msgid "Are you sure you want to remove '%s' as your History list?" -msgstr "Sei sicuro di voler rimuovere '%s' dal tuo elenco cronologia?" +msgid "Are you sure you want to remove \"%s\" as your History list?" +msgstr "Vuoi davvero rimuovere \"%s\" dall'elenco Cronologia?" msgctxt "#30574" -msgid "Are you sure you want to replace your current History list with '%s'?" -msgstr "Sei sicuro di voler sostituire l'attuale elenco cronologia con l'elenco '%s'?" +msgid "Are you sure you want to replace your current History list with \"%s\"?" +msgstr "Vuoi davvero sostituire l'elenco Cronologia corrente con \"%s\"?" msgctxt "#30575" msgid "Succeeded" @@ -611,8 +610,8 @@ msgid "Failed" msgstr "Operazione fallita" msgctxt "#30577" -msgid "Settings" -msgstr "Impostazioni" +msgid "" +msgstr " " msgctxt "#30578" msgid "Force SSL certificate verification" @@ -635,8 +634,8 @@ msgid "Autoplay suggested videos" msgstr "Riproduci automaticamente i video suggeriti" msgctxt "#30583" -msgid "Automatic" -msgstr "Automatico" +msgid "" +msgstr " " msgctxt "#30584" msgid "My Subscriptions (Filtered)" @@ -695,16 +694,16 @@ msgid "Updated: %s" msgstr "Aggiornato: %s" msgctxt "#30598" -msgid "Personal API keys enabled" -msgstr "Chiavi API personali abilitate" +msgid "" +msgstr " " msgctxt "#30599" msgid "Failed to enable personal API keys. Missing: %s" msgstr "Impossibile abilitare chiavi API personali. Manca: %s" msgctxt "#30600" -msgid "Subtitles" -msgstr "Sottotitoli" +msgid "" +msgstr " " msgctxt "#30601" msgid "%s with Original/%s fallback" @@ -763,8 +762,8 @@ msgid "" msgstr " " msgctxt "#30615" -msgid "Cancel" -msgstr "Annulla" +msgid "" +msgstr " " msgctxt "#30616" msgid "" @@ -779,8 +778,8 @@ msgid "" msgstr " " msgctxt "#30619" -msgid "Port" -msgstr "Porta" +msgid "" +msgstr " " msgctxt "#30620" msgid "Port %s already in use. Cannot start http server." @@ -823,8 +822,8 @@ msgid "IP whitelist (comma delimited)" msgstr "Whitelist IP (delimitati da virgole)" msgctxt "#30630" -msgid "Save" -msgstr "Salva" +msgid "" +msgstr " " msgctxt "#30631" msgid "Successfully updated: %s" @@ -939,8 +938,8 @@ msgid "Enter a name for this user" msgstr "Inserisci nome utente" msgctxt "#30659" -msgid "User is now '%s'" -msgstr "L'utente ora è '%s'" +msgid "User is now \"%s\"" +msgstr "L'utente adesso è \"%s\"" msgctxt "#30660" msgid "Users" @@ -963,16 +962,16 @@ msgid "Switch user" msgstr "Cambia utente" msgctxt "#30665" -msgid "Switch to '%s' now?" -msgstr "Cambiare subito a '%s'?" +msgid "Switch to \"%s\" now?" +msgstr "Vuoi passare a \"%s\" adesso?" msgctxt "#30666" -msgid "%s removed" -msgstr "%s rimosso" +msgid "\"%s\" removed" +msgstr "\"%s\" rimosso" msgctxt "#30667" -msgid "Renamed '%s' to '%s'" -msgstr "Rinominato '%s' in '%s'" +msgid "Renamed \"%s\" to \"%s\"" +msgstr "Rinominato \"%s\" in \"%s\"" msgctxt "#30668" msgid "Play count minimum percent" @@ -1115,8 +1114,8 @@ msgid "Play with subtitles" msgstr "Riproduci con sottotitoli" msgctxt "#30703" -msgid "Are you sure?" -msgstr "Sei sicuro?" +msgid "" +msgstr " " msgctxt "#30704" msgid "Use YouTube website urls with default player" @@ -1259,8 +1258,8 @@ msgid "" msgstr " " msgctxt "#30739" -msgid "" -msgstr " " +msgid "Subscribers" +msgstr "Iscritti" msgctxt "#30740" msgid "HLS" @@ -1476,15 +1475,15 @@ msgstr "8K/60 fps, HDR, usando AV1 | Dispositivo o PC moderno con funzionalità msgctxt "#30793" msgid "Views count display colour" -msgstr "Colore di visualizzazione del conteggio visualizzazioni" +msgstr "Colore di visualizzazione conteggio Visualizzazioni" msgctxt "#30794" -msgid "Likes count display colour" -msgstr "Colore di visualizzazione del conteggio Mi piace" +msgid "Subscriber/Likes count display colour" +msgstr "Colore di visualizzazione conteggio Iscritti/Mi piace" msgctxt "#30795" -msgid "Comments count display colour" -msgstr "Colore di visualizzazione del conteggio commenti" +msgid "Videos/Comments count display colour" +msgstr "Colore di visualizzazione conteggio Video/Commenti" msgctxt "#30796" msgid "1080p/60 fps | Raspberry Pi 4, or similar" @@ -1582,6 +1581,200 @@ msgctxt "#30819" msgid "Play from start" msgstr "Riproduci dall'inizio" +msgctxt "#30820" +msgid "Podcast" +msgstr "Podcast" + +#~ msgctxt "#30515" +#~ msgid "Auto-Remove from 'Watch Later'" +#~ msgstr "Rimozione automatica da Guarda più tardi" + +#~ msgctxt "#30569" +#~ msgid "Are you sure you want to remove '%s' as your Watch Later list?" +#~ msgstr "Sei sicuro di voler rimuovere '%s' dall'elenco Guarda più tardi?" + +#~ msgctxt "#30570" +#~ msgid "Are you sure you want to replace your current Watch Later list with '%s'?" +#~ msgstr "Sei sicuro di voler sostituire l'attuale elenco Guarda più tardi con l'elenco '%s'?" + +#~ msgctxt "#30573" +#~ msgid "Are you sure you want to remove '%s' as your History list?" +#~ msgstr "Sei sicuro di voler rimuovere '%s' dal tuo elenco cronologia?" + +#~ msgctxt "#30574" +#~ msgid "Are you sure you want to replace your current History list with '%s'?" +#~ msgstr "Sei sicuro di voler sostituire l'attuale elenco cronologia con l'elenco '%s'?" + +#~ msgctxt "#30659" +#~ msgid "User is now '%s'" +#~ msgstr "L'utente ora è '%s'" + +#~ msgctxt "#30665" +#~ msgid "Switch to '%s' now?" +#~ msgstr "Cambiare subito a '%s'?" + +#~ msgctxt "#30666" +#~ msgid "%s removed" +#~ msgstr "%s rimosso" + +#~ msgctxt "#30667" +#~ msgid "Renamed '%s' to '%s'" +#~ msgstr "Rinominato '%s' in '%s'" + +# msgctxt "Addon Summary" +# msgid "Plugin for YouTube" +# msgstr "Plugin per YouTube" +# msgctxt "Addon Description" +# msgid "YouTube is a one of the biggest video-sharing websites of the world." +# msgstr "YouTube è uno dei siti di video-sharing più grandi del mondo" +# msgstr "" +# Kodion Settings +#~ msgctxt "#30000" +#~ msgid "General" +#~ msgstr "Generale" + +#~ msgctxt "#30031" +#~ msgid "Advanced" +#~ msgstr "Avanzate" + +#~ msgctxt "#30108" +#~ msgid "Remove" +#~ msgstr "Rimuovi" + +#~ msgctxt "#30113" +#~ msgid "Rename" +#~ msgstr "Rinomina" + +#~ msgctxt "#30118" +#~ msgid "Delete" +#~ msgstr "Elimina" + +# YouTube +# empty strings from id 30206 to 30499 +#~ msgctxt "#30500" +#~ msgid "Channels" +#~ msgstr "Canali" + +#~ msgctxt "#30501" +#~ msgid "Playlists" +#~ msgstr "Playlist" + +#~ msgctxt "#30521" +#~ msgid "Select playlist" +#~ msgstr "Seleziona playlist" + +#~ msgctxt "#30522" +#~ msgid "New playlist..." +#~ msgstr "Nuova playlist..." + +#~ msgctxt "#30523" +#~ msgid "Language" +#~ msgstr "Lingua" + +#~ msgctxt "#30531" +#~ msgid "Play all" +#~ msgstr "Riproduci tutti" + +#~ msgctxt "#30532" +#~ msgid "Default" +#~ msgstr "Predefinito" + +#~ msgctxt "#30534" +#~ msgid "Shuffle" +#~ msgstr "Mescola" + +#~ msgctxt "#30539" +#~ msgid "Live" +#~ msgstr "Live" + +#~ msgctxt "#30543" +#~ msgid "Refresh" +#~ msgstr "Aggiorna" + +#~ msgctxt "#30548" +#~ msgid "More..." +#~ msgstr "Più..." + +#~ msgctxt "#30550" +#~ msgid "Region" +#~ msgstr "Regione" + +#~ msgctxt "#30560" +#~ msgid "Subtitle language" +#~ msgstr "Lingua dei sottotitoli" + +#~ msgctxt "#30561" +#~ msgid "None" +#~ msgstr "Nessuno" + +#~ msgctxt "#30566" +#~ msgid "Prompt" +#~ msgstr "Richiesta" + +#~ msgctxt "#30577" +#~ msgid "Settings" +#~ msgstr "Impostazioni" + +#~ msgctxt "#30583" +#~ msgid "Automatic" +#~ msgstr "Automatico" + +#~ msgctxt "#30598" +#~ msgid "Personal API keys enabled" +#~ msgstr "Chiavi API personali abilitate" + +#~ msgctxt "#30600" +#~ msgid "Subtitles" +#~ msgstr "Sottotitoli" + +#~ msgctxt "#30615" +#~ msgid "Cancel" +#~ msgstr "Annulla" + +#~ msgctxt "#30619" +#~ msgid "Port" +#~ msgstr "Porta" + +#~ msgctxt "#30630" +#~ msgid "Save" +#~ msgstr "Salva" + +#~ msgctxt "#30703" +#~ msgid "Are you sure?" +#~ msgstr "Sei sicuro?" + +#~ msgctxt "#30737" +#~ msgid "Episodes" +#~ msgstr "Episodi" + +#~ msgctxt "#30738" +#~ msgid "Videos" +#~ msgstr "Video" + +#~ msgctxt "#30562" +#~ msgid "" +#~ msgstr " " + +#~ msgctxt "#30739" +#~ msgid "" +#~ msgstr " " + +#~ msgctxt "#30794" +#~ msgid "Likes count display colour" +#~ msgstr "Colore di visualizzazione del conteggio Mi piace" + +#~ msgctxt "#30795" +#~ msgid "Comments count display colour" +#~ msgstr "Colore di visualizzazione del conteggio commenti" + +#~ msgctxt "#30546" +#~ msgid "Please log in twice!" +#~ msgstr "Accedi due volte!" + +#~ msgctxt "#30547" +#~ msgid "You must enable two applications so that YouTube is functioning properly." +#~ msgstr "Devi abilitare due applicazioni in modo che YouTube funzioni correttamente." + #~ msgctxt "#30001" #~ msgid "Username" #~ msgstr "Nome utente" diff --git a/plugin.video.youtube/resources/language/resource.language.ja_jp/strings.po b/plugin.video.youtube/resources/language/resource.language.ja_jp/strings.po index abca7d095f..bb9f20ec02 100644 --- a/plugin.video.youtube/resources/language/resource.language.ja_jp/strings.po +++ b/plugin.video.youtube/resources/language/resource.language.ja_jp/strings.po @@ -37,7 +37,7 @@ msgstr "" # msgstr "" # Kodion Settings msgctxt "#30000" -msgid "General" +msgid "" msgstr "" msgctxt "#30001" @@ -151,7 +151,7 @@ msgid "Configure %s?" msgstr "" msgctxt "#30031" -msgid "Advanced" +msgid "" msgstr "" msgctxt "#30032" @@ -217,7 +217,7 @@ msgid "Watch Later" msgstr "" msgctxt "#30108" -msgid "Remove" +msgid "" msgstr "" msgctxt "#30109" @@ -237,7 +237,7 @@ msgid "Sign Out" msgstr "" msgctxt "#30113" -msgid "Rename" +msgid "" msgstr "" msgctxt "#30114" @@ -257,7 +257,7 @@ msgid "Remove \"%s\"?" msgstr "" msgctxt "#30118" -msgid "Delete" +msgid "" msgstr "" msgctxt "#30119" @@ -301,11 +301,11 @@ msgstr "" # YouTube # empty strings from id 30206 to 30499 msgctxt "#30500" -msgid "Channels" +msgid "" msgstr "" msgctxt "#30501" -msgid "Playlists" +msgid "" msgstr "" msgctxt "#30502" @@ -361,7 +361,7 @@ msgid "Related Videos" msgstr "" msgctxt "#30515" -msgid "Auto-Remove from 'Watch Later'" +msgid "Auto-Remove from Watch Later" msgstr "" msgctxt "#30516" @@ -385,15 +385,15 @@ msgid "Add to..." msgstr "" msgctxt "#30521" -msgid "Select playlist" +msgid "" msgstr "" msgctxt "#30522" -msgid "New playlist..." +msgid "" msgstr "" msgctxt "#30523" -msgid "Language" +msgid "" msgstr "" msgctxt "#30524" @@ -425,11 +425,11 @@ msgid "I dislike this" msgstr "" msgctxt "#30531" -msgid "Play all" +msgid "" msgstr "" msgctxt "#30532" -msgid "Default" +msgid "" msgstr "" msgctxt "#30533" @@ -437,7 +437,7 @@ msgid "Reverse" msgstr "" msgctxt "#30534" -msgid "Shuffle" +msgid "" msgstr "" msgctxt "#30535" @@ -457,7 +457,7 @@ msgid "Disliked Videos" msgstr "" msgctxt "#30539" -msgid "Live" +msgid "" msgstr "" msgctxt "#30540" @@ -473,7 +473,7 @@ msgid "rtmpe streams are not supported" msgstr "" msgctxt "#30543" -msgid "Refresh" +msgid "" msgstr "" msgctxt "#30544" @@ -485,15 +485,15 @@ msgid "No further links found." msgstr "" msgctxt "#30546" -msgid "Please log in twice!" +msgid "Please complete all login prompts" msgstr "" msgctxt "#30547" -msgid "You must enable two applications so that YouTube is functioning properly." +msgid "You may be prompted to enable two applications so that YouTube is functioning properly." msgstr "" msgctxt "#30548" -msgid "More..." +msgid "" msgstr "" msgctxt "#30549" @@ -501,7 +501,7 @@ msgid "No videos streams found" msgstr "" msgctxt "#30550" -msgid "Region" +msgid "" msgstr "" msgctxt "#30551" @@ -541,15 +541,15 @@ msgid "Delete settings.xml" msgstr "" msgctxt "#30560" -msgid "Subtitle language" +msgid "" msgstr "" msgctxt "#30561" -msgid "None" +msgid "" msgstr "" msgctxt "#30562" -msgid "" +msgid "View all" msgstr "" msgctxt "#30563" @@ -565,7 +565,7 @@ msgid "" msgstr "" msgctxt "#30566" -msgid "Prompt" +msgid "" msgstr "" msgctxt "#30567" @@ -577,11 +577,11 @@ msgid "Remove as Watch Later" msgstr "" msgctxt "#30569" -msgid "Are you sure you want to remove '%s' as your Watch Later list?" +msgid "Are you sure you want to remove \"%s\" as your Watch Later list?" msgstr "" msgctxt "#30570" -msgid "Are you sure you want to replace your current Watch Later list with '%s'?" +msgid "Are you sure you want to replace your current Watch Later list with \"%s\"?" msgstr "" msgctxt "#30571" @@ -593,11 +593,11 @@ msgid "Remove as History" msgstr "" msgctxt "#30573" -msgid "Are you sure you want to remove '%s' as your History list?" +msgid "Are you sure you want to remove \"%s\" as your History list?" msgstr "" msgctxt "#30574" -msgid "Are you sure you want to replace your current History list with '%s'?" +msgid "Are you sure you want to replace your current History list with \"%s\"?" msgstr "" msgctxt "#30575" @@ -609,7 +609,7 @@ msgid "Failed" msgstr "" msgctxt "#30577" -msgid "Settings" +msgid "" msgstr "" msgctxt "#30578" @@ -633,7 +633,7 @@ msgid "Autoplay suggested videos" msgstr "" msgctxt "#30583" -msgid "Automatic" +msgid "" msgstr "" msgctxt "#30584" @@ -693,7 +693,7 @@ msgid "Updated: %s" msgstr "" msgctxt "#30598" -msgid "Personal API keys enabled" +msgid "" msgstr "" msgctxt "#30599" @@ -701,7 +701,7 @@ msgid "Failed to enable personal API keys. Missing: %s" msgstr "" msgctxt "#30600" -msgid "Subtitles" +msgid "" msgstr "" msgctxt "#30601" @@ -761,7 +761,7 @@ msgid "" msgstr "" msgctxt "#30615" -msgid "Cancel" +msgid "" msgstr "" msgctxt "#30616" @@ -777,7 +777,7 @@ msgid "" msgstr "" msgctxt "#30619" -msgid "Port" +msgid "" msgstr "" msgctxt "#30620" @@ -821,7 +821,7 @@ msgid "IP whitelist (comma delimited)" msgstr "" msgctxt "#30630" -msgid "Save" +msgid "" msgstr "" msgctxt "#30631" @@ -937,7 +937,7 @@ msgid "Enter a name for this user" msgstr "" msgctxt "#30659" -msgid "User is now '%s'" +msgid "User is now \"%s\"" msgstr "" msgctxt "#30660" @@ -961,15 +961,15 @@ msgid "Switch user" msgstr "" msgctxt "#30665" -msgid "Switch to '%s' now?" +msgid "Switch to \"%s\" now?" msgstr "" msgctxt "#30666" -msgid "%s removed" +msgid "\"%s\" removed" msgstr "" msgctxt "#30667" -msgid "Renamed '%s' to '%s'" +msgid "Renamed \"%s\" to \"%s\"" msgstr "" msgctxt "#30668" @@ -1113,7 +1113,7 @@ msgid "Play with subtitles" msgstr "" msgctxt "#30703" -msgid "Are you sure?" +msgid "" msgstr "" msgctxt "#30704" @@ -1257,7 +1257,7 @@ msgid "" msgstr "" msgctxt "#30739" -msgid "" +msgid "Subscribers" msgstr "" msgctxt "#30740" @@ -1477,11 +1477,11 @@ msgid "Views count display colour" msgstr "" msgctxt "#30794" -msgid "Likes count display colour" +msgid "Subscriber/Likes count display colour" msgstr "" msgctxt "#30795" -msgid "Comments count display colour" +msgid "Videos/Comments count display colour" msgstr "" msgctxt "#30796" @@ -1579,3 +1579,7 @@ msgstr "" msgctxt "#30819" msgid "Play from start" msgstr "" + +msgctxt "#30820" +msgid "Podcast" +msgstr "" diff --git a/plugin.video.youtube/resources/language/resource.language.kn_in/strings.po b/plugin.video.youtube/resources/language/resource.language.kn_in/strings.po index 4e1976167f..7927c81ef3 100644 --- a/plugin.video.youtube/resources/language/resource.language.kn_in/strings.po +++ b/plugin.video.youtube/resources/language/resource.language.kn_in/strings.po @@ -37,7 +37,7 @@ msgstr "" # msgstr "" # Kodion Settings msgctxt "#30000" -msgid "General" +msgid "" msgstr "" msgctxt "#30001" @@ -151,7 +151,7 @@ msgid "Configure %s?" msgstr "" msgctxt "#30031" -msgid "Advanced" +msgid "" msgstr "" msgctxt "#30032" @@ -217,7 +217,7 @@ msgid "Watch Later" msgstr "" msgctxt "#30108" -msgid "Remove" +msgid "" msgstr "" msgctxt "#30109" @@ -237,7 +237,7 @@ msgid "Sign Out" msgstr "" msgctxt "#30113" -msgid "Rename" +msgid "" msgstr "" msgctxt "#30114" @@ -257,7 +257,7 @@ msgid "Remove \"%s\"?" msgstr "" msgctxt "#30118" -msgid "Delete" +msgid "" msgstr "" msgctxt "#30119" @@ -301,11 +301,11 @@ msgstr "" # YouTube # empty strings from id 30206 to 30499 msgctxt "#30500" -msgid "Channels" +msgid "" msgstr "" msgctxt "#30501" -msgid "Playlists" +msgid "" msgstr "" msgctxt "#30502" @@ -361,7 +361,7 @@ msgid "Related Videos" msgstr "" msgctxt "#30515" -msgid "Auto-Remove from 'Watch Later'" +msgid "Auto-Remove from Watch Later" msgstr "" msgctxt "#30516" @@ -385,15 +385,15 @@ msgid "Add to..." msgstr "" msgctxt "#30521" -msgid "Select playlist" +msgid "" msgstr "" msgctxt "#30522" -msgid "New playlist..." +msgid "" msgstr "" msgctxt "#30523" -msgid "Language" +msgid "" msgstr "" msgctxt "#30524" @@ -425,11 +425,11 @@ msgid "I dislike this" msgstr "" msgctxt "#30531" -msgid "Play all" +msgid "" msgstr "" msgctxt "#30532" -msgid "Default" +msgid "" msgstr "" msgctxt "#30533" @@ -437,7 +437,7 @@ msgid "Reverse" msgstr "" msgctxt "#30534" -msgid "Shuffle" +msgid "" msgstr "" msgctxt "#30535" @@ -457,7 +457,7 @@ msgid "Disliked Videos" msgstr "" msgctxt "#30539" -msgid "Live" +msgid "" msgstr "" msgctxt "#30540" @@ -473,7 +473,7 @@ msgid "rtmpe streams are not supported" msgstr "" msgctxt "#30543" -msgid "Refresh" +msgid "" msgstr "" msgctxt "#30544" @@ -485,15 +485,15 @@ msgid "No further links found." msgstr "" msgctxt "#30546" -msgid "Please log in twice!" +msgid "Please complete all login prompts" msgstr "" msgctxt "#30547" -msgid "You must enable two applications so that YouTube is functioning properly." +msgid "You may be prompted to enable two applications so that YouTube is functioning properly." msgstr "" msgctxt "#30548" -msgid "More..." +msgid "" msgstr "" msgctxt "#30549" @@ -501,7 +501,7 @@ msgid "No videos streams found" msgstr "" msgctxt "#30550" -msgid "Region" +msgid "" msgstr "" msgctxt "#30551" @@ -541,15 +541,15 @@ msgid "Delete settings.xml" msgstr "" msgctxt "#30560" -msgid "Subtitle language" +msgid "" msgstr "" msgctxt "#30561" -msgid "None" +msgid "" msgstr "" msgctxt "#30562" -msgid "" +msgid "View all" msgstr "" msgctxt "#30563" @@ -565,7 +565,7 @@ msgid "" msgstr "" msgctxt "#30566" -msgid "Prompt" +msgid "" msgstr "" msgctxt "#30567" @@ -577,11 +577,11 @@ msgid "Remove as Watch Later" msgstr "" msgctxt "#30569" -msgid "Are you sure you want to remove '%s' as your Watch Later list?" +msgid "Are you sure you want to remove \"%s\" as your Watch Later list?" msgstr "" msgctxt "#30570" -msgid "Are you sure you want to replace your current Watch Later list with '%s'?" +msgid "Are you sure you want to replace your current Watch Later list with \"%s\"?" msgstr "" msgctxt "#30571" @@ -593,11 +593,11 @@ msgid "Remove as History" msgstr "" msgctxt "#30573" -msgid "Are you sure you want to remove '%s' as your History list?" +msgid "Are you sure you want to remove \"%s\" as your History list?" msgstr "" msgctxt "#30574" -msgid "Are you sure you want to replace your current History list with '%s'?" +msgid "Are you sure you want to replace your current History list with \"%s\"?" msgstr "" msgctxt "#30575" @@ -609,7 +609,7 @@ msgid "Failed" msgstr "" msgctxt "#30577" -msgid "Settings" +msgid "" msgstr "" msgctxt "#30578" @@ -633,7 +633,7 @@ msgid "Autoplay suggested videos" msgstr "" msgctxt "#30583" -msgid "Automatic" +msgid "" msgstr "" msgctxt "#30584" @@ -693,7 +693,7 @@ msgid "Updated: %s" msgstr "" msgctxt "#30598" -msgid "Personal API keys enabled" +msgid "" msgstr "" msgctxt "#30599" @@ -701,7 +701,7 @@ msgid "Failed to enable personal API keys. Missing: %s" msgstr "" msgctxt "#30600" -msgid "Subtitles" +msgid "" msgstr "" msgctxt "#30601" @@ -761,7 +761,7 @@ msgid "" msgstr "" msgctxt "#30615" -msgid "Cancel" +msgid "" msgstr "" msgctxt "#30616" @@ -777,7 +777,7 @@ msgid "" msgstr "" msgctxt "#30619" -msgid "Port" +msgid "" msgstr "" msgctxt "#30620" @@ -821,7 +821,7 @@ msgid "IP whitelist (comma delimited)" msgstr "" msgctxt "#30630" -msgid "Save" +msgid "" msgstr "" msgctxt "#30631" @@ -937,7 +937,7 @@ msgid "Enter a name for this user" msgstr "" msgctxt "#30659" -msgid "User is now '%s'" +msgid "User is now \"%s\"" msgstr "" msgctxt "#30660" @@ -961,15 +961,15 @@ msgid "Switch user" msgstr "" msgctxt "#30665" -msgid "Switch to '%s' now?" +msgid "Switch to \"%s\" now?" msgstr "" msgctxt "#30666" -msgid "%s removed" +msgid "\"%s\" removed" msgstr "" msgctxt "#30667" -msgid "Renamed '%s' to '%s'" +msgid "Renamed \"%s\" to \"%s\"" msgstr "" msgctxt "#30668" @@ -1113,7 +1113,7 @@ msgid "Play with subtitles" msgstr "" msgctxt "#30703" -msgid "Are you sure?" +msgid "" msgstr "" msgctxt "#30704" @@ -1257,7 +1257,7 @@ msgid "" msgstr "" msgctxt "#30739" -msgid "" +msgid "Subscribers" msgstr "" msgctxt "#30740" @@ -1477,11 +1477,11 @@ msgid "Views count display colour" msgstr "" msgctxt "#30794" -msgid "Likes count display colour" +msgid "Subscriber/Likes count display colour" msgstr "" msgctxt "#30795" -msgid "Comments count display colour" +msgid "Videos/Comments count display colour" msgstr "" msgctxt "#30796" @@ -1579,3 +1579,7 @@ msgstr "" msgctxt "#30819" msgid "Play from start" msgstr "" + +msgctxt "#30820" +msgid "Podcast" +msgstr "" diff --git a/plugin.video.youtube/resources/language/resource.language.ko_kr/strings.po b/plugin.video.youtube/resources/language/resource.language.ko_kr/strings.po index 00de1acbf4..6cc25a0730 100644 --- a/plugin.video.youtube/resources/language/resource.language.ko_kr/strings.po +++ b/plugin.video.youtube/resources/language/resource.language.ko_kr/strings.po @@ -7,7 +7,7 @@ msgstr "" "Project-Id-Version: XBMC-Addons\n" "Report-Msgid-Bugs-To: translations@kodi.tv\n" "POT-Creation-Date: 2015-09-21 11:01+0000\n" -"PO-Revision-Date: 2024-08-15 18:26+0000\n" +"PO-Revision-Date: 2024-11-20 18:38+0000\n" "Last-Translator: Minho Park \n" "Language-Team: Korean \n" "Language: ko_kr\n" @@ -15,7 +15,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 5.6.2\n" +"X-Generator: Weblate 5.8.4\n" msgctxt "Addon Summary" msgid "Plugin for YouTube" @@ -35,9 +35,10 @@ msgstr "이 플러그인은 Google의 허가를 받지 않았습니다" # msgctxt "Addon Description" # msgid "YouTube is a one of the biggest video-sharing websites of the world." # msgstr "" +# Kodion Settings msgctxt "#30000" -msgid "General" -msgstr "일반" +msgid "" +msgstr "" msgctxt "#30001" msgid "" @@ -149,8 +150,8 @@ msgid "Configure %s?" msgstr "%s을(를) 설정할까요?" msgctxt "#30031" -msgid "Advanced" -msgstr "고급" +msgid "" +msgstr "" msgctxt "#30032" msgid "View: TV Shows" @@ -215,8 +216,8 @@ msgid "Watch Later" msgstr "나중에 보기" msgctxt "#30108" -msgid "Remove" -msgstr "제거" +msgid "" +msgstr "" msgctxt "#30109" msgid "" @@ -235,8 +236,8 @@ msgid "Sign Out" msgstr "로그아웃" msgctxt "#30113" -msgid "Rename" -msgstr "이름 바꾸기" +msgid "" +msgstr "" msgctxt "#30114" msgid "Confirm delete" @@ -255,8 +256,8 @@ msgid "Remove \"%s\"?" msgstr "\"%s\" 제거할까요?" msgctxt "#30118" -msgid "Delete" -msgstr "삭제" +msgid "" +msgstr "" msgctxt "#30119" msgid "Please wait..." @@ -299,12 +300,12 @@ msgstr "" # YouTube # empty strings from id 30206 to 30499 msgctxt "#30500" -msgid "Channels" -msgstr "채널" +msgid "" +msgstr "" msgctxt "#30501" -msgid "Playlists" -msgstr "재생목록" +msgid "" +msgstr "" msgctxt "#30502" msgid "Go to %s" @@ -359,8 +360,8 @@ msgid "Related Videos" msgstr "관련 동영상" msgctxt "#30515" -msgid "Auto-Remove from 'Watch Later'" -msgstr "'나중에 볼 동영상'에서 자동 삭제" +msgid "Auto-Remove from Watch Later" +msgstr "나중에 보기에서 자동 지움" msgctxt "#30516" msgid "Folders" @@ -383,16 +384,16 @@ msgid "Add to..." msgstr "추가..." msgctxt "#30521" -msgid "Select playlist" -msgstr "재생목록 선택" +msgid "" +msgstr "" msgctxt "#30522" -msgid "New playlist..." -msgstr "새 재생목록..." +msgid "" +msgstr "" msgctxt "#30523" -msgid "Language" -msgstr "언어" +msgid "" +msgstr "" msgctxt "#30524" msgid "Select language" @@ -423,20 +424,20 @@ msgid "I dislike this" msgstr "싫어함" msgctxt "#30531" -msgid "Play all" -msgstr "모두 재생" +msgid "" +msgstr "" msgctxt "#30532" -msgid "Default" -msgstr "기본" +msgid "" +msgstr "" msgctxt "#30533" msgid "Reverse" msgstr "반대로" msgctxt "#30534" -msgid "Shuffle" -msgstr "섞기" +msgid "" +msgstr "" msgctxt "#30535" msgid "Select the order of the playlist" @@ -455,8 +456,8 @@ msgid "Disliked Videos" msgstr "싫어하는 동영상" msgctxt "#30539" -msgid "Live" -msgstr "실시간" +msgid "" +msgstr "" msgctxt "#30540" msgid "Play with..." @@ -471,8 +472,8 @@ msgid "rtmpe streams are not supported" msgstr "rtmpe 스트림 지원 안 함" msgctxt "#30543" -msgid "Refresh" -msgstr "새로 고침" +msgid "" +msgstr "" msgctxt "#30544" msgid "More Links from the description" @@ -483,24 +484,24 @@ msgid "No further links found." msgstr "더 이상 링크가 없음." msgctxt "#30546" -msgid "Please log in twice!" -msgstr "두 번 로그인합니다!" +msgid "Please complete all login prompts" +msgstr "모든 로그인을 완료해 주세요" msgctxt "#30547" -msgid "You must enable two applications so that YouTube is functioning properly." -msgstr "YouTube가 제대로 작동하려면 두 개의 애플리케이션을 활성화해야 합니다." +msgid "You may be prompted to enable two applications so that YouTube is functioning properly." +msgstr "유튜브가 제대로 동작하려면 두 개 애플리케이션을 사용하라는 메시지가 표시될 수 있습니다." msgctxt "#30548" -msgid "More..." -msgstr "더 보기..." +msgid "" +msgstr "" msgctxt "#30549" msgid "No videos streams found" msgstr "동영상 스트림이 없음" msgctxt "#30550" -msgid "Region" -msgstr "지역" +msgid "" +msgstr "" msgctxt "#30551" msgid "Recommendations" @@ -539,17 +540,17 @@ msgid "Delete settings.xml" msgstr "settings.xml 삭제" msgctxt "#30560" -msgid "Subtitle language" -msgstr "자막 언어" +msgid "" +msgstr "" msgctxt "#30561" -msgid "None" -msgstr "안 함" - -msgctxt "#30562" msgid "" msgstr "" +msgctxt "#30562" +msgid "View all" +msgstr "모두 보기" + msgctxt "#30563" msgid "" msgstr "" @@ -563,8 +564,8 @@ msgid "" msgstr "" msgctxt "#30566" -msgid "Prompt" -msgstr "프롬프트" +msgid "" +msgstr "" msgctxt "#30567" msgid "Set as Watch Later" @@ -575,12 +576,12 @@ msgid "Remove as Watch Later" msgstr "나중에 보기 삭제" msgctxt "#30569" -msgid "Are you sure you want to remove '%s' as your Watch Later list?" -msgstr "나중에 볼 재생목록에서 '%s' 지울까요?" +msgid "Are you sure you want to remove \"%s\" as your Watch Later list?" +msgstr "\"%s\"을(를) 나중에 볼 동영상 목록에서 지울까요?" msgctxt "#30570" -msgid "Are you sure you want to replace your current Watch Later list with '%s'?" -msgstr "나중에 볼 재생목록을 '%s'로 바꿀까요?" +msgid "Are you sure you want to replace your current Watch Later list with \"%s\"?" +msgstr "현재 나중에 볼 동영상 목록을 \"%s\"(으)로 바꿀까요?" msgctxt "#30571" msgid "Set as History" @@ -591,12 +592,12 @@ msgid "Remove as History" msgstr "이력 삭제" msgctxt "#30573" -msgid "Are you sure you want to remove '%s' as your History list?" -msgstr "이력에서 '%s' 지울까요?" +msgid "Are you sure you want to remove \"%s\" as your History list?" +msgstr "\"%s\"을(를) 기록 목록에서 지울까요?" msgctxt "#30574" -msgid "Are you sure you want to replace your current History list with '%s'?" -msgstr "현재 이력을 '%s'로 바꿀까요?" +msgid "Are you sure you want to replace your current History list with \"%s\"?" +msgstr "현재의 기록 목록을 \"%s\"(으)로 바꿀까요?" msgctxt "#30575" msgid "Succeeded" @@ -607,8 +608,8 @@ msgid "Failed" msgstr "실패" msgctxt "#30577" -msgid "Settings" -msgstr "설정" +msgid "" +msgstr "" msgctxt "#30578" msgid "Force SSL certificate verification" @@ -631,8 +632,8 @@ msgid "Autoplay suggested videos" msgstr "추천 동영상 자동 재생" msgctxt "#30583" -msgid "Automatic" -msgstr "자동" +msgid "" +msgstr "" msgctxt "#30584" msgid "My Subscriptions (Filtered)" @@ -691,16 +692,16 @@ msgid "Updated: %s" msgstr "업데이트됨: %s" msgctxt "#30598" -msgid "Personal API keys enabled" -msgstr "개인 API 키 사용함" +msgid "" +msgstr "" msgctxt "#30599" msgid "Failed to enable personal API keys. Missing: %s" msgstr "개인 API 키 사용 실패함. 없음: %s" msgctxt "#30600" -msgid "Subtitles" -msgstr "자막" +msgid "" +msgstr "" msgctxt "#30601" msgid "%s with Original/%s fallback" @@ -759,8 +760,8 @@ msgid "" msgstr "" msgctxt "#30615" -msgid "Cancel" -msgstr "취소" +msgid "" +msgstr "" msgctxt "#30616" msgid "" @@ -775,8 +776,8 @@ msgid "" msgstr "" msgctxt "#30619" -msgid "Port" -msgstr "포트" +msgid "" +msgstr "" msgctxt "#30620" msgid "Port %s already in use. Cannot start http server." @@ -819,8 +820,8 @@ msgid "IP whitelist (comma delimited)" msgstr "IP 화이트리스트 (쉼표로 나눔)" msgctxt "#30630" -msgid "Save" -msgstr "저장" +msgid "" +msgstr "" msgctxt "#30631" msgid "Successfully updated: %s" @@ -935,8 +936,8 @@ msgid "Enter a name for this user" msgstr "사용자 이름을 입력합니다" msgctxt "#30659" -msgid "User is now '%s'" -msgstr "지금 사용자는 '%s'" +msgid "User is now \"%s\"" +msgstr "사용자는 이제 \"%s\"입니다" msgctxt "#30660" msgid "Users" @@ -959,16 +960,16 @@ msgid "Switch user" msgstr "사용자 변경" msgctxt "#30665" -msgid "Switch to '%s' now?" -msgstr "지금 '%s'로 변경할까요?" +msgid "Switch to \"%s\" now?" +msgstr "지금 \"%s\"로 바꿀까요?" msgctxt "#30666" -msgid "%s removed" -msgstr "%s 지워짐" +msgid "\"%s\" removed" +msgstr "\"%s\" 지움" msgctxt "#30667" -msgid "Renamed '%s' to '%s'" -msgstr "'%s'에서 '%s'로 이름 바뀜" +msgid "Renamed \"%s\" to \"%s\"" +msgstr "\"%s\"를 \"%s\"로 이름을 바꾸었습니다" msgctxt "#30668" msgid "Play count minimum percent" @@ -1111,8 +1112,8 @@ msgid "Play with subtitles" msgstr "자막 재생" msgctxt "#30703" -msgid "Are you sure?" -msgstr "확실합니까?" +msgid "" +msgstr "" msgctxt "#30704" msgid "Use YouTube website urls with default player" @@ -1255,8 +1256,8 @@ msgid "" msgstr "" msgctxt "#30739" -msgid "" -msgstr "" +msgid "Subscribers" +msgstr "구독자" msgctxt "#30740" msgid "HLS" @@ -1475,12 +1476,12 @@ msgid "Views count display colour" msgstr "조회수 표시 색상" msgctxt "#30794" -msgid "Likes count display colour" -msgstr "좋아요 개수 표시 색상" +msgid "Subscriber/Likes count display colour" +msgstr "구독자/좋아요 수 표시 색상" msgctxt "#30795" -msgid "Comments count display colour" -msgstr "댓글 수 표시 색상" +msgid "Videos/Comments count display colour" +msgstr "동영상/댓글 개수 표시 색상" msgctxt "#30796" msgid "1080p/60 fps | Raspberry Pi 4, or similar" @@ -1578,6 +1579,190 @@ msgctxt "#30819" msgid "Play from start" msgstr "처음부터 재생" +msgctxt "#30820" +msgid "Podcast" +msgstr "팟캐스트" + +#~ msgctxt "#30515" +#~ msgid "Auto-Remove from 'Watch Later'" +#~ msgstr "'나중에 볼 동영상'에서 자동 삭제" + +#~ msgctxt "#30569" +#~ msgid "Are you sure you want to remove '%s' as your Watch Later list?" +#~ msgstr "나중에 볼 재생목록에서 '%s' 지울까요?" + +#~ msgctxt "#30570" +#~ msgid "Are you sure you want to replace your current Watch Later list with '%s'?" +#~ msgstr "나중에 볼 재생목록을 '%s'로 바꿀까요?" + +#~ msgctxt "#30573" +#~ msgid "Are you sure you want to remove '%s' as your History list?" +#~ msgstr "이력에서 '%s' 지울까요?" + +#~ msgctxt "#30574" +#~ msgid "Are you sure you want to replace your current History list with '%s'?" +#~ msgstr "현재 이력을 '%s'로 바꿀까요?" + +#~ msgctxt "#30659" +#~ msgid "User is now '%s'" +#~ msgstr "지금 사용자는 '%s'" + +#~ msgctxt "#30665" +#~ msgid "Switch to '%s' now?" +#~ msgstr "지금 '%s'로 변경할까요?" + +#~ msgctxt "#30666" +#~ msgid "%s removed" +#~ msgstr "%s 지워짐" + +#~ msgctxt "#30667" +#~ msgid "Renamed '%s' to '%s'" +#~ msgstr "'%s'에서 '%s'로 이름 바뀜" + +# msgctxt "Addon Summary" +# msgid "Plugin for YouTube" +# msgstr "" +# msgctxt "Addon Description" +# msgid "YouTube is a one of the biggest video-sharing websites of the world." +# msgstr "" +#~ msgctxt "#30000" +#~ msgid "General" +#~ msgstr "일반" + +#~ msgctxt "#30031" +#~ msgid "Advanced" +#~ msgstr "고급" + +#~ msgctxt "#30108" +#~ msgid "Remove" +#~ msgstr "제거" + +#~ msgctxt "#30113" +#~ msgid "Rename" +#~ msgstr "이름 바꾸기" + +#~ msgctxt "#30118" +#~ msgid "Delete" +#~ msgstr "삭제" + +# YouTube +# empty strings from id 30206 to 30499 +#~ msgctxt "#30500" +#~ msgid "Channels" +#~ msgstr "채널" + +#~ msgctxt "#30501" +#~ msgid "Playlists" +#~ msgstr "재생목록" + +#~ msgctxt "#30521" +#~ msgid "Select playlist" +#~ msgstr "재생목록 선택" + +#~ msgctxt "#30522" +#~ msgid "New playlist..." +#~ msgstr "새 재생목록..." + +#~ msgctxt "#30523" +#~ msgid "Language" +#~ msgstr "언어" + +#~ msgctxt "#30531" +#~ msgid "Play all" +#~ msgstr "모두 재생" + +#~ msgctxt "#30532" +#~ msgid "Default" +#~ msgstr "기본" + +#~ msgctxt "#30534" +#~ msgid "Shuffle" +#~ msgstr "섞기" + +#~ msgctxt "#30539" +#~ msgid "Live" +#~ msgstr "실시간" + +#~ msgctxt "#30543" +#~ msgid "Refresh" +#~ msgstr "새로 고침" + +#~ msgctxt "#30548" +#~ msgid "More..." +#~ msgstr "더 보기..." + +#~ msgctxt "#30550" +#~ msgid "Region" +#~ msgstr "지역" + +#~ msgctxt "#30560" +#~ msgid "Subtitle language" +#~ msgstr "자막 언어" + +#~ msgctxt "#30561" +#~ msgid "None" +#~ msgstr "안 함" + +#~ msgctxt "#30566" +#~ msgid "Prompt" +#~ msgstr "프롬프트" + +#~ msgctxt "#30577" +#~ msgid "Settings" +#~ msgstr "설정" + +#~ msgctxt "#30583" +#~ msgid "Automatic" +#~ msgstr "자동" + +#~ msgctxt "#30598" +#~ msgid "Personal API keys enabled" +#~ msgstr "개인 API 키 사용함" + +#~ msgctxt "#30600" +#~ msgid "Subtitles" +#~ msgstr "자막" + +#~ msgctxt "#30615" +#~ msgid "Cancel" +#~ msgstr "취소" + +#~ msgctxt "#30619" +#~ msgid "Port" +#~ msgstr "포트" + +#~ msgctxt "#30630" +#~ msgid "Save" +#~ msgstr "저장" + +#~ msgctxt "#30703" +#~ msgid "Are you sure?" +#~ msgstr "확실합니까?" + +#~ msgctxt "#30737" +#~ msgid "Episodes" +#~ msgstr "에피소드" + +#~ msgctxt "#30738" +#~ msgid "Videos" +#~ msgstr "비디오" + +#~ msgctxt "#30794" +#~ msgid "Likes count display colour" +#~ msgstr "좋아요 개수 표시 색상" + +#~ msgctxt "#30795" +#~ msgid "Comments count display colour" +#~ msgstr "댓글 수 표시 색상" + +#~ msgctxt "#30546" +#~ msgid "Please log in twice!" +#~ msgstr "두 번 로그인합니다!" + +#~ msgctxt "#30547" +#~ msgid "You must enable two applications so that YouTube is functioning properly." +#~ msgstr "YouTube가 제대로 작동하려면 두 개의 애플리케이션을 활성화해야 합니다." + #~ msgctxt "#30001" #~ msgid "Username" #~ msgstr "사용자명" diff --git a/plugin.video.youtube/resources/language/resource.language.lt_lt/strings.po b/plugin.video.youtube/resources/language/resource.language.lt_lt/strings.po index 7ee6d5e1d4..581eb1df4d 100644 --- a/plugin.video.youtube/resources/language/resource.language.lt_lt/strings.po +++ b/plugin.video.youtube/resources/language/resource.language.lt_lt/strings.po @@ -37,7 +37,7 @@ msgstr "" # msgstr "" # Kodion Settings msgctxt "#30000" -msgid "General" +msgid "" msgstr "" msgctxt "#30001" @@ -151,7 +151,7 @@ msgid "Configure %s?" msgstr "" msgctxt "#30031" -msgid "Advanced" +msgid "" msgstr "" msgctxt "#30032" @@ -217,7 +217,7 @@ msgid "Watch Later" msgstr "" msgctxt "#30108" -msgid "Remove" +msgid "" msgstr "" msgctxt "#30109" @@ -237,7 +237,7 @@ msgid "Sign Out" msgstr "" msgctxt "#30113" -msgid "Rename" +msgid "" msgstr "" msgctxt "#30114" @@ -257,7 +257,7 @@ msgid "Remove \"%s\"?" msgstr "" msgctxt "#30118" -msgid "Delete" +msgid "" msgstr "" msgctxt "#30119" @@ -301,11 +301,11 @@ msgstr "" # YouTube # empty strings from id 30206 to 30499 msgctxt "#30500" -msgid "Channels" +msgid "" msgstr "" msgctxt "#30501" -msgid "Playlists" +msgid "" msgstr "" msgctxt "#30502" @@ -361,7 +361,7 @@ msgid "Related Videos" msgstr "" msgctxt "#30515" -msgid "Auto-Remove from 'Watch Later'" +msgid "Auto-Remove from Watch Later" msgstr "" msgctxt "#30516" @@ -385,15 +385,15 @@ msgid "Add to..." msgstr "" msgctxt "#30521" -msgid "Select playlist" +msgid "" msgstr "" msgctxt "#30522" -msgid "New playlist..." +msgid "" msgstr "" msgctxt "#30523" -msgid "Language" +msgid "" msgstr "" msgctxt "#30524" @@ -425,11 +425,11 @@ msgid "I dislike this" msgstr "" msgctxt "#30531" -msgid "Play all" +msgid "" msgstr "" msgctxt "#30532" -msgid "Default" +msgid "" msgstr "" msgctxt "#30533" @@ -437,7 +437,7 @@ msgid "Reverse" msgstr "" msgctxt "#30534" -msgid "Shuffle" +msgid "" msgstr "" msgctxt "#30535" @@ -457,7 +457,7 @@ msgid "Disliked Videos" msgstr "" msgctxt "#30539" -msgid "Live" +msgid "" msgstr "" msgctxt "#30540" @@ -473,7 +473,7 @@ msgid "rtmpe streams are not supported" msgstr "" msgctxt "#30543" -msgid "Refresh" +msgid "" msgstr "" msgctxt "#30544" @@ -485,15 +485,15 @@ msgid "No further links found." msgstr "" msgctxt "#30546" -msgid "Please log in twice!" +msgid "Please complete all login prompts" msgstr "" msgctxt "#30547" -msgid "You must enable two applications so that YouTube is functioning properly." +msgid "You may be prompted to enable two applications so that YouTube is functioning properly." msgstr "" msgctxt "#30548" -msgid "More..." +msgid "" msgstr "" msgctxt "#30549" @@ -501,7 +501,7 @@ msgid "No videos streams found" msgstr "" msgctxt "#30550" -msgid "Region" +msgid "" msgstr "" msgctxt "#30551" @@ -541,15 +541,15 @@ msgid "Delete settings.xml" msgstr "" msgctxt "#30560" -msgid "Subtitle language" +msgid "" msgstr "" msgctxt "#30561" -msgid "None" +msgid "" msgstr "" msgctxt "#30562" -msgid "" +msgid "View all" msgstr "" msgctxt "#30563" @@ -565,7 +565,7 @@ msgid "" msgstr "" msgctxt "#30566" -msgid "Prompt" +msgid "" msgstr "" msgctxt "#30567" @@ -577,11 +577,11 @@ msgid "Remove as Watch Later" msgstr "" msgctxt "#30569" -msgid "Are you sure you want to remove '%s' as your Watch Later list?" +msgid "Are you sure you want to remove \"%s\" as your Watch Later list?" msgstr "" msgctxt "#30570" -msgid "Are you sure you want to replace your current Watch Later list with '%s'?" +msgid "Are you sure you want to replace your current Watch Later list with \"%s\"?" msgstr "" msgctxt "#30571" @@ -593,11 +593,11 @@ msgid "Remove as History" msgstr "" msgctxt "#30573" -msgid "Are you sure you want to remove '%s' as your History list?" +msgid "Are you sure you want to remove \"%s\" as your History list?" msgstr "" msgctxt "#30574" -msgid "Are you sure you want to replace your current History list with '%s'?" +msgid "Are you sure you want to replace your current History list with \"%s\"?" msgstr "" msgctxt "#30575" @@ -609,7 +609,7 @@ msgid "Failed" msgstr "" msgctxt "#30577" -msgid "Settings" +msgid "" msgstr "" msgctxt "#30578" @@ -633,7 +633,7 @@ msgid "Autoplay suggested videos" msgstr "" msgctxt "#30583" -msgid "Automatic" +msgid "" msgstr "" msgctxt "#30584" @@ -693,7 +693,7 @@ msgid "Updated: %s" msgstr "" msgctxt "#30598" -msgid "Personal API keys enabled" +msgid "" msgstr "" msgctxt "#30599" @@ -701,7 +701,7 @@ msgid "Failed to enable personal API keys. Missing: %s" msgstr "" msgctxt "#30600" -msgid "Subtitles" +msgid "" msgstr "" msgctxt "#30601" @@ -761,7 +761,7 @@ msgid "" msgstr "" msgctxt "#30615" -msgid "Cancel" +msgid "" msgstr "" msgctxt "#30616" @@ -777,7 +777,7 @@ msgid "" msgstr "" msgctxt "#30619" -msgid "Port" +msgid "" msgstr "" msgctxt "#30620" @@ -821,7 +821,7 @@ msgid "IP whitelist (comma delimited)" msgstr "" msgctxt "#30630" -msgid "Save" +msgid "" msgstr "" msgctxt "#30631" @@ -937,7 +937,7 @@ msgid "Enter a name for this user" msgstr "" msgctxt "#30659" -msgid "User is now '%s'" +msgid "User is now \"%s\"" msgstr "" msgctxt "#30660" @@ -961,15 +961,15 @@ msgid "Switch user" msgstr "" msgctxt "#30665" -msgid "Switch to '%s' now?" +msgid "Switch to \"%s\" now?" msgstr "" msgctxt "#30666" -msgid "%s removed" +msgid "\"%s\" removed" msgstr "" msgctxt "#30667" -msgid "Renamed '%s' to '%s'" +msgid "Renamed \"%s\" to \"%s\"" msgstr "" msgctxt "#30668" @@ -1113,7 +1113,7 @@ msgid "Play with subtitles" msgstr "" msgctxt "#30703" -msgid "Are you sure?" +msgid "" msgstr "" msgctxt "#30704" @@ -1257,7 +1257,7 @@ msgid "" msgstr "" msgctxt "#30739" -msgid "" +msgid "Subscribers" msgstr "" msgctxt "#30740" @@ -1477,11 +1477,11 @@ msgid "Views count display colour" msgstr "" msgctxt "#30794" -msgid "Likes count display colour" +msgid "Subscriber/Likes count display colour" msgstr "" msgctxt "#30795" -msgid "Comments count display colour" +msgid "Videos/Comments count display colour" msgstr "" msgctxt "#30796" @@ -1579,3 +1579,7 @@ msgstr "" msgctxt "#30819" msgid "Play from start" msgstr "" + +msgctxt "#30820" +msgid "Podcast" +msgstr "" diff --git a/plugin.video.youtube/resources/language/resource.language.lv_lv/strings.po b/plugin.video.youtube/resources/language/resource.language.lv_lv/strings.po index 8520a21ab3..fcf850456c 100644 --- a/plugin.video.youtube/resources/language/resource.language.lv_lv/strings.po +++ b/plugin.video.youtube/resources/language/resource.language.lv_lv/strings.po @@ -37,7 +37,7 @@ msgstr "" # msgstr "" # Kodion Settings msgctxt "#30000" -msgid "General" +msgid "" msgstr "" msgctxt "#30001" @@ -151,7 +151,7 @@ msgid "Configure %s?" msgstr "" msgctxt "#30031" -msgid "Advanced" +msgid "" msgstr "" msgctxt "#30032" @@ -217,7 +217,7 @@ msgid "Watch Later" msgstr "" msgctxt "#30108" -msgid "Remove" +msgid "" msgstr "" msgctxt "#30109" @@ -237,7 +237,7 @@ msgid "Sign Out" msgstr "" msgctxt "#30113" -msgid "Rename" +msgid "" msgstr "" msgctxt "#30114" @@ -257,7 +257,7 @@ msgid "Remove \"%s\"?" msgstr "" msgctxt "#30118" -msgid "Delete" +msgid "" msgstr "" msgctxt "#30119" @@ -301,11 +301,11 @@ msgstr "" # YouTube # empty strings from id 30206 to 30499 msgctxt "#30500" -msgid "Channels" +msgid "" msgstr "" msgctxt "#30501" -msgid "Playlists" +msgid "" msgstr "" msgctxt "#30502" @@ -361,7 +361,7 @@ msgid "Related Videos" msgstr "" msgctxt "#30515" -msgid "Auto-Remove from 'Watch Later'" +msgid "Auto-Remove from Watch Later" msgstr "" msgctxt "#30516" @@ -385,15 +385,15 @@ msgid "Add to..." msgstr "" msgctxt "#30521" -msgid "Select playlist" +msgid "" msgstr "" msgctxt "#30522" -msgid "New playlist..." +msgid "" msgstr "" msgctxt "#30523" -msgid "Language" +msgid "" msgstr "" msgctxt "#30524" @@ -425,11 +425,11 @@ msgid "I dislike this" msgstr "" msgctxt "#30531" -msgid "Play all" +msgid "" msgstr "" msgctxt "#30532" -msgid "Default" +msgid "" msgstr "" msgctxt "#30533" @@ -437,7 +437,7 @@ msgid "Reverse" msgstr "" msgctxt "#30534" -msgid "Shuffle" +msgid "" msgstr "" msgctxt "#30535" @@ -457,7 +457,7 @@ msgid "Disliked Videos" msgstr "" msgctxt "#30539" -msgid "Live" +msgid "" msgstr "" msgctxt "#30540" @@ -473,7 +473,7 @@ msgid "rtmpe streams are not supported" msgstr "" msgctxt "#30543" -msgid "Refresh" +msgid "" msgstr "" msgctxt "#30544" @@ -485,15 +485,15 @@ msgid "No further links found." msgstr "" msgctxt "#30546" -msgid "Please log in twice!" +msgid "Please complete all login prompts" msgstr "" msgctxt "#30547" -msgid "You must enable two applications so that YouTube is functioning properly." +msgid "You may be prompted to enable two applications so that YouTube is functioning properly." msgstr "" msgctxt "#30548" -msgid "More..." +msgid "" msgstr "" msgctxt "#30549" @@ -501,7 +501,7 @@ msgid "No videos streams found" msgstr "" msgctxt "#30550" -msgid "Region" +msgid "" msgstr "" msgctxt "#30551" @@ -541,15 +541,15 @@ msgid "Delete settings.xml" msgstr "" msgctxt "#30560" -msgid "Subtitle language" +msgid "" msgstr "" msgctxt "#30561" -msgid "None" +msgid "" msgstr "" msgctxt "#30562" -msgid "" +msgid "View all" msgstr "" msgctxt "#30563" @@ -565,7 +565,7 @@ msgid "" msgstr "" msgctxt "#30566" -msgid "Prompt" +msgid "" msgstr "" msgctxt "#30567" @@ -577,11 +577,11 @@ msgid "Remove as Watch Later" msgstr "" msgctxt "#30569" -msgid "Are you sure you want to remove '%s' as your Watch Later list?" +msgid "Are you sure you want to remove \"%s\" as your Watch Later list?" msgstr "" msgctxt "#30570" -msgid "Are you sure you want to replace your current Watch Later list with '%s'?" +msgid "Are you sure you want to replace your current Watch Later list with \"%s\"?" msgstr "" msgctxt "#30571" @@ -593,11 +593,11 @@ msgid "Remove as History" msgstr "" msgctxt "#30573" -msgid "Are you sure you want to remove '%s' as your History list?" +msgid "Are you sure you want to remove \"%s\" as your History list?" msgstr "" msgctxt "#30574" -msgid "Are you sure you want to replace your current History list with '%s'?" +msgid "Are you sure you want to replace your current History list with \"%s\"?" msgstr "" msgctxt "#30575" @@ -609,7 +609,7 @@ msgid "Failed" msgstr "" msgctxt "#30577" -msgid "Settings" +msgid "" msgstr "" msgctxt "#30578" @@ -633,7 +633,7 @@ msgid "Autoplay suggested videos" msgstr "" msgctxt "#30583" -msgid "Automatic" +msgid "" msgstr "" msgctxt "#30584" @@ -693,7 +693,7 @@ msgid "Updated: %s" msgstr "" msgctxt "#30598" -msgid "Personal API keys enabled" +msgid "" msgstr "" msgctxt "#30599" @@ -701,7 +701,7 @@ msgid "Failed to enable personal API keys. Missing: %s" msgstr "" msgctxt "#30600" -msgid "Subtitles" +msgid "" msgstr "" msgctxt "#30601" @@ -761,7 +761,7 @@ msgid "" msgstr "" msgctxt "#30615" -msgid "Cancel" +msgid "" msgstr "" msgctxt "#30616" @@ -777,7 +777,7 @@ msgid "" msgstr "" msgctxt "#30619" -msgid "Port" +msgid "" msgstr "" msgctxt "#30620" @@ -821,7 +821,7 @@ msgid "IP whitelist (comma delimited)" msgstr "" msgctxt "#30630" -msgid "Save" +msgid "" msgstr "" msgctxt "#30631" @@ -937,7 +937,7 @@ msgid "Enter a name for this user" msgstr "" msgctxt "#30659" -msgid "User is now '%s'" +msgid "User is now \"%s\"" msgstr "" msgctxt "#30660" @@ -961,15 +961,15 @@ msgid "Switch user" msgstr "" msgctxt "#30665" -msgid "Switch to '%s' now?" +msgid "Switch to \"%s\" now?" msgstr "" msgctxt "#30666" -msgid "%s removed" +msgid "\"%s\" removed" msgstr "" msgctxt "#30667" -msgid "Renamed '%s' to '%s'" +msgid "Renamed \"%s\" to \"%s\"" msgstr "" msgctxt "#30668" @@ -1113,7 +1113,7 @@ msgid "Play with subtitles" msgstr "" msgctxt "#30703" -msgid "Are you sure?" +msgid "" msgstr "" msgctxt "#30704" @@ -1257,7 +1257,7 @@ msgid "" msgstr "" msgctxt "#30739" -msgid "" +msgid "Subscribers" msgstr "" msgctxt "#30740" @@ -1477,11 +1477,11 @@ msgid "Views count display colour" msgstr "" msgctxt "#30794" -msgid "Likes count display colour" +msgid "Subscriber/Likes count display colour" msgstr "" msgctxt "#30795" -msgid "Comments count display colour" +msgid "Videos/Comments count display colour" msgstr "" msgctxt "#30796" @@ -1579,3 +1579,7 @@ msgstr "" msgctxt "#30819" msgid "Play from start" msgstr "" + +msgctxt "#30820" +msgid "Podcast" +msgstr "" diff --git a/plugin.video.youtube/resources/language/resource.language.mi/strings.po b/plugin.video.youtube/resources/language/resource.language.mi/strings.po index 4cb3b5e9e3..25f382117b 100644 --- a/plugin.video.youtube/resources/language/resource.language.mi/strings.po +++ b/plugin.video.youtube/resources/language/resource.language.mi/strings.po @@ -37,7 +37,7 @@ msgstr "" # msgstr "" # Kodion Settings msgctxt "#30000" -msgid "General" +msgid "" msgstr "" msgctxt "#30001" @@ -151,7 +151,7 @@ msgid "Configure %s?" msgstr "" msgctxt "#30031" -msgid "Advanced" +msgid "" msgstr "" msgctxt "#30032" @@ -217,7 +217,7 @@ msgid "Watch Later" msgstr "" msgctxt "#30108" -msgid "Remove" +msgid "" msgstr "" msgctxt "#30109" @@ -237,7 +237,7 @@ msgid "Sign Out" msgstr "" msgctxt "#30113" -msgid "Rename" +msgid "" msgstr "" msgctxt "#30114" @@ -257,7 +257,7 @@ msgid "Remove \"%s\"?" msgstr "" msgctxt "#30118" -msgid "Delete" +msgid "" msgstr "" msgctxt "#30119" @@ -301,11 +301,11 @@ msgstr "" # YouTube # empty strings from id 30206 to 30499 msgctxt "#30500" -msgid "Channels" +msgid "" msgstr "" msgctxt "#30501" -msgid "Playlists" +msgid "" msgstr "" msgctxt "#30502" @@ -361,7 +361,7 @@ msgid "Related Videos" msgstr "" msgctxt "#30515" -msgid "Auto-Remove from 'Watch Later'" +msgid "Auto-Remove from Watch Later" msgstr "" msgctxt "#30516" @@ -385,15 +385,15 @@ msgid "Add to..." msgstr "" msgctxt "#30521" -msgid "Select playlist" +msgid "" msgstr "" msgctxt "#30522" -msgid "New playlist..." +msgid "" msgstr "" msgctxt "#30523" -msgid "Language" +msgid "" msgstr "" msgctxt "#30524" @@ -425,11 +425,11 @@ msgid "I dislike this" msgstr "" msgctxt "#30531" -msgid "Play all" +msgid "" msgstr "" msgctxt "#30532" -msgid "Default" +msgid "" msgstr "" msgctxt "#30533" @@ -437,7 +437,7 @@ msgid "Reverse" msgstr "" msgctxt "#30534" -msgid "Shuffle" +msgid "" msgstr "" msgctxt "#30535" @@ -457,7 +457,7 @@ msgid "Disliked Videos" msgstr "" msgctxt "#30539" -msgid "Live" +msgid "" msgstr "" msgctxt "#30540" @@ -473,7 +473,7 @@ msgid "rtmpe streams are not supported" msgstr "" msgctxt "#30543" -msgid "Refresh" +msgid "" msgstr "" msgctxt "#30544" @@ -485,15 +485,15 @@ msgid "No further links found." msgstr "" msgctxt "#30546" -msgid "Please log in twice!" +msgid "Please complete all login prompts" msgstr "" msgctxt "#30547" -msgid "You must enable two applications so that YouTube is functioning properly." +msgid "You may be prompted to enable two applications so that YouTube is functioning properly." msgstr "" msgctxt "#30548" -msgid "More..." +msgid "" msgstr "" msgctxt "#30549" @@ -501,7 +501,7 @@ msgid "No videos streams found" msgstr "" msgctxt "#30550" -msgid "Region" +msgid "" msgstr "" msgctxt "#30551" @@ -541,15 +541,15 @@ msgid "Delete settings.xml" msgstr "" msgctxt "#30560" -msgid "Subtitle language" +msgid "" msgstr "" msgctxt "#30561" -msgid "None" +msgid "" msgstr "" msgctxt "#30562" -msgid "" +msgid "View all" msgstr "" msgctxt "#30563" @@ -565,7 +565,7 @@ msgid "" msgstr "" msgctxt "#30566" -msgid "Prompt" +msgid "" msgstr "" msgctxt "#30567" @@ -577,11 +577,11 @@ msgid "Remove as Watch Later" msgstr "" msgctxt "#30569" -msgid "Are you sure you want to remove '%s' as your Watch Later list?" +msgid "Are you sure you want to remove \"%s\" as your Watch Later list?" msgstr "" msgctxt "#30570" -msgid "Are you sure you want to replace your current Watch Later list with '%s'?" +msgid "Are you sure you want to replace your current Watch Later list with \"%s\"?" msgstr "" msgctxt "#30571" @@ -593,11 +593,11 @@ msgid "Remove as History" msgstr "" msgctxt "#30573" -msgid "Are you sure you want to remove '%s' as your History list?" +msgid "Are you sure you want to remove \"%s\" as your History list?" msgstr "" msgctxt "#30574" -msgid "Are you sure you want to replace your current History list with '%s'?" +msgid "Are you sure you want to replace your current History list with \"%s\"?" msgstr "" msgctxt "#30575" @@ -609,7 +609,7 @@ msgid "Failed" msgstr "" msgctxt "#30577" -msgid "Settings" +msgid "" msgstr "" msgctxt "#30578" @@ -633,7 +633,7 @@ msgid "Autoplay suggested videos" msgstr "" msgctxt "#30583" -msgid "Automatic" +msgid "" msgstr "" msgctxt "#30584" @@ -693,7 +693,7 @@ msgid "Updated: %s" msgstr "" msgctxt "#30598" -msgid "Personal API keys enabled" +msgid "" msgstr "" msgctxt "#30599" @@ -701,7 +701,7 @@ msgid "Failed to enable personal API keys. Missing: %s" msgstr "" msgctxt "#30600" -msgid "Subtitles" +msgid "" msgstr "" msgctxt "#30601" @@ -761,7 +761,7 @@ msgid "" msgstr "" msgctxt "#30615" -msgid "Cancel" +msgid "" msgstr "" msgctxt "#30616" @@ -777,7 +777,7 @@ msgid "" msgstr "" msgctxt "#30619" -msgid "Port" +msgid "" msgstr "" msgctxt "#30620" @@ -821,7 +821,7 @@ msgid "IP whitelist (comma delimited)" msgstr "" msgctxt "#30630" -msgid "Save" +msgid "" msgstr "" msgctxt "#30631" @@ -937,7 +937,7 @@ msgid "Enter a name for this user" msgstr "" msgctxt "#30659" -msgid "User is now '%s'" +msgid "User is now \"%s\"" msgstr "" msgctxt "#30660" @@ -961,15 +961,15 @@ msgid "Switch user" msgstr "" msgctxt "#30665" -msgid "Switch to '%s' now?" +msgid "Switch to \"%s\" now?" msgstr "" msgctxt "#30666" -msgid "%s removed" +msgid "\"%s\" removed" msgstr "" msgctxt "#30667" -msgid "Renamed '%s' to '%s'" +msgid "Renamed \"%s\" to \"%s\"" msgstr "" msgctxt "#30668" @@ -1113,7 +1113,7 @@ msgid "Play with subtitles" msgstr "" msgctxt "#30703" -msgid "Are you sure?" +msgid "" msgstr "" msgctxt "#30704" @@ -1257,7 +1257,7 @@ msgid "" msgstr "" msgctxt "#30739" -msgid "" +msgid "Subscribers" msgstr "" msgctxt "#30740" @@ -1477,11 +1477,11 @@ msgid "Views count display colour" msgstr "" msgctxt "#30794" -msgid "Likes count display colour" +msgid "Subscriber/Likes count display colour" msgstr "" msgctxt "#30795" -msgid "Comments count display colour" +msgid "Videos/Comments count display colour" msgstr "" msgctxt "#30796" @@ -1579,3 +1579,7 @@ msgstr "" msgctxt "#30819" msgid "Play from start" msgstr "" + +msgctxt "#30820" +msgid "Podcast" +msgstr "" diff --git a/plugin.video.youtube/resources/language/resource.language.mk_mk/strings.po b/plugin.video.youtube/resources/language/resource.language.mk_mk/strings.po index c0a9d52c9d..805afeedcd 100644 --- a/plugin.video.youtube/resources/language/resource.language.mk_mk/strings.po +++ b/plugin.video.youtube/resources/language/resource.language.mk_mk/strings.po @@ -37,7 +37,7 @@ msgstr "" # msgstr "" # Kodion Settings msgctxt "#30000" -msgid "General" +msgid "" msgstr "" msgctxt "#30001" @@ -151,7 +151,7 @@ msgid "Configure %s?" msgstr "" msgctxt "#30031" -msgid "Advanced" +msgid "" msgstr "" msgctxt "#30032" @@ -217,7 +217,7 @@ msgid "Watch Later" msgstr "" msgctxt "#30108" -msgid "Remove" +msgid "" msgstr "" msgctxt "#30109" @@ -237,7 +237,7 @@ msgid "Sign Out" msgstr "" msgctxt "#30113" -msgid "Rename" +msgid "" msgstr "" msgctxt "#30114" @@ -257,7 +257,7 @@ msgid "Remove \"%s\"?" msgstr "" msgctxt "#30118" -msgid "Delete" +msgid "" msgstr "" msgctxt "#30119" @@ -301,11 +301,11 @@ msgstr "" # YouTube # empty strings from id 30206 to 30499 msgctxt "#30500" -msgid "Channels" +msgid "" msgstr "" msgctxt "#30501" -msgid "Playlists" +msgid "" msgstr "" msgctxt "#30502" @@ -361,7 +361,7 @@ msgid "Related Videos" msgstr "" msgctxt "#30515" -msgid "Auto-Remove from 'Watch Later'" +msgid "Auto-Remove from Watch Later" msgstr "" msgctxt "#30516" @@ -385,15 +385,15 @@ msgid "Add to..." msgstr "" msgctxt "#30521" -msgid "Select playlist" +msgid "" msgstr "" msgctxt "#30522" -msgid "New playlist..." +msgid "" msgstr "" msgctxt "#30523" -msgid "Language" +msgid "" msgstr "" msgctxt "#30524" @@ -425,11 +425,11 @@ msgid "I dislike this" msgstr "" msgctxt "#30531" -msgid "Play all" +msgid "" msgstr "" msgctxt "#30532" -msgid "Default" +msgid "" msgstr "" msgctxt "#30533" @@ -437,7 +437,7 @@ msgid "Reverse" msgstr "" msgctxt "#30534" -msgid "Shuffle" +msgid "" msgstr "" msgctxt "#30535" @@ -457,7 +457,7 @@ msgid "Disliked Videos" msgstr "" msgctxt "#30539" -msgid "Live" +msgid "" msgstr "" msgctxt "#30540" @@ -473,7 +473,7 @@ msgid "rtmpe streams are not supported" msgstr "" msgctxt "#30543" -msgid "Refresh" +msgid "" msgstr "" msgctxt "#30544" @@ -485,15 +485,15 @@ msgid "No further links found." msgstr "" msgctxt "#30546" -msgid "Please log in twice!" +msgid "Please complete all login prompts" msgstr "" msgctxt "#30547" -msgid "You must enable two applications so that YouTube is functioning properly." +msgid "You may be prompted to enable two applications so that YouTube is functioning properly." msgstr "" msgctxt "#30548" -msgid "More..." +msgid "" msgstr "" msgctxt "#30549" @@ -501,7 +501,7 @@ msgid "No videos streams found" msgstr "" msgctxt "#30550" -msgid "Region" +msgid "" msgstr "" msgctxt "#30551" @@ -541,15 +541,15 @@ msgid "Delete settings.xml" msgstr "" msgctxt "#30560" -msgid "Subtitle language" +msgid "" msgstr "" msgctxt "#30561" -msgid "None" +msgid "" msgstr "" msgctxt "#30562" -msgid "" +msgid "View all" msgstr "" msgctxt "#30563" @@ -565,7 +565,7 @@ msgid "" msgstr "" msgctxt "#30566" -msgid "Prompt" +msgid "" msgstr "" msgctxt "#30567" @@ -577,11 +577,11 @@ msgid "Remove as Watch Later" msgstr "" msgctxt "#30569" -msgid "Are you sure you want to remove '%s' as your Watch Later list?" +msgid "Are you sure you want to remove \"%s\" as your Watch Later list?" msgstr "" msgctxt "#30570" -msgid "Are you sure you want to replace your current Watch Later list with '%s'?" +msgid "Are you sure you want to replace your current Watch Later list with \"%s\"?" msgstr "" msgctxt "#30571" @@ -593,11 +593,11 @@ msgid "Remove as History" msgstr "" msgctxt "#30573" -msgid "Are you sure you want to remove '%s' as your History list?" +msgid "Are you sure you want to remove \"%s\" as your History list?" msgstr "" msgctxt "#30574" -msgid "Are you sure you want to replace your current History list with '%s'?" +msgid "Are you sure you want to replace your current History list with \"%s\"?" msgstr "" msgctxt "#30575" @@ -609,7 +609,7 @@ msgid "Failed" msgstr "" msgctxt "#30577" -msgid "Settings" +msgid "" msgstr "" msgctxt "#30578" @@ -633,7 +633,7 @@ msgid "Autoplay suggested videos" msgstr "" msgctxt "#30583" -msgid "Automatic" +msgid "" msgstr "" msgctxt "#30584" @@ -693,7 +693,7 @@ msgid "Updated: %s" msgstr "" msgctxt "#30598" -msgid "Personal API keys enabled" +msgid "" msgstr "" msgctxt "#30599" @@ -701,7 +701,7 @@ msgid "Failed to enable personal API keys. Missing: %s" msgstr "" msgctxt "#30600" -msgid "Subtitles" +msgid "" msgstr "" msgctxt "#30601" @@ -761,7 +761,7 @@ msgid "" msgstr "" msgctxt "#30615" -msgid "Cancel" +msgid "" msgstr "" msgctxt "#30616" @@ -777,7 +777,7 @@ msgid "" msgstr "" msgctxt "#30619" -msgid "Port" +msgid "" msgstr "" msgctxt "#30620" @@ -821,7 +821,7 @@ msgid "IP whitelist (comma delimited)" msgstr "" msgctxt "#30630" -msgid "Save" +msgid "" msgstr "" msgctxt "#30631" @@ -937,7 +937,7 @@ msgid "Enter a name for this user" msgstr "" msgctxt "#30659" -msgid "User is now '%s'" +msgid "User is now \"%s\"" msgstr "" msgctxt "#30660" @@ -961,15 +961,15 @@ msgid "Switch user" msgstr "" msgctxt "#30665" -msgid "Switch to '%s' now?" +msgid "Switch to \"%s\" now?" msgstr "" msgctxt "#30666" -msgid "%s removed" +msgid "\"%s\" removed" msgstr "" msgctxt "#30667" -msgid "Renamed '%s' to '%s'" +msgid "Renamed \"%s\" to \"%s\"" msgstr "" msgctxt "#30668" @@ -1113,7 +1113,7 @@ msgid "Play with subtitles" msgstr "" msgctxt "#30703" -msgid "Are you sure?" +msgid "" msgstr "" msgctxt "#30704" @@ -1257,7 +1257,7 @@ msgid "" msgstr "" msgctxt "#30739" -msgid "" +msgid "Subscribers" msgstr "" msgctxt "#30740" @@ -1477,11 +1477,11 @@ msgid "Views count display colour" msgstr "" msgctxt "#30794" -msgid "Likes count display colour" +msgid "Subscriber/Likes count display colour" msgstr "" msgctxt "#30795" -msgid "Comments count display colour" +msgid "Videos/Comments count display colour" msgstr "" msgctxt "#30796" @@ -1579,3 +1579,7 @@ msgstr "" msgctxt "#30819" msgid "Play from start" msgstr "" + +msgctxt "#30820" +msgid "Podcast" +msgstr "" diff --git a/plugin.video.youtube/resources/language/resource.language.ml_in/strings.po b/plugin.video.youtube/resources/language/resource.language.ml_in/strings.po index 29da1c697e..9d1a665236 100644 --- a/plugin.video.youtube/resources/language/resource.language.ml_in/strings.po +++ b/plugin.video.youtube/resources/language/resource.language.ml_in/strings.po @@ -37,7 +37,7 @@ msgstr "" # msgstr "" # Kodion Settings msgctxt "#30000" -msgid "General" +msgid "" msgstr "" msgctxt "#30001" @@ -151,7 +151,7 @@ msgid "Configure %s?" msgstr "" msgctxt "#30031" -msgid "Advanced" +msgid "" msgstr "" msgctxt "#30032" @@ -217,7 +217,7 @@ msgid "Watch Later" msgstr "" msgctxt "#30108" -msgid "Remove" +msgid "" msgstr "" msgctxt "#30109" @@ -237,7 +237,7 @@ msgid "Sign Out" msgstr "" msgctxt "#30113" -msgid "Rename" +msgid "" msgstr "" msgctxt "#30114" @@ -257,7 +257,7 @@ msgid "Remove \"%s\"?" msgstr "" msgctxt "#30118" -msgid "Delete" +msgid "" msgstr "" msgctxt "#30119" @@ -301,11 +301,11 @@ msgstr "" # YouTube # empty strings from id 30206 to 30499 msgctxt "#30500" -msgid "Channels" +msgid "" msgstr "" msgctxt "#30501" -msgid "Playlists" +msgid "" msgstr "" msgctxt "#30502" @@ -361,7 +361,7 @@ msgid "Related Videos" msgstr "" msgctxt "#30515" -msgid "Auto-Remove from 'Watch Later'" +msgid "Auto-Remove from Watch Later" msgstr "" msgctxt "#30516" @@ -385,15 +385,15 @@ msgid "Add to..." msgstr "" msgctxt "#30521" -msgid "Select playlist" +msgid "" msgstr "" msgctxt "#30522" -msgid "New playlist..." +msgid "" msgstr "" msgctxt "#30523" -msgid "Language" +msgid "" msgstr "" msgctxt "#30524" @@ -425,11 +425,11 @@ msgid "I dislike this" msgstr "" msgctxt "#30531" -msgid "Play all" +msgid "" msgstr "" msgctxt "#30532" -msgid "Default" +msgid "" msgstr "" msgctxt "#30533" @@ -437,7 +437,7 @@ msgid "Reverse" msgstr "" msgctxt "#30534" -msgid "Shuffle" +msgid "" msgstr "" msgctxt "#30535" @@ -457,7 +457,7 @@ msgid "Disliked Videos" msgstr "" msgctxt "#30539" -msgid "Live" +msgid "" msgstr "" msgctxt "#30540" @@ -473,7 +473,7 @@ msgid "rtmpe streams are not supported" msgstr "" msgctxt "#30543" -msgid "Refresh" +msgid "" msgstr "" msgctxt "#30544" @@ -485,15 +485,15 @@ msgid "No further links found." msgstr "" msgctxt "#30546" -msgid "Please log in twice!" +msgid "Please complete all login prompts" msgstr "" msgctxt "#30547" -msgid "You must enable two applications so that YouTube is functioning properly." +msgid "You may be prompted to enable two applications so that YouTube is functioning properly." msgstr "" msgctxt "#30548" -msgid "More..." +msgid "" msgstr "" msgctxt "#30549" @@ -501,7 +501,7 @@ msgid "No videos streams found" msgstr "" msgctxt "#30550" -msgid "Region" +msgid "" msgstr "" msgctxt "#30551" @@ -541,15 +541,15 @@ msgid "Delete settings.xml" msgstr "" msgctxt "#30560" -msgid "Subtitle language" +msgid "" msgstr "" msgctxt "#30561" -msgid "None" +msgid "" msgstr "" msgctxt "#30562" -msgid "" +msgid "View all" msgstr "" msgctxt "#30563" @@ -565,7 +565,7 @@ msgid "" msgstr "" msgctxt "#30566" -msgid "Prompt" +msgid "" msgstr "" msgctxt "#30567" @@ -577,11 +577,11 @@ msgid "Remove as Watch Later" msgstr "" msgctxt "#30569" -msgid "Are you sure you want to remove '%s' as your Watch Later list?" +msgid "Are you sure you want to remove \"%s\" as your Watch Later list?" msgstr "" msgctxt "#30570" -msgid "Are you sure you want to replace your current Watch Later list with '%s'?" +msgid "Are you sure you want to replace your current Watch Later list with \"%s\"?" msgstr "" msgctxt "#30571" @@ -593,11 +593,11 @@ msgid "Remove as History" msgstr "" msgctxt "#30573" -msgid "Are you sure you want to remove '%s' as your History list?" +msgid "Are you sure you want to remove \"%s\" as your History list?" msgstr "" msgctxt "#30574" -msgid "Are you sure you want to replace your current History list with '%s'?" +msgid "Are you sure you want to replace your current History list with \"%s\"?" msgstr "" msgctxt "#30575" @@ -609,7 +609,7 @@ msgid "Failed" msgstr "" msgctxt "#30577" -msgid "Settings" +msgid "" msgstr "" msgctxt "#30578" @@ -633,7 +633,7 @@ msgid "Autoplay suggested videos" msgstr "" msgctxt "#30583" -msgid "Automatic" +msgid "" msgstr "" msgctxt "#30584" @@ -693,7 +693,7 @@ msgid "Updated: %s" msgstr "" msgctxt "#30598" -msgid "Personal API keys enabled" +msgid "" msgstr "" msgctxt "#30599" @@ -701,7 +701,7 @@ msgid "Failed to enable personal API keys. Missing: %s" msgstr "" msgctxt "#30600" -msgid "Subtitles" +msgid "" msgstr "" msgctxt "#30601" @@ -761,7 +761,7 @@ msgid "" msgstr "" msgctxt "#30615" -msgid "Cancel" +msgid "" msgstr "" msgctxt "#30616" @@ -777,7 +777,7 @@ msgid "" msgstr "" msgctxt "#30619" -msgid "Port" +msgid "" msgstr "" msgctxt "#30620" @@ -821,7 +821,7 @@ msgid "IP whitelist (comma delimited)" msgstr "" msgctxt "#30630" -msgid "Save" +msgid "" msgstr "" msgctxt "#30631" @@ -937,7 +937,7 @@ msgid "Enter a name for this user" msgstr "" msgctxt "#30659" -msgid "User is now '%s'" +msgid "User is now \"%s\"" msgstr "" msgctxt "#30660" @@ -961,15 +961,15 @@ msgid "Switch user" msgstr "" msgctxt "#30665" -msgid "Switch to '%s' now?" +msgid "Switch to \"%s\" now?" msgstr "" msgctxt "#30666" -msgid "%s removed" +msgid "\"%s\" removed" msgstr "" msgctxt "#30667" -msgid "Renamed '%s' to '%s'" +msgid "Renamed \"%s\" to \"%s\"" msgstr "" msgctxt "#30668" @@ -1113,7 +1113,7 @@ msgid "Play with subtitles" msgstr "" msgctxt "#30703" -msgid "Are you sure?" +msgid "" msgstr "" msgctxt "#30704" @@ -1257,7 +1257,7 @@ msgid "" msgstr "" msgctxt "#30739" -msgid "" +msgid "Subscribers" msgstr "" msgctxt "#30740" @@ -1477,11 +1477,11 @@ msgid "Views count display colour" msgstr "" msgctxt "#30794" -msgid "Likes count display colour" +msgid "Subscriber/Likes count display colour" msgstr "" msgctxt "#30795" -msgid "Comments count display colour" +msgid "Videos/Comments count display colour" msgstr "" msgctxt "#30796" @@ -1579,3 +1579,7 @@ msgstr "" msgctxt "#30819" msgid "Play from start" msgstr "" + +msgctxt "#30820" +msgid "Podcast" +msgstr "" diff --git a/plugin.video.youtube/resources/language/resource.language.mn_mn/strings.po b/plugin.video.youtube/resources/language/resource.language.mn_mn/strings.po index 30a2f7ea33..ee49165c6d 100644 --- a/plugin.video.youtube/resources/language/resource.language.mn_mn/strings.po +++ b/plugin.video.youtube/resources/language/resource.language.mn_mn/strings.po @@ -37,7 +37,7 @@ msgstr "" # msgstr "" # Kodion Settings msgctxt "#30000" -msgid "General" +msgid "" msgstr "" msgctxt "#30001" @@ -151,7 +151,7 @@ msgid "Configure %s?" msgstr "" msgctxt "#30031" -msgid "Advanced" +msgid "" msgstr "" msgctxt "#30032" @@ -217,7 +217,7 @@ msgid "Watch Later" msgstr "" msgctxt "#30108" -msgid "Remove" +msgid "" msgstr "" msgctxt "#30109" @@ -237,7 +237,7 @@ msgid "Sign Out" msgstr "" msgctxt "#30113" -msgid "Rename" +msgid "" msgstr "" msgctxt "#30114" @@ -257,7 +257,7 @@ msgid "Remove \"%s\"?" msgstr "" msgctxt "#30118" -msgid "Delete" +msgid "" msgstr "" msgctxt "#30119" @@ -301,11 +301,11 @@ msgstr "" # YouTube # empty strings from id 30206 to 30499 msgctxt "#30500" -msgid "Channels" +msgid "" msgstr "" msgctxt "#30501" -msgid "Playlists" +msgid "" msgstr "" msgctxt "#30502" @@ -361,7 +361,7 @@ msgid "Related Videos" msgstr "" msgctxt "#30515" -msgid "Auto-Remove from 'Watch Later'" +msgid "Auto-Remove from Watch Later" msgstr "" msgctxt "#30516" @@ -385,15 +385,15 @@ msgid "Add to..." msgstr "" msgctxt "#30521" -msgid "Select playlist" +msgid "" msgstr "" msgctxt "#30522" -msgid "New playlist..." +msgid "" msgstr "" msgctxt "#30523" -msgid "Language" +msgid "" msgstr "" msgctxt "#30524" @@ -425,11 +425,11 @@ msgid "I dislike this" msgstr "" msgctxt "#30531" -msgid "Play all" +msgid "" msgstr "" msgctxt "#30532" -msgid "Default" +msgid "" msgstr "" msgctxt "#30533" @@ -437,7 +437,7 @@ msgid "Reverse" msgstr "" msgctxt "#30534" -msgid "Shuffle" +msgid "" msgstr "" msgctxt "#30535" @@ -457,7 +457,7 @@ msgid "Disliked Videos" msgstr "" msgctxt "#30539" -msgid "Live" +msgid "" msgstr "" msgctxt "#30540" @@ -473,7 +473,7 @@ msgid "rtmpe streams are not supported" msgstr "" msgctxt "#30543" -msgid "Refresh" +msgid "" msgstr "" msgctxt "#30544" @@ -485,15 +485,15 @@ msgid "No further links found." msgstr "" msgctxt "#30546" -msgid "Please log in twice!" +msgid "Please complete all login prompts" msgstr "" msgctxt "#30547" -msgid "You must enable two applications so that YouTube is functioning properly." +msgid "You may be prompted to enable two applications so that YouTube is functioning properly." msgstr "" msgctxt "#30548" -msgid "More..." +msgid "" msgstr "" msgctxt "#30549" @@ -501,7 +501,7 @@ msgid "No videos streams found" msgstr "" msgctxt "#30550" -msgid "Region" +msgid "" msgstr "" msgctxt "#30551" @@ -541,15 +541,15 @@ msgid "Delete settings.xml" msgstr "" msgctxt "#30560" -msgid "Subtitle language" +msgid "" msgstr "" msgctxt "#30561" -msgid "None" +msgid "" msgstr "" msgctxt "#30562" -msgid "" +msgid "View all" msgstr "" msgctxt "#30563" @@ -565,7 +565,7 @@ msgid "" msgstr "" msgctxt "#30566" -msgid "Prompt" +msgid "" msgstr "" msgctxt "#30567" @@ -577,11 +577,11 @@ msgid "Remove as Watch Later" msgstr "" msgctxt "#30569" -msgid "Are you sure you want to remove '%s' as your Watch Later list?" +msgid "Are you sure you want to remove \"%s\" as your Watch Later list?" msgstr "" msgctxt "#30570" -msgid "Are you sure you want to replace your current Watch Later list with '%s'?" +msgid "Are you sure you want to replace your current Watch Later list with \"%s\"?" msgstr "" msgctxt "#30571" @@ -593,11 +593,11 @@ msgid "Remove as History" msgstr "" msgctxt "#30573" -msgid "Are you sure you want to remove '%s' as your History list?" +msgid "Are you sure you want to remove \"%s\" as your History list?" msgstr "" msgctxt "#30574" -msgid "Are you sure you want to replace your current History list with '%s'?" +msgid "Are you sure you want to replace your current History list with \"%s\"?" msgstr "" msgctxt "#30575" @@ -609,7 +609,7 @@ msgid "Failed" msgstr "" msgctxt "#30577" -msgid "Settings" +msgid "" msgstr "" msgctxt "#30578" @@ -633,7 +633,7 @@ msgid "Autoplay suggested videos" msgstr "" msgctxt "#30583" -msgid "Automatic" +msgid "" msgstr "" msgctxt "#30584" @@ -693,7 +693,7 @@ msgid "Updated: %s" msgstr "" msgctxt "#30598" -msgid "Personal API keys enabled" +msgid "" msgstr "" msgctxt "#30599" @@ -701,7 +701,7 @@ msgid "Failed to enable personal API keys. Missing: %s" msgstr "" msgctxt "#30600" -msgid "Subtitles" +msgid "" msgstr "" msgctxt "#30601" @@ -761,7 +761,7 @@ msgid "" msgstr "" msgctxt "#30615" -msgid "Cancel" +msgid "" msgstr "" msgctxt "#30616" @@ -777,7 +777,7 @@ msgid "" msgstr "" msgctxt "#30619" -msgid "Port" +msgid "" msgstr "" msgctxt "#30620" @@ -821,7 +821,7 @@ msgid "IP whitelist (comma delimited)" msgstr "" msgctxt "#30630" -msgid "Save" +msgid "" msgstr "" msgctxt "#30631" @@ -937,7 +937,7 @@ msgid "Enter a name for this user" msgstr "" msgctxt "#30659" -msgid "User is now '%s'" +msgid "User is now \"%s\"" msgstr "" msgctxt "#30660" @@ -961,15 +961,15 @@ msgid "Switch user" msgstr "" msgctxt "#30665" -msgid "Switch to '%s' now?" +msgid "Switch to \"%s\" now?" msgstr "" msgctxt "#30666" -msgid "%s removed" +msgid "\"%s\" removed" msgstr "" msgctxt "#30667" -msgid "Renamed '%s' to '%s'" +msgid "Renamed \"%s\" to \"%s\"" msgstr "" msgctxt "#30668" @@ -1113,7 +1113,7 @@ msgid "Play with subtitles" msgstr "" msgctxt "#30703" -msgid "Are you sure?" +msgid "" msgstr "" msgctxt "#30704" @@ -1257,7 +1257,7 @@ msgid "" msgstr "" msgctxt "#30739" -msgid "" +msgid "Subscribers" msgstr "" msgctxt "#30740" @@ -1477,11 +1477,11 @@ msgid "Views count display colour" msgstr "" msgctxt "#30794" -msgid "Likes count display colour" +msgid "Subscriber/Likes count display colour" msgstr "" msgctxt "#30795" -msgid "Comments count display colour" +msgid "Videos/Comments count display colour" msgstr "" msgctxt "#30796" @@ -1579,3 +1579,7 @@ msgstr "" msgctxt "#30819" msgid "Play from start" msgstr "" + +msgctxt "#30820" +msgid "Podcast" +msgstr "" diff --git a/plugin.video.youtube/resources/language/resource.language.ms_my/strings.po b/plugin.video.youtube/resources/language/resource.language.ms_my/strings.po index dc1c1ac0b7..090f7911f6 100644 --- a/plugin.video.youtube/resources/language/resource.language.ms_my/strings.po +++ b/plugin.video.youtube/resources/language/resource.language.ms_my/strings.po @@ -37,7 +37,7 @@ msgstr "" # msgstr "" # Kodion Settings msgctxt "#30000" -msgid "General" +msgid "" msgstr "" msgctxt "#30001" @@ -151,7 +151,7 @@ msgid "Configure %s?" msgstr "" msgctxt "#30031" -msgid "Advanced" +msgid "" msgstr "" msgctxt "#30032" @@ -217,7 +217,7 @@ msgid "Watch Later" msgstr "" msgctxt "#30108" -msgid "Remove" +msgid "" msgstr "" msgctxt "#30109" @@ -237,7 +237,7 @@ msgid "Sign Out" msgstr "" msgctxt "#30113" -msgid "Rename" +msgid "" msgstr "" msgctxt "#30114" @@ -257,7 +257,7 @@ msgid "Remove \"%s\"?" msgstr "" msgctxt "#30118" -msgid "Delete" +msgid "" msgstr "" msgctxt "#30119" @@ -301,11 +301,11 @@ msgstr "" # YouTube # empty strings from id 30206 to 30499 msgctxt "#30500" -msgid "Channels" +msgid "" msgstr "" msgctxt "#30501" -msgid "Playlists" +msgid "" msgstr "" msgctxt "#30502" @@ -361,7 +361,7 @@ msgid "Related Videos" msgstr "" msgctxt "#30515" -msgid "Auto-Remove from 'Watch Later'" +msgid "Auto-Remove from Watch Later" msgstr "" msgctxt "#30516" @@ -385,15 +385,15 @@ msgid "Add to..." msgstr "" msgctxt "#30521" -msgid "Select playlist" +msgid "" msgstr "" msgctxt "#30522" -msgid "New playlist..." +msgid "" msgstr "" msgctxt "#30523" -msgid "Language" +msgid "" msgstr "" msgctxt "#30524" @@ -425,11 +425,11 @@ msgid "I dislike this" msgstr "" msgctxt "#30531" -msgid "Play all" +msgid "" msgstr "" msgctxt "#30532" -msgid "Default" +msgid "" msgstr "" msgctxt "#30533" @@ -437,7 +437,7 @@ msgid "Reverse" msgstr "" msgctxt "#30534" -msgid "Shuffle" +msgid "" msgstr "" msgctxt "#30535" @@ -457,7 +457,7 @@ msgid "Disliked Videos" msgstr "" msgctxt "#30539" -msgid "Live" +msgid "" msgstr "" msgctxt "#30540" @@ -473,7 +473,7 @@ msgid "rtmpe streams are not supported" msgstr "" msgctxt "#30543" -msgid "Refresh" +msgid "" msgstr "" msgctxt "#30544" @@ -485,15 +485,15 @@ msgid "No further links found." msgstr "" msgctxt "#30546" -msgid "Please log in twice!" +msgid "Please complete all login prompts" msgstr "" msgctxt "#30547" -msgid "You must enable two applications so that YouTube is functioning properly." +msgid "You may be prompted to enable two applications so that YouTube is functioning properly." msgstr "" msgctxt "#30548" -msgid "More..." +msgid "" msgstr "" msgctxt "#30549" @@ -501,7 +501,7 @@ msgid "No videos streams found" msgstr "" msgctxt "#30550" -msgid "Region" +msgid "" msgstr "" msgctxt "#30551" @@ -541,15 +541,15 @@ msgid "Delete settings.xml" msgstr "" msgctxt "#30560" -msgid "Subtitle language" +msgid "" msgstr "" msgctxt "#30561" -msgid "None" +msgid "" msgstr "" msgctxt "#30562" -msgid "" +msgid "View all" msgstr "" msgctxt "#30563" @@ -565,7 +565,7 @@ msgid "" msgstr "" msgctxt "#30566" -msgid "Prompt" +msgid "" msgstr "" msgctxt "#30567" @@ -577,11 +577,11 @@ msgid "Remove as Watch Later" msgstr "" msgctxt "#30569" -msgid "Are you sure you want to remove '%s' as your Watch Later list?" +msgid "Are you sure you want to remove \"%s\" as your Watch Later list?" msgstr "" msgctxt "#30570" -msgid "Are you sure you want to replace your current Watch Later list with '%s'?" +msgid "Are you sure you want to replace your current Watch Later list with \"%s\"?" msgstr "" msgctxt "#30571" @@ -593,11 +593,11 @@ msgid "Remove as History" msgstr "" msgctxt "#30573" -msgid "Are you sure you want to remove '%s' as your History list?" +msgid "Are you sure you want to remove \"%s\" as your History list?" msgstr "" msgctxt "#30574" -msgid "Are you sure you want to replace your current History list with '%s'?" +msgid "Are you sure you want to replace your current History list with \"%s\"?" msgstr "" msgctxt "#30575" @@ -609,7 +609,7 @@ msgid "Failed" msgstr "" msgctxt "#30577" -msgid "Settings" +msgid "" msgstr "" msgctxt "#30578" @@ -633,7 +633,7 @@ msgid "Autoplay suggested videos" msgstr "" msgctxt "#30583" -msgid "Automatic" +msgid "" msgstr "" msgctxt "#30584" @@ -693,7 +693,7 @@ msgid "Updated: %s" msgstr "" msgctxt "#30598" -msgid "Personal API keys enabled" +msgid "" msgstr "" msgctxt "#30599" @@ -701,7 +701,7 @@ msgid "Failed to enable personal API keys. Missing: %s" msgstr "" msgctxt "#30600" -msgid "Subtitles" +msgid "" msgstr "" msgctxt "#30601" @@ -761,7 +761,7 @@ msgid "" msgstr "" msgctxt "#30615" -msgid "Cancel" +msgid "" msgstr "" msgctxt "#30616" @@ -777,7 +777,7 @@ msgid "" msgstr "" msgctxt "#30619" -msgid "Port" +msgid "" msgstr "" msgctxt "#30620" @@ -821,7 +821,7 @@ msgid "IP whitelist (comma delimited)" msgstr "" msgctxt "#30630" -msgid "Save" +msgid "" msgstr "" msgctxt "#30631" @@ -937,7 +937,7 @@ msgid "Enter a name for this user" msgstr "" msgctxt "#30659" -msgid "User is now '%s'" +msgid "User is now \"%s\"" msgstr "" msgctxt "#30660" @@ -961,15 +961,15 @@ msgid "Switch user" msgstr "" msgctxt "#30665" -msgid "Switch to '%s' now?" +msgid "Switch to \"%s\" now?" msgstr "" msgctxt "#30666" -msgid "%s removed" +msgid "\"%s\" removed" msgstr "" msgctxt "#30667" -msgid "Renamed '%s' to '%s'" +msgid "Renamed \"%s\" to \"%s\"" msgstr "" msgctxt "#30668" @@ -1113,7 +1113,7 @@ msgid "Play with subtitles" msgstr "" msgctxt "#30703" -msgid "Are you sure?" +msgid "" msgstr "" msgctxt "#30704" @@ -1257,7 +1257,7 @@ msgid "" msgstr "" msgctxt "#30739" -msgid "" +msgid "Subscribers" msgstr "" msgctxt "#30740" @@ -1477,11 +1477,11 @@ msgid "Views count display colour" msgstr "" msgctxt "#30794" -msgid "Likes count display colour" +msgid "Subscriber/Likes count display colour" msgstr "" msgctxt "#30795" -msgid "Comments count display colour" +msgid "Videos/Comments count display colour" msgstr "" msgctxt "#30796" @@ -1579,3 +1579,7 @@ msgstr "" msgctxt "#30819" msgid "Play from start" msgstr "" + +msgctxt "#30820" +msgid "Podcast" +msgstr "" diff --git a/plugin.video.youtube/resources/language/resource.language.mt_mt/strings.po b/plugin.video.youtube/resources/language/resource.language.mt_mt/strings.po index b08a8d8fb1..d342ac4e20 100644 --- a/plugin.video.youtube/resources/language/resource.language.mt_mt/strings.po +++ b/plugin.video.youtube/resources/language/resource.language.mt_mt/strings.po @@ -37,7 +37,7 @@ msgstr "" # msgstr "" # Kodion Settings msgctxt "#30000" -msgid "General" +msgid "" msgstr "" msgctxt "#30001" @@ -151,7 +151,7 @@ msgid "Configure %s?" msgstr "" msgctxt "#30031" -msgid "Advanced" +msgid "" msgstr "" msgctxt "#30032" @@ -217,7 +217,7 @@ msgid "Watch Later" msgstr "" msgctxt "#30108" -msgid "Remove" +msgid "" msgstr "" msgctxt "#30109" @@ -237,7 +237,7 @@ msgid "Sign Out" msgstr "" msgctxt "#30113" -msgid "Rename" +msgid "" msgstr "" msgctxt "#30114" @@ -257,7 +257,7 @@ msgid "Remove \"%s\"?" msgstr "" msgctxt "#30118" -msgid "Delete" +msgid "" msgstr "" msgctxt "#30119" @@ -301,11 +301,11 @@ msgstr "" # YouTube # empty strings from id 30206 to 30499 msgctxt "#30500" -msgid "Channels" +msgid "" msgstr "" msgctxt "#30501" -msgid "Playlists" +msgid "" msgstr "" msgctxt "#30502" @@ -361,7 +361,7 @@ msgid "Related Videos" msgstr "" msgctxt "#30515" -msgid "Auto-Remove from 'Watch Later'" +msgid "Auto-Remove from Watch Later" msgstr "" msgctxt "#30516" @@ -385,15 +385,15 @@ msgid "Add to..." msgstr "" msgctxt "#30521" -msgid "Select playlist" +msgid "" msgstr "" msgctxt "#30522" -msgid "New playlist..." +msgid "" msgstr "" msgctxt "#30523" -msgid "Language" +msgid "" msgstr "" msgctxt "#30524" @@ -425,11 +425,11 @@ msgid "I dislike this" msgstr "" msgctxt "#30531" -msgid "Play all" +msgid "" msgstr "" msgctxt "#30532" -msgid "Default" +msgid "" msgstr "" msgctxt "#30533" @@ -437,7 +437,7 @@ msgid "Reverse" msgstr "" msgctxt "#30534" -msgid "Shuffle" +msgid "" msgstr "" msgctxt "#30535" @@ -457,7 +457,7 @@ msgid "Disliked Videos" msgstr "" msgctxt "#30539" -msgid "Live" +msgid "" msgstr "" msgctxt "#30540" @@ -473,7 +473,7 @@ msgid "rtmpe streams are not supported" msgstr "" msgctxt "#30543" -msgid "Refresh" +msgid "" msgstr "" msgctxt "#30544" @@ -485,15 +485,15 @@ msgid "No further links found." msgstr "" msgctxt "#30546" -msgid "Please log in twice!" +msgid "Please complete all login prompts" msgstr "" msgctxt "#30547" -msgid "You must enable two applications so that YouTube is functioning properly." +msgid "You may be prompted to enable two applications so that YouTube is functioning properly." msgstr "" msgctxt "#30548" -msgid "More..." +msgid "" msgstr "" msgctxt "#30549" @@ -501,7 +501,7 @@ msgid "No videos streams found" msgstr "" msgctxt "#30550" -msgid "Region" +msgid "" msgstr "" msgctxt "#30551" @@ -541,15 +541,15 @@ msgid "Delete settings.xml" msgstr "" msgctxt "#30560" -msgid "Subtitle language" +msgid "" msgstr "" msgctxt "#30561" -msgid "None" +msgid "" msgstr "" msgctxt "#30562" -msgid "" +msgid "View all" msgstr "" msgctxt "#30563" @@ -565,7 +565,7 @@ msgid "" msgstr "" msgctxt "#30566" -msgid "Prompt" +msgid "" msgstr "" msgctxt "#30567" @@ -577,11 +577,11 @@ msgid "Remove as Watch Later" msgstr "" msgctxt "#30569" -msgid "Are you sure you want to remove '%s' as your Watch Later list?" +msgid "Are you sure you want to remove \"%s\" as your Watch Later list?" msgstr "" msgctxt "#30570" -msgid "Are you sure you want to replace your current Watch Later list with '%s'?" +msgid "Are you sure you want to replace your current Watch Later list with \"%s\"?" msgstr "" msgctxt "#30571" @@ -593,11 +593,11 @@ msgid "Remove as History" msgstr "" msgctxt "#30573" -msgid "Are you sure you want to remove '%s' as your History list?" +msgid "Are you sure you want to remove \"%s\" as your History list?" msgstr "" msgctxt "#30574" -msgid "Are you sure you want to replace your current History list with '%s'?" +msgid "Are you sure you want to replace your current History list with \"%s\"?" msgstr "" msgctxt "#30575" @@ -609,7 +609,7 @@ msgid "Failed" msgstr "" msgctxt "#30577" -msgid "Settings" +msgid "" msgstr "" msgctxt "#30578" @@ -633,7 +633,7 @@ msgid "Autoplay suggested videos" msgstr "" msgctxt "#30583" -msgid "Automatic" +msgid "" msgstr "" msgctxt "#30584" @@ -693,7 +693,7 @@ msgid "Updated: %s" msgstr "" msgctxt "#30598" -msgid "Personal API keys enabled" +msgid "" msgstr "" msgctxt "#30599" @@ -701,7 +701,7 @@ msgid "Failed to enable personal API keys. Missing: %s" msgstr "" msgctxt "#30600" -msgid "Subtitles" +msgid "" msgstr "" msgctxt "#30601" @@ -761,7 +761,7 @@ msgid "" msgstr "" msgctxt "#30615" -msgid "Cancel" +msgid "" msgstr "" msgctxt "#30616" @@ -777,7 +777,7 @@ msgid "" msgstr "" msgctxt "#30619" -msgid "Port" +msgid "" msgstr "" msgctxt "#30620" @@ -821,7 +821,7 @@ msgid "IP whitelist (comma delimited)" msgstr "" msgctxt "#30630" -msgid "Save" +msgid "" msgstr "" msgctxt "#30631" @@ -937,7 +937,7 @@ msgid "Enter a name for this user" msgstr "" msgctxt "#30659" -msgid "User is now '%s'" +msgid "User is now \"%s\"" msgstr "" msgctxt "#30660" @@ -961,15 +961,15 @@ msgid "Switch user" msgstr "" msgctxt "#30665" -msgid "Switch to '%s' now?" +msgid "Switch to \"%s\" now?" msgstr "" msgctxt "#30666" -msgid "%s removed" +msgid "\"%s\" removed" msgstr "" msgctxt "#30667" -msgid "Renamed '%s' to '%s'" +msgid "Renamed \"%s\" to \"%s\"" msgstr "" msgctxt "#30668" @@ -1113,7 +1113,7 @@ msgid "Play with subtitles" msgstr "" msgctxt "#30703" -msgid "Are you sure?" +msgid "" msgstr "" msgctxt "#30704" @@ -1257,7 +1257,7 @@ msgid "" msgstr "" msgctxt "#30739" -msgid "" +msgid "Subscribers" msgstr "" msgctxt "#30740" @@ -1477,11 +1477,11 @@ msgid "Views count display colour" msgstr "" msgctxt "#30794" -msgid "Likes count display colour" +msgid "Subscriber/Likes count display colour" msgstr "" msgctxt "#30795" -msgid "Comments count display colour" +msgid "Videos/Comments count display colour" msgstr "" msgctxt "#30796" @@ -1579,3 +1579,7 @@ msgstr "" msgctxt "#30819" msgid "Play from start" msgstr "" + +msgctxt "#30820" +msgid "Podcast" +msgstr "" diff --git a/plugin.video.youtube/resources/language/resource.language.my_mm/strings.po b/plugin.video.youtube/resources/language/resource.language.my_mm/strings.po index 39eadbc19c..fa460269af 100644 --- a/plugin.video.youtube/resources/language/resource.language.my_mm/strings.po +++ b/plugin.video.youtube/resources/language/resource.language.my_mm/strings.po @@ -37,7 +37,7 @@ msgstr "" # msgstr "" # Kodion Settings msgctxt "#30000" -msgid "General" +msgid "" msgstr "" msgctxt "#30001" @@ -151,7 +151,7 @@ msgid "Configure %s?" msgstr "" msgctxt "#30031" -msgid "Advanced" +msgid "" msgstr "" msgctxt "#30032" @@ -217,7 +217,7 @@ msgid "Watch Later" msgstr "" msgctxt "#30108" -msgid "Remove" +msgid "" msgstr "" msgctxt "#30109" @@ -237,7 +237,7 @@ msgid "Sign Out" msgstr "" msgctxt "#30113" -msgid "Rename" +msgid "" msgstr "" msgctxt "#30114" @@ -257,7 +257,7 @@ msgid "Remove \"%s\"?" msgstr "" msgctxt "#30118" -msgid "Delete" +msgid "" msgstr "" msgctxt "#30119" @@ -301,11 +301,11 @@ msgstr "" # YouTube # empty strings from id 30206 to 30499 msgctxt "#30500" -msgid "Channels" +msgid "" msgstr "" msgctxt "#30501" -msgid "Playlists" +msgid "" msgstr "" msgctxt "#30502" @@ -361,7 +361,7 @@ msgid "Related Videos" msgstr "" msgctxt "#30515" -msgid "Auto-Remove from 'Watch Later'" +msgid "Auto-Remove from Watch Later" msgstr "" msgctxt "#30516" @@ -385,15 +385,15 @@ msgid "Add to..." msgstr "" msgctxt "#30521" -msgid "Select playlist" +msgid "" msgstr "" msgctxt "#30522" -msgid "New playlist..." +msgid "" msgstr "" msgctxt "#30523" -msgid "Language" +msgid "" msgstr "" msgctxt "#30524" @@ -425,11 +425,11 @@ msgid "I dislike this" msgstr "" msgctxt "#30531" -msgid "Play all" +msgid "" msgstr "" msgctxt "#30532" -msgid "Default" +msgid "" msgstr "" msgctxt "#30533" @@ -437,7 +437,7 @@ msgid "Reverse" msgstr "" msgctxt "#30534" -msgid "Shuffle" +msgid "" msgstr "" msgctxt "#30535" @@ -457,7 +457,7 @@ msgid "Disliked Videos" msgstr "" msgctxt "#30539" -msgid "Live" +msgid "" msgstr "" msgctxt "#30540" @@ -473,7 +473,7 @@ msgid "rtmpe streams are not supported" msgstr "" msgctxt "#30543" -msgid "Refresh" +msgid "" msgstr "" msgctxt "#30544" @@ -485,15 +485,15 @@ msgid "No further links found." msgstr "" msgctxt "#30546" -msgid "Please log in twice!" +msgid "Please complete all login prompts" msgstr "" msgctxt "#30547" -msgid "You must enable two applications so that YouTube is functioning properly." +msgid "You may be prompted to enable two applications so that YouTube is functioning properly." msgstr "" msgctxt "#30548" -msgid "More..." +msgid "" msgstr "" msgctxt "#30549" @@ -501,7 +501,7 @@ msgid "No videos streams found" msgstr "" msgctxt "#30550" -msgid "Region" +msgid "" msgstr "" msgctxt "#30551" @@ -541,15 +541,15 @@ msgid "Delete settings.xml" msgstr "" msgctxt "#30560" -msgid "Subtitle language" +msgid "" msgstr "" msgctxt "#30561" -msgid "None" +msgid "" msgstr "" msgctxt "#30562" -msgid "" +msgid "View all" msgstr "" msgctxt "#30563" @@ -565,7 +565,7 @@ msgid "" msgstr "" msgctxt "#30566" -msgid "Prompt" +msgid "" msgstr "" msgctxt "#30567" @@ -577,11 +577,11 @@ msgid "Remove as Watch Later" msgstr "" msgctxt "#30569" -msgid "Are you sure you want to remove '%s' as your Watch Later list?" +msgid "Are you sure you want to remove \"%s\" as your Watch Later list?" msgstr "" msgctxt "#30570" -msgid "Are you sure you want to replace your current Watch Later list with '%s'?" +msgid "Are you sure you want to replace your current Watch Later list with \"%s\"?" msgstr "" msgctxt "#30571" @@ -593,11 +593,11 @@ msgid "Remove as History" msgstr "" msgctxt "#30573" -msgid "Are you sure you want to remove '%s' as your History list?" +msgid "Are you sure you want to remove \"%s\" as your History list?" msgstr "" msgctxt "#30574" -msgid "Are you sure you want to replace your current History list with '%s'?" +msgid "Are you sure you want to replace your current History list with \"%s\"?" msgstr "" msgctxt "#30575" @@ -609,7 +609,7 @@ msgid "Failed" msgstr "" msgctxt "#30577" -msgid "Settings" +msgid "" msgstr "" msgctxt "#30578" @@ -633,7 +633,7 @@ msgid "Autoplay suggested videos" msgstr "" msgctxt "#30583" -msgid "Automatic" +msgid "" msgstr "" msgctxt "#30584" @@ -693,7 +693,7 @@ msgid "Updated: %s" msgstr "" msgctxt "#30598" -msgid "Personal API keys enabled" +msgid "" msgstr "" msgctxt "#30599" @@ -701,7 +701,7 @@ msgid "Failed to enable personal API keys. Missing: %s" msgstr "" msgctxt "#30600" -msgid "Subtitles" +msgid "" msgstr "" msgctxt "#30601" @@ -761,7 +761,7 @@ msgid "" msgstr "" msgctxt "#30615" -msgid "Cancel" +msgid "" msgstr "" msgctxt "#30616" @@ -777,7 +777,7 @@ msgid "" msgstr "" msgctxt "#30619" -msgid "Port" +msgid "" msgstr "" msgctxt "#30620" @@ -821,7 +821,7 @@ msgid "IP whitelist (comma delimited)" msgstr "" msgctxt "#30630" -msgid "Save" +msgid "" msgstr "" msgctxt "#30631" @@ -937,7 +937,7 @@ msgid "Enter a name for this user" msgstr "" msgctxt "#30659" -msgid "User is now '%s'" +msgid "User is now \"%s\"" msgstr "" msgctxt "#30660" @@ -961,15 +961,15 @@ msgid "Switch user" msgstr "" msgctxt "#30665" -msgid "Switch to '%s' now?" +msgid "Switch to \"%s\" now?" msgstr "" msgctxt "#30666" -msgid "%s removed" +msgid "\"%s\" removed" msgstr "" msgctxt "#30667" -msgid "Renamed '%s' to '%s'" +msgid "Renamed \"%s\" to \"%s\"" msgstr "" msgctxt "#30668" @@ -1113,7 +1113,7 @@ msgid "Play with subtitles" msgstr "" msgctxt "#30703" -msgid "Are you sure?" +msgid "" msgstr "" msgctxt "#30704" @@ -1257,7 +1257,7 @@ msgid "" msgstr "" msgctxt "#30739" -msgid "" +msgid "Subscribers" msgstr "" msgctxt "#30740" @@ -1477,11 +1477,11 @@ msgid "Views count display colour" msgstr "" msgctxt "#30794" -msgid "Likes count display colour" +msgid "Subscriber/Likes count display colour" msgstr "" msgctxt "#30795" -msgid "Comments count display colour" +msgid "Videos/Comments count display colour" msgstr "" msgctxt "#30796" @@ -1579,3 +1579,7 @@ msgstr "" msgctxt "#30819" msgid "Play from start" msgstr "" + +msgctxt "#30820" +msgid "Podcast" +msgstr "" diff --git a/plugin.video.youtube/resources/language/resource.language.nb_no/strings.po b/plugin.video.youtube/resources/language/resource.language.nb_no/strings.po index fe6df02f6d..88d8272264 100644 --- a/plugin.video.youtube/resources/language/resource.language.nb_no/strings.po +++ b/plugin.video.youtube/resources/language/resource.language.nb_no/strings.po @@ -31,14 +31,14 @@ msgstr "" # msgctxt "Addon Summary" # msgid "Plugin for YouTube" -# msgstr "Tillegg for YouTube" +# msgstr "" # msgctxt "Addon Description" # msgid "YouTube is a one of the biggest video-sharing websites of the world." -# msgstr "YouTube er en av verdens største nettsider for deling av videoer." +# msgstr "" # Kodion Settings msgctxt "#30000" -msgid "General" -msgstr "Generelt" +msgid "" +msgstr "" msgctxt "#30001" msgid "" @@ -151,8 +151,8 @@ msgid "Configure %s?" msgstr "" msgctxt "#30031" -msgid "Advanced" -msgstr "Avansert" +msgid "" +msgstr "" msgctxt "#30032" msgid "View: TV Shows" @@ -217,8 +217,8 @@ msgid "Watch Later" msgstr "Se senere" msgctxt "#30108" -msgid "Remove" -msgstr "Fjern" +msgid "" +msgstr "" msgctxt "#30109" msgid "" @@ -237,8 +237,8 @@ msgid "Sign Out" msgstr "Logg ut" msgctxt "#30113" -msgid "Rename" -msgstr "Gi nytt navn" +msgid "" +msgstr "" msgctxt "#30114" msgid "Confirm delete" @@ -257,8 +257,8 @@ msgid "Remove \"%s\"?" msgstr "Fjern \"%s\"?" msgctxt "#30118" -msgid "Delete" -msgstr "Slett" +msgid "" +msgstr "" msgctxt "#30119" msgid "Please wait..." @@ -299,14 +299,14 @@ msgid "" msgstr "" # YouTube -# empty strings from id 30204 to 30499 +# empty strings from id 30206 to 30499 msgctxt "#30500" -msgid "Channels" -msgstr "Kanaler" +msgid "" +msgstr "" msgctxt "#30501" -msgid "Playlists" -msgstr "Spillelister" +msgid "" +msgstr "" msgctxt "#30502" msgid "Go to %s" @@ -361,8 +361,8 @@ msgid "Related Videos" msgstr "Relaterte videoer" msgctxt "#30515" -msgid "Auto-Remove from 'Watch Later'" -msgstr "Autofjern fra 'Se senere'" +msgid "Auto-Remove from Watch Later" +msgstr "" msgctxt "#30516" msgid "Folders" @@ -385,16 +385,16 @@ msgid "Add to..." msgstr "Legg til..." msgctxt "#30521" -msgid "Select playlist" -msgstr "Velg spilleliste" +msgid "" +msgstr "" msgctxt "#30522" -msgid "New playlist..." -msgstr "Ny spilleliste..." +msgid "" +msgstr "" msgctxt "#30523" -msgid "Language" -msgstr "Språk" +msgid "" +msgstr "" msgctxt "#30524" msgid "Select language" @@ -425,20 +425,20 @@ msgid "I dislike this" msgstr "Jeg misliker dette" msgctxt "#30531" -msgid "Play all" -msgstr "Spill alle" +msgid "" +msgstr "" msgctxt "#30532" -msgid "Default" -msgstr "Standard" +msgid "" +msgstr "" msgctxt "#30533" msgid "Reverse" msgstr "Revers" msgctxt "#30534" -msgid "Shuffle" -msgstr "Tilfeldig" +msgid "" +msgstr "" msgctxt "#30535" msgid "Select the order of the playlist" @@ -457,8 +457,8 @@ msgid "Disliked Videos" msgstr "Mislikte videoer" msgctxt "#30539" -msgid "Live" -msgstr "Direkte" +msgid "" +msgstr "" msgctxt "#30540" msgid "Play with..." @@ -473,8 +473,8 @@ msgid "rtmpe streams are not supported" msgstr "rtmpe-strømmer er ikke støttet" msgctxt "#30543" -msgid "Refresh" -msgstr "Oppdater" +msgid "" +msgstr "" msgctxt "#30544" msgid "More Links from the description" @@ -485,24 +485,24 @@ msgid "No further links found." msgstr "Ingen flere lenker funnet." msgctxt "#30546" -msgid "Please log in twice!" -msgstr "Vennligst logg inn to ganger!" +msgid "Please complete all login prompts" +msgstr "" msgctxt "#30547" -msgid "You must enable two applications so that YouTube is functioning properly." -msgstr "Du må aktivere to applikasjoner så YouTube virker." +msgid "You may be prompted to enable two applications so that YouTube is functioning properly." +msgstr "" msgctxt "#30548" -msgid "More..." -msgstr "Mer..." +msgid "" +msgstr "" msgctxt "#30549" msgid "No videos streams found" msgstr "Ingen videostrøm funnet" msgctxt "#30550" -msgid "Region" -msgstr "Region" +msgid "" +msgstr "" msgctxt "#30551" msgid "Recommendations" @@ -541,15 +541,15 @@ msgid "Delete settings.xml" msgstr "Slett settings.xml" msgctxt "#30560" -msgid "Subtitle language" -msgstr "Språk for undertekst" +msgid "" +msgstr "" msgctxt "#30561" -msgid "None" -msgstr "Ingen" +msgid "" +msgstr "" msgctxt "#30562" -msgid "" +msgid "View all" msgstr "" msgctxt "#30563" @@ -565,8 +565,8 @@ msgid "" msgstr "" msgctxt "#30566" -msgid "Prompt" -msgstr "Spør" +msgid "" +msgstr "" msgctxt "#30567" msgid "Set as Watch Later" @@ -577,11 +577,11 @@ msgid "Remove as Watch Later" msgstr "" msgctxt "#30569" -msgid "Are you sure you want to remove '%s' as your Watch Later list?" +msgid "Are you sure you want to remove \"%s\" as your Watch Later list?" msgstr "" msgctxt "#30570" -msgid "Are you sure you want to replace your current Watch Later list with '%s'?" +msgid "Are you sure you want to replace your current Watch Later list with \"%s\"?" msgstr "" msgctxt "#30571" @@ -593,11 +593,11 @@ msgid "Remove as History" msgstr "" msgctxt "#30573" -msgid "Are you sure you want to remove '%s' as your History list?" +msgid "Are you sure you want to remove \"%s\" as your History list?" msgstr "" msgctxt "#30574" -msgid "Are you sure you want to replace your current History list with '%s'?" +msgid "Are you sure you want to replace your current History list with \"%s\"?" msgstr "" msgctxt "#30575" @@ -609,8 +609,8 @@ msgid "Failed" msgstr "" msgctxt "#30577" -msgid "Settings" -msgstr "Innstillinger" +msgid "" +msgstr "" msgctxt "#30578" msgid "Force SSL certificate verification" @@ -633,7 +633,7 @@ msgid "Autoplay suggested videos" msgstr "" msgctxt "#30583" -msgid "Automatic" +msgid "" msgstr "" msgctxt "#30584" @@ -693,7 +693,7 @@ msgid "Updated: %s" msgstr "" msgctxt "#30598" -msgid "Personal API keys enabled" +msgid "" msgstr "" msgctxt "#30599" @@ -701,7 +701,7 @@ msgid "Failed to enable personal API keys. Missing: %s" msgstr "" msgctxt "#30600" -msgid "Subtitles" +msgid "" msgstr "" msgctxt "#30601" @@ -761,7 +761,7 @@ msgid "" msgstr "" msgctxt "#30615" -msgid "Cancel" +msgid "" msgstr "" msgctxt "#30616" @@ -777,8 +777,8 @@ msgid "" msgstr "" msgctxt "#30619" -msgid "Port" -msgstr "Port" +msgid "" +msgstr "" msgctxt "#30620" msgid "Port %s already in use. Cannot start http server." @@ -821,7 +821,7 @@ msgid "IP whitelist (comma delimited)" msgstr "" msgctxt "#30630" -msgid "Save" +msgid "" msgstr "" msgctxt "#30631" @@ -937,7 +937,7 @@ msgid "Enter a name for this user" msgstr "" msgctxt "#30659" -msgid "User is now '%s'" +msgid "User is now \"%s\"" msgstr "" msgctxt "#30660" @@ -961,15 +961,15 @@ msgid "Switch user" msgstr "" msgctxt "#30665" -msgid "Switch to '%s' now?" +msgid "Switch to \"%s\" now?" msgstr "" msgctxt "#30666" -msgid "%s removed" +msgid "\"%s\" removed" msgstr "" msgctxt "#30667" -msgid "Renamed '%s' to '%s'" +msgid "Renamed \"%s\" to \"%s\"" msgstr "" msgctxt "#30668" @@ -1113,7 +1113,7 @@ msgid "Play with subtitles" msgstr "" msgctxt "#30703" -msgid "Are you sure?" +msgid "" msgstr "" msgctxt "#30704" @@ -1257,7 +1257,7 @@ msgid "" msgstr "" msgctxt "#30739" -msgid "" +msgid "Subscribers" msgstr "" msgctxt "#30740" @@ -1477,11 +1477,11 @@ msgid "Views count display colour" msgstr "" msgctxt "#30794" -msgid "Likes count display colour" +msgid "Subscriber/Likes count display colour" msgstr "" msgctxt "#30795" -msgid "Comments count display colour" +msgid "Videos/Comments count display colour" msgstr "" msgctxt "#30796" @@ -1580,6 +1580,119 @@ msgctxt "#30819" msgid "Play from start" msgstr "" +msgctxt "#30820" +msgid "Podcast" +msgstr "" + +#~ msgctxt "#30515" +#~ msgid "Auto-Remove from 'Watch Later'" +#~ msgstr "Autofjern fra 'Se senere'" + +# msgctxt "Addon Summary" +# msgid "Plugin for YouTube" +# msgstr "Tillegg for YouTube" +# msgctxt "Addon Description" +# msgid "YouTube is a one of the biggest video-sharing websites of the world." +# msgstr "YouTube er en av verdens største nettsider for deling av videoer." +# Kodion Settings +#~ msgctxt "#30000" +#~ msgid "General" +#~ msgstr "Generelt" + +#~ msgctxt "#30031" +#~ msgid "Advanced" +#~ msgstr "Avansert" + +#~ msgctxt "#30108" +#~ msgid "Remove" +#~ msgstr "Fjern" + +#~ msgctxt "#30113" +#~ msgid "Rename" +#~ msgstr "Gi nytt navn" + +#~ msgctxt "#30118" +#~ msgid "Delete" +#~ msgstr "Slett" + +# YouTube +# empty strings from id 30204 to 30499 +#~ msgctxt "#30500" +#~ msgid "Channels" +#~ msgstr "Kanaler" + +#~ msgctxt "#30501" +#~ msgid "Playlists" +#~ msgstr "Spillelister" + +#~ msgctxt "#30521" +#~ msgid "Select playlist" +#~ msgstr "Velg spilleliste" + +#~ msgctxt "#30522" +#~ msgid "New playlist..." +#~ msgstr "Ny spilleliste..." + +#~ msgctxt "#30523" +#~ msgid "Language" +#~ msgstr "Språk" + +#~ msgctxt "#30531" +#~ msgid "Play all" +#~ msgstr "Spill alle" + +#~ msgctxt "#30532" +#~ msgid "Default" +#~ msgstr "Standard" + +#~ msgctxt "#30534" +#~ msgid "Shuffle" +#~ msgstr "Tilfeldig" + +#~ msgctxt "#30539" +#~ msgid "Live" +#~ msgstr "Direkte" + +#~ msgctxt "#30543" +#~ msgid "Refresh" +#~ msgstr "Oppdater" + +#~ msgctxt "#30548" +#~ msgid "More..." +#~ msgstr "Mer..." + +#~ msgctxt "#30550" +#~ msgid "Region" +#~ msgstr "Region" + +#~ msgctxt "#30560" +#~ msgid "Subtitle language" +#~ msgstr "Språk for undertekst" + +#~ msgctxt "#30561" +#~ msgid "None" +#~ msgstr "Ingen" + +#~ msgctxt "#30566" +#~ msgid "Prompt" +#~ msgstr "Spør" + +#~ msgctxt "#30577" +#~ msgid "Settings" +#~ msgstr "Innstillinger" + +#~ msgctxt "#30619" +#~ msgid "Port" +#~ msgstr "Port" + +#~ msgctxt "#30546" +#~ msgid "Please log in twice!" +#~ msgstr "Vennligst logg inn to ganger!" + +#~ msgctxt "#30547" +#~ msgid "You must enable two applications so that YouTube is functioning properly." +#~ msgstr "Du må aktivere to applikasjoner så YouTube virker." + #~ msgctxt "#30001" #~ msgid "Username" #~ msgstr "Brukernavn" diff --git a/plugin.video.youtube/resources/language/resource.language.nl_nl/strings.po b/plugin.video.youtube/resources/language/resource.language.nl_nl/strings.po index 28e309b77e..9c5ac95868 100644 --- a/plugin.video.youtube/resources/language/resource.language.nl_nl/strings.po +++ b/plugin.video.youtube/resources/language/resource.language.nl_nl/strings.po @@ -31,14 +31,14 @@ msgstr "Deze plug-in wordt niet door Google ondersteund" # msgctxt "Addon Summary" # msgid "Plugin for YouTube" -# msgstr "Plugin voor YouTube" +# msgstr "" # msgctxt "Addon Description" # msgid "YouTube is a one of the biggest video-sharing websites of the world." -# msgstr "YouTube is een van de grootste sites ter wereld om video's te delen." +# msgstr "" # Kodion Settings msgctxt "#30000" -msgid "General" -msgstr "Algemeen" +msgid "" +msgstr "" msgctxt "#30001" msgid "" @@ -152,8 +152,8 @@ msgid "Configure %s?" msgstr "" msgctxt "#30031" -msgid "Advanced" -msgstr "Geavanceerd" +msgid "" +msgstr "" msgctxt "#30032" msgid "View: TV Shows" @@ -218,8 +218,8 @@ msgid "Watch Later" msgstr "Bekijk Later" msgctxt "#30108" -msgid "Remove" -msgstr "Verwijder" +msgid "" +msgstr "" msgctxt "#30109" msgid "" @@ -238,8 +238,8 @@ msgid "Sign Out" msgstr "Uitloggen" msgctxt "#30113" -msgid "Rename" -msgstr "Hernoemen" +msgid "" +msgstr "" msgctxt "#30114" msgid "Confirm delete" @@ -258,8 +258,8 @@ msgid "Remove \"%s\"?" msgstr "Verwijder \"%s\"?" msgctxt "#30118" -msgid "Delete" -msgstr "Verwijder" +msgid "" +msgstr "" msgctxt "#30119" msgid "Please wait..." @@ -302,12 +302,12 @@ msgstr "" # YouTube # empty strings from id 30206 to 30499 msgctxt "#30500" -msgid "Channels" -msgstr "Kanalen" +msgid "" +msgstr "" msgctxt "#30501" -msgid "Playlists" -msgstr "Afspeellijsten" +msgid "" +msgstr "" msgctxt "#30502" msgid "Go to %s" @@ -362,8 +362,8 @@ msgid "Related Videos" msgstr "Gerelateerde Video's" msgctxt "#30515" -msgid "Auto-Remove from 'Watch Later'" -msgstr "Verwijder automatisch van 'Later Bekijken'" +msgid "Auto-Remove from Watch Later" +msgstr "" msgctxt "#30516" msgid "Folders" @@ -386,16 +386,16 @@ msgid "Add to..." msgstr "Voeg toe aan..." msgctxt "#30521" -msgid "Select playlist" -msgstr "Selecteer afspeellijst" +msgid "" +msgstr "" msgctxt "#30522" -msgid "New playlist..." -msgstr "Nieuwe afspeellijst..." +msgid "" +msgstr "" msgctxt "#30523" -msgid "Language" -msgstr "Taal" +msgid "" +msgstr "" msgctxt "#30524" msgid "Select language" @@ -426,20 +426,20 @@ msgid "I dislike this" msgstr "Niet leuk" msgctxt "#30531" -msgid "Play all" -msgstr "Alles afspelen" +msgid "" +msgstr "" msgctxt "#30532" -msgid "Default" -msgstr "Standaard" +msgid "" +msgstr "" msgctxt "#30533" msgid "Reverse" msgstr "Omgekeerd" msgctxt "#30534" -msgid "Shuffle" -msgstr "Willekeurige volgorde" +msgid "" +msgstr "" msgctxt "#30535" msgid "Select the order of the playlist" @@ -458,8 +458,8 @@ msgid "Disliked Videos" msgstr "Video's die ik niet leuk vind" msgctxt "#30539" -msgid "Live" -msgstr "Live" +msgid "" +msgstr "" msgctxt "#30540" msgid "Play with..." @@ -474,8 +474,8 @@ msgid "rtmpe streams are not supported" msgstr "rtmpe streams worden niet ondersteund" msgctxt "#30543" -msgid "Refresh" -msgstr "Verversen" +msgid "" +msgstr "" msgctxt "#30544" msgid "More Links from the description" @@ -486,24 +486,24 @@ msgid "No further links found." msgstr "Geen verdere links gevonden" msgctxt "#30546" -msgid "Please log in twice!" -msgstr "Log AUB twee keer in!" +msgid "Please complete all login prompts" +msgstr "" msgctxt "#30547" -msgid "You must enable two applications so that YouTube is functioning properly." -msgstr "Je moet twee applicaties inschakelen zodat YouTube correct kan functioneren." +msgid "You may be prompted to enable two applications so that YouTube is functioning properly." +msgstr "" msgctxt "#30548" -msgid "More..." -msgstr "Meer..." +msgid "" +msgstr "" msgctxt "#30549" msgid "No videos streams found" msgstr "Geen videostreams gevonden" msgctxt "#30550" -msgid "Region" -msgstr "Regio" +msgid "" +msgstr "" msgctxt "#30551" msgid "Recommendations" @@ -542,15 +542,15 @@ msgid "Delete settings.xml" msgstr "Verwijder settings.xml" msgctxt "#30560" -msgid "Subtitle language" -msgstr "Te downloaden ondertitelingstaal" +msgid "" +msgstr "" msgctxt "#30561" -msgid "None" -msgstr "Geen" +msgid "" +msgstr "" msgctxt "#30562" -msgid "" +msgid "View all" msgstr "" msgctxt "#30563" @@ -566,8 +566,8 @@ msgid "" msgstr "" msgctxt "#30566" -msgid "Prompt" -msgstr "Waarschuwen" +msgid "" +msgstr "" msgctxt "#30567" msgid "Set as Watch Later" @@ -578,12 +578,12 @@ msgid "Remove as Watch Later" msgstr "Verwijder van Bekijk Later" msgctxt "#30569" -msgid "Are you sure you want to remove '%s' as your Watch Later list?" -msgstr "Weet je zeker dat je '%s' wilt verwijderen van je Bekijk Later lijst?" +msgid "Are you sure you want to remove \"%s\" as your Watch Later list?" +msgstr "" msgctxt "#30570" -msgid "Are you sure you want to replace your current Watch Later list with '%s'?" -msgstr "Weet je zeker dat je je huidige Bekijk Later lijst wilt vervangen met '%s'?" +msgid "Are you sure you want to replace your current Watch Later list with \"%s\"?" +msgstr "" msgctxt "#30571" msgid "Set as History" @@ -594,12 +594,12 @@ msgid "Remove as History" msgstr "Verwijder van geschiedenis" msgctxt "#30573" -msgid "Are you sure you want to remove '%s' as your History list?" -msgstr "Weet je zeker dat je '%s' wilt verwijderen van je Geschiedenis lijst?" +msgid "Are you sure you want to remove \"%s\" as your History list?" +msgstr "" msgctxt "#30574" -msgid "Are you sure you want to replace your current History list with '%s'?" -msgstr "Weet je zeker dat je je huidige Geschiedenis lijst wilt vervangen met '%s'?" +msgid "Are you sure you want to replace your current History list with \"%s\"?" +msgstr "" msgctxt "#30575" msgid "Succeeded" @@ -610,8 +610,8 @@ msgid "Failed" msgstr "Mislukt" msgctxt "#30577" -msgid "Settings" -msgstr "Instellingen" +msgid "" +msgstr "" msgctxt "#30578" msgid "Force SSL certificate verification" @@ -634,8 +634,8 @@ msgid "Autoplay suggested videos" msgstr "Speel aanbevolen video's automatisch af" msgctxt "#30583" -msgid "Automatic" -msgstr "Automatisch" +msgid "" +msgstr "" msgctxt "#30584" msgid "My Subscriptions (Filtered)" @@ -694,15 +694,15 @@ msgid "Updated: %s" msgstr "%s bijgewerkt" msgctxt "#30598" -msgid "Personal API keys enabled" -msgstr "Persoonlijke API sleutels ingeschakeld" +msgid "" +msgstr "" msgctxt "#30599" msgid "Failed to enable personal API keys. Missing: %s" msgstr "Inschakelen persoonlijke API sleutels mislukt. %s ontbreekt" msgctxt "#30600" -msgid "Subtitles" +msgid "" msgstr "" msgctxt "#30601" @@ -762,8 +762,8 @@ msgid "" msgstr "" msgctxt "#30615" -msgid "Cancel" -msgstr "Annuleren" +msgid "" +msgstr "" msgctxt "#30616" msgid "" @@ -778,8 +778,8 @@ msgid "" msgstr "" msgctxt "#30619" -msgid "Port" -msgstr "Poort" +msgid "" +msgstr "" msgctxt "#30620" msgid "Port %s already in use. Cannot start http server." @@ -822,8 +822,8 @@ msgid "IP whitelist (comma delimited)" msgstr "IP witte lijst (komma gescheiden)" msgctxt "#30630" -msgid "Save" -msgstr "Opslaan" +msgid "" +msgstr "" msgctxt "#30631" msgid "Successfully updated: %s" @@ -938,8 +938,8 @@ msgid "Enter a name for this user" msgstr "Voer een naam in voor deze gebruiker" msgctxt "#30659" -msgid "User is now '%s'" -msgstr "Gebruiker is nu '%s'" +msgid "User is now \"%s\"" +msgstr "" msgctxt "#30660" msgid "Users" @@ -962,16 +962,16 @@ msgid "Switch user" msgstr "Wissel van Gebruiker" msgctxt "#30665" -msgid "Switch to '%s' now?" -msgstr "Schakel nu om naar '%s'?" +msgid "Switch to \"%s\" now?" +msgstr "" msgctxt "#30666" -msgid "%s removed" +msgid "\"%s\" removed" msgstr "" msgctxt "#30667" -msgid "Renamed '%s' to '%s'" -msgstr "'%s' hernoemd naar '%s'" +msgid "Renamed \"%s\" to \"%s\"" +msgstr "" msgctxt "#30668" msgid "Play count minimum percent" @@ -1114,8 +1114,8 @@ msgid "Play with subtitles" msgstr "Afspelen met ondertiteling" msgctxt "#30703" -msgid "Are you sure?" -msgstr "Weet je dat zeker?" +msgid "" +msgstr "" msgctxt "#30704" msgid "Use YouTube website urls with default player" @@ -1258,7 +1258,7 @@ msgid "" msgstr "" msgctxt "#30739" -msgid "" +msgid "Subscribers" msgstr "" msgctxt "#30740" @@ -1478,11 +1478,11 @@ msgid "Views count display colour" msgstr "" msgctxt "#30794" -msgid "Likes count display colour" +msgid "Subscriber/Likes count display colour" msgstr "" msgctxt "#30795" -msgid "Comments count display colour" +msgid "Videos/Comments count display colour" msgstr "" msgctxt "#30796" @@ -1581,6 +1581,167 @@ msgctxt "#30819" msgid "Play from start" msgstr "" +msgctxt "#30820" +msgid "Podcast" +msgstr "" + +#~ msgctxt "#30515" +#~ msgid "Auto-Remove from 'Watch Later'" +#~ msgstr "Verwijder automatisch van 'Later Bekijken'" + +#~ msgctxt "#30569" +#~ msgid "Are you sure you want to remove '%s' as your Watch Later list?" +#~ msgstr "Weet je zeker dat je '%s' wilt verwijderen van je Bekijk Later lijst?" + +#~ msgctxt "#30570" +#~ msgid "Are you sure you want to replace your current Watch Later list with '%s'?" +#~ msgstr "Weet je zeker dat je je huidige Bekijk Later lijst wilt vervangen met '%s'?" + +#~ msgctxt "#30573" +#~ msgid "Are you sure you want to remove '%s' as your History list?" +#~ msgstr "Weet je zeker dat je '%s' wilt verwijderen van je Geschiedenis lijst?" + +#~ msgctxt "#30574" +#~ msgid "Are you sure you want to replace your current History list with '%s'?" +#~ msgstr "Weet je zeker dat je je huidige Geschiedenis lijst wilt vervangen met '%s'?" + +#~ msgctxt "#30659" +#~ msgid "User is now '%s'" +#~ msgstr "Gebruiker is nu '%s'" + +#~ msgctxt "#30665" +#~ msgid "Switch to '%s' now?" +#~ msgstr "Schakel nu om naar '%s'?" + +#~ msgctxt "#30667" +#~ msgid "Renamed '%s' to '%s'" +#~ msgstr "'%s' hernoemd naar '%s'" + +# msgctxt "Addon Summary" +# msgid "Plugin for YouTube" +# msgstr "Plugin voor YouTube" +# msgctxt "Addon Description" +# msgid "YouTube is a one of the biggest video-sharing websites of the world." +# msgstr "YouTube is een van de grootste sites ter wereld om video's te delen." +# Kodion Settings +#~ msgctxt "#30000" +#~ msgid "General" +#~ msgstr "Algemeen" + +#~ msgctxt "#30031" +#~ msgid "Advanced" +#~ msgstr "Geavanceerd" + +#~ msgctxt "#30108" +#~ msgid "Remove" +#~ msgstr "Verwijder" + +#~ msgctxt "#30113" +#~ msgid "Rename" +#~ msgstr "Hernoemen" + +#~ msgctxt "#30118" +#~ msgid "Delete" +#~ msgstr "Verwijder" + +# YouTube +# empty strings from id 30206 to 30499 +#~ msgctxt "#30500" +#~ msgid "Channels" +#~ msgstr "Kanalen" + +#~ msgctxt "#30501" +#~ msgid "Playlists" +#~ msgstr "Afspeellijsten" + +#~ msgctxt "#30521" +#~ msgid "Select playlist" +#~ msgstr "Selecteer afspeellijst" + +#~ msgctxt "#30522" +#~ msgid "New playlist..." +#~ msgstr "Nieuwe afspeellijst..." + +#~ msgctxt "#30523" +#~ msgid "Language" +#~ msgstr "Taal" + +#~ msgctxt "#30531" +#~ msgid "Play all" +#~ msgstr "Alles afspelen" + +#~ msgctxt "#30532" +#~ msgid "Default" +#~ msgstr "Standaard" + +#~ msgctxt "#30534" +#~ msgid "Shuffle" +#~ msgstr "Willekeurige volgorde" + +#~ msgctxt "#30539" +#~ msgid "Live" +#~ msgstr "Live" + +#~ msgctxt "#30543" +#~ msgid "Refresh" +#~ msgstr "Verversen" + +#~ msgctxt "#30548" +#~ msgid "More..." +#~ msgstr "Meer..." + +#~ msgctxt "#30550" +#~ msgid "Region" +#~ msgstr "Regio" + +#~ msgctxt "#30560" +#~ msgid "Subtitle language" +#~ msgstr "Te downloaden ondertitelingstaal" + +#~ msgctxt "#30561" +#~ msgid "None" +#~ msgstr "Geen" + +#~ msgctxt "#30566" +#~ msgid "Prompt" +#~ msgstr "Waarschuwen" + +#~ msgctxt "#30577" +#~ msgid "Settings" +#~ msgstr "Instellingen" + +#~ msgctxt "#30583" +#~ msgid "Automatic" +#~ msgstr "Automatisch" + +#~ msgctxt "#30598" +#~ msgid "Personal API keys enabled" +#~ msgstr "Persoonlijke API sleutels ingeschakeld" + +#~ msgctxt "#30615" +#~ msgid "Cancel" +#~ msgstr "Annuleren" + +#~ msgctxt "#30619" +#~ msgid "Port" +#~ msgstr "Poort" + +#~ msgctxt "#30630" +#~ msgid "Save" +#~ msgstr "Opslaan" + +#~ msgctxt "#30703" +#~ msgid "Are you sure?" +#~ msgstr "Weet je dat zeker?" + +#~ msgctxt "#30546" +#~ msgid "Please log in twice!" +#~ msgstr "Log AUB twee keer in!" + +#~ msgctxt "#30547" +#~ msgid "You must enable two applications so that YouTube is functioning properly." +#~ msgstr "Je moet twee applicaties inschakelen zodat YouTube correct kan functioneren." + #~ msgctxt "#30001" #~ msgid "Username" #~ msgstr "Gebruikersnaam" diff --git a/plugin.video.youtube/resources/language/resource.language.os_os/strings.po b/plugin.video.youtube/resources/language/resource.language.os_os/strings.po index 247d491ebe..3e35dcd634 100644 --- a/plugin.video.youtube/resources/language/resource.language.os_os/strings.po +++ b/plugin.video.youtube/resources/language/resource.language.os_os/strings.po @@ -37,7 +37,7 @@ msgstr "" # msgstr "" # Kodion Settings msgctxt "#30000" -msgid "General" +msgid "" msgstr "" msgctxt "#30001" @@ -151,7 +151,7 @@ msgid "Configure %s?" msgstr "" msgctxt "#30031" -msgid "Advanced" +msgid "" msgstr "" msgctxt "#30032" @@ -217,7 +217,7 @@ msgid "Watch Later" msgstr "" msgctxt "#30108" -msgid "Remove" +msgid "" msgstr "" msgctxt "#30109" @@ -237,7 +237,7 @@ msgid "Sign Out" msgstr "" msgctxt "#30113" -msgid "Rename" +msgid "" msgstr "" msgctxt "#30114" @@ -257,7 +257,7 @@ msgid "Remove \"%s\"?" msgstr "" msgctxt "#30118" -msgid "Delete" +msgid "" msgstr "" msgctxt "#30119" @@ -301,11 +301,11 @@ msgstr "" # YouTube # empty strings from id 30206 to 30499 msgctxt "#30500" -msgid "Channels" +msgid "" msgstr "" msgctxt "#30501" -msgid "Playlists" +msgid "" msgstr "" msgctxt "#30502" @@ -361,7 +361,7 @@ msgid "Related Videos" msgstr "" msgctxt "#30515" -msgid "Auto-Remove from 'Watch Later'" +msgid "Auto-Remove from Watch Later" msgstr "" msgctxt "#30516" @@ -385,15 +385,15 @@ msgid "Add to..." msgstr "" msgctxt "#30521" -msgid "Select playlist" +msgid "" msgstr "" msgctxt "#30522" -msgid "New playlist..." +msgid "" msgstr "" msgctxt "#30523" -msgid "Language" +msgid "" msgstr "" msgctxt "#30524" @@ -425,11 +425,11 @@ msgid "I dislike this" msgstr "" msgctxt "#30531" -msgid "Play all" +msgid "" msgstr "" msgctxt "#30532" -msgid "Default" +msgid "" msgstr "" msgctxt "#30533" @@ -437,7 +437,7 @@ msgid "Reverse" msgstr "" msgctxt "#30534" -msgid "Shuffle" +msgid "" msgstr "" msgctxt "#30535" @@ -457,7 +457,7 @@ msgid "Disliked Videos" msgstr "" msgctxt "#30539" -msgid "Live" +msgid "" msgstr "" msgctxt "#30540" @@ -473,7 +473,7 @@ msgid "rtmpe streams are not supported" msgstr "" msgctxt "#30543" -msgid "Refresh" +msgid "" msgstr "" msgctxt "#30544" @@ -485,15 +485,15 @@ msgid "No further links found." msgstr "" msgctxt "#30546" -msgid "Please log in twice!" +msgid "Please complete all login prompts" msgstr "" msgctxt "#30547" -msgid "You must enable two applications so that YouTube is functioning properly." +msgid "You may be prompted to enable two applications so that YouTube is functioning properly." msgstr "" msgctxt "#30548" -msgid "More..." +msgid "" msgstr "" msgctxt "#30549" @@ -501,7 +501,7 @@ msgid "No videos streams found" msgstr "" msgctxt "#30550" -msgid "Region" +msgid "" msgstr "" msgctxt "#30551" @@ -541,15 +541,15 @@ msgid "Delete settings.xml" msgstr "" msgctxt "#30560" -msgid "Subtitle language" +msgid "" msgstr "" msgctxt "#30561" -msgid "None" +msgid "" msgstr "" msgctxt "#30562" -msgid "" +msgid "View all" msgstr "" msgctxt "#30563" @@ -565,7 +565,7 @@ msgid "" msgstr "" msgctxt "#30566" -msgid "Prompt" +msgid "" msgstr "" msgctxt "#30567" @@ -577,11 +577,11 @@ msgid "Remove as Watch Later" msgstr "" msgctxt "#30569" -msgid "Are you sure you want to remove '%s' as your Watch Later list?" +msgid "Are you sure you want to remove \"%s\" as your Watch Later list?" msgstr "" msgctxt "#30570" -msgid "Are you sure you want to replace your current Watch Later list with '%s'?" +msgid "Are you sure you want to replace your current Watch Later list with \"%s\"?" msgstr "" msgctxt "#30571" @@ -593,11 +593,11 @@ msgid "Remove as History" msgstr "" msgctxt "#30573" -msgid "Are you sure you want to remove '%s' as your History list?" +msgid "Are you sure you want to remove \"%s\" as your History list?" msgstr "" msgctxt "#30574" -msgid "Are you sure you want to replace your current History list with '%s'?" +msgid "Are you sure you want to replace your current History list with \"%s\"?" msgstr "" msgctxt "#30575" @@ -609,7 +609,7 @@ msgid "Failed" msgstr "" msgctxt "#30577" -msgid "Settings" +msgid "" msgstr "" msgctxt "#30578" @@ -633,7 +633,7 @@ msgid "Autoplay suggested videos" msgstr "" msgctxt "#30583" -msgid "Automatic" +msgid "" msgstr "" msgctxt "#30584" @@ -693,7 +693,7 @@ msgid "Updated: %s" msgstr "" msgctxt "#30598" -msgid "Personal API keys enabled" +msgid "" msgstr "" msgctxt "#30599" @@ -701,7 +701,7 @@ msgid "Failed to enable personal API keys. Missing: %s" msgstr "" msgctxt "#30600" -msgid "Subtitles" +msgid "" msgstr "" msgctxt "#30601" @@ -761,7 +761,7 @@ msgid "" msgstr "" msgctxt "#30615" -msgid "Cancel" +msgid "" msgstr "" msgctxt "#30616" @@ -777,7 +777,7 @@ msgid "" msgstr "" msgctxt "#30619" -msgid "Port" +msgid "" msgstr "" msgctxt "#30620" @@ -821,7 +821,7 @@ msgid "IP whitelist (comma delimited)" msgstr "" msgctxt "#30630" -msgid "Save" +msgid "" msgstr "" msgctxt "#30631" @@ -937,7 +937,7 @@ msgid "Enter a name for this user" msgstr "" msgctxt "#30659" -msgid "User is now '%s'" +msgid "User is now \"%s\"" msgstr "" msgctxt "#30660" @@ -961,15 +961,15 @@ msgid "Switch user" msgstr "" msgctxt "#30665" -msgid "Switch to '%s' now?" +msgid "Switch to \"%s\" now?" msgstr "" msgctxt "#30666" -msgid "%s removed" +msgid "\"%s\" removed" msgstr "" msgctxt "#30667" -msgid "Renamed '%s' to '%s'" +msgid "Renamed \"%s\" to \"%s\"" msgstr "" msgctxt "#30668" @@ -1113,7 +1113,7 @@ msgid "Play with subtitles" msgstr "" msgctxt "#30703" -msgid "Are you sure?" +msgid "" msgstr "" msgctxt "#30704" @@ -1257,7 +1257,7 @@ msgid "" msgstr "" msgctxt "#30739" -msgid "" +msgid "Subscribers" msgstr "" msgctxt "#30740" @@ -1477,11 +1477,11 @@ msgid "Views count display colour" msgstr "" msgctxt "#30794" -msgid "Likes count display colour" +msgid "Subscriber/Likes count display colour" msgstr "" msgctxt "#30795" -msgid "Comments count display colour" +msgid "Videos/Comments count display colour" msgstr "" msgctxt "#30796" @@ -1579,3 +1579,7 @@ msgstr "" msgctxt "#30819" msgid "Play from start" msgstr "" + +msgctxt "#30820" +msgid "Podcast" +msgstr "" diff --git a/plugin.video.youtube/resources/language/resource.language.pl_pl/strings.po b/plugin.video.youtube/resources/language/resource.language.pl_pl/strings.po index f5333b1399..4553215629 100644 --- a/plugin.video.youtube/resources/language/resource.language.pl_pl/strings.po +++ b/plugin.video.youtube/resources/language/resource.language.pl_pl/strings.po @@ -7,7 +7,7 @@ msgstr "" "Project-Id-Version: XBMC-Addons\n" "Report-Msgid-Bugs-To: alanwww1@xbmc.org\n" "POT-Creation-Date: 2015-09-21 11:01+0000\n" -"PO-Revision-Date: 2024-08-04 09:10+0000\n" +"PO-Revision-Date: 2024-10-29 21:02+0000\n" "Last-Translator: Marek Adamski \n" "Language-Team: Polish \n" "Language: pl_pl\n" @@ -15,7 +15,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 5.6.2\n" +"X-Generator: Weblate 5.7.2\n" msgctxt "Addon Summary" msgid "Plugin for YouTube" @@ -31,13 +31,14 @@ msgstr "Ta wtyczka nie jest zatwierdzona przez Google" # msgctxt "Addon Summary" # msgid "Plugin for YouTube" -# msgstr "Wtyczka YouTube" +# msgstr "" # msgctxt "Addon Description" # msgid "YouTube is a one of the biggest video-sharing websites of the world." -# msgstr "YouTube jest jednym z największych na świecie serwisów udostępniania wideo." +# msgstr "" +# Kodion Settings msgctxt "#30000" -msgid "General" -msgstr "Ogólne" +msgid "" +msgstr "" msgctxt "#30001" msgid "" @@ -149,8 +150,8 @@ msgid "Configure %s?" msgstr "Skonfigurować %s?" msgctxt "#30031" -msgid "Advanced" -msgstr "Zaawansowane" +msgid "" +msgstr "" msgctxt "#30032" msgid "View: TV Shows" @@ -215,8 +216,8 @@ msgid "Watch Later" msgstr "Do obejrzenia" msgctxt "#30108" -msgid "Remove" -msgstr "Usuń" +msgid "" +msgstr "" msgctxt "#30109" msgid "" @@ -235,8 +236,8 @@ msgid "Sign Out" msgstr "Wyloguj" msgctxt "#30113" -msgid "Rename" -msgstr "Przemianuj" +msgid "" +msgstr "" msgctxt "#30114" msgid "Confirm delete" @@ -255,8 +256,8 @@ msgid "Remove \"%s\"?" msgstr "Przenieść \"%s\"?" msgctxt "#30118" -msgid "Delete" -msgstr "Usuń" +msgid "" +msgstr "" msgctxt "#30119" msgid "Please wait..." @@ -299,12 +300,12 @@ msgstr "" # YouTube # empty strings from id 30206 to 30499 msgctxt "#30500" -msgid "Channels" -msgstr "Kanały" +msgid "" +msgstr "" msgctxt "#30501" -msgid "Playlists" -msgstr "Listy odtwarzania" +msgid "" +msgstr "" msgctxt "#30502" msgid "Go to %s" @@ -359,8 +360,8 @@ msgid "Related Videos" msgstr "Powiązane" msgctxt "#30515" -msgid "Auto-Remove from 'Watch Later'" -msgstr "Usuwaj po obejrzeniu pozycję z listy 'Do obejrzenia'" +msgid "Auto-Remove from Watch Later" +msgstr "" msgctxt "#30516" msgid "Folders" @@ -383,16 +384,16 @@ msgid "Add to..." msgstr "Dodaj do..." msgctxt "#30521" -msgid "Select playlist" -msgstr "Wybierz listę" +msgid "" +msgstr "" msgctxt "#30522" -msgid "New playlist..." -msgstr "Nowa lista..." +msgid "" +msgstr "" msgctxt "#30523" -msgid "Language" -msgstr "Język" +msgid "" +msgstr "" msgctxt "#30524" msgid "Select language" @@ -423,20 +424,20 @@ msgid "I dislike this" msgstr "To mi się nie podoba" msgctxt "#30531" -msgid "Play all" -msgstr "Odtwarzaj wszystko" +msgid "" +msgstr "" msgctxt "#30532" -msgid "Default" -msgstr "Domyślna" +msgid "" +msgstr "" msgctxt "#30533" msgid "Reverse" msgstr "Odwrócona" msgctxt "#30534" -msgid "Shuffle" -msgstr "Losowa" +msgid "" +msgstr "" msgctxt "#30535" msgid "Select the order of the playlist" @@ -455,8 +456,8 @@ msgid "Disliked Videos" msgstr "Nielubiane" msgctxt "#30539" -msgid "Live" -msgstr "Na żywo" +msgid "" +msgstr "" msgctxt "#30540" msgid "Play with..." @@ -471,8 +472,8 @@ msgid "rtmpe streams are not supported" msgstr "Strumienie RTMPE nie są obsługiwane" msgctxt "#30543" -msgid "Refresh" -msgstr "Odśwież" +msgid "" +msgstr "" msgctxt "#30544" msgid "More Links from the description" @@ -483,24 +484,24 @@ msgid "No further links found." msgstr "Brak kolejnych łączy." msgctxt "#30546" -msgid "Please log in twice!" -msgstr "Wymagana dwukrotna aktywacja!" +msgid "Please complete all login prompts" +msgstr "Wypełnij wszystkie monity logowania" msgctxt "#30547" -msgid "You must enable two applications so that YouTube is functioning properly." -msgstr "Musisz wykonać aktywację dwukrotnie, aby dodatek YouTube działał poprawnie." +msgid "You may be prompted to enable two applications so that YouTube is functioning properly." +msgstr "Może zostać wyświetlony monit o włączenie dwóch aplikacji, aby YouTube działał prawidłowo." msgctxt "#30548" -msgid "More..." -msgstr "Więcej..." +msgid "" +msgstr "" msgctxt "#30549" msgid "No videos streams found" msgstr "Brak strumieni wideo" msgctxt "#30550" -msgid "Region" -msgstr "Region" +msgid "" +msgstr "" msgctxt "#30551" msgid "Recommendations" @@ -539,17 +540,17 @@ msgid "Delete settings.xml" msgstr "Usuń plik ustawień settings.xml" msgctxt "#30560" -msgid "Subtitle language" -msgstr "Język napisów" +msgid "" +msgstr "" msgctxt "#30561" -msgid "None" -msgstr "Brak" - -msgctxt "#30562" msgid "" msgstr "" +msgctxt "#30562" +msgid "View all" +msgstr "Zobacz wszystkie" + msgctxt "#30563" msgid "" msgstr "" @@ -563,8 +564,8 @@ msgid "" msgstr "" msgctxt "#30566" -msgid "Prompt" -msgstr "Pytaj" +msgid "" +msgstr "" msgctxt "#30567" msgid "Set as Watch Later" @@ -575,12 +576,12 @@ msgid "Remove as Watch Later" msgstr "Odłącz od listy Do obejrzenia" msgctxt "#30569" -msgid "Are you sure you want to remove '%s' as your Watch Later list?" -msgstr "Czy jesteś pewien, że chcesz odłączyć listę '%s' od listy Do obejrzenia?" +msgid "Are you sure you want to remove \"%s\" as your Watch Later list?" +msgstr "" msgctxt "#30570" -msgid "Are you sure you want to replace your current Watch Later list with '%s'?" -msgstr "Czy jesteś pewien, że chcesz zastąpić aktualną listę Do obejrzenia listą '%s'?" +msgid "Are you sure you want to replace your current Watch Later list with \"%s\"?" +msgstr "" msgctxt "#30571" msgid "Set as History" @@ -591,12 +592,12 @@ msgid "Remove as History" msgstr "Odłącz od listy Historia" msgctxt "#30573" -msgid "Are you sure you want to remove '%s' as your History list?" -msgstr "Czy jesteś pewien, że chcesz odłączyć listę '%s' od listy Historia?" +msgid "Are you sure you want to remove \"%s\" as your History list?" +msgstr "" msgctxt "#30574" -msgid "Are you sure you want to replace your current History list with '%s'?" -msgstr "Czy jesteś pewien, że chcesz zastąpić aktualną listę Historii listą '%s'?" +msgid "Are you sure you want to replace your current History list with \"%s\"?" +msgstr "" msgctxt "#30575" msgid "Succeeded" @@ -607,8 +608,8 @@ msgid "Failed" msgstr "Zakończone niepowodzeniem" msgctxt "#30577" -msgid "Settings" -msgstr "Ustawienia" +msgid "" +msgstr "" msgctxt "#30578" msgid "Force SSL certificate verification" @@ -631,8 +632,8 @@ msgid "Autoplay suggested videos" msgstr "Odtwarzaj polecane wideo automatycznie" msgctxt "#30583" -msgid "Automatic" -msgstr "Automatycznie" +msgid "" +msgstr "" msgctxt "#30584" msgid "My Subscriptions (Filtered)" @@ -691,16 +692,16 @@ msgid "Updated: %s" msgstr "Zaktualizowano: %s" msgctxt "#30598" -msgid "Personal API keys enabled" -msgstr "Aktywowano osobiste klucze API" +msgid "" +msgstr "" msgctxt "#30599" msgid "Failed to enable personal API keys. Missing: %s" msgstr "Aktywacja osobistych kluczy API zakończona niepowodzeniem. Brakuje: %s" msgctxt "#30600" -msgid "Subtitles" -msgstr "Napisy" +msgid "" +msgstr "" msgctxt "#30601" msgid "%s with Original/%s fallback" @@ -759,8 +760,8 @@ msgid "" msgstr "" msgctxt "#30615" -msgid "Cancel" -msgstr "Anuluj" +msgid "" +msgstr "" msgctxt "#30616" msgid "" @@ -775,8 +776,8 @@ msgid "" msgstr "" msgctxt "#30619" -msgid "Port" -msgstr "Port" +msgid "" +msgstr "" msgctxt "#30620" msgid "Port %s already in use. Cannot start http server." @@ -819,8 +820,8 @@ msgid "IP whitelist (comma delimited)" msgstr "Biała lista IP (oddzielane przecinkiem)" msgctxt "#30630" -msgid "Save" -msgstr "Zapisz" +msgid "" +msgstr "" msgctxt "#30631" msgid "Successfully updated: %s" @@ -935,8 +936,8 @@ msgid "Enter a name for this user" msgstr "Wprowadź nazwę dla użytkownika" msgctxt "#30659" -msgid "User is now '%s'" -msgstr "Użytkownikiem jest teraz '%s'" +msgid "User is now \"%s\"" +msgstr "" msgctxt "#30660" msgid "Users" @@ -959,16 +960,16 @@ msgid "Switch user" msgstr "Zmień użytkownika" msgctxt "#30665" -msgid "Switch to '%s' now?" -msgstr "Zmienić na '%s' teraz?" +msgid "Switch to \"%s\" now?" +msgstr "" msgctxt "#30666" -msgid "%s removed" -msgstr "Usunięto %s" +msgid "\"%s\" removed" +msgstr "" msgctxt "#30667" -msgid "Renamed '%s' to '%s'" -msgstr "Zmieniono z '%s' na '%s'" +msgid "Renamed \"%s\" to \"%s\"" +msgstr "" msgctxt "#30668" msgid "Play count minimum percent" @@ -1111,8 +1112,8 @@ msgid "Play with subtitles" msgstr "Odtwarzaj z napisami" msgctxt "#30703" -msgid "Are you sure?" -msgstr "Jesteś pewien?" +msgid "" +msgstr "" msgctxt "#30704" msgid "Use YouTube website urls with default player" @@ -1255,8 +1256,8 @@ msgid "" msgstr "" msgctxt "#30739" -msgid "" -msgstr "" +msgid "Subscribers" +msgstr "Subskrybenci" msgctxt "#30740" msgid "HLS" @@ -1475,12 +1476,12 @@ msgid "Views count display colour" msgstr "Kolor wyświetlania liczby wyświetleń" msgctxt "#30794" -msgid "Likes count display colour" -msgstr "Kolor wyświetlania liczby polubień" +msgid "Subscriber/Likes count display colour" +msgstr "Kolor wyświetlania liczby subskrybentów/polubień" msgctxt "#30795" -msgid "Comments count display colour" -msgstr "Kolor wyświetlania liczby komentarzy" +msgid "Videos/Comments count display colour" +msgstr "Kolor wyświetlania liczby filmów/komentarzy" msgctxt "#30796" msgid "1080p/60 fps | Raspberry Pi 4, or similar" @@ -1576,7 +1577,191 @@ msgstr "Czy na pewno chcesz odświeżyć settings.xml?" msgctxt "#30819" msgid "Play from start" -msgstr "" +msgstr "Odtwórz od początku" + +msgctxt "#30820" +msgid "Podcast" +msgstr "Podcast" + +#~ msgctxt "#30515" +#~ msgid "Auto-Remove from 'Watch Later'" +#~ msgstr "Usuwaj po obejrzeniu pozycję z listy 'Do obejrzenia'" + +#~ msgctxt "#30569" +#~ msgid "Are you sure you want to remove '%s' as your Watch Later list?" +#~ msgstr "Czy jesteś pewien, że chcesz odłączyć listę '%s' od listy Do obejrzenia?" + +#~ msgctxt "#30570" +#~ msgid "Are you sure you want to replace your current Watch Later list with '%s'?" +#~ msgstr "Czy jesteś pewien, że chcesz zastąpić aktualną listę Do obejrzenia listą '%s'?" + +#~ msgctxt "#30573" +#~ msgid "Are you sure you want to remove '%s' as your History list?" +#~ msgstr "Czy jesteś pewien, że chcesz odłączyć listę '%s' od listy Historia?" + +#~ msgctxt "#30574" +#~ msgid "Are you sure you want to replace your current History list with '%s'?" +#~ msgstr "Czy jesteś pewien, że chcesz zastąpić aktualną listę Historii listą '%s'?" + +#~ msgctxt "#30659" +#~ msgid "User is now '%s'" +#~ msgstr "Użytkownikiem jest teraz '%s'" + +#~ msgctxt "#30665" +#~ msgid "Switch to '%s' now?" +#~ msgstr "Zmienić na '%s' teraz?" + +#~ msgctxt "#30666" +#~ msgid "%s removed" +#~ msgstr "Usunięto %s" + +#~ msgctxt "#30667" +#~ msgid "Renamed '%s' to '%s'" +#~ msgstr "Zmieniono z '%s' na '%s'" + +# msgctxt "Addon Summary" +# msgid "Plugin for YouTube" +# msgstr "Wtyczka YouTube" +# msgctxt "Addon Description" +# msgid "YouTube is a one of the biggest video-sharing websites of the world." +# msgstr "YouTube jest jednym z największych na świecie serwisów udostępniania wideo." +#~ msgctxt "#30000" +#~ msgid "General" +#~ msgstr "Ogólne" + +#~ msgctxt "#30031" +#~ msgid "Advanced" +#~ msgstr "Zaawansowane" + +#~ msgctxt "#30108" +#~ msgid "Remove" +#~ msgstr "Usuń" + +#~ msgctxt "#30113" +#~ msgid "Rename" +#~ msgstr "Przemianuj" + +#~ msgctxt "#30118" +#~ msgid "Delete" +#~ msgstr "Usuń" + +# YouTube +# empty strings from id 30206 to 30499 +#~ msgctxt "#30500" +#~ msgid "Channels" +#~ msgstr "Kanały" + +#~ msgctxt "#30501" +#~ msgid "Playlists" +#~ msgstr "Listy odtwarzania" + +#~ msgctxt "#30521" +#~ msgid "Select playlist" +#~ msgstr "Wybierz listę" + +#~ msgctxt "#30522" +#~ msgid "New playlist..." +#~ msgstr "Nowa lista..." + +#~ msgctxt "#30523" +#~ msgid "Language" +#~ msgstr "Język" + +#~ msgctxt "#30531" +#~ msgid "Play all" +#~ msgstr "Odtwarzaj wszystko" + +#~ msgctxt "#30532" +#~ msgid "Default" +#~ msgstr "Domyślna" + +#~ msgctxt "#30534" +#~ msgid "Shuffle" +#~ msgstr "Losowa" + +#~ msgctxt "#30539" +#~ msgid "Live" +#~ msgstr "Na żywo" + +#~ msgctxt "#30543" +#~ msgid "Refresh" +#~ msgstr "Odśwież" + +#~ msgctxt "#30548" +#~ msgid "More..." +#~ msgstr "Więcej..." + +#~ msgctxt "#30550" +#~ msgid "Region" +#~ msgstr "Region" + +#~ msgctxt "#30560" +#~ msgid "Subtitle language" +#~ msgstr "Język napisów" + +#~ msgctxt "#30561" +#~ msgid "None" +#~ msgstr "Brak" + +#~ msgctxt "#30566" +#~ msgid "Prompt" +#~ msgstr "Pytaj" + +#~ msgctxt "#30577" +#~ msgid "Settings" +#~ msgstr "Ustawienia" + +#~ msgctxt "#30583" +#~ msgid "Automatic" +#~ msgstr "Automatycznie" + +#~ msgctxt "#30598" +#~ msgid "Personal API keys enabled" +#~ msgstr "Aktywowano osobiste klucze API" + +#~ msgctxt "#30600" +#~ msgid "Subtitles" +#~ msgstr "Napisy" + +#~ msgctxt "#30615" +#~ msgid "Cancel" +#~ msgstr "Anuluj" + +#~ msgctxt "#30619" +#~ msgid "Port" +#~ msgstr "Port" + +#~ msgctxt "#30630" +#~ msgid "Save" +#~ msgstr "Zapisz" + +#~ msgctxt "#30703" +#~ msgid "Are you sure?" +#~ msgstr "Jesteś pewien?" + +#~ msgctxt "#30737" +#~ msgid "Episodes" +#~ msgstr "Odcinki" + +#~ msgctxt "#30738" +#~ msgid "Videos" +#~ msgstr "WIDEO" + +#~ msgctxt "#30794" +#~ msgid "Likes count display colour" +#~ msgstr "Kolor wyświetlania liczby polubień" + +#~ msgctxt "#30795" +#~ msgid "Comments count display colour" +#~ msgstr "Kolor wyświetlania liczby komentarzy" + +#~ msgctxt "#30546" +#~ msgid "Please log in twice!" +#~ msgstr "Wymagana dwukrotna aktywacja!" + +#~ msgctxt "#30547" +#~ msgid "You must enable two applications so that YouTube is functioning properly." +#~ msgstr "Musisz wykonać aktywację dwukrotnie, aby dodatek YouTube działał poprawnie." #~ msgctxt "#30001" #~ msgid "Username" diff --git a/plugin.video.youtube/resources/language/resource.language.pt_br/strings.po b/plugin.video.youtube/resources/language/resource.language.pt_br/strings.po index 64e3635601..4a2c1946dc 100644 --- a/plugin.video.youtube/resources/language/resource.language.pt_br/strings.po +++ b/plugin.video.youtube/resources/language/resource.language.pt_br/strings.po @@ -31,13 +31,14 @@ msgstr "Este plugin não é recomendado pelo Google" # msgctxt "Addon Summary" # msgid "Plugin for YouTube" -# msgstr "Plugin do YouTube" +# msgstr "" # msgctxt "Addon Description" # msgid "YouTube is a one of the biggest video-sharing websites of the world." -# msgstr "Youtube é uma das maiores plataformas de vídeo online do mundo." +# msgstr "" +# Kodion Settings msgctxt "#30000" -msgid "General" -msgstr "Geral" +msgid "" +msgstr "" msgctxt "#30001" msgid "" @@ -151,8 +152,8 @@ msgid "Configure %s?" msgstr "Configurar %s?" msgctxt "#30031" -msgid "Advanced" -msgstr "Avançado" +msgid "" +msgstr "" msgctxt "#30032" msgid "View: TV Shows" @@ -217,8 +218,8 @@ msgid "Watch Later" msgstr "Assistir mais tarde" msgctxt "#30108" -msgid "Remove" -msgstr "Remover" +msgid "" +msgstr "" msgctxt "#30109" msgid "" @@ -237,8 +238,8 @@ msgid "Sign Out" msgstr "Deslogar" msgctxt "#30113" -msgid "Rename" -msgstr "Renomear" +msgid "" +msgstr "" msgctxt "#30114" msgid "Confirm delete" @@ -257,8 +258,8 @@ msgid "Remove \"%s\"?" msgstr "Remover \"%s\"?" msgctxt "#30118" -msgid "Delete" -msgstr "Deletar" +msgid "" +msgstr "" msgctxt "#30119" msgid "Please wait..." @@ -299,13 +300,15 @@ msgctxt "#30205" msgid "" msgstr "" +# YouTube +# empty strings from id 30206 to 30499 msgctxt "#30500" -msgid "Channels" -msgstr "Canais" +msgid "" +msgstr "" msgctxt "#30501" -msgid "Playlists" -msgstr "Lista de Reprodução" +msgid "" +msgstr "" msgctxt "#30502" msgid "Go to %s" @@ -360,8 +363,8 @@ msgid "Related Videos" msgstr "Vídeos Relacionados" msgctxt "#30515" -msgid "Auto-Remove from 'Watch Later'" -msgstr "Autoremover de 'Assistir mais tarde'" +msgid "Auto-Remove from Watch Later" +msgstr "" msgctxt "#30516" msgid "Folders" @@ -384,16 +387,16 @@ msgid "Add to..." msgstr "Adicionar para..." msgctxt "#30521" -msgid "Select playlist" -msgstr "Selecionar lista de reprodução" +msgid "" +msgstr "" msgctxt "#30522" -msgid "New playlist..." -msgstr "Nova lista de reprodução..." +msgid "" +msgstr "" msgctxt "#30523" -msgid "Language" -msgstr "Idioma" +msgid "" +msgstr "" msgctxt "#30524" msgid "Select language" @@ -424,20 +427,20 @@ msgid "I dislike this" msgstr "Não gosto" msgctxt "#30531" -msgid "Play all" -msgstr "Reproduzir todos" +msgid "" +msgstr "" msgctxt "#30532" -msgid "Default" -msgstr "Padrão" +msgid "" +msgstr "" msgctxt "#30533" msgid "Reverse" msgstr "Reverso" msgctxt "#30534" -msgid "Shuffle" -msgstr "Aleatório" +msgid "" +msgstr "" msgctxt "#30535" msgid "Select the order of the playlist" @@ -456,8 +459,8 @@ msgid "Disliked Videos" msgstr "Vídeos Não Curtidos" msgctxt "#30539" -msgid "Live" -msgstr "Ao Vivo" +msgid "" +msgstr "" msgctxt "#30540" msgid "Play with..." @@ -472,8 +475,8 @@ msgid "rtmpe streams are not supported" msgstr "rtmpe stream não suportado" msgctxt "#30543" -msgid "Refresh" -msgstr "Atualizar" +msgid "" +msgstr "" msgctxt "#30544" msgid "More Links from the description" @@ -484,24 +487,24 @@ msgid "No further links found." msgstr "Nenhum outro link encontrado." msgctxt "#30546" -msgid "Please log in twice!" -msgstr "Por favor inicie sessão duas vezes!" +msgid "Please complete all login prompts" +msgstr "" msgctxt "#30547" -msgid "You must enable two applications so that YouTube is functioning properly." -msgstr "Você deve ativar 2 aplicações para que o YouTube funcione adequadamente." +msgid "You may be prompted to enable two applications so that YouTube is functioning properly." +msgstr "" msgctxt "#30548" -msgid "More..." -msgstr "Mais..." +msgid "" +msgstr "" msgctxt "#30549" msgid "No videos streams found" msgstr "Nenhum stream de vídeo encontrado" msgctxt "#30550" -msgid "Region" -msgstr "Região" +msgid "" +msgstr "" msgctxt "#30551" msgid "Recommendations" @@ -540,15 +543,15 @@ msgid "Delete settings.xml" msgstr "Deletar o arquivo settings.xml" msgctxt "#30560" -msgid "Subtitle language" -msgstr "Idioma de legendas" +msgid "" +msgstr "" msgctxt "#30561" -msgid "None" -msgstr "Nenhuma" +msgid "" +msgstr "" msgctxt "#30562" -msgid "" +msgid "View all" msgstr "" msgctxt "#30563" @@ -564,8 +567,8 @@ msgid "" msgstr "" msgctxt "#30566" -msgid "Prompt" -msgstr "Perguntar" +msgid "" +msgstr "" msgctxt "#30567" msgid "Set as Watch Later" @@ -576,12 +579,12 @@ msgid "Remove as Watch Later" msgstr "Remover de Assistir mais tarde" msgctxt "#30569" -msgid "Are you sure you want to remove '%s' as your Watch Later list?" -msgstr "Tem certeza que deseja remover '%s' de sua lista Assistir mais tarde?" +msgid "Are you sure you want to remove \"%s\" as your Watch Later list?" +msgstr "" msgctxt "#30570" -msgid "Are you sure you want to replace your current Watch Later list with '%s'?" -msgstr "Tem certeza que deseja substituir sua lista de Assistir mais tarde atual com '%s'?" +msgid "Are you sure you want to replace your current Watch Later list with \"%s\"?" +msgstr "" msgctxt "#30571" msgid "Set as History" @@ -592,12 +595,12 @@ msgid "Remove as History" msgstr "Remover do histório" msgctxt "#30573" -msgid "Are you sure you want to remove '%s' as your History list?" -msgstr "Tem certeza que deseja remover '%s' de seu histórico?" +msgid "Are you sure you want to remove \"%s\" as your History list?" +msgstr "" msgctxt "#30574" -msgid "Are you sure you want to replace your current History list with '%s'?" -msgstr "Tem certeza que deseja substituir sua lista de histórico por '%s'?" +msgid "Are you sure you want to replace your current History list with \"%s\"?" +msgstr "" msgctxt "#30575" msgid "Succeeded" @@ -608,8 +611,8 @@ msgid "Failed" msgstr "Falhou" msgctxt "#30577" -msgid "Settings" -msgstr "Ajustes" +msgid "" +msgstr "" msgctxt "#30578" msgid "Force SSL certificate verification" @@ -632,8 +635,8 @@ msgid "Autoplay suggested videos" msgstr "Reproduzir automaticamente vídeos sugeridos" msgctxt "#30583" -msgid "Automatic" -msgstr "Automático" +msgid "" +msgstr "" msgctxt "#30584" msgid "My Subscriptions (Filtered)" @@ -692,16 +695,16 @@ msgid "Updated: %s" msgstr "Atualizado: %s" msgctxt "#30598" -msgid "Personal API keys enabled" -msgstr "Chave da API pessoal ativada" +msgid "" +msgstr "" msgctxt "#30599" msgid "Failed to enable personal API keys. Missing: %s" msgstr "Falhous ao ativar a chave pessoal da API. Faltando: %s" msgctxt "#30600" -msgid "Subtitles" -msgstr "Legendas" +msgid "" +msgstr "" msgctxt "#30601" msgid "%s with Original/%s fallback" @@ -760,8 +763,8 @@ msgid "" msgstr "" msgctxt "#30615" -msgid "Cancel" -msgstr "Cancelar" +msgid "" +msgstr "" msgctxt "#30616" msgid "" @@ -776,8 +779,8 @@ msgid "" msgstr "" msgctxt "#30619" -msgid "Port" -msgstr "Porta" +msgid "" +msgstr "" msgctxt "#30620" msgid "Port %s already in use. Cannot start http server." @@ -820,8 +823,8 @@ msgid "IP whitelist (comma delimited)" msgstr "Lista branca IP (delimitado com vírgula)" msgctxt "#30630" -msgid "Save" -msgstr "Salvar" +msgid "" +msgstr "" msgctxt "#30631" msgid "Successfully updated: %s" @@ -936,8 +939,8 @@ msgid "Enter a name for this user" msgstr "Entre com um nome para este usuário" msgctxt "#30659" -msgid "User is now '%s'" -msgstr "Usuário é agora '%s'" +msgid "User is now \"%s\"" +msgstr "" msgctxt "#30660" msgid "Users" @@ -960,16 +963,16 @@ msgid "Switch user" msgstr "Alterar usuário" msgctxt "#30665" -msgid "Switch to '%s' now?" -msgstr "Alterar para '%s'agora?" +msgid "Switch to \"%s\" now?" +msgstr "" msgctxt "#30666" -msgid "%s removed" -msgstr "%s removido" +msgid "\"%s\" removed" +msgstr "" msgctxt "#30667" -msgid "Renamed '%s' to '%s'" -msgstr "Renomeado '%s' to '%s'" +msgid "Renamed \"%s\" to \"%s\"" +msgstr "" msgctxt "#30668" msgid "Play count minimum percent" @@ -1112,8 +1115,8 @@ msgid "Play with subtitles" msgstr "Reproduzir com legendas" msgctxt "#30703" -msgid "Are you sure?" -msgstr "Tem certeza?" +msgid "" +msgstr "" msgctxt "#30704" msgid "Use YouTube website urls with default player" @@ -1256,7 +1259,7 @@ msgid "" msgstr "" msgctxt "#30739" -msgid "" +msgid "Subscribers" msgstr "" #, fuzzy @@ -1481,12 +1484,12 @@ msgid "Views count display colour" msgstr "Cor de exibição do número de visualizações" msgctxt "#30794" -msgid "Likes count display colour" -msgstr "Cor de exibição do número de curtidas" +msgid "Subscriber/Likes count display colour" +msgstr "" msgctxt "#30795" -msgid "Comments count display colour" -msgstr "Cor de exibição do número de comentários" +msgid "Videos/Comments count display colour" +msgstr "" msgctxt "#30796" msgid "1080p/60 fps | Raspberry Pi 4, or similar" @@ -1584,6 +1587,180 @@ msgctxt "#30819" msgid "Play from start" msgstr "" +msgctxt "#30820" +msgid "Podcast" +msgstr "" + +#~ msgctxt "#30515" +#~ msgid "Auto-Remove from 'Watch Later'" +#~ msgstr "Autoremover de 'Assistir mais tarde'" + +#~ msgctxt "#30569" +#~ msgid "Are you sure you want to remove '%s' as your Watch Later list?" +#~ msgstr "Tem certeza que deseja remover '%s' de sua lista Assistir mais tarde?" + +#~ msgctxt "#30570" +#~ msgid "Are you sure you want to replace your current Watch Later list with '%s'?" +#~ msgstr "Tem certeza que deseja substituir sua lista de Assistir mais tarde atual com '%s'?" + +#~ msgctxt "#30573" +#~ msgid "Are you sure you want to remove '%s' as your History list?" +#~ msgstr "Tem certeza que deseja remover '%s' de seu histórico?" + +#~ msgctxt "#30574" +#~ msgid "Are you sure you want to replace your current History list with '%s'?" +#~ msgstr "Tem certeza que deseja substituir sua lista de histórico por '%s'?" + +#~ msgctxt "#30659" +#~ msgid "User is now '%s'" +#~ msgstr "Usuário é agora '%s'" + +#~ msgctxt "#30665" +#~ msgid "Switch to '%s' now?" +#~ msgstr "Alterar para '%s'agora?" + +#~ msgctxt "#30666" +#~ msgid "%s removed" +#~ msgstr "%s removido" + +#~ msgctxt "#30667" +#~ msgid "Renamed '%s' to '%s'" +#~ msgstr "Renomeado '%s' to '%s'" + +# msgctxt "Addon Summary" +# msgid "Plugin for YouTube" +# msgstr "Plugin do YouTube" +# msgctxt "Addon Description" +# msgid "YouTube is a one of the biggest video-sharing websites of the world." +# msgstr "Youtube é uma das maiores plataformas de vídeo online do mundo." +#~ msgctxt "#30000" +#~ msgid "General" +#~ msgstr "Geral" + +#~ msgctxt "#30031" +#~ msgid "Advanced" +#~ msgstr "Avançado" + +#~ msgctxt "#30108" +#~ msgid "Remove" +#~ msgstr "Remover" + +#~ msgctxt "#30113" +#~ msgid "Rename" +#~ msgstr "Renomear" + +#~ msgctxt "#30118" +#~ msgid "Delete" +#~ msgstr "Deletar" + +#~ msgctxt "#30500" +#~ msgid "Channels" +#~ msgstr "Canais" + +#~ msgctxt "#30501" +#~ msgid "Playlists" +#~ msgstr "Lista de Reprodução" + +#~ msgctxt "#30521" +#~ msgid "Select playlist" +#~ msgstr "Selecionar lista de reprodução" + +#~ msgctxt "#30522" +#~ msgid "New playlist..." +#~ msgstr "Nova lista de reprodução..." + +#~ msgctxt "#30523" +#~ msgid "Language" +#~ msgstr "Idioma" + +#~ msgctxt "#30531" +#~ msgid "Play all" +#~ msgstr "Reproduzir todos" + +#~ msgctxt "#30532" +#~ msgid "Default" +#~ msgstr "Padrão" + +#~ msgctxt "#30534" +#~ msgid "Shuffle" +#~ msgstr "Aleatório" + +#~ msgctxt "#30539" +#~ msgid "Live" +#~ msgstr "Ao Vivo" + +#~ msgctxt "#30543" +#~ msgid "Refresh" +#~ msgstr "Atualizar" + +#~ msgctxt "#30548" +#~ msgid "More..." +#~ msgstr "Mais..." + +#~ msgctxt "#30550" +#~ msgid "Region" +#~ msgstr "Região" + +#~ msgctxt "#30560" +#~ msgid "Subtitle language" +#~ msgstr "Idioma de legendas" + +#~ msgctxt "#30561" +#~ msgid "None" +#~ msgstr "Nenhuma" + +#~ msgctxt "#30566" +#~ msgid "Prompt" +#~ msgstr "Perguntar" + +#~ msgctxt "#30577" +#~ msgid "Settings" +#~ msgstr "Ajustes" + +#~ msgctxt "#30583" +#~ msgid "Automatic" +#~ msgstr "Automático" + +#~ msgctxt "#30598" +#~ msgid "Personal API keys enabled" +#~ msgstr "Chave da API pessoal ativada" + +#~ msgctxt "#30600" +#~ msgid "Subtitles" +#~ msgstr "Legendas" + +#~ msgctxt "#30615" +#~ msgid "Cancel" +#~ msgstr "Cancelar" + +#~ msgctxt "#30619" +#~ msgid "Port" +#~ msgstr "Porta" + +#~ msgctxt "#30630" +#~ msgid "Save" +#~ msgstr "Salvar" + +#~ msgctxt "#30703" +#~ msgid "Are you sure?" +#~ msgstr "Tem certeza?" + +#~ msgctxt "#30794" +#~ msgid "Likes count display colour" +#~ msgstr "Cor de exibição do número de curtidas" + +#~ msgctxt "#30795" +#~ msgid "Comments count display colour" +#~ msgstr "Cor de exibição do número de comentários" + +#~ msgctxt "#30546" +#~ msgid "Please log in twice!" +#~ msgstr "Por favor inicie sessão duas vezes!" + +#~ msgctxt "#30547" +#~ msgid "You must enable two applications so that YouTube is functioning properly." +#~ msgstr "Você deve ativar 2 aplicações para que o YouTube funcione adequadamente." + #~ msgctxt "#30001" #~ msgid "Username" #~ msgstr "Usuário" diff --git a/plugin.video.youtube/resources/language/resource.language.pt_pt/strings.po b/plugin.video.youtube/resources/language/resource.language.pt_pt/strings.po index 81f900d434..1256bd5fb0 100644 --- a/plugin.video.youtube/resources/language/resource.language.pt_pt/strings.po +++ b/plugin.video.youtube/resources/language/resource.language.pt_pt/strings.po @@ -31,13 +31,14 @@ msgstr "" # msgctxt "Addon Summary" # msgid "Plugin for YouTube" -# msgstr "Plugin para o Youtube" +# msgstr "" # msgctxt "Addon Description" # msgid "YouTube is a one of the biggest video-sharing websites of the world." -# msgstr "Youtube é um dos maiores sites do mundo de partilha de vídeos." +# msgstr "" +# Kodion Settings msgctxt "#30000" -msgid "General" -msgstr "Geral" +msgid "" +msgstr "" msgctxt "#30001" msgid "" @@ -149,8 +150,8 @@ msgid "Configure %s?" msgstr "" msgctxt "#30031" -msgid "Advanced" -msgstr "Avançado" +msgid "" +msgstr "" msgctxt "#30032" msgid "View: TV Shows" @@ -215,8 +216,8 @@ msgid "Watch Later" msgstr "Ver mais tarde" msgctxt "#30108" -msgid "Remove" -msgstr "Remover" +msgid "" +msgstr "" msgctxt "#30109" msgid "" @@ -235,8 +236,8 @@ msgid "Sign Out" msgstr "Terminar Sessão" msgctxt "#30113" -msgid "Rename" -msgstr "Renomear" +msgid "" +msgstr "" msgctxt "#30114" msgid "Confirm delete" @@ -255,8 +256,8 @@ msgid "Remove \"%s\"?" msgstr "Remover \"%s\"?" msgctxt "#30118" -msgid "Delete" -msgstr "Apagar" +msgid "" +msgstr "" msgctxt "#30119" msgid "Please wait..." @@ -299,12 +300,12 @@ msgstr "" # YouTube # empty strings from id 30206 to 30499 msgctxt "#30500" -msgid "Channels" -msgstr "Canais" +msgid "" +msgstr "" msgctxt "#30501" -msgid "Playlists" -msgstr "Listas de Reproduções" +msgid "" +msgstr "" msgctxt "#30502" msgid "Go to %s" @@ -359,8 +360,8 @@ msgid "Related Videos" msgstr "Vídeos relacionados" msgctxt "#30515" -msgid "Auto-Remove from 'Watch Later'" -msgstr "Remover automaticamente de 'Ver mais tarde'" +msgid "Auto-Remove from Watch Later" +msgstr "" msgctxt "#30516" msgid "Folders" @@ -383,16 +384,16 @@ msgid "Add to..." msgstr "Adicionar a..." msgctxt "#30521" -msgid "Select playlist" -msgstr "Selecionar Lista de Reprodução" +msgid "" +msgstr "" msgctxt "#30522" -msgid "New playlist..." -msgstr "Nova Lista de Reprodução..." +msgid "" +msgstr "" msgctxt "#30523" -msgid "Language" -msgstr "Língua" +msgid "" +msgstr "" msgctxt "#30524" msgid "Select language" @@ -423,20 +424,20 @@ msgid "I dislike this" msgstr "Não gosto" msgctxt "#30531" -msgid "Play all" -msgstr "Reproduzir todos" +msgid "" +msgstr "" msgctxt "#30532" -msgid "Default" -msgstr "Padrão" +msgid "" +msgstr "" msgctxt "#30533" msgid "Reverse" msgstr "Anular" msgctxt "#30534" -msgid "Shuffle" -msgstr "Aleatório" +msgid "" +msgstr "" msgctxt "#30535" msgid "Select the order of the playlist" @@ -455,8 +456,8 @@ msgid "Disliked Videos" msgstr "Vídeos que Não Gostei" msgctxt "#30539" -msgid "Live" -msgstr "Em Directo" +msgid "" +msgstr "" msgctxt "#30540" msgid "Play with..." @@ -471,8 +472,8 @@ msgid "rtmpe streams are not supported" msgstr "rtmpe streams não são suportados" msgctxt "#30543" -msgid "Refresh" -msgstr "Actualizar" +msgid "" +msgstr "" msgctxt "#30544" msgid "More Links from the description" @@ -483,24 +484,24 @@ msgid "No further links found." msgstr "Nenhum link encontrado" msgctxt "#30546" -msgid "Please log in twice!" -msgstr "Por favor inicie sessão duas vezes" +msgid "Please complete all login prompts" +msgstr "" msgctxt "#30547" -msgid "You must enable two applications so that YouTube is functioning properly." -msgstr "Tem que activar duas aplicações para que o Youtube funcione correctamente." +msgid "You may be prompted to enable two applications so that YouTube is functioning properly." +msgstr "" msgctxt "#30548" -msgid "More..." -msgstr "Mais..." +msgid "" +msgstr "" msgctxt "#30549" msgid "No videos streams found" msgstr "Nenhuma stream de vídeo encontrada" msgctxt "#30550" -msgid "Region" -msgstr "Região" +msgid "" +msgstr "" msgctxt "#30551" msgid "Recommendations" @@ -539,15 +540,15 @@ msgid "Delete settings.xml" msgstr "apagar settings.xml" msgctxt "#30560" -msgid "Subtitle language" -msgstr "Linguagem das legendas" +msgid "" +msgstr "" msgctxt "#30561" -msgid "None" -msgstr "Nenhuma" +msgid "" +msgstr "" msgctxt "#30562" -msgid "" +msgid "View all" msgstr "" msgctxt "#30563" @@ -563,8 +564,8 @@ msgid "" msgstr "" msgctxt "#30566" -msgid "Prompt" -msgstr "Perguntar" +msgid "" +msgstr "" msgctxt "#30567" msgid "Set as Watch Later" @@ -575,12 +576,12 @@ msgid "Remove as Watch Later" msgstr "Remover de Ver mais tarde" msgctxt "#30569" -msgid "Are you sure you want to remove '%s' as your Watch Later list?" -msgstr "Tem a certeza que deseja remover '%s' da sua lista de Ver mais tarde?" +msgid "Are you sure you want to remove \"%s\" as your Watch Later list?" +msgstr "" msgctxt "#30570" -msgid "Are you sure you want to replace your current Watch Later list with '%s'?" -msgstr "Tem a certeza que deseja substituir a sua actual lista Ver mais tarde com '%s'?" +msgid "Are you sure you want to replace your current Watch Later list with \"%s\"?" +msgstr "" msgctxt "#30571" msgid "Set as History" @@ -591,12 +592,12 @@ msgid "Remove as History" msgstr "Remover do Histórico" msgctxt "#30573" -msgid "Are you sure you want to remove '%s' as your History list?" -msgstr "Tem a certeza que deseja remover '%s' da sua lista do Histórico?" +msgid "Are you sure you want to remove \"%s\" as your History list?" +msgstr "" msgctxt "#30574" -msgid "Are you sure you want to replace your current History list with '%s'?" -msgstr "Tem a certeza que deseja substituir a sua actual lista do Histórico com '%s'?" +msgid "Are you sure you want to replace your current History list with \"%s\"?" +msgstr "" msgctxt "#30575" msgid "Succeeded" @@ -607,8 +608,8 @@ msgid "Failed" msgstr "Falhou" msgctxt "#30577" -msgid "Settings" -msgstr "Definições" +msgid "" +msgstr "" msgctxt "#30578" msgid "Force SSL certificate verification" @@ -631,8 +632,8 @@ msgid "Autoplay suggested videos" msgstr "Reprodução automática de vídeos sugeridos" msgctxt "#30583" -msgid "Automatic" -msgstr "Automático" +msgid "" +msgstr "" msgctxt "#30584" msgid "My Subscriptions (Filtered)" @@ -691,15 +692,15 @@ msgid "Updated: %s" msgstr "Actualizado: %s" msgctxt "#30598" -msgid "Personal API keys enabled" -msgstr "Chaves API pessoais activadas" +msgid "" +msgstr "" msgctxt "#30599" msgid "Failed to enable personal API keys. Missing: %s" msgstr "Falha ao activar chaves API pessoais. Em falta: %s" msgctxt "#30600" -msgid "Subtitles" +msgid "" msgstr "" msgctxt "#30601" @@ -759,8 +760,8 @@ msgid "" msgstr "" msgctxt "#30615" -msgid "Cancel" -msgstr "Cancelar" +msgid "" +msgstr "" msgctxt "#30616" msgid "" @@ -775,8 +776,8 @@ msgid "" msgstr "" msgctxt "#30619" -msgid "Port" -msgstr "Porta" +msgid "" +msgstr "" msgctxt "#30620" msgid "Port %s already in use. Cannot start http server." @@ -819,8 +820,8 @@ msgid "IP whitelist (comma delimited)" msgstr "Lista de permissões de IP (delimitada por vírgulas)" msgctxt "#30630" -msgid "Save" -msgstr "Guardar" +msgid "" +msgstr "" msgctxt "#30631" msgid "Successfully updated: %s" @@ -935,8 +936,8 @@ msgid "Enter a name for this user" msgstr "Insira um nome para este utilizador" msgctxt "#30659" -msgid "User is now '%s'" -msgstr "Utilizador é agora '%s'" +msgid "User is now \"%s\"" +msgstr "" msgctxt "#30660" msgid "Users" @@ -959,16 +960,16 @@ msgid "Switch user" msgstr "Mudar de utilizador" msgctxt "#30665" -msgid "Switch to '%s' now?" -msgstr "Mudar para '%s' agora?" +msgid "Switch to \"%s\" now?" +msgstr "" msgctxt "#30666" -msgid "%s removed" +msgid "\"%s\" removed" msgstr "" msgctxt "#30667" -msgid "Renamed '%s' to '%s'" -msgstr "Renomeado '%s' para '%s'" +msgid "Renamed \"%s\" to \"%s\"" +msgstr "" msgctxt "#30668" msgid "Play count minimum percent" @@ -1111,8 +1112,8 @@ msgid "Play with subtitles" msgstr "Reproduzir com legendas" msgctxt "#30703" -msgid "Are you sure?" -msgstr "Tem a certeza?" +msgid "" +msgstr "" msgctxt "#30704" msgid "Use YouTube website urls with default player" @@ -1255,7 +1256,7 @@ msgid "" msgstr "" msgctxt "#30739" -msgid "" +msgid "Subscribers" msgstr "" msgctxt "#30740" @@ -1475,11 +1476,11 @@ msgid "Views count display colour" msgstr "" msgctxt "#30794" -msgid "Likes count display colour" +msgid "Subscriber/Likes count display colour" msgstr "" msgctxt "#30795" -msgid "Comments count display colour" +msgid "Videos/Comments count display colour" msgstr "" msgctxt "#30796" @@ -1578,6 +1579,166 @@ msgctxt "#30819" msgid "Play from start" msgstr "" +msgctxt "#30820" +msgid "Podcast" +msgstr "" + +#~ msgctxt "#30515" +#~ msgid "Auto-Remove from 'Watch Later'" +#~ msgstr "Remover automaticamente de 'Ver mais tarde'" + +#~ msgctxt "#30569" +#~ msgid "Are you sure you want to remove '%s' as your Watch Later list?" +#~ msgstr "Tem a certeza que deseja remover '%s' da sua lista de Ver mais tarde?" + +#~ msgctxt "#30570" +#~ msgid "Are you sure you want to replace your current Watch Later list with '%s'?" +#~ msgstr "Tem a certeza que deseja substituir a sua actual lista Ver mais tarde com '%s'?" + +#~ msgctxt "#30573" +#~ msgid "Are you sure you want to remove '%s' as your History list?" +#~ msgstr "Tem a certeza que deseja remover '%s' da sua lista do Histórico?" + +#~ msgctxt "#30574" +#~ msgid "Are you sure you want to replace your current History list with '%s'?" +#~ msgstr "Tem a certeza que deseja substituir a sua actual lista do Histórico com '%s'?" + +#~ msgctxt "#30659" +#~ msgid "User is now '%s'" +#~ msgstr "Utilizador é agora '%s'" + +#~ msgctxt "#30665" +#~ msgid "Switch to '%s' now?" +#~ msgstr "Mudar para '%s' agora?" + +#~ msgctxt "#30667" +#~ msgid "Renamed '%s' to '%s'" +#~ msgstr "Renomeado '%s' para '%s'" + +# msgctxt "Addon Summary" +# msgid "Plugin for YouTube" +# msgstr "Plugin para o Youtube" +# msgctxt "Addon Description" +# msgid "YouTube is a one of the biggest video-sharing websites of the world." +# msgstr "Youtube é um dos maiores sites do mundo de partilha de vídeos." +#~ msgctxt "#30000" +#~ msgid "General" +#~ msgstr "Geral" + +#~ msgctxt "#30031" +#~ msgid "Advanced" +#~ msgstr "Avançado" + +#~ msgctxt "#30108" +#~ msgid "Remove" +#~ msgstr "Remover" + +#~ msgctxt "#30113" +#~ msgid "Rename" +#~ msgstr "Renomear" + +#~ msgctxt "#30118" +#~ msgid "Delete" +#~ msgstr "Apagar" + +# YouTube +# empty strings from id 30206 to 30499 +#~ msgctxt "#30500" +#~ msgid "Channels" +#~ msgstr "Canais" + +#~ msgctxt "#30501" +#~ msgid "Playlists" +#~ msgstr "Listas de Reproduções" + +#~ msgctxt "#30521" +#~ msgid "Select playlist" +#~ msgstr "Selecionar Lista de Reprodução" + +#~ msgctxt "#30522" +#~ msgid "New playlist..." +#~ msgstr "Nova Lista de Reprodução..." + +#~ msgctxt "#30523" +#~ msgid "Language" +#~ msgstr "Língua" + +#~ msgctxt "#30531" +#~ msgid "Play all" +#~ msgstr "Reproduzir todos" + +#~ msgctxt "#30532" +#~ msgid "Default" +#~ msgstr "Padrão" + +#~ msgctxt "#30534" +#~ msgid "Shuffle" +#~ msgstr "Aleatório" + +#~ msgctxt "#30539" +#~ msgid "Live" +#~ msgstr "Em Directo" + +#~ msgctxt "#30543" +#~ msgid "Refresh" +#~ msgstr "Actualizar" + +#~ msgctxt "#30548" +#~ msgid "More..." +#~ msgstr "Mais..." + +#~ msgctxt "#30550" +#~ msgid "Region" +#~ msgstr "Região" + +#~ msgctxt "#30560" +#~ msgid "Subtitle language" +#~ msgstr "Linguagem das legendas" + +#~ msgctxt "#30561" +#~ msgid "None" +#~ msgstr "Nenhuma" + +#~ msgctxt "#30566" +#~ msgid "Prompt" +#~ msgstr "Perguntar" + +#~ msgctxt "#30577" +#~ msgid "Settings" +#~ msgstr "Definições" + +#~ msgctxt "#30583" +#~ msgid "Automatic" +#~ msgstr "Automático" + +#~ msgctxt "#30598" +#~ msgid "Personal API keys enabled" +#~ msgstr "Chaves API pessoais activadas" + +#~ msgctxt "#30615" +#~ msgid "Cancel" +#~ msgstr "Cancelar" + +#~ msgctxt "#30619" +#~ msgid "Port" +#~ msgstr "Porta" + +#~ msgctxt "#30630" +#~ msgid "Save" +#~ msgstr "Guardar" + +#~ msgctxt "#30703" +#~ msgid "Are you sure?" +#~ msgstr "Tem a certeza?" + +#~ msgctxt "#30546" +#~ msgid "Please log in twice!" +#~ msgstr "Por favor inicie sessão duas vezes" + +#~ msgctxt "#30547" +#~ msgid "You must enable two applications so that YouTube is functioning properly." +#~ msgstr "Tem que activar duas aplicações para que o Youtube funcione correctamente." + #~ msgctxt "#30001" #~ msgid "Username" #~ msgstr "Utilizador" diff --git a/plugin.video.youtube/resources/language/resource.language.ro_ro/strings.po b/plugin.video.youtube/resources/language/resource.language.ro_ro/strings.po index c3b8c08246..3454b999d4 100644 --- a/plugin.video.youtube/resources/language/resource.language.ro_ro/strings.po +++ b/plugin.video.youtube/resources/language/resource.language.ro_ro/strings.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: XBMC-Addons\n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" +"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n" "POT-Creation-Date: 2015-09-21 11:01+0000\n" "PO-Revision-Date: 2024-08-06 06:27+0000\n" "Last-Translator: Daniel \n" @@ -35,9 +35,10 @@ msgstr "Acest modul nu este susținut de Google" # msgctxt "Addon Description" # msgid "YouTube is a one of the biggest video-sharing websites of the world." # msgstr "" +# Kodion Settings msgctxt "#30000" -msgid "General" -msgstr "Generale" +msgid "" +msgstr "" msgctxt "#30001" msgid "" @@ -150,8 +151,8 @@ msgid "Configure %s?" msgstr "" msgctxt "#30031" -msgid "Advanced" -msgstr "Avansat" +msgid "" +msgstr "" msgctxt "#30032" msgid "View: TV Shows" @@ -216,8 +217,8 @@ msgid "Watch Later" msgstr "Privesc mai târziu" msgctxt "#30108" -msgid "Remove" -msgstr "Elimină" +msgid "" +msgstr "" msgctxt "#30109" msgid "" @@ -236,8 +237,8 @@ msgid "Sign Out" msgstr "Deautentificare" msgctxt "#30113" -msgid "Rename" -msgstr "Redenumire" +msgid "" +msgstr "" msgctxt "#30114" msgid "Confirm delete" @@ -256,8 +257,8 @@ msgid "Remove \"%s\"?" msgstr "Eliminați „%s”?" msgctxt "#30118" -msgid "Delete" -msgstr "Șterge" +msgid "" +msgstr "" msgctxt "#30119" msgid "Please wait..." @@ -300,12 +301,12 @@ msgstr "" # YouTube # empty strings from id 30206 to 30499 msgctxt "#30500" -msgid "Channels" -msgstr "Canale" +msgid "" +msgstr "" msgctxt "#30501" -msgid "Playlists" -msgstr "Liste de redare" +msgid "" +msgstr "" msgctxt "#30502" msgid "Go to %s" @@ -360,8 +361,8 @@ msgid "Related Videos" msgstr "Videoclipuri similare" msgctxt "#30515" -msgid "Auto-Remove from 'Watch Later'" -msgstr "Eliminare automată din „Privesc mai târziu”" +msgid "Auto-Remove from Watch Later" +msgstr "" msgctxt "#30516" msgid "Folders" @@ -384,16 +385,16 @@ msgid "Add to..." msgstr "Adaugă la..." msgctxt "#30521" -msgid "Select playlist" -msgstr "Selectați listă de redare" +msgid "" +msgstr "" msgctxt "#30522" -msgid "New playlist..." -msgstr "Listă de redare nouă..." +msgid "" +msgstr "" msgctxt "#30523" -msgid "Language" -msgstr "Limbă" +msgid "" +msgstr "" msgctxt "#30524" msgid "Select language" @@ -424,20 +425,20 @@ msgid "I dislike this" msgstr "Nu-mi place" msgctxt "#30531" -msgid "Play all" -msgstr "Redă toate" +msgid "" +msgstr "" msgctxt "#30532" -msgid "Default" -msgstr "Implicit" +msgid "" +msgstr "" msgctxt "#30533" msgid "Reverse" msgstr "Invers" msgctxt "#30534" -msgid "Shuffle" -msgstr "Amestecă" +msgid "" +msgstr "" msgctxt "#30535" msgid "Select the order of the playlist" @@ -456,8 +457,8 @@ msgid "Disliked Videos" msgstr "Videoclipuri care nu-mi plac" msgctxt "#30539" -msgid "Live" -msgstr "În direct" +msgid "" +msgstr "" msgctxt "#30540" msgid "Play with..." @@ -472,8 +473,8 @@ msgid "rtmpe streams are not supported" msgstr "Fluxurile rtmpe nu sunt suportate" msgctxt "#30543" -msgid "Refresh" -msgstr "Reîmprospătează" +msgid "" +msgstr "" msgctxt "#30544" msgid "More Links from the description" @@ -484,24 +485,24 @@ msgid "No further links found." msgstr "Nu mai sunt alte legături." msgctxt "#30546" -msgid "Please log in twice!" -msgstr "Vă rugăm să vă autentificați de două ori!" +msgid "Please complete all login prompts" +msgstr "" msgctxt "#30547" -msgid "You must enable two applications so that YouTube is functioning properly." -msgstr "Trebuie să activați două aplicații ca YouTube să funcționeze cum trebuie." +msgid "You may be prompted to enable two applications so that YouTube is functioning properly." +msgstr "" msgctxt "#30548" -msgid "More..." -msgstr "Mai multe..." +msgid "" +msgstr "" msgctxt "#30549" msgid "No videos streams found" msgstr "Nu a fost găsit niciun flux video" msgctxt "#30550" -msgid "Region" -msgstr "Regiune" +msgid "" +msgstr "" msgctxt "#30551" msgid "Recommendations" @@ -540,15 +541,15 @@ msgid "Delete settings.xml" msgstr "" msgctxt "#30560" -msgid "Subtitle language" -msgstr "Limba subtitrării" +msgid "" +msgstr "" msgctxt "#30561" -msgid "None" -msgstr "Nici una" +msgid "" +msgstr "" msgctxt "#30562" -msgid "" +msgid "View all" msgstr "" msgctxt "#30563" @@ -564,8 +565,8 @@ msgid "" msgstr "" msgctxt "#30566" -msgid "Prompt" -msgstr "Prompt" +msgid "" +msgstr "" msgctxt "#30567" msgid "Set as Watch Later" @@ -576,11 +577,11 @@ msgid "Remove as Watch Later" msgstr "Șterge din 'Vezi mai târziu'" msgctxt "#30569" -msgid "Are you sure you want to remove '%s' as your Watch Later list?" +msgid "Are you sure you want to remove \"%s\" as your Watch Later list?" msgstr "" msgctxt "#30570" -msgid "Are you sure you want to replace your current Watch Later list with '%s'?" +msgid "Are you sure you want to replace your current Watch Later list with \"%s\"?" msgstr "" msgctxt "#30571" @@ -592,11 +593,11 @@ msgid "Remove as History" msgstr "Șterge din istoric" msgctxt "#30573" -msgid "Are you sure you want to remove '%s' as your History list?" +msgid "Are you sure you want to remove \"%s\" as your History list?" msgstr "" msgctxt "#30574" -msgid "Are you sure you want to replace your current History list with '%s'?" +msgid "Are you sure you want to replace your current History list with \"%s\"?" msgstr "" msgctxt "#30575" @@ -608,8 +609,8 @@ msgid "Failed" msgstr "" msgctxt "#30577" -msgid "Settings" -msgstr "Setări" +msgid "" +msgstr "" msgctxt "#30578" msgid "Force SSL certificate verification" @@ -632,7 +633,7 @@ msgid "Autoplay suggested videos" msgstr "" msgctxt "#30583" -msgid "Automatic" +msgid "" msgstr "" msgctxt "#30584" @@ -692,7 +693,7 @@ msgid "Updated: %s" msgstr "" msgctxt "#30598" -msgid "Personal API keys enabled" +msgid "" msgstr "" msgctxt "#30599" @@ -700,7 +701,7 @@ msgid "Failed to enable personal API keys. Missing: %s" msgstr "" msgctxt "#30600" -msgid "Subtitles" +msgid "" msgstr "" msgctxt "#30601" @@ -760,7 +761,7 @@ msgid "" msgstr "" msgctxt "#30615" -msgid "Cancel" +msgid "" msgstr "" msgctxt "#30616" @@ -776,7 +777,7 @@ msgid "" msgstr "" msgctxt "#30619" -msgid "Port" +msgid "" msgstr "" msgctxt "#30620" @@ -820,7 +821,7 @@ msgid "IP whitelist (comma delimited)" msgstr "" msgctxt "#30630" -msgid "Save" +msgid "" msgstr "" msgctxt "#30631" @@ -936,7 +937,7 @@ msgid "Enter a name for this user" msgstr "" msgctxt "#30659" -msgid "User is now '%s'" +msgid "User is now \"%s\"" msgstr "" msgctxt "#30660" @@ -960,15 +961,15 @@ msgid "Switch user" msgstr "" msgctxt "#30665" -msgid "Switch to '%s' now?" +msgid "Switch to \"%s\" now?" msgstr "" msgctxt "#30666" -msgid "%s removed" +msgid "\"%s\" removed" msgstr "" msgctxt "#30667" -msgid "Renamed '%s' to '%s'" +msgid "Renamed \"%s\" to \"%s\"" msgstr "" msgctxt "#30668" @@ -1112,7 +1113,7 @@ msgid "Play with subtitles" msgstr "" msgctxt "#30703" -msgid "Are you sure?" +msgid "" msgstr "" msgctxt "#30704" @@ -1256,7 +1257,7 @@ msgid "" msgstr "" msgctxt "#30739" -msgid "" +msgid "Subscribers" msgstr "" msgctxt "#30740" @@ -1476,11 +1477,11 @@ msgid "Views count display colour" msgstr "" msgctxt "#30794" -msgid "Likes count display colour" +msgid "Subscriber/Likes count display colour" msgstr "" msgctxt "#30795" -msgid "Comments count display colour" +msgid "Videos/Comments count display colour" msgstr "" msgctxt "#30796" @@ -1579,6 +1580,114 @@ msgctxt "#30819" msgid "Play from start" msgstr "" +msgctxt "#30820" +msgid "Podcast" +msgstr "" + +#~ msgctxt "#30515" +#~ msgid "Auto-Remove from 'Watch Later'" +#~ msgstr "Eliminare automată din „Privesc mai târziu”" + +# msgctxt "Addon Summary" +# msgid "Plugin for YouTube" +# msgstr "" +# msgctxt "Addon Description" +# msgid "YouTube is a one of the biggest video-sharing websites of the world." +# msgstr "" +#~ msgctxt "#30000" +#~ msgid "General" +#~ msgstr "Generale" + +#~ msgctxt "#30031" +#~ msgid "Advanced" +#~ msgstr "Avansat" + +#~ msgctxt "#30108" +#~ msgid "Remove" +#~ msgstr "Elimină" + +#~ msgctxt "#30113" +#~ msgid "Rename" +#~ msgstr "Redenumire" + +#~ msgctxt "#30118" +#~ msgid "Delete" +#~ msgstr "Șterge" + +# YouTube +# empty strings from id 30206 to 30499 +#~ msgctxt "#30500" +#~ msgid "Channels" +#~ msgstr "Canale" + +#~ msgctxt "#30501" +#~ msgid "Playlists" +#~ msgstr "Liste de redare" + +#~ msgctxt "#30521" +#~ msgid "Select playlist" +#~ msgstr "Selectați listă de redare" + +#~ msgctxt "#30522" +#~ msgid "New playlist..." +#~ msgstr "Listă de redare nouă..." + +#~ msgctxt "#30523" +#~ msgid "Language" +#~ msgstr "Limbă" + +#~ msgctxt "#30531" +#~ msgid "Play all" +#~ msgstr "Redă toate" + +#~ msgctxt "#30532" +#~ msgid "Default" +#~ msgstr "Implicit" + +#~ msgctxt "#30534" +#~ msgid "Shuffle" +#~ msgstr "Amestecă" + +#~ msgctxt "#30539" +#~ msgid "Live" +#~ msgstr "În direct" + +#~ msgctxt "#30543" +#~ msgid "Refresh" +#~ msgstr "Reîmprospătează" + +#~ msgctxt "#30548" +#~ msgid "More..." +#~ msgstr "Mai multe..." + +#~ msgctxt "#30550" +#~ msgid "Region" +#~ msgstr "Regiune" + +#~ msgctxt "#30560" +#~ msgid "Subtitle language" +#~ msgstr "Limba subtitrării" + +#~ msgctxt "#30561" +#~ msgid "None" +#~ msgstr "Nici una" + +#~ msgctxt "#30566" +#~ msgid "Prompt" +#~ msgstr "Prompt" + +#~ msgctxt "#30577" +#~ msgid "Settings" +#~ msgstr "Setări" + +#~ msgctxt "#30546" +#~ msgid "Please log in twice!" +#~ msgstr "Vă rugăm să vă autentificați de două ori!" + +#~ msgctxt "#30547" +#~ msgid "You must enable two applications so that YouTube is functioning properly." +#~ msgstr "Trebuie să activați două aplicații ca YouTube să funcționeze cum trebuie." + #~ msgctxt "#30001" #~ msgid "Username" #~ msgstr "Nume utilizator" diff --git a/plugin.video.youtube/resources/language/resource.language.ru_ru/strings.po b/plugin.video.youtube/resources/language/resource.language.ru_ru/strings.po index 9b6697635a..780cf725be 100644 --- a/plugin.video.youtube/resources/language/resource.language.ru_ru/strings.po +++ b/plugin.video.youtube/resources/language/resource.language.ru_ru/strings.po @@ -31,14 +31,14 @@ msgstr "Плагин не поддерживается Google" # msgctxt "Addon Summary" # msgid "Plugin for YouTube" -# msgstr "Видеодополнение YouTube" +# msgstr "" # msgctxt "Addon Description" # msgid "YouTube is a one of the biggest video-sharing websites of the world." -# msgstr "YouTube - популярнейший видеохостинговый сайт, предоставляющий пользователям услуги хранения, доставки и показа видео." +# msgstr "" # Kodion Settings msgctxt "#30000" -msgid "General" -msgstr "Общие" +msgid "" +msgstr "" msgctxt "#30001" msgid "" @@ -151,8 +151,8 @@ msgid "Configure %s?" msgstr "" msgctxt "#30031" -msgid "Advanced" -msgstr "Расширенные" +msgid "" +msgstr "" msgctxt "#30032" msgid "View: TV Shows" @@ -217,8 +217,8 @@ msgid "Watch Later" msgstr "Отложенный просмотр" msgctxt "#30108" -msgid "Remove" -msgstr "Удалить" +msgid "" +msgstr "" msgctxt "#30109" msgid "" @@ -237,8 +237,8 @@ msgid "Sign Out" msgstr "Выйти" msgctxt "#30113" -msgid "Rename" -msgstr "Изменить" +msgid "" +msgstr "" msgctxt "#30114" msgid "Confirm delete" @@ -257,8 +257,8 @@ msgid "Remove \"%s\"?" msgstr "Удалить \"%s\"?" msgctxt "#30118" -msgid "Delete" -msgstr "Удаление" +msgid "" +msgstr "" msgctxt "#30119" msgid "Please wait..." @@ -301,12 +301,12 @@ msgstr "" # YouTube # empty strings from id 30206 to 30499 msgctxt "#30500" -msgid "Channels" -msgstr "Каналы" +msgid "" +msgstr "" msgctxt "#30501" -msgid "Playlists" -msgstr "Плейлисты" +msgid "" +msgstr "" msgctxt "#30502" msgid "Go to %s" @@ -361,8 +361,8 @@ msgid "Related Videos" msgstr "Похожее видео" msgctxt "#30515" -msgid "Auto-Remove from 'Watch Later'" -msgstr "Автоматическое удаление из \"Отложенного просмотра\"" +msgid "Auto-Remove from Watch Later" +msgstr "" msgctxt "#30516" msgid "Folders" @@ -385,16 +385,16 @@ msgid "Add to..." msgstr "Добавить в..." msgctxt "#30521" -msgid "Select playlist" -msgstr "Выбрать плейлист" +msgid "" +msgstr "" msgctxt "#30522" -msgid "New playlist..." -msgstr "Новый плейлист..." +msgid "" +msgstr "" msgctxt "#30523" -msgid "Language" -msgstr "Язык" +msgid "" +msgstr "" msgctxt "#30524" msgid "Select language" @@ -425,20 +425,20 @@ msgid "I dislike this" msgstr "Мне не понравилось" msgctxt "#30531" -msgid "Play all" -msgstr "Проиграть все" +msgid "" +msgstr "" msgctxt "#30532" -msgid "Default" -msgstr "в обычном порядке" +msgid "" +msgstr "" msgctxt "#30533" msgid "Reverse" msgstr "в обратном порядке" msgctxt "#30534" -msgid "Shuffle" -msgstr "в случайном порядке" +msgid "" +msgstr "" msgctxt "#30535" msgid "Select the order of the playlist" @@ -457,8 +457,8 @@ msgid "Disliked Videos" msgstr "Непонравившееся видео" msgctxt "#30539" -msgid "Live" -msgstr "Прямой эфир" +msgid "" +msgstr "" msgctxt "#30540" msgid "Play with..." @@ -473,8 +473,8 @@ msgid "rtmpe streams are not supported" msgstr "потоки rtmpe не поддерживаются" msgctxt "#30543" -msgid "Refresh" -msgstr "Обновить" +msgid "" +msgstr "" msgctxt "#30544" msgid "More Links from the description" @@ -485,24 +485,24 @@ msgid "No further links found." msgstr "Ссылки не найдены." msgctxt "#30546" -msgid "Please log in twice!" -msgstr "Пожалуйста, авторизуйтесь дважды!" +msgid "Please complete all login prompts" +msgstr "" msgctxt "#30547" -msgid "You must enable two applications so that YouTube is functioning properly." -msgstr "Вы должны подключить две копии приложения, чтобы YouTube функционировал правильно." +msgid "You may be prompted to enable two applications so that YouTube is functioning properly." +msgstr "" msgctxt "#30548" -msgid "More..." -msgstr "Еще..." +msgid "" +msgstr "" msgctxt "#30549" msgid "No videos streams found" msgstr "Видеопотоки не найдены" msgctxt "#30550" -msgid "Region" -msgstr "регион" +msgid "" +msgstr "" msgctxt "#30551" msgid "Recommendations" @@ -541,15 +541,15 @@ msgid "Delete settings.xml" msgstr "Удалить settings.xml" msgctxt "#30560" -msgid "Subtitle language" -msgstr "Язык субтитров" +msgid "" +msgstr "" msgctxt "#30561" -msgid "None" -msgstr "Ничего" +msgid "" +msgstr "" msgctxt "#30562" -msgid "" +msgid "View all" msgstr "" msgctxt "#30563" @@ -565,8 +565,8 @@ msgid "" msgstr "" msgctxt "#30566" -msgid "Prompt" -msgstr "Спрашивать" +msgid "" +msgstr "" msgctxt "#30567" msgid "Set as Watch Later" @@ -577,12 +577,12 @@ msgid "Remove as Watch Later" msgstr "Удалить из списка Отложенного просмотра" msgctxt "#30569" -msgid "Are you sure you want to remove '%s' as your Watch Later list?" -msgstr "Вы уверены, что хотите удалить '%s' из списка Отложенного просмотра?" +msgid "Are you sure you want to remove \"%s\" as your Watch Later list?" +msgstr "" msgctxt "#30570" -msgid "Are you sure you want to replace your current Watch Later list with '%s'?" -msgstr "Вы уверены, что хотите заменить свой текущий список Отложенного просмотра на '%s'?" +msgid "Are you sure you want to replace your current Watch Later list with \"%s\"?" +msgstr "" msgctxt "#30571" msgid "Set as History" @@ -593,12 +593,12 @@ msgid "Remove as History" msgstr "Отвязать от истории" msgctxt "#30573" -msgid "Are you sure you want to remove '%s' as your History list?" -msgstr "Вы уверены, что хотите отвязать '%s' от истории просмотра?" +msgid "Are you sure you want to remove \"%s\" as your History list?" +msgstr "" msgctxt "#30574" -msgid "Are you sure you want to replace your current History list with '%s'?" -msgstr "Вы уверены, что хотите заменить текущий плейлист История на '%s'?" +msgid "Are you sure you want to replace your current History list with \"%s\"?" +msgstr "" msgctxt "#30575" msgid "Succeeded" @@ -609,8 +609,8 @@ msgid "Failed" msgstr "Ошибка" msgctxt "#30577" -msgid "Settings" -msgstr "Настройки" +msgid "" +msgstr "" msgctxt "#30578" msgid "Force SSL certificate verification" @@ -633,8 +633,8 @@ msgid "Autoplay suggested videos" msgstr "Воспроизводить предлагаемые видео" msgctxt "#30583" -msgid "Automatic" -msgstr "Автоматически" +msgid "" +msgstr "" msgctxt "#30584" msgid "My Subscriptions (Filtered)" @@ -693,16 +693,16 @@ msgid "Updated: %s" msgstr "Обновлено: %s" msgctxt "#30598" -msgid "Personal API keys enabled" -msgstr "Включен персональный API ключ" +msgid "" +msgstr "" msgctxt "#30599" msgid "Failed to enable personal API keys. Missing: %s" msgstr "Ошибка включения персонального API ключа. Отсутствует: %s" msgctxt "#30600" -msgid "Subtitles" -msgstr "Субтитры" +msgid "" +msgstr "" msgctxt "#30601" msgid "%s with Original/%s fallback" @@ -761,8 +761,8 @@ msgid "" msgstr "" msgctxt "#30615" -msgid "Cancel" -msgstr "Отмена" +msgid "" +msgstr "" msgctxt "#30616" msgid "" @@ -777,8 +777,8 @@ msgid "" msgstr "" msgctxt "#30619" -msgid "Port" -msgstr "Порт" +msgid "" +msgstr "" msgctxt "#30620" msgid "Port %s already in use. Cannot start http server." @@ -821,8 +821,8 @@ msgid "IP whitelist (comma delimited)" msgstr "Белый список IP (разделен запятыми)" msgctxt "#30630" -msgid "Save" -msgstr "Сохранить" +msgid "" +msgstr "" msgctxt "#30631" msgid "Successfully updated: %s" @@ -937,8 +937,8 @@ msgid "Enter a name for this user" msgstr "Введите имя пользователя" msgctxt "#30659" -msgid "User is now '%s'" -msgstr "Текущий пользователь '%s'" +msgid "User is now \"%s\"" +msgstr "" msgctxt "#30660" msgid "Users" @@ -961,16 +961,16 @@ msgid "Switch user" msgstr "Смена пользователя" msgctxt "#30665" -msgid "Switch to '%s' now?" -msgstr "Переключиться на '%s'?" +msgid "Switch to \"%s\" now?" +msgstr "" msgctxt "#30666" -msgid "%s removed" +msgid "\"%s\" removed" msgstr "" msgctxt "#30667" -msgid "Renamed '%s' to '%s'" -msgstr "'%s' переименован в '%s'" +msgid "Renamed \"%s\" to \"%s\"" +msgstr "" msgctxt "#30668" msgid "Play count minimum percent" @@ -1113,8 +1113,8 @@ msgid "Play with subtitles" msgstr "Воспроизвести с субтитрами" msgctxt "#30703" -msgid "Are you sure?" -msgstr "Вы уверены?" +msgid "" +msgstr "" msgctxt "#30704" msgid "Use YouTube website urls with default player" @@ -1257,7 +1257,7 @@ msgid "" msgstr "" msgctxt "#30739" -msgid "" +msgid "Subscribers" msgstr "" msgctxt "#30740" @@ -1477,11 +1477,11 @@ msgid "Views count display colour" msgstr "" msgctxt "#30794" -msgid "Likes count display colour" +msgid "Subscriber/Likes count display colour" msgstr "" msgctxt "#30795" -msgid "Comments count display colour" +msgid "Videos/Comments count display colour" msgstr "" msgctxt "#30796" @@ -1580,6 +1580,171 @@ msgctxt "#30819" msgid "Play from start" msgstr "" +msgctxt "#30820" +msgid "Podcast" +msgstr "" + +#~ msgctxt "#30515" +#~ msgid "Auto-Remove from 'Watch Later'" +#~ msgstr "Автоматическое удаление из \"Отложенного просмотра\"" + +#~ msgctxt "#30569" +#~ msgid "Are you sure you want to remove '%s' as your Watch Later list?" +#~ msgstr "Вы уверены, что хотите удалить '%s' из списка Отложенного просмотра?" + +#~ msgctxt "#30570" +#~ msgid "Are you sure you want to replace your current Watch Later list with '%s'?" +#~ msgstr "Вы уверены, что хотите заменить свой текущий список Отложенного просмотра на '%s'?" + +#~ msgctxt "#30573" +#~ msgid "Are you sure you want to remove '%s' as your History list?" +#~ msgstr "Вы уверены, что хотите отвязать '%s' от истории просмотра?" + +#~ msgctxt "#30574" +#~ msgid "Are you sure you want to replace your current History list with '%s'?" +#~ msgstr "Вы уверены, что хотите заменить текущий плейлист История на '%s'?" + +#~ msgctxt "#30659" +#~ msgid "User is now '%s'" +#~ msgstr "Текущий пользователь '%s'" + +#~ msgctxt "#30665" +#~ msgid "Switch to '%s' now?" +#~ msgstr "Переключиться на '%s'?" + +#~ msgctxt "#30667" +#~ msgid "Renamed '%s' to '%s'" +#~ msgstr "'%s' переименован в '%s'" + +# msgctxt "Addon Summary" +# msgid "Plugin for YouTube" +# msgstr "Видеодополнение YouTube" +# msgctxt "Addon Description" +# msgid "YouTube is a one of the biggest video-sharing websites of the world." +# msgstr "YouTube - популярнейший видеохостинговый сайт, предоставляющий пользователям услуги хранения, доставки и показа видео." +# Kodion Settings +#~ msgctxt "#30000" +#~ msgid "General" +#~ msgstr "Общие" + +#~ msgctxt "#30031" +#~ msgid "Advanced" +#~ msgstr "Расширенные" + +#~ msgctxt "#30108" +#~ msgid "Remove" +#~ msgstr "Удалить" + +#~ msgctxt "#30113" +#~ msgid "Rename" +#~ msgstr "Изменить" + +#~ msgctxt "#30118" +#~ msgid "Delete" +#~ msgstr "Удаление" + +# YouTube +# empty strings from id 30206 to 30499 +#~ msgctxt "#30500" +#~ msgid "Channels" +#~ msgstr "Каналы" + +#~ msgctxt "#30501" +#~ msgid "Playlists" +#~ msgstr "Плейлисты" + +#~ msgctxt "#30521" +#~ msgid "Select playlist" +#~ msgstr "Выбрать плейлист" + +#~ msgctxt "#30522" +#~ msgid "New playlist..." +#~ msgstr "Новый плейлист..." + +#~ msgctxt "#30523" +#~ msgid "Language" +#~ msgstr "Язык" + +#~ msgctxt "#30531" +#~ msgid "Play all" +#~ msgstr "Проиграть все" + +#~ msgctxt "#30532" +#~ msgid "Default" +#~ msgstr "в обычном порядке" + +#~ msgctxt "#30534" +#~ msgid "Shuffle" +#~ msgstr "в случайном порядке" + +#~ msgctxt "#30539" +#~ msgid "Live" +#~ msgstr "Прямой эфир" + +#~ msgctxt "#30543" +#~ msgid "Refresh" +#~ msgstr "Обновить" + +#~ msgctxt "#30548" +#~ msgid "More..." +#~ msgstr "Еще..." + +#~ msgctxt "#30550" +#~ msgid "Region" +#~ msgstr "регион" + +#~ msgctxt "#30560" +#~ msgid "Subtitle language" +#~ msgstr "Язык субтитров" + +#~ msgctxt "#30561" +#~ msgid "None" +#~ msgstr "Ничего" + +#~ msgctxt "#30566" +#~ msgid "Prompt" +#~ msgstr "Спрашивать" + +#~ msgctxt "#30577" +#~ msgid "Settings" +#~ msgstr "Настройки" + +#~ msgctxt "#30583" +#~ msgid "Automatic" +#~ msgstr "Автоматически" + +#~ msgctxt "#30598" +#~ msgid "Personal API keys enabled" +#~ msgstr "Включен персональный API ключ" + +#~ msgctxt "#30600" +#~ msgid "Subtitles" +#~ msgstr "Субтитры" + +#~ msgctxt "#30615" +#~ msgid "Cancel" +#~ msgstr "Отмена" + +#~ msgctxt "#30619" +#~ msgid "Port" +#~ msgstr "Порт" + +#~ msgctxt "#30630" +#~ msgid "Save" +#~ msgstr "Сохранить" + +#~ msgctxt "#30703" +#~ msgid "Are you sure?" +#~ msgstr "Вы уверены?" + +#~ msgctxt "#30546" +#~ msgid "Please log in twice!" +#~ msgstr "Пожалуйста, авторизуйтесь дважды!" + +#~ msgctxt "#30547" +#~ msgid "You must enable two applications so that YouTube is functioning properly." +#~ msgstr "Вы должны подключить две копии приложения, чтобы YouTube функционировал правильно." + #~ msgctxt "#30001" #~ msgid "Username" #~ msgstr "Имя пользователя" diff --git a/plugin.video.youtube/resources/language/resource.language.si_lk/strings.po b/plugin.video.youtube/resources/language/resource.language.si_lk/strings.po index 1306683403..ac2950137d 100644 --- a/plugin.video.youtube/resources/language/resource.language.si_lk/strings.po +++ b/plugin.video.youtube/resources/language/resource.language.si_lk/strings.po @@ -37,7 +37,7 @@ msgstr "" # msgstr "" # Kodion Settings msgctxt "#30000" -msgid "General" +msgid "" msgstr "" msgctxt "#30001" @@ -151,7 +151,7 @@ msgid "Configure %s?" msgstr "" msgctxt "#30031" -msgid "Advanced" +msgid "" msgstr "" msgctxt "#30032" @@ -217,7 +217,7 @@ msgid "Watch Later" msgstr "" msgctxt "#30108" -msgid "Remove" +msgid "" msgstr "" msgctxt "#30109" @@ -237,7 +237,7 @@ msgid "Sign Out" msgstr "" msgctxt "#30113" -msgid "Rename" +msgid "" msgstr "" msgctxt "#30114" @@ -257,7 +257,7 @@ msgid "Remove \"%s\"?" msgstr "" msgctxt "#30118" -msgid "Delete" +msgid "" msgstr "" msgctxt "#30119" @@ -301,11 +301,11 @@ msgstr "" # YouTube # empty strings from id 30206 to 30499 msgctxt "#30500" -msgid "Channels" +msgid "" msgstr "" msgctxt "#30501" -msgid "Playlists" +msgid "" msgstr "" msgctxt "#30502" @@ -361,7 +361,7 @@ msgid "Related Videos" msgstr "" msgctxt "#30515" -msgid "Auto-Remove from 'Watch Later'" +msgid "Auto-Remove from Watch Later" msgstr "" msgctxt "#30516" @@ -385,15 +385,15 @@ msgid "Add to..." msgstr "" msgctxt "#30521" -msgid "Select playlist" +msgid "" msgstr "" msgctxt "#30522" -msgid "New playlist..." +msgid "" msgstr "" msgctxt "#30523" -msgid "Language" +msgid "" msgstr "" msgctxt "#30524" @@ -425,11 +425,11 @@ msgid "I dislike this" msgstr "" msgctxt "#30531" -msgid "Play all" +msgid "" msgstr "" msgctxt "#30532" -msgid "Default" +msgid "" msgstr "" msgctxt "#30533" @@ -437,7 +437,7 @@ msgid "Reverse" msgstr "" msgctxt "#30534" -msgid "Shuffle" +msgid "" msgstr "" msgctxt "#30535" @@ -457,7 +457,7 @@ msgid "Disliked Videos" msgstr "" msgctxt "#30539" -msgid "Live" +msgid "" msgstr "" msgctxt "#30540" @@ -473,7 +473,7 @@ msgid "rtmpe streams are not supported" msgstr "" msgctxt "#30543" -msgid "Refresh" +msgid "" msgstr "" msgctxt "#30544" @@ -485,15 +485,15 @@ msgid "No further links found." msgstr "" msgctxt "#30546" -msgid "Please log in twice!" +msgid "Please complete all login prompts" msgstr "" msgctxt "#30547" -msgid "You must enable two applications so that YouTube is functioning properly." +msgid "You may be prompted to enable two applications so that YouTube is functioning properly." msgstr "" msgctxt "#30548" -msgid "More..." +msgid "" msgstr "" msgctxt "#30549" @@ -501,7 +501,7 @@ msgid "No videos streams found" msgstr "" msgctxt "#30550" -msgid "Region" +msgid "" msgstr "" msgctxt "#30551" @@ -541,15 +541,15 @@ msgid "Delete settings.xml" msgstr "" msgctxt "#30560" -msgid "Subtitle language" +msgid "" msgstr "" msgctxt "#30561" -msgid "None" +msgid "" msgstr "" msgctxt "#30562" -msgid "" +msgid "View all" msgstr "" msgctxt "#30563" @@ -565,7 +565,7 @@ msgid "" msgstr "" msgctxt "#30566" -msgid "Prompt" +msgid "" msgstr "" msgctxt "#30567" @@ -577,11 +577,11 @@ msgid "Remove as Watch Later" msgstr "" msgctxt "#30569" -msgid "Are you sure you want to remove '%s' as your Watch Later list?" +msgid "Are you sure you want to remove \"%s\" as your Watch Later list?" msgstr "" msgctxt "#30570" -msgid "Are you sure you want to replace your current Watch Later list with '%s'?" +msgid "Are you sure you want to replace your current Watch Later list with \"%s\"?" msgstr "" msgctxt "#30571" @@ -593,11 +593,11 @@ msgid "Remove as History" msgstr "" msgctxt "#30573" -msgid "Are you sure you want to remove '%s' as your History list?" +msgid "Are you sure you want to remove \"%s\" as your History list?" msgstr "" msgctxt "#30574" -msgid "Are you sure you want to replace your current History list with '%s'?" +msgid "Are you sure you want to replace your current History list with \"%s\"?" msgstr "" msgctxt "#30575" @@ -609,7 +609,7 @@ msgid "Failed" msgstr "" msgctxt "#30577" -msgid "Settings" +msgid "" msgstr "" msgctxt "#30578" @@ -633,7 +633,7 @@ msgid "Autoplay suggested videos" msgstr "" msgctxt "#30583" -msgid "Automatic" +msgid "" msgstr "" msgctxt "#30584" @@ -693,7 +693,7 @@ msgid "Updated: %s" msgstr "" msgctxt "#30598" -msgid "Personal API keys enabled" +msgid "" msgstr "" msgctxt "#30599" @@ -701,7 +701,7 @@ msgid "Failed to enable personal API keys. Missing: %s" msgstr "" msgctxt "#30600" -msgid "Subtitles" +msgid "" msgstr "" msgctxt "#30601" @@ -761,7 +761,7 @@ msgid "" msgstr "" msgctxt "#30615" -msgid "Cancel" +msgid "" msgstr "" msgctxt "#30616" @@ -777,7 +777,7 @@ msgid "" msgstr "" msgctxt "#30619" -msgid "Port" +msgid "" msgstr "" msgctxt "#30620" @@ -821,7 +821,7 @@ msgid "IP whitelist (comma delimited)" msgstr "" msgctxt "#30630" -msgid "Save" +msgid "" msgstr "" msgctxt "#30631" @@ -937,7 +937,7 @@ msgid "Enter a name for this user" msgstr "" msgctxt "#30659" -msgid "User is now '%s'" +msgid "User is now \"%s\"" msgstr "" msgctxt "#30660" @@ -961,15 +961,15 @@ msgid "Switch user" msgstr "" msgctxt "#30665" -msgid "Switch to '%s' now?" +msgid "Switch to \"%s\" now?" msgstr "" msgctxt "#30666" -msgid "%s removed" +msgid "\"%s\" removed" msgstr "" msgctxt "#30667" -msgid "Renamed '%s' to '%s'" +msgid "Renamed \"%s\" to \"%s\"" msgstr "" msgctxt "#30668" @@ -1113,7 +1113,7 @@ msgid "Play with subtitles" msgstr "" msgctxt "#30703" -msgid "Are you sure?" +msgid "" msgstr "" msgctxt "#30704" @@ -1257,7 +1257,7 @@ msgid "" msgstr "" msgctxt "#30739" -msgid "" +msgid "Subscribers" msgstr "" msgctxt "#30740" @@ -1477,11 +1477,11 @@ msgid "Views count display colour" msgstr "" msgctxt "#30794" -msgid "Likes count display colour" +msgid "Subscriber/Likes count display colour" msgstr "" msgctxt "#30795" -msgid "Comments count display colour" +msgid "Videos/Comments count display colour" msgstr "" msgctxt "#30796" @@ -1579,3 +1579,7 @@ msgstr "" msgctxt "#30819" msgid "Play from start" msgstr "" + +msgctxt "#30820" +msgid "Podcast" +msgstr "" diff --git a/plugin.video.youtube/resources/language/resource.language.sk_sk/strings.po b/plugin.video.youtube/resources/language/resource.language.sk_sk/strings.po index b5b7cb3f7f..6f94b58740 100644 --- a/plugin.video.youtube/resources/language/resource.language.sk_sk/strings.po +++ b/plugin.video.youtube/resources/language/resource.language.sk_sk/strings.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: XBMC-Addons\n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" +"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n" "POT-Creation-Date: 2015-09-21 11:01+0000\n" "PO-Revision-Date: 2024-08-17 20:46+0000\n" "Last-Translator: Jose Riha \n" @@ -31,13 +31,14 @@ msgstr "Tento doplnok nie je schválený spoločnosťou Google" # msgctxt "Addon Summary" # msgid "Plugin for YouTube" -# msgstr "Plugin pre YouTube" +# msgstr "" # msgctxt "Addon Description" # msgid "YouTube is a one of the biggest video-sharing websites of the world." -# msgstr "YouTube je jednou z najväčších webstránok na zdieľanie videa na svete" +# msgstr "" +# Kodion Settings msgctxt "#30000" -msgid "General" -msgstr "Hlavné" +msgid "" +msgstr "" msgctxt "#30001" msgid "" @@ -149,8 +150,8 @@ msgid "Configure %s?" msgstr "Konfigurovať %s?" msgctxt "#30031" -msgid "Advanced" -msgstr "Pokročilé" +msgid "" +msgstr "" msgctxt "#30032" msgid "View: TV Shows" @@ -215,8 +216,8 @@ msgid "Watch Later" msgstr "Pozrieť neskôr" msgctxt "#30108" -msgid "Remove" -msgstr "Odstrániť" +msgid "" +msgstr "" msgctxt "#30109" msgid "" @@ -235,8 +236,8 @@ msgid "Sign Out" msgstr "Odhlásiť" msgctxt "#30113" -msgid "Rename" -msgstr "Premenovať" +msgid "" +msgstr "" msgctxt "#30114" msgid "Confirm delete" @@ -255,8 +256,8 @@ msgid "Remove \"%s\"?" msgstr "Odstrániť \"%s\"?" msgctxt "#30118" -msgid "Delete" -msgstr "Odstrániť" +msgid "" +msgstr "" msgctxt "#30119" msgid "Please wait..." @@ -299,12 +300,12 @@ msgstr "" # YouTube # empty strings from id 30206 to 30499 msgctxt "#30500" -msgid "Channels" -msgstr "Kanály" +msgid "" +msgstr "" msgctxt "#30501" -msgid "Playlists" -msgstr "Zoznamy" +msgid "" +msgstr "" msgctxt "#30502" msgid "Go to %s" @@ -359,8 +360,8 @@ msgid "Related Videos" msgstr "Súvisiace videá" msgctxt "#30515" -msgid "Auto-Remove from 'Watch Later'" -msgstr "Automaticky odstrániť z 'Pozrieť neskôr'" +msgid "Auto-Remove from Watch Later" +msgstr "" msgctxt "#30516" msgid "Folders" @@ -383,16 +384,16 @@ msgid "Add to..." msgstr "Pridať do..." msgctxt "#30521" -msgid "Select playlist" -msgstr "Vyberte zoznam" +msgid "" +msgstr "" msgctxt "#30522" -msgid "New playlist..." -msgstr "Nový zoznam..." +msgid "" +msgstr "" msgctxt "#30523" -msgid "Language" -msgstr "Jazyk" +msgid "" +msgstr "" msgctxt "#30524" msgid "Select language" @@ -423,20 +424,20 @@ msgid "I dislike this" msgstr "Nepáči sa mi to" msgctxt "#30531" -msgid "Play all" -msgstr "Prehrať všetko" +msgid "" +msgstr "" msgctxt "#30532" -msgid "Default" -msgstr "Štandardný" +msgid "" +msgstr "" msgctxt "#30533" msgid "Reverse" msgstr "Naopak" msgctxt "#30534" -msgid "Shuffle" -msgstr "Náhodne" +msgid "" +msgstr "" msgctxt "#30535" msgid "Select the order of the playlist" @@ -455,8 +456,8 @@ msgid "Disliked Videos" msgstr "Videá, ktoré sa mi nepáčia" msgctxt "#30539" -msgid "Live" -msgstr "Živé prenosy" +msgid "" +msgstr "" msgctxt "#30540" msgid "Play with..." @@ -471,8 +472,8 @@ msgid "rtmpe streams are not supported" msgstr "rtmpe prúdy nie sú podporované" msgctxt "#30543" -msgid "Refresh" -msgstr "Obnoviť" +msgid "" +msgstr "" msgctxt "#30544" msgid "More Links from the description" @@ -483,24 +484,24 @@ msgid "No further links found." msgstr "Ďalšie odkazy neboli nájdené." msgctxt "#30546" -msgid "Please log in twice!" -msgstr "Prosím prihláste se dvakrát!" +msgid "Please complete all login prompts" +msgstr "" msgctxt "#30547" -msgid "You must enable two applications so that YouTube is functioning properly." -msgstr "Je potrebné povoliť dve aplikácie pre správnu funkcionalitu doplnku." +msgid "You may be prompted to enable two applications so that YouTube is functioning properly." +msgstr "" msgctxt "#30548" -msgid "More..." -msgstr "Viac..." +msgid "" +msgstr "" msgctxt "#30549" msgid "No videos streams found" msgstr "Žiadne video prúdy neboli nájdené" msgctxt "#30550" -msgid "Region" -msgstr "Región" +msgid "" +msgstr "" msgctxt "#30551" msgid "Recommendations" @@ -539,15 +540,15 @@ msgid "Delete settings.xml" msgstr "Odstrániť settings.xml" msgctxt "#30560" -msgid "Subtitle language" -msgstr "Jazyk titulkov" +msgid "" +msgstr "" msgctxt "#30561" -msgid "None" -msgstr "Žiaden" +msgid "" +msgstr "" msgctxt "#30562" -msgid "" +msgid "View all" msgstr "" msgctxt "#30563" @@ -563,8 +564,8 @@ msgid "" msgstr "" msgctxt "#30566" -msgid "Prompt" -msgstr "Spýtať sa" +msgid "" +msgstr "" msgctxt "#30567" msgid "Set as Watch Later" @@ -575,12 +576,12 @@ msgid "Remove as Watch Later" msgstr "Odstrániť z 'Pozrieť neskôr'" msgctxt "#30569" -msgid "Are you sure you want to remove '%s' as your Watch Later list?" -msgstr "Naozaj chcete odstrániť '%s' zo zoznamu 'Pozrieť neskôr'?" +msgid "Are you sure you want to remove \"%s\" as your Watch Later list?" +msgstr "" msgctxt "#30570" -msgid "Are you sure you want to replace your current Watch Later list with '%s'?" -msgstr "Naozaj chcete nahradiť aktuálny zoznam 'Pozrieť neskôr' zoznamom '%s'?" +msgid "Are you sure you want to replace your current Watch Later list with \"%s\"?" +msgstr "" msgctxt "#30571" msgid "Set as History" @@ -591,12 +592,12 @@ msgid "Remove as History" msgstr "Odstrániť z histórie" msgctxt "#30573" -msgid "Are you sure you want to remove '%s' as your History list?" -msgstr "Naozaj chcete odstrániť '%s' zo zoznamu histórie?" +msgid "Are you sure you want to remove \"%s\" as your History list?" +msgstr "" msgctxt "#30574" -msgid "Are you sure you want to replace your current History list with '%s'?" -msgstr "Naozaj chcete nahradiť aktuálny zoznam histórie zoznamom '%s'?" +msgid "Are you sure you want to replace your current History list with \"%s\"?" +msgstr "" msgctxt "#30575" msgid "Succeeded" @@ -607,8 +608,8 @@ msgid "Failed" msgstr "Neúspech" msgctxt "#30577" -msgid "Settings" -msgstr "Nastavenia" +msgid "" +msgstr "" msgctxt "#30578" msgid "Force SSL certificate verification" @@ -631,8 +632,8 @@ msgid "Autoplay suggested videos" msgstr "Automaticky prehrávať navrhované videá" msgctxt "#30583" -msgid "Automatic" -msgstr "Automaticky" +msgid "" +msgstr "" msgctxt "#30584" msgid "My Subscriptions (Filtered)" @@ -691,16 +692,16 @@ msgid "Updated: %s" msgstr "Aktualizované: %s" msgctxt "#30598" -msgid "Personal API keys enabled" -msgstr "Osobné API kľúče povolené" +msgid "" +msgstr "" msgctxt "#30599" msgid "Failed to enable personal API keys. Missing: %s" msgstr "Nepodarilo sa zapnúť osobné kľúče API. Chýba: %s" msgctxt "#30600" -msgid "Subtitles" -msgstr "Titulky" +msgid "" +msgstr "" msgctxt "#30601" msgid "%s with Original/%s fallback" @@ -759,8 +760,8 @@ msgid "" msgstr "" msgctxt "#30615" -msgid "Cancel" -msgstr "Zrušiť" +msgid "" +msgstr "" msgctxt "#30616" msgid "" @@ -775,8 +776,8 @@ msgid "" msgstr "" msgctxt "#30619" -msgid "Port" -msgstr "Port" +msgid "" +msgstr "" msgctxt "#30620" msgid "Port %s already in use. Cannot start http server." @@ -819,8 +820,8 @@ msgid "IP whitelist (comma delimited)" msgstr "Povolené IP adresy (oddelené čiarkou)" msgctxt "#30630" -msgid "Save" -msgstr "Uložiť" +msgid "" +msgstr "" msgctxt "#30631" msgid "Successfully updated: %s" @@ -935,8 +936,8 @@ msgid "Enter a name for this user" msgstr "Zadajte meno používateľa" msgctxt "#30659" -msgid "User is now '%s'" -msgstr "Používateľ je teraz '%s'" +msgid "User is now \"%s\"" +msgstr "" msgctxt "#30660" msgid "Users" @@ -959,16 +960,16 @@ msgid "Switch user" msgstr "Prepnúť používateľa" msgctxt "#30665" -msgid "Switch to '%s' now?" -msgstr "Prepnúť na '%s' teraz?" +msgid "Switch to \"%s\" now?" +msgstr "" msgctxt "#30666" -msgid "%s removed" -msgstr "%s bolo odstránené" +msgid "\"%s\" removed" +msgstr "" msgctxt "#30667" -msgid "Renamed '%s' to '%s'" -msgstr "'%s' premenované na '%s'" +msgid "Renamed \"%s\" to \"%s\"" +msgstr "" msgctxt "#30668" msgid "Play count minimum percent" @@ -1111,8 +1112,8 @@ msgid "Play with subtitles" msgstr "Prehrať s titulkami" msgctxt "#30703" -msgid "Are you sure?" -msgstr "Naozaj to chcete?" +msgid "" +msgstr "" msgctxt "#30704" msgid "Use YouTube website urls with default player" @@ -1255,7 +1256,7 @@ msgid "" msgstr "" msgctxt "#30739" -msgid "" +msgid "Subscribers" msgstr "" msgctxt "#30740" @@ -1475,12 +1476,12 @@ msgid "Views count display colour" msgstr "Farba zobrazenia počtu videní" msgctxt "#30794" -msgid "Likes count display colour" -msgstr "Farba zobrazenia počtu Lajkov" +msgid "Subscriber/Likes count display colour" +msgstr "" msgctxt "#30795" -msgid "Comments count display colour" -msgstr "Farba zobrazenia počtu komentárov" +msgid "Videos/Comments count display colour" +msgstr "" msgctxt "#30796" msgid "1080p/60 fps | Raspberry Pi 4, or similar" @@ -1578,6 +1579,182 @@ msgctxt "#30819" msgid "Play from start" msgstr "Prehrať od začiatku" +msgctxt "#30820" +msgid "Podcast" +msgstr "" + +#~ msgctxt "#30515" +#~ msgid "Auto-Remove from 'Watch Later'" +#~ msgstr "Automaticky odstrániť z 'Pozrieť neskôr'" + +#~ msgctxt "#30569" +#~ msgid "Are you sure you want to remove '%s' as your Watch Later list?" +#~ msgstr "Naozaj chcete odstrániť '%s' zo zoznamu 'Pozrieť neskôr'?" + +#~ msgctxt "#30570" +#~ msgid "Are you sure you want to replace your current Watch Later list with '%s'?" +#~ msgstr "Naozaj chcete nahradiť aktuálny zoznam 'Pozrieť neskôr' zoznamom '%s'?" + +#~ msgctxt "#30573" +#~ msgid "Are you sure you want to remove '%s' as your History list?" +#~ msgstr "Naozaj chcete odstrániť '%s' zo zoznamu histórie?" + +#~ msgctxt "#30574" +#~ msgid "Are you sure you want to replace your current History list with '%s'?" +#~ msgstr "Naozaj chcete nahradiť aktuálny zoznam histórie zoznamom '%s'?" + +#~ msgctxt "#30659" +#~ msgid "User is now '%s'" +#~ msgstr "Používateľ je teraz '%s'" + +#~ msgctxt "#30665" +#~ msgid "Switch to '%s' now?" +#~ msgstr "Prepnúť na '%s' teraz?" + +#~ msgctxt "#30666" +#~ msgid "%s removed" +#~ msgstr "%s bolo odstránené" + +#~ msgctxt "#30667" +#~ msgid "Renamed '%s' to '%s'" +#~ msgstr "'%s' premenované na '%s'" + +# msgctxt "Addon Summary" +# msgid "Plugin for YouTube" +# msgstr "Plugin pre YouTube" +# msgctxt "Addon Description" +# msgid "YouTube is a one of the biggest video-sharing websites of the world." +# msgstr "YouTube je jednou z najväčších webstránok na zdieľanie videa na svete" +#~ msgctxt "#30000" +#~ msgid "General" +#~ msgstr "Hlavné" + +#~ msgctxt "#30031" +#~ msgid "Advanced" +#~ msgstr "Pokročilé" + +#~ msgctxt "#30108" +#~ msgid "Remove" +#~ msgstr "Odstrániť" + +#~ msgctxt "#30113" +#~ msgid "Rename" +#~ msgstr "Premenovať" + +#~ msgctxt "#30118" +#~ msgid "Delete" +#~ msgstr "Odstrániť" + +# YouTube +# empty strings from id 30206 to 30499 +#~ msgctxt "#30500" +#~ msgid "Channels" +#~ msgstr "Kanály" + +#~ msgctxt "#30501" +#~ msgid "Playlists" +#~ msgstr "Zoznamy" + +#~ msgctxt "#30521" +#~ msgid "Select playlist" +#~ msgstr "Vyberte zoznam" + +#~ msgctxt "#30522" +#~ msgid "New playlist..." +#~ msgstr "Nový zoznam..." + +#~ msgctxt "#30523" +#~ msgid "Language" +#~ msgstr "Jazyk" + +#~ msgctxt "#30531" +#~ msgid "Play all" +#~ msgstr "Prehrať všetko" + +#~ msgctxt "#30532" +#~ msgid "Default" +#~ msgstr "Štandardný" + +#~ msgctxt "#30534" +#~ msgid "Shuffle" +#~ msgstr "Náhodne" + +#~ msgctxt "#30539" +#~ msgid "Live" +#~ msgstr "Živé prenosy" + +#~ msgctxt "#30543" +#~ msgid "Refresh" +#~ msgstr "Obnoviť" + +#~ msgctxt "#30548" +#~ msgid "More..." +#~ msgstr "Viac..." + +#~ msgctxt "#30550" +#~ msgid "Region" +#~ msgstr "Región" + +#~ msgctxt "#30560" +#~ msgid "Subtitle language" +#~ msgstr "Jazyk titulkov" + +#~ msgctxt "#30561" +#~ msgid "None" +#~ msgstr "Žiaden" + +#~ msgctxt "#30566" +#~ msgid "Prompt" +#~ msgstr "Spýtať sa" + +#~ msgctxt "#30577" +#~ msgid "Settings" +#~ msgstr "Nastavenia" + +#~ msgctxt "#30583" +#~ msgid "Automatic" +#~ msgstr "Automaticky" + +#~ msgctxt "#30598" +#~ msgid "Personal API keys enabled" +#~ msgstr "Osobné API kľúče povolené" + +#~ msgctxt "#30600" +#~ msgid "Subtitles" +#~ msgstr "Titulky" + +#~ msgctxt "#30615" +#~ msgid "Cancel" +#~ msgstr "Zrušiť" + +#~ msgctxt "#30619" +#~ msgid "Port" +#~ msgstr "Port" + +#~ msgctxt "#30630" +#~ msgid "Save" +#~ msgstr "Uložiť" + +#~ msgctxt "#30703" +#~ msgid "Are you sure?" +#~ msgstr "Naozaj to chcete?" + +#~ msgctxt "#30794" +#~ msgid "Likes count display colour" +#~ msgstr "Farba zobrazenia počtu Lajkov" + +#~ msgctxt "#30795" +#~ msgid "Comments count display colour" +#~ msgstr "Farba zobrazenia počtu komentárov" + +#~ msgctxt "#30546" +#~ msgid "Please log in twice!" +#~ msgstr "Prosím prihláste se dvakrát!" + +#~ msgctxt "#30547" +#~ msgid "You must enable two applications so that YouTube is functioning properly." +#~ msgstr "Je potrebné povoliť dve aplikácie pre správnu funkcionalitu doplnku." + #~ msgctxt "#30001" #~ msgid "Username" #~ msgstr "Meno používateľa" diff --git a/plugin.video.youtube/resources/language/resource.language.sl_si/strings.po b/plugin.video.youtube/resources/language/resource.language.sl_si/strings.po index d790c597d3..f24c0f2a7e 100644 --- a/plugin.video.youtube/resources/language/resource.language.sl_si/strings.po +++ b/plugin.video.youtube/resources/language/resource.language.sl_si/strings.po @@ -37,7 +37,7 @@ msgstr "" # msgstr "" # Kodion Settings msgctxt "#30000" -msgid "General" +msgid "" msgstr "" msgctxt "#30001" @@ -151,7 +151,7 @@ msgid "Configure %s?" msgstr "" msgctxt "#30031" -msgid "Advanced" +msgid "" msgstr "" msgctxt "#30032" @@ -217,7 +217,7 @@ msgid "Watch Later" msgstr "" msgctxt "#30108" -msgid "Remove" +msgid "" msgstr "" msgctxt "#30109" @@ -237,7 +237,7 @@ msgid "Sign Out" msgstr "" msgctxt "#30113" -msgid "Rename" +msgid "" msgstr "" msgctxt "#30114" @@ -257,7 +257,7 @@ msgid "Remove \"%s\"?" msgstr "" msgctxt "#30118" -msgid "Delete" +msgid "" msgstr "" msgctxt "#30119" @@ -301,11 +301,11 @@ msgstr "" # YouTube # empty strings from id 30206 to 30499 msgctxt "#30500" -msgid "Channels" +msgid "" msgstr "" msgctxt "#30501" -msgid "Playlists" +msgid "" msgstr "" msgctxt "#30502" @@ -361,7 +361,7 @@ msgid "Related Videos" msgstr "" msgctxt "#30515" -msgid "Auto-Remove from 'Watch Later'" +msgid "Auto-Remove from Watch Later" msgstr "" msgctxt "#30516" @@ -385,15 +385,15 @@ msgid "Add to..." msgstr "" msgctxt "#30521" -msgid "Select playlist" +msgid "" msgstr "" msgctxt "#30522" -msgid "New playlist..." +msgid "" msgstr "" msgctxt "#30523" -msgid "Language" +msgid "" msgstr "" msgctxt "#30524" @@ -425,11 +425,11 @@ msgid "I dislike this" msgstr "" msgctxt "#30531" -msgid "Play all" +msgid "" msgstr "" msgctxt "#30532" -msgid "Default" +msgid "" msgstr "" msgctxt "#30533" @@ -437,7 +437,7 @@ msgid "Reverse" msgstr "" msgctxt "#30534" -msgid "Shuffle" +msgid "" msgstr "" msgctxt "#30535" @@ -457,7 +457,7 @@ msgid "Disliked Videos" msgstr "" msgctxt "#30539" -msgid "Live" +msgid "" msgstr "" msgctxt "#30540" @@ -473,7 +473,7 @@ msgid "rtmpe streams are not supported" msgstr "" msgctxt "#30543" -msgid "Refresh" +msgid "" msgstr "" msgctxt "#30544" @@ -485,15 +485,15 @@ msgid "No further links found." msgstr "" msgctxt "#30546" -msgid "Please log in twice!" +msgid "Please complete all login prompts" msgstr "" msgctxt "#30547" -msgid "You must enable two applications so that YouTube is functioning properly." +msgid "You may be prompted to enable two applications so that YouTube is functioning properly." msgstr "" msgctxt "#30548" -msgid "More..." +msgid "" msgstr "" msgctxt "#30549" @@ -501,7 +501,7 @@ msgid "No videos streams found" msgstr "" msgctxt "#30550" -msgid "Region" +msgid "" msgstr "" msgctxt "#30551" @@ -541,15 +541,15 @@ msgid "Delete settings.xml" msgstr "" msgctxt "#30560" -msgid "Subtitle language" +msgid "" msgstr "" msgctxt "#30561" -msgid "None" +msgid "" msgstr "" msgctxt "#30562" -msgid "" +msgid "View all" msgstr "" msgctxt "#30563" @@ -565,7 +565,7 @@ msgid "" msgstr "" msgctxt "#30566" -msgid "Prompt" +msgid "" msgstr "" msgctxt "#30567" @@ -577,11 +577,11 @@ msgid "Remove as Watch Later" msgstr "" msgctxt "#30569" -msgid "Are you sure you want to remove '%s' as your Watch Later list?" +msgid "Are you sure you want to remove \"%s\" as your Watch Later list?" msgstr "" msgctxt "#30570" -msgid "Are you sure you want to replace your current Watch Later list with '%s'?" +msgid "Are you sure you want to replace your current Watch Later list with \"%s\"?" msgstr "" msgctxt "#30571" @@ -593,11 +593,11 @@ msgid "Remove as History" msgstr "" msgctxt "#30573" -msgid "Are you sure you want to remove '%s' as your History list?" +msgid "Are you sure you want to remove \"%s\" as your History list?" msgstr "" msgctxt "#30574" -msgid "Are you sure you want to replace your current History list with '%s'?" +msgid "Are you sure you want to replace your current History list with \"%s\"?" msgstr "" msgctxt "#30575" @@ -609,7 +609,7 @@ msgid "Failed" msgstr "" msgctxt "#30577" -msgid "Settings" +msgid "" msgstr "" msgctxt "#30578" @@ -633,7 +633,7 @@ msgid "Autoplay suggested videos" msgstr "" msgctxt "#30583" -msgid "Automatic" +msgid "" msgstr "" msgctxt "#30584" @@ -693,7 +693,7 @@ msgid "Updated: %s" msgstr "" msgctxt "#30598" -msgid "Personal API keys enabled" +msgid "" msgstr "" msgctxt "#30599" @@ -701,7 +701,7 @@ msgid "Failed to enable personal API keys. Missing: %s" msgstr "" msgctxt "#30600" -msgid "Subtitles" +msgid "" msgstr "" msgctxt "#30601" @@ -761,7 +761,7 @@ msgid "" msgstr "" msgctxt "#30615" -msgid "Cancel" +msgid "" msgstr "" msgctxt "#30616" @@ -777,7 +777,7 @@ msgid "" msgstr "" msgctxt "#30619" -msgid "Port" +msgid "" msgstr "" msgctxt "#30620" @@ -821,7 +821,7 @@ msgid "IP whitelist (comma delimited)" msgstr "" msgctxt "#30630" -msgid "Save" +msgid "" msgstr "" msgctxt "#30631" @@ -937,7 +937,7 @@ msgid "Enter a name for this user" msgstr "" msgctxt "#30659" -msgid "User is now '%s'" +msgid "User is now \"%s\"" msgstr "" msgctxt "#30660" @@ -961,15 +961,15 @@ msgid "Switch user" msgstr "" msgctxt "#30665" -msgid "Switch to '%s' now?" +msgid "Switch to \"%s\" now?" msgstr "" msgctxt "#30666" -msgid "%s removed" +msgid "\"%s\" removed" msgstr "" msgctxt "#30667" -msgid "Renamed '%s' to '%s'" +msgid "Renamed \"%s\" to \"%s\"" msgstr "" msgctxt "#30668" @@ -1113,7 +1113,7 @@ msgid "Play with subtitles" msgstr "" msgctxt "#30703" -msgid "Are you sure?" +msgid "" msgstr "" msgctxt "#30704" @@ -1257,7 +1257,7 @@ msgid "" msgstr "" msgctxt "#30739" -msgid "" +msgid "Subscribers" msgstr "" msgctxt "#30740" @@ -1477,11 +1477,11 @@ msgid "Views count display colour" msgstr "" msgctxt "#30794" -msgid "Likes count display colour" +msgid "Subscriber/Likes count display colour" msgstr "" msgctxt "#30795" -msgid "Comments count display colour" +msgid "Videos/Comments count display colour" msgstr "" msgctxt "#30796" @@ -1579,3 +1579,7 @@ msgstr "" msgctxt "#30819" msgid "Play from start" msgstr "" + +msgctxt "#30820" +msgid "Podcast" +msgstr "" diff --git a/plugin.video.youtube/resources/language/resource.language.sq_al/strings.po b/plugin.video.youtube/resources/language/resource.language.sq_al/strings.po index 50abe6bf7c..621cc0f7fc 100644 --- a/plugin.video.youtube/resources/language/resource.language.sq_al/strings.po +++ b/plugin.video.youtube/resources/language/resource.language.sq_al/strings.po @@ -37,7 +37,7 @@ msgstr "" # msgstr "" # Kodion Settings msgctxt "#30000" -msgid "General" +msgid "" msgstr "" msgctxt "#30001" @@ -151,7 +151,7 @@ msgid "Configure %s?" msgstr "" msgctxt "#30031" -msgid "Advanced" +msgid "" msgstr "" msgctxt "#30032" @@ -217,7 +217,7 @@ msgid "Watch Later" msgstr "" msgctxt "#30108" -msgid "Remove" +msgid "" msgstr "" msgctxt "#30109" @@ -237,7 +237,7 @@ msgid "Sign Out" msgstr "" msgctxt "#30113" -msgid "Rename" +msgid "" msgstr "" msgctxt "#30114" @@ -257,7 +257,7 @@ msgid "Remove \"%s\"?" msgstr "" msgctxt "#30118" -msgid "Delete" +msgid "" msgstr "" msgctxt "#30119" @@ -301,11 +301,11 @@ msgstr "" # YouTube # empty strings from id 30206 to 30499 msgctxt "#30500" -msgid "Channels" +msgid "" msgstr "" msgctxt "#30501" -msgid "Playlists" +msgid "" msgstr "" msgctxt "#30502" @@ -361,7 +361,7 @@ msgid "Related Videos" msgstr "" msgctxt "#30515" -msgid "Auto-Remove from 'Watch Later'" +msgid "Auto-Remove from Watch Later" msgstr "" msgctxt "#30516" @@ -385,15 +385,15 @@ msgid "Add to..." msgstr "" msgctxt "#30521" -msgid "Select playlist" +msgid "" msgstr "" msgctxt "#30522" -msgid "New playlist..." +msgid "" msgstr "" msgctxt "#30523" -msgid "Language" +msgid "" msgstr "" msgctxt "#30524" @@ -425,11 +425,11 @@ msgid "I dislike this" msgstr "" msgctxt "#30531" -msgid "Play all" +msgid "" msgstr "" msgctxt "#30532" -msgid "Default" +msgid "" msgstr "" msgctxt "#30533" @@ -437,7 +437,7 @@ msgid "Reverse" msgstr "" msgctxt "#30534" -msgid "Shuffle" +msgid "" msgstr "" msgctxt "#30535" @@ -457,7 +457,7 @@ msgid "Disliked Videos" msgstr "" msgctxt "#30539" -msgid "Live" +msgid "" msgstr "" msgctxt "#30540" @@ -473,7 +473,7 @@ msgid "rtmpe streams are not supported" msgstr "" msgctxt "#30543" -msgid "Refresh" +msgid "" msgstr "" msgctxt "#30544" @@ -485,15 +485,15 @@ msgid "No further links found." msgstr "" msgctxt "#30546" -msgid "Please log in twice!" +msgid "Please complete all login prompts" msgstr "" msgctxt "#30547" -msgid "You must enable two applications so that YouTube is functioning properly." +msgid "You may be prompted to enable two applications so that YouTube is functioning properly." msgstr "" msgctxt "#30548" -msgid "More..." +msgid "" msgstr "" msgctxt "#30549" @@ -501,7 +501,7 @@ msgid "No videos streams found" msgstr "" msgctxt "#30550" -msgid "Region" +msgid "" msgstr "" msgctxt "#30551" @@ -541,15 +541,15 @@ msgid "Delete settings.xml" msgstr "" msgctxt "#30560" -msgid "Subtitle language" +msgid "" msgstr "" msgctxt "#30561" -msgid "None" +msgid "" msgstr "" msgctxt "#30562" -msgid "" +msgid "View all" msgstr "" msgctxt "#30563" @@ -565,7 +565,7 @@ msgid "" msgstr "" msgctxt "#30566" -msgid "Prompt" +msgid "" msgstr "" msgctxt "#30567" @@ -577,11 +577,11 @@ msgid "Remove as Watch Later" msgstr "" msgctxt "#30569" -msgid "Are you sure you want to remove '%s' as your Watch Later list?" +msgid "Are you sure you want to remove \"%s\" as your Watch Later list?" msgstr "" msgctxt "#30570" -msgid "Are you sure you want to replace your current Watch Later list with '%s'?" +msgid "Are you sure you want to replace your current Watch Later list with \"%s\"?" msgstr "" msgctxt "#30571" @@ -593,11 +593,11 @@ msgid "Remove as History" msgstr "" msgctxt "#30573" -msgid "Are you sure you want to remove '%s' as your History list?" +msgid "Are you sure you want to remove \"%s\" as your History list?" msgstr "" msgctxt "#30574" -msgid "Are you sure you want to replace your current History list with '%s'?" +msgid "Are you sure you want to replace your current History list with \"%s\"?" msgstr "" msgctxt "#30575" @@ -609,7 +609,7 @@ msgid "Failed" msgstr "" msgctxt "#30577" -msgid "Settings" +msgid "" msgstr "" msgctxt "#30578" @@ -633,7 +633,7 @@ msgid "Autoplay suggested videos" msgstr "" msgctxt "#30583" -msgid "Automatic" +msgid "" msgstr "" msgctxt "#30584" @@ -693,7 +693,7 @@ msgid "Updated: %s" msgstr "" msgctxt "#30598" -msgid "Personal API keys enabled" +msgid "" msgstr "" msgctxt "#30599" @@ -701,7 +701,7 @@ msgid "Failed to enable personal API keys. Missing: %s" msgstr "" msgctxt "#30600" -msgid "Subtitles" +msgid "" msgstr "" msgctxt "#30601" @@ -761,7 +761,7 @@ msgid "" msgstr "" msgctxt "#30615" -msgid "Cancel" +msgid "" msgstr "" msgctxt "#30616" @@ -777,7 +777,7 @@ msgid "" msgstr "" msgctxt "#30619" -msgid "Port" +msgid "" msgstr "" msgctxt "#30620" @@ -821,7 +821,7 @@ msgid "IP whitelist (comma delimited)" msgstr "" msgctxt "#30630" -msgid "Save" +msgid "" msgstr "" msgctxt "#30631" @@ -937,7 +937,7 @@ msgid "Enter a name for this user" msgstr "" msgctxt "#30659" -msgid "User is now '%s'" +msgid "User is now \"%s\"" msgstr "" msgctxt "#30660" @@ -961,15 +961,15 @@ msgid "Switch user" msgstr "" msgctxt "#30665" -msgid "Switch to '%s' now?" +msgid "Switch to \"%s\" now?" msgstr "" msgctxt "#30666" -msgid "%s removed" +msgid "\"%s\" removed" msgstr "" msgctxt "#30667" -msgid "Renamed '%s' to '%s'" +msgid "Renamed \"%s\" to \"%s\"" msgstr "" msgctxt "#30668" @@ -1113,7 +1113,7 @@ msgid "Play with subtitles" msgstr "" msgctxt "#30703" -msgid "Are you sure?" +msgid "" msgstr "" msgctxt "#30704" @@ -1257,7 +1257,7 @@ msgid "" msgstr "" msgctxt "#30739" -msgid "" +msgid "Subscribers" msgstr "" msgctxt "#30740" @@ -1477,11 +1477,11 @@ msgid "Views count display colour" msgstr "" msgctxt "#30794" -msgid "Likes count display colour" +msgid "Subscriber/Likes count display colour" msgstr "" msgctxt "#30795" -msgid "Comments count display colour" +msgid "Videos/Comments count display colour" msgstr "" msgctxt "#30796" @@ -1579,3 +1579,7 @@ msgstr "" msgctxt "#30819" msgid "Play from start" msgstr "" + +msgctxt "#30820" +msgid "Podcast" +msgstr "" diff --git a/plugin.video.youtube/resources/language/resource.language.sr_rs/strings.po b/plugin.video.youtube/resources/language/resource.language.sr_rs/strings.po index 6ded4ef0de..f134e55d1d 100644 --- a/plugin.video.youtube/resources/language/resource.language.sr_rs/strings.po +++ b/plugin.video.youtube/resources/language/resource.language.sr_rs/strings.po @@ -37,7 +37,7 @@ msgstr "" # msgstr "" # Kodion Settings msgctxt "#30000" -msgid "General" +msgid "" msgstr "" msgctxt "#30001" @@ -151,7 +151,7 @@ msgid "Configure %s?" msgstr "" msgctxt "#30031" -msgid "Advanced" +msgid "" msgstr "" msgctxt "#30032" @@ -217,7 +217,7 @@ msgid "Watch Later" msgstr "" msgctxt "#30108" -msgid "Remove" +msgid "" msgstr "" msgctxt "#30109" @@ -237,7 +237,7 @@ msgid "Sign Out" msgstr "" msgctxt "#30113" -msgid "Rename" +msgid "" msgstr "" msgctxt "#30114" @@ -257,7 +257,7 @@ msgid "Remove \"%s\"?" msgstr "" msgctxt "#30118" -msgid "Delete" +msgid "" msgstr "" msgctxt "#30119" @@ -301,11 +301,11 @@ msgstr "" # YouTube # empty strings from id 30206 to 30499 msgctxt "#30500" -msgid "Channels" +msgid "" msgstr "" msgctxt "#30501" -msgid "Playlists" +msgid "" msgstr "" msgctxt "#30502" @@ -361,7 +361,7 @@ msgid "Related Videos" msgstr "" msgctxt "#30515" -msgid "Auto-Remove from 'Watch Later'" +msgid "Auto-Remove from Watch Later" msgstr "" msgctxt "#30516" @@ -385,15 +385,15 @@ msgid "Add to..." msgstr "" msgctxt "#30521" -msgid "Select playlist" +msgid "" msgstr "" msgctxt "#30522" -msgid "New playlist..." +msgid "" msgstr "" msgctxt "#30523" -msgid "Language" +msgid "" msgstr "" msgctxt "#30524" @@ -425,11 +425,11 @@ msgid "I dislike this" msgstr "" msgctxt "#30531" -msgid "Play all" +msgid "" msgstr "" msgctxt "#30532" -msgid "Default" +msgid "" msgstr "" msgctxt "#30533" @@ -437,7 +437,7 @@ msgid "Reverse" msgstr "" msgctxt "#30534" -msgid "Shuffle" +msgid "" msgstr "" msgctxt "#30535" @@ -457,7 +457,7 @@ msgid "Disliked Videos" msgstr "" msgctxt "#30539" -msgid "Live" +msgid "" msgstr "" msgctxt "#30540" @@ -473,7 +473,7 @@ msgid "rtmpe streams are not supported" msgstr "" msgctxt "#30543" -msgid "Refresh" +msgid "" msgstr "" msgctxt "#30544" @@ -485,15 +485,15 @@ msgid "No further links found." msgstr "" msgctxt "#30546" -msgid "Please log in twice!" +msgid "Please complete all login prompts" msgstr "" msgctxt "#30547" -msgid "You must enable two applications so that YouTube is functioning properly." +msgid "You may be prompted to enable two applications so that YouTube is functioning properly." msgstr "" msgctxt "#30548" -msgid "More..." +msgid "" msgstr "" msgctxt "#30549" @@ -501,7 +501,7 @@ msgid "No videos streams found" msgstr "" msgctxt "#30550" -msgid "Region" +msgid "" msgstr "" msgctxt "#30551" @@ -541,15 +541,15 @@ msgid "Delete settings.xml" msgstr "" msgctxt "#30560" -msgid "Subtitle language" +msgid "" msgstr "" msgctxt "#30561" -msgid "None" +msgid "" msgstr "" msgctxt "#30562" -msgid "" +msgid "View all" msgstr "" msgctxt "#30563" @@ -565,7 +565,7 @@ msgid "" msgstr "" msgctxt "#30566" -msgid "Prompt" +msgid "" msgstr "" msgctxt "#30567" @@ -577,11 +577,11 @@ msgid "Remove as Watch Later" msgstr "" msgctxt "#30569" -msgid "Are you sure you want to remove '%s' as your Watch Later list?" +msgid "Are you sure you want to remove \"%s\" as your Watch Later list?" msgstr "" msgctxt "#30570" -msgid "Are you sure you want to replace your current Watch Later list with '%s'?" +msgid "Are you sure you want to replace your current Watch Later list with \"%s\"?" msgstr "" msgctxt "#30571" @@ -593,11 +593,11 @@ msgid "Remove as History" msgstr "" msgctxt "#30573" -msgid "Are you sure you want to remove '%s' as your History list?" +msgid "Are you sure you want to remove \"%s\" as your History list?" msgstr "" msgctxt "#30574" -msgid "Are you sure you want to replace your current History list with '%s'?" +msgid "Are you sure you want to replace your current History list with \"%s\"?" msgstr "" msgctxt "#30575" @@ -609,7 +609,7 @@ msgid "Failed" msgstr "" msgctxt "#30577" -msgid "Settings" +msgid "" msgstr "" msgctxt "#30578" @@ -633,7 +633,7 @@ msgid "Autoplay suggested videos" msgstr "" msgctxt "#30583" -msgid "Automatic" +msgid "" msgstr "" msgctxt "#30584" @@ -693,7 +693,7 @@ msgid "Updated: %s" msgstr "" msgctxt "#30598" -msgid "Personal API keys enabled" +msgid "" msgstr "" msgctxt "#30599" @@ -701,7 +701,7 @@ msgid "Failed to enable personal API keys. Missing: %s" msgstr "" msgctxt "#30600" -msgid "Subtitles" +msgid "" msgstr "" msgctxt "#30601" @@ -761,7 +761,7 @@ msgid "" msgstr "" msgctxt "#30615" -msgid "Cancel" +msgid "" msgstr "" msgctxt "#30616" @@ -777,7 +777,7 @@ msgid "" msgstr "" msgctxt "#30619" -msgid "Port" +msgid "" msgstr "" msgctxt "#30620" @@ -821,7 +821,7 @@ msgid "IP whitelist (comma delimited)" msgstr "" msgctxt "#30630" -msgid "Save" +msgid "" msgstr "" msgctxt "#30631" @@ -937,7 +937,7 @@ msgid "Enter a name for this user" msgstr "" msgctxt "#30659" -msgid "User is now '%s'" +msgid "User is now \"%s\"" msgstr "" msgctxt "#30660" @@ -961,15 +961,15 @@ msgid "Switch user" msgstr "" msgctxt "#30665" -msgid "Switch to '%s' now?" +msgid "Switch to \"%s\" now?" msgstr "" msgctxt "#30666" -msgid "%s removed" +msgid "\"%s\" removed" msgstr "" msgctxt "#30667" -msgid "Renamed '%s' to '%s'" +msgid "Renamed \"%s\" to \"%s\"" msgstr "" msgctxt "#30668" @@ -1113,7 +1113,7 @@ msgid "Play with subtitles" msgstr "" msgctxt "#30703" -msgid "Are you sure?" +msgid "" msgstr "" msgctxt "#30704" @@ -1257,7 +1257,7 @@ msgid "" msgstr "" msgctxt "#30739" -msgid "" +msgid "Subscribers" msgstr "" msgctxt "#30740" @@ -1477,11 +1477,11 @@ msgid "Views count display colour" msgstr "" msgctxt "#30794" -msgid "Likes count display colour" +msgid "Subscriber/Likes count display colour" msgstr "" msgctxt "#30795" -msgid "Comments count display colour" +msgid "Videos/Comments count display colour" msgstr "" msgctxt "#30796" @@ -1579,3 +1579,7 @@ msgstr "" msgctxt "#30819" msgid "Play from start" msgstr "" + +msgctxt "#30820" +msgid "Podcast" +msgstr "" diff --git a/plugin.video.youtube/resources/language/resource.language.sr_rs@latin/strings.po b/plugin.video.youtube/resources/language/resource.language.sr_rs@latin/strings.po index 774d06dbdf..c94baefb64 100644 --- a/plugin.video.youtube/resources/language/resource.language.sr_rs@latin/strings.po +++ b/plugin.video.youtube/resources/language/resource.language.sr_rs@latin/strings.po @@ -37,7 +37,7 @@ msgstr "" # msgstr "" # Kodion Settings msgctxt "#30000" -msgid "General" +msgid "" msgstr "" msgctxt "#30001" @@ -151,7 +151,7 @@ msgid "Configure %s?" msgstr "" msgctxt "#30031" -msgid "Advanced" +msgid "" msgstr "" msgctxt "#30032" @@ -217,7 +217,7 @@ msgid "Watch Later" msgstr "" msgctxt "#30108" -msgid "Remove" +msgid "" msgstr "" msgctxt "#30109" @@ -237,7 +237,7 @@ msgid "Sign Out" msgstr "" msgctxt "#30113" -msgid "Rename" +msgid "" msgstr "" msgctxt "#30114" @@ -257,7 +257,7 @@ msgid "Remove \"%s\"?" msgstr "" msgctxt "#30118" -msgid "Delete" +msgid "" msgstr "" msgctxt "#30119" @@ -301,11 +301,11 @@ msgstr "" # YouTube # empty strings from id 30206 to 30499 msgctxt "#30500" -msgid "Channels" +msgid "" msgstr "" msgctxt "#30501" -msgid "Playlists" +msgid "" msgstr "" msgctxt "#30502" @@ -361,7 +361,7 @@ msgid "Related Videos" msgstr "" msgctxt "#30515" -msgid "Auto-Remove from 'Watch Later'" +msgid "Auto-Remove from Watch Later" msgstr "" msgctxt "#30516" @@ -385,15 +385,15 @@ msgid "Add to..." msgstr "" msgctxt "#30521" -msgid "Select playlist" +msgid "" msgstr "" msgctxt "#30522" -msgid "New playlist..." +msgid "" msgstr "" msgctxt "#30523" -msgid "Language" +msgid "" msgstr "" msgctxt "#30524" @@ -425,11 +425,11 @@ msgid "I dislike this" msgstr "" msgctxt "#30531" -msgid "Play all" +msgid "" msgstr "" msgctxt "#30532" -msgid "Default" +msgid "" msgstr "" msgctxt "#30533" @@ -437,7 +437,7 @@ msgid "Reverse" msgstr "" msgctxt "#30534" -msgid "Shuffle" +msgid "" msgstr "" msgctxt "#30535" @@ -457,7 +457,7 @@ msgid "Disliked Videos" msgstr "" msgctxt "#30539" -msgid "Live" +msgid "" msgstr "" msgctxt "#30540" @@ -473,7 +473,7 @@ msgid "rtmpe streams are not supported" msgstr "" msgctxt "#30543" -msgid "Refresh" +msgid "" msgstr "" msgctxt "#30544" @@ -485,15 +485,15 @@ msgid "No further links found." msgstr "" msgctxt "#30546" -msgid "Please log in twice!" +msgid "Please complete all login prompts" msgstr "" msgctxt "#30547" -msgid "You must enable two applications so that YouTube is functioning properly." +msgid "You may be prompted to enable two applications so that YouTube is functioning properly." msgstr "" msgctxt "#30548" -msgid "More..." +msgid "" msgstr "" msgctxt "#30549" @@ -501,7 +501,7 @@ msgid "No videos streams found" msgstr "" msgctxt "#30550" -msgid "Region" +msgid "" msgstr "" msgctxt "#30551" @@ -541,15 +541,15 @@ msgid "Delete settings.xml" msgstr "" msgctxt "#30560" -msgid "Subtitle language" +msgid "" msgstr "" msgctxt "#30561" -msgid "None" +msgid "" msgstr "" msgctxt "#30562" -msgid "" +msgid "View all" msgstr "" msgctxt "#30563" @@ -565,7 +565,7 @@ msgid "" msgstr "" msgctxt "#30566" -msgid "Prompt" +msgid "" msgstr "" msgctxt "#30567" @@ -577,11 +577,11 @@ msgid "Remove as Watch Later" msgstr "" msgctxt "#30569" -msgid "Are you sure you want to remove '%s' as your Watch Later list?" +msgid "Are you sure you want to remove \"%s\" as your Watch Later list?" msgstr "" msgctxt "#30570" -msgid "Are you sure you want to replace your current Watch Later list with '%s'?" +msgid "Are you sure you want to replace your current Watch Later list with \"%s\"?" msgstr "" msgctxt "#30571" @@ -593,11 +593,11 @@ msgid "Remove as History" msgstr "" msgctxt "#30573" -msgid "Are you sure you want to remove '%s' as your History list?" +msgid "Are you sure you want to remove \"%s\" as your History list?" msgstr "" msgctxt "#30574" -msgid "Are you sure you want to replace your current History list with '%s'?" +msgid "Are you sure you want to replace your current History list with \"%s\"?" msgstr "" msgctxt "#30575" @@ -609,7 +609,7 @@ msgid "Failed" msgstr "" msgctxt "#30577" -msgid "Settings" +msgid "" msgstr "" msgctxt "#30578" @@ -633,7 +633,7 @@ msgid "Autoplay suggested videos" msgstr "" msgctxt "#30583" -msgid "Automatic" +msgid "" msgstr "" msgctxt "#30584" @@ -693,7 +693,7 @@ msgid "Updated: %s" msgstr "" msgctxt "#30598" -msgid "Personal API keys enabled" +msgid "" msgstr "" msgctxt "#30599" @@ -701,7 +701,7 @@ msgid "Failed to enable personal API keys. Missing: %s" msgstr "" msgctxt "#30600" -msgid "Subtitles" +msgid "" msgstr "" msgctxt "#30601" @@ -761,7 +761,7 @@ msgid "" msgstr "" msgctxt "#30615" -msgid "Cancel" +msgid "" msgstr "" msgctxt "#30616" @@ -777,7 +777,7 @@ msgid "" msgstr "" msgctxt "#30619" -msgid "Port" +msgid "" msgstr "" msgctxt "#30620" @@ -821,7 +821,7 @@ msgid "IP whitelist (comma delimited)" msgstr "" msgctxt "#30630" -msgid "Save" +msgid "" msgstr "" msgctxt "#30631" @@ -937,7 +937,7 @@ msgid "Enter a name for this user" msgstr "" msgctxt "#30659" -msgid "User is now '%s'" +msgid "User is now \"%s\"" msgstr "" msgctxt "#30660" @@ -961,15 +961,15 @@ msgid "Switch user" msgstr "" msgctxt "#30665" -msgid "Switch to '%s' now?" +msgid "Switch to \"%s\" now?" msgstr "" msgctxt "#30666" -msgid "%s removed" +msgid "\"%s\" removed" msgstr "" msgctxt "#30667" -msgid "Renamed '%s' to '%s'" +msgid "Renamed \"%s\" to \"%s\"" msgstr "" msgctxt "#30668" @@ -1113,7 +1113,7 @@ msgid "Play with subtitles" msgstr "" msgctxt "#30703" -msgid "Are you sure?" +msgid "" msgstr "" msgctxt "#30704" @@ -1257,7 +1257,7 @@ msgid "" msgstr "" msgctxt "#30739" -msgid "" +msgid "Subscribers" msgstr "" msgctxt "#30740" @@ -1477,11 +1477,11 @@ msgid "Views count display colour" msgstr "" msgctxt "#30794" -msgid "Likes count display colour" +msgid "Subscriber/Likes count display colour" msgstr "" msgctxt "#30795" -msgid "Comments count display colour" +msgid "Videos/Comments count display colour" msgstr "" msgctxt "#30796" @@ -1579,3 +1579,7 @@ msgstr "" msgctxt "#30819" msgid "Play from start" msgstr "" + +msgctxt "#30820" +msgid "Podcast" +msgstr "" diff --git a/plugin.video.youtube/resources/language/resource.language.sv_se/strings.po b/plugin.video.youtube/resources/language/resource.language.sv_se/strings.po index 0d4591e933..c0e4588890 100644 --- a/plugin.video.youtube/resources/language/resource.language.sv_se/strings.po +++ b/plugin.video.youtube/resources/language/resource.language.sv_se/strings.po @@ -37,8 +37,8 @@ msgstr "Detta plugin är inte godkänt av Google" # msgstr "" # Kodion Settings msgctxt "#30000" -msgid "General" -msgstr "Allmänt" +msgid "" +msgstr "" msgctxt "#30001" msgid "" @@ -151,8 +151,8 @@ msgid "Configure %s?" msgstr "" msgctxt "#30031" -msgid "Advanced" -msgstr "Avancerat" +msgid "" +msgstr "" msgctxt "#30032" msgid "View: TV Shows" @@ -217,7 +217,7 @@ msgid "Watch Later" msgstr "" msgctxt "#30108" -msgid "Remove" +msgid "" msgstr "" msgctxt "#30109" @@ -237,7 +237,7 @@ msgid "Sign Out" msgstr "" msgctxt "#30113" -msgid "Rename" +msgid "" msgstr "" msgctxt "#30114" @@ -257,7 +257,7 @@ msgid "Remove \"%s\"?" msgstr "" msgctxt "#30118" -msgid "Delete" +msgid "" msgstr "" msgctxt "#30119" @@ -301,11 +301,11 @@ msgstr "" # YouTube # empty strings from id 30206 to 30499 msgctxt "#30500" -msgid "Channels" -msgstr "Kanaler" +msgid "" +msgstr "" msgctxt "#30501" -msgid "Playlists" +msgid "" msgstr "" msgctxt "#30502" @@ -361,7 +361,7 @@ msgid "Related Videos" msgstr "" msgctxt "#30515" -msgid "Auto-Remove from 'Watch Later'" +msgid "Auto-Remove from Watch Later" msgstr "" msgctxt "#30516" @@ -385,15 +385,15 @@ msgid "Add to..." msgstr "" msgctxt "#30521" -msgid "Select playlist" +msgid "" msgstr "" msgctxt "#30522" -msgid "New playlist..." +msgid "" msgstr "" msgctxt "#30523" -msgid "Language" +msgid "" msgstr "" msgctxt "#30524" @@ -425,11 +425,11 @@ msgid "I dislike this" msgstr "" msgctxt "#30531" -msgid "Play all" +msgid "" msgstr "" msgctxt "#30532" -msgid "Default" +msgid "" msgstr "" msgctxt "#30533" @@ -437,7 +437,7 @@ msgid "Reverse" msgstr "" msgctxt "#30534" -msgid "Shuffle" +msgid "" msgstr "" msgctxt "#30535" @@ -457,8 +457,8 @@ msgid "Disliked Videos" msgstr "" msgctxt "#30539" -msgid "Live" -msgstr "Live" +msgid "" +msgstr "" msgctxt "#30540" msgid "Play with..." @@ -473,7 +473,7 @@ msgid "rtmpe streams are not supported" msgstr "" msgctxt "#30543" -msgid "Refresh" +msgid "" msgstr "" msgctxt "#30544" @@ -485,15 +485,15 @@ msgid "No further links found." msgstr "" msgctxt "#30546" -msgid "Please log in twice!" +msgid "Please complete all login prompts" msgstr "" msgctxt "#30547" -msgid "You must enable two applications so that YouTube is functioning properly." +msgid "You may be prompted to enable two applications so that YouTube is functioning properly." msgstr "" msgctxt "#30548" -msgid "More..." +msgid "" msgstr "" msgctxt "#30549" @@ -501,7 +501,7 @@ msgid "No videos streams found" msgstr "" msgctxt "#30550" -msgid "Region" +msgid "" msgstr "" msgctxt "#30551" @@ -541,15 +541,15 @@ msgid "Delete settings.xml" msgstr "" msgctxt "#30560" -msgid "Subtitle language" +msgid "" msgstr "" msgctxt "#30561" -msgid "None" -msgstr "Ingen" +msgid "" +msgstr "" msgctxt "#30562" -msgid "" +msgid "View all" msgstr "" msgctxt "#30563" @@ -565,7 +565,7 @@ msgid "" msgstr "" msgctxt "#30566" -msgid "Prompt" +msgid "" msgstr "" msgctxt "#30567" @@ -577,11 +577,11 @@ msgid "Remove as Watch Later" msgstr "" msgctxt "#30569" -msgid "Are you sure you want to remove '%s' as your Watch Later list?" +msgid "Are you sure you want to remove \"%s\" as your Watch Later list?" msgstr "" msgctxt "#30570" -msgid "Are you sure you want to replace your current Watch Later list with '%s'?" +msgid "Are you sure you want to replace your current Watch Later list with \"%s\"?" msgstr "" msgctxt "#30571" @@ -593,11 +593,11 @@ msgid "Remove as History" msgstr "" msgctxt "#30573" -msgid "Are you sure you want to remove '%s' as your History list?" +msgid "Are you sure you want to remove \"%s\" as your History list?" msgstr "" msgctxt "#30574" -msgid "Are you sure you want to replace your current History list with '%s'?" +msgid "Are you sure you want to replace your current History list with \"%s\"?" msgstr "" msgctxt "#30575" @@ -609,8 +609,8 @@ msgid "Failed" msgstr "" msgctxt "#30577" -msgid "Settings" -msgstr "Inställningar" +msgid "" +msgstr "" msgctxt "#30578" msgid "Force SSL certificate verification" @@ -633,7 +633,7 @@ msgid "Autoplay suggested videos" msgstr "" msgctxt "#30583" -msgid "Automatic" +msgid "" msgstr "" msgctxt "#30584" @@ -693,7 +693,7 @@ msgid "Updated: %s" msgstr "" msgctxt "#30598" -msgid "Personal API keys enabled" +msgid "" msgstr "" msgctxt "#30599" @@ -701,7 +701,7 @@ msgid "Failed to enable personal API keys. Missing: %s" msgstr "" msgctxt "#30600" -msgid "Subtitles" +msgid "" msgstr "" msgctxt "#30601" @@ -761,7 +761,7 @@ msgid "" msgstr "" msgctxt "#30615" -msgid "Cancel" +msgid "" msgstr "" msgctxt "#30616" @@ -777,8 +777,8 @@ msgid "" msgstr "" msgctxt "#30619" -msgid "Port" -msgstr "Portnummer" +msgid "" +msgstr "" msgctxt "#30620" msgid "Port %s already in use. Cannot start http server." @@ -821,7 +821,7 @@ msgid "IP whitelist (comma delimited)" msgstr "" msgctxt "#30630" -msgid "Save" +msgid "" msgstr "" msgctxt "#30631" @@ -937,7 +937,7 @@ msgid "Enter a name for this user" msgstr "" msgctxt "#30659" -msgid "User is now '%s'" +msgid "User is now \"%s\"" msgstr "" msgctxt "#30660" @@ -961,15 +961,15 @@ msgid "Switch user" msgstr "" msgctxt "#30665" -msgid "Switch to '%s' now?" +msgid "Switch to \"%s\" now?" msgstr "" msgctxt "#30666" -msgid "%s removed" +msgid "\"%s\" removed" msgstr "" msgctxt "#30667" -msgid "Renamed '%s' to '%s'" +msgid "Renamed \"%s\" to \"%s\"" msgstr "" msgctxt "#30668" @@ -1113,7 +1113,7 @@ msgid "Play with subtitles" msgstr "" msgctxt "#30703" -msgid "Are you sure?" +msgid "" msgstr "" msgctxt "#30704" @@ -1257,7 +1257,7 @@ msgid "" msgstr "" msgctxt "#30739" -msgid "" +msgid "Subscribers" msgstr "" msgctxt "#30740" @@ -1477,11 +1477,11 @@ msgid "Views count display colour" msgstr "" msgctxt "#30794" -msgid "Likes count display colour" +msgid "Subscriber/Likes count display colour" msgstr "" msgctxt "#30795" -msgid "Comments count display colour" +msgid "Videos/Comments count display colour" msgstr "" msgctxt "#30796" @@ -1580,6 +1580,47 @@ msgctxt "#30819" msgid "Play from start" msgstr "" +msgctxt "#30820" +msgid "Podcast" +msgstr "" + +# msgctxt "Addon Summary" +# msgid "Plugin for YouTube" +# msgstr "" +# msgctxt "Addon Description" +# msgid "YouTube is a one of the biggest video-sharing websites of the world." +# msgstr "" +# Kodion Settings +#~ msgctxt "#30000" +#~ msgid "General" +#~ msgstr "Allmänt" + +#~ msgctxt "#30031" +#~ msgid "Advanced" +#~ msgstr "Avancerat" + +# YouTube +# empty strings from id 30206 to 30499 +#~ msgctxt "#30500" +#~ msgid "Channels" +#~ msgstr "Kanaler" + +#~ msgctxt "#30539" +#~ msgid "Live" +#~ msgstr "Live" + +#~ msgctxt "#30561" +#~ msgid "None" +#~ msgstr "Ingen" + +#~ msgctxt "#30577" +#~ msgid "Settings" +#~ msgstr "Inställningar" + +#~ msgctxt "#30619" +#~ msgid "Port" +#~ msgstr "Portnummer" + #~ msgctxt "#30001" #~ msgid "Username" #~ msgstr "Användarnamn" diff --git a/plugin.video.youtube/resources/language/resource.language.szl/strings.po b/plugin.video.youtube/resources/language/resource.language.szl/strings.po index a358da4e05..df868047af 100644 --- a/plugin.video.youtube/resources/language/resource.language.szl/strings.po +++ b/plugin.video.youtube/resources/language/resource.language.szl/strings.po @@ -37,7 +37,7 @@ msgstr "" # msgstr "" # Kodion Settings msgctxt "#30000" -msgid "General" +msgid "" msgstr "" msgctxt "#30001" @@ -151,7 +151,7 @@ msgid "Configure %s?" msgstr "" msgctxt "#30031" -msgid "Advanced" +msgid "" msgstr "" msgctxt "#30032" @@ -217,7 +217,7 @@ msgid "Watch Later" msgstr "" msgctxt "#30108" -msgid "Remove" +msgid "" msgstr "" msgctxt "#30109" @@ -237,7 +237,7 @@ msgid "Sign Out" msgstr "" msgctxt "#30113" -msgid "Rename" +msgid "" msgstr "" msgctxt "#30114" @@ -257,7 +257,7 @@ msgid "Remove \"%s\"?" msgstr "" msgctxt "#30118" -msgid "Delete" +msgid "" msgstr "" msgctxt "#30119" @@ -301,11 +301,11 @@ msgstr "" # YouTube # empty strings from id 30206 to 30499 msgctxt "#30500" -msgid "Channels" +msgid "" msgstr "" msgctxt "#30501" -msgid "Playlists" +msgid "" msgstr "" msgctxt "#30502" @@ -361,7 +361,7 @@ msgid "Related Videos" msgstr "" msgctxt "#30515" -msgid "Auto-Remove from 'Watch Later'" +msgid "Auto-Remove from Watch Later" msgstr "" msgctxt "#30516" @@ -385,15 +385,15 @@ msgid "Add to..." msgstr "" msgctxt "#30521" -msgid "Select playlist" +msgid "" msgstr "" msgctxt "#30522" -msgid "New playlist..." +msgid "" msgstr "" msgctxt "#30523" -msgid "Language" +msgid "" msgstr "" msgctxt "#30524" @@ -425,11 +425,11 @@ msgid "I dislike this" msgstr "" msgctxt "#30531" -msgid "Play all" +msgid "" msgstr "" msgctxt "#30532" -msgid "Default" +msgid "" msgstr "" msgctxt "#30533" @@ -437,7 +437,7 @@ msgid "Reverse" msgstr "" msgctxt "#30534" -msgid "Shuffle" +msgid "" msgstr "" msgctxt "#30535" @@ -457,7 +457,7 @@ msgid "Disliked Videos" msgstr "" msgctxt "#30539" -msgid "Live" +msgid "" msgstr "" msgctxt "#30540" @@ -473,7 +473,7 @@ msgid "rtmpe streams are not supported" msgstr "" msgctxt "#30543" -msgid "Refresh" +msgid "" msgstr "" msgctxt "#30544" @@ -485,15 +485,15 @@ msgid "No further links found." msgstr "" msgctxt "#30546" -msgid "Please log in twice!" +msgid "Please complete all login prompts" msgstr "" msgctxt "#30547" -msgid "You must enable two applications so that YouTube is functioning properly." +msgid "You may be prompted to enable two applications so that YouTube is functioning properly." msgstr "" msgctxt "#30548" -msgid "More..." +msgid "" msgstr "" msgctxt "#30549" @@ -501,7 +501,7 @@ msgid "No videos streams found" msgstr "" msgctxt "#30550" -msgid "Region" +msgid "" msgstr "" msgctxt "#30551" @@ -541,15 +541,15 @@ msgid "Delete settings.xml" msgstr "" msgctxt "#30560" -msgid "Subtitle language" +msgid "" msgstr "" msgctxt "#30561" -msgid "None" +msgid "" msgstr "" msgctxt "#30562" -msgid "" +msgid "View all" msgstr "" msgctxt "#30563" @@ -565,7 +565,7 @@ msgid "" msgstr "" msgctxt "#30566" -msgid "Prompt" +msgid "" msgstr "" msgctxt "#30567" @@ -577,11 +577,11 @@ msgid "Remove as Watch Later" msgstr "" msgctxt "#30569" -msgid "Are you sure you want to remove '%s' as your Watch Later list?" +msgid "Are you sure you want to remove \"%s\" as your Watch Later list?" msgstr "" msgctxt "#30570" -msgid "Are you sure you want to replace your current Watch Later list with '%s'?" +msgid "Are you sure you want to replace your current Watch Later list with \"%s\"?" msgstr "" msgctxt "#30571" @@ -593,11 +593,11 @@ msgid "Remove as History" msgstr "" msgctxt "#30573" -msgid "Are you sure you want to remove '%s' as your History list?" +msgid "Are you sure you want to remove \"%s\" as your History list?" msgstr "" msgctxt "#30574" -msgid "Are you sure you want to replace your current History list with '%s'?" +msgid "Are you sure you want to replace your current History list with \"%s\"?" msgstr "" msgctxt "#30575" @@ -609,7 +609,7 @@ msgid "Failed" msgstr "" msgctxt "#30577" -msgid "Settings" +msgid "" msgstr "" msgctxt "#30578" @@ -633,7 +633,7 @@ msgid "Autoplay suggested videos" msgstr "" msgctxt "#30583" -msgid "Automatic" +msgid "" msgstr "" msgctxt "#30584" @@ -693,7 +693,7 @@ msgid "Updated: %s" msgstr "" msgctxt "#30598" -msgid "Personal API keys enabled" +msgid "" msgstr "" msgctxt "#30599" @@ -701,7 +701,7 @@ msgid "Failed to enable personal API keys. Missing: %s" msgstr "" msgctxt "#30600" -msgid "Subtitles" +msgid "" msgstr "" msgctxt "#30601" @@ -761,7 +761,7 @@ msgid "" msgstr "" msgctxt "#30615" -msgid "Cancel" +msgid "" msgstr "" msgctxt "#30616" @@ -777,7 +777,7 @@ msgid "" msgstr "" msgctxt "#30619" -msgid "Port" +msgid "" msgstr "" msgctxt "#30620" @@ -821,7 +821,7 @@ msgid "IP whitelist (comma delimited)" msgstr "" msgctxt "#30630" -msgid "Save" +msgid "" msgstr "" msgctxt "#30631" @@ -937,7 +937,7 @@ msgid "Enter a name for this user" msgstr "" msgctxt "#30659" -msgid "User is now '%s'" +msgid "User is now \"%s\"" msgstr "" msgctxt "#30660" @@ -961,15 +961,15 @@ msgid "Switch user" msgstr "" msgctxt "#30665" -msgid "Switch to '%s' now?" +msgid "Switch to \"%s\" now?" msgstr "" msgctxt "#30666" -msgid "%s removed" +msgid "\"%s\" removed" msgstr "" msgctxt "#30667" -msgid "Renamed '%s' to '%s'" +msgid "Renamed \"%s\" to \"%s\"" msgstr "" msgctxt "#30668" @@ -1113,7 +1113,7 @@ msgid "Play with subtitles" msgstr "" msgctxt "#30703" -msgid "Are you sure?" +msgid "" msgstr "" msgctxt "#30704" @@ -1257,7 +1257,7 @@ msgid "" msgstr "" msgctxt "#30739" -msgid "" +msgid "Subscribers" msgstr "" msgctxt "#30740" @@ -1477,11 +1477,11 @@ msgid "Views count display colour" msgstr "" msgctxt "#30794" -msgid "Likes count display colour" +msgid "Subscriber/Likes count display colour" msgstr "" msgctxt "#30795" -msgid "Comments count display colour" +msgid "Videos/Comments count display colour" msgstr "" msgctxt "#30796" @@ -1579,3 +1579,7 @@ msgstr "" msgctxt "#30819" msgid "Play from start" msgstr "" + +msgctxt "#30820" +msgid "Podcast" +msgstr "" diff --git a/plugin.video.youtube/resources/language/resource.language.ta_in/strings.po b/plugin.video.youtube/resources/language/resource.language.ta_in/strings.po index a39d2e686f..fa3d0d6309 100644 --- a/plugin.video.youtube/resources/language/resource.language.ta_in/strings.po +++ b/plugin.video.youtube/resources/language/resource.language.ta_in/strings.po @@ -37,7 +37,7 @@ msgstr "" # msgstr "" # Kodion Settings msgctxt "#30000" -msgid "General" +msgid "" msgstr "" msgctxt "#30001" @@ -151,7 +151,7 @@ msgid "Configure %s?" msgstr "" msgctxt "#30031" -msgid "Advanced" +msgid "" msgstr "" msgctxt "#30032" @@ -217,7 +217,7 @@ msgid "Watch Later" msgstr "" msgctxt "#30108" -msgid "Remove" +msgid "" msgstr "" msgctxt "#30109" @@ -237,7 +237,7 @@ msgid "Sign Out" msgstr "" msgctxt "#30113" -msgid "Rename" +msgid "" msgstr "" msgctxt "#30114" @@ -257,7 +257,7 @@ msgid "Remove \"%s\"?" msgstr "" msgctxt "#30118" -msgid "Delete" +msgid "" msgstr "" msgctxt "#30119" @@ -301,11 +301,11 @@ msgstr "" # YouTube # empty strings from id 30206 to 30499 msgctxt "#30500" -msgid "Channels" +msgid "" msgstr "" msgctxt "#30501" -msgid "Playlists" +msgid "" msgstr "" msgctxt "#30502" @@ -361,7 +361,7 @@ msgid "Related Videos" msgstr "" msgctxt "#30515" -msgid "Auto-Remove from 'Watch Later'" +msgid "Auto-Remove from Watch Later" msgstr "" msgctxt "#30516" @@ -385,15 +385,15 @@ msgid "Add to..." msgstr "" msgctxt "#30521" -msgid "Select playlist" +msgid "" msgstr "" msgctxt "#30522" -msgid "New playlist..." +msgid "" msgstr "" msgctxt "#30523" -msgid "Language" +msgid "" msgstr "" msgctxt "#30524" @@ -425,11 +425,11 @@ msgid "I dislike this" msgstr "" msgctxt "#30531" -msgid "Play all" +msgid "" msgstr "" msgctxt "#30532" -msgid "Default" +msgid "" msgstr "" msgctxt "#30533" @@ -437,7 +437,7 @@ msgid "Reverse" msgstr "" msgctxt "#30534" -msgid "Shuffle" +msgid "" msgstr "" msgctxt "#30535" @@ -457,7 +457,7 @@ msgid "Disliked Videos" msgstr "" msgctxt "#30539" -msgid "Live" +msgid "" msgstr "" msgctxt "#30540" @@ -473,7 +473,7 @@ msgid "rtmpe streams are not supported" msgstr "" msgctxt "#30543" -msgid "Refresh" +msgid "" msgstr "" msgctxt "#30544" @@ -485,15 +485,15 @@ msgid "No further links found." msgstr "" msgctxt "#30546" -msgid "Please log in twice!" +msgid "Please complete all login prompts" msgstr "" msgctxt "#30547" -msgid "You must enable two applications so that YouTube is functioning properly." +msgid "You may be prompted to enable two applications so that YouTube is functioning properly." msgstr "" msgctxt "#30548" -msgid "More..." +msgid "" msgstr "" msgctxt "#30549" @@ -501,7 +501,7 @@ msgid "No videos streams found" msgstr "" msgctxt "#30550" -msgid "Region" +msgid "" msgstr "" msgctxt "#30551" @@ -541,15 +541,15 @@ msgid "Delete settings.xml" msgstr "" msgctxt "#30560" -msgid "Subtitle language" +msgid "" msgstr "" msgctxt "#30561" -msgid "None" +msgid "" msgstr "" msgctxt "#30562" -msgid "" +msgid "View all" msgstr "" msgctxt "#30563" @@ -565,7 +565,7 @@ msgid "" msgstr "" msgctxt "#30566" -msgid "Prompt" +msgid "" msgstr "" msgctxt "#30567" @@ -577,11 +577,11 @@ msgid "Remove as Watch Later" msgstr "" msgctxt "#30569" -msgid "Are you sure you want to remove '%s' as your Watch Later list?" +msgid "Are you sure you want to remove \"%s\" as your Watch Later list?" msgstr "" msgctxt "#30570" -msgid "Are you sure you want to replace your current Watch Later list with '%s'?" +msgid "Are you sure you want to replace your current Watch Later list with \"%s\"?" msgstr "" msgctxt "#30571" @@ -593,11 +593,11 @@ msgid "Remove as History" msgstr "" msgctxt "#30573" -msgid "Are you sure you want to remove '%s' as your History list?" +msgid "Are you sure you want to remove \"%s\" as your History list?" msgstr "" msgctxt "#30574" -msgid "Are you sure you want to replace your current History list with '%s'?" +msgid "Are you sure you want to replace your current History list with \"%s\"?" msgstr "" msgctxt "#30575" @@ -609,7 +609,7 @@ msgid "Failed" msgstr "" msgctxt "#30577" -msgid "Settings" +msgid "" msgstr "" msgctxt "#30578" @@ -633,7 +633,7 @@ msgid "Autoplay suggested videos" msgstr "" msgctxt "#30583" -msgid "Automatic" +msgid "" msgstr "" msgctxt "#30584" @@ -693,7 +693,7 @@ msgid "Updated: %s" msgstr "" msgctxt "#30598" -msgid "Personal API keys enabled" +msgid "" msgstr "" msgctxt "#30599" @@ -701,7 +701,7 @@ msgid "Failed to enable personal API keys. Missing: %s" msgstr "" msgctxt "#30600" -msgid "Subtitles" +msgid "" msgstr "" msgctxt "#30601" @@ -761,7 +761,7 @@ msgid "" msgstr "" msgctxt "#30615" -msgid "Cancel" +msgid "" msgstr "" msgctxt "#30616" @@ -777,7 +777,7 @@ msgid "" msgstr "" msgctxt "#30619" -msgid "Port" +msgid "" msgstr "" msgctxt "#30620" @@ -821,7 +821,7 @@ msgid "IP whitelist (comma delimited)" msgstr "" msgctxt "#30630" -msgid "Save" +msgid "" msgstr "" msgctxt "#30631" @@ -937,7 +937,7 @@ msgid "Enter a name for this user" msgstr "" msgctxt "#30659" -msgid "User is now '%s'" +msgid "User is now \"%s\"" msgstr "" msgctxt "#30660" @@ -961,15 +961,15 @@ msgid "Switch user" msgstr "" msgctxt "#30665" -msgid "Switch to '%s' now?" +msgid "Switch to \"%s\" now?" msgstr "" msgctxt "#30666" -msgid "%s removed" +msgid "\"%s\" removed" msgstr "" msgctxt "#30667" -msgid "Renamed '%s' to '%s'" +msgid "Renamed \"%s\" to \"%s\"" msgstr "" msgctxt "#30668" @@ -1113,7 +1113,7 @@ msgid "Play with subtitles" msgstr "" msgctxt "#30703" -msgid "Are you sure?" +msgid "" msgstr "" msgctxt "#30704" @@ -1257,7 +1257,7 @@ msgid "" msgstr "" msgctxt "#30739" -msgid "" +msgid "Subscribers" msgstr "" msgctxt "#30740" @@ -1477,11 +1477,11 @@ msgid "Views count display colour" msgstr "" msgctxt "#30794" -msgid "Likes count display colour" +msgid "Subscriber/Likes count display colour" msgstr "" msgctxt "#30795" -msgid "Comments count display colour" +msgid "Videos/Comments count display colour" msgstr "" msgctxt "#30796" @@ -1579,3 +1579,7 @@ msgstr "" msgctxt "#30819" msgid "Play from start" msgstr "" + +msgctxt "#30820" +msgid "Podcast" +msgstr "" diff --git a/plugin.video.youtube/resources/language/resource.language.te_in/strings.po b/plugin.video.youtube/resources/language/resource.language.te_in/strings.po index 671431939c..112d64ec5c 100644 --- a/plugin.video.youtube/resources/language/resource.language.te_in/strings.po +++ b/plugin.video.youtube/resources/language/resource.language.te_in/strings.po @@ -37,7 +37,7 @@ msgstr "" # msgstr "" # Kodion Settings msgctxt "#30000" -msgid "General" +msgid "" msgstr "" msgctxt "#30001" @@ -151,7 +151,7 @@ msgid "Configure %s?" msgstr "" msgctxt "#30031" -msgid "Advanced" +msgid "" msgstr "" msgctxt "#30032" @@ -217,7 +217,7 @@ msgid "Watch Later" msgstr "" msgctxt "#30108" -msgid "Remove" +msgid "" msgstr "" msgctxt "#30109" @@ -237,7 +237,7 @@ msgid "Sign Out" msgstr "" msgctxt "#30113" -msgid "Rename" +msgid "" msgstr "" msgctxt "#30114" @@ -257,7 +257,7 @@ msgid "Remove \"%s\"?" msgstr "" msgctxt "#30118" -msgid "Delete" +msgid "" msgstr "" msgctxt "#30119" @@ -301,11 +301,11 @@ msgstr "" # YouTube # empty strings from id 30206 to 30499 msgctxt "#30500" -msgid "Channels" +msgid "" msgstr "" msgctxt "#30501" -msgid "Playlists" +msgid "" msgstr "" msgctxt "#30502" @@ -361,7 +361,7 @@ msgid "Related Videos" msgstr "" msgctxt "#30515" -msgid "Auto-Remove from 'Watch Later'" +msgid "Auto-Remove from Watch Later" msgstr "" msgctxt "#30516" @@ -385,15 +385,15 @@ msgid "Add to..." msgstr "" msgctxt "#30521" -msgid "Select playlist" +msgid "" msgstr "" msgctxt "#30522" -msgid "New playlist..." +msgid "" msgstr "" msgctxt "#30523" -msgid "Language" +msgid "" msgstr "" msgctxt "#30524" @@ -425,11 +425,11 @@ msgid "I dislike this" msgstr "" msgctxt "#30531" -msgid "Play all" +msgid "" msgstr "" msgctxt "#30532" -msgid "Default" +msgid "" msgstr "" msgctxt "#30533" @@ -437,7 +437,7 @@ msgid "Reverse" msgstr "" msgctxt "#30534" -msgid "Shuffle" +msgid "" msgstr "" msgctxt "#30535" @@ -457,7 +457,7 @@ msgid "Disliked Videos" msgstr "" msgctxt "#30539" -msgid "Live" +msgid "" msgstr "" msgctxt "#30540" @@ -473,7 +473,7 @@ msgid "rtmpe streams are not supported" msgstr "" msgctxt "#30543" -msgid "Refresh" +msgid "" msgstr "" msgctxt "#30544" @@ -485,15 +485,15 @@ msgid "No further links found." msgstr "" msgctxt "#30546" -msgid "Please log in twice!" +msgid "Please complete all login prompts" msgstr "" msgctxt "#30547" -msgid "You must enable two applications so that YouTube is functioning properly." +msgid "You may be prompted to enable two applications so that YouTube is functioning properly." msgstr "" msgctxt "#30548" -msgid "More..." +msgid "" msgstr "" msgctxt "#30549" @@ -501,7 +501,7 @@ msgid "No videos streams found" msgstr "" msgctxt "#30550" -msgid "Region" +msgid "" msgstr "" msgctxt "#30551" @@ -541,15 +541,15 @@ msgid "Delete settings.xml" msgstr "" msgctxt "#30560" -msgid "Subtitle language" +msgid "" msgstr "" msgctxt "#30561" -msgid "None" +msgid "" msgstr "" msgctxt "#30562" -msgid "" +msgid "View all" msgstr "" msgctxt "#30563" @@ -565,7 +565,7 @@ msgid "" msgstr "" msgctxt "#30566" -msgid "Prompt" +msgid "" msgstr "" msgctxt "#30567" @@ -577,11 +577,11 @@ msgid "Remove as Watch Later" msgstr "" msgctxt "#30569" -msgid "Are you sure you want to remove '%s' as your Watch Later list?" +msgid "Are you sure you want to remove \"%s\" as your Watch Later list?" msgstr "" msgctxt "#30570" -msgid "Are you sure you want to replace your current Watch Later list with '%s'?" +msgid "Are you sure you want to replace your current Watch Later list with \"%s\"?" msgstr "" msgctxt "#30571" @@ -593,11 +593,11 @@ msgid "Remove as History" msgstr "" msgctxt "#30573" -msgid "Are you sure you want to remove '%s' as your History list?" +msgid "Are you sure you want to remove \"%s\" as your History list?" msgstr "" msgctxt "#30574" -msgid "Are you sure you want to replace your current History list with '%s'?" +msgid "Are you sure you want to replace your current History list with \"%s\"?" msgstr "" msgctxt "#30575" @@ -609,7 +609,7 @@ msgid "Failed" msgstr "" msgctxt "#30577" -msgid "Settings" +msgid "" msgstr "" msgctxt "#30578" @@ -633,7 +633,7 @@ msgid "Autoplay suggested videos" msgstr "" msgctxt "#30583" -msgid "Automatic" +msgid "" msgstr "" msgctxt "#30584" @@ -693,7 +693,7 @@ msgid "Updated: %s" msgstr "" msgctxt "#30598" -msgid "Personal API keys enabled" +msgid "" msgstr "" msgctxt "#30599" @@ -701,7 +701,7 @@ msgid "Failed to enable personal API keys. Missing: %s" msgstr "" msgctxt "#30600" -msgid "Subtitles" +msgid "" msgstr "" msgctxt "#30601" @@ -761,7 +761,7 @@ msgid "" msgstr "" msgctxt "#30615" -msgid "Cancel" +msgid "" msgstr "" msgctxt "#30616" @@ -777,7 +777,7 @@ msgid "" msgstr "" msgctxt "#30619" -msgid "Port" +msgid "" msgstr "" msgctxt "#30620" @@ -821,7 +821,7 @@ msgid "IP whitelist (comma delimited)" msgstr "" msgctxt "#30630" -msgid "Save" +msgid "" msgstr "" msgctxt "#30631" @@ -937,7 +937,7 @@ msgid "Enter a name for this user" msgstr "" msgctxt "#30659" -msgid "User is now '%s'" +msgid "User is now \"%s\"" msgstr "" msgctxt "#30660" @@ -961,15 +961,15 @@ msgid "Switch user" msgstr "" msgctxt "#30665" -msgid "Switch to '%s' now?" +msgid "Switch to \"%s\" now?" msgstr "" msgctxt "#30666" -msgid "%s removed" +msgid "\"%s\" removed" msgstr "" msgctxt "#30667" -msgid "Renamed '%s' to '%s'" +msgid "Renamed \"%s\" to \"%s\"" msgstr "" msgctxt "#30668" @@ -1113,7 +1113,7 @@ msgid "Play with subtitles" msgstr "" msgctxt "#30703" -msgid "Are you sure?" +msgid "" msgstr "" msgctxt "#30704" @@ -1257,7 +1257,7 @@ msgid "" msgstr "" msgctxt "#30739" -msgid "" +msgid "Subscribers" msgstr "" msgctxt "#30740" @@ -1477,11 +1477,11 @@ msgid "Views count display colour" msgstr "" msgctxt "#30794" -msgid "Likes count display colour" +msgid "Subscriber/Likes count display colour" msgstr "" msgctxt "#30795" -msgid "Comments count display colour" +msgid "Videos/Comments count display colour" msgstr "" msgctxt "#30796" @@ -1579,3 +1579,7 @@ msgstr "" msgctxt "#30819" msgid "Play from start" msgstr "" + +msgctxt "#30820" +msgid "Podcast" +msgstr "" diff --git a/plugin.video.youtube/resources/language/resource.language.tg_tj/strings.po b/plugin.video.youtube/resources/language/resource.language.tg_tj/strings.po index 7cef946cc5..33275eab1a 100644 --- a/plugin.video.youtube/resources/language/resource.language.tg_tj/strings.po +++ b/plugin.video.youtube/resources/language/resource.language.tg_tj/strings.po @@ -37,7 +37,7 @@ msgstr "" # msgstr "" # Kodion Settings msgctxt "#30000" -msgid "General" +msgid "" msgstr "" msgctxt "#30001" @@ -151,7 +151,7 @@ msgid "Configure %s?" msgstr "" msgctxt "#30031" -msgid "Advanced" +msgid "" msgstr "" msgctxt "#30032" @@ -217,7 +217,7 @@ msgid "Watch Later" msgstr "" msgctxt "#30108" -msgid "Remove" +msgid "" msgstr "" msgctxt "#30109" @@ -237,7 +237,7 @@ msgid "Sign Out" msgstr "" msgctxt "#30113" -msgid "Rename" +msgid "" msgstr "" msgctxt "#30114" @@ -257,7 +257,7 @@ msgid "Remove \"%s\"?" msgstr "" msgctxt "#30118" -msgid "Delete" +msgid "" msgstr "" msgctxt "#30119" @@ -301,11 +301,11 @@ msgstr "" # YouTube # empty strings from id 30206 to 30499 msgctxt "#30500" -msgid "Channels" +msgid "" msgstr "" msgctxt "#30501" -msgid "Playlists" +msgid "" msgstr "" msgctxt "#30502" @@ -361,7 +361,7 @@ msgid "Related Videos" msgstr "" msgctxt "#30515" -msgid "Auto-Remove from 'Watch Later'" +msgid "Auto-Remove from Watch Later" msgstr "" msgctxt "#30516" @@ -385,15 +385,15 @@ msgid "Add to..." msgstr "" msgctxt "#30521" -msgid "Select playlist" +msgid "" msgstr "" msgctxt "#30522" -msgid "New playlist..." +msgid "" msgstr "" msgctxt "#30523" -msgid "Language" +msgid "" msgstr "" msgctxt "#30524" @@ -425,11 +425,11 @@ msgid "I dislike this" msgstr "" msgctxt "#30531" -msgid "Play all" +msgid "" msgstr "" msgctxt "#30532" -msgid "Default" +msgid "" msgstr "" msgctxt "#30533" @@ -437,7 +437,7 @@ msgid "Reverse" msgstr "" msgctxt "#30534" -msgid "Shuffle" +msgid "" msgstr "" msgctxt "#30535" @@ -457,7 +457,7 @@ msgid "Disliked Videos" msgstr "" msgctxt "#30539" -msgid "Live" +msgid "" msgstr "" msgctxt "#30540" @@ -473,7 +473,7 @@ msgid "rtmpe streams are not supported" msgstr "" msgctxt "#30543" -msgid "Refresh" +msgid "" msgstr "" msgctxt "#30544" @@ -485,15 +485,15 @@ msgid "No further links found." msgstr "" msgctxt "#30546" -msgid "Please log in twice!" +msgid "Please complete all login prompts" msgstr "" msgctxt "#30547" -msgid "You must enable two applications so that YouTube is functioning properly." +msgid "You may be prompted to enable two applications so that YouTube is functioning properly." msgstr "" msgctxt "#30548" -msgid "More..." +msgid "" msgstr "" msgctxt "#30549" @@ -501,7 +501,7 @@ msgid "No videos streams found" msgstr "" msgctxt "#30550" -msgid "Region" +msgid "" msgstr "" msgctxt "#30551" @@ -541,15 +541,15 @@ msgid "Delete settings.xml" msgstr "" msgctxt "#30560" -msgid "Subtitle language" +msgid "" msgstr "" msgctxt "#30561" -msgid "None" +msgid "" msgstr "" msgctxt "#30562" -msgid "" +msgid "View all" msgstr "" msgctxt "#30563" @@ -565,7 +565,7 @@ msgid "" msgstr "" msgctxt "#30566" -msgid "Prompt" +msgid "" msgstr "" msgctxt "#30567" @@ -577,11 +577,11 @@ msgid "Remove as Watch Later" msgstr "" msgctxt "#30569" -msgid "Are you sure you want to remove '%s' as your Watch Later list?" +msgid "Are you sure you want to remove \"%s\" as your Watch Later list?" msgstr "" msgctxt "#30570" -msgid "Are you sure you want to replace your current Watch Later list with '%s'?" +msgid "Are you sure you want to replace your current Watch Later list with \"%s\"?" msgstr "" msgctxt "#30571" @@ -593,11 +593,11 @@ msgid "Remove as History" msgstr "" msgctxt "#30573" -msgid "Are you sure you want to remove '%s' as your History list?" +msgid "Are you sure you want to remove \"%s\" as your History list?" msgstr "" msgctxt "#30574" -msgid "Are you sure you want to replace your current History list with '%s'?" +msgid "Are you sure you want to replace your current History list with \"%s\"?" msgstr "" msgctxt "#30575" @@ -609,7 +609,7 @@ msgid "Failed" msgstr "" msgctxt "#30577" -msgid "Settings" +msgid "" msgstr "" msgctxt "#30578" @@ -633,7 +633,7 @@ msgid "Autoplay suggested videos" msgstr "" msgctxt "#30583" -msgid "Automatic" +msgid "" msgstr "" msgctxt "#30584" @@ -693,7 +693,7 @@ msgid "Updated: %s" msgstr "" msgctxt "#30598" -msgid "Personal API keys enabled" +msgid "" msgstr "" msgctxt "#30599" @@ -701,7 +701,7 @@ msgid "Failed to enable personal API keys. Missing: %s" msgstr "" msgctxt "#30600" -msgid "Subtitles" +msgid "" msgstr "" msgctxt "#30601" @@ -761,7 +761,7 @@ msgid "" msgstr "" msgctxt "#30615" -msgid "Cancel" +msgid "" msgstr "" msgctxt "#30616" @@ -777,7 +777,7 @@ msgid "" msgstr "" msgctxt "#30619" -msgid "Port" +msgid "" msgstr "" msgctxt "#30620" @@ -821,7 +821,7 @@ msgid "IP whitelist (comma delimited)" msgstr "" msgctxt "#30630" -msgid "Save" +msgid "" msgstr "" msgctxt "#30631" @@ -937,7 +937,7 @@ msgid "Enter a name for this user" msgstr "" msgctxt "#30659" -msgid "User is now '%s'" +msgid "User is now \"%s\"" msgstr "" msgctxt "#30660" @@ -961,15 +961,15 @@ msgid "Switch user" msgstr "" msgctxt "#30665" -msgid "Switch to '%s' now?" +msgid "Switch to \"%s\" now?" msgstr "" msgctxt "#30666" -msgid "%s removed" +msgid "\"%s\" removed" msgstr "" msgctxt "#30667" -msgid "Renamed '%s' to '%s'" +msgid "Renamed \"%s\" to \"%s\"" msgstr "" msgctxt "#30668" @@ -1113,7 +1113,7 @@ msgid "Play with subtitles" msgstr "" msgctxt "#30703" -msgid "Are you sure?" +msgid "" msgstr "" msgctxt "#30704" @@ -1257,7 +1257,7 @@ msgid "" msgstr "" msgctxt "#30739" -msgid "" +msgid "Subscribers" msgstr "" msgctxt "#30740" @@ -1477,11 +1477,11 @@ msgid "Views count display colour" msgstr "" msgctxt "#30794" -msgid "Likes count display colour" +msgid "Subscriber/Likes count display colour" msgstr "" msgctxt "#30795" -msgid "Comments count display colour" +msgid "Videos/Comments count display colour" msgstr "" msgctxt "#30796" @@ -1579,3 +1579,7 @@ msgstr "" msgctxt "#30819" msgid "Play from start" msgstr "" + +msgctxt "#30820" +msgid "Podcast" +msgstr "" diff --git a/plugin.video.youtube/resources/language/resource.language.th_th/strings.po b/plugin.video.youtube/resources/language/resource.language.th_th/strings.po index 6ed9dd941d..9ea6340e62 100644 --- a/plugin.video.youtube/resources/language/resource.language.th_th/strings.po +++ b/plugin.video.youtube/resources/language/resource.language.th_th/strings.po @@ -37,7 +37,7 @@ msgstr "" # msgstr "" # Kodion Settings msgctxt "#30000" -msgid "General" +msgid "" msgstr "" msgctxt "#30001" @@ -151,7 +151,7 @@ msgid "Configure %s?" msgstr "" msgctxt "#30031" -msgid "Advanced" +msgid "" msgstr "" msgctxt "#30032" @@ -217,7 +217,7 @@ msgid "Watch Later" msgstr "" msgctxt "#30108" -msgid "Remove" +msgid "" msgstr "" msgctxt "#30109" @@ -237,7 +237,7 @@ msgid "Sign Out" msgstr "" msgctxt "#30113" -msgid "Rename" +msgid "" msgstr "" msgctxt "#30114" @@ -257,7 +257,7 @@ msgid "Remove \"%s\"?" msgstr "" msgctxt "#30118" -msgid "Delete" +msgid "" msgstr "" msgctxt "#30119" @@ -301,11 +301,11 @@ msgstr "" # YouTube # empty strings from id 30206 to 30499 msgctxt "#30500" -msgid "Channels" +msgid "" msgstr "" msgctxt "#30501" -msgid "Playlists" +msgid "" msgstr "" msgctxt "#30502" @@ -361,7 +361,7 @@ msgid "Related Videos" msgstr "" msgctxt "#30515" -msgid "Auto-Remove from 'Watch Later'" +msgid "Auto-Remove from Watch Later" msgstr "" msgctxt "#30516" @@ -385,15 +385,15 @@ msgid "Add to..." msgstr "" msgctxt "#30521" -msgid "Select playlist" +msgid "" msgstr "" msgctxt "#30522" -msgid "New playlist..." +msgid "" msgstr "" msgctxt "#30523" -msgid "Language" +msgid "" msgstr "" msgctxt "#30524" @@ -425,11 +425,11 @@ msgid "I dislike this" msgstr "" msgctxt "#30531" -msgid "Play all" +msgid "" msgstr "" msgctxt "#30532" -msgid "Default" +msgid "" msgstr "" msgctxt "#30533" @@ -437,7 +437,7 @@ msgid "Reverse" msgstr "" msgctxt "#30534" -msgid "Shuffle" +msgid "" msgstr "" msgctxt "#30535" @@ -457,7 +457,7 @@ msgid "Disliked Videos" msgstr "" msgctxt "#30539" -msgid "Live" +msgid "" msgstr "" msgctxt "#30540" @@ -473,7 +473,7 @@ msgid "rtmpe streams are not supported" msgstr "" msgctxt "#30543" -msgid "Refresh" +msgid "" msgstr "" msgctxt "#30544" @@ -485,15 +485,15 @@ msgid "No further links found." msgstr "" msgctxt "#30546" -msgid "Please log in twice!" +msgid "Please complete all login prompts" msgstr "" msgctxt "#30547" -msgid "You must enable two applications so that YouTube is functioning properly." +msgid "You may be prompted to enable two applications so that YouTube is functioning properly." msgstr "" msgctxt "#30548" -msgid "More..." +msgid "" msgstr "" msgctxt "#30549" @@ -501,7 +501,7 @@ msgid "No videos streams found" msgstr "" msgctxt "#30550" -msgid "Region" +msgid "" msgstr "" msgctxt "#30551" @@ -541,15 +541,15 @@ msgid "Delete settings.xml" msgstr "" msgctxt "#30560" -msgid "Subtitle language" +msgid "" msgstr "" msgctxt "#30561" -msgid "None" +msgid "" msgstr "" msgctxt "#30562" -msgid "" +msgid "View all" msgstr "" msgctxt "#30563" @@ -565,7 +565,7 @@ msgid "" msgstr "" msgctxt "#30566" -msgid "Prompt" +msgid "" msgstr "" msgctxt "#30567" @@ -577,11 +577,11 @@ msgid "Remove as Watch Later" msgstr "" msgctxt "#30569" -msgid "Are you sure you want to remove '%s' as your Watch Later list?" +msgid "Are you sure you want to remove \"%s\" as your Watch Later list?" msgstr "" msgctxt "#30570" -msgid "Are you sure you want to replace your current Watch Later list with '%s'?" +msgid "Are you sure you want to replace your current Watch Later list with \"%s\"?" msgstr "" msgctxt "#30571" @@ -593,11 +593,11 @@ msgid "Remove as History" msgstr "" msgctxt "#30573" -msgid "Are you sure you want to remove '%s' as your History list?" +msgid "Are you sure you want to remove \"%s\" as your History list?" msgstr "" msgctxt "#30574" -msgid "Are you sure you want to replace your current History list with '%s'?" +msgid "Are you sure you want to replace your current History list with \"%s\"?" msgstr "" msgctxt "#30575" @@ -609,7 +609,7 @@ msgid "Failed" msgstr "" msgctxt "#30577" -msgid "Settings" +msgid "" msgstr "" msgctxt "#30578" @@ -633,7 +633,7 @@ msgid "Autoplay suggested videos" msgstr "" msgctxt "#30583" -msgid "Automatic" +msgid "" msgstr "" msgctxt "#30584" @@ -693,7 +693,7 @@ msgid "Updated: %s" msgstr "" msgctxt "#30598" -msgid "Personal API keys enabled" +msgid "" msgstr "" msgctxt "#30599" @@ -701,7 +701,7 @@ msgid "Failed to enable personal API keys. Missing: %s" msgstr "" msgctxt "#30600" -msgid "Subtitles" +msgid "" msgstr "" msgctxt "#30601" @@ -761,7 +761,7 @@ msgid "" msgstr "" msgctxt "#30615" -msgid "Cancel" +msgid "" msgstr "" msgctxt "#30616" @@ -777,7 +777,7 @@ msgid "" msgstr "" msgctxt "#30619" -msgid "Port" +msgid "" msgstr "" msgctxt "#30620" @@ -821,7 +821,7 @@ msgid "IP whitelist (comma delimited)" msgstr "" msgctxt "#30630" -msgid "Save" +msgid "" msgstr "" msgctxt "#30631" @@ -937,7 +937,7 @@ msgid "Enter a name for this user" msgstr "" msgctxt "#30659" -msgid "User is now '%s'" +msgid "User is now \"%s\"" msgstr "" msgctxt "#30660" @@ -961,15 +961,15 @@ msgid "Switch user" msgstr "" msgctxt "#30665" -msgid "Switch to '%s' now?" +msgid "Switch to \"%s\" now?" msgstr "" msgctxt "#30666" -msgid "%s removed" +msgid "\"%s\" removed" msgstr "" msgctxt "#30667" -msgid "Renamed '%s' to '%s'" +msgid "Renamed \"%s\" to \"%s\"" msgstr "" msgctxt "#30668" @@ -1113,7 +1113,7 @@ msgid "Play with subtitles" msgstr "" msgctxt "#30703" -msgid "Are you sure?" +msgid "" msgstr "" msgctxt "#30704" @@ -1257,7 +1257,7 @@ msgid "" msgstr "" msgctxt "#30739" -msgid "" +msgid "Subscribers" msgstr "" msgctxt "#30740" @@ -1477,11 +1477,11 @@ msgid "Views count display colour" msgstr "" msgctxt "#30794" -msgid "Likes count display colour" +msgid "Subscriber/Likes count display colour" msgstr "" msgctxt "#30795" -msgid "Comments count display colour" +msgid "Videos/Comments count display colour" msgstr "" msgctxt "#30796" @@ -1579,3 +1579,7 @@ msgstr "" msgctxt "#30819" msgid "Play from start" msgstr "" + +msgctxt "#30820" +msgid "Podcast" +msgstr "" diff --git a/plugin.video.youtube/resources/language/resource.language.tr_tr/strings.po b/plugin.video.youtube/resources/language/resource.language.tr_tr/strings.po index ca86b6e9fc..408d513be5 100644 --- a/plugin.video.youtube/resources/language/resource.language.tr_tr/strings.po +++ b/plugin.video.youtube/resources/language/resource.language.tr_tr/strings.po @@ -37,8 +37,8 @@ msgstr "Bu eklenti Google tarafından üretilmemiştir" # msgstr "" # Kodion Settings msgctxt "#30000" -msgid "General" -msgstr "Genel" +msgid "" +msgstr "" msgctxt "#30001" msgid "" @@ -151,8 +151,8 @@ msgid "Configure %s?" msgstr "" msgctxt "#30031" -msgid "Advanced" -msgstr "Gelişmiş" +msgid "" +msgstr "" msgctxt "#30032" msgid "View: TV Shows" @@ -217,8 +217,8 @@ msgid "Watch Later" msgstr "Daha Sonra İzle" msgctxt "#30108" -msgid "Remove" -msgstr "Kaldır" +msgid "" +msgstr "" msgctxt "#30109" msgid "" @@ -237,8 +237,8 @@ msgid "Sign Out" msgstr "Çıkış Yap" msgctxt "#30113" -msgid "Rename" -msgstr "Yeniden Adlandır" +msgid "" +msgstr "" msgctxt "#30114" msgid "Confirm delete" @@ -257,8 +257,8 @@ msgid "Remove \"%s\"?" msgstr "\"%s\" ögesi kaldırılsın mı?" msgctxt "#30118" -msgid "Delete" -msgstr "Kaldır" +msgid "" +msgstr "" msgctxt "#30119" msgid "Please wait..." @@ -301,12 +301,12 @@ msgstr "" # YouTube # empty strings from id 30206 to 30499 msgctxt "#30500" -msgid "Channels" -msgstr "Kanallar" +msgid "" +msgstr "" msgctxt "#30501" -msgid "Playlists" -msgstr "Oynatma Listeleri" +msgid "" +msgstr "" msgctxt "#30502" msgid "Go to %s" @@ -361,8 +361,8 @@ msgid "Related Videos" msgstr "İlgili Videolar" msgctxt "#30515" -msgid "Auto-Remove from 'Watch Later'" -msgstr "Daha Sonra İzle'den izlenen videoları sonrasında kaldır" +msgid "Auto-Remove from Watch Later" +msgstr "" msgctxt "#30516" msgid "Folders" @@ -385,16 +385,16 @@ msgid "Add to..." msgstr "Ekle..." msgctxt "#30521" -msgid "Select playlist" -msgstr "Oynatma listesi seç" +msgid "" +msgstr "" msgctxt "#30522" -msgid "New playlist..." -msgstr "Yeni oynatmalistesi..." +msgid "" +msgstr "" msgctxt "#30523" -msgid "Language" -msgstr "Diller" +msgid "" +msgstr "" msgctxt "#30524" msgid "Select language" @@ -425,20 +425,20 @@ msgid "I dislike this" msgstr "Bunu beğenmedim" msgctxt "#30531" -msgid "Play all" -msgstr "Hepsini oynat" +msgid "" +msgstr "" msgctxt "#30532" -msgid "Default" -msgstr "Varsayılan" +msgid "" +msgstr "" msgctxt "#30533" msgid "Reverse" msgstr "Tersine çevir" msgctxt "#30534" -msgid "Shuffle" -msgstr "Karıştır" +msgid "" +msgstr "" msgctxt "#30535" msgid "Select the order of the playlist" @@ -457,8 +457,8 @@ msgid "Disliked Videos" msgstr "Beğenilmeyen Videolar" msgctxt "#30539" -msgid "Live" -msgstr "Canlı Yayınlar" +msgid "" +msgstr "" msgctxt "#30540" msgid "Play with..." @@ -473,8 +473,8 @@ msgid "rtmpe streams are not supported" msgstr "rtmpe yayın akışları deskteklenmiyor" msgctxt "#30543" -msgid "Refresh" -msgstr "Yenile" +msgid "" +msgstr "" msgctxt "#30544" msgid "More Links from the description" @@ -485,24 +485,24 @@ msgid "No further links found." msgstr "Daha fazla bağlantı bulunamadı." msgctxt "#30546" -msgid "Please log in twice!" -msgstr "Lütfen iki kere giriş yapın!" +msgid "Please complete all login prompts" +msgstr "" msgctxt "#30547" -msgid "You must enable two applications so that YouTube is functioning properly." -msgstr "İki uygulamayı da etkinleştirmelisiniz ki YouTube doğru bir şekilde çalışsın." +msgid "You may be prompted to enable two applications so that YouTube is functioning properly." +msgstr "" msgctxt "#30548" -msgid "More..." -msgstr "Daha fazla..." +msgid "" +msgstr "" msgctxt "#30549" msgid "No videos streams found" msgstr "Hiçbir video akışı bulunamadı" msgctxt "#30550" -msgid "Region" -msgstr "Bölge" +msgid "" +msgstr "" msgctxt "#30551" msgid "Recommendations" @@ -541,15 +541,15 @@ msgid "Delete settings.xml" msgstr "settings.xml dosyasını sil" msgctxt "#30560" -msgid "Subtitle language" -msgstr "Alt yazı dili" +msgid "" +msgstr "" msgctxt "#30561" -msgid "None" -msgstr "Hiçbiri" +msgid "" +msgstr "" msgctxt "#30562" -msgid "" +msgid "View all" msgstr "" msgctxt "#30563" @@ -565,8 +565,8 @@ msgid "" msgstr "" msgctxt "#30566" -msgid "Prompt" -msgstr "İstem" +msgid "" +msgstr "" msgctxt "#30567" msgid "Set as Watch Later" @@ -577,12 +577,12 @@ msgid "Remove as Watch Later" msgstr "Daha Sonra İzle'den kaldır" msgctxt "#30569" -msgid "Are you sure you want to remove '%s' as your Watch Later list?" -msgstr "'%s' ögesi Daha Sonra İzle listesinden kaldırılacak, emin misiniz?" +msgid "Are you sure you want to remove \"%s\" as your Watch Later list?" +msgstr "" msgctxt "#30570" -msgid "Are you sure you want to replace your current Watch Later list with '%s'?" -msgstr "Şimdiki Daha Sonra İzle listeniz '%s' ile değiştirilecek, emin misiniz?" +msgid "Are you sure you want to replace your current Watch Later list with \"%s\"?" +msgstr "" msgctxt "#30571" msgid "Set as History" @@ -593,12 +593,12 @@ msgid "Remove as History" msgstr "Geçmişten kaldır" msgctxt "#30573" -msgid "Are you sure you want to remove '%s' as your History list?" -msgstr "'%s' ögesi Geçmiş listesinizden kaldırılacak, emin misiniz?" +msgid "Are you sure you want to remove \"%s\" as your History list?" +msgstr "" msgctxt "#30574" -msgid "Are you sure you want to replace your current History list with '%s'?" -msgstr "Şimdiki Geçmiş listeniz, '%s' ile değiştirilecek, emin misiniz?" +msgid "Are you sure you want to replace your current History list with \"%s\"?" +msgstr "" msgctxt "#30575" msgid "Succeeded" @@ -609,8 +609,8 @@ msgid "Failed" msgstr "Başarısız" msgctxt "#30577" -msgid "Settings" -msgstr "Ayarlar" +msgid "" +msgstr "" msgctxt "#30578" msgid "Force SSL certificate verification" @@ -633,8 +633,8 @@ msgid "Autoplay suggested videos" msgstr "Önerilen videoları otomatik oynat" msgctxt "#30583" -msgid "Automatic" -msgstr "Otomatik" +msgid "" +msgstr "" msgctxt "#30584" msgid "My Subscriptions (Filtered)" @@ -693,15 +693,15 @@ msgid "Updated: %s" msgstr "Güncellendi: %s" msgctxt "#30598" -msgid "Personal API keys enabled" -msgstr "Kişisel API anahtarları etkinleştirildi" +msgid "" +msgstr "" msgctxt "#30599" msgid "Failed to enable personal API keys. Missing: %s" msgstr "Kişisel API anahtarları etkinleştirilemedi. Eksik: %s" msgctxt "#30600" -msgid "Subtitles" +msgid "" msgstr "" msgctxt "#30601" @@ -761,8 +761,8 @@ msgid "" msgstr "" msgctxt "#30615" -msgid "Cancel" -msgstr "İptal Et" +msgid "" +msgstr "" msgctxt "#30616" msgid "" @@ -777,8 +777,8 @@ msgid "" msgstr "" msgctxt "#30619" -msgid "Port" -msgstr "Bağlantı Noktası" +msgid "" +msgstr "" msgctxt "#30620" msgid "Port %s already in use. Cannot start http server." @@ -821,8 +821,8 @@ msgid "IP whitelist (comma delimited)" msgstr "IP beyaz listesi (virgül ile ayrılmış)" msgctxt "#30630" -msgid "Save" -msgstr "Kaydet" +msgid "" +msgstr "" msgctxt "#30631" msgid "Successfully updated: %s" @@ -937,8 +937,8 @@ msgid "Enter a name for this user" msgstr "Bu kullanıcı için bir ad gir" msgctxt "#30659" -msgid "User is now '%s'" -msgstr "Kullanıcı şu anda '%s'" +msgid "User is now \"%s\"" +msgstr "" msgctxt "#30660" msgid "Users" @@ -961,16 +961,16 @@ msgid "Switch user" msgstr "Kullanıcı değiştir" msgctxt "#30665" -msgid "Switch to '%s' now?" -msgstr "'%s' kullanıcısına geçilsin mi?" +msgid "Switch to \"%s\" now?" +msgstr "" msgctxt "#30666" -msgid "%s removed" +msgid "\"%s\" removed" msgstr "" msgctxt "#30667" -msgid "Renamed '%s' to '%s'" -msgstr "Kullanıcının adı, '%s' adından '%s' adına değiştirildi" +msgid "Renamed \"%s\" to \"%s\"" +msgstr "" msgctxt "#30668" msgid "Play count minimum percent" @@ -1113,8 +1113,8 @@ msgid "Play with subtitles" msgstr "Alt yazılar ile oynat" msgctxt "#30703" -msgid "Are you sure?" -msgstr "Emin misiniz?" +msgid "" +msgstr "" msgctxt "#30704" msgid "Use YouTube website urls with default player" @@ -1257,7 +1257,7 @@ msgid "" msgstr "" msgctxt "#30739" -msgid "" +msgid "Subscribers" msgstr "" msgctxt "#30740" @@ -1477,11 +1477,11 @@ msgid "Views count display colour" msgstr "" msgctxt "#30794" -msgid "Likes count display colour" +msgid "Subscriber/Likes count display colour" msgstr "" msgctxt "#30795" -msgid "Comments count display colour" +msgid "Videos/Comments count display colour" msgstr "" msgctxt "#30796" @@ -1580,6 +1580,167 @@ msgctxt "#30819" msgid "Play from start" msgstr "" +msgctxt "#30820" +msgid "Podcast" +msgstr "" + +#~ msgctxt "#30515" +#~ msgid "Auto-Remove from 'Watch Later'" +#~ msgstr "Daha Sonra İzle'den izlenen videoları sonrasında kaldır" + +#~ msgctxt "#30569" +#~ msgid "Are you sure you want to remove '%s' as your Watch Later list?" +#~ msgstr "'%s' ögesi Daha Sonra İzle listesinden kaldırılacak, emin misiniz?" + +#~ msgctxt "#30570" +#~ msgid "Are you sure you want to replace your current Watch Later list with '%s'?" +#~ msgstr "Şimdiki Daha Sonra İzle listeniz '%s' ile değiştirilecek, emin misiniz?" + +#~ msgctxt "#30573" +#~ msgid "Are you sure you want to remove '%s' as your History list?" +#~ msgstr "'%s' ögesi Geçmiş listesinizden kaldırılacak, emin misiniz?" + +#~ msgctxt "#30574" +#~ msgid "Are you sure you want to replace your current History list with '%s'?" +#~ msgstr "Şimdiki Geçmiş listeniz, '%s' ile değiştirilecek, emin misiniz?" + +#~ msgctxt "#30659" +#~ msgid "User is now '%s'" +#~ msgstr "Kullanıcı şu anda '%s'" + +#~ msgctxt "#30665" +#~ msgid "Switch to '%s' now?" +#~ msgstr "'%s' kullanıcısına geçilsin mi?" + +#~ msgctxt "#30667" +#~ msgid "Renamed '%s' to '%s'" +#~ msgstr "Kullanıcının adı, '%s' adından '%s' adına değiştirildi" + +# msgctxt "Addon Summary" +# msgid "Plugin for YouTube" +# msgstr "" +# msgctxt "Addon Description" +# msgid "YouTube is a one of the biggest video-sharing websites of the world." +# msgstr "" +# Kodion Settings +#~ msgctxt "#30000" +#~ msgid "General" +#~ msgstr "Genel" + +#~ msgctxt "#30031" +#~ msgid "Advanced" +#~ msgstr "Gelişmiş" + +#~ msgctxt "#30108" +#~ msgid "Remove" +#~ msgstr "Kaldır" + +#~ msgctxt "#30113" +#~ msgid "Rename" +#~ msgstr "Yeniden Adlandır" + +#~ msgctxt "#30118" +#~ msgid "Delete" +#~ msgstr "Kaldır" + +# YouTube +# empty strings from id 30206 to 30499 +#~ msgctxt "#30500" +#~ msgid "Channels" +#~ msgstr "Kanallar" + +#~ msgctxt "#30501" +#~ msgid "Playlists" +#~ msgstr "Oynatma Listeleri" + +#~ msgctxt "#30521" +#~ msgid "Select playlist" +#~ msgstr "Oynatma listesi seç" + +#~ msgctxt "#30522" +#~ msgid "New playlist..." +#~ msgstr "Yeni oynatmalistesi..." + +#~ msgctxt "#30523" +#~ msgid "Language" +#~ msgstr "Diller" + +#~ msgctxt "#30531" +#~ msgid "Play all" +#~ msgstr "Hepsini oynat" + +#~ msgctxt "#30532" +#~ msgid "Default" +#~ msgstr "Varsayılan" + +#~ msgctxt "#30534" +#~ msgid "Shuffle" +#~ msgstr "Karıştır" + +#~ msgctxt "#30539" +#~ msgid "Live" +#~ msgstr "Canlı Yayınlar" + +#~ msgctxt "#30543" +#~ msgid "Refresh" +#~ msgstr "Yenile" + +#~ msgctxt "#30548" +#~ msgid "More..." +#~ msgstr "Daha fazla..." + +#~ msgctxt "#30550" +#~ msgid "Region" +#~ msgstr "Bölge" + +#~ msgctxt "#30560" +#~ msgid "Subtitle language" +#~ msgstr "Alt yazı dili" + +#~ msgctxt "#30561" +#~ msgid "None" +#~ msgstr "Hiçbiri" + +#~ msgctxt "#30566" +#~ msgid "Prompt" +#~ msgstr "İstem" + +#~ msgctxt "#30577" +#~ msgid "Settings" +#~ msgstr "Ayarlar" + +#~ msgctxt "#30583" +#~ msgid "Automatic" +#~ msgstr "Otomatik" + +#~ msgctxt "#30598" +#~ msgid "Personal API keys enabled" +#~ msgstr "Kişisel API anahtarları etkinleştirildi" + +#~ msgctxt "#30615" +#~ msgid "Cancel" +#~ msgstr "İptal Et" + +#~ msgctxt "#30619" +#~ msgid "Port" +#~ msgstr "Bağlantı Noktası" + +#~ msgctxt "#30630" +#~ msgid "Save" +#~ msgstr "Kaydet" + +#~ msgctxt "#30703" +#~ msgid "Are you sure?" +#~ msgstr "Emin misiniz?" + +#~ msgctxt "#30546" +#~ msgid "Please log in twice!" +#~ msgstr "Lütfen iki kere giriş yapın!" + +#~ msgctxt "#30547" +#~ msgid "You must enable two applications so that YouTube is functioning properly." +#~ msgstr "İki uygulamayı da etkinleştirmelisiniz ki YouTube doğru bir şekilde çalışsın." + #~ msgctxt "#30001" #~ msgid "Username" #~ msgstr "Kullanıcı Adı" diff --git a/plugin.video.youtube/resources/language/resource.language.uk_ua/strings.po b/plugin.video.youtube/resources/language/resource.language.uk_ua/strings.po index e68d24b557..2d540eaeaa 100644 --- a/plugin.video.youtube/resources/language/resource.language.uk_ua/strings.po +++ b/plugin.video.youtube/resources/language/resource.language.uk_ua/strings.po @@ -35,9 +35,10 @@ msgstr "Цей плагін не має відношення до компані # msgctxt "Addon Description" # msgid "YouTube is a one of the biggest video-sharing websites of the world." # msgstr "" +# Kodion Settings msgctxt "#30000" -msgid "General" -msgstr "Загальні" +msgid "" +msgstr "" msgctxt "#30001" msgid "" @@ -149,8 +150,8 @@ msgid "Configure %s?" msgstr "" msgctxt "#30031" -msgid "Advanced" -msgstr "Розширені" +msgid "" +msgstr "" msgctxt "#30032" msgid "View: TV Shows" @@ -215,8 +216,8 @@ msgid "Watch Later" msgstr "Відкладений перегляд" msgctxt "#30108" -msgid "Remove" -msgstr "Видалити" +msgid "" +msgstr "" msgctxt "#30109" msgid "" @@ -235,8 +236,8 @@ msgid "Sign Out" msgstr "Вийти" msgctxt "#30113" -msgid "Rename" -msgstr "Перейменувати" +msgid "" +msgstr "" msgctxt "#30114" msgid "Confirm delete" @@ -255,8 +256,8 @@ msgid "Remove \"%s\"?" msgstr "Видалити \"%s\"?" msgctxt "#30118" -msgid "Delete" -msgstr "Знищення" +msgid "" +msgstr "" msgctxt "#30119" msgid "Please wait..." @@ -299,12 +300,12 @@ msgstr "" # YouTube # empty strings from id 30206 to 30499 msgctxt "#30500" -msgid "Channels" -msgstr "Канали" +msgid "" +msgstr "" msgctxt "#30501" -msgid "Playlists" -msgstr "Плейлисти" +msgid "" +msgstr "" msgctxt "#30502" msgid "Go to %s" @@ -359,8 +360,8 @@ msgid "Related Videos" msgstr "Схоже відео" msgctxt "#30515" -msgid "Auto-Remove from 'Watch Later'" -msgstr "Авто-видалення з \"Відкладеного перегляду\"" +msgid "Auto-Remove from Watch Later" +msgstr "" msgctxt "#30516" msgid "Folders" @@ -383,16 +384,16 @@ msgid "Add to..." msgstr "Додати в..." msgctxt "#30521" -msgid "Select playlist" -msgstr "Вибрати плейліст" +msgid "" +msgstr "" msgctxt "#30522" -msgid "New playlist..." -msgstr "Новий плейліст..." +msgid "" +msgstr "" msgctxt "#30523" -msgid "Language" -msgstr "Мова" +msgid "" +msgstr "" msgctxt "#30524" msgid "Select language" @@ -423,20 +424,20 @@ msgid "I dislike this" msgstr "Мені не сподобалося" msgctxt "#30531" -msgid "Play all" -msgstr "Програти все" +msgid "" +msgstr "" msgctxt "#30532" -msgid "Default" -msgstr "Звичайний порядок" +msgid "" +msgstr "" msgctxt "#30533" msgid "Reverse" msgstr "Зворотний порядок" msgctxt "#30534" -msgid "Shuffle" -msgstr "Випадковий порядок" +msgid "" +msgstr "" msgctxt "#30535" msgid "Select the order of the playlist" @@ -455,8 +456,8 @@ msgid "Disliked Videos" msgstr "Відео, яке не сподобалось" msgctxt "#30539" -msgid "Live" -msgstr "Прямий ефір" +msgid "" +msgstr "" msgctxt "#30540" msgid "Play with..." @@ -471,8 +472,8 @@ msgid "rtmpe streams are not supported" msgstr "потоки rtmpe не підтримуються" msgctxt "#30543" -msgid "Refresh" -msgstr "Оновити" +msgid "" +msgstr "" msgctxt "#30544" msgid "More Links from the description" @@ -483,24 +484,24 @@ msgid "No further links found." msgstr "Подальших посилань не знайдено." msgctxt "#30546" -msgid "Please log in twice!" -msgstr "Будь-ласка, увійдіть двічі!" +msgid "Please complete all login prompts" +msgstr "" msgctxt "#30547" -msgid "You must enable two applications so that YouTube is functioning properly." -msgstr "Ви повинні підключити дві копії програми щоб YouTube працював правильно." +msgid "You may be prompted to enable two applications so that YouTube is functioning properly." +msgstr "" msgctxt "#30548" -msgid "More..." -msgstr "Ще..." +msgid "" +msgstr "" msgctxt "#30549" msgid "No videos streams found" msgstr "Відеопотоки не знайдені" msgctxt "#30550" -msgid "Region" -msgstr "регіон" +msgid "" +msgstr "" msgctxt "#30551" msgid "Recommendations" @@ -539,15 +540,15 @@ msgid "Delete settings.xml" msgstr "Видалити settings.xml" msgctxt "#30560" -msgid "Subtitle language" -msgstr "Мова субтитрів" +msgid "" +msgstr "" msgctxt "#30561" -msgid "None" -msgstr "Жоден" +msgid "" +msgstr "" msgctxt "#30562" -msgid "" +msgid "View all" msgstr "" msgctxt "#30563" @@ -563,7 +564,7 @@ msgid "" msgstr "" msgctxt "#30566" -msgid "Prompt" +msgid "" msgstr "" msgctxt "#30567" @@ -575,12 +576,12 @@ msgid "Remove as Watch Later" msgstr "Видалити з \\\"Переглянути пізніше\\\"" msgctxt "#30569" -msgid "Are you sure you want to remove '%s' as your Watch Later list?" -msgstr "Бажаєте видалити '%s' зі списку \\\"Переглянути пізніше\\\"?" +msgid "Are you sure you want to remove \"%s\" as your Watch Later list?" +msgstr "" msgctxt "#30570" -msgid "Are you sure you want to replace your current Watch Later list with '%s'?" -msgstr "Бажаєте замініти поточний список \\\"Переглянути пізніше\\\" на '%s'?" +msgid "Are you sure you want to replace your current Watch Later list with \"%s\"?" +msgstr "" msgctxt "#30571" msgid "Set as History" @@ -591,11 +592,11 @@ msgid "Remove as History" msgstr "Видалити з історії переглянутих" msgctxt "#30573" -msgid "Are you sure you want to remove '%s' as your History list?" -msgstr "Бажаєте видалити '%s' з списку переглянутого?" +msgid "Are you sure you want to remove \"%s\" as your History list?" +msgstr "" msgctxt "#30574" -msgid "Are you sure you want to replace your current History list with '%s'?" +msgid "Are you sure you want to replace your current History list with \"%s\"?" msgstr "" msgctxt "#30575" @@ -607,8 +608,8 @@ msgid "Failed" msgstr "Помилка" msgctxt "#30577" -msgid "Settings" -msgstr "Налаштування" +msgid "" +msgstr "" msgctxt "#30578" msgid "Force SSL certificate verification" @@ -631,8 +632,8 @@ msgid "Autoplay suggested videos" msgstr "Автоматично відтворювати запропоновані відео" msgctxt "#30583" -msgid "Automatic" -msgstr "Автоматично" +msgid "" +msgstr "" msgctxt "#30584" msgid "My Subscriptions (Filtered)" @@ -691,7 +692,7 @@ msgid "Updated: %s" msgstr "Оновлено: %s" msgctxt "#30598" -msgid "Personal API keys enabled" +msgid "" msgstr "" msgctxt "#30599" @@ -699,7 +700,7 @@ msgid "Failed to enable personal API keys. Missing: %s" msgstr "" msgctxt "#30600" -msgid "Subtitles" +msgid "" msgstr "" msgctxt "#30601" @@ -759,8 +760,8 @@ msgid "" msgstr "" msgctxt "#30615" -msgid "Cancel" -msgstr "Відмінити" +msgid "" +msgstr "" msgctxt "#30616" msgid "" @@ -775,8 +776,8 @@ msgid "" msgstr "" msgctxt "#30619" -msgid "Port" -msgstr "Порт" +msgid "" +msgstr "" msgctxt "#30620" msgid "Port %s already in use. Cannot start http server." @@ -819,8 +820,8 @@ msgid "IP whitelist (comma delimited)" msgstr "" msgctxt "#30630" -msgid "Save" -msgstr "Зберегти" +msgid "" +msgstr "" msgctxt "#30631" msgid "Successfully updated: %s" @@ -935,8 +936,8 @@ msgid "Enter a name for this user" msgstr "Введіть ім'я користувача" msgctxt "#30659" -msgid "User is now '%s'" -msgstr "Поточний користувач: '%s'" +msgid "User is now \"%s\"" +msgstr "" msgctxt "#30660" msgid "Users" @@ -959,16 +960,16 @@ msgid "Switch user" msgstr "Змінити користувача" msgctxt "#30665" -msgid "Switch to '%s' now?" -msgstr "Змінити на '%s'?" +msgid "Switch to \"%s\" now?" +msgstr "" msgctxt "#30666" -msgid "%s removed" +msgid "\"%s\" removed" msgstr "" msgctxt "#30667" -msgid "Renamed '%s' to '%s'" -msgstr "'%s' перейменовано на '%s'" +msgid "Renamed \"%s\" to \"%s\"" +msgstr "" msgctxt "#30668" msgid "Play count minimum percent" @@ -1111,8 +1112,8 @@ msgid "Play with subtitles" msgstr "" msgctxt "#30703" -msgid "Are you sure?" -msgstr "Ви впевнені?" +msgid "" +msgstr "" msgctxt "#30704" msgid "Use YouTube website urls with default player" @@ -1255,7 +1256,7 @@ msgid "" msgstr "" msgctxt "#30739" -msgid "" +msgid "Subscribers" msgstr "" msgctxt "#30740" @@ -1475,11 +1476,11 @@ msgid "Views count display colour" msgstr "" msgctxt "#30794" -msgid "Likes count display colour" +msgid "Subscriber/Likes count display colour" msgstr "" msgctxt "#30795" -msgid "Comments count display colour" +msgid "Videos/Comments count display colour" msgstr "" msgctxt "#30796" @@ -1578,6 +1579,154 @@ msgctxt "#30819" msgid "Play from start" msgstr "" +msgctxt "#30820" +msgid "Podcast" +msgstr "" + +#~ msgctxt "#30515" +#~ msgid "Auto-Remove from 'Watch Later'" +#~ msgstr "Авто-видалення з \"Відкладеного перегляду\"" + +#~ msgctxt "#30569" +#~ msgid "Are you sure you want to remove '%s' as your Watch Later list?" +#~ msgstr "Бажаєте видалити '%s' зі списку \\\"Переглянути пізніше\\\"?" + +#~ msgctxt "#30570" +#~ msgid "Are you sure you want to replace your current Watch Later list with '%s'?" +#~ msgstr "Бажаєте замініти поточний список \\\"Переглянути пізніше\\\" на '%s'?" + +#~ msgctxt "#30573" +#~ msgid "Are you sure you want to remove '%s' as your History list?" +#~ msgstr "Бажаєте видалити '%s' з списку переглянутого?" + +#~ msgctxt "#30659" +#~ msgid "User is now '%s'" +#~ msgstr "Поточний користувач: '%s'" + +#~ msgctxt "#30665" +#~ msgid "Switch to '%s' now?" +#~ msgstr "Змінити на '%s'?" + +#~ msgctxt "#30667" +#~ msgid "Renamed '%s' to '%s'" +#~ msgstr "'%s' перейменовано на '%s'" + +# msgctxt "Addon Summary" +# msgid "Plugin for YouTube" +# msgstr "" +# msgctxt "Addon Description" +# msgid "YouTube is a one of the biggest video-sharing websites of the world." +# msgstr "" +#~ msgctxt "#30000" +#~ msgid "General" +#~ msgstr "Загальні" + +#~ msgctxt "#30031" +#~ msgid "Advanced" +#~ msgstr "Розширені" + +#~ msgctxt "#30108" +#~ msgid "Remove" +#~ msgstr "Видалити" + +#~ msgctxt "#30113" +#~ msgid "Rename" +#~ msgstr "Перейменувати" + +#~ msgctxt "#30118" +#~ msgid "Delete" +#~ msgstr "Знищення" + +# YouTube +# empty strings from id 30206 to 30499 +#~ msgctxt "#30500" +#~ msgid "Channels" +#~ msgstr "Канали" + +#~ msgctxt "#30501" +#~ msgid "Playlists" +#~ msgstr "Плейлисти" + +#~ msgctxt "#30521" +#~ msgid "Select playlist" +#~ msgstr "Вибрати плейліст" + +#~ msgctxt "#30522" +#~ msgid "New playlist..." +#~ msgstr "Новий плейліст..." + +#~ msgctxt "#30523" +#~ msgid "Language" +#~ msgstr "Мова" + +#~ msgctxt "#30531" +#~ msgid "Play all" +#~ msgstr "Програти все" + +#~ msgctxt "#30532" +#~ msgid "Default" +#~ msgstr "Звичайний порядок" + +#~ msgctxt "#30534" +#~ msgid "Shuffle" +#~ msgstr "Випадковий порядок" + +#~ msgctxt "#30539" +#~ msgid "Live" +#~ msgstr "Прямий ефір" + +#~ msgctxt "#30543" +#~ msgid "Refresh" +#~ msgstr "Оновити" + +#~ msgctxt "#30548" +#~ msgid "More..." +#~ msgstr "Ще..." + +#~ msgctxt "#30550" +#~ msgid "Region" +#~ msgstr "регіон" + +#~ msgctxt "#30560" +#~ msgid "Subtitle language" +#~ msgstr "Мова субтитрів" + +#~ msgctxt "#30561" +#~ msgid "None" +#~ msgstr "Жоден" + +#~ msgctxt "#30577" +#~ msgid "Settings" +#~ msgstr "Налаштування" + +#~ msgctxt "#30583" +#~ msgid "Automatic" +#~ msgstr "Автоматично" + +#~ msgctxt "#30615" +#~ msgid "Cancel" +#~ msgstr "Відмінити" + +#~ msgctxt "#30619" +#~ msgid "Port" +#~ msgstr "Порт" + +#~ msgctxt "#30630" +#~ msgid "Save" +#~ msgstr "Зберегти" + +#~ msgctxt "#30703" +#~ msgid "Are you sure?" +#~ msgstr "Ви впевнені?" + +#~ msgctxt "#30546" +#~ msgid "Please log in twice!" +#~ msgstr "Будь-ласка, увійдіть двічі!" + +#~ msgctxt "#30547" +#~ msgid "You must enable two applications so that YouTube is functioning properly." +#~ msgstr "Ви повинні підключити дві копії програми щоб YouTube працював правильно." + #~ msgctxt "#30001" #~ msgid "Username" #~ msgstr "Ім'я користувача" diff --git a/plugin.video.youtube/resources/language/resource.language.uz_uz/strings.po b/plugin.video.youtube/resources/language/resource.language.uz_uz/strings.po index 0bfc719010..16944f35ec 100644 --- a/plugin.video.youtube/resources/language/resource.language.uz_uz/strings.po +++ b/plugin.video.youtube/resources/language/resource.language.uz_uz/strings.po @@ -37,7 +37,7 @@ msgstr "" # msgstr "" # Kodion Settings msgctxt "#30000" -msgid "General" +msgid "" msgstr "" msgctxt "#30001" @@ -151,7 +151,7 @@ msgid "Configure %s?" msgstr "" msgctxt "#30031" -msgid "Advanced" +msgid "" msgstr "" msgctxt "#30032" @@ -217,7 +217,7 @@ msgid "Watch Later" msgstr "" msgctxt "#30108" -msgid "Remove" +msgid "" msgstr "" msgctxt "#30109" @@ -237,7 +237,7 @@ msgid "Sign Out" msgstr "" msgctxt "#30113" -msgid "Rename" +msgid "" msgstr "" msgctxt "#30114" @@ -257,7 +257,7 @@ msgid "Remove \"%s\"?" msgstr "" msgctxt "#30118" -msgid "Delete" +msgid "" msgstr "" msgctxt "#30119" @@ -301,11 +301,11 @@ msgstr "" # YouTube # empty strings from id 30206 to 30499 msgctxt "#30500" -msgid "Channels" +msgid "" msgstr "" msgctxt "#30501" -msgid "Playlists" +msgid "" msgstr "" msgctxt "#30502" @@ -361,7 +361,7 @@ msgid "Related Videos" msgstr "" msgctxt "#30515" -msgid "Auto-Remove from 'Watch Later'" +msgid "Auto-Remove from Watch Later" msgstr "" msgctxt "#30516" @@ -385,15 +385,15 @@ msgid "Add to..." msgstr "" msgctxt "#30521" -msgid "Select playlist" +msgid "" msgstr "" msgctxt "#30522" -msgid "New playlist..." +msgid "" msgstr "" msgctxt "#30523" -msgid "Language" +msgid "" msgstr "" msgctxt "#30524" @@ -425,11 +425,11 @@ msgid "I dislike this" msgstr "" msgctxt "#30531" -msgid "Play all" +msgid "" msgstr "" msgctxt "#30532" -msgid "Default" +msgid "" msgstr "" msgctxt "#30533" @@ -437,7 +437,7 @@ msgid "Reverse" msgstr "" msgctxt "#30534" -msgid "Shuffle" +msgid "" msgstr "" msgctxt "#30535" @@ -457,7 +457,7 @@ msgid "Disliked Videos" msgstr "" msgctxt "#30539" -msgid "Live" +msgid "" msgstr "" msgctxt "#30540" @@ -473,7 +473,7 @@ msgid "rtmpe streams are not supported" msgstr "" msgctxt "#30543" -msgid "Refresh" +msgid "" msgstr "" msgctxt "#30544" @@ -485,15 +485,15 @@ msgid "No further links found." msgstr "" msgctxt "#30546" -msgid "Please log in twice!" +msgid "Please complete all login prompts" msgstr "" msgctxt "#30547" -msgid "You must enable two applications so that YouTube is functioning properly." +msgid "You may be prompted to enable two applications so that YouTube is functioning properly." msgstr "" msgctxt "#30548" -msgid "More..." +msgid "" msgstr "" msgctxt "#30549" @@ -501,7 +501,7 @@ msgid "No videos streams found" msgstr "" msgctxt "#30550" -msgid "Region" +msgid "" msgstr "" msgctxt "#30551" @@ -541,15 +541,15 @@ msgid "Delete settings.xml" msgstr "" msgctxt "#30560" -msgid "Subtitle language" +msgid "" msgstr "" msgctxt "#30561" -msgid "None" +msgid "" msgstr "" msgctxt "#30562" -msgid "" +msgid "View all" msgstr "" msgctxt "#30563" @@ -565,7 +565,7 @@ msgid "" msgstr "" msgctxt "#30566" -msgid "Prompt" +msgid "" msgstr "" msgctxt "#30567" @@ -577,11 +577,11 @@ msgid "Remove as Watch Later" msgstr "" msgctxt "#30569" -msgid "Are you sure you want to remove '%s' as your Watch Later list?" +msgid "Are you sure you want to remove \"%s\" as your Watch Later list?" msgstr "" msgctxt "#30570" -msgid "Are you sure you want to replace your current Watch Later list with '%s'?" +msgid "Are you sure you want to replace your current Watch Later list with \"%s\"?" msgstr "" msgctxt "#30571" @@ -593,11 +593,11 @@ msgid "Remove as History" msgstr "" msgctxt "#30573" -msgid "Are you sure you want to remove '%s' as your History list?" +msgid "Are you sure you want to remove \"%s\" as your History list?" msgstr "" msgctxt "#30574" -msgid "Are you sure you want to replace your current History list with '%s'?" +msgid "Are you sure you want to replace your current History list with \"%s\"?" msgstr "" msgctxt "#30575" @@ -609,7 +609,7 @@ msgid "Failed" msgstr "" msgctxt "#30577" -msgid "Settings" +msgid "" msgstr "" msgctxt "#30578" @@ -633,7 +633,7 @@ msgid "Autoplay suggested videos" msgstr "" msgctxt "#30583" -msgid "Automatic" +msgid "" msgstr "" msgctxt "#30584" @@ -693,7 +693,7 @@ msgid "Updated: %s" msgstr "" msgctxt "#30598" -msgid "Personal API keys enabled" +msgid "" msgstr "" msgctxt "#30599" @@ -701,7 +701,7 @@ msgid "Failed to enable personal API keys. Missing: %s" msgstr "" msgctxt "#30600" -msgid "Subtitles" +msgid "" msgstr "" msgctxt "#30601" @@ -761,7 +761,7 @@ msgid "" msgstr "" msgctxt "#30615" -msgid "Cancel" +msgid "" msgstr "" msgctxt "#30616" @@ -777,7 +777,7 @@ msgid "" msgstr "" msgctxt "#30619" -msgid "Port" +msgid "" msgstr "" msgctxt "#30620" @@ -821,7 +821,7 @@ msgid "IP whitelist (comma delimited)" msgstr "" msgctxt "#30630" -msgid "Save" +msgid "" msgstr "" msgctxt "#30631" @@ -937,7 +937,7 @@ msgid "Enter a name for this user" msgstr "" msgctxt "#30659" -msgid "User is now '%s'" +msgid "User is now \"%s\"" msgstr "" msgctxt "#30660" @@ -961,15 +961,15 @@ msgid "Switch user" msgstr "" msgctxt "#30665" -msgid "Switch to '%s' now?" +msgid "Switch to \"%s\" now?" msgstr "" msgctxt "#30666" -msgid "%s removed" +msgid "\"%s\" removed" msgstr "" msgctxt "#30667" -msgid "Renamed '%s' to '%s'" +msgid "Renamed \"%s\" to \"%s\"" msgstr "" msgctxt "#30668" @@ -1113,7 +1113,7 @@ msgid "Play with subtitles" msgstr "" msgctxt "#30703" -msgid "Are you sure?" +msgid "" msgstr "" msgctxt "#30704" @@ -1257,7 +1257,7 @@ msgid "" msgstr "" msgctxt "#30739" -msgid "" +msgid "Subscribers" msgstr "" msgctxt "#30740" @@ -1477,11 +1477,11 @@ msgid "Views count display colour" msgstr "" msgctxt "#30794" -msgid "Likes count display colour" +msgid "Subscriber/Likes count display colour" msgstr "" msgctxt "#30795" -msgid "Comments count display colour" +msgid "Videos/Comments count display colour" msgstr "" msgctxt "#30796" @@ -1579,3 +1579,7 @@ msgstr "" msgctxt "#30819" msgid "Play from start" msgstr "" + +msgctxt "#30820" +msgid "Podcast" +msgstr "" diff --git a/plugin.video.youtube/resources/language/resource.language.vi_vn/strings.po b/plugin.video.youtube/resources/language/resource.language.vi_vn/strings.po index bea12c7b2b..2ecfd56066 100644 --- a/plugin.video.youtube/resources/language/resource.language.vi_vn/strings.po +++ b/plugin.video.youtube/resources/language/resource.language.vi_vn/strings.po @@ -37,8 +37,8 @@ msgstr "Plugin này không được xác nhận bởi Google" # msgstr "" # Kodion Settings msgctxt "#30000" -msgid "General" -msgstr "Chung" +msgid "" +msgstr "" msgctxt "#30001" msgid "" @@ -151,7 +151,7 @@ msgid "Configure %s?" msgstr "" msgctxt "#30031" -msgid "Advanced" +msgid "" msgstr "" msgctxt "#30032" @@ -217,7 +217,7 @@ msgid "Watch Later" msgstr "" msgctxt "#30108" -msgid "Remove" +msgid "" msgstr "" msgctxt "#30109" @@ -237,7 +237,7 @@ msgid "Sign Out" msgstr "Đăng xuất" msgctxt "#30113" -msgid "Rename" +msgid "" msgstr "" msgctxt "#30114" @@ -257,7 +257,7 @@ msgid "Remove \"%s\"?" msgstr "" msgctxt "#30118" -msgid "Delete" +msgid "" msgstr "" msgctxt "#30119" @@ -301,11 +301,11 @@ msgstr "" # YouTube # empty strings from id 30206 to 30499 msgctxt "#30500" -msgid "Channels" +msgid "" msgstr "" msgctxt "#30501" -msgid "Playlists" +msgid "" msgstr "" msgctxt "#30502" @@ -361,7 +361,7 @@ msgid "Related Videos" msgstr "" msgctxt "#30515" -msgid "Auto-Remove from 'Watch Later'" +msgid "Auto-Remove from Watch Later" msgstr "" msgctxt "#30516" @@ -385,15 +385,15 @@ msgid "Add to..." msgstr "" msgctxt "#30521" -msgid "Select playlist" +msgid "" msgstr "" msgctxt "#30522" -msgid "New playlist..." +msgid "" msgstr "" msgctxt "#30523" -msgid "Language" +msgid "" msgstr "" msgctxt "#30524" @@ -425,11 +425,11 @@ msgid "I dislike this" msgstr "" msgctxt "#30531" -msgid "Play all" +msgid "" msgstr "" msgctxt "#30532" -msgid "Default" +msgid "" msgstr "" msgctxt "#30533" @@ -437,7 +437,7 @@ msgid "Reverse" msgstr "" msgctxt "#30534" -msgid "Shuffle" +msgid "" msgstr "" msgctxt "#30535" @@ -457,7 +457,7 @@ msgid "Disliked Videos" msgstr "" msgctxt "#30539" -msgid "Live" +msgid "" msgstr "" msgctxt "#30540" @@ -473,7 +473,7 @@ msgid "rtmpe streams are not supported" msgstr "" msgctxt "#30543" -msgid "Refresh" +msgid "" msgstr "" msgctxt "#30544" @@ -485,15 +485,15 @@ msgid "No further links found." msgstr "" msgctxt "#30546" -msgid "Please log in twice!" +msgid "Please complete all login prompts" msgstr "" msgctxt "#30547" -msgid "You must enable two applications so that YouTube is functioning properly." +msgid "You may be prompted to enable two applications so that YouTube is functioning properly." msgstr "" msgctxt "#30548" -msgid "More..." +msgid "" msgstr "" msgctxt "#30549" @@ -501,7 +501,7 @@ msgid "No videos streams found" msgstr "" msgctxt "#30550" -msgid "Region" +msgid "" msgstr "" msgctxt "#30551" @@ -541,15 +541,15 @@ msgid "Delete settings.xml" msgstr "" msgctxt "#30560" -msgid "Subtitle language" +msgid "" msgstr "" msgctxt "#30561" -msgid "None" +msgid "" msgstr "" msgctxt "#30562" -msgid "" +msgid "View all" msgstr "" msgctxt "#30563" @@ -565,7 +565,7 @@ msgid "" msgstr "" msgctxt "#30566" -msgid "Prompt" +msgid "" msgstr "" msgctxt "#30567" @@ -577,11 +577,11 @@ msgid "Remove as Watch Later" msgstr "" msgctxt "#30569" -msgid "Are you sure you want to remove '%s' as your Watch Later list?" +msgid "Are you sure you want to remove \"%s\" as your Watch Later list?" msgstr "" msgctxt "#30570" -msgid "Are you sure you want to replace your current Watch Later list with '%s'?" +msgid "Are you sure you want to replace your current Watch Later list with \"%s\"?" msgstr "" msgctxt "#30571" @@ -593,11 +593,11 @@ msgid "Remove as History" msgstr "" msgctxt "#30573" -msgid "Are you sure you want to remove '%s' as your History list?" +msgid "Are you sure you want to remove \"%s\" as your History list?" msgstr "" msgctxt "#30574" -msgid "Are you sure you want to replace your current History list with '%s'?" +msgid "Are you sure you want to replace your current History list with \"%s\"?" msgstr "" msgctxt "#30575" @@ -609,7 +609,7 @@ msgid "Failed" msgstr "" msgctxt "#30577" -msgid "Settings" +msgid "" msgstr "" msgctxt "#30578" @@ -633,7 +633,7 @@ msgid "Autoplay suggested videos" msgstr "" msgctxt "#30583" -msgid "Automatic" +msgid "" msgstr "" msgctxt "#30584" @@ -693,7 +693,7 @@ msgid "Updated: %s" msgstr "" msgctxt "#30598" -msgid "Personal API keys enabled" +msgid "" msgstr "" msgctxt "#30599" @@ -701,7 +701,7 @@ msgid "Failed to enable personal API keys. Missing: %s" msgstr "" msgctxt "#30600" -msgid "Subtitles" +msgid "" msgstr "" msgctxt "#30601" @@ -761,7 +761,7 @@ msgid "" msgstr "" msgctxt "#30615" -msgid "Cancel" +msgid "" msgstr "" msgctxt "#30616" @@ -777,7 +777,7 @@ msgid "" msgstr "" msgctxt "#30619" -msgid "Port" +msgid "" msgstr "" msgctxt "#30620" @@ -821,7 +821,7 @@ msgid "IP whitelist (comma delimited)" msgstr "" msgctxt "#30630" -msgid "Save" +msgid "" msgstr "" msgctxt "#30631" @@ -937,7 +937,7 @@ msgid "Enter a name for this user" msgstr "" msgctxt "#30659" -msgid "User is now '%s'" +msgid "User is now \"%s\"" msgstr "" msgctxt "#30660" @@ -961,15 +961,15 @@ msgid "Switch user" msgstr "" msgctxt "#30665" -msgid "Switch to '%s' now?" +msgid "Switch to \"%s\" now?" msgstr "" msgctxt "#30666" -msgid "%s removed" +msgid "\"%s\" removed" msgstr "" msgctxt "#30667" -msgid "Renamed '%s' to '%s'" +msgid "Renamed \"%s\" to \"%s\"" msgstr "" msgctxt "#30668" @@ -1113,7 +1113,7 @@ msgid "Play with subtitles" msgstr "" msgctxt "#30703" -msgid "Are you sure?" +msgid "" msgstr "" msgctxt "#30704" @@ -1257,7 +1257,7 @@ msgid "" msgstr "" msgctxt "#30739" -msgid "" +msgid "Subscribers" msgstr "" msgctxt "#30740" @@ -1477,11 +1477,11 @@ msgid "Views count display colour" msgstr "" msgctxt "#30794" -msgid "Likes count display colour" +msgid "Subscriber/Likes count display colour" msgstr "" msgctxt "#30795" -msgid "Comments count display colour" +msgid "Videos/Comments count display colour" msgstr "" msgctxt "#30796" @@ -1580,6 +1580,21 @@ msgctxt "#30819" msgid "Play from start" msgstr "" +msgctxt "#30820" +msgid "Podcast" +msgstr "" + +# msgctxt "Addon Summary" +# msgid "Plugin for YouTube" +# msgstr "" +# msgctxt "Addon Description" +# msgid "YouTube is a one of the biggest video-sharing websites of the world." +# msgstr "" +# Kodion Settings +#~ msgctxt "#30000" +#~ msgid "General" +#~ msgstr "Chung" + #~ msgctxt "#30001" #~ msgid "Username" #~ msgstr "Tên người dùng" diff --git a/plugin.video.youtube/resources/language/resource.language.zh_cn/strings.po b/plugin.video.youtube/resources/language/resource.language.zh_cn/strings.po index 54d12a68d0..d0bd568df2 100644 --- a/plugin.video.youtube/resources/language/resource.language.zh_cn/strings.po +++ b/plugin.video.youtube/resources/language/resource.language.zh_cn/strings.po @@ -31,13 +31,14 @@ msgstr "此插件未被谷歌认可" # msgctxt "Addon Summary" # msgid "Plugin for YouTube" -# msgstr "YouTube 插件" +# msgstr "" # msgctxt "Addon Description" # msgid "YouTube is a one of the biggest video-sharing websites of the world." -# msgstr "YouTube 是全世界最大的视频分享网站。" +# msgstr "" +# Kodion Settings msgctxt "#30000" -msgid "General" -msgstr "常规" +msgid "" +msgstr "" msgctxt "#30001" msgid "" @@ -149,8 +150,8 @@ msgid "Configure %s?" msgstr "" msgctxt "#30031" -msgid "Advanced" -msgstr "高级" +msgid "" +msgstr "" msgctxt "#30032" msgid "View: TV Shows" @@ -215,8 +216,8 @@ msgid "Watch Later" msgstr "稍后观看" msgctxt "#30108" -msgid "Remove" -msgstr "移除" +msgid "" +msgstr "" msgctxt "#30109" msgid "" @@ -235,8 +236,8 @@ msgid "Sign Out" msgstr "登出" msgctxt "#30113" -msgid "Rename" -msgstr "重命名" +msgid "" +msgstr "" msgctxt "#30114" msgid "Confirm delete" @@ -255,8 +256,8 @@ msgid "Remove \"%s\"?" msgstr "移除 \"%s\"?" msgctxt "#30118" -msgid "Delete" -msgstr "删除" +msgid "" +msgstr "" msgctxt "#30119" msgid "Please wait..." @@ -299,12 +300,12 @@ msgstr "" # YouTube # empty strings from id 30206 to 30499 msgctxt "#30500" -msgid "Channels" -msgstr "频道" +msgid "" +msgstr "" msgctxt "#30501" -msgid "Playlists" -msgstr "播放列表" +msgid "" +msgstr "" msgctxt "#30502" msgid "Go to %s" @@ -359,8 +360,8 @@ msgid "Related Videos" msgstr "相关视频" msgctxt "#30515" -msgid "Auto-Remove from 'Watch Later'" -msgstr "从 “稍后观看” 中自动移除" +msgid "Auto-Remove from Watch Later" +msgstr "" msgctxt "#30516" msgid "Folders" @@ -383,16 +384,16 @@ msgid "Add to..." msgstr "添加到..." msgctxt "#30521" -msgid "Select playlist" -msgstr "选择播放列表" +msgid "" +msgstr "" msgctxt "#30522" -msgid "New playlist..." -msgstr "新建播放列表..." +msgid "" +msgstr "" msgctxt "#30523" -msgid "Language" -msgstr "语音" +msgid "" +msgstr "" msgctxt "#30524" msgid "Select language" @@ -423,20 +424,20 @@ msgid "I dislike this" msgstr "我要踩一下" msgctxt "#30531" -msgid "Play all" -msgstr "全部播放" +msgid "" +msgstr "" msgctxt "#30532" -msgid "Default" -msgstr "默认" +msgid "" +msgstr "" msgctxt "#30533" msgid "Reverse" msgstr "反向" msgctxt "#30534" -msgid "Shuffle" -msgstr "任意" +msgid "" +msgstr "" msgctxt "#30535" msgid "Select the order of the playlist" @@ -455,8 +456,8 @@ msgid "Disliked Videos" msgstr "踩过的视频" msgctxt "#30539" -msgid "Live" -msgstr "直播" +msgid "" +msgstr "" msgctxt "#30540" msgid "Play with..." @@ -471,8 +472,8 @@ msgid "rtmpe streams are not supported" msgstr "不支持 RTMPE 流" msgctxt "#30543" -msgid "Refresh" -msgstr "刷新" +msgid "" +msgstr "" msgctxt "#30544" msgid "More Links from the description" @@ -483,24 +484,24 @@ msgid "No further links found." msgstr "沒有符合此描述内容的其他链接。" msgctxt "#30546" -msgid "Please log in twice!" -msgstr "请登录两次!" +msgid "Please complete all login prompts" +msgstr "" msgctxt "#30547" -msgid "You must enable two applications so that YouTube is functioning properly." -msgstr "您必需启用至少两个应用,Youtube 插件才能正常运行。" +msgid "You may be prompted to enable two applications so that YouTube is functioning properly." +msgstr "" msgctxt "#30548" -msgid "More..." -msgstr "更多..." +msgid "" +msgstr "" msgctxt "#30549" msgid "No videos streams found" msgstr "沒有找到视频流" msgctxt "#30550" -msgid "Region" -msgstr "区域" +msgid "" +msgstr "" msgctxt "#30551" msgid "Recommendations" @@ -539,15 +540,15 @@ msgid "Delete settings.xml" msgstr "删除 settings.xml" msgctxt "#30560" -msgid "Subtitle language" -msgstr "字幕语言" +msgid "" +msgstr "" msgctxt "#30561" -msgid "None" -msgstr "无" +msgid "" +msgstr "" msgctxt "#30562" -msgid "" +msgid "View all" msgstr "" msgctxt "#30563" @@ -563,8 +564,8 @@ msgid "" msgstr "" msgctxt "#30566" -msgid "Prompt" -msgstr "提示" +msgid "" +msgstr "" msgctxt "#30567" msgid "Set as Watch Later" @@ -575,12 +576,12 @@ msgid "Remove as Watch Later" msgstr "从稍后观看中移除" msgctxt "#30569" -msgid "Are you sure you want to remove '%s' as your Watch Later list?" -msgstr "确定要将 '%s' 从稍后观看列表中移除?" +msgid "Are you sure you want to remove \"%s\" as your Watch Later list?" +msgstr "" msgctxt "#30570" -msgid "Are you sure you want to replace your current Watch Later list with '%s'?" -msgstr "确定要用 '%s' 替换当前的稍后观看列表?" +msgid "Are you sure you want to replace your current Watch Later list with \"%s\"?" +msgstr "" msgctxt "#30571" msgid "Set as History" @@ -591,12 +592,12 @@ msgid "Remove as History" msgstr "从历史记录中移除" msgctxt "#30573" -msgid "Are you sure you want to remove '%s' as your History list?" -msgstr "确定要将 '%s' 从历史记录列表中移除?" +msgid "Are you sure you want to remove \"%s\" as your History list?" +msgstr "" msgctxt "#30574" -msgid "Are you sure you want to replace your current History list with '%s'?" -msgstr "确定要用 '%s' 替换当前的历史记录列表?" +msgid "Are you sure you want to replace your current History list with \"%s\"?" +msgstr "" msgctxt "#30575" msgid "Succeeded" @@ -607,8 +608,8 @@ msgid "Failed" msgstr "失败" msgctxt "#30577" -msgid "Settings" -msgstr "设置" +msgid "" +msgstr "" msgctxt "#30578" msgid "Force SSL certificate verification" @@ -631,8 +632,8 @@ msgid "Autoplay suggested videos" msgstr "自动播放推荐的视频" msgctxt "#30583" -msgid "Automatic" -msgstr "自动" +msgid "" +msgstr "" msgctxt "#30584" msgid "My Subscriptions (Filtered)" @@ -691,15 +692,15 @@ msgid "Updated: %s" msgstr "已更新:%s" msgctxt "#30598" -msgid "Personal API keys enabled" -msgstr "允许私人 API 密钥" +msgid "" +msgstr "" msgctxt "#30599" msgid "Failed to enable personal API keys. Missing: %s" msgstr "允许私人 API 密钥失败。缺失:%s" msgctxt "#30600" -msgid "Subtitles" +msgid "" msgstr "" msgctxt "#30601" @@ -759,8 +760,8 @@ msgid "" msgstr "" msgctxt "#30615" -msgid "Cancel" -msgstr "取消" +msgid "" +msgstr "" msgctxt "#30616" msgid "" @@ -775,8 +776,8 @@ msgid "" msgstr "" msgctxt "#30619" -msgid "Port" -msgstr "端口" +msgid "" +msgstr "" msgctxt "#30620" msgid "Port %s already in use. Cannot start http server." @@ -819,8 +820,8 @@ msgid "IP whitelist (comma delimited)" msgstr "IP 白名单(逗号分隔)" msgctxt "#30630" -msgid "Save" -msgstr "保存" +msgid "" +msgstr "" msgctxt "#30631" msgid "Successfully updated: %s" @@ -935,8 +936,8 @@ msgid "Enter a name for this user" msgstr "输入该用户的名称" msgctxt "#30659" -msgid "User is now '%s'" -msgstr "用户现在是 '%s'" +msgid "User is now \"%s\"" +msgstr "" msgctxt "#30660" msgid "Users" @@ -959,16 +960,16 @@ msgid "Switch user" msgstr "切换用户" msgctxt "#30665" -msgid "Switch to '%s' now?" -msgstr "切换到 '%s' ?" +msgid "Switch to \"%s\" now?" +msgstr "" msgctxt "#30666" -msgid "%s removed" +msgid "\"%s\" removed" msgstr "" msgctxt "#30667" -msgid "Renamed '%s' to '%s'" -msgstr "已重命名 '%s' 为 '%s'" +msgid "Renamed \"%s\" to \"%s\"" +msgstr "" msgctxt "#30668" msgid "Play count minimum percent" @@ -1111,8 +1112,8 @@ msgid "Play with subtitles" msgstr "播放字幕" msgctxt "#30703" -msgid "Are you sure?" -msgstr "你确定吗?" +msgid "" +msgstr "" msgctxt "#30704" msgid "Use YouTube website urls with default player" @@ -1255,7 +1256,7 @@ msgid "" msgstr "" msgctxt "#30739" -msgid "" +msgid "Subscribers" msgstr "" msgctxt "#30740" @@ -1475,11 +1476,11 @@ msgid "Views count display colour" msgstr "" msgctxt "#30794" -msgid "Likes count display colour" +msgid "Subscriber/Likes count display colour" msgstr "" msgctxt "#30795" -msgid "Comments count display colour" +msgid "Videos/Comments count display colour" msgstr "" msgctxt "#30796" @@ -1578,6 +1579,166 @@ msgctxt "#30819" msgid "Play from start" msgstr "" +msgctxt "#30820" +msgid "Podcast" +msgstr "" + +#~ msgctxt "#30515" +#~ msgid "Auto-Remove from 'Watch Later'" +#~ msgstr "从 “稍后观看” 中自动移除" + +#~ msgctxt "#30569" +#~ msgid "Are you sure you want to remove '%s' as your Watch Later list?" +#~ msgstr "确定要将 '%s' 从稍后观看列表中移除?" + +#~ msgctxt "#30570" +#~ msgid "Are you sure you want to replace your current Watch Later list with '%s'?" +#~ msgstr "确定要用 '%s' 替换当前的稍后观看列表?" + +#~ msgctxt "#30573" +#~ msgid "Are you sure you want to remove '%s' as your History list?" +#~ msgstr "确定要将 '%s' 从历史记录列表中移除?" + +#~ msgctxt "#30574" +#~ msgid "Are you sure you want to replace your current History list with '%s'?" +#~ msgstr "确定要用 '%s' 替换当前的历史记录列表?" + +#~ msgctxt "#30659" +#~ msgid "User is now '%s'" +#~ msgstr "用户现在是 '%s'" + +#~ msgctxt "#30665" +#~ msgid "Switch to '%s' now?" +#~ msgstr "切换到 '%s' ?" + +#~ msgctxt "#30667" +#~ msgid "Renamed '%s' to '%s'" +#~ msgstr "已重命名 '%s' 为 '%s'" + +# msgctxt "Addon Summary" +# msgid "Plugin for YouTube" +# msgstr "YouTube 插件" +# msgctxt "Addon Description" +# msgid "YouTube is a one of the biggest video-sharing websites of the world." +# msgstr "YouTube 是全世界最大的视频分享网站。" +#~ msgctxt "#30000" +#~ msgid "General" +#~ msgstr "常规" + +#~ msgctxt "#30031" +#~ msgid "Advanced" +#~ msgstr "高级" + +#~ msgctxt "#30108" +#~ msgid "Remove" +#~ msgstr "移除" + +#~ msgctxt "#30113" +#~ msgid "Rename" +#~ msgstr "重命名" + +#~ msgctxt "#30118" +#~ msgid "Delete" +#~ msgstr "删除" + +# YouTube +# empty strings from id 30206 to 30499 +#~ msgctxt "#30500" +#~ msgid "Channels" +#~ msgstr "频道" + +#~ msgctxt "#30501" +#~ msgid "Playlists" +#~ msgstr "播放列表" + +#~ msgctxt "#30521" +#~ msgid "Select playlist" +#~ msgstr "选择播放列表" + +#~ msgctxt "#30522" +#~ msgid "New playlist..." +#~ msgstr "新建播放列表..." + +#~ msgctxt "#30523" +#~ msgid "Language" +#~ msgstr "语音" + +#~ msgctxt "#30531" +#~ msgid "Play all" +#~ msgstr "全部播放" + +#~ msgctxt "#30532" +#~ msgid "Default" +#~ msgstr "默认" + +#~ msgctxt "#30534" +#~ msgid "Shuffle" +#~ msgstr "任意" + +#~ msgctxt "#30539" +#~ msgid "Live" +#~ msgstr "直播" + +#~ msgctxt "#30543" +#~ msgid "Refresh" +#~ msgstr "刷新" + +#~ msgctxt "#30548" +#~ msgid "More..." +#~ msgstr "更多..." + +#~ msgctxt "#30550" +#~ msgid "Region" +#~ msgstr "区域" + +#~ msgctxt "#30560" +#~ msgid "Subtitle language" +#~ msgstr "字幕语言" + +#~ msgctxt "#30561" +#~ msgid "None" +#~ msgstr "无" + +#~ msgctxt "#30566" +#~ msgid "Prompt" +#~ msgstr "提示" + +#~ msgctxt "#30577" +#~ msgid "Settings" +#~ msgstr "设置" + +#~ msgctxt "#30583" +#~ msgid "Automatic" +#~ msgstr "自动" + +#~ msgctxt "#30598" +#~ msgid "Personal API keys enabled" +#~ msgstr "允许私人 API 密钥" + +#~ msgctxt "#30615" +#~ msgid "Cancel" +#~ msgstr "取消" + +#~ msgctxt "#30619" +#~ msgid "Port" +#~ msgstr "端口" + +#~ msgctxt "#30630" +#~ msgid "Save" +#~ msgstr "保存" + +#~ msgctxt "#30703" +#~ msgid "Are you sure?" +#~ msgstr "你确定吗?" + +#~ msgctxt "#30546" +#~ msgid "Please log in twice!" +#~ msgstr "请登录两次!" + +#~ msgctxt "#30547" +#~ msgid "You must enable two applications so that YouTube is functioning properly." +#~ msgstr "您必需启用至少两个应用,Youtube 插件才能正常运行。" + #~ msgctxt "#30001" #~ msgid "Username" #~ msgstr "账号" diff --git a/plugin.video.youtube/resources/language/resource.language.zh_tw/strings.po b/plugin.video.youtube/resources/language/resource.language.zh_tw/strings.po index 98139859b2..5bd7d88e7b 100644 --- a/plugin.video.youtube/resources/language/resource.language.zh_tw/strings.po +++ b/plugin.video.youtube/resources/language/resource.language.zh_tw/strings.po @@ -31,14 +31,14 @@ msgstr "此附加元件未由Google支持" # msgctxt "Addon Summary" # msgid "Plugin for YouTube" -# msgstr "YouTube 附加元件" +# msgstr "" # msgctxt "Addon Description" # msgid "YouTube is a one of the biggest video-sharing websites of the world." -# msgstr "YouTube 是全球最大的一個影片分享網站。" +# msgstr "" # Kodion Settings msgctxt "#30000" -msgid "General" -msgstr "一般設定" +msgid "" +msgstr "" msgctxt "#30001" msgid "" @@ -151,8 +151,8 @@ msgid "Configure %s?" msgstr "" msgctxt "#30031" -msgid "Advanced" -msgstr "進階設定" +msgid "" +msgstr "" msgctxt "#30032" msgid "View: TV Shows" @@ -217,8 +217,8 @@ msgid "Watch Later" msgstr "稍後觀看" msgctxt "#30108" -msgid "Remove" -msgstr "移除" +msgid "" +msgstr "" msgctxt "#30109" msgid "" @@ -237,8 +237,8 @@ msgid "Sign Out" msgstr "登出" msgctxt "#30113" -msgid "Rename" -msgstr "重新命名" +msgid "" +msgstr "" msgctxt "#30114" msgid "Confirm delete" @@ -257,8 +257,8 @@ msgid "Remove \"%s\"?" msgstr "搬移 \"%s\"?" msgctxt "#30118" -msgid "Delete" -msgstr "刪除" +msgid "" +msgstr "" msgctxt "#30119" msgid "Please wait..." @@ -301,12 +301,12 @@ msgstr "" # YouTube # empty strings from id 30206 to 30499 msgctxt "#30500" -msgid "Channels" -msgstr "頻道" +msgid "" +msgstr "" msgctxt "#30501" -msgid "Playlists" -msgstr "播放清單" +msgid "" +msgstr "" msgctxt "#30502" msgid "Go to %s" @@ -361,8 +361,8 @@ msgid "Related Videos" msgstr "相關影片" msgctxt "#30515" -msgid "Auto-Remove from 'Watch Later'" -msgstr "自動刪除「稍後觀看」的影片" +msgid "Auto-Remove from Watch Later" +msgstr "" msgctxt "#30516" msgid "Folders" @@ -385,16 +385,16 @@ msgid "Add to..." msgstr "新增至 ..." msgctxt "#30521" -msgid "Select playlist" -msgstr "選擇播放清單" +msgid "" +msgstr "" msgctxt "#30522" -msgid "New playlist..." -msgstr "新播放清單..." +msgid "" +msgstr "" msgctxt "#30523" -msgid "Language" -msgstr "語言" +msgid "" +msgstr "" msgctxt "#30524" msgid "Select language" @@ -425,20 +425,20 @@ msgid "I dislike this" msgstr "不喜歡這個" msgctxt "#30531" -msgid "Play all" -msgstr "全部播放" +msgid "" +msgstr "" msgctxt "#30532" -msgid "Default" -msgstr "預設" +msgid "" +msgstr "" msgctxt "#30533" msgid "Reverse" msgstr "反向" msgctxt "#30534" -msgid "Shuffle" -msgstr "隨機" +msgid "" +msgstr "" msgctxt "#30535" msgid "Select the order of the playlist" @@ -457,8 +457,8 @@ msgid "Disliked Videos" msgstr "不喜歡的影片" msgctxt "#30539" -msgid "Live" -msgstr "直播" +msgid "" +msgstr "" msgctxt "#30540" msgid "Play with..." @@ -473,8 +473,8 @@ msgid "rtmpe streams are not supported" msgstr "不支援 RTMPE 格式" msgctxt "#30543" -msgid "Refresh" -msgstr "重新整理" +msgid "" +msgstr "" msgctxt "#30544" msgid "More Links from the description" @@ -485,24 +485,24 @@ msgid "No further links found." msgstr "沒有此範圍的其他連結。" msgctxt "#30546" -msgid "Please log in twice!" -msgstr "請登入兩次!" +msgid "Please complete all login prompts" +msgstr "" msgctxt "#30547" -msgid "You must enable two applications so that YouTube is functioning properly." -msgstr "您要啟用兩個應用,Youtube 才能發揮完整的功能。" +msgid "You may be prompted to enable two applications so that YouTube is functioning properly." +msgstr "" msgctxt "#30548" -msgid "More..." -msgstr "更多選項 ..." +msgid "" +msgstr "" msgctxt "#30549" msgid "No videos streams found" msgstr "沒有影片串流" msgctxt "#30550" -msgid "Region" -msgstr "地區" +msgid "" +msgstr "" msgctxt "#30551" msgid "Recommendations" @@ -541,15 +541,15 @@ msgid "Delete settings.xml" msgstr "刪除 settings.xml" msgctxt "#30560" -msgid "Subtitle language" -msgstr "字幕語言" +msgid "" +msgstr "" msgctxt "#30561" -msgid "None" -msgstr "無" +msgid "" +msgstr "" msgctxt "#30562" -msgid "" +msgid "View all" msgstr "" msgctxt "#30563" @@ -565,8 +565,8 @@ msgid "" msgstr "" msgctxt "#30566" -msgid "Prompt" -msgstr "提示" +msgid "" +msgstr "" msgctxt "#30567" msgid "Set as Watch Later" @@ -577,12 +577,12 @@ msgid "Remove as Watch Later" msgstr "從稍後播放移除" msgctxt "#30569" -msgid "Are you sure you want to remove '%s' as your Watch Later list?" -msgstr "你確定要把 '%s' 從稍後播放移除?" +msgid "Are you sure you want to remove \"%s\" as your Watch Later list?" +msgstr "" msgctxt "#30570" -msgid "Are you sure you want to replace your current Watch Later list with '%s'?" -msgstr "你確定要用 '%s' 取代現有稍後播放列表?" +msgid "Are you sure you want to replace your current Watch Later list with \"%s\"?" +msgstr "" msgctxt "#30571" msgid "Set as History" @@ -593,12 +593,12 @@ msgid "Remove as History" msgstr "取消設為歷史播放清單" msgctxt "#30573" -msgid "Are you sure you want to remove '%s' as your History list?" -msgstr "你確定要取消 '%s' 做為歷史播放列表?" +msgid "Are you sure you want to remove \"%s\" as your History list?" +msgstr "" msgctxt "#30574" -msgid "Are you sure you want to replace your current History list with '%s'?" -msgstr "你確定要用 '%s' 取代現有歷史播放列表?" +msgid "Are you sure you want to replace your current History list with \"%s\"?" +msgstr "" msgctxt "#30575" msgid "Succeeded" @@ -609,8 +609,8 @@ msgid "Failed" msgstr "失敗" msgctxt "#30577" -msgid "Settings" -msgstr "設定" +msgid "" +msgstr "" msgctxt "#30578" msgid "Force SSL certificate verification" @@ -633,8 +633,8 @@ msgid "Autoplay suggested videos" msgstr "自動播放建議影片" msgctxt "#30583" -msgid "Automatic" -msgstr "自動" +msgid "" +msgstr "" msgctxt "#30584" msgid "My Subscriptions (Filtered)" @@ -693,15 +693,15 @@ msgid "Updated: %s" msgstr "更新: %s" msgctxt "#30598" -msgid "Personal API keys enabled" -msgstr "個人 API 金鑰啟用" +msgid "" +msgstr "" msgctxt "#30599" msgid "Failed to enable personal API keys. Missing: %s" msgstr "無法啟用個人 API 金鑰,缺少: %s" msgctxt "#30600" -msgid "Subtitles" +msgid "" msgstr "" msgctxt "#30601" @@ -761,8 +761,8 @@ msgid "" msgstr "" msgctxt "#30615" -msgid "Cancel" -msgstr "取消" +msgid "" +msgstr "" msgctxt "#30616" msgid "" @@ -777,8 +777,8 @@ msgid "" msgstr "" msgctxt "#30619" -msgid "Port" -msgstr "Port" +msgid "" +msgstr "" msgctxt "#30620" msgid "Port %s already in use. Cannot start http server." @@ -821,8 +821,8 @@ msgid "IP whitelist (comma delimited)" msgstr "IP 白名單 (使用,分隔)" msgctxt "#30630" -msgid "Save" -msgstr "儲存" +msgid "" +msgstr "" msgctxt "#30631" msgid "Successfully updated: %s" @@ -937,8 +937,8 @@ msgid "Enter a name for this user" msgstr "輸入使用者名稱" msgctxt "#30659" -msgid "User is now '%s'" -msgstr "使用者名稱為 '%s'" +msgid "User is now \"%s\"" +msgstr "" msgctxt "#30660" msgid "Users" @@ -961,16 +961,16 @@ msgid "Switch user" msgstr "切換使用者" msgctxt "#30665" -msgid "Switch to '%s' now?" -msgstr "切換為 '%s' ?" +msgid "Switch to \"%s\" now?" +msgstr "" msgctxt "#30666" -msgid "%s removed" +msgid "\"%s\" removed" msgstr "" msgctxt "#30667" -msgid "Renamed '%s' to '%s'" -msgstr "已重新命名 '%s' 為 '%s'" +msgid "Renamed \"%s\" to \"%s\"" +msgstr "" msgctxt "#30668" msgid "Play count minimum percent" @@ -1113,8 +1113,8 @@ msgid "Play with subtitles" msgstr "播放字幕" msgctxt "#30703" -msgid "Are you sure?" -msgstr "確定?" +msgid "" +msgstr "" msgctxt "#30704" msgid "Use YouTube website urls with default player" @@ -1257,7 +1257,7 @@ msgid "" msgstr "" msgctxt "#30739" -msgid "" +msgid "Subscribers" msgstr "" msgctxt "#30740" @@ -1477,11 +1477,11 @@ msgid "Views count display colour" msgstr "" msgctxt "#30794" -msgid "Likes count display colour" +msgid "Subscriber/Likes count display colour" msgstr "" msgctxt "#30795" -msgid "Comments count display colour" +msgid "Videos/Comments count display colour" msgstr "" msgctxt "#30796" @@ -1580,6 +1580,167 @@ msgctxt "#30819" msgid "Play from start" msgstr "" +msgctxt "#30820" +msgid "Podcast" +msgstr "" + +#~ msgctxt "#30515" +#~ msgid "Auto-Remove from 'Watch Later'" +#~ msgstr "自動刪除「稍後觀看」的影片" + +#~ msgctxt "#30569" +#~ msgid "Are you sure you want to remove '%s' as your Watch Later list?" +#~ msgstr "你確定要把 '%s' 從稍後播放移除?" + +#~ msgctxt "#30570" +#~ msgid "Are you sure you want to replace your current Watch Later list with '%s'?" +#~ msgstr "你確定要用 '%s' 取代現有稍後播放列表?" + +#~ msgctxt "#30573" +#~ msgid "Are you sure you want to remove '%s' as your History list?" +#~ msgstr "你確定要取消 '%s' 做為歷史播放列表?" + +#~ msgctxt "#30574" +#~ msgid "Are you sure you want to replace your current History list with '%s'?" +#~ msgstr "你確定要用 '%s' 取代現有歷史播放列表?" + +#~ msgctxt "#30659" +#~ msgid "User is now '%s'" +#~ msgstr "使用者名稱為 '%s'" + +#~ msgctxt "#30665" +#~ msgid "Switch to '%s' now?" +#~ msgstr "切換為 '%s' ?" + +#~ msgctxt "#30667" +#~ msgid "Renamed '%s' to '%s'" +#~ msgstr "已重新命名 '%s' 為 '%s'" + +# msgctxt "Addon Summary" +# msgid "Plugin for YouTube" +# msgstr "YouTube 附加元件" +# msgctxt "Addon Description" +# msgid "YouTube is a one of the biggest video-sharing websites of the world." +# msgstr "YouTube 是全球最大的一個影片分享網站。" +# Kodion Settings +#~ msgctxt "#30000" +#~ msgid "General" +#~ msgstr "一般設定" + +#~ msgctxt "#30031" +#~ msgid "Advanced" +#~ msgstr "進階設定" + +#~ msgctxt "#30108" +#~ msgid "Remove" +#~ msgstr "移除" + +#~ msgctxt "#30113" +#~ msgid "Rename" +#~ msgstr "重新命名" + +#~ msgctxt "#30118" +#~ msgid "Delete" +#~ msgstr "刪除" + +# YouTube +# empty strings from id 30206 to 30499 +#~ msgctxt "#30500" +#~ msgid "Channels" +#~ msgstr "頻道" + +#~ msgctxt "#30501" +#~ msgid "Playlists" +#~ msgstr "播放清單" + +#~ msgctxt "#30521" +#~ msgid "Select playlist" +#~ msgstr "選擇播放清單" + +#~ msgctxt "#30522" +#~ msgid "New playlist..." +#~ msgstr "新播放清單..." + +#~ msgctxt "#30523" +#~ msgid "Language" +#~ msgstr "語言" + +#~ msgctxt "#30531" +#~ msgid "Play all" +#~ msgstr "全部播放" + +#~ msgctxt "#30532" +#~ msgid "Default" +#~ msgstr "預設" + +#~ msgctxt "#30534" +#~ msgid "Shuffle" +#~ msgstr "隨機" + +#~ msgctxt "#30539" +#~ msgid "Live" +#~ msgstr "直播" + +#~ msgctxt "#30543" +#~ msgid "Refresh" +#~ msgstr "重新整理" + +#~ msgctxt "#30548" +#~ msgid "More..." +#~ msgstr "更多選項 ..." + +#~ msgctxt "#30550" +#~ msgid "Region" +#~ msgstr "地區" + +#~ msgctxt "#30560" +#~ msgid "Subtitle language" +#~ msgstr "字幕語言" + +#~ msgctxt "#30561" +#~ msgid "None" +#~ msgstr "無" + +#~ msgctxt "#30566" +#~ msgid "Prompt" +#~ msgstr "提示" + +#~ msgctxt "#30577" +#~ msgid "Settings" +#~ msgstr "設定" + +#~ msgctxt "#30583" +#~ msgid "Automatic" +#~ msgstr "自動" + +#~ msgctxt "#30598" +#~ msgid "Personal API keys enabled" +#~ msgstr "個人 API 金鑰啟用" + +#~ msgctxt "#30615" +#~ msgid "Cancel" +#~ msgstr "取消" + +#~ msgctxt "#30619" +#~ msgid "Port" +#~ msgstr "Port" + +#~ msgctxt "#30630" +#~ msgid "Save" +#~ msgstr "儲存" + +#~ msgctxt "#30703" +#~ msgid "Are you sure?" +#~ msgstr "確定?" + +#~ msgctxt "#30546" +#~ msgid "Please log in twice!" +#~ msgstr "請登入兩次!" + +#~ msgctxt "#30547" +#~ msgid "You must enable two applications so that YouTube is functioning properly." +#~ msgstr "您要啟用兩個應用,Youtube 才能發揮完整的功能。" + #~ msgctxt "#30001" #~ msgid "Username" #~ msgstr "帳戶" diff --git a/plugin.video.youtube/resources/lib/youtube_authentication.py b/plugin.video.youtube/resources/lib/youtube_authentication.py index d32ca5b176..e2f04c9424 100644 --- a/plugin.video.youtube/resources/lib/youtube_authentication.py +++ b/plugin.video.youtube/resources/lib/youtube_authentication.py @@ -167,5 +167,5 @@ def reset_access_tokens(addon_id): return context = XbmcContext(params={'addon_id': addon_id}) context.get_access_manager().update_access_token( - addon_id, access_token='', refresh_token='' + addon_id, access_token='', expiry=-1, refresh_token='' ) diff --git a/plugin.video.youtube/resources/lib/youtube_plugin/__init__.py b/plugin.video.youtube/resources/lib/youtube_plugin/__init__.py index a2d997b5f2..7cfa9cb14c 100644 --- a/plugin.video.youtube/resources/lib/youtube_plugin/__init__.py +++ b/plugin.video.youtube/resources/lib/youtube_plugin/__init__.py @@ -13,15 +13,15 @@ key_sets = { 'youtube-tv': { - 'client_id': 'ODYxNTU2NzA4NDU0LWQ2ZGxtM2xoMDVpZGQ4bnBlazE4azZiZThiYTNvYzY4', - 'api_key': 'QUl6YVN5QzZmdlpTSkhBN1Z6NWo4akNpS1J0N3RVSU9xakUyTjNn', - 'client_secret': 'U2JvVmhvRzlzMHJOYWZpeENTR0dLWEFU' + 'api_key': '', + 'client_id': '', + 'client_secret': '', }, 'provided': { '0': { - 'client_id': '', 'api_key': '', - 'client_secret': '' + 'client_id': '', + 'client_secret': '', } } } diff --git a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/__init__.py b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/__init__.py index cb913bc4ac..9b3fdb3047 100644 --- a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/__init__.py +++ b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/__init__.py @@ -10,7 +10,6 @@ from __future__ import absolute_import, division, unicode_literals -from . import logger from .abstract_provider import ( # Abstract provider for implementation by the user AbstractProvider, diff --git a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/abstract_provider.py b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/abstract_provider.py index b3892d0d2a..9038e3646d 100644 --- a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/abstract_provider.py +++ b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/abstract_provider.py @@ -12,7 +12,14 @@ import re -from .constants import CHECK_SETTINGS, CONTENT, PATHS, REROUTE_PATH +from .constants import ( + CHECK_SETTINGS, + CONTAINER_ID, + CONTAINER_POSITION, + CONTENT, + PATHS, + REROUTE_PATH, +) from .exceptions import KodionException from .items import ( DirectoryItem, @@ -26,6 +33,7 @@ class AbstractProvider(object): RESULT_CACHE_TO_DISC = 'cache_to_disc' # (bool) + RESULT_FALLBACK = 'fallback' # (bool) RESULT_FORCE_RESOLVE = 'force_resolve' # (bool) RESULT_UPDATE_LISTING = 'update_listing' # (bool) @@ -61,59 +69,61 @@ def __init__(self): self.register_path(r''.join(( '^', PATHS.WATCH_LATER, - '/(?Padd|clear|list|remove)/?$' + '/(?Padd|clear|list|play|remove)/?$' )), self.on_watch_later) self.register_path(r''.join(( '^', PATHS.BOOKMARKS, - '/(?Padd|clear|list|remove)/?$' + '/(?Padd|clear|list|play|remove)/?$' )), self.on_bookmarks) self.register_path(r''.join(( '^', '(', PATHS.SEARCH, '|', PATHS.EXTERNAL_SEARCH, ')', - '/(?Pinput|query|list|remove|clear|rename)?/?$' + '/(?Pinput|input_prompt|query|list|remove|clear|rename)?/?$' )), self.on_search) self.register_path(r''.join(( '^', PATHS.HISTORY, - '/?$' + '/(?Pclear|list|mark_unwatched|mark_watched|play|remove|reset_resume)/?$' )), self.on_playback_history) self.register_path(r'(?P.*\/)extrafanart\/([\?#].+)?$', self.on_extra_fanart) @classmethod - def register_path(cls, re_path, method=None): + def register_path(cls, re_path, command=None): """ Registers a new method for the given regular expression :param re_path: regular expression of the path - :param method: method or function to be registered + :param command: command or function to be registered :return: """ - def wrapper(method): - if callable(method): - func = method + def wrapper(command): + if callable(command): + func = command else: - func = getattr(method, '__func__', None) + func = getattr(command, '__func__', None) if not callable(func): return None cls._dict_path[re.compile(re_path, re.UNICODE)] = func - return method + return command - if method: - return wrapper(method) + if command: + return wrapper(command) return wrapper def run_wizard(self, context): - settings = context.get_settings() + localize = context.localize + # ui local variable used for ui.get_view_manager() in unofficial version ui = context.get_ui() - context.send_notification(CHECK_SETTINGS, 'defer') + settings_state = {'state': 'defer'} + context.wakeup(CHECK_SETTINGS, timeout=5, payload=settings_state) wizard_steps = self.get_wizard_steps() @@ -122,9 +132,9 @@ def run_wizard(self, context): try: if wizard_steps and ui.on_yes_no_input( - context.localize('setup_wizard'), - (context.localize('setup_wizard.prompt') - % context.localize('setup_wizard.prompt.settings')) + localize('setup_wizard'), + (localize('setup_wizard.prompt') + % localize('setup_wizard.prompt.settings')) ): for wizard_step in wizard_steps: if callable(wizard_step): @@ -135,8 +145,10 @@ def run_wizard(self, context): else: step += 1 finally: + settings = context.get_settings(refresh=True) settings.setup_wizard_enabled(False) - context.send_notification(CHECK_SETTINGS, 'process') + settings_state['state'] = 'process' + context.wakeup(CHECK_SETTINGS, timeout=5, payload=settings_state) @staticmethod def get_wizard_steps(): @@ -159,9 +171,9 @@ def navigate(self, context): result, new_options = result options.update(new_options) - refresh = context.get_param('refresh') - if refresh is not None: - options[self.RESULT_UPDATE_LISTING] = bool(refresh) + if context.get_param('refresh'): + options[self.RESULT_CACHE_TO_DISC] = True + options[self.RESULT_UPDATE_LISTING] = True return result, options @@ -211,7 +223,14 @@ def on_goto_page(provider, context, re_match): else: page_token = '' params = dict(params, page=page, page_token=page_token) - return provider.reroute(context=context, path=path, params=params) + + if (not context.get_infobool('System.HasActiveModalDialog') + and context.is_plugin_path( + context.get_infolabel('Container.FolderPath'), + partial=True, + )): + return provider.reroute(context=context, path=path, params=params) + return provider.navigate(context.clone(path, params)) @staticmethod def on_reroute(provider, context, re_match): @@ -233,15 +252,32 @@ def reroute(self, context, path=None, params=None, uri=None): path, params = uri if not path: + context.log_error('Rerouting - No route path') return False - if path == current_path and params == current_params: - if 'refresh' not in params: - return False + + window_fallback = params.pop('window_fallback', False) + window_replace = params.pop('window_replace', False) + window_return = params.pop('window_return', True) + + if window_fallback: + container_uri = context.get_infolabel('Container.FolderPath') + if context.is_plugin_path(container_uri): + context.log_debug('Rerouting - Fallback route not required') + return False, {self.RESULT_FALLBACK: False} + + if 'refresh' in params: + container = context.get_infolabel('System.CurrentControlId') + position = context.get_infolabel('Container.CurrentItem') params['refresh'] += 1 + elif path == current_path and params == current_params: + context.log_error('Rerouting - Unable to reroute to current path') + return False + else: + container = None + position = None result = None function_cache = context.get_function_cache() - window_return = params.pop('window_return', True) try: result, options = function_cache.run( self.navigate, @@ -250,19 +286,37 @@ def reroute(self, context, path=None, params=None, uri=None): context=context.clone(path, params), ) except Exception as exc: - context.log_error('Rerouting error: |{0}|'.format(exc)) + context.log_error('Rerouting - Error' + '\n\tException: {exc!r}'.format(exc=exc)) finally: - context.log_debug('Rerouting to |{path}| |{params}|{status}' - .format(path=path, - params=params, - status='' if result else ' failed')) - if not result: + uri = context.create_uri(path, params) + if result: + context.log_debug('Rerouting - Success' + '\n\tURI: {uri}' + '\n\tFallback: |{window_fallback}|' + '\n\tReplace: |{window_replace}|' + '\n\tReturn: |{window_return}|' + .format(uri=uri, + window_fallback=window_fallback, + window_replace=window_replace, + window_return=window_return)) + else: + context.log_debug('Rerouting - No results' + '\n\tURI: {uri}' + .format(uri=uri)) return False - context.get_ui().set_property(REROUTE_PATH, path) + + ui = context.get_ui() + ui.set_property(REROUTE_PATH, path) + if container and position: + ui.set_property(CONTAINER_ID, container) + ui.set_property(CONTAINER_POSITION, position) + context.execute(''.join(( - 'ActivateWindow(Videos, ', - context.create_uri(path, params), - ', return)' if window_return else ')', + 'ReplaceWindow' if window_replace else 'ActivateWindow', + '(Videos,', + uri, + ',return)' if window_return else ')', ))) return True @@ -274,12 +328,13 @@ def on_bookmarks(provider, context, re_match): def on_watch_later(provider, context, re_match): raise NotImplementedError() - def on_search_run(self, context, search_text): + def on_search_run(self, context, query): raise NotImplementedError() @staticmethod def on_search(provider, context, re_match): params = context.get_params() + localize = context.localize ui = context.get_ui() command = re_match.group('command') @@ -287,18 +342,33 @@ def on_search(provider, context, re_match): if not command or command == 'query': query = to_unicode(params.get('q', '')) - return provider.on_search_run(context=context, search_text=query) + if query: + return provider.on_search_run(context=context, query=query) + command = 'list' + context.set_path(PATHS.SEARCH, command) if command == 'remove': query = to_unicode(params.get('q', '')) + if not ui.on_yes_no_input( + localize('content.remove'), + localize('content.remove.check') % query, + ): + return False + search_history.del_item(query) ui.refresh_container() + + ui.show_notification( + localize('removed') % query, + time_ms=2500, + audible=False, + ) return True if command == 'rename': query = to_unicode(params.get('q', '')) result, new_query = ui.on_keyboard_input( - context.localize('search.rename'), query + localize('search.rename'), query ) if result: search_history.del_item(query) @@ -307,11 +377,23 @@ def on_search(provider, context, re_match): return True if command == 'clear': + if not ui.on_yes_no_input( + localize('search.clear'), + localize('content.clear.check') % localize('search.history') + ): + return False + search_history.clear() ui.refresh_container() + + ui.show_notification( + localize('completed'), + time_ms=2500, + audible=False, + ) return True - if command == 'input': + if command.startswith('input'): query = None # came from page 1 of search query by '..'/back # user doesn't want to input on this path @@ -327,7 +409,7 @@ def on_search(provider, context, re_match): query = to_unicode(cached) else: result, input_query = ui.on_keyboard_input( - context.localize('search.title') + localize('search.title') ) if result: query = input_query @@ -336,9 +418,13 @@ def on_search(provider, context, re_match): return False context.set_path(PATHS.SEARCH, 'query') - return provider.on_search_run(context=context, search_text=query) + return ( + provider.on_search_run(context=context, query=query), + {provider.RESULT_CACHE_TO_DISC: command != 'input_prompt'}, + ) - context.set_content(CONTENT.LIST_CONTENT) + context.set_content(CONTENT.LIST_CONTENT, + category_label=localize('search')) result = [] location = context.get_param('location', False) diff --git a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/compatibility/__init__.py b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/compatibility/__init__.py index 8e702ce5e9..57aaa22412 100644 --- a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/compatibility/__init__.py +++ b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/compatibility/__init__.py @@ -10,9 +10,10 @@ __all__ = ( 'BaseHTTPRequestHandler', 'TCPServer', + 'available_cpu_count', 'byte_string_type', - 'cpu_count', 'datetime_infolabel', + 'entity_escape', 'parse_qs', 'parse_qsl', 'quote', @@ -36,7 +37,6 @@ from html import unescape from http.server import BaseHTTPRequestHandler from socketserver import TCPServer - from os import cpu_count from urllib.parse import ( parse_qs, parse_qsl, @@ -54,17 +54,29 @@ import xbmcplugin import xbmcvfs + xbmc.LOGNOTICE = xbmc.LOGINFO xbmc.LOGSEVERE = xbmc.LOGFATAL string_type = str byte_string_type = bytes to_str = str + + + def entity_escape(text, + entities=str.maketrans({ + '&': '&', + '"': '"', + '<': '<', + '>': '>', + '\'': ''', + })): + return text.translate(entities) + # Compatibility shims for Kodi v18 and Python v2.7 except ImportError: from BaseHTTPServer import BaseHTTPRequestHandler from contextlib import contextmanager as _contextmanager - from multiprocessing import cpu_count from SocketServer import TCPServer from urllib import ( quote as _quote, @@ -130,11 +142,25 @@ def _file_closer(*args, **kwargs): string_type = basestring byte_string_type = (bytes, str) + def to_str(value): if isinstance(value, unicode): return value.encode('utf-8') return str(value) + + def entity_escape(text, + entities={ + '&': '&', + '"': '"', + '<': '<', + '>': '>', + '\'': ''', + }): + for key, value in entities.viewitems(): + text = text.replace(key, value) + return text + # Kodi v20+ if hasattr(xbmcgui.ListItem, 'setDateTime'): def datetime_infolabel(datetime_obj, *_args, **_kwargs): @@ -143,3 +169,27 @@ def datetime_infolabel(datetime_obj, *_args, **_kwargs): else: def datetime_infolabel(datetime_obj, str_format='%Y-%m-%d %H:%M:%S'): return datetime_obj.strftime(str_format) + + +_cpu_count = _sched_get_affinity = None +try: + from os import sched_getaffinity as _sched_getaffinity +except ImportError: + try: + from multiprocessing import cpu_count as _cpu_count + except ImportError: + pass + + +def available_cpu_count(): + if _sched_get_affinity: + # Equivalent to os.process_cpu_count() + return len(_sched_get_affinity(0)) or 1 + + if _cpu_count: + try: + return _cpu_count() or 1 + except NotImplementedError: + return 1 + + return 1 diff --git a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/constants/__init__.py b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/constants/__init__.py index 84a898be85..8453531695 100644 --- a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/constants/__init__.py +++ b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/constants/__init__.py @@ -16,6 +16,11 @@ const_settings as SETTINGS, const_sort_methods as SORT, ) +from .const_lang_region import ( + DEFAULT_LANGUAGES, + DEFAULT_REGIONS, + TRANSLATION_LANGUAGES, +) # Addon paths @@ -31,13 +36,17 @@ '0': False, '1': True, 'false': False, + 'False': False, 'true': True, + 'True': True, + 'None': None, + 'null': None, } # Flags ABORT_FLAG = 'abort_requested' BUSY_FLAG = 'busy' -WAIT_FLAG = 'builtin_running' +WAIT_END_FLAG = 'builtin_completed' # ListItem Properties CHANNEL_ID = 'channel_id' @@ -59,17 +68,20 @@ PLUGIN_WAKEUP = 'plugin_wakeup' PLUGIN_SLEEPING = 'plugin_sleeping' SERVER_WAKEUP = 'server_wakeup' -SERVER_POST_START = 'server_post_start' WAKEUP = 'wakeup' # Play options PLAY_FORCE_AUDIO = 'audio_only' PLAY_PROMPT_QUALITY = 'ask_for_quality' PLAY_PROMPT_SUBTITLES = 'prompt_for_subtitles' +PLAY_STRM = 'strm' PLAY_TIMESHIFT = 'timeshift' PLAY_WITH = 'play_with' # Stored data +CONTAINER_ID = 'container_id' +CONTAINER_FOCUS = 'container_focus' +CONTAINER_POSITION = 'container_position' CONTENT_TYPE = 'content_type' DEVELOPER_CONFIGS = 'configs' LICENSE_TOKEN = 'license_token' @@ -94,7 +106,7 @@ # Flags 'ABORT_FLAG', 'BUSY_FLAG', - 'WAIT_FLAG', + 'WAIT_END_FLAG', # ListItem properties 'CHANNEL_ID', @@ -115,7 +127,6 @@ # Sleep/wakeup states 'PLUGIN_SLEEPING', 'PLUGIN_WAKEUP', - 'SERVER_POST_START', 'SERVER_WAKEUP', 'WAKEUP', @@ -123,10 +134,14 @@ 'PLAY_FORCE_AUDIO', 'PLAY_PROMPT_QUALITY', 'PLAY_PROMPT_SUBTITLES', + 'PLAY_STRM', 'PLAY_TIMESHIFT', 'PLAY_WITH', # Stored data + 'CONTAINER_ID', + 'CONTAINER_FOCUS', + 'CONTAINER_POSITION', 'CONTENT_TYPE', 'DEVELOPER_CONFIGS', 'LICENSE_TOKEN', @@ -141,4 +156,9 @@ 'PATHS', 'SETTINGS', 'SORT', + + # Languages and Regions + 'DEFAULT_LANGUAGES', + 'DEFAULT_REGIONS', + 'TRANSLATION_LANGUAGES', ) diff --git a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/constants/const_lang_region.py b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/constants/const_lang_region.py new file mode 100644 index 0000000000..d045b78f61 --- /dev/null +++ b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/constants/const_lang_region.py @@ -0,0 +1,772 @@ +# -*- coding: utf-8 -*- +""" + + Copyright (C) 2014-2016 bromix (plugin.video.youtube) + Copyright (C) 2016-2024 plugin.video.youtube + + SPDX-License-Identifier: GPL-2.0-only + See LICENSES/GPL-2.0-only for more information. +""" + +from __future__ import absolute_import, division, unicode_literals + + +DEFAULT_LANGUAGES = {'items': [ + {'id': 'af', 'snippet': {'hl': 'af', 'name': 'Afrikaans'}}, + {'id': 'sq', 'snippet': {'hl': 'sq', 'name': 'Albanian'}}, + {'id': 'am', 'snippet': {'hl': 'am', 'name': 'Amharic'}}, + {'id': 'ar', 'snippet': {'hl': 'ar', 'name': 'Arabic'}}, + {'id': 'hy', 'snippet': {'hl': 'hy', 'name': 'Armenian'}}, + {'id': 'az', 'snippet': {'hl': 'az', 'name': 'Azerbaijani'}}, + {'id': 'eu', 'snippet': {'hl': 'eu', 'name': 'Basque'}}, + {'id': 'bn', 'snippet': {'hl': 'bn', 'name': 'Bengali'}}, + {'id': 'bg', 'snippet': {'hl': 'bg', 'name': 'Bulgarian'}}, + {'id': 'ca', 'snippet': {'hl': 'ca', 'name': 'Catalan'}}, + {'id': 'zh-CN', 'snippet': {'hl': 'zh-CN', 'name': 'Chinese'}}, + {'id': 'zh-HK', 'snippet': {'hl': 'zh-HK', 'name': 'Chinese (Hong Kong)'}}, + {'id': 'zh-TW', 'snippet': {'hl': 'zh-TW', 'name': 'Chinese (Taiwan)'}}, + {'id': 'hr', 'snippet': {'hl': 'hr', 'name': 'Croatian'}}, + {'id': 'cs', 'snippet': {'hl': 'cs', 'name': 'Czech'}}, + {'id': 'da', 'snippet': {'hl': 'da', 'name': 'Danish'}}, + {'id': 'nl', 'snippet': {'hl': 'nl', 'name': 'Dutch'}}, + {'id': 'en', 'snippet': {'hl': 'en', 'name': 'English'}}, + {'id': 'en-GB', 'snippet': {'hl': 'en-GB', 'name': 'English (United Kingdom)'}}, + {'id': 'et', 'snippet': {'hl': 'et', 'name': 'Estonian'}}, + {'id': 'fil', 'snippet': {'hl': 'fil', 'name': 'Filipino'}}, + {'id': 'fi', 'snippet': {'hl': 'fi', 'name': 'Finnish'}}, + {'id': 'fr', 'snippet': {'hl': 'fr', 'name': 'French'}}, + {'id': 'fr-CA', 'snippet': {'hl': 'fr-CA', 'name': 'French (Canada)'}}, + {'id': 'gl', 'snippet': {'hl': 'gl', 'name': 'Galician'}}, + {'id': 'ka', 'snippet': {'hl': 'ka', 'name': 'Georgian'}}, + {'id': 'de', 'snippet': {'hl': 'de', 'name': 'German'}}, + {'id': 'el', 'snippet': {'hl': 'el', 'name': 'Greek'}}, + {'id': 'gu', 'snippet': {'hl': 'gu', 'name': 'Gujarati'}}, + {'id': 'iw', 'snippet': {'hl': 'iw', 'name': 'Hebrew'}}, + {'id': 'hi', 'snippet': {'hl': 'hi', 'name': 'Hindi'}}, + {'id': 'hu', 'snippet': {'hl': 'hu', 'name': 'Hungarian'}}, + {'id': 'is', 'snippet': {'hl': 'is', 'name': 'Icelandic'}}, + {'id': 'id', 'snippet': {'hl': 'id', 'name': 'Indonesian'}}, + {'id': 'it', 'snippet': {'hl': 'it', 'name': 'Italian'}}, + {'id': 'ja', 'snippet': {'hl': 'ja', 'name': 'Japanese'}}, + {'id': 'kn', 'snippet': {'hl': 'kn', 'name': 'Kannada'}}, + {'id': 'kk', 'snippet': {'hl': 'kk', 'name': 'Kazakh'}}, + {'id': 'km', 'snippet': {'hl': 'km', 'name': 'Khmer'}}, + {'id': 'ko', 'snippet': {'hl': 'ko', 'name': 'Korean'}}, + {'id': 'ky', 'snippet': {'hl': 'ky', 'name': 'Kyrgyz'}}, + {'id': 'lo', 'snippet': {'hl': 'lo', 'name': 'Lao'}}, + {'id': 'lv', 'snippet': {'hl': 'lv', 'name': 'Latvian'}}, + {'id': 'lt', 'snippet': {'hl': 'lt', 'name': 'Lithuanian'}}, + {'id': 'mk', 'snippet': {'hl': 'mk', 'name': 'Macedonian'}}, + {'id': 'ms', 'snippet': {'hl': 'ms', 'name': 'Malay'}}, + {'id': 'ml', 'snippet': {'hl': 'ml', 'name': 'Malayalam'}}, + {'id': 'mr', 'snippet': {'hl': 'mr', 'name': 'Marathi'}}, + {'id': 'mn', 'snippet': {'hl': 'mn', 'name': 'Mongolian'}}, + {'id': 'my', 'snippet': {'hl': 'my', 'name': 'Myanmar (Burmese)'}}, + {'id': 'ne', 'snippet': {'hl': 'ne', 'name': 'Nepali'}}, + {'id': 'no', 'snippet': {'hl': 'no', 'name': 'Norwegian'}}, + {'id': 'fa', 'snippet': {'hl': 'fa', 'name': 'Persian'}}, + {'id': 'pl', 'snippet': {'hl': 'pl', 'name': 'Polish'}}, + {'id': 'pt', 'snippet': {'hl': 'pt', 'name': 'Portuguese (Brazil)'}}, + {'id': 'pt-PT', 'snippet': {'hl': 'pt-PT', 'name': 'Portuguese (Portugal)'}}, + {'id': 'pa', 'snippet': {'hl': 'pa', 'name': 'Punjabi'}}, + {'id': 'ro', 'snippet': {'hl': 'ro', 'name': 'Romanian'}}, + {'id': 'ru', 'snippet': {'hl': 'ru', 'name': 'Russian'}}, + {'id': 'sr', 'snippet': {'hl': 'sr', 'name': 'Serbian'}}, + {'id': 'si', 'snippet': {'hl': 'si', 'name': 'Sinhala'}}, + {'id': 'sk', 'snippet': {'hl': 'sk', 'name': 'Slovak'}}, + {'id': 'sl', 'snippet': {'hl': 'sl', 'name': 'Slovenian'}}, + {'id': 'es-419', 'snippet': {'hl': 'es-419', 'name': 'Spanish (Latin America)'}}, + {'id': 'es', 'snippet': {'hl': 'es', 'name': 'Spanish (Spain)'}}, + {'id': 'sw', 'snippet': {'hl': 'sw', 'name': 'Swahili'}}, + {'id': 'sv', 'snippet': {'hl': 'sv', 'name': 'Swedish'}}, + {'id': 'ta', 'snippet': {'hl': 'ta', 'name': 'Tamil'}}, + {'id': 'te', 'snippet': {'hl': 'te', 'name': 'Telugu'}}, + {'id': 'th', 'snippet': {'hl': 'th', 'name': 'Thai'}}, + {'id': 'tr', 'snippet': {'hl': 'tr', 'name': 'Turkish'}}, + {'id': 'uk', 'snippet': {'hl': 'uk', 'name': 'Ukrainian'}}, + {'id': 'ur', 'snippet': {'hl': 'ur', 'name': 'Urdu'}}, + {'id': 'uz', 'snippet': {'hl': 'uz', 'name': 'Uzbek'}}, + {'id': 'vi', 'snippet': {'hl': 'vi', 'name': 'Vietnamese'}}, + {'id': 'zu', 'snippet': {'hl': 'zu', 'name': 'Zulu'}}, +]} + +DEFAULT_REGIONS = {'items': [ + {'id': 'DZ', 'snippet': {'gl': 'DZ', 'name': 'Algeria'}}, + {'id': 'AR', 'snippet': {'gl': 'AR', 'name': 'Argentina'}}, + {'id': 'AU', 'snippet': {'gl': 'AU', 'name': 'Australia'}}, + {'id': 'AT', 'snippet': {'gl': 'AT', 'name': 'Austria'}}, + {'id': 'AZ', 'snippet': {'gl': 'AZ', 'name': 'Azerbaijan'}}, + {'id': 'BH', 'snippet': {'gl': 'BH', 'name': 'Bahrain'}}, + {'id': 'BY', 'snippet': {'gl': 'BY', 'name': 'Belarus'}}, + {'id': 'BE', 'snippet': {'gl': 'BE', 'name': 'Belgium'}}, + {'id': 'BA', 'snippet': {'gl': 'BA', 'name': 'Bosnia and Herzegovina'}}, + {'id': 'BR', 'snippet': {'gl': 'BR', 'name': 'Brazil'}}, + {'id': 'BG', 'snippet': {'gl': 'BG', 'name': 'Bulgaria'}}, + {'id': 'CA', 'snippet': {'gl': 'CA', 'name': 'Canada'}}, + {'id': 'CL', 'snippet': {'gl': 'CL', 'name': 'Chile'}}, + {'id': 'CO', 'snippet': {'gl': 'CO', 'name': 'Colombia'}}, + {'id': 'HR', 'snippet': {'gl': 'HR', 'name': 'Croatia'}}, + {'id': 'CZ', 'snippet': {'gl': 'CZ', 'name': 'Czech Republic'}}, + {'id': 'DK', 'snippet': {'gl': 'DK', 'name': 'Denmark'}}, + {'id': 'EG', 'snippet': {'gl': 'EG', 'name': 'Egypt'}}, + {'id': 'EE', 'snippet': {'gl': 'EE', 'name': 'Estonia'}}, + {'id': 'FI', 'snippet': {'gl': 'FI', 'name': 'Finland'}}, + {'id': 'FR', 'snippet': {'gl': 'FR', 'name': 'France'}}, + {'id': 'GE', 'snippet': {'gl': 'GE', 'name': 'Georgia'}}, + {'id': 'DE', 'snippet': {'gl': 'DE', 'name': 'Germany'}}, + {'id': 'GH', 'snippet': {'gl': 'GH', 'name': 'Ghana'}}, + {'id': 'GR', 'snippet': {'gl': 'GR', 'name': 'Greece'}}, + {'id': 'HK', 'snippet': {'gl': 'HK', 'name': 'Hong Kong'}}, + {'id': 'HU', 'snippet': {'gl': 'HU', 'name': 'Hungary'}}, + {'id': 'IS', 'snippet': {'gl': 'IS', 'name': 'Iceland'}}, + {'id': 'IN', 'snippet': {'gl': 'IN', 'name': 'India'}}, + {'id': 'ID', 'snippet': {'gl': 'ID', 'name': 'Indonesia'}}, + {'id': 'IQ', 'snippet': {'gl': 'IQ', 'name': 'Iraq'}}, + {'id': 'IE', 'snippet': {'gl': 'IE', 'name': 'Ireland'}}, + {'id': 'IL', 'snippet': {'gl': 'IL', 'name': 'Israel'}}, + {'id': 'IT', 'snippet': {'gl': 'IT', 'name': 'Italy'}}, + {'id': 'JM', 'snippet': {'gl': 'JM', 'name': 'Jamaica'}}, + {'id': 'JP', 'snippet': {'gl': 'JP', 'name': 'Japan'}}, + {'id': 'JO', 'snippet': {'gl': 'JO', 'name': 'Jordan'}}, + {'id': 'KZ', 'snippet': {'gl': 'KZ', 'name': 'Kazakhstan'}}, + {'id': 'KE', 'snippet': {'gl': 'KE', 'name': 'Kenya'}}, + {'id': 'KW', 'snippet': {'gl': 'KW', 'name': 'Kuwait'}}, + {'id': 'LV', 'snippet': {'gl': 'LV', 'name': 'Latvia'}}, + {'id': 'LB', 'snippet': {'gl': 'LB', 'name': 'Lebanon'}}, + {'id': 'LY', 'snippet': {'gl': 'LY', 'name': 'Libya'}}, + {'id': 'LT', 'snippet': {'gl': 'LT', 'name': 'Lithuania'}}, + {'id': 'LU', 'snippet': {'gl': 'LU', 'name': 'Luxembourg'}}, + {'id': 'MK', 'snippet': {'gl': 'MK', 'name': 'Macedonia'}}, + {'id': 'MY', 'snippet': {'gl': 'MY', 'name': 'Malaysia'}}, + {'id': 'MX', 'snippet': {'gl': 'MX', 'name': 'Mexico'}}, + {'id': 'ME', 'snippet': {'gl': 'ME', 'name': 'Montenegro'}}, + {'id': 'MA', 'snippet': {'gl': 'MA', 'name': 'Morocco'}}, + {'id': 'NP', 'snippet': {'gl': 'NP', 'name': 'Nepal'}}, + {'id': 'NL', 'snippet': {'gl': 'NL', 'name': 'Netherlands'}}, + {'id': 'NZ', 'snippet': {'gl': 'NZ', 'name': 'New Zealand'}}, + {'id': 'NG', 'snippet': {'gl': 'NG', 'name': 'Nigeria'}}, + {'id': 'NO', 'snippet': {'gl': 'NO', 'name': 'Norway'}}, + {'id': 'OM', 'snippet': {'gl': 'OM', 'name': 'Oman'}}, + {'id': 'PK', 'snippet': {'gl': 'PK', 'name': 'Pakistan'}}, + {'id': 'PE', 'snippet': {'gl': 'PE', 'name': 'Peru'}}, + {'id': 'PH', 'snippet': {'gl': 'PH', 'name': 'Philippines'}}, + {'id': 'PL', 'snippet': {'gl': 'PL', 'name': 'Poland'}}, + {'id': 'PT', 'snippet': {'gl': 'PT', 'name': 'Portugal'}}, + {'id': 'PR', 'snippet': {'gl': 'PR', 'name': 'Puerto Rico'}}, + {'id': 'QA', 'snippet': {'gl': 'QA', 'name': 'Qatar'}}, + {'id': 'RO', 'snippet': {'gl': 'RO', 'name': 'Romania'}}, + {'id': 'RU', 'snippet': {'gl': 'RU', 'name': 'Russia'}}, + {'id': 'SA', 'snippet': {'gl': 'SA', 'name': 'Saudi Arabia'}}, + {'id': 'SN', 'snippet': {'gl': 'SN', 'name': 'Senegal'}}, + {'id': 'RS', 'snippet': {'gl': 'RS', 'name': 'Serbia'}}, + {'id': 'SG', 'snippet': {'gl': 'SG', 'name': 'Singapore'}}, + {'id': 'SK', 'snippet': {'gl': 'SK', 'name': 'Slovakia'}}, + {'id': 'SI', 'snippet': {'gl': 'SI', 'name': 'Slovenia'}}, + {'id': 'ZA', 'snippet': {'gl': 'ZA', 'name': 'South Africa'}}, + {'id': 'KR', 'snippet': {'gl': 'KR', 'name': 'South Korea'}}, + {'id': 'ES', 'snippet': {'gl': 'ES', 'name': 'Spain'}}, + {'id': 'LK', 'snippet': {'gl': 'LK', 'name': 'Sri Lanka'}}, + {'id': 'SE', 'snippet': {'gl': 'SE', 'name': 'Sweden'}}, + {'id': 'CH', 'snippet': {'gl': 'CH', 'name': 'Switzerland'}}, + {'id': 'TW', 'snippet': {'gl': 'TW', 'name': 'Taiwan'}}, + {'id': 'TZ', 'snippet': {'gl': 'TZ', 'name': 'Tanzania'}}, + {'id': 'TH', 'snippet': {'gl': 'TH', 'name': 'Thailand'}}, + {'id': 'TN', 'snippet': {'gl': 'TN', 'name': 'Tunisia'}}, + {'id': 'TR', 'snippet': {'gl': 'TR', 'name': 'Turkey'}}, + {'id': 'UG', 'snippet': {'gl': 'UG', 'name': 'Uganda'}}, + {'id': 'UA', 'snippet': {'gl': 'UA', 'name': 'Ukraine'}}, + {'id': 'AE', 'snippet': {'gl': 'AE', 'name': 'United Arab Emirates'}}, + {'id': 'GB', 'snippet': {'gl': 'GB', 'name': 'United Kingdom'}}, + {'id': 'US', 'snippet': {'gl': 'US', 'name': 'United States'}}, + {'id': 'VN', 'snippet': {'gl': 'VN', 'name': 'Vietnam'}}, + {'id': 'YE', 'snippet': {'gl': 'YE', 'name': 'Yemen'}}, + {'id': 'ZW', 'snippet': {'gl': 'ZW', 'name': 'Zimbabwe'}}, +]} + +TRANSLATION_LANGUAGES = [ + {'languageCode': 'aa', 'languageName': {'simpleText': 'Afar'}}, + {'languageCode': 'ab', 'languageName': {'simpleText': 'Abkhazian'}}, + {'languageCode': 'ace', 'languageName': {'simpleText': 'Acehnese'}}, + {'languageCode': 'ach', 'languageName': {'simpleText': 'Acoli'}}, + {'languageCode': 'ada', 'languageName': {'simpleText': 'Adangme'}}, + {'languageCode': 'ady', 'languageName': {'simpleText': 'Adyghe'}}, + {'languageCode': 'ae', 'languageName': {'simpleText': 'Avestan'}}, + {'languageCode': 'aeb', 'languageName': {'simpleText': 'Tunisian Arabic'}}, + {'languageCode': 'af', 'languageName': {'simpleText': 'Afrikaans'}}, + {'languageCode': 'afh', 'languageName': {'simpleText': 'Afrihili'}}, + {'languageCode': 'agq', 'languageName': {'simpleText': 'Aghem'}}, + {'languageCode': 'ain', 'languageName': {'simpleText': 'Ainu'}}, + {'languageCode': 'ak', 'languageName': {'simpleText': 'Akan'}}, + {'languageCode': 'akk', 'languageName': {'simpleText': 'Akkadian'}}, + {'languageCode': 'akz', 'languageName': {'simpleText': 'Alabama'}}, + {'languageCode': 'ale', 'languageName': {'simpleText': 'Aleut'}}, + {'languageCode': 'aln', 'languageName': {'simpleText': 'Gheg Albanian'}}, + {'languageCode': 'alt', 'languageName': {'simpleText': 'Southern Altai'}}, + {'languageCode': 'am', 'languageName': {'simpleText': 'Amharic'}}, + {'languageCode': 'an', 'languageName': {'simpleText': 'Aragonese'}}, + {'languageCode': 'ang', 'languageName': {'simpleText': 'Old English'}}, + {'languageCode': 'anp', 'languageName': {'simpleText': 'Angika'}}, + {'languageCode': 'ar', 'languageName': {'simpleText': 'Arabic'}}, + {'languageCode': 'ar_001', 'languageName': {'simpleText': 'Arabic (world)'}}, + {'languageCode': 'arc', 'languageName': {'simpleText': 'Aramaic'}}, + {'languageCode': 'arn', 'languageName': {'simpleText': 'Mapuche'}}, + {'languageCode': 'aro', 'languageName': {'simpleText': 'Araona'}}, + {'languageCode': 'arp', 'languageName': {'simpleText': 'Arapaho'}}, + {'languageCode': 'arq', 'languageName': {'simpleText': 'Algerian Arabic'}}, + {'languageCode': 'ars', 'languageName': {'simpleText': 'Najdi Arabic'}}, + {'languageCode': 'arw', 'languageName': {'simpleText': 'Arawak'}}, + {'languageCode': 'ary', 'languageName': {'simpleText': 'Moroccan Arabic'}}, + {'languageCode': 'arz', 'languageName': {'simpleText': 'Egyptian Arabic'}}, + {'languageCode': 'as', 'languageName': {'simpleText': 'Assamese'}}, + {'languageCode': 'asa', 'languageName': {'simpleText': 'Asu'}}, + {'languageCode': 'ase', 'languageName': {'simpleText': 'American Sign Language'}}, + {'languageCode': 'ast', 'languageName': {'simpleText': 'Asturian'}}, + {'languageCode': 'av', 'languageName': {'simpleText': 'Avaric'}}, + {'languageCode': 'avk', 'languageName': {'simpleText': 'Kotava'}}, + {'languageCode': 'awa', 'languageName': {'simpleText': 'Awadhi'}}, + {'languageCode': 'ay', 'languageName': {'simpleText': 'Aymara'}}, + {'languageCode': 'az', 'languageName': {'simpleText': 'Azerbaijani'}}, + {'languageCode': 'az_Cyrl', 'languageName': {'simpleText': 'Azerbaijani (Cyrillic)'}}, + {'languageCode': 'az_Latn', 'languageName': {'simpleText': 'Azerbaijani (Latin)'}}, + {'languageCode': 'ba', 'languageName': {'simpleText': 'Bashkir'}}, + {'languageCode': 'bal', 'languageName': {'simpleText': 'Baluchi'}}, + {'languageCode': 'ban', 'languageName': {'simpleText': 'Balinese'}}, + {'languageCode': 'bar', 'languageName': {'simpleText': 'Bavarian'}}, + {'languageCode': 'bas', 'languageName': {'simpleText': 'Basaa'}}, + {'languageCode': 'bax', 'languageName': {'simpleText': 'Bamun'}}, + {'languageCode': 'bbc', 'languageName': {'simpleText': 'Batak Toba'}}, + {'languageCode': 'bbj', 'languageName': {'simpleText': 'Ghomala'}}, + {'languageCode': 'be', 'languageName': {'simpleText': 'Belarusian'}}, + {'languageCode': 'bej', 'languageName': {'simpleText': 'Beja'}}, + {'languageCode': 'bem', 'languageName': {'simpleText': 'Bemba'}}, + {'languageCode': 'bew', 'languageName': {'simpleText': 'Betawi'}}, + {'languageCode': 'bez', 'languageName': {'simpleText': 'Bena'}}, + {'languageCode': 'bfd', 'languageName': {'simpleText': 'Bafut'}}, + {'languageCode': 'bfq', 'languageName': {'simpleText': 'Badaga'}}, + {'languageCode': 'bg', 'languageName': {'simpleText': 'Bulgarian'}}, + {'languageCode': 'bgc', 'languageName': {'simpleText': 'Haryanvi'}}, + {'languageCode': 'bgn', 'languageName': {'simpleText': 'Western Balochi'}}, + {'languageCode': 'bho', 'languageName': {'simpleText': 'Bhojpuri'}}, + {'languageCode': 'bi', 'languageName': {'simpleText': 'Bislama'}}, + {'languageCode': 'bik', 'languageName': {'simpleText': 'Bikol'}}, + {'languageCode': 'bin', 'languageName': {'simpleText': 'Bini'}}, + {'languageCode': 'bjn', 'languageName': {'simpleText': 'Banjar'}}, + {'languageCode': 'bkm', 'languageName': {'simpleText': 'Kom'}}, + {'languageCode': 'bla', 'languageName': {'simpleText': 'Siksik\u00e1'}}, + {'languageCode': 'blo', 'languageName': {'simpleText': 'Anii'}}, + {'languageCode': 'bm', 'languageName': {'simpleText': 'Bambara'}}, + {'languageCode': 'bn', 'languageName': {'simpleText': 'Bangla'}}, + {'languageCode': 'bo', 'languageName': {'simpleText': 'Tibetan'}}, + {'languageCode': 'bpy', 'languageName': {'simpleText': 'Bishnupriya'}}, + {'languageCode': 'bqi', 'languageName': {'simpleText': 'Bakhtiari'}}, + {'languageCode': 'br', 'languageName': {'simpleText': 'Breton'}}, + {'languageCode': 'bra', 'languageName': {'simpleText': 'Braj'}}, + {'languageCode': 'brh', 'languageName': {'simpleText': 'Brahui'}}, + {'languageCode': 'brx', 'languageName': {'simpleText': 'Bodo'}}, + {'languageCode': 'bs', 'languageName': {'simpleText': 'Bosnian'}}, + {'languageCode': 'bs_Cyrl', 'languageName': {'simpleText': 'Bosnian (Cyrillic)'}}, + {'languageCode': 'bs_Latn', 'languageName': {'simpleText': 'Bosnian (Latin)'}}, + {'languageCode': 'bss', 'languageName': {'simpleText': 'Akoose'}}, + {'languageCode': 'bua', 'languageName': {'simpleText': 'Buriat'}}, + {'languageCode': 'bug', 'languageName': {'simpleText': 'Buginese'}}, + {'languageCode': 'bum', 'languageName': {'simpleText': 'Bulu'}}, + {'languageCode': 'byn', 'languageName': {'simpleText': 'Blin'}}, + {'languageCode': 'byv', 'languageName': {'simpleText': 'Medumba'}}, + {'languageCode': 'ca', 'languageName': {'simpleText': 'Catalan'}}, + {'languageCode': 'cad', 'languageName': {'simpleText': 'Caddo'}}, + {'languageCode': 'car', 'languageName': {'simpleText': 'Carib'}}, + {'languageCode': 'cay', 'languageName': {'simpleText': 'Cayuga'}}, + {'languageCode': 'cch', 'languageName': {'simpleText': 'Atsam'}}, + {'languageCode': 'ccp', 'languageName': {'simpleText': 'Chakma'}}, + {'languageCode': 'ce', 'languageName': {'simpleText': 'Chechen'}}, + {'languageCode': 'ceb', 'languageName': {'simpleText': 'Cebuano'}}, + {'languageCode': 'cgg', 'languageName': {'simpleText': 'Chiga'}}, + {'languageCode': 'ch', 'languageName': {'simpleText': 'Chamorro'}}, + {'languageCode': 'chb', 'languageName': {'simpleText': 'Chibcha'}}, + {'languageCode': 'chg', 'languageName': {'simpleText': 'Chagatai'}}, + {'languageCode': 'chk', 'languageName': {'simpleText': 'Chuukese'}}, + {'languageCode': 'chm', 'languageName': {'simpleText': 'Mari'}}, + {'languageCode': 'chn', 'languageName': {'simpleText': 'Chinook Jargon'}}, + {'languageCode': 'cho', 'languageName': {'simpleText': 'Choctaw'}}, + {'languageCode': 'chp', 'languageName': {'simpleText': 'Chipewyan'}}, + {'languageCode': 'chr', 'languageName': {'simpleText': 'Cherokee'}}, + {'languageCode': 'chy', 'languageName': {'simpleText': 'Cheyenne'}}, + {'languageCode': 'ckb', 'languageName': {'simpleText': 'Central Kurdish'}}, + {'languageCode': 'co', 'languageName': {'simpleText': 'Corsican'}}, + {'languageCode': 'cop', 'languageName': {'simpleText': 'Coptic'}}, + {'languageCode': 'cps', 'languageName': {'simpleText': 'Capiznon'}}, + {'languageCode': 'cr', 'languageName': {'simpleText': 'Cree'}}, + {'languageCode': 'crh', 'languageName': {'simpleText': 'Crimean Tatar'}}, + {'languageCode': 'cs', 'languageName': {'simpleText': 'Czech'}}, + {'languageCode': 'csb', 'languageName': {'simpleText': 'Kashubian'}}, + {'languageCode': 'csw', 'languageName': {'simpleText': 'Swampy Cree'}}, + {'languageCode': 'cu', 'languageName': {'simpleText': 'Church Slavic'}}, + {'languageCode': 'cv', 'languageName': {'simpleText': 'Chuvash'}}, + {'languageCode': 'cy', 'languageName': {'simpleText': 'Welsh'}}, + {'languageCode': 'da', 'languageName': {'simpleText': 'Danish'}}, + {'languageCode': 'dak', 'languageName': {'simpleText': 'Dakota'}}, + {'languageCode': 'dar', 'languageName': {'simpleText': 'Dargwa'}}, + {'languageCode': 'dav', 'languageName': {'simpleText': 'Taita'}}, + {'languageCode': 'de', 'languageName': {'simpleText': 'German'}}, + {'languageCode': 'de_AT', 'languageName': {'simpleText': 'German (Austria)'}}, + {'languageCode': 'de_CH', 'languageName': {'simpleText': 'German (Switzerland)'}}, + {'languageCode': 'del', 'languageName': {'simpleText': 'Delaware'}}, + {'languageCode': 'den', 'languageName': {'simpleText': 'Slave'}}, + {'languageCode': 'dgr', 'languageName': {'simpleText': 'Dogrib'}}, + {'languageCode': 'din', 'languageName': {'simpleText': 'Dinka'}}, + {'languageCode': 'dje', 'languageName': {'simpleText': 'Zarma'}}, + {'languageCode': 'doi', 'languageName': {'simpleText': 'Dogri'}}, + {'languageCode': 'dsb', 'languageName': {'simpleText': 'Lower Sorbian'}}, + {'languageCode': 'dua', 'languageName': {'simpleText': 'Duala'}}, + {'languageCode': 'dum', 'languageName': {'simpleText': 'Middle Dutch'}}, + {'languageCode': 'dv', 'languageName': {'simpleText': 'Divehi'}}, + {'languageCode': 'dyo', 'languageName': {'simpleText': 'Jola-Fonyi'}}, + {'languageCode': 'dyu', 'languageName': {'simpleText': 'Dyula'}}, + {'languageCode': 'dz', 'languageName': {'simpleText': 'Dzongkha'}}, + {'languageCode': 'dzg', 'languageName': {'simpleText': 'Dazaga'}}, + {'languageCode': 'ebu', 'languageName': {'simpleText': 'Embu'}}, + {'languageCode': 'ee', 'languageName': {'simpleText': 'Ewe'}}, + {'languageCode': 'efi', 'languageName': {'simpleText': 'Efik'}}, + {'languageCode': 'egy', 'languageName': {'simpleText': 'Ancient Egyptian'}}, + {'languageCode': 'eka', 'languageName': {'simpleText': 'Ekajuk'}}, + {'languageCode': 'el', 'languageName': {'simpleText': 'Greek'}}, + {'languageCode': 'elx', 'languageName': {'simpleText': 'Elamite'}}, + {'languageCode': 'en', 'languageName': {'simpleText': 'English'}}, + {'languageCode': 'en_AU', 'languageName': {'simpleText': 'English (Australia)'}}, + {'languageCode': 'en_CA', 'languageName': {'simpleText': 'English (Canada)'}}, + {'languageCode': 'en_GB', 'languageName': {'simpleText': 'English (United Kingdom)'}}, + {'languageCode': 'en_US', 'languageName': {'simpleText': 'English (United States)'}}, + {'languageCode': 'enm', 'languageName': {'simpleText': 'Middle English'}}, + {'languageCode': 'eo', 'languageName': {'simpleText': 'Esperanto'}}, + {'languageCode': 'es', 'languageName': {'simpleText': 'Spanish'}}, + {'languageCode': 'es_419', 'languageName': {'simpleText': 'Spanish (Latin America)'}}, + {'languageCode': 'es_ES', 'languageName': {'simpleText': 'Spanish (Spain)'}}, + {'languageCode': 'es_MX', 'languageName': {'simpleText': 'Spanish (Mexico)'}}, + {'languageCode': 'et', 'languageName': {'simpleText': 'Estonian'}}, + {'languageCode': 'eu', 'languageName': {'simpleText': 'Basque'}}, + {'languageCode': 'ewo', 'languageName': {'simpleText': 'Ewondo'}}, + {'languageCode': 'fa', 'languageName': {'simpleText': 'Persian'}}, + {'languageCode': 'fa_AF', 'languageName': {'simpleText': 'Persian (Afghanistan)'}}, + {'languageCode': 'fan', 'languageName': {'simpleText': 'Fang'}}, + {'languageCode': 'fat', 'languageName': {'simpleText': 'Fanti'}}, + {'languageCode': 'ff', 'languageName': {'simpleText': 'Fula'}}, + {'languageCode': 'ff_Adlm', 'languageName': {'simpleText': 'Fula (Adlam)'}}, + {'languageCode': 'ff_Latn', 'languageName': {'simpleText': 'Fula (Latin)'}}, + {'languageCode': 'fi', 'languageName': {'simpleText': 'Finnish'}}, + {'languageCode': 'fil', 'languageName': {'simpleText': 'Filipino'}}, + {'languageCode': 'fj', 'languageName': {'simpleText': 'Fijian'}}, + {'languageCode': 'fo', 'languageName': {'simpleText': 'Faroese'}}, + {'languageCode': 'fon', 'languageName': {'simpleText': 'Fon'}}, + {'languageCode': 'fr', 'languageName': {'simpleText': 'French'}}, + {'languageCode': 'fr_CA', 'languageName': {'simpleText': 'French (Canada)'}}, + {'languageCode': 'fr_CH', 'languageName': {'simpleText': 'French (Switzerland)'}}, + {'languageCode': 'frm', 'languageName': {'simpleText': 'Middle French'}}, + {'languageCode': 'fro', 'languageName': {'simpleText': 'Old French'}}, + {'languageCode': 'frr', 'languageName': {'simpleText': 'Northern Frisian'}}, + {'languageCode': 'frs', 'languageName': {'simpleText': 'Eastern Frisian'}}, + {'languageCode': 'fur', 'languageName': {'simpleText': 'Friulian'}}, + {'languageCode': 'fy', 'languageName': {'simpleText': 'Western Frisian'}}, + {'languageCode': 'ga', 'languageName': {'simpleText': 'Irish'}}, + {'languageCode': 'gaa', 'languageName': {'simpleText': 'Ga'}}, + {'languageCode': 'gay', 'languageName': {'simpleText': 'Gayo'}}, + {'languageCode': 'gba', 'languageName': {'simpleText': 'Gbaya'}}, + {'languageCode': 'gd', 'languageName': {'simpleText': 'Scottish Gaelic'}}, + {'languageCode': 'gez', 'languageName': {'simpleText': 'Geez'}}, + {'languageCode': 'gil', 'languageName': {'simpleText': 'Gilbertese'}}, + {'languageCode': 'gl', 'languageName': {'simpleText': 'Galician'}}, + {'languageCode': 'gmh', 'languageName': {'simpleText': 'Middle High German'}}, + {'languageCode': 'gn', 'languageName': {'simpleText': 'Guarani'}}, + {'languageCode': 'goh', 'languageName': {'simpleText': 'Old High German'}}, + {'languageCode': 'gon', 'languageName': {'simpleText': 'Gondi'}}, + {'languageCode': 'gor', 'languageName': {'simpleText': 'Gorontalo'}}, + {'languageCode': 'got', 'languageName': {'simpleText': 'Gothic'}}, + {'languageCode': 'grb', 'languageName': {'simpleText': 'Grebo'}}, + {'languageCode': 'grc', 'languageName': {'simpleText': 'Ancient Greek'}}, + {'languageCode': 'gsw', 'languageName': {'simpleText': 'Swiss German'}}, + {'languageCode': 'gu', 'languageName': {'simpleText': 'Gujarati'}}, + {'languageCode': 'guz', 'languageName': {'simpleText': 'Gusii'}}, + {'languageCode': 'gv', 'languageName': {'simpleText': 'Manx'}}, + {'languageCode': 'gwi', 'languageName': {'simpleText': 'Gwich\u02bcin'}}, + {'languageCode': 'ha', 'languageName': {'simpleText': 'Hausa'}}, + {'languageCode': 'hai', 'languageName': {'simpleText': 'Haida'}}, + {'languageCode': 'haw', 'languageName': {'simpleText': 'Hawaiian'}}, + {'languageCode': 'he', 'languageName': {'simpleText': 'Hebrew'}}, + {'languageCode': 'hi', 'languageName': {'simpleText': 'Hindi'}}, + {'languageCode': 'hi_Latn', 'languageName': {'simpleText': 'Hindi (Latin)'}}, + {'languageCode': 'hil', 'languageName': {'simpleText': 'Hiligaynon'}}, + {'languageCode': 'hit', 'languageName': {'simpleText': 'Hittite'}}, + {'languageCode': 'hmn', 'languageName': {'simpleText': 'Hmong'}}, + {'languageCode': 'ho', 'languageName': {'simpleText': 'Hiri Motu'}}, + {'languageCode': 'hr', 'languageName': {'simpleText': 'Croatian'}}, + {'languageCode': 'hsb', 'languageName': {'simpleText': 'Upper Sorbian'}}, + {'languageCode': 'ht', 'languageName': {'simpleText': 'Haitian Creole'}}, + {'languageCode': 'hu', 'languageName': {'simpleText': 'Hungarian'}}, + {'languageCode': 'hup', 'languageName': {'simpleText': 'Hupa'}}, + {'languageCode': 'hy', 'languageName': {'simpleText': 'Armenian'}}, + {'languageCode': 'hz', 'languageName': {'simpleText': 'Herero'}}, + {'languageCode': 'ia', 'languageName': {'simpleText': 'Interlingua'}}, + {'languageCode': 'iba', 'languageName': {'simpleText': 'Iban'}}, + {'languageCode': 'ibb', 'languageName': {'simpleText': 'Ibibio'}}, + {'languageCode': 'id', 'languageName': {'simpleText': 'Indonesian'}}, + {'languageCode': 'ie', 'languageName': {'simpleText': 'Interlingue'}}, + {'languageCode': 'ig', 'languageName': {'simpleText': 'Igbo'}}, + {'languageCode': 'ii', 'languageName': {'simpleText': 'Sichuan Yi'}}, + {'languageCode': 'ik', 'languageName': {'simpleText': 'Inupiaq'}}, + {'languageCode': 'ilo', 'languageName': {'simpleText': 'Iloko'}}, + {'languageCode': 'in', 'languageName': {'simpleText': 'Indonesian'}}, + {'languageCode': 'inh', 'languageName': {'simpleText': 'Ingush'}}, + {'languageCode': 'io', 'languageName': {'simpleText': 'Ido'}}, + {'languageCode': 'is', 'languageName': {'simpleText': 'Icelandic'}}, + {'languageCode': 'it', 'languageName': {'simpleText': 'Italian'}}, + {'languageCode': 'iu', 'languageName': {'simpleText': 'Inuktitut'}}, + {'languageCode': 'iw', 'languageName': {'simpleText': 'Hebrew'}}, + {'languageCode': 'ja', 'languageName': {'simpleText': 'Japanese'}}, + {'languageCode': 'jbo', 'languageName': {'simpleText': 'Lojban'}}, + {'languageCode': 'jgo', 'languageName': {'simpleText': 'Ngomba'}}, + {'languageCode': 'jmc', 'languageName': {'simpleText': 'Machame'}}, + {'languageCode': 'jpr', 'languageName': {'simpleText': 'Judeo-Persian'}}, + {'languageCode': 'jrb', 'languageName': {'simpleText': 'Judeo-Arabic'}}, + {'languageCode': 'jv', 'languageName': {'simpleText': 'Javanese'}}, + {'languageCode': 'ka', 'languageName': {'simpleText': 'Georgian'}}, + {'languageCode': 'kaa', 'languageName': {'simpleText': 'Kara-Kalpak'}}, + {'languageCode': 'kab', 'languageName': {'simpleText': 'Kabyle'}}, + {'languageCode': 'kac', 'languageName': {'simpleText': 'Kachin'}}, + {'languageCode': 'kaj', 'languageName': {'simpleText': 'Jju'}}, + {'languageCode': 'kam', 'languageName': {'simpleText': 'Kamba'}}, + {'languageCode': 'kaw', 'languageName': {'simpleText': 'Kawi'}}, + {'languageCode': 'kbd', 'languageName': {'simpleText': 'Kabardian'}}, + {'languageCode': 'kbl', 'languageName': {'simpleText': 'Kanembu'}}, + {'languageCode': 'kcg', 'languageName': {'simpleText': 'Tyap'}}, + {'languageCode': 'kde', 'languageName': {'simpleText': 'Makonde'}}, + {'languageCode': 'kea', 'languageName': {'simpleText': 'Kabuverdianu'}}, + {'languageCode': 'kfo', 'languageName': {'simpleText': 'Koro'}}, + {'languageCode': 'kg', 'languageName': {'simpleText': 'Kongo'}}, + {'languageCode': 'kgp', 'languageName': {'simpleText': 'Kaingang'}}, + {'languageCode': 'kha', 'languageName': {'simpleText': 'Khasi'}}, + {'languageCode': 'kho', 'languageName': {'simpleText': 'Khotanese'}}, + {'languageCode': 'khq', 'languageName': {'simpleText': 'Koyra Chiini'}}, + {'languageCode': 'ki', 'languageName': {'simpleText': 'Kikuyu'}}, + {'languageCode': 'kj', 'languageName': {'simpleText': 'Kuanyama'}}, + {'languageCode': 'kk', 'languageName': {'simpleText': 'Kazakh'}}, + {'languageCode': 'kkj', 'languageName': {'simpleText': 'Kako'}}, + {'languageCode': 'kl', 'languageName': {'simpleText': 'Kalaallisut'}}, + {'languageCode': 'kln', 'languageName': {'simpleText': 'Kalenjin'}}, + {'languageCode': 'km', 'languageName': {'simpleText': 'Khmer'}}, + {'languageCode': 'kmb', 'languageName': {'simpleText': 'Kimbundu'}}, + {'languageCode': 'kn', 'languageName': {'simpleText': 'Kannada'}}, + {'languageCode': 'ko', 'languageName': {'simpleText': 'Korean'}}, + {'languageCode': 'kok', 'languageName': {'simpleText': 'Konkani'}}, + {'languageCode': 'kos', 'languageName': {'simpleText': 'Kosraean'}}, + {'languageCode': 'kpe', 'languageName': {'simpleText': 'Kpelle'}}, + {'languageCode': 'kr', 'languageName': {'simpleText': 'Kanuri'}}, + {'languageCode': 'krc', 'languageName': {'simpleText': 'Karachay-Balkar'}}, + {'languageCode': 'krl', 'languageName': {'simpleText': 'Karelian'}}, + {'languageCode': 'kru', 'languageName': {'simpleText': 'Kurukh'}}, + {'languageCode': 'ks', 'languageName': {'simpleText': 'Kashmiri'}}, + {'languageCode': 'ks_Arab', 'languageName': {'simpleText': 'Kashmiri (Arabic)'}}, + {'languageCode': 'ks_Deva', 'languageName': {'simpleText': 'Kashmiri (Devanagari)'}}, + {'languageCode': 'ksb', 'languageName': {'simpleText': 'Shambala'}}, + {'languageCode': 'ksf', 'languageName': {'simpleText': 'Bafia'}}, + {'languageCode': 'ksh', 'languageName': {'simpleText': 'Colognian'}}, + {'languageCode': 'ku', 'languageName': {'simpleText': 'Kurdish'}}, + {'languageCode': 'kum', 'languageName': {'simpleText': 'Kumyk'}}, + {'languageCode': 'kut', 'languageName': {'simpleText': 'Kutenai'}}, + {'languageCode': 'kv', 'languageName': {'simpleText': 'Komi'}}, + {'languageCode': 'kw', 'languageName': {'simpleText': 'Cornish'}}, + {'languageCode': 'kxv', 'languageName': {'simpleText': 'Kuvi'}}, + {'languageCode': 'kxv_Deva', 'languageName': {'simpleText': 'Kuvi (Devanagari)'}}, + {'languageCode': 'kxv_Latn', 'languageName': {'simpleText': 'Kuvi (Latin)'}}, + {'languageCode': 'kxv_Orya', 'languageName': {'simpleText': 'Kuvi (Odia)'}}, + {'languageCode': 'kxv_Telu', 'languageName': {'simpleText': 'Kuvi (Telugu)'}}, + {'languageCode': 'ky', 'languageName': {'simpleText': 'Kyrgyz'}}, + {'languageCode': 'la', 'languageName': {'simpleText': 'Latin'}}, + {'languageCode': 'lad', 'languageName': {'simpleText': 'Ladino'}}, + {'languageCode': 'lag', 'languageName': {'simpleText': 'Langi'}}, + {'languageCode': 'lah', 'languageName': {'simpleText': 'Western Panjabi'}}, + {'languageCode': 'lam', 'languageName': {'simpleText': 'Lamba'}}, + {'languageCode': 'lb', 'languageName': {'simpleText': 'Luxembourgish'}}, + {'languageCode': 'lez', 'languageName': {'simpleText': 'Lezghian'}}, + {'languageCode': 'lg', 'languageName': {'simpleText': 'Ganda'}}, + {'languageCode': 'li', 'languageName': {'simpleText': 'Limburgish'}}, + {'languageCode': 'lij', 'languageName': {'simpleText': 'Ligurian'}}, + {'languageCode': 'lkt', 'languageName': {'simpleText': 'Lakota'}}, + {'languageCode': 'lmo', 'languageName': {'simpleText': 'Lombard'}}, + {'languageCode': 'ln', 'languageName': {'simpleText': 'Lingala'}}, + {'languageCode': 'lo', 'languageName': {'simpleText': 'Lao'}}, + {'languageCode': 'lol', 'languageName': {'simpleText': 'Mongo'}}, + {'languageCode': 'loz', 'languageName': {'simpleText': 'Lozi'}}, + {'languageCode': 'lrc', 'languageName': {'simpleText': 'Northern Luri'}}, + {'languageCode': 'lt', 'languageName': {'simpleText': 'Lithuanian'}}, + {'languageCode': 'lu', 'languageName': {'simpleText': 'Luba-Katanga'}}, + {'languageCode': 'lua', 'languageName': {'simpleText': 'Luba-Lulua'}}, + {'languageCode': 'lui', 'languageName': {'simpleText': 'Luiseno'}}, + {'languageCode': 'lun', 'languageName': {'simpleText': 'Lunda'}}, + {'languageCode': 'luo', 'languageName': {'simpleText': 'Luo'}}, + {'languageCode': 'lus', 'languageName': {'simpleText': 'Mizo'}}, + {'languageCode': 'luy', 'languageName': {'simpleText': 'Luyia'}}, + {'languageCode': 'lv', 'languageName': {'simpleText': 'Latvian'}}, + {'languageCode': 'mad', 'languageName': {'simpleText': 'Madurese'}}, + {'languageCode': 'maf', 'languageName': {'simpleText': 'Mafa'}}, + {'languageCode': 'mag', 'languageName': {'simpleText': 'Magahi'}}, + {'languageCode': 'mai', 'languageName': {'simpleText': 'Maithili'}}, + {'languageCode': 'mak', 'languageName': {'simpleText': 'Makasar'}}, + {'languageCode': 'man', 'languageName': {'simpleText': 'Mandingo'}}, + {'languageCode': 'mas', 'languageName': {'simpleText': 'Masai'}}, + {'languageCode': 'mde', 'languageName': {'simpleText': 'Maba'}}, + {'languageCode': 'mdf', 'languageName': {'simpleText': 'Moksha'}}, + {'languageCode': 'mdr', 'languageName': {'simpleText': 'Mandar'}}, + {'languageCode': 'men', 'languageName': {'simpleText': 'Mende'}}, + {'languageCode': 'mer', 'languageName': {'simpleText': 'Meru'}}, + {'languageCode': 'mfe', 'languageName': {'simpleText': 'Morisyen'}}, + {'languageCode': 'mg', 'languageName': {'simpleText': 'Malagasy'}}, + {'languageCode': 'mga', 'languageName': {'simpleText': 'Middle Irish'}}, + {'languageCode': 'mgh', 'languageName': {'simpleText': 'Makhuwa-Meetto'}}, + {'languageCode': 'mgo', 'languageName': {'simpleText': 'Meta\u02bc'}}, + {'languageCode': 'mh', 'languageName': {'simpleText': 'Marshallese'}}, + {'languageCode': 'mi', 'languageName': {'simpleText': 'M\u0101ori'}}, + {'languageCode': 'mic', 'languageName': {'simpleText': 'Mi\'kmaw'}}, + {'languageCode': 'min', 'languageName': {'simpleText': 'Minangkabau'}}, + {'languageCode': 'mk', 'languageName': {'simpleText': 'Macedonian'}}, + {'languageCode': 'ml', 'languageName': {'simpleText': 'Malayalam'}}, + {'languageCode': 'mn', 'languageName': {'simpleText': 'Mongolian'}}, + {'languageCode': 'mnc', 'languageName': {'simpleText': 'Manchu'}}, + {'languageCode': 'mni', 'languageName': {'simpleText': 'Manipuri'}}, + {'languageCode': 'mni_Beng', 'languageName': {'simpleText': 'Manipuri (Bangla)'}}, + {'languageCode': 'mo', 'languageName': {'simpleText': 'Romanian'}}, + {'languageCode': 'moh', 'languageName': {'simpleText': 'Mohawk'}}, + {'languageCode': 'mos', 'languageName': {'simpleText': 'Mossi'}}, + {'languageCode': 'mr', 'languageName': {'simpleText': 'Marathi'}}, + {'languageCode': 'ms', 'languageName': {'simpleText': 'Malay'}}, + {'languageCode': 'mt', 'languageName': {'simpleText': 'Maltese'}}, + {'languageCode': 'mua', 'languageName': {'simpleText': 'Mundang'}}, + {'languageCode': 'mul', 'languageName': {'simpleText': 'Multiple languages'}}, + {'languageCode': 'mus', 'languageName': {'simpleText': 'Muscogee'}}, + {'languageCode': 'mwl', 'languageName': {'simpleText': 'Mirandese'}}, + {'languageCode': 'mwr', 'languageName': {'simpleText': 'Marwari'}}, + {'languageCode': 'my', 'languageName': {'simpleText': 'Burmese'}}, + {'languageCode': 'mye', 'languageName': {'simpleText': 'Myene'}}, + {'languageCode': 'myv', 'languageName': {'simpleText': 'Erzya'}}, + {'languageCode': 'mzn', 'languageName': {'simpleText': 'Mazanderani'}}, + {'languageCode': 'na', 'languageName': {'simpleText': 'Nauru'}}, + {'languageCode': 'nap', 'languageName': {'simpleText': 'Neapolitan'}}, + {'languageCode': 'naq', 'languageName': {'simpleText': 'Nama'}}, + {'languageCode': 'nb', 'languageName': {'simpleText': 'Norwegian Bokm\u00e5l'}}, + {'languageCode': 'nd', 'languageName': {'simpleText': 'North Ndebele'}}, + {'languageCode': 'nds', 'languageName': {'simpleText': 'Low German'}}, + {'languageCode': 'nds_NL', 'languageName': {'simpleText': 'Low German (Netherlands)'}}, + {'languageCode': 'ne', 'languageName': {'simpleText': 'Nepali'}}, + {'languageCode': 'new', 'languageName': {'simpleText': 'Newari'}}, + {'languageCode': 'ng', 'languageName': {'simpleText': 'Ndonga'}}, + {'languageCode': 'nia', 'languageName': {'simpleText': 'Nias'}}, + {'languageCode': 'niu', 'languageName': {'simpleText': 'Niuean'}}, + {'languageCode': 'nl', 'languageName': {'simpleText': 'Dutch'}}, + {'languageCode': 'nl_BE', 'languageName': {'simpleText': 'Dutch (Belgium)'}}, + {'languageCode': 'nmg', 'languageName': {'simpleText': 'Kwasio'}}, + {'languageCode': 'nn', 'languageName': {'simpleText': 'Norwegian Nynorsk'}}, + {'languageCode': 'nnh', 'languageName': {'simpleText': 'Ngiemboon'}}, + {'languageCode': 'no', 'languageName': {'simpleText': 'Norwegian'}}, + {'languageCode': 'nog', 'languageName': {'simpleText': 'Nogai'}}, + {'languageCode': 'non', 'languageName': {'simpleText': 'Old Norse'}}, + {'languageCode': 'nqo', 'languageName': {'simpleText': 'N\u2019Ko'}}, + {'languageCode': 'nr', 'languageName': {'simpleText': 'South Ndebele'}}, + {'languageCode': 'nso', 'languageName': {'simpleText': 'Northern Sotho'}}, + {'languageCode': 'nus', 'languageName': {'simpleText': 'Nuer'}}, + {'languageCode': 'nv', 'languageName': {'simpleText': 'Navajo'}}, + {'languageCode': 'nwc', 'languageName': {'simpleText': 'Classical Newari'}}, + {'languageCode': 'ny', 'languageName': {'simpleText': 'Nyanja'}}, + {'languageCode': 'nym', 'languageName': {'simpleText': 'Nyamwezi'}}, + {'languageCode': 'nyn', 'languageName': {'simpleText': 'Nyankole'}}, + {'languageCode': 'nyo', 'languageName': {'simpleText': 'Nyoro'}}, + {'languageCode': 'nzi', 'languageName': {'simpleText': 'Nzima'}}, + {'languageCode': 'oc', 'languageName': {'simpleText': 'Occitan'}}, + {'languageCode': 'oj', 'languageName': {'simpleText': 'Ojibwa'}}, + {'languageCode': 'om', 'languageName': {'simpleText': 'Oromo'}}, + {'languageCode': 'or', 'languageName': {'simpleText': 'Odia'}}, + {'languageCode': 'os', 'languageName': {'simpleText': 'Ossetic'}}, + {'languageCode': 'osa', 'languageName': {'simpleText': 'Osage'}}, + {'languageCode': 'ota', 'languageName': {'simpleText': 'Ottoman Turkish'}}, + {'languageCode': 'pa', 'languageName': {'simpleText': 'Punjabi'}}, + {'languageCode': 'pa_Arab', 'languageName': {'simpleText': 'Punjabi (Arabic)'}}, + {'languageCode': 'pa_Guru', 'languageName': {'simpleText': 'Punjabi (Gurmukhi)'}}, + {'languageCode': 'pag', 'languageName': {'simpleText': 'Pangasinan'}}, + {'languageCode': 'pal', 'languageName': {'simpleText': 'Pahlavi'}}, + {'languageCode': 'pam', 'languageName': {'simpleText': 'Pampanga'}}, + {'languageCode': 'pap', 'languageName': {'simpleText': 'Papiamento'}}, + {'languageCode': 'pau', 'languageName': {'simpleText': 'Palauan'}}, + {'languageCode': 'pcm', 'languageName': {'simpleText': 'Nigerian Pidgin'}}, + {'languageCode': 'peo', 'languageName': {'simpleText': 'Old Persian'}}, + {'languageCode': 'phn', 'languageName': {'simpleText': 'Phoenician'}}, + {'languageCode': 'pi', 'languageName': {'simpleText': 'Pali'}}, + {'languageCode': 'pl', 'languageName': {'simpleText': 'Polish'}}, + {'languageCode': 'pon', 'languageName': {'simpleText': 'Pohnpeian'}}, + {'languageCode': 'prg', 'languageName': {'simpleText': 'Prussian'}}, + {'languageCode': 'pro', 'languageName': {'simpleText': 'Old Proven\u00e7al'}}, + {'languageCode': 'ps', 'languageName': {'simpleText': 'Pashto'}}, + {'languageCode': 'pt', 'languageName': {'simpleText': 'Portuguese'}}, + {'languageCode': 'pt_BR', 'languageName': {'simpleText': 'Portuguese (Brazil)'}}, + {'languageCode': 'pt_PT', 'languageName': {'simpleText': 'Portuguese (Portugal)'}}, + {'languageCode': 'qu', 'languageName': {'simpleText': 'Quechua'}}, + {'languageCode': 'raj', 'languageName': {'simpleText': 'Rajasthani'}}, + {'languageCode': 'rap', 'languageName': {'simpleText': 'Rapanui'}}, + {'languageCode': 'rar', 'languageName': {'simpleText': 'Rarotongan'}}, + {'languageCode': 'rm', 'languageName': {'simpleText': 'Romansh'}}, + {'languageCode': 'rn', 'languageName': {'simpleText': 'Rundi'}}, + {'languageCode': 'ro', 'languageName': {'simpleText': 'Romanian'}}, + {'languageCode': 'ro_MD', 'languageName': {'simpleText': 'Romanian (Moldova)'}}, + {'languageCode': 'rof', 'languageName': {'simpleText': 'Rombo'}}, + {'languageCode': 'rom', 'languageName': {'simpleText': 'Romany'}}, + {'languageCode': 'ru', 'languageName': {'simpleText': 'Russian'}}, + {'languageCode': 'rup', 'languageName': {'simpleText': 'Aromanian'}}, + {'languageCode': 'rw', 'languageName': {'simpleText': 'Kinyarwanda'}}, + {'languageCode': 'rwk', 'languageName': {'simpleText': 'Rwa'}}, + {'languageCode': 'sa', 'languageName': {'simpleText': 'Sanskrit'}}, + {'languageCode': 'sad', 'languageName': {'simpleText': 'Sandawe'}}, + {'languageCode': 'sah', 'languageName': {'simpleText': 'Yakut'}}, + {'languageCode': 'sam', 'languageName': {'simpleText': 'Samaritan Aramaic'}}, + {'languageCode': 'saq', 'languageName': {'simpleText': 'Samburu'}}, + {'languageCode': 'sas', 'languageName': {'simpleText': 'Sasak'}}, + {'languageCode': 'sat', 'languageName': {'simpleText': 'Santali'}}, + {'languageCode': 'sat_Olck', 'languageName': {'simpleText': 'Santali (Ol Chiki)'}}, + {'languageCode': 'sba', 'languageName': {'simpleText': 'Ngambay'}}, + {'languageCode': 'sbp', 'languageName': {'simpleText': 'Sangu'}}, + {'languageCode': 'sc', 'languageName': {'simpleText': 'Sardinian'}}, + {'languageCode': 'scn', 'languageName': {'simpleText': 'Sicilian'}}, + {'languageCode': 'sco', 'languageName': {'simpleText': 'Scots'}}, + {'languageCode': 'sd', 'languageName': {'simpleText': 'Sindhi'}}, + {'languageCode': 'sd_Arab', 'languageName': {'simpleText': 'Sindhi (Arabic)'}}, + {'languageCode': 'sd_Deva', 'languageName': {'simpleText': 'Sindhi (Devanagari)'}}, + {'languageCode': 'se', 'languageName': {'simpleText': 'Northern Sami'}}, + {'languageCode': 'see', 'languageName': {'simpleText': 'Seneca'}}, + {'languageCode': 'seh', 'languageName': {'simpleText': 'Sena'}}, + {'languageCode': 'sel', 'languageName': {'simpleText': 'Selkup'}}, + {'languageCode': 'ses', 'languageName': {'simpleText': 'Koyraboro Senni'}}, + {'languageCode': 'sg', 'languageName': {'simpleText': 'Sango'}}, + {'languageCode': 'sga', 'languageName': {'simpleText': 'Old Irish'}}, + {'languageCode': 'sh', 'languageName': {'simpleText': 'Serbo-Croatian'}}, + {'languageCode': 'shi', 'languageName': {'simpleText': 'Tachelhit'}}, + {'languageCode': 'shi_Latn', 'languageName': {'simpleText': 'Tachelhit (Latin)'}}, + {'languageCode': 'shi_Tfng', 'languageName': {'simpleText': 'Tachelhit (Tifinagh)'}}, + {'languageCode': 'shn', 'languageName': {'simpleText': 'Shan'}}, + {'languageCode': 'shu', 'languageName': {'simpleText': 'Chadian Arabic'}}, + {'languageCode': 'si', 'languageName': {'simpleText': 'Sinhala'}}, + {'languageCode': 'sid', 'languageName': {'simpleText': 'Sidamo'}}, + {'languageCode': 'sk', 'languageName': {'simpleText': 'Slovak'}}, + {'languageCode': 'sl', 'languageName': {'simpleText': 'Slovenian'}}, + {'languageCode': 'sm', 'languageName': {'simpleText': 'Samoan'}}, + {'languageCode': 'sma', 'languageName': {'simpleText': 'Southern Sami'}}, + {'languageCode': 'smj', 'languageName': {'simpleText': 'Lule Sami'}}, + {'languageCode': 'smn', 'languageName': {'simpleText': 'Inari Sami'}}, + {'languageCode': 'sms', 'languageName': {'simpleText': 'Skolt Sami'}}, + {'languageCode': 'sn', 'languageName': {'simpleText': 'Shona'}}, + {'languageCode': 'snk', 'languageName': {'simpleText': 'Soninke'}}, + {'languageCode': 'so', 'languageName': {'simpleText': 'Somali'}}, + {'languageCode': 'sog', 'languageName': {'simpleText': 'Sogdien'}}, + {'languageCode': 'sq', 'languageName': {'simpleText': 'Albanian'}}, + {'languageCode': 'sr', 'languageName': {'simpleText': 'Serbian'}}, + {'languageCode': 'sr_Cyrl', 'languageName': {'simpleText': 'Serbian (Cyrillic)'}}, + {'languageCode': 'sr_Latn', 'languageName': {'simpleText': 'Serbian (Latin)'}}, + {'languageCode': 'srn', 'languageName': {'simpleText': 'Sranan Tongo'}}, + {'languageCode': 'srr', 'languageName': {'simpleText': 'Serer'}}, + {'languageCode': 'ss', 'languageName': {'simpleText': 'Swati'}}, + {'languageCode': 'ssy', 'languageName': {'simpleText': 'Saho'}}, + {'languageCode': 'st', 'languageName': {'simpleText': 'Southern Sotho'}}, + {'languageCode': 'su', 'languageName': {'simpleText': 'Sundanese'}}, + {'languageCode': 'su_Latn', 'languageName': {'simpleText': 'Sundanese (Latin)'}}, + {'languageCode': 'suk', 'languageName': {'simpleText': 'Sukuma'}}, + {'languageCode': 'sus', 'languageName': {'simpleText': 'Susu'}}, + {'languageCode': 'sux', 'languageName': {'simpleText': 'Sumerian'}}, + {'languageCode': 'sv', 'languageName': {'simpleText': 'Swedish'}}, + {'languageCode': 'sw', 'languageName': {'simpleText': 'Swahili'}}, + {'languageCode': 'sw_CD', 'languageName': {'simpleText': 'Swahili (Congo - Kinshasa)'}}, + {'languageCode': 'swb', 'languageName': {'simpleText': 'Comorian'}}, + {'languageCode': 'syc', 'languageName': {'simpleText': 'Classical Syriac'}}, + {'languageCode': 'syr', 'languageName': {'simpleText': 'Syriac'}}, + {'languageCode': 'szl', 'languageName': {'simpleText': 'Silesian'}}, + {'languageCode': 'ta', 'languageName': {'simpleText': 'Tamil'}}, + {'languageCode': 'te', 'languageName': {'simpleText': 'Telugu'}}, + {'languageCode': 'tem', 'languageName': {'simpleText': 'Timne'}}, + {'languageCode': 'teo', 'languageName': {'simpleText': 'Teso'}}, + {'languageCode': 'ter', 'languageName': {'simpleText': 'Tereno'}}, + {'languageCode': 'tet', 'languageName': {'simpleText': 'Tetum'}}, + {'languageCode': 'tg', 'languageName': {'simpleText': 'Tajik'}}, + {'languageCode': 'th', 'languageName': {'simpleText': 'Thai'}}, + {'languageCode': 'ti', 'languageName': {'simpleText': 'Tigrinya'}}, + {'languageCode': 'tig', 'languageName': {'simpleText': 'Tigre'}}, + {'languageCode': 'tiv', 'languageName': {'simpleText': 'Tiv'}}, + {'languageCode': 'tk', 'languageName': {'simpleText': 'Turkmen'}}, + {'languageCode': 'tkl', 'languageName': {'simpleText': 'Tokelau'}}, + {'languageCode': 'tl', 'languageName': {'simpleText': 'Tagalog'}}, + {'languageCode': 'tlh', 'languageName': {'simpleText': 'Klingon'}}, + {'languageCode': 'tli', 'languageName': {'simpleText': 'Tlingit'}}, + {'languageCode': 'tmh', 'languageName': {'simpleText': 'Tamashek'}}, + {'languageCode': 'tn', 'languageName': {'simpleText': 'Tswana'}}, + {'languageCode': 'to', 'languageName': {'simpleText': 'Tongan'}}, + {'languageCode': 'tog', 'languageName': {'simpleText': 'Nyasa Tonga'}}, + {'languageCode': 'tok', 'languageName': {'simpleText': 'Toki Pona'}}, + {'languageCode': 'tpi', 'languageName': {'simpleText': 'Tok Pisin'}}, + {'languageCode': 'tr', 'languageName': {'simpleText': 'Turkish'}}, + {'languageCode': 'trv', 'languageName': {'simpleText': 'Taroko'}}, + {'languageCode': 'ts', 'languageName': {'simpleText': 'Tsonga'}}, + {'languageCode': 'tsi', 'languageName': {'simpleText': 'Tsimshian'}}, + {'languageCode': 'tt', 'languageName': {'simpleText': 'Tatar'}}, + {'languageCode': 'tum', 'languageName': {'simpleText': 'Tumbuka'}}, + {'languageCode': 'tvl', 'languageName': {'simpleText': 'Tuvalu'}}, + {'languageCode': 'tw', 'languageName': {'simpleText': 'Twi'}}, + {'languageCode': 'twq', 'languageName': {'simpleText': 'Tasawaq'}}, + {'languageCode': 'ty', 'languageName': {'simpleText': 'Tahitian'}}, + {'languageCode': 'tyv', 'languageName': {'simpleText': 'Tuvinian'}}, + {'languageCode': 'tzm', 'languageName': {'simpleText': 'Central Atlas Tamazight'}}, + {'languageCode': 'udm', 'languageName': {'simpleText': 'Udmurt'}}, + {'languageCode': 'ug', 'languageName': {'simpleText': 'Uyghur'}}, + {'languageCode': 'uga', 'languageName': {'simpleText': 'Ugaritic'}}, + {'languageCode': 'uk', 'languageName': {'simpleText': 'Ukrainian'}}, + {'languageCode': 'umb', 'languageName': {'simpleText': 'Umbundu'}}, + {'languageCode': 'ur', 'languageName': {'simpleText': 'Urdu'}}, + {'languageCode': 'uz', 'languageName': {'simpleText': 'Uzbek'}}, + {'languageCode': 'uz_Arab', 'languageName': {'simpleText': 'Uzbek (Arabic)'}}, + {'languageCode': 'uz_Cyrl', 'languageName': {'simpleText': 'Uzbek (Cyrillic)'}}, + {'languageCode': 'uz_Latn', 'languageName': {'simpleText': 'Uzbek (Latin)'}}, + {'languageCode': 'vai', 'languageName': {'simpleText': 'Vai'}}, + {'languageCode': 'vai_Latn', 'languageName': {'simpleText': 'Vai (Latin)'}}, + {'languageCode': 'vai_Vaii', 'languageName': {'simpleText': 'Vai (Vai)'}}, + {'languageCode': 've', 'languageName': {'simpleText': 'Venda'}}, + {'languageCode': 'vec', 'languageName': {'simpleText': 'Venetian'}}, + {'languageCode': 'vi', 'languageName': {'simpleText': 'Vietnamese'}}, + {'languageCode': 'vmw', 'languageName': {'simpleText': 'Makhuwa'}}, + {'languageCode': 'vo', 'languageName': {'simpleText': 'Volap\u00fck'}}, + {'languageCode': 'vot', 'languageName': {'simpleText': 'Votic'}}, + {'languageCode': 'vun', 'languageName': {'simpleText': 'Vunjo'}}, + {'languageCode': 'wa', 'languageName': {'simpleText': 'Walloon'}}, + {'languageCode': 'wae', 'languageName': {'simpleText': 'Walser'}}, + {'languageCode': 'wal', 'languageName': {'simpleText': 'Wolaytta'}}, + {'languageCode': 'war', 'languageName': {'simpleText': 'Waray'}}, + {'languageCode': 'was', 'languageName': {'simpleText': 'Washo'}}, + {'languageCode': 'wo', 'languageName': {'simpleText': 'Wolof'}}, + {'languageCode': 'xal', 'languageName': {'simpleText': 'Kalmyk'}}, + {'languageCode': 'xh', 'languageName': {'simpleText': 'Xhosa'}}, + {'languageCode': 'xnr', 'languageName': {'simpleText': 'Kangri'}}, + {'languageCode': 'xog', 'languageName': {'simpleText': 'Soga'}}, + {'languageCode': 'yao', 'languageName': {'simpleText': 'Yao'}}, + {'languageCode': 'yap', 'languageName': {'simpleText': 'Yapese'}}, + {'languageCode': 'yav', 'languageName': {'simpleText': 'Yangben'}}, + {'languageCode': 'ybb', 'languageName': {'simpleText': 'Yemba'}}, + {'languageCode': 'yi', 'languageName': {'simpleText': 'Yiddish'}}, + {'languageCode': 'yo', 'languageName': {'simpleText': 'Yoruba'}}, + {'languageCode': 'yrl', 'languageName': {'simpleText': 'Nheengatu'}}, + {'languageCode': 'yue', 'languageName': {'simpleText': 'Cantonese'}}, + {'languageCode': 'yue_Hans', 'languageName': {'simpleText': 'Cantonese (Simplified)'}}, + {'languageCode': 'yue_Hant', 'languageName': {'simpleText': 'Cantonese (Traditional)'}}, + {'languageCode': 'za', 'languageName': {'simpleText': 'Zhuang'}}, + {'languageCode': 'zap', 'languageName': {'simpleText': 'Zapotec'}}, + {'languageCode': 'zbl', 'languageName': {'simpleText': 'Blissymbols'}}, + {'languageCode': 'zen', 'languageName': {'simpleText': 'Zenaga'}}, + {'languageCode': 'zgh', 'languageName': {'simpleText': 'Standard Moroccan Tamazight'}}, + {'languageCode': 'zh', 'languageName': {'simpleText': 'Chinese'}}, + {'languageCode': 'zh_Hans', 'languageName': {'simpleText': 'Chinese (Simplified)'}}, + {'languageCode': 'zh_Hant', 'languageName': {'simpleText': 'Chinese (Traditional)'}}, + {'languageCode': 'zh_TW', 'languageName': {'simpleText': 'Chinese (Taiwan)'}}, + {'languageCode': 'zu', 'languageName': {'simpleText': 'Zulu'}}, + {'languageCode': 'zun', 'languageName': {'simpleText': 'Zuni'}}, + {'languageCode': 'zxx', 'languageName': {'simpleText': 'No linguistic content'}}, + {'languageCode': 'zza', 'languageName': {'simpleText': 'Zaza'}}, +] diff --git a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/constants/const_paths.py b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/constants/const_paths.py index e0003afb4d..ff8d359174 100644 --- a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/constants/const_paths.py +++ b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/constants/const_paths.py @@ -32,6 +32,6 @@ API_SUBMIT = '/youtube/api/submit' DRM = '/youtube/widevine' IP = '/youtube/client_ip' -MPD = '/youtube/manifest/dash/' +MPD = '/youtube/manifest/dash' PING = '/youtube/ping' REDIRECT = '/youtube/redirect' diff --git a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/constants/const_settings.py b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/constants/const_settings.py index 54acaab2a1..3f12718ee2 100644 --- a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/constants/const_settings.py +++ b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/constants/const_settings.py @@ -78,7 +78,17 @@ CONNECT_TIMEOUT = 'requests.timeout.connect' # (int) READ_TIMEOUT = 'requests.timeout.read' # (int) +PROXY_SOURCE = 'requests.proxy.source' # (int) +PROXY_ENABLED = 'requests.proxy.enabled' # (bool) +PROXY_TYPE = 'requests.proxy.type' # (int) +PROXY_SERVER = 'requests.proxy.server' # (str) +PROXY_PORT = 'requests.proxy.port' # (int) +PROXY_USERNAME = 'requests.proxy.username' # (str) +PROXY_PASSWORD = 'requests.proxy.password' # (str) + HTTPD_PORT = 'kodion.http.port' # (int) HTTPD_LISTEN = 'kodion.http.listen' # (str) HTTPD_WHITELIST = 'kodion.http.ip.whitelist' # (str) HTTPD_IDLE_SLEEP = 'youtube.http.idle_sleep' # (bool) + +LOGGING_ENABLED = 'kodion.logging.enabled' # (bool) diff --git a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/context/abstract_context.py b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/context/abstract_context.py index e13c679493..dc0ddd6d8f 100644 --- a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/context/abstract_context.py +++ b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/context/abstract_context.py @@ -12,13 +12,21 @@ import os -from .. import logger -from ..compatibility import parse_qsl, quote, to_str, urlencode, urlsplit +from ..logger import Logger +from ..compatibility import ( + parse_qsl, + quote, + to_str, + unquote, + urlencode, + urlsplit, +) from ..constants import ( PATHS, PLAY_FORCE_AUDIO, PLAY_PROMPT_QUALITY, PLAY_PROMPT_SUBTITLES, + PLAY_STRM, PLAY_TIMESHIFT, PLAY_WITH, VALUE_FROM_STR, @@ -36,7 +44,7 @@ from ..utils import current_system_version -class AbstractContext(object): +class AbstractContext(Logger): _initialized = False _addon = None _settings = None @@ -45,6 +53,7 @@ class AbstractContext(object): PLAY_FORCE_AUDIO, PLAY_PROMPT_SUBTITLES, PLAY_PROMPT_QUALITY, + PLAY_STRM, PLAY_TIMESHIFT, PLAY_WITH, 'confirmed', @@ -52,19 +61,21 @@ class AbstractContext(object): 'enable', 'hide_folders', 'hide_live', + 'hide_next_page', 'hide_playlists', 'hide_search', 'incognito', 'location', 'logged_in', - 'play', 'resume', 'screensaver', - 'strm', + 'window_fallback', + 'window_replace', 'window_return', } _INT_PARAMS = { 'fanart_type', + 'items_per_page', 'live', 'next_page_token', 'offset', @@ -81,7 +92,9 @@ class AbstractContext(object): } _LIST_PARAMS = { 'channel_ids', + 'item_filter', 'playlist_ids', + 'video_ids', } _STRING_PARAMS = { 'api_key', @@ -89,19 +102,18 @@ class AbstractContext(object): 'addon_id', 'category_label', 'channel_id', - 'channel_name', 'client_id', 'client_secret', 'click_tracking', 'event_type', 'item', 'item_id', + 'item_name', 'order', 'page_token', 'parent_id', 'playlist', # deprecated 'playlist_id', - 'playlist_name', 'q', 'rating', 'reload_path', @@ -110,12 +122,12 @@ class AbstractContext(object): 'uri', 'videoid', # deprecated 'video_id', - 'video_name', 'visitor', } _STRING_BOOL_PARAMS = { 'reload_path', } + _NON_EMPTY_STRING_PARAMS = set() def __init__(self, path='/', params=None, plugin_id=''): self._access_manager = None @@ -135,9 +147,13 @@ def __init__(self, path='/', params=None, plugin_id=''): self._plugin_icon = None self._version = 'UNKNOWN' - self._path = self.create_path(path) + self._path = path + self._path_parts = [] + self.set_path(path, force=True) + self._params = params or {} self.parse_params(self._params) + self._uri = self.create_uri(self._path, self._params) @staticmethod @@ -240,16 +256,7 @@ def reload_access_manager(self, get_uuid=False): return uuid return access_manager - def get_video_playlist(self): - raise NotImplementedError() - - def get_audio_playlist(self): - raise NotImplementedError() - - def get_video_player(self): - raise NotImplementedError() - - def get_audio_player(self): + def get_playlist_player(self): raise NotImplementedError() def get_ui(self): @@ -270,7 +277,9 @@ def create_uri(self, path=None, params=None, run=False): uri = self._plugin_id.join(('plugin://', uri)) if params: - uri = '?'.join((uri, urlencode(params))) + if isinstance(params, (dict, list, tuple)): + params = urlencode(params) + uri = '?'.join((uri, params)) return ''.join(( 'RunPlugin(', @@ -278,32 +287,42 @@ def create_uri(self, path=None, params=None, run=False): ')' )) if run else uri + def get_parent_uri(self, **kwargs): + return self.create_uri(self._path_parts[:-1], **kwargs) + @staticmethod def create_path(*args, **kwargs): - path = '/'.join([ - part - for part in [ + include_parts = kwargs.get('parts') + parts = [ + part for part in [ str(arg).strip('/').replace('\\', '/').replace('//', '/') for arg in args ] if part - ]) - if path: - path = path.join(('/', '/')) + ] + if parts: + path = '/'.join(parts).join(('/', '/')) + if path.startswith(PATHS.ROUTE): + parts = parts[2:] + elif path.startswith(PATHS.COMMAND): + parts = [] + elif path.startswith(PATHS.GOTO_PAGE): + parts = parts[2:] + if parts and parts[0].isnumeric(): + parts = parts[1:] else: - return '/' + return ('/', parts) if include_parts else '/' if kwargs.get('is_uri'): - return quote(path) - return path + path = quote(path) + return (path, parts) if include_parts else path def get_path(self): return self._path def set_path(self, *path, **kwargs): if kwargs.get('force'): - self._path = path[0] - else: - self._path = self.create_path(*path) + path = unquote(path[0]).split('/') + self._path, self._path_parts = self.create_path(*path, parts=True) def get_params(self): return self._params @@ -313,8 +332,11 @@ def get_param(self, name, default=None): def parse_uri(self, uri): uri = urlsplit(uri) - path = uri.path - params = self.parse_params(dict(parse_qsl(uri.query)), update=False) + path = uri.path.rstrip('/') + params = self.parse_params( + dict(parse_qsl(uri.query, keep_blank_values=True)), + update=False, + ) return path, params def parse_params(self, params, update=True): @@ -324,26 +346,26 @@ def parse_params(self, params, update=True): for param, value in params.items(): try: if param in self._BOOL_PARAMS: - parsed_value = VALUE_FROM_STR.get(str(value).lower(), False) + parsed_value = VALUE_FROM_STR.get(str(value), False) elif param in self._INT_PARAMS: - parsed_value = None - if param in self._INT_BOOL_PARAMS: - parsed_value = VALUE_FROM_STR.get(str(value).lower()) - if parsed_value is None: - parsed_value = int(value) - else: - parsed_value = int(parsed_value) + parsed_value = int( + (VALUE_FROM_STR.get(str(value), value) or 0) + if param in self._INT_BOOL_PARAMS else + value + ) elif param in self._FLOAT_PARAMS: parsed_value = float(value) elif param in self._LIST_PARAMS: - parsed_value = [ - val for val in value.split(',') if val - ] + parsed_value = ( + list(value) + if isinstance(value, (list, tuple)) else + [val for val in value.split(',') if val] + ) elif param in self._STRING_PARAMS: parsed_value = to_str(value) if param in self._STRING_BOOL_PARAMS: parsed_value = VALUE_FROM_STR.get( - parsed_value.lower(), parsed_value + parsed_value, parsed_value ) # process and translate deprecated parameters elif param == 'action': @@ -357,8 +379,15 @@ def parse_params(self, params, update=True): elif params == 'playlist': to_delete.append(param) param = 'playlist_id' + elif param in self._NON_EMPTY_STRING_PARAMS: + parsed_value = to_str(value) + parsed_value = VALUE_FROM_STR.get( + parsed_value, parsed_value + ) + if not parsed_value: + raise ValueError else: - self.log_debug('Unknown parameter - |{0}: {1}|'.format( + self.log_debug('Unknown parameter - |{0}: {1!r}|'.format( param, value )) to_delete.append(param) @@ -430,29 +459,10 @@ def set_content(self, content_type, sub_type=None, category_label=None): def add_sort_method(self, *sort_methods): raise NotImplementedError() - def log(self, text, log_level=logger.NOTICE): - logger.log(text, log_level, self.get_id()) - - def log_warning(self, text): - self.log(text, logger.WARNING) - - def log_error(self, text): - self.log(text, logger.ERROR) - - def log_notice(self, text): - self.log(text, logger.NOTICE) - - def log_debug(self, text): - self.log(text, logger.DEBUG) - - def log_info(self, text): - self.log(text, logger.INFO) - def clone(self, new_path=None, new_params=None): raise NotImplementedError() - @staticmethod - def execute(command): + def execute(self, command, wait=False, wait_for=None): raise NotImplementedError() @staticmethod diff --git a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/context/xbmc/xbmc_context.py b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/context/xbmc/xbmc_context.py index 33f7914bf8..fc4ea0b8a9 100644 --- a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/context/xbmc/xbmc_context.py +++ b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/context/xbmc/xbmc_context.py @@ -18,7 +18,6 @@ from ..abstract_context import AbstractContext from ...compatibility import ( parse_qsl, - unquote, urlsplit, xbmc, xbmcaddon, @@ -32,7 +31,7 @@ SORT, WAKEUP, ) -from ...player import XbmcPlayer, XbmcPlaylist +from ...player import XbmcPlaylistPlayer from ...settings import XbmcPluginSettings from ...ui import XbmcContextUI from ...utils import ( @@ -50,35 +49,41 @@ class XbmcContext(AbstractContext): _KODI_UI_SUBTITLE_OPTIONS = None LOCAL_MAP = { + 'api.config': 30634, + 'api.config.bookmark': 30638, + 'api.config.not_updated': 30635, + 'api.config.save': 190, + 'api.config.updated': 30631, 'api.id': 30202, 'api.key': 30201, 'api.key.incorrect': 30648, - 'api.personal.enabled': 30598, + 'api.personal.enabled': 30636, + 'api.personal.disabled': 30637, 'api.personal.failed': 30599, 'api.secret': 30203, - 'archive': 30105, - 'are_you_sure': 30703, - 'auto_remove_watch_later': 30515, + 'are_you_sure': 750, 'bookmark': 30101, 'bookmark.channel': 30803, 'bookmark.created': 21362, 'bookmark.remove': 20404, 'bookmarks': 30100, 'bookmarks.clear': 30801, - 'bookmarks.clear.confirm': 30802, + 'bookmarks.clear.check': 30802, 'browse_channels': 30512, - 'cancel': 30615, - 'channels': 30500, + 'cancel': 222, + 'channel': 19029, + 'channels': 19019, 'client.id.incorrect': 30649, 'client.ip': 30700, 'client.ip.failed': 30701, 'client.secret.incorrect': 30650, - 'content.clear': 30121, - 'content.clear.confirm': 30120, - 'content.delete': 30116, - 'content.delete.confirm': 30114, - 'content.remove': 30117, - 'content.remove.confirm': 30115, + 'completed': 19256, + 'content.clear': 30120, + 'content.clear.check': 30121, + 'content.delete': 30114, + 'content.delete.check': 30116, + 'content.remove': 30115, + 'content.remove.check': 30117, 'datetime.a_minute_ago': 30677, 'datetime.airing_now': 30691, 'datetime.airing_soon': 30693, @@ -95,7 +100,7 @@ class XbmcContext(AbstractContext): 'datetime.two_days_ago': 30683, 'datetime.two_hours_ago': 30680, 'datetime.yesterday_at': 30682, - 'delete': 30118, + 'delete': 117, 'disliked.video': 30717, 'error.no_video_streams_found': 30549, 'error.rtmpe_not_supported': 30542, @@ -103,23 +108,22 @@ class XbmcContext(AbstractContext): 'go_to_channel': 30502, 'history': 30509, 'history.clear': 30609, - 'history.clear.confirm': 30610, + 'history.clear.check': 30610, 'history.list.remove': 30572, - 'history.list.remove.confirm': 30573, + 'history.list.remove.check': 30573, 'history.list.set': 30571, - 'history.list.set.confirm': 30574, + 'history.list.set.check': 30574, 'history.mark.unwatched': 30669, 'history.mark.watched': 30670, - 'history.remove': 30108, + 'history.remove': 15015, 'history.reset.resume_point': 30674, + 'home': 10000, 'httpd.not.running': 30699, 'inputstreamhelper.is_installed': 30625, - 'isa.enable.confirm': 30579, + 'isa.enable.check': 30579, 'key.requirement': 30731, - 'latest_videos': 30109, - 'library': 30103, 'liked.video': 30716, - 'live': 30539, + 'live': 19664, 'live.completed': 30647, 'live.upcoming': 30646, 'maintenance.bookmarks': 30800, @@ -132,53 +136,63 @@ class XbmcContext(AbstractContext): 'my_channel': 30507, 'my_location': 30654, 'my_subscriptions': 30510, + 'my_subscriptions.loading': 575, 'my_subscriptions.filter.add': 30587, 'my_subscriptions.filter.added': 30589, 'my_subscriptions.filter.remove': 30588, 'my_subscriptions.filter.removed': 30590, 'my_subscriptions.filtered': 30584, - 'none': 30561, + 'none': 231, 'page.back': 30815, 'page.choose': 30806, 'page.empty': 30816, 'page.next': 30106, 'playlist.added_to': 30714, - 'playlist.create': 30522, - 'playlist.play.all': 30531, - 'playlist.play.default': 30532, + 'playlist.create': 525, + 'playlist.play.all': 22083, + 'playlist.play.default': 571, 'playlist.play.from_here': 30537, 'playlist.play.reverse': 30533, 'playlist.play.select': 30535, - 'playlist.play.shuffle': 30534, + 'playlist.play.shuffle': 191, + 'playlist.podcast': 30820, 'playlist.progress.updating': 30536, 'playlist.removed_from': 30715, - 'playlist.select': 30521, - 'playlists': 30501, + 'playlist.select': 524, + 'playlist.view.all': 30562, + 'playlists': 136, 'please_wait': 30119, - 'prompt': 30566, 'purchases': 30622, 'recommendations': 30551, - 'refresh': 30543, - 'refresh.settings.confirm': 30818, + 'refresh': 184, + 'refresh.settings.check': 30818, 'related_videos': 30514, - 'remove': 30108, + 'remove': 15015, 'removed': 30666, - 'rename': 30113, + 'rename': 118, 'renamed': 30667, - 'reset.access_manager.confirm': 30581, + 'reset.access_manager.check': 30581, 'retry': 30612, 'saved.playlists': 30611, - 'search': 30102, + 'search': 137, 'search.clear': 30556, + 'search.history': 30558, 'search.new': 30110, 'search.quick': 30605, 'search.quick.incognito': 30606, - 'search.remove': 30108, - 'search.rename': 30113, - 'search.title': 30102, + 'search.remove': 15015, + 'search.rename': 118, + 'search.sort': 550, + 'search.sort.date': 552, + 'search.sort.rating': 563, + 'search.sort.relevance': 420, + 'search.sort.title': 369, + 'search.sort.viewCount': 30767, + 'search.title': 137, + 'select': 424, 'select.listen.ip': 30644, 'select_video_quality': 30010, - 'settings': 30577, + 'settings': 10004, 'setup_wizard': 30526, 'setup_wizard.capabilities': 30786, 'setup_wizard.capabilities.720p30': 30787, @@ -196,24 +210,28 @@ class XbmcContext(AbstractContext): 'setup_wizard.prompt.import_search_history': 30779, 'setup_wizard.prompt.locale': 30527, 'setup_wizard.prompt.my_location': 30653, - 'setup_wizard.prompt.settings': 30577, + 'setup_wizard.prompt.settings': 10004, 'setup_wizard.prompt.settings.defaults': 30783, 'setup_wizard.prompt.settings.list_details': 30784, 'setup_wizard.prompt.settings.performance': 30785, 'setup_wizard.prompt.settings.refresh': 30817, - 'setup_wizard.prompt.subtitles': 30600, + 'setup_wizard.prompt.subtitles': 287, 'sign.enter_code': 30519, 'sign.go_to': 30502, 'sign.in': 30111, 'sign.out': 30112, - 'sign.twice.text': 30547, - 'sign.twice.title': 30546, + 'sign.multi.text': 30547, + 'sign.multi.title': 30546, + 'start': 335, 'stats.commentCount': 30732, # 'stats.favoriteCount': 1036, + 'stats.itemCount': 20360, 'stats.likeCount': 30733, + 'stats.subscriberCount': 30739, + 'stats.videoCount': 3, 'stats.viewCount': 30767, 'stream.alternate': 30747, - 'stream.automatic': 30583, + 'stream.automatic': 36588, 'stream.descriptive': 30746, 'stream.dubbed': 30745, 'stream.multi_audio': 30763, @@ -226,7 +244,7 @@ class XbmcContext(AbstractContext): 'subtitles.download': 30705, 'subtitles.download.pre': 30706, 'subtitles.all': 30774, - 'subtitles.language': 30560, + 'subtitles.language': 21448, 'subtitles.no_asr': 30602, 'subtitles.translation': 30775, 'subtitles.with_fallback': 30601, @@ -240,7 +258,7 @@ class XbmcContext(AbstractContext): 'updated_': 30597, 'uploads': 30726, 'user.changed': 30659, - 'user.default': 30532, + 'user.default': 571, 'user.enter_name': 30658, 'user.new': 30656, 'user.remove': 30662, @@ -257,7 +275,7 @@ class XbmcContext(AbstractContext): 'video.description.links.not_found': 30545, 'video.disliked': 30538, 'video.liked': 30508, - 'video.more': 30548, + 'video.more': 22082, 'video.play.ask_for_quality': 30730, 'video.play.audio_only': 30708, 'video.play.timeshift': 30819, @@ -267,20 +285,49 @@ class XbmcContext(AbstractContext): 'video.rate': 30528, 'video.rate.dislike': 30530, 'video.rate.like': 30529, - 'video.rate.none': 30108, + 'video.rate.none': 15015, + 'videos': 3, 'watch_later': 30107, 'watch_later.add': 30107, 'watch_later.added_to': 30713, 'watch_later.clear': 30769, - 'watch_later.clear.confirm': 30770, + 'watch_later.clear.check': 30770, 'watch_later.list.remove': 30568, - 'watch_later.list.remove.confirm': 30569, + 'watch_later.list.remove.check': 30569, 'watch_later.list.set': 30567, - 'watch_later.list.set.confirm': 30570, - 'watch_later.remove': 30108, + 'watch_later.list.set.check': 30570, + 'watch_later.remove': 15015, 'youtube': 30003, } + SEARCH_PARAMS = { + 'forMine', + 'channelId', + 'channelType', + 'eventType', + 'location', + 'locationRadius', + 'maxResults', + 'order', + 'pageToken' + 'publishedAfter', + 'publishedBefore', + 'q', + 'safeSearch', + 'topicId', + 'type', + 'videoCaption', + 'videoCategoryId', + 'videoDefinition', + 'videoDimension', + 'videoDuration', + 'videoEmbeddable', + 'videoLicense', + 'videoPaidProductPlacement', + 'videoSyndicated', + 'videoType', + } + def __new__(cls, *args, **kwargs): self = super(XbmcContext, cls).__new__(cls) @@ -297,6 +344,9 @@ def __new__(cls, *args, **kwargs): self.localize(309), # UI language } + # Update default allowable params + cls._NON_EMPTY_STRING_PARAMS.update(self.SEARCH_PARAMS) + cls._initialized = True return self @@ -320,10 +370,7 @@ def __init__(self, self._version = self._addon.getAddonInfo('version') self._ui = None - self._video_playlist = None - self._audio_playlist = None - self._video_player = None - self._audio_player = None + self._playlist = None atexit.register(self.tear_down) @@ -341,15 +388,16 @@ def init(self): return # first the path of the uri - parsed_url = urlsplit(uri) - self._path = unquote(parsed_url.path) + self.set_path(urlsplit(uri).path, force=True) # after that try to get the params self._params = {} if num_args > 2: params = sys.argv[2][1:] if params: - self.parse_params(dict(parse_qsl(params))) + self.parse_params( + dict(parse_qsl(params, keep_blank_values=True)) + ) # then Kodi resume status if num_args > 3 and sys.argv[3].lower() == 'resume:true': @@ -426,25 +474,10 @@ def get_subtitle_language(self): sub_language = None return sub_language - def get_video_playlist(self): - if not self._video_playlist: - self._video_playlist = XbmcPlaylist('video', proxy(self)) - return self._video_playlist - - def get_audio_playlist(self): - if not self._audio_playlist: - self._audio_playlist = XbmcPlaylist('audio', proxy(self)) - return self._audio_playlist - - def get_video_player(self): - if not self._video_player: - self._video_player = XbmcPlayer('video', proxy(self)) - return self._video_player - - def get_audio_player(self): - if not self._audio_player: - self._audio_player = XbmcPlayer('audio', proxy(self)) - return self._audio_player + def get_playlist_player(self, playlist_type=None): + if not self._playlist or playlist_type: + self._playlist = XbmcPlaylistPlayer(proxy(self), playlist_type) + return self._playlist def get_ui(self): if not self._ui: @@ -509,20 +542,26 @@ def set_content(self, content_type, sub_type=None, category_label=None): )) def apply_content(self): + # ui local variable used for ui.get_view_manager() in unofficial version ui = self.get_ui() + content_type = ui.pop_property(CONTENT_TYPE) - if not content_type: - return + if content_type: + content_type, sub_type, category_label = json.loads(content_type) + self.log_debug('Applying content-type: |{type}| for |{path}|'.format( + type=(sub_type or content_type), path=self.get_path() + )) + xbmcplugin.setContent(self._plugin_handle, content_type) + else: + content_type = None + sub_type = None + category_label = None - content_type, sub_type, category_label = json.loads(content_type) - self.log_debug('Applying content-type: |{type}| for |{path}|'.format( - type=(sub_type or content_type), path=self.get_path() - )) - xbmcplugin.setContent(self._plugin_handle, content_type) if category_label is None: category_label = self.get_param('category_label') if category_label: xbmcplugin.setPluginCategory(self._plugin_handle, category_label) + detailed_labels = self.get_settings().show_detailed_labels() if sub_type == 'history': self.add_sort_method( @@ -544,6 +583,7 @@ def apply_content(self): (SORT.UNSORTED,), (SORT.LABEL,), ) + if content_type == CONTENT.VIDEO_CONTENT: self.add_sort_method( (SORT.CHANNEL, '[%A - ]%T \u2022 %P', '%D | %J'), @@ -566,7 +606,7 @@ def apply_content(self): ) def add_sort_method(self, *sort_methods): - args = slice(None if current_system_version.compatible(19, 0) else 2) + args = slice(None if current_system_version.compatible(19) else 2) for sort_method in sort_methods: xbmcplugin.addSortMethod(self._plugin_handle, *sort_method[args]) @@ -593,22 +633,24 @@ def clone(self, new_path=None, new_params=None): new_context._watch_later_list = self._watch_later_list new_context._ui = self._ui - new_context._video_playlist = self._video_playlist - new_context._audio_playlist = self._audio_playlist - new_context._video_player = self._video_player - new_context._audio_player = self._audio_player + new_context._playlist = self._playlist return new_context def execute(self, command, wait=False, wait_for=None): + if not wait_for: + xbmc.executebuiltin(command, wait) + return + + ui = self.get_ui() + ui.clear_property(wait_for) + pop_property = ui.pop_property + waitForAbort = xbmc.Monitor().waitForAbort + xbmc.executebuiltin(command, wait) - if wait_for: - ui = self.get_ui() - monitor = xbmc.Monitor() - while not monitor.abortRequested(): - monitor.waitForAbort(1) - if not ui.get_property(wait_for): - break + + while not pop_property(wait_for) and not waitForAbort(1): + pass @staticmethod def sleep(timeout=None): @@ -620,11 +662,15 @@ def addon_enabled(self, addon_id): 'properties': ['enabled']}) try: return response['result']['addon']['enabled'] is True - except (KeyError, TypeError): + except (KeyError, TypeError) as exc: error = response.get('error', {}) - self.log_error('XbmcContext.addon_enabled error - |{0}: {1}|' - .format(error.get('code', 'unknown'), - error.get('message', 'unknown'))) + self.log_error('XbmcContext.addon_enabled - Error' + '\n\tException: {exc!r}' + '\n\tCode: {code}' + '\n\tMessage: {msg}' + .format(exc=exc, + code=error.get('code', 'Unknown'), + msg=error.get('message', 'Unknown'))) return False def set_addon_enabled(self, addon_id, enabled=True): @@ -633,11 +679,15 @@ def set_addon_enabled(self, addon_id, enabled=True): 'enabled': enabled}) try: return response['result'] == 'OK' - except (KeyError, TypeError): + except (KeyError, TypeError) as exc: error = response.get('error', {}) - self.log_error('XbmcContext.set_addon_enabled error - |{0}: {1}|' - .format(error.get('code', 'unknown'), - error.get('message', 'unknown'))) + self.log_error('XbmcContext.set_addon_enabled - Error' + '\n\tException: {exc!r}' + '\n\tCode: {code}' + '\n\tMessage: {msg}' + .format(exc=exc, + code=error.get('code', 'Unknown'), + msg=error.get('message', 'Unknown'))) return False @staticmethod @@ -659,7 +709,7 @@ def use_inputstream_adaptive(self, prompt=False): if (prompt and self.get_ui().on_yes_no_input( self.get_name(), - self.localize('isa.enable.confirm'), + self.localize('isa.enable.check'), ) and self.set_addon_enabled('inputstream.adaptive')): prompt = False @@ -693,6 +743,7 @@ def use_inputstream_adaptive(self, prompt=False): 'av01': loose_version('20.3.0'), 'vp8': False, 'vp9': loose_version('2.3.14'), + 'vp9.2': loose_version('2.4.0'), } def inputstream_adaptive_capabilities(self, capability=None): @@ -761,10 +812,7 @@ def tear_down(self): attrs = ( '_ui', - '_video_playlist', - '_audio_playlist', - '_video_player', - '_audio_player', + '_playlist', ) for attr in attrs: try: @@ -773,11 +821,13 @@ def tear_down(self): except AttributeError: pass - def wakeup(self, target, timeout=None): + def wakeup(self, target, timeout=None, payload=None): data = {'target': target, 'response_required': bool(timeout)} + if payload: + data.update(payload) self.send_notification(WAKEUP, data) if not timeout: - return + return None pop_property = self.get_ui().pop_property no_timeout = timeout < 0 @@ -786,17 +836,34 @@ def wakeup(self, target, timeout=None): wait_period = wait_period_ms / 1000 while no_timeout or remaining > 0: - awake = pop_property(WAKEUP) - if awake: - if awake == target: - self.log_debug('Wakeup |{0}| in {1}ms' - .format(awake, timeout - remaining)) - else: - self.log_error('Wakeup |{0}| in {1}ms - expected |{2}|' - .format(awake, timeout - remaining, target)) + data = pop_property(WAKEUP) + if data: + data = json.loads(data) + + if data: + response = data.get('response') + response_target = data.get('target') or 'Unknown' + + if target == response_target: + if response: + self.log_debug('Wakeup |{0}| in {1}ms' + .format(response_target, + timeout - remaining)) + else: + self.log_error('Wakeup |{0}| in {1}ms - failed' + .format(response_target, + timeout - remaining)) + return response + + self.log_error('Wakeup |{0}| in {1}ms - expected |{2}|' + .format(response_target, + timeout - remaining, + target)) break + wait(wait_period) remaining -= wait_period_ms else: self.log_error('Wakeup |{0}| timed out in {1}ms' .format(target, timeout)) + return False diff --git a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/debug.py b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/debug.py index 0768366817..f99a5ad546 100644 --- a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/debug.py +++ b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/debug.py @@ -13,7 +13,7 @@ import atexit import os -from .logger import log_debug +from .logger import Logger def debug_here(host='localhost'): @@ -145,7 +145,7 @@ def __exit__(self, exc_type=None, exc_val=None, exc_tb=None): if not self._enabled: return - log_debug('Profiling stats: {0}'.format(self.get_stats( + Logger.log_debug('Profiling stats: {0}'.format(self.get_stats( num_lines=self._num_lines, print_callees=self._print_callees, reuse=self._reuse, @@ -270,7 +270,7 @@ def get_stats(self, return output def print_stats(self): - log_debug('Profiling stats: {0}'.format(self.get_stats( + Logger.log_debug('Profiling stats: {0}'.format(self.get_stats( num_lines=self._num_lines, print_callees=self._print_callees, reuse=self._reuse, diff --git a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/items/__init__.py b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/items/__init__.py index 7e11964e87..16e888f58d 100644 --- a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/items/__init__.py +++ b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/items/__init__.py @@ -15,11 +15,9 @@ from .command_item import CommandItem from .directory_item import DirectoryItem from .image_item import ImageItem -from .media_item import AudioItem, VideoItem -from .new_search_item import NewSearchItem +from .media_item import AudioItem, MediaItem, VideoItem from .next_page_item import NextPageItem -from .search_history_item import SearchHistoryItem -from .search_item import SearchItem +from .search_items import NewSearchItem, SearchHistoryItem, SearchItem from .uri_item import UriItem from .utils import from_json from .watch_later_item import WatchLaterItem @@ -38,6 +36,7 @@ 'CommandItem', 'DirectoryItem', 'ImageItem', + 'MediaItem', 'NewSearchItem', 'NextPageItem', 'SearchHistoryItem', diff --git a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/items/base_item.py b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/items/base_item.py index e286e3ccea..5f76499901 100644 --- a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/items/base_item.py +++ b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/items/base_item.py @@ -14,7 +14,15 @@ from datetime import date, datetime from hashlib import md5 -from ..compatibility import datetime_infolabel, string_type, to_str, unescape +from .menu_items import separator +from ..compatibility import ( + datetime_infolabel, + parse_qsl, + string_type, + to_str, + unescape, + urlsplit, +) from ..constants import MEDIA_PATH @@ -27,6 +35,8 @@ def __init__(self, name, uri, image=None, fanart=None): self.set_name(name) self._uri = uri + self._available = True + self._callback = None self._image = '' if image: @@ -35,6 +45,7 @@ def __init__(self, name, uri, image=None, fanart=None): if fanart: self.set_fanart(fanart) + self._bookmark_id = None self._bookmark_timestamp = None self._context_menu = None self._added_utc = None @@ -42,15 +53,21 @@ def __init__(self, name, uri, image=None, fanart=None): self._date = None self._dateadded = None self._short_details = None + self._production_code = None + + self._cast = None + self._artists = None + self._studios = None def __str__(self): - return ('------------------------------\n' - 'Name: |{0}|\n' - 'URI: |{1}|\n' - 'Image: |{2}|\n' - '------------------------------'.format(self._name, - self._uri, - self._image)) + return ('{type}' + '\n\tName: |{name}|' + '\n\tURI: |{uri}|' + '\n\tImage: |image}|' + .format(type=self.__class__.__name__, + name=self._name, + uri=self._uri, + image=self._image)) def __repr__(self): return json.dumps( @@ -66,10 +83,51 @@ def get_id(self): """ return md5(''.join((self._name, self._uri)).encode('utf-8')).hexdigest() + def parse_item_ids_from_uri(self): + if not self._uri: + return None + + item_ids = {} + + uri = urlsplit(self._uri) + path = uri.path.rstrip('/') + params = dict(parse_qsl(uri.query)) + + video_id = params.get('video_id') + if video_id: + item_ids['video_id'] = video_id + + channel_id = None + playlist_id = None + + while path: + part, _, next_part = path.partition('/') + if not next_part: + break + + if part == 'channel': + channel_id = next_part.partition('/')[0] + elif part == 'playlist': + playlist_id = next_part.partition('/')[0] + path = next_part + + if channel_id: + item_ids['channel_id'] = channel_id + if playlist_id: + item_ids['playlist_id'] = playlist_id + + for item_id, value in item_ids.items(): + try: + setattr(self, item_id, value) + except AttributeError: + pass + + return item_ids + def set_name(self, name): try: name = unescape(name) - except: + except Exception: pass self._name = name return name @@ -91,6 +149,22 @@ def get_uri(self): """ return self._uri + @property + def available(self): + return self._available + + @available.setter + def available(self, value): + self._available = value + + @property + def callback(self): + return self._callback + + @callback.setter + def callback(self, value): + self._callback = value + def set_image(self, image): if not image: return @@ -120,10 +194,16 @@ def get_fanart(self, default=True): 'fanart.jpg', )) - def add_context_menu(self, context_menu, position='end', replace=False): - context_menu = (item for item in context_menu if item) + def add_context_menu(self, + context_menu, + position='end', + replace=False, + end_separator=separator()): + context_menu = [item for item in context_menu if item] + if context_menu and end_separator and context_menu[-1] != end_separator: + context_menu.append(end_separator) if replace or not self._context_menu: - self._context_menu = list(context_menu) + self._context_menu = context_menu elif position == 'end': self._context_menu.extend(context_menu) else: @@ -185,6 +265,14 @@ def get_count(self): def set_count(self, count): self._count = int(count or 0) + @property + def bookmark_id(self): + return self._bookmark_id + + @bookmark_id.setter + def bookmark_id(self, value): + self._bookmark_id = value + def set_bookmark_timestamp(self, timestamp): self._bookmark_timestamp = timestamp @@ -195,6 +283,62 @@ def get_bookmark_timestamp(self): def playable(self): return self._playable + @playable.setter + def playable(self, value): + self._playable = value + + def add_artist(self, artist): + if artist: + if self._artists is None: + self._artists = [] + self._artists.append(to_str(artist)) + + def get_artists(self): + return self._artists + + def get_artists_string(self): + if self._artists: + return ', '.join(self._artists) + return None + + def set_artists(self, artists): + self._artists = list(artists) + + def set_cast(self, members): + self._cast = list(members) + + def add_cast(self, name, role=None, order=None, thumbnail=None): + if name: + if self._cast is None: + self._cast = [] + self._cast.append({ + 'name': to_str(name), + 'role': to_str(role) if role else '', + 'order': int(order) if order else len(self._cast) + 1, + 'thumbnail': to_str(thumbnail) if thumbnail else '', + }) + + def get_cast(self): + return self._cast + + def add_studio(self, studio): + if studio: + if self._studios is None: + self._studios = [] + self._studios.append(to_str(studio)) + + def get_studios(self): + return self._studios + + def set_studios(self, studios): + self._studios = list(studios) + + def set_production_code(self, value): + self._production_code = value or '' + + def get_production_code(self): + return self._production_code + class _Encoder(json.JSONEncoder): def encode(self, obj, nested=False): @@ -232,3 +376,6 @@ def encode(self, obj, nested=False): if nested: return output return super(_Encoder, self).encode(output) + + def default(self, obj): + pass diff --git a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/items/command_item.py b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/items/command_item.py index c4838c005e..501a28f28a 100644 --- a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/items/command_item.py +++ b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/items/command_item.py @@ -37,6 +37,5 @@ def __init__(self, menu_items.refresh(context), menu_items.goto_home(context), menu_items.goto_quick_search(context), - menu_items.separator(), ] self.add_context_menu(context_menu) diff --git a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/items/directory_item.py b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/items/directory_item.py index a4cab88bec..e34c61e764 100644 --- a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/items/directory_item.py +++ b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/items/directory_item.py @@ -71,7 +71,7 @@ def get_category_label(self): def set_plot(self, plot): try: plot = unescape(plot) - except: + except Exception: pass self._plot = plot diff --git a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/items/media_item.py b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/items/media_item.py index 4118e59e12..0a8554d851 100644 --- a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/items/media_item.py +++ b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/items/media_item.py @@ -14,7 +14,7 @@ from datetime import date from . import BaseItem -from ..compatibility import datetime_infolabel, to_str, unescape +from ..compatibility import datetime_infolabel, to_str, unescape, urlencode from ..constants import CONTENT from ..utils import duration_to_seconds, seconds_to_duration @@ -25,17 +25,24 @@ class MediaItem(BaseItem): _playable = True - def __init__(self, name, uri, image='DefaultFile.png', fanart=None): + def __init__(self, + name, + uri, + image='DefaultFile.png', + fanart=None, + plot=None, + video_id=None, + channel_id=None, + playlist_id=None, + playlist_item_id=None, + subscription_id=None): super(MediaItem, self).__init__(name, uri, image, fanart) self._aired = None self._premiered = None self._scheduled_start_utc = None self._year = None - self._artists = None - self._cast = None self._genres = None - self._studios = None self._duration = -1 self._play_count = None @@ -44,8 +51,7 @@ def __init__(self, name, uri, image='DefaultFile.png', fanart=None): self._start_time = None self._mediatype = None - self._plot = None - self._production_code = None + self._plot = plot self._rating = None self._title = self.get_name() self._track_number = None @@ -61,11 +67,11 @@ def __init__(self, name, uri, image='DefaultFile.png', fanart=None): self._upcoming = False self._vod = False - self._video_id = None - self._channel_id = None - self._subscription_id = None - self._playlist_id = None - self._playlist_item_id = None + self._video_id = video_id + self._channel_id = channel_id + self._subscription_id = subscription_id + self._playlist_id = playlist_id + self._playlist_item_id = playlist_item_id def set_aired(self, year, month, day): self._aired = date(year, month, day) @@ -110,40 +116,6 @@ def set_year_from_datetime(self, date_time): def get_year(self): return self._year - def add_artist(self, artist): - if artist: - if self._artists is None: - self._artists = [] - self._artists.append(to_str(artist)) - - def get_artists(self): - return self._artists - - def get_artists_string(self): - if self._artists: - return ', '.join(self._artists) - return None - - def set_artists(self, artists): - self._artists = list(artists) - - def set_cast(self, members): - self._cast = list(members) - - def add_cast(self, name, role=None, order=None, thumbnail=None): - if name: - if self._cast is None: - self._cast = [] - self._cast.append({ - 'name': to_str(name), - 'role': to_str(role) if role else '', - 'order': int(order) if order else len(self._cast) + 1, - 'thumbnail': to_str(thumbnail) if thumbnail else '', - }) - - def get_cast(self): - return self._cast - def add_genre(self, genre): if genre: if self._genres is None: @@ -156,18 +128,6 @@ def get_genres(self): def set_genres(self, genres): self._genres = list(genres) - def add_studio(self, studio): - if studio: - if self._studios is None: - self._studios = [] - self._studios.append(to_str(studio)) - - def get_studios(self): - return self._studios - - def set_studios(self, studios): - self._studios = list(studios) - def set_duration(self, hours=0, minutes=0, seconds=0, duration=''): if duration: _seconds = duration_to_seconds(duration) @@ -225,19 +185,13 @@ def get_mediatype(self): def set_plot(self, plot): try: plot = unescape(plot) - except: + except Exception: pass self._plot = plot def get_plot(self): return self._plot - def set_production_code(self, value): - self._production_code = value or '' - - def get_production_code(self): - return self._production_code - def set_rating(self, rating): rating = float(rating) if rating > 10: @@ -252,7 +206,7 @@ def get_rating(self): def set_title(self, title): try: title = unescape(title) - except: + except Exception: pass self._name = self._title = title @@ -268,7 +222,9 @@ def get_track_number(self): def set_headers(self, value): self._headers = value - def get_headers(self): + def get_headers(self, as_string=False): + if as_string: + return urlencode(self._headers) if self._headers else '' return self._headers def set_license_key(self, url): @@ -384,8 +340,27 @@ class AudioItem(MediaItem): _ALLOWABLE_MEDIATYPES = {CONTENT.AUDIO_TYPE, 'song', 'album', 'artist'} _DEFAULT_MEDIATYPE = CONTENT.AUDIO_TYPE - def __init__(self, name, uri, image='DefaultAudio.png', fanart=None): - super(AudioItem, self).__init__(name, uri, image, fanart) + def __init__(self, + name, + uri, + image='DefaultAudio.png', + fanart=None, + plot=None, + video_id=None, + channel_id=None, + playlist_id=None, + playlist_item_id=None, + subscription_id=None): + super(AudioItem, self).__init__(name, + uri, + image, + fanart, + plot, + video_id, + channel_id, + playlist_id, + playlist_item_id, + subscription_id) self._album = None def set_album_name(self, album_name): @@ -405,8 +380,27 @@ class VideoItem(MediaItem): r'(http(s)?://)?www.imdb.(com|de)/title/(?P[t0-9]+)(/)?' ) - def __init__(self, name, uri, image='DefaultVideo.png', fanart=None): - super(VideoItem, self).__init__(name, uri, image, fanart) + def __init__(self, + name, + uri, + image='DefaultVideo.png', + fanart=None, + plot=None, + video_id=None, + channel_id=None, + playlist_id=None, + playlist_item_id=None, + subscription_id=None): + super(VideoItem, self).__init__(name, + uri, + image, + fanart, + plot, + video_id, + channel_id, + playlist_id, + playlist_item_id, + subscription_id) self._directors = None self._episode = None self._imdb_id = None diff --git a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/items/menu_items.py b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/items/menu_items.py index 5ce366f994..0f524a0d91 100644 --- a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/items/menu_items.py +++ b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/items/menu_items.py @@ -102,6 +102,21 @@ def refresh(context): ) +def play_all_from(context, route, order='normal'): + return ( + context.localize('playlist.play.shuffle') + if order == 'shuffle' else + context.localize('playlist.play.all'), + context.create_uri( + (route, 'play',), + { + 'order': order, + }, + run=True, + ), + ) + + def queue_video(context): return ( context.localize('video.queue'), @@ -109,27 +124,58 @@ def queue_video(context): ) -def play_all_from_playlist(context, playlist_id, video_id=''): - if video_id: - return ( - context.localize('playlist.play.from_here'), - context.create_uri( - (PATHS.PLAY,), - { - 'playlist_id': playlist_id, - 'video_id': video_id, - 'play': True, - }, - run=True, - ), - ) +def play_playlist(context, playlist_id): return ( context.localize('playlist.play.all'), context.create_uri( (PATHS.PLAY,), { 'playlist_id': playlist_id, - 'play': True, + 'order': 'ask', + }, + run=True, + ), + ) + + +def play_playlist_from(context, playlist_id, video_id): + return ( + context.localize('playlist.play.from_here'), + context.create_uri( + (PATHS.PLAY,), + { + 'playlist_id': playlist_id, + 'video_id': video_id, + }, + run=True, + ), + ) + + +def view_playlist(context, playlist_id): + return ( + context.localize('playlist.view.all'), + context.create_uri( + (PATHS.ROUTE, PATHS.PLAY,), + { + 'playlist_id': playlist_id, + 'order': 'normal', + 'action': 'list', + }, + run=True, + ), + ) + + +def shuffle_playlist(context, playlist_id): + return ( + context.localize('playlist.play.shuffle'), + context.create_uri( + (PATHS.ROUTE, PATHS.PLAY,), + { + 'playlist_id': playlist_id, + 'order': 'shuffle', + 'action': 'list', }, run=True, ), @@ -158,7 +204,7 @@ def remove_video_from_playlist(context, playlist_id, video_id, video_name): context.get_params(), playlist_id=playlist_id, video_id=video_id, - video_name=video_name, + item_name=video_name, reload_path=context.get_path(), ), run=True, @@ -173,7 +219,7 @@ def rename_playlist(context, playlist_id, playlist_name): ('playlist', 'rename', 'playlist',), { 'playlist_id': playlist_id, - 'playlist_name': playlist_name + 'item_name': playlist_name }, run=True, ), @@ -187,7 +233,7 @@ def delete_playlist(context, playlist_id, playlist_name): ('playlist', 'remove', 'playlist',), { 'playlist_id': playlist_id, - 'playlist_name': playlist_name + 'item_name': playlist_name }, run=True, ), @@ -201,7 +247,7 @@ def remove_as_watch_later(context, playlist_id, playlist_name): ('playlist', 'remove', 'watch_later',), { 'playlist_id': playlist_id, - 'playlist_name': playlist_name + 'item_name': playlist_name }, run=True, ), @@ -215,7 +261,7 @@ def set_as_watch_later(context, playlist_id, playlist_name): ('playlist', 'set', 'watch_later',), { 'playlist_id': playlist_id, - 'playlist_name': playlist_name + 'item_name': playlist_name }, run=True, ), @@ -229,7 +275,7 @@ def remove_as_history(context, playlist_id, playlist_name): ('playlist', 'remove', 'history',), { 'playlist_id': playlist_id, - 'playlist_name': playlist_name + 'item_name': playlist_name }, run=True, ), @@ -243,7 +289,7 @@ def set_as_history(context, playlist_id, playlist_name): ('playlist', 'set', 'history',), { 'playlist_id': playlist_id, - 'playlist_name': playlist_name + 'item_name': playlist_name }, run=True, ), @@ -254,10 +300,9 @@ def remove_my_subscriptions_filter(context, channel_name): return ( context.localize('my_subscriptions.filter.remove'), context.create_uri( - ('my_subscriptions', 'filter',), + ('my_subscriptions', 'filter', 'remove'), { - 'channel_name': channel_name, - 'action': 'remove' + 'item_name': channel_name, }, run=True, ), @@ -268,10 +313,9 @@ def add_my_subscriptions_filter(context, channel_name): return ( context.localize('my_subscriptions.filter.add'), context.create_uri( - ('my_subscriptions', 'filter',), + ('my_subscriptions', 'filter', 'add',), { - 'channel_name': channel_name, - 'action': 'add', + 'item_name': channel_name, }, run=True, ), @@ -322,13 +366,14 @@ def watch_later_local_add(context, item): ) -def watch_later_local_remove(context, video_id): +def watch_later_local_remove(context, video_id, video_name=''): return ( context.localize('watch_later.remove'), context.create_uri( (PATHS.WATCH_LATER, 'remove',), { 'video_id': video_id, + 'item_name': video_name, }, run=True, ), @@ -446,14 +491,14 @@ def play_timeshift(context, video_id): ) -def history_remove(context, video_id): +def history_remove(context, video_id, video_name=''): return ( context.localize('history.remove'), context.create_uri( - (PATHS.HISTORY,), + (PATHS.HISTORY, 'remove',), { - 'action': 'remove', - 'video_id': video_id + 'video_id': video_id, + 'item_name': video_name, }, run=True, ), @@ -464,10 +509,7 @@ def history_clear(context): return ( context.localize('history.clear'), context.create_uri( - (PATHS.HISTORY,), - { - 'action': 'clear' - }, + (PATHS.HISTORY, 'clear',), run=True, ), ) @@ -477,10 +519,9 @@ def history_mark_watched(context, video_id): return ( context.localize('history.mark.watched'), context.create_uri( - (PATHS.HISTORY,), + (PATHS.HISTORY, 'mark_watched',), { 'video_id': video_id, - 'action': 'mark_watched', }, run=True, ), @@ -491,10 +532,9 @@ def history_mark_unwatched(context, video_id): return ( context.localize('history.mark.unwatched'), context.create_uri( - (PATHS.HISTORY,), + (PATHS.HISTORY, 'mark_unwatched',), { 'video_id': video_id, - 'action': 'mark_unwatched', }, run=True, ), @@ -505,10 +545,9 @@ def history_reset_resume(context, video_id): return ( context.localize('history.reset.resume_point'), context.create_uri( - (PATHS.HISTORY,), + (PATHS.HISTORY, 'reset_resume',), { 'video_id': video_id, - 'action': 'reset_resume', }, run=True, ), @@ -533,7 +572,7 @@ def bookmark_add_channel(context, channel_id, channel_name=''): return ( (context.localize('bookmark.channel') % ( context.get_ui().bold(channel_name) if channel_name else - context.localize(19029) + context.localize('channel') )), context.create_uri( (PATHS.BOOKMARKS, 'add',), @@ -546,13 +585,14 @@ def bookmark_add_channel(context, channel_id, channel_name=''): ) -def bookmark_remove(context, item_id): +def bookmark_remove(context, item_id, item_name=''): return ( context.localize('bookmark.remove'), context.create_uri( (PATHS.BOOKMARKS, 'remove',), { 'item_id': item_id, + 'item_name': item_name, }, run=True, ), @@ -605,6 +645,27 @@ def search_clear(context): ) +def search_sort_by(context, params, order): + selected = params.get('order', 'relevance') == order + order_label = context.localize('search.sort.' + order) + return ( + context.localize('search.sort').format( + context.get_ui().bold(order_label) if selected else order_label + ), + context.create_uri( + (PATHS.ROUTE, PATHS.SEARCH, 'query',), + params=dict(params, + order=order, + page=1, + page_token='', + pageToken='', + window_replace=True, + window_return=False), + run=True, + ), + ) + + def separator(): return ( '--------', @@ -614,7 +675,7 @@ def separator(): def goto_home(context): return ( - context.localize(10000), + context.localize('home'), context.create_uri( (PATHS.ROUTE, PATHS.HOME,), { @@ -625,11 +686,20 @@ def goto_home(context): ) -def goto_quick_search(context): +def goto_quick_search(context, params=None, incognito=None): + if params is None: + params = {} + if incognito is None: + incognito = params.get('incognito') + else: + params['incognito'] = incognito return ( - context.localize('search.quick'), + context.localize('search.quick.incognito' + if incognito else + 'search.quick'), context.create_uri( (PATHS.ROUTE, PATHS.SEARCH, 'input',), + params, run=True, ), ) diff --git a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/items/new_search_item.py b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/items/new_search_item.py deleted file mode 100644 index 3eeab206a9..0000000000 --- a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/items/new_search_item.py +++ /dev/null @@ -1,49 +0,0 @@ -# -*- coding: utf-8 -*- -""" - - Copyright (C) 2014-2016 bromix (plugin.video.youtube) - Copyright (C) 2016-2018 plugin.video.youtube - - SPDX-License-Identifier: GPL-2.0-only - See LICENSES/GPL-2.0-only for more information. -""" - -from __future__ import absolute_import, division, unicode_literals - -from .directory_item import DirectoryItem -from ..constants import PATHS - - -class NewSearchItem(DirectoryItem): - def __init__(self, - context, - name=None, - image=None, - fanart=None, - incognito=False, - channel_id='', - addon_id='', - location=False): - if not name: - name = context.get_ui().bold(context.localize('search.new')) - - if image is None: - image = '{media}/new_search.png' - - params = {} - if addon_id: - params['addon_id'] = addon_id - if incognito: - params['incognito'] = incognito - if channel_id: - params['channel_id'] = channel_id - if location: - params['location'] = location - - super(NewSearchItem, self).__init__(name, - context.create_uri( - (PATHS.SEARCH, 'input',), - params=params, - ), - image=image, - fanart=fanart) diff --git a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/items/next_page_item.py b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/items/next_page_item.py index 32d50c0f53..946820f503 100644 --- a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/items/next_page_item.py +++ b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/items/next_page_item.py @@ -45,7 +45,6 @@ def __init__(self, context, params, image=None, fanart=None): menu_items.goto_page(context, params) if can_jump else None, menu_items.goto_home(context), menu_items.goto_quick_search(context), - menu_items.separator(), ] self.add_context_menu(context_menu) diff --git a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/items/search_history_item.py b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/items/search_history_item.py deleted file mode 100644 index 737aa6701a..0000000000 --- a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/items/search_history_item.py +++ /dev/null @@ -1,40 +0,0 @@ -# -*- coding: utf-8 -*- -""" - - Copyright (C) 2014-2016 bromix (plugin.video.youtube) - Copyright (C) 2016-2018 plugin.video.youtube - - SPDX-License-Identifier: GPL-2.0-only - See LICENSES/GPL-2.0-only for more information. -""" - -from __future__ import absolute_import, division, unicode_literals - -from . import menu_items -from .directory_item import DirectoryItem -from ..constants import PATHS - - -class SearchHistoryItem(DirectoryItem): - def __init__(self, context, query, image=None, fanart=None, location=False): - if image is None: - image = '{media}/search.png' - - params = {'q': query} - if location: - params['location'] = location - - super(SearchHistoryItem, self).__init__(query, - context.create_uri( - (PATHS.SEARCH, 'query',), - params=params, - ), - image=image, - fanart=fanart) - - context_menu = [ - menu_items.search_remove(context, query), - menu_items.search_rename(context, query), - menu_items.search_clear(context), - ] - self.add_context_menu(context_menu) diff --git a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/items/search_item.py b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/items/search_item.py deleted file mode 100644 index 4329c450bd..0000000000 --- a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/items/search_item.py +++ /dev/null @@ -1,40 +0,0 @@ -# -*- coding: utf-8 -*- -""" - - Copyright (C) 2014-2016 bromix (plugin.video.youtube) - Copyright (C) 2016-2018 plugin.video.youtube - - SPDX-License-Identifier: GPL-2.0-only - See LICENSES/GPL-2.0-only for more information. -""" - -from __future__ import absolute_import, division, unicode_literals - -from .directory_item import DirectoryItem -from ..constants import PATHS - - -class SearchItem(DirectoryItem): - def __init__(self, - context, - name=None, - image=None, - fanart=None, - location=False): - if not name: - name = context.localize('search') - - if image is None: - image = '{media}/search.png' - - params = {} - if location: - params['location'] = location - - super(SearchItem, self).__init__(name, - context.create_uri( - (PATHS.SEARCH, 'list',), - params=params, - ), - image=image, - fanart=fanart) diff --git a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/items/search_items.py b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/items/search_items.py new file mode 100644 index 0000000000..e45ad011ed --- /dev/null +++ b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/items/search_items.py @@ -0,0 +1,131 @@ +# -*- coding: utf-8 -*- +""" + + Copyright (C) 2014-2016 bromix (plugin.video.youtube) + Copyright (C) 2016-2018 plugin.video.youtube + + SPDX-License-Identifier: GPL-2.0-only + See LICENSES/GPL-2.0-only for more information. +""" + +from __future__ import absolute_import, division, unicode_literals + +from . import menu_items +from .directory_item import DirectoryItem +from ..constants import PATHS + + +class SearchItem(DirectoryItem): + def __init__(self, + context, + name=None, + image=None, + fanart=None, + location=False): + if not name: + name = context.localize('search') + + if image is None: + image = '{media}/search.png' + + params = {} + if location: + params['location'] = location + + super(SearchItem, self).__init__(name, + context.create_uri( + (PATHS.SEARCH, 'list',), + params=params, + ), + image=image, + fanart=fanart) + + context_menu = [ + menu_items.search_clear(context), + menu_items.separator(), + menu_items.goto_quick_search(context, params), + menu_items.goto_quick_search(context, params, incognito=True) + ] + self.add_context_menu(context_menu) + + +class SearchHistoryItem(DirectoryItem): + def __init__(self, context, query, image=None, fanart=None, location=False): + if image is None: + image = '{media}/search.png' + + if isinstance(query, dict): + params = query + query = params['q'] + else: + params = {'q': query} + if location: + params['location'] = location + + super(SearchHistoryItem, self).__init__(query, + context.create_uri( + (PATHS.SEARCH, 'query',), + params=params, + ), + image=image, + fanart=fanart) + + context_menu = [ + menu_items.search_remove(context, query), + menu_items.search_rename(context, query), + menu_items.search_clear(context), + menu_items.separator(), + menu_items.search_sort_by(context, params, 'relevance'), + menu_items.search_sort_by(context, params, 'date'), + menu_items.search_sort_by(context, params, 'viewCount'), + menu_items.search_sort_by(context, params, 'rating'), + menu_items.search_sort_by(context, params, 'title'), + ] + self.add_context_menu(context_menu) + + +class NewSearchItem(DirectoryItem): + def __init__(self, + context, + name=None, + image=None, + fanart=None, + incognito=False, + channel_id='', + addon_id='', + location=False): + if not name: + name = context.get_ui().bold(context.localize('search.new')) + + if image is None: + image = '{media}/new_search.png' + + params = {} + if addon_id: + params['addon_id'] = addon_id + if incognito: + params['incognito'] = incognito + if channel_id: + params['channel_id'] = channel_id + if location: + params['location'] = location + + super(NewSearchItem, self).__init__(name, + context.create_uri( + (PATHS.SEARCH, 'input',), + params=params, + ), + image=image, + fanart=fanart) + + if context.is_plugin_path(context.get_uri(), (PATHS.SEARCH, 'list',)): + context_menu = [ + menu_items.search_clear(context), + menu_items.separator(), + menu_items.goto_quick_search(context, params, not incognito) + ] + else: + context_menu = [ + menu_items.goto_quick_search(context, params, not incognito) + ] + self.add_context_menu(context_menu) diff --git a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/items/utils.py b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/items/utils.py index f93ab11fad..7b595da428 100644 --- a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/items/utils.py +++ b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/items/utils.py @@ -52,12 +52,17 @@ def from_json(json_data, *args): :param json_data: :return: """ + if args and args[0] and len(args[0]) == 4: + bookmark_id = args[0][0] + bookmark_timestamp = args[0][1] + else: + bookmark_id = None + bookmark_timestamp = None + if isinstance(json_data, string_type): if json_data == to_str(None): # Channel bookmark that will be updated. Store timestamp for update - if args and args[0] and len(args[0]) == 4: - return args[0][1] - return None + return bookmark_timestamp json_data = json.loads(json_data, object_hook=_decoder) item_type = json_data.get('type') @@ -70,4 +75,9 @@ def from_json(json_data, *args): if hasattr(item, key): setattr(item, key, value) + if bookmark_id: + item.bookmark_id = bookmark_id + if bookmark_timestamp: + item.set_bookmark_timestamp(bookmark_timestamp) + return item diff --git a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/items/xbmc/xbmc_items.py b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/items/xbmc/xbmc_items.py index f7396f929e..ea6375273d 100644 --- a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/items/xbmc/xbmc_items.py +++ b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/items/xbmc/xbmc_items.py @@ -12,13 +12,20 @@ from json import dumps -from .. import AudioItem, DirectoryItem, ImageItem, VideoItem +from .. import ( + AudioItem, + DirectoryItem, + ImageItem, + MediaItem, + VideoItem, +) from ...compatibility import to_str, xbmc, xbmcgui from ...constants import ( CHANNEL_ID, PLAYLISTITEM_ID, PLAYLIST_ID, PLAY_COUNT, + PLAY_STRM, PLAY_TIMESHIFT, PLAY_WITH, SUBSCRIPTION_ID, @@ -28,62 +35,87 @@ def set_info(list_item, item, properties, set_play_count=True, resume=True): - if not current_system_version.compatible(20, 0): - if isinstance(item, VideoItem): - info_labels = {} - info_type = 'video' + if not current_system_version.compatible(20): + info_labels = {} + info_type = None + + if isinstance(item, MediaItem): + if isinstance(item, VideoItem): + info_type = 'video' + + value = item.get_episode() + if value is not None: + info_labels['episode'] = value + + value = item.get_season() + if value is not None: + info_labels['season'] = value + + elif isinstance(item, AudioItem): + info_type = 'music' + + value = item.get_album_name() + if value is not None: + info_labels['album'] = value + + else: + return value = item.get_aired(as_info_label=True) if value is not None: info_labels['aired'] = value - value = item.get_cast() + value = item.get_premiered(as_info_label=True) if value is not None: - info_labels['castandrole'] = [(member['name'], member['role']) - for member in value] + info_labels['premiered'] = value - value = item.get_production_code() + value = item.get_plot() if value is not None: - info_labels['code'] = value + info_labels['plot'] = value - value = item.get_dateadded(as_info_label=True) + value = item.get_last_played(as_info_label=True) if value is not None: - info_labels['dateadded'] = value + info_labels['lastplayed'] = value - value = item.get_episode() + value = item.get_mediatype() if value is not None: - info_labels['episode'] = value + info_labels['mediatype'] = value - value = item.get_plot() + value = item.get_play_count() if value is not None: - info_labels['plot'] = value + if set_play_count: + info_labels['playcount'] = value + properties[PLAY_COUNT] = value - value = item.get_premiered(as_info_label=True) + value = item.get_rating() if value is not None: - info_labels['premiered'] = value + info_labels['rating'] = value - value = item.get_season() + value = item.get_title() if value is not None: - info_labels['season'] = value + info_labels['title'] = value - value = item.get_studios() + value = item.get_track_number() if value is not None: - info_labels['studio'] = value - - elif isinstance(item, AudioItem): - info_labels = {} - info_type = 'music' + info_labels['tracknumber'] = value - value = item.get_album_name() + value = item.get_year() if value is not None: - info_labels['album'] = value + info_labels['year'] = value - value = item.get_plot() - if value is not None: - info_labels['plot'] = value + resume_time = resume and item.get_start_time() + if resume_time: + properties['ResumeTime'] = str(resume_time) + duration = item.get_duration() + if duration: + properties['TotalTime'] = str(duration) + if info_type == 'video': + list_item.addStreamInfo(info_type, {'duration': duration}) + + if duration is not None: + info_labels['duration'] = duration elif isinstance(item, DirectoryItem): - info_labels = {} info_type = 'video' value = item.get_name() @@ -94,204 +126,205 @@ def set_info(list_item, item, properties, set_play_count=True, resume=True): if value is not None: info_labels['plot'] = value - if info_labels: - list_item.setInfo(info_type, info_labels) - - if properties: - list_item.setProperties(properties) - return - elif isinstance(item, ImageItem): + info_type = 'picture' + value = item.get_title() if value is not None: - list_item.setInfo('picture', {'title': value}) - - if properties: - list_item.setProperties(properties) - return + info_labels['title'] = value else: return - value = item.get_artists() - if value is not None: - info_labels['artist'] = value - - value = item.get_count() - if value is not None: - info_labels['count'] = value - - value = item.get_date(as_info_label=True) - if value is not None: - info_labels['date'] = value - - value = item.get_duration() - if value is not None: - info_labels['duration'] = value - - value = item.get_last_played(as_info_label=True) + value = item.get_production_code() if value is not None: - info_labels['lastplayed'] = value + info_labels['code'] = value - value = item.get_mediatype() + value = item.get_dateadded(as_info_label=True) if value is not None: - info_labels['mediatype'] = value + info_labels['dateadded'] = value - value = item.get_play_count() + value = item.get_studios() if value is not None: - if set_play_count: - info_labels['playcount'] = value - properties[PLAY_COUNT] = value + info_labels['studio'] = value - value = item.get_rating() + value = item.get_cast() if value is not None: - info_labels['rating'] = value + info_labels['castandrole'] = [(member['name'], member['role']) + for member in value] - value = item.get_title() + value = item.get_artists() if value is not None: - info_labels['title'] = value + info_labels['artist'] = value - value = item.get_track_number() + value = item.get_count() if value is not None: - info_labels['tracknumber'] = value + info_labels['count'] = value - value = item.get_year() + value = item.get_date(as_info_label=True) if value is not None: - info_labels['year'] = value - - resume_time = resume and item.get_start_time() - if resume_time: - properties['ResumeTime'] = str(resume_time) - duration = item.get_duration() - if duration: - properties['TotalTime'] = str(duration) - if info_type == 'video': - list_item.addStreamInfo(info_type, {'duration': duration}) + info_labels['date'] = value if properties: list_item.setProperties(properties) - if info_labels: + if info_labels and info_type: list_item.setInfo(info_type, info_labels) return - value = item.get_date(as_info_label=True) - if value is not None: - list_item.setDateTime(value) + if isinstance(item, MediaItem): + if isinstance(item, VideoItem): + info_tag = list_item.getVideoInfoTag() + info_type = 'video' - if isinstance(item, VideoItem): - info_tag = list_item.getVideoInfoTag() - info_type = 'video' + # episode: int + value = item.get_episode() + if value is not None: + info_tag.setEpisode(value) - value = item.get_aired(as_info_label=True) - if value is not None: - info_tag.setFirstAired(value) + # season: int + value = item.get_season() + if value is not None: + info_tag.setSeason(value) - value = item.get_dateadded(as_info_label=True) - if value is not None: - info_tag.setDateAdded(value) + value = item.get_premiered(as_info_label=True) + if value is not None: + info_tag.setPremiered(value) - value = item.get_premiered(as_info_label=True) - if value is not None: - info_tag.setPremiered(value) + value = item.get_aired(as_info_label=True) + if value is not None: + info_tag.setFirstAired(value) - # artist: list[str] - # eg. ["Angerfist"] - # Used as alias for channel name - value = item.get_artists() - if value is not None: - info_tag.setArtists(value) + # plot: str + value = item.get_plot() + if value is not None: + info_tag.setPlot(value) - # cast: list[xbmc.Actor] - # From list[{member: str, role: str, order: int, thumbnail: str}] - # Used as alias for channel name if enabled - value = item.get_cast() - if value is not None: - info_tag.setCast([xbmc.Actor(**member) for member in value]) + # tracknumber: int + # eg. 12 + value = item.get_track_number() + if value is not None: + info_tag.setTrackNumber(value) + + # director: list[str] + # eg. "Steven Spielberg" + # Currently unused + # value = item.get_directors() + # if value is not None: + # info_tag.setDirectors(value) + + # imdbnumber: str + # eg. "tt3458353" + # Currently unused + # value = item.get_imdb_id() + # if value is not None: + # info_tag.setIMDBNumber(value) - # director: list[str] - # eg. "Steven Spielberg" - # Currently unused - # value = item.get_directors() - # if value is not None: - # info_tag.setDirectors(value) + elif isinstance(item, AudioItem): + info_tag = list_item.getMusicInfoTag() + info_type = 'music' - # episode: int - value = item.get_episode() - if value is not None: - info_tag.setEpisode(value) + # album: str + # eg. "Buckle Up" + value = item.get_album_name() + if value is not None: + info_tag.setAlbum(value) - # imdbnumber: str - # eg. "tt3458353" - # Currently unused - # value = item.get_imdb_id() - # if value is not None: - # info_tag.setIMDBNumber(value) + value = item.get_premiered(as_info_label=True) + if value is not None: + info_tag.setReleaseDate(value) - # plot: str - value = item.get_plot() - if value is not None: - info_tag.setPlot(value) + # comment: str + value = item.get_plot() + if value is not None: + info_tag.setComment(value) - # code: str - # eg. "466K | 3.9K | 312" - # Production code, currently used to store misc video data for label - # formatting - value = item.get_production_code() - if value is not None: - info_tag.setProductionCode(value) + # artist: str + # eg. "Artist 1, Artist 2" + # Used as alias for channel name + value = item.get_artists_string() + if value is not None: + info_tag.setArtist(value) - # season: int - value = item.get_season() - if value is not None: - info_tag.setSeason(value) + # track: int + # eg. 12 + value = item.get_track_number() + if value is not None: + info_tag.setTrack(value) - # studio: list[str] - # Used as alias for channel name if enabled - value = item.get_studios() - if value is not None: - info_tag.setStudios(value) + else: + return - # tracknumber: int - # eg. 12 - value = item.get_track_number() + value = item.get_last_played(as_info_label=True) if value is not None: - info_tag.setTrackNumber(value) + info_tag.setLastPlayed(value) - elif isinstance(item, AudioItem): - info_tag = list_item.getMusicInfoTag() - info_type = 'music' - - value = item.get_premiered(as_info_label=True) + # mediatype: str + value = item.get_mediatype() if value is not None: - info_tag.setReleaseDate(value) + info_tag.setMediaType(value) - # album: str - # eg. "Buckle Up" - value = item.get_album_name() + # playcount: int + value = item.get_play_count() if value is not None: - info_tag.setAlbum(value) + if set_play_count: + if info_type == 'video': + info_tag.setPlaycount(value) + elif info_type == 'music': + info_tag.setPlayCount(value) + properties[PLAY_COUNT] = value - # artist: str - # eg. "Artist 1, Artist 2" - # Used as alias for channel name - value = item.get_artists_string() + # rating: float + value = item.get_rating() if value is not None: - info_tag.setArtist(value) + info_tag.setRating(value) - # comment: str - value = item.get_plot() + # title: str + # eg. "Blow Your Head Off" + value = item.get_title() if value is not None: - info_tag.setComment(value) + info_tag.setTitle(value) - # track: int - # eg. 12 - value = item.get_track_number() + # year: int + # eg. 1994 + value = item.get_year() if value is not None: - info_tag.setTrack(value) + info_tag.setYear(value) + + # genre: list[str] + # eg. ["Hardcore"] + # Currently unused + # value = item.get_genres() + # if value is not None: + # info_tag.setGenres(value) + + resume_time = resume and item.get_start_time() + duration = item.get_duration() + if info_type == 'video': + if resume_time and duration: + info_tag.setResumePoint(resume_time, float(duration)) + elif resume_time: + info_tag.setResumePoint(resume_time) + if duration: + info_tag.addVideoStream(xbmc.VideoStreamDetail( + duration=duration, + )) + elif info_type == 'music': + # These properties are deprecated but there is no other way to set + # these details for a ListItem with a MusicInfoTag + if resume_time: + properties['ResumeTime'] = str(resume_time) + if duration: + properties['TotalTime'] = str(duration) + + # duration: int + # As seconds + if duration is not None: + info_tag.setDuration(duration) elif isinstance(item, DirectoryItem): info_tag = list_item.getVideoInfoTag() + info_type = 'video' value = item.get_name() if value is not None: @@ -301,64 +334,49 @@ def set_info(list_item, item, properties, set_play_count=True, resume=True): if value is not None: info_tag.setPlot(value) - if properties: - list_item.setProperties(properties) - return - elif isinstance(item, ImageItem): info_tag = list_item.getPictureInfoTag() + info_type = 'picture' value = item.get_title() if value is not None: info_tag.setTitle(value) - if properties: - list_item.setProperties(properties) - return - else: return - resume_time = resume and item.get_start_time() - duration = item.get_duration() if info_type == 'video': - if resume_time and duration: - info_tag.setResumePoint(resume_time, float(duration)) - elif resume_time: - info_tag.setResumePoint(resume_time) - if duration: - info_tag.addVideoStream(xbmc.VideoStreamDetail(duration=duration)) - elif info_type == 'music': - # These properties are deprecated but there is no other way to set these - # details for a ListItem with a MusicInfoTag - if resume_time: - properties['ResumeTime'] = str(resume_time) - if duration: - properties['TotalTime'] = str(duration) - - # duration: int - # As seconds - if duration is not None: - info_tag.setDuration(duration) - - # mediatype: str - value = item.get_mediatype() - if value is not None: - info_tag.setMediaType(value) + # code: str + # eg. "466K | 3.9K | 312" + # Production code, currently used to store misc video data for label + # formatting + value = item.get_production_code() + if value is not None: + info_tag.setProductionCode(value) - value = item.get_last_played(as_info_label=True) - if value is not None: - info_tag.setLastPlayed(value) + value = item.get_dateadded(as_info_label=True) + if value is not None: + info_tag.setDateAdded(value) - # playcount: int - value = item.get_play_count() - if value is not None: - if set_play_count: - if info_type == 'video': - info_tag.setPlaycount(value) - elif info_type == 'music': - info_tag.setPlayCount(value) - properties[PLAY_COUNT] = value + # studio: list[str] + # Used as alias for channel name if enabled + value = item.get_studios() + if value is not None: + info_tag.setStudios(value) + + # cast: list[xbmc.Actor] + # From list[{member: str, role: str, order: int, thumbnail: str}] + # Used as alias for channel name if enabled + value = item.get_cast() + if value is not None: + info_tag.setCast([xbmc.Actor(**member) for member in value]) + + # artist: list[str] + # eg. ["Angerfist"] + # Used as alias for channel name + value = item.get_artists() + if value is not None: + info_tag.setArtists(value) # count: int # eg. 12 @@ -368,29 +386,9 @@ def set_info(list_item, item, properties, set_play_count=True, resume=True): if value is not None: list_item.setInfo(info_type, {'count': value}) - # genre: list[str] - # eg. ["Hardcore"] - # Currently unused - # value = item.get_genres() - # if value is not None: - # info_tag.setGenres(value) - - # rating: float - value = item.get_rating() - if value is not None: - info_tag.setRating(value) - - # title: str - # eg. "Blow Your Head Off" - value = item.get_title() - if value is not None: - info_tag.setTitle(value) - - # year: int - # eg. 1994 - value = item.get_year() + value = item.get_date(as_info_label=True) if value is not None: - info_tag.setYear(value) + list_item.setDateTime(value) if properties: list_item.setProperties(properties) @@ -401,10 +399,12 @@ def playback_item(context, media_item, show_fanart=None, **_kwargs): context.log_debug('Converting %s |%s|' % (media_item.__class__.__name__, redact_ip(uri))) + params = context.get_params() settings = context.get_settings() ui = context.get_ui() + is_external = ui.get_property(PLAY_WITH) - is_strm = context.get_param('strm') + is_strm = params.get(PLAY_STRM) mime_type = None if is_strm: @@ -446,12 +446,12 @@ def playback_item(context, media_item, show_fanart=None, **_kwargs): props['inputstream.adaptive.stream_selection_type'] = 'adaptive' props['inputstream.adaptive.chooser_resolution_max'] = 'auto' - if current_system_version.compatible(19, 0): + if current_system_version.compatible(19): props['inputstream'] = 'inputstream.adaptive' else: props['inputstreamaddon'] = 'inputstream.adaptive' - if not current_system_version.compatible(21, 0): + if not current_system_version.compatible(21): props['inputstream.adaptive.manifest_type'] = manifest_type if media_item.live: @@ -467,7 +467,7 @@ def playback_item(context, media_item, show_fanart=None, **_kwargs): 'ssl_verify_peer': False, }) - headers = media_item.get_headers() + headers = media_item.get_headers(as_string=True) if headers: props['inputstream.adaptive.manifest_headers'] = headers props['inputstream.adaptive.stream_headers'] = headers @@ -482,11 +482,13 @@ def playback_item(context, media_item, show_fanart=None, **_kwargs): mime_type = uri.split('mime=', 1)[1].split('&', 1)[0] mime_type = mime_type.replace('%2F', '/') - headers = media_item.get_headers() + headers = media_item.get_headers(as_string=True) if (headers and uri.startswith('http') and not (is_external or settings.default_player_web_urls())): - kwargs['path'] = '|'.join((uri, headers)) + uri = '|'.join((uri, headers)) + kwargs['path'] = uri + media_item.set_uri(uri) list_item = xbmcgui.ListItem(**kwargs) @@ -511,7 +513,7 @@ def playback_item(context, media_item, show_fanart=None, **_kwargs): if media_item.subtitles: list_item.setSubtitles(media_item.subtitles) - resume = context.get_param('resume') + resume = params.get('resume') set_info(list_item, media_item, props, resume=resume) return list_item @@ -523,6 +525,7 @@ def directory_listitem(context, directory_item, show_fanart=None, **_kwargs): kwargs = { 'label': directory_item.get_name(), + 'label2': directory_item.get_short_details(), 'path': uri, 'offscreen': True, } @@ -568,15 +571,17 @@ def directory_listitem(context, directory_item, show_fanart=None, **_kwargs): set_info(list_item, directory_item, props) """ - # ListItems that do not open a lower level list should have the isFolder - # parameter of the xbmcplugin.addDirectoryItem set to False, however this - # now appears to mark the ListItem as playable, even if the IsPlayable - # property is not set or set to "false". - # Set isFolder to True as a workaround, regardless of whether the ListItem - # is actually a folder. - is_folder = not directory_item.is_action() + ListItems that do not open a lower level list should have the isFolder + parameter of the xbmcplugin.addDirectoryItem set to False, however this + now appears to mark the ListItem as playable, even if the IsPlayable + property is not set or set to "false". + Set isFolder to True as a workaround, regardless of whether the ListItem + is actually a folder. """ - is_folder = True + # Workaround: + # is_folder = True + # Test correctly setting isFolder: + is_folder = not directory_item.is_action() context_menu = directory_item.get_context_menu() if context_menu is not None: diff --git a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/json_store/access_manager.py b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/json_store/access_manager.py index d026938847..e6e9a4b834 100644 --- a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/json_store/access_manager.py +++ b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/json_store/access_manager.py @@ -435,18 +435,19 @@ def is_access_token_expired(self, addon_id=None): def update_access_token(self, addon_id, access_token=None, - unix_timestamp=None, + expiry=None, refresh_token=None): """ Updates the old access token with the new one. + :param addon_id: :param access_token: - :param unix_timestamp: + :param expiry: :param refresh_token: :return: """ details = { 'access_token': ( - '|'.join(access_token) + '|'.join([token or '' for token in access_token]) if isinstance(access_token, (list, tuple)) else access_token if access_token else @@ -454,16 +455,17 @@ def update_access_token(self, ) } - if unix_timestamp is not None: - details['token_expires'] = ( - min(map(int, unix_timestamp)) - if isinstance(unix_timestamp, (list, tuple)) else - int(unix_timestamp) - ) + if expiry is not None: + if isinstance(expiry, (list, tuple)): + expiry = [val for val in expiry if val] + expiry = min(map(int, expiry)) if expiry else -1 + else: + expiry = int(expiry) + details['token_expires'] = time.time() + expiry if refresh_token is not None: details['refresh_token'] = ( - '|'.join(refresh_token) + '|'.join([token or '' for token in refresh_token]) if isinstance(refresh_token, (list, tuple)) else refresh_token ) diff --git a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/json_store/json_store.py b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/json_store/json_store.py index baede56d44..12beef2c77 100644 --- a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/json_store/json_store.py +++ b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/json_store/json_store.py @@ -14,19 +14,19 @@ from io import open from ..constants import DATA_PATH -from ..logger import log_debug, log_error +from ..logger import Logger from ..utils import make_dirs, merge_dicts, to_unicode -class JSONStore(object): +class JSONStore(Logger): BASE_PATH = make_dirs(DATA_PATH) def __init__(self, filename): if self.BASE_PATH: - self.filename = os.path.join(self.BASE_PATH, filename) + self.filepath = os.path.join(self.BASE_PATH, filename) else: - log_error('JSONStore.__init__ - unable to access temp directory') - self.filename = None + self.log_error('JSONStore.__init__ - temp directory not available') + self.filepath = None self._data = {} self.load() @@ -36,62 +36,66 @@ def set_defaults(self, reset=False): raise NotImplementedError def save(self, data, update=False, process=None): - if not self.filename: + if not self.filepath: return if update: data = merge_dicts(self._data, data) if data == self._data: - log_debug('JSONStore.save - data unchanged:\n|{filename}|'.format( - filename=self.filename - )) + self.log_debug('JSONStore.save - data unchanged' + '\n\tFile: {filepath}' + .format(filepath=self.filepath)) return - log_debug('JSONStore.save - saving:\n|{filename}|'.format( - filename=self.filename - )) + self.log_debug('JSONStore.save - saving' + '\n\tFile: {filepath}' + .format(filepath=self.filepath)) try: if not data: raise ValueError _data = json.loads(json.dumps(data, ensure_ascii=False)) - with open(self.filename, mode='w', encoding='utf-8') as jsonfile: + with open(self.filepath, mode='w', encoding='utf-8') as jsonfile: jsonfile.write(to_unicode(json.dumps(_data, ensure_ascii=False, indent=4, sort_keys=True))) self._data = process(_data) if process is not None else _data - except (IOError, OSError): - log_error('JSONStore.save - access error:\n|{filename}|'.format( - filename=self.filename - )) + except (IOError, OSError) as exc: + self.log_error('JSONStore.save - Access error' + '\n\tException: {exc!r}' + '\n\tFile: {filepath}' + .format(exc=exc, filepath=self.filepath)) return - except (TypeError, ValueError): - log_error('JSONStore.save - invalid data:\n|{data}|'.format( - data=data - )) + except (TypeError, ValueError) as exc: + self.log_error('JSONStore.save - Invalid data' + '\n\tException: {exc!r}' + '\n\tData: {data}' + .format(exc=exc, data=data)) self.set_defaults(reset=True) def load(self, process=None): - if not self.filename: + if not self.filepath: return - log_debug('JSONStore.load - loading:\n|{filename}|'.format( - filename=self.filename - )) + self.log_debug('JSONStore.load - loading' + '\n\tFile: {filepath}' + .format(filepath=self.filepath)) try: - with open(self.filename, mode='r', encoding='utf-8') as jsonfile: + with open(self.filepath, mode='r', encoding='utf-8') as jsonfile: data = jsonfile.read() if not data: raise ValueError _data = json.loads(data) self._data = process(_data) if process is not None else _data - except (IOError, OSError): - log_error('JSONStore.load - access error:\n|{filename}|'.format( - filename=self.filename - )) - except (TypeError, ValueError): - log_error('JSONStore.load - invalid data:\n|{data}|'.format( - data=data - )) + except (IOError, OSError) as exc: + self.log_error('JSONStore.load - Access error' + '\n\tException: {exc!r}' + '\n\tFile: {filepath}' + .format(exc=exc, filepath=self.filepath)) + except (TypeError, ValueError) as exc: + self.log_error('JSONStore.load - Invalid data' + '\n\tException: {exc!r}' + '\n\tData: {data}' + .format(exc=exc, data=data)) def get_data(self, process=None): try: @@ -99,10 +103,11 @@ def get_data(self, process=None): raise ValueError _data = json.loads(json.dumps(self._data, ensure_ascii=False)) return process(_data) if process is not None else _data - except (TypeError, ValueError): - log_error('JSONStore.get_data - invalid data:\n|{data}|'.format( - data=self._data - )) + except (TypeError, ValueError) as exc: + self.log_error('JSONStore.get_data - Invalid data' + '\n\tException: {exc!r}' + '\n\tData: {data}' + .format(exc=exc, data=self._data)) self.set_defaults(reset=True) _data = json.loads(json.dumps(self._data, ensure_ascii=False)) return process(_data) if process is not None else _data diff --git a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/logger.py b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/logger.py index b3968f2d60..34b9cc2c01 100644 --- a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/logger.py +++ b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/logger.py @@ -10,42 +10,56 @@ from __future__ import absolute_import, division, unicode_literals -from .compatibility import xbmc, xbmcaddon +from .compatibility import xbmc from .constants import ADDON_ID -DEBUG = xbmc.LOGDEBUG -INFO = xbmc.LOGINFO -NOTICE = xbmc.LOGNOTICE -WARNING = xbmc.LOGWARNING -ERROR = xbmc.LOGERROR -FATAL = xbmc.LOGFATAL -SEVERE = xbmc.LOGSEVERE -NONE = xbmc.LOGNONE -def log(text, log_level=DEBUG, addon_id=ADDON_ID): - if not addon_id: - addon_id = xbmcaddon.Addon().getAddonInfo('id') - log_line = '[%s] %s' % (addon_id, text) - xbmc.log(msg=log_line, level=log_level) - - -def log_debug(text, addon_id=ADDON_ID): - log(text, DEBUG, addon_id) - - -def log_info(text, addon_id=ADDON_ID): - log(text, INFO, addon_id) - - -def log_notice(text, addon_id=ADDON_ID): - log(text, NOTICE, addon_id) - - -def log_warning(text, addon_id=ADDON_ID): - log(text, WARNING, addon_id) - - -def log_error(text, addon_id=ADDON_ID): - log(text, ERROR, addon_id) +class Logger(object): + LOGDEBUG = xbmc.LOGDEBUG + LOGINFO = xbmc.LOGINFO + LOGNOTICE = xbmc.LOGNOTICE + LOGWARNING = xbmc.LOGWARNING + LOGERROR = xbmc.LOGERROR + LOGFATAL = xbmc.LOGFATAL + LOGSEVERE = xbmc.LOGSEVERE + LOGNONE = xbmc.LOGNONE + + @staticmethod + def log(text, log_level=LOGDEBUG, addon_id=ADDON_ID): + log_line = '[%s] %s' % (addon_id, text) + xbmc.log(msg=log_line, level=log_level) + + @staticmethod + def log_debug(text, addon_id=ADDON_ID): + log_line = '[%s] %s' % (addon_id, text) + xbmc.log(msg=log_line, level=Logger.LOGDEBUG) + + @staticmethod + def log_info(text, addon_id=ADDON_ID): + log_line = '[%s] %s' % (addon_id, text) + xbmc.log(msg=log_line, level=Logger.LOGINFO) + + @staticmethod + def log_notice(text, addon_id=ADDON_ID): + log_line = '[%s] %s' % (addon_id, text) + xbmc.log(msg=log_line, level=Logger.LOGNOTICE) + + @staticmethod + def log_warning(text, addon_id=ADDON_ID): + log_line = '[%s] %s' % (addon_id, text) + xbmc.log(msg=log_line, level=Logger.LOGWARNING) + + @staticmethod + def log_error(text, addon_id=ADDON_ID): + log_line = '[%s] %s' % (addon_id, text) + xbmc.log(msg=log_line, level=Logger.LOGERROR) + + @staticmethod + def debug_log(on=False, off=True): + if on: + Logger.LOGDEBUG = Logger.LOGNOTICE + elif off: + Logger.LOGDEBUG = xbmc.LOGDEBUG + return Logger.LOGDEBUG diff --git a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/monitors/player_monitor.py b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/monitors/player_monitor.py index 59bb42c433..2ca9e656a8 100644 --- a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/monitors/player_monitor.py +++ b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/monitors/player_monitor.py @@ -26,7 +26,7 @@ class PlayerMonitorThread(threading.Thread): - def __init__(self, player, provider, context, monitor, playback_data): + def __init__(self, player, provider, context, monitor, player_data): super(PlayerMonitorThread, self).__init__() self._stopped = threading.Event() @@ -37,10 +37,10 @@ def __init__(self, player, provider, context, monitor, playback_data): self._context = context self._monitor = monitor - self.playback_data = playback_data - self.video_id = playback_data.get('video_id') - self.channel_id = playback_data.get('channel_id') - self.video_status = playback_data.get('video_status') + self.player_data = player_data + self.video_id = player_data.get('video_id') + self.channel_id = player_data.get('channel_id') + self.video_status = player_data.get('video_status') self.current_time = 0.0 self.total_time = 0.0 @@ -55,13 +55,13 @@ def abort_now(self): or self.stopped()) def run(self): - playing_file = self.playback_data.get('playing_file') - play_count = self.playback_data.get('play_count', 0) - use_remote_history = self.playback_data.get('use_remote_history', False) - use_local_history = self.playback_data.get('use_local_history', False) - playback_stats = self.playback_data.get('playback_stats', {}) - refresh_only = self.playback_data.get('refresh_only', False) - clip = self.playback_data.get('clip', False) + playing_file = self.player_data.get('playing_file') + play_count = self.player_data.get('play_count', 0) + use_remote_history = self.player_data.get('use_remote_history', False) + use_local_history = self.player_data.get('use_local_history', False) + playback_stats = self.player_data.get('playback_stats', {}) + refresh_only = self.player_data.get('refresh_only', False) + clip = self.player_data.get('clip', False) self._context.log_debug('PlayerMonitorThread[{0}]: Starting' .format(self.video_id)) @@ -208,7 +208,7 @@ def run(self): 'played_time': self.current_time, 'played_percent': self.progress, } - self.playback_data['play_data'] = play_data + self.player_data['play_data'] = play_data if logged_in and report_url: client.update_watch_history( @@ -218,10 +218,10 @@ def run(self): status=(segment_end, segment_end, segment_end, 'stopped'), ) if use_local_history: - self._context.get_playback_history().update_item(self.video_id, - play_data) + self._context.get_playback_history().set_item(self.video_id, + play_data) - self._context.send_notification(PLAYBACK_STOPPED, self.playback_data) + self._context.send_notification(PLAYBACK_STOPPED, self.player_data) self._context.log_debug('Playback stopped [{video_id}]:' ' {played_time:.3f} secs of {total_time:.3f}' ' @ {played_percent}%,' @@ -240,7 +240,7 @@ def run(self): self._provider.on_playlist_x( self._provider, self._context, - method='remove', + command='remove', category='video', playlist_id=watch_later_id, video_id=playlist_item_id, @@ -272,7 +272,7 @@ def run(self): self._provider, self._context, rating_match, - method='rate', + command='rate', ) if settings.get_bool('youtube.post.play.refresh', False): @@ -355,9 +355,13 @@ def cleanup_threads(self, only_ended=True): self.threads = active_threads def onPlayBackStarted(self): + if not self._ui.busy_dialog_active(): + self._ui.clear_property(BUSY_FLAG) + if self._ui.get_property(PLAY_WITH): self._context.execute('Action(SwitchPlayer)') self._context.execute('Action(Stop)') + return def onAVStarted(self): if self._ui.get_property(PLAY_WITH): @@ -366,16 +370,16 @@ def onAVStarted(self): if not self._ui.busy_dialog_active(): self._ui.clear_property(BUSY_FLAG) - playback_data = self._ui.pop_property(PLAYER_DATA) - if not playback_data: + player_data = self._ui.pop_property(PLAYER_DATA) + if not player_data: return self.cleanup_threads() - playback_data = json.loads(playback_data) + player_data = json.loads(player_data) try: - self.seek_time = float(playback_data.get('seek_time')) - self.start_time = float(playback_data.get('start_time')) - self.end_time = float(playback_data.get('end_time')) + self.seek_time = float(player_data.get('seek_time')) + self.start_time = float(player_data.get('start_time')) + self.end_time = float(player_data.get('end_time')) self.current_time = max(0.0, self.getTime()) self.total_time = max(0.0, self.getTotalTime()) except (ValueError, TypeError, RuntimeError): @@ -389,7 +393,7 @@ def onAVStarted(self): self._provider, self._context, self._monitor, - playback_data)) + player_data)) def onPlayBackEnded(self): if not self._ui.busy_dialog_active(): diff --git a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/monitors/service_monitor.py b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/monitors/service_monitor.py index b0cfc33d1b..452aa59b2c 100644 --- a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/monitors/service_monitor.py +++ b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/monitors/service_monitor.py @@ -12,45 +12,47 @@ import json import threading -from ..compatibility import xbmc, xbmcgui +from ..compatibility import urlsplit, xbmc, xbmcgui from ..constants import ( ADDON_ID, CHECK_SETTINGS, + CONTAINER_FOCUS, + PATHS, PLUGIN_WAKEUP, REFRESH_CONTAINER, RELOAD_ACCESS_MANAGER, SERVER_WAKEUP, WAKEUP, ) -from ..logger import log_debug from ..network import get_connect_address, get_http_server, httpd_status class ServiceMonitor(xbmc.Monitor): _settings_changes = 0 - _settings_state = None + _settings_collect = False get_idle_time = xbmc.getGlobalIdleTime def __init__(self, context): self._context = context - settings = context.get_settings() - self._httpd_address, self._httpd_port = get_connect_address(context) - self._old_httpd_address = self._httpd_address - self._old_httpd_port = self._httpd_port - self._whitelist = settings.httpd_whitelist() + self._httpd_address = None + self._httpd_port = None + self._whitelist = None + self._old_httpd_address = None + self._old_httpd_port = None + self._use_httpd = None + self._httpd_error = False self.httpd = None self.httpd_thread = None - self.httpd_sleep_allowed = settings.httpd_sleep_allowed() + self.httpd_sleep_allowed = True self.system_idle = False + self.system_sleep = False self.refresh = False self.interrupt = False - self._use_httpd = None - if self.httpd_required(settings): - self.start_httpd() + self.onSettingsChanged(force=True) super(ServiceMonitor, self).__init__() @@ -84,73 +86,123 @@ def refresh_container(self, force=False): self.refresh = True def onNotification(self, sender, method, data): + if sender == 'xbmc': + if method == 'System.OnSleep': + self.system_idle = True + self.system_sleep = True + + elif method in { + 'GUI.OnScreensaverActivated', + 'GUI.OnDPMSActivated', + }: + self.system_idle = True + + elif method in { + 'GUI.OnScreensaverDeactivated', + 'GUI.OnDPMSDeactivated', + 'System.OnWake', + }: + self.onWake() + + elif method == 'Player.OnPlay': + player = xbmc.Player() + try: + playing_file = urlsplit(player.getPlayingFile()) + if playing_file.path in {PATHS.MPD, + PATHS.PLAY, + PATHS.REDIRECT}: + self.onWake() + except RuntimeError: + pass + + return + if sender != ADDON_ID: return + group, separator, event = method.partition('.') - if event == CHECK_SETTINGS: - if not isinstance(data, dict): - data = json.loads(data) - if data == 'defer': - self._settings_state = data - elif data == 'process': - self._settings_state = data - self.onSettingsChanged() - self._settings_state = None - elif event == WAKEUP: + + if event == WAKEUP: if not isinstance(data, dict): data = json.loads(data) if not data: return + target = data.get('target') + if target == PLUGIN_WAKEUP: self.interrupt = True + response = True + elif target == SERVER_WAKEUP: if not self.httpd and self.httpd_required(): - self.start_httpd() + response = self.start_httpd() + else: + response = bool(self.httpd) if self.httpd_sleep_allowed: self.httpd_sleep_allowed = None + + elif target == CHECK_SETTINGS: + state = data.get('state') + if state == 'defer': + self._settings_collect = True + elif state == 'process': + self.onSettingsChanged(force=True) + response = True + + else: + return + if data.get('response_required'): - self.set_property(WAKEUP, target) + data['response'] = response + self.set_property(WAKEUP, json.dumps(data, ensure_ascii=False)) + elif event == REFRESH_CONTAINER: self.refresh_container() + + elif event == CONTAINER_FOCUS: + if data: + data = json.loads(data) + if not data or not self.is_plugin_container(check_all=True): + return + xbmc.executebuiltin('SetFocus({0},{1},absolute)'.format(*data)) + elif event == RELOAD_ACCESS_MANAGER: self._context.reload_access_manager() self.refresh_container() - def onScreensaverActivated(self): - self.system_idle = True + def onSettingsChanged(self, force=False): + context = self._context - def onScreensaverDeactivated(self): - self.system_idle = False - self.interrupt = True - - def onDPMSActivated(self): - self.system_idle = True - - def onDPMSDeactivated(self): - self.system_idle = False - self.interrupt = True + if force: + self._settings_collect = False + self._settings_changes = 0 + else: + self._settings_changes += 1 + if self._settings_collect: + return - def onSettingsChanged(self): - self._settings_changes += 1 - if self._settings_state == 'defer': - return - changes = self._settings_changes - if self._settings_state != 'process': + total = self._settings_changes self.waitForAbort(1) - if changes != self._settings_changes: + if total != self._settings_changes: return - log_debug('onSettingsChanged: {0} change(s)'.format(changes)) - self._settings_changes = 0 - settings = self._context.get_settings(refresh=True) + context.log_debug('onSettingsChanged: {0} change(s)'.format(total)) + self._settings_changes = 0 + + settings = context.get_settings(refresh=True) + if settings.logging_enabled(): + context.debug_log(on=True) + else: + context.debug_log(off=True) + self.set_property(CHECK_SETTINGS) self.refresh_container() httpd_started = bool(self.httpd) httpd_restart = False - address, port = get_connect_address(self._context) + address, port = get_connect_address(context) if port != self._httpd_port: self._old_httpd_port = self._httpd_port self._httpd_port = port @@ -177,64 +229,105 @@ def onSettingsChanged(self): elif httpd_started: self.shutdown_httpd() + def onWake(self): + self.system_idle = False + self.system_sleep = False + self.interrupt = True + + if not self.httpd and self.httpd_required(): + self.start_httpd() + if self.httpd_sleep_allowed: + self.httpd_sleep_allowed = None + def httpd_address_sync(self): self._old_httpd_address = self._httpd_address self._old_httpd_port = self._httpd_port def start_httpd(self): if self.httpd: - return + self._httpd_error = False + return True - log_debug('HTTPServer: Starting |{ip}:{port}|' - .format(ip=self._httpd_address, port=self._httpd_port)) + context = self._context + context.log_debug('HTTPServer: Starting |{ip}:{port}|' + .format(ip=self._httpd_address, + port=self._httpd_port)) self.httpd_address_sync() self.httpd = get_http_server(address=self._httpd_address, port=self._httpd_port, - context=self._context) + context=context) if not self.httpd: - return + self._httpd_error = True + return False self.httpd_thread = threading.Thread(target=self.httpd.serve_forever) + self.httpd_thread.daemon = True self.httpd_thread.start() address = self.httpd.socket.getsockname() - log_debug('HTTPServer: Serving on |{ip}:{port}|' - .format(ip=address[0], port=address[1])) + context.log_debug('HTTPServer: Listening on |{ip}:{port}|' + .format(ip=address[0], + port=address[1])) + self._httpd_error = False + return True - def shutdown_httpd(self, sleep=False): + def shutdown_httpd(self): if self.httpd: - if sleep and self.httpd_required(while_sleeping=True): + if (not self.system_sleep + and self.system_idle + and self.httpd_required(while_idle=True)): return - log_debug('HTTPServer: Shutting down |{ip}:{port}|' - .format(ip=self._old_httpd_address, - port=self._old_httpd_port)) + self._context.log_debug('HTTPServer: Shutting down |{ip}:{port}|' + .format(ip=self._old_httpd_address, + port=self._old_httpd_port)) self.httpd_address_sync() - self.httpd.shutdown() + + shutdown_thread = threading.Thread(target=self.httpd.shutdown) + shutdown_thread.daemon = True + shutdown_thread.start() + + for thread in (self.httpd_thread, shutdown_thread): + if not thread.is_alive(): + continue + try: + thread.join(5) + except RuntimeError: + pass + self.httpd.server_close() - self.httpd_thread.join() + self.httpd_thread = None self.httpd = None def restart_httpd(self): - log_debug('HTTPServer: Restarting |{old_ip}:{old_port}| > |{ip}:{port}|' - .format(old_ip=self._old_httpd_address, - old_port=self._old_httpd_port, - ip=self._httpd_address, - port=self._httpd_port)) + self._context.log_debug('HTTPServer: Restarting' + ' |{old_ip}:{old_port}| > |{ip}:{port}|' + .format(old_ip=self._old_httpd_address, + old_port=self._old_httpd_port, + ip=self._httpd_address, + port=self._httpd_port)) self.shutdown_httpd() self.start_httpd() def ping_httpd(self): return self.httpd and httpd_status(self._context) - def httpd_required(self, settings=None, while_sleeping=False): - if while_sleeping: + def httpd_required(self, settings=None, while_idle=False): + if settings: + required = (settings.use_isa() + or settings.api_config_page() + or settings.support_alternative_player()) + self._use_httpd = required + + elif self._httpd_error: + required = False + + elif while_idle: settings = self._context.get_settings() - return (settings.api_config_page() - or settings.support_alternative_player()) + required = (settings.api_config_page() + or settings.support_alternative_player()) - if settings: - self._use_httpd = (settings.use_isa() - or settings.api_config_page() - or settings.support_alternative_player()) - return self._use_httpd + else: + required = self._use_httpd + + return required diff --git a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/network/http_server.py b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/network/http_server.py index b2ecba8bbb..8f4a1b4b21 100644 --- a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/network/http_server.py +++ b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/network/http_server.py @@ -20,15 +20,21 @@ from ..compatibility import ( BaseHTTPRequestHandler, TCPServer, - parse_qs, + parse_qsl, urlsplit, + urlunsplit, xbmc, xbmcgui, xbmcvfs, ) -from ..constants import ADDON_ID, LICENSE_TOKEN, LICENSE_URL, PATHS, TEMP_PATH -from ..logger import log_debug, log_error -from ..utils import validate_ip_address, redact_ip, wait +from ..constants import ( + ADDON_ID, + LICENSE_TOKEN, + LICENSE_URL, + PATHS, + TEMP_PATH, +) +from ..utils import redact_ip, validate_ip_address, wait class HTTPServer(TCPServer): @@ -44,6 +50,9 @@ def server_close(self): class RequestHandler(BaseHTTPRequestHandler, object): + protocol_version = 'HTTP/1.1' + server_version = 'plugin.video.youtube/1.0' + _context = None requests = None BASE_PATH = xbmcvfs.translatePath(TEMP_PATH) @@ -63,47 +72,58 @@ def __init__(self, *args, **kwargs): self.whitelist_ips = self._context.get_settings().httpd_whitelist() super(RequestHandler, self).__init__(*args, **kwargs) - def connection_allowed(self): + def connection_allowed(self, method): client_ip = self.client_address[0] - octets = validate_ip_address(client_ip) - log_lines = ['HTTPServer: Connection from |%s|' % client_ip] - conn_allowed = False - for ip_range in self.local_ranges: - if ((any(octets) - and isinstance(ip_range, tuple) - and ip_range[0] <= octets <= ip_range[1]) - or client_ip == ip_range): - conn_allowed = True - break - log_lines.append('Local range: |%s|' % str(conn_allowed)) - if not conn_allowed: - conn_allowed = client_ip in self.whitelist_ips - log_lines.append('Whitelisted: |%s|' % str(conn_allowed)) + is_whitelisted = client_ip in self.whitelist_ips + conn_allowed = is_whitelisted if not conn_allowed: - log_debug('HTTPServer: Connection from |{client_ip| not allowed' - .format(client_ip=client_ip)) - elif self.path != PATHS.PING: - log_debug(' '.join(log_lines)) + octets = validate_ip_address(client_ip) + for ip_range in self.local_ranges: + if ((any(octets) + and isinstance(ip_range, tuple) + and ip_range[0] <= octets <= ip_range[1]) + or client_ip == ip_range): + in_local_range = True + conn_allowed = True + break + else: + in_local_range = False + else: + in_local_range = 'Undetermined' + + if self.path != PATHS.PING: + msg = ('HTTPServer - {method}' + '\n\tPath: |{path}|' + '\n\tAddress: |{client_ip}|' + '\n\tWhitelisted: {is_whitelisted}' + '\n\tLocal range: {in_local_range}' + '\n\tStatus: {status}' + .format(method=method, + path=redact_ip(self.path), + client_ip=client_ip, + is_whitelisted=is_whitelisted, + in_local_range=in_local_range, + status='Allowed' if conn_allowed else 'Blocked')) + self._context.log_debug(msg) return conn_allowed # noinspection PyPep8Naming def do_GET(self): - settings = self._context.get_settings() - localize = self._context.localize + if not self.connection_allowed('GET'): + self.send_error(403) + return + + context = self._context + localize = context.localize + + settings = context.get_settings() api_config_enabled = settings.api_config_page() # Strip trailing slash if present stripped_path = self.path.rstrip('/') - if stripped_path != PATHS.PING: - log_debug('HTTPServer: GET |{path}|'.format( - path=redact_ip(self.path) - )) - - if not self.connection_allowed(): - self.send_error(403) - elif stripped_path == PATHS.IP: + if stripped_path == PATHS.IP: client_json = json.dumps({'ip': self.client_address[0]}) self.send_response(200) self.send_header('Content-Type', 'application/json; charset=utf-8') @@ -112,15 +132,22 @@ def do_GET(self): self.wfile.write(client_json.encode('utf-8')) elif stripped_path.startswith(PATHS.MPD): - filepath = os.path.join(self.BASE_PATH, self.path[len(PATHS.MPD):]) - file_chunk = True try: + file = dict(parse_qsl(urlsplit(self.path).query)).get('file') + if file: + filepath = os.path.join(self.BASE_PATH, file) + else: + filepath = None + raise IOError + with open(filepath, 'rb') as f: self.send_response(200) self.send_header('Content-Type', 'application/dash+xml') self.send_header('Content-Length', str(os.path.getsize(filepath))) self.end_headers() + + file_chunk = True while file_chunk: file_chunk = f.read(self.chunk_size) if file_chunk: @@ -146,15 +173,15 @@ def do_GET(self): xbmc.executebuiltin('Dialog.Close(addonsettings,true)') query = urlsplit(self.path).query - params = parse_qs(query) + params = dict(parse_qsl(query)) updated = [] - api_key = params.get('api_key', [None])[0] - api_id = params.get('api_id', [None])[0] - api_secret = params.get('api_secret', [None])[0] + api_key = params.get('api_key') + api_id = params.get('api_id') + api_secret = params.get('api_secret') # Bookmark this page if api_key and api_id and api_secret: - footer = localize(30638) + footer = localize('api.config.bookmark') else: footer = '' @@ -167,27 +194,27 @@ def do_GET(self): if api_key is not None and api_key != settings.api_key(): settings.api_key(new_key=api_key) - updated.append(localize(30201)) # API Key + updated.append(localize('api.key')) if api_id is not None and api_id != settings.api_id(): settings.api_id(new_id=api_id) - updated.append(localize(30202)) # API ID + updated.append(localize('api.id')) if api_secret is not None and api_secret != settings.api_secret(): settings.api_secret(new_secret=api_secret) - updated.append(localize(30203)) # API Secret + updated.append(localize('api.secret')) if api_key and api_id and api_secret: - enabled = localize(30636) # Personal keys enabled + enabled = localize('api.personal.enabled') else: - enabled = localize(30637) # Personal keys disabled + enabled = localize('api.personal.disabled') if updated: # Successfully updated - updated = localize(30631) % ', '.join(updated) + updated = localize('api.config.updated') % ', '.join(updated) else: # No changes, not updated - updated = localize(30635) + updated = localize('api.config.not_updated') html = self.api_submit_page(updated, enabled, footer) html = html.encode('utf-8') @@ -204,11 +231,12 @@ def do_GET(self): self.send_error(204) elif stripped_path.startswith(PATHS.REDIRECT): - url = parse_qs(urlsplit(self.path).query).get('url') + url = dict(parse_qsl(urlsplit(self.path).query)).get('url') if url: wait(1) self.send_response(301) - self.send_header('Location', url[0]) + self.send_header('Location', url) + self.send_header('Connection', 'close') self.end_headers() else: self.send_error(501) @@ -218,23 +246,28 @@ def do_GET(self): # noinspection PyPep8Naming def do_HEAD(self): - log_debug('HTTPServer: HEAD |{path}|'.format(path=self.path)) - - if not self.connection_allowed(): + if not self.connection_allowed('HEAD'): self.send_error(403) + return - elif self.path.startswith(PATHS.MPD): - filepath = os.path.join(self.BASE_PATH, self.path[len(PATHS.MPD):]) - if not os.path.isfile(filepath): - response = ('File Not Found: |{path}| -> |{filepath}|' - .format(path=self.path, filepath=filepath)) - self.send_error(404, response) - else: + if self.path.startswith(PATHS.MPD): + try: + file = dict(parse_qsl(urlsplit(self.path).query)).get('file') + if file: + file_path = os.path.join(self.BASE_PATH, file) + else: + file_path = None + raise IOError + + file_size = os.path.getsize(file_path) self.send_response(200) self.send_header('Content-Type', 'application/dash+xml') - self.send_header('Content-Length', - str(os.path.getsize(filepath))) + self.send_header('Content-Length', str(file_size)) self.end_headers() + except IOError: + response = ('File Not Found: |{path}| -> |{file_path}|' + .format(path=self.path, file_path=file_path)) + self.send_error(404, response) elif self.path.startswith(PATHS.REDIRECT): self.send_error(404) @@ -244,12 +277,11 @@ def do_HEAD(self): # noinspection PyPep8Naming def do_POST(self): - log_debug('HTTPServer: POST |{path}|'.format(path=self.path)) - - if not self.connection_allowed(): + if not self.connection_allowed('POST'): self.send_error(403) + return - elif self.path.startswith(PATHS.DRM): + if self.path.startswith(PATHS.DRM): home = xbmcgui.Window(10000) lic_url = home.getProperty('-'.join((ADDON_ID, LICENSE_URL))) @@ -294,8 +326,9 @@ def do_POST(self): re.MULTILINE) if match: authorized_types = match.group('authorized_types').split(',') - log_debug('HTTPServer: Found authorized formats |{auth_fmts}|' - .format(auth_fmts=authorized_types)) + self._context.log_debug('HTTPServer - Found authorized formats' + '\n\tFormats: {auth_fmts}' + .format(auth_fmts=authorized_types)) fmt_to_px = { 'SD': (1280 * 528) - 1, @@ -349,15 +382,15 @@ def api_config_page(cls): css = Pages.api_configuration.get('css') html = html.format( css=css, - title=localize(30634), # YouTube Add-on API Configuration - api_key_head=localize(30201), # API Key - api_id_head=localize(30202), # API ID - api_secret_head=localize(30203), # API Secret + title=localize('api.config'), + api_key_head=localize('api.key'), + api_id_head=localize('api.id'), + api_secret_head=localize('api.secret'), api_id_value=api_id, api_key_value=api_key, api_secret_value=api_secret, - submit=localize(30630), # Save - header=localize(30634), # YouTube Add-on API Configuration + submit=localize('api.config.save'), + header=localize('api.config'), ) return html @@ -368,11 +401,11 @@ def api_submit_page(cls, updated_keys, enabled, footer): css = Pages.api_submit.get('css') html = html.format( css=css, - title=localize(30634), # YouTube Add-on API Configuration + title=localize('api.config'), updated=updated_keys, enabled=enabled, footer=footer, - header=localize(30634), # YouTube Add-on API Configuration + header=localize('api.config'), ) return html @@ -566,8 +599,10 @@ def get_http_server(address, port, context): server = HTTPServer((address, port), RequestHandler) return server except socket.error as exc: - log_error('HTTPServer: Failed to start |{address}:{port}| |{response}|' - .format(address=address, port=port, response=exc)) + context.log_error('HTTPServer - Failed to start' + '\n\tAddress: |{address}:{port}|' + '\n\tResponse: {response}' + .format(address=address, port=port, response=exc)) xbmcgui.Dialog().notification(context.get_name(), str(exc), context.get_icon(), @@ -577,13 +612,13 @@ def get_http_server(address, port, context): def httpd_status(context): - address, port = get_connect_address(context) - url = ''.join(( - 'http://', - address, - ':', - str(port), + netloc = get_connect_address(context, as_netloc=True) + url = urlunsplit(( + 'http', + netloc, PATHS.PING, + '', + '', )) if not RequestHandler.requests: RequestHandler.requests = BaseRequestsClass(context=context) @@ -592,22 +627,22 @@ def httpd_status(context): if result == 204: return True - log_debug('HTTPServer: Ping |{address}:{port}| - |{response}|' - .format(address=address, - port=port, - response=result or 'failed')) + context.log_debug('HTTPServer - Ping' + '\n\tAddress: |{netloc}|' + '\n\tResponse: {response}' + .format(netloc=netloc, + response=result or 'failed')) return False def get_client_ip_address(context): ip_address = None - address, port = get_connect_address(context) - url = ''.join(( - 'http://', - address, - ':', - str(port), + url = urlunsplit(( + 'http', + get_connect_address(context, as_netloc=True), PATHS.IP, + '', + '', )) if not RequestHandler.requests: RequestHandler.requests = BaseRequestsClass(context=context) @@ -621,31 +656,48 @@ def get_client_ip_address(context): def get_connect_address(context, as_netloc=False): settings = context.get_settings() - address = settings.httpd_listen() - port = settings.httpd_port() - if address == '0.0.0.0': - address = '127.0.0.1' + listen_address = settings.httpd_listen() + listen_port = settings.httpd_port() - sock = None try: sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) - if hasattr(socket, "SO_REUSEADDR"): - sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) - if hasattr(socket, "SO_REUSEPORT"): - sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) - except socket.error: - address = xbmc.getIPAddress() - - if sock: + if listen_address == '0.0.0.0': + broadcast_address = '' + sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) + else: + broadcast_address = listen_address + if hasattr(socket, 'SO_REUSEADDR'): + sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + if hasattr(socket, 'SO_REUSEPORT'): + sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) + except socket.error as exc: + context.log_error('HTTPServer' + ' - get_connect_address failed to create socket' + '\n\tException: {exc!r}' + .format(exc=exc)) + connect_address = xbmc.getIPAddress() + else: sock.settimeout(0) try: - sock.connect((address, 0)) - address = sock.getsockname()[0] - except socket.error: - address = xbmc.getIPAddress() + sock.connect((broadcast_address, 0)) + except socket.error as exc: + context.log_error('HTTPServer' + ' - get_connect_address failed connect' + '\n\tException: {exc!r}' + .format(exc=exc)) + connect_address = xbmc.getIPAddress() + else: + try: + connect_address = sock.getsockname()[0] + except socket.error as exc: + context.log_error('HTTPServer' + ' - get_connect_address failed to get address' + '\n\tException: {exc!r}' + .format(exc=exc)) + connect_address = xbmc.getIPAddress() finally: sock.close() if as_netloc: - return ':'.join((address, str(port))) - return address, port + return ':'.join((connect_address, str(listen_port))) + return listen_address, listen_port diff --git a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/network/ip_api.py b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/network/ip_api.py index 853ee216e9..a2dc26fe33 100644 --- a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/network/ip_api.py +++ b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/network/ip_api.py @@ -10,7 +10,6 @@ from __future__ import absolute_import, division, unicode_literals from .requests import BaseRequestsClass -from .. import logger class Locator(BaseRequestsClass): @@ -30,11 +29,14 @@ def locate_requester(self): self._response = response and response.json() or {} def success(self): - successful = self.response().get('status', 'fail') == 'success' + response = self.response() + successful = response.get('status', 'fail') == 'success' if successful: - logger.log_debug('Location request was successful') + self.log_debug('Locator - Request successful') else: - logger.log_error(self.response().get('message', 'Location request failed with no error message')) + self.log_error('Locator - Request failed' + '\n\tMessage: {msg}' + .format(msg=response.get('message', 'Unknown'))) return successful def coordinates(self): @@ -44,7 +46,7 @@ def coordinates(self): lat = self._response.get('lat') lon = self._response.get('lon') if lat is None or lon is None: - logger.log_error('No coordinates returned') + self.log_error('Locator - No coordinates returned') return None - logger.log_debug('Coordinates found') + self.log_debug('Locator - Coordinates found') return {'lat': lat, 'lon': lon} diff --git a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/network/requests.py b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/network/requests.py index 16c4963b58..610a495e0e 100644 --- a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/network/requests.py +++ b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/network/requests.py @@ -10,6 +10,7 @@ from __future__ import absolute_import, division, unicode_literals import atexit +import socket from traceback import format_stack from requests import Session @@ -18,7 +19,7 @@ from requests.utils import DEFAULT_CA_BUNDLE_PATH, extract_zipped_paths from urllib3.util.ssl_ import create_urllib3_context -from ..logger import log_error +from ..logger import Logger __all__ = ( @@ -28,6 +29,20 @@ class SSLHTTPAdapter(HTTPAdapter): + _SOCKET_OPTIONS = ( + (socket.SOL_SOCKET, getattr(socket, 'SO_KEEPALIVE', None), 1), + (socket.IPPROTO_TCP, getattr(socket, 'TCP_NODELAY', None), 1), + (socket.IPPROTO_TCP, getattr(socket, 'TCP_KEEPIDLE', None), 300), + # TCP_KEEPALIVE equivalent to TCP_KEEPIDLE on iOS/macOS + (socket.IPPROTO_TCP, getattr(socket, 'TCP_KEEPALIVE', None), 300), + # TCP_KEEPINTVL may not be implemented at app level on iOS/macOS + (socket.IPPROTO_TCP, getattr(socket, 'TCP_KEEPINTVL', None), 60), + # TCP_KEEPCNT may not be implemented at app level on iOS/macOS + (socket.IPPROTO_TCP, getattr(socket, 'TCP_KEEPCNT', None), 5), + # TCP_USER_TIMEOUT = TCP_KEEPIDLE + TCP_KEEPINTVL * TCP_KEEPCNT + (socket.IPPROTO_TCP, getattr(socket, 'TCP_USER_TIMEOUT', None), 600), + ) + _ssl_context = create_urllib3_context() _ssl_context.load_verify_locations( capath=extract_zipped_paths(DEFAULT_CA_BUNDLE_PATH) @@ -35,6 +50,12 @@ class SSLHTTPAdapter(HTTPAdapter): def init_poolmanager(self, *args, **kwargs): kwargs['ssl_context'] = self._ssl_context + + kwargs['socket_options'] = [ + socket_option for socket_option in self._SOCKET_OPTIONS + if socket_option[1] is not None + ] + return super(SSLHTTPAdapter, self).init_poolmanager(*args, **kwargs) def cert_verify(self, conn, url, verify, cert): @@ -42,7 +63,7 @@ def cert_verify(self, conn, url, verify, cert): return super(SSLHTTPAdapter, self).cert_verify(conn, url, verify, cert) -class BaseRequestsClass(object): +class BaseRequestsClass(Logger): _session = Session() _session.mount('https://', SSLHTTPAdapter( pool_maxsize=10, @@ -51,6 +72,7 @@ class BaseRequestsClass(object): total=3, backoff_factor=0.1, status_forcelist={500, 502, 503, 504}, + allowed_methods=None, ) )) atexit.register(_session.close) @@ -58,7 +80,8 @@ class BaseRequestsClass(object): def __init__(self, context, exc_type=None): settings = context.get_settings() self._verify = settings.verify_ssl() - self._timeout = settings.get_timeout() + self._timeout = settings.requests_timeout() + self._proxy = settings.proxy_settings() if isinstance(exc_type, tuple): self._default_exc = (RequestException,) + exc_type @@ -89,6 +112,8 @@ def request(self, url, method='GET', timeout = self._timeout if verify is None: verify = self._verify + if proxies is None: + proxies = self._proxy if allow_redirects is None: allow_redirects = True @@ -123,7 +148,7 @@ def request(self, url, method='GET', except self._default_exc as exc: exc_response = exc.response or response response_text = exc_response and exc_response.text - stack_trace = format_stack() + stack = format_stack() error_details = {'exc': exc} if error_hook: @@ -141,40 +166,40 @@ def request(self, url, method='GET', error_details.update(_detail) if _response is not None: response = _response - response_text = str(_response) + response_text = repr(_response) if _trace is not None: - stack_trace = _trace + stack = _trace if _exc is not None: raise_exc = _exc if error_title is None: - error_title = 'Request failed' + error_title = 'Request - Failed' if error_info is None: try: - error_info = 'Status: {0.status_code} - {0.reason}'.format( - exc.response - ) + error_info = ('Status: {0.status_code} - {0.reason}' + .format(exc.response)) except AttributeError: - error_info = str(exc) + error_info = ('Exception: {exc!r}' + .format(exc=exc)) elif '{' in error_info: try: error_info = error_info.format(**error_details) except (AttributeError, IndexError, KeyError): - error_info = str(exc) + error_info = ('Exception: {exc!r}' + .format(exc=exc)) if response_text: - response_text = 'Request response:\n{0}'.format(response_text) + response_text = ('Response: {0}' + .format(response_text)) - if stack_trace: - stack_trace = ( - 'Stack trace (most recent call last):\n{0}'.format( - ''.join(stack_trace) - ) + if stack: + stack = 'Stack trace (most recent call last):\n{stack}'.format( + stack=''.join(stack) ) - log_error('\n'.join([part for part in [ - error_title, error_info, response_text, stack_trace + self.log_error('\n\t'.join([part for part in [ + error_title, error_info, response_text, stack ] if part])) if raise_exc: diff --git a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/player/__init__.py b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/player/__init__.py index 62e814d120..83ed44b372 100644 --- a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/player/__init__.py +++ b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/player/__init__.py @@ -9,8 +9,7 @@ from __future__ import absolute_import, division, unicode_literals -from .xbmc.xbmc_player import XbmcPlayer -from .xbmc.xbmc_playlist import XbmcPlaylist +from .xbmc.xbmc_playlist_player import XbmcPlaylistPlayer -__all__ = ('XbmcPlayer', 'XbmcPlaylist',) +__all__ = ('XbmcPlaylistPlayer',) diff --git a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/player/abstract_player.py b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/player/abstract_player.py deleted file mode 100644 index ac769d85e4..0000000000 --- a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/player/abstract_player.py +++ /dev/null @@ -1,29 +0,0 @@ -# -*- coding: utf-8 -*- -""" - - Copyright (C) 2014-2016 bromix (plugin.video.youtube) - Copyright (C) 2016-2018 plugin.video.youtube - - SPDX-License-Identifier: GPL-2.0-only - See LICENSES/GPL-2.0-only for more information. -""" - - -class AbstractPlayer(object): - def __init__(self): - pass - - def play(self, playlist_index=-1): - raise NotImplementedError() - - @staticmethod - def stop(): - raise NotImplementedError() - - @staticmethod - def pause(): - raise NotImplementedError() - - @staticmethod - def is_playing(): - raise NotImplementedError() diff --git a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/player/abstract_playlist.py b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/player/abstract_playlist_player.py similarity index 93% rename from plugin.video.youtube/resources/lib/youtube_plugin/kodion/player/abstract_playlist.py rename to plugin.video.youtube/resources/lib/youtube_plugin/kodion/player/abstract_playlist_player.py index a840b790fd..34c97b833e 100644 --- a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/player/abstract_playlist.py +++ b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/player/abstract_playlist_player.py @@ -9,7 +9,7 @@ """ -class AbstractPlaylist(object): +class AbstractPlaylistPlayer(object): def __init__(self): pass diff --git a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/player/xbmc/xbmc_player.py b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/player/xbmc/xbmc_player.py deleted file mode 100644 index f290667d37..0000000000 --- a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/player/xbmc/xbmc_player.py +++ /dev/null @@ -1,58 +0,0 @@ -# -*- coding: utf-8 -*- -""" - - Copyright (C) 2014-2016 bromix (plugin.video.youtube) - Copyright (C) 2016-2018 plugin.video.youtube - - SPDX-License-Identifier: GPL-2.0-only - See LICENSES/GPL-2.0-only for more information. -""" - -from __future__ import absolute_import, division, unicode_literals - -from ..abstract_player import AbstractPlayer -from ...compatibility import xbmc - - -class XbmcPlayer(AbstractPlayer): - def __init__(self, player_type, context): - super(XbmcPlayer, self).__init__() - - self._player_type = player_type - if player_type == 'audio': - self._player_type = 'music' - - self._context = context - - def play(self, playlist_index=-1): - """ - We call the player in this way, because 'Player.play(...)' will call the addon again while the instance is - running. This is somehow shitty, because we couldn't release any resources and in our case we couldn't release - the cache. So this is the solution to prevent a locked database (sqlite). - """ - self._context.execute('Playlist.PlayOffset(%s,%d)' % (self._player_type, playlist_index)) - - """ - playlist = None - if self._player_type == 'video': - playlist = xbmc.PlayList(xbmc.PLAYLIST_VIDEO) - elif self._player_type == 'music': - playlist = xbmc.PlayList(xbmc.PLAYLIST_MUSIC) - - if playlist_index >= 0: - xbmc.Player().play(item=playlist, startpos=playlist_index) - else: - xbmc.Player().play(item=playlist) - """ - - @staticmethod - def stop(): - xbmc.Player().stop() - - @staticmethod - def pause(): - xbmc.Player().pause() - - @staticmethod - def is_playing(): - return xbmc.Player().isPlaying() diff --git a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/player/xbmc/xbmc_playlist.py b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/player/xbmc/xbmc_playlist_player.py similarity index 50% rename from plugin.video.youtube/resources/lib/youtube_plugin/kodion/player/xbmc/xbmc_playlist.py rename to plugin.video.youtube/resources/lib/youtube_plugin/kodion/player/xbmc/xbmc_playlist_player.py index a914c20513..fee3305e78 100644 --- a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/player/xbmc/xbmc_playlist.py +++ b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/player/xbmc/xbmc_playlist_player.py @@ -12,33 +12,45 @@ import json -from ..abstract_playlist import AbstractPlaylist +from ..abstract_playlist_player import AbstractPlaylistPlayer from ...compatibility import xbmc from ...items import VideoItem, media_listitem from ...utils.methods import jsonrpc, wait -class XbmcPlaylist(AbstractPlaylist): +class XbmcPlaylistPlayer(AbstractPlaylistPlayer): _CACHE = { - 'playerid': None, - 'playlistid': None + 'player_id': None, + 'playlist_id': None } - _PLAYER_PLAYLIST = { + PLAYLIST_MAP = { + 0: 'music', + 1: 'video', 'video': xbmc.PLAYLIST_VIDEO, # 1 'audio': xbmc.PLAYLIST_MUSIC, # 0 } - def __init__(self, playlist_type, context, retry=0): - super(XbmcPlaylist, self).__init__() + def __init__(self, context, playlist_type=None, retry=None): + super(XbmcPlaylistPlayer, self).__init__() self._context = context - self._playlist = None - playlist_type = self._PLAYER_PLAYLIST.get(playlist_type) - if playlist_type: - self._playlist = xbmc.PlayList(playlist_type) + + player = xbmc.Player() + if retry is None: + retry = 3 if player.isPlaying() else 0 + + if playlist_type is None: + playlist_id = self.get_playlist_id(retry=retry) else: - self._playlist = xbmc.PlayList(self.get_playlistid(retry=retry)) + playlist_id = ( + self.PLAYLIST_MAP.get(playlist_type) + or self.PLAYLIST_MAP['video'] + ) + self.set_playlist_id(playlist_id) + + self._playlist = xbmc.PlayList(playlist_id) + self._player = player def clear(self): self._playlist.clear() @@ -57,13 +69,26 @@ def unshuffle(self): def size(self): return self._playlist.size() + def stop(self): + return self._player.stop() + + def pause(self): + return self._player.pause() + + def play_item(self, *args, **kwargs): + return self._player.play(*args, **kwargs) + + def is_playing(self): + return self._player.isPlaying() + @classmethod - def get_playerid(cls, retry=0): - """Function to get active player playerid""" + def get_player_id(cls, retry=0): + """Function to get active player player_id""" - # We don't need to get playerid every time, cache and reuse instead - if cls._CACHE['playerid'] is not None: - return cls._CACHE['playerid'] + # We don't need to get player_id every time, cache and reuse instead + player_id = cls._CACHE['player_id'] + if player_id is not None: + return player_id # Sometimes Kodi gets confused and uses a music playlist for video # content, so get the first active player instead, default to video @@ -79,42 +104,55 @@ def get_playerid(cls, retry=0): wait(2) else: # No active player - cls._CACHE['playerid'] = None + cls.set_player_id(None) return None for player in result: - if player.get('type', 'video') in cls._PLAYER_PLAYLIST: - playerid = player.get('playerid') - if playerid is not None: - playerid = int(playerid) + if player.get('type', 'video') in cls.PLAYLIST_MAP: + try: + player_id = int(player['playerid']) + except (KeyError, TypeError, ValueError): + continue break else: # No active player - cls._CACHE['playerid'] = None - return None + player_id = None + + cls.set_player_id(player_id) + return player_id + + @classmethod + def set_player_id(cls, player_id): + """Function to set player_id for requested player type""" + + cls._CACHE['player_id'] = player_id - cls._CACHE['playerid'] = playerid - return playerid + @classmethod + def set_playlist_id(cls, playlist_id): + """Function to set playlist_id for requested playlist type""" + + cls._CACHE['playlist_id'] = playlist_id @classmethod - def get_playlistid(cls, retry=0): - """Function to get playlistid of active player""" + def get_playlist_id(cls, retry=0): + """Function to get playlist_id of active player""" - # We don't need to get playlistid every time, cache and reuse instead - if cls._CACHE['playlistid'] is not None: - return cls._CACHE['playlistid'] + # We don't need to get playlist_id every time, cache and reuse instead + playlist_id = cls._CACHE['playlist_id'] + if playlist_id is not None: + return playlist_id result = jsonrpc(method='Player.GetProperties', - params={'playerid': cls.get_playerid(retry=retry), + params={'playerid': cls.get_player_id(retry=retry), 'properties': ['playlistid']}) try: - playlistid = int(result['result']['playlistid']) + playlist_id = int(result['result']['playlistid']) except (KeyError, TypeError, ValueError): - playlistid = cls._PLAYER_PLAYLIST['video'] + playlist_id = cls.PLAYLIST_MAP['video'] - cls._CACHE['playlistid'] = playlistid - return playlistid + cls.set_playlist_id(playlist_id) + return playlist_id def get_items(self, properties=None, dumps=False): if properties is None: @@ -128,11 +166,15 @@ def get_items(self, properties=None, dumps=False): try: result = response['result']['items'] return json.dumps(result, ensure_ascii=False) if dumps else result - except (KeyError, TypeError, ValueError): + except (KeyError, TypeError, ValueError) as exc: error = response.get('error', {}) - self._context.log_error('XbmcPlaylist.get_items error - |{0}: {1}|' - .format(error.get('code', 'unknown'), - error.get('message', 'unknown'))) + self._context.log_error('XbmcPlaylist.get_items - Error' + '\n\tException: {exc!r}' + '\n\tCode: {code}' + '\n\tMessage: {msg}' + .format(exc=exc, + code=error.get('code', 'Unknown'), + msg=error.get('message', 'Unknown'))) return '' if dumps else [] def add_items(self, items, loads=False): @@ -148,7 +190,7 @@ def add_items(self, items, loads=False): # jsonrpc(method='Playlist.Add', # params={ - # 'playlistid': self._playlist.getPlayListId(), + # 'playlistid': self._playlist.getPlaylistId(), # 'item': items, # }, # no_response=True) @@ -172,7 +214,7 @@ def play_playlist_item(self, position, resume=False): .format(position)) if not resume: - xbmc.Player().play(self._playlist, startpos=position - 1) + self._player.play(self._playlist, startpos=position - 1) return # JSON Player.Open can be too slow but is needed if resuming is enabled jsonrpc(method='Player.Open', @@ -182,34 +224,50 @@ def play_playlist_item(self, position, resume=False): options={'resume': True}, no_response=True) + def play(self, playlist_index=-1): + """ + We call the player in this way, because 'Player.play(...)' will call the addon again while the instance is + running. This is somehow shitty, because we couldn't release any resources and in our case we couldn't release + the cache. So this is the solution to prevent a locked database (sqlite). + """ + playlist_type = self.PLAYLIST_MAP.get(self._playlist.getPlayListId()) + self._context.execute( + 'Playlist.PlayOffset({type},{position})' + .format(type=playlist_type or 'video', position=playlist_index) + ) + + """ + playlist = None + if self._player_type == 'video': + playlist = xbmc.PlayList(xbmc.PLAYLIST_VIDEO) + elif self._player_type == 'music': + playlist = xbmc.PlayList(xbmc.PLAYLIST_MUSIC) + + if playlist_index >= 0: + xbmc.Player().play(item=playlist, startpos=playlist_index) + else: + xbmc.Player().play(item=playlist) + """ + def get_position(self, offset=0): """ Function to get current playlist position and number of remaining playlist items, where the first item in the playlist is position 1 """ - result = (None, None) - - # Use actual playlistid rather than xbmc.PLAYLIST_VIDEO as Kodi - # sometimes plays video content in a music playlist - playlistid = self._playlist.getPlayListId() - if playlistid is None: - return result - - playlist = xbmc.PlayList(playlistid) - position = playlist.getposition() + position = self._playlist.getposition() # PlayList().getposition() starts from zero unless playlist not active if position < 0: - return result - playlist_size = playlist.size() + return None, None + playlist_size = self._playlist.size() # Use 1 based index value for playlist position position += (offset + 1) # A playlist with only one element has no next item if playlist_size >= 1 and position <= playlist_size: - self._context.log_debug('playlistid: {0}, position - {1}/{2}' - .format(playlistid, + self._context.log_debug('playlist_id: {0}, position - {1}/{2}' + .format(self.get_playlist_id(), position, playlist_size)) - result = (position, (playlist_size - position)) - return result + return position, (playlist_size - position) + return None, None diff --git a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/plugin/xbmc/xbmc_plugin.py b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/plugin/xbmc/xbmc_plugin.py index 1df1e133d9..4cdca23693 100644 --- a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/plugin/xbmc/xbmc_plugin.py +++ b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/plugin/xbmc/xbmc_plugin.py @@ -13,10 +13,14 @@ from traceback import format_stack from ..abstract_plugin import AbstractPlugin -from ...compatibility import xbmc, xbmcplugin +from ...compatibility import urlsplit, xbmcplugin from ...constants import ( BUSY_FLAG, - CHECK_SETTINGS, + CONTAINER_FOCUS, + CONTAINER_ID, + CONTAINER_POSITION, + CONTENT_TYPE, + PATHS, PLAYLIST_PATH, PLAYLIST_POSITION, PLUGIN_SLEEPING, @@ -28,13 +32,13 @@ ) from ...exceptions import KodionException from ...items import ( + CommandItem, directory_listitem, image_listitem, media_listitem, playback_item, uri_listitem, ) -from ...player import XbmcPlaylist class XbmcPlugin(AbstractPlugin): @@ -59,70 +63,99 @@ class XbmcPlugin(AbstractPlugin): def __init__(self): super(XbmcPlugin, self).__init__() - self.handle = None def run(self, provider, context, focused=None): - self.handle = context.get_handle() + handle = context.get_handle() ui = context.get_ui() - if ui.pop_property(BUSY_FLAG).lower() == 'true': - if ui.busy_dialog_active(): - xbmcplugin.endOfDirectory( - self.handle, - succeeded=False, - updateListing=True, - ) + route = ui.pop_property(REROUTE_PATH) + post_run_action = None + succeeded = False + for was_busy in (ui.pop_property(BUSY_FLAG),): + if was_busy: + if ui.busy_dialog_active(): + ui.set_property(BUSY_FLAG) + if route: + break + else: + break + + uri = context.get_uri() + playlist_player = context.get_playlist_player() + position, remaining = playlist_player.get_position() + playing = (playlist_player.is_playing() + and context.is_plugin_path(uri, PATHS.PLAY)) + + if playing: + items = playlist_player.get_items() + playlist_player.clear() + context.log_warning('Multiple busy dialogs active' + ' - Playlist cleared to avoid Kodi crash') + + xbmcplugin.endOfDirectory( + handle, + succeeded=False, + updateListing=True, + cacheToDisc=False, + ) - playlist = XbmcPlaylist('auto', context, retry=3) - position, remaining = playlist.get_position() - items = playlist.get_items() - playlist.clear() - - context.log_warning('Multiple busy dialogs active - ' - 'playlist cleared to avoid Kodi crash') - - if position and items: - path = items[position - 1]['file'] - old_path = ui.pop_property(PLAYLIST_PATH) - old_position = ui.pop_property(PLAYLIST_POSITION) - if (old_position and position == int(old_position) - and old_path and path == old_path): - if remaining: - position += 1 - else: - items = None - - if items: - max_wait_time = 30 - while ui.busy_dialog_active(): - max_wait_time -= 1 - if max_wait_time < 0: - context.log_error('Multiple busy dialogs active - ' - 'extended busy period') - break - context.sleep(1) - - context.log_warning('Multiple busy dialogs active - ' - 'reloading playlist') - - num_items = playlist.add_items(items) - if xbmc.Player().isPlaying(): - return False - if position: - max_wait_time = min(position, num_items) - else: - position = 1 - max_wait_time = num_items - while ui.busy_dialog_active() or playlist.size() < position: - max_wait_time -= 1 - if max_wait_time < 0: - context.log_error('Multiple busy dialogs active - ' - 'unable to restart playback') - break - context.sleep(1) + if not playing: + context.log_warning('Multiple busy dialogs active' + ' - Plugin call ended to avoid Kodi crash') + result, post_run_action = self.uri_action(context, uri) + succeeded = result + continue + + if position: + path = items[position - 1]['file'] + old_path = ui.pop_property(PLAYLIST_PATH) + old_position = ui.pop_property(PLAYLIST_POSITION) + if (old_position and position == int(old_position) + and old_path and path == old_path): + if remaining: + position += 1 else: - playlist.play_playlist_item(position) - return False + continue + + max_wait_time = 30 + while ui.busy_dialog_active(): + max_wait_time -= 1 + if max_wait_time < 0: + context.log_error('Multiple busy dialogs active' + ' - Extended busy period') + continue + context.sleep(1) + + context.log_warning('Multiple busy dialogs active' + ' - Reloading playlist') + + num_items = playlist_player.add_items(items) + if position: + max_wait_time = min(position, num_items) + else: + position = 1 + max_wait_time = num_items + + while ui.busy_dialog_active() or playlist_player.size() < position: + max_wait_time -= 1 + if max_wait_time < 0: + context.log_error('Multiple busy dialogs active' + ' - Unable to restart playback') + result, post_run_action = self.uri_action( + context, + 'command://Playlist.PlayOffset({type},{position})' + .format(type='video', + position=(position - 1)), + ) + succeeded = False + continue + context.sleep(1) + else: + playlist_player.play_playlist_item(position) + else: + if post_run_action: + self.post_run(context, ui, post_run_action) + return succeeded if ui.get_property(PLUGIN_SLEEPING): context.wakeup(PLUGIN_WAKEUP) @@ -135,17 +168,11 @@ def run(self, provider, context, focused=None): if ui.pop_property(RELOAD_ACCESS_MANAGER): context.reload_access_manager() - if ui.pop_property(CHECK_SETTINGS): - provider.reset_client() - settings = context.get_settings(refresh=True) - else: - settings = context.get_settings() - + settings = context.get_settings() if settings.setup_wizard_enabled(): provider.run_wizard(context) try: - route = ui.pop_property(REROUTE_PATH) if route: function_cache = context.get_function_cache() result, options = function_cache.run( @@ -158,16 +185,29 @@ def run(self, provider, context, focused=None): result, options = provider.navigate(context) except KodionException as exc: result = options = None - if provider.handle_exception(context, exc): - context.log_error('XbmcRunner.run - {exc}:\n{details}'.format( - exc=exc, details=''.join(format_stack()) - )) + if not provider.handle_exception(context, exc): + msg = ('XbmcRunner.run - Error' + '\n\tException: {exc!r}' + '\n\tStack trace (most recent call last):\n{stack}' + .format(exc=exc, + stack=''.join(format_stack()))) + context.log_error(msg) ui.on_ok('Error in ContentProvider', exc.__str__()) - items = None + items = isinstance(result, (list, tuple)) item_count = 0 + if items: + if not result: + result = [ + CommandItem( + name=context.localize('page.back'), + command='Action(ParentDir)', + context=context, + image='DefaultFolderBack.png', + plot=context.localize('page.empty'), + ) + ] - if result and isinstance(result, (list, tuple)): show_fanart = settings.fanart_selection() items = [ self._LIST_ITEM_MAP[item.__class__.__name__]( @@ -183,68 +223,115 @@ def run(self, provider, context, focused=None): if options.get(provider.RESULT_FORCE_RESOLVE): result = result[0] + else: + result = None if result and result.__class__.__name__ in self._PLAY_ITEM_MAP: uri = result.get_uri() if result.playable: - ui = context.get_ui() - if not context.is_plugin_path(uri) and ui.busy_dialog_active(): - ui.set_property(BUSY_FLAG) - playlist = XbmcPlaylist('auto', context) - position, _ = playlist.get_position() - items = playlist.get_items() - if position and items: - ui.set_property(PLAYLIST_PATH, - items[position - 1]['file']) - ui.set_property(PLAYLIST_POSITION, str(position)) - item = self._PLAY_ITEM_MAP[result.__class__.__name__]( context, result, show_fanart=context.get_settings().fanart_selection(), ) - result = True - xbmcplugin.setResolvedUrl(self.handle, - succeeded=result, - listitem=item) - - elif uri.startswith('script://'): - uri = uri[len('script://'):] - context.log_debug('Running script: |{0}|'.format(uri)) - context.execute('RunScript({0})'.format(uri)) - result = False - - elif uri.startswith('command://'): - uri = uri[len('command://'):] - context.log_debug('Running command: |{0}|'.format(uri)) - context.execute(uri) - result = True - - elif context.is_plugin_path(uri): - context.log_debug('Redirecting to: |{0}|'.format(uri)) - context.execute('RunPlugin({0})'.format(uri)) - result = False + uri = result.get_uri() + result = xbmcplugin.addDirectoryItem(handle, + url=uri, + listitem=item) + if route: + playlist_player = context.get_playlist_player() + playlist_player.play_item(item=uri, listitem=item) + else: + xbmcplugin.setResolvedUrl(handle, + succeeded=result, + listitem=item) else: - result = False + result, post_run_action = self.uri_action(context, uri) if item_count: context.apply_content() succeeded = xbmcplugin.addDirectoryItems( - self.handle, items, item_count + handle, items, item_count ) cache_to_disc = options.get(provider.RESULT_CACHE_TO_DISC, True) update_listing = options.get(provider.RESULT_UPDATE_LISTING, False) else: succeeded = bool(result) + if not succeeded: + ui.clear_property(CONTENT_TYPE) + + if not options or options.get(provider.RESULT_FALLBACK, True): + result, post_run_action = self.uri_action( + context, + context.get_parent_uri(params={ + 'window_fallback': True, + 'window_replace': True, + 'window_return': False, + }), + ) cache_to_disc = False update_listing = True xbmcplugin.endOfDirectory( - self.handle, + handle, succeeded=succeeded, updateListing=update_listing, cacheToDisc=cache_to_disc, ) + container = ui.pop_property(CONTAINER_ID) + position = ui.pop_property(CONTAINER_POSITION) + if container and position: + context.send_notification(CONTAINER_FOCUS, [container, position]) + + if post_run_action: + self.post_run(context, ui, post_run_action) return succeeded + + @staticmethod + def post_run(context, ui, action, timeout=30): + while ui.busy_dialog_active(): + timeout -= 1 + if timeout < 0: + context.log_error('Multiple busy dialogs active' + ' - Post run action unable to execute') + break + context.sleep(1) + else: + context.execute(action) + + @staticmethod + def uri_action(context, uri): + if uri.startswith('script://'): + uri = uri[len('script://'):] + context.log_debug('Running script: |{0}|'.format(uri)) + action = 'RunScript({0})'.format(uri) + result = True + + elif uri.startswith('command://'): + uri = uri[len('command://'):] + context.log_debug('Running command: |{0}|'.format(uri)) + action = uri + result = True + + elif context.is_plugin_path(uri, PATHS.PLAY): + context.log_debug('Redirecting for playback: |{0}|'.format(uri)) + action = 'PlayMedia({0}, playlist_time_hint=1)'.format(uri) + result = False + + elif context.is_plugin_path(uri): + context.log_debug('Redirecting to: |{0}|'.format(uri)) + uri = urlsplit(uri) + action = context.create_uri( + (PATHS.ROUTE, uri.path.rstrip('/') or PATHS.HOME), + uri.query, + run=True, + ) + result = False + + else: + action = None + result = False + + return result, action diff --git a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/plugin_runner.py b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/plugin_runner.py index e5fa69fcfc..7b7ede27f3 100644 --- a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/plugin_runner.py +++ b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/plugin_runner.py @@ -10,9 +10,9 @@ from __future__ import absolute_import, division, unicode_literals -from platform import python_version - +from .constants import CHECK_SETTINGS from .context import XbmcContext +from .debug import Profiler from .plugin import XbmcPlugin from ..youtube import Provider @@ -22,22 +22,26 @@ _context = XbmcContext() _plugin = XbmcPlugin() _provider = Provider() - -_profiler = _context.get_infobool('System.GetBool(debug.showloginfo)') -if _profiler: - from .debug import Profiler - - _profiler = Profiler(enabled=False, print_callees=False, num_lines=20) +_profiler = Profiler(enabled=False, print_callees=False, num_lines=20) def run(context=_context, plugin=_plugin, provider=_provider, profiler=_profiler): - if profiler: - profiler.enable(flush=True) - context.log_debug('Starting Kodion framework by bromix...') + if context.get_ui().pop_property(CHECK_SETTINGS): + provider.reset_client() + settings = context.get_settings(refresh=True) + else: + settings = context.get_settings() + + debug = settings.logging_enabled() + if debug: + context.debug_log(on=True) + profiler.enable(flush=True) + else: + context.debug_log(off=True) current_uri = context.get_uri() context.init() @@ -48,18 +52,19 @@ def run(context=_context, if key in params: params[key] = '' - context.log_notice('Running: {plugin} ({version})' - ' on {kodi} with Python {python}\n' - 'Path: {path}\n' - 'Params: {params}' - .format(plugin=context.get_name(), - version=context.get_version(), - kodi=context.get_system_version(), - python=python_version(), + system_version = context.get_system_version() + context.log_notice('Plugin: Running v{version}' + '\n\tKodi: v{kodi}' + '\n\tPython: v{python}' + '\n\tPath: |{path}|' + '\n\tParams: |{params}|' + .format(version=context.get_version(), + kodi=str(system_version), + python=system_version.get_python_version(), path=context.get_path(), params=params)) plugin.run(provider, context, focused=(current_uri == new_uri)) - if profiler: + if debug: profiler.print_stats() diff --git a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/script_actions.py b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/script_actions.py index 88c85a3f39..93531a968a 100644 --- a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/script_actions.py +++ b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/script_actions.py @@ -15,13 +15,17 @@ from .compatibility import parse_qsl, urlsplit, xbmc, xbmcaddon, xbmcvfs from .constants import ( DATA_PATH, + DEFAULT_LANGUAGES, + DEFAULT_REGIONS, RELOAD_ACCESS_MANAGER, + SERVER_WAKEUP, TEMP_PATH, - WAIT_FLAG, + WAIT_END_FLAG, ) from .context import XbmcContext -from .network import get_client_ip_address, httpd_status -from .utils import current_system_version, rm_dir, validate_ip_address +from .network import Locator, get_client_ip_address, httpd_status +from .utils import rm_dir, validate_ip_address +from ..youtube import Provider def _config_actions(context, action, *_args): @@ -63,7 +67,7 @@ def _config_actions(context, action, *_args): sub_opts = [ localize('none'), - localize('prompt'), + localize('select'), localize('subtitles.with_fallback') % (preferred, fallback), preferred, '%s (%s)' % (preferred, localize('subtitles.no_asr')), @@ -116,6 +120,7 @@ def _config_actions(context, action, *_args): settings.httpd_listen(addresses[selected_address]) elif action == 'show_client_ip': + context.wakeup(SERVER_WAKEUP, timeout=5) if httpd_status(context): client_ip = get_client_ip_address(context) if client_ip: @@ -126,6 +131,98 @@ def _config_actions(context, action, *_args): else: ui.show_notification(context.localize('httpd.not.running')) + elif action == 'geo_location': + locator = Locator(context) + locator.locate_requester() + coords = locator.coordinates() + if coords: + context.get_settings().set_location( + '{0[lat]},{0[lon]}'.format(coords) + ) + + elif action == 'language_region': + client = Provider().get_client(context) + settings = context.get_settings() + + plugin_language = settings.get_language() + plugin_region = settings.get_region() + + kodi_language = context.get_language() + base_kodi_language = kodi_language.partition('-')[0] + + json_data = client.get_supported_languages(kodi_language) + items = json_data.get('items') or DEFAULT_LANGUAGES['items'] + + selected_language = [None] + + def _get_selected_language(item): + item_lang = item[1] + base_item_lang = item_lang.partition('-')[0] + if item_lang == kodi_language or item_lang == plugin_language: + selected_language[0] = item + elif (not selected_language[0] + and base_item_lang == base_kodi_language): + selected_language.append(item) + return item + + # Ignore es-419 as it causes hl not a valid language error + # https://github.com/jdf76/plugin.video.youtube/issues/418 + invalid_ids = ('es-419',) + language_list = sorted([ + (item['snippet']['name'], item['snippet']['hl']) + for item in items + if item['id'] not in invalid_ids + ], key=_get_selected_language) + + if selected_language[0]: + selected_language = language_list.index(selected_language[0]) + elif len(selected_language) > 1: + selected_language = language_list.index(selected_language[1]) + else: + selected_language = None + + language_id = ui.on_select( + localize('setup_wizard.locale.language'), + language_list, + preselect=selected_language + ) + if language_id == -1: + return + + json_data = client.get_supported_regions(language=language_id) + items = json_data.get('items') or DEFAULT_REGIONS['items'] + + selected_region = [None] + + def _get_selected_region(item): + item_region = item[1] + if item_region == plugin_region: + selected_region[0] = item + return item + + region_list = sorted([ + (item['snippet']['name'], item['snippet']['gl']) + for item in items + ], key=_get_selected_region) + + if selected_region[0]: + selected_region = region_list.index(selected_region[0]) + else: + selected_region = None + + region_id = ui.on_select( + localize('setup_wizard.locale.region'), + region_list, + preselect=selected_region + ) + if region_id == -1: + return + + # set new language id and region id + settings = context.get_settings() + settings.set_language(language_id) + settings.set_region(region_id) + def _maintenance_actions(context, action, params): target = params.get('target') @@ -148,7 +245,7 @@ def _maintenance_actions(context, action, params): if ui.on_clear_content(localize('maintenance.{0}'.format(target))): targets[target]().clear() - ui.show_notification(localize('succeeded')) + ui.show_notification(localize('completed')) elif action == 'refresh': targets = { @@ -159,9 +256,9 @@ def _maintenance_actions(context, action, params): return if target == 'settings_xml' and ui.on_yes_no_input( - context.get_name(), localize('refresh.settings.confirm') + context.get_name(), localize('refresh.settings.check') ): - if not current_system_version.compatible(20, 0): + if not context.get_system_version().compatible(20): ui.show_notification(localize('failed')) return @@ -322,7 +419,7 @@ def switch_to_user(user): username = access_manager.get_username(user) if ui.on_remove_content(username): access_manager.remove_user(user) - ui.show_notification(localize('removed') % '"%s"' % username, + ui.show_notification(localize('removed') % username, localize('remove')) if user == 0: access_manager.add_user(username=localize('user.default'), @@ -364,14 +461,13 @@ def switch_to_user(user): def run(argv): context = XbmcContext() ui = context.get_ui() - ui.set_property(WAIT_FLAG) try: category = action = params = None args = argv[1:] if args: args = urlsplit(args[0]) - path = args.path + path = args.path.rstrip('/') if path: path = path.split('/') category = path[0] @@ -382,6 +478,20 @@ def run(argv): if params: params = dict(parse_qsl(args.query)) + system_version = context.get_system_version() + context.log_notice('Script: Running v{version}' + '\n\tKodi: v{kodi}' + '\n\tPython: v{python}' + '\n\tCategory: |{category}|' + '\n\tAction: |{action}|' + '\n\tParams: |{params}|' + .format(version=context.get_version(), + kodi=str(system_version), + python=system_version.get_python_version(), + category=category, + action=action, + params=params)) + if not category: xbmcaddon.Addon().openSettings() return @@ -398,4 +508,4 @@ def run(argv): _user_actions(context, action, params) return finally: - ui.clear_property(WAIT_FLAG) + ui.set_property(WAIT_END_FLAG) diff --git a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/service_runner.py b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/service_runner.py index 89fc41fffa..eede82d36f 100644 --- a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/service_runner.py +++ b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/service_runner.py @@ -13,7 +13,6 @@ from .constants import ( ABORT_FLAG, PLUGIN_SLEEPING, - SERVER_POST_START, TEMP_PATH, VIDEO_ID, ) @@ -28,16 +27,21 @@ def run(): context = XbmcContext() - context.log_debug('YouTube service initialization...') - provider = Provider() + system_version = context.get_system_version() + context.log_notice('Service: Starting v{version}' + '\n\tKodi: v{kodi}' + '\n\tPython: v{python}' + .format(version=context.get_version(), + kodi=str(system_version), + python=system_version.get_python_version())) + get_listitem_info = context.get_listitem_info get_listitem_property = context.get_listitem_property ui = context.get_ui() clear_property = ui.clear_property - pop_property = ui.pop_property set_property = ui.set_property clear_property(ABORT_FLAG) @@ -71,8 +75,13 @@ def run(): while not monitor.abortRequested(): is_idle = monitor.system_idle or monitor.get_idle_time() >= loop_period + is_asleep = monitor.system_sleep - if is_idle: + if is_asleep: + plugin_idle_time_ms = 0 + if not plugin_is_idle: + plugin_is_idle = set_property(PLUGIN_SLEEPING) + elif is_idle: if plugin_idle_time_ms >= plugin_idle_timeout_ms: plugin_idle_time_ms = 0 if not plugin_is_idle: @@ -84,18 +93,17 @@ def run(): if not monitor.httpd: httpd_idle_time_ms = 0 + elif is_asleep: + httpd_idle_time_ms = 0 + monitor.shutdown_httpd() elif is_idle: if monitor.httpd_sleep_allowed: if httpd_idle_time_ms >= httpd_idle_timeout_ms: httpd_idle_time_ms = 0 - monitor.shutdown_httpd(sleep=True) - else: - if monitor.httpd_sleep_allowed is None: - if pop_property(SERVER_POST_START): - monitor.httpd_sleep_allowed = True - httpd_idle_time_ms = 0 - else: - pop_property(SERVER_POST_START) + monitor.shutdown_httpd() + elif monitor.httpd_sleep_allowed is None: + monitor.httpd_sleep_allowed = True + httpd_idle_time_ms = 0 else: if httpd_idle_time_ms >= httpd_ping_period_ms: httpd_idle_time_ms = 0 @@ -116,6 +124,12 @@ def run(): wait_time_ms = 0 while not monitor.abortRequested(): + if (not monitor.httpd + and not monitor.system_sleep + and not (monitor.system_idle + or monitor.get_idle_time() >= loop_period)): + monitor.onWake() + if monitor.refresh and all(container.values()): monitor.refresh_container(force=True) monitor.refresh = False diff --git a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/settings/abstract_settings.py b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/settings/abstract_settings.py index 928f09e0e6..a3c7582a42 100644 --- a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/settings/abstract_settings.py +++ b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/settings/abstract_settings.py @@ -13,7 +13,12 @@ import sys from ..constants import SETTINGS -from ..utils import current_system_version, validate_ip_address +from ..utils import ( + current_system_version, + get_kodi_setting_bool, + get_kodi_setting_value, + validate_ip_address, +) class AbstractSettings(object): @@ -186,26 +191,184 @@ def get_thumbnail_size(self, value=None): return self._THUMB_SIZES[value] return self._THUMB_SIZES[default] + _SAFE_SEARCH_LEVELS = { + 0: 'moderate', + 1: 'none', + 2: 'strict', + } + def safe_search(self): index = self.get_int(SETTINGS.SAFE_SEARCH, 0) - values = {0: 'moderate', 1: 'none', 2: 'strict'} - return values[index] + return self._SAFE_SEARCH_LEVELS[index] def age_gate(self): return self.get_bool(SETTINGS.AGE_GATE, True) - def verify_ssl(self): + def verify_ssl(self, value=None): + if value is not None: + return self.set_bool(SETTINGS.VERIFY_SSL, value) + if sys.version_info <= (2, 7, 9): verify = False else: verify = self.get_bool(SETTINGS.VERIFY_SSL, True) return verify - def get_timeout(self): + def requests_timeout(self, value=None): + if value is not None: + self.set_int(SETTINGS.CONNECT_TIMEOUT, value[0]) + self.set_int(SETTINGS.READ_TIMEOUT, value[1]) + return value + connect_timeout = self.get_int(SETTINGS.CONNECT_TIMEOUT, 9) + 0.5 read_timout = self.get_int(SETTINGS.READ_TIMEOUT, 27) return connect_timeout, read_timout + _PROXY_TYPE_SCHEME = { + 0: 'http', + 1: 'socks4', + 2: 'socks4a', + 3: 'socks5', + 4: 'socks5h', + 5: 'https', + } + + _PROXY_SETTINGS = { + SETTINGS.PROXY_ENABLED: { + 'value': None, + 'type': bool, + 'default': False, + 'kodi_name': 'network.usehttpproxy', + }, + SETTINGS.PROXY_TYPE: { + 'value': None, + 'type': int, + 'default': 0, + 'kodi_name': 'network.httpproxytype', + }, + SETTINGS.PROXY_SERVER: { + 'value': None, + 'type': str, + 'default': '', + 'kodi_name': 'network.httpproxyserver', + }, + SETTINGS.PROXY_PORT: { + 'value': None, + 'type': int, + 'default': 8080, + 'kodi_name': 'network.httpproxyport', + }, + SETTINGS.PROXY_USERNAME: { + 'value': None, + 'type': str, + 'default': '', + 'kodi_name': 'network.httpproxyusername', + }, + SETTINGS.PROXY_PASSWORD: { + 'value': None, + 'type': str, + 'default': '', + 'kodi_name': 'network.httpproxypassword', + }, + } + + def proxy_settings(self, value=None, as_mapping=True): + if value is not None: + for setting_name, setting in value.items(): + setting_value = setting.get('value') + if setting_value is None: + continue + + setting_type = setting.get('type', int) + if setting_type is int: + self.set_int(setting_name, setting_value) + elif setting_type is str: + self.set_string(setting_name, setting_value) + else: + self.set_bool(setting_name, setting_value) + return value + + proxy_source = self.get_int(SETTINGS.PROXY_SOURCE, 1) + if not proxy_source: + return None + + settings = {} + for setting_name, setting in self._PROXY_SETTINGS.items(): + setting_default = setting.get('default') + setting_type = setting.get('type', int) + if proxy_source == 1: + setting_value = get_kodi_setting_value( + setting.get('kodi_name'), + process=setting_type, + ) or setting_default + elif setting_type is int: + setting_value = self.get_int(setting_name, setting_default) + elif setting_type is str: + setting_value = self.get_string(setting_name, setting_default) + else: + setting_value = self.get_bool(setting_name, setting_default) + + settings[setting_name] = { + 'value': setting_value, + 'type': setting_type, + 'default': setting_default, + } + + if not as_mapping: + return settings + + if proxy_source == 1 and not settings[SETTINGS.PROXY_ENABLED]['value']: + return None + + scheme = self._PROXY_TYPE_SCHEME[settings[SETTINGS.PROXY_TYPE]['value']] + if scheme.startswith('socks'): + from ..compatibility import xbmc, xbmcaddon + + pysocks = None + install_attempted = False + while not pysocks: + try: + pysocks = xbmcaddon.Addon('script.module.pysocks') + except RuntimeError: + if install_attempted: + break + xbmc.executebuiltin( + 'InstallAddon(script.module.pysocks)', + wait=True, + ) + install_attempted = True + if pysocks: + del pysocks + else: + return None + + host = settings[SETTINGS.PROXY_SERVER]['value'] + if not host: + return None + + port = settings[SETTINGS.PROXY_PORT]['value'] + if port: + host_port_string = ':'.join((host, str(port))) + else: + host_port_string = host + + username = settings[SETTINGS.PROXY_USERNAME]['value'] + if username: + password = settings[SETTINGS.PROXY_PASSWORD]['value'] + if password: + auth_string = ':'.join((username, password)) + else: + auth_string = username + auth_string += '@' + else: + auth_string = '' + + proxy_string = ''.join((scheme, '://', auth_string, host_port_string)) + return { + 'http': proxy_string, + 'https': proxy_string, + } + def allow_dev_keys(self): return self.get_bool(SETTINGS.ALLOW_DEV_KEYS, False) @@ -412,8 +575,13 @@ def stream_select(self, value=None): 'vod': True, } - def item_filter(self, update=None): - types = dict.fromkeys(self.get_string_list(SETTINGS.HIDE_VIDEOS), False) + def item_filter(self, update=None, override=None): + types = dict.fromkeys( + self.get_string_list(SETTINGS.HIDE_VIDEOS) + if override is None else + override, + False + ) types = dict(self._DEFAULT_FILTER, **types) if update: if 'live_folder' in update: @@ -466,14 +634,22 @@ def get_history_playlist(self): def set_history_playlist(self, value): return self.set_string(SETTINGS.HISTORY_PLAYLIST, value) - if current_system_version.compatible(20, 0): + if current_system_version.compatible(20): + _COLOR_SETTING_MAP = { + 'itemCount': 'commentCount', + 'subscriberCount': 'likeCount', + 'videoCount': 'commentCount', + } + def get_label_color(self, label_part): + label_part = self._COLOR_SETTING_MAP.get(label_part) or label_part setting_name = '.'.join((SETTINGS.LABEL_COLOR, label_part)) return self.get_string(setting_name, 'white') else: _COLOR_MAP = { 'commentCount': 'cyan', 'favoriteCount': 'gold', + 'itemCount': 'cyan', 'likeCount': 'lime', 'viewCount': 'lightblue', } @@ -483,3 +659,7 @@ def get_label_color(self, label_part): def get_channel_name_aliases(self): return frozenset(self.get_string_list(SETTINGS.CHANNEL_NAME_ALIASES)) + + def logging_enabled(self): + return (self.get_bool(SETTINGS.LOGGING_ENABLED, False) + or get_kodi_setting_bool('debug.showloginfo')) diff --git a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/settings/xbmc/xbmc_plugin_settings.py b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/settings/xbmc/xbmc_plugin_settings.py index ba22a9731f..1e8051cb85 100644 --- a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/settings/xbmc/xbmc_plugin_settings.py +++ b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/settings/xbmc/xbmc_plugin_settings.py @@ -15,8 +15,7 @@ from ..abstract_settings import AbstractSettings from ...compatibility import xbmcaddon from ...constants import ADDON_ID, VALUE_FROM_STR -from ...logger import log_debug -from ...utils.methods import get_kodi_setting_bool +from ...logger import Logger from ...utils.system_version import current_system_version @@ -24,7 +23,7 @@ class SettingsProxy(object): def __init__(self, instance): self.ref = instance - if current_system_version.compatible(21, 0): + if current_system_version.compatible(21): def get_bool(self, *args, **kwargs): return self.ref.getBool(*args, **kwargs) @@ -75,7 +74,7 @@ def set_str_list(self, setting, value): value = ','.join(value) return self.ref.setSetting(setting, value) - if not current_system_version.compatible(19, 0): + if not current_system_version.compatible(19): @property def ref(self): if self._ref: @@ -94,7 +93,7 @@ def ref(self): del self._ref -class XbmcPluginSettings(AbstractSettings): +class XbmcPluginSettings(AbstractSettings, Logger): _instances = set() _proxy = None @@ -119,9 +118,8 @@ def flush(self, xbmc_addon=None, fill=False, flush_all=True): else: fill = False - self._echo = get_kodi_setting_bool('debug.showloginfo') self._cache = {} - if current_system_version.compatible(21, 0): + if current_system_version.compatible(21): self._proxy = SettingsProxy(xbmc_addon.getSettings()) # set methods in new Settings class are documented as returning a # bool, True if value was set, False otherwise, similar to how the @@ -130,10 +128,12 @@ def flush(self, xbmc_addon=None, fill=False, flush_all=True): # Ignore return value until bug is fixed in Kodi self._check_set = False else: - if fill and not current_system_version.compatible(19, 0): + if fill and not current_system_version.compatible(19): self.__class__._instances.add(xbmc_addon) self._proxy = SettingsProxy(xbmc_addon) + self._echo = self.logging_enabled() + def get_bool(self, setting, default=None, echo=None): if setting in self._cache: return self._cache[setting] @@ -144,7 +144,7 @@ def get_bool(self, setting, default=None, echo=None): except (TypeError, ValueError) as exc: error = exc try: - value = self.get_string(setting, echo=False).lower() + value = self.get_string(setting, echo=False) value = VALUE_FROM_STR.get(value, default) except TypeError as exc: error = exc @@ -154,11 +154,10 @@ def get_bool(self, setting, default=None, echo=None): value = default if self._echo and echo is not False: - log_debug('Get |{setting}|: {value} (bool, {status})'.format( - setting=setting, - value=value, - status=error if error else 'success' - )) + self.log_debug('Get |{setting}|: {value} (bool, {status})' + .format(setting=setting, + value=value, + status=error if error else 'success')) self._cache[setting] = value return value @@ -174,11 +173,10 @@ def set_bool(self, setting, value, echo=None): error = exc if self._echo and echo is not False: - log_debug('Set |{setting}|: {value} (bool, {status})'.format( - setting=setting, - value=value, - status=error if error else 'success' - )) + self.log_debug('Set |{setting}|: {value} (bool, {status})' + .format(setting=setting, + value=value, + status=error if error else 'success')) return not error def get_int(self, setting, default=-1, process=None, echo=None): @@ -203,11 +201,10 @@ def get_int(self, setting, default=-1, process=None, echo=None): value = default if self._echo and echo is not False: - log_debug('Get |{setting}|: {value} (int, {status})'.format( - setting=setting, - value=value, - status=error if error else 'success' - )) + self.log_debug('Get |{setting}|: {value} (int, {status})' + .format(setting=setting, + value=value, + status=error if error else 'success')) self._cache[setting] = value return value @@ -223,11 +220,10 @@ def set_int(self, setting, value, echo=None): error = exc if self._echo and echo is not False: - log_debug('Set |{setting}|: {value} (int, {status})'.format( - setting=setting, - value=value, - status=error if error else 'success' - )) + self.log_debug('Set |{setting}|: {value} (int, {status})' + .format(setting=setting, + value=value, + status=error if error else 'success')) return not error def get_string(self, setting, default='', echo=None): @@ -250,11 +246,10 @@ def get_string(self, setting, default='', echo=None): echo = '...'.join((value[:3], value[-3:])) else: echo = value - log_debug('Get |{setting}|: "{echo}" (str, {status})'.format( - setting=setting, - echo=echo, - status=error if error else 'success' - )) + self.log_debug('Get |{setting}|: "{echo}" (str, {status})' + .format(setting=setting, + echo=echo, + status=error if error else 'success')) self._cache[setting] = value return value @@ -278,11 +273,10 @@ def set_string(self, setting, value, echo=None): echo = '...'.join((value[:3], value[-3:])) else: echo = value - log_debug('Set |{setting}|: "{echo}" (str, {status})'.format( - setting=setting, - echo=echo, - status=error if error else 'success' - )) + self.log_debug('Set |{setting}|: "{echo}" (str, {status})' + .format(setting=setting, + echo=echo, + status=error if error else 'success')) return not error def get_string_list(self, setting, default=None, echo=None): @@ -299,11 +293,10 @@ def get_string_list(self, setting, default=None, echo=None): value = default if self._echo and echo is not False: - log_debug('Get |{setting}|: "{value}" (str list, {status})'.format( - setting=setting, - value=value, - status=error if error else 'success' - )) + self.log_debug('Get |{setting}|: "{value}" (str list, {status})' + .format(setting=setting, + value=value, + status=error if error else 'success')) self._cache[setting] = value return value @@ -319,9 +312,8 @@ def set_string_list(self, setting, value, echo=None): error = exc if self._echo and echo is not False: - log_debug('Set |{setting}|: "{value}" (str list, {status})'.format( - setting=setting, - value=value, - status=error if error else 'success' - )) + self.log_debug('Set |{setting}|: "{value}" (str list, {status})' + .format(setting=setting, + value=value, + status=error if error else 'success')) return not error diff --git a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/sql_store/search_history.py b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/sql_store/search_history.py index 3ebe581218..46c0587433 100644 --- a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/sql_store/search_history.py +++ b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/sql_store/search_history.py @@ -32,14 +32,26 @@ def get_items(self, process=None): return result @staticmethod - def _make_id(search_text): - return md5(search_text.encode('utf-8')).hexdigest() - - def add_item(self, search_text): - self._set(self._make_id(search_text), search_text) - - def del_item(self, search_text): - self._remove(self._make_id(search_text)) - - def update_item(self, search_text, timestamp=None): - self._update(self._make_id(search_text), search_text, timestamp) + def _make_id(query): + return md5(query.encode('utf-8')).hexdigest() + + def add_item(self, query): + if isinstance(query, dict): + params = query + query = params['q'] + else: + params = {'q': query} + self._set(self._make_id(query), params) + + def del_item(self, query): + if isinstance(query, dict): + query = query['q'] + self._remove(self._make_id(query)) + + def update_item(self, query, timestamp=None): + if isinstance(query, dict): + params = query + query = params['q'] + else: + params = {'q': query} + self._update(self._make_id(query), params, timestamp) diff --git a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/sql_store/storage.py b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/sql_store/storage.py index 0425dbc56b..d35945a1e7 100644 --- a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/sql_store/storage.py +++ b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/sql_store/storage.py @@ -17,7 +17,7 @@ from threading import Lock from traceback import format_stack -from ..logger import log_error +from ..logger import Logger from ..utils.datetime_parser import fromtimestamp, since_epoch from ..utils.methods import make_dirs @@ -232,12 +232,18 @@ def _open(self): isolation_level=None) break except (sqlite3.Error, sqlite3.OperationalError) as exc: - log_error('SQLStorage._open - {exc}:\n{details}'.format( - exc=exc, details=''.join(format_stack()) - )) - if isinstance(exc, sqlite3.Error): + msg = ('SQLStorage._open - Error' + '\n\tException: {exc!r}' + '\n\tStack trace (most recent call last):\n{stack}' + .format(exc=exc, + stack=''.join(format_stack()))) + if isinstance(exc, sqlite3.OperationalError): + Logger.log_warning(msg) + time.sleep(0.1) + else: + Logger.log_error(msg) return False - time.sleep(0.1) + else: return False @@ -305,12 +311,17 @@ def _execute(cursor, query, values=None, many=False, script=False): return cursor.executescript(query) return cursor.execute(query, values) except (sqlite3.Error, sqlite3.OperationalError) as exc: - log_error('SQLStorage._execute - {exc}:\n{details}'.format( - exc=exc, details=''.join(format_stack()) - )) - if isinstance(exc, sqlite3.Error): + msg = ('SQLStorage._execute - Error' + '\n\tException: {exc!r}' + '\n\tStack trace (most recent call last):\n{stack}' + .format(exc=exc, + stack=''.join(format_stack()))) + if isinstance(exc, sqlite3.OperationalError): + Logger.log_warning(msg) + time.sleep(0.1) + else: + Logger.log_error(msg) return [] - time.sleep(0.1) return [] def _optimize_file_size(self, defer=False): diff --git a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/ui/abstract_context_ui.py b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/ui/abstract_context_ui.py index 2597d53772..71f68dca02 100644 --- a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/ui/abstract_context_ui.py +++ b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/ui/abstract_context_ui.py @@ -15,7 +15,11 @@ class AbstractContextUI(object): def __init__(self): pass - def create_progress_dialog(self, heading, text=None, background=False): + def create_progress_dialog(self, + heading, + message='', + background=False, + message_template=None): raise NotImplementedError() def on_keyboard_input(self, title, default='', hidden=False): diff --git a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/ui/abstract_progress_dialog.py b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/ui/abstract_progress_dialog.py index 83ab3ac576..c1fb80d3a3 100644 --- a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/ui/abstract_progress_dialog.py +++ b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/ui/abstract_progress_dialog.py @@ -14,14 +14,24 @@ class AbstractProgressDialog(object): - def __init__(self, dialog, heading, text, total=100): + def __init__(self, + dialog, + heading, + message='', + total=None, + message_template=None): self._dialog = dialog() - self._dialog.create(heading, text) + self._dialog.create(heading, message) + + self._position = None + self._total = int(total) if total else 100 + + self._message = message + self._message_template = message_template + self._template_params = {} # simple reset because KODI won't do it :( - self._total = int(total) - self._position = 1 - self.update(steps=-1) + self.update(position=0) def __enter__(self): return self @@ -43,20 +53,43 @@ def close(self): def set_total(self, total): self._total = int(total) - def update(self, steps=1, text=None): - self._position += steps + def reset_total(self, new_total, **kwargs): + self._total = int(new_total) + self.update(position=0, **kwargs) - if not self._total: - position = 0 - elif self._position >= self._total: - position = 100 - else: - position = int(100 * self._position / self._total) + def update_total(self, new_total, **kwargs): + self._total = int(new_total) + self.update(steps=0, **kwargs) + + def grow_total(self, new_total): + total = int(new_total) + if total > self._total: + self._total = total + return self._total + + def update(self, steps=1, position=None, message=None, **template_params): + if position is None: + self._position += steps - if isinstance(text, string_type): - self._dialog.update(percent=position, message=text) + if not self._total: + position = 0 + elif self._position >= self._total: + position = 100 + else: + position = int(100 * self._position / self._total) else: - self._dialog.update(percent=position) + self._position = position + + if isinstance(message, string_type): + self._message = message + elif template_params and self._message_template: + self._template_params.update(template_params) + message = self._message_template.format(**self._template_params) + self._message = message + + # Kodi 18 renamed XbmcProgressDialog.update argument line1 to message. + # Only use positional arguments to maintain compatibility + self._dialog.update(position, self._message) def is_aborted(self): raise NotImplementedError() diff --git a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/ui/xbmc/xbmc_context_ui.py b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/ui/xbmc/xbmc_context_ui.py index 3145cf0441..381b4333cf 100644 --- a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/ui/xbmc/xbmc_context_ui.py +++ b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/ui/xbmc/xbmc_context_ui.py @@ -22,11 +22,15 @@ def __init__(self, context): super(XbmcContextUI, self).__init__() self._context = context - def create_progress_dialog(self, heading, text=None, background=False): + def create_progress_dialog(self, + heading, + message='', + background=False, + message_template=None): if background: - return XbmcProgressDialogBG(heading, text) + return XbmcProgressDialogBG(heading, message, message_template) - return XbmcProgressDialog(heading, text) + return XbmcProgressDialog(heading, message, message_template) def on_keyboard_input(self, title, default='', hidden=False): # Starting with Gotham (13.X > ...) @@ -58,20 +62,20 @@ def on_ok(self, title, text): def on_remove_content(self, name): return self.on_yes_no_input( - self._context.localize('content.remove.confirm'), - self._context.localize('content.remove') % to_unicode(name), + self._context.localize('content.remove'), + self._context.localize('content.remove.check') % to_unicode(name), ) def on_delete_content(self, name): return self.on_yes_no_input( - self._context.localize('content.delete.confirm'), - self._context.localize('content.delete') % to_unicode(name), + self._context.localize('content.delete'), + self._context.localize('content.delete.check') % to_unicode(name), ) def on_clear_content(self, name): return self.on_yes_no_input( - self._context.localize('content.clear.confirm'), - self._context.localize('content.clear') % to_unicode(name), + self._context.localize('content.clear'), + self._context.localize('content.clear.check') % to_unicode(name), ) def on_select(self, title, items=None, preselect=-1, use_details=False): @@ -218,16 +222,20 @@ def new_line(value=1, cr_before=0, cr_after=0): '[CR]' * cr_after, )) - def set_focus_next_item(self): - list_id = xbmcgui.Window(xbmcgui.getCurrentWindowId()).getFocusId() + @staticmethod + def set_focus_next_item(): + container = xbmc.getInfoLabel('System.CurrentControlId') + position = xbmc.getInfoLabel('Container.CurrentItem') try: - position = xbmc.getInfoLabel('Container.Position') - next_position = int(position) + 1 - self._context.execute('SetFocus({list_id},{position})'.format( - list_id=list_id, position=next_position - )) + position = int(position) + 1 except ValueError: - pass + return + xbmc.executebuiltin( + 'SetFocus({container},{position},absolute)'.format( + container=container, + position=position + ) + ) @staticmethod def busy_dialog_active(): diff --git a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/ui/xbmc/xbmc_progress_dialog.py b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/ui/xbmc/xbmc_progress_dialog.py index 596ada365d..e9e793e672 100644 --- a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/ui/xbmc/xbmc_progress_dialog.py +++ b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/ui/xbmc/xbmc_progress_dialog.py @@ -15,22 +15,28 @@ class XbmcProgressDialog(AbstractProgressDialog): - def __init__(self, heading, text): - super(XbmcProgressDialog, self).__init__(xbmcgui.DialogProgress, - heading, - text, - 100) + def __init__(self, heading, message='', message_template=None): + super(XbmcProgressDialog, self).__init__( + dialog=xbmcgui.DialogProgress, + heading=heading, + message=message, + total=100, + message_template=message_template, + ) def is_aborted(self): return self._dialog.iscanceled() class XbmcProgressDialogBG(AbstractProgressDialog): - def __init__(self, heading, text): - super(XbmcProgressDialogBG, self).__init__(xbmcgui.DialogProgressBG, - heading, - text, - 100) + def __init__(self, heading, message='', message_template=None): + super(XbmcProgressDialogBG, self).__init__( + dialog=xbmcgui.DialogProgressBG, + heading=heading, + message=message, + total=100, + message_template=message_template, + ) def is_aborted(self): return False diff --git a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/utils/datetime_parser.py b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/utils/datetime_parser.py index b09097f738..1ea2f7c8a6 100644 --- a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/utils/datetime_parser.py +++ b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/utils/datetime_parser.py @@ -17,7 +17,7 @@ from threading import Condition, Lock from ..exceptions import KodionException -from ..logger import log_error +from ..logger import Logger try: from datetime import timezone @@ -283,8 +283,8 @@ def strptime(datetime_str, fmt=None): if strptime.reloaded.acquire(False): _strptime = import_module('_strptime') modules['_strptime'] = _strptime - log_error('Python strptime bug workaround - ' - 'https://github.com/python/cpython/issues/71587') + Logger.log_error('Python strptime bug workaround' + ' - https://github.com/python/cpython/issues/71587') strptime.reloaded.notify_all() strptime.reloaded.release() else: diff --git a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/utils/methods.py b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/utils/methods.py index bdb55f6fa6..30e88b5b13 100644 --- a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/utils/methods.py +++ b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/utils/methods.py @@ -18,7 +18,7 @@ from math import floor, log from ..compatibility import byte_string_type, string_type, xbmc, xbmcvfs -from ..logger import log_error +from ..logger import Logger __all__ = ( @@ -32,6 +32,7 @@ 'make_dirs', 'merge_dicts', 'print_items', + 'redact_ip', 'rm_dir', 'seconds_to_duration', 'select_stream', @@ -69,7 +70,7 @@ def select_stream(context, and settings.live_stream_type()) or 'hls' if audio_only: - context.log_debug('Select stream: Audio only') + context.log_debug('Select stream - Audio only') stream_list = [item for item in stream_data_list if 'video' not in item] else: @@ -84,7 +85,7 @@ def select_stream(context, ] if not stream_list: - context.log_debug('Select stream: no streams found') + context.log_debug('Select stream - No streams found') return None def _stream_sort(_stream): @@ -110,7 +111,9 @@ def _stream_sort(_stream): if original_value: log_data['url'] = redact_ip(original_value) - context.log_debug('Stream {0}:\n{1}'.format(idx, log_data)) + context.log_debug('Stream {idx}:' + '\n\t{stream_details}' + .format(idx=idx, stream_details=log_data)) if ask_for_quality: selected_stream = context.get_ui().on_select( @@ -118,7 +121,7 @@ def _stream_sort(_stream): [stream['title'] for stream in stream_list], ) if selected_stream == -1: - context.log_debug('Select stream: no stream selected') + context.log_debug('Select stream - No stream selected') return None else: selected_stream = 0 @@ -166,7 +169,8 @@ def make_dirs(path): if succeeded: return path - log_error('Failed to create directory: |{0}|'.format(path)) + Logger.log_error('utils.make_dirs - Failed to create directory' + '\n\tPath: {path}'.format(path=path)) return False @@ -186,7 +190,8 @@ def rm_dir(path): if succeeded: return True - log_error('Failed to remove directory: {0}'.format(path)) + Logger.log_error('utils.rm_dir - Failed to remove directory' + '\n\tPath: {path}'.format(path=path)) return False @@ -198,16 +203,17 @@ def find_video_id(plugin_path): return '' -def friendly_number(input, precision=3, scale=('', 'K', 'M', 'B'), as_str=True): - _input = float('{input:.{precision}g}'.format( - input=float(input), precision=precision +def friendly_number(value, precision=3, scale=('', 'K', 'M', 'B'), as_str=True): + value = float('{value:.{precision}g}'.format( + value=float(value), + precision=precision, )) - _abs_input = abs(_input) - magnitude = 0 if _abs_input < 1000 else int(log(floor(_abs_input), 1000)) + abs_value = abs(value) + magnitude = 0 if abs_value < 1000 else int(log(floor(abs_value), 1000)) output = '{output:f}'.format( - output=_input / 1000 ** magnitude + output=value / 1000 ** magnitude ).rstrip('0').rstrip('.') + scale[magnitude] - return output if as_str else (output, _input) + return output if as_str else (output, value) _RE_PERIODS = re.compile(r'([\d.]+)(d|h|m|s|$)') diff --git a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/utils/system_version.py b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/utils/system_version.py index b306abac1c..a6e8b15b74 100644 --- a/plugin.video.youtube/resources/lib/youtube_plugin/kodion/utils/system_version.py +++ b/plugin.video.youtube/resources/lib/youtube_plugin/kodion/utils/system_version.py @@ -10,79 +10,81 @@ from __future__ import absolute_import, division, unicode_literals +from platform import python_version + from .methods import jsonrpc from ..compatibility import string_type class SystemVersion(object): - def __init__(self, version=None, releasename=None, appname=None): - self._version = ( - version if version and isinstance(version, tuple) - else (0, 0, 0, 0) - ) - - self._releasename = ( - releasename if releasename and isinstance(releasename, string_type) - else 'UNKNOWN' - ) - - self._appname = ( - appname if appname and isinstance(appname, string_type) - else 'UNKNOWN' - ) + RELEASE_NAME_MAP = { + 22: 'Piers', + 21: 'Omega', + 20: 'Nexus', + 19: 'Matrix', + 18: 'Leia', + 17: 'Krypton', + 16: 'Jarvis', + 15: 'Isengard', + 14: 'Helix', + 13: 'Gotham', + 12: 'Frodo', + } + + def __init__(self, version=None, release_name=None, app_name=None): + if isinstance(version, tuple): + self._version = version + else: + version = None - try: - response = jsonrpc(method='Application.GetProperties', - params={'properties': ['version', 'name']}) - version_installed = response['result']['version'] - self._version = (version_installed.get('major', 1), - version_installed.get('minor', 0)) - self._appname = response['result']['name'] - except (KeyError, TypeError): - self._version = (1, 0) # Frodo - self._appname = 'Unknown Application' - - if self._version >= (22, 0): - self._releasename = 'Piers' - elif self._version >= (21, 0): - self._releasename = 'Omega' - elif self._version >= (20, 0): - self._releasename = 'Nexus' - elif self._version >= (19, 0): - self._releasename = 'Matrix' - elif self._version >= (18, 0): - self._releasename = 'Leia' - elif self._version >= (17, 0): - self._releasename = 'Krypton' - elif self._version >= (16, 0): - self._releasename = 'Jarvis' - elif self._version >= (15, 0): - self._releasename = 'Isengard' - elif self._version >= (14, 0): - self._releasename = 'Helix' - elif self._version >= (13, 0): - self._releasename = 'Gotham' - elif self._version >= (12, 0): - self._releasename = 'Frodo' + if app_name and isinstance(app_name, string_type): + self._app_name = app_name + else: + app_name = None + + if version is None or app_name is None: + try: + result = jsonrpc( + method='Application.GetProperties', + params={'properties': ['version', 'name']}, + )['result'] or {} + except (KeyError, TypeError): + result = {} + + if version is None: + version = result.get('version') or {} + self._version = (version.get('major', 1), + version.get('minor', 0)) + + if app_name is None: + self._app_name = result.get('name', 'Unknown application') + + if release_name and isinstance(release_name, string_type): + self._release_name = release_name else: - self._releasename = 'Unknown Release' + self._release_name = self.RELEASE_NAME_MAP.get(self._version[0], + 'Unknown release') + + self._python_version = python_version() def __str__(self): - obj_str = '{releasename} ({appname}-{version[0]}.{version[1]})'.format( - releasename=self._releasename, - appname=self._appname, + return '{version[0]}.{version[1]} ({app_name} {release_name})'.format( + release_name=self._release_name, + app_name=self._app_name, version=self._version ) - return obj_str def get_release_name(self): - return self._releasename + return self._release_name def get_version(self): return self._version def get_app_name(self): - return self._appname + return self._app_name + + def get_python_version(self): + return self._python_version def compatible(self, *version): return self._version >= version diff --git a/plugin.video.youtube/resources/lib/youtube_plugin/youtube/client/__config__.py b/plugin.video.youtube/resources/lib/youtube_plugin/youtube/client/__config__.py index c7b5f87b49..65488ce3b3 100644 --- a/plugin.video.youtube/resources/lib/youtube_plugin/youtube/client/__config__.py +++ b/plugin.video.youtube/resources/lib/youtube_plugin/youtube/client/__config__.py @@ -82,6 +82,7 @@ def __init__(self, context): switch=switch)) if changed: self._context.log_debug('API key set changed: Signing out') + self._access_manager.set_last_key_hash(current_hash) self._context.execute(self._context.create_uri( ('sign', 'out'), { @@ -89,7 +90,6 @@ def __init__(self, context): }, run=True, )) - self._access_manager.set_last_key_hash(current_hash) @staticmethod def get_current_switch(): @@ -140,7 +140,8 @@ def get_api_keys(self, switch): key = key.partition('_')[-1] if key and key in key_set: key_set[key] = value - if not key_set['id'].endswith('.apps.googleusercontent.com'): + if (key_set['id'] + and not key_set['id'].endswith('.apps.googleusercontent.com')): key_set['id'] += '.apps.googleusercontent.com' return key_set diff --git a/plugin.video.youtube/resources/lib/youtube_plugin/youtube/client/login_client.py b/plugin.video.youtube/resources/lib/youtube_plugin/youtube/client/login_client.py index 0293c65b45..5aa383a204 100644 --- a/plugin.video.youtube/resources/lib/youtube_plugin/youtube/client/login_client.py +++ b/plugin.video.youtube/resources/lib/youtube_plugin/youtube/client/login_client.py @@ -10,16 +10,12 @@ from __future__ import absolute_import, division, unicode_literals -import time - from .request_client import YouTubeRequestClient from ..youtube_exceptions import ( InvalidGrant, InvalidJSON, LoginException, ) -from ...kodion.compatibility import parse_qsl -from ...kodion.logger import log_debug class LoginClient(YouTubeRequestClient): @@ -37,6 +33,12 @@ class LoginClient(YouTubeRequestClient): 'identity.plus.page.impersonation', )) TOKEN_URL = 'https://www.googleapis.com/oauth2/v4/token' + TOKEN_TYPES = { + 0: 'tv', + 'tv': 'tv', + 1: 'personal', + 'personal': 'personal', + } def __init__(self, configs=None, @@ -80,11 +82,11 @@ def _error_hook(**kwargs): return None, None, None, json_data, False, InvalidGrant(json_data) return None, None, None, json_data, False, LoginException(json_data) - def set_access_token(self, access_token=''): - self._access_token = access_token - - def set_access_token_tv(self, access_token_tv=''): - self._access_token_tv = access_token_tv + def set_access_token(self, personal=None, tv=None): + if personal is not None: + self._access_token = personal + if tv is not None: + self._access_token_tv = tv def revoke(self, refresh_token): # https://developers.google.com/youtube/v3/guides/auth/devices @@ -103,17 +105,23 @@ def revoke(self, refresh_token): response_hook=LoginClient._response_hook, error_hook=LoginClient._error_hook, error_title='Logout Failed', - error_info='Revoke failed: {exc}', + error_info=('Revoke - Failed' + '\n\tException: {exc!r}'), raise_exc=True) - def refresh_token_tv(self, refresh_token): - client_id = self._config_tv.get('id', '') - client_secret = self._config_tv.get('secret', '') - return self.refresh_token(refresh_token, - client_id=client_id, - client_secret=client_secret) + def refresh_token(self, token_type, refresh_token=None): + login_type = self.TOKEN_TYPES.get(token_type) + if login_type == 'tv': + client_id = self._config_tv.get('id') + client_secret = self._config_tv.get('secret') + elif login_type == 'personal': + client_id = self._config.get('id') + client_secret = self._config.get('secret') + else: + return None + if not client_id or not client_secret or not refresh_token: + return None - def refresh_token(self, refresh_token, client_id='', client_secret=''): # https://developers.google.com/youtube/v3/guides/auth/devices headers = {'Host': 'www.googleapis.com', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)' @@ -121,21 +129,21 @@ def refresh_token(self, refresh_token, client_id='', client_secret=''): ' Chrome/61.0.3163.100 Safari/537.36', 'Content-Type': 'application/x-www-form-urlencoded'} - client_id = client_id or self._config.get('id', '') - client_secret = client_secret or self._config.get('secret', '') post_data = {'client_id': client_id, 'client_secret': client_secret, 'refresh_token': refresh_token, 'grant_type': 'refresh_token'} config_type = self._get_config_type(client_id, client_secret) - client = ''.join(( - '(config_type: |', config_type, - '| client_id: |', client_id[:3], '...', client_id[-5:], - '| client_secret: |', client_secret[:3], '...', client_secret[-3:], - '|)' - )) - log_debug('Refresh token for {0}'.format(client)) + client = (('\n\tconfig_type: |{config_type}|' + '\n\tclient_id: |{id_start}...{id_end}|' + '\n\tclient_secret: |{secret_start}...{secret_end}|') + .format(config_type=config_type, + id_start=client_id[:3], + id_end=client_id[-5:], + secret_start=client_secret[:3], + secret_end=client_secret[-3:])) + self.log_debug('Refresh token:{0}'.format(client)) json_data = self.request(self.TOKEN_URL, method='POST', @@ -144,25 +152,26 @@ def refresh_token(self, refresh_token, client_id='', client_secret=''): response_hook=LoginClient._response_hook, error_hook=LoginClient._error_hook, error_title='Login Failed', - error_info=('Refresh token failed' - ' {client}:\n{{exc}}' + error_info=('Refresh token - Failed' + '\n\tException: {{exc!r}}' + '{client}' .format(client=client)), raise_exc=True) + return json_data - if json_data: - access_token = json_data['access_token'] - expires_in = time.time() + int(json_data.get('expires_in', 3600)) - return access_token, expires_in - return '', '' - - def request_access_token_tv(self, code, client_id='', client_secret=''): - client_id = client_id or self._config_tv.get('id', '') - client_secret = client_secret or self._config_tv.get('secret', '') - return self.request_access_token(code, - client_id=client_id, - client_secret=client_secret) + def request_access_token(self, token_type, code=None): + login_type = self.TOKEN_TYPES.get(token_type) + if login_type == 'tv': + client_id = self._config_tv.get('id') + client_secret = self._config_tv.get('secret') + elif login_type == 'personal': + client_id = self._config.get('id') + client_secret = self._config.get('secret') + else: + return None + if not client_id or not client_secret or not code: + return None - def request_access_token(self, code, client_id='', client_secret=''): # https://developers.google.com/youtube/v3/guides/auth/devices headers = {'Host': 'www.googleapis.com', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)' @@ -170,21 +179,21 @@ def request_access_token(self, code, client_id='', client_secret=''): ' Chrome/61.0.3163.100 Safari/537.36', 'Content-Type': 'application/x-www-form-urlencoded'} - client_id = client_id or self._config.get('id', '') - client_secret = client_secret or self._config.get('secret', '') post_data = {'client_id': client_id, 'client_secret': client_secret, 'code': code, 'grant_type': 'http://oauth.net/grant_type/device/1.0'} config_type = self._get_config_type(client_id, client_secret) - client = ''.join(( - '(config_type: |', config_type, - '| client_id: |', client_id[:3], '...', client_id[-5:], - '| client_secret: |', client_secret[:3], '...', client_secret[-3:], - '|)' - )) - log_debug('Requesting access token for {0}'.format(client)) + client = (('\n\tconfig_type: |{config_type}|' + '\n\tclient_id: |{id_start}...{id_end}|' + '\n\tclient_secret: |{secret_start}...{secret_end}|') + .format(config_type=config_type, + id_start=client_id[:3], + id_end=client_id[-5:], + secret_start=client_secret[:3], + secret_end=client_secret[-3:])) + self.log_debug('Requesting access token:{0}'.format(client)) json_data = self.request(self.TOKEN_URL, method='POST', @@ -193,17 +202,24 @@ def request_access_token(self, code, client_id='', client_secret=''): response_hook=LoginClient._response_hook, error_hook=LoginClient._error_hook, error_title='Login Failed: Unknown response', - error_info=('Access token request failed' - ' {client}:\n{{exc}}' + error_info=('Access token request - Failed' + '\n\tException: {{exc!r}}' + '{client}' .format(client=client)), raise_exc=True) return json_data - def request_device_and_user_code_tv(self): - client_id = self._config_tv.get('id', '') - return self.request_device_and_user_code(client_id=client_id) + def request_device_and_user_code(self, token_type): + login_type = self.TOKEN_TYPES.get(token_type) + if login_type == 'tv': + client_id = self._config_tv.get('id') + elif login_type == 'personal': + client_id = self._config.get('id') + else: + return None + if not client_id: + return None - def request_device_and_user_code(self, client_id=''): # https://developers.google.com/youtube/v3/guides/auth/devices headers = {'Host': 'accounts.google.com', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)' @@ -211,17 +227,16 @@ def request_device_and_user_code(self, client_id=''): ' Chrome/61.0.3163.100 Safari/537.36', 'Content-Type': 'application/x-www-form-urlencoded'} - client_id = client_id or self._config.get('id', '') post_data = {'client_id': client_id, 'scope': 'https://www.googleapis.com/auth/youtube'} config_type = self._get_config_type(client_id) - client = ''.join(( - '(config_type: |', config_type, - '| client_id: |', client_id[:3], '...', client_id[-5:], - '|)' - )) - log_debug('Requesting device and user code for {0}'.format(client)) + client = (('\n\tconfig_type: |{config_type}|' + '\n\tclient_id: |{id_start}...{id_end}|') + .format(config_type=config_type, + id_start=client_id[:3], + id_end=client_id[-5:])) + self.log_debug('Requesting device and user code:{0}'.format(client)) json_data = self.request(self.DEVICE_CODE_URL, method='POST', @@ -230,69 +245,34 @@ def request_device_and_user_code(self, client_id=''): response_hook=LoginClient._response_hook, error_hook=LoginClient._error_hook, error_title='Login Failed: Unknown response', - error_info=('Device/user code request failed' - ' {client}:\n{{exc}}' + error_info=('Device/user code request - Failed' + '\n\tException: {{exc!r}}' + '{client}' .format(client=client)), raise_exc=True) return json_data - def authenticate(self, username, password): - headers = {'device': '38c6ee9a82b8b10a', - 'app': 'com.google.android.youtube', - 'User-Agent': 'GoogleAuth/1.4 (GT-I9100 KTU84Q)', - 'content-type': 'application/x-www-form-urlencoded', - 'Host': 'android.clients.google.com', - 'Connection': 'Keep-Alive', - 'Accept-Encoding': 'gzip'} - - post_data = { - 'device_country': self._region.lower(), - 'operatorCountry': self._region.lower(), - 'lang': self._language, - 'sdk_version': '19', - # 'google_play_services_version': '6188034', - 'accountType': 'HOSTED_OR_GOOGLE', - 'Email': username.encode('utf-8'), - 'service': self.SERVICE_URLS, - 'source': 'android', - 'androidId': '38c6ee9a82b8b10a', - 'app': 'com.google.android.youtube', - # 'client_sig': '24bb24c05e47e0aefa68a58a766179d9b613a600', - 'callerPkg': 'com.google.android.youtube', - # 'callerSig': '24bb24c05e47e0aefa68a58a766179d9b613a600', - 'Passwd': password.encode('utf-8') - } - - result = self.request(self.ANDROID_CLIENT_AUTH_URL, - method='POST', - data=post_data, - headers=headers, - error_title='Login Failed', - raise_exc=True) - - lines = result.text.replace('\n', '&') - params = dict(parse_qsl(lines)) - token = params.get('Auth', '') - expires = int(params.get('Expiry', -1)) - if not token or expires == -1: - raise LoginException('Failed to get token') - - return token, expires - def _get_config_type(self, client_id, client_secret=None): """used for logging""" if client_secret is None: - using_conf_tv = client_id == self._config_tv.get('id', '') - using_conf_main = client_id == self._config.get('id', '') + config_id = self._config_tv.get('id') + using_conf_tv = config_id and client_id == config_id + config_id = self._config.get('id') + using_conf_main = config_id and client_id == config_id else: + config_secret = self._config_tv.get('secret') + config_id = self._config_tv.get('id') using_conf_tv = ( - client_secret == self._config_tv.get('secret', '') - and client_id == self._config_tv.get('id', '') + config_secret and client_secret == config_secret + and config_id and client_id == config_id ) + config_secret = self._config.get('secret') + config_id = self._config.get('id') using_conf_main = ( - client_secret == self._config.get('secret', '') - and client_id == self._config.get('id', '') + config_secret and client_secret == config_secret + and config_id and client_id == config_id ) + if not using_conf_main and not using_conf_tv: return 'None' if using_conf_tv: diff --git a/plugin.video.youtube/resources/lib/youtube_plugin/youtube/client/request_client.py b/plugin.video.youtube/resources/lib/youtube_plugin/youtube/client/request_client.py index 506241b8ba..d6012445a5 100644 --- a/plugin.video.youtube/resources/lib/youtube_plugin/youtube/client/request_client.py +++ b/plugin.video.youtube/resources/lib/youtube_plugin/youtube/client/request_client.py @@ -72,7 +72,7 @@ class YouTubeRequestClient(BaseRequestsClass): }, }, 'thirdParty': { - 'embedUrl': 'https://www.youtube.com/embed/{json[videoId]}', + 'embedUrl': 'https://www.youtube.com/', }, }, 'headers': { @@ -88,6 +88,7 @@ class YouTubeRequestClient(BaseRequestsClass): # Limited subtitle availability 'android_testsuite': { '_id': 30, + '_disabled': True, '_query_subtitles': True, 'json': { 'params': _PLAYER_PARAMS['android_testsuite'], @@ -116,6 +117,7 @@ class YouTubeRequestClient(BaseRequestsClass): # Limited subtitle availability 'android_youtube_tv': { '_id': 29, + '_disabled': True, '_query_subtitles': True, 'json': { 'params': _PLAYER_PARAMS['android'], @@ -129,6 +131,9 @@ class YouTubeRequestClient(BaseRequestsClass): 'platform': 'MOBILE', }, }, + 'thirdParty': { + 'embedUrl': 'https://www.google.com/', + }, }, 'headers': { 'User-Agent': ('com.google.android.apps.youtube.unplugged/' @@ -139,8 +144,35 @@ class YouTubeRequestClient(BaseRequestsClass): 'X-YouTube-Client-Version': '{json[context][client][clientVersion]}', }, }, + 'android_vr': { + '_id': 28, + '_query_subtitles': False, + 'json': { + 'context': { + 'client': { + 'clientName': 'ANDROID_VR', + 'clientVersion': '1.57.29', + 'deviceMake': 'Oculus', + 'deviceModel': 'Quest 3', + 'osName': 'Android', + 'osVersion': '12L', + 'androidSdkVersion': '32', + } + } + }, + 'headers': { + 'User-Agent': ('com.google.android.apps.youtube.vr.oculus/' + '{json[context][client][clientVersion]}' + ' (Linux; U; {json[context][client][osName]}' + ' {json[context][client][osVersion]};' + ' eureka-user Build/SQ3A.220605.009.A1) gzip'), + 'X-YouTube-Client-Name': '{_id}', + 'X-YouTube-Client-Version': '{json[context][client][clientVersion]}', + }, + }, 'ios': { '_id': 5, + '_auth_type': False, '_os': { 'major': '17', 'minor': '5', @@ -197,7 +229,7 @@ class YouTubeRequestClient(BaseRequestsClass): }, }, 'thirdParty': { - 'embedUrl': 'https://www.youtube.com', + 'embedUrl': 'https://www.google.com/', }, }, # Headers from a 2022 Samsung Tizen 6.5 based Smart TV @@ -230,6 +262,7 @@ class YouTubeRequestClient(BaseRequestsClass): }, '_common': { '_access_token': None, + '_access_token_tv': None, 'json': { 'contentCheckOk': True, 'context': { @@ -255,17 +288,15 @@ class YouTubeRequestClient(BaseRequestsClass): 'videoId': None, }, 'headers': { - 'Origin': 'https://www.youtube.com', - 'Referer': 'https://www.youtube.com/watch?v={json[videoId]}', 'Accept-Encoding': 'gzip, deflate', 'Accept-Charset': 'ISO-8859-1,utf-8;q=0.7,*;q=0.7', 'Accept': '*/*', 'Accept-Language': 'en-US,en;q=0.5', - 'Authorization': 'Bearer {_access_token}', + 'Authorization': None, }, 'params': { 'key': ValueError, - 'prettyPrint': 'false' + 'prettyPrint': False, }, }, } @@ -338,27 +369,53 @@ def json_traverse(cls, json_data, path, default=None): def build_client(cls, client_name=None, data=None): templates = {} - client = None + base_client = None if client_name: - client = cls.CLIENTS.get(client_name) - if client and client.get('_disabled'): + base_client = cls.CLIENTS.get(client_name) + if base_client and base_client.get('_disabled'): return None - if not client: - client = YouTubeRequestClient.CLIENTS['web'] - client = client.copy() + if not base_client: + base_client = YouTubeRequestClient.CLIENTS['web'] + base_client = base_client.copy() if data: - client = merge_dicts(client, data) + client = merge_dicts(base_client, data) client = merge_dicts(cls.CLIENTS['_common'], client, templates) client['_name'] = client_name + if base_client.get('_auth_required'): + client['_auth_required'] = True + for values, template_id, template in templates.values(): + if template_id in values: + values[template_id] = template.format(**client) + + has_auth = False try: params = client['params'] - if client.get('_access_token'): + auth_required = client.get('_auth_required') + auth_requested = client.get('_auth_requested') + auth_type = client.get('_auth_type') + if auth_type == 'tv' and auth_requested != 'personal': + auth_token = client.get('_access_token_tv') + elif auth_type is not False: + auth_token = client.get('_access_token') + else: + auth_token = None + + if auth_token and (auth_required or auth_requested): + headers = client['headers'] + if 'Authorization' in headers: + headers = headers.copy() + headers['Authorization'] = 'Bearer {0}'.format(auth_token) + client['headers'] = headers + has_auth = True + if 'key' in params: params = params.copy() del params['key'] client['params'] = params + elif auth_required: + return None else: headers = client['headers'] if 'Authorization' in headers: @@ -372,9 +429,6 @@ def build_client(cls, client_name=None, data=None): client['params'] = params except KeyError: pass - - for values, template_id, template in templates.values(): - if template_id in values: - values[template_id] = template.format(**client) + client['_has_auth'] = has_auth return client diff --git a/plugin.video.youtube/resources/lib/youtube_plugin/youtube/client/youtube.py b/plugin.video.youtube/resources/lib/youtube_plugin/youtube/client/youtube.py index a004e15b4e..c68cdd1600 100644 --- a/plugin.video.youtube/resources/lib/youtube_plugin/youtube/client/youtube.py +++ b/plugin.video.youtube/resources/lib/youtube_plugin/youtube/client/youtube.py @@ -10,20 +10,20 @@ from __future__ import absolute_import, division, unicode_literals +import json import threading import xml.etree.ElementTree as ET from functools import partial from itertools import chain, islice from random import randint -from traceback import format_exc +from traceback import format_stack from .login_client import LoginClient from ..helper.stream_info import StreamInfo from ..youtube_exceptions import InvalidJSON, YouTubeException -from ...kodion.compatibility import cpu_count, string_type, to_str +from ...kodion.compatibility import available_cpu_count, string_type, to_str from ...kodion.items import DirectoryItem from ...kodion.utils import ( - current_system_version, datetime_parser, strip_html_from_text, to_unicode, @@ -32,7 +32,7 @@ class YouTube(LoginClient): CLIENTS = { - 1: { + 'v1': { 'url': 'https://www.youtube.com/youtubei/v1/{_endpoint}', 'method': None, 'json': { @@ -47,7 +47,8 @@ class YouTube(LoginClient): 'Host': 'www.youtube.com', }, }, - 3: { + 'v3': { + '_auth_required': True, 'url': 'https://www.googleapis.com/youtube/v3/{_endpoint}', 'method': None, 'headers': { @@ -84,8 +85,27 @@ class YouTube(LoginClient): 'Host': 'www.youtube.com', }, }, + 'watch_history': { + '_auth_required': True, + '_auth_type': 'personal', + '_video_id': None, + 'headers': { + 'Host': 's.youtube.com', + 'Referer': 'https://www.youtube.com/watch?v={_video_id}', + }, + 'params': { + 'referrer': 'https://accounts.google.com/', + 'ns': 'yt', + 'el': 'detailpage', + 'ver': '2', + 'fs': '0', + 'volume': '100', + 'muted': '0', + }, + }, '_common': { '_access_token': None, + '_access_token_tv': None, 'json': { 'context': { 'client': { @@ -107,7 +127,7 @@ class YouTube(LoginClient): 'Accept-Charset': 'ISO-8859-1,utf-8;q=0.7,*;q=0.7', 'Accept': '*/*', 'Accept-Language': 'en-US,en;q=0.5', - 'Authorization': 'Bearer {_access_token}', + 'Authorization': None, 'DNT': '1', 'User-Agent': ('Mozilla/5.0 (Linux; Android 10; SM-G981B)' ' AppleWebKit/537.36 (KHTML, like Gecko)' @@ -115,7 +135,7 @@ class YouTube(LoginClient): }, 'params': { 'key': None, - 'prettyPrint': 'false' + 'prettyPrint': False, }, }, } @@ -127,8 +147,8 @@ def __init__(self, context, **kwargs): super(YouTube, self).__init__(context=context, **kwargs) - def get_max_results(self): - return self._max_results + def max_results(self): + return self._context.get_param('items_per_page') or self._max_results def get_language(self): return self._language @@ -146,33 +166,20 @@ def update_watch_history(self, context, video_id, url, status=None): ' current time={cmt},' ' segment start={st},' ' segment end={et},' - ' state={state}'.format( - video_id=video_id, cmt=cmt, st=st, et=et, state=state - )) + ' state={state}' + .format(video_id=video_id, + cmt=cmt, + st=st, + et=et, + state=state)) - headers = { - 'Host': 's.youtube.com', - 'Connection': 'keep-alive', - 'Accept-Encoding': 'gzip, deflate', - 'Accept-Charset': 'ISO-8859-1,utf-8;q=0.7,*;q=0.7', - 'Accept': '*/*', - 'Accept-Language': 'en-US,en;q=0.5', - 'DNT': '1', - 'Referer': 'https://www.youtube.com/watch?v=' + video_id, - 'User-Agent': ('Mozilla/5.0 (Linux; Android 10; SM-G981B)' - ' AppleWebKit/537.36 (KHTML, like Gecko)' - ' Chrome/80.0.3987.162 Mobile Safari/537.36'), - } - params = { - 'docid': video_id, - 'referrer': 'https://accounts.google.com/', - 'ns': 'yt', - 'el': 'detailpage', - 'ver': '2', - 'fs': '0', - 'volume': '100', - 'muted': '0', + client_data = { + '_video_id': video_id, + 'url': url, + 'error_title': 'Failed to update watch history', } + + params = {} if cmt is not None: params['cmt'] = format(cmt, '.3f') if st is not None: @@ -181,11 +188,11 @@ def update_watch_history(self, context, video_id, url, status=None): params['et'] = format(et, '.3f') if state is not None: params['state'] = state - if self._access_token: - params['access_token'] = self._access_token - self.request(url, params=params, headers=headers, - error_msg='Failed to update watch history') + self.api_request(client='watch_history', + client_data=client_data, + params=params, + no_content=True) def get_streams(self, context, @@ -193,15 +200,17 @@ def get_streams(self, ask_for_quality=False, audio_only=False, use_mpd=True): - return StreamInfo(context, - access_token=self._access_token_tv, - ask_for_quality=ask_for_quality, - audio_only=audio_only, - use_mpd=use_mpd).load_stream_info(video_id) + return StreamInfo( + context, + access_token=(self._access_token or self._access_token_tv), + ask_for_quality=ask_for_quality, + audio_only=audio_only, + use_mpd=use_mpd, + ).load_stream_info(video_id) def remove_playlist(self, playlist_id, **kwargs): params = {'id': playlist_id, - 'mine': 'true'} + 'mine': True} return self.api_request(method='DELETE', path='playlists', params=params, @@ -286,7 +295,7 @@ def rate_video(self, video_id, rating='like', **kwargs): def add_video_to_playlist(self, playlist_id, video_id, **kwargs): params = {'part': 'snippet', - 'mine': 'true'} + 'mine': True} post_data = {'kind': 'youtube#playlistItem', 'snippet': {'playlistId': playlist_id, 'resourceId': {'kind': 'youtube#video', @@ -319,7 +328,7 @@ def unsubscribe(self, subscription_id, **kwargs): def unsubscribe_channel(self, channel_id, **kwargs): post_data = {'channelIds': [channel_id]} - return self.api_request(version=1, + return self.api_request(client='v1', method='POST', path='subscription/unsubscribe', post_data=post_data, @@ -348,10 +357,10 @@ def get_subscription(self, :return: """ params = {'part': 'snippet', - 'maxResults': str(self._max_results), + 'maxResults': str(self.max_results()), 'order': order} if channel_id == 'mine': - params['mine'] = 'true' + params['mine'] = True else: params['channelId'] = channel_id if page_token: @@ -364,7 +373,7 @@ def get_subscription(self, def get_guide_category(self, guide_category_id, page_token='', **kwargs): params = {'part': 'snippet,contentDetails,brandingSettings', - 'maxResults': str(self._max_results), + 'maxResults': str(self.max_results()), 'categoryId': guide_category_id, 'regionCode': self._region, 'hl': self._language} @@ -377,7 +386,7 @@ def get_guide_category(self, guide_category_id, page_token='', **kwargs): def get_guide_categories(self, page_token='', **kwargs): params = {'part': 'snippet', - 'maxResults': str(self._max_results), + 'maxResults': str(self.max_results()), 'regionCode': self._region, 'hl': self._language} if page_token: @@ -390,7 +399,7 @@ def get_guide_categories(self, page_token='', **kwargs): def get_trending_videos(self, page_token='', **kwargs): params = {'part': 'snippet,status', - 'maxResults': str(self._max_results), + 'maxResults': str(self.max_results()), 'regionCode': self._region, 'hl': self._language, 'chart': 'mostPopular'} @@ -403,7 +412,7 @@ def get_trending_videos(self, page_token='', **kwargs): def get_video_category(self, video_category_id, page_token='', **kwargs): params = {'part': 'snippet,contentDetails,status', - 'maxResults': str(self._max_results), + 'maxResults': str(self.max_results()), 'videoCategoryId': video_category_id, 'chart': 'mostPopular', 'regionCode': self._region, @@ -417,7 +426,7 @@ def get_video_category(self, video_category_id, page_token='', **kwargs): def get_video_categories(self, page_token='', **kwargs): params = {'part': 'snippet', - 'maxResults': str(self._max_results), + 'maxResults': str(self.max_results()), 'regionCode': self._region, 'hl': self._language} if page_token: @@ -447,7 +456,7 @@ def get_recommended_for_home(self, } post_data['context'] = context - result = self.api_request(version=1, + result = self.api_request(client='v1', method='POST', path='browse', post_data=post_data) @@ -604,7 +613,7 @@ def get_related_for_home(self, page_token='', refresh=False): # Increase value to recursively retrieve recommendations for the first # recommended video, up to the set maximum recursion depth max_depth = 2 - items_per_page = self._max_results + items_per_page = self.max_results() diversity_limits = items_per_page // (num_items * max_depth) items = [[] for _ in range(max_depth * len(video_ids))] counts = { @@ -811,14 +820,14 @@ def rank_and_sort(item): def get_activities(self, channel_id, page_token='', **kwargs): params = {'part': 'snippet,contentDetails', - 'maxResults': str(self._max_results), + 'maxResults': str(self.max_results()), 'regionCode': self._region, 'hl': self._language} if channel_id == 'home': - params['home'] = 'true' + params['home'] = True elif channel_id == 'mine': - params['mine'] = 'true' + params['mine'] = True else: params['channelId'] = channel_id if page_token: @@ -834,7 +843,7 @@ def get_channel_sections(self, channel_id, **kwargs): 'regionCode': self._region, 'hl': self._language} if channel_id == 'mine': - params['mine'] = 'true' + params['mine'] = True else: params['channelId'] = channel_id return self.api_request(method='GET', @@ -844,11 +853,11 @@ def get_channel_sections(self, channel_id, **kwargs): def get_playlists_of_channel(self, channel_id, page_token='', **kwargs): params = {'part': 'snippet', - 'maxResults': str(self._max_results)} - if channel_id != 'mine': - params['channelId'] = channel_id + 'maxResults': str(self.max_results())} + if channel_id == 'mine': + params['mine'] = True else: - params['mine'] = 'true' + params['channelId'] = channel_id if page_token: params['pageToken'] = page_token @@ -864,7 +873,7 @@ def get_playlist_item_id_of_video_id(self, json_data = self.get_playlist_items( playlist_id=playlist_id, page_token=page_token, - max_results=50, + max_results=self.max_results(), ) if not json_data: return None @@ -890,7 +899,7 @@ def get_playlist_items(self, **kwargs): # prepare params if max_results is None: - max_results = self._max_results + max_results = self.max_results() params = {'part': 'snippet', 'maxResults': str(max_results), 'playlistId': playlist_id} @@ -936,11 +945,11 @@ def get_channels(self, channel_id, **kwargs): if not isinstance(channel_id, string_type): channel_id = ','.join(channel_id) - params = {'part': 'snippet,contentDetails,brandingSettings'} - if channel_id != 'mine': - params['id'] = channel_id + params = {'part': 'snippet,contentDetails,brandingSettings,statistics'} + if channel_id == 'mine': + params['mine'] = True else: - params['mine'] = 'true' + params['id'] = channel_id return self.api_request(method='GET', path='channels', params=params, @@ -954,7 +963,7 @@ def get_disliked_videos(self, page_token='', **kwargs): # prepare params params = {'part': 'snippet,status', 'myRating': 'dislike', - 'maxResults': str(self._max_results)} + 'maxResults': str(self.max_results())} if page_token: params['pageToken'] = page_token @@ -988,7 +997,7 @@ def get_playlists(self, playlist_id, **kwargs): if not isinstance(playlist_id, string_type): playlist_id = ','.join(playlist_id) - params = {'part': 'snippet,contentDetails', + params = {'part': 'snippet,status,contentDetails', 'id': playlist_id} return self.api_request(method='GET', path='playlists', @@ -1022,7 +1031,7 @@ def get_live_events(self, 'regionCode': self._region, 'hl': self._language, 'relevanceLanguage': self._language, - 'maxResults': str(self._max_results)} + 'maxResults': str(self.max_results())} if location: settings = self._context.get_settings() @@ -1035,7 +1044,13 @@ def get_live_events(self, params['pageToken'] = page_token if after: - params['publishedAfter'] = after + if isinstance(after, string_type) and after.startswith('{'): + after = json.loads(after) + params['publishedAfter'] = ( + datetime_parser.yt_datetime_offset(**after) + if isinstance(after, dict) else + after + ) return self.api_request(method='GET', path='search', @@ -1049,14 +1064,15 @@ def get_related_videos(self, offset=0, retry=0, **kwargs): - max_results = self._max_results if max_results <= 0 else max_results + max_results = self.max_results() if max_results <= 0 else max_results post_data = {'videoId': video_id} if page_token: post_data['continuation'] = page_token - result = self.api_request(version=('tv' if retry == 1 else - 'tv_embed' if retry == 2 else 1), + result = self.api_request(client=('tv' if retry == 1 else + 'tv_embed' if retry == 2 else + 'v1'), method='POST', path='next', post_data=post_data, @@ -1248,7 +1264,7 @@ def get_parent_comments(self, page_token='', max_results=0, **kwargs): - max_results = self._max_results if max_results <= 0 else max_results + max_results = self.max_results() if max_results <= 0 else max_results # prepare params params = {'part': 'snippet', @@ -1270,7 +1286,7 @@ def get_child_comments(self, page_token='', max_results=0, **kwargs): - max_results = self._max_results if max_results <= 0 else max_results + max_results = self.max_results() if max_results <= 0 else max_results # prepare params params = {'part': 'snippet', @@ -1293,13 +1309,13 @@ def get_channel_videos(self, channel_id, page_token='', **kwargs): params = {'part': 'snippet', 'hl': self._language, - 'maxResults': str(self._max_results), + 'maxResults': str(self.max_results()), 'type': 'video', 'safeSearch': 'none', 'order': 'date'} if channel_id == 'mine': - params['forMine'] = 'true' + params['forMine'] = True else: params['channelId'] = channel_id @@ -1314,87 +1330,199 @@ def get_channel_videos(self, channel_id, page_token='', **kwargs): def search(self, q, search_type=None, - event_type='', - channel_id='', + event_type=None, + channel_id=None, order='relevance', safe_search='moderate', page_token='', location=False, **kwargs): """ + Returns a collection of search results that match the query parameters specified in the API request. By default, a search result set identifies matching video, channel, and playlist resources, but you can also configure queries to only retrieve a specific type of resource. - :param q: - :param search_type: acceptable values are: 'video' | 'channel' | 'playlist' - :param event_type: 'live', 'completed', 'upcoming' - :param channel_id: limit search to channel id - :param order: one of: 'date', 'rating', 'relevance', 'title', 'videoCount', 'viewCount' - :param safe_search: one of: 'moderate', 'none', 'strict' - :param page_token: can be '' - :param location: bool, use geolocation + + :param str q: The q parameter specifies the query term to search for. Query can also use the Boolean NOT (-) + and OR (|) operators to exclude videos or to find videos that are associated with one of several search + terms. + :param str search_type: Acceptable values are: 'video', 'channel' or 'playlist' + :param str event_type: Restricts a search to broadcast events. If you specify a value for this parameter, you + must also set the type parameter's value to video. + Acceptable values are: + - `live` + - `completed` + - `upcoming` + :param str channel_id: limit search to channel id + :param str channel_type: Restrict a search to a particular type of channel. + Acceptable values are: + - `any` : return all channels. + - `show` : only retrieve shows. + :param str order: Specifies the method that will be used to order resources in the API response. The default + value is relevance. + Acceptable values are: + - `date` : reverse chronological order based on the date created. + - `rating` : highest to lowest rating. + - `relevance` : sorted based on their relevance to the search query. + - `title` : alphabetically by title. + - `videoCount` : channels are sorted in descending order of their number of uploaded videos. + - `viewCount` : highest to lowest number of views or concurrent viewers for live broadcasts. + :param str safe_search: one of: 'moderate', 'none', 'strict' + :param str page_token: can be '' + :param bool location: use geolocation + :param str video_type: Restrict a search to a particular type of videos. If you specify a value for this + parameter, you must also set the type parameter's value to video. + Acceptable values are: + - `any` : return all videos. + - `episode` : only retrieve episodes of shows. + - `movie` : only retrieve movies. :return: """ - if search_type is None: - search_type = ['video', 'channel', 'playlist'] - - # prepare search type - if not search_type: - search_type = '' - if not isinstance(search_type, string_type): - search_type = ','.join(search_type) - - # prepare page token - if not page_token: - page_token = '' - # prepare params - params = {'q': q, + params = {'q': q.replace('|', '%7C') if '|' in q else q, 'part': 'snippet', 'regionCode': self._region, 'hl': self._language, 'relevanceLanguage': self._language, - 'maxResults': str(self._max_results)} + 'maxResults': str(self.max_results())} - if event_type and event_type in {'live', 'upcoming', 'completed'}: - params['eventType'] = event_type + if search_type is None: + search_type = ('video', 'channel', 'playlist') + if isinstance(search_type, (list, tuple)): + search_type = ','.join(search_type) if search_type: params['type'] = search_type + + if event_type and event_type in {'live', 'upcoming', 'completed'}: + params['eventType'] = event_type + params['type'] = 'video' + if channel_id: params['channelId'] = channel_id + if order: params['order'] = order + if safe_search: params['safeSearch'] = safe_search + if page_token: params['pageToken'] = page_token - video_only_params = ['eventType', 'videoCaption', 'videoCategoryId', 'videoDefinition', - 'videoDimension', 'videoDuration', 'videoEmbeddable', 'videoLicense', - 'videoSyndicated', 'videoType', 'relatedToVideoId', 'forMine'] - for key in video_only_params: - if params.get(key) is not None: - params['type'] = 'video' - break - - if params['type'] == 'video' and location: + if location: settings = self._context.get_settings() location = settings.get_location() if location: params['location'] = location params['locationRadius'] = settings.get_location_radius() + params['type'] = 'video' return self.api_request(method='GET', path='search', params=params, **kwargs) + def search_with_params(self, params, **kwargs): + settings = self._context.get_settings() + + # prepare default params + search_params = { + 'part': 'snippet', + 'regionCode': self._region, + 'hl': self._language, + 'relevanceLanguage': self._language, + } + + search_query = params.get('q', '') + if '|' in search_query: + search_params['q'] = search_query.replace('|', '%7C') + + max_results = params.get('maxResults') + if max_results is None: + search_params['maxResults'] = str(self.max_results()) + + search_type = params.get('type') + if isinstance(search_type, (list, tuple)): + search_params['type'] = ','.join(search_type) + + channel_id = params.get('channelId') + if channel_id == 'mine': + del params['channelId'] + params['forMine'] = True + + location = params.get('location') + if location is True: + location = settings.get_location() + if location: + search_params['location'] = location + search_params['locationRadius'] = settings.get_location_radius() + + safe_search = params.get('safeSearch') + if safe_search is None: + search_params['safeSearch'] = settings.safe_search() + + published = params.get('publishedBefore') + if published: + if isinstance(published, string_type) and published.startswith('{'): + published = json.loads(published) + search_params['publishedBefore'] = ( + datetime_parser.yt_datetime_offset(**published) + if isinstance(published, dict) else + published + ) + + published = params.get('publishedAfter') + if published: + if isinstance(published, string_type) and published.startswith('{'): + published = json.loads(published) + search_params['publishedAfter'] = ( + datetime_parser.yt_datetime_offset(**published) + if isinstance(published, dict) else + published + ) + + params_to_delete = [] + for param, value in params.items(): + if value: + if param not in search_params: + search_params[param] = value + else: + params_to_delete.append(param) + + for param in params_to_delete: + del params[param] + + video_only_params = { + 'eventType', + 'forMine' + 'location', + 'relatedToVideoId', + 'videoCaption', + 'videoCategoryId', + 'videoDefinition', + 'videoDimension', + 'videoDuration', + 'videoEmbeddable', + 'videoLicense', + 'videoSyndicated', + 'videoType', + } + if not video_only_params.isdisjoint(search_params.keys()): + search_params['type'] = 'video' + + return (params, + self.api_request(method='GET', + path='search', + params=search_params, + **kwargs)) + def get_my_subscriptions(self, page_token=1, logged_in=False, do_filter=False, refresh=False, + progress_dialog=None, **kwargs): """ modified by PureHemp, using YouTube RSS for fetching latest videos @@ -1405,7 +1533,7 @@ def get_my_subscriptions(self, 'items': [], 'pageInfo': { 'totalResults': 0, - 'resultsPerPage': self._max_results, + 'resultsPerPage': self.max_results(), }, } @@ -1430,8 +1558,8 @@ def get_my_subscriptions(self, page = page_token or 1 totals = { 'num': 0, - 'start': -self._max_results, - 'end': page * self._max_results, + 'start': -self.max_results(), + 'end': page * self.max_results(), 'video_ids': set(), } totals['start'] += totals['end'] @@ -1452,9 +1580,9 @@ def _sort_by_date_time(item, limits): params = { 'part': 'snippet', - 'maxResults': '50', + 'maxResults': str(self.max_results()), 'order': 'alphabetical', - 'mine': 'true' + 'mine': True, } def _get_channels(output, _params=params): @@ -1501,7 +1629,10 @@ def _get_channels(output, _params=params): 'Accept-Language': 'en-US,en;q=0.7,de;q=0.3' } - def _get_feed_cache(output, channel_id, _cache=cache, _refresh=refresh): + def _get_feed_cache(output, + channel_id, + _cache=cache, + _refresh=refresh): cached = _cache.get_item(channel_id) if cached: feed_details = cached['value'] @@ -1522,6 +1653,7 @@ def _get_feed_cache(output, channel_id, _cache=cache, _refresh=refresh): feeds[channel_id].update(feed_details) else: feeds[channel_id] = feed_details + return True, False def _get_feed(output, channel_id, _headers=headers): @@ -1549,10 +1681,19 @@ def _get_feed(output, channel_id, _headers=headers): } def _parse_feeds(feeds, - encode=not current_system_version.compatible(19, 0), + sort_method, + sort_limits, + progress_dialog=None, + utf8=self._context.get_system_version().compatible(19), filters=subscription_filters, _ns=namespaces, _cache=cache): + if progress_dialog: + total = len(feeds) + progress_dialog.reset_total(new_total=total, + current=0, + total=total) + all_items = {} new_cache = {} for channel_id, feed in feeds.items(): @@ -1565,7 +1706,7 @@ def _parse_feeds(feeds, content.encoding = 'utf-8' content = to_unicode(content.content).replace('\n', '') - root = ET.fromstring(to_str(content) if encode else content) + root = ET.fromstring(content if utf8 else to_str(content)) channel_name = (root.findtext('atom:title', '', _ns) .lower().replace(',', '')) feed_items = [{ @@ -1592,7 +1733,7 @@ def _parse_feeds(feeds, 'video_ids': set(), } feed_items.sort(reverse=True, - key=partial(_sort_by_date_time, + key=partial(sort_method, limits=feed_limits)) feed_items = feed_items[:min(1000, feed_limits['num'])] new_cache[channel_id] = { @@ -1613,9 +1754,19 @@ def _parse_feeds(feeds, else: all_items[channel_id] = feed_items + if progress_dialog: + progress_dialog.update(current=len(all_items)) + if new_cache: _cache.set_items(new_cache) - return list(chain.from_iterable(all_items.values())) + # filter, sorting by publish date and trim + if all_items: + return sorted( + chain.from_iterable(all_items.values()), + reverse=True, + key=partial(sort_method, limits=sort_limits), + ) + return None def _threaded_fetch(kwargs, output, @@ -1643,9 +1794,13 @@ def _threaded_fetch(kwargs, try: success, complete = worker(output, **_kwargs) - except Exception: - msg = 'get_my_subscriptions._threaded_fetch - {exc}' - self._context.log_error(msg.format(exc=format_exc())) + except Exception as exc: + msg = ('get_my_subscriptions._threaded_fetch - Error' + '\n\tException: {exc!r}' + '\n\tStack trace (most recent call last):\n{stack}' + .format(exc=exc, + stack=''.join(format_stack()))) + self._context.log_error(msg) continue if complete or not success: @@ -1662,11 +1817,7 @@ def _threaded_fetch(kwargs, threads['current'].discard(threading.current_thread()) threads['loop'].set() - try: - num_cores = cpu_count() or 1 - except NotImplementedError: - num_cores = 1 - max_threads = min(32, 2 * (num_cores + 4)) + max_threads = min(32, 2 * (available_cpu_count() + 4)) counts = { 'all': 0, } @@ -1728,6 +1879,15 @@ def _threaded_fetch(kwargs, del payloads[pool_id] completed = [] iterator = iter(payloads) + if progress_dialog: + total = progress_dialog.grow_total( + new_total=len(threaded_output['channel_ids']), + ) + progress_dialog.update( + steps=0, + current=len(threaded_output['feeds']), + total=total, + ) continue payload = payloads[pool_id] @@ -1768,14 +1928,13 @@ def _threaded_fetch(kwargs, counter.acquire(True) new_thread.start() - items = _parse_feeds(threaded_output['feeds']) - - # filter, sorting by publish date and trim - if items: - items.sort(reverse=True, - key=partial(_sort_by_date_time, - limits=totals)) - else: + items = _parse_feeds( + threaded_output['feeds'], + sort_method=_sort_by_date_time, + sort_limits=totals, + progress_dialog=progress_dialog, + ) + if not items: return None if totals['num'] > totals['end']: @@ -1817,7 +1976,7 @@ def _perform(_playlist_idx, _page_token, _offset, _result): else: _post_data['browseId'] = 'FEmy_youtube' - _json_data = self.api_request(version=1, + _json_data = self.api_request(client='v1', method='POST', path='browse', post_data=_post_data) @@ -1837,7 +1996,7 @@ def _perform(_playlist_idx, _page_token, _offset, _result): if not _result: _result = {'items': []} - _new_offset = self._max_results - len(_result['items']) + _offset + _new_offset = self.max_results() - len(_result['items']) + _offset if _offset > 0: _items = _items[_offset:] _result['offset'] = _new_offset @@ -1867,23 +2026,23 @@ def _perform(_playlist_idx, _page_token, _offset, _result): _continuations = (_data.get('continuations', [{}])[0] .get('nextContinuationData', {}) .get('continuation', '')) - if _continuations and len(_result['items']) <= self._max_results: + if _continuations and len(_result['items']) <= self.max_results(): _result['next_page_token'] = _continuations - if len(_result['items']) < self._max_results: + if len(_result['items']) < self.max_results(): _result = _perform(_playlist_idx=playlist_index, _page_token=_continuations, _offset=0, _result=_result) # trim result - if len(_result['items']) > self._max_results: + if len(_result['items']) > self.max_results(): _items = _result['items'] - _items = _items[:self._max_results] + _items = _items[:self.max_results()] _result['items'] = _items _result['continue'] = True - if len(_result['items']) < self._max_results: + if len(_result['items']) < self.max_results(): if 'continue' in _result: del _result['continue'] @@ -1912,7 +2071,7 @@ def _perform(_playlist_idx, _page_token, _offset, _result): } playlist_index = None - json_data = self.api_request(version=1, + json_data = self.api_request(client='v1', method='POST', path='browse', post_data=_en_post_data) @@ -1943,8 +2102,8 @@ def _perform(_playlist_idx, _page_token, _offset, _result): def _response_hook(self, **kwargs): response = kwargs['response'] - self._context.log_debug('API response: |{0.status_code}|\n' - 'headers: |{0.headers}|'.format(response)) + self._context.log_debug('API response: |{0.status_code}|' + '\n\theaders: |{0.headers}|'.format(response)) if response.status_code == 204 and 'no_content' in kwargs: return True try: @@ -1966,14 +2125,17 @@ def _error_hook(self, **kwargs): if getattr(exc, 'pass_data', False): data = json_data else: - data = None + data = kwargs['response'] if getattr(exc, 'raise_exc', False): exception = YouTubeException else: exception = None if not json_data or 'error' not in json_data: - return None, None, None, data, None, exception + info = ('Request - Failed' + '\n\tException: {exc!r}') + details = kwargs + return None, info, details, data, None, exception details = json_data['error'] reason = details.get('errors', [{}])[0].get('reason', 'Unknown') @@ -1982,7 +2144,7 @@ def _error_hook(self, **kwargs): if getattr(exc, 'notify', True): ok_dialog = False timeout = 5000 - if reason == 'accessNotConfigured': + if reason in {'accessNotConfigured', 'forbidden'}: notification = self._context.localize('key.requirement') ok_dialog = True elif reason == 'keyInvalid' and message == 'Bad Request': @@ -2002,25 +2164,27 @@ def _error_hook(self, **kwargs): title, time_ms=timeout) - info = ('API error: {reason}\n' - 'exc: |{exc}|\n' - 'message: |{message}|') + info = ('API error - {reason}' + '\n\tException: {exc!r}' + '\n\tMessage: {message}') details = {'reason': reason, 'message': message} return '', info, details, data, False, exception def api_request(self, - version=3, + client='v3', method='GET', + client_data=None, path=None, params=None, post_data=None, headers=None, no_login=False, **kwargs): - client_data = { - '_endpoint': path.strip('/'), - 'method': method, - } + if not client_data: + client_data = {} + client_data.setdefault('method', method) + if path: + client_data['_endpoint'] = path.strip('/') if headers: client_data['headers'] = headers if method in {'POST', 'PUT'}: @@ -2032,27 +2196,38 @@ def api_request(self, if params: client_data['params'] = params - # a config can decide if a token is allowed - if (not no_login and self._access_token - and self._config.get('token-allowed', True)): - client_data['_access_token'] = self._access_token - - client = self.build_client(version, client_data) + abort = False + if not no_login: + client_data.setdefault('_auth_required', True) + # a config can decide if a token is allowed + if self._access_token and self._config.get('token-allowed', True): + client_data['_access_token'] = self._access_token + if self._access_token_tv: + client_data['_access_token_tv'] = self._access_token_tv - params = client.get('params') - if 'key' in params and not params['key']: - params = params.copy() - key = self._config.get('key') or self._config_tv.get('key') - if key: - params['key'] = key - else: - del params['key'] - client['params'] = params + client = self.build_client(client, client_data) + if not client: + client = {} + abort = True if clear_data and 'json' in client: del client['json'] + params = client.get('params') if params: + if 'key' in params: + if params['key']: + abort = False + else: + params = params.copy() + key = self._config.get('key') or self._config_tv.get('key') + if key: + abort = False + params['key'] = key + else: + del params['key'] + client['params'] = params + log_params = params.copy() if 'location' in log_params: log_params['location'] = '|xx.xxxx,xx.xxxx|' @@ -2070,21 +2245,29 @@ def api_request(self, else: log_headers = None - self._context.log_debug('API request:\n' - 'version: |{version}|\n' - 'method: |{method}|\n' - 'path: |{path}|\n' - 'params: |{params}|\n' - 'post_data: |{data}|\n' - 'headers: |{headers}|' - .format(version=version, - method=method, - path=path, - params=log_params, - data=client.get('json'), - headers=log_headers)) - response = self.request(response_hook=self._response_hook, - response_hook_kwargs=kwargs, - error_hook=self._error_hook, - **client) - return response + context = self._context + context.log_debug('API request:' + '\n\ttype: |{type}|' + '\n\tmethod: |{method}|' + '\n\tpath: |{path}|' + '\n\tparams: |{params}|' + '\n\tpost_data: |{data}|' + '\n\theaders: |{headers}|' + .format(type=client.get('_name'), + method=method, + path=path, + params=log_params, + data=client.get('json'), + headers=log_headers)) + if abort: + if kwargs.get('notify', True): + context.get_ui().on_ok( + context.get_name(), + context.localize('key.requirement'), + ) + context.log_warning('API request: aborted') + return {} + return self.request(response_hook=self._response_hook, + response_hook_kwargs=kwargs, + error_hook=self._error_hook, + **client) diff --git a/plugin.video.youtube/resources/lib/youtube_plugin/youtube/helper/ratebypass/ratebypass.py b/plugin.video.youtube/resources/lib/youtube_plugin/youtube/helper/ratebypass/ratebypass.py index d5c4e7473d..876d6b43a8 100644 --- a/plugin.video.youtube/resources/lib/youtube_plugin/youtube/helper/ratebypass/ratebypass.py +++ b/plugin.video.youtube/resources/lib/youtube_plugin/youtube/helper/ratebypass/ratebypass.py @@ -14,9 +14,9 @@ import re try: - from ....kodion import logger + from ....kodion.logger import Logger except: - class logger(object): + class Logger(object): @staticmethod def log_debug(txt): print(txt) @@ -259,17 +259,17 @@ def get_throttling_function_code(js): # This pattern is only present in the throttling function code. fiduciary_index = js.find('enhanced_except_') if fiduciary_index == -1: - logger.log_debug('ratebypass: fiduciary_index not found') + Logger.log_debug('ratebypass: fiduciary_index not found') return None start_index = js.rfind('=function(', 0, fiduciary_index) if start_index == -1: - logger.log_debug('ratebypass: function code start not found') + Logger.log_debug('ratebypass: function code start not found') return None end_index = js.find('};', fiduciary_index) if end_index == -1: - logger.log_debug('ratebypass: function code end not found') + Logger.log_debug('ratebypass: function code end not found') return None return js[start_index:end_index].replace('\n', '') @@ -294,7 +294,7 @@ def get_throttling_plan_gen(raw_code): plan_start_pattern = 'try{' plan_start_index = raw_code.find(plan_start_pattern) if plan_start_index == -1: - logger.log_debug('ratebypass: command block start not found') + Logger.log_debug('ratebypass: command block start not found') raise Exception() else: # Skip the whole start pattern, it's not needed. @@ -302,7 +302,7 @@ def get_throttling_plan_gen(raw_code): plan_end_index = raw_code.find('}', plan_start_index) if plan_end_index == -1: - logger.log_debug('ratebypass: command block end not found') + Logger.log_debug('ratebypass: command block end not found') raise Exception() plan_code = raw_code[plan_start_index:plan_end_index] @@ -365,14 +365,14 @@ def get_throttling_function_array(cls, mutable_n_list, raw_code): array_start_pattern = ",c=[" array_start_index = raw_code.find(array_start_pattern) if array_start_index == -1: - logger.log_debug('ratebypass: "c" array pattern not found') + Logger.log_debug('ratebypass: "c" array pattern not found') raise Exception() else: array_start_index += len(array_start_pattern) array_end_index = raw_code.rfind('];') if array_end_index == -1: - logger.log_debug('ratebypass: "c" array end not found') + Logger.log_debug('ratebypass: "c" array end not found') raise Exception() array_code = raw_code[array_start_index:array_end_index] @@ -404,7 +404,7 @@ def get_throttling_function_array(cls, mutable_n_list, raw_code): found = True break else: - logger.log_debug('ratebypass: mapping function not yet ' + Logger.log_debug('ratebypass: mapping function not yet ' 'listed: {unknown}'.format(unknown=el)) if found: continue @@ -428,7 +428,7 @@ def calculate_n(self, mutable_n_list): video stream URL. """ if self.calculated_n: - logger.log_debug('`n` already calculated: {calculated_n}. returning early...' + Logger.log_debug('`n` already calculated: {calculated_n}. returning early...' .format(calculated_n=self.calculated_n)) return self.calculated_n @@ -436,7 +436,7 @@ def calculate_n(self, mutable_n_list): return None initial_n_string = ''.join(mutable_n_list) - logger.log_debug('Attempting to calculate `n` from initial: {initial_n}' + Logger.log_debug('Attempting to calculate `n` from initial: {initial_n}' .format(initial_n=initial_n_string)) # For each step in the plan, get the first item of the step as the @@ -449,8 +449,8 @@ def calculate_n(self, mutable_n_list): for step in self.get_throttling_plan_gen(self.throttling_function_code): curr_func = throttling_array[int(step[0])] if not callable(curr_func): - logger.log_debug('{curr_func} is not callable.'.format(curr_func=curr_func)) - logger.log_debug('Throttling array:\n{throttling_array}\n' + Logger.log_debug('{curr_func} is not callable.'.format(curr_func=curr_func)) + Logger.log_debug('Throttling array:\n{throttling_array}\n' .format(throttling_array=throttling_array)) return None @@ -462,10 +462,10 @@ def calculate_n(self, mutable_n_list): second_arg = throttling_array[int(step[2])] curr_func(first_arg, second_arg) except: - logger.log_debug('Error calculating new `n`') + Logger.log_debug('Error calculating new `n`') return None self.calculated_n = ''.join(mutable_n_list) - logger.log_debug('Calculated `n`: {calculated_n}' + Logger.log_debug('Calculated `n`: {calculated_n}' .format(calculated_n=self.calculated_n)) return self.calculated_n diff --git a/plugin.video.youtube/resources/lib/youtube_plugin/youtube/helper/resource_manager.py b/plugin.video.youtube/resources/lib/youtube_plugin/youtube/helper/resource_manager.py index 76b1831fec..377e7d974e 100644 --- a/plugin.video.youtube/resources/lib/youtube_plugin/youtube/helper/resource_manager.py +++ b/plugin.video.youtube/resources/lib/youtube_plugin/youtube/helper/resource_manager.py @@ -32,33 +32,36 @@ def _list_batch(input_list, n=50): yield input_list[i:i + n] def get_channels(self, ids, defer_cache=False): - client = self._provider.get_client(self._context) - data_cache = self._context.get_data_cache() - function_cache = self._context.get_function_cache() - refresh = self._context.get_param('refresh') + context = self._context + client = self._provider.get_client(context) + data_cache = context.get_data_cache() + function_cache = context.get_function_cache() + refresh = context.get_param('refresh') updated = [] - for channel_id in ids: - if not channel_id: + for identifier in ids: + if not identifier: continue - if channel_id != 'mine': - updated.append(channel_id) + if identifier != 'mine': + updated.append(identifier) continue data = function_cache.run( client.get_channel_by_identifier, function_cache.ONE_DAY, _refresh=refresh, - identifier=channel_id, + identifier=identifier, ) or {} - items = data.get('items', [{'id': 'mine'}]) + items = data.get('items') try: - channel_id = items[0]['id'] - updated.append(channel_id) - except IndexError: - self._context.log_error('Channel not found:\n{data}' - .format(data=data)) + updated.append(items[0]['id']) + except (IndexError, KeyError, TypeError) as exc: + context.log_error('ResourceManager.get_channels' + ' - Own channel_id not found' + '\n\tException: {exc!r}' + '\n\tChannels: {data}' + .format(exc=exc, data=data)) ids = updated if refresh: @@ -71,8 +74,12 @@ def get_channels(self, ids, defer_cache=False): or result[id_].get('_partial')] if result: - self._context.log_debug('Found cached data for channels:\n|{ids}|' - .format(ids=list(result))) + context.debug_log and context.log_debug( + 'ResourceManager.get_channels' + ' - Using cached data for channels' + '\n\tChannel IDs: {ids}' + .format(ids=list(result)) + ) if to_update: new_data = [client.get_channels(list_of_50) @@ -83,8 +90,12 @@ def get_channels(self, ids, defer_cache=False): new_data = None if new_data: - self._context.log_debug('Got data for channels:\n|{ids}|' - .format(ids=to_update)) + context.debug_log and context.log_debug( + 'ResourceManager.get_channels' + ' - Retrieved new data for channels' + '\n\tVideo IDs: {ids}' + .format(ids=to_update) + ) new_data = { yt_item['id']: yt_item for batch in new_data @@ -133,12 +144,13 @@ def get_fanarts(self, channel_ids, force=False, defer_cache=False): return result def get_playlists(self, ids, defer_cache=False): + context = self._context ids = tuple(ids) - refresh = self._context.get_param('refresh') + refresh = context.get_param('refresh') if refresh: result = {} else: - data_cache = self._context.get_data_cache() + data_cache = context.get_data_cache() result = data_cache.get_items(ids, data_cache.ONE_MONTH) to_update = [id_ for id_ in ids if id_ not in result @@ -146,11 +158,15 @@ def get_playlists(self, ids, defer_cache=False): or result[id_].get('_partial')] if result: - self._context.log_debug('Found cached data for playlists:\n|{ids}|' - .format(ids=list(result))) + context.debug_log and context.log_debug( + 'ResourceManager.get_playlists' + ' - Using cached data for playlists' + '\n\tVideo IDs: {ids}' + .format(ids=list(result)) + ) if to_update: - client = self._provider.get_client(self._context) + client = self._provider.get_client(context) new_data = [client.get_playlists(list_of_50) for list_of_50 in self._list_batch(to_update, n=50)] if not any(new_data): @@ -159,8 +175,12 @@ def get_playlists(self, ids, defer_cache=False): new_data = None if new_data: - self._context.log_debug('Got data for playlists:\n|{ids}|' - .format(ids=to_update)) + context.debug_log and context.log_debug( + 'ResourceManager.get_playlists' + ' - Retrieved new data for playlists' + '\n\tVideo IDs: {ids}' + .format(ids=to_update) + ) new_data = { yt_item['id']: yt_item for batch in new_data @@ -185,7 +205,8 @@ def get_playlist_items(self, ids=None, batch_id=None, defer_cache=False): if not ids and not batch_id: return None - refresh = self._context.get_param('refresh') + context = self._context + refresh = context.get_param('refresh') if batch_id: ids = [batch_id[0]] @@ -195,7 +216,7 @@ def get_playlist_items(self, ids=None, batch_id=None, defer_cache=False): page_token = None fetch_next = True - data_cache = self._context.get_data_cache() + data_cache = context.get_data_cache() batch_ids = [] to_update = [] result = {} @@ -221,10 +242,14 @@ def get_playlist_items(self, ids=None, batch_id=None, defer_cache=False): break if result: - self._context.log_debug('Found cached items for playlists:\n|{ids}|' - .format(ids=list(result))) - - client = self._provider.get_client(self._context) + context.debug_log and context.log_debug( + 'ResourceManager.get_playlist_items' + ' - Using cached data for playlist parts' + '\n\tBatch IDs: {ids}' + .format(ids=list(result)) + ) + + client = self._provider.get_client(context) new_data = {} insert_point = 0 for playlist_id, page_token in to_update: @@ -243,9 +268,12 @@ def get_playlist_items(self, ids=None, batch_id=None, defer_cache=False): break if new_data: - to_update = list(new_data) - self._context.log_debug('Got items for playlists:\n|{ids}|' - .format(ids=to_update)) + context.debug_log and context.log_debug( + 'ResourceManager.get_playlist_items' + ' - Retrieved new data for playlist parts' + '\n\tBatch IDs: {ids}' + .format(ids=list(new_data)) + ) result.update(new_data) self.cache_data({ '{0},{1}'.format(*batch_id): batch @@ -284,12 +312,13 @@ def get_videos(self, live_details=False, suppress_errors=False, defer_cache=False): + context = self._context ids = tuple(ids) - refresh = self._context.get_param('refresh') + refresh = context.get_param('refresh') if refresh: result = {} else: - data_cache = self._context.get_data_cache() + data_cache = context.get_data_cache() result = data_cache.get_items(ids, data_cache.ONE_MONTH) to_update = [id_ for id_ in ids if id_ not in result @@ -297,12 +326,16 @@ def get_videos(self, or result[id_].get('_partial')] if result: - self._context.log_debug('Found cached data for videos:\n|{ids}|' - .format(ids=list(result))) + context.debug_log and context.log_debug( + 'ResourceManager.get_videos' + ' - Using cached data for videos' + '\n\tVideo IDs: {ids}' + .format(ids=list(result)) + ) if to_update: notify_and_raise = not suppress_errors - client = self._provider.get_client(self._context) + client = self._provider.get_client(context) new_data = [client.get_videos(list_of_50, live_details, notify=notify_and_raise, @@ -314,15 +347,20 @@ def get_videos(self, new_data = None if new_data: - self._context.log_debug('Got data for videos:\n|{ids}|' - .format(ids=to_update)) + context.debug_log and context.log_debug( + 'ResourceManager.get_videos' + ' - Retrieved new data for videos' + '\n\tVideo IDs: {ids}' + .format(ids=to_update) + ) new_data = { yt_item['id']: yt_item for batch in new_data for yt_item in batch.get('items', []) if yt_item } - new_data = dict(dict.fromkeys(to_update, {}), **new_data) + new_data = dict(dict.fromkeys(to_update, {'_unavailable': True}), + **new_data) result.update(new_data) self.cache_data(new_data, defer=defer_cache) @@ -335,8 +373,8 @@ def get_videos(self, if id_ in result } - if self._context.get_settings().use_local_history(): - playback_history = self._context.get_playback_history() + if context.get_settings().use_local_history(): + playback_history = context.get_playback_history() played_items = playback_history.get_items(ids) for video_id, play_data in played_items.items(): if video_id in result: @@ -355,8 +393,13 @@ def cache_data(self, data=None, defer=False): data = self.new_data flush = True if data: - self._context.get_data_cache().set_items(data) - self._context.log_debug('Cached data for items:\n|{ids}|' - .format(ids=list(data))) + context = self._context + context.get_data_cache().set_items(data) + context.debug_log and context.log_debug( + 'ResourceManager.cache_data' + ' - Storing new data to cache' + '\n\tIDs: {ids}' + .format(ids=list(data)) + ) if flush: self.new_data = {} diff --git a/plugin.video.youtube/resources/lib/youtube_plugin/youtube/helper/stream_info.py b/plugin.video.youtube/resources/lib/youtube_plugin/youtube/helper/stream_info.py index 7d3a03fcef..27c902f8cb 100644 --- a/plugin.video.youtube/resources/lib/youtube_plugin/youtube/helper/stream_info.py +++ b/plugin.video.youtube/resources/lib/youtube_plugin/youtube/helper/stream_info.py @@ -23,6 +23,7 @@ from ..client.request_client import YouTubeRequestClient from ..youtube_exceptions import InvalidJSON, YouTubeException from ...kodion.compatibility import ( + entity_escape, parse_qs, quote, unescape, @@ -30,6 +31,7 @@ urlencode, urljoin, urlsplit, + urlunsplit, xbmcvfs, ) from ...kodion.constants import PATHS, TEMP_PATH @@ -661,8 +663,8 @@ class StreamInfo(YouTubeRequestClient): QUALITY_FACTOR = { # video - order based on comparative compression ratio 'av01': 1, + 'vp9.2': 0.75, 'vp9': 0.75, - 'vp09': 0.75, 'vp8': 0.55, 'vp08': 0.55, 'avc1': 0.5, @@ -701,7 +703,8 @@ def __init__(self, self._calculate_n = True self._cipher = None - self._selected_client = None + self._auth_client = {} + self._selected_client = {} self._client_groups = { 'custom': clients if clients else (), # Access "premium" streams, HLS and DASH @@ -711,10 +714,9 @@ def __init__(self, ), # Will play most videos with subtitles at full resolution with HDR # Some restricted videos require additional requests for subtitles - # Limited audio stream availability + # Limited audio stream availability with some clients 'mpd': ( - 'android_youtube_tv', - 'android_testsuite', + 'android_vr', ), # Progressive streams # Limited video and audio stream availability @@ -764,18 +766,24 @@ def _error_hook(**kwargs): exception = None if not json_data or 'error' not in json_data: - info = ('exc: |{exc}|\n' - 'video_id: {video_id}, client: {client}, auth: {auth}') + info = ('Request - Failed' + '\n\tException: {exc!r}' + '\n\tvideo_id: |{video_id}|' + '\n\tClient: |{client}|' + '\n\tAuth: |{auth}|') return None, info, kwargs, data, None, exception details = json_data['error'] reason = details.get('errors', [{}])[0].get('reason', 'Unknown') message = details.get('message', 'Unknown error') - info = ('exc: |{exc}|\n' - 'reason: {reason}\n' - 'message: |{message}|\n' - 'video_id: {video_id}, client: {client}, auth: {auth}') + info = ('Request - Failed' + '\n\tException: {exc!r}' + '\n\tReason: {reason}' + '\n\tMessage: {message}' + '\n\tvideo_id: |{video_id}|' + '\n\tClient: |{client}|' + '\n\tAuth: |{auth}|') kwargs['message'] = message kwargs['reason'] = reason return None, info, kwargs, data, None, exception @@ -973,15 +981,16 @@ def _get_player_js(self): return result @staticmethod - def _make_curl_headers(headers, cookies=None): + def _prepare_headers(headers, cookies=None, new_headers=None): + if cookies or new_headers: + headers = headers.copy() if cookies: headers['Cookie'] = '; '.join([ '='.join((cookie.name, cookie.value)) for cookie in cookies ]) - # Headers used in xbmc_items.video_playback_item' - return '&'.join([ - '='.join((key, quote(value))) for key, value in headers.items() - ]) + if new_headers: + headers.update(new_headers) + return headers @staticmethod def _normalize_url(url): @@ -1014,7 +1023,7 @@ def _update_from_hls(self, client_name = 'web' client_data = {'json': {'videoId': self.video_id}} headers = self.build_client(client_name, client_data)['headers'] - curl_headers = self._make_curl_headers(headers, cookies=None) + curl_headers = self._prepare_headers(headers) if meta_info is None: meta_info = {'video': {}, @@ -1025,12 +1034,14 @@ def _update_from_hls(self, if playback_stats is None: playback_stats = {} - settings = self._context.get_settings() + context = self._context + settings = context.get_settings() if self._use_mpd: qualities = settings.mpd_video_qualities() selected_height = qualities[0]['nom_height'] else: selected_height = settings.fixed_video_quality() + log_debug = context.log_debug for url in urls: result = self.request( @@ -1083,9 +1094,10 @@ def _update_from_hls(self, playback_stats=playback_stats, ) if yt_format is None: - self._context.log_debug('Unknown itag: {itag}\n{stream}' - .format(itag=itag, - stream=redact_ip(match[0]))) + stream_info = redact_ip(match.group(1)) + log_debug('Unknown itag - {itag}' + '\n\t{stream}' + .format(itag=itag, stream=stream_info)) if (not yt_format or (yt_format.get('hls/video') and not yt_format.get('hls/audio'))): @@ -1112,7 +1124,7 @@ def _update_from_streams(self, client_name = 'web' client_data = {'json': {'videoId': self.video_id}} headers = self.build_client(client_name, client_data)['headers'] - curl_headers = self._make_curl_headers(headers, cookies=None) + curl_headers = self._prepare_headers(headers) if meta_info is None: meta_info = {'video': {}, @@ -1123,12 +1135,14 @@ def _update_from_streams(self, if playback_stats is None: playback_stats = {} - settings = self._context.get_settings() + context = self._context + settings = context.get_settings() if self._use_mpd: qualities = settings.mpd_video_qualities() selected_height = qualities[0]['nom_height'] else: selected_height = settings.fixed_video_quality() + log_debug = context.log_debug for stream_map in streams: itag = str(stream_map['itag']) @@ -1167,9 +1181,9 @@ def _update_from_streams(self, stream_map['conn'] = redact_ip(conn) if stream: stream_map['stream'] = redact_ip(stream) - self._context.log_debug('Unknown itag: {itag}\n{stream}'.format( - itag=itag, stream=stream_map, - )) + log_debug('Unknown itag - {itag}' + '\n\t{stream}' + .format(itag=itag, stream=stream_map)) if (not yt_format or (yt_format.get('dash/video') and not yt_format.get('dash/audio'))): @@ -1224,13 +1238,15 @@ def _process_signature_cipher(self, stream_map): try: signature = self._cipher.get_signature(encrypted_signature) except Exception as exc: - self._context.log_error('VideoInfo._process_signature_cipher - ' - 'failed to extract URL from |{sig}|\n' - '{exc}:\n{details}'.format( - sig=encrypted_signature, - exc=exc, - details=''.join(format_stack()) - )) + msg = ('StreamInfo._process_signature_cipher' + ' - Failed to extract URL' + '\n\tException: {exc!r}' + '\n\tSignature: |{sig}|' + '\n\tStack trace (most recent call last):\n{stack}' + .format(exc=exc, + sig=encrypted_signature, + stack=''.join(format_stack()))) + self._context.log_error(msg) self._cipher = False return None data_cache.set_item(encrypted_signature, {'sig': signature}) @@ -1336,11 +1352,13 @@ def _get_error_details(self, playability_status, details=None): def load_stream_info(self, video_id): self.video_id = video_id - settings = self._context.get_settings() + context = self._context + settings = context.get_settings() age_gate_enabled = settings.age_gate() audio_only = self._audio_only ask_for_quality = self._ask_for_quality use_mpd = self._use_mpd + use_remote_history = settings.use_remote_history() client_name = None _client = None @@ -1357,13 +1375,18 @@ def load_stream_info(self, video_id): video_info_url = 'https://www.youtube.com/youtubei/v1/player' + log_debug = context.log_debug + log_warning = context.log_warning + abort_reasons = { 'country', 'not available', } - skip_reasons = { + reauth_reasons = { 'age', 'inappropriate', + } + skip_reasons = { 'latest version', } retry_reasons = { @@ -1373,111 +1396,138 @@ def load_stream_info(self, video_id): } abort = False - client_data = {'json': {'videoId': video_id}} - if self._access_token: - auth = True - client_data['_access_token'] = self._access_token - else: - auth = False + has_access_token = bool(self._access_token) + client_data = { + 'json': { + 'videoId': video_id, + }, + '_auth_required': False, + '_auth_requested': 'personal' if use_remote_history else False, + '_access_token': self._access_token, + } for name, clients in self._client_groups.items(): if not clients: continue - if name == 'mpd' and not use_mpd: + if name == 'mpd' and not (use_mpd or use_remote_history): continue if name == 'ask' and use_mpd and not ask_for_quality: continue - status = None - - for client_name in clients: - _client = self.build_client(client_name, client_data) - if not _client: - continue - - _result = self.request( - video_info_url, - 'POST', - response_hook=self._response_hook_json, - error_title='Player request failed', - error_hook=self._error_hook, - error_hook_kwargs={ - 'video_id': video_id, - 'client': client_name, - 'auth': bool(_client.get('_access_token')), - }, - **_client - ) - - video_details = _result.get('videoDetails', {}) - playability = _result.get('playabilityStatus', {}) - status = playability.get('status', 'ERROR').upper() - reason = playability.get('reason', 'UNKNOWN') - - if video_details and video_id != video_details.get('videoId'): - status = 'CONTENT_NOT_AVAILABLE_IN_THIS_APP' - reason = 'Watch on the latest version of YouTube' - - if (age_gate_enabled - and playability.get('desktopLegacyAgeGateReason')): - abort = True - break - elif status == 'LIVE_STREAM_OFFLINE': - abort = True - break - elif status == 'OK': - break - elif status in { - 'AGE_CHECK_REQUIRED', - 'AGE_VERIFICATION_REQUIRED', - 'CONTENT_CHECK_REQUIRED', - 'LOGIN_REQUIRED', - 'CONTENT_NOT_AVAILABLE_IN_THIS_APP', - 'ERROR', - 'UNPLAYABLE', - }: - self._context.log_warning( - 'Failed to retrieve video info - ' - 'video_id: {0}, client: {1}, auth: {2},\n' - 'status: {3}, reason: {4}'.format( - video_id, - _client['_name'], - auth, - status, - reason or 'UNKNOWN', - ) - ) - compare_reason = reason.lower() - if any(why in compare_reason for why in retry_reasons): + restart = False + while 1: + for client_name in clients: + _client = self.build_client(client_name, client_data) + if not _client: continue - if any(why in compare_reason for why in skip_reasons): + + _result = self.request( + video_info_url, + 'POST', + response_hook=self._response_hook_json, + error_title='Player request failed', + error_hook=self._error_hook, + error_hook_kwargs={ + 'video_id': video_id, + 'client': client_name, + 'auth': _client.get('_has_auth', False), + }, + **_client + ) or {} + + video_details = _result.get('videoDetails', {}) + playability = _result.get('playabilityStatus', {}) + status = playability.get('status', 'ERROR').upper() + reason = playability.get('reason', 'UNKNOWN') + + if (video_details + and video_id != video_details.get('videoId')): + status = 'CONTENT_NOT_AVAILABLE_IN_THIS_APP' + reason = 'Watch on the latest version of YouTube' + + if (age_gate_enabled + and playability.get('desktopLegacyAgeGateReason')): + abort = True break - if any(why in compare_reason for why in abort_reasons): + elif status == 'LIVE_STREAM_OFFLINE': abort = True break + elif status == 'OK': + break + elif status in { + 'AGE_CHECK_REQUIRED', + 'AGE_VERIFICATION_REQUIRED', + 'CONTENT_CHECK_REQUIRED', + 'LOGIN_REQUIRED', + 'CONTENT_NOT_AVAILABLE_IN_THIS_APP', + 'ERROR', + 'UNPLAYABLE', + }: + log_warning( + 'Failed to retrieve video info' + '\n\tStatus: {status}' + '\n\tReason: {reason}' + '\n\tvideo_id: |{video_id}|' + '\n\tClient: |{client}|' + '\n\tAuth: |{auth}|' + .format( + status=status, + reason=reason or 'UNKNOWN', + video_id=video_id, + client=_client['_name'], + auth=_client.get('_has_auth', False), + ) + ) + compare_reason = reason.lower() + if any(why in compare_reason for why in reauth_reasons): + if has_access_token: + client_data['_auth_required'] = True + restart = True + break + if any(why in compare_reason for why in retry_reasons): + continue + if any(why in compare_reason for why in skip_reasons): + break + if any(why in compare_reason for why in abort_reasons): + abort = True + break + else: + log_debug( + 'Unknown playabilityStatus in player response' + '\n\tplayabilityStatus: {0}' + .format(playability) + ) else: - self._context.log_debug( - 'Unknown playabilityStatus in player response:\n|{0}|' - .format(playability) - ) + break + if not restart: + break + restart = False if abort: break if status == 'OK': - self._context.log_debug( - 'Retrieved video info - ' - 'video_id: {0}, client: {1}, auth: {2}'.format( - video_id, - client_name, - bool(_client.get('_access_token')), + log_debug( + 'Retrieved video info:' + '\n\tvideo_id: |{video_id}|' + '\n\tClient: |{client}|' + '\n\tAuth: |{auth}|' + .format( + video_id=video_id, + client=client_name, + auth=_client.get('_has_auth', False), ) ) if not self._selected_client: - client = self._selected_client = _client.copy() - result = _result - video_details = result.get('videoDetails', {}) - playability = result.get('playabilityStatus', {}) + self._selected_client = { + 'client': _client.copy(), + 'result': _result, + } + if not self._auth_client and _client.get('_has_auth'): + self._auth_client = { + 'client': _client.copy(), + 'result': _result, + } _streaming_data = _result.get('streamingData', {}) if audio_only or ask_for_quality or not use_mpd: @@ -1509,16 +1559,18 @@ def load_stream_info(self, video_id): reason = self._get_error_details(playability) raise YouTubeException(reason or 'UNKNOWN') + client = self._selected_client['client'] + result = self._selected_client['result'] + if 'Authorization' in client['headers']: del client['headers']['Authorization'] # Make a set of URL-quoted headers to be sent to Kodi when requesting # the stream during playback. The YT player doesn't seem to use any # cookies when doing that, so for now cookies are ignored. # curl_headers = self._make_curl_headers(headers, cookies) - curl_headers = self._make_curl_headers(client['headers'], cookies=None) + curl_headers = self._prepare_headers(client['headers']) - microformat = (result.get('microformat', {}) - .get('playerMicroformatRenderer', {})) + video_details = result.get('videoDetails', {}) is_live = video_details.get('isLiveContent', False) if is_live: is_live = video_details.get('isLive', False) @@ -1528,6 +1580,8 @@ def load_stream_info(self, video_id): live_dvr = False thumb_suffix = '' + microformat = (result.get('microformat', {}) + .get('playerMicroformatRenderer', {})) meta_info = { 'id': video_id, 'title': unescape(video_details.get('title', '') @@ -1557,12 +1611,14 @@ def load_stream_info(self, video_id): 'subtitles': None, } - if settings.use_remote_history(): + if use_remote_history and self._auth_client: playback_stats = { 'playback_url': 'videostatsPlaybackUrl', 'watchtime_url': 'videostatsWatchtimeUrl', } - playback_tracking = result.get('playbackTracking', {}) + playback_tracking = (self._auth_client + .get('result', {}) + .get('playbackTracking', {})) cpn = self._generate_cpn() for key, url_key in playback_stats.items(): @@ -1588,17 +1644,15 @@ def load_stream_info(self, video_id): continue self._context.log_debug('Found widevine license url: {0}' .format(url)) - address, port = get_connect_address(self._context) license_info = { 'url': url, - 'proxy': ''.join(( - 'http://', - address, - ':', - str(port), + 'proxy': urlunsplit(( + 'http', + get_connect_address(self._context, as_netloc=True), PATHS.DRM, - '||R{{SSM}}|', - )), + '', + '', + )) + '||R{{SSM}}|R', 'token': self._access_token, } break @@ -1642,12 +1696,12 @@ def load_stream_info(self, video_id): playback_stats, ) - subtitles = Subtitles(self._context, video_id) + subtitles = Subtitles(context, video_id) query_subtitles = client.get('_query_subtitles') - if (not is_live or live_dvr) and ( - query_subtitles is True - or (query_subtitles - and subtitles.sub_selection == subtitles.LANG_ALL)): + if ((not is_live or live_dvr) + and (query_subtitles is True + or (query_subtitles + and subtitles.sub_selection == subtitles.LANG_ALL))): for client_name in ('smart_tv_embedded', 'web', 'android'): caption_client = self.build_client(client_name, client_data) if not caption_client: @@ -1661,7 +1715,7 @@ def load_stream_info(self, video_id): error_hook_kwargs={ 'video_id': video_id, 'client': client_name, - 'auth': bool(caption_client.get('_access_token')), + 'auth': _client.get('_has_auth', False), }, **caption_client ) @@ -1723,14 +1777,15 @@ def load_stream_info(self, video_id): elif default_lang['is_asr']: title.append(' [ASR]') - for _prop in ('multi_lang', 'multi_audio'): + localize = context.localize + for _prop in ('multi_language', 'multi_audio'): if not main_stream.get(_prop): continue _prop = 'stream.' + _prop - title.extend((' [', self._context.localize(_prop), ']')) + title.extend((' [', localize(_prop), ']')) if len(title) > 1: - yt_format['title'] = ''.join(yt_format['title']) + yt_format['title'] = ''.join(title) stream_list['9999'] = yt_format @@ -1753,11 +1808,12 @@ def load_stream_info(self, video_id): return stream_list.values() def _process_stream_data(self, stream_data, default_lang_code='und'): - _settings = self._context.get_settings() + context = self._context + settings = context.get_settings() audio_only = self._audio_only - qualities = _settings.mpd_video_qualities() - isa_capabilities = self._context.inputstream_adaptive_capabilities() - stream_features = _settings.stream_features() + qualities = settings.mpd_video_qualities() + isa_capabilities = context.inputstream_adaptive_capabilities() + stream_features = settings.stream_features() allow_hdr = 'hdr' in stream_features allow_hfr = 'hfr' in stream_features disable_hfr_max = 'no_hfr_max' in stream_features @@ -1765,7 +1821,8 @@ def _process_stream_data(self, stream_data, default_lang_code='und'): fps_map = (self.INTEGER_FPS_SCALE if 'no_frac_fr_hint' in stream_features else self.FRACTIONAL_FPS_SCALE) - stream_select = _settings.stream_select() + stream_select = settings.stream_select() + localize = context.localize audio_data = {} video_data = {} @@ -1801,12 +1858,15 @@ def _process_stream_data(self, stream_data, default_lang_code='und'): codec = re.match(r'codecs="([a-z0-9]+([.\-][0-9](?="))?)', codecs) if codec: codec = codec.group(1) - if codec.startswith(('vp9', 'vp09')): + if codec.startswith('vp9'): codec = 'vp9' + elif codec.startswith('vp09'): + codec = 'vp9.2' elif codec.startswith('dts'): codec = 'dts' - if codec not in stream_features or codec not in isa_capabilities: + if codec not in isa_capabilities: continue + preferred_codec = codec.split('.')[0] in stream_features media_type, container = mime_type.split('/') bitrate = stream.get('bitrate', 0) @@ -1830,18 +1890,26 @@ def _process_stream_data(self, stream_data, default_lang_code='und'): if role_type == 4 or audio_track.get('audioIsDefault'): role = 'main' - label = self._context.localize('stream.original') + label = localize('stream.original') elif role_type == 3: role = 'dub' - label = self._context.localize('stream.dubbed') + label = localize('stream.dubbed') elif role_type == 2: role = 'description' - label = self._context.localize('stream.descriptive') + label = localize('stream.descriptive') + # Secondary language track + elif role_type == 6: + role = 'alternate' + label = localize('stream.alternate') + # Auto-dubbed language track + elif role_type == 10: + role = 'dub' + label = localize('stream.dubbed') # Unsure of what other audio types are actually available # Role set to "alternate" as default fallback else: role = 'alternate' - label = self._context.localize('stream.alternate') + label = localize('stream.alternate') mime_group = ''.join(( mime_type, '_', language_code, '.', role_str, @@ -1861,12 +1929,12 @@ def _process_stream_data(self, stream_data, default_lang_code='und'): role = 'main' role_type = 4 role_str = '4' - label = self._context.localize('stream.original') + label = localize('stream.original') mime_group = mime_type sample_rate = int(stream.get('audioSampleRate', '0'), 10) height = width = fps = frame_rate = hdr = None - language = self._context.get_language_name(language_code) + language = context.get_language_name(language_code) label = '{0} ({1} kbps)'.format(label, bitrate // 1000) if channels > 2 or 'auto' not in stream_select: quality_group = ''.join(( @@ -1887,7 +1955,11 @@ def _process_stream_data(self, stream_data, default_lang_code='und'): if fps > 30 and not allow_hfr: continue - hdr = 'HDR' in stream.get('qualityLabel', '') + if 'colorInfo' in stream: + hdr = not any(value.endswith('BT709') + for value in stream['colorInfo'].values()) + else: + hdr = 'HDR' in stream.get('qualityLabel', '') if hdr and not allow_hdr: continue @@ -1946,18 +2018,15 @@ def _process_stream_data(self, stream_data, default_lang_code='und'): url = unquote(url) primary_url, secondary_url = self._process_url_params(url) - primary_url = (primary_url.replace("&", "&") - .replace('"', """) - .replace("<", "<") - .replace(">", ">")) details = { 'mimeType': mime_type, - 'baseUrl': primary_url, + 'baseUrl': entity_escape(primary_url), 'mediaType': media_type, 'container': container, 'codecs': codecs, 'codec': codec, + 'preferred_codec': preferred_codec, 'id': itag, 'width': width, 'height': height, @@ -1979,15 +2048,11 @@ def _process_stream_data(self, stream_data, default_lang_code='und'): 'channels': channels, } if secondary_url: - secondary_url = (secondary_url.replace("&", "&") - .replace('"', """) - .replace("<", "<") - .replace(">", ">")) - details['baseUrlSecondary'] = secondary_url + details['baseUrlSecondary'] = entity_escape(secondary_url) data[mime_group][itag] = data[quality_group][itag] = details if not video_data and not audio_only: - self._context.log_debug('Generate MPD: No video mime-types found') + context.log_debug('Generate MPD: No video mime-types found') return None, None def _stream_sort(stream): @@ -1995,11 +2060,13 @@ def _stream_sort(stream): return (1,) return ( + - stream['preferred_codec'], - stream['height'], - stream['fps'], - stream['hdr'], - stream['biasedBitrate'], ) if stream['mediaType'] == 'video' else ( + - stream['preferred_codec'], - stream['channels'], - stream['biasedBitrate'], ) @@ -2040,9 +2107,12 @@ def _generate_mpd_manifest(self, if not video_data or not audio_data: return None, None + context = self._context + log_error = context.log_error + if not self.BASE_PATH: - self._context.log_error('VideoInfo._generate_mpd_manifest - ' - 'unable to access temp directory') + log_error('StreamInfo._generate_mpd_manifest' + ' - Unable to access temp directory') return None, None def _filter_group(previous_group, previous_stream, item): @@ -2089,16 +2159,17 @@ def _filter_group(previous_group, previous_stream, item): ) return skip_group - _settings = self._context.get_settings() - stream_features = _settings.stream_features() + settings = context.get_settings() + stream_features = settings.stream_features() do_filter = 'filter' in stream_features frame_rate_hint = 'no_fr_hint' not in stream_features - stream_select = _settings.stream_select() + stream_select = settings.stream_select() + localize = context.localize main_stream = { 'audio': audio_data[0][1][0], 'multi_audio': False, - 'multi_lang': False, + 'multi_language': False, } if video_data: main_stream['video'] = video_data[0][1][0] @@ -2140,7 +2211,7 @@ def _filter_group(previous_group, previous_stream, item): if group.startswith(mime_type) and 'auto' in stream_select: label = '{0} [{1}]'.format( stream['langName'] - or self._context.localize('stream.automatic'), + or localize('stream.automatic'), stream['label'] ) if stream == main_stream[media_type]: @@ -2196,9 +2267,7 @@ def _filter_group(previous_group, previous_stream, item): )) if license_url: - license_url = (license_url.replace("&", "&") - .replace('"', """).replace("<", "<") - .replace(">", ">")) + license_url = entity_escape(license_url) output.extend(( '\t\t\t\n' '\t\t\t\n' ).format( - quality=(idx + 1), priority=(num_streams - idx), **stream - ) for idx, stream in enumerate(streams))) + quality=(idx + 1), + priority=(num_streams - idx), + **stream + ) for idx, stream in enumerate(streams)]) elif media_type == 'video': - output.extend((( + output.extend([( '\t\t\t\n' '\t\t\t\n' ).format( - quality=(idx + 1), priority=(num_streams - idx), **stream - ) for idx, stream in enumerate(streams))) + quality=(idx + 1), + priority=(num_streams - idx), + **stream + ) for idx, stream in enumerate(streams)]) output.append('\t\t\n') set_id += 1 if subs_data: - translation_lang = self._context.localize('subtitles.translation') + translation_lang = localize('subtitles.translation') for lang_id, subtitle in subs_data.items(): lang_code = subtitle['lang'] label = language = subtitle['language'] @@ -2283,11 +2356,7 @@ def _filter_group(previous_group, previous_stream, item): else: kind = lang_id - url = (unquote(subtitle['url']) - .replace("&", "&") - .replace('"', """) - .replace("<", "<") - .replace(">", ">")) + url = entity_escape(unquote(subtitle['url'])) output.extend(( '\t\t 1: - main_stream['multi_lang'] = True + main_stream['multi_language'] = True if roles.difference({'', 'main', 'dub'}): main_stream['multi_audio'] = True @@ -2332,19 +2401,19 @@ def _filter_group(previous_group, previous_stream, item): try: with xbmcvfs.File(filepath, 'w') as mpd_file: success = mpd_file.write(output) - except (IOError, OSError): - self._context.log_error('VideoInfo._generate_mpd_manifest - ' - 'file write failed for: {file}' - .format(file=filepath)) + except (IOError, OSError) as exc: + log_error('StreamInfo._generate_mpd_manifest' + ' - File write failed' + '\n\tException: {exc!r}' + '\n\tFile: {filepath}' + .format(exc=exc, filepath=filepath)) success = False if success: - address, port = get_connect_address(self._context) - return ''.join(( - 'http://', - address, - ':', - str(port), + return urlunsplit(( + 'http', + get_connect_address(context, as_netloc=True), PATHS.MPD, - filename, + urlencode({'file': filename}), + '', )), main_stream return None, None diff --git a/plugin.video.youtube/resources/lib/youtube_plugin/youtube/helper/subtitles.py b/plugin.video.youtube/resources/lib/youtube_plugin/youtube/helper/subtitles.py index 741ed0e479..c9dc8b47a5 100644 --- a/plugin.video.youtube/resources/lib/youtube_plugin/youtube/helper/subtitles.py +++ b/plugin.video.youtube/resources/lib/youtube_plugin/youtube/helper/subtitles.py @@ -18,7 +18,11 @@ urlsplit, xbmcvfs, ) -from ...kodion.constants import PLAY_PROMPT_SUBTITLES, TEMP_PATH +from ...kodion.constants import ( + TRANSLATION_LANGUAGES, + PLAY_PROMPT_SUBTITLES, + TEMP_PATH, +) from ...kodion.network import BaseRequestsClass from ...kodion.utils import make_dirs @@ -94,6 +98,7 @@ def load(self, captions, headers=None): self.renderer = captions.get('playerCaptionsTracklistRenderer', {}) self.caption_tracks = self.renderer.get('captionTracks', []) self.translation_langs = self.renderer.get('translationLanguages', []) + self.translation_langs.extend(TRANSLATION_LANGUAGES) try: default_audio = self.renderer.get('defaultAudioTrackIndex') @@ -161,7 +166,7 @@ def load(self, captions, headers=None): def _unescape(self, text): try: text = unescape(text) - except: + except Exception: self._context.log_error('Subtitles._unescape - failed: |{text}|' .format(text=text)) return text @@ -299,7 +304,8 @@ def _prompt(self): num_total = num_captions + num_translations if not num_total: - self._context.log_debug('No subtitles found for prompt') + self._context.log_debug('Subtitles._prompt' + ' - No subtitles found for prompt') else: translation_lang = self._context.localize('subtitles.translation') choice = self._context.get_ui().on_select( @@ -317,11 +323,13 @@ def _prompt(self): track_kind = 'translation' choice = translations[choice - num_captions] else: - self._context.log_debug('Subtitle selection cancelled') + self._context.log_debug('Subtitles._prompt' + ' - Subtitle selection cancelled') return None lang, language = choice - + self._context.log_debug('Subtitles._prompt - selected: |{lang}|' + .format(lang=lang)) url, mime_type = self._get_url(track=track, lang=lang) if url: return { @@ -335,8 +343,6 @@ def _prompt(self): 'url': url, }, } - self._context.log_debug('No subtitle found for selection: |{lang}|' - .format(lang=lang)) return None def _get_url(self, track, lang=None): @@ -362,19 +368,20 @@ def _get_url(self, track, lang=None): )) if not self.BASE_PATH: self._context.log_error('Subtitles._get_url' - ' - unable to access temp directory') + ' - Unable to access temp directory') return None, None filepath = os.path.join(self.BASE_PATH, filename) if xbmcvfs.exists(filepath): self._context.log_debug('Subtitles._get_url' - ' - use existing: |{lang}: {file}|' + ' - Use existing subtitle for: |{lang}|' + '\n\tFile: {file}' .format(lang=lang, file=filepath)) return filepath, self.FORMATS[sub_format]['mime_type'] base_url = self._normalize_url(track.get('baseUrl')) if not base_url: - self._context.log_error('Subtitles._get_url - no url for: |{lang}|' + self._context.log_error('Subtitles._get_url - no URL for: |{lang}|' .format(lang=lang)) return None, None @@ -385,7 +392,9 @@ def _get_url(self, track, lang=None): ('tlang', tlang) if tlang else (None, None), ) if not tlang: - self._context.log_debug('Subtitles._get_url: |{lang}: {url}|' + self._context.log_debug('Subtitles._get_url' + ' - found new subtitle for: |{lang}|' + '\n\tURL: {url}' .format(lang=lang, url=subtitle_url)) if not download: @@ -394,7 +403,8 @@ def _get_url(self, track, lang=None): response = BaseRequestsClass(context=self._context).request( subtitle_url, headers=self.headers, - error_info=('Subtitles._get_url - GET failed for: {lang}: {{exc}}' + error_info=('Subtitles._get_url - GET failed for: |{lang}|' + '\n\tException: {{exc!r}}' .format(lang=lang)) ) response = response and response.text @@ -409,8 +419,9 @@ def _get_url(self, track, lang=None): success = sub_file.write(output) except (IOError, OSError): self._context.log_error('Subtitles._get_url' - ' - write failed for: {file}' - .format(file=filepath)) + ' - write failed for: |{lang}|' + '\n\tFile: {file}' + .format(lang=lang, file=filepath)) if success: return filepath, self.FORMATS[sub_format]['mime_type'] return None, None @@ -466,7 +477,8 @@ def _get_track(self, if sel_track: return sel_track, sel_lang, sel_language, sel_kind - self._context.log_debug('Subtitles._get - no subtitle for: |{lang}|' + self._context.log_debug('Subtitles._get_track' + ' - no subtitle for: |{lang}|' .format(lang=lang)) return None, None, None, None diff --git a/plugin.video.youtube/resources/lib/youtube_plugin/youtube/helper/tv.py b/plugin.video.youtube/resources/lib/youtube_plugin/youtube/helper/tv.py index 4dde234fd4..85e90f3f78 100644 --- a/plugin.video.youtube/resources/lib/youtube_plugin/youtube/helper/tv.py +++ b/plugin.video.youtube/resources/lib/youtube_plugin/youtube/helper/tv.py @@ -16,35 +16,34 @@ def tv_videos_to_items(provider, context, json_data): - incognito = context.get_param('incognito') - settings = context.get_settings() - use_play_data = not incognito and settings.use_local_history() - item_filter = settings.item_filter() - item_params = { 'video_id': None, } - if incognito: + if context.get_param('incognito'): item_params['incognito'] = True + video_id_dict = {} - channel_item_dict = {} + channel_items_dict = {} + for item in json_data.get('items', []): video_id = item['id'] item_params['video_id'] = video_id - video_item = VideoItem( - item['title'], context.create_uri((PATHS.PLAY,), item_params) + video_id_dict[video_id] = VideoItem( + name=item['title'], + uri=context.create_uri((PATHS.PLAY,), item_params), + video_id=video_id, ) - if incognito: - video_item.set_play_count(0) - video_id_dict[video_id] = video_item - - utils.update_video_infos(provider, - context, - video_id_dict, - channel_items_dict=channel_item_dict, - use_play_data=use_play_data, - item_filter=item_filter) - utils.update_fanarts(provider, context, channel_item_dict) + + item_filter = context.get_settings().item_filter() + + utils.update_video_infos( + provider, + context, + video_id_dict, + channel_items_dict=channel_items_dict, + item_filter=item_filter, + ) + utils.update_fanarts(provider, context, channel_items_dict) if item_filter: result = utils.filter_videos(video_id_dict.values(), **item_filter) @@ -80,7 +79,7 @@ def saved_playlists_to_items(provider, context, json_data): title = item['title'] channel_id = item['channel_id'] playlist_id = item['id'] - image = utils.get_thumbnail(thumb_size, item.get('thumbnails', {})) + image = utils.get_thumbnail(thumb_size, item.get('thumbnails')) if channel_id: item_uri = context.create_uri( @@ -93,7 +92,12 @@ def saved_playlists_to_items(provider, context, json_data): item_params, ) - playlist_item = DirectoryItem(title, item_uri, image=image) + playlist_item = DirectoryItem( + name=title, + uri=item_uri, + image=image, + playlist_id=playlist_id, + ) result.append(playlist_item) playlist_id_dict[playlist_id] = playlist_item diff --git a/plugin.video.youtube/resources/lib/youtube_plugin/youtube/helper/url_resolver.py b/plugin.video.youtube/resources/lib/youtube_plugin/youtube/helper/url_resolver.py index 96fe526e89..fed6464630 100644 --- a/plugin.video.youtube/resources/lib/youtube_plugin/youtube/helper/url_resolver.py +++ b/plugin.video.youtube/resources/lib/youtube_plugin/youtube/helper/url_resolver.py @@ -169,6 +169,17 @@ def resolve(self, url, url_components, method='HEAD'): }) return url_components._replace(query=urlencode(params)).geturl() + elif path == '/watch_videos': + params = dict(parse_qsl(url_components.query)) + new_components = urlsplit(response.url) + new_params = dict(parse_qsl(new_components.query)) + # add/overwrite all other params from original query string + new_params.update(params) + # build new URL from these components + return new_components._replace( + query=urlencode(new_params) + ).geturl() + # we try to extract the channel id from the html content # With the channel id we can construct a URL we already work with # https://www.youtube.com/channel/ diff --git a/plugin.video.youtube/resources/lib/youtube_plugin/youtube/helper/url_to_item_converter.py b/plugin.video.youtube/resources/lib/youtube_plugin/youtube/helper/url_to_item_converter.py index 7377206077..8dc19b7eb3 100644 --- a/plugin.video.youtube/resources/lib/youtube_plugin/youtube/helper/url_to_item_converter.py +++ b/plugin.video.youtube/resources/lib/youtube_plugin/youtube/helper/url_to_item_converter.py @@ -60,6 +60,7 @@ def add_url(self, url, context): ('v', 'video_id', False), ('live', 'live', False), ('clip', 'clip', False), + ('video_ids', 'video_ids', False), ) if old in url_params } @@ -82,27 +83,45 @@ def add_url(self, url, context): )) return - if 'video_id' in new_params: + item = None + + if 'video_ids' in new_params: + for video_id in new_params['video_ids'].split(','): + item = VideoItem( + name='', + uri=context.create_uri( + (PATHS.PLAY,), + dict(new_params, video_id=video_id), + ), + video_id=video_id, + ) + self._video_id_dict[video_id] = item + + elif 'video_id' in new_params: video_id = new_params['video_id'] - video_item = VideoItem( - '', context.create_uri((PATHS.PLAY,), new_params) + item = VideoItem( + name='', + uri=context.create_uri((PATHS.PLAY,), new_params), + video_id=video_id, ) - self._video_id_dict[video_id] = video_item + self._video_id_dict[video_id] = item - elif 'playlist_id' in new_params: + if 'playlist_id' in new_params: playlist_id = new_params['playlist_id'] if self._flatten: self._playlist_ids.append(playlist_id) return - playlist_item = DirectoryItem( - '', context.create_uri(('playlist', playlist_id,), new_params), + item = DirectoryItem( + name='', + uri=context.create_uri(('playlist', playlist_id,), new_params), + playlist_id=playlist_id, ) - self._playlist_id_dict[playlist_id] = playlist_item + self._playlist_id_dict[playlist_id] = item - elif 'channel_id' in new_params: + if 'channel_id' in new_params: channel_id = new_params['channel_id'] live = new_params.get('live') @@ -110,14 +129,18 @@ def add_url(self, url, context): self._channel_ids.append(channel_id) return - channel_item = VideoItem( - '', context.create_uri((PATHS.PLAY,), new_params) + item = VideoItem( + name='', + uri=context.create_uri((PATHS.PLAY,), new_params), + channel_id=channel_id, ) if live else DirectoryItem( - '', context.create_uri(('channel', channel_id,), new_params) + name='', + uri=context.create_uri(('channel', channel_id,), new_params), + channel_id=channel_id, ) - self._channel_id_dict[channel_id] = channel_item + self._channel_id_dict[channel_id] = item - else: + if not item: context.log_debug('No items found in url "{0}"'.format(url)) def add_urls(self, urls, context): @@ -140,7 +163,7 @@ def get_items(self, provider, context, skip_title=False): 'channel_ids': ','.join(self._channel_ids), }, ), - image='{media}/playlist.png', + image='{media}/channels.png', category_label=item_label, ) result.append(channels_item) @@ -155,8 +178,7 @@ def get_items(self, provider, context, skip_title=False): (PATHS.PLAY,), { 'playlist_ids': ','.join(self._playlist_ids), - 'play': True, - 'order': 'default', + 'order': 'normal', }, ), playable=True, @@ -191,12 +213,13 @@ def get_video_items(self, provider, context, skip_title=False): if self._video_items: return self._video_items - use_play_data = not context.get_param('incognito', False) - channel_id_dict = {} - utils.update_video_infos(provider, context, self._video_id_dict, - channel_items_dict=channel_id_dict, - use_play_data=use_play_data) + utils.update_video_infos( + provider, + context, + self._video_id_dict, + channel_items_dict=channel_id_dict, + ) utils.update_fanarts(provider, context, channel_id_dict) self._video_items = [ diff --git a/plugin.video.youtube/resources/lib/youtube_plugin/youtube/helper/utils.py b/plugin.video.youtube/resources/lib/youtube_plugin/youtube/helper/utils.py index b492a07ded..40cc1e1f1f 100644 --- a/plugin.video.youtube/resources/lib/youtube_plugin/youtube/helper/utils.py +++ b/plugin.video.youtube/resources/lib/youtube_plugin/youtube/helper/utils.py @@ -15,7 +15,7 @@ from math import log10 from ...kodion.constants import CONTENT, LICENSE_TOKEN, LICENSE_URL, PATHS -from ...kodion.items import AudioItem, DirectoryItem, menu_items +from ...kodion.items import AudioItem, CommandItem, DirectoryItem, menu_items from ...kodion.utils import ( datetime_parser, friendly_number, @@ -23,11 +23,6 @@ ) -try: - from inputstreamhelper import Helper as ISHelper -except ImportError: - ISHelper = None - __RE_PLAYLIST = re.compile( r'^(/channel/(?P[^/]+))/playlist/(?P[^/]+)/?$' ) @@ -118,7 +113,10 @@ def make_comment_item(context, snippet, uri, total_replies=0): ui.new_line(body, cr_before=2), )) - comment_item = DirectoryItem(label, uri, plot=plot, action=(not uri)) + if uri: + comment_item = DirectoryItem(label, uri, plot=plot) + else: + comment_item = CommandItem(label, 'Action(Info)', context, plot=plot) datetime = datetime_parser.parse(published_at) comment_item.set_added_utc(datetime) @@ -152,9 +150,18 @@ def update_channel_infos(provider, context, channel_id_dict, if subscription_id_dict is None: subscription_id_dict = {} - settings = context.get_settings() logged_in = provider.is_logged_in() + + settings = context.get_settings() + channel_name_aliases = settings.get_channel_name_aliases() + show_details = settings.show_detailed_description() + + localize = context.localize + channel_role = localize('channel') + untitled = localize('untitled') + path = context.get_path() + ui = context.get_ui() filter_list = None if path.startswith(PATHS.SUBSCRIPTIONS): @@ -184,12 +191,73 @@ def update_channel_infos(provider, context, channel_id_dict, channel_item = channel_id_dict[channel_id] - # title - title = snippet['title'] - channel_item.set_name(title) + label_stats = [] + stats = [] + if 'statistics' in yt_item: + for stat, value in yt_item['statistics'].items(): + label = context.LOCAL_MAP.get('stats.' + stat) + if not label: + continue + + str_value, value = friendly_number(value, as_str=False) + if not value: + continue + + color = settings.get_label_color(stat) + label = localize(label) + if value == 1: + label = label.rstrip('s') + + label_stats.append(ui.color(color, str_value)) + stats.append(ui.color(color, ui.bold(' '.join(( + str_value, label + ))))) + + label_stats = ' | '.join(label_stats) + stats = ' | '.join(stats) + + # Used for label2, but is poorly supported in skins + channel_item.set_short_details(label_stats) + # Hack to force a custom label mask containing production code, + # activated on sort order selection, to display details + # Refer XbmcContext.set_content for usage + channel_item.set_production_code(label_stats) + + # channel name and title + localised_info = snippet.get('localized') or {} + channel_name = (localised_info.get('title') + or snippet.get('title') + or untitled) + channel_item.set_name(channel_name) + channel_item.add_artist(channel_name) + if 'cast' in channel_name_aliases: + channel_item.add_cast(channel_name, role=channel_role) + if 'studio' in channel_name_aliases: + channel_item.add_studio(channel_name) + + # plot + description = strip_html_from_text(localised_info.get('description') + or snippet.get('description') + or '') + if show_details: + description = ''.join(( + ui.bold(channel_name, cr_after=1), + ui.new_line(stats, cr_after=1) if stats else '', + ui.new_line(description, cr_after=1) if description else '', + 'https://youtu.be/channel' + channel_id, + )) + channel_item.set_plot(description) + + # date time + published_at = snippet.get('publishedAt') + if published_at: + datetime = datetime_parser.parse(published_at) + channel_item.set_added_utc(datetime) + local_datetime = datetime_parser.utc_to_local(datetime) + channel_item.set_date_from_datetime(local_datetime) # image - image = get_thumbnail(thumb_size, snippet.get('thumbnails', {})) + image = get_thumbnail(thumb_size, snippet.get('thumbnails')) channel_item.set_image(image) # - update context menu @@ -215,13 +283,13 @@ def update_channel_infos(provider, context, channel_id_dict, # add/remove from filter list if in_subscription_list and filter_list is not None: - channel = title.lower().replace(',', '') + channel = channel_name.lower().replace(',', '') context_menu.append( menu_items.remove_my_subscriptions_filter( - context, title + context, channel_name ) if channel in filter_list else menu_items.add_my_subscriptions_filter( - context, title + context, channel_name ) ) @@ -233,7 +301,6 @@ def update_channel_infos(provider, context, channel_id_dict, ) if context_menu: - context_menu.append(menu_items.separator()) channel_item.add_context_menu(context_menu) # update channel mapping @@ -261,8 +328,23 @@ def update_playlist_infos(provider, context, playlist_id_dict, custom_watch_later_id = access_manager.get_watch_later_id() custom_history_id = access_manager.get_watch_history_id() logged_in = provider.is_logged_in() + + settings = context.get_settings() + thumb_size = settings.get_thumbnail_size() + channel_name_aliases = settings.get_channel_name_aliases() + show_details = settings.show_detailed_description() + item_count_color = settings.get_label_color('itemCount') + + localize = context.localize + channel_role = localize('channel') + episode_count_label = localize('stats.itemCount') + video_count_label = localize('stats.videoCount') + podcast_label = context.localize('playlist.podcast') + untitled = localize('untitled') + separator = menu_items.separator() + path = context.get_path() - thumb_size = context.get_settings().get_thumbnail_size() + ui = context.get_ui() # if the path directs to a playlist of our own, set channel id to 'mine' if path.startswith(PATHS.MY_PLAYLISTS): @@ -282,20 +364,91 @@ def update_playlist_infos(provider, context, playlist_id_dict, playlist_item = playlist_id_dict[playlist_id] - title = snippet['title'] + is_podcast = yt_item.get('status', {}).get('podcastStatus') == 'enabled' + item_count_str, item_count = friendly_number( + yt_item.get('contentDetails', {}).get('itemCount', 0), + as_str=False, + ) + count_label = episode_count_label if is_podcast else video_count_label + + label_details = ' | '.join([item for item in ( + ui.bold('((○))') if is_podcast else '', + ui.color(item_count_color, item_count_str), + ) if item]) + + # Used for label2, but is poorly supported in skins + playlist_item.set_short_details(label_details) + # Hack to force a custom label mask containing production code, + # activated on sort order selection, to display details + # Refer XbmcContext.set_content for usage + playlist_item.set_production_code(label_details) + + # title + localised_info = snippet.get('localized') or {} + title = localised_info.get('title') or snippet.get('title') or untitled playlist_item.set_name(title) - image = get_thumbnail(thumb_size, snippet.get('thumbnails', {})) + # channel name + channel_name = snippet.get('channelTitle') or untitled + playlist_item.add_artist(channel_name) + if 'cast' in channel_name_aliases: + playlist_item.add_cast(channel_name, role=channel_role) + if 'studio' in channel_name_aliases: + playlist_item.add_studio(channel_name) + + # plot with channel name, podcast status and item count + description = strip_html_from_text(localised_info.get('description') + or snippet.get('description') + or '') + if show_details: + description = ''.join(( + ui.bold(channel_name, cr_after=1), + ui.bold(podcast_label) if is_podcast else '', + ' | ' if is_podcast else '', + ui.color( + item_count_color, + ui.bold(' '.join((item_count_str, + count_label.rstrip('s') + if item_count == 1 else + count_label))), + cr_after=1, + ), + ui.new_line(description, cr_after=1) if description else '', + 'https://youtu.be/playlist?list=' + playlist_id, + )) + playlist_item.set_plot(description) + + # date time + published_at = snippet.get('publishedAt') + if published_at: + datetime = datetime_parser.parse(published_at) + playlist_item.set_added_utc(datetime) + local_datetime = datetime_parser.utc_to_local(datetime) + playlist_item.set_date_from_datetime(local_datetime) + + image = get_thumbnail(thumb_size, snippet.get('thumbnails')) playlist_item.set_image(image) - channel_id = 'mine' if in_my_playlists else snippet['channelId'] - channel_name = snippet.get('channelTitle', '') + # update channel mapping + channel_id = snippet.get('channelId', '') + playlist_item.channel_id = channel_id + if channel_id and channel_items_dict is not None: + if channel_id not in channel_items_dict: + channel_items_dict[channel_id] = [] + channel_items_dict[channel_id].append(playlist_item) # play all videos of the playlist context_menu = [ - menu_items.play_all_from_playlist( + menu_items.play_playlist( + context, playlist_id + ), + menu_items.view_playlist( context, playlist_id ), + menu_items.shuffle_playlist( + context, playlist_id + ), + separator, menu_items.bookmark_add( context, playlist_item ) if not in_bookmarks_list and channel_id != 'mine' else None, @@ -346,7 +499,6 @@ def update_playlist_infos(provider, context, playlist_id_dict, ) if context_menu: - context_menu.append(menu_items.separator()) playlist_item.add_context_menu(context_menu) # update channel mapping @@ -360,7 +512,6 @@ def update_video_infos(provider, context, video_id_dict, playlist_item_id_dict=None, channel_items_dict=None, live_details=True, - use_play_data=True, item_filter=None, data=None): video_ids = list(video_id_dict) @@ -385,7 +536,6 @@ def update_video_infos(provider, context, video_id_dict, else: watch_later_id = None - localize = context.localize settings = context.get_settings() alternate_player = settings.support_alternative_player() default_web_urls = settings.default_player_web_urls() @@ -396,8 +546,10 @@ def update_video_infos(provider, context, video_id_dict, subtitles_prompt = settings.get_subtitle_selection() == 1 thumb_size = settings.get_thumbnail_size() thumb_stamp = get_thumb_timestamp() + use_play_data = settings.use_local_history() - channel_role = localize(19029) + localize = context.localize + channel_role = localize('channel') untitled = localize('untitled') path = context.get_path() @@ -425,14 +577,23 @@ def update_video_infos(provider, context, video_id_dict, playlist_match = __RE_PLAYLIST.match(path) for video_id, yt_item in data.items(): - if not yt_item or 'snippet' not in yt_item: + if not yt_item: + continue + + media_item = video_id_dict.get(video_id) + if not media_item: + continue + + if 'snippet' not in yt_item: + if yt_item.get('_unavailable'): + media_item.playable = False + media_item.available = False continue snippet = yt_item['snippet'] - media_item = video_id_dict[video_id] media_item.set_mediatype( CONTENT.AUDIO_TYPE - if audio_only or isinstance(media_item, AudioItem) else + if isinstance(media_item, AudioItem) else CONTENT.VIDEO_TYPE ) @@ -496,7 +657,11 @@ def update_video_infos(provider, context, video_id_dict, ): continue - if not media_item.live and play_data: + if media_item.live: + media_item.set_play_count(0) + use_play_data = False + play_data = None + elif play_data: if 'play_count' in play_data: media_item.set_play_count(play_data['play_count']) @@ -508,8 +673,6 @@ def update_video_infos(provider, context, video_id_dict, if 'last_played' in play_data: media_item.set_last_played(play_data['last_played']) - elif media_item.live: - media_item.set_play_count(0) if start_at: datetime = datetime_parser.parse(start_at) @@ -527,7 +690,7 @@ def update_video_infos(provider, context, video_id_dict, elif media_item.live: type_label = localize('live') else: - type_label = localize(335) # "Start" + type_label = localize('start') start_at = ' '.join(( type_label, datetime_parser.get_scheduled_start(context, local_datetime), @@ -582,9 +745,12 @@ def update_video_infos(provider, context, video_id_dict, media_item.set_production_code(label_stats) # update and set the title + localised_info = snippet.get('localized') or {} title = media_item.get_title() if not title or title == untitled: - title = snippet.get('title') or untitled + title = (localised_info.get('title') + or snippet.get('title') + or untitled) media_item.set_title(ui.italic(title) if media_item.upcoming else title) """ @@ -614,7 +780,7 @@ def update_video_infos(provider, context, video_id_dict, break # channel name - channel_name = snippet.get('channelTitle', '') + channel_name = snippet.get('channelTitle', '') or untitled media_item.add_artist(channel_name) if 'cast' in channel_name_aliases: media_item.add_cast(channel_name, role=channel_role) @@ -622,15 +788,17 @@ def update_video_infos(provider, context, video_id_dict, media_item.add_studio(channel_name) # plot - description = strip_html_from_text(snippet['description']) + description = strip_html_from_text(localised_info.get('description') + or snippet.get('description') + or '') if show_details: description = ''.join(( - ui.bold(channel_name, cr_after=1) if channel_name else '', + ui.bold(channel_name, cr_after=1), ui.new_line(stats, cr_after=1) if stats else '', (ui.italic(start_at, cr_after=1) if media_item.upcoming else ui.new_line(start_at, cr_after=1)) if start_at else '', - description, - ui.new_line('https://youtu.be/' + video_id, cr_before=1) + ui.new_line(description, cr_after=1) if description else '', + 'https://youtu.be/' + video_id, )) media_item.set_plot(description) @@ -649,8 +817,8 @@ def update_video_infos(provider, context, video_id_dict, # try to find a better resolution for the image image = media_item.get_image() - if not image: - image = get_thumbnail(thumb_size, snippet.get('thumbnails', {})) + if not image or image.startswith('Default'): + image = get_thumbnail(thumb_size, snippet.get('thumbnails')) if image.endswith('_live.jpg'): image = ''.join((image, '?ct=', thumb_stamp)) media_item.set_image(image) @@ -682,12 +850,12 @@ def update_video_infos(provider, context, video_id_dict, playlist_channel_id = playlist_match.group('channel_id') context_menu.extend(( - menu_items.play_all_from_playlist( + menu_items.play_playlist_from( context, playlist_id, video_id ), - menu_items.play_all_from_playlist( + menu_items.play_playlist( context, playlist_id - ) + ), )) # add 'Watch Later' only if we are not in my 'Watch Later' list @@ -755,7 +923,7 @@ def update_video_infos(provider, context, video_id_dict, context_menu.append( # remove bookmarked channel of the video menu_items.bookmark_remove( - context, item_id=channel_id + context, channel_id, channel_name ) if in_my_subscriptions_list else # bookmark channel of the video menu_items.bookmark_add_channel( @@ -763,18 +931,17 @@ def update_video_infos(provider, context, video_id_dict, ) ) - if not media_item.live and play_data: + if use_play_data: context_menu.append( menu_items.history_mark_unwatched( context, video_id - ) if play_data.get('play_count') else + ) if play_data and play_data.get('play_count') else menu_items.history_mark_watched( context, video_id ) ) - - if (play_data.get('played_percent', 0) > 0 - or play_data.get('played_time', 0) > 0): + if play_data and (play_data.get('played_percent', 0) > 0 + or play_data.get('played_time', 0) > 0): context_menu.append( menu_items.history_reset_resume( context, video_id @@ -825,17 +992,11 @@ def update_video_infos(provider, context, video_id_dict, ) if context_menu: - context_menu.append(menu_items.separator()) media_item.add_context_menu(context_menu) -def update_play_info(provider, context, video_id, media_item, video_stream, - use_play_data=True): - media_item.video_id = video_id - update_video_infos(provider, - context, - {video_id: media_item}, - use_play_data=use_play_data) +def update_play_info(provider, context, video_id, media_item, video_stream): + update_video_infos(provider, context, {video_id: media_item}) settings = context.get_settings() ui = context.get_ui() @@ -845,7 +1006,7 @@ def update_play_info(provider, context, video_id, media_item, video_stream, media_item.live = meta_data.get('status', {}).get('live', False) media_item.set_subtitles(meta_data.get('subtitles', None)) image = get_thumbnail(settings.get_thumbnail_size(), - meta_data.get('thumbnails', {})) + meta_data.get('thumbnails')) if image: if media_item.live: image = ''.join((image, '?ct=', get_thumb_timestamp())) @@ -855,24 +1016,34 @@ def update_play_info(provider, context, video_id, media_item, video_stream, media_item.set_headers(video_stream['headers']) # set _uses_isa - if media_item.live: - media_item.set_isa(settings.use_isa_live_streams()) - elif media_item.use_hls() or media_item.use_mpd(): - media_item.set_isa(settings.use_isa()) + if media_item.use_hls() or media_item.use_mpd(): + if media_item.live: + use_isa = settings.use_isa_live_streams() + else: + use_isa = settings.use_isa() + else: + use_isa = False + media_item.set_isa(use_isa) - if media_item.use_isa(): + if use_isa: license_info = video_stream.get('license_info', {}) - license_proxy = license_info.get('proxy', '') - license_url = license_info.get('url', '') - license_token = license_info.get('token', '') + license_proxy = license_info.get('proxy') + license_url = license_info.get('url') + license_token = license_info.get('token') + + if license_proxy and license_url and license_token: + try: + from inputstreamhelper import Helper - if ISHelper and license_proxy and license_url and license_token: - ISHelper('mpd' if media_item.use_mpd() else 'hls', - drm='com.widevine.alpha').check_inputstream() + is_helper = Helper('mpd' if media_item.use_mpd() else 'hls', + drm='com.widevine.alpha') + except ImportError: + is_helper = None - media_item.set_license_key(license_proxy) - ui.set_property(LICENSE_URL, license_url) - ui.set_property(LICENSE_TOKEN, license_token) + if is_helper and is_helper.check_inputstream(): + media_item.set_license_key(license_proxy) + ui.set_property(LICENSE_URL, license_url) + ui.set_property(LICENSE_TOKEN, license_token) def update_fanarts(provider, context, channel_items_dict, data=None): @@ -1020,13 +1191,13 @@ def get_shelf_index_by_title(context, json_data, shelf_title): def add_related_video_to_playlist(provider, context, client, v3, video_id): - playlist = context.get_video_playlist() + playlist_player = context.get_playlist_player() - if playlist.size() <= 999: + if playlist_player.size() <= 999: a = 0 add_item = None page_token = '' - playlist_items = playlist.get_items() + playlist_items = playlist_player.get_items() while not add_item and a <= 2: a += 1 @@ -1041,7 +1212,7 @@ def add_related_video_to_playlist(provider, context, client, v3, video_id): json_data, process_next_page=False) page_token = json_data.get('nextPageToken', '') - except: + except Exception: context.get_ui().show_notification('Failed to add a suggested video.', time_ms=5000) if result_items: @@ -1056,7 +1227,7 @@ def add_related_video_to_playlist(provider, context, client, v3, video_id): continue if add_item: - playlist.add(add_item) + playlist_player.add(add_item) break if not page_token: @@ -1075,7 +1246,7 @@ def filter_videos(items, return [ item for item in items - if (not item.playable or ( + if ((item.callback and item.callback(item)) or not item.playable or ( (completed and item.completed) or (live and item.live and not item.upcoming) or (premieres and upcoming and item.upcoming and not item.live) diff --git a/plugin.video.youtube/resources/lib/youtube_plugin/youtube/helper/v3.py b/plugin.video.youtube/resources/lib/youtube_plugin/youtube/helper/v3.py index 9313de34f7..0cf27f06f3 100644 --- a/plugin.video.youtube/resources/lib/youtube_plugin/youtube/helper/v3.py +++ b/plugin.video.youtube/resources/lib/youtube_plugin/youtube/helper/v3.py @@ -24,22 +24,25 @@ ) from ...kodion import KodionException from ...kodion.constants import PATHS -from ...kodion.items import CommandItem, DirectoryItem, NextPageItem, VideoItem +from ...kodion.items import ( + CommandItem, + DirectoryItem, + NextPageItem, + VideoItem, + menu_items, +) +from ...kodion.utils import strip_html_from_text -def _process_list_response(provider, context, json_data, item_filter): +def _process_list_response(provider, + context, + json_data, + item_filter=None, + progress_dialog=None): yt_items = json_data.get('items', []) if not yt_items: context.log_warning('v3 response: Items list is empty') - return [ - CommandItem( - context.localize('page.back'), - 'Action(ParentDir)', - context, - image='DefaultFolderBack.png', - plot=context.localize('page.empty'), - ) - ] + return None video_id_dict = {} channel_id_dict = {} @@ -47,20 +50,18 @@ def _process_list_response(provider, context, json_data, item_filter): playlist_item_id_dict = {} subscription_id_dict = {} - result = [] + items = [] + do_callbacks = False new_params = {} params = context.get_params() - incognito = params.get('incognito', False) - if incognito: - new_params['incognito'] = incognito + if params.get('incognito'): + new_params['incognito'] = True addon_id = params.get('addon_id', '') if addon_id: new_params['addon_id'] = addon_id settings = context.get_settings() - use_play_data = not incognito and settings.use_local_history() - thumb_size = settings.get_thumbnail_size() fanart_type = params.get('fanart_type') if fanart_type is None: @@ -69,6 +70,13 @@ def _process_list_response(provider, context, json_data, item_filter): fanart_type = settings.get_thumbnail_size(settings.THUMB_SIZE_BEST) else: fanart_type = False + untitled = context.localize('untitled') + + if progress_dialog: + total = len(yt_items) + progress_dialog.reset_total(new_total=total, + current=0, + total=total) for yt_item in yt_items: kind, is_youtube, is_plugin, kind_type = _parse_kind(yt_item) @@ -82,10 +90,17 @@ def _process_list_response(provider, context, json_data, item_filter): if is_youtube: item_id = yt_item.get('id') snippet = yt_item.get('snippet', {}) - title = snippet.get('title', context.localize('untitled')) + + localised_info = snippet.get('localized') or {} + title = (localised_info.get('title') + or snippet.get('title') + or untitled) + description = strip_html_from_text(localised_info.get('description') + or snippet.get('description') + or '') thumbnails = snippet.get('thumbnails') - if not thumbnails and yt_item.get('_partial'): + if not thumbnails: thumbnails = { thumb_type: { 'url': thumb['url'].format(item_id, ''), @@ -110,7 +125,18 @@ def _process_list_response(provider, context, json_data, item_filter): item_id = item_id['channelId'] else: item_id = None - if not item_id: + if item_id: + yt_item['_context_menu'] = { + 'context_menu': ( + menu_items.search_sort_by(context, params, 'relevance'), + menu_items.search_sort_by(context, params, 'date'), + menu_items.search_sort_by(context, params, 'viewCount'), + menu_items.search_sort_by(context, params, 'rating'), + menu_items.search_sort_by(context, params, 'title'), + ), + 'position': 0, + } + else: context.log_debug('v3 searchResult discarded: |%s|' % kind) continue @@ -120,7 +146,12 @@ def _process_list_response(provider, context, json_data, item_filter): (PATHS.PLAY,), item_params, ) - item = VideoItem(title, item_uri, image=image, fanart=fanart) + item = VideoItem(title, + item_uri, + image=image, + fanart=fanart, + plot=description, + video_id=item_id) video_id_dict[item_id] = item elif kind_type == 'channel': @@ -132,6 +163,7 @@ def _process_list_response(provider, context, json_data, item_filter): item_uri, image=image, fanart=fanart, + plot=description, channel_id=item_id) channel_id_dict[item_id] = item @@ -141,7 +173,11 @@ def _process_list_response(provider, context, json_data, item_filter): ('special', 'browse_channels'), item_params, ) - item = DirectoryItem(title, item_uri) + item = DirectoryItem(title, + item_uri, + image=image, + fanart=fanart, + plot=description) elif kind_type == 'subscription': subscription_id = item_id @@ -157,6 +193,7 @@ def _process_list_response(provider, context, json_data, item_filter): item_uri, image=image, fanart=fanart, + plot=description, channel_id=item_id, subscription_id=subscription_id) channel_id_dict[item_id] = item @@ -182,22 +219,29 @@ def _process_list_response(provider, context, json_data, item_filter): item_uri, image=image, fanart=fanart, + plot=description, channel_id=channel_id, playlist_id=item_id) playlist_id_dict[item_id] = item elif kind_type == 'playlistitem': - playlistitem_id = item_id + playlist_item_id = item_id item_id = snippet['resourceId']['videoId'] # store the id of the playlistItem - needed for deleting item - playlist_item_id_dict[item_id] = playlistitem_id + playlist_item_id_dict[item_id] = playlist_item_id item_params['video_id'] = item_id item_uri = context.create_uri( (PATHS.PLAY,), item_params, ) - item = VideoItem(title, item_uri, image=image, fanart=fanart) + item = VideoItem(title, + item_uri, + image=image, + fanart=fanart, + plot=description, + video_id=item_id, + playlist_item_id=playlist_item_id) video_id_dict[item_id] = item elif kind_type == 'activity': @@ -215,7 +259,12 @@ def _process_list_response(provider, context, json_data, item_filter): (PATHS.PLAY,), item_params, ) - item = VideoItem(title, item_uri, image=image, fanart=fanart) + item = VideoItem(title, + item_uri, + image=image, + fanart=fanart, + plot=description, + video_id=item_id) video_id_dict[item_id] = item elif kind_type == 'commentthread': @@ -250,18 +299,18 @@ def _process_list_response(provider, context, json_data, item_filter): item.add_context_menu(**yt_item['_context_menu']) if isinstance(item, VideoItem): - item.video_id = item_id - if incognito: - item.set_play_count(0) # Set track number from playlist, or set to current list length to # match "Default" (unsorted) sort order - position = snippet.get('position') or len(result) + position = snippet.get('position') or len(items) item.set_track_number(position + 1) if '_callback' in yt_item: - yt_item['_callback'](item) + item.callback = yt_item['_callback'] + do_callbacks = True - result.append(item) + items.append(item) + if progress_dialog: + progress_dialog.update(current=len(items)) # this will also update the channel_id_dict with the correct channel_id # for each video. @@ -289,7 +338,6 @@ def _process_list_response(provider, context, json_data, item_filter): 'upd_kwargs': { 'data': None, 'live_details': True, - 'use_play_data': use_play_data, 'item_filter': item_filter, }, 'complete': False, @@ -380,6 +428,12 @@ def _fetch(resource): completed = [] iterator = iter(resources) threads['loop'].set() + + if progress_dialog: + progress_dialog.reset_total(new_total=remaining, + current=0, + total=remaining) + while threads['loop'].wait(): try: resource_id = next(iterator) @@ -398,6 +452,8 @@ def _fetch(resource): if resource['complete']: remaining -= 1 completed.append(resource_id) + if progress_dialog: + progress_dialog.update(current=len(completed)) continue defer = resource['defer'] @@ -420,7 +476,7 @@ def _fetch(resource): resource['thread'] = new_thread new_thread.start() - return result + return items, do_callbacks _KNOWN_RESPONSE_KINDS = { @@ -445,29 +501,45 @@ def response_to_items(provider, sort=None, reverse=False, process_next_page=True, - item_filter=None): + item_filter=None, + progress_dialog=None): kind, is_youtube, is_plugin, kind_type = _parse_kind(json_data) if not is_youtube and not is_plugin: context.log_debug('v3 response discarded: |%s|' % kind) return [] + params = context.get_params() + if kind_type in _KNOWN_RESPONSE_KINDS: - item_filter = context.get_settings().item_filter(item_filter) + item_filter = context.get_settings().item_filter( + update=item_filter, + override=params.get('item_filter'), + ) result = _process_list_response( - provider, context, json_data, item_filter + provider, + context, + json_data, + item_filter=item_filter, + progress_dialog=progress_dialog, ) + if not result: + return [] + + items, do_callbacks = result + if not items: + return items else: raise KodionException('Unknown kind: %s' % kind) - if item_filter: - result = filter_videos(result, **item_filter) + if item_filter or do_callbacks: + items = filter_videos(items, **item_filter) if sort is not None: - result.sort(key=sort, reverse=reverse) + items.sort(key=sort, reverse=reverse) # no processing of next page item - if not result or not process_next_page: - return result + if not process_next_page or params.get('hide_next_page'): + return items # next page """ @@ -477,7 +549,6 @@ def response_to_items(provider, We implemented our own calculation for the token into the YouTube client This should work for up to ~2000 entries. """ - params = context.get_params() current_page = params.get('page') next_page = current_page + 1 if current_page else 2 new_params = dict(params, page=next_page) @@ -493,7 +564,7 @@ def response_to_items(provider, elif current_page: new_params['page_token'] = '' else: - return result + return items page_info = json_data.get('pageInfo', {}) yt_total_results = int(page_info.get('totalResults', 0)) @@ -508,7 +579,7 @@ def response_to_items(provider, next_page = 1 new_params['page'] = 1 else: - return result + return items yt_visitor_data = json_data.get('visitorData') if yt_visitor_data: @@ -524,9 +595,9 @@ def response_to_items(provider, new_params['offset'] = offset next_page_item = NextPageItem(context, new_params) - result.append(next_page_item) + items.append(next_page_item) - return result + return items def _parse_kind(item): diff --git a/plugin.video.youtube/resources/lib/youtube_plugin/youtube/helper/yt_login.py b/plugin.video.youtube/resources/lib/youtube_plugin/youtube/helper/yt_login.py index d951d869db..3d6ba7d18e 100644 --- a/plugin.video.youtube/resources/lib/youtube_plugin/youtube/helper/yt_login.py +++ b/plugin.video.youtube/resources/lib/youtube_plugin/youtube/helper/yt_login.py @@ -10,8 +10,6 @@ from __future__ import absolute_import, division, unicode_literals -import time - from ..youtube_exceptions import LoginException @@ -24,26 +22,25 @@ def process(mode, provider, context, sign_out_refresh=True): def _do_logout(): refresh_tokens = access_manager.get_refresh_token() client = provider.get_client(context) - if refresh_tokens: + if any(refresh_tokens): for _refresh_token in set(refresh_tokens): try: - client.revoke(_refresh_token) + if _refresh_token: + client.revoke(_refresh_token) except LoginException: pass access_manager.update_access_token( - addon_id, access_token='', refresh_token='', + addon_id, access_token='', expiry=-1, refresh_token='', ) provider.reset_client() - def _do_login(login_type): - for_tv = login_type == 'tv' + def _do_login(token_type): _client = provider.get_client(context) try: - if for_tv: - json_data = _client.request_device_and_user_code_tv() - else: - json_data = _client.request_device_and_user_code() + json_data = _client.request_device_and_user_code(token_type) + if not json_data: + return None except LoginException: _do_logout() raise @@ -59,23 +56,26 @@ def _do_login(login_type): else: verification_url = 'youtube.com/activate' - text = [localize('sign.go_to') % ui.bold(verification_url), - '[CR]%s %s' % (localize('sign.enter_code'), - ui.bold(user_code))] - text = ''.join(text) + message = ''.join(( + localize('sign.go_to') % ui.bold(verification_url), + '[CR]', + localize('sign.enter_code'), + ' ', + ui.bold(user_code), + )) with ui.create_progress_dialog( - heading=localize('sign.in'), text=text, background=False - ) as dialog: + heading=localize('sign.in'), message=message, background=False + ) as progress_dialog: steps = ((10 * 60) // interval) # 10 Minutes - dialog.set_total(steps) + progress_dialog.set_total(steps) for _ in range(steps): - dialog.update() + progress_dialog.update() try: - if for_tv: - json_data = _client.request_access_token_tv(device_code) - else: - json_data = _client.request_access_token(device_code) + json_data = _client.request_access_token(token_type, + device_code) + if not json_data: + break except LoginException: _do_logout() raise @@ -93,11 +93,10 @@ def _do_login(login_type): _access_token = json_data.get('access_token', '') _refresh_token = json_data.get('refresh_token', '') if not _access_token and not _refresh_token: - _expires_in = 0 + _expiry = 0 else: - _expires_in = (int(json_data.get('expires_in', 3600)) - + time.time()) - return _access_token, _expires_in, _refresh_token + _expiry = int(json_data.get('expires_in', 3600)) + return _access_token, _expiry, _refresh_token if json_data['error'] != 'authorization_pending': message = json_data['error'] @@ -106,11 +105,11 @@ def _do_login(login_type): context.log_error('Error requesting access token: |error|' .format(error=message)) - if dialog.is_aborted(): + if progress_dialog.is_aborted(): break context.sleep(interval) - return '', 0, '' + return None if mode == 'out': _do_logout() @@ -118,32 +117,23 @@ def _do_login(login_type): ui.refresh_container() elif mode == 'in': - ui.on_ok(localize('sign.twice.title'), localize('sign.twice.text')) - - tokens = { - 'tv': None, - 'kodi': None, - } - for token in tokens: - new_token = _do_login(login_type=token) - access_token, expires_in, refresh_token = new_token + ui.on_ok(localize('sign.multi.title'), localize('sign.multi.text')) + + tokens = ['tv', 'personal'] + for token_type, token in enumerate(tokens): + new_token = _do_login(token_type) or ('', -1, '') + tokens[token_type] = new_token + context.log_debug('YouTube Login:' - ' Type |{0}|,' - ' Access Token |{1}|,' - ' Refresh Token |{2}|,' - ' Expires |{3}|' + '\n\tType: |{0}|' + '\n\tAccess token: |{1}|' + '\n\tRefresh token: |{2}|' + '\n\tExpires: |{3}|' .format(token, - access_token != '', - refresh_token != '', - expires_in)) - # abort login - if not access_token and not refresh_token: - provider.reset_client() - access_manager.update_access_token(addon_id, '') - ui.refresh_container() - return - tokens[token] = new_token + bool(new_token[0]), + bool(new_token[2]), + new_token[1])) provider.reset_client() - access_manager.update_access_token(addon_id, *zip(*tokens.values())) + access_manager.update_access_token(addon_id, *zip(*tokens)) ui.refresh_container() diff --git a/plugin.video.youtube/resources/lib/youtube_plugin/youtube/helper/yt_play.py b/plugin.video.youtube/resources/lib/youtube_plugin/youtube/helper/yt_play.py index 1da0a13aed..bc5e7cd414 100644 --- a/plugin.video.youtube/resources/lib/youtube_plugin/youtube/helper/yt_play.py +++ b/plugin.video.youtube/resources/lib/youtube_plugin/youtube/helper/yt_play.py @@ -18,18 +18,21 @@ from ..youtube_exceptions import YouTubeException from ...kodion.compatibility import urlencode, urlunsplit from ...kodion.constants import ( + BUSY_FLAG, + CONTENT, PATHS, PLAYBACK_INIT, PLAYER_DATA, + PLAYLIST_PATH, + PLAYLIST_POSITION, PLAY_FORCE_AUDIO, PLAY_PROMPT_QUALITY, PLAY_PROMPT_SUBTITLES, PLAY_TIMESHIFT, PLAY_WITH, - SERVER_POST_START, SERVER_WAKEUP, ) -from ...kodion.items import AudioItem, VideoItem +from ...kodion.items import AudioItem, UriItem, VideoItem from ...kodion.network import get_connect_address from ...kodion.utils import find_video_id, select_stream @@ -49,6 +52,7 @@ def _play_stream(provider, context): incognito = params.get('incognito', False) screensaver = params.get('screensaver', False) + audio_only = False is_external = ui.get_property(PLAY_WITH) if ((is_external and settings.alternative_player_web_urls()) or settings.default_player_web_urls()): @@ -59,21 +63,31 @@ def _play_stream(provider, context): ask_for_quality = settings.ask_for_video_quality() if ui.pop_property(PLAY_PROMPT_QUALITY) and not screensaver: ask_for_quality = True - - audio_only = settings.audio_only() - if ui.pop_property(PLAY_FORCE_AUDIO): + elif ui.pop_property(PLAY_FORCE_AUDIO): audio_only = True + else: + audio_only = settings.audio_only() + use_adaptive_formats = (not is_external + or settings.alternative_player_adaptive()) + use_mpd = (use_adaptive_formats + and settings.use_mpd_videos() + and context.wakeup(SERVER_WAKEUP, timeout=5)) try: - streams = client.get_streams(context, - video_id, - ask_for_quality, - audio_only, - settings.use_mpd_videos()) + streams = client.get_streams( + context, + video_id=video_id, + ask_for_quality=ask_for_quality, + audio_only=audio_only, + use_mpd=use_mpd, + ) except YouTubeException as exc: - context.log_error('yt_play.play_video - {exc}:\n{details}'.format( - exc=exc, details=''.join(format_stack()) - )) + msg = ('yt_play.play_video - Error' + '\n\tException: {exc!r}' + '\n\tStack trace (most recent call last):\n{stack}' + .format(exc=exc, + stack=''.join(format_stack()))) + context.log_error(msg) ui.show_notification(message=exc.get_message()) return False @@ -87,8 +101,7 @@ def _play_stream(provider, context): streams, ask_for_quality=ask_for_quality, audio_only=audio_only, - use_adaptive_formats=(not is_external - or settings.alternative_player_adaptive()), + use_adaptive_formats=use_adaptive_formats, ) if stream is None: @@ -119,17 +132,17 @@ def _play_stream(provider, context): )) stream['url'] = url - if audio_only or not video_type: - media_item = AudioItem(metadata.get('title', ''), stream['url']) - else: - media_item = VideoItem(metadata.get('title', ''), stream['url']) + media_item = (AudioItem if audio_only or not video_type else VideoItem)( + name=metadata.get('title', ''), + uri=stream['url'], + video_id=video_id, + ) use_history = not (screensaver or incognito or stream.get('live')) use_remote_history = use_history and settings.use_remote_history() - use_play_data = use_history and settings.use_local_history() + use_local_history = use_history and settings.use_local_history() - utils.update_play_info(provider, context, video_id, media_item, - stream, use_play_data=use_play_data) + utils.update_play_info(provider, context, video_id, media_item, stream) seek_time = 0.0 if params.get('resume') else params.get('seek', 0.0) start_time = params.get('start', 0.0) @@ -142,7 +155,7 @@ def _play_stream(provider, context): # if end_time: # video_item.set_duration_from_seconds(end_time) - play_count = use_play_data and media_item.get_play_count() or 0 + play_count = use_local_history and media_item.get_play_count() or 0 playback_stats = stream.get('playback_stats') playback_data = { @@ -152,7 +165,7 @@ def _play_stream(provider, context): 'playing_file': media_item.get_uri(), 'play_count': play_count, 'use_remote_history': use_remote_history, - 'use_local_history': use_play_data, + 'use_local_history': use_local_history, 'playback_stats': playback_stats, 'seek_time': seek_time, 'start_time': start_time, @@ -167,24 +180,30 @@ def _play_stream(provider, context): def _play_playlist(provider, context): - videos = [] + video_items = [] params = context.get_params() - player = context.get_video_player() - player.stop() - action = params.get('action') + if not action and context.get_handle() == -1: + action = 'play' + playlist_ids = params.get('playlist_ids') if not playlist_ids: playlist_ids = [params.get('playlist_id')] + video_id = params.get('video_id') resource_manager = provider.get_resource_manager(context) ui = context.get_ui() with ui.create_progress_dialog( - context.localize('playlist.progress.updating'), - context.localize('please_wait'), - background=True + heading=context.localize('playlist.progress.updating'), + message=context.localize('please_wait'), + background=True, + message_template=( + '{wait} {{current}}/{{total}}'.format( + wait=context.localize('please_wait'), + ) + ), ) as progress_dialog: json_data = resource_manager.get_playlist_items(playlist_ids) @@ -192,11 +211,8 @@ def _play_playlist(provider, context): progress_dialog.set_total(total) progress_dialog.update( steps=0, - text='{wait} {current}/{total}'.format( - wait=context.localize('please_wait'), - current=0, - total=total - ) + current=0, + total=total, ) # start the loop and fill the list with video items @@ -205,114 +221,90 @@ def _play_playlist(provider, context): context, chunk, process_next_page=False) - videos.extend(result) + video_items.extend(result) progress_dialog.update( steps=len(result), - text='{wait} {current}/{total}'.format( - wait=context.localize('please_wait'), - current=len(videos), - total=total - ) + current=len(video_items), + total=total, ) - if not videos: + if not video_items: return False - # select order - order = params.get('order', '') - if not order: - order_list = ('default', 'reverse', 'shuffle') - items = [(context.localize('playlist.play.%s' % order), order) - for order in order_list] - order = ui.on_select(context.localize('playlist.play.select'), - items) - if order not in order_list: - order = 'default' - - # reverse the list - if order == 'reverse': - videos = videos[::-1] - elif order == 'shuffle': - # we have to shuffle the playlist by our self. - # The implementation of XBMC/KODI is quite weak :( - random.shuffle(videos) - - if action == 'list': - return videos - - # clear the playlist - playlist = context.get_video_playlist() - playlist.clear() - playlist.unshuffle() - - # check if we have a video as starting point for the playlist - video_id = params.get('video_id') - playlist_position = None if video_id else 0 - # add videos to playlist - for idx, video in enumerate(videos): - playlist.add(video) - if playlist_position is None and video.video_id == video_id: - playlist_position = idx - - options = { - provider.RESULT_CACHE_TO_DISC: False, - provider.RESULT_FORCE_RESOLVE: True, - provider.RESULT_UPDATE_LISTING: False, - } - - if action == 'queue': - return videos, options - if context.get_handle() == -1 or action == 'play': - player.play(playlist_index=playlist_position) - return False - return videos[playlist_position], options + return ( + process_items_for_playlist(context, video_items, action, video_id), + { + provider.RESULT_CACHE_TO_DISC: False, + provider.RESULT_FORCE_RESOLVE: True, + provider.RESULT_UPDATE_LISTING: True, + }, + ) def _play_channel_live(provider, context): channel_id = context.get_param('channel_id') - index = context.get_param('live', 1) - 1 - if index < 0: - index = 0 - json_data = provider.get_client(context).search(q='', - search_type='video', - event_type='live', - channel_id=channel_id, - safe_search=False) + _, json_data = provider.get_client(context).search_with_params(params={ + 'type': 'video', + 'eventType': 'live', + 'channelId': channel_id, + 'safeSearch': 'none', + }) if not json_data: return False - video_items = v3.response_to_items(provider, - context, - json_data, - process_next_page=False) - - try: - video_item = video_items[index] - except IndexError: + channel_streams = v3.response_to_items(provider, + context, + json_data, + process_next_page=False) + if not channel_streams: return False - player = context.get_video_player() - player.stop() + return ( + process_items_for_playlist( + context, + channel_streams, + action='play' if context.get_handle() == -1 else None, + play_from=context.get_param('live', 1), + ), + { + provider.RESULT_CACHE_TO_DISC: False, + provider.RESULT_FORCE_RESOLVE: True, + provider.RESULT_UPDATE_LISTING: True, + }, + ) - playlist = context.get_video_playlist() - playlist.clear() - playlist.add(video_item) - if context.get_handle() == -1: - player.play(playlist_index=0) - return False - return video_item +def process(provider, context, **_kwargs): + """ + Plays a video, playlist, or channel live stream. + Video: + plugin://plugin.video.youtube/play/?video_id= -def process(provider, context, **_kwargs): + * VIDEO_ID: YouTube Video ID + + Playlist: + plugin://plugin.video.youtube/play/?playlist_id=[&order=][&action=] + + * PLAYLIST_ID: YouTube Playlist ID + * ORDER: [ask(default)|normal|reverse|shuffle] optional playlist order + * ACTION: [list|play|queue|None(default)] optional action to perform + + Channel live streams: + plugin://plugin.video.youtube/play/?channel_id=[&live=X] + + * CHANNEL_ID: YouTube Channel ID + * X: optional index of live stream to play if channel has multiple live streams. 1 (default) for first live stream + """ ui = context.get_ui() params = context.get_params() param_keys = params.keys() - if ({'channel_id', 'playlist_id', 'playlist_ids', 'video_id'} - .isdisjoint(param_keys)): + if {'channel_id', 'playlist_id', 'playlist_ids', 'video_id'}.isdisjoint( + param_keys + ): listitem_path = context.get_listitem_info('FileNameAndPath') if context.is_plugin_path(listitem_path, PATHS.PLAY): video_id = find_video_id(listitem_path) @@ -341,12 +333,26 @@ def process(provider, context, **_kwargs): # This is required to trigger Kodi resume prompt, along with using # RunPlugin. Prompt will not be used if using PlayMedia if force_play: - context.execute('Action(Play)') - return False - ui.clear_property(SERVER_POST_START) - context.wakeup(SERVER_WAKEUP, timeout=5) + return UriItem('command://Action(Play)') + + if context.get_handle() == -1: + return UriItem('command://PlayMedia({0}, playlist_type_hint=1)' + .format(context.create_uri((PATHS.PLAY,), params))) + + ui.set_property(BUSY_FLAG) + playlist_player = context.get_playlist_player() + position, _ = playlist_player.get_position() + items = playlist_player.get_items() + media_item = _play_stream(provider, context) - ui.set_property(SERVER_POST_START) + if media_item: + if position and items: + ui.set_property(PLAYLIST_PATH, + items[position - 1]['file']) + ui.set_property(PLAYLIST_POSITION, str(position)) + else: + ui.clear_property(BUSY_FLAG) + return media_item if playlist_id or 'playlist_ids' in params: @@ -355,3 +361,78 @@ def process(provider, context, **_kwargs): if 'channel_id' in params: return _play_channel_live(provider, context) return False + + +def process_items_for_playlist(context, items, action=None, play_from=None): + # select order + order = context.get_param('order') + if not order and play_from is None: + order = 'ask' + if order == 'ask': + order_list = ('default', 'reverse', 'shuffle') + selection_list = [ + (context.localize('playlist.play.%s' % order), order) + for order in order_list + ] + order = context.get_ui().on_select( + context.localize('playlist.play.select'), + selection_list, + ) + if order not in order_list: + order = 'default' + + # reverse the list + if order == 'reverse': + items = items[::-1] + elif order == 'shuffle': + # we have to shuffle the playlist by our self. + # The implementation of XBMC/KODI is quite weak :( + random.shuffle(items) + + if action == 'list': + context.set_content(CONTENT.VIDEO_CONTENT) + return items + + # stop and clear the playlist + playlist_player = context.get_playlist_player() + playlist_player.clear() + playlist_player.unshuffle() + + # check if we have a video as starting point for the playlist + if play_from == 'start': + play_from = 0 + elif play_from == 'end': + play_from = -1 + if isinstance(play_from, int): + playlist_position = play_from + else: + playlist_position = None + + # add videos to playlist + for idx, item in enumerate(items): + if not item.playable: + continue + playlist_player.add(item) + if playlist_position is None and item.video_id == play_from: + playlist_position = idx + + num_items = playlist_player.size() + if not num_items: + return False + + if isinstance(play_from, int): + if num_items >= play_from > 0: + playlist_position = play_from - 1 + elif play_from < 0: + playlist_position = num_items + play_from + else: + playlist_position = 0 + elif playlist_position is None: + playlist_position = 0 + + if action == 'queue': + return items + if action == 'play': + playlist_player.play_playlist_item(playlist_position + 1) + return False + return items[playlist_position] diff --git a/plugin.video.youtube/resources/lib/youtube_plugin/youtube/helper/yt_playlist.py b/plugin.video.youtube/resources/lib/youtube_plugin/youtube/helper/yt_playlist.py index c288905775..31aebd9ca8 100644 --- a/plugin.video.youtube/resources/lib/youtube_plugin/youtube/helper/yt_playlist.py +++ b/plugin.video.youtube/resources/lib/youtube_plugin/youtube/helper/yt_playlist.py @@ -52,7 +52,7 @@ def _process_add_video(provider, context, keymap_action=False): context.get_ui().show_notification( message=notify_message, time_ms=2500, - audible=False + audible=False, ) if keymap_action: @@ -86,7 +86,7 @@ def _process_remove_video(provider, if video_id is None: video_id = params.pop('video_id', None) if video_name is None: - video_name = params.pop('video_name', None) + video_name = params.pop('item_name', None) if confirmed is None: confirmed = params.pop('confirmed', False) @@ -133,7 +133,7 @@ def _process_remove_video(provider, context.get_ui().show_notification( message=context.localize('playlist.removed_from'), time_ms=2500, - audible=False + audible=False, ) if not context.is_plugin_path(container_uri): @@ -171,7 +171,7 @@ def _process_remove_playlist(provider, context): if not playlist_id: raise KodionException('Playlist/Remove: missing playlist_id') - playlist_name = params.get('playlist_name', '') + playlist_name = params.get('item_name', '') if not playlist_name: raise KodionException('Playlist/Remove: missing playlist_name') @@ -253,7 +253,7 @@ def _process_select_playlist(provider, context): snippet = playlist.get('snippet', {}) title = snippet.get('title', '') description = snippet.get('description', '') - thumbnail = get_thumbnail(thumb_size, snippet.get('thumbnails', {})) + thumbnail = get_thumbnail(thumb_size, snippet.get('thumbnails')) playlist_id = playlist.get('id', '') if title and playlist_id: items.append(( @@ -301,7 +301,7 @@ def _process_rename_playlist(provider, context): raise KodionException('playlist/rename: missing playlist_id') result, text = ui.on_keyboard_input( - context.localize('rename'), default=params.get('playlist_name', ''), + context.localize('rename'), default=params.get('item_name', ''), ) if not result or not text: return False @@ -318,23 +318,23 @@ def _process_rename_playlist(provider, context): return False -def _playlist_id_change(context, playlist, method): +def _playlist_id_change(context, playlist, command): playlist_id = context.get_param('playlist_id', '') if not playlist_id: - raise KodionException('{type}/{method}: missing playlist_id' - .format(type=playlist, method=method)) - playlist_name = context.get_param('playlist_name', '') + raise KodionException('{type}/{command}: missing playlist_id' + .format(type=playlist, command=command)) + playlist_name = context.get_param('item_name', '') if not playlist_name: - raise KodionException('{type}/{method}: missing playlist_name' - .format(type=playlist, method=method)) + raise KodionException('{type}/{command}: missing playlist_name' + .format(type=playlist, command=command)) if context.get_ui().on_yes_no_input( context.get_name(), - context.localize('{type}.list.{method}.confirm'.format( - type=playlist, method=method + context.localize('{type}.list.{command}.check'.format( + type=playlist, command=command )) % playlist_name ): - if method == 'remove': + if command == 'remove': playlist_id = None if playlist == 'watch_later': context.get_access_manager().set_watch_later_id(playlist_id) @@ -347,35 +347,35 @@ def _playlist_id_change(context, playlist, method): def process(provider, context, re_match=None, - method=None, + command=None, category=None, **kwargs): if re_match: - if method is None: - method = re_match.group('method') + if command is None: + command = re_match.group('command') if category is None: category = re_match.group('category') - if method == 'add' and category == 'video': + if command == 'add' and category == 'video': return _process_add_video(provider, context) - if method == 'remove' and category == 'video': + if command == 'remove' and category == 'video': return _process_remove_video(provider, context, **kwargs) - if method == 'remove' and category == 'playlist': + if command == 'remove' and category == 'playlist': return _process_remove_playlist(provider, context) - if method == 'select' and category == 'playlist': + if command == 'select' and category == 'playlist': return _process_select_playlist(provider, context) - if method == 'rename' and category == 'playlist': + if command == 'rename' and category == 'playlist': return _process_rename_playlist(provider, context) - if method in {'set', 'remove'} and category == 'watch_later': - return _playlist_id_change(context, category, method) + if command in {'set', 'remove'} and category == 'watch_later': + return _playlist_id_change(context, category, command) - if method in {'set', 'remove'} and category == 'history': - return _playlist_id_change(context, category, method) + if command in {'set', 'remove'} and category == 'history': + return _playlist_id_change(context, category, command) - raise KodionException('Unknown category |{0}| or method |{1}|' - .format(category, method)) + raise KodionException('Unknown playlist category |{0}| or command |{1}|' + .format(category, command)) diff --git a/plugin.video.youtube/resources/lib/youtube_plugin/youtube/helper/yt_setup_wizard.py b/plugin.video.youtube/resources/lib/youtube_plugin/youtube/helper/yt_setup_wizard.py index d50d80ff45..d09ddfdb25 100644 --- a/plugin.video.youtube/resources/lib/youtube_plugin/youtube/helper/yt_setup_wizard.py +++ b/plugin.video.youtube/resources/lib/youtube_plugin/youtube/helper/yt_setup_wizard.py @@ -13,277 +13,30 @@ import os from ...kodion.compatibility import urlencode, xbmcvfs -from ...kodion.constants import ADDON_ID, DATA_PATH, WAIT_FLAG -from ...kodion.network import Locator, httpd_status +from ...kodion.constants import ADDON_ID, DATA_PATH, WAIT_END_FLAG +from ...kodion.network import httpd_status from ...kodion.sql_store import PlaybackHistory, SearchHistory -from ...kodion.utils import current_system_version, to_unicode +from ...kodion.utils import to_unicode from ...kodion.utils.datetime_parser import strptime -DEFAULT_LANGUAGES = {'items': [ - {'snippet': {'name': 'Afrikaans', 'hl': 'af'}, 'id': 'af'}, - {'snippet': {'name': 'Azerbaijani', 'hl': 'az'}, 'id': 'az'}, - {'snippet': {'name': 'Indonesian', 'hl': 'id'}, 'id': 'id'}, - {'snippet': {'name': 'Malay', 'hl': 'ms'}, 'id': 'ms'}, - {'snippet': {'name': 'Catalan', 'hl': 'ca'}, 'id': 'ca'}, - {'snippet': {'name': 'Czech', 'hl': 'cs'}, 'id': 'cs'}, - {'snippet': {'name': 'Danish', 'hl': 'da'}, 'id': 'da'}, - {'snippet': {'name': 'German', 'hl': 'de'}, 'id': 'de'}, - {'snippet': {'name': 'Estonian', 'hl': 'et'}, 'id': 'et'}, - {'snippet': {'name': 'English (United Kingdom)', 'hl': 'en-GB'}, 'id': 'en-GB'}, - {'snippet': {'name': 'English', 'hl': 'en'}, 'id': 'en'}, - {'snippet': {'name': 'Spanish (Spain)', 'hl': 'es'}, 'id': 'es'}, - {'snippet': {'name': 'Spanish (Latin America)', 'hl': 'es-419'}, 'id': 'es-419'}, - {'snippet': {'name': 'Basque', 'hl': 'eu'}, 'id': 'eu'}, - {'snippet': {'name': 'Filipino', 'hl': 'fil'}, 'id': 'fil'}, - {'snippet': {'name': 'French', 'hl': 'fr'}, 'id': 'fr'}, - {'snippet': {'name': 'French (Canada)', 'hl': 'fr-CA'}, 'id': 'fr-CA'}, - {'snippet': {'name': 'Galician', 'hl': 'gl'}, 'id': 'gl'}, - {'snippet': {'name': 'Croatian', 'hl': 'hr'}, 'id': 'hr'}, - {'snippet': {'name': 'Zulu', 'hl': 'zu'}, 'id': 'zu'}, - {'snippet': {'name': 'Icelandic', 'hl': 'is'}, 'id': 'is'}, - {'snippet': {'name': 'Italian', 'hl': 'it'}, 'id': 'it'}, - {'snippet': {'name': 'Swahili', 'hl': 'sw'}, 'id': 'sw'}, - {'snippet': {'name': 'Latvian', 'hl': 'lv'}, 'id': 'lv'}, - {'snippet': {'name': 'Lithuanian', 'hl': 'lt'}, 'id': 'lt'}, - {'snippet': {'name': 'Hungarian', 'hl': 'hu'}, 'id': 'hu'}, - {'snippet': {'name': 'Dutch', 'hl': 'nl'}, 'id': 'nl'}, - {'snippet': {'name': 'Norwegian', 'hl': 'no'}, 'id': 'no'}, - {'snippet': {'name': 'Uzbek', 'hl': 'uz'}, 'id': 'uz'}, - {'snippet': {'name': 'Polish', 'hl': 'pl'}, 'id': 'pl'}, - {'snippet': {'name': 'Portuguese (Portugal)', 'hl': 'pt-PT'}, 'id': 'pt-PT'}, - {'snippet': {'name': 'Portuguese (Brazil)', 'hl': 'pt'}, 'id': 'pt'}, - {'snippet': {'name': 'Romanian', 'hl': 'ro'}, 'id': 'ro'}, - {'snippet': {'name': 'Albanian', 'hl': 'sq'}, 'id': 'sq'}, - {'snippet': {'name': 'Slovak', 'hl': 'sk'}, 'id': 'sk'}, - {'snippet': {'name': 'Slovenian', 'hl': 'sl'}, 'id': 'sl'}, - {'snippet': {'name': 'Finnish', 'hl': 'fi'}, 'id': 'fi'}, - {'snippet': {'name': 'Swedish', 'hl': 'sv'}, 'id': 'sv'}, - {'snippet': {'name': 'Vietnamese', 'hl': 'vi'}, 'id': 'vi'}, - {'snippet': {'name': 'Turkish', 'hl': 'tr'}, 'id': 'tr'}, - {'snippet': {'name': 'Bulgarian', 'hl': 'bg'}, 'id': 'bg'}, - {'snippet': {'name': 'Kyrgyz', 'hl': 'ky'}, 'id': 'ky'}, - {'snippet': {'name': 'Kazakh', 'hl': 'kk'}, 'id': 'kk'}, - {'snippet': {'name': 'Macedonian', 'hl': 'mk'}, 'id': 'mk'}, - {'snippet': {'name': 'Mongolian', 'hl': 'mn'}, 'id': 'mn'}, - {'snippet': {'name': 'Russian', 'hl': 'ru'}, 'id': 'ru'}, - {'snippet': {'name': 'Serbian', 'hl': 'sr'}, 'id': 'sr'}, - {'snippet': {'name': 'Ukrainian', 'hl': 'uk'}, 'id': 'uk'}, - {'snippet': {'name': 'Greek', 'hl': 'el'}, 'id': 'el'}, - {'snippet': {'name': 'Armenian', 'hl': 'hy'}, 'id': 'hy'}, - {'snippet': {'name': 'Hebrew', 'hl': 'iw'}, 'id': 'iw'}, - {'snippet': {'name': 'Urdu', 'hl': 'ur'}, 'id': 'ur'}, - {'snippet': {'name': 'Arabic', 'hl': 'ar'}, 'id': 'ar'}, - {'snippet': {'name': 'Persian', 'hl': 'fa'}, 'id': 'fa'}, - {'snippet': {'name': 'Nepali', 'hl': 'ne'}, 'id': 'ne'}, - {'snippet': {'name': 'Marathi', 'hl': 'mr'}, 'id': 'mr'}, - {'snippet': {'name': 'Hindi', 'hl': 'hi'}, 'id': 'hi'}, - {'snippet': {'name': 'Bengali', 'hl': 'bn'}, 'id': 'bn'}, - {'snippet': {'name': 'Punjabi', 'hl': 'pa'}, 'id': 'pa'}, - {'snippet': {'name': 'Gujarati', 'hl': 'gu'}, 'id': 'gu'}, - {'snippet': {'name': 'Tamil', 'hl': 'ta'}, 'id': 'ta'}, - {'snippet': {'name': 'Telugu', 'hl': 'te'}, 'id': 'te'}, - {'snippet': {'name': 'Kannada', 'hl': 'kn'}, 'id': 'kn'}, - {'snippet': {'name': 'Malayalam', 'hl': 'ml'}, 'id': 'ml'}, - {'snippet': {'name': 'Sinhala', 'hl': 'si'}, 'id': 'si'}, - {'snippet': {'name': 'Thai', 'hl': 'th'}, 'id': 'th'}, - {'snippet': {'name': 'Lao', 'hl': 'lo'}, 'id': 'lo'}, - {'snippet': {'name': 'Myanmar (Burmese)', 'hl': 'my'}, 'id': 'my'}, - {'snippet': {'name': 'Georgian', 'hl': 'ka'}, 'id': 'ka'}, - {'snippet': {'name': 'Amharic', 'hl': 'am'}, 'id': 'am'}, - {'snippet': {'name': 'Khmer', 'hl': 'km'}, 'id': 'km'}, - {'snippet': {'name': 'Chinese', 'hl': 'zh-CN'}, 'id': 'zh-CN'}, - {'snippet': {'name': 'Chinese (Taiwan)', 'hl': 'zh-TW'}, 'id': 'zh-TW'}, - {'snippet': {'name': 'Chinese (Hong Kong)', 'hl': 'zh-HK'}, 'id': 'zh-HK'}, - {'snippet': {'name': 'Japanese', 'hl': 'ja'}, 'id': 'ja'}, - {'snippet': {'name': 'Korean', 'hl': 'ko'}, 'id': 'ko'}, -]} -DEFAULT_REGIONS = {'items': [ - {'snippet': {'gl': 'DZ', 'name': 'Algeria'}, 'id': 'DZ'}, - {'snippet': {'gl': 'AR', 'name': 'Argentina'}, 'id': 'AR'}, - {'snippet': {'gl': 'AU', 'name': 'Australia'}, 'id': 'AU'}, - {'snippet': {'gl': 'AT', 'name': 'Austria'}, 'id': 'AT'}, - {'snippet': {'gl': 'AZ', 'name': 'Azerbaijan'}, 'id': 'AZ'}, - {'snippet': {'gl': 'BH', 'name': 'Bahrain'}, 'id': 'BH'}, - {'snippet': {'gl': 'BY', 'name': 'Belarus'}, 'id': 'BY'}, - {'snippet': {'gl': 'BE', 'name': 'Belgium'}, 'id': 'BE'}, - {'snippet': {'gl': 'BA', 'name': 'Bosnia and Herzegovina'}, 'id': 'BA'}, - {'snippet': {'gl': 'BR', 'name': 'Brazil'}, 'id': 'BR'}, - {'snippet': {'gl': 'BG', 'name': 'Bulgaria'}, 'id': 'BG'}, - {'snippet': {'gl': 'CA', 'name': 'Canada'}, 'id': 'CA'}, - {'snippet': {'gl': 'CL', 'name': 'Chile'}, 'id': 'CL'}, - {'snippet': {'gl': 'CO', 'name': 'Colombia'}, 'id': 'CO'}, - {'snippet': {'gl': 'HR', 'name': 'Croatia'}, 'id': 'HR'}, - {'snippet': {'gl': 'CZ', 'name': 'Czech Republic'}, 'id': 'CZ'}, - {'snippet': {'gl': 'DK', 'name': 'Denmark'}, 'id': 'DK'}, - {'snippet': {'gl': 'EG', 'name': 'Egypt'}, 'id': 'EG'}, - {'snippet': {'gl': 'EE', 'name': 'Estonia'}, 'id': 'EE'}, - {'snippet': {'gl': 'FI', 'name': 'Finland'}, 'id': 'FI'}, - {'snippet': {'gl': 'FR', 'name': 'France'}, 'id': 'FR'}, - {'snippet': {'gl': 'GE', 'name': 'Georgia'}, 'id': 'GE'}, - {'snippet': {'gl': 'DE', 'name': 'Germany'}, 'id': 'DE'}, - {'snippet': {'gl': 'GH', 'name': 'Ghana'}, 'id': 'GH'}, - {'snippet': {'gl': 'GR', 'name': 'Greece'}, 'id': 'GR'}, - {'snippet': {'gl': 'HK', 'name': 'Hong Kong'}, 'id': 'HK'}, - {'snippet': {'gl': 'HU', 'name': 'Hungary'}, 'id': 'HU'}, - {'snippet': {'gl': 'IS', 'name': 'Iceland'}, 'id': 'IS'}, - {'snippet': {'gl': 'IN', 'name': 'India'}, 'id': 'IN'}, - {'snippet': {'gl': 'ID', 'name': 'Indonesia'}, 'id': 'ID'}, - {'snippet': {'gl': 'IQ', 'name': 'Iraq'}, 'id': 'IQ'}, - {'snippet': {'gl': 'IE', 'name': 'Ireland'}, 'id': 'IE'}, - {'snippet': {'gl': 'IL', 'name': 'Israel'}, 'id': 'IL'}, - {'snippet': {'gl': 'IT', 'name': 'Italy'}, 'id': 'IT'}, - {'snippet': {'gl': 'JM', 'name': 'Jamaica'}, 'id': 'JM'}, - {'snippet': {'gl': 'JP', 'name': 'Japan'}, 'id': 'JP'}, - {'snippet': {'gl': 'JO', 'name': 'Jordan'}, 'id': 'JO'}, - {'snippet': {'gl': 'KZ', 'name': 'Kazakhstan'}, 'id': 'KZ'}, - {'snippet': {'gl': 'KE', 'name': 'Kenya'}, 'id': 'KE'}, - {'snippet': {'gl': 'KW', 'name': 'Kuwait'}, 'id': 'KW'}, - {'snippet': {'gl': 'LV', 'name': 'Latvia'}, 'id': 'LV'}, - {'snippet': {'gl': 'LB', 'name': 'Lebanon'}, 'id': 'LB'}, - {'snippet': {'gl': 'LY', 'name': 'Libya'}, 'id': 'LY'}, - {'snippet': {'gl': 'LT', 'name': 'Lithuania'}, 'id': 'LT'}, - {'snippet': {'gl': 'LU', 'name': 'Luxembourg'}, 'id': 'LU'}, - {'snippet': {'gl': 'MK', 'name': 'Macedonia'}, 'id': 'MK'}, - {'snippet': {'gl': 'MY', 'name': 'Malaysia'}, 'id': 'MY'}, - {'snippet': {'gl': 'MX', 'name': 'Mexico'}, 'id': 'MX'}, - {'snippet': {'gl': 'ME', 'name': 'Montenegro'}, 'id': 'ME'}, - {'snippet': {'gl': 'MA', 'name': 'Morocco'}, 'id': 'MA'}, - {'snippet': {'gl': 'NP', 'name': 'Nepal'}, 'id': 'NP'}, - {'snippet': {'gl': 'NL', 'name': 'Netherlands'}, 'id': 'NL'}, - {'snippet': {'gl': 'NZ', 'name': 'New Zealand'}, 'id': 'NZ'}, - {'snippet': {'gl': 'NG', 'name': 'Nigeria'}, 'id': 'NG'}, - {'snippet': {'gl': 'NO', 'name': 'Norway'}, 'id': 'NO'}, - {'snippet': {'gl': 'OM', 'name': 'Oman'}, 'id': 'OM'}, - {'snippet': {'gl': 'PK', 'name': 'Pakistan'}, 'id': 'PK'}, - {'snippet': {'gl': 'PE', 'name': 'Peru'}, 'id': 'PE'}, - {'snippet': {'gl': 'PH', 'name': 'Philippines'}, 'id': 'PH'}, - {'snippet': {'gl': 'PL', 'name': 'Poland'}, 'id': 'PL'}, - {'snippet': {'gl': 'PT', 'name': 'Portugal'}, 'id': 'PT'}, - {'snippet': {'gl': 'PR', 'name': 'Puerto Rico'}, 'id': 'PR'}, - {'snippet': {'gl': 'QA', 'name': 'Qatar'}, 'id': 'QA'}, - {'snippet': {'gl': 'RO', 'name': 'Romania'}, 'id': 'RO'}, - {'snippet': {'gl': 'RU', 'name': 'Russia'}, 'id': 'RU'}, - {'snippet': {'gl': 'SA', 'name': 'Saudi Arabia'}, 'id': 'SA'}, - {'snippet': {'gl': 'SN', 'name': 'Senegal'}, 'id': 'SN'}, - {'snippet': {'gl': 'RS', 'name': 'Serbia'}, 'id': 'RS'}, - {'snippet': {'gl': 'SG', 'name': 'Singapore'}, 'id': 'SG'}, - {'snippet': {'gl': 'SK', 'name': 'Slovakia'}, 'id': 'SK'}, - {'snippet': {'gl': 'SI', 'name': 'Slovenia'}, 'id': 'SI'}, - {'snippet': {'gl': 'ZA', 'name': 'South Africa'}, 'id': 'ZA'}, - {'snippet': {'gl': 'KR', 'name': 'South Korea'}, 'id': 'KR'}, - {'snippet': {'gl': 'ES', 'name': 'Spain'}, 'id': 'ES'}, - {'snippet': {'gl': 'LK', 'name': 'Sri Lanka'}, 'id': 'LK'}, - {'snippet': {'gl': 'SE', 'name': 'Sweden'}, 'id': 'SE'}, - {'snippet': {'gl': 'CH', 'name': 'Switzerland'}, 'id': 'CH'}, - {'snippet': {'gl': 'TW', 'name': 'Taiwan'}, 'id': 'TW'}, - {'snippet': {'gl': 'TZ', 'name': 'Tanzania'}, 'id': 'TZ'}, - {'snippet': {'gl': 'TH', 'name': 'Thailand'}, 'id': 'TH'}, - {'snippet': {'gl': 'TN', 'name': 'Tunisia'}, 'id': 'TN'}, - {'snippet': {'gl': 'TR', 'name': 'Turkey'}, 'id': 'TR'}, - {'snippet': {'gl': 'UG', 'name': 'Uganda'}, 'id': 'UG'}, - {'snippet': {'gl': 'UA', 'name': 'Ukraine'}, 'id': 'UA'}, - {'snippet': {'gl': 'AE', 'name': 'United Arab Emirates'}, 'id': 'AE'}, - {'snippet': {'gl': 'GB', 'name': 'United Kingdom'}, 'id': 'GB'}, - {'snippet': {'gl': 'US', 'name': 'United States'}, 'id': 'US'}, - {'snippet': {'gl': 'VN', 'name': 'Vietnam'}, 'id': 'VN'}, - {'snippet': {'gl': 'YE', 'name': 'Yemen'}, 'id': 'YE'}, - {'snippet': {'gl': 'ZW', 'name': 'Zimbabwe'}, 'id': 'ZW'}, -]} - - def process_language(provider, context, step, steps): localize = context.localize ui = context.get_ui() step += 1 - if not ui.on_yes_no_input( + if ui.on_yes_no_input( localize('setup_wizard') + ' ({0}/{1})'.format(step, steps), (localize('setup_wizard.prompt') % localize('setup_wizard.prompt.locale')) ): - return step - - client = provider.get_client(context) - settings = context.get_settings() - - plugin_language = settings.get_language() - plugin_region = settings.get_region() - - kodi_language = context.get_language() - base_kodi_language = kodi_language.partition('-')[0] - - json_data = client.get_supported_languages(kodi_language) - items = json_data.get('items') or DEFAULT_LANGUAGES['items'] - - selected_language = [None] - - def _get_selected_language(item): - item_lang = item[1] - base_item_lang = item_lang.partition('-')[0] - if item_lang == kodi_language or item_lang == plugin_language: - selected_language[0] = item - elif not selected_language[0] and base_item_lang == base_kodi_language: - selected_language.append(item) - return item - - # Ignore es-419 as it causes hl not a valid language error - # https://github.com/jdf76/plugin.video.youtube/issues/418 - invalid_ids = ('es-419',) - language_list = sorted([ - (item['snippet']['name'], item['snippet']['hl']) - for item in items - if item['id'] not in invalid_ids - ], key=_get_selected_language) - - if selected_language[0]: - selected_language = language_list.index(selected_language[0]) - elif len(selected_language) > 1: - selected_language = language_list.index(selected_language[1]) - else: - selected_language = None - - language_id = ui.on_select( - localize('setup_wizard.locale.language'), - language_list, - preselect=selected_language - ) - if language_id == -1: - return step - - json_data = client.get_supported_regions(language=language_id) - items = json_data.get('items') or DEFAULT_REGIONS['items'] - - selected_region = [None] - - def _get_selected_region(item): - item_region = item[1] - if item_region == plugin_region: - selected_region[0] = item - return item - - region_list = sorted([ - (item['snippet']['name'], item['snippet']['gl']) - for item in items - ], key=_get_selected_region) - - if selected_region[0]: - selected_region = region_list.index(selected_region[0]) - else: - selected_region = None - - region_id = ui.on_select( - localize('setup_wizard.locale.region'), - region_list, - preselect=selected_region - ) - if region_id == -1: - return step - - # set new language id and region id - settings = context.get_settings() - settings.set_language(language_id) - settings.set_region(region_id) + context.execute( + 'RunScript({addon_id},config/language_region)'.format( + addon_id=ADDON_ID, + ), + wait_for=WAIT_END_FLAG, + ) + context.get_settings(refresh=True) return step @@ -296,13 +49,13 @@ def process_geo_location(context, step, steps, **_kwargs): (localize('setup_wizard.prompt') % localize('setup_wizard.prompt.my_location')) ): - locator = Locator(context) - locator.locate_requester() - coords = locator.coordinates() - if coords: - context.get_settings().set_location( - '{0[lat]},{0[lon]}'.format(coords) - ) + context.execute( + 'RunScript({addon_id},config/geo_location)'.format( + addon_id=ADDON_ID, + ), + wait_for=WAIT_END_FLAG, + ) + context.get_settings(refresh=True) return step @@ -320,12 +73,15 @@ def process_default_settings(context, step, steps, **_kwargs): settings.use_mpd_videos(True) settings.stream_select(4 if settings.ask_for_video_quality() else 3) settings.set_subtitle_download(False) - if current_system_version.compatible(21, 0): - settings.live_stream_type(3) - else: + if context.get_system_version().compatible(21): settings.live_stream_type(2) + else: + settings.live_stream_type(1) if not xbmcvfs.exists('special://profile/playercorefactory.xml'): + settings.support_alternative_player(False) settings.default_player_web_urls(False) + settings.alternative_player_web_urls(False) + settings.alternative_player_adaptive(False) if settings.cache_size() < 20: settings.cache_size(20) if settings.use_isa() and not httpd_status(context): @@ -367,11 +123,6 @@ def process_performance_settings(context, step, steps, **_kwargs): 'max_resolution': 3, # 720p 'stream_features': ('avc1', 'mp4a', 'filter'), 'num_items': 10, - 'settings': ( - (settings.use_isa, (False,)), - (settings.use_mpd_videos, (False,)), - (settings.set_subtitle_download, (True,)), - ), }, '1080p30_avc': { 'max_resolution': 4, # 1080p @@ -442,9 +193,12 @@ def process_subtitles(context, step, steps, **_kwargs): (localize('setup_wizard.prompt') % localize('setup_wizard.prompt.subtitles')) ): - context.execute('RunScript({addon_id},config/subtitles)'.format( - addon_id=ADDON_ID - ), wait_for=WAIT_FLAG) + context.execute( + 'RunScript({addon_id},config/subtitles)'.format( + addon_id=ADDON_ID, + ), + wait_for=WAIT_END_FLAG, + ) context.get_settings(refresh=True) return step @@ -480,12 +234,15 @@ def _convert_old_search_item(value, item): ui.show_notification(localize('succeeded')) context.execute( - 'RunScript({addon},maintenance/{action}?{query})' - .format(addon=ADDON_ID, - action='delete', - query=urlencode({'target': 'other_file', - 'path': search_db_path})), - wait_for=WAIT_FLAG, + 'RunScript({addon},maintenance/{action}?{query})'.format( + addon=ADDON_ID, + action='delete', + query=urlencode({ + 'target': 'other_file', + 'path': search_db_path, + }), + ), + wait_for=WAIT_END_FLAG, ) return step @@ -526,12 +283,15 @@ def _convert_old_history_item(value, item): ui.show_notification(localize('succeeded')) context.execute( - 'RunScript({addon},maintenance/{action}?{query})' - .format(addon=ADDON_ID, - action='delete', - query=urlencode({'target': 'other_file', - 'path': history_db_path})), - wait_for=WAIT_FLAG, + 'RunScript({addon},maintenance/{action}?{query})'.format( + addon=ADDON_ID, + action='delete', + query=urlencode({ + 'target': 'other_file', + 'path': history_db_path, + }), + ), + wait_for=WAIT_END_FLAG, ) return step @@ -542,15 +302,14 @@ def process_refresh_settings(context, step, steps, **_kwargs): step += 1 if context.get_ui().on_yes_no_input( localize('setup_wizard') + ' ({0}/{1})'.format(step, steps), - (localize('setup_wizard.prompt') - % localize('setup_wizard.prompt.settings.refresh')) + localize('setup_wizard.prompt.settings.refresh'), ): context.execute( - 'RunScript({addon},maintenance/{action}?{query})' - .format(addon=ADDON_ID, - action='refresh', - query='target=settings_xml'), - wait_for=WAIT_FLAG, + 'RunScript({addon},maintenance/{action}?{query})'.format( + addon=ADDON_ID, + action='refresh', + query='target=settings_xml', + ), + wait_for=WAIT_END_FLAG, ) - context.get_settings(refresh=True) return step diff --git a/plugin.video.youtube/resources/lib/youtube_plugin/youtube/helper/yt_specials.py b/plugin.video.youtube/resources/lib/youtube_plugin/youtube/helper/yt_specials.py index df95180942..9c2cad36de 100644 --- a/plugin.video.youtube/resources/lib/youtube_plugin/youtube/helper/yt_specials.py +++ b/plugin.video.youtube/resources/lib/youtube_plugin/youtube/helper/yt_specials.py @@ -15,7 +15,6 @@ from ...kodion.constants import CONTENT from ...kodion.items import DirectoryItem, UriItem from ...kodion.utils import strip_html_from_text -from ...kodion.utils.datetime_parser import yt_datetime_offset def _process_related_videos(provider, context, client): @@ -23,7 +22,7 @@ def _process_related_videos(provider, context, client): function_cache = context.get_function_cache() params = context.get_params() - video_id = params.get('video_id', '') + video_id = params.get('video_id') refresh = params.get('refresh') if video_id: json_data = function_cache.run( @@ -149,9 +148,7 @@ def _process_live_events(provider, context, client, event_type='live'): order='date' if event_type == 'upcoming' else 'viewCount', page_token=context.get_param('page_token', ''), location=context.get_param('location', False), - after=(yt_datetime_offset(days=3) - if event_type == 'completed' else - None), + after={'days': 3} if event_type == 'completed' else None, ) if not json_data: @@ -224,7 +221,9 @@ def _display_channels(channel_ids): channel_id_dict = {} for channel_id in channel_ids: channel_item = DirectoryItem( - '', context.create_uri(('channel', channel_id,), item_params) + name='', + uri=context.create_uri(('channel', channel_id,), item_params), + channel_id=channel_id, ) channel_id_dict[channel_id] = channel_item @@ -249,7 +248,9 @@ def _display_playlists(playlist_ids): playlist_id_dict = {} for playlist_id in playlist_ids: playlist_item = DirectoryItem( - '', context.create_uri(('playlist', playlist_id,), item_params) + name='', + uri=context.create_uri(('playlist', playlist_id,), item_params), + playlist_id=playlist_id, ) playlist_id_dict[playlist_id] = playlist_item @@ -297,19 +298,33 @@ def _process_saved_playlists_tv(provider, context, client): def _process_my_subscriptions(provider, context, client, filtered=False): context.set_content(CONTENT.VIDEO_CONTENT) - params = context.get_params() - refresh = params.get('refresh') - - json_data = client.get_my_subscriptions( - page_token=params.get('page', 1), - logged_in=provider.is_logged_in(), - do_filter=filtered, - refresh=refresh, - ) + with context.get_ui().create_progress_dialog( + heading=context.localize('my_subscriptions.loading'), + message=context.localize('please_wait'), + background=True, + message_template=( + '{wait} {{current}}/{{total}}'.format( + wait=context.localize('please_wait'), + ) + ), + ) as progress_dialog: + params = context.get_params() + json_data = client.get_my_subscriptions( + page_token=params.get('page', 1), + logged_in=provider.is_logged_in(), + do_filter=filtered, + refresh=params.get('refresh'), + progress_dialog=progress_dialog, + ) - if not json_data: - return False - return v3.response_to_items(provider, context, json_data) + if not json_data: + return False + return v3.response_to_items( + provider, + context, + json_data, + progress_dialog=progress_dialog, + ) def process(provider, context, re_match): diff --git a/plugin.video.youtube/resources/lib/youtube_plugin/youtube/helper/yt_subscriptions.py b/plugin.video.youtube/resources/lib/youtube_plugin/youtube/helper/yt_subscriptions.py index f9cea5627f..9bcd25f14f 100644 --- a/plugin.video.youtube/resources/lib/youtube_plugin/youtube/helper/yt_subscriptions.py +++ b/plugin.video.youtube/resources/lib/youtube_plugin/youtube/helper/yt_subscriptions.py @@ -45,7 +45,7 @@ def _process_add(_provider, context, client): context.get_ui().show_notification( context.localize('subscribed.to.channel'), time_ms=2500, - audible=False + audible=False, ) return True @@ -76,26 +76,26 @@ def _process_remove(_provider, context, client): context.get_ui().show_notification( context.localize('unsubscribed.from.channel'), time_ms=2500, - audible=False + audible=False, ) return True def process(provider, context, re_match): - method = re_match.group('method') + command = re_match.group('command') # we need a login client = provider.get_client(context) if not provider.is_logged_in(): return UriItem(context.create_uri(('sign', 'in'))) - if method == 'list': + if command == 'list': return _process_list(provider, context, client) - if method == 'add': + if command == 'add': return _process_add(provider, context, client) - if method == 'remove': + if command == 'remove': return _process_remove(provider, context, client) - raise KodionException('Unknown subscriptions method: %s' % method) + raise KodionException('Unknown subscriptions command: %s' % command) diff --git a/plugin.video.youtube/resources/lib/youtube_plugin/youtube/helper/yt_video.py b/plugin.video.youtube/resources/lib/youtube_plugin/youtube/helper/yt_video.py index a877a2b9ab..3569ae9fbd 100644 --- a/plugin.video.youtube/resources/lib/youtube_plugin/youtube/helper/yt_video.py +++ b/plugin.video.youtube/resources/lib/youtube_plugin/youtube/helper/yt_video.py @@ -44,7 +44,7 @@ def _process_rate_video(provider, context, re_match): client = provider.get_client(context) json_data = client.get_video_rating(video_id) if not json_data: - return False + return False, {provider.RESULT_FALLBACK: False} items = json_data.get('items', []) if items: @@ -84,7 +84,7 @@ def _process_rate_video(provider, context, re_match): context.get_ui().show_notification( message=notify_message, time_ms=2500, - audible=False + audible=False, ) return True @@ -116,14 +116,14 @@ def _process_more_for_video(context): context.execute(result) -def process(provider, context, re_match=None, method=None): - if re_match and method is None: - method = re_match.group('method') +def process(provider, context, re_match=None, command=None): + if re_match and command is None: + command = re_match.group('command') - if method == 'rate': + if command == 'rate': return _process_rate_video(provider, context, re_match) - if method == 'more': + if command == 'more': return _process_more_for_video(context) - raise KodionException('Unknown method: %s' % method) + raise KodionException('Unknown video command: %s' % command) diff --git a/plugin.video.youtube/resources/lib/youtube_plugin/youtube/provider.py b/plugin.video.youtube/resources/lib/youtube_plugin/youtube/provider.py index d4846bf9e2..3ae559bf37 100644 --- a/plugin.video.youtube/resources/lib/youtube_plugin/youtube/provider.py +++ b/plugin.video.youtube/resources/lib/youtube_plugin/youtube/provider.py @@ -40,6 +40,7 @@ PATHS, ) from ..kodion.items import ( + BaseItem, DirectoryItem, NewSearchItem, SearchItem, @@ -47,7 +48,7 @@ VideoItem, menu_items, ) -from ..kodion.utils import strip_html_from_text +from ..kodion.utils import strip_html_from_text, to_unicode class Provider(AbstractProvider): @@ -59,12 +60,12 @@ def __init__(self): self._logged_in = False self.on_video_x = self.register_path( - '^/video/(?P[^/]+)/?$', + '^/video/(?P[^/]+)/?$', yt_video.process, ) self.on_playlist_x = self.register_path( - '^/playlist/(?P[^/]+)/(?P[^/]+)/?$', + '^/playlist/(?P[^/]+)/(?P[^/]+)/?$', yt_playlist.process, ) @@ -79,7 +80,7 @@ def __init__(self): ) self.register_path( - '^/subscriptions/(?P[^/]+)/?$', + '^/subscriptions/(?P[^/]+)/?$', yt_subscriptions.process, ) @@ -133,8 +134,8 @@ def get_dev_config(context, addon_id, dev_configs): dev_main = None if not dev_main: - context.log_error('Invalid developer config: |{dev_config}|\n' - 'expected: |{{' + context.log_error('Invalid developer config: |{dev_config}|' + '\n\texpected: |{{' ' "origin": ADDON_ID,' ' "main": {{' ' "system": SYSTEM_NAME,' @@ -197,72 +198,48 @@ def get_client(self, context): access_manager.set_last_origin(origin) self.reset_client() - if dev_id: - access_tokens = access_manager.get_access_token(dev_id) - if access_manager.is_access_token_expired(dev_id): - # reset access_token - access_tokens = [] - access_manager.update_access_token(dev_id, access_tokens) - elif self._client: - return self._client - - if dev_keys: - context.log_debug('Selecting YouTube developer config "{0}"' - .format(dev_id)) - configs['main'] = dev_keys - else: - dev_keys = configs['main'] - context.log_debug('Selecting YouTube config "{0}"' - ' w/ developer access tokens' - .format(dev_keys['system'])) - - refresh_tokens = access_manager.get_refresh_token(dev_id) - if refresh_tokens: - keys_changed = access_manager.dev_keys_changed( - dev_id, dev_keys['key'], dev_keys['id'], dev_keys['secret'] - ) - if keys_changed: - context.log_warning('API key set changed: Resetting client' - ' and updating access token') - self.reset_client() - access_tokens = [] - refresh_tokens = [] - access_manager.update_access_token( - dev_id, access_tokens, -1, refresh_tokens - ) - - context.log_debug( - 'Access token count: |{0}|, refresh token count: |{1}|' - .format(len(access_tokens), len(refresh_tokens)) - ) - else: - access_tokens = access_manager.get_access_token(dev_id) - if access_manager.is_access_token_expired(dev_id): - # reset access_token - access_tokens = [] - access_manager.update_access_token(dev_id, access_tokens) - elif self._client: - return self._client + access_tokens = access_manager.get_access_token(dev_id) + if access_manager.is_access_token_expired(dev_id): + # reset access_token + access_tokens = [None, None] + access_manager.update_access_token(dev_id, access_token='') + elif self._client: + return self._client + if not dev_id: context.log_debug('Selecting YouTube config "{0}"' .format(configs['main']['system'])) - - refresh_tokens = access_manager.get_refresh_token(dev_id) - if refresh_tokens: - if self._api_check.changed: - context.log_warning('API key set changed: Resetting client' - ' and updating access token') - self.reset_client() - access_tokens = [] - refresh_tokens = [] - access_manager.update_access_token( - dev_id, access_tokens, -1, refresh_tokens, - ) - - context.log_debug( - 'Access token count: |{0}|, refresh token count: |{1}|' - .format(len(access_tokens), len(refresh_tokens)) + elif dev_keys: + context.log_debug('Selecting YouTube developer config "{0}"' + .format(dev_id)) + configs['main'] = dev_keys + else: + dev_keys = configs['main'] + context.log_debug('Selecting YouTube config "{0}"' + ' w/ developer access tokens' + .format(dev_keys['system'])) + + refresh_tokens = access_manager.get_refresh_token(dev_id) + if any(refresh_tokens): + keys_changed = access_manager.dev_keys_changed( + dev_id, dev_keys['key'], dev_keys['id'], dev_keys['secret'] + ) if dev_id else self._api_check.changed + if keys_changed: + context.log_warning('API key set changed: Resetting client' + ' and updating access token') + access_tokens = [None, None] + refresh_tokens = [None, None] + access_manager.update_access_token( + dev_id, access_token='', expiry=-1, refresh_token='' ) + self.reset_client() + + num_access_tokens = sum(1 for token in access_tokens if token) + num_refresh_tokens = sum(1 for token in refresh_tokens if token) + context.log_debug( + 'Access token count: |{0}|, refresh token count: |{1}|' + .format(num_access_tokens, num_refresh_tokens) + ) settings = context.get_settings() client = YouTube(context=context, @@ -276,35 +253,61 @@ def get_client(self, context): self._client = client # create new access tokens - elif len(access_tokens) != 2 and len(refresh_tokens) == 2: + elif num_access_tokens != num_refresh_tokens: + access_tokens = [None, None] + token_expiry = 0 try: - kodi_token = client.refresh_token(refresh_tokens[1]) - tv_token = client.refresh_token_tv(refresh_tokens[0]) - access_tokens = (tv_token[0], kodi_token[0]) - expires_in = min(tv_token[1], kodi_token[1]) - access_manager.update_access_token( - dev_id, access_tokens, expires_in, - ) + for token_type, value in enumerate(refresh_tokens): + if not value: + continue + + json_data = client.refresh_token(token_type, value) + if not json_data: + continue + + token = json_data.get('access_token') + expiry = int(json_data.get('expires_in', 3600)) + if token and expiry > 0: + access_tokens[token_type] = token + if not token_expiry or expiry < token_expiry: + token_expiry = expiry + + if any(access_tokens) and token_expiry: + access_manager.update_access_token( + dev_id, + access_token=access_tokens, + expiry=token_expiry, + ) + else: + raise InvalidGrant + except (InvalidGrant, LoginException) as exc: self.handle_exception(context, exc) - # reset access_token + # reset access token + # reset refresh token if InvalidGrant otherwise leave as-is + # to retry later if isinstance(exc, InvalidGrant): - access_manager.update_access_token( - dev_id, access_token='', refresh_token='', - ) + refresh_token = '' else: - access_manager.update_access_token(dev_id) + refresh_token = None + access_manager.update_access_token( + dev_id, + refresh_token=refresh_token, + ) - # in debug log the login status - self._logged_in = len(access_tokens) == 2 - if self._logged_in: + num_access_tokens = sum(1 for token in access_tokens if token) + + if num_access_tokens and access_tokens[1]: + self._logged_in = True context.log_debug('User is logged in') - client.set_access_token_tv(access_token_tv=access_tokens[0]) - client.set_access_token(access_token=access_tokens[1]) + client.set_access_token( + personal=access_tokens[1], + tv=access_tokens[0], + ) else: + self._logged_in = False context.log_debug('User is not logged in') - client.set_access_token_tv(access_token_tv='') - client.set_access_token(access_token='') + client.set_access_token(personal='', tv='') self._client = client return self._client @@ -344,21 +347,24 @@ def on_uri2addon(provider, context, uri=None, **_kwargs): return False - """ - Lists the videos of a playlist. - path : '/channel/(?P[^/]+)/playlist/(?P[^/]+)/' - or - path : '/playlist/(?P[^/]+)/' - channel_id : ['mine'|] - playlist_id: - """ - @AbstractProvider.register_path( r'^(?:/channel/(?P[^/]+))?' r'/playlist/(?P[^/]+)/?$' ) @staticmethod def on_playlist(provider, context, re_match): + """ + Lists the videos of a playlist. + + plugin://plugin.video.youtube/channel//playlist/ + + or + + plugin://plugin.video.youtube/playlist/ + + * CHANNEL_ID: ['mine'|YouTube Channel ID] + * PLAYLIST_ID: YouTube Playlist ID + """ context.set_content(CONTENT.VIDEO_CONTENT) resource_manager = provider.get_resource_manager(context) @@ -371,17 +377,18 @@ def on_playlist(provider, context, re_match): result = v3.response_to_items(provider, context, json_data[batch_id]) return result - """ - Lists all playlists of a channel. - path : '/channel/(?P[^/]+)/playlists/' - channel_id: - """ - @AbstractProvider.register_path( r'^/channel/(?P[^/]+)' r'/playlists/?$') @staticmethod def on_channel_playlists(provider, context, re_match): + """ + Lists all playlists of a channel. + + plugin://plugin.video.youtube/channel//playlists/ + + * CHANNEL_ID: YouTube Channel ID + """ context.set_content(CONTENT.LIST_CONTENT) channel_id = re_match.group('channel_id') @@ -403,19 +410,53 @@ def on_channel_playlists(provider, context, re_match): ).get(channel_id) playlists = resource_manager.get_related_playlists(channel_id) - uploads = playlists.get('uploads') - if uploads: + playlist_id = playlists.get('uploads') + if playlist_id: item_label = context.localize('uploads') uploads = DirectoryItem( context.get_ui().bold(item_label), context.create_uri( - ('channel', channel_id, 'playlist', uploads), + ('channel', channel_id, 'playlist', playlist_id), new_params, ), image='{media}/playlist.png', fanart=fanart, category_label=item_label, + channel_id=channel_id, + playlist_id=playlist_id, ) + + context_menu = [ + menu_items.play_playlist( + context, playlist_id + ), + menu_items.view_playlist( + context, playlist_id + ), + menu_items.shuffle_playlist( + context, playlist_id + ), + ] + + if channel_id != 'mine': + context_menu.extend(( + menu_items.separator(), + menu_items.bookmark_add( + context, uploads + ), + # subscribe to the channel via the playlist item + menu_items.subscribe_to_channel( + context, channel_id, + ) if provider.is_logged_in else None, + # bookmark channel of the playlist + menu_items.bookmark_add_channel( + context, channel_id, + ) + )) + + if context_menu: + uploads.add_context_menu(context_menu) + result = [uploads] else: result = False @@ -431,17 +472,18 @@ def on_channel_playlists(provider, context, re_match): result.extend(v3.response_to_items(provider, context, json_data)) return result - """ - List live streams for channel. - path : '/channel/(?P[^/]+)/live/' - channel_id: - """ - @AbstractProvider.register_path( r'^/channel/(?P[^/]+)' r'/live/?$') @staticmethod def on_channel_live(provider, context, re_match): + """ + List live streams for channel. + + plugin://plugin.video.youtube/channel//live + + * CHANNEL_ID: YouTube Channel ID + """ context.set_content(CONTENT.VIDEO_CONTENT) result = [] @@ -474,17 +516,19 @@ def on_channel_live(provider, context, re_match): return result - """ - Lists a playlist folder and all uploaded videos of a channel. - path :'/channel|handle|user/(?P)[^/]+/' - channel_id: - """ - @AbstractProvider.register_path( - r'^/(?P(channel|handle|user))' + r'^/(?P(channel|handle|user))' r'/(?P[^/]+)/?$') @staticmethod def on_channel(provider, context, re_match): + """ + Lists a playlist folder and all uploaded videos of a channel. + + plugin://plugin.video.youtube// + + * ID_TYPE: channel|handle|user + * ID: YouTube ID + """ listitem_channel_id = context.get_listitem_property(CHANNEL_ID) client = provider.get_client(context) @@ -494,10 +538,10 @@ def on_channel(provider, context, re_match): params = context.get_params() ui = context.get_ui() - method = re_match.group('method') + command = re_match.group('command') identifier = re_match.group('identifier') - if (method == 'channel' + if (command == 'channel' and identifier and identifier.lower() == 'property' and listitem_channel_id @@ -506,7 +550,7 @@ def on_channel(provider, context, re_match): channel=create_uri(('channel', listitem_channel_id)) )) - if method == 'channel' and not identifier: + if command == 'channel' and not identifier: return False context.set_content(CONTENT.VIDEO_CONTENT) @@ -520,14 +564,14 @@ def on_channel(provider, context, re_match): only have the handle or username of a channel. """ if identifier == 'mine': - method = 'mine' + command = 'mine' elif identifier.startswith('@'): - method = 'handle' - if method == 'channel': + command = 'handle' + if command == 'channel': channel_id = identifier else: channel_id = None - identifier = {method: True, 'identifier': identifier} + identifier = {command: True, 'identifier': identifier} if not channel_id: context.log_debug('Trying to get channel ID for |{0}|'.format( @@ -586,6 +630,7 @@ def on_channel(provider, context, re_match): image='{media}/playlist.png', fanart=fanart, category_label=item_label, + channel_id=channel_id, ) result.append(playlists_item) @@ -611,6 +656,7 @@ def on_channel(provider, context, re_match): image='{media}/live.png', fanart=fanart, category_label=item_label, + channel_id=channel_id, ) result.append(live_item) @@ -691,19 +737,6 @@ def on_my_location(context, **_kwargs): return result - """ - Plays a video, playlist, or channel live stream. - Video: '/play/?video_id=XXXXXX' - - Playlist: '/play/?playlist_id=XXXXXX[&order=ORDER][&action=ACTION]' - ORDER: [normal(default)|reverse|shuffle] optional playlist ordering - ACTION: [list|play|queue|None(default)] optional action to perform - - Channel live streams: '/play/?channel_id=UCXXXXXX[&live=X] - X: optional index of live stream to play if channel has multiple live - streams. 1 (default) for first live stream - """ - @AbstractProvider.register_path('^/users/(?P[^/]+)/?$') @staticmethod def on_users(re_match, **_kwargs): @@ -717,8 +750,13 @@ def on_users(re_match, **_kwargs): def on_sign(provider, context, re_match): sign_out_confirmed = context.get_param('confirmed') mode = re_match.group('mode') - if (mode == 'in') and context.get_access_manager().get_refresh_token(): - yt_login.process('out', provider, context, sign_out_refresh=False) + if mode == 'in': + refresh_tokens = context.get_access_manager().get_refresh_token() + if any(refresh_tokens): + yt_login.process('out', + provider, + context, + sign_out_refresh=False) if (not sign_out_confirmed and mode == 'out' and context.get_ui().on_yes_no_input( @@ -729,7 +767,7 @@ def on_sign(provider, context, re_match): if mode == 'in' or (mode == 'out' and sign_out_confirmed): yt_login.process(mode, provider, context) - return False + return True def _search_channel_or_playlist(self, context, identifier): if re.match(r'U[CU][0-9a-zA-Z_\-]{20,24}', identifier): @@ -737,55 +775,62 @@ def _search_channel_or_playlist(self, context, identifier): elif re.match(r'[OP]L[0-9a-zA-Z_\-]{30,40}', identifier): json_data = self.get_client(context).get_playlists(identifier) else: - return False + return None if json_data: return v3.response_to_items(self, context, json_data) - return False + return None + + def on_search_run(self, context, query): + data_cache = context.get_data_cache() + data_cache.del_item('search_query') - def on_search_run(self, context, search_text): # Search by url to access unlisted videos - if search_text.startswith(('https://', 'http://')): - return self.on_uri2addon(provider=self, - context=context, - uri=search_text) - if context.is_plugin_path(search_text): - return self.reroute(context=context, uri=search_text) - - result = self._search_channel_or_playlist(context, search_text) - if result: # found a channel or playlist matching search_text + if query.startswith(('https://', 'http://')): + return self.on_uri2addon(provider=self, context=context, uri=query) + if context.is_plugin_path(query): + return UriItem(query) + + result = self._search_channel_or_playlist(context, query) + if result: # found a channel or playlist matching search query return result result = [] - context.set_param('q', search_text) - context.set_param('category_label', search_text) + context.set_param('q', query) + context.set_param('category_label', query) params = context.get_params() - channel_id = params.get('channel_id') - event_type = params.get('event_type') + channel_id = params.get('channel_id') or params.get('channelId') + event_type = params.get('event_type') or params.get('eventType') hide_folders = params.get('hide_folders') location = params.get('location') page = params.get('page', 1) - page_token = params.get('page_token', '') - order = params.get('order', 'relevance') - search_type = params.get('search_type', 'video') - safe_search = context.get_settings().safe_search() - - context.get_data_cache().set_item('search_query', search_text) - if not params.get('incognito') and not params.get('channel_id'): - context.get_search_history().add_item(search_text) + page_token = params.get('page_token') or params.get('pageToken') or '' + search_type = params.get('search_type', 'video') or params.get('type') if search_type == 'video': context.set_content(CONTENT.VIDEO_CONTENT) else: context.set_content(CONTENT.LIST_CONTENT) - if (page == 1 - and search_type == 'video' - and not event_type - and not hide_folders): - if not channel_id and not location: - channel_params = dict(params, search_type='channel') + if not hide_folders and page == 1: + if event_type or search_type != 'video': + video_params = dict(params, + search_type='video', + event_type='') + item_label = context.localize('videos') + video_item = DirectoryItem( + context.get_ui().bold(item_label), + context.create_uri((context.get_path(),), video_params), + image='DefaultVideo.png', + category_label=item_label, + ) + result.append(video_item) + + if not channel_id and not location and search_type != 'channel': + channel_params = dict(params, + search_type='channel', + event_type='') item_label = context.localize('channels') channel_item = DirectoryItem( context.get_ui().bold(item_label), @@ -795,8 +840,10 @@ def on_search_run(self, context, search_text): ) result.append(channel_item) - if not location: - playlist_params = dict(params, search_type='playlist') + if not location and search_type != 'playlist': + playlist_params = dict(params, + search_type='playlist', + event_type='') item_label = context.localize('playlists') playlist_item = DirectoryItem( context.get_ui().bold(item_label), @@ -806,37 +853,74 @@ def on_search_run(self, context, search_text): ) result.append(playlist_item) - if not channel_id: - # live + if not channel_id and event_type != 'live': live_params = dict(params, search_type='video', event_type='live') item_label = context.localize('live') live_item = DirectoryItem( context.get_ui().bold(item_label), - context.create_uri( - (context.get_path().replace('input', 'query'),), - live_params, - ), + context.create_uri((context.get_path(),), live_params), image='{media}/live.png', category_label=item_label, ) result.append(live_item) + if event_type and event_type != 'upcoming': + upcoming_params = dict(params, + search_type='video', + event_type='upcoming') + item_label = context.localize('live.upcoming') + upcoming_item = DirectoryItem( + context.get_ui().bold(item_label), + context.create_uri((context.get_path(),), upcoming_params), + image='{media}/live.png', + category_label=item_label, + ) + result.append(upcoming_item) + + if event_type and event_type != 'completed': + completed_params = dict(params, + search_type='video', + event_type='completed') + item_label = context.localize('live.completed') + completed_item = DirectoryItem( + context.get_ui().bold(item_label), + context.create_uri((context.get_path(),), completed_params), + image='{media}/live.png', + category_label=item_label, + ) + result.append(completed_item) + + search_params = { + 'q': query, + 'channelId': channel_id, + 'type': search_type, + 'eventType': event_type, + 'pageToken': page_token, + 'location': location, + } + for param in (context.SEARCH_PARAMS + .intersection(params.keys()) + .difference(search_params.keys())): + search_params[param] = params[param] + function_cache = context.get_function_cache() - json_data = function_cache.run(self.get_client(context).search, - function_cache.ONE_MINUTE * 10, - _refresh=params.get('refresh'), - q=search_text, - search_type=search_type, - event_type=event_type, - safe_search=safe_search, - page_token=page_token, - channel_id=channel_id, - order=order, - location=location) + search_params, json_data = function_cache.run( + self.get_client(context).search_with_params, + function_cache.ONE_MINUTE * 10, + _refresh=params.get('refresh'), + params=search_params, + ) if not json_data: return False + + # Store current search query for Kodi window history navigation + if not params.get('incognito'): + if not params.get('channel_id'): + context.get_search_history().add_item(search_params) + data_cache.set_item('search_query', query) + result.extend(v3.response_to_items( self, context, json_data, item_filter={ @@ -853,21 +937,23 @@ def on_configure_addon(provider, context, re_match): action = re_match.group('action') if action == 'setup_wizard': provider.run_wizard(context) - return False + return False, {provider.RESULT_FALLBACK: False} return UriItem('script://{addon},config/{action}'.format( addon=ADDON_ID, action=action )) - @AbstractProvider.register_path('^/my_subscriptions/filter/?$') + @AbstractProvider.register_path( + '^/my_subscriptions/filter' + '/(?Padd|remove)/?$' + ) @staticmethod - def on_manage_my_subscription_filter(context, **_kwargs): + def on_manage_my_subscription_filter(context, re_match): settings = context.get_settings() ui = context.get_ui() - params = context.get_params() - action = params.get('action') - channel = params.get('channel_name') - if not channel or not action: + channel = context.get_param('item_name') + command = re_match.group('command') + if not channel or not command: return filter_enabled = settings.get_bool('youtube.folder.my_subscriptions_filtered.show', False) @@ -882,19 +968,19 @@ def on_manage_my_subscription_filter(context, **_kwargs): filter_list = filter_string.split(',') filter_list = [x.lower() for x in filter_list] - if action == 'add': + if command == 'add': if channel_name not in filter_list: filter_list.append(channel_name) - elif action == 'remove' and channel_name in filter_list: + elif command == 'remove' and channel_name in filter_list: filter_list = [chan_name for chan_name in filter_list if chan_name != channel_name] modified_string = ','.join(filter_list).lstrip(',') if filter_string != modified_string: settings.set_string('youtube.filter.my_subscriptions_filtered.list', modified_string) message = '' - if action == 'add': + if command == 'add': message = context.localize('my_subscriptions.filter.added') - elif action == 'remove': + elif command == 'remove': message = context.localize('my_subscriptions.filter.removed') if message: ui.show_notification(message=message) @@ -921,22 +1007,23 @@ def on_maintenance_actions(provider, context, re_match): localize = context.localize if target == 'access_manager' and ui.on_yes_no_input( - context.get_name(), localize('reset.access_manager.confirm') + context.get_name(), localize('reset.access_manager.check') ): addon_id = context.get_param('addon_id', None) access_manager = context.get_access_manager() client = provider.get_client(context) refresh_tokens = access_manager.get_refresh_token() success = True - if refresh_tokens: + if any(refresh_tokens): for refresh_token in set(refresh_tokens): try: - client.revoke(refresh_token) + if refresh_token: + client.revoke(refresh_token) except LoginException: success = False provider.reset_client() access_manager.update_access_token( - addon_id, access_token='', refresh_token='', + addon_id, access_token='', expiry=-1, refresh_token='', ) ui.refresh_container() ui.show_notification(localize('succeeded' if success else 'failed')) @@ -998,13 +1085,15 @@ def on_api_key_update(context, **_kwargs): @staticmethod def on_playback_history(provider, context, re_match): params = context.get_params() - action = params.get('action') - if not action: + command = re_match.group('command') + if not command: return False + localize = context.localize playback_history = context.get_playback_history() + ui = context.get_ui() - if action == 'list': + if command in {'list', 'play'}: context.set_content(CONTENT.VIDEO_CONTENT, sub_type='history') items = playback_history.get_items() if not items: @@ -1025,7 +1114,6 @@ def on_playback_history(provider, context, re_match): menu_items.history_clear( context ), - menu_items.separator(), ), 'position': 0, } @@ -1034,23 +1122,53 @@ def on_playback_history(provider, context, re_match): ] } video_items = v3.response_to_items(provider, context, v3_response) + if command == 'play': + return yt_play.process_items_for_playlist( + context, + video_items, + action='play', + play_from='start', + ) return video_items - if action == 'clear' and context.get_ui().on_yes_no_input( - context.get_name(), - context.localize('history.clear.confirm') - ): + if command == 'clear': + if not ui.on_yes_no_input( + localize('history.clear'), + localize('history.clear.check') + ): + return False, {provider.RESULT_FALLBACK: False} + playback_history.clear() - context.get_ui().refresh_container() + ui.refresh_container() + + ui.show_notification( + localize('completed'), + time_ms=2500, + audible=False, + ) return True video_id = params.get('video_id') if not video_id: return False - if action == 'remove': + if command == 'remove': + video_name = params.get('item_name') or video_id + video_name = to_unicode(video_name) + if not ui.on_yes_no_input( + localize('content.remove'), + localize('content.remove.check') % video_name, + ): + return False, {provider.RESULT_FALLBACK: False} + playback_history.del_item(video_id) - context.get_ui().refresh_container() + ui.refresh_container() + + ui.show_notification( + localize('removed') % video_name, + time_ms=2500, + audible=False, + ) return True play_data = playback_history.get_item(video_id) @@ -1065,22 +1183,22 @@ def on_playback_history(provider, context, re_match): 'played_percent': 0 } - if action == 'mark_unwatched': + if command == 'mark_unwatched': if play_data.get('play_count', 0) > 0: play_data['play_count'] = 0 play_data['played_time'] = 0 play_data['played_percent'] = 0 - elif action == 'mark_watched': + elif command == 'mark_watched': if not play_data.get('play_count', 0): play_data['play_count'] = 1 - elif action == 'reset_resume': + elif command == 'reset_resume': play_data['played_time'] = 0 play_data['played_percent'] = 0 playback_history_method(video_id, play_data) - context.get_ui().refresh_container() + ui.refresh_container() return True @staticmethod @@ -1096,6 +1214,7 @@ def on_root(provider, context, re_match): # _.get_my_playlists() # context.set_content(CONTENT.LIST_CONTENT) + context.set_param('category_label', localize('youtube')) result = [] @@ -1215,34 +1334,61 @@ def on_root(provider, context, re_match): image='{media}/watch_later.png', ) context_menu = [ - menu_items.play_all_from_playlist( + menu_items.play_playlist( context, watch_later_id - ) + ), + menu_items.view_playlist( + context, watch_later_id + ), + menu_items.shuffle_playlist( + context, watch_later_id + ), ] watch_later_item.add_context_menu(context_menu) result.append(watch_later_item) else: - watch_history_item = DirectoryItem( + watch_later_item = DirectoryItem( localize('watch_later'), create_uri((PATHS.WATCH_LATER, 'list')), image='{media}/watch_later.png', ) - result.append(watch_history_item) + context_menu = [ + menu_items.watch_later_local_clear(context), + menu_items.separator(), + menu_items.play_all_from( + context, + route=PATHS.WATCH_LATER, + ), + menu_items.play_all_from( + context, + route=PATHS.WATCH_LATER, + order='shuffle', + ), + ] + watch_later_item.add_context_menu(context_menu) + result.append(watch_later_item) # liked videos if logged_in and settings_bool('youtube.folder.liked_videos.show', True): resource_manager = provider.get_resource_manager(context) playlists = resource_manager.get_related_playlists('mine') if playlists and 'likes' in playlists: + liked_list_id = playlists['likes'] liked_videos_item = DirectoryItem( localize('video.liked'), - create_uri(('channel', 'mine', 'playlist', playlists['likes'])), + create_uri(('channel', 'mine', 'playlist', liked_list_id)), image='{media}/likes.png', ) context_menu = [ - menu_items.play_all_from_playlist( - context, playlists['likes'] - ) + menu_items.play_playlist( + context, liked_list_id + ), + menu_items.view_playlist( + context, liked_list_id + ), + menu_items.shuffle_playlist( + context, liked_list_id + ), ] liked_videos_item.add_context_menu(context_menu) result.append(liked_videos_item) @@ -1265,18 +1411,40 @@ def on_root(provider, context, re_match): image='{media}/history.png', ) context_menu = [ - menu_items.play_all_from_playlist( + menu_items.play_playlist( context, history_id - ) + ), + menu_items.view_playlist( + context, history_id + ), + menu_items.shuffle_playlist( + context, history_id + ), ] watch_history_item.add_context_menu(context_menu) result.append(watch_history_item) elif local_history: watch_history_item = DirectoryItem( localize('history'), - create_uri((PATHS.HISTORY,), params={'action': 'list'}), + create_uri((PATHS.HISTORY, 'list')), image='{media}/history.png', ) + context_menu = [ + menu_items.history_clear( + context + ), + menu_items.separator(), + menu_items.play_all_from( + context, + route=PATHS.HISTORY, + ), + menu_items.play_all_from( + context, + route=PATHS.HISTORY, + order='shuffle', + ), + ] + watch_history_item.add_context_menu(context_menu) result.append(watch_history_item) # (my) playlists @@ -1314,6 +1482,22 @@ def on_root(provider, context, re_match): create_uri((PATHS.BOOKMARKS, 'list')), image='{media}/bookmarks.png', ) + context_menu = [ + menu_items.bookmarks_clear( + context + ), + menu_items.separator(), + menu_items.play_all_from( + context, + route=PATHS.BOOKMARKS, + ), + menu_items.play_all_from( + context, + route=PATHS.BOOKMARKS, + order='shuffle', + ), + ] + bookmarks_item.add_context_menu(context_menu) result.append(bookmarks_item) # browse channels @@ -1399,7 +1583,7 @@ def on_bookmarks(provider, context, re_match): if not command: return False - if command == 'list': + if command in {'list', 'play'}: context.set_content(CONTENT.VIDEO_CONTENT) bookmarks_list = context.get_bookmarks_list() items = bookmarks_list.get_items() @@ -1411,35 +1595,83 @@ def on_bookmarks(provider, context, re_match): 'items': [] } - def _update_bookmark(_id, timestamp): + def _update_bookmark(context, _id, old_item): def _update(new_item): - new_item.set_bookmark_timestamp(timestamp) - bookmarks_list.update_item(_id, repr(new_item), timestamp) + if isinstance(old_item, float): + bookmark_timestamp = old_item + elif isinstance(old_item, BaseItem): + bookmark_timestamp = old_item.get_bookmark_timestamp() + else: + return + + if new_item.available: + new_item.bookmark_id = _id + new_item.set_bookmark_timestamp(bookmark_timestamp) + new_item.callback = None + bookmarks_list.update_item( + _id, + repr(new_item), + bookmark_timestamp, + ) + else: + new_item.__dict__.update(old_item.__dict__) + new_item.bookmark_id = _id + new_item.set_bookmark_timestamp(bookmark_timestamp) + new_item.available = False + new_item.playable = False + new_item.set_title(context.get_ui().color( + 'AA808080', new_item.get_title() + )) return _update for item_id, item in items.items(): + callback = _update_bookmark(context, item_id, item) if isinstance(item, float): kind = 'youtube#channel' yt_id = item_id - callback = _update_bookmark(item_id, item) + item_name = '' partial = True - else: - callback = None + elif isinstance(item, BaseItem): partial = False + if isinstance(item, VideoItem): kind = 'youtube#video' yt_id = item.video_id else: - yt_id = item.playlist_id + yt_id = getattr(item, 'playlist_id', None) if yt_id: kind = 'youtube#playlist' else: kind = 'youtube#channel' - yt_id = item.channel_id + yt_id = getattr(item, 'channel_id', None) + item_name = item.get_name() + else: + kind = None + yt_id = None + item_name = '' + partial = False if not yt_id: - continue + if isinstance(item, BaseItem): + item_ids = item.parse_item_ids_from_uri() + to_delete = False + for kind in ('video', 'playlist', 'channel'): + yt_id = item_ids.get(kind + '_id') + if not yt_id: + continue + if yt_id == 'None': + to_delete = True + continue + kind = 'youtube#' + kind + partial = True + break + else: + if to_delete: + bookmarks_list.del_item(item_id) + continue + else: + continue item = { 'kind': kind, @@ -1448,12 +1680,11 @@ def _update(new_item): '_context_menu': { 'context_menu': ( menu_items.bookmark_remove( - context, item_id + context, item_id, item_name ), menu_items.bookmarks_clear( context ), - menu_items.separator(), ), 'position': 0, }, @@ -1463,22 +1694,32 @@ def _update(new_item): v3_response['items'].append(item) bookmarks = v3.response_to_items(provider, context, v3_response) + if command == 'play': + return yt_play.process_items_for_playlist( + context, + bookmarks, + action='play', + play_from='start', + ) return bookmarks ui = context.get_ui() localize = context.localize - if command == 'clear' and ui.on_yes_no_input( - context.get_name(), - localize('bookmarks.clear.confirm') - ): + if command == 'clear': + if not ui.on_yes_no_input( + context.localize('bookmarks.clear'), + localize('bookmarks.clear.check') + ): + return False, {provider.RESULT_FALLBACK: False} + context.get_bookmarks_list().clear() ui.refresh_container() ui.show_notification( - localize('succeeded'), + localize('completed'), time_ms=2500, - audible=False + audible=False, ) return True @@ -1493,18 +1734,26 @@ def _update(new_item): ui.show_notification( localize('bookmark.created'), time_ms=2500, - audible=False + audible=False, ) return True if command == 'remove': + bookmark_name = params.get('item_name') or localize('bookmark') + bookmark_name = to_unicode(bookmark_name) + if not ui.on_yes_no_input( + localize('content.remove'), + localize('content.remove.check') % bookmark_name, + ): + return False, {provider.RESULT_FALLBACK: False} + context.get_bookmarks_list().del_item(item_id) context.get_ui().refresh_container() ui.show_notification( - localize('removed') % localize('bookmark'), + localize('removed') % bookmark_name, time_ms=2500, - audible=False + audible=False, ) return True @@ -1517,7 +1766,10 @@ def on_watch_later(provider, context, re_match): if not command: return False - if command == 'list': + localize = context.localize + ui = context.get_ui() + + if command in {'list', 'play'}: context.set_content(CONTENT.VIDEO_CONTENT, sub_type='watch_later') items = context.get_watch_later_list().get_items() if not items: @@ -1533,28 +1785,43 @@ def on_watch_later(provider, context, re_match): '_context_menu': { 'context_menu': ( menu_items.watch_later_local_remove( - context, video_id + context, video_id, item.get_name() ), menu_items.watch_later_local_clear( context ), - menu_items.separator(), ), 'position': 0, } } - for video_id in items.keys() + for video_id, item in items.items() ] } video_items = v3.response_to_items(provider, context, v3_response) + if command == 'play': + return yt_play.process_items_for_playlist( + context, + video_items, + action='play', + play_from='start', + ) return video_items - if command == 'clear' and context.get_ui().on_yes_no_input( - context.get_name(), - context.localize('watch_later.clear.confirm') - ): + if command == 'clear': + if not ui.on_yes_no_input( + localize('watch_later.clear'), + localize('watch_later.clear.check') + ): + return False, {provider.RESULT_FALLBACK: False} + context.get_watch_later_list().clear() - context.get_ui().refresh_container() + ui.refresh_container() + + ui.show_notification( + localize('completed'), + time_ms=2500, + audible=False, + ) return True video_id = params.get('video_id') @@ -1568,75 +1835,89 @@ def on_watch_later(provider, context, re_match): return True if command == 'remove': + video_name = params.get('item_name') or localize('untitled') + video_name = to_unicode(video_name) + if not ui.on_yes_no_input( + localize('content.remove'), + localize('content.remove.check') % video_name, + ): + return False, {provider.RESULT_FALLBACK: False} + context.get_watch_later_list().del_item(video_id) - context.get_ui().refresh_container() + ui.refresh_container() + + ui.show_notification( + localize('removed') % video_name, + time_ms=2500, + audible=False, + ) return True return False def handle_exception(self, context, exception_to_handle): - if isinstance(exception_to_handle, (InvalidGrant, LoginException)): - ok_dialog = False - message_timeout = 5000 - - message = exception_to_handle.get_message() - msg = exception_to_handle.get_message() - log_message = exception_to_handle.get_message() - - error = '' - code = '' - if isinstance(msg, dict): - if 'error_description' in msg: - message = strip_html_from_text(msg['error_description']) - log_message = strip_html_from_text(msg['error_description']) - elif 'message' in msg: - message = strip_html_from_text(msg['message']) - log_message = strip_html_from_text(msg['message']) - else: - message = 'No error message' - log_message = 'No error message' - - if 'error' in msg: - error = msg['error'] - - if 'code' in msg: - code = msg['code'] + if not isinstance(exception_to_handle, (InvalidGrant, LoginException)): + return False - if error and code: - title = '%s: [%s] %s' % ('LoginException', code, error) - elif error: - title = '%s: %s' % ('LoginException', error) + ok_dialog = False + message_timeout = 5000 + + message = exception_to_handle.get_message() + msg = exception_to_handle.get_message() + log_message = exception_to_handle.get_message() + + error = '' + code = '' + if isinstance(msg, dict): + if 'error_description' in msg: + message = strip_html_from_text(msg['error_description']) + log_message = strip_html_from_text(msg['error_description']) + elif 'message' in msg: + message = strip_html_from_text(msg['message']) + log_message = strip_html_from_text(msg['message']) else: - title = 'LoginException' + message = 'No error message' + log_message = 'No error message' - context.log_error('%s: %s' % (title, log_message)) + if 'error' in msg: + error = msg['error'] - if error == 'deleted_client': - message = context.localize('key.requirement') - context.get_access_manager().update_access_token( - context.get_param('addon_id', None), - access_token='', - refresh_token='', - ) - ok_dialog = True - - if error == 'invalid_client': - if message == 'The OAuth client was not found.': - message = context.localize('client.id.incorrect') - message_timeout = 7000 - elif message == 'Unauthorized': - message = context.localize('client.secret.incorrect') - message_timeout = 7000 - - if ok_dialog: - context.get_ui().on_ok(title, message) - else: - context.get_ui().show_notification(message, - title, - time_ms=message_timeout) + if 'code' in msg: + code = msg['code'] - return False + if error and code: + title = '%s: [%s] %s' % ('LoginException', code, error) + elif error: + title = '%s: %s' % ('LoginException', error) + else: + title = 'LoginException' + context.log_error('%s: %s' % (title, log_message)) + + if error == 'deleted_client': + message = context.localize('key.requirement') + context.get_access_manager().update_access_token( + context.get_param('addon_id', None), + access_token='', + expiry=-1, + refresh_token='', + ) + ok_dialog = True + + if error == 'invalid_client': + if message == 'The OAuth client was not found.': + message = context.localize('client.id.incorrect') + message_timeout = 7000 + elif message == 'Unauthorized': + message = context.localize('client.secret.incorrect') + message_timeout = 7000 + + if ok_dialog: + context.get_ui().on_ok(title, message) + else: + context.get_ui().show_notification(message, + title, + time_ms=message_timeout) return True def tear_down(self): diff --git a/plugin.video.youtube/resources/settings.xml b/plugin.video.youtube/resources/settings.xml index d01bd58dcd..ea33b17cbb 100644 --- a/plugin.video.youtube/resources/settings.xml +++ b/plugin.video.youtube/resources/settings.xml @@ -1,7 +1,7 @@
- + 0 @@ -32,7 +32,7 @@ 3 - + @@ -78,7 +78,7 @@ 2 - + @@ -198,7 +198,7 @@ - + 0 true @@ -242,7 +242,7 @@ - + @@ -284,7 +284,7 @@ - + @@ -406,7 +406,7 @@ true - + 0 true @@ -493,7 +493,7 @@ 30038 - + 0 true @@ -529,7 +529,7 @@ true - + 0 true @@ -549,7 +549,7 @@ true - + 0 false @@ -592,8 +592,8 @@ - - + + 0 false @@ -647,7 +647,7 @@ - + 0 true @@ -688,7 +688,7 @@ 0 - 3 + 2 @@ -706,7 +706,7 @@ 0 - 0 + 1 @@ -721,7 +721,7 @@ - + 0 true @@ -757,7 +757,7 @@ - + 0 true @@ -857,21 +857,41 @@ - - + + + 0 + + true + + RunScript($ID,config/language_region) + + true + + + 0 en-US false - 30523 + 248 - + 0 US false - 30550 + 20026 + + + + 0 + + true + + RunScript($ID,config/geo_location) + + true @@ -897,7 +917,7 @@ - + 0 90 @@ -921,7 +941,7 @@ - + 0 true @@ -953,8 +973,91 @@ 14045 + + 0 + 1 + + + + + + + + + + + 4 + false + + + + 0 + 0 + + + + + + + + + + + + 2 + + + + + 0 + + + true + + + 2 + + + + + 0 + 8080 + + 1 + 1 + 65535 + + + 2 + + + + + 0 + + + true + + + 2 + + + + + 0 + + + true + + + 2 + + + true + + - + 0 0.0.0.0 @@ -972,7 +1075,7 @@ true - + 0 50152 @@ -980,7 +1083,7 @@ 65535 - 30619 + 730 @@ -1007,6 +1110,13 @@ + + + 0 + false + + +