diff --git a/README.md b/README.md index 70b2f9cb..e254b157 100644 --- a/README.md +++ b/README.md @@ -81,6 +81,7 @@ Some people argue that PKC is 'hacky' because of the way it directly accesses th + Hungarian, thanks @savage93 + Ukrainian, thanks @uniss + Lithuanian, thanks @egidusm + + Korean, thanks @so-o-bima ### Additional Artwork PKC uses additional artwork for free from [TheMovieDB](https://www.themoviedb.org). Many thanks for lettings us use the API, guys! diff --git a/addon.xml b/addon.xml index e9e0953a..41fa5f77 100644 --- a/addon.xml +++ b/addon.xml @@ -1,5 +1,5 @@ - + @@ -83,13 +83,41 @@ Нативна інтеграція Plex в Kodi Підключає Kodi до серверу Plex. Цей плагін передбачає, що ви керуєте всіма своїми відео за допомогою Plex (і ніяк не Kodi). Ви можете втратити дані, які вже зберігаються у відео та музичних БД Kodi (оскільки цей плагін безпосередньо їх змінює). Використовуйте на свій страх і ризик! Використовуйте на свій ризик + Lieto uz savu atbildību Inbyggd integrering av Plex i Kodi Anslut Kodi till din Plex Media Server. Detta tillägg antar att du hanterar alla dina filmer med Plex (och ingen med Kodi). Du kan förlora data redan sparad i Kodis video och musik databaser (eftersom detta tillägg direkt ändrar dem). Använd på egen risk! Använd på egen risk Natūralioji „Plex“ integracija į „Kodi“ Prijunkite „Kodi“ prie „Plex Medija Serverio“. Šiame papildinyje daroma prielaida, kad valdote visus savo vaizdo įrašus naudodami „Plex“ (ir nė vieno su „Kodi“). Galite prarasti jau saugomus „Kodi“ vaizdo įrašų ir muzikos duomenų bazių duomenis (kadangi šis papildinys juos tiesiogiai pakeičia). Naudokite savo pačių rizika! Naudokite savo pačių rizika - version 3.1.0: + Plex를 Kodi에 기본 통합 + Kodi를 Plex Media Server에 연결합니다. 이 플러그인은 Plex로 모든 비디오를 관리하고 Kodi로는 관리하지 않는다고 가정합니다. Kodi 비디오 및 음악 데이터베이스에 이미 저장된 데이터가 손실 될 수 있습니다 (이 플러그인이 직접 변경하므로). 자신의 책임하에 사용하십시오! + 자신의 책임하에 사용 + version 3.2.0: +WARNING: Database reset and full resync required +- version 3.1.1-3.1.4 for everyone + +version 3.1.4 (beta only): +- Fix Alexa and RuntimeError: dictionary keys changed during iteration +- Fix AttributeError: module 'shutil' has no attribute 'copy_tree' + +version 3.1.3 (beta only): +- Add PKC setting to disable verification whether we can access a media file +- Direct paths: corrections to more closely mirror Kodi's way of saving movie and tv show files to the db +- Make sure that the correct file system encoding is used for playlists +- Fix a rare AttributeError when using playlists +- Fix regression: fix add-on paths always falling back to direct paths + +version 3.1.2 (beta only): +- Fix ImportError: cannot import name 'dir_util' from 'distutils' on PKC startup +- Fix UnicodeEncodeError if Plex playlist name contains illegal chars +- Fix PKC not showing up as a casting target in some cases + +version 3.1.1 (beta only): +- Direct paths: fix filename showing instead of full video metadata during playback +- Update translations + +version 3.1.0: - version 3.0.16 and 3.0.17 for everyone - Fix resume not working if Kodi player start-up is slow @@ -163,885 +191,6 @@ version 3.0.1: version 3.0.0: - Major upgrade from Python 2 to Python 3, allowing use of Kodi 19 Matrix - -version 2.12.18 (beta only): -- Quickly sync recently watched items before synching the playstates of the entire Plex library -- Improve logging for websocket JSON loads - -version 2.12.17 (beta only): -- Sync name and user rating of a TV show season to Kodi -- Fix rare TypeError: expected string or buffer on playback start - -version 2.12.16: -- versions 2.12.14 and 2.12.15 for everyone - -version 2.12.15 (beta only): -- Fix skip intros sometimes not working due to a RuntimeError -- Update translations - -version 2.12.14 (beta only): -- Add skip intro functionality - -version 2.12.13: -- Fix KeyError: u'game' if Plex Arcade has been activated -- Fix AttributeError: 'App' object has no attribute 'threads' when sync is cancelled - -version 2.12.12: -- Hopefully fix rare case when sync would get stuck indefinitely -- Fix ValueError: invalid literal for int() for invalid dates sent by Plex -- version 2.12.11 for everyone - -version 2.12.11 (beta only): -- Fix PKC not auto-picking audio/subtitle stream when transcoding -- Fix ValueError when deleting a music album -- Fix OSError: Invalid argument when Plex returns an invalid timestamp - -version 2.12.10: -- Fix pictures from Plex picture libraries not working/displaying - -version 2.12.9: -- Fix Local variable 'user' referenced before assignement - -version 2.12.8: -- version 2.12.7 for everyone - -version 2.12.7 (beta only): -- Fix PKC suddenly using main Plex user's credentials, e.g. when the PMS address changed -- Fix missing Kodi tags for movie collections/sets - -version 2.12.6: -- Fix rare KeyError when using PKC widgets -- Fix suspension of artwork caching and PKC becoming unresponsive -- Update translations -- Versions 2.12.4 and 2.12.5 for everyone - -version 2.12.5 (beta only): -- Greatly improve matching logic for The Movie Database if Plex does not provide an appropriate id -- Fix high transcoding resolutions not being available for Win10 -- Fix rare playback progress report failing and KeyError: u'containerKey' -- Fix rare KeyError: None when trying to sync playlists -- Fix TypeError when canceling Plex sync section dialog - -version 2.12.4 (beta only): -- Hopefully fix freeze during sync: Don't assign multiple sets/collections for a specific movie -- Support metadata provider ids (e.g. for IMDB) for the new Plex Movie Agent - -version 2.12.3: -- Fix playback failing due to caching of subtitles with non-ascii chars -- Fix ValueError: invalid literal for int() with base 10 during show sync -- Fix UnboundLocalError when certain Plex sections are deleted or being un-synched -- New method to install PlexKodiConnect directly via an URL. You thus do not need to upload a ZIP file to Kodi anymore. - -version 2.12.2: -- version 2.12.0 and 2.12.1 for everyone -- Fix regression: sync dialog not showing up when it should - -version 2.12.1 (beta only): -- Fix PKC shutdown on Kodi profile switch -- Fix Kodi content type for images/photos -- Added support for custom set of safe characters when escaping paths (thanks @geropan) -- Revert "Don't allow spaces in devicename" -- Fix sync dialog showing in certain cases even though user opted out - -version 2.12.0 (beta only): -- Fix websocket threads; enable PKC background sync for all Plex Home users! -- Fix PKC incorrectly marking a video as unwatched if an external player has been used -- Update translations - -version 2.11.7: -- Fix PKC crashing on devices running Microsoft UWP, e.g. XBox - -version 2.11.6: -- Fix rare sync crash when queue was full -- Set "Auto-adjust transcoding quality" to false by default - -version 2.11.5: -- Versions 2.11.0-2.11.4 for everyone - -version 2.11.4 (beta only): -- Fix another TypeError: 'NoneType' object has no attribute '__getitem__', e.g. when trying to play trailers - -version 2.11.3 (beta only): -- Fix TypeError: 'NoneType' object has no attribute '__getitem__', e.g. when displaying albums - -version 2.11.2 (beta only): -- Refactor direct and add-on paths. Enables use of Plex music playlists synched to Kodi - -version 2.11.1 (beta only): -- Rewire the set-up of audio and subtitle streams, esp. before starting a transcoding session. Fixes playback not starting at all - -version 2.11.0 (beta only): -- Fix PKC not burning in (and thus not showing) subtitles when transcoding -- When transcoding, only let user choose to burn-in subtitles that can't be displayed otherwise by Kodi -- Improve PKC automatically connecting to local PMS -- Ensure that our only video transcoding target is h264 -- Fix adjusted subtitle size not working when burning in subtitles -- Fix regression: burn-in subtitles picking up the last user setting instead of the current one - -version 2.10.12: -- versions 2.10.5-11 for everyone - -version 2.10.11 (beta only): -- Fix yet another rare but annoying bug where PKC becomes unresponsive during sync - -version 2.10.10 (beta only): -- Fix rare but annoying bug where PKC becomes unresponsive during sync -- Fix PKC background sync not working in some cases - -version 2.10.9 (beta only): -- Other Kodi add-ons can now search for Plex items using plugin://plugin.video.plexkodiconnect?mode=search&query=YOUR SEARCH STRING HERE - -version 2.10.8 (beta only): -- Improve thread pool management to render PKC snappier -- Attempt to fix broken pipe error -- Fix DirectPaths when a video's folder name is identical to a video's filename (you will need to manually reset the Kodi database) - -version 2.10.7 (beta only): -- Fix PKC not starting up on iOS -- Optimize the new sync process and fix some bugs that were introduced -- Fix PKC becoming unresponsive e.g. when switching the PMS - -version 2.10.6 (beta only): -- Fix AttributeError if user enters an invalid pin code -- Fix OperationalError when starting with a fresh PKC installation -- Fix IndexError - -version 2.10.5 (beta only): -- Rewire library sync to speed it up and fix sync getting stuck in rare cases -- Optimize threads by using events instead of a polling mechanism. Fixes PKC becoming unresponsive, e.g. when switching users -- Optimize adding values to Kodi databases by not using sqlite COALESCE command -- Fix OperationalError when resetting PKC -- Improve sync resiliance when certain items are not to be synced to Kodi or PKC skipped an item in the past -- Make sure bool is returned instead of an int -- Don't use WAL mode for sqlite connections, it is not making any difference - -version 2.10.4: -- version 2.10.3 for everyone -- Fix to correctly wipe Kodi databases - -version 2.10.3 (beta only): -- Fix a couple of issues with music when using direct paths: correctly escape music paths for Kodi regex matching -- Fix Recently Added Albums sort order (you will have to reset the Kodi database manually) -- Fix database being locked in rare cases -- Increase batch size for library sync from 500 to 2000 to increase sync speed -- Optimize some code -- Fix KeyError when using Plex search capabilities -- Check faster for available Plex Media Server to connect to - -version 2.10.2: -- Fix Kodi playback jumping to the beginning of a video that just started -- Fix transcoding quality degenerating quickly while playing with a new setting to deactivate auto quality for transcoding (applicable e.g. for Chromecast) -- Update translations - -version 2.10.1: -- Fix resume for Kodi on low powered devices, e.g. Raspberry Pi -- Fix resume when using an external player -- Fix UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode - interpreting them as being unequal - -version 2.10.0: -- version 2.9.12 - 2.9.14 for everyone -- Get rid of some obsolete code for the ContextMonitor we dropped - -version 2.9.14 (beta only): -- Fix resume when starting playback via PMS or when force transcoding -- Get rid of ContextMonitor and the dedicated Python thread - with new resume mechanics, this is not needed anymore -- Optimize clean-up of file table in the Kodi video database after stopping playback -- Get rid of some obsolete imports - -version 2.9.13 (beta only): -- Fix PKC resuming instead of playing from the beginning - -version 2.9.12 (beta only): -- Fix resume not working in some cases -- Support Plex search across all media and Plex Media Servers: Navigate to the PlexKodiConnect Add-on, then "Search" -- Always use the current Kodi language when communicating with the PMS (restart Kodi when changing the language!) -- Fix Kodi crashing when casting from e.g. Plex Web or Plex for Windows -- Fix PKC throwing error if m3u playlist contains resume information - -version 2.9.11: -- version 2.9.10 for everyone - -version 2.9.10 (beta only): -- Add tmdb provider sync -- Fix external subtitles not being available -- Fix PKC increasing the Plex watch count by 2 instead of 1 -- Improve subtitle naming -- Delete temporary subtitles on playback stop -- Fix a missleading string - -version 2.9.9: -- Versions 2.9.6 - 2.9.8 for everyone - -version 2.9.8 (beta only): -- Fix Play Error in scenarios (older PMS version?) where posting playqueues using an uri `server://` is not possible and `library://` is necessary -- Fix rare AttributeError on PKC startup when modifying advancedsettings.xml -- Update translations - -version 2.9.7 (beta only): -- Correctly escape URLs for Direct Paths -- Update settings to inform user that reboot is necessary -- Optimize code -- Don't migrate PKC settings if we're dealing with a clean new PKC installation -- Force-scan every single item in the library - seems like we could lose some recently added items otherwise when updating PKC - -version 2.9.6 (beta only): -- Rework logic for using direct paths, direct play, direct streaming and transcoding, using the PMS StreamingBrain: Let PMS StreamingBrain decide on whether we need to force-transcode, New setting to choose "Direct Streaming", Allow for 4k transcoding and direct streaming, New setting to force transcode only 4K and above -- Fix PKC background sync synching items to Kodi even though entire section should not be synched -- Force a full sync of all items after choosing a new PMS, changing a PMS' address and changing which Plex libraries to sync -- Only enforce advancedsettings.xml 'cleanonupdate' to be false for PKC add-on paths -- Never give up trying to connect to the PMS or Alexa using websockets -- Fix resume when force-transcoding - -version 2.9.5: -- Version 2.9.4 for everyone - -version 2.9.4 (beta only): -- Fix extras not playing when path substitution is enabled -- Fix Plex Companion device restarting playback when reconnecting to PKC -- Fix playback report not working after having played a non-Plex video file -- Change how items are added to Plex playqueues by using PMS machine identifier -- Optimize code for playqueue items -- Fix rare AttributeError when shutting down Kodi - -version 2.9.3: -- version 2.9.2 for everyone - -version 2.9.2 (beta only): -- Fix Plex Companion casting from iOS and Android -- Faster sync of playlists -- Sync playlists immediately after synching new/changed items and show an info dialog -- Fix potential playlist sync issues if there is a dot in the playlist name -- Correctly detect whether we already synched a Kodi playlist -- Remove obsolete check if path is indeed in unicode -- Add unicode representation to Playlist() class -- Separate function to wipe all synched Plex playlists -- Less logging when comparing PKC versions - -version 2.9.1: -- Fix On Deck and Recently Added Episodes for shows not appending showname and season and episode number - -version 2.9.0: -WARNING: You might have to manually select your PKC widgets again -- versions 2.8.8 - 2.8.11 for everyone -- Fix AttributeError: 'NoneType' object has no attribute 'attrib' on playback startup -- Add new Lithuanian translations (thanks @egidusm) - -version 2.8.11 (beta only): -- Support for the Up Next Kodi add-on -- Fix casting to PlexKodiConnect always starting the first episode -- Rename video nodes for ondeck - -version 2.8.10 (beta only): -- Fix broken PKC update - -version 2.8.9 (beta only): -- Fix sections that are not synced not displaying menu but entire library -- Provide more metadata for unsynced directory-like items like a tv show -- Fix 'Plex.nodes."id".path' not linking directly to entire library - -version 2.8.8 (beta only): -WARNING: You might have to manually select your PKC widgets again -- Ensure correct Kodi Container.Type is set for PKC widgets -- Fix missing cast artwork if an actor also acted as director or writer for another movie. You will have to manually reset the Kodi DB. - -version 2.8.7: -- Fix PKC potentially marking a video as watched on startup; don't sync time by toggling a video watch status but use PMS epoch time - -version 2.8.6: -- Fix PKC creating thousands of playlists if a single Kodi playlist wasn't unique -- Fix FutureWarning - -version 2.8.5: -- Fix Trakt add-on not recognizing id of tv shows (you will need to manually reset the Kodi database in the PKC settings under Advanced) -- Update translations - -version 2.8.4: -- Fix for Kodi 17 Krypton TypeError on playback start: 'offscreen' is an invalid keyword argument for this function -- Fix widgets not being populated after very first PlexKodiConnect library sync without a restart of Kodi -- Don't restart Kodi if user chose to enter PKC settings on install - -version 2.8.3: -- Versions 2.8.1-2.8.2 for everyone - -version 2.8.2 (beta only): -- Add an additional, faster On Deck node for movies (for tv shows, this is impossible, unfortunately) -- Introduce limits to the number of videos shown in PKC widgets to speed them up -- Fix TypeError for Direct Paths: init() got an unexpected keyword argument ‘item’ -- Fix In Progress widgets being broken and tv shows showing up as completely watched -- Update translations - -version 2.8.1 (beta only): -- Fix playback startup and RuntimeError: Unknown exception thrown from the call "XBMCAddon::xbmcplugin::setResolvedUrl" -- Refactor Plex API -- Fix TV Show clearlogo not displaying during playback -- Fix rare UnicodeDecodeError on library sync -- Add additional info dialog for PKC synching playlists -- Update translations - -version 2.8.0: -- Finally fix Kodi crashing on playback startup for add-on paths! -- All the good stuff from 2.7.15-2.7.18 for everyone - -version 2.7.18 (beta only): -- Fix Kodi always playing the same file version of a video if several are present -- Also play trailers if user chose to resume movie from the beginning -- Ask user whether to resume if using Direct Paths and user initiated playback via PMS -- Fix video thrown by Plex Companion not resuming - -version 2.7.17 (beta only): -- Another attempt to keep Kodi from crashing on playback startup - -version 2.7.16 (beta only): -- Hopefully fix Kodi crashing on playback startup for good - -version 2.7.15 (beta only): -- Hopefully fix Kodi crashing on playback startup -- Refresh widgets only on homescreen to prevent cursor from jumping within libraries -- Don't refresh container when user chose to delete or refresh an item from the context menu - -version 2.7.14: -- Correctly clear window variables e.g. on user switch -- Reload skin on resetting PKC video nodes -- Fix last-played node value to ensure a playcount greater than zero -- 2.7.11-2.7.13 for everyone - -version 2.7.13 (beta only): -- Fix transcoding not working -- Fix 4k H265 not being transcoded -- Fix some appearance tweak settings -- Fix music and picture nodes pointing to video library -- Fix unequality when comparing sections -- Fix Plex Companion logging error messages - -version 2.7.12 (beta only): -- Fix UnicodeEncodeError on playback startup for direct paths -- Attempt to fix rare Kodi crash on PKC exit - -version 2.7.11 (beta only): -- Fixes to unicode -- Cleanup code, remove some obsolet methods and functions -- Fix FutureWarning - -version 2.7.10: -- Fix duplicate music entries for direct paths (you will need to manually reset the Kodi database) -- Fix UnicodeEncodeError for Direct Paths and some PKC video nodes -- Fix playback sometimes not being reported for direct paths -- Update translations - -version 2.7.9: -- Wait for PKC to authorize before loading widgets -- Fix UnicodeDecodeError for libraries with non-ASCII paths -- Fix TypeError on Kodi start -- Fix Kodi Masterlock for nfs paths (requires restart) - -version 2.7.8: -- Fix widgets not working in some cases like NVidia Shield -- Fix appending of show title, season and episode number -- Fix node paths for skins - -version 2.7.7: -- Fix sync not working due to non-ASCII Plex library names -- Fix PKC synching playstate to wrong user on profile switch. Be aware that Kodi profile switches are error-prone -- Fix playback sometimes not being reported for direct paths -- Fix float() argument must be a string or a number -- Fix nodes for skin use -- Fix 'NoneType' object has no attribute 'kodi_path' - -version 2.7.6: -- Make 2.7.5 available for everyone - -version 2.7.5: -- Giant overhaul of widgets -- Fix some KeyErrors when playing songs -- Fix rare cases where playlists were being created - -version 2.7.4: -- Fix PKC not synching new items if an older Kodi db is present - -version 2.7.3: -- Fix PKC trying to initialize playqueues over and over again -- Fix PKC not starting due to a higher version Kodi database - -version 2.7.2: -- Fix Kodi profile switch not working correctly and PKC not exiting cleanly - -version 2.7.1: -- Fix playback not starting at all -- Fix rare TypeError: unsupported operand type(s) for /: 'NoneType' and 'int' on playback startup -- Improve plex db lookups by creating better db indicees -- Fix background sync crashing in rare cases -- Update translations -- Add Ko-fi donate button - -version 2.7.0: -- WARNING: You will need to reset the Kodi database if you're using the stable version of PKC! -- Version 2.6.6-9 for everyone -- Choose which Plex libraries get synched to Kodi - -version 2.6.9 (beta only): -- Fix PKC crashing on resetting the database - -version 2.6.8 (beta only): -- Choose which Plex libraries get synched to Kodi -- Fix PKC becoming unresponsive -- Fix rare case where thousands of identical playlists could be generated -- Fix movies or shows disappearing in fringe cases -- Fix processing of collections in special cases -- Implement Codacy suggestions - -version 2.6.7 (beta only): -- Fix "Unauthorized for PMS" e.g. on switching Plex users -- Improve error messages when playback failes - -version 2.6.6 (beta only): -- WARNING: You will need to reset the Kodi database! -- Greatly speed up sync for episodes, especially for large libraries -- Allow websocket redirects. Never allow insecure HTTPs connections for Kodi Leia -- Optimize headers for communication with PMS to appear like a Plex Media Player -- Fix PMS log entries 'Unable to find client profile for device' -- Improve sync dialog - -version 2.6.5: -- Fix extras not playing -- Hide "Verify SSL certificate" setting for Kodi 18 Krypton -- Improve logging -- Update translations - -version 2.6.4: -- Fix music items getting deleted on startup -- Never ignore SSL certificate errors for Kodi >= 18 - just like Kodi -- Fix playback not starting at the beginning -- Improve dialog to manually enter PMS IP and port -- Show logged in Plex home user in the settings and allow changing it -- Update German strings -- Implement Codacy suggestions - -version 2.6.3: -- Fix PKC crashing on Xbox - -version 2.6.2: -- Fix playlist sync: sequence item 0: expected string or unicode -- Fix PKC not deleting all the items it should -- Fix keyError 'sessionKey' for weird PMS messages -- Fix artwork caching AttributeError: 'ImageCachingThread' object has no attribute 'cancel' -- Improve pop-up "Searching for PMS" -- Fix FutureWarning - -version 2.6.1: -- WARNING: You will need to reset the Kodi database! -- Fix TV sections not being deleted e.g. after user switch -- Don't show a library sync error pop-up when full sync is interrupted -- Fix to correctly escape paths -- Update translations - -version 2.6.0: -- Support for Kodi 18 Leia -- Big overhaul of the synching process, it's now much faster -- PKC now supports really big Plex and Kodi libraries -- Too many other improvements to recount. See the changelog for the 2.5.x versions -Furthermore: -- Don't lock Plex DB when processing websocket messages -- Fix KeyError: u'kodi_fileid' for some Plex websocket messages -- Update translations - -version 2.5.23 (beta only): -- Hopefully fix slow playback startup just after Kodi startup -- Better, safer way to enter network credentials for Direct Paths -- Fix check whether a direct path is accessible -- Fix OperationalError: no such table on database reset -- Fix widgets not displaying correct playstate after PKC startup -- Fix 'NoneType' object has no attribute 'execute' when Plex artwork is not synced and an item is deleted -- Update translations -- Log whether Plex artwork is synced to Kodi - -version 2.5.22 (beta only): -- Fix rare EOFError and PKC starting wrong video as a consequence - -version 2.5.21 (beta only): -- Fix KodiVideoDB object has no attribute kodiconn -- Fix local variable 'set_api' referenced before assignment - -version 2.5.20 (beta only): -- Begin a new transaction when database was locked -- Fix browsing to show from info dialog -- Fix rare KeyError if user is playing something somewhere else - -version 2.5.19 (beta only): -- Fix crash on startup-sync due to missing albums -- Fix browsing to show from info dialog - -version 2.5.18 (beta only): -- Fix playback start: Don't lock databases when starting playback -- Refresh Kodi view only once on full syncs -- Ignore playstate updates for full sync time stamps croneter committed -- Try even longer to write to Kodi database -- Fix some items rarely not being synced - -version 2.5.17 (beta only): -- Fix playback not starting for really large libraries - -version 2.5.16 (beta only): -- Fix KeyError due to malformed PMS messages -- Fix to database parameter must be string - -version 2.5.15 (beta only): -- Make PKC potentially compatible with several database schemas -- Support for Kodi 18 Leia RC 5.2 -- Increase number of attempts to write to Kodi DB -- Further increase database sync resiliance - -version 2.5.14 (beta only): -Fix rare OperationalError: Locked Database - -version 2.5.13 (beta only): -- Fix playback not starting up -- Fix Plex channels and watch later not working -- Hopefully fix playstate not being synced to PMS - -version 2.5.12 (beta only): -- WARNING: You will need to reset the Kodi database! -- New option to not use Plex artwork -- Add-on paths: Fix resume if playback not initiated with PKC -- Increase database resiliance with sqlite WAL mode - -version 2.5.11 (beta only): -- Direct Paths: Fix AttributeError for widgets - -version 2.5.10 (beta only): -- Enable Plex Hub listings to be used for widgets -- Finally fix deleteting of items from PMS not working -- Catch sqlite OperationalError for websocket messages -- Revert "Increase database timeouts" - -version 2.5.9 (beta only): -- Compatibility with Kodi 18 RC 4 -- New setting to escape paths e.g. for HTTP direct paths -- Ensure path replacement never contains trailing (back)slash -- Leia: fix resetting of videoplayer autoplay next item -- Don't store identical show artwork for seasons -- Close DB connections while caching images -- Increase database timeouts -- Improve logging for seasons - -version 2.5.8 (beta only): -- Hopefully fix Kodi crashing on playback start -- Fix video resuming from old resume point -- Fix database is locked -- Faster way to initialize playlists on the Plex side -- Fix PKC recreating playlists too often -- Shutdown playlist sync if necessary - -version 2.5.7 (beta only): -- WARNING: You will need to reset the Kodi database! -- Increase timeout for database connections -- Fix music DB not being wiped on database reset -- Improve Plex playQueue resiliance - -version 2.5.6 (beta only): -- Fix many items not getting synced -- Fix episodes not being synced to due a missing season -- Fix some very few items not being synced -- Fix ValueError during sync due to missing Plex timestamp -- Fix resume for episodes for add-on paths -- Fix movies not showing up on switching PMS -- Finish full syncs during playbacks, don't start new ones -- Fix AttributeError when a playlist disappeared -- Close sync dialog if video playback starts -- Don't show sync messages while Kodi is playing something -- Only marking full sync as successful if that is indeed the case -- Optimize code - -version 2.5.5 (beta only): -- Fix OperationalError and PKC not starting up - -version 2.5.4 (beta only): -- Fix a couple of issues related to episodes -- Fix permanent missing library items if PMS failed to send a single response -- Fix OperationalError: enforce Kodi restart with clean DB once -- Fix switching PMS not recognizing when old PMS is selected -- Fix PKC not automatically connecting to changed PMS IP on startup -- Remove message "Full library sync finished" -- Fix PKC not automatically connecting to changed PMS IP on startup -- Remove cProfile program metrics measurements - -version 2.5.3 (beta only): -- Fix Plex sections not showing up or disappearing - -version 2.5.2 (beta only): -- Rewire library sync -- Optimize sqlite transactions -- Replace annoying sync message with PKC settings info -- Add PKC settings status indication for caching -- Fix KeyError when synching playlists -- Fix ImportError for Plex Companion gdm issues -- Increase database connection cache size -- Force-Reboot Kodi immediately if sqlite PRAGMA WAL causes errors -- Force a full sync on switching Plex username -- Fix wierd behavior upon switching to another PMS -- More bugfixes and code optimizations - -version 2.5.1 (beta only): -- Fix OSError on resetting the database - -version 2.5.0 (beta only): -- Huge rewrite of the sync mechanism - it should now be faster and more stable -- Sync huge Plex libraries now: the sync will load all data bit by bit -- Rewrote code for the main program loop, reducing the need for separate Python threads -- Rewrote and sped up code to access and change Kodi and Plex databases -- Fixes to Kodi 18 Leia music library -- Tons of other small fixes I can't remember - -version 2.4.10 (beta only): -- Use xml.etree.cElementTree whenever possible to avoid memory leaks - -version 2.4.9: -- Fix Kodi crashing due to PKC memory leak - -version 2.4.8: -- Make 2.4.4-2.4.7 available for everyone - -version 2.4.7 (beta only): -- Try to fix PKC for Enigma 2 -- Fix Kodi 18 wanting to scan tags for songs all the time (you will need to reset the database in the PKC settings) -- Optimize resetting of Kodi and Plex databases - -version 2.4.6 (beta only): -- Fix PKC not starting up on Enigma -- Fix sync issues if video lies in root of file system -- Make sure we retain a dummy first music artist entry -- Increase logging - -version 2.4.5 (beta only): -- Fix playback not starting up at all -- Rewire Kodi library refreshs -- Wipe Kodi database on first PKC run to more reliably install PKC - -version 2.4.4 (beta only): -- Fix rare case when playback would not start-up -- Increase logging - -version 2.4.3: -- Fix Kodi addons throwing jsonrpc errors (database reset needed) - -version 2.4.2: -- Make version 2.4.1 available for everyone - -version 2.4.1 (beta only): -- Hopefully fix endless playlist sync loops -- Ensure shows are deleted before seasons before episodes -- Fix library sync crash on deleting episode with missing season -- Fix numbering of already existing playlist files -- Optimize logging - -version 2.4.0: -- Use pretty Plex dialogs for everyone! - -version 2.3.14 (beta only): -- Fix AttributeError on forcing texture caching -- Switch to Plex style dialogs -- Include PKC info in plex.tv dialogs -- Include PKC info in user selection dialog - -version 2.3.13 (beta only): -- Pretty Plex dialogs for plex.tv sign-in and user selection -- Fix UnicodeDecodeError for PMS with non ASCII chars on local LAN discovery -- Fix add-on settings not opening on installation -- Greatly speed up deleting of items on the Kodi side -- Safely parse XMLs using defusedxml -- Fix PKC trying to sync audio playlists even when audio sync disabled -- Some code cleanup - -version 2.3.12: -- Fix Kodi hanging if media stream selection is aborted -- Fix potential sync crash -- Revert "Fix Kodi crash by committing to DB frequently" - -version 2.3.11 (beta only): -- Fix Kodi crash by committing to DB frequently - -version 2.3.10: -- Compatibility with Kodi 18 Leia Beta 1 -- Update translations -- Make version 2.3.9 available for everyone - -version 2.3.9 (beta only): -- Fix playback not resuming (Kodi 18 ignores listitem "StartOffset") -- Fix playerid not being retrieved for Kodi 18 -- Prefer local trailers; new setting to list extras instead of playing trailer - -version 2.3.8: -- Fix typo -- Make version 2.3.4-2.3.7 available for everyone - -version 2.3.7 (beta only): -- Fix library sync crash due to exotic playlist characters -- Force-deactivate playlist sync for Microsoft UWP for Kodi 18 - -version 2.3.6 (beta only): -- Fix PKC not starting by decoupling watchdog/subprocess modules - -version 2.3.5 (beta only): -- Fix PKC not starting by importing playlist module only when sync enabled - -version 2.3.4 (beta only): -- Fix playback sometimes not starting and UnicodeEncodeError for logging - -version 2.3.3: -- Choose trailer if several are present (DB reset required) - -version 2.3.2: -- Fix casting to PKC failing - -version 2.3.1: -- Fix library sync crashing due to Plex photo albums - -version 2.3.0: -Major stable version bump. Highlights: -- Sync Plex playlists to Kodi and Kodi playlists to Plex! -- Support for Plex collection/set artwork -- Many bug fixes, especially Plex Companion -- Tons of code improvements in the hope that someone else will help with developing PKC -Warning: the 2 helper add-ons for movies and tv shows also received an upgrade from 2.0.4 to 2.0.5. If you want to downgrade PKC, be sure to downgrade these add-ons as well! - -version 2.2.18 (beta only): -- Fix PKC tv show node "all" -- Move PKC playlist shortcut - -version 2.2.17 (beta only): -- Access Plex Hubs. Listing will be different depending on Kodi section! -- Fix year for songs missing -- Fix Plex extras not playing -- Fix rare library sync crash - -version 2.2.16 (beta only): -- Enable Kodi libraries for Plex Music libraries -- New Playlists menu item for video libraries -- Only show Plex libraries in the applicable Kodi media category -- Optimize code - -version 2.2.15 (beta only): -- Fix ImportError on first PKC run - -version 2.2.14 (beta only): -- Hopefully fix playlist sync loops - -version 2.2.13 (beta only): -- Fix library sync crash -- Fix switching to __future__ module -- Fix "Prefer Kodi Artwork" toggle doing the exact opposite -- Fix "Prefer Kodi artwork" setting not being visible - -version 2.2.12 (beta only): -- Fix slow sync. Fix endless sync of corrupted PMS elements -- Refactor playlist code -- Fix FutureWarning - -version 2.2.11 (beta only): -- Fix OnDeck widget for Direct Paths -- Fix Plex Companion crashing when connected to Plex Web -- Fix Plex Companion crash when connected to Plex Web playing playlist music -- Improve Plex playback report when playing music playlist -- Improve reliability in Kodi song playback -- Catch some errors if user mixes audio and video in Kodi playqueue - -version 2.2.10 (beta only): -- Fix playlists getting recreated and deleted in an endless loop -- Add some safety nets for playlist sync -- Fix FutureWarning -- Fix playlist sync settings not disappearing -- Optimize code - -version 2.2.9 (beta only): -- Hopefully fix Kodi and Plex playlists getting out of sync -- Fix and optimize startup of playlist sync -- Hide certain playlist settings under certain conditions -- Fix errors in Kodi log - -version 2.2.8 (beta only): -- Support for Plex collection artwork (PKC settings toggle under Artwork) -- Fix hard PKC reset not working (OSError: no such file) -- Deduplication -- Catch exception -- Update translations -- Extend Kodi metadata -- Update readme - -version 2.2.7 (beta only): -- Allow to only sync specific Plex or Kodi playlists -- Don't show artwork sync progress, reduce setting-writes -- Fix playback sometimes not starting up -- Use __future__ for contextmenu.py -- Fix imports - -version 2.2.6 (beta only): -- Fix default settings string, only show in English, hopefully fixes PKC loosing its settings - -version 2.2.5 (beta only): -- Fix AttributeError and add_update has crashed - -version 2.2.4 (beta only): -- Fix LibrarySync crashing due to Plex Companion messages - -version 2.2.3 (beta only): -- Compatibility with Kodi Krypton Alpha 2 -- Append tv show and SxxExx to episode playlist entries - -version 2.2.2 (beta only): -- Fixes to locking mechanisms which resulted in weird behavior in some cases -- Switch to Python __future__ unicode_literals and absolute paths -- Fix UnboundLocalError for playlists -- Check all Kodi database versions before starting PKC -- Fix KeyError on non-PKC playback startup -- Speed up subtitle download to Kodi -- Update translations -- PEP-8 stuff - -version 2.2.1 (beta only): -- Fix library sync crash due to PMS sending string, not unicode -- Fix playback from playlists for add-on paths -- Detect playback from a Kodi playlist for add-on paths - because we need some hacks due to Kodi bugs -- Fix add-on paths playstate and Plex Companion for playlists -- Fix Kodi telling Plex companion false playqueue position -- Don't try to get a Kodi library items for Plex clips -- Update translations - -version 2.2.0 (beta only): -- Support for syncing Plex playlists to Kodi and vice-versa! (Kodi mixed music and video playlists cannot be supported as Plex does not support them) - -version 2.1.6: -- Fix slow sync. Fix endless sync of corrupted PMS elements - -version 2.1.5: -- Fix OnDeck widget for Direct Paths - -version 2.1.4: -- Fix PKC settings suddenly getting lost -- Don't show artwork sync progress, reduce setting-writes - -version 2.1.3: -- Fix default settings string, only show in English, hopefully fixes PKC loosing its settings - -version 2.1.2: -- Compatibility with Kodi Krypton Alpha 2 -- Check all Kodi database versions before starting PKC -- Fix KeyError on non-PKC playback startup -- PEP-8 stuff - -version 2.1.1: -- Fix Library Sync crash on Android - -version 2.1.0: -Finally a new update for the stable version. You will need to reconnect to your PMS and reset the Kodi database once. Highlights of v2 include: -- Support for Plex extras -- Huge improvements to Plex Companion -- Fixes to Alexa voice control -- Kodi 18 Leia Alpha 1 support -- Improvements to playback start-up -- Improvements to the syncing mechanism, which should get rid of a ton of small bugs -- Fixes to widgets and resuming playback -- Use of plex.direct paths instead of local IP addresses to ensure the SSL certificates shown by the PMS are deemed valid -- Fix Kodi screensaver -- Faster PKC startup -- And tons of other stuff... + diff --git a/changelog.txt b/changelog.txt index 8e36a3cd..347eb674 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,3 +1,27 @@ +version 3.2.0: +WARNING: Database reset and full resync required +- version 3.1.1-3.1.4 for everyone + +version 3.1.4 (beta only): +- Fix Alexa and RuntimeError: dictionary keys changed during iteration +- Fix AttributeError: module 'shutil' has no attribute 'copy_tree' + +version 3.1.3 (beta only): +- Add PKC setting to disable verification whether we can access a media file +- Direct paths: corrections to more closely mirror Kodi's way of saving movie and tv show files to the db +- Make sure that the correct file system encoding is used for playlists +- Fix a rare AttributeError when using playlists +- Fix regression: fix add-on paths always falling back to direct paths + +version 3.1.2 (beta only): +- Fix ImportError: cannot import name 'dir_util' from 'distutils' on PKC startup +- Fix UnicodeEncodeError if Plex playlist name contains illegal chars +- Fix PKC not showing up as a casting target in some cases + +version 3.1.1 (beta only): +- Direct paths: fix filename showing instead of full video metadata during playback +- Update translations + version 3.1.0: - version 3.0.16 and 3.0.17 for everyone - Fix resume not working if Kodi player start-up is slow diff --git a/resources/language/resource.language.cs_CZ/strings.po b/resources/language/resource.language.cs_CZ/strings.po index 33418e4d..473069a2 100644 --- a/resources/language/resource.language.cs_CZ/strings.po +++ b/resources/language/resource.language.cs_CZ/strings.po @@ -1150,6 +1150,11 @@ msgctxt "#39071" msgid "Current plex.tv status:" msgstr "Současný stav plex.tv:" +# PKC Settings - Connection +msgctxt "#39072" +msgid "Background sync connection:" +msgstr "" + # PKC Settings, category name msgctxt "#39073" msgid "Appearance Tweaks" @@ -1225,6 +1230,31 @@ msgctxt "#39085" msgid "Reload Kodi node files to apply all the settings below" msgstr "Znovu načíst Kodi pro aplikování nastavení níže" +# PKC Settings - Connection - Background sync connection status +msgctxt "#39089" +msgid "Alexa connection status:" +msgstr "" + +# PKC Settings - Connection - Background sync connection status +msgctxt "#39091" +msgid "Timeout - not connected" +msgstr "" + +# PKC Settings - Connection - Background sync connection status +msgctxt "#39092" +msgid "IOError - not connected" +msgstr "" + +# PKC Settings - Connection - Background sync connection status +msgctxt "#39093" +msgid "Suspended - not connected" +msgstr "" + +# PKC Settings - Connection - Background sync connection status +msgctxt "#39094" +msgid "Managed Plex User - not connected" +msgstr "" + msgctxt "#39200" msgid "Log-out Plex Home User " msgstr "Odhlásit uživatele Plex Home " diff --git a/resources/language/resource.language.da_DK/strings.po b/resources/language/resource.language.da_DK/strings.po index e2181616..1e44b3e8 100644 --- a/resources/language/resource.language.da_DK/strings.po +++ b/resources/language/resource.language.da_DK/strings.po @@ -1153,6 +1153,11 @@ msgctxt "#39071" msgid "Current plex.tv status:" msgstr "Nuværende plex.tv status:" +# PKC Settings - Connection +msgctxt "#39072" +msgid "Background sync connection:" +msgstr "" + # PKC Settings, category name msgctxt "#39073" msgid "Appearance Tweaks" @@ -1230,6 +1235,31 @@ msgstr "" "Reload Kodi node filer for alle indstillinger\n" "nedeunder" +# PKC Settings - Connection - Background sync connection status +msgctxt "#39089" +msgid "Alexa connection status:" +msgstr "" + +# PKC Settings - Connection - Background sync connection status +msgctxt "#39091" +msgid "Timeout - not connected" +msgstr "" + +# PKC Settings - Connection - Background sync connection status +msgctxt "#39092" +msgid "IOError - not connected" +msgstr "" + +# PKC Settings - Connection - Background sync connection status +msgctxt "#39093" +msgid "Suspended - not connected" +msgstr "" + +# PKC Settings - Connection - Background sync connection status +msgctxt "#39094" +msgid "Managed Plex User - not connected" +msgstr "" + msgctxt "#39200" msgid "Log-out Plex Home User " msgstr "Log ud Plex hjemme bruger " diff --git a/resources/language/resource.language.de_DE/strings.po b/resources/language/resource.language.de_DE/strings.po index bc0f8af5..f1670b71 100644 --- a/resources/language/resource.language.de_DE/strings.po +++ b/resources/language/resource.language.de_DE/strings.po @@ -1171,6 +1171,11 @@ msgctxt "#39071" msgid "Current plex.tv status:" msgstr "Aktueller plex.tv Status:" +# PKC Settings - Connection +msgctxt "#39072" +msgid "Background sync connection:" +msgstr "Verbindungsstatus Hintergrund-Synchronisation:" + # PKC Settings, category name msgctxt "#39073" msgid "Appearance Tweaks" @@ -1246,6 +1251,31 @@ msgctxt "#39085" msgid "Reload Kodi node files to apply all the settings below" msgstr "Kodi neu laden um Einstellungen unten zu übernehmen" +# PKC Settings - Connection - Background sync connection status +msgctxt "#39089" +msgid "Alexa connection status:" +msgstr "Alexa Verbindungsstatus:" + +# PKC Settings - Connection - Background sync connection status +msgctxt "#39091" +msgid "Timeout - not connected" +msgstr "Timeout - nicht verbunden" + +# PKC Settings - Connection - Background sync connection status +msgctxt "#39092" +msgid "IOError - not connected" +msgstr "IOError - nicht verbunden" + +# PKC Settings - Connection - Background sync connection status +msgctxt "#39093" +msgid "Suspended - not connected" +msgstr "Angehalten - nicht verbunden" + +# PKC Settings - Connection - Background sync connection status +msgctxt "#39094" +msgid "Managed Plex User - not connected" +msgstr "Managed Plex User - nicht verbunden" + msgctxt "#39200" msgid "Log-out Plex Home User " msgstr "Plex Home Benutzer abmelden: " diff --git a/resources/language/resource.language.el_GR/strings.po b/resources/language/resource.language.el_GR/strings.po new file mode 100644 index 00000000..503029d8 --- /dev/null +++ b/resources/language/resource.language.el_GR/strings.po @@ -0,0 +1,1575 @@ +# XBMC Media Center language file +# Translators: +# Croneter None , 2017 +# +msgid "" +msgstr "" +"Project-Id-Version: PlexKodiConnect\n" +"Report-Msgid-Bugs-To: croneter@gmail.com\n" +"POT-Creation-Date: 2017-04-15 13:13+0000\n" +"PO-Revision-Date: 2017-04-30 08:30+0000\n" +"Last-Translator: Croneter None , 2017\n" +"Language-Team: Greek (Greece) (https://www.transifex.com/croneter/teams/73837/el_GR/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: el_GR\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +# Add-on settings +msgctxt "#29999" +msgid "PlexKodiConnect" +msgstr "PlexKodiConnect" + +msgctxt "#30000" +msgid "Server Address (IP)" +msgstr "Διεύθυνση (IP) του διακομιστή" + +msgctxt "#30001" +msgid "Searching for PMS" +msgstr "" + +msgctxt "#30002" +msgid "Preferred playback method" +msgstr "Προτιμώμενη μέθοδος αναπαραγωγής" + +# Warning displayed if Kodi setting is enabled. Be sure to escape the quotes +# again! The exact wording can be found in the Kodi settings, player settings, +# videos +msgctxt "#30003" +msgid "" +"Warning: Kodi setting \"Play next video automatically\" is enabled. This " +"could break PKC. Deactivate?" +msgstr "" + +msgctxt "#30004" +msgid "" +"The Kodi webserver is needed for artwork caching. PKC already set a strong, " +"random password automatically if you haven't done so already. Please confirm" +" the next dialog that you want to enable the webserver now with Yes." +msgstr "" + +msgctxt "#30005" +msgid "Username: " +msgstr "Όνομα χρήστη: " + +# Sync notification displayed if there is still artwork to be cached to Kodi +msgctxt "#30006" +msgid "Caching %s Plex images" +msgstr "" + +# Sync notification displayed if syncing of major artwork is done +msgctxt "#30007" +msgid "Plex image caching done" +msgstr "" + +# PKC settings artwork: Enable notifications for artwork image sync +msgctxt "#30008" +msgid "Enable notifications for image caching" +msgstr "" + +# PKC settings artwork: Enable image caching during Kodi playback +msgctxt "#30009" +msgid "Enable image caching during Kodi playback (restart Kodi!)" +msgstr "" + +# PKC settings - Artwork +msgctxt "#30010" +msgid "Approximate progress" +msgstr "" + +# PKC settings - Artwork +msgctxt "#30011" +msgid "Artwork left to cache:" +msgstr "" + +# Button text +msgctxt "#30012" +msgid "OK" +msgstr "Αποδοχή" + +msgctxt "#30013" +msgid "Never show" +msgstr "Να μην εμφανίζεται ποτέ" + +# PKC settings category +msgctxt "#30014" +msgid "Connection" +msgstr "Σύνδεση" + +# Pop-up notification if user tried to manually initiate fanart download +msgctxt "#30015" +msgid "Fanart download already running" +msgstr "" + +msgctxt "#30016" +msgid "Device Name" +msgstr "Όνομα συσκευής" + +# Error message +msgctxt "#30017" +msgid "Unauthorized for PMS" +msgstr "Μη εξουσιοδοτημένο στο PMS" + +# Sync notification displayed for the number of fanart.tv lookups left +msgctxt "#30018" +msgid "Checking FanartTV for %s items" +msgstr "" + +# PKC settings artwork options: status info +msgctxt "#30019" +msgid "FanartTV lookup completed" +msgstr "" + +# PKC settings sync options +msgctxt "#30020" +msgid "Sync Plex playlists (reboot Kodi!)" +msgstr "" + +# PKC settings sync options +msgctxt "#30021" +msgid "Only sync specific Plex playlists to Kodi" +msgstr "" + +# PKC settings category +msgctxt "#30022" +msgid "Advanced" +msgstr "Για προχωρημένους" + +# PKC settings sync options +msgctxt "#30023" +msgid "Only sync specific Kodi playlists to Plex" +msgstr "" + +msgctxt "#30024" +msgid "Username" +msgstr "Όνομα χρήστη" + +msgctxt "#30025" +msgid "Display message if PMS goes offline" +msgstr "Εμφάνιση μηνύματος αν αποσυνδεθεί το PMS" + +# PKC settings sync options +msgctxt "#30026" +msgid "Prefix in Plex playlist name to trigger sync" +msgstr "" + +# PKC settings sync options +msgctxt "#30027" +msgid "Prefix in Kodi playlist name to trigger sync" +msgstr "" + +# PKC settings artwork options: status info +msgctxt "#30028" +msgid "PKC-only image caching completed" +msgstr "" + +msgctxt "#30030" +msgid "Port Number" +msgstr "Αριθμός θύρας" + +msgctxt "#30031" +msgid "I own this Plex Media Server" +msgstr "Κατέχω αυτόν το Plex Media Server" + +# Kodi context menu entry for movie and episode information screen +msgctxt "#30032" +msgid "Information" +msgstr "" + +msgctxt "#30042" +msgid "Refresh" +msgstr "Ανανέωση" + +msgctxt "#30043" +msgid "Delete" +msgstr "Διαγραφή" + +# Notification displayed if there is a LOT to be deleted +msgctxt "#30052" +msgid "Deleting" +msgstr "Γίνεται διαγραφή" + +msgctxt "#30069" +msgid "None" +msgstr "Κανένα" + +msgctxt "#30093" +msgid "Mark Watched" +msgstr "Σήμανση ως προβληθέν" + +msgctxt "#30094" +msgid "Mark Unwatched" +msgstr "Σήμανση ως μη προβληθέν" + +msgctxt "#30095" +msgid "Add to Favorites" +msgstr "Προσθήκη στα αγαπημένα" + +msgctxt "#30096" +msgid "Remove from Favorites" +msgstr "Αφαίρεση από τα αγαπημένα" + +msgctxt "#30114" +msgid "Offer delete after playback" +msgstr "Ερώτηση για διαγραφή μετά την αναπαραγωγή" + +msgctxt "#30115" +msgid "For Episodes" +msgstr "Για επεισόδια" + +msgctxt "#30116" +msgid "For Movies" +msgstr "Για ταινίες" + +msgctxt "#30125" +msgid "Done" +msgstr "Ολοκληρώθηκε" + +# Error popup message text +msgctxt "#30128" +msgid "Play Error" +msgstr "Σφάλμα αναπαραγωγής" + +msgctxt "#30132" +msgid "Warning" +msgstr "Προειδοποίηση" + +msgctxt "#30135" +msgid "Error" +msgstr "Σφάλμα" + +msgctxt "#30138" +msgid "Search" +msgstr "Αναζήτηση" + +msgctxt "#30139" +msgid "Enable Theme Music (Requires Restart)" +msgstr "Ενεργοποίηση μουσικής θέματος (απαιτεί επανεκκίνηση)" + +msgctxt "#30143" +msgid "Always transcode if video bitrate is above" +msgstr "Μετατροπή πάντα εάν η ποιότητα βίντεο είναι πάνω από" + +msgctxt "#30157" +msgid "Enable Enhanced Images (eg CoverArt)" +msgstr "Ενεργοποίηση βελτιωμένων εικόνων (π.χ. CoverArt)" + +msgctxt "#30158" +msgid "Metadata" +msgstr "Μεταδεδομένα" + +msgctxt "#30160" +msgid "Video Quality if Transcoding necessary" +msgstr "Ποιότητα βίντεο εάν χρειάζεται μετατροπή" + +msgctxt "#30161" +msgid "Auto-adjust transcoding quality (deactivate for Chromecast)" +msgstr "" + +msgctxt "#30165" +msgid "Direct Play" +msgstr "Απευθείας Αναπαραγωγή" + +msgctxt "#30166" +msgid "Transcoding" +msgstr "Μετατροπή" + +msgctxt "#30170" +msgid "Recently Added TV Shows" +msgstr "Πρόσφατες σειρές" + +msgctxt "#30171" +msgid "In Progress TV Shows" +msgstr "Σειρές σε εξέλιξη" + +msgctxt "#30173" +msgid "Channels" +msgstr "Κανάλια" + +msgctxt "#30174" +msgid "Recently Added" +msgstr "Προστέθηκαν πρόσφατα" + +msgctxt "#30177" +msgid "In Progress Movies" +msgstr "Ταινίες σε εξέλιξη" + +msgctxt "#30178" +msgid "In Progress Episodes" +msgstr "Επεισόδια σε εξέλιξη" + +msgctxt "#30179" +msgid "Next Episodes" +msgstr "Επόμενα επεισόδια" + +msgctxt "#30180" +msgid "Favorite Movies" +msgstr "Αγαπημένες ταινίες" + +msgctxt "#30181" +msgid "Favorite Shows" +msgstr "Αγαπημένες σειρές" + +msgctxt "#30182" +msgid "Favorite Episodes" +msgstr "Αγαπημένα επεισόδια" + +msgctxt "#30189" +msgid "Unwatched Movies" +msgstr "Μη προβληθείσες ταινίες" + +msgctxt "#30198" +msgid "Search" +msgstr "Αναζήτηση" + +# For setting up direct paths and adding network credentials +msgctxt "#30200" +msgid "" +"In the following window, enter the server's hostname (or IP) where your Plex" +" media resides. Mind the case!" +msgstr "" + +# For setting up direct paths and adding network credentials - input window +# for hostname +msgctxt "#30201" +msgid "Enter server hostname (or IP)" +msgstr "" + +# For setting up direct paths and adding network credentials +msgctxt "#30202" +msgid "" +"In the following window, enter the network protocol you would like to use. " +"This is likely 'smb'." +msgstr "" + +# For setting up direct paths and adding network credentials - input window +# protocol +msgctxt "#30203" +msgid "Enter network protocol" +msgstr "" + +# For setting up direct paths and adding network credentials +msgctxt "#30204" +msgid "The hostname or IP '{0}' that you entered is not valid." +msgstr "" + +# For setting up direct paths and adding network credentials +msgctxt "#30205" +msgid "The protocol '{0}' that you entered is not supported." +msgstr "" + +# Video node naming for random e.g. movies +msgctxt "#30227" +msgid "Random" +msgstr "Τυχαίο" + +# Video node naming for e.g. movies +msgctxt "#30230" +msgid "Recommended" +msgstr "Προτεινόμενα" + +msgctxt "#30235" +msgid "Extras" +msgstr "Έξτρα" + +msgctxt "#30243" +msgid "Enable HTTPS" +msgstr "Ενεργοποίηση HTTPS" + +msgctxt "#30251" +msgid "Recently added Home Videos" +msgstr "Πρόσφατα προσωπικά βίντεο" + +msgctxt "#30252" +msgid "Recently added Photos" +msgstr "Πρόσφατες φωτοφραφίες" + +msgctxt "#30253" +msgid "Favorite Home Videos" +msgstr "Αγαπημένα Προσωπικά Βίντεο" + +msgctxt "#30254" +msgid "Favorite Photos" +msgstr "Αγαπημένες Φωτογραφίες" + +msgctxt "#30255" +msgid "Favorite Albums" +msgstr "Αγαπημένα Άλμπουμ" + +msgctxt "#30256" +msgid "Recently added Music videos" +msgstr "Πρόσφατα μουσικά βίντεο" + +msgctxt "#30257" +msgid "In progress Music videos" +msgstr "Μουσικά βίντεο σε εξέλιξη" + +msgctxt "#30258" +msgid "Unwatched Music videos" +msgstr "Μη προβληθέντα μουσικά βίντεο" + +# PKC settings sub category under appearance tweaks +msgctxt "#30302" +msgid "Movies" +msgstr "Ταινίες" + +# contextmenu entry +msgctxt "#30401" +msgid "Plex options" +msgstr "Ρυθμίσεις του Plex" + +# contextmenu entry +msgctxt "#30405" +msgid "Add to Plex favorites" +msgstr "Προσθήκη στα αγαπημένα του Plex" + +# contextmenu entry +msgctxt "#30406" +msgid "Remove from Plex favorites" +msgstr "Αφαίρεση από τα αγαπημένα του Plex" + +# contextmenu entry +msgctxt "#30407" +msgid "Set custom song rating" +msgstr "Ορισμός προσαρμοσμένης βαθμολογίας τραγουδιού" + +# contextmenu entry +msgctxt "#30408" +msgid "Plex addon settings" +msgstr "Ρυθμίσεις της προσθήκης Plex" + +# contextmenu entry +msgctxt "#30409" +msgid "Delete item from server" +msgstr "Διαγραφή στοιχείου από το διακομιστή" + +# contextmenu entry +msgctxt "#30410" +msgid "Refresh this item" +msgstr "Ανανέωση αυτού του στοιχείου" + +# contextmenu entry +msgctxt "#30412" +msgid "Force transcode" +msgstr "Επιβολή μετατροπής" + +# Error dialog text +msgctxt "#30414" +msgid "" +"Could not delete the Plex item. Is item deletion enabled on the Plex Media " +"Server?" +msgstr "" +"Δεν είναι δυνατή η διαγραφή του στοιχείου Plex. Είναι ενεργοποιημένη η " +"διαγραφή στοιχείου στο διακομιστή Plex Media Server;" + +# contextmenu entry +msgctxt "#30415" +msgid "Start playback via PMS" +msgstr "Έναρξη αναπαραγωγής μέσω PMS" + +msgctxt "#30416" +msgid "Settings for the Plex Server" +msgstr "Ρυθμίσεις για το Plex Server" + +msgctxt "#30417" +msgid "" +"Could not change the Kodi settings file {0}. PKC might not work correctly. " +"Error: {1}" +msgstr "" + +# PKC Settings - Connection +msgctxt "#30500" +msgid "Verify Host SSL Certificate (more secure)" +msgstr "Επαλήθευση πιστοποιητικού SSL εξυπηρετητή (πιο ασφαλές)" + +# PKC Settings - Connection +msgctxt "#30501" +msgid "Client SSL certificate" +msgstr "Πιστοποιητικό πελάτη" + +# PKC Settings - Artwork +msgctxt "#30502" +msgid "Sync Plex artwork from the PMS (recommended)" +msgstr "" + +# Message shown if SSL HTTPS certificate fails +msgctxt "#30503" +msgid "SSL certificate failed to validate. Please check {0} for solutions." +msgstr "" + +# PKC Settings, category name +msgctxt "#30506" +msgid "Sync Options" +msgstr "Επιλογές συγχρονισμού" + +# PKC Settings - Sync Options +msgctxt "#30507" +msgid "Show syncing progress" +msgstr "Εμφάνιση προόδου συγχρονισμού" + +# PKC Settings - Sync Options +msgctxt "#30508" +msgid "Sync empty TV Shows" +msgstr "Συγχρονισμός κενών σειρών" + +# PKC Settings - Sync Options +msgctxt "#30509" +msgid "Enable Music Library" +msgstr "Ενεργοποίηση μουσικής βιβλιοθήκης" + +msgctxt "#30510" +msgid "Direct stream music library" +msgstr "Άμεση ροή μουσικής βιβλιοθήκης" + +# PKC Settings - Sync Options +msgctxt "#30511" +msgid "Playback Mode" +msgstr "Τύπος αναπαραγωγής" + +# PKC Settings - Artwork +msgctxt "#30512" +msgid "Cache all artwork for a smooth Kodi experience" +msgstr "" + +# PKC Settings - Artwork +msgctxt "#30513" +msgid "Limit artwork cache threads (recommended for rpi)" +msgstr "Περιορισμός τοπικής αποθήκευσης εξωφύλλου (συνιστάται για rpi)" + +# PKC Settings - Sync Options +msgctxt "#30514" +msgid "Show all Plex extras instead of immediately playing trailers" +msgstr "" + +# PKC Settings - Sync Options +msgctxt "#30515" +msgid "Maximum items to request from the server at once" +msgstr "" +"Μέγιστος αριθμός στοιχείων που θα ζητούνται από το διακομιστή ταυτόχρονα" + +# PKC Settings, category name +msgctxt "#30516" +msgid "Playback" +msgstr "Αναπαραγωγή" + +# PKC Settings - Connection +msgctxt "#30517" +msgid "Set network credentials for Direct Paths and direct play" +msgstr "" + +# PKC Settings - Playback +msgctxt "#30518" +msgid "Enable Plex Trailers (Plexpass is needed)" +msgstr "Ενεργοποίηση τρέιλερ του Plex (Απαιτείται Plexpass)" + +# PKC Settings - Playback +msgctxt "#30519" +msgid "Ask to play trailers" +msgstr "Ερώτηση για αναπαραγωγή τρέιλερ" + +# PKC Settings - Plex +msgctxt "#30520" +msgid "Skip PMS delete confirmation (use at your own risk)" +msgstr "" + +# PKC Settings - Playback +msgctxt "#30521" +msgid "Jump back on resume (in seconds)" +msgstr "Επιστροφή στη συνέχιση (σε δευτερόλεπτα)" + +# PKC Settings - Playback +msgctxt "#30522" +msgid "Force transcode h265/HEVC" +msgstr "Επιβολή μετατροπής h265/HEVC" + +# PKC Settings - Sync Options +msgctxt "#30523" +msgid "Also show sync progress for playstate and user data" +msgstr "" + +# PKC Settings - Sync Options +msgctxt "#30524" +msgid "Select Plex libraries to sync" +msgstr "" + +# PKC Settings - Playback +msgctxt "#30525" +msgid "Skip intro" +msgstr "" + +# PKC Settings - Playback +msgctxt "#30527" +msgid "Ignore specials in next episodes" +msgstr "" + +msgctxt "#30528" +msgid "Permanent users to add to the session" +msgstr "" + +# PKC Settings - Advanced +msgctxt "#30529" +msgid "Startup delay (in seconds)" +msgstr "" + +msgctxt "#30531" +msgid "Enable new content notification" +msgstr "" + +msgctxt "#30532" +msgid "Duration of the video library pop up (in seconds)" +msgstr "" + +msgctxt "#30533" +msgid "Duration of the music library pop up (in seconds)" +msgstr "" + +msgctxt "#30534" +msgid "Server messages" +msgstr "" + +# PKC Settings - Advanced +msgctxt "#30535" +msgid "Generate a new unique Plex device Id (e.g. to clone Kodi)" +msgstr "" + +# PKC Settings - Connection +msgctxt "#30536" +msgid "Users must log in every time Kodi restarts" +msgstr "" + +# PKC Settings warning +msgctxt "#30537" +msgid "RESTART KODI IF YOU MAKE ANY CHANGES" +msgstr "" + +# PKC Settings warning +msgctxt "#30538" +msgid "Manual complete reset of Kodi database necessary, see \"Advanced\"" +msgstr "" + +# PKC Settings - Artwork +msgctxt "#30539" +msgid "Download additional art from FanArtTV" +msgstr "" + +# PKC Settings - Artwork +msgctxt "#30540" +msgid "Download movie set/collection art from FanArtTV" +msgstr "" + +# PKC Settings - Playback +msgctxt "#30541" +msgid "Transcoding: Auto-pick audio and subtitle stream using Plex defaults" +msgstr "" + +# PKC Settings - Playback +msgctxt "#30542" +msgid "Always pick best quality for trailers" +msgstr "" + +# PKC Settings - Artwork +msgctxt "#30543" +msgid "Prefer Kodi artwork for collections/sets" +msgstr "" + +msgctxt "#30544" +msgid "Artwork" +msgstr "Εξώφυλλο" + +# PKC Settings - Playback +msgctxt "#30545" +msgid "Force transcode pictures" +msgstr "" + +# Welcome to Plex notification +msgctxt "#33000" +msgid "Welcome" +msgstr "" + +# Error message +msgctxt "#33001" +msgid "Error connecting" +msgstr "" + +# Error message +msgctxt "#33002" +msgid "Server is unreachable" +msgstr "" + +# Plex notification +msgctxt "#33003" +msgid "Server is online" +msgstr "" + +# Plex notification when we need to transcode +msgctxt "#33004" +msgid "PMS enforced transcoding" +msgstr "" + +# Plex notification when we need to use direct streaming (instead of +# transcoding) +msgctxt "#33005" +msgid "PMS enforced direct streaming" +msgstr "" + +# Error notification +msgctxt "#33009" +msgid "Invalid username or password" +msgstr "" + +msgctxt "#33010" +msgid "User is unauthorized for server {0}" +msgstr "" + +msgctxt "#33011" +msgid "Plex.tv did not provide us a valid list of Plex users, sorry." +msgstr "" + +# Dialog before playback +msgctxt "#33013" +msgid "Choose the audio stream" +msgstr "" + +# Dialog before playback +msgctxt "#33014" +msgid "Choose the subtitles stream" +msgstr "" + +# Dialog before playback +msgctxt "#33016" +msgid "Play trailers?" +msgstr "" + +# Error message +msgctxt "#33032" +msgid "" +"Failed to generate a new device Id. See your logs for more information." +msgstr "" + +# Pop-up informing about Kodi restart +msgctxt "#33033" +msgid "Kodi will now restart to apply the changes." +msgstr "" + +# Confirmation dialog before item gets deleted from the PMS +msgctxt "#33041" +msgid "" +"Delete file(s) from Plex Server? This will also delete the file(s) from " +"disk!" +msgstr "" + +# PKC Settings - Playback +msgctxt "#39000" +msgid "- Number of trailers to play before a movie" +msgstr "" + +# PKC Settings - Playback +msgctxt "#39001" +msgid "Boost audio when transcoding" +msgstr "" + +# PKC Settings - Playback +msgctxt "#39002" +msgid "Burnt-in subtitle size" +msgstr "" + +# PKC Settings - Sync +msgctxt "#39003" +msgid "Number of simultaneous download threads" +msgstr "" + +# PKC Settings - Plex +msgctxt "#39004" +msgid "Enable Plex Companion (restart Kodi!)" +msgstr "" + +# PKC Settings - Plex +msgctxt "#39005" +msgid "Plex Companion Port (change only if needed)" +msgstr "" + +# PKC Settings - Plex +msgctxt "#39008" +msgid "Plex Companion: Allows flinging media to Kodi through Plex" +msgstr "" + +# Error message +msgctxt "#39009" +msgid "Could not login to plex.tv. Please try signing in again." +msgstr "" + +# Error message +msgctxt "#39010" +msgid "Problems connecting to plex.tv. Network or internet issue?" +msgstr "" + +# Error message +msgctxt "#39011" +msgid "Could not find any Plex server in the network. Aborting..." +msgstr "" + +# Dialog text for choosing PMS +msgctxt "#39012" +msgid "Choose your Plex server" +msgstr "" + +# Error message +msgctxt "#39013" +msgid "Not yet authorized for Plex server " +msgstr "" + +# Error message +msgctxt "#39014" +msgid "Please sign in to plex.tv." +msgstr "" + +# Error message +msgctxt "#39015" +msgid "Problems connecting to server. Pick another server?" +msgstr "" + +# Pop-up on initial sync +msgctxt "#39016" +msgid "" +"Disable Plex music library? (It is HIGHLY recommended to use Plex music only" +" with direct paths for large music libraries. Kodi might crash otherwise)" +msgstr "" + +# Pop-up on initial sync +msgctxt "#39017" +msgid "" +"Would you now like to go to the plugin's settings to fine-tune PKC? You will" +" need to RESTART Kodi!" +msgstr "" + +# PKC Settings - Advanced +msgctxt "#39018" +msgid "Repair the Kodi database (force update all content)" +msgstr "" + +# PKC Settings - Advanced +msgctxt "#39019" +msgid "Reset the Kodi database and optionally reset PlexKodiConnect" +msgstr "" + +# PKC Settings - Artwork +msgctxt "#39020" +msgid "Cache all images to Kodi texture cache now" +msgstr "" + +# Appended to a listed PMS if it is in the same LAN network as PKC +msgctxt "#39022" +msgid "local" +msgstr "" + +# Error message +msgctxt "#39023" +msgid "Failed to authenticate. Did you login to plex.tv?" +msgstr "" + +# PKC Settings - Plex +msgctxt "#39025" +msgid "Automatically log into plex.tv on startup" +msgstr "" + +# PKC Settings - Sync +msgctxt "#39026" +msgid "Enable constant background sync" +msgstr "" + +# Pop-up on initial sync +msgctxt "#39028" +msgid "" +"CAUTION! If you choose \"Native\" mode , you might loose access to certain " +"Plex features such as: Plex trailers and transcoding options. ALL Plex " +"shares need to use direct paths (e.g. smb://myNAS/mymovie.mkv or " +"\\\\myNAS/mymovie.mkv)!" +msgstr "" + +# Pop-up on initial sync +msgctxt "#39029" +msgid "Network credentials" +msgstr "" + +# Pop-up on initial sync +msgctxt "#39030" +msgid "" +"Add network credentials to allow Kodi access to your content? Note: Skipping" +" this step may generate a message during the initial scan of your content if" +" Kodi can't locate your content." +msgstr "" + +# Error message displayed when verifying Direct Path sync paths passed by Plex +msgctxt "#39031" +msgid "" +"Kodi cannot locate the file %s. Please verify your PKC settings. Stop " +"syncing?" +msgstr "" + +# Pop-up on initial sync +msgctxt "#39033" +msgid "" +"Transform Plex UNC library paths \\\\myNas\\mymovie.mkv automatically to smb" +" paths, smb://myNas/mymovie.mkv? (recommended)" +msgstr "" + +# PKC Settings - Customize Paths +msgctxt "#39034" +msgid "Replace Plex UNC paths \\\\myNas with smb://myNas" +msgstr "" + +# PKC Settings - Customize Paths +msgctxt "#39035" +msgid "" +"Replace Plex paths /volume1/media or \\\\myserver\\media with custom SMB " +"paths smb://NAS/mystuff" +msgstr "" + +# PKC Settings - Customize Paths +msgctxt "#39036" +msgid "Escape special characters in path (e.g. space to %20)" +msgstr "" + +# PKC Settings - Customize Paths +msgctxt "#39090" +msgid "Safe characters for http(s), dav(s) and (s)ftp urls" +msgstr "" + +# PKC Settings - Customize Paths +msgctxt "#39037" +msgid "Original Plex MOVIE path to replace:" +msgstr "" + +# PKC Settings - Customize Paths +msgctxt "#39038" +msgid "Replace Plex MOVIE with:" +msgstr "" + +# PKC Settings - Customize Paths +msgctxt "#39039" +msgid "Original Plex TV SHOWS path to replace:" +msgstr "" + +# PKC Settings - Customize Paths +msgctxt "#39040" +msgid "Replace Plex TV SHOWS with:" +msgstr "" + +# PKC Settings - Customize Paths +msgctxt "#39041" +msgid "Original Plex MUSIC path to replace:" +msgstr "" + +# PKC Settings - Customize Paths +msgctxt "#39042" +msgid "Replace Plex MUSIC with:" +msgstr "" + +# Pop-up on initial sync +msgctxt "#39043" +msgid "" +"Go a step further and completely replace all original Plex library paths " +"(/volume1/media) with custom SMB paths (smb://NAS/MyStuff)?" +msgstr "" + +# Pop-up on initial sync +msgctxt "#39044" +msgid "" +"Please enter your custom smb paths in the settings under \"Sync Options\" " +"and then restart Kodi" +msgstr "" + +# PKC Settings - Customize Paths +msgctxt "#39045" +msgid "Original Plex PHOTO path to replace:" +msgstr "" + +# PKC Settings - Customize Paths +msgctxt "#39046" +msgid "Replace Plex PHOTO with:" +msgstr "" + +# PKC Settings - Appearance Tweaks +msgctxt "#39047" +msgid "On Deck: Append show title to episode" +msgstr "" + +# PKC Settings - Appearance Tweaks +msgctxt "#39048" +msgid "On Deck: Append season- and episode-number SxxExx" +msgstr "" + +# PKC Settings - Advanced +msgctxt "#39049" +msgid "Nothing works? Try a full reset!" +msgstr "" + +# PKC Settings - Connection +msgctxt "#39050" +msgid "Choose Plex Server from a list" +msgstr "" + +# PKC Settings - Sync +msgctxt "#39051" +msgid "Wait before sync new/changed PMS item [s]" +msgstr "" + +# PKC Settings - Sync +msgctxt "#39052" +msgid "Background Sync" +msgstr "" + +# PKC Settings - Sync +msgctxt "#39053" +msgid "Do a full library sync every x minutes" +msgstr "" + +# Appended to a listed PMS if it is in the same LAN network as PKC +msgctxt "#39054" +msgid "remote" +msgstr "remote" + +# Notification pop-up +msgctxt "#39055" +msgid "Searching for Plex Server" +msgstr "" + +# PKC Settings - Customize paths +msgctxt "#39056" +msgid "" +"Used by sync and when attempting Direct Paths. Restart Kodi on changes!" +msgstr "" + +# PKC Settings, category name +msgctxt "#39057" +msgid "Customize Paths" +msgstr "" + +# PKC Settings - Appearance Tweaks +msgctxt "#39059" +msgid "Recently Added: Append show title to episode" +msgstr "" + +# PKC Settings - Appearance Tweaks +msgctxt "#39060" +msgid "Recently Added: Append season- and episode-number SxxExx" +msgstr "" + +# Pop-up during initial sync +msgctxt "#39061" +msgid "" +"Would you like to download additional artwork from FanArtTV in the " +"background?" +msgstr "" + +# PKC Settings - Sync +msgctxt "#39062" +msgid "Sync when screensaver is deactivated" +msgstr "" + +# PKC Settings - Playback +msgctxt "#39063" +msgid "Force Transcode Hi10P" +msgstr "" + +# PKC Settings - Appearance Tweaks +msgctxt "#39064" +msgid "Recently Added: Also show already watched episodes" +msgstr "" + +# PKC Settings - Appearance Tweaks +msgctxt "#39065" +msgid "Force-refresh Kodi skin on stopping playback" +msgstr "" + +# PKC Settings - Appearance Tweaks +msgctxt "#39066" +msgid "Recently Added: Also show already watched movies" +msgstr "" + +# PKC Settings - Connection +msgctxt "#39067" +msgid "Your current Plex Media Server:" +msgstr "" + +# PKC Settings - Connection +msgctxt "#39068" +msgid "Manually enter Plex Media Server address" +msgstr "" + +# PKC Settings - Connection +msgctxt "#39069" +msgid "Current address:" +msgstr "" + +# PKC Settings - Connection +msgctxt "#39070" +msgid "Current port:" +msgstr "" + +# PKC Settings - Connection +msgctxt "#39071" +msgid "Current plex.tv status:" +msgstr "" + +# PKC Settings - Connection +msgctxt "#39072" +msgid "Background sync connection:" +msgstr "" + +# PKC Settings, category name +msgctxt "#39073" +msgid "Appearance Tweaks" +msgstr "" + +# PKC Settings - Appearance Tweaks +msgctxt "#39074" +msgid "TV Shows" +msgstr "" + +# Pop-up during initial sync +msgctxt "#39076" +msgid "" +"If you use several Plex libraries of one kind, e.g. \"Kids Movies\" and " +"\"Parents Movies\", be sure to check the Wiki: https://goo.gl/JFtQV9" +msgstr "" + +# PKC Settings - Appearance Tweaks +msgctxt "#39077" +msgid "Maximum number of videos to show in widgets" +msgstr "" + +# PKC Settings - Plex +msgctxt "#39078" +msgid "Plex Companion Update Port (change only if needed)" +msgstr "" + +# Error message +msgctxt "#39079" +msgid "" +"Plex Companion could not open the GDM port. Please change it in the PKC " +"settings." +msgstr "" + +# Pop-up on initial sync. +# Check that next translations for Add-on Paths and Direct Paths are +# identical! +msgctxt "#39080" +msgid "" +"Use Add-on Paths (default, easy) or Direct Paths? Choose Add-on Paths if " +"you're unsure. PKC will not work if your Direct Paths setup is wrong!" +msgstr "" + +# Button text for choosing PKC mode +msgctxt "#39081" +msgid "Add-on Paths" +msgstr "" + +# Button text for choosing PKC mode +msgctxt "#39082" +msgid "Direct Paths" +msgstr "" + +# Dialog for manually entering PMS +msgctxt "#39083" +msgid "Enter PMS IP or URL" +msgstr "" + +# Dialog for manually entering PMS +msgctxt "#39084" +msgid "Enter PMS port" +msgstr "" + +# PKC settings - Appearance Tweaks +msgctxt "#39085" +msgid "Reload Kodi node files to apply all the settings below" +msgstr "" + +# PKC Settings - Connection - Background sync connection status +msgctxt "#39089" +msgid "Alexa connection status:" +msgstr "" + +# PKC Settings - Connection - Background sync connection status +msgctxt "#39091" +msgid "Timeout - not connected" +msgstr "" + +# PKC Settings - Connection - Background sync connection status +msgctxt "#39092" +msgid "IOError - not connected" +msgstr "" + +# PKC Settings - Connection - Background sync connection status +msgctxt "#39093" +msgid "Suspended - not connected" +msgstr "" + +# PKC Settings - Connection - Background sync connection status +msgctxt "#39094" +msgid "Managed Plex User - not connected" +msgstr "" + +msgctxt "#39200" +msgid "Log-out Plex Home User " +msgstr "" + +msgctxt "#39201" +msgid "Settings" +msgstr "" + +msgctxt "#39204" +msgid "Perform manual library sync" +msgstr "" + +# Error message +msgctxt "#39205" +msgid "Unable to run the sync, the add-on is not connected to a Plex server." +msgstr "" + +msgctxt "#39206" +msgid "" +"Plex might lock your account if you fail to log in too many times. Proceed " +"anyway?" +msgstr "" + +msgctxt "#39207" +msgid "Resetting PMS connections, please wait" +msgstr "" + +msgctxt "#39208" +msgid "Failed to reset PKC. Try to restart Kodi." +msgstr "" + +# PKC Settings - Plex +msgctxt "#39209" +msgid "Toggle plex.tv login (sign in or sign out)" +msgstr "" + +msgctxt "#39210" +msgid "Not yet connected to Plex Server" +msgstr "" + +msgctxt "#39211" +msgid "Watch later" +msgstr "" + +# Error message pop-up if {0} cannot be contacted. {0} will be replaced by +# e.g. the PMS' name +msgctxt "#39213" +msgid "{0} offline" +msgstr "" + +msgctxt "#39215" +msgid "Enter your Plex Media Server's IP or URL, Examples are:" +msgstr "" + +msgctxt "#39217" +msgid "Use HTTPS (SSL) connections? Answer should probably be yes." +msgstr "" + +msgctxt "#39218" +msgid "Error contacting PMS" +msgstr "" + +msgctxt "#39219" +msgid "Abort (Yes) or save address anyway (No)?" +msgstr "" + +# String attached at the end to get something like "PMS Name is offline" +msgctxt "#39220" +msgid "connected" +msgstr "" + +msgctxt "#39221" +msgid "plex.tv toggle successful" +msgstr "" + +msgctxt "#39222" +msgid "Look for missing fanart on FanartTV now" +msgstr "" + +msgctxt "#39223" +msgid "" +"Only look for missing fanart or refresh all fanart? The scan will take quite" +" a while and happen in the background." +msgstr "" + +msgctxt "#39224" +msgid "Refresh all" +msgstr "" + +msgctxt "#39225" +msgid "Missing only" +msgstr "" + +# Message in the PKC settings if user has not logged in to plex.tv +msgctxt "#39226" +msgid "Not logged in to plex.tv" +msgstr "" + +# Message in the PKC settings if user is logged in to plex.tv +msgctxt "#39227" +msgid "Logged in to plex.tv" +msgstr "" + +# Message in the PKC settings to display the plex.tv username +msgctxt "#39228" +msgid "Plex admin user" +msgstr "" + +# Error message if user could not log in; the actual user name will be +# appended at the end of the string +msgctxt "#39229" +msgid "Login failed with plex.tv for user" +msgstr "" + +# Message in the PKC settings to display the plex.tv username +msgctxt "#39230" +msgid "Logged in Plex home user" +msgstr "" + +# Message in the PKC settings to change the logged in Plex home user +msgctxt "#39231" +msgid "Change logged in Plex home user" +msgstr "" + +msgctxt "#39250" +msgid "" +"Running the image cache process can take some time. It will happen in the " +"background. Are you sure you want continue?" +msgstr "" + +msgctxt "#39251" +msgid "Reset all existing cache data first?" +msgstr "" + +msgctxt "#39303" +msgid "Problems trying to contact plex.tv. Try again later" +msgstr "" + +msgctxt "#39304" +msgid "Go to https://plex.tv/pin and enter the code: " +msgstr "" + +msgctxt "#39305" +msgid "Could not sign in to plex.tv. Try again later" +msgstr "" + +msgctxt "#39306" +msgid ": Select User" +msgstr "" + +msgctxt "#39307" +msgid "Enter PIN for user " +msgstr "" + +msgctxt "#39308" +msgid "Could not log in user " +msgstr "" + +msgctxt "#39309" +msgid "Please try again." +msgstr "" + +msgctxt "#39310" +msgid "unknown" +msgstr "" + +msgctxt "#39311" +msgid "or press No to not sign in." +msgstr "" + +msgctxt "#39400" +msgid "" +"Library sync thread has crashed. You should restart Kodi now. Please report " +"this on the forum" +msgstr "" + +msgctxt "#39401" +msgid "" +"Detected Kodi database needs to be recreated for this version. This might " +"take a while. Proceed?" +msgstr "" + +msgctxt "#39402" +msgid " may not work correctly until the database is reset." +msgstr "" + +msgctxt "#39403" +msgid "" +"The current Kodi version is not supported by PKC. Please consult the Plex " +"forum." +msgstr "" + +msgctxt "#39405" +msgid "Plex playlists/nodes refreshed" +msgstr "" + +msgctxt "#39406" +msgid "Plex playlists/nodes refresh failed" +msgstr "" + +msgctxt "#39408" +msgid "" +"Sync had to skip some items because they could not be processed. Kodi may be" +" instable now!! Please post your Kodi logs to the Plex forum." +msgstr "" + +msgctxt "#39409" +msgid "" +"The Plex Server did not like you asking for so much data at once and " +"returned ERRORS. Try lowering the number of sync download threads in the " +"settings. Skipped some items for now." +msgstr "" + +msgctxt "#39410" +msgid "ERROR in library sync" +msgstr "" + +msgctxt "#39500" +msgid "On Deck" +msgstr "" + +msgctxt "#39501" +msgid "Collections" +msgstr "" + +msgctxt "#39502" +msgid "PKC On Deck (faster)" +msgstr "" + +msgctxt "#39600" +msgid "" +"Are you sure you want to reset your local Kodi database? A re-sync of the " +"Plex data will take time afterwards." +msgstr "" + +msgctxt "#39601" +msgid "Could not stop the database from running. Please try again later." +msgstr "" + +msgctxt "#39603" +msgid "" +"Reset all PlexKodiConnect Addon settings? (this is usually NOT recommended " +"and unnecessary!)" +msgstr "" + +msgctxt "#39700" +msgid "Amazon Alexa (Voice Recognition)" +msgstr "" + +msgctxt "#39701" +msgid "Activate Alexa" +msgstr "" + +msgctxt "#39702" +msgid "Browse by folder" +msgstr "" + +# For use with addon.xml (PKC metadata for Kodi, e.g. description) +# Addon Summary +msgctxt "#39703" +msgid "Native Integration of Plex into Kodi" +msgstr "" + +# For use with addon.xml (PKC metadata for Kodi, e.g. description) +# Addon Description +msgctxt "#39704" +msgid "" +"Connect Kodi to your Plex Media Server. This plugin assumes that you manage " +"all your videos with Plex (and none with Kodi). You might lose data already " +"stored in the Kodi video and music databases (as this plugin directly " +"changes them). Use at your own risk!" +msgstr "" + +# For use with addon.xml (PKC metadata for Kodi, e.g. description) +# Addon Disclaimer +msgctxt "#39705" +msgid "Use at your own risk" +msgstr "" + +# If user gets prompted to choose between several subtitles to burn in +msgctxt "#39706" +msgid "Don't burn-in any subtitle" +msgstr "" + +# If user gets prompted to choose between several audio/subtitle tracks and +# language is unknown +msgctxt "#39707" +msgid "unknown" +msgstr "" + +# If user gets prompted to choose between several subtitles and Plex adds the +# "default" flag +msgctxt "#39708" +msgid "Default" +msgstr "" + +# If user gets prompted to choose between several subtitles and Plex adds the +# "forced" flag +msgctxt "#39709" +msgid "Forced" +msgstr "" + +# If user gets prompted to choose between several subtitles the subtitle +# cannot be downloaded (has no 'key' attribute from the PMS), the subtitle +# needs to be burned in +msgctxt "#39710" +msgid "burn-in" +msgstr "" + +# Dialog text if PKC detected a new Music library and Kodi needs to be +# restarted +msgctxt "#39711" +msgid "" +"New Plex music library detected. Sorry, but we need to restart Kodi now due " +"to the changes made." +msgstr "" + +# Shown during sync process +msgctxt "#39712" +msgid "downloaded" +msgstr "" + +# Shown during sync process +msgctxt "#39713" +msgid "processed" +msgstr "" + +# Shown during sync process +msgctxt "#39714" +msgid "Sync" +msgstr "" + +# Shown during sync process +msgctxt "#39715" +msgid "Synching playlists" +msgstr "" + +# Error message if an xml, e.g. advancedsettings.xml cannot be parsed (xml is +# screwed up; formated the wrong way). Do NOT replace {0} and {1}! +msgctxt "#39716" +msgid "" +"Kodi cannot parse {0}. PKC will not function correctly. Please visit {1} and" +" correct your file!" +msgstr "" + +# Shown once on first installation to comply with the terms of use of +# themoviedb.org +msgctxt "#39717" +msgid "PKC uses free additional artwork from www.themoviedb.org. Many thanks!" +msgstr "" + +# Shown during very first PKC setup only +msgctxt "#39718" +msgid "" +"Do you want to replace your custom user ratings with an indicator of how " +"many versions of a media item you posses?" +msgstr "" + +# In PKC Settings under Sync +msgctxt "#39719" +msgid "Replace user ratings with number of media versions" +msgstr "" diff --git a/resources/language/resource.language.en_gb/strings.po b/resources/language/resource.language.en_gb/strings.po index fcc80e22..a094e90a 100644 --- a/resources/language/resource.language.en_gb/strings.po +++ b/resources/language/resource.language.en_gb/strings.po @@ -1078,6 +1078,11 @@ msgctxt "#39074" msgid "TV Shows" msgstr "" +# PKC Settings - Sync +msgctxt "#39075" +msgid "Verify access to media files while synching" +msgstr "" + # Pop-up during initial sync msgctxt "#39076" msgid "If you use several Plex libraries of one kind, e.g. \"Kids Movies\" and \"Parents Movies\", be sure to check the Wiki: https://goo.gl/JFtQV9" diff --git a/resources/language/resource.language.es_AR/strings.po b/resources/language/resource.language.es_AR/strings.po index 7ac0ebb1..bab969b0 100644 --- a/resources/language/resource.language.es_AR/strings.po +++ b/resources/language/resource.language.es_AR/strings.po @@ -1166,6 +1166,11 @@ msgctxt "#39071" msgid "Current plex.tv status:" msgstr "Estado actual de plex.tv:" +# PKC Settings - Connection +msgctxt "#39072" +msgid "Background sync connection:" +msgstr "" + # PKC Settings, category name msgctxt "#39073" msgid "Appearance Tweaks" @@ -1243,6 +1248,31 @@ msgctxt "#39085" msgid "Reload Kodi node files to apply all the settings below" msgstr "Recargar Kodi para aplicar todos los ajustes." +# PKC Settings - Connection - Background sync connection status +msgctxt "#39089" +msgid "Alexa connection status:" +msgstr "" + +# PKC Settings - Connection - Background sync connection status +msgctxt "#39091" +msgid "Timeout - not connected" +msgstr "" + +# PKC Settings - Connection - Background sync connection status +msgctxt "#39092" +msgid "IOError - not connected" +msgstr "" + +# PKC Settings - Connection - Background sync connection status +msgctxt "#39093" +msgid "Suspended - not connected" +msgstr "" + +# PKC Settings - Connection - Background sync connection status +msgctxt "#39094" +msgid "Managed Plex User - not connected" +msgstr "" + msgctxt "#39200" msgid "Log-out Plex Home User " msgstr "Terminar sesión del usuario de Plex Home " diff --git a/resources/language/resource.language.es_ES/strings.po b/resources/language/resource.language.es_ES/strings.po index f94b3cb9..6717be02 100644 --- a/resources/language/resource.language.es_ES/strings.po +++ b/resources/language/resource.language.es_ES/strings.po @@ -1168,6 +1168,11 @@ msgctxt "#39071" msgid "Current plex.tv status:" msgstr "Estado actual de plex.tv:" +# PKC Settings - Connection +msgctxt "#39072" +msgid "Background sync connection:" +msgstr "" + # PKC Settings, category name msgctxt "#39073" msgid "Appearance Tweaks" @@ -1245,6 +1250,31 @@ msgctxt "#39085" msgid "Reload Kodi node files to apply all the settings below" msgstr "Recargar Kodi para aplicar todos los ajustes." +# PKC Settings - Connection - Background sync connection status +msgctxt "#39089" +msgid "Alexa connection status:" +msgstr "" + +# PKC Settings - Connection - Background sync connection status +msgctxt "#39091" +msgid "Timeout - not connected" +msgstr "" + +# PKC Settings - Connection - Background sync connection status +msgctxt "#39092" +msgid "IOError - not connected" +msgstr "" + +# PKC Settings - Connection - Background sync connection status +msgctxt "#39093" +msgid "Suspended - not connected" +msgstr "" + +# PKC Settings - Connection - Background sync connection status +msgctxt "#39094" +msgid "Managed Plex User - not connected" +msgstr "" + msgctxt "#39200" msgid "Log-out Plex Home User " msgstr "Terminar sesión del usuario de Plex Home " diff --git a/resources/language/resource.language.es_MX/strings.po b/resources/language/resource.language.es_MX/strings.po index 12084c3d..3893798d 100644 --- a/resources/language/resource.language.es_MX/strings.po +++ b/resources/language/resource.language.es_MX/strings.po @@ -1166,6 +1166,11 @@ msgctxt "#39071" msgid "Current plex.tv status:" msgstr "Estado actual de plex.tv:" +# PKC Settings - Connection +msgctxt "#39072" +msgid "Background sync connection:" +msgstr "" + # PKC Settings, category name msgctxt "#39073" msgid "Appearance Tweaks" @@ -1243,6 +1248,31 @@ msgctxt "#39085" msgid "Reload Kodi node files to apply all the settings below" msgstr "Recargar Kodi para aplicar todos los ajustes." +# PKC Settings - Connection - Background sync connection status +msgctxt "#39089" +msgid "Alexa connection status:" +msgstr "" + +# PKC Settings - Connection - Background sync connection status +msgctxt "#39091" +msgid "Timeout - not connected" +msgstr "" + +# PKC Settings - Connection - Background sync connection status +msgctxt "#39092" +msgid "IOError - not connected" +msgstr "" + +# PKC Settings - Connection - Background sync connection status +msgctxt "#39093" +msgid "Suspended - not connected" +msgstr "" + +# PKC Settings - Connection - Background sync connection status +msgctxt "#39094" +msgid "Managed Plex User - not connected" +msgstr "" + msgctxt "#39200" msgid "Log-out Plex Home User " msgstr "Terminar sesión del usuario de Plex Home " diff --git a/resources/language/resource.language.fr_CA/strings.po b/resources/language/resource.language.fr_CA/strings.po index ee32c48b..0732a814 100644 --- a/resources/language/resource.language.fr_CA/strings.po +++ b/resources/language/resource.language.fr_CA/strings.po @@ -1180,6 +1180,11 @@ msgctxt "#39071" msgid "Current plex.tv status:" msgstr "État actuel de plex.tv: " +# PKC Settings - Connection +msgctxt "#39072" +msgid "Background sync connection:" +msgstr "" + # PKC Settings, category name msgctxt "#39073" msgid "Appearance Tweaks" @@ -1257,6 +1262,31 @@ msgid "Reload Kodi node files to apply all the settings below" msgstr "" "Recharger les fichiers de Kodi pour appliquer tous les paramètres ci-dessous" +# PKC Settings - Connection - Background sync connection status +msgctxt "#39089" +msgid "Alexa connection status:" +msgstr "" + +# PKC Settings - Connection - Background sync connection status +msgctxt "#39091" +msgid "Timeout - not connected" +msgstr "" + +# PKC Settings - Connection - Background sync connection status +msgctxt "#39092" +msgid "IOError - not connected" +msgstr "" + +# PKC Settings - Connection - Background sync connection status +msgctxt "#39093" +msgid "Suspended - not connected" +msgstr "" + +# PKC Settings - Connection - Background sync connection status +msgctxt "#39094" +msgid "Managed Plex User - not connected" +msgstr "" + msgctxt "#39200" msgid "Log-out Plex Home User " msgstr "Log-out Plex Home User " diff --git a/resources/language/resource.language.fr_FR/strings.po b/resources/language/resource.language.fr_FR/strings.po index c48daaf2..66570bed 100644 --- a/resources/language/resource.language.fr_FR/strings.po +++ b/resources/language/resource.language.fr_FR/strings.po @@ -1184,6 +1184,11 @@ msgctxt "#39071" msgid "Current plex.tv status:" msgstr "État actuel de plex.tv: " +# PKC Settings - Connection +msgctxt "#39072" +msgid "Background sync connection:" +msgstr "" + # PKC Settings, category name msgctxt "#39073" msgid "Appearance Tweaks" @@ -1261,6 +1266,31 @@ msgid "Reload Kodi node files to apply all the settings below" msgstr "" "Recharger les fichiers de Kodi pour appliquer tous les paramètres ci-dessous" +# PKC Settings - Connection - Background sync connection status +msgctxt "#39089" +msgid "Alexa connection status:" +msgstr "" + +# PKC Settings - Connection - Background sync connection status +msgctxt "#39091" +msgid "Timeout - not connected" +msgstr "" + +# PKC Settings - Connection - Background sync connection status +msgctxt "#39092" +msgid "IOError - not connected" +msgstr "" + +# PKC Settings - Connection - Background sync connection status +msgctxt "#39093" +msgid "Suspended - not connected" +msgstr "" + +# PKC Settings - Connection - Background sync connection status +msgctxt "#39094" +msgid "Managed Plex User - not connected" +msgstr "" + msgctxt "#39200" msgid "Log-out Plex Home User " msgstr "Log-out Plex Home User " diff --git a/resources/language/resource.language.hu_HU/strings.po b/resources/language/resource.language.hu_HU/strings.po index 0b9ef351..caefc8d8 100644 --- a/resources/language/resource.language.hu_HU/strings.po +++ b/resources/language/resource.language.hu_HU/strings.po @@ -1,7 +1,7 @@ # XBMC Media Center language file # Translators: # Croneter None , 2019 -# Savage93 , 2020 +# Savage93 , 2021 # msgid "" msgstr "" @@ -9,7 +9,7 @@ msgstr "" "Report-Msgid-Bugs-To: croneter@gmail.com\n" "POT-Creation-Date: 2017-04-15 13:13+0000\n" "PO-Revision-Date: 2017-04-30 08:30+0000\n" -"Last-Translator: Savage93 , 2020\n" +"Last-Translator: Savage93 , 2021\n" "Language-Team: Hungarian (Hungary) (https://www.transifex.com/croneter/teams/73837/hu_HU/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -51,6 +51,10 @@ msgid "" "random password automatically if you haven't done so already. Please confirm" " the next dialog that you want to enable the webserver now with Yes." msgstr "" +"A művészképek gyorsítótárazásához szükség van a Kodi webszerverének " +"bekapcsolására. A PKC beállított egy erős, véletlenszerű jelszót ehhez, " +"amennyiben ezt korábban nem tette meg. Kérem erősítse meg a következő " +"dialógusablakban, hogy be kívánja kapcsolni a webszervert." msgctxt "#30005" msgid "Username: " @@ -616,7 +620,7 @@ msgstr "Szinkronizálni kívánt Plex könyvtárak kiválasztása" # PKC Settings - Playback msgctxt "#30525" msgid "Skip intro" -msgstr "" +msgstr "Bevezető kihagyása" # PKC Settings - Playback msgctxt "#30527" @@ -684,6 +688,8 @@ msgstr "Film-szett/kollekció képek letöltése a FanArtTV-ről" msgctxt "#30541" msgid "Transcoding: Auto-pick audio and subtitle stream using Plex defaults" msgstr "" +"Transzkódolás: hang- és feliratsávok automatikus kiválasztása a Plex " +"alapértelmezések alapján" # PKC Settings - Playback msgctxt "#30542" @@ -983,7 +989,7 @@ msgstr "" # PKC Settings - Customize Paths msgctxt "#39090" msgid "Safe characters for http(s), dav(s) and (s)ftp urls" -msgstr "" +msgstr "Biztonságos karakterek http(s), dav(s) és (s)ftp elérési utakhoz" # PKC Settings - Customize Paths msgctxt "#39037" @@ -1168,6 +1174,11 @@ msgctxt "#39071" msgid "Current plex.tv status:" msgstr "Jelenlegi plex.tv állapot:" +# PKC Settings - Connection +msgctxt "#39072" +msgid "Background sync connection:" +msgstr "" + # PKC Settings, category name msgctxt "#39073" msgid "Appearance Tweaks" @@ -1246,6 +1257,31 @@ msgid "Reload Kodi node files to apply all the settings below" msgstr "" "Kodi csomópont fájlok újratöltése az alábbi beállítások alkalmazásához" +# PKC Settings - Connection - Background sync connection status +msgctxt "#39089" +msgid "Alexa connection status:" +msgstr "" + +# PKC Settings - Connection - Background sync connection status +msgctxt "#39091" +msgid "Timeout - not connected" +msgstr "" + +# PKC Settings - Connection - Background sync connection status +msgctxt "#39092" +msgid "IOError - not connected" +msgstr "" + +# PKC Settings - Connection - Background sync connection status +msgctxt "#39093" +msgid "Suspended - not connected" +msgstr "" + +# PKC Settings - Connection - Background sync connection status +msgctxt "#39094" +msgid "Managed Plex User - not connected" +msgstr "" + msgctxt "#39200" msgid "Log-out Plex Home User " msgstr "Kijelentkezés az otthoni Plex felhasználó fiókból: " diff --git a/resources/language/resource.language.it_IT/strings.po b/resources/language/resource.language.it_IT/strings.po index 69546761..91702340 100644 --- a/resources/language/resource.language.it_IT/strings.po +++ b/resources/language/resource.language.it_IT/strings.po @@ -1169,6 +1169,11 @@ msgctxt "#39071" msgid "Current plex.tv status:" msgstr "Stato attuale di plex.tv:" +# PKC Settings - Connection +msgctxt "#39072" +msgid "Background sync connection:" +msgstr "" + # PKC Settings, category name msgctxt "#39073" msgid "Appearance Tweaks" @@ -1246,6 +1251,31 @@ msgstr "" "Ricarica i nodi di file di Kodi per applicare tutte le impostazioni di " "sotto" +# PKC Settings - Connection - Background sync connection status +msgctxt "#39089" +msgid "Alexa connection status:" +msgstr "" + +# PKC Settings - Connection - Background sync connection status +msgctxt "#39091" +msgid "Timeout - not connected" +msgstr "" + +# PKC Settings - Connection - Background sync connection status +msgctxt "#39092" +msgid "IOError - not connected" +msgstr "" + +# PKC Settings - Connection - Background sync connection status +msgctxt "#39093" +msgid "Suspended - not connected" +msgstr "" + +# PKC Settings - Connection - Background sync connection status +msgctxt "#39094" +msgid "Managed Plex User - not connected" +msgstr "" + msgctxt "#39200" msgid "Log-out Plex Home User " msgstr "Logout utente Plex " diff --git a/resources/language/resource.language.ko_KR/strings.po b/resources/language/resource.language.ko_KR/strings.po new file mode 100644 index 00000000..70be09fb --- /dev/null +++ b/resources/language/resource.language.ko_KR/strings.po @@ -0,0 +1,1606 @@ +# XBMC Media Center language file +# Translators: +# Jaehyuk Lee , 2017 +# Naru Ri , 2018 +# seungwoo J , 2019 +# yun changwon , 2020 +# k irbymaker , 2020 +# Croneter None , 2021 +# jaemin kwak , 2021 +# +msgid "" +msgstr "" +"Project-Id-Version: PlexKodiConnect\n" +"Report-Msgid-Bugs-To: croneter@gmail.com\n" +"POT-Creation-Date: 2017-04-15 13:13+0000\n" +"PO-Revision-Date: 2017-04-30 08:30+0000\n" +"Last-Translator: jaemin kwak , 2021\n" +"Language-Team: Korean (Korea) (https://www.transifex.com/croneter/teams/73837/ko_KR/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ko_KR\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +# Add-on settings +msgctxt "#29999" +msgid "PlexKodiConnect" +msgstr "PlexKodiConnect" + +msgctxt "#30000" +msgid "Server Address (IP)" +msgstr "서버 주소 (IP)" + +msgctxt "#30001" +msgid "Searching for PMS" +msgstr "Plex 서버 검색" + +msgctxt "#30002" +msgid "Preferred playback method" +msgstr "선호하는 재생 방법" + +# Warning displayed if Kodi setting is enabled. Be sure to escape the quotes +# again! The exact wording can be found in the Kodi settings, player settings, +# videos +msgctxt "#30003" +msgid "" +"Warning: Kodi setting \"Play next video automatically\" is enabled. This " +"could break PKC. Deactivate?" +msgstr "" +"경고 : Kodi 설정에서 \"자동으로 다음 비디오 재생\" 옵션이 활성화되었습니다. 이것은 PKC 사용에 영향을 줄 수 있습니다. " +"비활성화 하시겠습니까?" + +msgctxt "#30004" +msgid "" +"The Kodi webserver is needed for artwork caching. PKC already set a strong, " +"random password automatically if you haven't done so already. Please confirm" +" the next dialog that you want to enable the webserver now with Yes." +msgstr "" +"아트워크 캐싱을 위해서는 Kodi 웹 서버가 필요합니다. 아직 설정하지 않은 경우 PKC는 강력한 임의 암호를 자동으로 설정합니다. 웹 " +"서버를 지금 활성화하려는 다음 대화 상자를 Yes(예)로 확인하십시오." + +msgctxt "#30005" +msgid "Username: " +msgstr "사용자이름: " + +# Sync notification displayed if there is still artwork to be cached to Kodi +msgctxt "#30006" +msgid "Caching %s Plex images" +msgstr "캐싱 %s Plex 이미지" + +# Sync notification displayed if syncing of major artwork is done +msgctxt "#30007" +msgid "Plex image caching done" +msgstr "플랙스 이미지 캐싱 완료" + +# PKC settings artwork: Enable notifications for artwork image sync +msgctxt "#30008" +msgid "Enable notifications for image caching" +msgstr "이미지 캐싱에 대한 알림 활성화" + +# PKC settings artwork: Enable image caching during Kodi playback +msgctxt "#30009" +msgid "Enable image caching during Kodi playback (restart Kodi!)" +msgstr "Kodi 재생 중 이미지 캐싱 활성화 (Kodi를 다시 시작하십시오!)" + +# PKC settings - Artwork +msgctxt "#30010" +msgid "Approximate progress" +msgstr "대략적인 진행 상황" + +# PKC settings - Artwork +msgctxt "#30011" +msgid "Artwork left to cache:" +msgstr "캐시 할 남은 아트 워크:" + +# Button text +msgctxt "#30012" +msgid "OK" +msgstr "확인" + +msgctxt "#30013" +msgid "Never show" +msgstr "표시 안함" + +# PKC settings category +msgctxt "#30014" +msgid "Connection" +msgstr "연결" + +# Pop-up notification if user tried to manually initiate fanart download +msgctxt "#30015" +msgid "Fanart download already running" +msgstr "팬아트 다운로드가 이미 실행 중입니다." + +msgctxt "#30016" +msgid "Device Name" +msgstr "기기 이름" + +# Error message +msgctxt "#30017" +msgid "Unauthorized for PMS" +msgstr "PMS에 대해 승인되지 않음" + +# Sync notification displayed for the number of fanart.tv lookups left +msgctxt "#30018" +msgid "Checking FanartTV for %s items" +msgstr "팬아트TV에서 %s 항목 확인 중" + +# PKC settings artwork options: status info +msgctxt "#30019" +msgid "FanartTV lookup completed" +msgstr "팬아트TV 조회 완료" + +# PKC settings sync options +msgctxt "#30020" +msgid "Sync Plex playlists (reboot Kodi!)" +msgstr "Plex 재생 목록 동기화 (Kodi를 재부팅하십시오!)" + +# PKC settings sync options +msgctxt "#30021" +msgid "Only sync specific Plex playlists to Kodi" +msgstr "특정 Plex 재생 목록 만 Kodi에 동기화" + +# PKC settings category +msgctxt "#30022" +msgid "Advanced" +msgstr "고급" + +# PKC settings sync options +msgctxt "#30023" +msgid "Only sync specific Kodi playlists to Plex" +msgstr "특정 Kodi 재생 목록 만 Plex에 동기화" + +msgctxt "#30024" +msgid "Username" +msgstr "사용자 이름" + +msgctxt "#30025" +msgid "Display message if PMS goes offline" +msgstr "PMS가 오프라인 상태가되면 메시지 표시" + +# PKC settings sync options +msgctxt "#30026" +msgid "Prefix in Plex playlist name to trigger sync" +msgstr "동기화를 트리거하는 Plex 재생 목록 이름의 접두사" + +# PKC settings sync options +msgctxt "#30027" +msgid "Prefix in Kodi playlist name to trigger sync" +msgstr "동기화를 트리거하는 Kodi 재생 목록 이름의 접두사" + +# PKC settings artwork options: status info +msgctxt "#30028" +msgid "PKC-only image caching completed" +msgstr "PKC 전용 이미지 캐싱 완료" + +msgctxt "#30030" +msgid "Port Number" +msgstr "포트 번호" + +msgctxt "#30031" +msgid "I own this Plex Media Server" +msgstr "이 Plex 미디어 서버를 소유하고 있습니다." + +# Kodi context menu entry for movie and episode information screen +msgctxt "#30032" +msgid "Information" +msgstr "정보" + +msgctxt "#30042" +msgid "Refresh" +msgstr "새로고침" + +msgctxt "#30043" +msgid "Delete" +msgstr "삭제" + +# Notification displayed if there is a LOT to be deleted +msgctxt "#30052" +msgid "Deleting" +msgstr "삭제" + +msgctxt "#30069" +msgid "None" +msgstr "없음" + +msgctxt "#30093" +msgid "Mark Watched" +msgstr "시청 마크" + +msgctxt "#30094" +msgid "Mark Unwatched" +msgstr "미시청 마크" + +msgctxt "#30095" +msgid "Add to Favorites" +msgstr "즐겨찾기에 추가" + +msgctxt "#30096" +msgid "Remove from Favorites" +msgstr "즐겨찾기에서 삭제" + +msgctxt "#30114" +msgid "Offer delete after playback" +msgstr "재생 후 삭제 제안" + +msgctxt "#30115" +msgid "For Episodes" +msgstr "에피소드" + +msgctxt "#30116" +msgid "For Movies" +msgstr "영화" + +msgctxt "#30125" +msgid "Done" +msgstr "완료" + +# Error popup message text +msgctxt "#30128" +msgid "Play Error" +msgstr "재생 오류" + +msgctxt "#30132" +msgid "Warning" +msgstr "위험" + +msgctxt "#30135" +msgid "Error" +msgstr "오류" + +msgctxt "#30138" +msgid "Search" +msgstr "검색" + +msgctxt "#30139" +msgid "Enable Theme Music (Requires Restart)" +msgstr "테마 음악 활성화 (다시 시작해야 함)" + +msgctxt "#30143" +msgid "Always transcode if video bitrate is above" +msgstr "비디오 비트 전송률이 이상이면 항상 트랜스 코딩" + +msgctxt "#30157" +msgid "Enable Enhanced Images (eg CoverArt)" +msgstr "향상된 이미지 활성화 (예: CoverArt)" + +msgctxt "#30158" +msgid "Metadata" +msgstr "메타데이터" + +msgctxt "#30160" +msgid "Video Quality if Transcoding necessary" +msgstr "트랜스 코딩이 필요한 경우 비디오 품질" + +msgctxt "#30161" +msgid "Auto-adjust transcoding quality (deactivate for Chromecast)" +msgstr "트랜스 코딩 품질 자동 조정 (크롬캐스트의 경우 비활성화)" + +msgctxt "#30165" +msgid "Direct Play" +msgstr "직접 재생" + +msgctxt "#30166" +msgid "Transcoding" +msgstr "트랜스코딩" + +msgctxt "#30170" +msgid "Recently Added TV Shows" +msgstr "최근 추가 된 TV 프로그램" + +msgctxt "#30171" +msgid "In Progress TV Shows" +msgstr "진행중인 TV 프로그램" + +msgctxt "#30173" +msgid "Channels" +msgstr "채널" + +msgctxt "#30174" +msgid "Recently Added" +msgstr "최근에 추가" + +msgctxt "#30177" +msgid "In Progress Movies" +msgstr "진행중인 영화" + +msgctxt "#30178" +msgid "In Progress Episodes" +msgstr "진행중인 에피소드" + +msgctxt "#30179" +msgid "Next Episodes" +msgstr "다음 에피소드" + +msgctxt "#30180" +msgid "Favorite Movies" +msgstr "좋아하는 영화" + +msgctxt "#30181" +msgid "Favorite Shows" +msgstr "좋아하는 쇼" + +msgctxt "#30182" +msgid "Favorite Episodes" +msgstr "좋아하는 에피소드" + +msgctxt "#30189" +msgid "Unwatched Movies" +msgstr "보지 않은 영화" + +msgctxt "#30198" +msgid "Search" +msgstr "검색" + +# For setting up direct paths and adding network credentials +msgctxt "#30200" +msgid "" +"In the following window, enter the server's hostname (or IP) where your Plex" +" media resides. Mind the case!" +msgstr "다음 창에서 Plex 미디어가있는 서버의 호스트 이름 (또는 IP)을 입력합니다. 조심하세요!" + +# For setting up direct paths and adding network credentials - input window +# for hostname +msgctxt "#30201" +msgid "Enter server hostname (or IP)" +msgstr "서버 호스트 이름 (또는 IP) 입력" + +# For setting up direct paths and adding network credentials +msgctxt "#30202" +msgid "" +"In the following window, enter the network protocol you would like to use. " +"This is likely 'smb'." +msgstr "다음 창에서 사용할 네트워크 프로토콜을 입력하십시오. 이것은 아마도 'smb'입니다." + +# For setting up direct paths and adding network credentials - input window +# protocol +msgctxt "#30203" +msgid "Enter network protocol" +msgstr "네트워크 프로토콜 입력" + +# For setting up direct paths and adding network credentials +msgctxt "#30204" +msgid "The hostname or IP '{0}' that you entered is not valid." +msgstr "입력 한 호스트 이름 또는 IP '{0}' 정보가 유효하지 않습니다." + +# For setting up direct paths and adding network credentials +msgctxt "#30205" +msgid "The protocol '{0}' that you entered is not supported." +msgstr "입력 한 '{0}'프로토콜은 지원되지 않습니다." + +# Video node naming for random e.g. movies +msgctxt "#30227" +msgid "Random" +msgstr "무작위" + +# Video node naming for e.g. movies +msgctxt "#30230" +msgid "Recommended" +msgstr "추천" + +msgctxt "#30235" +msgid "Extras" +msgstr "기타" + +msgctxt "#30243" +msgid "Enable HTTPS" +msgstr "HTTPS 활성화" + +msgctxt "#30251" +msgid "Recently added Home Videos" +msgstr "최근 추가된 홈 비디오" + +msgctxt "#30252" +msgid "Recently added Photos" +msgstr "최근 추가 된 사진" + +msgctxt "#30253" +msgid "Favorite Home Videos" +msgstr "좋아하는 홈 비디오" + +msgctxt "#30254" +msgid "Favorite Photos" +msgstr "좋아하는 사진" + +msgctxt "#30255" +msgid "Favorite Albums" +msgstr "좋아하는 앨범" + +msgctxt "#30256" +msgid "Recently added Music videos" +msgstr "최근 추가 된 뮤직 비디오" + +msgctxt "#30257" +msgid "In progress Music videos" +msgstr "진행 중 뮤직 비디오" + +msgctxt "#30258" +msgid "Unwatched Music videos" +msgstr "보지 않은 뮤직 비디오" + +# PKC settings sub category under appearance tweaks +msgctxt "#30302" +msgid "Movies" +msgstr "영화" + +# contextmenu entry +msgctxt "#30401" +msgid "Plex options" +msgstr "Plex 설정" + +# contextmenu entry +msgctxt "#30405" +msgid "Add to Plex favorites" +msgstr "Plex 즐겨 찾기에 추가" + +# contextmenu entry +msgctxt "#30406" +msgid "Remove from Plex favorites" +msgstr "Plex 즐겨 찾기에서 제거" + +# contextmenu entry +msgctxt "#30407" +msgid "Set custom song rating" +msgstr "사용자 지정 노래 등급 설정" + +# contextmenu entry +msgctxt "#30408" +msgid "Plex addon settings" +msgstr "Plex 애드온 설정" + +# contextmenu entry +msgctxt "#30409" +msgid "Delete item from server" +msgstr "서버에서 항목 삭제" + +# contextmenu entry +msgctxt "#30410" +msgid "Refresh this item" +msgstr "이 항목 새로 고침" + +# contextmenu entry +msgctxt "#30412" +msgid "Force transcode" +msgstr "강제 트랜스 코딩" + +# Error dialog text +msgctxt "#30414" +msgid "" +"Could not delete the Plex item. Is item deletion enabled on the Plex Media " +"Server?" +msgstr "Plex 항목을 삭제할 수 없습니다. Plex Media Server에서 항목 삭제가 활성화되어 있습니까?" + +# contextmenu entry +msgctxt "#30415" +msgid "Start playback via PMS" +msgstr "PMS를 통해 재생 시작" + +msgctxt "#30416" +msgid "Settings for the Plex Server" +msgstr "Plex 서버 설정" + +msgctxt "#30417" +msgid "" +"Could not change the Kodi settings file {0}. PKC might not work correctly. " +"Error: {1}" +msgstr "Kodi 설정파일 {0} 변경할 수 없습니다. PKC가 제대로 작동하지 않을 수 있습니다. 오류: {1}" + +# PKC Settings - Connection +msgctxt "#30500" +msgid "Verify Host SSL Certificate (more secure)" +msgstr "호스트 SSL 인증서 확인 (더 안전함)" + +# PKC Settings - Connection +msgctxt "#30501" +msgid "Client SSL certificate" +msgstr "클라이언트 SSL 인증서" + +# PKC Settings - Artwork +msgctxt "#30502" +msgid "Sync Plex artwork from the PMS (recommended)" +msgstr "PMS에서 Plex 아트 워크 동기화 (권장)" + +# Message shown if SSL HTTPS certificate fails +msgctxt "#30503" +msgid "SSL certificate failed to validate. Please check {0} for solutions." +msgstr "SSL 인증서를 확인하지 못했습니다. 솔루션은 {0}에서 확인하십시오." + +# PKC Settings, category name +msgctxt "#30506" +msgid "Sync Options" +msgstr "동기화 옵션" + +# PKC Settings - Sync Options +msgctxt "#30507" +msgid "Show syncing progress" +msgstr "동기화 진행률 표시" + +# PKC Settings - Sync Options +msgctxt "#30508" +msgid "Sync empty TV Shows" +msgstr "빈 TV 프로그램 동기화" + +# PKC Settings - Sync Options +msgctxt "#30509" +msgid "Enable Music Library" +msgstr "음악 라이브러리 활성화" + +msgctxt "#30510" +msgid "Direct stream music library" +msgstr "음악 라이브러리 직접 스트림" + +# PKC Settings - Sync Options +msgctxt "#30511" +msgid "Playback Mode" +msgstr "재생 모드" + +# PKC Settings - Artwork +msgctxt "#30512" +msgid "Cache all artwork for a smooth Kodi experience" +msgstr "원활한 Kodi 경험을 위해 모든 아트 워크 캐시" + +# PKC Settings - Artwork +msgctxt "#30513" +msgid "Limit artwork cache threads (recommended for rpi)" +msgstr "아트 워크 캐시 스레드 제한 (RPI에 권장 됨)" + +# PKC Settings - Sync Options +msgctxt "#30514" +msgid "Show all Plex extras instead of immediately playing trailers" +msgstr "예고편을 즉시 재생하는 대신 모든 Plex 엑스트라 표시" + +# PKC Settings - Sync Options +msgctxt "#30515" +msgid "Maximum items to request from the server at once" +msgstr "서버에서 한 번에 요청할 수있는 최대 항목" + +# PKC Settings, category name +msgctxt "#30516" +msgid "Playback" +msgstr "재생" + +# PKC Settings - Connection +msgctxt "#30517" +msgid "Set network credentials for Direct Paths and direct play" +msgstr "직접 경로 및 직접 재생에 대한 네트워크 자격 증명 설정" + +# PKC Settings - Playback +msgctxt "#30518" +msgid "Enable Plex Trailers (Plexpass is needed)" +msgstr "Plex 예고편 활성화 (Plexpass 필요)" + +# PKC Settings - Playback +msgctxt "#30519" +msgid "Ask to play trailers" +msgstr "예고편 재생 요청" + +# PKC Settings - Plex +msgctxt "#30520" +msgid "Skip PMS delete confirmation (use at your own risk)" +msgstr "PMS 삭제 확인 건너 뛰기 (사용자의 책임하에 사용)" + +# PKC Settings - Playback +msgctxt "#30521" +msgid "Jump back on resume (in seconds)" +msgstr "다시 시작으로 돌아 가기 (초)" + +# PKC Settings - Playback +msgctxt "#30522" +msgid "Force transcode h265/HEVC" +msgstr "h265 / HEVC 강제 트랜스 코딩" + +# PKC Settings - Sync Options +msgctxt "#30523" +msgid "Also show sync progress for playstate and user data" +msgstr "재생 상태 및 사용자 데이터에 대한 동기화 진행률도 표시" + +# PKC Settings - Sync Options +msgctxt "#30524" +msgid "Select Plex libraries to sync" +msgstr "동기화 할 Plex 라이브러리 선택" + +# PKC Settings - Playback +msgctxt "#30525" +msgid "Skip intro" +msgstr "인트로 건너 뛰기" + +# PKC Settings - Playback +msgctxt "#30527" +msgid "Ignore specials in next episodes" +msgstr "다음 에피소드에서 스페셜 무시" + +msgctxt "#30528" +msgid "Permanent users to add to the session" +msgstr "세션에 추가 할 영구 사용자" + +# PKC Settings - Advanced +msgctxt "#30529" +msgid "Startup delay (in seconds)" +msgstr "시작 지연 (초)" + +msgctxt "#30531" +msgid "Enable new content notification" +msgstr "새 콘텐츠 알림 활성화" + +msgctxt "#30532" +msgid "Duration of the video library pop up (in seconds)" +msgstr "비디오 라이브러리 팝업 시간 (초)" + +msgctxt "#30533" +msgid "Duration of the music library pop up (in seconds)" +msgstr "음악 라이브러리 팝업 시간 (초)" + +msgctxt "#30534" +msgid "Server messages" +msgstr "서버 메시지" + +# PKC Settings - Advanced +msgctxt "#30535" +msgid "Generate a new unique Plex device Id (e.g. to clone Kodi)" +msgstr "새로운 고유 Plex 장치 ID 생성 (예 : Kodi 복제)" + +# PKC Settings - Connection +msgctxt "#30536" +msgid "Users must log in every time Kodi restarts" +msgstr "사용자는 Kodi가 다시 시작될 때마다 로그인해야합니다." + +# PKC Settings warning +msgctxt "#30537" +msgid "RESTART KODI IF YOU MAKE ANY CHANGES" +msgstr "변경 사항이 있으면 KODI를 다시 시작하십시오." + +# PKC Settings warning +msgctxt "#30538" +msgid "Manual complete reset of Kodi database necessary, see \"Advanced\"" +msgstr "Kodi 데이터베이스를 수동으로 완전히 재설정해야합니다. \"고급 \"을 참조하십시오." + +# PKC Settings - Artwork +msgctxt "#30539" +msgid "Download additional art from FanArtTV" +msgstr "FanArtTV에서 추가 아트 다운로드" + +# PKC Settings - Artwork +msgctxt "#30540" +msgid "Download movie set/collection art from FanArtTV" +msgstr "FanArtTV에서 영화 세트 / 컬렉션 아트 다운로드" + +# PKC Settings - Playback +msgctxt "#30541" +msgid "Transcoding: Auto-pick audio and subtitle stream using Plex defaults" +msgstr "트랜스 코딩 : Plex 기본값을 사용하여 오디오 및 자막 스트림 자동 선택" + +# PKC Settings - Playback +msgctxt "#30542" +msgid "Always pick best quality for trailers" +msgstr "예고편에 항상 최상의 품질을 선택하십시오." + +# PKC Settings - Artwork +msgctxt "#30543" +msgid "Prefer Kodi artwork for collections/sets" +msgstr "컬렉션 / 세트에 Kodi 아트 워크 선호" + +msgctxt "#30544" +msgid "Artwork" +msgstr "삽화" + +# PKC Settings - Playback +msgctxt "#30545" +msgid "Force transcode pictures" +msgstr "사진 트랜스 코딩 강제" + +# Welcome to Plex notification +msgctxt "#33000" +msgid "Welcome" +msgstr "환영합니다" + +# Error message +msgctxt "#33001" +msgid "Error connecting" +msgstr "연결 오류" + +# Error message +msgctxt "#33002" +msgid "Server is unreachable" +msgstr "서버에 연결할 수 없습니다." + +# Plex notification +msgctxt "#33003" +msgid "Server is online" +msgstr "서버가 온라인 상태입니다." + +# Plex notification when we need to transcode +msgctxt "#33004" +msgid "PMS enforced transcoding" +msgstr "PMS 강제 트랜스 코딩" + +# Plex notification when we need to use direct streaming (instead of +# transcoding) +msgctxt "#33005" +msgid "PMS enforced direct streaming" +msgstr "PMS 강제 직접 스트리밍" + +# Error notification +msgctxt "#33009" +msgid "Invalid username or password" +msgstr "잘못된 사용자 이름 또는 비밀번호" + +msgctxt "#33010" +msgid "User is unauthorized for server {0}" +msgstr "사용자가 {0} 서버에 대한 권한이 없습니다." + +msgctxt "#33011" +msgid "Plex.tv did not provide us a valid list of Plex users, sorry." +msgstr "Plex.tv에서 유효한 Plex 사용자 목록을 제공하지 않았습니다. 죄송합니다." + +# Dialog before playback +msgctxt "#33013" +msgid "Choose the audio stream" +msgstr "오디오 스트림 선택" + +# Dialog before playback +msgctxt "#33014" +msgid "Choose the subtitles stream" +msgstr "자막 스트림 선택" + +# Dialog before playback +msgctxt "#33016" +msgid "Play trailers?" +msgstr "예고편을 재생 하시겠습니까?" + +# Error message +msgctxt "#33032" +msgid "" +"Failed to generate a new device Id. See your logs for more information." +msgstr "새 장치 ID를 생성하지 못했습니다. 자세한 정보는 로그를 참조하십시오." + +# Pop-up informing about Kodi restart +msgctxt "#33033" +msgid "Kodi will now restart to apply the changes." +msgstr "Kodi는 이제 변경 사항을 적용하기 위해 다시 시작됩니다." + +# Confirmation dialog before item gets deleted from the PMS +msgctxt "#33041" +msgid "" +"Delete file(s) from Plex Server? This will also delete the file(s) from " +"disk!" +msgstr "Plex 서버에서 파일을 삭제 하시겠습니까? 이렇게하면 디스크에서도 파일이 삭제됩니다!" + +# PKC Settings - Playback +msgctxt "#39000" +msgid "- Number of trailers to play before a movie" +msgstr "-영화 전에 재생할 예고편 수" + +# PKC Settings - Playback +msgctxt "#39001" +msgid "Boost audio when transcoding" +msgstr "트랜스 코딩시 오디오 향상" + +# PKC Settings - Playback +msgctxt "#39002" +msgid "Burnt-in subtitle size" +msgstr "번인 자막 크기" + +# PKC Settings - Sync +msgctxt "#39003" +msgid "Number of simultaneous download threads" +msgstr "동시 다운로드 스레드 수" + +# PKC Settings - Plex +msgctxt "#39004" +msgid "Enable Plex Companion (restart Kodi!)" +msgstr "Plex Companion 활성화 (Kodi를 다시 시작하십시오!)" + +# PKC Settings - Plex +msgctxt "#39005" +msgid "Plex Companion Port (change only if needed)" +msgstr "Plex 컴패니언 포트(필요한 경우에만 변경)" + +# PKC Settings - Plex +msgctxt "#39008" +msgid "Plex Companion: Allows flinging media to Kodi through Plex" +msgstr "Plex 컴패니언: Plex를 통해 코디에게 미디어를 던지는 것을 허용" + +# Error message +msgctxt "#39009" +msgid "Could not login to plex.tv. Please try signing in again." +msgstr "plex.tv에 로그인 할 수 없습니다. 다시 로그인 해주세요." + +# Error message +msgctxt "#39010" +msgid "Problems connecting to plex.tv. Network or internet issue?" +msgstr "plex.tv에 연결하는 데 문제가 있습니다. 네트워크 또는 인터넷 문제?" + +# Error message +msgctxt "#39011" +msgid "Could not find any Plex server in the network. Aborting..." +msgstr "네트워크에서 Plex 서버를 찾을 수 없습니다. 중단 중 ..." + +# Dialog text for choosing PMS +msgctxt "#39012" +msgid "Choose your Plex server" +msgstr "Plex 서버 선택" + +# Error message +msgctxt "#39013" +msgid "Not yet authorized for Plex server " +msgstr "아직 Plex 서버에 대해 승인되지 않았습니다." + +# Error message +msgctxt "#39014" +msgid "Please sign in to plex.tv." +msgstr "plex.tv에서 로그인하세요." + +# Error message +msgctxt "#39015" +msgid "Problems connecting to server. Pick another server?" +msgstr "서버에 연결하는 데 문제가 있습니다. 다른 서버를 선택 하시겠습니까?" + +# Pop-up on initial sync +msgctxt "#39016" +msgid "" +"Disable Plex music library? (It is HIGHLY recommended to use Plex music only" +" with direct paths for large music libraries. Kodi might crash otherwise)" +msgstr "" +"Plex 음악 라이브러리를 비활성화 하시겠습니까? (큰 음악 라이브러리의 경우 직접 경로로만 Plex 음악을 사용하는 것이 좋습니다. " +"그렇지 않으면 Kodi가 충돌 할 수 있습니다.)" + +# Pop-up on initial sync +msgctxt "#39017" +msgid "" +"Would you now like to go to the plugin's settings to fine-tune PKC? You will" +" need to RESTART Kodi!" +msgstr "이제 플러그인 설정으로 이동하여 PKC를 미세 조정 하시겠습니까? Kodi를 다시 시작해야합니다!" + +# PKC Settings - Advanced +msgctxt "#39018" +msgid "Repair the Kodi database (force update all content)" +msgstr "Kodi 데이터베이스 복구 (모든 콘텐츠 강제 업데이트)" + +# PKC Settings - Advanced +msgctxt "#39019" +msgid "Reset the Kodi database and optionally reset PlexKodiConnect" +msgstr "Kodi 데이터베이스를 재설정하고 선택적으로 PlexKodiConnect를 재설정하십시오." + +# PKC Settings - Artwork +msgctxt "#39020" +msgid "Cache all images to Kodi texture cache now" +msgstr "모든 이미지를 Kodi 텍스처 캐시에 지금 캐시하십시오." + +# Appended to a listed PMS if it is in the same LAN network as PKC +msgctxt "#39022" +msgid "local" +msgstr "로컬" + +# Error message +msgctxt "#39023" +msgid "Failed to authenticate. Did you login to plex.tv?" +msgstr "인증하지 못했습니다. plex.tv에 로그인하셨습니까?" + +# PKC Settings - Plex +msgctxt "#39025" +msgid "Automatically log into plex.tv on startup" +msgstr "시작시 자동으로 plex.tv에 로그인" + +# PKC Settings - Sync +msgctxt "#39026" +msgid "Enable constant background sync" +msgstr "지속적인 백그라운드 동기화 활성화" + +# Pop-up on initial sync +msgctxt "#39028" +msgid "" +"CAUTION! If you choose \"Native\" mode , you might loose access to certain " +"Plex features such as: Plex trailers and transcoding options. ALL Plex " +"shares need to use direct paths (e.g. smb://myNAS/mymovie.mkv or " +"\\\\myNAS/mymovie.mkv)!" +msgstr "" +"주의! \"기본\" 모드를 선택하면 Plex 예고편 및 트랜스 코딩 옵션과 같은 특정 Plex 기능에 대한 액세스 권한이 손실 될 수 " +"있습니다. 모든 Plex 공유는 직접 경로를 사용해야합니다! (예: smb://myNAS/mymovie.mkv 또는 " +"\\\\myNAS/mymovie.mkv)" + +# Pop-up on initial sync +msgctxt "#39029" +msgid "Network credentials" +msgstr "네트워크 자격 증명" + +# Pop-up on initial sync +msgctxt "#39030" +msgid "" +"Add network credentials to allow Kodi access to your content? Note: Skipping" +" this step may generate a message during the initial scan of your content if" +" Kodi can't locate your content." +msgstr "" +"Kodi가 콘텐츠에 액세스 할 수 있도록 네트워크 자격 증명을 추가 하시겠습니까? 참고 : Kodi에서 콘텐츠를 찾을 수없는 경우이 " +"단계를 건너 뛰면 콘텐츠의 초기 스캔 중에 메시지가 생성 될 수 있습니다." + +# Error message displayed when verifying Direct Path sync paths passed by Plex +msgctxt "#39031" +msgid "" +"Kodi cannot locate the file %s. Please verify your PKC settings. Stop " +"syncing?" +msgstr "Kodi가 % s 파일을 찾을 수 없습니다. PKC 설정을 확인하십시오. 동기화를 중지 하시겠습니까?" + +# Pop-up on initial sync +msgctxt "#39033" +msgid "" +"Transform Plex UNC library paths \\\\myNas\\mymovie.mkv automatically to smb" +" paths, smb://myNas/mymovie.mkv? (recommended)" +msgstr "" +"Plex UNC 라이브러리 \\\\myNas\\mymovie.mkv 경로를 smb 경로 smb://myNas/mymovie.mkv 경로로" +" 자동 변환 하시겠습니까? (권장)" + +# PKC Settings - Customize Paths +msgctxt "#39034" +msgid "Replace Plex UNC paths \\\\myNas with smb://myNas" +msgstr "Plex UNC 경로 \\\\myNas를 smb://myNas로 바꿉니다." + +# PKC Settings - Customize Paths +msgctxt "#39035" +msgid "" +"Replace Plex paths /volume1/media or \\\\myserver\\media with custom SMB " +"paths smb://NAS/mystuff" +msgstr "" +"Plex 경로 /volume1/media 또는 \\\\myserver\\media 경로를 사용자 지정 SMB 경로 " +"smb://NAS/mystuff 경로로 바꿉니다." + +# PKC Settings - Customize Paths +msgctxt "#39036" +msgid "Escape special characters in path (e.g. space to %20)" +msgstr "경로의 특수 문자 이스케이프 (예: 공백을 %20으로)" + +# PKC Settings - Customize Paths +msgctxt "#39090" +msgid "Safe characters for http(s), dav(s) and (s)ftp urls" +msgstr "http(s), dav(s) 및 (s)ftp URL에 대한 안전한 문자" + +# PKC Settings - Customize Paths +msgctxt "#39037" +msgid "Original Plex MOVIE path to replace:" +msgstr "대체 할 원본 Plex MOVIE 경로:" + +# PKC Settings - Customize Paths +msgctxt "#39038" +msgid "Replace Plex MOVIE with:" +msgstr "Plex MOVIE를 다음으로 교체:" + +# PKC Settings - Customize Paths +msgctxt "#39039" +msgid "Original Plex TV SHOWS path to replace:" +msgstr "원래 Plex TV는 대체 할 경로를 보여줍니다." + +# PKC Settings - Customize Paths +msgctxt "#39040" +msgid "Replace Plex TV SHOWS with:" +msgstr "Plex TV SHOWS를 다음으로 교체:" + +# PKC Settings - Customize Paths +msgctxt "#39041" +msgid "Original Plex MUSIC path to replace:" +msgstr "대체 할 원래 Plex MUSIC 경로:" + +# PKC Settings - Customize Paths +msgctxt "#39042" +msgid "Replace Plex MUSIC with:" +msgstr "Plex 음악을 다음으로 교체하십시오." + +# Pop-up on initial sync +msgctxt "#39043" +msgid "" +"Go a step further and completely replace all original Plex library paths " +"(/volume1/media) with custom SMB paths (smb://NAS/MyStuff)?" +msgstr "" +"한 단계 더 나아가 모든 원본 Plex 라이브러리 경로 (/volume1/media) 경로를 사용자 지정 SMB 경로 " +"(smb://NAS/ MyStuff) 경로로 완전히 교체 하시겠습니까?" + +# Pop-up on initial sync +msgctxt "#39044" +msgid "" +"Please enter your custom smb paths in the settings under \"Sync Options\" " +"and then restart Kodi" +msgstr "\"동기화 옵션\"의 설정에 사용자 지정 smb 경로를 입력 한 다음 Kodi를 다시 시작하십시오" + +# PKC Settings - Customize Paths +msgctxt "#39045" +msgid "Original Plex PHOTO path to replace:" +msgstr "교체 할 원본 Plex 포토 경로 :" + +# PKC Settings - Customize Paths +msgctxt "#39046" +msgid "Replace Plex PHOTO with:" +msgstr "Plex PHOTO를 다음으로 교체:" + +# PKC Settings - Appearance Tweaks +msgctxt "#39047" +msgid "On Deck: Append show title to episode" +msgstr "On Deck: 에피소드에 프로그램 제목 추가" + +# PKC Settings - Appearance Tweaks +msgctxt "#39048" +msgid "On Deck: Append season- and episode-number SxxExx" +msgstr "On Deck: 시즌 및 에피소드 번호 SxxExx 추가" + +# PKC Settings - Advanced +msgctxt "#39049" +msgid "Nothing works? Try a full reset!" +msgstr "작동하지 않습니까? 전체 재설정을 시도하십시오!" + +# PKC Settings - Connection +msgctxt "#39050" +msgid "Choose Plex Server from a list" +msgstr "목록에서 Plex 서버 선택" + +# PKC Settings - Sync +msgctxt "#39051" +msgid "Wait before sync new/changed PMS item [s]" +msgstr "새로운/변경된 PMS 항목을 동기화하기 전에 기다립니다. (초)" + +# PKC Settings - Sync +msgctxt "#39052" +msgid "Background Sync" +msgstr "백그라운드 동기화" + +# PKC Settings - Sync +msgctxt "#39053" +msgid "Do a full library sync every x minutes" +msgstr "x 분마다 전체 라이브러리 동기화 수행" + +# Appended to a listed PMS if it is in the same LAN network as PKC +msgctxt "#39054" +msgid "remote" +msgstr "리모트" + +# Notification pop-up +msgctxt "#39055" +msgid "Searching for Plex Server" +msgstr "Plex 서버 검색" + +# PKC Settings - Customize paths +msgctxt "#39056" +msgid "" +"Used by sync and when attempting Direct Paths. Restart Kodi on changes!" +msgstr "동기화 및 직접 경로 시도시 사용됩니다. 변경 사항에 대해 Kodi를 다시 시작하십시오!" + +# PKC Settings, category name +msgctxt "#39057" +msgid "Customize Paths" +msgstr "경로 사용자 지정" + +# PKC Settings - Appearance Tweaks +msgctxt "#39059" +msgid "Recently Added: Append show title to episode" +msgstr "최근 추가: 에피소드에 프로그램 제목 추가" + +# PKC Settings - Appearance Tweaks +msgctxt "#39060" +msgid "Recently Added: Append season- and episode-number SxxExx" +msgstr "최근 추가: 시즌 및 에피소드 번호 SxxExx 추가" + +# Pop-up during initial sync +msgctxt "#39061" +msgid "" +"Would you like to download additional artwork from FanArtTV in the " +"background?" +msgstr "백그라운드에서 팬아트TV의 추가 아트 워크를 다운로드 하시겠습니까?" + +# PKC Settings - Sync +msgctxt "#39062" +msgid "Sync when screensaver is deactivated" +msgstr "화면 보호기가 비활성화되었을 때 동기화" + +# PKC Settings - Playback +msgctxt "#39063" +msgid "Force Transcode Hi10P" +msgstr "강제 코드 변환 Hi10P" + +# PKC Settings - Appearance Tweaks +msgctxt "#39064" +msgid "Recently Added: Also show already watched episodes" +msgstr "최근 추가: 이미 본 에피소드도 표시" + +# PKC Settings - Appearance Tweaks +msgctxt "#39065" +msgid "Force-refresh Kodi skin on stopping playback" +msgstr "재생 중지시 Kodi 스킨 강제 새로 고침" + +# PKC Settings - Appearance Tweaks +msgctxt "#39066" +msgid "Recently Added: Also show already watched movies" +msgstr "최근 추가 : 이미 본 영화도 표시" + +# PKC Settings - Connection +msgctxt "#39067" +msgid "Your current Plex Media Server:" +msgstr "현재 Plex 미디어 서버:" + +# PKC Settings - Connection +msgctxt "#39068" +msgid "Manually enter Plex Media Server address" +msgstr "Plex Media Server 주소를 수동으로 입력" + +# PKC Settings - Connection +msgctxt "#39069" +msgid "Current address:" +msgstr "현재 주소:" + +# PKC Settings - Connection +msgctxt "#39070" +msgid "Current port:" +msgstr "현재 포트 :" + +# PKC Settings - Connection +msgctxt "#39071" +msgid "Current plex.tv status:" +msgstr "현재 plex.tv 상태 :" + +# PKC Settings - Connection +msgctxt "#39072" +msgid "Background sync connection:" +msgstr "백그라운드 동기화 연결:" + +# PKC Settings, category name +msgctxt "#39073" +msgid "Appearance Tweaks" +msgstr "모양 조정" + +# PKC Settings - Appearance Tweaks +msgctxt "#39074" +msgid "TV Shows" +msgstr "TV 프로그램" + +# Pop-up during initial sync +msgctxt "#39076" +msgid "" +"If you use several Plex libraries of one kind, e.g. \"Kids Movies\" and " +"\"Parents Movies\", be sure to check the Wiki: https://goo.gl/JFtQV9" +msgstr "" +"한 종류의 여러 Plex 라이브러리를 사용하는 경우 (예: \"Kids Movies\" 및 \"Parents Movies\" 는 " +"Wiki: https://goo.gl/JFtQV9에서 확인하세요." + +# PKC Settings - Appearance Tweaks +msgctxt "#39077" +msgid "Maximum number of videos to show in widgets" +msgstr "위젯에 표시 할 최대 동영상 수" + +# PKC Settings - Plex +msgctxt "#39078" +msgid "Plex Companion Update Port (change only if needed)" +msgstr "Plex Companion 업데이트 포트 (필요한 경우에만 변경)" + +# Error message +msgctxt "#39079" +msgid "" +"Plex Companion could not open the GDM port. Please change it in the PKC " +"settings." +msgstr "Plex Companion에서 GDM 포트를 열 수 없습니다. PKC 설정에서 변경하십시오." + +# Pop-up on initial sync. +# Check that next translations for Add-on Paths and Direct Paths are +# identical! +msgctxt "#39080" +msgid "" +"Use Add-on Paths (default, easy) or Direct Paths? Choose Add-on Paths if " +"you're unsure. PKC will not work if your Direct Paths setup is wrong!" +msgstr "" +"애드온 경로 (기본값, 쉬운) 또는 직접 경로를 사용 하시겠습니까? 확실하지 않은 경우 추가 기능 경로를 선택하십시오. 직접 경로 설정이" +" 잘못된 경우 PKC가 작동하지 않습니다!" + +# Button text for choosing PKC mode +msgctxt "#39081" +msgid "Add-on Paths" +msgstr "애드온 경로" + +# Button text for choosing PKC mode +msgctxt "#39082" +msgid "Direct Paths" +msgstr "직접 경로" + +# Dialog for manually entering PMS +msgctxt "#39083" +msgid "Enter PMS IP or URL" +msgstr "PMS IP 또는 URL 입력" + +# Dialog for manually entering PMS +msgctxt "#39084" +msgid "Enter PMS port" +msgstr "PMS 포트 입력" + +# PKC settings - Appearance Tweaks +msgctxt "#39085" +msgid "Reload Kodi node files to apply all the settings below" +msgstr "아래의 모든 설정을 적용하려면 Kodi 노드 파일을 다시로드하십시오." + +# PKC Settings - Connection - Background sync connection status +msgctxt "#39089" +msgid "Alexa connection status:" +msgstr "Alexa 연결 상태:" + +# PKC Settings - Connection - Background sync connection status +msgctxt "#39091" +msgid "Timeout - not connected" +msgstr "시간 초과 - 연결되지 않음" + +# PKC Settings - Connection - Background sync connection status +msgctxt "#39092" +msgid "IOError - not connected" +msgstr "IOError - 연결되지 않음" + +# PKC Settings - Connection - Background sync connection status +msgctxt "#39093" +msgid "Suspended - not connected" +msgstr "일시 중지됨 - 연결되지 않음" + +# PKC Settings - Connection - Background sync connection status +msgctxt "#39094" +msgid "Managed Plex User - not connected" +msgstr "플렉스 관리자 - 연결되지 않음" + +msgctxt "#39200" +msgid "Log-out Plex Home User " +msgstr "Plex Home 사용자 로그 아웃" + +msgctxt "#39201" +msgid "Settings" +msgstr "설정" + +msgctxt "#39204" +msgid "Perform manual library sync" +msgstr "수동 라이브러리 동기화 수행" + +# Error message +msgctxt "#39205" +msgid "Unable to run the sync, the add-on is not connected to a Plex server." +msgstr "동기화를 실행할 수 없습니다. 추가 기능이 Plex 서버에 연결되어 있지 않습니다." + +msgctxt "#39206" +msgid "" +"Plex might lock your account if you fail to log in too many times. Proceed " +"anyway?" +msgstr "너무 많이 로그인하지 못하면 Plex가 계정을 잠글 수 있습니다. 계속 진행하시겠습니까?" + +msgctxt "#39207" +msgid "Resetting PMS connections, please wait" +msgstr "PMS 연결을 재설정하는 중입니다. 잠시 기다려주십시오." + +msgctxt "#39208" +msgid "Failed to reset PKC. Try to restart Kodi." +msgstr "PKC를 재설정하지 못했습니다. Kodi를 다시 시작하십시오." + +# PKC Settings - Plex +msgctxt "#39209" +msgid "Toggle plex.tv login (sign in or sign out)" +msgstr "plex.tv 로그인 전환 (로그인 또는 로그 아웃)" + +msgctxt "#39210" +msgid "Not yet connected to Plex Server" +msgstr "아직 Plex 서버에 연결되지 않았습니다." + +msgctxt "#39211" +msgid "Watch later" +msgstr "나중에보기" + +# Error message pop-up if {0} cannot be contacted. {0} will be replaced by +# e.g. the PMS' name +msgctxt "#39213" +msgid "{0} offline" +msgstr "{0} 오프라인" + +msgctxt "#39215" +msgid "Enter your Plex Media Server's IP or URL, Examples are:" +msgstr "Plex Media Server의 IP 또는 URL을 입력하십시오. 예는 다음과 같습니다." + +msgctxt "#39217" +msgid "Use HTTPS (SSL) connections? Answer should probably be yes." +msgstr "HTTPS (SSL) 연결을 사용 하시겠습니까? 대답은 아마도 예일 것입니다." + +msgctxt "#39218" +msgid "Error contacting PMS" +msgstr "PMS에 연결하는 중에 오류가 발생했습니다." + +msgctxt "#39219" +msgid "Abort (Yes) or save address anyway (No)?" +msgstr "중단 (예)하거나 주소를 저장 (아니오) 하시겠습니까?" + +# String attached at the end to get something like "PMS Name is offline" +msgctxt "#39220" +msgid "connected" +msgstr "연결됨" + +msgctxt "#39221" +msgid "plex.tv toggle successful" +msgstr "plex.tv 전환 성공" + +msgctxt "#39222" +msgid "Look for missing fanart on FanartTV now" +msgstr "지금 FanartTV에서 누락 된 팬 아트를 찾아보세요" + +msgctxt "#39223" +msgid "" +"Only look for missing fanart or refresh all fanart? The scan will take quite" +" a while and happen in the background." +msgstr "누락 된 팬 아트 만 찾거나 모든 팬 아트를 새로 고침 하시겠습니까? 스캔은 꽤 시간이 걸리며 백그라운드에서 수행됩니다." + +msgctxt "#39224" +msgid "Refresh all" +msgstr "모두 새로 고침" + +msgctxt "#39225" +msgid "Missing only" +msgstr "누락 정보만" + +# Message in the PKC settings if user has not logged in to plex.tv +msgctxt "#39226" +msgid "Not logged in to plex.tv" +msgstr "plex.tv에 로그인하지 않았습니다." + +# Message in the PKC settings if user is logged in to plex.tv +msgctxt "#39227" +msgid "Logged in to plex.tv" +msgstr "plex.tv에 로그인했습니다." + +# Message in the PKC settings to display the plex.tv username +msgctxt "#39228" +msgid "Plex admin user" +msgstr "Plex 관리자" + +# Error message if user could not log in; the actual user name will be +# appended at the end of the string +msgctxt "#39229" +msgid "Login failed with plex.tv for user" +msgstr "사용자의 plex.tv로 로그인하지 못했습니다." + +# Message in the PKC settings to display the plex.tv username +msgctxt "#39230" +msgid "Logged in Plex home user" +msgstr "Plex 홈 사용자에 로그인했습니다." + +# Message in the PKC settings to change the logged in Plex home user +msgctxt "#39231" +msgid "Change logged in Plex home user" +msgstr "로그인 한 Plex 홈 사용자 변경" + +msgctxt "#39250" +msgid "" +"Running the image cache process can take some time. It will happen in the " +"background. Are you sure you want continue?" +msgstr "이미지 캐시 프로세스를 실행하는 데 다소 시간이 걸릴 수 있습니다. 백그라운드에서 발생합니다. 계속 하시겠습니까?" + +msgctxt "#39251" +msgid "Reset all existing cache data first?" +msgstr "모든 기존 캐시 데이터를 먼저 재설정 하시겠습니까?" + +msgctxt "#39303" +msgid "Problems trying to contact plex.tv. Try again later" +msgstr "plex.tv에 연결하는 동안 문제가 발생했습니다. 나중에 다시 시도하십시오." + +msgctxt "#39304" +msgid "Go to https://plex.tv/pin and enter the code: " +msgstr "https://plex.tv/pin 웹페이지로 이동하여 코드를 입력하십시오." + +msgctxt "#39305" +msgid "Could not sign in to plex.tv. Try again later" +msgstr "plex.tv에 로그인 할 수 없습니다. 나중에 다시 시도" + +msgctxt "#39306" +msgid ": Select User" +msgstr ": 사용자 선택" + +msgctxt "#39307" +msgid "Enter PIN for user " +msgstr "사용자 PIN 번호 입력" + +msgctxt "#39308" +msgid "Could not log in user " +msgstr "로그인 할 수 없습니다." + +msgctxt "#39309" +msgid "Please try again." +msgstr "다시 시도하십시오." + +msgctxt "#39310" +msgid "unknown" +msgstr "알 수 없는" + +msgctxt "#39311" +msgid "or press No to not sign in." +msgstr "또는 로그인하지 않으려면 아니오를 누르십시오." + +msgctxt "#39400" +msgid "" +"Library sync thread has crashed. You should restart Kodi now. Please report " +"this on the forum" +msgstr "라이브러리 동기화 스레드가 중단되었습니다. 지금 Kodi를 다시 시작해야합니다. 포럼에 이것을 신고하십시오" + +msgctxt "#39401" +msgid "" +"Detected Kodi database needs to be recreated for this version. This might " +"take a while. Proceed?" +msgstr "탐지된 Kodi 데이터베이스를 이 버전에 대해 다시 만들어야 합니다. 시간이 좀 걸릴 수 있습니다. 진행하시겠습니까?" + +msgctxt "#39402" +msgid " may not work correctly until the database is reset." +msgstr "데이터베이스를 재설정 할 때까지 제대로 작동하지 않을 수 있습니다." + +msgctxt "#39403" +msgid "" +"The current Kodi version is not supported by PKC. Please consult the Plex " +"forum." +msgstr "현재 Kodi 버전은 PKC에서 지원되지 않습니다. Plex 포럼을 참조하십시오." + +msgctxt "#39405" +msgid "Plex playlists/nodes refreshed" +msgstr "Plex 재생 목록/노드 새로 고침" + +msgctxt "#39406" +msgid "Plex playlists/nodes refresh failed" +msgstr "Plex 재생 목록/노드 새로 고침 실패" + +msgctxt "#39408" +msgid "" +"Sync had to skip some items because they could not be processed. Kodi may be" +" instable now!! Please post your Kodi logs to the Plex forum." +msgstr "" +"일부 항목은 처리 할 수 ​​없어 동기화를 건너 뛰어야했습니다. Kodi는 지금 불안정 할 수 있습니다 !! Kodi 로그를 Plex " +"포럼에 게시하십시오." + +msgctxt "#39409" +msgid "" +"The Plex Server did not like you asking for so much data at once and " +"returned ERRORS. Try lowering the number of sync download threads in the " +"settings. Skipped some items for now." +msgstr "" +"Plex 서버는 한 번에 너무 많은 데이터를 요청하는 것을 좋아하지 않았고 오류를 반환했습니다. 설정에서 동기화 다운로드 스레드 수를 " +"줄이십시오. 지금은 일부 항목을 건너 뛰었습니다." + +msgctxt "#39410" +msgid "ERROR in library sync" +msgstr "라이브러리 동기화 오류" + +msgctxt "#39500" +msgid "On Deck" +msgstr "On Deck" + +msgctxt "#39501" +msgid "Collections" +msgstr "컬렉션" + +msgctxt "#39502" +msgid "PKC On Deck (faster)" +msgstr "PKC On Deck (빠름)" + +msgctxt "#39600" +msgid "" +"Are you sure you want to reset your local Kodi database? A re-sync of the " +"Plex data will take time afterwards." +msgstr "로컬 Kodi 데이터베이스를 재설정 하시겠습니까? 나중에 Plex 데이터를 다시 동기화하는 데 시간이 걸립니다." + +msgctxt "#39601" +msgid "Could not stop the database from running. Please try again later." +msgstr "데이터베이스 실행을 중지 할 수 없습니다. 나중에 다시 시도하세요." + +msgctxt "#39603" +msgid "" +"Reset all PlexKodiConnect Addon settings? (this is usually NOT recommended " +"and unnecessary!)" +msgstr "모든 PlexKodiConnect 애드온 설정을 재설정 하시겠습니까? (일반적으로 권장되지 않으며 불필요합니다!)" + +msgctxt "#39700" +msgid "Amazon Alexa (Voice Recognition)" +msgstr "아마존 알렉사 (음성 인식)" + +msgctxt "#39701" +msgid "Activate Alexa" +msgstr "알렉사 활성화" + +msgctxt "#39702" +msgid "Browse by folder" +msgstr "폴더로 찾아보기" + +# For use with addon.xml (PKC metadata for Kodi, e.g. description) +# Addon Summary +msgctxt "#39703" +msgid "Native Integration of Plex into Kodi" +msgstr "Plex를 Kodi에 기본 통합" + +# For use with addon.xml (PKC metadata for Kodi, e.g. description) +# Addon Description +msgctxt "#39704" +msgid "" +"Connect Kodi to your Plex Media Server. This plugin assumes that you manage " +"all your videos with Plex (and none with Kodi). You might lose data already " +"stored in the Kodi video and music databases (as this plugin directly " +"changes them). Use at your own risk!" +msgstr "" +"Kodi를 Plex Media Server에 연결합니다. 이 플러그인은 Plex로 모든 비디오를 관리하고 Kodi로는 관리하지 않는다고 " +"가정합니다. Kodi 비디오 및 음악 데이터베이스에 이미 저장된 데이터가 손실 될 수 있습니다 (이 플러그인이 직접 변경하므로). 자신의" +" 책임하에 사용하십시오!" + +# For use with addon.xml (PKC metadata for Kodi, e.g. description) +# Addon Disclaimer +msgctxt "#39705" +msgid "Use at your own risk" +msgstr "자신의 책임하에 사용" + +# If user gets prompted to choose between several subtitles to burn in +msgctxt "#39706" +msgid "Don't burn-in any subtitle" +msgstr "어떤 자막도 번인하지 마십시오" + +# If user gets prompted to choose between several audio/subtitle tracks and +# language is unknown +msgctxt "#39707" +msgid "unknown" +msgstr "알 수 없는" + +# If user gets prompted to choose between several subtitles and Plex adds the +# "default" flag +msgctxt "#39708" +msgid "Default" +msgstr "기본" + +# If user gets prompted to choose between several subtitles and Plex adds the +# "forced" flag +msgctxt "#39709" +msgid "Forced" +msgstr "강요된" + +# If user gets prompted to choose between several subtitles the subtitle +# cannot be downloaded (has no 'key' attribute from the PMS), the subtitle +# needs to be burned in +msgctxt "#39710" +msgid "burn-in" +msgstr "번인" + +# Dialog text if PKC detected a new Music library and Kodi needs to be +# restarted +msgctxt "#39711" +msgid "" +"New Plex music library detected. Sorry, but we need to restart Kodi now due " +"to the changes made." +msgstr "새 Plex 음악 라이브러리가 감지되었습니다. 죄송합니다. 변경 사항으로 인해 지금 Kodi를 다시 시작해야합니다." + +# Shown during sync process +msgctxt "#39712" +msgid "downloaded" +msgstr "다운로드 됨" + +# Shown during sync process +msgctxt "#39713" +msgid "processed" +msgstr "처리" + +# Shown during sync process +msgctxt "#39714" +msgid "Sync" +msgstr "동기화" + +# Shown during sync process +msgctxt "#39715" +msgid "Synching playlists" +msgstr "재생 목록 동기화" + +# Error message if an xml, e.g. advancedsettings.xml cannot be parsed (xml is +# screwed up; formated the wrong way). Do NOT replace {0} and {1}! +msgctxt "#39716" +msgid "" +"Kodi cannot parse {0}. PKC will not function correctly. Please visit {1} and" +" correct your file!" +msgstr "Kodi는 {0} 구문 분석 할 수 없습니다. PKC가 올바르게 작동하지 않습니다. {1} 방문하여 파일을 수정하십시오!" + +# Shown once on first installation to comply with the terms of use of +# themoviedb.org +msgctxt "#39717" +msgid "PKC uses free additional artwork from www.themoviedb.org. Many thanks!" +msgstr "PKC는 www.themoviedb.org의 무료 추가 아트 워크를 사용합니다. 감사합니다!" + +# Shown during very first PKC setup only +msgctxt "#39718" +msgid "" +"Do you want to replace your custom user ratings with an indicator of how " +"many versions of a media item you posses?" +msgstr "사용자 지정 사용자 등급을 보유하고있는 미디어 항목의 버전 수에 대한 표시기로 바꾸시겠습니까?" + +# In PKC Settings under Sync +msgctxt "#39719" +msgid "Replace user ratings with number of media versions" +msgstr "사용자 등급을 미디어 버전 수로 대체" diff --git a/resources/language/resource.language.lt_LT/strings.po b/resources/language/resource.language.lt_LT/strings.po index 5ddcff57..3023ddbf 100644 --- a/resources/language/resource.language.lt_LT/strings.po +++ b/resources/language/resource.language.lt_LT/strings.po @@ -1162,6 +1162,11 @@ msgctxt "#39071" msgid "Current plex.tv status:" msgstr "Dabartinė „plex.tv“ būsena:" +# PKC Settings - Connection +msgctxt "#39072" +msgid "Background sync connection:" +msgstr "" + # PKC Settings, category name msgctxt "#39073" msgid "Appearance Tweaks" @@ -1239,6 +1244,31 @@ msgstr "" "Atnaujinkite „Kodi“ mazgų failus, kad galėtumėte taikyti visus toliau " "pateiktus nustatymus" +# PKC Settings - Connection - Background sync connection status +msgctxt "#39089" +msgid "Alexa connection status:" +msgstr "" + +# PKC Settings - Connection - Background sync connection status +msgctxt "#39091" +msgid "Timeout - not connected" +msgstr "" + +# PKC Settings - Connection - Background sync connection status +msgctxt "#39092" +msgid "IOError - not connected" +msgstr "" + +# PKC Settings - Connection - Background sync connection status +msgctxt "#39093" +msgid "Suspended - not connected" +msgstr "" + +# PKC Settings - Connection - Background sync connection status +msgctxt "#39094" +msgid "Managed Plex User - not connected" +msgstr "" + msgctxt "#39200" msgid "Log-out Plex Home User " msgstr "Atjungti „Plex“ namų vartotoją" diff --git a/resources/language/resource.language.lv_LV/strings.po b/resources/language/resource.language.lv_LV/strings.po index 0cef43b6..4baad6ff 100644 --- a/resources/language/resource.language.lv_LV/strings.po +++ b/resources/language/resource.language.lv_LV/strings.po @@ -1144,6 +1144,11 @@ msgctxt "#39071" msgid "Current plex.tv status:" msgstr "Pašreizējais plex.tv statuss:" +# PKC Settings - Connection +msgctxt "#39072" +msgid "Background sync connection:" +msgstr "" + # PKC Settings, category name msgctxt "#39073" msgid "Appearance Tweaks" @@ -1212,6 +1217,31 @@ msgctxt "#39085" msgid "Reload Kodi node files to apply all the settings below" msgstr "" +# PKC Settings - Connection - Background sync connection status +msgctxt "#39089" +msgid "Alexa connection status:" +msgstr "" + +# PKC Settings - Connection - Background sync connection status +msgctxt "#39091" +msgid "Timeout - not connected" +msgstr "" + +# PKC Settings - Connection - Background sync connection status +msgctxt "#39092" +msgid "IOError - not connected" +msgstr "" + +# PKC Settings - Connection - Background sync connection status +msgctxt "#39093" +msgid "Suspended - not connected" +msgstr "" + +# PKC Settings - Connection - Background sync connection status +msgctxt "#39094" +msgid "Managed Plex User - not connected" +msgstr "" + msgctxt "#39200" msgid "Log-out Plex Home User " msgstr "" diff --git a/resources/language/resource.language.nl_NL/strings.po b/resources/language/resource.language.nl_NL/strings.po index aec52228..ae45bdff 100644 --- a/resources/language/resource.language.nl_NL/strings.po +++ b/resources/language/resource.language.nl_NL/strings.po @@ -1156,6 +1156,11 @@ msgctxt "#39071" msgid "Current plex.tv status:" msgstr "Huidige status van de plex.tv:" +# PKC Settings - Connection +msgctxt "#39072" +msgid "Background sync connection:" +msgstr "" + # PKC Settings, category name msgctxt "#39073" msgid "Appearance Tweaks" @@ -1234,6 +1239,31 @@ msgstr "" "Herlaad de Kodi node bestanden om alles onderstaande instellingen door te " "voeren" +# PKC Settings - Connection - Background sync connection status +msgctxt "#39089" +msgid "Alexa connection status:" +msgstr "" + +# PKC Settings - Connection - Background sync connection status +msgctxt "#39091" +msgid "Timeout - not connected" +msgstr "" + +# PKC Settings - Connection - Background sync connection status +msgctxt "#39092" +msgid "IOError - not connected" +msgstr "" + +# PKC Settings - Connection - Background sync connection status +msgctxt "#39093" +msgid "Suspended - not connected" +msgstr "" + +# PKC Settings - Connection - Background sync connection status +msgctxt "#39094" +msgid "Managed Plex User - not connected" +msgstr "" + msgctxt "#39200" msgid "Log-out Plex Home User " msgstr "Log-out Plex Home gebruiker " diff --git a/resources/language/resource.language.no_NO/strings.po b/resources/language/resource.language.no_NO/strings.po index cc187253..806a7394 100644 --- a/resources/language/resource.language.no_NO/strings.po +++ b/resources/language/resource.language.no_NO/strings.po @@ -1149,6 +1149,11 @@ msgctxt "#39071" msgid "Current plex.tv status:" msgstr "Aktuell plex.tv statys:" +# PKC Settings - Connection +msgctxt "#39072" +msgid "Background sync connection:" +msgstr "" + # PKC Settings, category name msgctxt "#39073" msgid "Appearance Tweaks" @@ -1224,6 +1229,31 @@ msgctxt "#39085" msgid "Reload Kodi node files to apply all the settings below" msgstr "" +# PKC Settings - Connection - Background sync connection status +msgctxt "#39089" +msgid "Alexa connection status:" +msgstr "" + +# PKC Settings - Connection - Background sync connection status +msgctxt "#39091" +msgid "Timeout - not connected" +msgstr "" + +# PKC Settings - Connection - Background sync connection status +msgctxt "#39092" +msgid "IOError - not connected" +msgstr "" + +# PKC Settings - Connection - Background sync connection status +msgctxt "#39093" +msgid "Suspended - not connected" +msgstr "" + +# PKC Settings - Connection - Background sync connection status +msgctxt "#39094" +msgid "Managed Plex User - not connected" +msgstr "" + msgctxt "#39200" msgid "Log-out Plex Home User " msgstr "Logg av Plex Home User" diff --git a/resources/language/resource.language.pl_PL/strings.po b/resources/language/resource.language.pl_PL/strings.po new file mode 100644 index 00000000..f6779b6e --- /dev/null +++ b/resources/language/resource.language.pl_PL/strings.po @@ -0,0 +1,1580 @@ +# XBMC Media Center language file +# Translators: +# Croneter None , 2017 +# Wiktor Dackiewicz , 2017 +# Kacpolz , 2019 +# Top Secret , 2020 +# +msgid "" +msgstr "" +"Project-Id-Version: PlexKodiConnect\n" +"Report-Msgid-Bugs-To: croneter@gmail.com\n" +"POT-Creation-Date: 2017-04-15 13:13+0000\n" +"PO-Revision-Date: 2017-04-30 08:30+0000\n" +"Last-Translator: Top Secret , 2020\n" +"Language-Team: Polish (Poland) (https://www.transifex.com/croneter/teams/73837/pl_PL/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: pl_PL\n" +"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n" + +# Add-on settings +msgctxt "#29999" +msgid "PlexKodiConnect" +msgstr "PlexKodiConnect" + +msgctxt "#30000" +msgid "Server Address (IP)" +msgstr "Adres serwera (IP)" + +msgctxt "#30001" +msgid "Searching for PMS" +msgstr "Szukanie serwera Plex" + +msgctxt "#30002" +msgid "Preferred playback method" +msgstr "Preferowana metoda odtwarzania" + +# Warning displayed if Kodi setting is enabled. Be sure to escape the quotes +# again! The exact wording can be found in the Kodi settings, player settings, +# videos +msgctxt "#30003" +msgid "" +"Warning: Kodi setting \"Play next video automatically\" is enabled. This " +"could break PKC. Deactivate?" +msgstr "" +"Uwaga: Opcja Kodi \"Odtwórz następne wideo automatycznie\" jest włączona. " +"Może to zepsuć PKC. Deaktywować?" + +msgctxt "#30004" +msgid "" +"The Kodi webserver is needed for artwork caching. PKC already set a strong, " +"random password automatically if you haven't done so already. Please confirm" +" the next dialog that you want to enable the webserver now with Yes." +msgstr "" + +msgctxt "#30005" +msgid "Username: " +msgstr "Nazwa użytkownika: " + +# Sync notification displayed if there is still artwork to be cached to Kodi +msgctxt "#30006" +msgid "Caching %s Plex images" +msgstr "Buforowanie %s zdjęć Plex" + +# Sync notification displayed if syncing of major artwork is done +msgctxt "#30007" +msgid "Plex image caching done" +msgstr "Buforowanie zdjęć Plex zakończone" + +# PKC settings artwork: Enable notifications for artwork image sync +msgctxt "#30008" +msgid "Enable notifications for image caching" +msgstr "Włącz powiadomienia dla buforowania zdjęć" + +# PKC settings artwork: Enable image caching during Kodi playback +msgctxt "#30009" +msgid "Enable image caching during Kodi playback (restart Kodi!)" +msgstr "" +"Włącz buforowanie zdjęć podczas odtwarzania Kodi (wymagany restart Kodi!)" + +# PKC settings - Artwork +msgctxt "#30010" +msgid "Approximate progress" +msgstr "Przybliżony postęp" + +# PKC settings - Artwork +msgctxt "#30011" +msgid "Artwork left to cache:" +msgstr "" + +# Button text +msgctxt "#30012" +msgid "OK" +msgstr "OK" + +msgctxt "#30013" +msgid "Never show" +msgstr "Nigdy nie pokazuj" + +# PKC settings category +msgctxt "#30014" +msgid "Connection" +msgstr "Połączenie" + +# Pop-up notification if user tried to manually initiate fanart download +msgctxt "#30015" +msgid "Fanart download already running" +msgstr "Pobieranie Fanart jest już uruchomione" + +msgctxt "#30016" +msgid "Device Name" +msgstr "Nazwa urządzenia" + +# Error message +msgctxt "#30017" +msgid "Unauthorized for PMS" +msgstr "Nieautoryzowane dla PMS" + +# Sync notification displayed for the number of fanart.tv lookups left +msgctxt "#30018" +msgid "Checking FanartTV for %s items" +msgstr "Przeszukiwanie FanartTV dla %s elementów" + +# PKC settings artwork options: status info +msgctxt "#30019" +msgid "FanartTV lookup completed" +msgstr "Przeszukiwanie FanartTV zakończone" + +# PKC settings sync options +msgctxt "#30020" +msgid "Sync Plex playlists (reboot Kodi!)" +msgstr "Zsynchronizuj playlisty Plex (uruchom ponownie Kodi!)" + +# PKC settings sync options +msgctxt "#30021" +msgid "Only sync specific Plex playlists to Kodi" +msgstr "" + +# PKC settings category +msgctxt "#30022" +msgid "Advanced" +msgstr "Ustawienia zaawansowane" + +# PKC settings sync options +msgctxt "#30023" +msgid "Only sync specific Kodi playlists to Plex" +msgstr "Synchronizuj tylko określone playlisty Kodi do Plex" + +msgctxt "#30024" +msgid "Username" +msgstr "Nazwa Użytkownika" + +msgctxt "#30025" +msgid "Display message if PMS goes offline" +msgstr "Wyświetlić komunikat, jeśli PMS przechodzi w tryb offline" + +# PKC settings sync options +msgctxt "#30026" +msgid "Prefix in Plex playlist name to trigger sync" +msgstr "" + +# PKC settings sync options +msgctxt "#30027" +msgid "Prefix in Kodi playlist name to trigger sync" +msgstr "" + +# PKC settings artwork options: status info +msgctxt "#30028" +msgid "PKC-only image caching completed" +msgstr "" + +msgctxt "#30030" +msgid "Port Number" +msgstr "Numer portu" + +msgctxt "#30031" +msgid "I own this Plex Media Server" +msgstr "Posiadam ten Plex Media Server" + +# Kodi context menu entry for movie and episode information screen +msgctxt "#30032" +msgid "Information" +msgstr "Informacja" + +msgctxt "#30042" +msgid "Refresh" +msgstr "Odśwież" + +msgctxt "#30043" +msgid "Delete" +msgstr "Usuń" + +# Notification displayed if there is a LOT to be deleted +msgctxt "#30052" +msgid "Deleting" +msgstr "Usuwanie" + +msgctxt "#30069" +msgid "None" +msgstr "Brak" + +msgctxt "#30093" +msgid "Mark Watched" +msgstr "Zaznacz obejrzane " + +msgctxt "#30094" +msgid "Mark Unwatched" +msgstr "Zaznacz nieobejrzane" + +msgctxt "#30095" +msgid "Add to Favorites" +msgstr "Dodaj do ulubionych" + +msgctxt "#30096" +msgid "Remove from Favorites" +msgstr "Usuń z ulubionych" + +msgctxt "#30114" +msgid "Offer delete after playback" +msgstr "Zaoferuj usunięcie po odtworzeniu" + +msgctxt "#30115" +msgid "For Episodes" +msgstr "Dla odcinków" + +msgctxt "#30116" +msgid "For Movies" +msgstr "Dla filmów" + +msgctxt "#30125" +msgid "Done" +msgstr "Zrobione" + +# Error popup message text +msgctxt "#30128" +msgid "Play Error" +msgstr "Błąd odtwarzania" + +msgctxt "#30132" +msgid "Warning" +msgstr "Ostrzeżenie" + +msgctxt "#30135" +msgid "Error" +msgstr "Błąd" + +msgctxt "#30138" +msgid "Search" +msgstr "Szukaj" + +msgctxt "#30139" +msgid "Enable Theme Music (Requires Restart)" +msgstr "Włącz muzykę w tle (wymagany restart)" + +msgctxt "#30143" +msgid "Always transcode if video bitrate is above" +msgstr "Zawsze transkoduj jeżeli przepływność filmu jest większa" + +msgctxt "#30157" +msgid "Enable Enhanced Images (eg CoverArt)" +msgstr "" + +msgctxt "#30158" +msgid "Metadata" +msgstr "Metadane" + +msgctxt "#30160" +msgid "Video Quality if Transcoding necessary" +msgstr "Jakość video jeżeli transkodowanie będzie wymagane" + +msgctxt "#30161" +msgid "Auto-adjust transcoding quality (deactivate for Chromecast)" +msgstr "" + +msgctxt "#30165" +msgid "Direct Play" +msgstr "" + +msgctxt "#30166" +msgid "Transcoding" +msgstr "Prztwarzanie " + +msgctxt "#30170" +msgid "Recently Added TV Shows" +msgstr "Ostatnio dodane Programy TV" + +msgctxt "#30171" +msgid "In Progress TV Shows" +msgstr "Obecnie oglądane Programy TV" + +msgctxt "#30173" +msgid "Channels" +msgstr "Kanały" + +msgctxt "#30174" +msgid "Recently Added" +msgstr "Ostatnio dodane" + +msgctxt "#30177" +msgid "In Progress Movies" +msgstr "Obecnie oglądane filmy" + +msgctxt "#30178" +msgid "In Progress Episodes" +msgstr "Obecnie oglądane odcinki" + +msgctxt "#30179" +msgid "Next Episodes" +msgstr "Następny odcinek" + +msgctxt "#30180" +msgid "Favorite Movies" +msgstr "Ulubione filmy" + +msgctxt "#30181" +msgid "Favorite Shows" +msgstr "Ulubione programy" + +msgctxt "#30182" +msgid "Favorite Episodes" +msgstr "Ulubione odcinki" + +msgctxt "#30189" +msgid "Unwatched Movies" +msgstr "Nieobejrzane filmy" + +msgctxt "#30198" +msgid "Search" +msgstr "Szukaj" + +# For setting up direct paths and adding network credentials +msgctxt "#30200" +msgid "" +"In the following window, enter the server's hostname (or IP) where your Plex" +" media resides. Mind the case!" +msgstr "" + +# For setting up direct paths and adding network credentials - input window +# for hostname +msgctxt "#30201" +msgid "Enter server hostname (or IP)" +msgstr "Wpisz nazwę hosta serwera (lub IP)" + +# For setting up direct paths and adding network credentials +msgctxt "#30202" +msgid "" +"In the following window, enter the network protocol you would like to use. " +"This is likely 'smb'." +msgstr "" + +# For setting up direct paths and adding network credentials - input window +# protocol +msgctxt "#30203" +msgid "Enter network protocol" +msgstr "Wpisz protokół sieci" + +# For setting up direct paths and adding network credentials +msgctxt "#30204" +msgid "The hostname or IP '{0}' that you entered is not valid." +msgstr "Nazwa hosta lub IP '{0}', który wpisałeś nie jest poprawny." + +# For setting up direct paths and adding network credentials +msgctxt "#30205" +msgid "The protocol '{0}' that you entered is not supported." +msgstr "Protokół '{0}', który wpisałeś nie jest wspierany." + +# Video node naming for random e.g. movies +msgctxt "#30227" +msgid "Random" +msgstr "Losowo" + +# Video node naming for e.g. movies +msgctxt "#30230" +msgid "Recommended" +msgstr "Polecane" + +msgctxt "#30235" +msgid "Extras" +msgstr "Dodatki" + +msgctxt "#30243" +msgid "Enable HTTPS" +msgstr "Włącz HTTPS" + +msgctxt "#30251" +msgid "Recently added Home Videos" +msgstr "Ostatnio dodane własne filmy" + +msgctxt "#30252" +msgid "Recently added Photos" +msgstr "Ostatnio dodane zdjęcia" + +msgctxt "#30253" +msgid "Favorite Home Videos" +msgstr "Ulubione prywatne filmy" + +msgctxt "#30254" +msgid "Favorite Photos" +msgstr "Ulubione zdjęcia" + +msgctxt "#30255" +msgid "Favorite Albums" +msgstr "Ulubione Albumy" + +msgctxt "#30256" +msgid "Recently added Music videos" +msgstr "Ostatnio dodane teledyski" + +msgctxt "#30257" +msgid "In progress Music videos" +msgstr "Obecnie oglądane teledyski" + +msgctxt "#30258" +msgid "Unwatched Music videos" +msgstr "Nieobejrzane teledyski" + +# PKC settings sub category under appearance tweaks +msgctxt "#30302" +msgid "Movies" +msgstr "Filmy" + +# contextmenu entry +msgctxt "#30401" +msgid "Plex options" +msgstr "Opcje Plex" + +# contextmenu entry +msgctxt "#30405" +msgid "Add to Plex favorites" +msgstr "Dodaj do ulubionych Plex" + +# contextmenu entry +msgctxt "#30406" +msgid "Remove from Plex favorites" +msgstr "Usuń z ulubionych Plex" + +# contextmenu entry +msgctxt "#30407" +msgid "Set custom song rating" +msgstr "" + +# contextmenu entry +msgctxt "#30408" +msgid "Plex addon settings" +msgstr "Ustawienia dodatku Plex" + +# contextmenu entry +msgctxt "#30409" +msgid "Delete item from server" +msgstr "Usuń element z serwera" + +# contextmenu entry +msgctxt "#30410" +msgid "Refresh this item" +msgstr "Odśwież element" + +# contextmenu entry +msgctxt "#30412" +msgid "Force transcode" +msgstr "Wymuś transkodowanie" + +# Error dialog text +msgctxt "#30414" +msgid "" +"Could not delete the Plex item. Is item deletion enabled on the Plex Media " +"Server?" +msgstr "" + +# contextmenu entry +msgctxt "#30415" +msgid "Start playback via PMS" +msgstr "Rozpocznij odtwarzanie przez PMS" + +msgctxt "#30416" +msgid "Settings for the Plex Server" +msgstr "Ustawienia dla serwera Plex" + +msgctxt "#30417" +msgid "" +"Could not change the Kodi settings file {0}. PKC might not work correctly. " +"Error: {1}" +msgstr "" +"Nie można zmienić pliku ustawień Kodi {0}. PKC może nie działać prawidłowo. " +"Błąd: {1}" + +# PKC Settings - Connection +msgctxt "#30500" +msgid "Verify Host SSL Certificate (more secure)" +msgstr "Zweryfikuj host certyfikatu SSL (bardziej bezpieczne)" + +# PKC Settings - Connection +msgctxt "#30501" +msgid "Client SSL certificate" +msgstr "Certyfikat SSL klienta" + +# PKC Settings - Artwork +msgctxt "#30502" +msgid "Sync Plex artwork from the PMS (recommended)" +msgstr "" + +# Message shown if SSL HTTPS certificate fails +msgctxt "#30503" +msgid "SSL certificate failed to validate. Please check {0} for solutions." +msgstr "Błąd weryfikacji certyfikatu SSL. Spróbuj tego {0} " + +# PKC Settings, category name +msgctxt "#30506" +msgid "Sync Options" +msgstr "Opcje synchronizacji" + +# PKC Settings - Sync Options +msgctxt "#30507" +msgid "Show syncing progress" +msgstr "Pokaż postęp synchronizacji" + +# PKC Settings - Sync Options +msgctxt "#30508" +msgid "Sync empty TV Shows" +msgstr "Synchronizuj puste programy TV" + +# PKC Settings - Sync Options +msgctxt "#30509" +msgid "Enable Music Library" +msgstr "Włącz bibliotekę muzyczną" + +msgctxt "#30510" +msgid "Direct stream music library" +msgstr "" + +# PKC Settings - Sync Options +msgctxt "#30511" +msgid "Playback Mode" +msgstr "Tryb odtwarzania" + +# PKC Settings - Artwork +msgctxt "#30512" +msgid "Cache all artwork for a smooth Kodi experience" +msgstr "" + +# PKC Settings - Artwork +msgctxt "#30513" +msgid "Limit artwork cache threads (recommended for rpi)" +msgstr "" + +# PKC Settings - Sync Options +msgctxt "#30514" +msgid "Show all Plex extras instead of immediately playing trailers" +msgstr "" + +# PKC Settings - Sync Options +msgctxt "#30515" +msgid "Maximum items to request from the server at once" +msgstr "" + +# PKC Settings, category name +msgctxt "#30516" +msgid "Playback" +msgstr "Odtwarzanie" + +# PKC Settings - Connection +msgctxt "#30517" +msgid "Set network credentials for Direct Paths and direct play" +msgstr "" + +# PKC Settings - Playback +msgctxt "#30518" +msgid "Enable Plex Trailers (Plexpass is needed)" +msgstr "" + +# PKC Settings - Playback +msgctxt "#30519" +msgid "Ask to play trailers" +msgstr "Pytaj czy odtwarzać zapowiedzi" + +# PKC Settings - Plex +msgctxt "#30520" +msgid "Skip PMS delete confirmation (use at your own risk)" +msgstr "" + +# PKC Settings - Playback +msgctxt "#30521" +msgid "Jump back on resume (in seconds)" +msgstr "" + +# PKC Settings - Playback +msgctxt "#30522" +msgid "Force transcode h265/HEVC" +msgstr "Wymuś transkodowanie h265/HEVC" + +# PKC Settings - Sync Options +msgctxt "#30523" +msgid "Also show sync progress for playstate and user data" +msgstr "" + +# PKC Settings - Sync Options +msgctxt "#30524" +msgid "Select Plex libraries to sync" +msgstr "Wybierz biblioteki Plex do synchronizacji" + +# PKC Settings - Playback +msgctxt "#30525" +msgid "Skip intro" +msgstr "" + +# PKC Settings - Playback +msgctxt "#30527" +msgid "Ignore specials in next episodes" +msgstr "" + +msgctxt "#30528" +msgid "Permanent users to add to the session" +msgstr "" + +# PKC Settings - Advanced +msgctxt "#30529" +msgid "Startup delay (in seconds)" +msgstr "" + +msgctxt "#30531" +msgid "Enable new content notification" +msgstr "" + +msgctxt "#30532" +msgid "Duration of the video library pop up (in seconds)" +msgstr "" + +msgctxt "#30533" +msgid "Duration of the music library pop up (in seconds)" +msgstr "" + +msgctxt "#30534" +msgid "Server messages" +msgstr "Wiadomości serwera" + +# PKC Settings - Advanced +msgctxt "#30535" +msgid "Generate a new unique Plex device Id (e.g. to clone Kodi)" +msgstr "" + +# PKC Settings - Connection +msgctxt "#30536" +msgid "Users must log in every time Kodi restarts" +msgstr "" + +# PKC Settings warning +msgctxt "#30537" +msgid "RESTART KODI IF YOU MAKE ANY CHANGES" +msgstr "" + +# PKC Settings warning +msgctxt "#30538" +msgid "Manual complete reset of Kodi database necessary, see \"Advanced\"" +msgstr "" + +# PKC Settings - Artwork +msgctxt "#30539" +msgid "Download additional art from FanArtTV" +msgstr "Pobierz dodatkową grafikę z FanArtTV" + +# PKC Settings - Artwork +msgctxt "#30540" +msgid "Download movie set/collection art from FanArtTV" +msgstr "" + +# PKC Settings - Playback +msgctxt "#30541" +msgid "Transcoding: Auto-pick audio and subtitle stream using Plex defaults" +msgstr "" + +# PKC Settings - Playback +msgctxt "#30542" +msgid "Always pick best quality for trailers" +msgstr "" + +# PKC Settings - Artwork +msgctxt "#30543" +msgid "Prefer Kodi artwork for collections/sets" +msgstr "" + +msgctxt "#30544" +msgid "Artwork" +msgstr "Grafika" + +# PKC Settings - Playback +msgctxt "#30545" +msgid "Force transcode pictures" +msgstr "" + +# Welcome to Plex notification +msgctxt "#33000" +msgid "Welcome" +msgstr "Witaj" + +# Error message +msgctxt "#33001" +msgid "Error connecting" +msgstr "Błąd łączenia" + +# Error message +msgctxt "#33002" +msgid "Server is unreachable" +msgstr "Serwer jest nieosiągalny" + +# Plex notification +msgctxt "#33003" +msgid "Server is online" +msgstr "Serwer jest online" + +# Plex notification when we need to transcode +msgctxt "#33004" +msgid "PMS enforced transcoding" +msgstr "" + +# Plex notification when we need to use direct streaming (instead of +# transcoding) +msgctxt "#33005" +msgid "PMS enforced direct streaming" +msgstr "" + +# Error notification +msgctxt "#33009" +msgid "Invalid username or password" +msgstr "Nieprawidłowa nazwa użytkownika lub hasło" + +msgctxt "#33010" +msgid "User is unauthorized for server {0}" +msgstr "" + +msgctxt "#33011" +msgid "Plex.tv did not provide us a valid list of Plex users, sorry." +msgstr "" + +# Dialog before playback +msgctxt "#33013" +msgid "Choose the audio stream" +msgstr "Wybierz ścieżkę dźwięku" + +# Dialog before playback +msgctxt "#33014" +msgid "Choose the subtitles stream" +msgstr "Wybierz ścieżkę napisów" + +# Dialog before playback +msgctxt "#33016" +msgid "Play trailers?" +msgstr "Odtworzyć zapowiedz?" + +# Error message +msgctxt "#33032" +msgid "" +"Failed to generate a new device Id. See your logs for more information." +msgstr "" + +# Pop-up informing about Kodi restart +msgctxt "#33033" +msgid "Kodi will now restart to apply the changes." +msgstr "" + +# Confirmation dialog before item gets deleted from the PMS +msgctxt "#33041" +msgid "" +"Delete file(s) from Plex Server? This will also delete the file(s) from " +"disk!" +msgstr "" + +# PKC Settings - Playback +msgctxt "#39000" +msgid "- Number of trailers to play before a movie" +msgstr "" + +# PKC Settings - Playback +msgctxt "#39001" +msgid "Boost audio when transcoding" +msgstr "" + +# PKC Settings - Playback +msgctxt "#39002" +msgid "Burnt-in subtitle size" +msgstr "" + +# PKC Settings - Sync +msgctxt "#39003" +msgid "Number of simultaneous download threads" +msgstr "" + +# PKC Settings - Plex +msgctxt "#39004" +msgid "Enable Plex Companion (restart Kodi!)" +msgstr "" + +# PKC Settings - Plex +msgctxt "#39005" +msgid "Plex Companion Port (change only if needed)" +msgstr "" + +# PKC Settings - Plex +msgctxt "#39008" +msgid "Plex Companion: Allows flinging media to Kodi through Plex" +msgstr "" + +# Error message +msgctxt "#39009" +msgid "Could not login to plex.tv. Please try signing in again." +msgstr "" + +# Error message +msgctxt "#39010" +msgid "Problems connecting to plex.tv. Network or internet issue?" +msgstr "" + +# Error message +msgctxt "#39011" +msgid "Could not find any Plex server in the network. Aborting..." +msgstr "" + +# Dialog text for choosing PMS +msgctxt "#39012" +msgid "Choose your Plex server" +msgstr "Wybierz swój serwer Plex" + +# Error message +msgctxt "#39013" +msgid "Not yet authorized for Plex server " +msgstr "" + +# Error message +msgctxt "#39014" +msgid "Please sign in to plex.tv." +msgstr "Proszę zarejestrować się na plex.tv" + +# Error message +msgctxt "#39015" +msgid "Problems connecting to server. Pick another server?" +msgstr "Problem z połączeniem do serwera. Czy chcesz wybrać inny serwer?" + +# Pop-up on initial sync +msgctxt "#39016" +msgid "" +"Disable Plex music library? (It is HIGHLY recommended to use Plex music only" +" with direct paths for large music libraries. Kodi might crash otherwise)" +msgstr "" + +# Pop-up on initial sync +msgctxt "#39017" +msgid "" +"Would you now like to go to the plugin's settings to fine-tune PKC? You will" +" need to RESTART Kodi!" +msgstr "" + +# PKC Settings - Advanced +msgctxt "#39018" +msgid "Repair the Kodi database (force update all content)" +msgstr "" + +# PKC Settings - Advanced +msgctxt "#39019" +msgid "Reset the Kodi database and optionally reset PlexKodiConnect" +msgstr "" + +# PKC Settings - Artwork +msgctxt "#39020" +msgid "Cache all images to Kodi texture cache now" +msgstr "" + +# Appended to a listed PMS if it is in the same LAN network as PKC +msgctxt "#39022" +msgid "local" +msgstr "lokalny" + +# Error message +msgctxt "#39023" +msgid "Failed to authenticate. Did you login to plex.tv?" +msgstr "" + +# PKC Settings - Plex +msgctxt "#39025" +msgid "Automatically log into plex.tv on startup" +msgstr "" + +# PKC Settings - Sync +msgctxt "#39026" +msgid "Enable constant background sync" +msgstr "" + +# Pop-up on initial sync +msgctxt "#39028" +msgid "" +"CAUTION! If you choose \"Native\" mode , you might loose access to certain " +"Plex features such as: Plex trailers and transcoding options. ALL Plex " +"shares need to use direct paths (e.g. smb://myNAS/mymovie.mkv or " +"\\\\myNAS/mymovie.mkv)!" +msgstr "" + +# Pop-up on initial sync +msgctxt "#39029" +msgid "Network credentials" +msgstr "" + +# Pop-up on initial sync +msgctxt "#39030" +msgid "" +"Add network credentials to allow Kodi access to your content? Note: Skipping" +" this step may generate a message during the initial scan of your content if" +" Kodi can't locate your content." +msgstr "" + +# Error message displayed when verifying Direct Path sync paths passed by Plex +msgctxt "#39031" +msgid "" +"Kodi cannot locate the file %s. Please verify your PKC settings. Stop " +"syncing?" +msgstr "" + +# Pop-up on initial sync +msgctxt "#39033" +msgid "" +"Transform Plex UNC library paths \\\\myNas\\mymovie.mkv automatically to smb" +" paths, smb://myNas/mymovie.mkv? (recommended)" +msgstr "" + +# PKC Settings - Customize Paths +msgctxt "#39034" +msgid "Replace Plex UNC paths \\\\myNas with smb://myNas" +msgstr "" + +# PKC Settings - Customize Paths +msgctxt "#39035" +msgid "" +"Replace Plex paths /volume1/media or \\\\myserver\\media with custom SMB " +"paths smb://NAS/mystuff" +msgstr "" + +# PKC Settings - Customize Paths +msgctxt "#39036" +msgid "Escape special characters in path (e.g. space to %20)" +msgstr "" + +# PKC Settings - Customize Paths +msgctxt "#39090" +msgid "Safe characters for http(s), dav(s) and (s)ftp urls" +msgstr "" + +# PKC Settings - Customize Paths +msgctxt "#39037" +msgid "Original Plex MOVIE path to replace:" +msgstr "" + +# PKC Settings - Customize Paths +msgctxt "#39038" +msgid "Replace Plex MOVIE with:" +msgstr "Zamień Plex FILMY z:" + +# PKC Settings - Customize Paths +msgctxt "#39039" +msgid "Original Plex TV SHOWS path to replace:" +msgstr "" + +# PKC Settings - Customize Paths +msgctxt "#39040" +msgid "Replace Plex TV SHOWS with:" +msgstr "Zamień Plex PROGRAMY TV z:" + +# PKC Settings - Customize Paths +msgctxt "#39041" +msgid "Original Plex MUSIC path to replace:" +msgstr "" + +# PKC Settings - Customize Paths +msgctxt "#39042" +msgid "Replace Plex MUSIC with:" +msgstr "Zamień Plex MUZYKA z:" + +# Pop-up on initial sync +msgctxt "#39043" +msgid "" +"Go a step further and completely replace all original Plex library paths " +"(/volume1/media) with custom SMB paths (smb://NAS/MyStuff)?" +msgstr "" + +# Pop-up on initial sync +msgctxt "#39044" +msgid "" +"Please enter your custom smb paths in the settings under \"Sync Options\" " +"and then restart Kodi" +msgstr "" + +# PKC Settings - Customize Paths +msgctxt "#39045" +msgid "Original Plex PHOTO path to replace:" +msgstr "" + +# PKC Settings - Customize Paths +msgctxt "#39046" +msgid "Replace Plex PHOTO with:" +msgstr "" + +# PKC Settings - Appearance Tweaks +msgctxt "#39047" +msgid "On Deck: Append show title to episode" +msgstr "" + +# PKC Settings - Appearance Tweaks +msgctxt "#39048" +msgid "On Deck: Append season- and episode-number SxxExx" +msgstr "" + +# PKC Settings - Advanced +msgctxt "#39049" +msgid "Nothing works? Try a full reset!" +msgstr "" + +# PKC Settings - Connection +msgctxt "#39050" +msgid "Choose Plex Server from a list" +msgstr "" + +# PKC Settings - Sync +msgctxt "#39051" +msgid "Wait before sync new/changed PMS item [s]" +msgstr "" + +# PKC Settings - Sync +msgctxt "#39052" +msgid "Background Sync" +msgstr "Synchronizacja w tle" + +# PKC Settings - Sync +msgctxt "#39053" +msgid "Do a full library sync every x minutes" +msgstr "Zrób pełną synchronizację biblioteki co x minut" + +# Appended to a listed PMS if it is in the same LAN network as PKC +msgctxt "#39054" +msgid "remote" +msgstr "zdalny" + +# Notification pop-up +msgctxt "#39055" +msgid "Searching for Plex Server" +msgstr "Szukanie serwera Plex" + +# PKC Settings - Customize paths +msgctxt "#39056" +msgid "" +"Used by sync and when attempting Direct Paths. Restart Kodi on changes!" +msgstr "" + +# PKC Settings, category name +msgctxt "#39057" +msgid "Customize Paths" +msgstr "" + +# PKC Settings - Appearance Tweaks +msgctxt "#39059" +msgid "Recently Added: Append show title to episode" +msgstr "" + +# PKC Settings - Appearance Tweaks +msgctxt "#39060" +msgid "Recently Added: Append season- and episode-number SxxExx" +msgstr "" + +# Pop-up during initial sync +msgctxt "#39061" +msgid "" +"Would you like to download additional artwork from FanArtTV in the " +"background?" +msgstr "" + +# PKC Settings - Sync +msgctxt "#39062" +msgid "Sync when screensaver is deactivated" +msgstr "Synchronizuj kiedy wygaszacz ekranu jest wyłączony" + +# PKC Settings - Playback +msgctxt "#39063" +msgid "Force Transcode Hi10P" +msgstr "Wymuś transkodowanie Hi10P" + +# PKC Settings - Appearance Tweaks +msgctxt "#39064" +msgid "Recently Added: Also show already watched episodes" +msgstr "" + +# PKC Settings - Appearance Tweaks +msgctxt "#39065" +msgid "Force-refresh Kodi skin on stopping playback" +msgstr "" + +# PKC Settings - Appearance Tweaks +msgctxt "#39066" +msgid "Recently Added: Also show already watched movies" +msgstr "" + +# PKC Settings - Connection +msgctxt "#39067" +msgid "Your current Plex Media Server:" +msgstr "" + +# PKC Settings - Connection +msgctxt "#39068" +msgid "Manually enter Plex Media Server address" +msgstr "" + +# PKC Settings - Connection +msgctxt "#39069" +msgid "Current address:" +msgstr "Aktualny adres:" + +# PKC Settings - Connection +msgctxt "#39070" +msgid "Current port:" +msgstr "Aktualny port:" + +# PKC Settings - Connection +msgctxt "#39071" +msgid "Current plex.tv status:" +msgstr "Aktualny status plex.tv:" + +# PKC Settings - Connection +msgctxt "#39072" +msgid "Background sync connection:" +msgstr "" + +# PKC Settings, category name +msgctxt "#39073" +msgid "Appearance Tweaks" +msgstr "" + +# PKC Settings - Appearance Tweaks +msgctxt "#39074" +msgid "TV Shows" +msgstr "" + +# Pop-up during initial sync +msgctxt "#39076" +msgid "" +"If you use several Plex libraries of one kind, e.g. \"Kids Movies\" and " +"\"Parents Movies\", be sure to check the Wiki: https://goo.gl/JFtQV9" +msgstr "" + +# PKC Settings - Appearance Tweaks +msgctxt "#39077" +msgid "Maximum number of videos to show in widgets" +msgstr "" + +# PKC Settings - Plex +msgctxt "#39078" +msgid "Plex Companion Update Port (change only if needed)" +msgstr "" + +# Error message +msgctxt "#39079" +msgid "" +"Plex Companion could not open the GDM port. Please change it in the PKC " +"settings." +msgstr "" + +# Pop-up on initial sync. +# Check that next translations for Add-on Paths and Direct Paths are +# identical! +msgctxt "#39080" +msgid "" +"Use Add-on Paths (default, easy) or Direct Paths? Choose Add-on Paths if " +"you're unsure. PKC will not work if your Direct Paths setup is wrong!" +msgstr "" + +# Button text for choosing PKC mode +msgctxt "#39081" +msgid "Add-on Paths" +msgstr "" + +# Button text for choosing PKC mode +msgctxt "#39082" +msgid "Direct Paths" +msgstr "" + +# Dialog for manually entering PMS +msgctxt "#39083" +msgid "Enter PMS IP or URL" +msgstr "" + +# Dialog for manually entering PMS +msgctxt "#39084" +msgid "Enter PMS port" +msgstr "" + +# PKC settings - Appearance Tweaks +msgctxt "#39085" +msgid "Reload Kodi node files to apply all the settings below" +msgstr "" + +# PKC Settings - Connection - Background sync connection status +msgctxt "#39089" +msgid "Alexa connection status:" +msgstr "" + +# PKC Settings - Connection - Background sync connection status +msgctxt "#39091" +msgid "Timeout - not connected" +msgstr "" + +# PKC Settings - Connection - Background sync connection status +msgctxt "#39092" +msgid "IOError - not connected" +msgstr "" + +# PKC Settings - Connection - Background sync connection status +msgctxt "#39093" +msgid "Suspended - not connected" +msgstr "" + +# PKC Settings - Connection - Background sync connection status +msgctxt "#39094" +msgid "Managed Plex User - not connected" +msgstr "" + +msgctxt "#39200" +msgid "Log-out Plex Home User " +msgstr "" + +msgctxt "#39201" +msgid "Settings" +msgstr "Ustawienia" + +msgctxt "#39204" +msgid "Perform manual library sync" +msgstr "" + +# Error message +msgctxt "#39205" +msgid "Unable to run the sync, the add-on is not connected to a Plex server." +msgstr "" + +msgctxt "#39206" +msgid "" +"Plex might lock your account if you fail to log in too many times. Proceed " +"anyway?" +msgstr "" + +msgctxt "#39207" +msgid "Resetting PMS connections, please wait" +msgstr "" + +msgctxt "#39208" +msgid "Failed to reset PKC. Try to restart Kodi." +msgstr "" + +# PKC Settings - Plex +msgctxt "#39209" +msgid "Toggle plex.tv login (sign in or sign out)" +msgstr "" + +msgctxt "#39210" +msgid "Not yet connected to Plex Server" +msgstr "" + +msgctxt "#39211" +msgid "Watch later" +msgstr "Obejrzyj później" + +# Error message pop-up if {0} cannot be contacted. {0} will be replaced by +# e.g. the PMS' name +msgctxt "#39213" +msgid "{0} offline" +msgstr "" + +msgctxt "#39215" +msgid "Enter your Plex Media Server's IP or URL, Examples are:" +msgstr "" + +msgctxt "#39217" +msgid "Use HTTPS (SSL) connections? Answer should probably be yes." +msgstr "" + +msgctxt "#39218" +msgid "Error contacting PMS" +msgstr "" + +msgctxt "#39219" +msgid "Abort (Yes) or save address anyway (No)?" +msgstr "Przerwać (Tak) czy zapisać adres (nie)?" + +# String attached at the end to get something like "PMS Name is offline" +msgctxt "#39220" +msgid "connected" +msgstr "połączono" + +msgctxt "#39221" +msgid "plex.tv toggle successful" +msgstr "" + +msgctxt "#39222" +msgid "Look for missing fanart on FanartTV now" +msgstr "" + +msgctxt "#39223" +msgid "" +"Only look for missing fanart or refresh all fanart? The scan will take quite" +" a while and happen in the background." +msgstr "" + +msgctxt "#39224" +msgid "Refresh all" +msgstr "Odśwież wszystko" + +msgctxt "#39225" +msgid "Missing only" +msgstr "" + +# Message in the PKC settings if user has not logged in to plex.tv +msgctxt "#39226" +msgid "Not logged in to plex.tv" +msgstr "" + +# Message in the PKC settings if user is logged in to plex.tv +msgctxt "#39227" +msgid "Logged in to plex.tv" +msgstr "" + +# Message in the PKC settings to display the plex.tv username +msgctxt "#39228" +msgid "Plex admin user" +msgstr "" + +# Error message if user could not log in; the actual user name will be +# appended at the end of the string +msgctxt "#39229" +msgid "Login failed with plex.tv for user" +msgstr "" + +# Message in the PKC settings to display the plex.tv username +msgctxt "#39230" +msgid "Logged in Plex home user" +msgstr "" + +# Message in the PKC settings to change the logged in Plex home user +msgctxt "#39231" +msgid "Change logged in Plex home user" +msgstr "" + +msgctxt "#39250" +msgid "" +"Running the image cache process can take some time. It will happen in the " +"background. Are you sure you want continue?" +msgstr "" + +msgctxt "#39251" +msgid "Reset all existing cache data first?" +msgstr "" + +msgctxt "#39303" +msgid "Problems trying to contact plex.tv. Try again later" +msgstr "" + +msgctxt "#39304" +msgid "Go to https://plex.tv/pin and enter the code: " +msgstr "" + +msgctxt "#39305" +msgid "Could not sign in to plex.tv. Try again later" +msgstr "" + +msgctxt "#39306" +msgid ": Select User" +msgstr ": Wybierz użytkownika" + +msgctxt "#39307" +msgid "Enter PIN for user " +msgstr "Wprowadź PIN dla użytkownika" + +msgctxt "#39308" +msgid "Could not log in user " +msgstr "" + +msgctxt "#39309" +msgid "Please try again." +msgstr "Proszę spróbować ponownie." + +msgctxt "#39310" +msgid "unknown" +msgstr "nieznany" + +msgctxt "#39311" +msgid "or press No to not sign in." +msgstr "" + +msgctxt "#39400" +msgid "" +"Library sync thread has crashed. You should restart Kodi now. Please report " +"this on the forum" +msgstr "" + +msgctxt "#39401" +msgid "" +"Detected Kodi database needs to be recreated for this version. This might " +"take a while. Proceed?" +msgstr "" + +msgctxt "#39402" +msgid " may not work correctly until the database is reset." +msgstr "" + +msgctxt "#39403" +msgid "" +"The current Kodi version is not supported by PKC. Please consult the Plex " +"forum." +msgstr "" + +msgctxt "#39405" +msgid "Plex playlists/nodes refreshed" +msgstr "" + +msgctxt "#39406" +msgid "Plex playlists/nodes refresh failed" +msgstr "" + +msgctxt "#39408" +msgid "" +"Sync had to skip some items because they could not be processed. Kodi may be" +" instable now!! Please post your Kodi logs to the Plex forum." +msgstr "" + +msgctxt "#39409" +msgid "" +"The Plex Server did not like you asking for so much data at once and " +"returned ERRORS. Try lowering the number of sync download threads in the " +"settings. Skipped some items for now." +msgstr "" + +msgctxt "#39410" +msgid "ERROR in library sync" +msgstr "" + +msgctxt "#39500" +msgid "On Deck" +msgstr "" + +msgctxt "#39501" +msgid "Collections" +msgstr "Kolekcje" + +msgctxt "#39502" +msgid "PKC On Deck (faster)" +msgstr "" + +msgctxt "#39600" +msgid "" +"Are you sure you want to reset your local Kodi database? A re-sync of the " +"Plex data will take time afterwards." +msgstr "" + +msgctxt "#39601" +msgid "Could not stop the database from running. Please try again later." +msgstr "" + +msgctxt "#39603" +msgid "" +"Reset all PlexKodiConnect Addon settings? (this is usually NOT recommended " +"and unnecessary!)" +msgstr "" + +msgctxt "#39700" +msgid "Amazon Alexa (Voice Recognition)" +msgstr "Amazon Alexa (Rozpoznawanie głosu)" + +msgctxt "#39701" +msgid "Activate Alexa" +msgstr "Włącz Alexa" + +msgctxt "#39702" +msgid "Browse by folder" +msgstr "" + +# For use with addon.xml (PKC metadata for Kodi, e.g. description) +# Addon Summary +msgctxt "#39703" +msgid "Native Integration of Plex into Kodi" +msgstr "" + +# For use with addon.xml (PKC metadata for Kodi, e.g. description) +# Addon Description +msgctxt "#39704" +msgid "" +"Connect Kodi to your Plex Media Server. This plugin assumes that you manage " +"all your videos with Plex (and none with Kodi). You might lose data already " +"stored in the Kodi video and music databases (as this plugin directly " +"changes them). Use at your own risk!" +msgstr "" + +# For use with addon.xml (PKC metadata for Kodi, e.g. description) +# Addon Disclaimer +msgctxt "#39705" +msgid "Use at your own risk" +msgstr "" + +# If user gets prompted to choose between several subtitles to burn in +msgctxt "#39706" +msgid "Don't burn-in any subtitle" +msgstr "" + +# If user gets prompted to choose between several audio/subtitle tracks and +# language is unknown +msgctxt "#39707" +msgid "unknown" +msgstr "" + +# If user gets prompted to choose between several subtitles and Plex adds the +# "default" flag +msgctxt "#39708" +msgid "Default" +msgstr "" + +# If user gets prompted to choose between several subtitles and Plex adds the +# "forced" flag +msgctxt "#39709" +msgid "Forced" +msgstr "" + +# If user gets prompted to choose between several subtitles the subtitle +# cannot be downloaded (has no 'key' attribute from the PMS), the subtitle +# needs to be burned in +msgctxt "#39710" +msgid "burn-in" +msgstr "" + +# Dialog text if PKC detected a new Music library and Kodi needs to be +# restarted +msgctxt "#39711" +msgid "" +"New Plex music library detected. Sorry, but we need to restart Kodi now due " +"to the changes made." +msgstr "" + +# Shown during sync process +msgctxt "#39712" +msgid "downloaded" +msgstr "" + +# Shown during sync process +msgctxt "#39713" +msgid "processed" +msgstr "" + +# Shown during sync process +msgctxt "#39714" +msgid "Sync" +msgstr "" + +# Shown during sync process +msgctxt "#39715" +msgid "Synching playlists" +msgstr "" + +# Error message if an xml, e.g. advancedsettings.xml cannot be parsed (xml is +# screwed up; formated the wrong way). Do NOT replace {0} and {1}! +msgctxt "#39716" +msgid "" +"Kodi cannot parse {0}. PKC will not function correctly. Please visit {1} and" +" correct your file!" +msgstr "" + +# Shown once on first installation to comply with the terms of use of +# themoviedb.org +msgctxt "#39717" +msgid "PKC uses free additional artwork from www.themoviedb.org. Many thanks!" +msgstr "" + +# Shown during very first PKC setup only +msgctxt "#39718" +msgid "" +"Do you want to replace your custom user ratings with an indicator of how " +"many versions of a media item you posses?" +msgstr "" + +# In PKC Settings under Sync +msgctxt "#39719" +msgid "Replace user ratings with number of media versions" +msgstr "" diff --git a/resources/language/resource.language.pt_BR/strings.po b/resources/language/resource.language.pt_BR/strings.po index b2475af8..500da10f 100644 --- a/resources/language/resource.language.pt_BR/strings.po +++ b/resources/language/resource.language.pt_BR/strings.po @@ -1145,6 +1145,11 @@ msgctxt "#39071" msgid "Current plex.tv status:" msgstr "Estado atual da plex.tv:" +# PKC Settings - Connection +msgctxt "#39072" +msgid "Background sync connection:" +msgstr "" + # PKC Settings, category name msgctxt "#39073" msgid "Appearance Tweaks" @@ -1217,6 +1222,31 @@ msgctxt "#39085" msgid "Reload Kodi node files to apply all the settings below" msgstr "" +# PKC Settings - Connection - Background sync connection status +msgctxt "#39089" +msgid "Alexa connection status:" +msgstr "" + +# PKC Settings - Connection - Background sync connection status +msgctxt "#39091" +msgid "Timeout - not connected" +msgstr "" + +# PKC Settings - Connection - Background sync connection status +msgctxt "#39092" +msgid "IOError - not connected" +msgstr "" + +# PKC Settings - Connection - Background sync connection status +msgctxt "#39093" +msgid "Suspended - not connected" +msgstr "" + +# PKC Settings - Connection - Background sync connection status +msgctxt "#39094" +msgid "Managed Plex User - not connected" +msgstr "" + msgctxt "#39200" msgid "Log-out Plex Home User " msgstr "Sair da sessão do Utilizador Caseiro Plex" diff --git a/resources/language/resource.language.pt_PT/strings.po b/resources/language/resource.language.pt_PT/strings.po index fe74f9fa..58274305 100644 --- a/resources/language/resource.language.pt_PT/strings.po +++ b/resources/language/resource.language.pt_PT/strings.po @@ -1148,6 +1148,11 @@ msgctxt "#39071" msgid "Current plex.tv status:" msgstr "Estado atual da plex.tv:" +# PKC Settings - Connection +msgctxt "#39072" +msgid "Background sync connection:" +msgstr "" + # PKC Settings, category name msgctxt "#39073" msgid "Appearance Tweaks" @@ -1220,6 +1225,31 @@ msgctxt "#39085" msgid "Reload Kodi node files to apply all the settings below" msgstr "" +# PKC Settings - Connection - Background sync connection status +msgctxt "#39089" +msgid "Alexa connection status:" +msgstr "" + +# PKC Settings - Connection - Background sync connection status +msgctxt "#39091" +msgid "Timeout - not connected" +msgstr "" + +# PKC Settings - Connection - Background sync connection status +msgctxt "#39092" +msgid "IOError - not connected" +msgstr "" + +# PKC Settings - Connection - Background sync connection status +msgctxt "#39093" +msgid "Suspended - not connected" +msgstr "" + +# PKC Settings - Connection - Background sync connection status +msgctxt "#39094" +msgid "Managed Plex User - not connected" +msgstr "" + msgctxt "#39200" msgid "Log-out Plex Home User " msgstr "Sair da sessão do Utilizador Caseiro Plex" diff --git a/resources/language/resource.language.ru_RU/strings.po b/resources/language/resource.language.ru_RU/strings.po index b6773804..5d300a82 100644 --- a/resources/language/resource.language.ru_RU/strings.po +++ b/resources/language/resource.language.ru_RU/strings.po @@ -1161,6 +1161,11 @@ msgctxt "#39071" msgid "Current plex.tv status:" msgstr "Текущий статус на plex.tv:" +# PKC Settings - Connection +msgctxt "#39072" +msgid "Background sync connection:" +msgstr "" + # PKC Settings, category name msgctxt "#39073" msgid "Appearance Tweaks" @@ -1236,6 +1241,31 @@ msgctxt "#39085" msgid "Reload Kodi node files to apply all the settings below" msgstr "Перезаписать узлы БД Kodi, чтобы применить следующие настройки" +# PKC Settings - Connection - Background sync connection status +msgctxt "#39089" +msgid "Alexa connection status:" +msgstr "" + +# PKC Settings - Connection - Background sync connection status +msgctxt "#39091" +msgid "Timeout - not connected" +msgstr "" + +# PKC Settings - Connection - Background sync connection status +msgctxt "#39092" +msgid "IOError - not connected" +msgstr "" + +# PKC Settings - Connection - Background sync connection status +msgctxt "#39093" +msgid "Suspended - not connected" +msgstr "" + +# PKC Settings - Connection - Background sync connection status +msgctxt "#39094" +msgid "Managed Plex User - not connected" +msgstr "" + msgctxt "#39200" msgid "Log-out Plex Home User " msgstr "Выйти из Plex" diff --git a/resources/language/resource.language.sv_SE/strings.po b/resources/language/resource.language.sv_SE/strings.po index b94943aa..7d856a58 100644 --- a/resources/language/resource.language.sv_SE/strings.po +++ b/resources/language/resource.language.sv_SE/strings.po @@ -1156,6 +1156,11 @@ msgctxt "#39071" msgid "Current plex.tv status:" msgstr "Nuvarande plex.tv status:" +# PKC Settings - Connection +msgctxt "#39072" +msgid "Background sync connection:" +msgstr "" + # PKC Settings, category name msgctxt "#39073" msgid "Appearance Tweaks" @@ -1230,6 +1235,31 @@ msgctxt "#39085" msgid "Reload Kodi node files to apply all the settings below" msgstr "Ladda om Kodi-nodfiler för att applicera alla inställningar nedan" +# PKC Settings - Connection - Background sync connection status +msgctxt "#39089" +msgid "Alexa connection status:" +msgstr "" + +# PKC Settings - Connection - Background sync connection status +msgctxt "#39091" +msgid "Timeout - not connected" +msgstr "" + +# PKC Settings - Connection - Background sync connection status +msgctxt "#39092" +msgid "IOError - not connected" +msgstr "" + +# PKC Settings - Connection - Background sync connection status +msgctxt "#39093" +msgid "Suspended - not connected" +msgstr "" + +# PKC Settings - Connection - Background sync connection status +msgctxt "#39094" +msgid "Managed Plex User - not connected" +msgstr "" + msgctxt "#39200" msgid "Log-out Plex Home User " msgstr "Logga ut Plex Home-användare" diff --git a/resources/language/resource.language.uk_UA/strings.po b/resources/language/resource.language.uk_UA/strings.po index 3a7a9c14..49fc722c 100644 --- a/resources/language/resource.language.uk_UA/strings.po +++ b/resources/language/resource.language.uk_UA/strings.po @@ -1158,6 +1158,11 @@ msgctxt "#39071" msgid "Current plex.tv status:" msgstr "Поточний plex.tv статус:" +# PKC Settings - Connection +msgctxt "#39072" +msgid "Background sync connection:" +msgstr "" + # PKC Settings, category name msgctxt "#39073" msgid "Appearance Tweaks" @@ -1235,6 +1240,31 @@ msgid "Reload Kodi node files to apply all the settings below" msgstr "" "Перезавантажити файли вузла Kodi для застосування всіх наступних налаштувань" +# PKC Settings - Connection - Background sync connection status +msgctxt "#39089" +msgid "Alexa connection status:" +msgstr "" + +# PKC Settings - Connection - Background sync connection status +msgctxt "#39091" +msgid "Timeout - not connected" +msgstr "" + +# PKC Settings - Connection - Background sync connection status +msgctxt "#39092" +msgid "IOError - not connected" +msgstr "" + +# PKC Settings - Connection - Background sync connection status +msgctxt "#39093" +msgid "Suspended - not connected" +msgstr "" + +# PKC Settings - Connection - Background sync connection status +msgctxt "#39094" +msgid "Managed Plex User - not connected" +msgstr "" + msgctxt "#39200" msgid "Log-out Plex Home User " msgstr "Вийти з профілю користувача Plex Home" diff --git a/resources/language/resource.language.zh_CN/strings.po b/resources/language/resource.language.zh_CN/strings.po index 1fede3e8..20361830 100644 --- a/resources/language/resource.language.zh_CN/strings.po +++ b/resources/language/resource.language.zh_CN/strings.po @@ -1114,6 +1114,11 @@ msgctxt "#39071" msgid "Current plex.tv status:" msgstr "当前plex.tv状态:" +# PKC Settings - Connection +msgctxt "#39072" +msgid "Background sync connection:" +msgstr "" + # PKC Settings, category name msgctxt "#39073" msgid "Appearance Tweaks" @@ -1182,6 +1187,31 @@ msgctxt "#39085" msgid "Reload Kodi node files to apply all the settings below" msgstr "" +# PKC Settings - Connection - Background sync connection status +msgctxt "#39089" +msgid "Alexa connection status:" +msgstr "" + +# PKC Settings - Connection - Background sync connection status +msgctxt "#39091" +msgid "Timeout - not connected" +msgstr "" + +# PKC Settings - Connection - Background sync connection status +msgctxt "#39092" +msgid "IOError - not connected" +msgstr "" + +# PKC Settings - Connection - Background sync connection status +msgctxt "#39093" +msgid "Suspended - not connected" +msgstr "" + +# PKC Settings - Connection - Background sync connection status +msgctxt "#39094" +msgid "Managed Plex User - not connected" +msgstr "" + msgctxt "#39200" msgid "Log-out Plex Home User " msgstr "退出Plex家庭用户 " diff --git a/resources/language/resource.language.zh_TW/strings.po b/resources/language/resource.language.zh_TW/strings.po index 36733b6b..32e66ace 100644 --- a/resources/language/resource.language.zh_TW/strings.po +++ b/resources/language/resource.language.zh_TW/strings.po @@ -1110,6 +1110,11 @@ msgctxt "#39071" msgid "Current plex.tv status:" msgstr "plex.tv 狀態︰" +# PKC Settings - Connection +msgctxt "#39072" +msgid "Background sync connection:" +msgstr "" + # PKC Settings, category name msgctxt "#39073" msgid "Appearance Tweaks" @@ -1178,6 +1183,31 @@ msgctxt "#39085" msgid "Reload Kodi node files to apply all the settings below" msgstr "" +# PKC Settings - Connection - Background sync connection status +msgctxt "#39089" +msgid "Alexa connection status:" +msgstr "" + +# PKC Settings - Connection - Background sync connection status +msgctxt "#39091" +msgid "Timeout - not connected" +msgstr "" + +# PKC Settings - Connection - Background sync connection status +msgctxt "#39092" +msgid "IOError - not connected" +msgstr "" + +# PKC Settings - Connection - Background sync connection status +msgctxt "#39093" +msgid "Suspended - not connected" +msgstr "" + +# PKC Settings - Connection - Background sync connection status +msgctxt "#39094" +msgid "Managed Plex User - not connected" +msgstr "" + msgctxt "#39200" msgid "Log-out Plex Home User " msgstr "登出Plex Home用戶 " diff --git a/resources/lib/app/libsync.py b/resources/lib/app/libsync.py index 397abe9c..5a0114ab 100644 --- a/resources/lib/app/libsync.py +++ b/resources/lib/app/libsync.py @@ -69,6 +69,8 @@ class Sync(object): self.run_lib_scan = None # Set if user decided to cancel sync self.stop_sync = False + # Do we check whether we can access a media file? + self.check_media_file_existence = False # Could we access the paths? self.path_verified = False @@ -92,6 +94,8 @@ class Sync(object): def load(self): self.direct_paths = utils.settings('useDirectPaths') == '1' + self.check_media_file_existence = \ + utils.settings('check_media_file_existence') == '1' self.enable_music = utils.settings('enableMusic') == 'true' self.artwork = utils.settings('usePlexArtwork') == 'true' self.replace_smb_path = utils.settings('replaceSMB') == 'true' diff --git a/resources/lib/companion.py b/resources/lib/companion.py index 2034c530..077474fd 100644 --- a/resources/lib/companion.py +++ b/resources/lib/companion.py @@ -48,7 +48,7 @@ def convert_alexa_to_companion(dictionary): """ The params passed by Alexa must first be converted to Companion talk """ - for key in dictionary: + for key in list(dictionary): if key in v.ALEXA_TO_COMPANION: dictionary[v.ALEXA_TO_COMPANION[key]] = dictionary[key] del dictionary[key] diff --git a/resources/lib/itemtypes/movies.py b/resources/lib/itemtypes/movies.py index 45f4b48a..4fc93348 100644 --- a/resources/lib/itemtypes/movies.py +++ b/resources/lib/itemtypes/movies.py @@ -1,13 +1,26 @@ #!/usr/bin/env python # -*- coding: utf-8 -*- from logging import getLogger +import re +import os +import string from .common import ItemBase from ..plex_api import API from .. import app, variables as v, plex_functions as PF +from ..path_ops import append_os_sep LOG = getLogger('PLEX.movies') +# Tolerance in years if comparing videos as equal +VIDEOYEAR_TOLERANCE = 1 +PUNCTUATION_TRANSLATION = {ord(char): None for char in string.punctuation} +# Punctuation removed in original strings!! +# Matches '2010 The Year We Make Contact 1984' +# from '2010 The Year We Make Contact 1984 720p webrip' +REGEX_MOVIENAME_AND_YEAR = re.compile( + r'''(.+)((?:19|20)\d{2}).*(?!((19|20)\d{2}))''') + class Movie(ItemBase): """ @@ -37,11 +50,39 @@ class Movie(ItemBase): fullpath, path, filename = api.fullpath() if app.SYNC.direct_paths and not fullpath.startswith('http'): - kodi_pathid = self.kodidb.add_path(path, - content='movies', - scraper='metadata.local') + if api.subtype: + # E.g. homevideos, which have "subtype" flag set + # Homevideo directories need to be flat by Plex' instructions + library_path, video_path = path, path + else: + # Normal movie libraries + library_path, video_path, filename = split_movie_path(fullpath) + if library_path == video_path: + # "Flat" folder structure where e.g. movies lie all in 1 dir + # E.g. + # 'C:\\Movies\\Pulp Fiction (1994).mkv' + kodi_pathid = self.kodidb.add_path(library_path, + content='movies', + scraper='metadata.local') + path = library_path + kodi_parent_pathid = kodi_pathid + else: + # Plex library contains folders named identical to the + # video file, e.g. + # 'C:\\Movies\\Pulp Fiction (1994)\\Pulp Fiction (1994).mkv' + # Add the "parent" path for the Plex library + kodi_parent_pathid = self.kodidb.add_path( + library_path, + content='movies', + scraper='metadata.local') + # Add this movie's path + kodi_pathid = self.kodidb.add_path( + video_path, + id_parent_path=kodi_parent_pathid) + path = video_path else: kodi_pathid = self.kodidb.get_path(path) + kodi_parent_pathid = kodi_pathid if update_item: LOG.info('UPDATE movie plex_id: %s - %s', plex_id, api.title()) @@ -105,8 +146,8 @@ class Movie(ItemBase): api.list_to_string(api.studios()), api.trailer(), api.list_to_string(api.countries()), - fullpath, - kodi_pathid, + path, + kodi_parent_pathid, api.premiere_date(), api.userrating()) @@ -243,3 +284,73 @@ class Movie(ItemBase): return unique_ids.get('imdb', unique_ids.get('tmdb', unique_ids.get('tvdb'))) + + +def split_movie_path(path): + """ + Implements Plex' video naming convention for movies: + https://support.plex.tv/articles/naming-and-organizing-your-movie-media-files/ + + Splits a video's path into its librarypath, potential video folder, and + filename. + E.g. path = 'C:\\Movies\\Pulp Fiction (1994)\\Pulp Fiction (1994).mkv' + returns the tuple + ('C:\\Movies\\', + 'C:\\Movies\\Pulp Fiction (1994)\\', + 'Pulp Fiction (1994).mkv') + + E.g. path = 'C:\\Movies\\Pulp Fiction (1994).mkv' + returns the tuple + ('C:\\Movies\\', + 'C:\\Movies\\', + 'Pulp Fiction (1994).mkv') + """ + basename, filename = os.path.split(path) + library_path, videofolder = os.path.split(basename) + + clean_filename = _clean_name(os.path.splitext(filename)[0]) + clean_videofolder = _clean_name(videofolder) + + try: + parsed_filename = _parse_videoname_and_year(clean_filename) + except (TypeError, IndexError): + LOG.warn('Could not parse video path, be sure to follow the Plex ' + 'naming guidelines!! We failed to parse this path: %s', path) + # Be on the safe side and assume that the movie folder structure is + # flat + return append_os_sep(basename), append_os_sep(basename), filename + try: + parsed_videofolder = _parse_videoname_and_year(clean_videofolder) + except (TypeError, IndexError): + # e.g. no year to parse => flat structure + return append_os_sep(basename), append_os_sep(basename), filename + if _parsed_names_alike(parsed_filename, parsed_videofolder): + # e.g. + # filename = The Master.(2012).720p.Blu-ray.axed.mkv + # videofolder = The Master 2012 + # or + # filename = National Lampoon's Christmas Vacation (1989) + # [x264-Bluray-1080p DTS-2.0] + # videofolder = Christmas Vacation 1989 + return append_os_sep(library_path), append_os_sep(basename), filename + else: + # Flat movie file-stuctrue, all movies in one big directory + return append_os_sep(basename), append_os_sep(basename), filename + + +def _parsed_names_alike(name1, name2): + return (abs(name2[1] - name1[1]) <= VIDEOYEAR_TOLERANCE and + (name1[0] in name2[0] or name2[0] in name1[0])) + + +def _clean_name(name): + """ + Returns name with all whitespaces (regex "\\s") and punctuation + (string.punctuation) characters removed; all characters in lowercase + """ + return re.sub('\\s', '', name).translate(PUNCTUATION_TRANSLATION).lower() + + +def _parse_videoname_and_year(name): + parsed = REGEX_MOVIENAME_AND_YEAR.search(name) + return parsed[1], int(parsed[2]) diff --git a/resources/lib/kodi_db/video.py b/resources/lib/kodi_db/video.py index 47fc9559..2c3e8a74 100644 --- a/resources/lib/kodi_db/video.py +++ b/resources/lib/kodi_db/video.py @@ -45,13 +45,15 @@ class KodiVideoDB(common.KodiDBBase): strContent, strScraper, noUpdate, - exclude) - VALUES (?, ?, ?, ?, ?) + exclude, + allAudio) + VALUES (?, ?, ?, ?, ?, ?) ''' self.cursor.execute(query, (path, kind, 'metadata.local', 1, + 0, 0)) @db.catch_operationalerrors @@ -108,11 +110,13 @@ class KodiVideoDB(common.KodiDBBase): idParentPath, strContent, strScraper, - noUpdate) - VALUES (?, ?, ?, ?, ?, ?) + noUpdate, + exclude, + allAudio) + VALUES (?, ?, ?, ?, ?, ?, ?, ?) ''', (path, date_added, id_parent_path, content, - scraper, 1)) + scraper, 1, 0, 0)) pathid = self.cursor.lastrowid return pathid diff --git a/resources/lib/library_sync/sections.py b/resources/lib/library_sync/sections.py index 295e5572..3a206351 100644 --- a/resources/lib/library_sync/sections.py +++ b/resources/lib/library_sync/sections.py @@ -20,10 +20,10 @@ SHOULD_CANCEL = None LIBRARY_PATH = path_ops.translate_path('special://profile/library/video/') # The video library might not yet exist for this user - create it if not path_ops.exists(LIBRARY_PATH): - path_ops.copy_tree( + path_ops.copytree( src=path_ops.translate_path('special://xbmc/system/library/video'), dst=LIBRARY_PATH, - preserve_mode=0) # dont copy permission bits so we have write access! + copy_function=path_ops.shutil.copyfile) PLAYLISTS_PATH = path_ops.translate_path("special://profile/playlists/video/") if not path_ops.exists(PLAYLISTS_PATH): path_ops.makedirs(PLAYLISTS_PATH) diff --git a/resources/lib/path_ops.py b/resources/lib/path_ops.py index f0363f5d..7dd81dfd 100644 --- a/resources/lib/path_ops.py +++ b/resources/lib/path_ops.py @@ -17,7 +17,6 @@ as well as sources.xml import shutil import os from os import path # allows to use path_ops.path.join, for example -from distutils import dir_util import re import xbmcvfs @@ -27,6 +26,17 @@ KODI_ENCODING = 'utf-8' REGEX_FILE_NUMBERING = re.compile(r'''_(\d\d)\.\w+$''') +def append_os_sep(path): + """ + Appends either a '\\' or '/' - IRRELEVANT of the host OS!! (os.path.join is + dependant on the host OS) + """ + if '/' in path: + return path + '/' + else: + return path + '\\' + + def translate_path(path): """ Returns the XBMC translated path [unicode] @@ -155,28 +165,47 @@ def walk(top, topdown=True, onerror=None, followlinks=False): [x for x in nondirs]) -def copy_tree(src, dst, *args, **kwargs): +def copytree(src, dst, *args, **kwargs): """ - Copy an entire directory tree 'src' to a new location 'dst'. + Recursively copy an entire directory tree rooted at src to a directory named + dst and return the destination directory. dirs_exist_ok dictates whether to + raise an exception in case dst or any missing parent directory already + exists. - Both 'src' and 'dst' must be directory names. If 'src' is not a - directory, raise DistutilsFileError. If 'dst' does not exist, it is - created with 'mkpath()'. The end result of the copy is that every - file in 'src' is copied to 'dst', and directories under 'src' are - recursively copied to 'dst'. Return the list of files that were - copied or might have been copied, using their output name. The - return value is unaffected by 'update' or 'dry_run': it is simply - the list of all files under 'src', with the names changed to be - under 'dst'. + Permissions and times of directories are copied with copystat(), individual + files are copied using copy2(). - 'preserve_mode' and 'preserve_times' are the same as for - 'copy_file'; note that they only apply to regular files, not to - directories. If 'preserve_symlinks' is true, symlinks will be - copied as symlinks (on platforms that support them!); otherwise - (the default), the destination of the symlink will be copied. - 'update' and 'verbose' are the same as for 'copy_file'. + If symlinks is true, symbolic links in the source tree are represented as + symbolic links in the new tree and the metadata of the original links will + be copied as far as the platform allows; if false or omitted, the contents + and metadata of the linked files are copied to the new tree. + + When symlinks is false, if the file pointed by the symlink doesn’t exist, an + exception will be added in the list of errors raised in an Error exception + at the end of the copy process. You can set the optional + ignore_dangling_symlinks flag to true if you want to silence this exception. + Notice that this option has no effect on platforms that don’t support + os.symlink(). + + If ignore is given, it must be a callable that will receive as its arguments + the directory being visited by copytree(), and a list of its contents, as + returned by os.listdir(). Since copytree() is called recursively, the ignore + callable will be called once for each directory that is copied. The callable + must return a sequence of directory and file names relative to the current + directory (i.e. a subset of the items in its second argument); these names + will then be ignored in the copy process. ignore_patterns() can be used to + create such a callable that ignores names based on glob-style patterns. + + If exception(s) occur, an Error is raised with a list of reasons. + + If copy_function is given, it must be a callable that will be used to copy + each file. It will be called with the source path and the destination path + as arguments. By default, copy2() is used, but any function that supports + the same signature (like copy()) can be used. + + Raises an auditing event shutil.copytree with arguments src, dst. """ - return dir_util.copy_tree(src, dst, *args, **kwargs) + return shutil.copytree(src, dst, *args, **kwargs) def basename(path): diff --git a/resources/lib/pathvalidate/__init__.py b/resources/lib/pathvalidate/__init__.py new file mode 100644 index 00000000..425aaf9d --- /dev/null +++ b/resources/lib/pathvalidate/__init__.py @@ -0,0 +1,35 @@ +""" +.. codeauthor:: Tsuyoshi Hombashi +""" + +from .__version__ import __author__, __copyright__, __email__, __license__, __version__ +from ._common import ( + Platform, + ascii_symbols, + normalize_platform, + replace_unprintable_char, + unprintable_ascii_chars, + validate_null_string, + validate_pathtype, +) +from ._filename import FileNameSanitizer, is_valid_filename, sanitize_filename, validate_filename +from ._filepath import ( + FilePathSanitizer, + is_valid_filepath, + sanitize_file_path, + sanitize_filepath, + validate_file_path, + validate_filepath, +) +from ._ltsv import sanitize_ltsv_label, validate_ltsv_label +from ._symbol import replace_symbol, validate_symbol +from .error import ( + ErrorReason, + InvalidCharError, + InvalidLengthError, + InvalidReservedNameError, + NullNameError, + ReservedNameError, + ValidationError, + ValidReservedNameError, +) diff --git a/resources/lib/pathvalidate/__version__.py b/resources/lib/pathvalidate/__version__.py new file mode 100644 index 00000000..375dee84 --- /dev/null +++ b/resources/lib/pathvalidate/__version__.py @@ -0,0 +1,6 @@ +__author__ = "Tsuyoshi Hombashi" +__copyright__ = "Copyright 2016, {}".format(__author__) +__license__ = "MIT License" +__version__ = "2.4.1" +__maintainer__ = __author__ +__email__ = "tsuyoshi.hombashi@gmail.com" diff --git a/resources/lib/pathvalidate/_base.py b/resources/lib/pathvalidate/_base.py new file mode 100644 index 00000000..f7451a78 --- /dev/null +++ b/resources/lib/pathvalidate/_base.py @@ -0,0 +1,137 @@ +""" +.. codeauthor:: Tsuyoshi Hombashi +""" + +import abc +import os +from typing import Optional, Tuple, cast + +from ._common import PathType, Platform, PlatformType, normalize_platform, unprintable_ascii_chars +from .error import ReservedNameError, ValidationError + + +class BaseFile: + _INVALID_PATH_CHARS = "".join(unprintable_ascii_chars) + _INVALID_FILENAME_CHARS = _INVALID_PATH_CHARS + "/" + _INVALID_WIN_PATH_CHARS = _INVALID_PATH_CHARS + ':*?"<>|\t\n\r\x0b\x0c' + _INVALID_WIN_FILENAME_CHARS = _INVALID_FILENAME_CHARS + _INVALID_WIN_PATH_CHARS + "\\" + + _ERROR_MSG_TEMPLATE = "invalid char found: invalids=({invalid}), value={value}" + + @property + def platform(self) -> Platform: + return self.__platform + + @property + def reserved_keywords(self) -> Tuple[str, ...]: + return tuple() + + @property + def min_len(self) -> int: + return self._min_len + + @property + def max_len(self) -> int: + return self._max_len + + def __init__( + self, + min_len: Optional[int], + max_len: Optional[int], + check_reserved: bool, + platform_max_len: Optional[int] = None, + platform: PlatformType = None, + ) -> None: + self.__platform = normalize_platform(platform) + self._check_reserved = check_reserved + + if min_len is None: + min_len = 1 + self._min_len = max(min_len, 1) + + if platform_max_len is None: + platform_max_len = self._get_default_max_path_len() + + if max_len in [None, -1]: + self._max_len = platform_max_len + else: + self._max_len = cast(int, max_len) + + self._max_len = min(self._max_len, platform_max_len) + self._validate_max_len() + + def _is_posix(self) -> bool: + return self.platform == Platform.POSIX + + def _is_universal(self) -> bool: + return self.platform == Platform.UNIVERSAL + + def _is_linux(self) -> bool: + return self.platform == Platform.LINUX + + def _is_windows(self) -> bool: + return self.platform == Platform.WINDOWS + + def _is_macos(self) -> bool: + return self.platform == Platform.MACOS + + def _validate_max_len(self) -> None: + if self.max_len < 1: + raise ValueError("max_len must be greater or equals to one") + + if self.min_len > self.max_len: + raise ValueError("min_len must be lower than max_len") + + def _get_default_max_path_len(self) -> int: + if self._is_linux(): + return 4096 + + if self._is_windows(): + return 260 + + if self._is_posix() or self._is_macos(): + return 1024 + + return 260 # universal + + +class AbstractValidator(BaseFile, metaclass=abc.ABCMeta): + @abc.abstractmethod + def validate(self, value: PathType) -> None: # pragma: no cover + pass + + def is_valid(self, value: PathType) -> bool: + try: + self.validate(value) + except (TypeError, ValidationError): + return False + + return True + + def _is_reserved_keyword(self, value: str) -> bool: + return value in self.reserved_keywords + + +class AbstractSanitizer(BaseFile, metaclass=abc.ABCMeta): + @abc.abstractmethod + def sanitize(self, value: PathType, replacement_text: str = "") -> PathType: # pragma: no cover + pass + + +class BaseValidator(AbstractValidator): + def _validate_reserved_keywords(self, name: str) -> None: + if not self._check_reserved: + return + + root_name = self.__extract_root_name(name) + if self._is_reserved_keyword(root_name.upper()): + raise ReservedNameError( + "'{}' is a reserved name".format(root_name), + reusable_name=False, + reserved_name=root_name, + platform=self.platform, + ) + + @staticmethod + def __extract_root_name(path: str) -> str: + return os.path.splitext(os.path.basename(path))[0] diff --git a/resources/lib/pathvalidate/_common.py b/resources/lib/pathvalidate/_common.py new file mode 100644 index 00000000..18d354cf --- /dev/null +++ b/resources/lib/pathvalidate/_common.py @@ -0,0 +1,147 @@ +""" +.. codeauthor:: Tsuyoshi Hombashi +""" + +import enum +import platform +import re +import string +from pathlib import Path +from typing import Any, List, Optional, Union, cast + + +_re_whitespaces = re.compile(r"^[\s]+$") + + +@enum.unique +class Platform(enum.Enum): + POSIX = "POSIX" + UNIVERSAL = "universal" + + LINUX = "Linux" + WINDOWS = "Windows" + MACOS = "macOS" + + +PathType = Union[str, Path] +PlatformType = Union[str, Platform, None] + + +def is_pathlike_obj(value: PathType) -> bool: + return isinstance(value, Path) + + +def validate_pathtype( + text: PathType, allow_whitespaces: bool = False, error_msg: Optional[str] = None +) -> None: + from .error import ErrorReason, ValidationError + + if _is_not_null_string(text) or is_pathlike_obj(text): + return + + if allow_whitespaces and _re_whitespaces.search(str(text)): + return + + if is_null_string(text): + if not error_msg: + error_msg = "the value must be a not empty" + + raise ValidationError( + description=error_msg, + reason=ErrorReason.NULL_NAME, + ) + + raise TypeError("text must be a string: actual={}".format(type(text))) + + +def validate_null_string(text: PathType, error_msg: Optional[str] = None) -> None: + # Deprecated: alias to validate_pathtype + validate_pathtype(text, False, error_msg) + + +def preprocess(name: PathType) -> str: + if is_pathlike_obj(name): + name = str(name) + + return cast(str, name) + + +def is_null_string(value: Any) -> bool: + if value is None: + return True + + try: + return len(value.strip()) == 0 + except AttributeError: + return False + + +def _is_not_null_string(value: Any) -> bool: + try: + return len(value.strip()) > 0 + except AttributeError: + return False + + +def _get_unprintable_ascii_chars() -> List[str]: + return [chr(c) for c in range(128) if chr(c) not in string.printable] + + +unprintable_ascii_chars = tuple(_get_unprintable_ascii_chars()) + + +def _get_ascii_symbols() -> List[str]: + symbol_list = [] # type: List[str] + + for i in range(128): + c = chr(i) + + if c in unprintable_ascii_chars or c in string.digits + string.ascii_letters: + continue + + symbol_list.append(c) + + return symbol_list + + +ascii_symbols = tuple(_get_ascii_symbols()) + +__RE_UNPRINTABLE_CHARS = re.compile( + "[{}]".format(re.escape("".join(unprintable_ascii_chars))), re.UNICODE +) + + +def replace_unprintable_char(text: str, replacement_text: str = "") -> str: + try: + return __RE_UNPRINTABLE_CHARS.sub(replacement_text, text) + except (TypeError, AttributeError): + raise TypeError("text must be a string") + + +def normalize_platform(name: PlatformType) -> Platform: + if isinstance(name, Platform): + return name + + if name: + name = name.strip().lower() + + if name == "posix": + return Platform.POSIX + + if name == "auto": + name = platform.system().lower() + + if name in ["linux"]: + return Platform.LINUX + + if name and name.startswith("win"): + return Platform.WINDOWS + + if name in ["mac", "macos", "darwin"]: + return Platform.MACOS + + return Platform.UNIVERSAL + + +def findall_to_str(match: List[Any]) -> str: + return ", ".join([repr(text) for text in match]) diff --git a/resources/lib/pathvalidate/_const.py b/resources/lib/pathvalidate/_const.py new file mode 100644 index 00000000..07bc01f2 --- /dev/null +++ b/resources/lib/pathvalidate/_const.py @@ -0,0 +1,16 @@ +_NTFS_RESERVED_FILE_NAMES = ( + "$Mft", + "$MftMirr", + "$LogFile", + "$Volume", + "$AttrDef", + "$Bitmap", + "$Boot", + "$BadClus", + "$Secure", + "$Upcase", + "$Extend", + "$Quota", + "$ObjId", + "$Reparse", +) # Only in root directory diff --git a/resources/lib/pathvalidate/_filename.py b/resources/lib/pathvalidate/_filename.py new file mode 100644 index 00000000..376ac04d --- /dev/null +++ b/resources/lib/pathvalidate/_filename.py @@ -0,0 +1,341 @@ +""" +.. codeauthor:: Tsuyoshi Hombashi +""" + +import itertools +import ntpath +import posixpath +import re +from pathlib import Path +from typing import Optional, Pattern, Tuple + +from ._base import AbstractSanitizer, BaseFile, BaseValidator +from ._common import ( + PathType, + Platform, + PlatformType, + findall_to_str, + is_pathlike_obj, + preprocess, + validate_pathtype, +) +from .error import ErrorReason, InvalidCharError, InvalidLengthError, ValidationError + + +_DEFAULT_MAX_FILENAME_LEN = 255 +_RE_INVALID_FILENAME = re.compile( + "[{:s}]".format(re.escape(BaseFile._INVALID_FILENAME_CHARS)), re.UNICODE +) +_RE_INVALID_WIN_FILENAME = re.compile( + "[{:s}]".format(re.escape(BaseFile._INVALID_WIN_FILENAME_CHARS)), re.UNICODE +) + + +class FileNameSanitizer(AbstractSanitizer): + def __init__( + self, + min_len: Optional[int] = 1, + max_len: Optional[int] = _DEFAULT_MAX_FILENAME_LEN, + platform: PlatformType = None, + check_reserved: bool = True, + ) -> None: + super().__init__( + min_len=min_len, + max_len=max_len, + check_reserved=check_reserved, + platform_max_len=_DEFAULT_MAX_FILENAME_LEN, + platform=platform, + ) + + self._sanitize_regexp = self._get_sanitize_regexp() + self.__validator = FileNameValidator( + min_len=self.min_len, + max_len=self.max_len, + check_reserved=check_reserved, + platform=self.platform, + ) + + def sanitize(self, value: PathType, replacement_text: str = "") -> PathType: + try: + validate_pathtype(value, allow_whitespaces=True if not self._is_windows() else False) + except ValidationError as e: + if e.reason == ErrorReason.NULL_NAME: + return "" + raise + + sanitized_filename = self._sanitize_regexp.sub(replacement_text, str(value)) + sanitized_filename = sanitized_filename[: self.max_len] + + try: + self.__validator.validate(sanitized_filename) + except ValidationError as e: + if e.reason == ErrorReason.RESERVED_NAME and e.reusable_name is False: + sanitized_filename = re.sub( + re.escape(e.reserved_name), "{}_".format(e.reserved_name), sanitized_filename + ) + elif e.reason == ErrorReason.INVALID_CHARACTER: + if self.platform in [Platform.UNIVERSAL, Platform.WINDOWS]: + sanitized_filename = sanitized_filename.rstrip(" .") + + if is_pathlike_obj(value): + return Path(sanitized_filename) + + return sanitized_filename + + def _get_sanitize_regexp(self) -> Pattern: + if self.platform in [Platform.UNIVERSAL, Platform.WINDOWS]: + return _RE_INVALID_WIN_FILENAME + + return _RE_INVALID_FILENAME + + +class FileNameValidator(BaseValidator): + _WINDOWS_RESERVED_FILE_NAMES = ("CON", "PRN", "AUX", "CLOCK$", "NUL") + tuple( + "{:s}{:d}".format(name, num) + for name, num in itertools.product(("COM", "LPT"), range(1, 10)) + ) + _MACOS_RESERVED_FILE_NAMES = (":",) + + @property + def reserved_keywords(self) -> Tuple[str, ...]: + common_keywords = super().reserved_keywords + + if self._is_universal(): + return ( + common_keywords + + self._WINDOWS_RESERVED_FILE_NAMES + + self._MACOS_RESERVED_FILE_NAMES + ) + + if self._is_windows(): + return common_keywords + self._WINDOWS_RESERVED_FILE_NAMES + + if self._is_posix() or self._is_macos(): + return common_keywords + self._MACOS_RESERVED_FILE_NAMES + + return common_keywords + + def __init__( + self, + min_len: Optional[int] = 1, + max_len: Optional[int] = _DEFAULT_MAX_FILENAME_LEN, + platform: PlatformType = None, + check_reserved: bool = True, + ) -> None: + super().__init__( + min_len=min_len, + max_len=max_len, + check_reserved=check_reserved, + platform_max_len=_DEFAULT_MAX_FILENAME_LEN, + platform=platform, + ) + + def validate(self, value: PathType) -> None: + validate_pathtype( + value, + allow_whitespaces=False + if self.platform in [Platform.UNIVERSAL, Platform.WINDOWS] + else True, + ) + + unicode_filename = preprocess(value) + value_len = len(unicode_filename) + + self.validate_abspath(unicode_filename) + + if value_len > self.max_len: + raise InvalidLengthError( + "filename is too long: expected<={:d}, actual={:d}".format(self.max_len, value_len) + ) + if value_len < self.min_len: + raise InvalidLengthError( + "filename is too short: expected>={:d}, actual={:d}".format(self.min_len, value_len) + ) + + self._validate_reserved_keywords(unicode_filename) + + if self._is_universal() or self._is_windows(): + self.__validate_win_filename(unicode_filename) + else: + self.__validate_unix_filename(unicode_filename) + + def validate_abspath(self, value: str) -> None: + err = ValidationError( + description="found an absolute path ({}), expected a filename".format(value), + platform=self.platform, + reason=ErrorReason.FOUND_ABS_PATH, + ) + + if self._is_universal() or self._is_windows(): + if ntpath.isabs(value): + raise err + + if posixpath.isabs(value): + raise err + + def __validate_unix_filename(self, unicode_filename: str) -> None: + match = _RE_INVALID_FILENAME.findall(unicode_filename) + if match: + raise InvalidCharError( + self._ERROR_MSG_TEMPLATE.format( + invalid=findall_to_str(match), value=repr(unicode_filename) + ) + ) + + def __validate_win_filename(self, unicode_filename: str) -> None: + match = _RE_INVALID_WIN_FILENAME.findall(unicode_filename) + if match: + raise InvalidCharError( + self._ERROR_MSG_TEMPLATE.format( + invalid=findall_to_str(match), value=repr(unicode_filename) + ), + platform=Platform.WINDOWS, + ) + + if unicode_filename in (".", ".."): + return + + if unicode_filename[-1] in (" ", "."): + raise InvalidCharError( + self._ERROR_MSG_TEMPLATE.format( + invalid=re.escape(unicode_filename[-1]), value=repr(unicode_filename) + ), + platform=Platform.WINDOWS, + description="Do not end a file or directory name with a space or a period", + ) + + +def validate_filename( + filename: PathType, + platform: Optional[str] = None, + min_len: int = 1, + max_len: int = _DEFAULT_MAX_FILENAME_LEN, + check_reserved: bool = True, +) -> None: + """Verifying whether the ``filename`` is a valid file name or not. + + Args: + filename: + Filename to validate. + platform: + Target platform name of the filename. + + .. include:: platform.txt + min_len: + Minimum length of the ``filename``. The value must be greater or equal to one. + Defaults to ``1``. + max_len: + Maximum length of the ``filename``. The value must be lower than: + + - ``Linux``: 4096 + - ``macOS``: 1024 + - ``Windows``: 260 + - ``universal``: 260 + + Defaults to ``255``. + check_reserved: + If |True|, check reserved names of the ``platform``. + + Raises: + ValidationError (ErrorReason.INVALID_LENGTH): + If the ``filename`` is longer than ``max_len`` characters. + ValidationError (ErrorReason.INVALID_CHARACTER): + If the ``filename`` includes invalid character(s) for a filename: + |invalid_filename_chars|. + The following characters are also invalid for Windows platform: + |invalid_win_filename_chars|. + ValidationError (ErrorReason.RESERVED_NAME): + If the ``filename`` equals reserved name by OS. + Windows reserved name is as follows: + ``"CON"``, ``"PRN"``, ``"AUX"``, ``"NUL"``, ``"COM[1-9]"``, ``"LPT[1-9]"``. + + Example: + :ref:`example-validate-filename` + + See Also: + `Naming Files, Paths, and Namespaces - Win32 apps | Microsoft Docs + `__ + """ + + FileNameValidator( + platform=platform, min_len=min_len, max_len=max_len, check_reserved=check_reserved + ).validate(filename) + + +def is_valid_filename( + filename: PathType, + platform: Optional[str] = None, + min_len: int = 1, + max_len: Optional[int] = None, + check_reserved: bool = True, +) -> bool: + """Check whether the ``filename`` is a valid name or not. + + Args: + filename: + A filename to be checked. + + Example: + :ref:`example-is-valid-filename` + + See Also: + :py:func:`.validate_filename()` + """ + + return FileNameValidator( + platform=platform, min_len=min_len, max_len=max_len, check_reserved=check_reserved + ).is_valid(filename) + + +def sanitize_filename( + filename: PathType, + replacement_text: str = "", + platform: Optional[str] = None, + max_len: Optional[int] = _DEFAULT_MAX_FILENAME_LEN, + check_reserved: bool = True, +) -> PathType: + """Make a valid filename from a string. + + To make a valid filename the function does: + + - Replace invalid characters as file names included in the ``filename`` + with the ``replacement_text``. Invalid characters are: + + - unprintable characters + - |invalid_filename_chars| + - for Windows (or universal) only: |invalid_win_filename_chars| + + - Append underscore (``"_"``) at the tail of the name if sanitized name + is one of the reserved names by operating systems + (only when ``check_reserved`` is |True|). + + Args: + filename: Filename to sanitize. + replacement_text: + Replacement text for invalid characters. Defaults to ``""``. + platform: + Target platform name of the filename. + + .. include:: platform.txt + max_len: + Maximum length of the ``filename`` length. Truncate the name length if + the ``filename`` length exceeds this value. + Defaults to ``255``. + check_reserved: + If |True|, sanitize reserved names of the ``platform``. + + Returns: + Same type as the ``filename`` (str or PathLike object): + Sanitized filename. + + Raises: + ValueError: + If the ``filename`` is an invalid filename. + + Example: + :ref:`example-sanitize-filename` + """ + + return FileNameSanitizer( + platform=platform, max_len=max_len, check_reserved=check_reserved + ).sanitize(filename, replacement_text) diff --git a/resources/lib/pathvalidate/_filepath.py b/resources/lib/pathvalidate/_filepath.py new file mode 100644 index 00000000..c6c76929 --- /dev/null +++ b/resources/lib/pathvalidate/_filepath.py @@ -0,0 +1,427 @@ +""" +.. codeauthor:: Tsuyoshi Hombashi +""" + +import ntpath +import os.path +import posixpath +import re +from pathlib import Path +from typing import List, Optional, Pattern, Tuple # noqa + +from ._base import AbstractSanitizer, BaseFile, BaseValidator +from ._common import ( + PathType, + Platform, + PlatformType, + findall_to_str, + is_pathlike_obj, + preprocess, + validate_pathtype, +) +from ._const import _NTFS_RESERVED_FILE_NAMES +from ._filename import FileNameSanitizer, FileNameValidator +from .error import ( + ErrorReason, + InvalidCharError, + InvalidLengthError, + ReservedNameError, + ValidationError, +) + + +_RE_INVALID_PATH = re.compile("[{:s}]".format(re.escape(BaseFile._INVALID_PATH_CHARS)), re.UNICODE) +_RE_INVALID_WIN_PATH = re.compile( + "[{:s}]".format(re.escape(BaseFile._INVALID_WIN_PATH_CHARS)), re.UNICODE +) + + +class FilePathSanitizer(AbstractSanitizer): + def __init__( + self, + min_len: Optional[int] = 1, + max_len: Optional[int] = None, + platform: PlatformType = None, + check_reserved: bool = True, + normalize: bool = True, + ) -> None: + super().__init__( + min_len=min_len, + max_len=max_len, + check_reserved=check_reserved, + platform=platform, + ) + + self._sanitize_regexp = self._get_sanitize_regexp() + self.__fpath_validator = FilePathValidator( + min_len=self.min_len, + max_len=self.max_len, + check_reserved=check_reserved, + platform=self.platform, + ) + self.__fname_sanitizer = FileNameSanitizer( + min_len=self.min_len, + max_len=self.max_len, + check_reserved=check_reserved, + platform=self.platform, + ) + self.__normalize = normalize + + if self._is_universal() or self._is_windows(): + self.__split_drive = ntpath.splitdrive + else: + self.__split_drive = posixpath.splitdrive + + def sanitize(self, value: PathType, replacement_text: str = "") -> PathType: + if not value: + return "" + + self.__fpath_validator.validate_abspath(value) + + unicode_filepath = preprocess(value) + + if self.__normalize: + unicode_filepath = os.path.normpath(unicode_filepath) + + drive, unicode_filepath = self.__split_drive(unicode_filepath) + sanitized_path = self._sanitize_regexp.sub(replacement_text, unicode_filepath) + if self._is_windows(): + path_separator = "\\" + else: + path_separator = "/" + + sanitized_entries = [] # type: List[str] + if drive: + sanitized_entries.append(drive) + for entry in sanitized_path.replace("\\", "/").split("/"): + if entry in _NTFS_RESERVED_FILE_NAMES: + sanitized_entries.append("{}_".format(entry)) + continue + + sanitized_entry = str(self.__fname_sanitizer.sanitize(entry)) + if not sanitized_entry: + if not sanitized_entries: + sanitized_entries.append("") + continue + + sanitized_entries.append(sanitized_entry) + + sanitized_path = path_separator.join(sanitized_entries) + + if is_pathlike_obj(value): + return Path(sanitized_path) + + return sanitized_path + + def _get_sanitize_regexp(self) -> Pattern: + if self.platform in [Platform.UNIVERSAL, Platform.WINDOWS]: + return _RE_INVALID_WIN_PATH + + return _RE_INVALID_PATH + + +class FilePathValidator(BaseValidator): + _RE_NTFS_RESERVED = re.compile( + "|".join("^/{}$".format(re.escape(pattern)) for pattern in _NTFS_RESERVED_FILE_NAMES), + re.IGNORECASE, + ) + _MACOS_RESERVED_FILE_PATHS = ("/", ":") + + @property + def reserved_keywords(self) -> Tuple[str, ...]: + common_keywords = super().reserved_keywords + + if any([self._is_universal(), self._is_posix(), self._is_macos()]): + return common_keywords + self._MACOS_RESERVED_FILE_PATHS + + if self._is_linux(): + return common_keywords + ("/",) + + return common_keywords + + def __init__( + self, + min_len: Optional[int] = 1, + max_len: Optional[int] = None, + platform: PlatformType = None, + check_reserved: bool = True, + ) -> None: + super().__init__( + min_len=min_len, + max_len=max_len, + check_reserved=check_reserved, + platform=platform, + ) + + self.__fname_validator = FileNameValidator( + min_len=min_len, max_len=max_len, check_reserved=check_reserved, platform=platform + ) + + if self._is_universal() or self._is_windows(): + self.__split_drive = ntpath.splitdrive + else: + self.__split_drive = posixpath.splitdrive + + def validate(self, value: PathType) -> None: + validate_pathtype( + value, + allow_whitespaces=False + if self.platform in [Platform.UNIVERSAL, Platform.WINDOWS] + else True, + ) + self.validate_abspath(value) + + _drive, value = self.__split_drive(str(value)) + if not value: + return + + filepath = os.path.normpath(value) + unicode_filepath = preprocess(filepath) + value_len = len(unicode_filepath) + + if value_len > self.max_len: + raise InvalidLengthError( + "file path is too long: expected<={:d}, actual={:d}".format(self.max_len, value_len) + ) + if value_len < self.min_len: + raise InvalidLengthError( + "file path is too short: expected>={:d}, actual={:d}".format( + self.min_len, value_len + ) + ) + + self._validate_reserved_keywords(unicode_filepath) + unicode_filepath = unicode_filepath.replace("\\", "/") + for entry in unicode_filepath.split("/"): + if not entry or entry in (".", ".."): + continue + + self.__fname_validator._validate_reserved_keywords(entry) + + if self._is_universal() or self._is_windows(): + self.__validate_win_filepath(unicode_filepath) + else: + self.__validate_unix_filepath(unicode_filepath) + + def validate_abspath(self, value: PathType) -> None: + value = str(value) + is_posix_abs = posixpath.isabs(value) + is_nt_abs = ntpath.isabs(value) + err_object = ValidationError( + description=( + "an invalid absolute file path ({}) for the platform ({}).".format( + value, self.platform.value + ) + + " to avoid the error, specify an appropriate platform correspond" + + " with the path format, or 'auto'." + ), + platform=self.platform, + reason=ErrorReason.MALFORMED_ABS_PATH, + ) + + if any([self._is_windows() and is_nt_abs, self._is_linux() and is_posix_abs]): + return + + if self._is_universal() and any([is_posix_abs, is_nt_abs]): + ValidationError( + description=( + "{}. expected a platform independent file path".format( + "POSIX absolute file path found" + if is_posix_abs + else "NT absolute file path found" + ) + ), + platform=self.platform, + reason=ErrorReason.MALFORMED_ABS_PATH, + ) + + if any([self._is_windows(), self._is_universal()]) and is_posix_abs: + raise err_object + + drive, _tail = ntpath.splitdrive(value) + if not self._is_windows() and drive and is_nt_abs: + raise err_object + + def __validate_unix_filepath(self, unicode_filepath: str) -> None: + match = _RE_INVALID_PATH.findall(unicode_filepath) + if match: + raise InvalidCharError( + self._ERROR_MSG_TEMPLATE.format( + invalid=findall_to_str(match), value=repr(unicode_filepath) + ) + ) + + def __validate_win_filepath(self, unicode_filepath: str) -> None: + match = _RE_INVALID_WIN_PATH.findall(unicode_filepath) + if match: + raise InvalidCharError( + self._ERROR_MSG_TEMPLATE.format( + invalid=findall_to_str(match), value=repr(unicode_filepath) + ), + platform=Platform.WINDOWS, + ) + + _drive, value = self.__split_drive(unicode_filepath) + if value: + match_reserved = self._RE_NTFS_RESERVED.search(value) + if match_reserved: + reserved_name = match_reserved.group() + raise ReservedNameError( + "'{}' is a reserved name".format(reserved_name), + reusable_name=False, + reserved_name=reserved_name, + platform=self.platform, + ) + + +def validate_filepath( + file_path: PathType, + platform: Optional[str] = None, + min_len: int = 1, + max_len: Optional[int] = None, + check_reserved: bool = True, +) -> None: + """Verifying whether the ``file_path`` is a valid file path or not. + + Args: + file_path: + File path to validate. + platform: + Target platform name of the file path. + + .. include:: platform.txt + min_len: + Minimum length of the ``file_path``. The value must be greater or equal to one. + Defaults to ``1``. + max_len: + Maximum length of the ``file_path`` length. If the value is |None|, + automatically determined by the ``platform``: + + - ``Linux``: 4096 + - ``macOS``: 1024 + - ``Windows``: 260 + - ``universal``: 260 + check_reserved: + If |True|, check reserved names of the ``platform``. + + Raises: + ValidationError (ErrorReason.INVALID_CHARACTER): + If the ``file_path`` includes invalid char(s): + |invalid_file_path_chars|. + The following characters are also invalid for Windows platform: + |invalid_win_file_path_chars| + ValidationError (ErrorReason.INVALID_LENGTH): + If the ``file_path`` is longer than ``max_len`` characters. + ValidationError: + If ``file_path`` include invalid values. + + Example: + :ref:`example-validate-file-path` + + See Also: + `Naming Files, Paths, and Namespaces - Win32 apps | Microsoft Docs + `__ + """ + + FilePathValidator( + platform=platform, min_len=min_len, max_len=max_len, check_reserved=check_reserved + ).validate(file_path) + + +def validate_file_path(file_path, platform=None, max_path_len=None): + # Deprecated + validate_filepath(file_path, platform, max_path_len) + + +def is_valid_filepath( + file_path: PathType, + platform: Optional[str] = None, + min_len: int = 1, + max_len: Optional[int] = None, + check_reserved: bool = True, +) -> bool: + """Check whether the ``file_path`` is a valid name or not. + + Args: + file_path: + A filepath to be checked. + + Example: + :ref:`example-is-valid-filepath` + + See Also: + :py:func:`.validate_filepath()` + """ + + return FilePathValidator( + platform=platform, min_len=min_len, max_len=max_len, check_reserved=check_reserved + ).is_valid(file_path) + + +def sanitize_filepath( + file_path: PathType, + replacement_text: str = "", + platform: Optional[str] = None, + max_len: Optional[int] = None, + check_reserved: bool = True, + normalize: bool = True, +) -> PathType: + """Make a valid file path from a string. + + To make a valid file path the function does: + + - replace invalid characters for a file path within the ``file_path`` + with the ``replacement_text``. Invalid characters are as follows: + + - unprintable characters + - |invalid_file_path_chars| + - for Windows (or universal) only: |invalid_win_file_path_chars| + + - Append underscore (``"_"``) at the tail of the name if sanitized name + is one of the reserved names by operating systems + (only when ``check_reserved`` is |True|). + + Args: + file_path: + File path to sanitize. + replacement_text: + Replacement text for invalid characters. + Defaults to ``""``. + platform: + Target platform name of the file path. + + .. include:: platform.txt + max_len: + Maximum length of the ``file_path`` length. Truncate the name if the ``file_path`` + length exceedd this value. If the value is |None|, + ``max_len`` will automatically determined by the ``platform``: + + - ``Linux``: 4096 + - ``macOS``: 1024 + - ``Windows``: 260 + - ``universal``: 260 + check_reserved: + If |True|, sanitize reserved names of the ``platform``. + normalize: + If |True|, normalize the the file path. + + Returns: + Same type as the argument (str or PathLike object): + Sanitized filepath. + + Raises: + ValueError: + If the ``file_path`` is an invalid file path. + + Example: + :ref:`example-sanitize-file-path` + """ + + return FilePathSanitizer( + platform=platform, max_len=max_len, check_reserved=check_reserved, normalize=normalize + ).sanitize(file_path, replacement_text) + + +def sanitize_file_path(file_path, replacement_text="", platform=None, max_path_len=None): + # Deprecated + return sanitize_filepath(file_path, platform, max_path_len) diff --git a/resources/lib/pathvalidate/_ltsv.py b/resources/lib/pathvalidate/_ltsv.py new file mode 100644 index 00000000..f3b7082f --- /dev/null +++ b/resources/lib/pathvalidate/_ltsv.py @@ -0,0 +1,45 @@ +""" +.. codeauthor:: Tsuyoshi Hombashi +""" + +import re + +from ._common import preprocess, validate_pathtype +from .error import InvalidCharError + + +__RE_INVALID_LTSV_LABEL = re.compile("[^0-9A-Za-z_.-]", re.UNICODE) + + +def validate_ltsv_label(label: str) -> None: + """ + Verifying whether ``label`` is a valid + `Labeled Tab-separated Values (LTSV) `__ label or not. + + :param label: Label to validate. + :raises pathvalidate.ValidationError: + If invalid character(s) found in the ``label`` for a LTSV format label. + """ + + validate_pathtype(label, allow_whitespaces=False, error_msg="label is empty") + + match_list = __RE_INVALID_LTSV_LABEL.findall(preprocess(label)) + if match_list: + raise InvalidCharError( + "invalid character found for a LTSV format label: {}".format(match_list) + ) + + +def sanitize_ltsv_label(label: str, replacement_text: str = "") -> str: + """ + Replace all of the symbols in text. + + :param label: Input text. + :param replacement_text: Replacement text. + :return: A replacement string. + :rtype: str + """ + + validate_pathtype(label, allow_whitespaces=False, error_msg="label is empty") + + return __RE_INVALID_LTSV_LABEL.sub(replacement_text, preprocess(label)) diff --git a/resources/lib/pathvalidate/_symbol.py b/resources/lib/pathvalidate/_symbol.py new file mode 100644 index 00000000..cc66b5db --- /dev/null +++ b/resources/lib/pathvalidate/_symbol.py @@ -0,0 +1,110 @@ +""" +.. codeauthor:: Tsuyoshi Hombashi +""" + +import re +from typing import Sequence + +from ._common import ascii_symbols, preprocess, unprintable_ascii_chars +from .error import InvalidCharError + + +__RE_UNPRINTABLE = re.compile( + "[{}]".format(re.escape("".join(unprintable_ascii_chars))), re.UNICODE +) +__RE_SYMBOL = re.compile( + "[{}]".format(re.escape("".join(ascii_symbols + unprintable_ascii_chars))), re.UNICODE +) + + +def validate_unprintable(text: str) -> None: + # deprecated + match_list = __RE_UNPRINTABLE.findall(preprocess(text)) + if match_list: + raise InvalidCharError("unprintable character found: {}".format(match_list)) + + +def replace_unprintable(text: str, replacement_text: str = "") -> str: + # deprecated + try: + return __RE_UNPRINTABLE.sub(replacement_text, preprocess(text)) + except (TypeError, AttributeError): + raise TypeError("text must be a string") + + +def validate_symbol(text: str) -> None: + """ + Verifying whether symbol(s) included in the ``text`` or not. + + Args: + text: + Input text to validate. + + Raises: + ValidationError (ErrorReason.INVALID_CHARACTER): + If symbol(s) included in the ``text``. + """ + + match_list = __RE_SYMBOL.findall(preprocess(text)) + if match_list: + raise InvalidCharError("invalid symbols found: {}".format(match_list)) + + +def replace_symbol( + text: str, + replacement_text: str = "", + exclude_symbols: Sequence[str] = [], + is_replace_consecutive_chars: bool = False, + is_strip: bool = False, +) -> str: + """ + Replace all of the symbols in the ``text``. + + Args: + text: + Input text. + replacement_text: + Replacement text. + exclude_symbols: + Symbols that exclude from the replacement. + is_replace_consecutive_chars: + If |True|, replace consecutive multiple ``replacement_text`` characters + to a single character. + is_strip: + If |True|, strip ``replacement_text`` from the beginning/end of the replacement text. + + Returns: + A replacement string. + + Example: + + :ref:`example-sanitize-symbol` + """ + + if exclude_symbols: + regexp = re.compile( + "[{}]".format( + re.escape( + "".join(set(ascii_symbols + unprintable_ascii_chars) - set(exclude_symbols)) + ) + ), + re.UNICODE, + ) + else: + regexp = __RE_SYMBOL + + try: + new_text = regexp.sub(replacement_text, preprocess(text)) + except TypeError: + raise TypeError("text must be a string") + + if not replacement_text: + return new_text + + if is_replace_consecutive_chars: + new_text = re.sub("{}+".format(re.escape(replacement_text)), replacement_text, new_text) + + if is_strip: + new_text = new_text.strip(replacement_text) + + return new_text diff --git a/resources/lib/pathvalidate/argparse.py b/resources/lib/pathvalidate/argparse.py new file mode 100644 index 00000000..806b4b00 --- /dev/null +++ b/resources/lib/pathvalidate/argparse.py @@ -0,0 +1,68 @@ +""" +.. codeauthor:: Tsuyoshi Hombashi +""" + +from argparse import ArgumentTypeError + +from ._common import PathType +from ._filename import sanitize_filename, validate_filename +from ._filepath import sanitize_filepath, validate_filepath +from .error import ValidationError + + +def validate_filename_arg(value: str) -> str: + if not value: + return "" + + try: + validate_filename(value) + except ValidationError as e: + raise ArgumentTypeError(e) + + return value + + +def validate_filepath_arg(value: str) -> str: + if not value: + return "" + + try: + validate_filepath(value, platform="auto") + except ValidationError as e: + raise ArgumentTypeError(e) + + return value + + +def sanitize_filename_arg(value: str) -> PathType: + if not value: + return "" + + return sanitize_filename(value) + + +def sanitize_filepath_arg(value: str) -> PathType: + if not value: + return "" + + return sanitize_filepath(value, platform="auto") + + +def filename(value: PathType) -> PathType: # pragma: no cover + # Deprecated + try: + validate_filename(value) + except ValidationError as e: + raise ArgumentTypeError(e) + + return sanitize_filename(value) + + +def filepath(value: PathType) -> PathType: # pragma: no cover + # Deprecated + try: + validate_filepath(value) + except ValidationError as e: + raise ArgumentTypeError(e) + + return sanitize_filepath(value) diff --git a/resources/lib/pathvalidate/click.py b/resources/lib/pathvalidate/click.py new file mode 100644 index 00000000..63c095ef --- /dev/null +++ b/resources/lib/pathvalidate/click.py @@ -0,0 +1,74 @@ +""" +.. codeauthor:: Tsuyoshi Hombashi +""" + +import click + +from ._common import PathType +from ._filename import sanitize_filename, validate_filename +from ._filepath import sanitize_filepath, validate_filepath +from .error import ValidationError + + +def validate_filename_arg(ctx, param, value) -> str: + if not value: + return "" + + try: + validate_filename(value) + except ValidationError as e: + raise click.BadParameter(str(e)) + + return value + + +def validate_filepath_arg(ctx, param, value) -> str: + if not value: + return "" + + try: + validate_filepath(value) + except ValidationError as e: + raise click.BadParameter(str(e)) + + return value + + +def sanitize_filename_arg(ctx, param, value) -> PathType: + if not value: + return "" + + return sanitize_filename(value) + + +def sanitize_filepath_arg(ctx, param, value) -> PathType: + if not value: + return "" + + return sanitize_filepath(value) + + +def filename(ctx, param, value): # pragma: no cover + # Deprecated + if not value: + return None + + try: + validate_filename(value) + except ValidationError as e: + raise click.BadParameter(str(e)) + + return sanitize_filename(value) + + +def filepath(ctx, param, value): # pragma: no cover + # Deprecated + if not value: + return None + + try: + validate_filepath(value) + except ValidationError as e: + raise click.BadParameter(str(e)) + + return sanitize_filepath(value) diff --git a/resources/lib/pathvalidate/error.py b/resources/lib/pathvalidate/error.py new file mode 100644 index 00000000..331df904 --- /dev/null +++ b/resources/lib/pathvalidate/error.py @@ -0,0 +1,155 @@ +""" +.. codeauthor:: Tsuyoshi Hombashi +""" + +import enum +from typing import Optional, cast + +from ._common import Platform + + +@enum.unique +class ErrorReason(enum.Enum): + """ + Validation error reasons. + """ + + FOUND_ABS_PATH = "FOUND_ABS_PATH" #: found an absolute path when expecting a file name + NULL_NAME = "NULL_NAME" #: empty value + INVALID_CHARACTER = "INVALID_CHARACTER" #: found invalid characters(s) in a value + INVALID_LENGTH = "INVALID_LENGTH" #: found invalid string length + MALFORMED_ABS_PATH = "MALFORMED_ABS_PATH" #: found invalid absolute path format + RESERVED_NAME = "RESERVED_NAME" #: found a reserved name by a platform + + +class ValidationError(ValueError): + """ + Exception class of validation errors. + + .. py:attribute:: reason + + The cause of the error. + + Returns: + :py:class:`~pathvalidate.error.ErrorReason`: + """ + + @property + def platform(self) -> Platform: + return self.__platform + + @property + def reason(self) -> Optional[ErrorReason]: + return self.__reason + + @property + def description(self) -> str: + return self.__description + + @property + def reserved_name(self) -> str: + return self.__reserved_name + + @property + def reusable_name(self) -> bool: + return self.__reusable_name + + def __init__(self, *args, **kwargs): + self.__platform = kwargs.pop("platform", None) + self.__reason = kwargs.pop("reason", None) + self.__description = kwargs.pop("description", None) + self.__reserved_name = kwargs.pop("reserved_name", None) + self.__reusable_name = kwargs.pop("reusable_name", None) + + try: + super().__init__(*args[0], **kwargs) + except IndexError: + super().__init__(*args, **kwargs) + + def __str__(self) -> str: + item_list = [] + + if Exception.__str__(self): + item_list.append(Exception.__str__(self)) + + if self.reason: + item_list.append("reason={}".format(cast(ErrorReason, self.reason).value)) + if self.platform: + item_list.append("target-platform={}".format(self.platform.value)) + if self.description: + item_list.append("description={}".format(self.description)) + if self.__reusable_name is not None: + item_list.append("reusable_name={}".format(self.reusable_name)) + + return ", ".join(item_list).strip() + + def __repr__(self, *args, **kwargs): + return self.__str__(*args, **kwargs) + + +class NullNameError(ValidationError): + """ + Exception raised when a name is empty. + """ + + def __init__(self, *args, **kwargs) -> None: + kwargs["reason"] = ErrorReason.NULL_NAME + + super().__init__(args, **kwargs) + + +class InvalidCharError(ValidationError): + """ + Exception raised when includes invalid character(s) within a string. + """ + + def __init__(self, *args, **kwargs) -> None: + kwargs["reason"] = ErrorReason.INVALID_CHARACTER + + super().__init__(args, **kwargs) + + +class InvalidLengthError(ValidationError): + """ + Exception raised when a string too long/short. + """ + + def __init__(self, *args, **kwargs) -> None: + kwargs["reason"] = ErrorReason.INVALID_LENGTH + + super().__init__(args, **kwargs) + + +class ReservedNameError(ValidationError): + """ + Exception raised when a string matched a reserved name. + """ + + def __init__(self, *args, **kwargs) -> None: + kwargs["reason"] = ErrorReason.RESERVED_NAME + + super().__init__(args, **kwargs) + + +class ValidReservedNameError(ReservedNameError): + """ + Exception raised when a string matched a reserved name. + However, it can be used as a name. + """ + + def __init__(self, *args, **kwargs) -> None: + kwargs["reusable_name"] = True + + super().__init__(args, **kwargs) + + +class InvalidReservedNameError(ReservedNameError): + """ + Exception raised when a string matched a reserved name. + Moreover, the reserved name is invalid as a name. + """ + + def __init__(self, *args, **kwargs) -> None: + kwargs["reusable_name"] = False + + super().__init__(args, **kwargs) diff --git a/resources/lib/pathvalidate/py.typed b/resources/lib/pathvalidate/py.typed new file mode 100644 index 00000000..e69de29b diff --git a/resources/lib/playlist_func.py b/resources/lib/playlist_func.py index 1e16b11b..f18e115c 100644 --- a/resources/lib/playlist_func.py +++ b/resources/lib/playlist_func.py @@ -402,9 +402,9 @@ def _get_playListVersion_from_xml(playlist, xml): Raises PlaylistError if unsuccessful """ - playlist.version = utils.cast(int, - xml.get('%sVersion' % playlist.kind)) - if playlist.version is None: + try: + playlist.version = int(xml.get('%sVersion' % playlist.kind)) + except (AttributeError, TypeError): raise PlaylistError('Could not get new playlist Version for playlist ' '%s' % playlist) @@ -416,6 +416,8 @@ def get_playlist_details_from_xml(playlist, xml): Raises PlaylistError if something went wrong. """ + if xml is None: + raise PlaylistError('No playlist received for playlist %s' % playlist) playlist.id = utils.cast(int, xml.get('%sID' % playlist.kind)) playlist.version = utils.cast(int, @@ -703,8 +705,8 @@ def delete_playlist_item_from_PMS(playlist, pos): playlist.items[pos].id, playlist.repeat), action_type="DELETE") - _get_playListVersion_from_xml(playlist, xml) del playlist.items[pos] + _get_playListVersion_from_xml(playlist, xml) # Functions operating on the Kodi playlist objects ########## diff --git a/resources/lib/plex_api/base.py b/resources/lib/plex_api/base.py index bfc3a11f..a764ccd3 100644 --- a/resources/lib/plex_api/base.py +++ b/resources/lib/plex_api/base.py @@ -96,6 +96,13 @@ class Base(object): """ return self.xml.get('type') + @property + def subtype(self): + """ + Returns the subtype of media, e.g. 'clip' as string or None. + """ + return self.xml.get('subtype') + @property def section_id(self): self.check_db() diff --git a/resources/lib/plex_api/media.py b/resources/lib/plex_api/media.py index bfa47c08..7c9d6b86 100644 --- a/resources/lib/plex_api/media.py +++ b/resources/lib/plex_api/media.py @@ -369,7 +369,8 @@ class Media(object): force_check : Will always try to check validity of path Will also skip confirmation dialog if path not found folder : Set to True if path is a folder - omit_check : Will entirely omit validity check if True + omit_check : Will entirely omit validity check if True. Will + be superseded by force_check! """ if path is None: return @@ -385,7 +386,13 @@ class Media(object): path = 'smb:' + path.replace('\\', '/') if app.SYNC.escape_path: path = utils.escape_path(path, app.SYNC.escape_path_safe_chars) - if (app.SYNC.path_verified and not force_check) or omit_check: + if force_check: + pass + elif omit_check: + return path + elif not app.SYNC.check_media_file_existence: + return path + elif app.SYNC.path_verified: return path # exist() needs a / or \ at the end to work for directories diff --git a/resources/lib/plexbmchelper/listener.py b/resources/lib/plexbmchelper/listener.py index 6774a4d8..58efff9a 100644 --- a/resources/lib/plexbmchelper/listener.py +++ b/resources/lib/plexbmchelper/listener.py @@ -92,7 +92,7 @@ class MyHandler(BaseHTTPRequestHandler): self.send_header('Content-Length', len(body)) self.send_header('Connection', "close") self.end_headers() - self.wfile.write(body) + self.wfile.write(body.encode('utf-8')) self.wfile.close() except Exception: pass diff --git a/resources/lib/utils.py b/resources/lib/utils.py index 675c3ad0..002e96ca 100644 --- a/resources/lib/utils.py +++ b/resources/lib/utils.py @@ -26,7 +26,7 @@ import xbmc import xbmcaddon import xbmcgui -from . import path_ops, variables as v +from . import pathvalidate, path_ops, variables as v LOG = getLogger('PLEX.utils') @@ -422,29 +422,10 @@ def valid_filename(text): """ Return a valid filename after passing it in [unicode]. """ - # Get rid of all whitespace except a normal space - text = re.sub(r'(?! )\s', '', text) - # ASCII characters 0 to 31 (non-printable, just in case) - text = re.sub(u'[\x00-\x1f]', '', text) - if v.DEVICE == 'Windows': - # Whitespace at the end of the filename is illegal - text = text.strip() - # Dot at the end of a filename is illegal - text = re.sub(r'\.+$', '', text) - # Illegal Windows characters - text = re.sub(r'[/\\:*?"<>|\^]', '', text) - elif v.DEVICE == 'MacOSX': - # Colon is illegal - text = re.sub(r':', '', text) - # Files cannot begin with a dot - text = re.sub(r'^\.+', '', text) - else: - # Linux - text = re.sub(r'/', '', text) - # Ensure that filename length is at most 255 chars (including 3 chars for - # filename extension and 1 dot to separate the extension) - text = text[:min(len(text), 251)] - return text + return pathvalidate.sanitize_filename(text, + replacement_text='_', + platform='auto', + max_len=248) def escape_html(string): diff --git a/resources/lib/variables.py b/resources/lib/variables.py index 86b23cae..cc298705 100644 --- a/resources/lib/variables.py +++ b/resources/lib/variables.py @@ -84,7 +84,7 @@ COMPANION_PORT = int(_ADDON.getSetting('companionPort')) PKC_MACHINE_IDENTIFIER = None # Minimal PKC version needed for the Kodi database - otherwise need to recreate -MIN_DB_VERSION = '2.6.8' +MIN_DB_VERSION = '3.1.3' # Supported databases - version numbers in tuples should decrease SUPPORTED_VIDEO_DB = { @@ -668,14 +668,10 @@ PLEX_STREAM_TYPE_FROM_STREAM_TYPE = { # Encoding to be used for our m3u playlist files # m3u files do not have encoding specified by definition, unfortunately. -if DEVICE == 'Windows': - M3U_ENCODING = 'mbcs' -else: - M3U_ENCODING = sys.getfilesystemencoding() - if (not M3U_ENCODING or - M3U_ENCODING == 'ascii' or - M3U_ENCODING == 'ANSI_X3.4-1968'): - M3U_ENCODING = 'utf-8' +# The filesystem encoding is generally utf-8 +# For Windows, it can be either utf-8 or mbcs +# See https://docs.python.org/3/library/sys.html#sys.getfilesystemencoding +M3U_ENCODING = sys.getfilesystemencoding() def database_paths(): diff --git a/resources/settings.xml b/resources/settings.xml index fda93768..f707d67d 100644 --- a/resources/settings.xml +++ b/resources/settings.xml @@ -64,6 +64,7 @@ +