Compare commits

..

235 Commits

Author SHA1 Message Date
Jellyfin Release Bot
478d8b07bf Bump version to 10.9.7 2024-06-24 20:19:28 -04:00
Bond-009
c9b6ebd94f Merge pull request #11911 from Bond-009/infoaudionorm
Log album name and id in normalization task
2024-06-24 22:51:57 +02:00
Bond-009
30fc089dd5 Merge pull request #12166 from Bond-009/4kbdmv
Fix HDR detection for 4K Blu-Ray BDMVs
2024-06-24 22:51:41 +02:00
Bond-009
25f02658f0 Merge pull request #12126 from gnattu/add-extracted-lyrics
Try to add extracted lyrics during scanning
2024-06-24 22:51:28 +02:00
Bond-009
2266a00337 Merge pull request #12055 from Shadowghost/fix-season-backdrops
Fix season backdrops
2024-06-24 22:41:57 +02:00
Shadowghost
afeff31dca Merge remote-tracking branch 'upstream/release-10.9.z' into fix-season-backdrops 2024-06-24 22:34:43 +02:00
Bond-009
476dc01f4d Merge pull request #12025 from Shadowghost/remove-empty-image-folders-recursive
Fix empty image folder removal for legacy locations
2024-06-24 22:14:09 +02:00
Bond_009
b81b674ae1 Log album name and id in normalization task
Filename of the concat file is now the same as the album id.
Temp file gets deleted even if LUFS calculation failed
2024-06-24 22:01:49 +02:00
Bond_009
15eb7a25b9 Fix HDR detection for 4K Blu-Ray BDMVs 2024-06-24 11:43:01 +02:00
Shadowghost
aadd57bc48 Fix check 2024-06-24 09:16:51 +02:00
Bond-009
cbbe5db813 Merge pull request #12053 from Shadowghost/fix-local-playlist-scanning
Rewrite PlaylistItemsProvider as ILocalMetadataProvider
2024-06-23 17:56:23 +02:00
Bond-009
4601097d3e Merge pull request #12050 from Shadowghost/fix-seasons
Fix season handling
2024-06-23 17:48:48 +02:00
gnattu
10cd9a7f79 Only add first stream
Signed-off-by: gnattu <gnattuoc@me.com>
2024-06-22 18:26:59 +08:00
Tim Eisele
6cf98d4930 Only cleanup children on specific exceptions (#12134) 2024-06-21 09:08:05 -06:00
Tim Eisele
34a65980e3 Remove incomplete mediatype restriction from playlists (#12024) 2024-06-21 09:07:38 -06:00
Nyanmisaka
6010bc01c3 Fix MicroDVD being recognized as DVDSUB subtitles (#12149) 2024-06-21 09:07:25 -06:00
Shadowghost
a00f9e1a10 Cleanup seasons after creating real ones 2024-06-20 22:03:01 +02:00
Bond-009
85078d8f10 Merge pull request #12123 from Shadowghost/fix-cleanup-task
Fix Cleanup Task metadata saving
2024-06-20 11:36:48 +02:00
Bond-009
1606b6c0f6 Merge pull request #12043 from jellyfin/pr-parental-au-1
Fix the Australian PG rating
2024-06-20 11:20:19 +02:00
Bond-009
f097aad01e Merge pull request #12094 from Shadowghost/fix-dual-socket-address-handling
Map IPv6 mapped IPv4 addresses back to IPv4 before running checks
2024-06-20 11:20:06 +02:00
Tim Eisele
bf53f1ae38 Do not override <year> if <releasedate> is set (#12120) 2024-06-18 08:16:21 -06:00
gnattu
31237f778a Try to add extracted lyrics during scanning
The extraction process does not add the extracted lyrics to the audio media streams. Try to add it when tryExtractEmbeddedLyrics is true.

Signed-off-by: gnattu <gnattuoc@me.com>
2024-06-18 10:08:11 +08:00
Shadowghost
55d245a77b Fix saving item metadata 2024-06-17 23:13:53 +02:00
Odd Stråbø
9f35f56eaf Fix the Australian PG rating
As per https://www.classification.gov.au/classification-ratings/what-are-ratings

Fixes #11650
Well, sort of. I don't think it is possible to differentiate between them, as we'd be comparing the integer values, not the position in the list?
2024-06-15 19:55:14 +02:00
Bond-009
f2a5ccf102 Merge pull request #12065 from Rivenlalala/fix-bdmv-file-extension-case-issue
Make m2ts extension case-insensitive
2024-06-15 17:52:05 +02:00
Bond-009
2b78980747 Merge pull request #12017 from gnattu/overwrite-livetv-codec
Overwrite supported codecs for livetv
2024-06-15 17:38:10 +02:00
Bond-009
a89678074e Merge pull request #12026 from Bond-009/hisubs
Check hearing impared flags with equality instead of contains
2024-06-15 17:37:49 +02:00
Bond-009
d813f83b4a Merge pull request #12039 from Shadowghost/fix-local-episode-thumb
Fix local episode image thumb recognition
2024-06-15 17:37:30 +02:00
Bond-009
37b7e953f7 Merge pull request #12031 from jellyfin/fix-video-embedded-image
Fix video embedded image detection
2024-06-15 17:36:19 +02:00
Bond-009
08b64c5502 Merge pull request #12028 from Shadowghost/fix-replace
Fix replace all and respect metadata settings
2024-06-15 17:36:05 +02:00
Bond-009
23a660e917 Merge pull request #12073 from Shadowghost/fix-mb
Fix Music Brainz release group query
2024-06-15 17:34:44 +02:00
Bond-009
78eb9b2f78 Merge pull request #12046 from gnattu/fix-wrong-mpegts-detection
Fix mpeg-ts detection
2024-06-15 17:34:31 +02:00
Bond-009
d90f504ca7 Merge pull request #12037 from Shadowghost/fix-user-delete
Do not fail user deletion if we have no playlist folder
2024-06-15 17:34:21 +02:00
Shadowghost
56104d3042 Map IPv6 mapped IPv4 addresses back to IPv4 before running checks 2024-06-14 10:22:10 +02:00
Rivenlalala
fcec1fcc4d Make m2ts extension case-insensitive 2024-06-12 04:16:50 +08:00
Shadowghost
1a14902da8 Apply review suggestion 2024-06-11 18:48:38 +02:00
Shadowghost
34bdf8bf78 Do not cleanup old backdrops 2024-06-11 10:29:06 +02:00
Shadowghost
7ff3f6af6c Fix MB release group query 2024-06-10 21:43:42 +02:00
Shadowghost
bd8b0c4c03 Remove all existing backdrops when replacing all images 2024-06-09 23:17:57 +02:00
Shadowghost
0c560a313a Fix local season backdrop saving 2024-06-09 21:35:12 +02:00
Shadowghost
8882bb495c Rewrite PlaylistItemsProvider as ILocalMetadataProvider 2024-06-09 20:53:33 +02:00
Shadowghost
e4078f984a Fix season handling 2024-06-09 18:47:21 +02:00
gnattu
8e5a2f565c Fix mpeg-ts detection
When the container name is `mpeg`, it means it is MPEG-PS, while the TS container should have the explicit name `mpeg-ts`.

Signed-off-by: gnattu <gnattuoc@me.com>
2024-06-09 21:23:13 +08:00
Shadowghost
8b442a7749 Check for existence before trying to delete directory 2024-06-09 08:24:58 +02:00
Shadowghost
b63f7a2bc0 Only remove image from item if file system delete was successful 2024-06-09 00:46:46 +02:00
Shadowghost
f9e7d5229e Limit removal scope 2024-06-09 00:46:19 +02:00
Shadowghost
b24d05bff7 Apply review suggestion 2024-06-08 22:35:50 +02:00
Shadowghost
fd009fc71b Simplify metadata subdir check 2024-06-08 21:57:21 +02:00
Shadowghost
302eea1cb7 Fix local episode image thumb recognition 2024-06-08 21:51:08 +02:00
Shadowghost
b116a2742e Do not fail user deletion if we have no playlist folder 2024-06-08 16:46:12 +02:00
nyanmisaka
99a04e23d9 Fix video embedded image detection
Fixes debbfaa. Embedded images also exist in video.

Signed-off-by: nyanmisaka <nst799610810@gmail.com>
2024-06-08 16:55:27 +08:00
Shadowghost
19a89d5a60 Remove folder after removing empty subfolders 2024-06-08 00:12:36 +02:00
Shadowghost
feb20c131a Use helper 2024-06-08 00:08:11 +02:00
Shadowghost
ec82023265 Respect different metadata settings on refresh 2024-06-07 23:19:30 +02:00
Shadowghost
e4f3f0b3b6 Remove all data when replacing all 2024-06-07 23:19:04 +02:00
Shadowghost
28274d4c75 Remove empty image folders recursively 2024-06-07 22:12:48 +02:00
Bond_009
b6595e4efc Check hearing impared flags with equality instead of contains
Fixes #12019
2024-06-07 22:12:35 +02:00
gnattu
4046ef1c13 Overwrite supported codecs for livetv
Only changeing streamingRequest is not enough. The internal logic will do codec shifting based on supported codecs, need to overwrite all of them.

Signed-off-by: gnattu <gnattuoc@me.com>
2024-06-07 17:58:35 +08:00
Jellyfin Release Bot
b25d6d1e48 Bump version to 10.9.6 2024-06-06 14:41:10 -04:00
Bond-009
cf59140276 Merge pull request #11959 from Shadowghost/continue-validation-if-removed
Do not stop validation if folder was removed
2024-06-06 20:02:38 +02:00
Bond-009
cc4563a477 Use only 1 write connection/DB (#11986) 2024-06-06 08:04:51 -06:00
gnattu
0d984b5162 Fix fallback artist when taglib fails (#11989) 2024-06-06 08:04:33 -06:00
Tim Eisele
279cba008b Set ProductionLocations instead of Tags (#11984) 2024-06-06 06:47:15 -06:00
Jellyfin Release Bot
2b5d458456 Bump version to 10.9.5 2024-06-05 18:04:17 -04:00
Joshua M. Boniface
f41efb3b2c Merge pull request #11978 from Shadowghost/do-to-fallback-to-media-dir
Fallback to local dir when saving to media dir fails
2024-06-05 17:49:57 -04:00
Shadowghost
0155293c64 Fallback to local dir when saving to media dir fails 2024-06-05 23:39:13 +02:00
Joshua M. Boniface
b78efd6b1e Merge pull request #11963 from gnattu/fix-rename-lib
Fix Library renaming
2024-06-05 17:30:56 -04:00
Joshua M. Boniface
bfcc09db8a Merge pull request #11921 from Shadowghost/fix-identify-over-nfo
Fix identify over NFO and replace all when NFO saving enabled
2024-06-05 17:24:36 -04:00
Joshua M. Boniface
a46c17e19f Merge pull request #11969 from Bond-009/readconns
Create readonly DB connections when possible
2024-06-05 17:09:34 -04:00
Tim Eisele
b0bb22b650 Fix local image saving (#11934) 2024-06-05 15:08:12 -06:00
Joshua M. Boniface
0c039145e5 Merge pull request #11935 from Shadowghost/fix-movie-nfo
Fix dateadded and movie NFO recognition
2024-06-05 17:01:17 -04:00
Joshua M. Boniface
2a3c904a9f Merge pull request #11943 from Shadowghost/increase-migration-batch-size
Increase lyrics migration batch size to 5000
2024-06-05 17:00:31 -04:00
Shadowghost
7cbdb6708b Fix windows test 2024-06-05 22:15:51 +02:00
Shadowghost
7058db2b04 Fix test 2024-06-05 20:57:19 +02:00
Shadowghost
8f7df590cd Do not replace locked fields 2024-06-05 19:16:14 +02:00
Bond_009
0f67a5ba2f Actually create readonly connection when asked 2024-06-05 10:43:40 +02:00
Bond_009
19fb00b5b7 Revert "remove readonly"
This reverts commit e7016e38b8.
2024-06-05 10:43:40 +02:00
gnattu
8683253c6d Fix Library renaming
This handler should not just spawn a normal library validation task because our new logic will prevent the removal of library root folder unless explicitly required, which will cause the old lib still "ghosting" in the db.

Signed-off-by: gnattu <gnattuoc@me.com>
2024-06-05 08:49:33 +08:00
Shadowghost
918a36d564 Fix test 2024-06-05 01:12:47 +02:00
Shadowghost
57ae0b5796 Fix typo 2024-06-05 00:58:00 +02:00
Shadowghost
262f7dd98f Fix metadata saver check 2024-06-05 00:53:09 +02:00
Shadowghost
4714b3af67 Ignore local images when replacing and saving is enabled 2024-06-05 00:26:30 +02:00
Shadowghost
0359035000 Do not stop validation if folder was removed 2024-06-04 23:14:45 +02:00
Shadowghost
b14edb8876 Do not run local providers if replacing and saving is enabled 2024-06-04 21:54:04 +02:00
Niels van Velzen
47c5e0c2c7 Merge pull request #11958 from Shadowghost/fix-trailer-nfo-saving
Export trailer URLs in new format
2024-06-04 21:33:11 +02:00
Shadowghost
8709d94783 Export trailer URLs in new format 2024-06-04 19:28:18 +02:00
Tim Eisele
23b1251393 Do not delete file locations for virtual episodes and seasons (#11954) 2024-06-04 07:09:20 -06:00
cptn
484aea1cdb NextUp query respects Limit (#11956) 2024-06-04 07:05:32 -06:00
Niels van Velzen
d1c00ba4ed Merge pull request #11920 from Shadowghost/fix-season-path
Only set season path if season folder parsing was successful
2024-06-04 12:48:51 +02:00
Niels van Velzen
b1a5fe2f55 Merge pull request #11933 from Shadowghost/fix-trailer-duplication
Check trailer distinction by URL
2024-06-04 12:04:39 +02:00
Shadowghost
d7ff6d023c Apply review suggestions 2024-06-03 16:39:22 +02:00
Shadowghost
253e95dcba Increase lyrics migration fetch batch size to 5000 2024-06-03 13:53:34 +02:00
Shadowghost
c7ce1aa4c7 Fix dateadded and movie NFO recognition 2024-06-02 22:33:02 +02:00
Shadowghost
3d87885577 Check trailer distinction by URL 2024-06-02 21:31:31 +02:00
Shadowghost
a7e2271845 Skip local metadata providers when identifying 2024-06-02 09:17:43 +02:00
Shadowghost
2a02abee46 Only set season path if season folder parsing was successful 2024-06-02 08:59:41 +02:00
Jellyfin Release Bot
ab4315742f Bump version to 10.9.4 2024-06-01 18:38:59 -04:00
Joshua M. Boniface
2ddb15c784 Merge pull request #11743 from Shadowghost/fix-replace
Fix replace logic
2024-06-01 18:33:31 -04:00
Joshua M. Boniface
95c7d997c1 Merge pull request #11823 from gnattu/env-disable-second-level-cache
Add Env Var to disable second level cache
2024-06-01 18:32:54 -04:00
Joshua M. Boniface
e2c909f50f Merge pull request #11762 from Shadowghost/fix-lyrics
Mark Audio as RequiresDeserialization and backfill data
2024-06-01 18:32:36 -04:00
Joshua M. Boniface
a53ea029fa Merge pull request #11719 from Shadowghost/fix-season-names
Move NFO series season name parsing to own local provider
2024-06-01 18:31:55 -04:00
Joshua M. Boniface
869dab2ba2 Merge pull request #11873 from thornbill/fix-first-time-setup-guest-but-for-real
Fix FirstTimeSetupHandler allowing public access
2024-06-01 18:31:31 -04:00
Joshua M. Boniface
d2be2ee480 Merge pull request #11910 from Bond-009/audionormout
Audio normalization: parse ffmpeg output line by line
2024-06-01 16:07:05 -04:00
Bond_009
bc8ef94f0d Audio normalization: parse ffmpeg output line by line
Should prevent OOM error
Also optimized the regex so it can bail out earlier
2024-06-01 17:50:12 +02:00
Bill Thornton
ed1b880359 Remove api key check and simplify conditions 2024-05-31 16:31:15 -04:00
Bill Thornton
7221e7ca68 Fix FirstTimeSetupHandler failing for users and update tests 2024-05-31 14:09:04 -04:00
gnattu
0392daa103 Relax remuxing requirement for LiveTV (#11851) 2024-05-31 07:01:47 -06:00
gnattu
d602b6dbc5 Fix multi-part album folder being detected as artist folder (#11886) 2024-05-31 07:01:28 -06:00
Cody Robibero
b8a0cf6a9e Merge pull request #11859 from gnattu/use-ffprobe-audio-metadata-fallback 2024-05-31 07:00:56 -06:00
Cody Robibero
26419c64f5 Merge pull request #11894 from gnattu/escape-concated-path 2024-05-31 06:58:00 -06:00
Bill Thornton
a71e2d9f0a Update FirstTimeSetupHandler.cs
Co-authored-by: Claus Vium <cvium@users.noreply.github.com>
2024-05-31 03:18:33 -04:00
gnattu
cfe67ff17d Add extra white space
Co-authored-by: Claus Vium <cvium@users.noreply.github.com>
2024-05-31 15:14:29 +08:00
gnattu
78e3ee15f9 Don't use interpolated strings
Co-authored-by: Claus Vium <cvium@users.noreply.github.com>
2024-05-31 14:59:57 +08:00
gnattu
2cb74e3dd0 Escape tmpConcatPath for DVD and BD folder
Signed-off-by: gnattu <gnattuoc@me.com>
2024-05-31 14:54:00 +08:00
Joshua M. Boniface
8e979bdb4b Merge pull request #11882 from Shadowghost/fix-season-missing-episode
Fix missing episodes query for seasons
2024-05-30 19:52:20 -04:00
Shadowghost
e099fd6141 Fix missing episodes query for seasons 2024-05-30 20:26:26 +02:00
Bill Thornton
35962bcc42 Fix FirstTimeSetupHandler api key test 2024-05-30 12:08:52 -04:00
Tim Eisele
ae584beaac Return missing episodes for series when no user defined (#11806) 2024-05-30 09:32:37 -06:00
Cody Robibero
563033786f Merge pull request #11876 from Bond-009/enableLib 2024-05-30 09:32:00 -06:00
Joshua M. Boniface
f8c7f36a34 Merge pull request #11867 from Shadowghost/stable-dep-upgrade
Upgrade dependencies
2024-05-30 10:36:30 -04:00
Shadowghost
4746c88633 Apply review suggestion 2024-05-30 09:21:23 +02:00
Shadowghost
b7d6bedbbb Apply review suggestion 2024-05-30 08:54:44 +02:00
Bond_009
8db79c05dd Don't check if admin has access to library when updating
The access check also checks if the library is enabled, this makes it impossible to enable disabled libraries.
Regression from  #11171
2024-05-29 22:27:29 +02:00
Bill Thornton
8fa7ff647a Defer standard authentication checks to DefaultAuthorizationHandler 2024-05-29 14:35:41 -04:00
Bond-009
d0336cd67e Merge pull request #11857 from gnattu/fix-ffprobe-useragent
Fix ffprobe -user_agent parameter
2024-05-29 10:00:36 +02:00
Shadowghost
cfab4eb2fc Fix xUnit 2024-05-28 22:08:33 +02:00
Shadowghost
5f1c5009d3 Upgrade dependencies 2024-05-28 22:08:33 +02:00
gnattu
97d7151289 Don't use finally block for tag fallback
Signed-off-by: gnattu <gnattuoc@me.com>
2024-05-28 20:24:40 +08:00
gnattu
475fa36ea3 Use better exception logging
Co-authored-by: Claus Vium <cvium@users.noreply.github.com>
2024-05-28 20:23:03 +08:00
gnattu
e8d1ee0934 Use music metadata from ffprobe when TagLib fails
TagLib has its own limitations, which cause it to fail on certain audio files or extract incomplete information from the tags. Use the information from ffprobe when TagLib fails to extract data.

Signed-off-by: gnattu <gnattuoc@me.com>
2024-05-28 14:24:36 +08:00
gnattu
d07ec4ad0f Fix ffprobe -user_agent parameter
The PR #10448 was doing it wrong and actually did not work. Even its unit testing was testing for a wrong output.

Signed-off-by: gnattu <gnattuoc@me.com>
2024-05-28 03:18:46 +08:00
Shadowghost
684dfedbcc Do not remove already set people on locked items 2024-05-27 19:14:17 +02:00
Jellyfin Release Bot
730b01fb14 Bump version to 10.9.3 2024-05-26 20:00:29 -04:00
gnattu
45e8872cc0 Extract media attachment one by one if the filename appears to be a path (#11812) 2024-05-26 11:40:28 -06:00
Shadowghost
cc2c00d764 Respect locked fields when updating children from parent 2024-05-26 17:01:19 +02:00
gnattu
402a5e2c9f Use simpler config value
Only true and false are supported now

Signed-off-by: gnattu <gnattuoc@me.com>
2024-05-26 10:45:38 +08:00
Joshua M. Boniface
bcf884ccfa Update GitHub workflows from Master
Backport fixes from:
 - #11780
 - #11779
 - #11769
 - #11733
 - #11515
2024-05-25 11:55:48 -04:00
gnattu
2eece01acc Filter invalid IPs on external interface matching (#11766) 2024-05-25 09:44:03 -06:00
gnattu
ef985896e2 Use SharedStream for LiveTV more restrictively (#11805) 2024-05-25 09:43:53 -06:00
Nyanmisaka
5e7514243c Fix the IOSurf error in QSV transcoding (#11830) 2024-05-25 09:00:30 -06:00
gnattu
b9c0fc69e8 Add Env Var to disable second level cache
This is an attempt to track down possible causes of remaining database lockups. Add an environment variable to disable the second-level cache entirely to see if it works better on systems that still experience lockups.

Signed-off-by: gnattu <gnattuoc@me.com>
2024-05-25 01:12:00 +08:00
NotSaifA
4a344bebc0 Trickplay: kill ffmpeg when task is cancelled (#11790) 2024-05-24 07:50:55 -06:00
Tim Eisele
b2d54b82fa Improve reliability of HasChanged check (#11792) 2024-05-24 07:50:09 -06:00
gnattu
e7b1162cb3 Force more compatible transcoding profile for LiveTV (#11801) 2024-05-24 07:36:59 -06:00
Tim Eisele
d89e5a0074 Exclude virtual items from DateLastMediaAdded calculation (#11804) 2024-05-24 07:36:39 -06:00
Tim Eisele
4a54e5ddeb Add Canceled to ended state (#11808) 2024-05-24 07:36:19 -06:00
Bond-009
d9232e05f1 Merge pull request #11798 from gnattu/fix-trickplay-image-height
Recalculate trickplay image height for anamorphic videos
2024-05-24 14:19:37 +02:00
Bond-009
52be8be28f Merge pull request #11754 from Shadowghost/fix-bd-chapter-images
Fix BD/DVD folder chapter image extraction
2024-05-24 14:18:10 +02:00
Bond-009
ab6c2424db Merge pull request #11802 from crobibero/nullable-match-term
Mark SearchHint.MatchedTerm as nullable
2024-05-24 14:17:59 +02:00
Bond-009
eb437e7163 Merge pull request #11799 from nyanmisaka/fix-va-vk-interop-chk
Disable VA-VK interop on not supported kernel versions
2024-05-24 14:17:51 +02:00
Bond-009
2ddf2a7866 Merge pull request #11781 from Bond-009/orderts
Retain order blu-ray segments
2024-05-24 14:16:45 +02:00
Bond-009
60232ce9be Merge pull request #11788 from gnattu/override-too-small-trickplay-image-interval
Override too small trickplay image interval
2024-05-24 14:16:33 +02:00
gnattu
952995f796 Ignore NullOrEmpty imageStream.AspectRatio
Signed-off-by: gnattu <gnattuoc@me.com>
2024-05-23 23:08:29 +08:00
gnattu
933a285bf5 Use single quote
Signed-off-by: gnattu <gnattuoc@me.com>
2024-05-23 23:03:35 +08:00
gnattu
f8da69f8e5 Allow decimal aspect ratio
Signed-off-by: gnattu <gnattuoc@me.com>
2024-05-23 23:02:57 +08:00
Cody Robibero
d5e29bfce3 here you go Niels 2024-05-23 07:16:56 -06:00
nyanmisaka
ab36c4c011 Disable VA-VK interop on not supported kernel versions
Signed-off-by: nyanmisaka <nst799610810@gmail.com>
2024-05-23 14:53:00 +08:00
gnattu
c6e29647fc Recalculate trickplay image height for anamorphic videos
Signed-off-by: gnattu <gnattuoc@me.com>
2024-05-23 12:36:43 +08:00
Shadowghost
95a6291c34 Fixes 2024-05-22 19:26:19 +02:00
gnattu
fa2bff30f6 Explicitly use decimal
Co-authored-by: Cody Robibero <cody@robibe.ro>
2024-05-22 21:17:00 +08:00
Shadowghost
58041e1f9d Fix backwards merge 2024-05-22 13:44:45 +02:00
gnattu
447f73caf4 Fix bitrate calculation accuracy
Signed-off-by: gnattu <gnattuoc@me.com>
2024-05-22 13:41:54 +08:00
Shadowghost
9145be6bfc Remove local metadata stop logic 2024-05-22 07:38:53 +02:00
gnattu
86129589ef Override too small trickplay image interval
Some users may set this value too low, causing the trickplay generation to fail. Reset this interval to the minimum valid value of 1 second when the user-configured value is too small to prevent generation failures.

Signed-off-by: gnattu <gnattuoc@me.com>
2024-05-22 13:35:28 +08:00
Shadowghost
f5a8fca22f Don't drop existing metadata if item gets local locked 2024-05-21 23:22:44 +02:00
Shadowghost
2a612611b8 Extend minimum local metadata requirements 2024-05-21 23:14:28 +02:00
Shadowghost
0b64426cf2 Fix local locked and StopRefreshIfLocalMetadataFound logic 2024-05-21 23:08:00 +02:00
Shadowghost
f3bf9bcdc8 Fix final merge logic 2024-05-21 21:47:29 +02:00
Niels van Velzen
06a5ddda5e Merge pull request #11774 from Bond-009/downmix
Apply audio boost when downmixing regardless of downmixalgo
2024-05-21 21:40:22 +02:00
Shadowghost
8a5a93ee80 Allow removal of all people from an item 2024-05-21 21:14:30 +02:00
Bond_009
6777f47e0e Retain order blu-ray segments 2024-05-21 20:19:15 +02:00
Bond_009
cf04e1d8e5 Apply audio boost when downmixing regardless of downmixalgo
This is what I'd expect from the naming
Should fix #11771
2024-05-21 16:24:43 +02:00
Bond-009
d608f1e3cc Merge pull request #11713 from gnattu/fix-vt-h264-profile
Fix VideoToolbox H264 constrained profile option
2024-05-21 13:58:01 +02:00
Bond-009
86f5c93434 Merge pull request #11739 from Shadowghost/fix-trickplay
Do not run trickplay on scan if disabled
2024-05-21 13:57:41 +02:00
Bond-009
4fcbeef5e6 Merge pull request #11738 from crobibero/non-user-session
Don't require user when getting current session
2024-05-21 13:57:31 +02:00
Shadowghost
7d983ae0dd Mark Audio as RequiresDeserialization and backfill data 2024-05-20 22:56:22 +02:00
Shadowghost
a2ab34ef4c Rename provider to be run after normal season NFO provider 2024-05-20 20:12:52 +02:00
Shadowghost
77abafca8e Fix BD/DVD folder chapter image extraction 2024-05-20 13:19:05 +02:00
Shadowghost
e67eb48540 Never revert locked state 2024-05-20 12:49:26 +02:00
Shadowghost
37d7e8f5bf Fix replacement logic 2024-05-20 12:24:57 +02:00
Shadowghost
e6eef8bece Set path for season folders 2024-05-20 01:45:12 +02:00
Shadowghost
52cfd9f261 Properly pass replace flag to remote provider logic 2024-05-19 19:59:47 +02:00
Shadowghost
9a9e8e2648 Prevent infite loop 2024-05-19 18:36:18 +02:00
Shadowghost
2cebd5e05f Do not run trickplay on scan if disabled 2024-05-19 16:52:59 +02:00
Shadowghost
7fa72260ca Only set season name if it's unset 2024-05-19 16:50:51 +02:00
Cody Robibero
b19b346670 Don't require user when getting current session 2024-05-19 08:25:38 -06:00
Shadowghost
99de0ca45f Directly use ParentId 2024-05-18 21:28:07 +02:00
Shadowghost
c106b399d7 Apply review suggestion 2024-05-18 20:41:04 +02:00
Shadowghost
c274062e87 Move NFO series season name parsing to own local provider 2024-05-18 20:29:08 +02:00
gnattu
53de8c0805 Fix VideoToolbox H264 constrained profile option
Like a lot of other encoders they need an underscore between two words.

Signed-off-by: gnattu <gnattuoc@me.com>
2024-05-18 19:53:23 +08:00
Jellyfin Release Bot
76854b5eff Bump version to 10.9.2 2024-05-17 16:09:34 -04:00
Tim Eisele
5200633574 Prevent double iterating over all seasons (#11700) 2024-05-17 12:13:49 -06:00
Joshua M. Boniface
832e27a8fb Merge pull request #11680 from Shadowghost/secure-local-playlists
Secure local playlist path handling
2024-05-17 13:47:47 -04:00
Joshua M. Boniface
2da06bc0b1 Merge pull request #11647 from Shadowghost/fix-season-names
Fix season names
2024-05-17 13:47:24 -04:00
Joshua M. Boniface
46c748d888 Merge pull request #11699 from cvium/fix_livetv
Use MediaType instead of ToString and add text/ as disallowed mimetypes
2024-05-17 13:47:12 -04:00
Tim Eisele
430d450828 Fix network binding (#11671)
* Fix network binding

* Better log output

* Fix Kestrel bind message
2024-05-17 18:57:18 +02:00
Niels van Velzen
02937873b1 Merge pull request #11689 from gnattu/workaround-ffmpeg-seek
Workaround ffmpeg keyframe seeking for external subtitles
2024-05-17 18:55:01 +02:00
Niels van Velzen
d303ca56e3 Merge pull request #11698 from Bond-009/issue11605
Fix not binding to SQL parameters
2024-05-17 18:54:32 +02:00
cvium
c647143e53 fix(livetv): use MediaType instead of ToString and add text/ as disallowed mimetypes 2024-05-17 18:50:44 +02:00
Bond_009
dd0ab8ed56 Fix not binding to SQL parameters
Whitespace values weren't being filtered out in advance
Remove the posibility of this happening again by always binding

Should fix #11605
2024-05-17 18:35:11 +02:00
Shadowghost
18e6c1ef7d Apply review comments 2024-05-17 10:58:00 +02:00
gnattu
dec2032e13 Workaround ffmpeg keyframe seeking for external subtitles
We seek to the exact position of the keyframe for direct stream/remuxing, but FFmpeg seeks to the previous keyframe when the exact time is provided as input. To work around this, add a 0.5 second offset to the seeking time.

Signed-off-by: gnattu <gnattuoc@me.com>
2024-05-17 12:12:45 +08:00
Shadowghost
287e06d6dc If itemPath exists, use that, otherwise try getting full path from relative path 2024-05-16 21:55:00 +02:00
Shadowghost
dc93cc13b5 Apply review suggestion 2024-05-16 19:36:49 +02:00
Niels van Velzen
26714e2c62 Merge pull request #11673 from Shadowghost/fix-local-playlists
Fix local playlist scanning
2024-05-16 19:07:17 +02:00
Tim Eisele
c6c48a2b47 Fix series status parsing (#11648)
* Fix series status parsing

* Apply review suggestions and add test

* Apply review suggestion

* Apply review suggestions
2024-05-16 19:06:11 +02:00
Niels van Velzen
f8b67ec44c Merge pull request #11670 from jellyfin/attempt-restore-user-cache
Restore caching for UserManager
2024-05-16 19:05:00 +02:00
Niels van Velzen
ddd5c302b4 Merge pull request #11675 from gnattu/fix-vaapi-mjpeg-parameter
Fix quality parameter for vaapi_mjpeg
2024-05-16 19:04:34 +02:00
Niels van Velzen
9b98638b2b Merge pull request #11677 from Bond-009/migrateuserdb
Properly dispose dbContext in MigrateUserDb
2024-05-16 19:02:52 +02:00
Shadowghost
2ca8ce6f60 Apply review suggestions 2024-05-16 17:04:42 +02:00
Shadowghost
56a158e5c9 Secure local playlist path handling 2024-05-16 16:10:37 +02:00
gnattu
9b65d243a8 Use OrdinalIgnoreCase comparison
Signed-off-by: gnattu <gnattuoc@me.com>
2024-05-16 20:18:36 +08:00
Bond_009
c45dd5d6fb Properly dispose dbContext in MigrateUserDb 2024-05-16 10:58:32 +02:00
Shadowghost
af4b732080 Fix override of locked name 2024-05-16 08:25:35 +02:00
Shadowghost
1cdf0f5cc4 Apply review suggestion 2024-05-16 08:22:40 +02:00
gnattu
20a1da1855 fix quality parameter for vaapi
Hardware encoders has different expectations about quality input. VAAPI's mjpeg encoder excepts JPEG quality divided by QP2LAMBDA as input.

Signed-off-by: gnattu <gnattuoc@me.com>
2024-05-16 11:49:41 +08:00
gnattu
8aee50020b Always fallback for failed HEAD request (#11668) 2024-05-15 17:27:25 -06:00
Bond-009
c1615419b9 Don't generate TrickPlay images for files that don't exist (#11653) 2024-05-15 17:26:42 -06:00
Shadowghost
15489eeae3 Fix album photos 2024-05-16 00:31:50 +02:00
Shadowghost
80c9589885 Fix local playlist scanning 2024-05-15 23:20:14 +02:00
Cody Robibero
a5d60c4521 Allow empty user id when getting device list (#11633) 2024-05-15 07:06:29 -06:00
Bill Thornton
2cb052a119 Fix FirstTimeSetupPolicy allowing guest access (#11651) 2024-05-15 07:06:10 -06:00
gnattu
0756174b13 Restore caching for UserManager.cs
It seems like the EFCore's second level cache does not really work, and we are having very heavy database query here.

Signed-off-by: gnattu <gnattuoc@me.com>
2024-05-15 12:43:46 +08:00
gnattu
3f760e6685 Fix missing filename for timer (#11629) 2024-05-14 21:28:39 -06:00
Nathan McCrina
d5dc4435d9 Handle exception for unexpected audio file YEAR tag values (#11621) 2024-05-14 21:28:29 -06:00
Shadowghost
48228430c0 Fix season names 2024-05-15 01:23:23 +02:00
gnattu
f396a95f05 Fix network config (#11587) 2024-05-13 07:20:47 -06:00
Jellyfin Release Bot
717afcdc82 Bump version to 10.9.1 2024-05-12 20:10:24 -04:00
Tim Gels
25c50bcc5d Change "try" to "attempt" english translation (#11578) 2024-05-12 15:19:02 -06:00
Cody Robibero
f77a5d0c5c Default to processor count concurrent scan instead of 2 * processor count (#11569) 2024-05-12 15:18:56 -06:00
gnattu
6689d837d6 Fix absolute path checking on windows (#11570) 2024-05-12 15:12:07 -06:00
Cody Robibero
c1907354e8 Add metrics collector to disposable parts (#11539) 2024-05-12 09:14:36 -06:00
Cody Robibero
efba619acb Fix migration with special Rating (#11541) 2024-05-12 09:14:26 -06:00
Cody Robibero
7d271547c6 Disable nuget warning in Jellyfin.Extensions 2024-05-11 15:12:14 -06:00
Jellyfin Release Bot
327f92bb2e Bump version to 10.9.0 2024-05-11 14:23:58 -04:00
641 changed files with 6411 additions and 14696 deletions

View File

@@ -3,7 +3,7 @@
"isRoot": true, "isRoot": true,
"tools": { "tools": {
"dotnet-ef": { "dotnet-ef": {
"version": "8.0.8", "version": "8.0.4",
"commands": [ "commands": [
"dotnet-ef" "dotnet-ef"
] ]

View File

@@ -1,131 +1,58 @@
name: Issue Report name: Issue Report
description: File an issue report description: File an issue report
title: "[Issue]: "
labels: [bug, triage] labels: [bug, triage]
body: body:
- type: markdown - type: markdown
id: introduction
attributes: attributes:
value: | value: |
### Thank you for taking the time to report an issue! Thanks for taking the time to report an issue. Before submitting a report, please do the following:
Please keep in mind that Jellyfin is a [free and open-source](https://jellyfin.org/docs/general/about) project, made up entirely and exclusively of **volunteers** who donate their free time to the project. 1. Please head to our forum or chat rooms and troubleshoot with volunteers if you haven't already. Links can be found here: https://jellyfin.org/contact/
- type: checkboxes 2. Please search the bug tracker for similar issues. If you do find one, please comment there instead of opening a new bug report.
id: before-posting 3. If you decide to open a new report, please provide as much detail as possible.
attributes: 4. Please **ONLY** report **ONE** issue per report. If you are experiencing multiple issues, please open multiple reports.
label: "This issue respects the following points:"
description: All conditions are **required**. Failure to comply with any of these conditions may cause your issue to be closed without comment.
options:
- label: This is a **bug**, not a question or a configuration issue; Please visit our forum or chat rooms first to troubleshoot with volunteers, before creating a report. The links can be found [here](https://jellyfin.org/contact/).
required: true
- label: This issue is **not** already reported on [GitHub](https://github.com/jellyfin/jellyfin/issues?q=is%3Aopen+is%3Aissue) _(I've searched it)_.
required: true
- label: I'm using an up to date version of Jellyfin Server stable, unstable or master; We generally do not support previous older versions. If possible, please update to the latest version before opening an issue.
required: true
- label: I agree to follow Jellyfin's [Code of Conduct](https://jellyfin.org/docs/general/community-standards.html#code-of-conduct).
required: true
- label: This report addresses only a single issue; If you encounter multiple issues, kindly create separate reports for each one.
required: true
- type: markdown
id: preliminary-information
attributes:
value: |
### General preliminary information
Please keep the following in mind when creating this issue:
1. Fill in as much of the template as possible. When you are unsure about the relevancy of a section, do include the information requested in that section. Only leave out information in sections when you are completely sure about it not being relevant.
2. Provide as much detail as possible. Do not assume other people to know what is going on.
3. Keep everything readable and structured. Nobody enjoys reading poorly written reports that are difficult to understand.
4. Keep an eye on your report as long as it is open, your involvement might be requested at a later moment.
5. Keep the title short and descriptive. The title is not the place to write down a full description of the issue.
6. When deciding to leave out information in a field, leave it blank and empty. Avoid writing things such as `n/a` for empty fields.
- type: textarea - type: textarea
id: bug-description id: what-happened
attributes: attributes:
label: Description of the bug label: Please describe your bug
description: Please provide a detailed description on the bug you encountered, in a readable and comprehensible way. description: Also tell us, what did you expect to happen?
placeholder: | placeholder: |
After upgrading to version x.y.z of Jellyfin, the "login disclaimer" is showing incorrect text. It appears to me that it is appending the server name to the end of the login disclaimer, and showing that to a user. It might be a regression from pull request x. I have tried rebooting my host as well as my container multiple times. I tested this functionality on different clients, and it happens to all the tested clients (client x, y, z), that support the login disclaimer functionality. This makes me believe it is a server side issue. The more information that you are able to provide, the better. Did you do anything before this happened? Did you upgrade or change anything? Any screenshots or logs you can provide will be helpful.
If you are using an old release of Jellyfin, please also explain why.
validations: validations:
required: true required: true
- type: textarea - type: textarea
id: repro-steps id: repro-steps
attributes: attributes:
label: Reproduction steps label: Reproduction Steps
description: Reproduction steps should be complete and self-contained. Anyone can reproduce this issue by following these steps. Furthermore, the steps should be clear and easy to follow.
placeholder: | placeholder: |
1. Sign in on the Jellyfin web client, with an admin account, using a browser of your choice. 1. In this environment...
2. Navigate to the dashboard. 2. With this config...
3. Select "general". 3. Run '...'
4. Change the login disclaimer to something like "I am a cool disclaimer!" 4. See error...
5. Save the settings.
6. Sign out.
7. Make sure you are on the sign in screen. Otherwise, navigate to the sign in screen manually.
validations:
required: true
- type: textarea
id: actual-behavior
attributes:
label: What is the current _bug_ behavior?
description: Write down the incorrect behavior that currently happens after following the reproduction steps.
placeholder: |
The login disclaimer on the sign in screen has the server name appended to the text. The text shown is: "I am a cool disclaimer!jellyfinserver".
validations:
required: true
- type: textarea
id: expected-behavior
attributes:
label: What is the expected _correct_ behavior?
description: Write down the correct expected behavior that is supposed to happen after following the reproduction steps.
placeholder: |
The login disclaimer on the sign in screen should only show the configured text. The text that should be shown is: "I am a cool disclaimer!".
validations: validations:
required: true required: true
- type: dropdown - type: dropdown
id: version id: version
attributes: attributes:
label: Jellyfin Server version label: Jellyfin Version
description: What version of Jellyfin are you using? description: What version of Jellyfin are you running?
options: options:
- 10.9.11+ - 10.8.13
- Master - 10.8.12
- Unstable - 10.8.11 or older (please specify)
- Older* - Unstable (master branch)
validations: validations:
required: true required: true
- type: input - type: input
id: version-master id: version-other
attributes: attributes:
label: "Specify commit id" label: "if other:"
description: Fill in this field in case the option 'master' is selected. Provide the commit id it was built on. placeholder: Other
placeholder: |
610e56baafc3011e1bfa043bdabb567bda0c2ab0
- type: input
id: version-unstable
attributes:
label: "Specify unstable release number"
description: Fill in this field in case the option 'unstable' is selected. Provide the unstable release number.
placeholder: |
2024050906
- type: input
id: version-older
attributes:
label: "Specify version number"
description: Fill in this field in case the option 'older' is selected. Provide the version number.
placeholder: |
x.y.z
- type: input
id: build-version
attributes:
label: "Specify the build version"
description: Please provide the build version that is shown in the dashboard.
validations:
required: true
- type: textarea - type: textarea
id: environment-information
attributes: attributes:
label: Environment label: Environment
description: | description: |
Accurately fill in as much environment details as possible. If a certain environment field is not shown in the template below, but you consider useful information, please include it.
Examples: Examples:
- **OS**: [e.g. Debian 11, Windows 10] - **OS**: [e.g. Debian 11, Windows 10]
- **Linux Kernel**: [e.g. none, 5.15, 6.1, etc.] - **Linux Kernel**: [e.g. none, 5.15, 6.1, etc.]
@@ -160,22 +87,21 @@ body:
validations: validations:
required: true required: true
- type: markdown - type: markdown
id: general-information-logs
attributes: attributes:
value: | value: |
When providing logs, please keep the following things in mind: When providing logs, please keep the following things in mind.
1. **DO NOT** use external paste services. If logs are too large to paste into the field, upload them as text files. 1. **DO NOT** use external paste services.
2. Please provide complete logs. 2. Please provide complete logs.
- For server logs, ensure to capture all relevant information, encompassing both the events leading up to and following the occurrence of the issue. Typically, providing 10 *lines preceding and succeeding* the problem should be adequate. - For server logs, include everything you think is important plus *10 lines before and after*
- For ffmpeg logs, please provide the entire file unmodified. - For ffmpeg logs, please provide the entire file unmodified.
3. Please do not run logs through any translation program. We exclusively accept raw, untranslated logs. Particularly exercise caution if your browser automatically translates pages by default. 3. Please do not run logs through any translation program. Especially beware if your browser translates pages by default.
- Do not forget to censor out personal information such as public IP addresses.
4. Please do not include logs as screenshots, with the only exception being client logs in browsers. 4. Please do not include logs as screenshots, with the only exception being client logs in browsers.
- type: textarea - type: textarea
id: jellyfin-logs id: logs
attributes: attributes:
label: Jellyfin logs label: Jellyfin logs
description: Please copy and paste any relevant log output. This can be found in Dashboard > Logs. description: Please copy and paste any relevant log output. This can be found in Dashboard > Logs.
placeholder: For playback issues, browser/client and FFmpeg logs may be more useful.
render: shell render: shell
validations: validations:
required: true required: true
@@ -183,20 +109,24 @@ body:
id: ffmpeg-logs id: ffmpeg-logs
attributes: attributes:
label: FFmpeg logs label: FFmpeg logs
description: Relevant FFmpeg log output. This can be found in Dashboard > Logs > FFmpeg*.log. This field is considered mandatory for transcoding related issues. It's also important to include the specific codec details. description: Please copy and paste recent FFmpeg log output. This can be found in Dashboard > Logs > FFmpeg*.log.
placeholder: This field is mandatory for debugging hardware transcoding issues. It's important to include the specific codec details. If no FFmpeg logs appear, the file was Direct Played and did not use FFmpeg.
render: shell render: shell
- type: textarea - type: textarea
id: browser-logs id: browserlogs
attributes: attributes:
label: Client / Browser logs label: Please attach any browser or client logs here
description: Access browser logs by using the F12 to bring up the console. Screenshots are typically easier to read than raw logs. For clients such as Android or iOS, please see our documentation. placeholder: Access browser logs by using the F12 to bring up the console. Screenshots are typically easier to read than raw logs. For clients such as Android or iOS, please see our documentation.
- type: textarea - type: textarea
id: screenshots id: screenshots
attributes: attributes:
label: Relevant screenshots or videos label: Please attach any screenshots here
description: Attach relevant screenshots or videos related to this report. placeholder: Images can be pasted directly into the textbox and will be hosted by github.
- type: textarea - type: checkboxes
id: additional-information id: terms
attributes: attributes:
label: Additional information label: Code of Conduct
description: Any additional information that might be useful to this issue. description: By submitting this issue, you agree to follow our [Code of Conduct](https://jellyfin.org/docs/general/community-standards.html#code-of-conduct)
options:
- label: I agree to follow this project's Code of Conduct
required: true

View File

@@ -20,18 +20,18 @@ jobs:
steps: steps:
- name: Checkout repository - name: Checkout repository
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 # v4.1.6
- name: Setup .NET - name: Setup .NET
uses: actions/setup-dotnet@3e891b0cb619bf60e2c25674b222b8940e2c1c25 # v4.1.0 uses: actions/setup-dotnet@4d6c8fcf3c8f7a60068d26b594648e99df24cee3 # v4.0.0
with: with:
dotnet-version: '8.0.x' dotnet-version: '8.0.x'
- name: Initialize CodeQL - name: Initialize CodeQL
uses: github/codeql-action/init@662472033e021d55d94146f66f6058822b0b39fd # v3.27.0 uses: github/codeql-action/init@9fdb3e49720b44c48891d036bb502feb25684276 # v3.25.6
with: with:
languages: ${{ matrix.language }} languages: ${{ matrix.language }}
queries: +security-extended queries: +security-extended
- name: Autobuild - name: Autobuild
uses: github/codeql-action/autobuild@662472033e021d55d94146f66f6058822b0b39fd # v3.27.0 uses: github/codeql-action/autobuild@9fdb3e49720b44c48891d036bb502feb25684276 # v3.25.6
- name: Perform CodeQL Analysis - name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@662472033e021d55d94146f66f6058822b0b39fd # v3.27.0 uses: github/codeql-action/analyze@9fdb3e49720b44c48891d036bb502feb25684276 # v3.25.6

View File

@@ -1,149 +0,0 @@
name: ABI Compatibility
on:
pull_request_target:
permissions: {}
jobs:
abi-head:
name: ABI - HEAD
runs-on: ubuntu-latest
permissions: read-all
steps:
- name: Checkout repository
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
ref: ${{ github.event.pull_request.head.sha }}
repository: ${{ github.event.pull_request.head.repo.full_name }}
- name: Build
run: |
dotnet build Jellyfin.Server -o ./out
- name: Upload Head
uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3
with:
name: abi-head
retention-days: 14
if-no-files-found: error
path: out/
abi-base:
name: ABI - BASE
if: ${{ github.base_ref != '' }}
runs-on: ubuntu-latest
permissions: read-all
steps:
- name: Checkout repository
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
ref: ${{ github.event.pull_request.head.sha }}
repository: ${{ github.event.pull_request.head.repo.full_name }}
fetch-depth: 0
- name: Checkout common ancestor
env:
HEAD_REF: ${{ github.head_ref }}
run: |
git remote add upstream https://github.com/${{ github.event.pull_request.base.repo.full_name }}
git -c protocol.version=2 fetch --prune --progress --no-recurse-submodules upstream +refs/heads/*:refs/remotes/upstream/* +refs/tags/*:refs/tags/*
ANCESTOR_REF=$(git merge-base upstream/${{ github.base_ref }} origin/$HEAD_REF)
git checkout --progress --force $ANCESTOR_REF
- name: Build
run: |
dotnet build Jellyfin.Server -o ./out
- name: Upload Head
uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3
with:
name: abi-base
retention-days: 14
if-no-files-found: error
path: out/
abi-diff:
permissions:
pull-requests: write # to create or update comment (peter-evans/create-or-update-comment)
name: ABI - Difference
if: ${{ github.event_name == 'pull_request_target' }}
runs-on: ubuntu-latest
needs:
- abi-head
- abi-base
steps:
- name: Download abi-head
uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8
with:
name: abi-head
path: abi-head
- name: Download abi-base
uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8
with:
name: abi-base
path: abi-base
- name: Setup ApiCompat
run: |
dotnet tool install --global Microsoft.DotNet.ApiCompat.Tool
- name: Run ApiCompat
id: diff
run: |
{
echo 'body<<EOF'
for file in Jellyfin.Data.dll MediaBrowser.Common.dll MediaBrowser.Controller.dll MediaBrowser.Model.dll Emby.Naming.dll Jellyfin.Extensions.dll; do
COMPAT_OUTPUT="$( { apicompat --left ./abi-base/${file} --right ./abi-head/${file}; } 2>&1 )"
if [ "APICompat ran successfully without finding any breaking changes." != "${COMPAT_OUTPUT}" ]; then
printf "\n${file}\n${COMPAT_OUTPUT}\n"
fi
done
echo EOF
} >> $GITHUB_OUTPUT
- name: Find difference comment
uses: peter-evans/find-comment@3eae4d37986fb5a8592848f6a574fdf654e61f9e # v3.1.0
id: find-comment
with:
issue-number: ${{ github.event.pull_request.number }}
direction: last
body-includes: abi-diff-workflow-comment
- name: Reply or edit difference comment (changed)
uses: peter-evans/create-or-update-comment@71345be0265236311c031f5c7866368bd1eff043 # v4.0.0
if: ${{ steps.diff.outputs.body != '' }}
with:
issue-number: ${{ github.event.pull_request.number }}
comment-id: ${{ steps.find-comment.outputs.comment-id }}
edit-mode: replace
token: ${{ secrets.JF_BOT_TOKEN }}
body: |
<!--abi-diff-workflow-comment-->
<details>
<summary>ABI Difference</summary>
```
${{ steps.diff.outputs.body }}
```
</details>
- name: Reply or edit difference comment (unchanged)
uses: peter-evans/create-or-update-comment@71345be0265236311c031f5c7866368bd1eff043 # v4.0.0
if: ${{ steps.diff.outputs.body == '' && steps.find-comment.outputs.comment-id != '' }}
with:
issue-number: ${{ github.event.pull_request.number }}
comment-id: ${{ steps.find-comment.outputs.comment-id }}
edit-mode: replace
token: ${{ secrets.JF_BOT_TOKEN }}
body: |
<!--abi-diff-workflow-comment-->
<details>
<summary>ABI Difference</summary>
No changes to the ABI found. See history of this comment for previous changes.
</details>

View File

@@ -16,18 +16,18 @@ jobs:
permissions: read-all permissions: read-all
steps: steps:
- name: Checkout repository - name: Checkout repository
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 # v4.1.6
with: with:
ref: ${{ github.event.pull_request.head.sha }} ref: ${{ github.event.pull_request.head.sha }}
repository: ${{ github.event.pull_request.head.repo.full_name }} repository: ${{ github.event.pull_request.head.repo.full_name }}
- name: Setup .NET - name: Setup .NET
uses: actions/setup-dotnet@3e891b0cb619bf60e2c25674b222b8940e2c1c25 # v4.1.0 uses: actions/setup-dotnet@4d6c8fcf3c8f7a60068d26b594648e99df24cee3 # v4.0.0
with: with:
dotnet-version: '8.0.x' dotnet-version: '8.0.x'
- name: Generate openapi.json - name: Generate openapi.json
run: dotnet test tests/Jellyfin.Server.Integration.Tests/Jellyfin.Server.Integration.Tests.csproj -c Release --filter "Jellyfin.Server.Integration.Tests.OpenApiSpecTests" run: dotnet test tests/Jellyfin.Server.Integration.Tests/Jellyfin.Server.Integration.Tests.csproj -c Release --filter "Jellyfin.Server.Integration.Tests.OpenApiSpecTests"
- name: Upload openapi.json - name: Upload openapi.json
uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3 uses: actions/upload-artifact@65462800fd760344b1a7b4382951275a0abb4808 # v4.3.3
with: with:
name: openapi-head name: openapi-head
retention-days: 14 retention-days: 14
@@ -41,7 +41,7 @@ jobs:
permissions: read-all permissions: read-all
steps: steps:
- name: Checkout repository - name: Checkout repository
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 # v4.1.6
with: with:
ref: ${{ github.event.pull_request.head.sha }} ref: ${{ github.event.pull_request.head.sha }}
repository: ${{ github.event.pull_request.head.repo.full_name }} repository: ${{ github.event.pull_request.head.repo.full_name }}
@@ -55,13 +55,13 @@ jobs:
ANCESTOR_REF=$(git merge-base upstream/${{ github.base_ref }} origin/$HEAD_REF) ANCESTOR_REF=$(git merge-base upstream/${{ github.base_ref }} origin/$HEAD_REF)
git checkout --progress --force $ANCESTOR_REF git checkout --progress --force $ANCESTOR_REF
- name: Setup .NET - name: Setup .NET
uses: actions/setup-dotnet@3e891b0cb619bf60e2c25674b222b8940e2c1c25 # v4.1.0 uses: actions/setup-dotnet@4d6c8fcf3c8f7a60068d26b594648e99df24cee3 # v4.0.0
with: with:
dotnet-version: '8.0.x' dotnet-version: '8.0.x'
- name: Generate openapi.json - name: Generate openapi.json
run: dotnet test tests/Jellyfin.Server.Integration.Tests/Jellyfin.Server.Integration.Tests.csproj -c Release --filter "Jellyfin.Server.Integration.Tests.OpenApiSpecTests" run: dotnet test tests/Jellyfin.Server.Integration.Tests/Jellyfin.Server.Integration.Tests.csproj -c Release --filter "Jellyfin.Server.Integration.Tests.OpenApiSpecTests"
- name: Upload openapi.json - name: Upload openapi.json
uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3 uses: actions/upload-artifact@65462800fd760344b1a7b4382951275a0abb4808 # v4.3.3
with: with:
name: openapi-base name: openapi-base
retention-days: 14 retention-days: 14
@@ -80,12 +80,12 @@ jobs:
- openapi-base - openapi-base
steps: steps:
- name: Download openapi-head - name: Download openapi-head
uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8 uses: actions/download-artifact@65a9edc5881444af0b9093a5e628f2fe47ea3b2e # v4.1.7
with: with:
name: openapi-head name: openapi-head
path: openapi-head path: openapi-head
- name: Download openapi-base - name: Download openapi-base
uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8 uses: actions/download-artifact@65a9edc5881444af0b9093a5e628f2fe47ea3b2e # v4.1.7
with: with:
name: openapi-base name: openapi-base
path: openapi-base path: openapi-base
@@ -158,7 +158,7 @@ jobs:
run: |- run: |-
echo "JELLYFIN_VERSION=$(date +'%Y%m%d%H%M%S')" >> $GITHUB_ENV echo "JELLYFIN_VERSION=$(date +'%Y%m%d%H%M%S')" >> $GITHUB_ENV
- name: Download openapi-head - name: Download openapi-head
uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8 uses: actions/download-artifact@65a9edc5881444af0b9093a5e628f2fe47ea3b2e # v4.1.7
with: with:
name: openapi-head name: openapi-head
path: openapi-head path: openapi-head
@@ -172,7 +172,7 @@ jobs:
strip_components: 1 strip_components: 1
target: "/srv/incoming/openapi/unstable/jellyfin-openapi-${{ env.JELLYFIN_VERSION }}" target: "/srv/incoming/openapi/unstable/jellyfin-openapi-${{ env.JELLYFIN_VERSION }}"
- name: Move openapi.json (unstable) into place - name: Move openapi.json (unstable) into place
uses: appleboy/ssh-action@25ce8cbbcb08177468c7ff7ec5cbfa236f9341e1 # v1.1.0 uses: appleboy/ssh-action@029f5b4aeeeb58fdfe1410a5d17f967dacf36262 # v1.0.3
with: with:
host: "${{ secrets.REPO_HOST }}" host: "${{ secrets.REPO_HOST }}"
username: "${{ secrets.REPO_USER }}" username: "${{ secrets.REPO_USER }}"
@@ -220,7 +220,7 @@ jobs:
run: |- run: |-
echo "JELLYFIN_VERSION=${GITHUB_REF#refs/tags/v}" >> $GITHUB_ENV echo "JELLYFIN_VERSION=${GITHUB_REF#refs/tags/v}" >> $GITHUB_ENV
- name: Download openapi-head - name: Download openapi-head
uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8 uses: actions/download-artifact@65a9edc5881444af0b9093a5e628f2fe47ea3b2e # v4.1.7
with: with:
name: openapi-head name: openapi-head
path: openapi-head path: openapi-head
@@ -234,7 +234,7 @@ jobs:
strip_components: 1 strip_components: 1
target: "/srv/incoming/openapi/stable/jellyfin-openapi-${{ env.JELLYFIN_VERSION }}" target: "/srv/incoming/openapi/stable/jellyfin-openapi-${{ env.JELLYFIN_VERSION }}"
- name: Move openapi.json (stable) into place - name: Move openapi.json (stable) into place
uses: appleboy/ssh-action@25ce8cbbcb08177468c7ff7ec5cbfa236f9341e1 # v1.1.0 uses: appleboy/ssh-action@029f5b4aeeeb58fdfe1410a5d17f967dacf36262 # v1.0.3
with: with:
host: "${{ secrets.REPO_HOST }}" host: "${{ secrets.REPO_HOST }}"
username: "${{ secrets.REPO_USER }}" username: "${{ secrets.REPO_USER }}"

View File

@@ -19,9 +19,9 @@ jobs:
runs-on: "${{ matrix.os }}" runs-on: "${{ matrix.os }}"
steps: steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 # v4.1.6
- uses: actions/setup-dotnet@3e891b0cb619bf60e2c25674b222b8940e2c1c25 # v4.1.0 - uses: actions/setup-dotnet@4d6c8fcf3c8f7a60068d26b594648e99df24cee3 # v4.0.0
with: with:
dotnet-version: ${{ env.SDK_VERSION }} dotnet-version: ${{ env.SDK_VERSION }}
@@ -34,7 +34,7 @@ jobs:
--verbosity minimal --verbosity minimal
- name: Merge code coverage results - name: Merge code coverage results
uses: danielpalme/ReportGenerator-GitHub-Action@62f9e70ab348d56eee76d446b4db903a85ab0ea8 # v5.3.11 uses: danielpalme/ReportGenerator-GitHub-Action@6b06171d1a131e7fd85121120a1c00c1ed03e033 # 5.3.0
with: with:
reports: "**/coverage.cobertura.xml" reports: "**/coverage.cobertura.xml"
targetdir: "merged/" targetdir: "merged/"

View File

@@ -24,7 +24,7 @@ jobs:
reactions: '+1' reactions: '+1'
- name: Checkout the latest code - name: Checkout the latest code
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 # v4.1.6
with: with:
token: ${{ secrets.JF_BOT_TOKEN }} token: ${{ secrets.JF_BOT_TOKEN }}
fetch-depth: 0 fetch-depth: 0
@@ -51,7 +51,7 @@ jobs:
reactions: eyes reactions: eyes
- name: Checkout the latest code - name: Checkout the latest code
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 # v4.1.6
with: with:
token: ${{ secrets.JF_BOT_TOKEN }} token: ${{ secrets.JF_BOT_TOKEN }}
fetch-depth: 0 fetch-depth: 0
@@ -128,11 +128,11 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: pull in script - name: pull in script
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 # v4.1.6
with: with:
repository: jellyfin/jellyfin-triage-script repository: jellyfin/jellyfin-triage-script
- name: install python - name: install python
uses: actions/setup-python@0b93645e9fea7318ecaed2b359559ac225c90a2b # v5.3.0 uses: actions/setup-python@82c7e631bb3cdc910f68e0081d67478d79c6982d # v5.1.0
with: with:
python-version: '3.12' python-version: '3.12'
cache: 'pip' cache: 'pip'

View File

@@ -10,11 +10,11 @@ jobs:
issues: write issues: write
steps: steps:
- name: pull in script - name: pull in script
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 # v4.1.6
with: with:
repository: jellyfin/jellyfin-triage-script repository: jellyfin/jellyfin-triage-script
- name: install python - name: install python
uses: actions/setup-python@0b93645e9fea7318ecaed2b359559ac225c90a2b # v5.3.0 uses: actions/setup-python@82c7e631bb3cdc910f68e0081d67478d79c6982d # v5.1.0
with: with:
python-version: '3.12' python-version: '3.12'
cache: 'pip' cache: 'pip'

View File

@@ -15,7 +15,7 @@ jobs:
if: ${{ github.repository == 'jellyfin/jellyfin' }} if: ${{ github.repository == 'jellyfin/jellyfin' }}
steps: steps:
- name: Apply label - name: Apply label
uses: eps1lon/actions-label-merge-conflict@1b1b1fcde06a9b3d089f3464c96417961dde1168 # v3.0.2 uses: eps1lon/actions-label-merge-conflict@6d74047dcef155976a15e4a124dde2c7fe0c5522 # v3.0.1
if: ${{ github.event_name == 'push' || github.event_name == 'pull_request_target'}} if: ${{ github.event_name == 'push' || github.event_name == 'pull_request_target'}}
with: with:
dirtyLabel: 'merge conflict' dirtyLabel: 'merge conflict'

View File

@@ -33,7 +33,7 @@ jobs:
yq-version: v4.9.8 yq-version: v4.9.8
- name: Checkout Repository - name: Checkout Repository
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 # v4.1.6
with: with:
ref: ${{ env.TAG_BRANCH }} ref: ${{ env.TAG_BRANCH }}
@@ -66,7 +66,7 @@ jobs:
NEXT_VERSION: ${{ github.event.inputs.NEXT_VERSION }} NEXT_VERSION: ${{ github.event.inputs.NEXT_VERSION }}
steps: steps:
- name: Checkout Repository - name: Checkout Repository
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 # v4.1.6
with: with:
ref: ${{ env.TAG_BRANCH }} ref: ${{ env.TAG_BRANCH }}

View File

@@ -65,7 +65,6 @@
- [joshuaboniface](https://github.com/joshuaboniface) - [joshuaboniface](https://github.com/joshuaboniface)
- [JustAMan](https://github.com/JustAMan) - [JustAMan](https://github.com/JustAMan)
- [justinfenn](https://github.com/justinfenn) - [justinfenn](https://github.com/justinfenn)
- [JPVenson](https://github.com/JPVenson)
- [KerryRJ](https://github.com/KerryRJ) - [KerryRJ](https://github.com/KerryRJ)
- [Larvitar](https://github.com/Larvitar) - [Larvitar](https://github.com/Larvitar)
- [LeoVerto](https://github.com/LeoVerto) - [LeoVerto](https://github.com/LeoVerto)
@@ -185,13 +184,6 @@
- [GeorgeH005](https://github.com/GeorgeH005) - [GeorgeH005](https://github.com/GeorgeH005)
- [Vedant](https://github.com/viktory36/) - [Vedant](https://github.com/viktory36/)
- [NotSaifA](https://github.com/NotSaifA) - [NotSaifA](https://github.com/NotSaifA)
- [HonestlyWhoKnows](https://github.com/honestlywhoknows)
- [TheMelmacian](https://github.com/TheMelmacian)
- [ItsAllAboutTheCode](https://github.com/ItsAllAboutTheCode)
- [pret0rian8](https://github.com/pret0rian)
- [jaina heartles](https://github.com/heartles)
- [oxixes](https://github.com/oxixes)
- [elfalem](https://github.com/elfalem)
# Emby Contributors # Emby Contributors

View File

@@ -4,50 +4,52 @@
</PropertyGroup> </PropertyGroup>
<!-- Run "dotnet list package (dash,dash)outdated" to see the latest versions of each package.--> <!-- Run "dotnet list package (dash,dash)outdated" to see the latest versions of each package.-->
<ItemGroup Label="Package Dependencies"> <ItemGroup Label="Package Dependencies">
<PackageVersion Include="AsyncKeyedLock" Version="7.0.2" /> <PackageVersion Include="AsyncKeyedLock" Version="6.4.2" />
<PackageVersion Include="AutoFixture.AutoMoq" Version="4.18.1" /> <PackageVersion Include="AutoFixture.AutoMoq" Version="4.18.1" />
<PackageVersion Include="AutoFixture.Xunit2" Version="4.18.1" /> <PackageVersion Include="AutoFixture.Xunit2" Version="4.18.1" />
<PackageVersion Include="AutoFixture" Version="4.18.1" /> <PackageVersion Include="AutoFixture" Version="4.18.1" />
<PackageVersion Include="BDInfo" Version="0.8.0" /> <PackageVersion Include="BDInfo" Version="0.8.0" />
<PackageVersion Include="BlurHashSharp.SkiaSharp" Version="1.3.3" /> <PackageVersion Include="BlurHashSharp.SkiaSharp" Version="1.3.2" />
<PackageVersion Include="BlurHashSharp" Version="1.3.3" /> <PackageVersion Include="BlurHashSharp" Version="1.3.2" />
<PackageVersion Include="CommandLineParser" Version="2.9.1" /> <PackageVersion Include="CommandLineParser" Version="2.9.1" />
<PackageVersion Include="coverlet.collector" Version="6.0.2" /> <PackageVersion Include="coverlet.collector" Version="6.0.2" />
<PackageVersion Include="Diacritics" Version="3.3.29" /> <PackageVersion Include="Diacritics" Version="3.3.29" />
<PackageVersion Include="DiscUtils.Udf" Version="0.16.13" /> <PackageVersion Include="DiscUtils.Udf" Version="0.16.13" />
<PackageVersion Include="DotNet.Glob" Version="3.1.3" /> <PackageVersion Include="DotNet.Glob" Version="3.1.3" />
<PackageVersion Include="EFCoreSecondLevelCacheInterceptor" Version="4.5.0" />
<PackageVersion Include="FsCheck.Xunit" Version="2.16.6" /> <PackageVersion Include="FsCheck.Xunit" Version="2.16.6" />
<PackageVersion Include="HarfBuzzSharp.NativeAssets.Linux" Version="7.3.0.2" /> <PackageVersion Include="HarfBuzzSharp.NativeAssets.Linux" Version="7.3.0.2" />
<PackageVersion Include="ICU4N.Transliterator" Version="60.1.0-alpha.356" /> <PackageVersion Include="ICU4N.Transliterator" Version="60.1.0-alpha.356" />
<PackageVersion Include="IDisposableAnalyzers" Version="4.0.8" /> <PackageVersion Include="IDisposableAnalyzers" Version="4.0.7" />
<PackageVersion Include="Jellyfin.XmlTv" Version="10.8.0" /> <PackageVersion Include="Jellyfin.XmlTv" Version="10.8.0" />
<PackageVersion Include="libse" Version="4.0.8" /> <PackageVersion Include="libse" Version="4.0.5" />
<PackageVersion Include="LrcParser" Version="2024.0728.2" /> <PackageVersion Include="LrcParser" Version="2023.524.0" />
<PackageVersion Include="MetaBrainz.MusicBrainz" Version="6.1.0" /> <PackageVersion Include="MetaBrainz.MusicBrainz" Version="6.1.0" />
<PackageVersion Include="Microsoft.AspNetCore.Authorization" Version="8.0.10" /> <PackageVersion Include="Microsoft.AspNetCore.Authorization" Version="8.0.6" />
<PackageVersion Include="Microsoft.AspNetCore.Mvc.Testing" Version="8.0.10" /> <PackageVersion Include="Microsoft.AspNetCore.HttpOverrides" Version="2.2.0" />
<PackageVersion Include="Microsoft.AspNetCore.Mvc.Testing" Version="8.0.6" />
<PackageVersion Include="Microsoft.CodeAnalysis.BannedApiAnalyzers" Version="3.3.4" /> <PackageVersion Include="Microsoft.CodeAnalysis.BannedApiAnalyzers" Version="3.3.4" />
<PackageVersion Include="Microsoft.Data.Sqlite" Version="8.0.10" /> <PackageVersion Include="Microsoft.Data.Sqlite" Version="8.0.6" />
<PackageVersion Include="Microsoft.EntityFrameworkCore.Design" Version="8.0.10" /> <PackageVersion Include="Microsoft.EntityFrameworkCore.Design" Version="8.0.6" />
<PackageVersion Include="Microsoft.EntityFrameworkCore.Relational" Version="8.0.10" /> <PackageVersion Include="Microsoft.EntityFrameworkCore.Relational" Version="8.0.6" />
<PackageVersion Include="Microsoft.EntityFrameworkCore.Sqlite" Version="8.0.10" /> <PackageVersion Include="Microsoft.EntityFrameworkCore.Sqlite" Version="8.0.6" />
<PackageVersion Include="Microsoft.EntityFrameworkCore.Tools" Version="8.0.10" /> <PackageVersion Include="Microsoft.EntityFrameworkCore.Tools" Version="8.0.6" />
<PackageVersion Include="Microsoft.Extensions.Caching.Abstractions" Version="8.0.0" /> <PackageVersion Include="Microsoft.Extensions.Caching.Abstractions" Version="8.0.0" />
<PackageVersion Include="Microsoft.Extensions.Caching.Memory" Version="8.0.1" /> <PackageVersion Include="Microsoft.Extensions.Caching.Memory" Version="8.0.0" />
<PackageVersion Include="Microsoft.Extensions.Configuration.Abstractions" Version="8.0.0" /> <PackageVersion Include="Microsoft.Extensions.Configuration.Abstractions" Version="8.0.0" />
<PackageVersion Include="Microsoft.Extensions.Configuration.Binder" Version="8.0.2" /> <PackageVersion Include="Microsoft.Extensions.Configuration.Binder" Version="8.0.1" />
<PackageVersion Include="Microsoft.Extensions.Configuration.EnvironmentVariables" Version="8.0.0" /> <PackageVersion Include="Microsoft.Extensions.Configuration.EnvironmentVariables" Version="8.0.0" />
<PackageVersion Include="Microsoft.Extensions.Configuration.Json" Version="8.0.1" /> <PackageVersion Include="Microsoft.Extensions.Configuration.Json" Version="8.0.0" />
<PackageVersion Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="8.0.2" /> <PackageVersion Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="8.0.1" />
<PackageVersion Include="Microsoft.Extensions.DependencyInjection" Version="8.0.1" /> <PackageVersion Include="Microsoft.Extensions.DependencyInjection" Version="8.0.0" />
<PackageVersion Include="Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore" Version="8.0.10" /> <PackageVersion Include="Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore" Version="8.0.6" />
<PackageVersion Include="Microsoft.Extensions.Diagnostics.HealthChecks" Version="8.0.10" /> <PackageVersion Include="Microsoft.Extensions.Diagnostics.HealthChecks" Version="8.0.6" />
<PackageVersion Include="Microsoft.Extensions.Hosting.Abstractions" Version="8.0.1" /> <PackageVersion Include="Microsoft.Extensions.Hosting.Abstractions" Version="8.0.0" />
<PackageVersion Include="Microsoft.Extensions.Http" Version="8.0.1" /> <PackageVersion Include="Microsoft.Extensions.Http" Version="8.0.0" />
<PackageVersion Include="Microsoft.Extensions.Logging.Abstractions" Version="8.0.2" /> <PackageVersion Include="Microsoft.Extensions.Logging.Abstractions" Version="8.0.1" />
<PackageVersion Include="Microsoft.Extensions.Logging" Version="8.0.1" /> <PackageVersion Include="Microsoft.Extensions.Logging" Version="8.0.0" />
<PackageVersion Include="Microsoft.Extensions.Options" Version="8.0.2" /> <PackageVersion Include="Microsoft.Extensions.Options" Version="8.0.2" />
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="17.11.1" /> <PackageVersion Include="Microsoft.NET.Test.Sdk" Version="17.10.0" />
<PackageVersion Include="MimeTypes" Version="2.4.0" /> <PackageVersion Include="MimeTypes" Version="2.4.0" />
<PackageVersion Include="Mono.Nat" Version="3.0.4" /> <PackageVersion Include="Mono.Nat" Version="3.0.4" />
<PackageVersion Include="Moq" Version="4.18.4" /> <PackageVersion Include="Moq" Version="4.18.4" />
@@ -55,14 +57,14 @@
<PackageVersion Include="Newtonsoft.Json" Version="13.0.3" /> <PackageVersion Include="Newtonsoft.Json" Version="13.0.3" />
<PackageVersion Include="PlaylistsNET" Version="1.4.1" /> <PackageVersion Include="PlaylistsNET" Version="1.4.1" />
<PackageVersion Include="prometheus-net.AspNetCore" Version="8.2.1" /> <PackageVersion Include="prometheus-net.AspNetCore" Version="8.2.1" />
<PackageVersion Include="prometheus-net.DotNetRuntime" Version="4.4.1" /> <PackageVersion Include="prometheus-net.DotNetRuntime" Version="4.4.0" />
<PackageVersion Include="prometheus-net" Version="8.2.1" /> <PackageVersion Include="prometheus-net" Version="8.2.1" />
<PackageVersion Include="Serilog.AspNetCore" Version="8.0.3" /> <PackageVersion Include="Serilog.AspNetCore" Version="8.0.1" />
<PackageVersion Include="Serilog.Enrichers.Thread" Version="4.0.0" /> <PackageVersion Include="Serilog.Enrichers.Thread" Version="3.1.0" />
<PackageVersion Include="Serilog.Settings.Configuration" Version="8.0.4" /> <PackageVersion Include="Serilog.Settings.Configuration" Version="8.0.0" />
<PackageVersion Include="Serilog.Sinks.Async" Version="2.1.0" /> <PackageVersion Include="Serilog.Sinks.Async" Version="1.5.0" />
<PackageVersion Include="Serilog.Sinks.Console" Version="6.0.0" /> <PackageVersion Include="Serilog.Sinks.Console" Version="5.0.1" />
<PackageVersion Include="Serilog.Sinks.File" Version="6.0.0" /> <PackageVersion Include="Serilog.Sinks.File" Version="5.0.0" />
<PackageVersion Include="Serilog.Sinks.Graylog" Version="3.1.1" /> <PackageVersion Include="Serilog.Sinks.Graylog" Version="3.1.1" />
<PackageVersion Include="SerilogAnalyzer" Version="0.15.0" /> <PackageVersion Include="SerilogAnalyzer" Version="0.15.0" />
<PackageVersion Include="SharpFuzz" Version="2.1.1" /> <PackageVersion Include="SharpFuzz" Version="2.1.1" />
@@ -71,21 +73,20 @@
<PackageVersion Include="SkiaSharp.NativeAssets.Linux" Version="2.88.8" /> <PackageVersion Include="SkiaSharp.NativeAssets.Linux" Version="2.88.8" />
<PackageVersion Include="SmartAnalyzers.MultithreadingAnalyzer" Version="1.1.31" /> <PackageVersion Include="SmartAnalyzers.MultithreadingAnalyzer" Version="1.1.31" />
<PackageVersion Include="StyleCop.Analyzers" Version="1.2.0-beta.556" /> <PackageVersion Include="StyleCop.Analyzers" Version="1.2.0-beta.556" />
<PackageVersion Include="Svg.Skia" Version="2.0.0.1" /> <PackageVersion Include="Svg.Skia" Version="1.0.0.18" />
<PackageVersion Include="Swashbuckle.AspNetCore.ReDoc" Version="6.5.0" /> <PackageVersion Include="Swashbuckle.AspNetCore.ReDoc" Version="6.6.2" />
<PackageVersion Include="Swashbuckle.AspNetCore" Version="6.2.3" /> <PackageVersion Include="Swashbuckle.AspNetCore" Version="6.2.3" />
<PackageVersion Include="System.Globalization" Version="4.3.0" /> <PackageVersion Include="System.Globalization" Version="4.3.0" />
<PackageVersion Include="System.Linq.Async" Version="6.0.1" /> <PackageVersion Include="System.Linq.Async" Version="6.0.1" />
<PackageVersion Include="System.Text.Encoding.CodePages" Version="8.0.0" /> <PackageVersion Include="System.Text.Encoding.CodePages" Version="8.0.0" />
<PackageVersion Include="System.Text.Json" Version="8.0.5" /> <PackageVersion Include="System.Text.Json" Version="8.0.3" />
<PackageVersion Include="System.Threading.Tasks.Dataflow" Version="8.0.1" /> <PackageVersion Include="System.Threading.Tasks.Dataflow" Version="8.0.0" />
<PackageVersion Include="TagLibSharp" Version="2.3.0" /> <PackageVersion Include="TagLibSharp" Version="2.3.0" />
<PackageVersion Include="z440.atl.core" Version="6.6.0" />
<PackageVersion Include="TMDbLib" Version="2.2.0" /> <PackageVersion Include="TMDbLib" Version="2.2.0" />
<PackageVersion Include="UTF.Unknown" Version="2.5.1" /> <PackageVersion Include="UTF.Unknown" Version="2.5.1" />
<PackageVersion Include="Xunit.Priority" Version="1.1.6" /> <PackageVersion Include="Xunit.Priority" Version="1.1.6" />
<PackageVersion Include="xunit.runner.visualstudio" Version="2.8.2" /> <PackageVersion Include="xunit.runner.visualstudio" Version="2.8.1" />
<PackageVersion Include="Xunit.SkippableFact" Version="1.4.13" /> <PackageVersion Include="Xunit.SkippableFact" Version="1.4.13" />
<PackageVersion Include="xunit" Version="2.9.2" /> <PackageVersion Include="xunit" Version="2.8.1" />
</ItemGroup> </ItemGroup>
</Project> </Project>

View File

@@ -36,7 +36,7 @@
<PropertyGroup> <PropertyGroup>
<Authors>Jellyfin Contributors</Authors> <Authors>Jellyfin Contributors</Authors>
<PackageId>Jellyfin.Naming</PackageId> <PackageId>Jellyfin.Naming</PackageId>
<VersionPrefix>10.10.0</VersionPrefix> <VersionPrefix>10.9.7</VersionPrefix>
<RepositoryUrl>https://github.com/jellyfin/jellyfin</RepositoryUrl> <RepositoryUrl>https://github.com/jellyfin/jellyfin</RepositoryUrl>
<PackageLicenseExpression>GPL-3.0-only</PackageLicenseExpression> <PackageLicenseExpression>GPL-3.0-only</PackageLicenseExpression>
</PropertyGroup> </PropertyGroup>

View File

@@ -24,8 +24,6 @@ namespace Emby.Naming.TV
"stagione" "stagione"
}; };
private static readonly char[] _splitChars = ['.', '_', ' ', '-'];
/// <summary> /// <summary>
/// Attempts to parse season number from path. /// Attempts to parse season number from path.
/// </summary> /// </summary>
@@ -85,9 +83,14 @@ namespace Emby.Naming.TV
} }
} }
if (TryGetSeasonNumberFromPart(filename, out int seasonNumber)) if (filename.StartsWith("s", StringComparison.OrdinalIgnoreCase))
{ {
return (seasonNumber, true); var testFilename = filename.AsSpan().Slice(1);
if (int.TryParse(testFilename, NumberStyles.Integer, CultureInfo.InvariantCulture, out var val))
{
return (val, true);
}
} }
// Look for one of the season folder names // Look for one of the season folder names
@@ -105,10 +108,10 @@ namespace Emby.Naming.TV
} }
} }
var parts = filename.Split(_splitChars, StringSplitOptions.RemoveEmptyEntries); var parts = filename.Split(new[] { '.', '_', ' ', '-' }, StringSplitOptions.RemoveEmptyEntries);
foreach (var part in parts) foreach (var part in parts)
{ {
if (TryGetSeasonNumberFromPart(part, out seasonNumber)) if (TryGetSeasonNumberFromPart(part, out int seasonNumber))
{ {
return (seasonNumber, true); return (seasonNumber, true);
} }

View File

@@ -1,4 +1,4 @@
using System.Diagnostics.CodeAnalysis; using System.Diagnostics.CodeAnalysis;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
namespace Emby.Naming.Video; namespace Emby.Naming.Video;

View File

@@ -141,9 +141,7 @@ namespace Emby.Naming.Video
{ {
if (group.Key) if (group.Key)
{ {
videos.InsertRange(0, group videos.InsertRange(0, group.OrderByDescending(x => x.Files[0].FileNameWithoutExtension.ToString(), new AlphanumericComparator()));
.OrderByDescending(x => ResolutionRegex().Match(x.Files[0].FileNameWithoutExtension.ToString()).Value, new AlphanumericComparator())
.ThenBy(x => x.Files[0].FileNameWithoutExtension.ToString(), new AlphanumericComparator()));
} }
else else
{ {

View File

@@ -26,7 +26,7 @@ public class PhotoProvider : ICustomMetadataProvider<Photo>, IForcedProvider, IH
private readonly ILogger<PhotoProvider> _logger; private readonly ILogger<PhotoProvider> _logger;
private readonly IImageProcessor _imageProcessor; private readonly IImageProcessor _imageProcessor;
// Other extensions might cause taglib to hang // These are causing taglib to hang
private readonly string[] _includeExtensions = [".jpg", ".jpeg", ".png", ".tiff", ".cr2", ".webp", ".avif"]; private readonly string[] _includeExtensions = [".jpg", ".jpeg", ".png", ".tiff", ".cr2", ".webp", ".avif"];
/// <summary> /// <summary>

View File

@@ -104,6 +104,6 @@ namespace Emby.Server.Implementations.AppBase
/// Gets the folder path to the temp directory within the cache folder. /// Gets the folder path to the temp directory within the cache folder.
/// </summary> /// </summary>
/// <value>The temp directory.</value> /// <value>The temp directory.</value>
public string TempDirectory => Path.Join(Path.GetTempPath(), "jellyfin"); public string TempDirectory => Path.Combine(CachePath, "temp");
} }
} }

View File

@@ -40,7 +40,6 @@ using Jellyfin.MediaEncoding.Hls.Playlist;
using Jellyfin.Networking.Manager; using Jellyfin.Networking.Manager;
using Jellyfin.Networking.Udp; using Jellyfin.Networking.Udp;
using Jellyfin.Server.Implementations; using Jellyfin.Server.Implementations;
using Jellyfin.Server.Implementations.MediaSegments;
using MediaBrowser.Common; using MediaBrowser.Common;
using MediaBrowser.Common.Configuration; using MediaBrowser.Common.Configuration;
using MediaBrowser.Common.Events; using MediaBrowser.Common.Events;
@@ -402,12 +401,7 @@ namespace Emby.Server.Implementations
ConfigurationManager.ConfigurationUpdated += OnConfigurationUpdated; ConfigurationManager.ConfigurationUpdated += OnConfigurationUpdated;
ConfigurationManager.NamedConfigurationUpdated += OnConfigurationUpdated; ConfigurationManager.NamedConfigurationUpdated += OnConfigurationUpdated;
var ffmpegValid = Resolve<IMediaEncoder>().SetFFmpegPath(); Resolve<IMediaEncoder>().SetFFmpegPath();
if (!ffmpegValid)
{
throw new FfmpegException("Failed to find valid ffmpeg");
}
Logger.LogInformation("ServerId: {ServerId}", SystemId); Logger.LogInformation("ServerId: {ServerId}", SystemId);
Logger.LogInformation("Core startup complete"); Logger.LogInformation("Core startup complete");
@@ -558,8 +552,6 @@ namespace Emby.Server.Implementations
serviceCollection.AddScoped<DynamicHlsHelper>(); serviceCollection.AddScoped<DynamicHlsHelper>();
serviceCollection.AddScoped<IClientEventLogger, ClientEventLogger>(); serviceCollection.AddScoped<IClientEventLogger, ClientEventLogger>();
serviceCollection.AddSingleton<IDirectoryService, DirectoryService>(); serviceCollection.AddSingleton<IDirectoryService, DirectoryService>();
serviceCollection.AddSingleton<IMediaSegmentManager, MediaSegmentManager>();
} }
/// <summary> /// <summary>
@@ -643,7 +635,6 @@ namespace Emby.Server.Implementations
UserView.TVSeriesManager = Resolve<ITVSeriesManager>(); UserView.TVSeriesManager = Resolve<ITVSeriesManager>();
UserView.CollectionManager = Resolve<ICollectionManager>(); UserView.CollectionManager = Resolve<ICollectionManager>();
BaseItem.MediaSourceManager = Resolve<IMediaSourceManager>(); BaseItem.MediaSourceManager = Resolve<IMediaSourceManager>();
BaseItem.MediaSegmentManager = Resolve<IMediaSegmentManager>();
CollectionFolder.XmlSerializer = _xmlSerializer; CollectionFolder.XmlSerializer = _xmlSerializer;
CollectionFolder.ApplicationHost = this; CollectionFolder.ApplicationHost = this;
} }
@@ -673,8 +664,7 @@ namespace Emby.Server.Implementations
GetExports<IMetadataService>(), GetExports<IMetadataService>(),
GetExports<IMetadataProvider>(), GetExports<IMetadataProvider>(),
GetExports<IMetadataSaver>(), GetExports<IMetadataSaver>(),
GetExports<IExternalId>(), GetExports<IExternalId>());
GetExports<IExternalUrlProvider>());
Resolve<IMediaSourceManager>().AddParts(GetExports<IMediaSourceProvider>()); Resolve<IMediaSourceManager>().AddParts(GetExports<IMediaSourceProvider>());
} }

View File

@@ -20,9 +20,7 @@ namespace Emby.Server.Implementations
{ PlaylistsAllowDuplicatesKey, bool.FalseString }, { PlaylistsAllowDuplicatesKey, bool.FalseString },
{ BindToUnixSocketKey, bool.FalseString }, { BindToUnixSocketKey, bool.FalseString },
{ SqliteCacheSizeKey, "20000" }, { SqliteCacheSizeKey, "20000" },
{ FfmpegSkipValidationKey, bool.FalseString }, { SqliteDisableSecondLevelCacheKey, bool.FalseString }
{ FfmpegImgExtractPerfTradeoffKey, bool.FalseString },
{ DetectNetworkChangeKey, bool.TrueString }
}; };
} }
} }

View File

@@ -31,6 +31,17 @@ namespace Emby.Server.Implementations.Data
/// </summary> /// </summary>
protected string DbFilePath { get; set; } protected string DbFilePath { get; set; }
/// <summary>
/// Gets or sets the number of write connections to create.
/// </summary>
/// <value>Path to the DB file.</value>
protected int WriteConnectionsCount { get; set; } = 1;
/// <summary>
/// Gets or sets the number of read connections to create.
/// </summary>
protected int ReadConnectionsCount { get; set; } = 1;
/// <summary> /// <summary>
/// Gets the logger. /// Gets the logger.
/// </summary> /// </summary>
@@ -56,7 +67,7 @@ namespace Emby.Server.Implementations.Data
/// <summary> /// <summary>
/// Gets the journal size limit. <see href="https://www.sqlite.org/pragma.html#pragma_journal_size_limit" />. /// Gets the journal size limit. <see href="https://www.sqlite.org/pragma.html#pragma_journal_size_limit" />.
/// The default (-1) is overridden to prevent unconstrained WAL size, as reported by users. /// The default (-1) is overriden to prevent unconstrained WAL size, as reported by users.
/// </summary> /// </summary>
/// <value>The journal size limit.</value> /// <value>The journal size limit.</value>
protected virtual int? JournalSizeLimit => 134_217_728; // 128MiB protected virtual int? JournalSizeLimit => 134_217_728; // 128MiB

View File

@@ -1,5 +1,7 @@
#nullable disable #nullable disable
#pragma warning disable CS1591
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics; using System.Diagnostics;
@@ -181,8 +183,7 @@ namespace Emby.Server.Implementations.Data
"ElPresentFlag", "ElPresentFlag",
"BlPresentFlag", "BlPresentFlag",
"DvBlSignalCompatibilityId", "DvBlSignalCompatibilityId",
"IsHearingImpaired", "IsHearingImpaired"
"Rotation"
}; };
private static readonly string _mediaStreamSaveColumnsInsertQuery = private static readonly string _mediaStreamSaveColumnsInsertQuery =
@@ -326,6 +327,7 @@ namespace Emby.Server.Implementations.Data
DbFilePath = Path.Combine(_config.ApplicationPaths.DataPath, "library.db"); DbFilePath = Path.Combine(_config.ApplicationPaths.DataPath, "library.db");
CacheSize = configuration.GetSqliteCacheSize(); CacheSize = configuration.GetSqliteCacheSize();
ReadConnectionsCount = Environment.ProcessorCount * 2;
} }
/// <inheritdoc /> /// <inheritdoc />
@@ -342,7 +344,7 @@ namespace Emby.Server.Implementations.Data
base.Initialize(); base.Initialize();
const string CreateMediaStreamsTableCommand const string CreateMediaStreamsTableCommand
= "create table if not exists mediastreams (ItemId GUID, StreamIndex INT, StreamType TEXT, Codec TEXT, Language TEXT, ChannelLayout TEXT, Profile TEXT, AspectRatio TEXT, Path TEXT, IsInterlaced BIT, BitRate INT NULL, Channels INT NULL, SampleRate INT NULL, IsDefault BIT, IsForced BIT, IsExternal BIT, Height INT NULL, Width INT NULL, AverageFrameRate FLOAT NULL, RealFrameRate FLOAT NULL, Level FLOAT NULL, PixelFormat TEXT, BitDepth INT NULL, IsAnamorphic BIT NULL, RefFrames INT NULL, CodecTag TEXT NULL, Comment TEXT NULL, NalLengthSize TEXT NULL, IsAvc BIT NULL, Title TEXT NULL, TimeBase TEXT NULL, CodecTimeBase TEXT NULL, ColorPrimaries TEXT NULL, ColorSpace TEXT NULL, ColorTransfer TEXT NULL, DvVersionMajor INT NULL, DvVersionMinor INT NULL, DvProfile INT NULL, DvLevel INT NULL, RpuPresentFlag INT NULL, ElPresentFlag INT NULL, BlPresentFlag INT NULL, DvBlSignalCompatibilityId INT NULL, IsHearingImpaired BIT NULL, Rotation INT NULL, PRIMARY KEY (ItemId, StreamIndex))"; = "create table if not exists mediastreams (ItemId GUID, StreamIndex INT, StreamType TEXT, Codec TEXT, Language TEXT, ChannelLayout TEXT, Profile TEXT, AspectRatio TEXT, Path TEXT, IsInterlaced BIT, BitRate INT NULL, Channels INT NULL, SampleRate INT NULL, IsDefault BIT, IsForced BIT, IsExternal BIT, Height INT NULL, Width INT NULL, AverageFrameRate FLOAT NULL, RealFrameRate FLOAT NULL, Level FLOAT NULL, PixelFormat TEXT, BitDepth INT NULL, IsAnamorphic BIT NULL, RefFrames INT NULL, CodecTag TEXT NULL, Comment TEXT NULL, NalLengthSize TEXT NULL, IsAvc BIT NULL, Title TEXT NULL, TimeBase TEXT NULL, CodecTimeBase TEXT NULL, ColorPrimaries TEXT NULL, ColorSpace TEXT NULL, ColorTransfer TEXT NULL, DvVersionMajor INT NULL, DvVersionMinor INT NULL, DvProfile INT NULL, DvLevel INT NULL, RpuPresentFlag INT NULL, ElPresentFlag INT NULL, BlPresentFlag INT NULL, DvBlSignalCompatibilityId INT NULL, IsHearingImpaired BIT NULL, PRIMARY KEY (ItemId, StreamIndex))";
const string CreateMediaAttachmentsTableCommand const string CreateMediaAttachmentsTableCommand
= "create table if not exists mediaattachments (ItemId GUID, AttachmentIndex INT, Codec TEXT, CodecTag TEXT NULL, Comment TEXT NULL, Filename TEXT NULL, MIMEType TEXT NULL, PRIMARY KEY (ItemId, AttachmentIndex))"; = "create table if not exists mediaattachments (ItemId GUID, AttachmentIndex INT, Codec TEXT, CodecTag TEXT NULL, Comment TEXT NULL, Filename TEXT NULL, MIMEType TEXT NULL, PRIMARY KEY (ItemId, AttachmentIndex))";
@@ -537,15 +539,12 @@ namespace Emby.Server.Implementations.Data
AddColumn(connection, "MediaStreams", "IsHearingImpaired", "BIT", existingColumnNames); AddColumn(connection, "MediaStreams", "IsHearingImpaired", "BIT", existingColumnNames);
AddColumn(connection, "MediaStreams", "Rotation", "INT", existingColumnNames);
connection.Execute(string.Join(';', postQueries)); connection.Execute(string.Join(';', postQueries));
transaction.Commit(); transaction.Commit();
} }
} }
/// <inheritdoc />
public void SaveImages(BaseItem item) public void SaveImages(BaseItem item)
{ {
ArgumentNullException.ThrowIfNull(item); ArgumentNullException.ThrowIfNull(item);
@@ -1048,10 +1047,9 @@ namespace Emby.Server.Implementations.Data
foreach (var part in value.SpanSplit('|')) foreach (var part in value.SpanSplit('|'))
{ {
var providerDelimiterIndex = part.IndexOf('='); var providerDelimiterIndex = part.IndexOf('=');
// Don't let empty values through if (providerDelimiterIndex != -1 && providerDelimiterIndex == part.LastIndexOf('='))
if (providerDelimiterIndex != -1 && part.Length != providerDelimiterIndex + 1)
{ {
item.SetProviderId(part[..providerDelimiterIndex].ToString(), part[(providerDelimiterIndex + 1)..].ToString()); item.SetProviderId(part.Slice(0, providerDelimiterIndex).ToString(), part.Slice(providerDelimiterIndex + 1).ToString());
} }
} }
} }
@@ -2339,6 +2337,9 @@ namespace Emby.Server.Implementations.Data
if (query.SearchTerm.Length > 1) if (query.SearchTerm.Length > 1)
{ {
builder.Append("+ ((CleanName like @SearchTermContains or (OriginalTitle not null and OriginalTitle like @SearchTermContains)) * 10)"); builder.Append("+ ((CleanName like @SearchTermContains or (OriginalTitle not null and OriginalTitle like @SearchTermContains)) * 10)");
builder.Append("+ (SELECT COUNT(1) * 1 from ItemValues where ItemId=Guid and CleanValue like @SearchTermContains)");
builder.Append("+ (SELECT COUNT(1) * 2 from ItemValues where ItemId=Guid and CleanValue like @SearchTermStartsWith)");
builder.Append("+ (SELECT COUNT(1) * 10 from ItemValues where ItemId=Guid and CleanValue like @SearchTermEquals)");
} }
builder.Append(") as SearchScore"); builder.Append(") as SearchScore");
@@ -2369,6 +2370,11 @@ namespace Emby.Server.Implementations.Data
{ {
statement.TryBind("@SearchTermContains", "%" + searchTerm + "%"); statement.TryBind("@SearchTermContains", "%" + searchTerm + "%");
} }
if (commandText.Contains("@SearchTermEquals", StringComparison.OrdinalIgnoreCase))
{
statement.TryBind("@SearchTermEquals", searchTerm);
}
} }
private void BindSimilarParams(InternalItemsQuery query, SqliteCommand statement) private void BindSimilarParams(InternalItemsQuery query, SqliteCommand statement)
@@ -2434,7 +2440,6 @@ namespace Emby.Server.Implementations.Data
return string.Empty; return string.Empty;
} }
/// <inheritdoc />
public int GetCount(InternalItemsQuery query) public int GetCount(InternalItemsQuery query)
{ {
ArgumentNullException.ThrowIfNull(query); ArgumentNullException.ThrowIfNull(query);
@@ -2482,7 +2487,6 @@ namespace Emby.Server.Implementations.Data
} }
} }
/// <inheritdoc />
public List<BaseItem> GetItemList(InternalItemsQuery query) public List<BaseItem> GetItemList(InternalItemsQuery query)
{ {
ArgumentNullException.ThrowIfNull(query); ArgumentNullException.ThrowIfNull(query);
@@ -2636,7 +2640,6 @@ namespace Emby.Server.Implementations.Data
items.Add(newItem); items.Add(newItem);
} }
/// <inheritdoc />
public QueryResult<BaseItem> GetItems(InternalItemsQuery query) public QueryResult<BaseItem> GetItems(InternalItemsQuery query)
{ {
ArgumentNullException.ThrowIfNull(query); ArgumentNullException.ThrowIfNull(query);
@@ -2881,7 +2884,6 @@ namespace Emby.Server.Implementations.Data
}; };
} }
/// <inheritdoc />
public List<Guid> GetItemIdsList(InternalItemsQuery query) public List<Guid> GetItemIdsList(InternalItemsQuery query)
{ {
ArgumentNullException.ThrowIfNull(query); ArgumentNullException.ThrowIfNull(query);
@@ -4198,15 +4200,6 @@ namespace Emby.Server.Implementations.Data
OR (select CleanValue from ItemValues where ItemId=ParentId and Type=6 and CleanValue in ({includedTags})) is not null) OR (select CleanValue from ItemValues where ItemId=ParentId and Type=6 and CleanValue in ({includedTags})) is not null)
"""); """);
} }
// A playlist should be accessible to its owner regardless of allowed tags.
else if (includeTypes.Length == 1 && includeTypes.FirstOrDefault() is BaseItemKind.Playlist)
{
whereClauses.Add($"""
((select CleanValue from ItemValues where ItemId=Guid and Type=6 and CleanValue in ({includedTags})) is not null
OR data like @PlaylistOwnerUserId)
""");
}
else else
{ {
whereClauses.Add("((select CleanValue from ItemValues where ItemId=Guid and Type=6 and cleanvalue in (" + includedTags + ")) is not null)"); whereClauses.Add("((select CleanValue from ItemValues where ItemId=Guid and Type=6 and cleanvalue in (" + includedTags + ")) is not null)");
@@ -4218,11 +4211,6 @@ namespace Emby.Server.Implementations.Data
{ {
statement.TryBind(paramName + index, GetCleanValue(query.IncludeInheritedTags[index])); statement.TryBind(paramName + index, GetCleanValue(query.IncludeInheritedTags[index]));
} }
if (query.User is not null)
{
statement.TryBind("@PlaylistOwnerUserId", $"""%"OwnerUserId":"{query.User.Id.ToString("N")}"%""");
}
} }
} }
@@ -4440,7 +4428,6 @@ namespace Emby.Server.Implementations.Data
|| query.IncludeItemTypes.Contains(BaseItemKind.Season); || query.IncludeItemTypes.Contains(BaseItemKind.Season);
} }
/// <inheritdoc />
public void UpdateInheritedValues() public void UpdateInheritedValues()
{ {
const string Statements = """ const string Statements = """
@@ -4457,7 +4444,6 @@ where AncestorIdText not null and ItemValues.Value not null and ItemValues.Type
transaction.Commit(); transaction.Commit();
} }
/// <inheritdoc />
public void DeleteItem(Guid id) public void DeleteItem(Guid id)
{ {
if (id.IsEmpty()) if (id.IsEmpty())
@@ -4500,7 +4486,6 @@ where AncestorIdText not null and ItemValues.Value not null and ItemValues.Type
} }
} }
/// <inheritdoc />
public List<string> GetPeopleNames(InternalPeopleQuery query) public List<string> GetPeopleNames(InternalPeopleQuery query)
{ {
ArgumentNullException.ThrowIfNull(query); ArgumentNullException.ThrowIfNull(query);
@@ -4539,7 +4524,6 @@ where AncestorIdText not null and ItemValues.Value not null and ItemValues.Type
return list; return list;
} }
/// <inheritdoc />
public List<PersonInfo> GetPeople(InternalPeopleQuery query) public List<PersonInfo> GetPeople(InternalPeopleQuery query)
{ {
ArgumentNullException.ThrowIfNull(query); ArgumentNullException.ThrowIfNull(query);
@@ -4699,55 +4683,46 @@ AND Type = @InternalPersonType)");
} }
} }
/// <inheritdoc />
public QueryResult<(BaseItem Item, ItemCounts ItemCounts)> GetAllArtists(InternalItemsQuery query) public QueryResult<(BaseItem Item, ItemCounts ItemCounts)> GetAllArtists(InternalItemsQuery query)
{ {
return GetItemValues(query, new[] { 0, 1 }, typeof(MusicArtist).FullName); return GetItemValues(query, new[] { 0, 1 }, typeof(MusicArtist).FullName);
} }
/// <inheritdoc />
public QueryResult<(BaseItem Item, ItemCounts ItemCounts)> GetArtists(InternalItemsQuery query) public QueryResult<(BaseItem Item, ItemCounts ItemCounts)> GetArtists(InternalItemsQuery query)
{ {
return GetItemValues(query, new[] { 0 }, typeof(MusicArtist).FullName); return GetItemValues(query, new[] { 0 }, typeof(MusicArtist).FullName);
} }
/// <inheritdoc />
public QueryResult<(BaseItem Item, ItemCounts ItemCounts)> GetAlbumArtists(InternalItemsQuery query) public QueryResult<(BaseItem Item, ItemCounts ItemCounts)> GetAlbumArtists(InternalItemsQuery query)
{ {
return GetItemValues(query, new[] { 1 }, typeof(MusicArtist).FullName); return GetItemValues(query, new[] { 1 }, typeof(MusicArtist).FullName);
} }
/// <inheritdoc />
public QueryResult<(BaseItem Item, ItemCounts ItemCounts)> GetStudios(InternalItemsQuery query) public QueryResult<(BaseItem Item, ItemCounts ItemCounts)> GetStudios(InternalItemsQuery query)
{ {
return GetItemValues(query, new[] { 3 }, typeof(Studio).FullName); return GetItemValues(query, new[] { 3 }, typeof(Studio).FullName);
} }
/// <inheritdoc />
public QueryResult<(BaseItem Item, ItemCounts ItemCounts)> GetGenres(InternalItemsQuery query) public QueryResult<(BaseItem Item, ItemCounts ItemCounts)> GetGenres(InternalItemsQuery query)
{ {
return GetItemValues(query, new[] { 2 }, typeof(Genre).FullName); return GetItemValues(query, new[] { 2 }, typeof(Genre).FullName);
} }
/// <inheritdoc />
public QueryResult<(BaseItem Item, ItemCounts ItemCounts)> GetMusicGenres(InternalItemsQuery query) public QueryResult<(BaseItem Item, ItemCounts ItemCounts)> GetMusicGenres(InternalItemsQuery query)
{ {
return GetItemValues(query, new[] { 2 }, typeof(MusicGenre).FullName); return GetItemValues(query, new[] { 2 }, typeof(MusicGenre).FullName);
} }
/// <inheritdoc />
public List<string> GetStudioNames() public List<string> GetStudioNames()
{ {
return GetItemValueNames(new[] { 3 }, Array.Empty<string>(), Array.Empty<string>()); return GetItemValueNames(new[] { 3 }, Array.Empty<string>(), Array.Empty<string>());
} }
/// <inheritdoc />
public List<string> GetAllArtistNames() public List<string> GetAllArtistNames()
{ {
return GetItemValueNames(new[] { 0, 1 }, Array.Empty<string>(), Array.Empty<string>()); return GetItemValueNames(new[] { 0, 1 }, Array.Empty<string>(), Array.Empty<string>());
} }
/// <inheritdoc />
public List<string> GetMusicGenreNames() public List<string> GetMusicGenreNames()
{ {
return GetItemValueNames( return GetItemValueNames(
@@ -4762,7 +4737,6 @@ AND Type = @InternalPersonType)");
Array.Empty<string>()); Array.Empty<string>());
} }
/// <inheritdoc />
public List<string> GetGenreNames() public List<string> GetGenreNames()
{ {
return GetItemValueNames( return GetItemValueNames(
@@ -5240,7 +5214,6 @@ AND Type = @InternalPersonType)");
} }
} }
/// <inheritdoc />
public void UpdatePeople(Guid itemId, List<PersonInfo> people) public void UpdatePeople(Guid itemId, List<PersonInfo> people)
{ {
if (itemId.IsEmpty()) if (itemId.IsEmpty())
@@ -5342,7 +5315,6 @@ AND Type = @InternalPersonType)");
return item; return item;
} }
/// <inheritdoc />
public List<MediaStream> GetMediaStreams(MediaStreamQuery query) public List<MediaStream> GetMediaStreams(MediaStreamQuery query)
{ {
CheckDisposed(); CheckDisposed();
@@ -5391,7 +5363,6 @@ AND Type = @InternalPersonType)");
} }
} }
/// <inheritdoc />
public void SaveMediaStreams(Guid id, IReadOnlyList<MediaStream> streams, CancellationToken cancellationToken) public void SaveMediaStreams(Guid id, IReadOnlyList<MediaStream> streams, CancellationToken cancellationToken)
{ {
CheckDisposed(); CheckDisposed();
@@ -5512,8 +5483,6 @@ AND Type = @InternalPersonType)");
statement.TryBind("@DvBlSignalCompatibilityId" + index, stream.DvBlSignalCompatibilityId); statement.TryBind("@DvBlSignalCompatibilityId" + index, stream.DvBlSignalCompatibilityId);
statement.TryBind("@IsHearingImpaired" + index, stream.IsHearingImpaired); statement.TryBind("@IsHearingImpaired" + index, stream.IsHearingImpaired);
statement.TryBind("@Rotation" + index, stream.Rotation);
} }
statement.ExecuteNonQuery(); statement.ExecuteNonQuery();
@@ -5725,28 +5694,18 @@ AND Type = @InternalPersonType)");
item.IsHearingImpaired = reader.TryGetBoolean(43, out var result) && result; item.IsHearingImpaired = reader.TryGetBoolean(43, out var result) && result;
if (reader.TryGetInt32(44, out var rotation)) if (item.Type == MediaStreamType.Subtitle)
{
item.Rotation = rotation;
}
if (item.Type is MediaStreamType.Audio or MediaStreamType.Subtitle)
{
item.LocalizedDefault = _localization.GetLocalizedString("Default");
item.LocalizedExternal = _localization.GetLocalizedString("External");
if (item.Type is MediaStreamType.Subtitle)
{ {
item.LocalizedUndefined = _localization.GetLocalizedString("Undefined"); item.LocalizedUndefined = _localization.GetLocalizedString("Undefined");
item.LocalizedDefault = _localization.GetLocalizedString("Default");
item.LocalizedForced = _localization.GetLocalizedString("Forced"); item.LocalizedForced = _localization.GetLocalizedString("Forced");
item.LocalizedExternal = _localization.GetLocalizedString("External");
item.LocalizedHearingImpaired = _localization.GetLocalizedString("HearingImpaired"); item.LocalizedHearingImpaired = _localization.GetLocalizedString("HearingImpaired");
} }
}
return item; return item;
} }
/// <inheritdoc />
public List<MediaAttachment> GetMediaAttachments(MediaAttachmentQuery query) public List<MediaAttachment> GetMediaAttachments(MediaAttachmentQuery query)
{ {
CheckDisposed(); CheckDisposed();
@@ -5782,7 +5741,6 @@ AND Type = @InternalPersonType)");
return list; return list;
} }
/// <inheritdoc />
public void SaveMediaAttachments( public void SaveMediaAttachments(
Guid id, Guid id,
IReadOnlyList<MediaAttachment> attachments, IReadOnlyList<MediaAttachment> attachments,

View File

@@ -333,10 +333,10 @@ namespace Emby.Server.Implementations.Data
/// <returns>The user item data.</returns> /// <returns>The user item data.</returns>
private UserItemData ReadRow(SqliteDataReader reader) private UserItemData ReadRow(SqliteDataReader reader)
{ {
var userData = new UserItemData var userData = new UserItemData();
{
Key = reader.GetString(0) userData.Key = reader[0].ToString();
}; // userData.UserId = reader[1].ReadGuidFromBlob();
if (reader.TryGetDouble(2, out var rating)) if (reader.TryGetDouble(2, out var rating))
{ {

View File

@@ -1,3 +1,5 @@
#nullable disable
#pragma warning disable CS1591 #pragma warning disable CS1591
using System; using System;
@@ -81,12 +83,12 @@ namespace Emby.Server.Implementations.Dto
private ILiveTvManager LivetvManager => _livetvManagerFactory.Value; private ILiveTvManager LivetvManager => _livetvManagerFactory.Value;
/// <inheritdoc /> /// <inheritdoc />
public IReadOnlyList<BaseItemDto> GetBaseItemDtos(IReadOnlyList<BaseItem> items, DtoOptions options, User? user = null, BaseItem? owner = null) public IReadOnlyList<BaseItemDto> GetBaseItemDtos(IReadOnlyList<BaseItem> items, DtoOptions options, User user = null, BaseItem owner = null)
{ {
var accessibleItems = user is null ? items : items.Where(x => x.IsVisible(user)).ToList(); var accessibleItems = user is null ? items : items.Where(x => x.IsVisible(user)).ToList();
var returnItems = new BaseItemDto[accessibleItems.Count]; var returnItems = new BaseItemDto[accessibleItems.Count];
List<(BaseItem, BaseItemDto)>? programTuples = null; List<(BaseItem, BaseItemDto)> programTuples = null;
List<(BaseItemDto, LiveTvChannel)>? channelTuples = null; List<(BaseItemDto, LiveTvChannel)> channelTuples = null;
for (int index = 0; index < accessibleItems.Count; index++) for (int index = 0; index < accessibleItems.Count; index++)
{ {
@@ -135,7 +137,7 @@ namespace Emby.Server.Implementations.Dto
return returnItems; return returnItems;
} }
public BaseItemDto GetBaseItemDto(BaseItem item, DtoOptions options, User? user = null, BaseItem? owner = null) public BaseItemDto GetBaseItemDto(BaseItem item, DtoOptions options, User user = null, BaseItem owner = null)
{ {
var dto = GetBaseItemDtoInternal(item, options, user, owner); var dto = GetBaseItemDtoInternal(item, options, user, owner);
if (item is LiveTvChannel tvChannel) if (item is LiveTvChannel tvChannel)
@@ -165,7 +167,7 @@ namespace Emby.Server.Implementations.Dto
return dto; return dto;
} }
private static IList<BaseItem> GetTaggedItems(IItemByName byName, User? user, DtoOptions options) private static IList<BaseItem> GetTaggedItems(IItemByName byName, User user, DtoOptions options)
{ {
return byName.GetTaggedItems( return byName.GetTaggedItems(
new InternalItemsQuery(user) new InternalItemsQuery(user)
@@ -175,7 +177,7 @@ namespace Emby.Server.Implementations.Dto
}); });
} }
private BaseItemDto GetBaseItemDtoInternal(BaseItem item, DtoOptions options, User? user = null, BaseItem? owner = null) private BaseItemDto GetBaseItemDtoInternal(BaseItem item, DtoOptions options, User user = null, BaseItem owner = null)
{ {
var dto = new BaseItemDto var dto = new BaseItemDto
{ {
@@ -290,7 +292,7 @@ namespace Emby.Server.Implementations.Dto
} }
var path = mediaSource.Path; var path = mediaSource.Path;
string? fileExtensionContainer = null; string fileExtensionContainer = null;
if (!string.IsNullOrEmpty(path)) if (!string.IsNullOrEmpty(path))
{ {
@@ -314,8 +316,7 @@ namespace Emby.Server.Implementations.Dto
} }
} }
/// <inheritdoc /> public BaseItemDto GetItemByNameDto(BaseItem item, DtoOptions options, List<BaseItem> taggedItems, User user = null)
public BaseItemDto GetItemByNameDto(BaseItem item, DtoOptions options, List<BaseItem>? taggedItems, User? user = null)
{ {
var dto = GetBaseItemDtoInternal(item, options, user); var dto = GetBaseItemDtoInternal(item, options, user);
@@ -485,10 +486,10 @@ namespace Emby.Server.Implementations.Dto
return images return images
.Select(p => GetImageCacheTag(item, p)) .Select(p => GetImageCacheTag(item, p))
.Where(i => i is not null) .Where(i => i is not null)
.ToArray()!; // null values got filtered out .ToArray();
} }
private string? GetImageCacheTag(BaseItem item, ItemImageInfo image) private string GetImageCacheTag(BaseItem item, ItemImageInfo image)
{ {
try try
{ {
@@ -507,7 +508,7 @@ namespace Emby.Server.Implementations.Dto
/// <param name="dto">The dto.</param> /// <param name="dto">The dto.</param>
/// <param name="item">The item.</param> /// <param name="item">The item.</param>
/// <param name="user">The requesting user.</param> /// <param name="user">The requesting user.</param>
private void AttachPeople(BaseItemDto dto, BaseItem item, User? user = null) private void AttachPeople(BaseItemDto dto, BaseItem item, User user = null)
{ {
// Ordering by person type to ensure actors and artists are at the front. // Ordering by person type to ensure actors and artists are at the front.
// This is taking advantage of the fact that they both begin with A // This is taking advantage of the fact that they both begin with A
@@ -551,7 +552,7 @@ namespace Emby.Server.Implementations.Dto
var list = new List<BaseItemPerson>(); var list = new List<BaseItemPerson>();
Dictionary<string, Person> dictionary = people.Select(p => p.Name) var dictionary = people.Select(p => p.Name)
.Distinct(StringComparer.OrdinalIgnoreCase).Select(c => .Distinct(StringComparer.OrdinalIgnoreCase).Select(c =>
{ {
try try
@@ -564,9 +565,9 @@ namespace Emby.Server.Implementations.Dto
return null; return null;
} }
}).Where(i => i is not null) }).Where(i => i is not null)
.Where(i => user is null || i!.IsVisible(user)) .Where(i => user is null || i.IsVisible(user))
.DistinctBy(x => x!.Name, StringComparer.OrdinalIgnoreCase) .DistinctBy(x => x.Name, StringComparer.OrdinalIgnoreCase)
.ToDictionary(i => i!.Name, StringComparer.OrdinalIgnoreCase)!; // null values got filtered out .ToDictionary(i => i.Name, StringComparer.OrdinalIgnoreCase);
for (var i = 0; i < people.Count; i++) for (var i = 0; i < people.Count; i++)
{ {
@@ -579,7 +580,7 @@ namespace Emby.Server.Implementations.Dto
Type = person.Type Type = person.Type
}; };
if (dictionary.TryGetValue(person.Name, out Person? entity)) if (dictionary.TryGetValue(person.Name, out Person entity))
{ {
baseItemPerson.PrimaryImageTag = GetTagAndFillBlurhash(dto, entity, ImageType.Primary); baseItemPerson.PrimaryImageTag = GetTagAndFillBlurhash(dto, entity, ImageType.Primary);
baseItemPerson.Id = entity.Id; baseItemPerson.Id = entity.Id;
@@ -649,7 +650,7 @@ namespace Emby.Server.Implementations.Dto
return _libraryManager.GetGenreId(name); return _libraryManager.GetGenreId(name);
} }
private string? GetTagAndFillBlurhash(BaseItemDto dto, BaseItem item, ImageType imageType, int imageIndex = 0) private string GetTagAndFillBlurhash(BaseItemDto dto, BaseItem item, ImageType imageType, int imageIndex = 0)
{ {
var image = item.GetImageInfo(imageType, imageIndex); var image = item.GetImageInfo(imageType, imageIndex);
if (image is not null) if (image is not null)
@@ -660,14 +661,9 @@ namespace Emby.Server.Implementations.Dto
return null; return null;
} }
private string? GetTagAndFillBlurhash(BaseItemDto dto, BaseItem item, ItemImageInfo image) private string GetTagAndFillBlurhash(BaseItemDto dto, BaseItem item, ItemImageInfo image)
{ {
var tag = GetImageCacheTag(item, image); var tag = GetImageCacheTag(item, image);
if (tag is null)
{
return null;
}
if (!string.IsNullOrEmpty(image.BlurHash)) if (!string.IsNullOrEmpty(image.BlurHash))
{ {
dto.ImageBlurHashes ??= new Dictionary<ImageType, Dictionary<string, string>>(); dto.ImageBlurHashes ??= new Dictionary<ImageType, Dictionary<string, string>>();
@@ -720,7 +716,7 @@ namespace Emby.Server.Implementations.Dto
/// <param name="item">The item.</param> /// <param name="item">The item.</param>
/// <param name="owner">The owner.</param> /// <param name="owner">The owner.</param>
/// <param name="options">The options.</param> /// <param name="options">The options.</param>
private void AttachBasicFields(BaseItemDto dto, BaseItem item, BaseItem? owner, DtoOptions options) private void AttachBasicFields(BaseItemDto dto, BaseItem item, BaseItem owner, DtoOptions options)
{ {
if (options.ContainsField(ItemFields.DateCreated)) if (options.ContainsField(ItemFields.DateCreated))
{ {
@@ -1101,7 +1097,7 @@ namespace Emby.Server.Implementations.Dto
} }
} }
BaseItem[]? allExtras = null; BaseItem[] allExtras = null;
if (options.ContainsField(ItemFields.SpecialFeatureCount)) if (options.ContainsField(ItemFields.SpecialFeatureCount))
{ {
@@ -1138,7 +1134,7 @@ namespace Emby.Server.Implementations.Dto
dto.SeasonId = episode.SeasonId; dto.SeasonId = episode.SeasonId;
dto.SeriesId = episode.SeriesId; dto.SeriesId = episode.SeriesId;
Series? episodeSeries = null; Series episodeSeries = null;
// this block will add the series poster for episodes without a poster // this block will add the series poster for episodes without a poster
// TODO maybe remove the if statement entirely // TODO maybe remove the if statement entirely
@@ -1166,10 +1162,8 @@ namespace Emby.Server.Implementations.Dto
} }
// Add SeriesInfo // Add SeriesInfo
Series? series; if (item is Series series)
if (item is Series tmp)
{ {
series = tmp;
dto.AirDays = series.AirDays; dto.AirDays = series.AirDays;
dto.AirTime = series.AirTime; dto.AirTime = series.AirTime;
dto.Status = series.Status?.ToString(); dto.Status = series.Status?.ToString();
@@ -1270,7 +1264,7 @@ namespace Emby.Server.Implementations.Dto
} }
} }
private BaseItem? GetImageDisplayParent(BaseItem currentItem, BaseItem originalItem) private BaseItem GetImageDisplayParent(BaseItem currentItem, BaseItem originalItem)
{ {
if (currentItem is MusicAlbum musicAlbum) if (currentItem is MusicAlbum musicAlbum)
{ {
@@ -1291,7 +1285,7 @@ namespace Emby.Server.Implementations.Dto
return parent; return parent;
} }
private void AddInheritedImages(BaseItemDto dto, BaseItem item, DtoOptions options, BaseItem? owner) private void AddInheritedImages(BaseItemDto dto, BaseItem item, DtoOptions options, BaseItem owner)
{ {
if (!item.SupportsInheritedParentImages) if (!item.SupportsInheritedParentImages)
{ {
@@ -1311,7 +1305,7 @@ namespace Emby.Server.Implementations.Dto
return; return;
} }
BaseItem? parent = null; BaseItem parent = null;
var isFirst = true; var isFirst = true;
var imageTags = dto.ImageTags; var imageTags = dto.ImageTags;
@@ -1384,7 +1378,7 @@ namespace Emby.Server.Implementations.Dto
} }
} }
private string GetMappedPath(BaseItem item, BaseItem? ownerItem) private string GetMappedPath(BaseItem item, BaseItem ownerItem)
{ {
var path = item.Path; var path = item.Path;

View File

@@ -1,5 +1,6 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Globalization;
using System.Linq; using System.Linq;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
@@ -133,18 +134,17 @@ namespace Emby.Server.Implementations.EntryPoints
private UserDataChangeInfo GetUserDataChangeInfo(Guid userId, List<BaseItem> changedItems) private UserDataChangeInfo GetUserDataChangeInfo(Guid userId, List<BaseItem> changedItems)
{ {
var user = _userManager.GetUserById(userId) var user = _userManager.GetUserById(userId);
?? throw new ArgumentException("Invalid user ID", nameof(userId));
return new UserDataChangeInfo return new UserDataChangeInfo
{ {
UserId = userId, UserId = userId.ToString("N", CultureInfo.InvariantCulture),
UserDataList = changedItems UserDataList = changedItems
.DistinctBy(x => x.Id) .DistinctBy(x => x.Id)
.Select(i => .Select(i =>
{ {
var dto = _userDataManager.GetUserDataDto(i, user); var dto = _userDataManager.GetUserDataDto(i, user);
dto.ItemId = i.Id; dto.ItemId = i.Id.ToString("N", CultureInfo.InvariantCulture);
return dto; return dto;
}) })
.ToArray() .ToArray()

View File

@@ -314,12 +314,6 @@ namespace Emby.Server.Implementations.IO
var ex = e.GetException(); var ex = e.GetException();
var dw = (FileSystemWatcher)sender; var dw = (FileSystemWatcher)sender;
if (ex is UnauthorizedAccessException unauthorizedAccessException)
{
_logger.LogError(unauthorizedAccessException, "Permission error for Directory watcher: {Path}", dw.Path);
return;
}
_logger.LogError(ex, "Error in Directory watcher for: {Path}", dw.Path); _logger.LogError(ex, "Error in Directory watcher for: {Path}", dw.Path);
DisposeWatcher(dw, true); DisposeWatcher(dw, true);

View File

@@ -149,26 +149,6 @@ namespace Emby.Server.Implementations.IO
} }
} }
/// <inheritdoc />
public void MoveDirectory(string source, string destination)
{
try
{
Directory.Move(source, destination);
}
catch (IOException)
{
// Cross device move requires a copy
Directory.CreateDirectory(destination);
foreach (string file in Directory.GetFiles(source))
{
File.Copy(file, Path.Combine(destination, Path.GetFileName(file)), true);
}
Directory.Delete(source, true);
}
}
/// <summary> /// <summary>
/// Returns a <see cref="FileSystemMetadata"/> object for the specified file or directory path. /// Returns a <see cref="FileSystemMetadata"/> object for the specified file or directory path.
/// </summary> /// </summary>
@@ -347,7 +327,11 @@ namespace Emby.Server.Implementations.IO
} }
} }
/// <inheritdoc /> /// <summary>
/// Gets the creation time UTC.
/// </summary>
/// <param name="path">The path.</param>
/// <returns>DateTime.</returns>
public virtual DateTime GetCreationTimeUtc(string path) public virtual DateTime GetCreationTimeUtc(string path)
{ {
return GetCreationTimeUtc(GetFileSystemInfo(path)); return GetCreationTimeUtc(GetFileSystemInfo(path));
@@ -384,7 +368,11 @@ namespace Emby.Server.Implementations.IO
} }
} }
/// <inheritdoc /> /// <summary>
/// Gets the last write time UTC.
/// </summary>
/// <param name="path">The path.</param>
/// <returns>DateTime.</returns>
public virtual DateTime GetLastWriteTimeUtc(string path) public virtual DateTime GetLastWriteTimeUtc(string path)
{ {
return GetLastWriteTimeUtc(GetFileSystemInfo(path)); return GetLastWriteTimeUtc(GetFileSystemInfo(path));
@@ -458,7 +446,11 @@ namespace Emby.Server.Implementations.IO
File.SetAttributes(path, attributes); File.SetAttributes(path, attributes);
} }
/// <inheritdoc /> /// <summary>
/// Swaps the files.
/// </summary>
/// <param name="file1">The file1.</param>
/// <param name="file2">The file2.</param>
public virtual void SwapFiles(string file1, string file2) public virtual void SwapFiles(string file1, string file2)
{ {
ArgumentException.ThrowIfNullOrEmpty(file1); ArgumentException.ThrowIfNullOrEmpty(file1);
@@ -474,7 +466,7 @@ namespace Emby.Server.Implementations.IO
File.Copy(file1, temp1, true); File.Copy(file1, temp1, true);
File.Copy(file2, file1, true); File.Copy(file2, file1, true);
File.Move(temp1, file2, true); File.Copy(temp1, file2, true);
} }
/// <inheritdoc /> /// <inheritdoc />

View File

@@ -122,7 +122,6 @@ namespace Emby.Server.Implementations.Images
} }
await ProviderManager.SaveImage(item, outputPath, mimeType, imageType, null, false, cancellationToken).ConfigureAwait(false); await ProviderManager.SaveImage(item, outputPath, mimeType, imageType, null, false, cancellationToken).ConfigureAwait(false);
File.Delete(outputPath);
return ItemUpdateType.ImageUpdate; return ItemUpdateType.ImageUpdate;
} }

View File

@@ -50,10 +50,6 @@ namespace Emby.Server.Implementations.Library
"**/lost+found/**", "**/lost+found/**",
"**/lost+found", "**/lost+found",
// Trickplay files
"**/*.trickplay",
"**/*.trickplay/**",
// WMC temp recording directories that will constantly be written to // WMC temp recording directories that will constantly be written to
"**/TempRec/**", "**/TempRec/**",
"**/TempRec", "**/TempRec",

View File

@@ -1,5 +1,4 @@
#pragma warning disable CS1591 #pragma warning disable CS1591
#pragma warning disable CA5394
using System; using System;
using System.Collections.Concurrent; using System.Collections.Concurrent;
@@ -17,7 +16,6 @@ using Emby.Server.Implementations.Library.Resolvers;
using Emby.Server.Implementations.Library.Validators; using Emby.Server.Implementations.Library.Validators;
using Emby.Server.Implementations.Playlists; using Emby.Server.Implementations.Playlists;
using Emby.Server.Implementations.ScheduledTasks.Tasks; using Emby.Server.Implementations.ScheduledTasks.Tasks;
using Emby.Server.Implementations.Sorting;
using Jellyfin.Data.Entities; using Jellyfin.Data.Entities;
using Jellyfin.Data.Enums; using Jellyfin.Data.Enums;
using Jellyfin.Extensions; using Jellyfin.Extensions;
@@ -669,7 +667,7 @@ namespace Emby.Server.Implementations.Library
if (parent is not null) if (parent is not null)
{ {
var multiItemResolvers = resolvers is null ? MultiItemResolvers : resolvers.OfType<IMultiItemResolver>(); var multiItemResolvers = resolvers is null ? MultiItemResolvers : resolvers.OfType<IMultiItemResolver>().ToArray();
foreach (var resolver in multiItemResolvers) foreach (var resolver in multiItemResolvers)
{ {
@@ -1530,7 +1528,7 @@ namespace Emby.Server.Implementations.Library
{ {
var userViews = UserViewManager.GetUserViews(new UserViewQuery var userViews = UserViewManager.GetUserViews(new UserViewQuery
{ {
User = user, UserId = user.Id,
IncludeHidden = true, IncludeHidden = true,
IncludeExternalContent = allowExternalContent IncludeExternalContent = allowExternalContent
}); });
@@ -1712,19 +1710,13 @@ namespace Emby.Server.Implementations.Library
/// <inheritdoc /> /// <inheritdoc />
public IEnumerable<BaseItem> Sort(IEnumerable<BaseItem> items, User? user, IEnumerable<ItemSortBy> sortBy, SortOrder sortOrder) public IEnumerable<BaseItem> Sort(IEnumerable<BaseItem> items, User? user, IEnumerable<ItemSortBy> sortBy, SortOrder sortOrder)
{ {
var isFirst = true;
IOrderedEnumerable<BaseItem>? orderedItems = null; IOrderedEnumerable<BaseItem>? orderedItems = null;
foreach (var orderBy in sortBy.Select(o => GetComparer(o, user)).Where(c => c is not null)) foreach (var orderBy in sortBy.Select(o => GetComparer(o, user)).Where(c => c is not null))
{ {
if (orderBy is RandomComparer) if (isFirst)
{
var randomItems = items.ToArray();
Random.Shared.Shuffle(randomItems);
items = randomItems;
// Items are no longer ordered at this point, so set orderedItems back to null
orderedItems = null;
}
else if (orderedItems is null)
{ {
orderedItems = sortOrder == SortOrder.Descending orderedItems = sortOrder == SortOrder.Descending
? items.OrderByDescending(i => i, orderBy) ? items.OrderByDescending(i => i, orderBy)
@@ -1736,6 +1728,8 @@ namespace Emby.Server.Implementations.Library
? orderedItems!.ThenByDescending(i => i, orderBy) ? orderedItems!.ThenByDescending(i => i, orderBy)
: orderedItems!.ThenBy(i => i, orderBy); // orderedItems is set during the first iteration : orderedItems!.ThenBy(i => i, orderBy); // orderedItems is set during the first iteration
} }
isFirst = false;
} }
return orderedItems ?? items; return orderedItems ?? items;
@@ -1744,6 +1738,8 @@ namespace Emby.Server.Implementations.Library
/// <inheritdoc /> /// <inheritdoc />
public IEnumerable<BaseItem> Sort(IEnumerable<BaseItem> items, User? user, IEnumerable<(ItemSortBy OrderBy, SortOrder SortOrder)> orderBy) public IEnumerable<BaseItem> Sort(IEnumerable<BaseItem> items, User? user, IEnumerable<(ItemSortBy OrderBy, SortOrder SortOrder)> orderBy)
{ {
var isFirst = true;
IOrderedEnumerable<BaseItem>? orderedItems = null; IOrderedEnumerable<BaseItem>? orderedItems = null;
foreach (var (name, sortOrder) in orderBy) foreach (var (name, sortOrder) in orderBy)
@@ -1754,15 +1750,7 @@ namespace Emby.Server.Implementations.Library
continue; continue;
} }
if (comparer is RandomComparer) if (isFirst)
{
var randomItems = items.ToArray();
Random.Shared.Shuffle(randomItems);
items = randomItems;
// Items are no longer ordered at this point, so set orderedItems back to null
orderedItems = null;
}
else if (orderedItems is null)
{ {
orderedItems = sortOrder == SortOrder.Descending orderedItems = sortOrder == SortOrder.Descending
? items.OrderByDescending(i => i, comparer) ? items.OrderByDescending(i => i, comparer)
@@ -1774,6 +1762,8 @@ namespace Emby.Server.Implementations.Library
? orderedItems!.ThenByDescending(i => i, comparer) ? orderedItems!.ThenByDescending(i => i, comparer)
: orderedItems!.ThenBy(i => i, comparer); // orderedItems is set during the first iteration : orderedItems!.ThenBy(i => i, comparer); // orderedItems is set during the first iteration
} }
isFirst = false;
} }
return orderedItems ?? items; return orderedItems ?? items;
@@ -2725,9 +2715,33 @@ namespace Emby.Server.Implementations.Library
public string GetPathAfterNetworkSubstitution(string path, BaseItem? ownerItem) public string GetPathAfterNetworkSubstitution(string path, BaseItem? ownerItem)
{ {
string? newPath;
if (ownerItem is not null)
{
var libraryOptions = GetLibraryOptions(ownerItem);
if (libraryOptions is not null)
{
foreach (var pathInfo in libraryOptions.PathInfos)
{
if (path.TryReplaceSubPath(pathInfo.Path, pathInfo.NetworkPath, out newPath))
{
return newPath;
}
}
}
}
var metadataPath = _configurationManager.Configuration.MetadataPath;
var metadataNetworkPath = _configurationManager.Configuration.MetadataNetworkPath;
if (path.TryReplaceSubPath(metadataPath, metadataNetworkPath, out newPath))
{
return newPath;
}
foreach (var map in _configurationManager.Configuration.PathSubstitutions) foreach (var map in _configurationManager.Configuration.PathSubstitutions)
{ {
if (path.TryReplaceSubPath(map.From, map.To, out var newPath)) if (path.TryReplaceSubPath(map.From, map.To, out newPath))
{ {
return newPath; return newPath;
} }
@@ -3046,6 +3060,15 @@ namespace Emby.Server.Implementations.Library
SyncLibraryOptionsToLocations(virtualFolderPath, libraryOptions); SyncLibraryOptionsToLocations(virtualFolderPath, libraryOptions);
foreach (var originalPathInfo in libraryOptions.PathInfos)
{
if (string.Equals(mediaPath.Path, originalPathInfo.Path, StringComparison.Ordinal))
{
originalPathInfo.NetworkPath = mediaPath.NetworkPath;
break;
}
}
CollectionFolder.SaveLibraryOptions(virtualFolderPath, libraryOptions); CollectionFolder.SaveLibraryOptions(virtualFolderPath, libraryOptions);
} }

View File

@@ -113,11 +113,6 @@ namespace Emby.Server.Implementations.Library
return true; return true;
} }
if (stream.IsPgsSubtitleStream)
{
return true;
}
return false; return false;
} }
@@ -379,8 +374,7 @@ namespace Emby.Server.Implementations.Library
private void SetDefaultSubtitleStreamIndex(MediaSourceInfo source, UserItemData userData, User user, bool allowRememberingSelection) private void SetDefaultSubtitleStreamIndex(MediaSourceInfo source, UserItemData userData, User user, bool allowRememberingSelection)
{ {
if (userData is not null if (userData.SubtitleStreamIndex.HasValue
&& userData.SubtitleStreamIndex.HasValue
&& user.RememberSubtitleSelections && user.RememberSubtitleSelections
&& user.SubtitleMode != SubtitlePlaybackMode.None && user.SubtitleMode != SubtitlePlaybackMode.None
&& allowRememberingSelection) && allowRememberingSelection)
@@ -412,7 +406,7 @@ namespace Emby.Server.Implementations.Library
private void SetDefaultAudioStreamIndex(MediaSourceInfo source, UserItemData userData, User user, bool allowRememberingSelection) private void SetDefaultAudioStreamIndex(MediaSourceInfo source, UserItemData userData, User user, bool allowRememberingSelection)
{ {
if (userData is not null && userData.AudioStreamIndex.HasValue && user.RememberAudioSelections && allowRememberingSelection) if (userData.AudioStreamIndex.HasValue && user.RememberAudioSelections && allowRememberingSelection)
{ {
var index = userData.AudioStreamIndex.Value; var index = userData.AudioStreamIndex.Value;
// Make sure the saved index is still valid // Make sure the saved index is still valid
@@ -435,7 +429,7 @@ namespace Emby.Server.Implementations.Library
if (mediaType == MediaType.Video) if (mediaType == MediaType.Video)
{ {
var userData = item is null ? null : _userDataManager.GetUserData(user, item); var userData = item is null ? new UserItemData() : _userDataManager.GetUserData(user, item);
var allowRememberingSelection = item is null || item.EnableRememberingTrackSelections; var allowRememberingSelection = item is null || item.EnableRememberingTrackSelections;

View File

@@ -39,7 +39,7 @@ namespace Emby.Server.Implementations.Library
item.GetParents().Any(i => i.IsLocked); item.GetParents().Any(i => i.IsLocked);
// Make sure DateCreated and DateModified have values // Make sure DateCreated and DateModified have values
var fileInfo = directoryService.GetFileSystemEntry(item.Path); var fileInfo = directoryService.GetFile(item.Path);
if (fileInfo is null) if (fileInfo is null)
{ {
return false; return false;

View File

@@ -68,7 +68,11 @@ namespace Emby.Server.Implementations.Library.Resolvers.Movies
var justName = Path.GetFileName(item.Path.AsSpan()); var justName = Path.GetFileName(item.Path.AsSpan());
var id = justName.GetAttributeValue("tmdbid"); var id = justName.GetAttributeValue("tmdbid");
item.TrySetProviderId(MetadataProvider.Tmdb, id);
if (!string.IsNullOrEmpty(id))
{
item.SetProviderId(MetadataProvider.Tmdb, id);
}
} }
} }
} }

View File

@@ -373,14 +373,22 @@ namespace Emby.Server.Implementations.Library.Resolvers.Movies
{ {
// Check for TMDb id // Check for TMDb id
var tmdbid = justName.GetAttributeValue("tmdbid"); var tmdbid = justName.GetAttributeValue("tmdbid");
item.TrySetProviderId(MetadataProvider.Tmdb, tmdbid);
if (!string.IsNullOrWhiteSpace(tmdbid))
{
item.SetProviderId(MetadataProvider.Tmdb, tmdbid);
}
} }
if (!string.IsNullOrEmpty(item.Path)) if (!string.IsNullOrEmpty(item.Path))
{ {
// Check for IMDb id - we use full media path, as we can assume that this will match in any use case (whether id in parent dir or in file name) // Check for IMDb id - we use full media path, as we can assume that this will match in any use case (whether id in parent dir or in file name)
var imdbid = item.Path.AsSpan().GetAttributeValue("imdbid"); var imdbid = item.Path.AsSpan().GetAttributeValue("imdbid");
item.TrySetProviderId(MetadataProvider.Imdb, imdbid);
if (!string.IsNullOrWhiteSpace(imdbid))
{
item.SetProviderId(MetadataProvider.Imdb, imdbid);
}
} }
} }
} }

View File

@@ -186,25 +186,46 @@ namespace Emby.Server.Implementations.Library.Resolvers.TV
var justName = Path.GetFileName(path.AsSpan()); var justName = Path.GetFileName(path.AsSpan());
var imdbId = justName.GetAttributeValue("imdbid"); var imdbId = justName.GetAttributeValue("imdbid");
item.TrySetProviderId(MetadataProvider.Imdb, imdbId); if (!string.IsNullOrEmpty(imdbId))
{
item.SetProviderId(MetadataProvider.Imdb, imdbId);
}
var tvdbId = justName.GetAttributeValue("tvdbid"); var tvdbId = justName.GetAttributeValue("tvdbid");
item.TrySetProviderId(MetadataProvider.Tvdb, tvdbId); if (!string.IsNullOrEmpty(tvdbId))
{
item.SetProviderId(MetadataProvider.Tvdb, tvdbId);
}
var tvmazeId = justName.GetAttributeValue("tvmazeid"); var tvmazeId = justName.GetAttributeValue("tvmazeid");
item.TrySetProviderId(MetadataProvider.TvMaze, tvmazeId); if (!string.IsNullOrEmpty(tvmazeId))
{
item.SetProviderId(MetadataProvider.TvMaze, tvmazeId);
}
var tmdbId = justName.GetAttributeValue("tmdbid"); var tmdbId = justName.GetAttributeValue("tmdbid");
item.TrySetProviderId(MetadataProvider.Tmdb, tmdbId); if (!string.IsNullOrEmpty(tmdbId))
{
item.SetProviderId(MetadataProvider.Tmdb, tmdbId);
}
var anidbId = justName.GetAttributeValue("anidbid"); var anidbId = justName.GetAttributeValue("anidbid");
item.TrySetProviderId("AniDB", anidbId); if (!string.IsNullOrEmpty(anidbId))
{
item.SetProviderId("AniDB", anidbId);
}
var aniListId = justName.GetAttributeValue("anilistid"); var aniListId = justName.GetAttributeValue("anilistid");
item.TrySetProviderId("AniList", aniListId); if (!string.IsNullOrEmpty(aniListId))
{
item.SetProviderId("AniList", aniListId);
}
var aniSearchId = justName.GetAttributeValue("anisearchid"); var aniSearchId = justName.GetAttributeValue("anisearchid");
item.TrySetProviderId("AniSearch", aniSearchId); if (!string.IsNullOrEmpty(aniSearchId))
{
item.SetProviderId("AniSearch", aniSearchId);
}
} }
} }
} }

View File

@@ -1,7 +1,10 @@
#nullable disable
#pragma warning disable CS1591
using System; using System;
using System.Collections.Concurrent; using System.Collections.Concurrent;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics;
using System.Globalization; using System.Globalization;
using System.Threading; using System.Threading;
using Jellyfin.Data.Entities; using Jellyfin.Data.Entities;
@@ -29,12 +32,6 @@ namespace Emby.Server.Implementations.Library
private readonly IUserManager _userManager; private readonly IUserManager _userManager;
private readonly IUserDataRepository _repository; private readonly IUserDataRepository _repository;
/// <summary>
/// Initializes a new instance of the <see cref="UserDataManager"/> class.
/// </summary>
/// <param name="config">Instance of the <see cref="IServerConfigurationManager"/> interface.</param>
/// <param name="userManager">Instance of the <see cref="IUserManager"/> interface.</param>
/// <param name="repository">Instance of the <see cref="IUserDataRepository"/> interface.</param>
public UserDataManager( public UserDataManager(
IServerConfigurationManager config, IServerConfigurationManager config,
IUserManager userManager, IUserManager userManager,
@@ -45,10 +42,15 @@ namespace Emby.Server.Implementations.Library
_repository = repository; _repository = repository;
} }
/// <inheritdoc /> public event EventHandler<UserDataSaveEventArgs> UserDataSaved;
public event EventHandler<UserDataSaveEventArgs>? UserDataSaved;
public void SaveUserData(Guid userId, BaseItem item, UserItemData userData, UserDataSaveReason reason, CancellationToken cancellationToken)
{
var user = _userManager.GetUserById(userId);
SaveUserData(user, item, userData, reason, cancellationToken);
}
/// <inheritdoc />
public void SaveUserData(User user, BaseItem item, UserItemData userData, UserDataSaveReason reason, CancellationToken cancellationToken) public void SaveUserData(User user, BaseItem item, UserItemData userData, UserDataSaveReason reason, CancellationToken cancellationToken)
{ {
ArgumentNullException.ThrowIfNull(userData); ArgumentNullException.ThrowIfNull(userData);
@@ -79,7 +81,6 @@ namespace Emby.Server.Implementations.Library
}); });
} }
/// <inheritdoc />
public void SaveUserData(User user, BaseItem item, UpdateUserItemDataDto userDataDto, UserDataSaveReason reason) public void SaveUserData(User user, BaseItem item, UpdateUserItemDataDto userDataDto, UserDataSaveReason reason)
{ {
ArgumentNullException.ThrowIfNull(user); ArgumentNullException.ThrowIfNull(user);
@@ -127,7 +128,39 @@ namespace Emby.Server.Implementations.Library
SaveUserData(user, item, userData, reason, CancellationToken.None); SaveUserData(user, item, userData, reason, CancellationToken.None);
} }
private UserItemData GetUserData(User user, Guid itemId, List<string> keys) /// <summary>
/// Save the provided user data for the given user. Batch operation. Does not fire any events or update the cache.
/// </summary>
/// <param name="userId">The user id.</param>
/// <param name="userData">The user item data.</param>
/// <param name="cancellationToken">The cancellation token.</param>
public void SaveAllUserData(Guid userId, UserItemData[] userData, CancellationToken cancellationToken)
{
var user = _userManager.GetUserById(userId);
_repository.SaveAllUserData(user.InternalId, userData, cancellationToken);
}
/// <summary>
/// Retrieve all user data for the given user.
/// </summary>
/// <param name="userId">The user id.</param>
/// <returns>A <see cref="List{UserItemData}"/> containing all of the user's item data.</returns>
public List<UserItemData> GetAllUserData(Guid userId)
{
var user = _userManager.GetUserById(userId);
return _repository.GetAllUserData(user.InternalId);
}
public UserItemData GetUserData(Guid userId, Guid itemId, List<string> keys)
{
var user = _userManager.GetUserById(userId);
return GetUserData(user, itemId, keys);
}
public UserItemData GetUserData(User user, Guid itemId, List<string> keys)
{ {
var userId = user.InternalId; var userId = user.InternalId;
@@ -153,7 +186,7 @@ namespace Emby.Server.Implementations.Library
}; };
} }
throw new UnreachableException(); return null;
} }
/// <summary> /// <summary>
@@ -165,18 +198,27 @@ namespace Emby.Server.Implementations.Library
return internalUserId.ToString(CultureInfo.InvariantCulture) + "-" + itemId.ToString("N", CultureInfo.InvariantCulture); return internalUserId.ToString(CultureInfo.InvariantCulture) + "-" + itemId.ToString("N", CultureInfo.InvariantCulture);
} }
/// <inheritdoc />
public UserItemData GetUserData(User user, BaseItem item) public UserItemData GetUserData(User user, BaseItem item)
{ {
return GetUserData(user, item.Id, item.GetUserDataKeys()); return GetUserData(user, item.Id, item.GetUserDataKeys());
} }
/// <inheritdoc /> public UserItemData GetUserData(Guid userId, BaseItem item)
{
return GetUserData(userId, item.Id, item.GetUserDataKeys());
}
public UserItemDataDto GetUserDataDto(BaseItem item, User user) public UserItemDataDto GetUserDataDto(BaseItem item, User user)
=> GetUserDataDto(item, null, user, new DtoOptions()); {
var userData = GetUserData(user, item);
var dto = GetUserItemDataDto(userData);
item.FillUserDataDtoValues(dto, userData, null, user, new DtoOptions());
return dto;
}
/// <inheritdoc /> /// <inheritdoc />
public UserItemDataDto GetUserDataDto(BaseItem item, BaseItemDto? itemDto, User user, DtoOptions options) public UserItemDataDto GetUserDataDto(BaseItem item, BaseItemDto itemDto, User user, DtoOptions options)
{ {
var userData = GetUserData(user, item); var userData = GetUserData(user, item);
var dto = GetUserItemDataDto(userData); var dto = GetUserItemDataDto(userData);

View File

@@ -16,6 +16,7 @@ using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Library; using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.LiveTv; using MediaBrowser.Controller.LiveTv;
using MediaBrowser.Model.Channels; using MediaBrowser.Model.Channels;
using MediaBrowser.Model.Entities;
using MediaBrowser.Model.Globalization; using MediaBrowser.Model.Globalization;
using MediaBrowser.Model.Library; using MediaBrowser.Model.Library;
using MediaBrowser.Model.Querying; using MediaBrowser.Model.Querying;
@@ -26,15 +27,17 @@ namespace Emby.Server.Implementations.Library
{ {
private readonly ILibraryManager _libraryManager; private readonly ILibraryManager _libraryManager;
private readonly ILocalizationManager _localizationManager; private readonly ILocalizationManager _localizationManager;
private readonly IUserManager _userManager;
private readonly IChannelManager _channelManager; private readonly IChannelManager _channelManager;
private readonly ILiveTvManager _liveTvManager; private readonly ILiveTvManager _liveTvManager;
private readonly IServerConfigurationManager _config; private readonly IServerConfigurationManager _config;
public UserViewManager(ILibraryManager libraryManager, ILocalizationManager localizationManager, IChannelManager channelManager, ILiveTvManager liveTvManager, IServerConfigurationManager config) public UserViewManager(ILibraryManager libraryManager, ILocalizationManager localizationManager, IUserManager userManager, IChannelManager channelManager, ILiveTvManager liveTvManager, IServerConfigurationManager config)
{ {
_libraryManager = libraryManager; _libraryManager = libraryManager;
_localizationManager = localizationManager; _localizationManager = localizationManager;
_userManager = userManager;
_channelManager = channelManager; _channelManager = channelManager;
_liveTvManager = liveTvManager; _liveTvManager = liveTvManager;
_config = config; _config = config;
@@ -42,7 +45,11 @@ namespace Emby.Server.Implementations.Library
public Folder[] GetUserViews(UserViewQuery query) public Folder[] GetUserViews(UserViewQuery query)
{ {
var user = query.User; var user = _userManager.GetUserById(query.UserId);
if (user is null)
{
throw new ArgumentException("User id specified in the query does not exist.", nameof(query));
}
var folders = _libraryManager.GetUserRootFolder() var folders = _libraryManager.GetUserRootFolder()
.GetChildren(user, true) .GetChildren(user, true)
@@ -118,14 +125,14 @@ namespace Emby.Server.Implementations.Library
{ {
var channelResult = _channelManager.GetChannelsInternalAsync(new ChannelQuery var channelResult = _channelManager.GetChannelsInternalAsync(new ChannelQuery
{ {
UserId = user.Id UserId = query.UserId
}).GetAwaiter().GetResult(); }).GetAwaiter().GetResult();
var channels = channelResult.Items; var channels = channelResult.Items;
list.AddRange(channels); list.AddRange(channels);
if (_liveTvManager.GetEnabledUsers().Select(i => i.Id).Contains(user.Id)) if (_liveTvManager.GetEnabledUsers().Select(i => i.Id).Contains(query.UserId))
{ {
list.Add(_liveTvManager.GetInternalLiveTvFolder(CancellationToken.None)); list.Add(_liveTvManager.GetInternalLiveTvFolder(CancellationToken.None));
} }
@@ -200,7 +207,9 @@ namespace Emby.Server.Implementations.Library
public List<Tuple<BaseItem, List<BaseItem>>> GetLatestItems(LatestItemsQuery request, DtoOptions options) public List<Tuple<BaseItem, List<BaseItem>>> GetLatestItems(LatestItemsQuery request, DtoOptions options)
{ {
var libraryItems = GetItemsForLatestItems(request.User, request, options); var user = _userManager.GetUserById(request.UserId);
var libraryItems = GetItemsForLatestItems(user, request, options);
var list = new List<Tuple<BaseItem, List<BaseItem>>>(); var list = new List<Tuple<BaseItem, List<BaseItem>>>();

View File

@@ -1,3 +1 @@
{ {}
"Albums": "аальбомқәа"
}

View File

@@ -5,12 +5,12 @@
"Favorites": "Gunstelinge", "Favorites": "Gunstelinge",
"HeaderFavoriteShows": "Gunsteling Vertonings", "HeaderFavoriteShows": "Gunsteling Vertonings",
"ValueSpecialEpisodeName": "Spesiale - {0}", "ValueSpecialEpisodeName": "Spesiale - {0}",
"HeaderAlbumArtists": "Album kunstenaars", "HeaderAlbumArtists": "Kunstenaars se Album",
"Books": "Boeke", "Books": "Boeke",
"HeaderNextUp": "Volgende", "HeaderNextUp": "Volgende",
"Movies": "Flieks", "Movies": "Flieks",
"Shows": "Televisie Reekse", "Shows": "Televisie Reekse",
"HeaderContinueWatching": "Hou aan kyk", "HeaderContinueWatching": "Kyk Verder",
"HeaderFavoriteEpisodes": "Gunsteling Episodes", "HeaderFavoriteEpisodes": "Gunsteling Episodes",
"Photos": "Foto's", "Photos": "Foto's",
"Playlists": "Snitlyste", "Playlists": "Snitlyste",
@@ -19,7 +19,7 @@
"Sync": "Sinkroniseer", "Sync": "Sinkroniseer",
"HeaderFavoriteSongs": "Gunsteling Liedjies", "HeaderFavoriteSongs": "Gunsteling Liedjies",
"Songs": "Liedjies", "Songs": "Liedjies",
"DeviceOnlineWithName": "{0} is aanlyn", "DeviceOnlineWithName": "{0} is gekoppel",
"DeviceOfflineWithName": "{0} is ontkoppel", "DeviceOfflineWithName": "{0} is ontkoppel",
"Collections": "Versamelings", "Collections": "Versamelings",
"Inherit": "Ontvang", "Inherit": "Ontvang",
@@ -61,7 +61,7 @@
"NotificationOptionPluginInstalled": "Inprop module geïnstalleer", "NotificationOptionPluginInstalled": "Inprop module geïnstalleer",
"NotificationOptionPluginError": "Inprop module het misluk", "NotificationOptionPluginError": "Inprop module het misluk",
"NotificationOptionNewLibraryContent": "Nuwe inhoud bygevoeg", "NotificationOptionNewLibraryContent": "Nuwe inhoud bygevoeg",
"NotificationOptionInstallationFailed": "Installasie mislukking", "NotificationOptionInstallationFailed": "Installering het misluk",
"NotificationOptionCameraImageUploaded": "Kamera foto is opgelaai", "NotificationOptionCameraImageUploaded": "Kamera foto is opgelaai",
"NotificationOptionAudioPlaybackStopped": "Oudio terugspeel het gestop", "NotificationOptionAudioPlaybackStopped": "Oudio terugspeel het gestop",
"NotificationOptionAudioPlayback": "Oudio terugspeel het begin", "NotificationOptionAudioPlayback": "Oudio terugspeel het begin",
@@ -86,9 +86,9 @@
"HomeVideos": "Tuis Videos", "HomeVideos": "Tuis Videos",
"HeaderRecordingGroups": "Groep Opnames", "HeaderRecordingGroups": "Groep Opnames",
"Genres": "Genres", "Genres": "Genres",
"FailedLoginAttemptWithUserName": "Mislukte aanmeldpoging van {0}", "FailedLoginAttemptWithUserName": "Mislukte aansluiting van {0}",
"ChapterNameValue": "Hoofstuk {0}", "ChapterNameValue": "Hoofstuk {0}",
"CameraImageUploadedFrom": "'n Nuwe kamera foto is opgelaai vanaf {0}", "CameraImageUploadedFrom": "'n Nuwe kamera photo opgelaai van {0}",
"AuthenticationSucceededWithUserName": "{0} suksesvol geverifieer", "AuthenticationSucceededWithUserName": "{0} suksesvol geverifieer",
"Albums": "Albums", "Albums": "Albums",
"TasksChannelsCategory": "Internet kanale", "TasksChannelsCategory": "Internet kanale",
@@ -114,8 +114,8 @@
"TaskRefreshChapterImagesDescription": "Maak kleinkiekeis (fotos) vir films wat hoofstukke het.", "TaskRefreshChapterImagesDescription": "Maak kleinkiekeis (fotos) vir films wat hoofstukke het.",
"TaskRefreshChapterImages": "Verkry Hoofstuk Beelde", "TaskRefreshChapterImages": "Verkry Hoofstuk Beelde",
"Undefined": "Ongedefineerd", "Undefined": "Ongedefineerd",
"Forced": "Geforseerd", "Forced": "Geforseer",
"Default": "Standaard", "Default": "Oorspronklik",
"TaskCleanActivityLogDescription": "Verwyder aktiwiteitsaantekeninge ouer as die opgestelde ouderdom.", "TaskCleanActivityLogDescription": "Verwyder aktiwiteitsaantekeninge ouer as die opgestelde ouderdom.",
"TaskCleanActivityLog": "Maak Aktiwiteitsaantekeninge Skoon", "TaskCleanActivityLog": "Maak Aktiwiteitsaantekeninge Skoon",
"TaskOptimizeDatabaseDescription": "Komprimeer databasis en verkort vrye ruimte. As hierdie taak uitgevoer word nadat die media versameling geskandeer is of ander veranderings aangebring is wat databasisaanpassings impliseer, kan dit die prestasie verbeter.", "TaskOptimizeDatabaseDescription": "Komprimeer databasis en verkort vrye ruimte. As hierdie taak uitgevoer word nadat die media versameling geskandeer is of ander veranderings aangebring is wat databasisaanpassings impliseer, kan dit die prestasie verbeter.",
@@ -125,9 +125,5 @@
"External": "Ekstern", "External": "Ekstern",
"HearingImpaired": "gehoorgestremd", "HearingImpaired": "gehoorgestremd",
"TaskRefreshTrickplayImages": "Genereer Fopspeel Beelde", "TaskRefreshTrickplayImages": "Genereer Fopspeel Beelde",
"TaskRefreshTrickplayImagesDescription": "Skep fopspeel voorskou vir videos in aangeskakelde media versameling.", "TaskRefreshTrickplayImagesDescription": "Skep fopspeel voorskou vir videos in aangeskakelde media versameling."
"TaskAudioNormalizationDescription": "Skandeer lêers vir oudio-normaliseringsdata.",
"TaskAudioNormalization": "Odio Normalisering",
"TaskCleanCollectionsAndPlaylists": "Maak versamelings en snitlyste skoon",
"TaskCleanCollectionsAndPlaylistsDescription": "Verwyder items uit versamelings en snitlyste wat nie meer bestaan nie."
} }

View File

@@ -1,17 +1,17 @@
{ {
"Albums": "ألبومات", "Albums": "البومات",
"AppDeviceValues": "تطبيق: {0}, جهاز: {1}", "AppDeviceValues": "تطبيق: {0}, جهاز: {1}",
"Application": "تطبيق", "Application": "تطبيق",
"Artists": "الفنانون", "Artists": "الفنانين",
"AuthenticationSucceededWithUserName": "نجحت عملية التوثيق بـ {0}", "AuthenticationSucceededWithUserName": "نجحت عملية التوثيق بـ {0}",
"Books": "الكتب", "Books": "الكتب",
"CameraImageUploadedFrom": "رُفعت صورة الكاميرا الجديدة من {0}", "CameraImageUploadedFrom": "رُفعت صورة الكاميرا الجديدة من {0}",
"Channels": "القنوات", "Channels": "القنوات",
"ChapterNameValue": "الفصل {0}", "ChapterNameValue": "الفصل {0}",
"Collections": "المجموعات", "Collections": "التجميعات",
"DeviceOfflineWithName": "قُطِع الاتصال ب{0}", "DeviceOfflineWithName": "قُطِع الاتصال ب{0}",
"DeviceOnlineWithName": "{0} متصل", "DeviceOnlineWithName": "{0} متصل",
"FailedLoginAttemptWithUserName": "محاولة تسجيل الدخول فاشلة من {0}", "FailedLoginAttemptWithUserName": "محاولة تسجيل الدخول فشلت من {0}",
"Favorites": "المفضلة", "Favorites": "المفضلة",
"Folders": "المجلدات", "Folders": "المجلدات",
"Genres": "التصنيفات", "Genres": "التصنيفات",
@@ -130,6 +130,5 @@
"TaskCleanCollectionsAndPlaylists": "حذف المجموعات وقوائم التشغيل", "TaskCleanCollectionsAndPlaylists": "حذف المجموعات وقوائم التشغيل",
"TaskCleanCollectionsAndPlaylistsDescription": "حذف عناصر من المجموعات وقوائم التشغيل التي لم تعد موجودة.", "TaskCleanCollectionsAndPlaylistsDescription": "حذف عناصر من المجموعات وقوائم التشغيل التي لم تعد موجودة.",
"TaskAudioNormalization": "تطبيع الصوت", "TaskAudioNormalization": "تطبيع الصوت",
"TaskAudioNormalizationDescription": "مسح الملفات لتطبيع بيانات الصوت.", "TaskAudioNormalizationDescription": "مسح الملفات لتطبيع بيانات الصوت."
"TaskDownloadMissingLyrics": "تنزيل عبارات القصيدة"
} }

View File

@@ -52,7 +52,7 @@
"UserDownloadingItemWithValues": "{0} спампоўваецца {1}", "UserDownloadingItemWithValues": "{0} спампоўваецца {1}",
"TaskOptimizeDatabase": "Аптымізаваць базу дадзеных", "TaskOptimizeDatabase": "Аптымізаваць базу дадзеных",
"Artists": "Выканаўцы", "Artists": "Выканаўцы",
"UserOfflineFromDevice": "{0} адлучыўся ад {1}", "UserOfflineFromDevice": "{0} адключыўся ад {1}",
"UserPolicyUpdatedWithName": "Палітыка карыстальніка абноўлена для {0}", "UserPolicyUpdatedWithName": "Палітыка карыстальніка абноўлена для {0}",
"TaskCleanActivityLogDescription": "Выдаляе старэйшыя за зададзены ўзрост запісы ў журнале актыўнасці.", "TaskCleanActivityLogDescription": "Выдаляе старэйшыя за зададзены ўзрост запісы ў журнале актыўнасці.",
"TaskRefreshChapterImagesDescription": "Стварае мініяцюры для відэа, якія маюць раздзелы.", "TaskRefreshChapterImagesDescription": "Стварае мініяцюры для відэа, якія маюць раздзелы.",
@@ -66,7 +66,7 @@
"AppDeviceValues": "Прыкладанне: {0}, Прылада: {1}", "AppDeviceValues": "Прыкладанне: {0}, Прылада: {1}",
"Books": "Кнігі", "Books": "Кнігі",
"CameraImageUploadedFrom": "Новая выява камеры была загружана з {0}", "CameraImageUploadedFrom": "Новая выява камеры была загружана з {0}",
"DeviceOfflineWithName": "{0} адлучыўся", "DeviceOfflineWithName": "{0} адключыўся",
"DeviceOnlineWithName": "{0} падлучаны", "DeviceOnlineWithName": "{0} падлучаны",
"Forced": "Прымусова", "Forced": "Прымусова",
"HeaderRecordingGroups": "Групы запісаў", "HeaderRecordingGroups": "Групы запісаў",
@@ -127,13 +127,5 @@
"TaskRefreshTrickplayImages": "Стварыце выявы Trickplay", "TaskRefreshTrickplayImages": "Стварыце выявы Trickplay",
"TaskRefreshTrickplayImagesDescription": "Стварае прагляд відэаролікаў для Trickplay у падключаных бібліятэках.", "TaskRefreshTrickplayImagesDescription": "Стварае прагляд відэаролікаў для Trickplay у падключаных бібліятэках.",
"TaskCleanCollectionsAndPlaylists": "Ачысціце калекцыі і спісы прайгравання", "TaskCleanCollectionsAndPlaylists": "Ачысціце калекцыі і спісы прайгравання",
"TaskCleanCollectionsAndPlaylistsDescription": "Выдаляе элементы з калекцый і спісаў прайгравання, якія больш не існуюць.", "TaskCleanCollectionsAndPlaylistsDescription": "Выдаляе элементы з калекцый і спісаў прайгравання, якія больш не існуюць."
"TaskAudioNormalizationDescription": "Сканіруе файлы на прадмет нармалізацыі гуку.",
"TaskAudioNormalization": "Нармалізацыя гуку",
"TaskExtractMediaSegmentsDescription": "Выдае або атрымлівае медыясегменты з убудоў з падтрымкай MediaSegment.",
"TaskMoveTrickplayImagesDescription": "Перамяшчае існуючыя файлы trickplay у адпаведнасці з наладамі бібліятэкі.",
"TaskDownloadMissingLyrics": "Спампаваць зніклыя тэксты песень",
"TaskDownloadMissingLyricsDescription": "Спампоўвае тэксты для песень",
"TaskExtractMediaSegments": "Сканіраванне медыя-сегмента",
"TaskMoveTrickplayImages": "Перанесці месцазнаходжанне выявы Trickplay"
} }

View File

@@ -126,11 +126,5 @@
"External": "Външен", "External": "Външен",
"HearingImpaired": "Увреден слух", "HearingImpaired": "Увреден слух",
"TaskRefreshTrickplayImages": "Генерирай изображение", "TaskRefreshTrickplayImages": "Генерирай изображение",
"TaskRefreshTrickplayImagesDescription": "Създава прегледи на Trickplay за видеа в активирани библиотеки.", "TaskRefreshTrickplayImagesDescription": "Създава прегледи на Trickplay за видеа в активирани библиотеки."
"TaskDownloadMissingLyrics": "Свали липсващи текстове",
"TaskDownloadMissingLyricsDescription": "Свали текстове за песни",
"TaskCleanCollectionsAndPlaylists": "Изчисти колекциите и плейлистовете",
"TaskCleanCollectionsAndPlaylistsDescription": "Премахни несъществуващи файлове в колекциите и плейлистите.",
"TaskAudioNormalization": "Нормализиране на звука",
"TaskAudioNormalizationDescription": "Сканирай файловете за нормализация на звука."
} }

View File

@@ -130,7 +130,5 @@
"TaskCleanCollectionsAndPlaylistsDescription": "Esborra elements de col·leccions i llistes de reproducció que ja no existeixen.", "TaskCleanCollectionsAndPlaylistsDescription": "Esborra elements de col·leccions i llistes de reproducció que ja no existeixen.",
"TaskCleanCollectionsAndPlaylists": "Neteja col·leccions i llistes de reproducció", "TaskCleanCollectionsAndPlaylists": "Neteja col·leccions i llistes de reproducció",
"TaskAudioNormalization": "Normalització d'Àudio", "TaskAudioNormalization": "Normalització d'Àudio",
"TaskAudioNormalizationDescription": "Escaneja arxius per dades de normalització d'àudio.", "TaskAudioNormalizationDescription": "Escaneja arxius per dades de normalització d'àudio."
"TaskDownloadMissingLyricsDescription": "Baixar lletres de les cançons",
"TaskDownloadMissingLyrics": "Baixar lletres que falten"
} }

View File

@@ -22,7 +22,7 @@
"HeaderFavoriteEpisodes": "Oblíbené epizody", "HeaderFavoriteEpisodes": "Oblíbené epizody",
"HeaderFavoriteShows": "Oblíbené seriály", "HeaderFavoriteShows": "Oblíbené seriály",
"HeaderFavoriteSongs": "Oblíbená hudba", "HeaderFavoriteSongs": "Oblíbená hudba",
"HeaderLiveTV": "TV vysílání", "HeaderLiveTV": "Živý přenos",
"HeaderNextUp": "Další díly", "HeaderNextUp": "Další díly",
"HeaderRecordingGroups": "Skupiny nahrávek", "HeaderRecordingGroups": "Skupiny nahrávek",
"HomeVideos": "Domácí videa", "HomeVideos": "Domácí videa",
@@ -130,11 +130,5 @@
"TaskCleanCollectionsAndPlaylists": "Pročistit kolekce a seznamy přehrávání", "TaskCleanCollectionsAndPlaylists": "Pročistit kolekce a seznamy přehrávání",
"TaskCleanCollectionsAndPlaylistsDescription": "Odstraní neexistující položky z kolekcí a seznamů přehrávání.", "TaskCleanCollectionsAndPlaylistsDescription": "Odstraní neexistující položky z kolekcí a seznamů přehrávání.",
"TaskAudioNormalization": "Normalizace zvuku", "TaskAudioNormalization": "Normalizace zvuku",
"TaskAudioNormalizationDescription": "Skenovat soubory za účelem normalizace zvuku.", "TaskAudioNormalizationDescription": "Skenovat soubory za účelem normalizace zvuku."
"TaskDownloadMissingLyrics": "Stáhnout chybějící texty k písni",
"TaskDownloadMissingLyricsDescription": "Stáhne texty k písni",
"TaskExtractMediaSegments": "Skenování segmentů médií",
"TaskExtractMediaSegmentsDescription": "Extrahuje či získá segmenty médií pomocí zásuvných modulů MediaSegment.",
"TaskMoveTrickplayImages": "Přesunout úložiště obrázků Trickplay",
"TaskMoveTrickplayImagesDescription": "Přesune existující soubory Trickplay podle nastavení knihovny."
} }

View File

@@ -17,7 +17,7 @@
"Genres": "Genrer", "Genres": "Genrer",
"HeaderAlbumArtists": "Albumkunstnere", "HeaderAlbumArtists": "Albumkunstnere",
"HeaderContinueWatching": "Fortsæt afspilning", "HeaderContinueWatching": "Fortsæt afspilning",
"HeaderFavoriteAlbums": "Favoritalbum", "HeaderFavoriteAlbums": "Favoritalbummer",
"HeaderFavoriteArtists": "Favoritkunstnere", "HeaderFavoriteArtists": "Favoritkunstnere",
"HeaderFavoriteEpisodes": "Yndlingsafsnit", "HeaderFavoriteEpisodes": "Yndlingsafsnit",
"HeaderFavoriteShows": "Yndlingsserier", "HeaderFavoriteShows": "Yndlingsserier",
@@ -87,21 +87,21 @@
"UserOnlineFromDevice": "{0} er online fra {1}", "UserOnlineFromDevice": "{0} er online fra {1}",
"UserPasswordChangedWithName": "Adgangskode er ændret for brugeren {0}", "UserPasswordChangedWithName": "Adgangskode er ændret for brugeren {0}",
"UserPolicyUpdatedWithName": "Brugerpolitikken er blevet opdateret for {0}", "UserPolicyUpdatedWithName": "Brugerpolitikken er blevet opdateret for {0}",
"UserStartedPlayingItemWithValues": "{0} afspiller {1} på {2}", "UserStartedPlayingItemWithValues": "{0} har påbegyndt afspilning af {1}",
"UserStoppedPlayingItemWithValues": "{0} har afsluttet afspilning af {1} på {2}", "UserStoppedPlayingItemWithValues": "{0} har afsluttet afspilning af {1} på {2}",
"ValueHasBeenAddedToLibrary": "{0} er blevet tilføjet til dit mediebibliotek", "ValueHasBeenAddedToLibrary": "{0} er blevet tilføjet til dit mediebibliotek",
"ValueSpecialEpisodeName": "Special - {0}", "ValueSpecialEpisodeName": "Special - {0}",
"VersionNumber": "Version {0}", "VersionNumber": "Version {0}",
"TaskDownloadMissingSubtitlesDescription": "Søger på internettet efter manglende undertekster baseret på metadata-konfigurationen.", "TaskDownloadMissingSubtitlesDescription": "Søger på internettet efter manglende undertekster baseret på metadata-konfigurationen.",
"TaskDownloadMissingSubtitles": "Hentede medie mangler undertekster", "TaskDownloadMissingSubtitles": "Hent manglende undertekster",
"TaskUpdatePluginsDescription": "Henter og installerer opdateringer for plugins, som er konfigurerede til at blive opdateret automatisk.", "TaskUpdatePluginsDescription": "Henter og installerer opdateringer for plugins, som er indstillet til at blive opdateret automatisk.",
"TaskUpdatePlugins": "Opdater Plugins", "TaskUpdatePlugins": "Opdater Plugins",
"TaskCleanLogsDescription": "Sletter log-filer som er mere end {0} dage gamle.", "TaskCleanLogsDescription": "Sletter log-filer som er mere end {0} dage gamle.",
"TaskCleanLogs": "Ryd Log-mappe", "TaskCleanLogs": "Ryd Log-mappe",
"TaskRefreshLibraryDescription": "Scanner dit mediebibliotek for nye filer og opdateret metadata.", "TaskRefreshLibraryDescription": "Scanner dit mediebibliotek for nye filer og opdateret metadata.",
"TaskRefreshLibrary": "Scan Mediebibliotek", "TaskRefreshLibrary": "Scan Mediebibliotek",
"TaskCleanCacheDescription": "Sletter cache-filer som systemet ikke længere bruger.", "TaskCleanCacheDescription": "Sletter cache-filer som systemet ikke længere bruger.",
"TaskCleanCache": "Ryd cache-mappe", "TaskCleanCache": "Ryd Cache-mappe",
"TasksChannelsCategory": "Internetkanaler", "TasksChannelsCategory": "Internetkanaler",
"TasksApplicationCategory": "Applikation", "TasksApplicationCategory": "Applikation",
"TasksLibraryCategory": "Bibliotek", "TasksLibraryCategory": "Bibliotek",
@@ -128,13 +128,5 @@
"TaskRefreshTrickplayImages": "Generér Trickplay Billeder", "TaskRefreshTrickplayImages": "Generér Trickplay Billeder",
"TaskRefreshTrickplayImagesDescription": "Laver trickplay forhåndsvisninger for videoer i aktiverede biblioteker.", "TaskRefreshTrickplayImagesDescription": "Laver trickplay forhåndsvisninger for videoer i aktiverede biblioteker.",
"TaskCleanCollectionsAndPlaylists": "Ryd op i samlinger og afspilningslister", "TaskCleanCollectionsAndPlaylists": "Ryd op i samlinger og afspilningslister",
"TaskCleanCollectionsAndPlaylistsDescription": "Fjerner elementer fra samlinger og afspilningslister der ikke eksisterer længere.", "TaskCleanCollectionsAndPlaylistsDescription": "Fjerner enheder fra samlinger og afspilningslister der ikke eksisterer længere."
"TaskAudioNormalizationDescription": "Skanner filer for data vedrørende audio-normalisering.",
"TaskAudioNormalization": "Audio-normalisering",
"TaskDownloadMissingLyricsDescription": "Hentede sange mangler sangtekster",
"TaskDownloadMissingLyrics": "Hentede medie mangler sangtekster",
"TaskExtractMediaSegments": "Scan mediesegment",
"TaskMoveTrickplayImages": "Migrer billedelokation for Trickplay",
"TaskMoveTrickplayImagesDescription": "Flyt eksisterende trickplay-filer jævnfør biblioteksindstillilnger.",
"TaskExtractMediaSegmentsDescription": "Ekstraherer eller henter mediesegmenter fra plugins som understøtter MediaSegment."
} }

View File

@@ -126,15 +126,9 @@
"External": "Extern", "External": "Extern",
"HearingImpaired": "Hörgeschädigt", "HearingImpaired": "Hörgeschädigt",
"TaskRefreshTrickplayImages": "Trickplay-Bilder generieren", "TaskRefreshTrickplayImages": "Trickplay-Bilder generieren",
"TaskRefreshTrickplayImagesDescription": "Erstellt ein Trickplay-Vorschauen für Videos in aktivierten Bibliotheken.", "TaskRefreshTrickplayImagesDescription": "Erstellt eine Trickplay-Vorschau für Videos in aktivierten Bibliotheken.",
"TaskCleanCollectionsAndPlaylists": "Sammlungen und Playlisten aufräumen", "TaskCleanCollectionsAndPlaylists": "Sammlungen und Playlisten aufräumen",
"TaskCleanCollectionsAndPlaylistsDescription": "Lösche nicht mehr vorhandene Einträge aus den Sammlungen und Playlisten.", "TaskCleanCollectionsAndPlaylistsDescription": "Lösche nicht mehr vorhandene Einträge aus den Sammlungen und Playlisten.",
"TaskAudioNormalization": "Audio Normalisierung", "TaskAudioNormalization": "Audio Normalisierung",
"TaskAudioNormalizationDescription": "Durchsucht Dateien nach Audionormalisierungsdaten.", "TaskAudioNormalizationDescription": "Durchsucht Dateien nach Audionormalisierungsdaten."
"TaskDownloadMissingLyricsDescription": "Lädt Songtexte herunter",
"TaskDownloadMissingLyrics": "Fehlende Songtexte herunterladen",
"TaskExtractMediaSegments": "Scanne Mediensegmente",
"TaskExtractMediaSegmentsDescription": "Extrahiert oder empfängt Mediensegmente von Plugins die Mediensegmente nutzen.",
"TaskMoveTrickplayImages": "Verzeichnis für Trickplay-Bilder migrieren",
"TaskMoveTrickplayImagesDescription": "Trickplay-Bilder werden entsprechend der Bibliothekseinstellungen verschoben."
} }

View File

@@ -126,9 +126,5 @@
"External": "Εξωτερικό", "External": "Εξωτερικό",
"HearingImpaired": "Με προβλήματα ακοής", "HearingImpaired": "Με προβλήματα ακοής",
"TaskRefreshTrickplayImages": "Δημιουργήστε εικόνες Trickplay", "TaskRefreshTrickplayImages": "Δημιουργήστε εικόνες Trickplay",
"TaskRefreshTrickplayImagesDescription": "Δημιουργεί προεπισκοπήσεις trickplay για βίντεο σε ενεργοποιημένες βιβλιοθήκες.", "TaskRefreshTrickplayImagesDescription": "Δημιουργεί προεπισκοπήσεις trickplay για βίντεο σε ενεργοποιημένες βιβλιοθήκες."
"TaskAudioNormalization": "Ομοιομορφία ήχου",
"TaskAudioNormalizationDescription": "Ανίχνευση αρχείων για δεδομένα ομοιομορφίας ήχου.",
"TaskCleanCollectionsAndPlaylists": "Καθαρισμός συλλογών και λιστών αναπαραγωγής",
"TaskCleanCollectionsAndPlaylistsDescription": "Αφαιρούνται στοιχεία από τις συλλογές και τις λίστες αναπαραγωγής που δεν υπάρχουν πλέον."
} }

View File

@@ -130,11 +130,5 @@
"TaskCleanCollectionsAndPlaylists": "Clean up collections and playlists", "TaskCleanCollectionsAndPlaylists": "Clean up collections and playlists",
"TaskCleanCollectionsAndPlaylistsDescription": "Removes items from collections and playlists that no longer exist.", "TaskCleanCollectionsAndPlaylistsDescription": "Removes items from collections and playlists that no longer exist.",
"TaskAudioNormalization": "Audio Normalisation", "TaskAudioNormalization": "Audio Normalisation",
"TaskAudioNormalizationDescription": "Scans files for audio normalisation data.", "TaskAudioNormalizationDescription": "Scans files for audio normalisation data."
"TaskDownloadMissingLyrics": "Download missing lyrics",
"TaskDownloadMissingLyricsDescription": "Downloads lyrics for songs",
"TaskExtractMediaSegments": "Media Segment Scan",
"TaskExtractMediaSegmentsDescription": "Extracts or obtains media segments from MediaSegment enabled plugins.",
"TaskMoveTrickplayImages": "Migrate Trickplay Image Location",
"TaskMoveTrickplayImagesDescription": "Moves existing trickplay files according to the library settings."
} }

View File

@@ -122,8 +122,6 @@
"TaskCleanTranscodeDescription": "Deletes transcode files more than one day old.", "TaskCleanTranscodeDescription": "Deletes transcode files more than one day old.",
"TaskRefreshChannels": "Refresh Channels", "TaskRefreshChannels": "Refresh Channels",
"TaskRefreshChannelsDescription": "Refreshes internet channel information.", "TaskRefreshChannelsDescription": "Refreshes internet channel information.",
"TaskDownloadMissingLyrics": "Download missing lyrics",
"TaskDownloadMissingLyricsDescription": "Downloads lyrics for songs",
"TaskDownloadMissingSubtitles": "Download missing subtitles", "TaskDownloadMissingSubtitles": "Download missing subtitles",
"TaskDownloadMissingSubtitlesDescription": "Searches the internet for missing subtitles based on metadata configuration.", "TaskDownloadMissingSubtitlesDescription": "Searches the internet for missing subtitles based on metadata configuration.",
"TaskOptimizeDatabase": "Optimize database", "TaskOptimizeDatabase": "Optimize database",
@@ -131,9 +129,5 @@
"TaskKeyframeExtractor": "Keyframe Extractor", "TaskKeyframeExtractor": "Keyframe Extractor",
"TaskKeyframeExtractorDescription": "Extracts keyframes from video files to create more precise HLS playlists. This task may run for a long time.", "TaskKeyframeExtractorDescription": "Extracts keyframes from video files to create more precise HLS playlists. This task may run for a long time.",
"TaskCleanCollectionsAndPlaylists": "Clean up collections and playlists", "TaskCleanCollectionsAndPlaylists": "Clean up collections and playlists",
"TaskCleanCollectionsAndPlaylistsDescription": "Removes items from collections and playlists that no longer exist.", "TaskCleanCollectionsAndPlaylistsDescription": "Removes items from collections and playlists that no longer exist."
"TaskExtractMediaSegments": "Media Segment Scan",
"TaskExtractMediaSegmentsDescription": "Extracts or obtains media segments from MediaSegment enabled plugins.",
"TaskMoveTrickplayImages": "Migrate Trickplay Image Location",
"TaskMoveTrickplayImagesDescription": "Moves existing trickplay files according to the library settings."
} }

View File

@@ -124,17 +124,5 @@
"External": "Externo", "External": "Externo",
"TaskKeyframeExtractorDescription": "Extrae Fotogramas Clave de los archivos de vídeo para crear Listas de Reprodución HLS más precisas. Esta tarea puede durar mucho tiempo.", "TaskKeyframeExtractorDescription": "Extrae Fotogramas Clave de los archivos de vídeo para crear Listas de Reprodución HLS más precisas. Esta tarea puede durar mucho tiempo.",
"TaskKeyframeExtractor": "Extractor de Fotogramas Clave", "TaskKeyframeExtractor": "Extractor de Fotogramas Clave",
"HearingImpaired": "Discapacidad Auditiva", "HearingImpaired": "Discapacidad Auditiva"
"TaskRefreshTrickplayImages": "Generar imágenes de Trickplay",
"TaskRefreshTrickplayImagesDescription": "Crea vistas previas de reproducción engañosa para videos en bibliotecas habilitadas.",
"TaskAudioNormalization": "Normalización de audio",
"TaskAudioNormalizationDescription": "Escanea archivos en busca de datos de normalización de audio.",
"TaskCleanCollectionsAndPlaylists": "Limpiar colecciones y listas de reproducción",
"TaskCleanCollectionsAndPlaylistsDescription": "Elimina elementos de colecciones y listas de reproducción que ya no existen.",
"TaskDownloadMissingLyrics": "Descargar letra faltante",
"TaskDownloadMissingLyricsDescription": "Descarga letras de canciones",
"TaskExtractMediaSegments": "Escanear Segmentos de Media",
"TaskExtractMediaSegmentsDescription": "Extrae u obtiene segmentos de medio de plugins habilitados para MediaSegment.",
"TaskMoveTrickplayImagesDescription": "Mueve archivos existentes de trickplay de acuerdo a la configuración de la biblioteca.",
"TaskMoveTrickplayImages": "Migrar Ubicación de Imagen de Trickplay"
} }

View File

@@ -11,7 +11,7 @@
"Collections": "Colecciones", "Collections": "Colecciones",
"DeviceOfflineWithName": "{0} se ha desconectado", "DeviceOfflineWithName": "{0} se ha desconectado",
"DeviceOnlineWithName": "{0} está conectado", "DeviceOnlineWithName": "{0} está conectado",
"FailedLoginAttemptWithUserName": "Intento fallido de inicio de sesión de {0}", "FailedLoginAttemptWithUserName": "Intento fallido de inicio de sesión desde {0}",
"Favorites": "Favoritos", "Favorites": "Favoritos",
"Folders": "Carpetas", "Folders": "Carpetas",
"Genres": "Géneros", "Genres": "Géneros",
@@ -124,17 +124,5 @@
"TaskKeyframeExtractorDescription": "Extrae los cuadros clave de los archivos de vídeo para crear listas HLS más precisas. Esta tarea puede tardar un buen rato.", "TaskKeyframeExtractorDescription": "Extrae los cuadros clave de los archivos de vídeo para crear listas HLS más precisas. Esta tarea puede tardar un buen rato.",
"TaskKeyframeExtractor": "Extractor de Cuadros Clave", "TaskKeyframeExtractor": "Extractor de Cuadros Clave",
"External": "Externo", "External": "Externo",
"HearingImpaired": "Discapacidad Auditiva", "HearingImpaired": "Discapacidad Auditiva"
"TaskRefreshTrickplayImagesDescription": "Crea previsualizaciones para la barra de reproducción en las bibliotecas habilitadas.",
"TaskRefreshTrickplayImages": "Generar imágenes de la barra de reproducción",
"TaskAudioNormalization": "Normalización de audio",
"TaskAudioNormalizationDescription": "Analiza los archivos para normalizar el audio.",
"TaskCleanCollectionsAndPlaylists": "Limpieza de colecciones y listas de reproducción",
"TaskCleanCollectionsAndPlaylistsDescription": "Quita elementos que ya no existen de colecciones y listas de reproducción.",
"TaskDownloadMissingLyrics": "descargar letras que faltan",
"TaskDownloadMissingLyricsDescription": "Descargar letras de canciones",
"TaskExtractMediaSegments": "Escaneo de segmentos de medios",
"TaskExtractMediaSegmentsDescription": "Extrae u obtiene segmentos de medios de plugins habilitados para MediaSegment.",
"TaskMoveTrickplayImages": "Migrar la ubicación de la imagen de Trickplay",
"TaskMoveTrickplayImagesDescription": "Mueve archivos de trickplay existentes según la configuración de la biblioteca."
} }

View File

@@ -11,7 +11,7 @@
"Collections": "Colecciones", "Collections": "Colecciones",
"DeviceOfflineWithName": "{0} se ha desconectado", "DeviceOfflineWithName": "{0} se ha desconectado",
"DeviceOnlineWithName": "{0} está conectado", "DeviceOnlineWithName": "{0} está conectado",
"FailedLoginAttemptWithUserName": "Intento fallido de inicio de sesión de {0}", "FailedLoginAttemptWithUserName": "Error al intentar iniciar sesión desde {0}",
"Favorites": "Favoritos", "Favorites": "Favoritos",
"Folders": "Carpetas", "Folders": "Carpetas",
"Genres": "Géneros", "Genres": "Géneros",
@@ -130,11 +130,5 @@
"TaskCleanCollectionsAndPlaylists": "Limpiar colecciones y listas de reproducción", "TaskCleanCollectionsAndPlaylists": "Limpiar colecciones y listas de reproducción",
"TaskCleanCollectionsAndPlaylistsDescription": "Elimina elementos de colecciones y listas de reproducción que ya no existen.", "TaskCleanCollectionsAndPlaylistsDescription": "Elimina elementos de colecciones y listas de reproducción que ya no existen.",
"TaskAudioNormalization": "Normalización de audio", "TaskAudioNormalization": "Normalización de audio",
"TaskAudioNormalizationDescription": "Escanear archivos para obtener datos de normalización.", "TaskAudioNormalizationDescription": "Escanear archivos para obtener datos de normalización."
"TaskDownloadMissingLyricsDescription": "Descargar letras para las canciones",
"TaskDownloadMissingLyrics": "Descargar letras faltantes",
"TaskMoveTrickplayImagesDescription": "Mueve archivos de trickplay existentes según la configuración de la biblioteca.",
"TaskExtractMediaSegments": "Escaneo de segmentos de medios",
"TaskExtractMediaSegmentsDescription": "Extrae u obtiene segmentos de medios de plugins habilitados para MediaSegment.",
"TaskMoveTrickplayImages": "Migrar la ubicación de la imagen de Trickplay"
} }

View File

@@ -112,7 +112,7 @@
"CameraImageUploadedFrom": "Una nueva imagen de cámara ha sido subida desde {0}", "CameraImageUploadedFrom": "Una nueva imagen de cámara ha sido subida desde {0}",
"AuthenticationSucceededWithUserName": "{0} autenticado con éxito", "AuthenticationSucceededWithUserName": "{0} autenticado con éxito",
"Application": "Aplicación", "Application": "Aplicación",
"AppDeviceValues": "Aplicación: {0}, Dispositivo: {1}", "AppDeviceValues": "App: {0}, Dispositivo: {1}",
"TaskCleanActivityLogDescription": "Elimina las entradas del registro de actividad anteriores al periodo configurado.", "TaskCleanActivityLogDescription": "Elimina las entradas del registro de actividad anteriores al periodo configurado.",
"TaskCleanActivityLog": "Limpiar registro de actividades", "TaskCleanActivityLog": "Limpiar registro de actividades",
"Undefined": "Sin definir", "Undefined": "Sin definir",
@@ -125,11 +125,5 @@
"TaskKeyframeExtractor": "Extractor de Fotogramas Clave", "TaskKeyframeExtractor": "Extractor de Fotogramas Clave",
"HearingImpaired": "Discapacidad auditiva", "HearingImpaired": "Discapacidad auditiva",
"TaskRefreshTrickplayImagesDescription": "Crea previsualizaciones para la barra de reproducción en las bibliotecas habilitadas.", "TaskRefreshTrickplayImagesDescription": "Crea previsualizaciones para la barra de reproducción en las bibliotecas habilitadas.",
"TaskRefreshTrickplayImages": "Generar imágenes de la barra de reproducción", "TaskRefreshTrickplayImages": "Generar imágenes de la barra de reproducción"
"TaskAudioNormalization": "Normalización de audio",
"TaskCleanCollectionsAndPlaylistsDescription": "Quita elementos que ya no existen de colecciones y listas de reproducción.",
"TaskAudioNormalizationDescription": "Analiza los archivos para normalizar el audio.",
"TaskCleanCollectionsAndPlaylists": "Limpieza de colecciones y listas de reproducción",
"TaskDownloadMissingLyrics": "Descargar letra faltante",
"TaskDownloadMissingLyricsDescription": "Descarga letras de canciones"
} }

View File

@@ -12,118 +12,14 @@
"Application": "Aplicación", "Application": "Aplicación",
"AppDeviceValues": "App: {0}, Dispositivo: {1}", "AppDeviceValues": "App: {0}, Dispositivo: {1}",
"HeaderContinueWatching": "Continuar Viendo", "HeaderContinueWatching": "Continuar Viendo",
"HeaderAlbumArtists": "Artistas del álbum", "HeaderAlbumArtists": "Artistas del Álbum",
"Genres": "Géneros", "Genres": "Géneros",
"Folders": "Carpetas", "Folders": "Carpetas",
"Favorites": "Favoritos", "Favorites": "Favoritos",
"FailedLoginAttemptWithUserName": "Intento de inicio de sesión fallido desde {0}", "FailedLoginAttemptWithUserName": "Intento de inicio de sesión fallido de {0}",
"HeaderFavoriteSongs": "Canciones Favoritas", "HeaderFavoriteSongs": "Canciones Favoritas",
"HeaderFavoriteEpisodes": "Episodios Favoritos", "HeaderFavoriteEpisodes": "Episodios Favoritos",
"HeaderFavoriteArtists": "Artistas Favoritos", "HeaderFavoriteArtists": "Artistas Favoritos",
"External": "Externo", "External": "Externo",
"Default": "Predeterminado", "Default": "Predeterminado"
"Movies": "Películas",
"MessageNamedServerConfigurationUpdatedWithValue": "La sección {0} de la configuración ha sido actualizada",
"MixedContent": "Contenido mixto",
"Music": "Música",
"NotificationOptionCameraImageUploaded": "Imagen de la cámara subida",
"NotificationOptionServerRestartRequired": "Se necesita reiniciar el servidor",
"NotificationOptionVideoPlayback": "Reproducción de video iniciada",
"Sync": "Sincronizar",
"Shows": "Series",
"UserDownloadingItemWithValues": "{0} está descargando {1}",
"UserOfflineFromDevice": "{0} se ha desconectado desde {1}",
"UserOnlineFromDevice": "{0} está en línea desde {1}",
"TasksChannelsCategory": "Canales de Internet",
"TaskRefreshChannelsDescription": "Actualiza la información de canales de Internet.",
"TaskDownloadMissingSubtitles": "Descargar subtítulos faltantes",
"TaskOptimizeDatabaseDescription": "Compacta la base de datos y libera espacio. Ejecutar esta tarea después de escanear la biblioteca o hacer otros cambios que impliquen modificaciones en la base de datos puede mejorar el rendimiento.",
"TaskKeyframeExtractorDescription": "Extrae Fotogramas Clave de los archivos de vídeo para crear Listas de Reproducción HLS más precisas. Esta tarea puede durar mucho tiempo.",
"TaskAudioNormalization": "Normalización de audio",
"TaskAudioNormalizationDescription": "Escanear archivos para la normalización de data.",
"TaskCleanCollectionsAndPlaylists": "Limpiar colecciones y listas de reproducción",
"TaskCleanCollectionsAndPlaylistsDescription": "Remover elementos de colecciones y listas de reproducción que no existen.",
"TvShows": "Series de TV",
"UserStartedPlayingItemWithValues": "{0} está reproduciendo {1} en {2}",
"TaskRefreshChannels": "Actualizar canales",
"Photos": "Fotos",
"HeaderFavoriteShows": "Programas favoritos",
"TaskCleanActivityLog": "Limpiar registro de actividades",
"UserPasswordChangedWithName": "Se ha cambiado la contraseña para el usuario {0}",
"System": "Sistema",
"User": "Usuario",
"Forced": "Forzado",
"PluginInstalledWithName": "{0} ha sido instalado",
"HeaderFavoriteAlbums": "Álbumes favoritos",
"TaskUpdatePlugins": "Actualizar Plugins",
"Latest": "Recientes",
"UserStoppedPlayingItemWithValues": "{0} ha terminado de reproducir {1} en {2}",
"Songs": "Canciones",
"NotificationOptionPluginError": "Falla de plugin",
"ScheduledTaskStartedWithName": "{0} iniciado",
"TasksApplicationCategory": "Aplicación",
"UserDeletedWithName": "El usuario {0} ha sido eliminado",
"TaskRefreshChapterImages": "Extraer imágenes de los capítulos",
"TaskUpdatePluginsDescription": "Descarga e instala actualizaciones para plugins que están configurados para actualizarse automáticamente.",
"TaskRefreshPeopleDescription": "Actualiza metadatos de actores y directores en tu biblioteca de medios.",
"NotificationOptionUserLockedOut": "Usuario bloqueado",
"TaskCleanTranscodeDescription": "Elimina archivos transcodificados que tengan más de un día.",
"TaskCleanTranscode": "Limpiar el directorio de transcodificaciones",
"NotificationOptionPluginUpdateInstalled": "Actualización de plugin instalada",
"NotificationOptionAudioPlaybackStopped": "Reproducción de audio detenida",
"TasksLibraryCategory": "Biblioteca",
"NotificationOptionPluginInstalled": "Plugin instalado",
"UserPolicyUpdatedWithName": "La política de usuario ha sido actualizada para {0}",
"VersionNumber": "Versión {0}",
"HeaderNextUp": "A continuación",
"ValueHasBeenAddedToLibrary": "{0} se ha añadido a tu biblioteca",
"LabelIpAddressValue": "Dirección IP: {0}",
"NameSeasonNumber": "Temporada {0}",
"NotificationOptionNewLibraryContent": "Nuevo contenido agregado",
"Plugin": "Plugin",
"NotificationOptionAudioPlayback": "Reproducción de audio iniciada",
"NotificationOptionTaskFailed": "Falló la tarea programada",
"LabelRunningTimeValue": "Tiempo en ejecución: {0}",
"SubtitleDownloadFailureFromForItem": "Falló la descarga de subtítulos desde {0} para {1}",
"TaskRefreshLibrary": "Escanear biblioteca de medios",
"ServerNameNeedsToBeRestarted": "{0} debe ser reiniciado",
"TasksMaintenanceCategory": "Mantenimiento",
"ProviderValue": "Proveedor: {0}",
"UserCreatedWithName": "El usuario {0} ha sido creado",
"PluginUninstalledWithName": "{0} ha sido desinstalado",
"ValueSpecialEpisodeName": "Especial - {0}",
"ScheduledTaskFailedWithName": "{0} falló",
"TaskCleanLogs": "Limpiar directorio de registros",
"NameInstallFailed": "Falló la instalación de {0}",
"UserLockedOutWithName": "El usuario {0} ha sido bloqueado",
"TaskRefreshLibraryDescription": "Escanea tu biblioteca de medios para encontrar archivos nuevos y actualizar los metadatos.",
"StartupEmbyServerIsLoading": "El servidor Jellyfin está cargando. Por favor, intente de nuevo en un momento.",
"Playlists": "Listas de reproducción",
"TaskDownloadMissingSubtitlesDescription": "Busca subtítulos faltantes en Internet basándose en la configuración de metadatos.",
"MessageServerConfigurationUpdated": "Se ha actualizado la configuración del servidor",
"TaskRefreshPeople": "Actualizar personas",
"NotificationOptionVideoPlaybackStopped": "Reproducción de video detenida",
"HeaderLiveTV": "TV en vivo",
"NameSeasonUnknown": "Temporada desconocida",
"NotificationOptionInstallationFailed": "Fallo de instalación",
"NotificationOptionPluginUninstalled": "Plugin desinstalado",
"TaskCleanCache": "Limpiar directorio caché",
"TaskRefreshChapterImagesDescription": "Crea miniaturas para videos que tienen capítulos.",
"Inherit": "Heredar",
"HeaderRecordingGroups": "Grupos de grabación",
"ItemAddedWithName": "{0} fue agregado a la biblioteca",
"TaskOptimizeDatabase": "Optimizar base de datos",
"TaskKeyframeExtractor": "Extractor de Fotogramas Clave",
"HearingImpaired": "Discapacidad auditiva",
"HomeVideos": "Videos caseros",
"ItemRemovedWithName": "{0} fue removido de la biblioteca",
"MessageApplicationUpdated": "El servidor Jellyfin ha sido actualizado",
"MessageApplicationUpdatedTo": "El servidor Jellyfin ha sido actualizado a {0}",
"MusicVideos": "Videos musicales",
"NewVersionIsAvailable": "Una nueva versión de Jellyfin está disponible para descargar.",
"PluginUpdatedWithName": "{0} ha sido actualizado",
"Undefined": "Sin definir",
"TaskCleanActivityLogDescription": "Elimina las entradas del registro de actividad anteriores al periodo configurado.",
"TaskCleanCacheDescription": "Elimina archivos caché que ya no son necesarios para el sistema.",
"TaskCleanLogsDescription": "Elimina archivos de registro con más de {0} días de antigüedad."
} }

View File

@@ -102,7 +102,7 @@
"Forced": "Sunnitud", "Forced": "Sunnitud",
"Folders": "Kaustad", "Folders": "Kaustad",
"Favorites": "Lemmikud", "Favorites": "Lemmikud",
"FailedLoginAttemptWithUserName": "Sisselogimine nurjus aadressilt {0}", "FailedLoginAttemptWithUserName": "{0} - sisselogimine nurjus",
"DeviceOnlineWithName": "{0} on ühendatud", "DeviceOnlineWithName": "{0} on ühendatud",
"DeviceOfflineWithName": "{0} katkestas ühenduse", "DeviceOfflineWithName": "{0} katkestas ühenduse",
"Default": "Vaikimisi", "Default": "Vaikimisi",
@@ -125,15 +125,5 @@
"TaskKeyframeExtractorDescription": "Eraldab videofailidest võtmekaadreid, et luua täpsemaid HLS-i esitusloendeid. See ülesanne võib kesta pikka aega.", "TaskKeyframeExtractorDescription": "Eraldab videofailidest võtmekaadreid, et luua täpsemaid HLS-i esitusloendeid. See ülesanne võib kesta pikka aega.",
"TaskKeyframeExtractor": "Võtmekaadri ekstraktor", "TaskKeyframeExtractor": "Võtmekaadri ekstraktor",
"TaskRefreshTrickplayImages": "Loo eelvaate pildid", "TaskRefreshTrickplayImages": "Loo eelvaate pildid",
"TaskRefreshTrickplayImagesDescription": "Loob eelvaated videotele, kus lubatud.", "TaskRefreshTrickplayImagesDescription": "Loob eelvaated videotele, kus lubatud."
"TaskAudioNormalization": "Heli Normaliseerimine",
"TaskAudioNormalizationDescription": "Skaneerib faile heli normaliseerimise andmete jaoks.",
"TaskCleanCollectionsAndPlaylistsDescription": "Eemaldab kogumikest ja esitusloenditest asjad, mida enam ei eksisteeri.",
"TaskCleanCollectionsAndPlaylists": "Puhasta kogumikud ja esitusloendid",
"TaskDownloadMissingLyrics": "Lae alla puuduolev lüürika",
"TaskDownloadMissingLyricsDescription": "Lae lauludele alla lüürika",
"TaskMoveTrickplayImagesDescription": "Liigutab trickplay pildid meediakogu sätete kohaselt.",
"TaskExtractMediaSegments": "Meediasegmentide skaneerimine",
"TaskExtractMediaSegmentsDescription": "Eraldab või võtab meediasegmendid MediaSegment'i lubavatest pluginatest.",
"TaskMoveTrickplayImages": "Migreeri trickplay piltide asukoht"
} }

View File

@@ -128,13 +128,5 @@
"TaskRefreshTrickplayImages": "تولید تصاویر Trickplay", "TaskRefreshTrickplayImages": "تولید تصاویر Trickplay",
"TaskRefreshTrickplayImagesDescription": "تولید پیش‌نمایش های trickplay برای ویدیو های فعال شده در کتابخانه.", "TaskRefreshTrickplayImagesDescription": "تولید پیش‌نمایش های trickplay برای ویدیو های فعال شده در کتابخانه.",
"TaskCleanCollectionsAndPlaylists": "پاکسازی مجموعه ها و لیست پخش", "TaskCleanCollectionsAndPlaylists": "پاکسازی مجموعه ها و لیست پخش",
"TaskCleanCollectionsAndPlaylistsDescription": "موارد را از مجموعه ها و لیست پخش هایی که دیگر وجود ندارند حذف میکند.", "TaskCleanCollectionsAndPlaylistsDescription": "موارد را از مجموعه ها و لیست پخش هایی که دیگر وجود ندارند حذف میکند."
"TaskAudioNormalizationDescription": "بررسی فایل برای داده‌های نرمال کردن صدا.",
"TaskDownloadMissingLyrics": "دانلود متن‌های ناموجود",
"TaskDownloadMissingLyricsDescription": "دانلود متن شعر‌ها",
"TaskAudioNormalization": "نرمال کردن صدا",
"TaskExtractMediaSegments": "بررسی بخش محتوا",
"TaskExtractMediaSegmentsDescription": "بخش‌های محتوا را از افزونه‌های مربوط استخراح می‌کند.",
"TaskMoveTrickplayImages": "جابه‌جایی عکس‌های Trickplay",
"TaskMoveTrickplayImagesDescription": "داده‌های Trickplay را با توجه به تنظیمات کتاب‌خانه جابه‌جا می‌کند."
} }

View File

@@ -127,8 +127,5 @@
"TaskRefreshTrickplayImages": "Luo Trickplay-kuvat", "TaskRefreshTrickplayImages": "Luo Trickplay-kuvat",
"TaskRefreshTrickplayImagesDescription": "Luo Trickplay-esikatselut käytössä olevien kirjastojen videoista.", "TaskRefreshTrickplayImagesDescription": "Luo Trickplay-esikatselut käytössä olevien kirjastojen videoista.",
"TaskCleanCollectionsAndPlaylistsDescription": "Poistaa kohteet kokoelmista ja soittolistoista joita ei ole enää olemassa.", "TaskCleanCollectionsAndPlaylistsDescription": "Poistaa kohteet kokoelmista ja soittolistoista joita ei ole enää olemassa.",
"TaskCleanCollectionsAndPlaylists": "Puhdista kokoelmat ja soittolistat", "TaskCleanCollectionsAndPlaylists": "Puhdista kokoelmat ja soittolistat"
"TaskAudioNormalization": "Äänenvoimakkuuden normalisointi",
"TaskAudioNormalizationDescription": "Etsii tiedostoista äänenvoimakkuuden normalisointitietoja.",
"TaskDownloadMissingLyrics": "Lataa puuttuva lyriikka"
} }

View File

@@ -69,7 +69,7 @@
"HeaderLiveTV": "Live TV", "HeaderLiveTV": "Live TV",
"HeaderFavoriteSongs": "Mga Paboritong Kanta", "HeaderFavoriteSongs": "Mga Paboritong Kanta",
"HeaderFavoriteShows": "Mga Paboritong Pelikula", "HeaderFavoriteShows": "Mga Paboritong Pelikula",
"HeaderFavoriteEpisodes": "Mga Paboritong Yugto", "HeaderFavoriteEpisodes": "Mga Paboritong Episode",
"HeaderFavoriteArtists": "Mga Paboritong Artista", "HeaderFavoriteArtists": "Mga Paboritong Artista",
"HeaderFavoriteAlbums": "Mga Paboritong Album", "HeaderFavoriteAlbums": "Mga Paboritong Album",
"HeaderContinueWatching": "Magpatuloy sa Panonood", "HeaderContinueWatching": "Magpatuloy sa Panonood",

View File

@@ -11,7 +11,7 @@
"Collections": "Collections", "Collections": "Collections",
"DeviceOfflineWithName": "{0} s'est déconnecté", "DeviceOfflineWithName": "{0} s'est déconnecté",
"DeviceOnlineWithName": "{0} est connecté", "DeviceOnlineWithName": "{0} est connecté",
"FailedLoginAttemptWithUserName": "Tentative de connexion échouée par {0}", "FailedLoginAttemptWithUserName": "Tentative de connexion échoué par {0}",
"Favorites": "Favoris", "Favorites": "Favoris",
"Folders": "Dossiers", "Folders": "Dossiers",
"Genres": "Genres", "Genres": "Genres",
@@ -39,7 +39,7 @@
"MixedContent": "Contenu mixte", "MixedContent": "Contenu mixte",
"Movies": "Films", "Movies": "Films",
"Music": "Musique", "Music": "Musique",
"MusicVideos": "Vidéoclips", "MusicVideos": "Vidéos musicales",
"NameInstallFailed": "échec d'installation de {0}", "NameInstallFailed": "échec d'installation de {0}",
"NameSeasonNumber": "Saison {0}", "NameSeasonNumber": "Saison {0}",
"NameSeasonUnknown": "Saison Inconnue", "NameSeasonUnknown": "Saison Inconnue",
@@ -128,12 +128,5 @@
"TaskRefreshTrickplayImages": "Générer des images Trickplay", "TaskRefreshTrickplayImages": "Générer des images Trickplay",
"TaskRefreshTrickplayImagesDescription": "Crée des aperçus Trickplay pour les vidéos dans les médiathèques activées.", "TaskRefreshTrickplayImagesDescription": "Crée des aperçus Trickplay pour les vidéos dans les médiathèques activées.",
"TaskCleanCollectionsAndPlaylists": "Nettoyer les collections et les listes de lecture", "TaskCleanCollectionsAndPlaylists": "Nettoyer les collections et les listes de lecture",
"TaskCleanCollectionsAndPlaylistsDescription": "Supprime les éléments des collections et des listes de lecture qui n'existent plus.", "TaskCleanCollectionsAndPlaylistsDescription": "Supprimer les liens inexistants des collections et des listes de lecture"
"TaskAudioNormalization": "Normalisation audio",
"TaskAudioNormalizationDescription": "Analyse les fichiers à la recherche de données de normalisation audio.",
"TaskExtractMediaSegments": "Analyse des segments de média",
"TaskDownloadMissingLyricsDescription": "Téléchargement des paroles des chansons",
"TaskMoveTrickplayImagesDescription": "Déplace les fichiers trickplay existants en fonction des paramètres de la bibliothèque.",
"TaskDownloadMissingLyrics": "Télécharger les paroles des chansons manquantes",
"TaskMoveTrickplayImages": "Changer l'emplacement des images Trickplay"
} }

View File

@@ -1,6 +1,6 @@
{ {
"Albums": "Albums", "Albums": "Albums",
"AppDeviceValues": "Application : {0}, Appareil : {1}", "AppDeviceValues": "Application : {0}, Appareil: {1}",
"Application": "Application", "Application": "Application",
"Artists": "Artistes", "Artists": "Artistes",
"AuthenticationSucceededWithUserName": "{0} authentifié avec succès", "AuthenticationSucceededWithUserName": "{0} authentifié avec succès",
@@ -15,7 +15,7 @@
"Favorites": "Favoris", "Favorites": "Favoris",
"Folders": "Dossiers", "Folders": "Dossiers",
"Genres": "Genres", "Genres": "Genres",
"HeaderAlbumArtists": "Artistes d'albums", "HeaderAlbumArtists": "Artistes de l'album",
"HeaderContinueWatching": "Continuer de regarder", "HeaderContinueWatching": "Continuer de regarder",
"HeaderFavoriteAlbums": "Albums favoris", "HeaderFavoriteAlbums": "Albums favoris",
"HeaderFavoriteArtists": "Artistes préférés", "HeaderFavoriteArtists": "Artistes préférés",
@@ -130,11 +130,5 @@
"TaskCleanCollectionsAndPlaylists": "Nettoyer les collections et les listes de lecture", "TaskCleanCollectionsAndPlaylists": "Nettoyer les collections et les listes de lecture",
"TaskCleanCollectionsAndPlaylistsDescription": "Supprime les éléments des collections et des listes de lecture qui n'existent plus.", "TaskCleanCollectionsAndPlaylistsDescription": "Supprime les éléments des collections et des listes de lecture qui n'existent plus.",
"TaskAudioNormalization": "Normalisation audio", "TaskAudioNormalization": "Normalisation audio",
"TaskAudioNormalizationDescription": "Analyse les fichiers à la recherche de données de normalisation audio.", "TaskAudioNormalizationDescription": "Analyse les fichiers à la recherche de données de normalisation audio."
"TaskDownloadMissingLyricsDescription": "Téléchargement des paroles des chansons",
"TaskDownloadMissingLyrics": "Télécharger les paroles des chansons manquantes",
"TaskExtractMediaSegments": "Analyse des segments de média",
"TaskMoveTrickplayImages": "Changer l'emplacement des images Trickplay",
"TaskExtractMediaSegmentsDescription": "Extrait ou obtient des segments de média à partir des plugins compatibles avec MediaSegment.",
"TaskMoveTrickplayImagesDescription": "Déplace les fichiers trickplay existants en fonction des paramètres de la bibliothèque."
} }

View File

@@ -1,16 +1,3 @@
{ {
"Albums": "Albaim", "Albums": "Albaim"
"Artists": "Ealaíontóir",
"AuthenticationSucceededWithUserName": "{0} fíordheimhnithe",
"Books": "leabhair",
"CameraImageUploadedFrom": "Tá íomhá ceamara nua uaslódáilte ó {0}",
"Channels": "Cainéil",
"ChapterNameValue": "Caibidil {0}",
"Collections": "Bailiúcháin",
"Default": "Mainneachtain",
"DeviceOfflineWithName": "scoireadh {0}",
"DeviceOnlineWithName": "{0} ceangailte",
"External": "Forimeallach",
"FailedLoginAttemptWithUserName": "Iarracht ar theip ar fhíordheimhniú ó {0}",
"Favorites": "Ceanáin"
} }

View File

@@ -1,7 +1,7 @@
{ {
"Albums": "Álbumes", "Albums": "Álbumes",
"Collections": "Coleccións", "Collections": "Colecións",
"ChapterNameValue": "Capítulo {0}", "ChapterNameValue": "Capítulos {0}",
"Channels": "Canles", "Channels": "Canles",
"CameraImageUploadedFrom": "Cargouse unha nova imaxe da cámara desde {0}", "CameraImageUploadedFrom": "Cargouse unha nova imaxe da cámara desde {0}",
"Books": "Libros", "Books": "Libros",

View File

@@ -60,7 +60,7 @@
"NotificationOptionUserLockedOut": "משתמש ננעל", "NotificationOptionUserLockedOut": "משתמש ננעל",
"NotificationOptionVideoPlayback": "ניגון וידאו החל", "NotificationOptionVideoPlayback": "ניגון וידאו החל",
"NotificationOptionVideoPlaybackStopped": "ניגון וידאו הופסק", "NotificationOptionVideoPlaybackStopped": "ניגון וידאו הופסק",
"Photos": "צילומים", "Photos": "תמונות",
"Playlists": "רשימות נגינה", "Playlists": "רשימות נגינה",
"Plugin": "תוסף", "Plugin": "תוסף",
"PluginInstalledWithName": "{0} הותקן", "PluginInstalledWithName": "{0} הותקן",
@@ -126,15 +126,5 @@
"External": "חיצוני", "External": "חיצוני",
"HearingImpaired": "לקוי שמיעה", "HearingImpaired": "לקוי שמיעה",
"TaskRefreshTrickplayImages": "יצירת תמונות המחשה", "TaskRefreshTrickplayImages": "יצירת תמונות המחשה",
"TaskRefreshTrickplayImagesDescription": "יוצר תמונות המחשה לסרטונים שפעילים בספריות.", "TaskRefreshTrickplayImagesDescription": "יוצר תמונות המחשה לסרטונים שפעילים בספריות."
"TaskAudioNormalization": "נרמול שמע",
"TaskCleanCollectionsAndPlaylistsDescription": "מנקה פריטים לא קיימים מאוספים ורשימות השמעה.",
"TaskAudioNormalizationDescription": "מחפש קבצי נורמליזציה של שמע.",
"TaskCleanCollectionsAndPlaylists": "מנקה אוספים ורשימות השמעה",
"TaskDownloadMissingLyrics": "הורדת מילים חסרות",
"TaskDownloadMissingLyricsDescription": "הורדת מילים לשירים",
"TaskMoveTrickplayImages": "מעביר את מיקום תמונות Trickplay",
"TaskExtractMediaSegments": "סריקת מדיה",
"TaskExtractMediaSegmentsDescription": "מחלץ חלקי מדיה מתוספים המאפשרים זאת.",
"TaskMoveTrickplayImagesDescription": "מזיז קבצי trickplay קיימים בהתאם להגדרות הספרייה."
} }

View File

@@ -14,7 +14,7 @@
"Forced": "बलपूर्वक", "Forced": "बलपूर्वक",
"Folders": "फ़ोल्डर", "Folders": "फ़ोल्डर",
"Favorites": "पसंदीदा", "Favorites": "पसंदीदा",
"FailedLoginAttemptWithUserName": "{0} से संप्रवेश असफल हुआ", "FailedLoginAttemptWithUserName": "{0} से लॉगिन असफल हुआ",
"DeviceOnlineWithName": "{0} कनेक्ट हो गया है", "DeviceOnlineWithName": "{0} कनेक्ट हो गया है",
"DeviceOfflineWithName": "{0} डिस्कनेक्ट हो गया है", "DeviceOfflineWithName": "{0} डिस्कनेक्ट हो गया है",
"Default": "प्राथमिक", "Default": "प्राथमिक",
@@ -125,7 +125,5 @@
"TaskDownloadMissingSubtitlesDescription": "मेटाडेटा कॉन्फ़िगरेशन के आधार पर लापता उपशीर्षक के लिए इंटरनेट खोजता है।", "TaskDownloadMissingSubtitlesDescription": "मेटाडेटा कॉन्फ़िगरेशन के आधार पर लापता उपशीर्षक के लिए इंटरनेट खोजता है।",
"TaskKeyframeExtractorDescription": "अधिक सटीक एचएलएस प्लेलिस्ट बनाने के लिए वीडियो फ़ाइलों से मुख्य-फ़्रेम निकालता है। यह कार्य लंबे समय तक चल सकता है।", "TaskKeyframeExtractorDescription": "अधिक सटीक एचएलएस प्लेलिस्ट बनाने के लिए वीडियो फ़ाइलों से मुख्य-फ़्रेम निकालता है। यह कार्य लंबे समय तक चल सकता है।",
"TaskRefreshTrickplayImages": "ट्रिकप्लै चित्रों को सृजन करे", "TaskRefreshTrickplayImages": "ट्रिकप्लै चित्रों को सृजन करे",
"TaskRefreshTrickplayImagesDescription": "नियत संग्रहों में चलचित्रों का ट्रीकप्लै दर्शनों को सृजन करे.", "TaskRefreshTrickplayImagesDescription": "नियत संग्रहों में चलचित्रों का ट्रीकप्लै दर्शनों को सृजन करे."
"TaskAudioNormalization": "श्रव्य सामान्यीकरण",
"TaskAudioNormalizationDescription": "श्रव्य सामान्यीकरण के लिए फाइलें अन्वेषण करें"
} }

View File

@@ -11,7 +11,7 @@
"Collections": "Kolekcije", "Collections": "Kolekcije",
"DeviceOfflineWithName": "{0} je prekinuo vezu", "DeviceOfflineWithName": "{0} je prekinuo vezu",
"DeviceOnlineWithName": "{0} je povezan", "DeviceOnlineWithName": "{0} je povezan",
"FailedLoginAttemptWithUserName": "Neuspješan pokušaj prijave od {0}", "FailedLoginAttemptWithUserName": "Neuspjeli pokušaj prijave od {0}",
"Favorites": "Favoriti", "Favorites": "Favoriti",
"Folders": "Mape", "Folders": "Mape",
"Genres": "Žanrovi", "Genres": "Žanrovi",
@@ -126,15 +126,5 @@
"TaskOptimizeDatabaseDescription": "Sažima bazu podataka i uklanja prazan prostor. Pokretanje ovog zadatka, može poboljšati performanse nakon provođenja indeksiranja biblioteke ili provođenja drugih promjena koje utječu na bazu podataka.", "TaskOptimizeDatabaseDescription": "Sažima bazu podataka i uklanja prazan prostor. Pokretanje ovog zadatka, može poboljšati performanse nakon provođenja indeksiranja biblioteke ili provođenja drugih promjena koje utječu na bazu podataka.",
"HearingImpaired": "Oštećen sluh", "HearingImpaired": "Oštećen sluh",
"TaskRefreshTrickplayImages": "Generiraj Trickplay Slike", "TaskRefreshTrickplayImages": "Generiraj Trickplay Slike",
"TaskRefreshTrickplayImagesDescription": "Kreira trickplay pretpreglede za videe u omogućenim knjižnicama.", "TaskRefreshTrickplayImagesDescription": "Kreira trickplay pretpreglede za videe u omogućenim knjižnicama."
"TaskAudioNormalization": "Normalizacija zvuka",
"TaskAudioNormalizationDescription": "Skenira datoteke u potrazi za podacima o normalizaciji zvuka.",
"TaskCleanCollectionsAndPlaylistsDescription": "Uklanja stavke iz zbirki i popisa za reprodukciju koje više ne postoje.",
"TaskCleanCollectionsAndPlaylists": "Očisti zbirke i popise za reprodukciju",
"TaskExtractMediaSegments": "Skeniranje dijelova medija",
"TaskDownloadMissingLyrics": "Preuzmi tekstove koji nedostaju",
"TaskDownloadMissingLyricsDescription": "Preuzmi tekstove pjesama",
"TaskExtractMediaSegmentsDescription": "Izvlači ili pribavlja dijelove medija iz omogućenih media pluginova.",
"TaskMoveTrickplayImages": "Preseli lokaciju Trickplay slika",
"TaskMoveTrickplayImagesDescription": "Preseli lokaciju Trickplay slika prema postavkama zbirke."
} }

View File

@@ -1,13 +1,13 @@
{ {
"Albums": "Albumok", "Albums": "Albumok",
"AppDeviceValues": "Program: {0}, eszköz: {1}", "AppDeviceValues": "Program: {0}, Eszköz: {1}",
"Application": "Alkalmazás", "Application": "Alkalmazás",
"Artists": "Előadók", "Artists": "Előadók",
"AuthenticationSucceededWithUserName": "{0} sikeresen hitelesítve", "AuthenticationSucceededWithUserName": "{0} sikeresen hitelesítve",
"Books": "Könyvek", "Books": "Könyvek",
"CameraImageUploadedFrom": "Új kamerakép lett feltöltve innen: {0}", "CameraImageUploadedFrom": "Új kamerakép lett feltöltve innen: {0}",
"Channels": "Csatornák", "Channels": "Csatornák",
"ChapterNameValue": "{0}. jelenet", "ChapterNameValue": "Jelenet {0}",
"Collections": "Gyűjtemények", "Collections": "Gyűjtemények",
"DeviceOfflineWithName": "{0} kijelentkezett", "DeviceOfflineWithName": "{0} kijelentkezett",
"DeviceOnlineWithName": "{0} belépett", "DeviceOnlineWithName": "{0} belépett",
@@ -15,31 +15,31 @@
"Favorites": "Kedvencek", "Favorites": "Kedvencek",
"Folders": "Könyvtárak", "Folders": "Könyvtárak",
"Genres": "Műfajok", "Genres": "Műfajok",
"HeaderAlbumArtists": "Albumelőadók", "HeaderAlbumArtists": "Album előadók",
"HeaderContinueWatching": "Megtekintés folytatása", "HeaderContinueWatching": "Megtekintés folytatása",
"HeaderFavoriteAlbums": "Kedvenc albumok", "HeaderFavoriteAlbums": "Kedvenc Albumok",
"HeaderFavoriteArtists": "Kedvenc előadók", "HeaderFavoriteArtists": "Kedvenc előadók",
"HeaderFavoriteEpisodes": "Kedvenc epizódok", "HeaderFavoriteEpisodes": "Kedvenc epizódok",
"HeaderFavoriteShows": "Kedvenc sorozatok", "HeaderFavoriteShows": "Kedvenc sorozatok",
"HeaderFavoriteSongs": "Kedvenc számok", "HeaderFavoriteSongs": "Kedvenc dalok",
"HeaderLiveTV": "Élő TV", "HeaderLiveTV": "Élő TV",
"HeaderNextUp": "Következik", "HeaderNextUp": "Következik",
"HeaderRecordingGroups": "Felvételi csoportok", "HeaderRecordingGroups": "Felvételi csoportok",
"HomeVideos": "Otthoni videók", "HomeVideos": "Otthoni videók",
"Inherit": "Öröklés", "Inherit": "Örökölt",
"ItemAddedWithName": "{0} hozzáadva a médiatárhoz", "ItemAddedWithName": "{0} hozzáadva a könyvtárhoz",
"ItemRemovedWithName": "{0} eltávolítva a médiatárból", "ItemRemovedWithName": "{0} eltávolítva a könyvtárból",
"LabelIpAddressValue": "IP-cím: {0}", "LabelIpAddressValue": "IP-cím: {0}",
"LabelRunningTimeValue": "Lejátszási idő: {0}", "LabelRunningTimeValue": "Lejátszási idő: {0}",
"Latest": "Legújabb", "Latest": "Legújabb",
"MessageApplicationUpdated": "A Jellyfin kiszolgáló frissítve lett", "MessageApplicationUpdated": "A Jellyfin kiszolgáló frissítve lett",
"MessageApplicationUpdatedTo": "A Jellyfin kiszolgáló frissítve lett a következőre: {0}", "MessageApplicationUpdatedTo": "A Jellyfin kiszolgáló frissítve lett a következőre: {0}",
"MessageNamedServerConfigurationUpdatedWithValue": "A kiszolgálókonfigurációs rész frissítve lett: {0}", "MessageNamedServerConfigurationUpdatedWithValue": "A kiszolgálókonfigurációs rész frissítve lett: {0}",
"MessageServerConfigurationUpdated": "A kiszolgálókonfiguráció frissítve lett", "MessageServerConfigurationUpdated": "Kiszolgálókonfiguráció frissítve lett",
"MixedContent": "Vegyes tartalom", "MixedContent": "Vegyes tartalom",
"Movies": "Filmek", "Movies": "Filmek",
"Music": "Zenék", "Music": "Zenék",
"MusicVideos": "Zenei videóklipek", "MusicVideos": "Zenei videóklippek",
"NameInstallFailed": "{0} sikertelen telepítés", "NameInstallFailed": "{0} sikertelen telepítés",
"NameSeasonNumber": "{0}. évad", "NameSeasonNumber": "{0}. évad",
"NameSeasonUnknown": "Ismeretlen évad", "NameSeasonUnknown": "Ismeretlen évad",
@@ -56,7 +56,7 @@
"NotificationOptionPluginUninstalled": "Bővítmény eltávolítva", "NotificationOptionPluginUninstalled": "Bővítmény eltávolítva",
"NotificationOptionPluginUpdateInstalled": "Bővítményfrissítés telepítve", "NotificationOptionPluginUpdateInstalled": "Bővítményfrissítés telepítve",
"NotificationOptionServerRestartRequired": "A kiszolgáló újraindítása szükséges", "NotificationOptionServerRestartRequired": "A kiszolgáló újraindítása szükséges",
"NotificationOptionTaskFailed": "Hiba az ütemezett feladatban", "NotificationOptionTaskFailed": "Ütemezett feladat hiba",
"NotificationOptionUserLockedOut": "Felhasználó tiltva", "NotificationOptionUserLockedOut": "Felhasználó tiltva",
"NotificationOptionVideoPlayback": "Videólejátszás elkezdve", "NotificationOptionVideoPlayback": "Videólejátszás elkezdve",
"NotificationOptionVideoPlaybackStopped": "Videólejátszás leállítva", "NotificationOptionVideoPlaybackStopped": "Videólejátszás leállítva",
@@ -107,7 +107,7 @@
"TaskCleanCache": "Gyorsítótár könyvtárának ürítése", "TaskCleanCache": "Gyorsítótár könyvtárának ürítése",
"TasksChannelsCategory": "Internetes csatornák", "TasksChannelsCategory": "Internetes csatornák",
"TasksApplicationCategory": "Alkalmazás", "TasksApplicationCategory": "Alkalmazás",
"TasksLibraryCategory": "Médiatár", "TasksLibraryCategory": "Könyvtár",
"TasksMaintenanceCategory": "Karbantartás", "TasksMaintenanceCategory": "Karbantartás",
"TaskDownloadMissingSubtitlesDescription": "A metaadat-konfiguráció alapján ellenőrzi és letölti a hiányzó feliratokat az internetről.", "TaskDownloadMissingSubtitlesDescription": "A metaadat-konfiguráció alapján ellenőrzi és letölti a hiányzó feliratokat az internetről.",
"TaskDownloadMissingSubtitles": "Hiányzó feliratok letöltése", "TaskDownloadMissingSubtitles": "Hiányzó feliratok letöltése",
@@ -119,22 +119,16 @@
"Undefined": "Meghatározatlan", "Undefined": "Meghatározatlan",
"Forced": "Kényszerített", "Forced": "Kényszerített",
"Default": "Alapértelmezett", "Default": "Alapértelmezett",
"TaskOptimizeDatabaseDescription": "Tömöríti az adatbázist és csonkolja a szabad helyet. A feladat futtatása a médiatár beolvasása, vagy egyéb adatbázis-módosítást igénylő változtatás végrehajtása után, javíthatja a teljesítményt.", "TaskOptimizeDatabaseDescription": "Tömöríti az adatbázist és csonkolja a szabad helyet. A feladat futtatása a könyvtár beolvasása után, vagy egyéb, adatbázis-módosítást igénylő változtatások végrehajtása javíthatja a teljesítményt.",
"TaskOptimizeDatabase": "Adatbázis optimalizálása", "TaskOptimizeDatabase": "Adatbázis optimalizálása",
"TaskKeyframeExtractor": "Kulcsképkockák kibontása", "TaskKeyframeExtractor": "Kulcsképkockák kibontása",
"TaskKeyframeExtractorDescription": "Kibontja a kulcsképkockákat a videófájlokból, hogy pontosabb HLS lejátszási listákat hozzon létre. Ez a feladat hosszú ideig tarthat.", "TaskKeyframeExtractorDescription": "Kibontja a kulcsképkockákat a videófájlokból, hogy pontosabb HLS lejátszási listákat hozzon létre. Ez a feladat hosszú ideig tarthat.",
"External": "Külső", "External": "Külső",
"HearingImpaired": "Hallássérült", "HearingImpaired": "Hallássérült",
"TaskRefreshTrickplayImages": "Trickplay képek előállítása", "TaskRefreshTrickplayImages": "Trickplay képek generálása",
"TaskRefreshTrickplayImagesDescription": "Trickplay előnézetet készít az engedélyezett könyvtárakban lévő videókhoz.", "TaskRefreshTrickplayImagesDescription": "Trickplay előnézetet készít az engedélyezett könyvtárakban lévő videókhoz.",
"TaskAudioNormalization": "Hangerő-normalizálás", "TaskAudioNormalization": "Hangerő Normalizáció",
"TaskCleanCollectionsAndPlaylistsDescription": "Nem létező elemek törlése a gyűjteményekből és lejátszási listákról.", "TaskCleanCollectionsAndPlaylistsDescription": "Nem létező elemek törlése a gyűjteményekből és lejátszási listákról.",
"TaskAudioNormalizationDescription": "Hangerő-normalizálási adatok keresése.", "TaskAudioNormalizationDescription": "Hangerő normalizációs adatok keresése.",
"TaskCleanCollectionsAndPlaylists": "Gyűjtemények és lejátszási listák optimalizálása", "TaskCleanCollectionsAndPlaylists": "Gyűjtemények és lejátszási listák optimalizálása"
"TaskExtractMediaSegments": "Médiaszegmens felismerése",
"TaskDownloadMissingLyrics": "Hiányzó szöveg letöltése",
"TaskDownloadMissingLyricsDescription": "Zenék szövegének letöltése",
"TaskMoveTrickplayImages": "Trickplay képek helyének átköltöztetése",
"TaskMoveTrickplayImagesDescription": "A médiatár-beállításoknak megfelelően áthelyezi a meglévő trickplay fájlokat.",
"TaskExtractMediaSegmentsDescription": "Kinyeri vagy megszerzi a médiaszegmenseket a MediaSegment támogatással rendelkező bővítményekből."
} }

View File

@@ -81,7 +81,7 @@
"Movies": "Film", "Movies": "Film",
"MessageServerConfigurationUpdated": "Konfigurasi server telah diperbarui", "MessageServerConfigurationUpdated": "Konfigurasi server telah diperbarui",
"MessageNamedServerConfigurationUpdatedWithValue": "Bagian konfigurasi server {0} telah diperbarui", "MessageNamedServerConfigurationUpdatedWithValue": "Bagian konfigurasi server {0} telah diperbarui",
"FailedLoginAttemptWithUserName": "Gagal upaya login dari {0}", "FailedLoginAttemptWithUserName": "Gagal melakukan login dari {0}",
"CameraImageUploadedFrom": "Sebuah gambar kamera baru telah diunggah dari {0}", "CameraImageUploadedFrom": "Sebuah gambar kamera baru telah diunggah dari {0}",
"DeviceOfflineWithName": "{0} telah terputus", "DeviceOfflineWithName": "{0} telah terputus",
"DeviceOnlineWithName": "{0} telah terhubung", "DeviceOnlineWithName": "{0} telah terhubung",
@@ -125,9 +125,5 @@
"External": "Luar", "External": "Luar",
"HearingImpaired": "Gangguan Pendengaran", "HearingImpaired": "Gangguan Pendengaran",
"TaskRefreshTrickplayImages": "Hasilkan Gambar Trickplay", "TaskRefreshTrickplayImages": "Hasilkan Gambar Trickplay",
"TaskRefreshTrickplayImagesDescription": "Buat pratinjau trickplay untuk video di perpustakaan yang diaktifkan.", "TaskRefreshTrickplayImagesDescription": "Buat pratinjau trickplay untuk video di perpustakaan yang diaktifkan."
"TaskAudioNormalizationDescription": "Pindai file untuk data normalisasi audio.",
"TaskAudioNormalization": "Normalisasi Audio",
"TaskCleanCollectionsAndPlaylists": "Bersihkan koleksi dan daftar putar",
"TaskCleanCollectionsAndPlaylistsDescription": "Menghapus item dari koleksi dan daftar putar yang sudah tidak ada."
} }

View File

@@ -17,7 +17,7 @@
"Genres": "Stefnur", "Genres": "Stefnur",
"Folders": "Möppur", "Folders": "Möppur",
"Favorites": "Uppáhalds", "Favorites": "Uppáhalds",
"FailedLoginAttemptWithUserName": "{0} mistókst að auðkenna sig", "FailedLoginAttemptWithUserName": "{0} reyndi að auðkenna sig",
"DeviceOnlineWithName": "{0} hefur tengst", "DeviceOnlineWithName": "{0} hefur tengst",
"DeviceOfflineWithName": "{0} hefur aftengst", "DeviceOfflineWithName": "{0} hefur aftengst",
"Collections": "Söfn", "Collections": "Söfn",
@@ -123,13 +123,5 @@
"TaskRefreshChapterImages": "Plokka kafla-myndir", "TaskRefreshChapterImages": "Plokka kafla-myndir",
"TaskCleanActivityLogDescription": "Eyðir virkniskráningarfærslum sem hafa náð settum hámarksaldri.", "TaskCleanActivityLogDescription": "Eyðir virkniskráningarfærslum sem hafa náð settum hámarksaldri.",
"Forced": "Þvingað", "Forced": "Þvingað",
"External": "Útvær", "External": "Útvær"
"TaskRefreshTrickplayImagesDescription": "Býr til hraðspilunarmyndir fyrir myndbönd í virkum söfnum.",
"TaskRefreshTrickplayImages": "Búa til hraðspilunarmyndir",
"TaskAudioNormalization": "Hljóðstöðlun",
"TaskAudioNormalizationDescription": "Leitar að hljóðstöðlunargögnum í skrám.",
"TaskCleanCollectionsAndPlaylists": "Hreinsa söfn og spilunarlista",
"TaskCleanCollectionsAndPlaylistsDescription": "Fjarlægir hluti úr söfnum og spilalistum sem eru ekki lengur til.",
"TaskDownloadMissingLyricsDescription": "Sækja söngtexta fyrir lög",
"TaskDownloadMissingLyrics": "Sækja söngtexta sem vantar"
} }

View File

@@ -51,10 +51,10 @@
"NotificationOptionCameraImageUploaded": "Immagine fotocamera caricata", "NotificationOptionCameraImageUploaded": "Immagine fotocamera caricata",
"NotificationOptionInstallationFailed": "Installazione fallita", "NotificationOptionInstallationFailed": "Installazione fallita",
"NotificationOptionNewLibraryContent": "Nuovo contenuto aggiunto", "NotificationOptionNewLibraryContent": "Nuovo contenuto aggiunto",
"NotificationOptionPluginError": "Errore del plugin", "NotificationOptionPluginError": "Errore del Plug-in",
"NotificationOptionPluginInstalled": "Plugin installato", "NotificationOptionPluginInstalled": "Plug-in installato",
"NotificationOptionPluginUninstalled": "Plugin disinstallato", "NotificationOptionPluginUninstalled": "Plug-in disinstallato",
"NotificationOptionPluginUpdateInstalled": "Aggiornamento plugin installato", "NotificationOptionPluginUpdateInstalled": "Aggiornamento del plug-in installato",
"NotificationOptionServerRestartRequired": "Riavvio del server necessario", "NotificationOptionServerRestartRequired": "Riavvio del server necessario",
"NotificationOptionTaskFailed": "Operazione pianificata fallita", "NotificationOptionTaskFailed": "Operazione pianificata fallita",
"NotificationOptionUserLockedOut": "Utente bloccato", "NotificationOptionUserLockedOut": "Utente bloccato",
@@ -68,10 +68,10 @@
"PluginUpdatedWithName": "{0} è stato aggiornato", "PluginUpdatedWithName": "{0} è stato aggiornato",
"ProviderValue": "Provider: {0}", "ProviderValue": "Provider: {0}",
"ScheduledTaskFailedWithName": "{0} fallito", "ScheduledTaskFailedWithName": "{0} fallito",
"ScheduledTaskStartedWithName": "{0} avviato", "ScheduledTaskStartedWithName": "{0} avviati",
"ServerNameNeedsToBeRestarted": "{0} deve essere riavviato", "ServerNameNeedsToBeRestarted": "{0} deve essere riavviato",
"Shows": "Serie TV", "Shows": "Serie TV",
"Songs": "Brani", "Songs": "Canzoni",
"StartupEmbyServerIsLoading": "Jellyfin server si sta avviando. Per favore riprova più tardi.", "StartupEmbyServerIsLoading": "Jellyfin server si sta avviando. Per favore riprova più tardi.",
"SubtitleDownloadFailureForItem": "Impossibile scaricare i sottotitoli per {0}", "SubtitleDownloadFailureForItem": "Impossibile scaricare i sottotitoli per {0}",
"SubtitleDownloadFailureFromForItem": "Impossibile scaricare i sottotitoli da {0} per {1}", "SubtitleDownloadFailureFromForItem": "Impossibile scaricare i sottotitoli da {0} per {1}",
@@ -83,56 +83,52 @@
"UserDeletedWithName": "L'utente {0} è stato rimosso", "UserDeletedWithName": "L'utente {0} è stato rimosso",
"UserDownloadingItemWithValues": "{0} sta scaricando {1}", "UserDownloadingItemWithValues": "{0} sta scaricando {1}",
"UserLockedOutWithName": "L'utente {0} è stato bloccato", "UserLockedOutWithName": "L'utente {0} è stato bloccato",
"UserOfflineFromDevice": "{0} si è disconnesso da {1}", "UserOfflineFromDevice": "{0} si è disconnesso su {1}",
"UserOnlineFromDevice": "{0} è online su {1}", "UserOnlineFromDevice": "{0} è online su {1}",
"UserPasswordChangedWithName": "La password è stata cambiata per l'utente {0}", "UserPasswordChangedWithName": "La password è stata cambiata per l'utente {0}",
"UserPolicyUpdatedWithName": "La policy dell'utente è stata aggiornata per {0}", "UserPolicyUpdatedWithName": "La policy dell'utente è stata aggiornata per {0}",
"UserStartedPlayingItemWithValues": "{0} ha avviato la riproduzione di {1} su {2}", "UserStartedPlayingItemWithValues": "{0} ha avviato la riproduzione di \"{1}\" su {2}",
"UserStoppedPlayingItemWithValues": "{0} ha interrotto la riproduzione di {1} su {2}", "UserStoppedPlayingItemWithValues": "{0} ha interrotto la riproduzione di {1} su {2}",
"ValueHasBeenAddedToLibrary": "{0} è stato aggiunto alla tua libreria multimediale", "ValueHasBeenAddedToLibrary": "{0} è stato aggiunto alla tua libreria multimediale",
"ValueSpecialEpisodeName": "Speciale - {0}", "ValueSpecialEpisodeName": "Speciale - {0}",
"VersionNumber": "Versione {0}", "VersionNumber": "Versione {0}",
"TaskRefreshChannelsDescription": "Aggiorna le informazioni dei canali internet.", "TaskRefreshChannelsDescription": "Aggiorna le informazioni dei canali Internet.",
"TaskDownloadMissingSubtitlesDescription": "Cerca su internet i sottotitoli mancanti basandosi sulle configurazioni dei metadati.", "TaskDownloadMissingSubtitlesDescription": "Cerca su internet i sottotitoli mancanti basandosi sulle configurazioni dei metadati.",
"TaskDownloadMissingSubtitles": "Scarica i sottotitoli mancanti", "TaskDownloadMissingSubtitles": "Scarica i sottotitoli mancanti",
"TaskRefreshChannels": "Aggiorna canali", "TaskRefreshChannels": "Aggiorna i canali",
"TaskCleanTranscodeDescription": "Cancella i file di transcodifica più vecchi di un giorno.", "TaskCleanTranscodeDescription": "Cancella i file di transcode più vecchi di un giorno.",
"TaskCleanTranscode": "Svuota la cartella della transcodifica", "TaskCleanTranscode": "Svuota la cartella del transcoding",
"TaskUpdatePluginsDescription": "Scarica e installa gli aggiornamenti per i plugin configurati per l'aggiornamento automatico.", "TaskUpdatePluginsDescription": "Scarica e installa gli aggiornamenti per i plugin che sono stati configurati per essere aggiornati contemporaneamente.",
"TaskUpdatePlugins": "Aggiorna i plugin", "TaskUpdatePlugins": "Aggiorna i Plugin",
"TaskRefreshPeopleDescription": "Aggiorna i metadati degli attori e registi nella tua libreria.", "TaskRefreshPeopleDescription": "Aggiorna i metadati per gli attori e registi nella tua libreria multimediale.",
"TaskRefreshPeople": "Aggiorna Persone", "TaskRefreshPeople": "Aggiornamento Persone",
"TaskCleanLogsDescription": "Rimuovi i file di log più vecchi di {0} giorni.", "TaskCleanLogsDescription": "Rimuovi i file di log più vecchi di {0} giorni.",
"TaskCleanLogs": "Pulisci la cartella dei log", "TaskCleanLogs": "Pulisci la cartella dei log",
"TaskRefreshLibraryDescription": "Scansiona la libreria alla ricerca di nuovi file e aggiorna i metadati.", "TaskRefreshLibraryDescription": "Analizza la tua libreria multimediale per nuovi file e rinnova i metadati.",
"TaskRefreshLibrary": "Scansione della libreria", "TaskRefreshLibrary": "Scan Librerie",
"TaskRefreshChapterImagesDescription": "Crea le miniature per i video che hanno capitoli.", "TaskRefreshChapterImagesDescription": "Crea le thumbnail per i video che hanno capitoli.",
"TaskRefreshChapterImages": "Estrai immagini capitolo", "TaskRefreshChapterImages": "Estrai immagini capitolo",
"TaskCleanCacheDescription": "Cancella i file di cache non più necessari al sistema.", "TaskCleanCacheDescription": "Cancella i file di cache non più necessari al sistema.",
"TaskCleanCache": "Pulisci la cartella della cache", "TaskCleanCache": "Pulisci la directory della cache",
"TasksChannelsCategory": "Canali su Internet", "TasksChannelsCategory": "Canali su Internet",
"TasksApplicationCategory": "Applicazione", "TasksApplicationCategory": "Applicazione",
"TasksLibraryCategory": "Libreria", "TasksLibraryCategory": "Libreria",
"TasksMaintenanceCategory": "Manutenzione", "TasksMaintenanceCategory": "Manutenzione",
"TaskCleanActivityLog": "Attività di Registro Completate", "TaskCleanActivityLog": "Attività di Registro Completate",
"TaskCleanActivityLogDescription": "Elimina le voci del registro delle attività più vecchie delletà configurata.", "TaskCleanActivityLogDescription": "Elimina gli inserimenti nel registro delle attività più vecchie delletà configurata.",
"Undefined": "Non Definito", "Undefined": "Non Definito",
"Forced": "Forzato", "Forced": "Forzato",
"Default": "Predefinito", "Default": "Predefinito",
"TaskOptimizeDatabaseDescription": "Compatta database e tronca spazi liberi. Eseguire questa azione dopo la scansione o dopo aver fatto altre modifiche inerenti il database potrebbe aumentarne le prestazioni.", "TaskOptimizeDatabaseDescription": "Compatta Database e tronca spazi liberi. Eseguire questa azione dopo la scansione o dopo aver fatto altri cambiamenti inerenti il database potrebbe aumentarne la performance.",
"TaskOptimizeDatabase": "Ottimizza database", "TaskOptimizeDatabase": "Ottimizza Database",
"TaskKeyframeExtractor": "Estrattore di Keyframe", "TaskKeyframeExtractor": "Estrattore di Keyframe",
"TaskKeyframeExtractorDescription": "Estrae i keyframe dai video per creare migliori playlist HLS. Questa procedura potrebbe richiedere molto tempo.", "TaskKeyframeExtractorDescription": "Estrae i keyframe dai video per creare migliori playlist HLS. Questa procedura potrebbe richiedere molto tempo.",
"External": "Esterno", "External": "Esterno",
"HearingImpaired": "Non Udenti", "HearingImpaired": "con problemi di udito",
"TaskRefreshTrickplayImages": "Genera immagini Trickplay", "TaskRefreshTrickplayImages": "Genera immagini Trickplay",
"TaskRefreshTrickplayImagesDescription": "Crea anteprime trickplay per i video nelle librerie abilitate.", "TaskRefreshTrickplayImagesDescription": "Crea anteprime trickplay per i video nelle librerie abilitate.",
"TaskCleanCollectionsAndPlaylists": "Ripulire le collezioni e le playlist", "TaskCleanCollectionsAndPlaylists": "Ripulire le raccolte e le playlist",
"TaskCleanCollectionsAndPlaylistsDescription": "Rimuove gli elementi dalle collezioni e dalle playlist che non esistono più.", "TaskCleanCollectionsAndPlaylistsDescription": "Rimuove gli elementi dalle raccolte e dalle playlist che non esistono più.",
"TaskAudioNormalization": "Normalizzazione dell'audio", "TaskAudioNormalization": "Normalizzazione Audio",
"TaskAudioNormalizationDescription": "Scansiona i file alla ricerca dei dati per la normalizzazione dell'audio.", "TaskAudioNormalizationDescription": "Scansione files per normalizzazione audio."
"TaskDownloadMissingLyricsDescription": "Scarica testi per le canzoni",
"TaskDownloadMissingLyrics": "Scarica testi mancanti",
"TaskMoveTrickplayImages": "Sposta le immagini Trickplay",
"TaskMoveTrickplayImagesDescription": "Sposta le immagini Trickplay esistenti secondo la configurazione della libreria."
} }

View File

@@ -129,10 +129,5 @@
"TaskCleanCollectionsAndPlaylists": "コレクションとプレイリストをクリーンアップ", "TaskCleanCollectionsAndPlaylists": "コレクションとプレイリストをクリーンアップ",
"TaskAudioNormalization": "音声の正規化", "TaskAudioNormalization": "音声の正規化",
"TaskAudioNormalizationDescription": "音声の正規化データのためにファイルをスキャンします。", "TaskAudioNormalizationDescription": "音声の正規化データのためにファイルをスキャンします。",
"TaskCleanCollectionsAndPlaylistsDescription": "在しなくなったコレクションやプレイリストからアイテムを削除します。", "TaskCleanCollectionsAndPlaylistsDescription": "在しなくなったコレクションやプレイリストからアイテムを削除します。"
"TaskDownloadMissingLyricsDescription": "歌詞をダウンロード",
"TaskExtractMediaSegments": "メディアセグメントを読み取る",
"TaskMoveTrickplayImages": "Trickplayの画像を移動",
"TaskMoveTrickplayImagesDescription": "ライブラリ設定によりTrickplayのファイルを移動。",
"TaskDownloadMissingLyrics": "記録されていない歌詞をダウンロード"
} }

View File

@@ -1,133 +1,3 @@
{ {
"Albums": "អាលប៊ុម", "Albums": "Albums"
"MessageApplicationUpdatedTo": "ម៉ាស៊ីនមេនៃJellyfinត្រូវបានអាប់ដេតទៅកាន់ {0}",
"MessageNamedServerConfigurationUpdatedWithValue": "ការកំណត់ម៉ាស៊ីនមេ ផ្នែក {0} ត្រូវបានអាប់ដេត",
"MessageServerConfigurationUpdated": "ការកំណត់ម៉ាស៊ីនមេត្រូវបានអាប់ដេត",
"AppDeviceValues": "កម្មវិធី: {0}, ឧបករណ៍: {1}",
"MixedContent": "មាតិកាចម្រុះ",
"UserLockedOutWithName": "អ្នកប្រើប្រាស់ {0} ត្រូវ​បាន​ផ្អាក",
"Application": "កម្មវិធី",
"Artists": "សិល្បករ",
"AuthenticationSucceededWithUserName": "{0} បានផ្ទៀងផ្ទាត់ដោយជោគជ័យ",
"Books": "សៀវភៅ",
"NameSeasonNumber": "រដូវកាលទី {0}",
"NotificationOptionPluginInstalled": "Plugin បានដំឡើងរួច",
"CameraImageUploadedFrom": "រូបភាពកាមេរ៉ាថ្មីត្រូវបានបង្ហោះពី {0}",
"Channels": "ប៉ុស្ត៍",
"ChapterNameValue": "ជំពូក {0}",
"Collections": "បណ្តុំ",
"External": "ខាងក្រៅ",
"Default": "លំនាំដើម",
"NotificationOptionInstallationFailed": "ការដំឡើងមិនបានសម្រេច",
"DeviceOfflineWithName": "{0} បានផ្តាច់",
"Folders": "ថតឯកសារ",
"DeviceOnlineWithName": "{0} បានភ្ចាប់",
"HearingImpaired": "ខ្សោយការស្តាប់",
"HomeVideos": "វីឌីអូថតខ្លួនឯង",
"Favorites": "ចំណូលចិត្ត",
"HeaderFavoriteEpisodes": "ភាគដែលចូលចិត្ត",
"Forced": "បង្ខំ",
"Genres": "ប្រភេទ",
"HeaderFavoriteArtists": "សិល្បករដែលចូលចិត្ត",
"NotificationOptionApplicationUpdateAvailable": "កម្មវិធី យើងអាចអាប់ដេតបាន",
"NotificationOptionApplicationUpdateInstalled": "កម្មវិធី ដែលបានដំឡើងរួច",
"NotificationOptionAudioPlaybackStopped": "ការ​ចាក់សម្លេងបានផ្អាក",
"HeaderContinueWatching": "បន្តមើល",
"HeaderFavoriteAlbums": "អាល់ប៊ុមដែលចូលចិត្ត",
"HeaderFavoriteShows": "រឿងភាគដែលចូលចិត្ត",
"NewVersionIsAvailable": "មានជំនាន់ថ្មី ម៉ាស៊ីនមេJellyfin អាចទាញយកបាន.",
"HeaderAlbumArtists": "សិល្បករអាល់ប៊ុម",
"NotificationOptionCameraImageUploaded": "រូបភាពពីកាំមេរ៉ាបានអាប់ឡូតរួច",
"HeaderFavoriteSongs": "ចម្រៀងដែលចូលចិត្ត",
"HeaderNextUp": "បន្ទាប់",
"HeaderLiveTV": "ទូរទស្សន៍ផ្សាយផ្ទាល់",
"Movies": "រឿង",
"HeaderRecordingGroups": "ក្រុមនៃការថត",
"Music": "តន្ត្រី",
"Inherit": "មរតក",
"MusicVideos": "វីដេអូតន្ត្រី",
"NameInstallFailed": "{0} ការដំឡើងបានបរាជ័យ",
"NotificationOptionNewLibraryContent": "មាតិកាថ្មីៗត្រូវបានបន្ថែម",
"ItemAddedWithName": "{0} ត្រូវបានបន្ថែមទៅបណ្ណាល័យ",
"NameSeasonUnknown": "រដូវកាលមិនច្បាស់លាស់",
"ItemRemovedWithName": "{0} ត្រូវបានដកចេញពីបណ្ណាល័យ",
"LabelIpAddressValue": "លេខ IP: {0}",
"LabelRunningTimeValue": "ពេលវេលាកំពុងដំណើរការ: {0}",
"Latest": "ចុងក្រោយ",
"NotificationOptionAudioPlayback": "ការ​ចាក់​សំឡេង​បាន​ចាប់ផ្ដើម",
"NotificationOptionPluginError": "Plugin មិនដំណើរការ",
"NotificationOptionPluginUninstalled": "Plugin បានលុបចេញរួច",
"MessageApplicationUpdated": "ម៉ាស៊ីនមេនៃJellyfinត្រូវបានអាប់ដេត",
"NotificationOptionPluginUpdateInstalled": "Plugin អាប់ដេតបានដំឡើងរួច",
"NotificationOptionUserLockedOut": "អ្នកប្រើប្រាស់ត្រូវបានជាប់គាំង",
"NotificationOptionServerRestartRequired": "តម្រូវឱ្យចាប់ផ្ដើមម៉ាស៊ីនមេឡើងវិញ",
"Photos": "រូបថត",
"Playlists": "បញ្ជីចាក់",
"Plugin": "Plugin",
"PluginInstalledWithName": "{0} ត្រូវបានដំឡើង",
"NotificationOptionTaskFailed": "កិច្ចការដែលបានគ្រោងទុកបានបរាជ័យ",
"PluginUpdatedWithName": "{0} ត្រូវបានអាប់ដេត",
"NotificationOptionVideoPlayback": "ការចាក់វីដេអូបានចាប់ផ្តើម",
"Songs": "ចម្រៀង",
"ScheduledTaskStartedWithName": "{0} បានចាប់ផ្តើម",
"NotificationOptionVideoPlaybackStopped": "ការ​ចាក់​វីដេអូ​បាន​បញ្ឈប់",
"PluginUninstalledWithName": "{0} ត្រូវបានលុបចេញ",
"Shows": "រឿងភាគ",
"ProviderValue": "អ្នកផ្តល់សេវា: {0}",
"SubtitleDownloadFailureFromForItem": "សាប់ថាយថលបានបរាជ័យក្នុងការទាញយកពី {0} នៃ {1}",
"Sync": "ធ្វើអោយដំណាលគ្នា",
"System": "ប្រព័ន្ធ",
"TvShows": "កម្មវិធីទូរទស្សន៍",
"ScheduledTaskFailedWithName": "{0} បានបរាជ័យ",
"Undefined": "មិនបានកំណត់",
"User": "អ្នកប្រើប្រាស់",
"UserCreatedWithName": "អ្នកប្រើប្រាស់ {0} ត្រូវបានបង្កើតឡើង",
"ServerNameNeedsToBeRestarted": "{0} ចាំបាច់ត្រូវចាប់ផ្តើមឡើងវិញ",
"StartupEmbyServerIsLoading": "ម៉ាស៊ីនមេJellyfin កំពុងដំណើរការ. សូមព្យាយាមម្តងទៀតក្នុងពេលឆាប់ៗនេះ.",
"UserDeletedWithName": "អ្នកប្រើប្រាស់ {0} ត្រូវបានលុបចេញ",
"UserOnlineFromDevice": "{0} បានឃើញអនឡានពី {1}",
"UserDownloadingItemWithValues": "{0} កំពុងទាញយក {1}",
"UserOfflineFromDevice": "{0} បានផ្តាច់ចេញពី {1}",
"UserStartedPlayingItemWithValues": "{0} កំពុងចាក់ {1} នៅលើ {2}",
"TaskRefreshChapterImagesDescription": "បង្កើតរូបភាពតូចៗសម្រាប់វីដេអូដែលមានតាមជំពូក.",
"VersionNumber": "កំណែ {0}",
"TasksMaintenanceCategory": "តំហែរទាំ",
"TasksLibraryCategory": "បណ្ណាល័យ",
"TasksApplicationCategory": "កម្មវិធី",
"TaskCleanActivityLog": "សម្អាតកំណត់ហេតុសកម្មភាព",
"UserPasswordChangedWithName": "ពាក្យសម្ងាត់ត្រូវបានផ្លាស់ប្តូរសម្រាប់អ្នកប្រើប្រាស់ {0}",
"TaskCleanCache": "សម្អាតបញ្ជីឃ្លាំងសម្ងាត់",
"TaskRefreshChapterImages": "ដកស្រង់រូបភាពតាមជំពូក",
"UserPolicyUpdatedWithName": "គោលការណ៍អ្នកប្រើប្រាស់ត្រូវបានធ្វើបច្ចុប្បន្នភាពសម្រាប់ {0}",
"UserStoppedPlayingItemWithValues": "{0} បានបញ្ចប់ការចាក់ {1} នៅលើ {2}",
"ValueHasBeenAddedToLibrary": "{0} ត្រូវបានបញ្ចូលទៅក្នុងបណ្ណាល័យរឿងរបស់អ្នក",
"ValueSpecialEpisodeName": "ពិសេស - {0}",
"TasksChannelsCategory": "ប៉ុស្តតាមអ៊ីនធឺណិត",
"TaskAudioNormalization": "ធ្វើឱ្យមានតន្ត្រីមានសម្លេងស្មើគ្នា",
"TaskCleanActivityLogDescription": "លុបកំណត់ហេតុសកម្មភាពចាស់ជាងអាយុដែលបានកំណត់រចនាសម្ព័ន្ធ.",
"TaskCleanCacheDescription": "លុបឯកសារឃ្លាំងសម្ងាត់លែងត្រូវការដោយប្រព័ន្ធ.",
"TaskRefreshLibraryDescription": "ស្កេនបណ្ណាល័យរឿងរបស់អ្នក សម្រាប់ឯកសារថ្មីៗ និងmetadata ឡើងវិញ.",
"TaskCleanLogsDescription": "លុបឯកសារកំណត់ហេតុដែលមានអាយុកាលលើសពី {0} ថ្ងៃ.",
"TaskRefreshPeopleDescription": "ធ្វើបច្ចុប្បន្នភាព metadata សម្រាប់តួសម្តែង និងអ្នកដឹកនាំនៅក្នុងបណ្ណាល័យរឿងរបស់អ្នក.",
"TaskOptimizeDatabaseDescription": "បង្រួម Database និង Truncate free space. ដំណើរការកិច្ចការនេះ បន្ទាប់ពីការស្កេនបណ្ណាល័យ ឬធ្វើការផ្លាស់ប្តូរផ្សេងទៀត ដែលបញ្ជាក់ថា ការកែប្រែ Database អាចធ្វើឱ្យដំណើរការប្រសើរឡើង.",
"TaskRefreshTrickplayImages": "បង្កើតបណ្តុំរូបភាពតាម Trickplay",
"TaskRefreshTrickplayImagesDescription": "បង្កើត​ trickplay previews សម្រាប់​វីដេអូ​ក្នុង​បណ្ណាល័យ​ដែល​បានបង្ហាញ.",
"TaskKeyframeExtractorDescription": "ស្រង់យកFrame គន្លឹះៗពីវីដេអូ ដើម្បីបង្កើតបញ្ជីចាក់ HLS ច្បាស់លាស់ជាងមុន. កិច្ចការនេះអាចនឹងដំណើរការយូរ.",
"FailedLoginAttemptWithUserName": "បរាជ័យក្នុងការព្យាយាមចូលពី {0}",
"TaskCleanTranscode": "សម្អាតថតឯកសារ Transcode",
"TaskRefreshChannelsDescription": "Refreshes ព័ត៌មានបណ្តាញអ៊ីនធឺណិត.",
"TaskDownloadMissingSubtitles": "ទាញយកសាប់ថាយថលដែលបាត់",
"TaskRefreshChannels": "Refresh ឆានែល",
"TaskKeyframeExtractor": "ការញែក Keyframe",
"TaskAudioNormalizationDescription": "ស្កែនឯកសារសម្រាប់ធ្វើឱ្យមានតន្ត្រីមានសម្លេងស្មើគ្នា.",
"TaskRefreshLibrary": "ស្កេនបណ្ណាល័យរឿង",
"TaskCleanLogs": "សម្អាត Log Directory",
"TaskRefreshPeople": "Refresh អ្នកប្រើប្រាស់",
"TaskUpdatePlugins": "ធ្វើបច្ចុប្បន្នភាព Plugins",
"TaskUpdatePluginsDescription": "ទាញយក និងដំឡើងបច្ចុប្បន្នភាពសម្រាប់Plugins ដែលត្រូវបាន Config ដើម្បីធ្វើបច្ចុប្បន្នភាពដោយស្វ័យប្រវត្តិ.",
"TaskCleanTranscodeDescription": "លុបឯកសារ Transcode ដែលលើសពីមួយថ្ងៃ.",
"TaskDownloadMissingSubtitlesDescription": "ស្វែងរកតាមអ៊ីនធឺណិត សម្រាប់សាប់ថាយថល ដែលបាត់ដោយផ្អែកលើ metadata.",
"TaskOptimizeDatabase": "ធ្វើឱ្យ Database ប្រសើរឡើង",
"TaskCleanCollectionsAndPlaylistsDescription": "លុបរបស់របរចេញពីបណ្តុំ និងបញ្ជីចាក់ដែលលែងមាន.",
"TaskCleanCollectionsAndPlaylists": "សម្អាតបណ្តុំ និងបញ្ជីចាក់"
} }

View File

@@ -125,10 +125,5 @@
"TaskKeyframeExtractor": "키프레임 추출", "TaskKeyframeExtractor": "키프레임 추출",
"External": "외부", "External": "외부",
"HearingImpaired": "청각 장애", "HearingImpaired": "청각 장애",
"TaskCleanCollectionsAndPlaylists": "컬렉션과 재생목록 정리", "TaskCleanCollectionsAndPlaylists": "컬렉션과 재생목록 정리"
"TaskAudioNormalization": "오디오의 볼륨 수준을 일정하게 조정",
"TaskAudioNormalizationDescription": "오디오의 볼륨 수준을 일정하게 조정하기 위해 파일을 스캔합니다.",
"TaskRefreshTrickplayImages": "비디오 탐색용 미리보기 썸네일 생성",
"TaskRefreshTrickplayImagesDescription": "활성화된 라이브러리에서 비디오의 트릭플레이 미리보기를 생성합니다.",
"TaskCleanCollectionsAndPlaylistsDescription": "더 이상 존재하지 않는 컬렉션 및 재생 목록에서 항목을 제거합니다."
} }

View File

@@ -1,139 +0,0 @@
{
"Collections": "Kuntellow",
"DeviceOfflineWithName": "{0} re anjunyas",
"External": "A-ves",
"Folders": "Plegellow",
"HeaderFavoriteAlbums": "Albomow Drudh",
"HeaderFavoriteArtists": "Artydhyon Drudh",
"HeaderFavoriteEpisodes": "Towlennow Drudh",
"HeaderFavoriteSongs": "Kanow Drudh",
"HeaderRecordingGroups": "Bagasow Rekordya",
"HearingImpaired": "Klewans Aperys",
"HomeVideos": "Gwydhyow Tre",
"Inherit": "Herya",
"LabelRunningTimeValue": "Prys ow ponya: {0}",
"Latest": "Diwettha",
"MessageApplicationUpdated": "Servell Jellyfin re beu nowedhys",
"MessageApplicationUpdatedTo": "Servell Jellyfin re beu nowedhys dhe {0}",
"MessageNamedServerConfigurationUpdatedWithValue": "Rann dewisyans servell {0} re beu nowedhys",
"MixedContent": "Dalgh kemmyskys",
"Movies": "Fylmow",
"MusicVideos": "Gwydhyow Ilow",
"NameSeasonUnknown": "Seson Anwodhvedhys",
"NotificationOptionAudioPlayback": "Seneans dallethys",
"NotificationOptionAudioPlaybackStopped": "Seneans hedhys",
"NotificationOptionPluginError": "Defowt ystynnans",
"NotificationOptionPluginUninstalled": "Ystynnans anynstallys",
"NotificationOptionPluginUpdateInstalled": "Nowedheans ystynnans ynstallys",
"Application": "Gweythres",
"Favorites": "Moyha Kerys",
"Forced": "Konstrynys",
"Albums": "Albomow",
"Books": "Lyvrow",
"Channels": "Kanolyow",
"AppDeviceValues": "App: {0}, Devis: {1}",
"Artists": "Artyhdyon",
"HeaderAlbumArtists": "Albom artydhyon",
"HeaderNextUp": "Nessa",
"CameraImageUploadedFrom": "Skeusen kamera nowydh re beu ughkargys a-dhyworth {0}",
"ChapterNameValue": "Chaptra {0}",
"FailedLoginAttemptWithUserName": "Assay omgelm fyllys a-dhyworth {0}",
"AuthenticationSucceededWithUserName": "{0} omgelmys yn sewen",
"Default": "Defowt",
"DeviceOnlineWithName": "{0} yw junys",
"ItemRemovedWithName": "{0} a veu dileys a-dhyworth an lyverva",
"LabelIpAddressValue": "Trigva PK: {)}",
"Music": "Ilow",
"HeaderContinueWatching": "Pesya Ow Kweles",
"NameSeasonNumber": "Seson {0}",
"NotificationOptionApplicationUpdateInstalled": "Nowedheans gweythres ynstallys",
"NotificationOptionCameraImageUploaded": "Skeusen kamera ughkargys",
"HeaderFavoriteShows": "Diskwedhyansow Drudh",
"HeaderLiveTV": "PW Yn Fyw",
"MessageServerConfigurationUpdated": "Dewisyans servell re beu nowedhys",
"ItemAddedWithName": "{0} a veu keworrys dhe'n lyverva",
"NameInstallFailed": "{0} ynstallyans fyllys",
"NotificationOptionNewLibraryContent": "Dalgh nowydh keworrys",
"NewVersionIsAvailable": "Yma versyon nowydh a Servell Jellyfin neb yw kavadow rag iskarga.",
"NotificationOptionApplicationUpdateAvailable": "Nowedheans gweythres kavadow",
"NotificationOptionInstallationFailed": "Defowt ynstallyans",
"Genres": "Eghennow",
"NotificationOptionPluginInstalled": "Ystynnans ynstallys",
"NotificationOptionServerRestartRequired": "Dastalleth servell yw res",
"StartupEmbyServerIsLoading": "Yma Servell Jellyfin ow kargya. Assay arta yn berr mar pleg.",
"SubtitleDownloadFailureFromForItem": "Istitlow a fyllis iskarga a-dhyworth {0] rag {1}",
"System": "Kevreyth",
"User": "Devnydhyer",
"UserDeletedWithName": "Devnydhyer {0} re beu dileys",
"UserLockedOutWithName": "Devnydhyer {0} re beu alhwedhys yn-mes",
"UserStoppedPlayingItemWithValues": "{0} re worfennas gwari {1} war {2}",
"UserOfflineFromDevice": "{0} re anjunyas a-dhyworth {1}",
"UserOnlineFromDevice": "{0} yw warlinen a-dhyworth {1}",
"NotificationOptionUserLockedOut": "Devnydhyer yw alhwedhys yn-mes",
"Photos": "Skeusennow",
"Playlists": "Rolyow-gwari",
"Plugin": "Ystynnans",
"PluginInstalledWithName": "{0} a veu ynstallys",
"UserPolicyUpdatedWithName": "Polici devnydhyer re beu nowedhys rag {0}",
"PluginUpdatedWithName": "{0} a veu nowedhys",
"ScheduledTaskFailedWithName": "{0} a fyllis",
"Songs": "Kanow",
"Sync": "Kesseni",
"TvShows": "Towlennow PW",
"Undefined": "Anstyrys",
"UserCreatedWithName": "Devnydhyer {0} re beu gwruthys",
"UserDownloadingItemWithValues": "Yma {0} owth iskarga {1}",
"UserPasswordChangedWithName": "Ger-tremena re beu chanjys rag devnydhyer {0}",
"UserStartedPlayingItemWithValues": "Yma {0} ow kwari {1} war {2}",
"ValueHasBeenAddedToLibrary": "{0} re beu keworrys dhe'th lyverva media",
"VersionNumber": "Versyon {0}",
"TasksLibraryCategory": "Lyverva",
"TaskCleanActivityLog": "Glanhe Kovlyver Gwrians",
"TaskRefreshPeople": "Disegha Tus",
"TaskRefreshLibrary": "Arhwilas Lyverva Media",
"TaskCleanTranscodeDescription": "Y hwra dilea restrennow treylya neg a veu gwrys kyns nans yw dydh.",
"NotificationOptionVideoPlaybackStopped": "Gwareans gwydhyow yw hedhys",
"NotificationOptionVideoPlayback": "Gwareans gwydhyow yw dallethys",
"PluginUninstalledWithName": "{0} a veu anynstallys",
"NotificationOptionTaskFailed": "Defowt oberen towlennys",
"ProviderValue": "Provier: {0}",
"ScheduledTaskStartedWithName": "{0} a dhallathas",
"ServerNameNeedsToBeRestarted": "Yma edhom dhe {0} a vos dastallathys",
"ValueSpecialEpisodeName": "Arbennik - {0}",
"TasksMaintenanceCategory": "Mentons",
"TasksApplicationCategory": "Gweythres",
"TasksChannelsCategory": "Kanolyow Kesrosweyth",
"TaskCleanLogs": "Glanhe Kevarwodhyador Kovlyver",
"TaskAudioNormalization": "Normalheans Klewans",
"TaskRefreshChannels": "Disegha Kanolyow",
"TaskCleanTranscode": "Glanhe Kevarwodhyador Treylya",
"TaskUpdatePlugins": "Nowedhi Ystynansow",
"Shows": "Diskwedhyansow",
"TaskCleanCache": "Glanhe Kevarwodhyador Gwithva",
"TaskCleanActivityLogDescription": "Y hwra dilea lin kovlyver gwrians kottha ages an bloodh dewisys.",
"TaskCleanCacheDescription": "Y hwra dilea restrennow gwithva nag yw res rag an kevreyth.",
"TaskRefreshPeopleDescription": "Y hwra nowedhi metadata rag gwarioryon ha kevarwodhoryon yn dha lyverva media.",
"TaskRefreshChapterImages": "Kuntel Imajys Chaptra",
"TaskRefreshChapterImagesDescription": "Y hwra ewines meus rag gwydhyowyow gans chaptraow.",
"TaskRefreshTrickplayImagesDescription": "Y hwra kynwelyow trickplay rag gwydhyowyow yn lyvervaow gallosegys.",
"TaskRefreshTrickplayImages": "Dinythi Imajys Trickplay",
"TaskCleanLogsDescription": "Y hwra dilea restrennow kovlyver a veu gwrys kyns nans yw {0} dydh.",
"TaskDownloadMissingLyrics": "Iskarga geryow kellys",
"TaskUpdatePluginsDescription": "Y hwra iskarga hag ynstallya nowedheansow rag ystynansow neb yw dewisys dhe nowedhi yn awtomatek.",
"TaskDownloadMissingSubtitles": "Iskarga istitlow kellys",
"TaskRefreshChannelsDescription": "Y hwra disegha kedhlow kanolyow kesrosweyth.",
"TaskDownloadMissingLyricsDescription": "Y hwra iskarga geryow rag kanow",
"TaskDownloadMissingSubtitlesDescription": "Y hwra hwilas an kesrosweyth rag istitlow kellys a-dhywoth dewisyans metadata.",
"TaskOptimizeDatabase": "Gwellhe selvanylyon",
"TaskOptimizeDatabaseDescription": "Y hwra kesstrotha ha berrhe efander rydh. Martesen y hwra gwellhe gwryth mar kwre'ta an oberen ma wosa ty dhe arhwilas an lyverva, po neb chanj aral neb a brof chanjyansow selvanylyon.",
"TaskAudioNormalizationDescription": "Y hwra arhwilas restrennow rag manylyon normalheans klewans.",
"TaskRefreshLibraryDescription": "Y hwra arhwilas dha lyverva media rag restrennow nowydh ha disegha metamanylyon.",
"TaskCleanCollectionsAndPlaylists": "Glanhe kuntellow ha rolyow-gwari",
"TaskKeyframeExtractor": "Estennell Framalhwedh",
"TaskCleanCollectionsAndPlaylistsDescription": "Y hwra dilea taklow a-dhyworth kuntellow ha rolyow-gwari na vos na moy.",
"TaskKeyframeExtractorDescription": "Y hwra kuntel framyowalhwedh a-dhyworth restrennow gwydhyowyow rag gul rolyow-gwari HLS moy poran. Martesen y hwra an oberen ma ow ponya rag termyn hir.",
"TaskExtractMediaSegments": "Arhwilas Rann Media",
"TaskExtractMediaSegmentsDescription": "Kavos rannow media a-dhyworth ystynansow gallosegys MediaSegment.",
"TaskMoveTrickplayImages": "Divroa Tyller Imach TrickPlay",
"TaskMoveTrickplayImagesDescription": "Y hwra movya restrennow a-lemmyn trickplay herwydh settyansow lyverva."
}

View File

@@ -11,7 +11,7 @@
"Collections": "Kolekcijos", "Collections": "Kolekcijos",
"DeviceOfflineWithName": "{0} buvo atjungtas", "DeviceOfflineWithName": "{0} buvo atjungtas",
"DeviceOnlineWithName": "{0} prisijungęs", "DeviceOnlineWithName": "{0} prisijungęs",
"FailedLoginAttemptWithUserName": "Nesėkmingas {0} bandymas prisijungti", "FailedLoginAttemptWithUserName": "Nesėkmingas prisijungimas iš {0}",
"Favorites": "Mėgstami", "Favorites": "Mėgstami",
"Folders": "Katalogai", "Folders": "Katalogai",
"Genres": "Žanrai", "Genres": "Žanrai",
@@ -127,14 +127,6 @@
"HearingImpaired": "Su klausos sutrikimais", "HearingImpaired": "Su klausos sutrikimais",
"TaskRefreshTrickplayImages": "Generuoti Trickplay atvaizdus", "TaskRefreshTrickplayImages": "Generuoti Trickplay atvaizdus",
"TaskRefreshTrickplayImagesDescription": "Sukuria trickplay peržiūras vaizdo įrašams įgalintose bibliotekose.", "TaskRefreshTrickplayImagesDescription": "Sukuria trickplay peržiūras vaizdo įrašams įgalintose bibliotekose.",
"TaskCleanCollectionsAndPlaylists": "Sutvarko duomenis jūsų kolekcijose ir grojaraščiuose", "TaskCleanCollectionsAndPlaylists": "Sutvarko duomenis jūsų kolekcijose ir grojaraščiuose.",
"TaskCleanCollectionsAndPlaylistsDescription": "Pašalina nebeegzistuojančius elementus iš kolekcijų ir grojaraščių.", "TaskCleanCollectionsAndPlaylistsDescription": "Pašalina nebeegzistuojančius elementus iš kolekcijų ir grojaraščių."
"TaskAudioNormalization": "Garso Normalizavimas",
"TaskAudioNormalizationDescription": "Skenuoti garso normalizavimo informacijos failuose.",
"TaskExtractMediaSegments": "Medijos Segmentų Nuskaitymas",
"TaskDownloadMissingLyrics": "Parsisiųsti trūkstamus dainų tekstus",
"TaskExtractMediaSegmentsDescription": "Ištraukia arba gauna medijos segmentus iš MediaSegment ijungtų papildinių.",
"TaskMoveTrickplayImages": "Migruoti Trickplay Vaizdų Vietą",
"TaskMoveTrickplayImagesDescription": "Perkelia egzisuojančius trickplay failus pagal bibliotekos nustatymus.",
"TaskDownloadMissingLyricsDescription": "Parsisiųsti dainų žodžius"
} }

View File

@@ -17,7 +17,7 @@
"Inherit": "Pārmantot", "Inherit": "Pārmantot",
"AppDeviceValues": "Lietotne: {0}, Ierīce: {1}", "AppDeviceValues": "Lietotne: {0}, Ierīce: {1}",
"VersionNumber": "Versija {0}", "VersionNumber": "Versija {0}",
"ValueHasBeenAddedToLibrary": "{0} tika pievienots jūsu multvides bibliotēkai", "ValueHasBeenAddedToLibrary": "{0} ir ticis pievienots jūsu multvides bibliotēkai",
"UserStoppedPlayingItemWithValues": "{0} ir beidzis atskaņot {1} uz {2}", "UserStoppedPlayingItemWithValues": "{0} ir beidzis atskaņot {1} uz {2}",
"UserStartedPlayingItemWithValues": "{0} atskaņo {1} uz {2}", "UserStartedPlayingItemWithValues": "{0} atskaņo {1} uz {2}",
"UserPasswordChangedWithName": "Lietotāja {0} parole tika nomainīta", "UserPasswordChangedWithName": "Lietotāja {0} parole tika nomainīta",
@@ -95,7 +95,7 @@
"TaskRefreshChapterImages": "Izvilkt nodaļu attēlus", "TaskRefreshChapterImages": "Izvilkt nodaļu attēlus",
"TasksApplicationCategory": "Lietotne", "TasksApplicationCategory": "Lietotne",
"TasksLibraryCategory": "Bibliotēka", "TasksLibraryCategory": "Bibliotēka",
"TaskDownloadMissingSubtitlesDescription": "Meklē internetā trūkstošos subtitrus, pamatojoties uz metadatu konfigurāciju.", "TaskDownloadMissingSubtitlesDescription": "Internetā meklē trūkstošus subtitrus balstoties uz metadatu uzstādījumiem.",
"TaskDownloadMissingSubtitles": "Lejupielādēt trūkstošos subtitrus", "TaskDownloadMissingSubtitles": "Lejupielādēt trūkstošos subtitrus",
"TaskRefreshChannelsDescription": "Atjauno interneta kanālu informāciju.", "TaskRefreshChannelsDescription": "Atjauno interneta kanālu informāciju.",
"TaskRefreshChannels": "Atjaunot kanālus", "TaskRefreshChannels": "Atjaunot kanālus",
@@ -105,8 +105,8 @@
"TaskUpdatePlugins": "Atjaunot paplašinājumus", "TaskUpdatePlugins": "Atjaunot paplašinājumus",
"TaskRefreshPeopleDescription": "Atjauno metadatus aktieriem un direktoriem jūsu multivides bibliotēkā.", "TaskRefreshPeopleDescription": "Atjauno metadatus aktieriem un direktoriem jūsu multivides bibliotēkā.",
"TaskRefreshPeople": "Atjaunot cilvēkus", "TaskRefreshPeople": "Atjaunot cilvēkus",
"TaskCleanLogsDescription": "Nodzēš žurnāla ierakstus, kas ir senāki par {0} dienām.", "TaskCleanLogsDescription": "Nodzēš logdatnes, kas ir senākas par {0} dienām.",
"TaskCleanLogs": "Iztīrīt žurnālu mapi", "TaskCleanLogs": "Iztīrīt logdatņu mapi",
"TaskRefreshLibraryDescription": "Skenē jūsu multivides bibliotēku, lai atrastu jaunas datnes, un atsvaidzina metadatus.", "TaskRefreshLibraryDescription": "Skenē jūsu multivides bibliotēku, lai atrastu jaunas datnes, un atsvaidzina metadatus.",
"TaskRefreshLibrary": "Skenēt multivides bibliotēku", "TaskRefreshLibrary": "Skenēt multivides bibliotēku",
"TaskRefreshChapterImagesDescription": "Izveido sīktēlus priekš video ar sadaļām.", "TaskRefreshChapterImagesDescription": "Izveido sīktēlus priekš video ar sadaļām.",
@@ -125,9 +125,5 @@
"TaskKeyframeExtractor": "Atslēgkadru ekstraktors", "TaskKeyframeExtractor": "Atslēgkadru ekstraktors",
"TaskKeyframeExtractorDescription": "Ekstraktē atslēgkadrus no video failiem lai izveidotu precīzākus HLS atskaņošanas sarakstus. Šis process var būt ilgs.", "TaskKeyframeExtractorDescription": "Ekstraktē atslēgkadrus no video failiem lai izveidotu precīzākus HLS atskaņošanas sarakstus. Šis process var būt ilgs.",
"TaskRefreshTrickplayImages": "Ģenerēt partīšanas attēlus", "TaskRefreshTrickplayImages": "Ģenerēt partīšanas attēlus",
"TaskRefreshTrickplayImagesDescription": "Izveido priekšskatījumus videoklipu pārtīšanai iespējotajās bibliotēkās.", "TaskRefreshTrickplayImagesDescription": "Izveido priekšskatījumus videoklipu pārtīšanai iespējotajās bibliotēkās."
"TaskAudioNormalization": "Audio normalizācija",
"TaskCleanCollectionsAndPlaylistsDescription": "Noņem vairs neeksistējošus vienumus no kolekcijām un atskaņošanas sarakstiem.",
"TaskAudioNormalizationDescription": "Skanē failus priekš audio normālizācijas informācijas.",
"TaskCleanCollectionsAndPlaylists": "Notīrīt kolekcijas un atskaņošanas sarakstus"
} }

View File

@@ -55,7 +55,7 @@
"Genres": "Жанрови", "Genres": "Жанрови",
"Folders": "Папки", "Folders": "Папки",
"Favorites": "Омилени", "Favorites": "Омилени",
"FailedLoginAttemptWithUserName": "Неуспешен обид за најавување од {0}", "FailedLoginAttemptWithUserName": "Неуспешно поврзување од {0}",
"DeviceOnlineWithName": "{0} е приклучен", "DeviceOnlineWithName": "{0} е приклучен",
"DeviceOfflineWithName": "{0} се исклучи", "DeviceOfflineWithName": "{0} се исклучи",
"Collections": "Колекции", "Collections": "Колекции",
@@ -123,13 +123,5 @@
"TaskCleanActivityLogDescription": "Избришува логови на активности постари од определеното време.", "TaskCleanActivityLogDescription": "Избришува логови на активности постари од определеното време.",
"TaskCleanActivityLog": "Избриши Лог на Активности", "TaskCleanActivityLog": "Избриши Лог на Активности",
"External": "Надворешен", "External": "Надворешен",
"HearingImpaired": "Оштетен слух", "HearingImpaired": "Оштетен слух"
"TaskCleanCollectionsAndPlaylists": "Исчисти ги колекциите и плејлистите",
"TaskAudioNormalizationDescription": "Скенирање датотеки за податоци за нормализација на звукот.",
"TaskDownloadMissingLyrics": "Преземи стихови кои недостасуваат",
"TaskDownloadMissingLyricsDescription": "Преземи стихови/текстови за песни",
"TaskRefreshTrickplayImages": "Генерирај слики за прегледување (Trickplay)",
"TaskAudioNormalization": "Нормализација на звукот",
"TaskRefreshTrickplayImagesDescription": "Креира трикплеј прегледи за видеа во овозможените библиотеки.",
"TaskCleanCollectionsAndPlaylistsDescription": "Отстранува ставки од колекциите и плејлистите што веќе не постојат."
} }

View File

@@ -6,7 +6,7 @@
"ChapterNameValue": "അധ്യായം {0}", "ChapterNameValue": "അധ്യായം {0}",
"DeviceOfflineWithName": "{0} വിച്ഛേദിച്ചു", "DeviceOfflineWithName": "{0} വിച്ഛേദിച്ചു",
"DeviceOnlineWithName": "{0} ബന്ധിപ്പിച്ചു", "DeviceOnlineWithName": "{0} ബന്ധിപ്പിച്ചു",
"FailedLoginAttemptWithUserName": "{0}ൽ നിന്നുള്ള പ്രവേശന ശ്രമം പരാജയപ്പെട്ടു", "FailedLoginAttemptWithUserName": "{0} - എന്നതിൽ നിന്നുള്ള പ്രവേശന ശ്രമം പരാജയപ്പെട്ടു",
"Forced": "നിർബന്ധിച്ചു", "Forced": "നിർബന്ധിച്ചു",
"HeaderFavoriteAlbums": "പ്രിയപ്പെട്ട ആൽബങ്ങൾ", "HeaderFavoriteAlbums": "പ്രിയപ്പെട്ട ആൽബങ്ങൾ",
"HeaderFavoriteArtists": "പ്രിയപ്പെട്ട കലാകാരന്മാർ", "HeaderFavoriteArtists": "പ്രിയപ്പെട്ട കലാകാരന്മാർ",
@@ -125,9 +125,5 @@
"TaskKeyframeExtractorDescription": "കൂടുതൽ കൃത്യമായ HLS പ്ലേലിസ്റ്റുകൾ സൃഷ്‌ടിക്കുന്നതിന് വീഡിയോ ഫയലുകളിൽ നിന്ന് കീഫ്രെയിമുകൾ എക്‌സ്‌ട്രാക്‌റ്റ് ചെയ്യുന്നു. ഈ പ്രവർത്തനം പൂർത്തിയാവാൻ കുറച്ചധികം സമയം എടുത്തേക്കാം.", "TaskKeyframeExtractorDescription": "കൂടുതൽ കൃത്യമായ HLS പ്ലേലിസ്റ്റുകൾ സൃഷ്‌ടിക്കുന്നതിന് വീഡിയോ ഫയലുകളിൽ നിന്ന് കീഫ്രെയിമുകൾ എക്‌സ്‌ട്രാക്‌റ്റ് ചെയ്യുന്നു. ഈ പ്രവർത്തനം പൂർത്തിയാവാൻ കുറച്ചധികം സമയം എടുത്തേക്കാം.",
"TaskKeyframeExtractor": "കീഫ്രെയിം എക്സ്ട്രാക്റ്റർ", "TaskKeyframeExtractor": "കീഫ്രെയിം എക്സ്ട്രാക്റ്റർ",
"TaskCleanCollectionsAndPlaylistsDescription": "നിലവിലില്ലാത്ത ശേഖരങ്ങളിൽ നിന്നും പ്ലേലിസ്റ്റുകളിൽ നിന്നും ഇനങ്ങൾ നീക്കംചെയ്യുന്നു.", "TaskCleanCollectionsAndPlaylistsDescription": "നിലവിലില്ലാത്ത ശേഖരങ്ങളിൽ നിന്നും പ്ലേലിസ്റ്റുകളിൽ നിന്നും ഇനങ്ങൾ നീക്കംചെയ്യുന്നു.",
"TaskCleanCollectionsAndPlaylists": "ശേഖരങ്ങളും പ്ലേലിസ്റ്റുകളും വൃത്തിയാക്കുക", "TaskCleanCollectionsAndPlaylists": "ശേഖരങ്ങളും പ്ലേലിസ്റ്റുകളും വൃത്തിയാക്കുക"
"TaskAudioNormalization": "സാധാരണ ശബ്ദ നിലയിലെത്തിലെത്തിക്കുക",
"TaskAudioNormalizationDescription": "സാധാരണ ശബ്ദ നിലയിലെത്തിലെത്തിക്കുന്ന ഡാറ്റയ്ക്കായി ഫയലുകൾ സ്കാൻ ചെയ്യുക.",
"TaskRefreshTrickplayImages": "ട്രിക്ക് പ്ലേ ചിത്രങ്ങൾ സൃഷ്ടിക്കുക",
"TaskRefreshTrickplayImagesDescription": "പ്രവർത്തനക്ഷമമാക്കിയ ലൈബ്രറികളിൽ വീഡിയോകൾക്കായി ട്രിക്ക്പ്ലേ പ്രിവ്യൂകൾ സൃഷ്ടിക്കുന്നു."
} }

View File

@@ -126,15 +126,5 @@
"External": "Ekstern", "External": "Ekstern",
"HearingImpaired": "Hørselshemmet", "HearingImpaired": "Hørselshemmet",
"TaskRefreshTrickplayImages": "Generer Trickplay bilder", "TaskRefreshTrickplayImages": "Generer Trickplay bilder",
"TaskRefreshTrickplayImagesDescription": "Oppretter trickplay-forhåndsvisninger for videoer i aktiverte biblioteker.", "TaskRefreshTrickplayImagesDescription": "Oppretter trickplay-forhåndsvisninger for videoer i aktiverte biblioteker."
"TaskCleanCollectionsAndPlaylists": "Rydd kolleksjoner og spillelister",
"TaskAudioNormalization": "Lydnormalisering",
"TaskAudioNormalizationDescription": "Skan filer for lydnormaliserende data.",
"TaskCleanCollectionsAndPlaylistsDescription": "Fjerner elementer fra kolleksjoner og spillelister som ikke lengere finnes.",
"TaskDownloadMissingLyrics": "Last ned manglende tekster",
"TaskDownloadMissingLyricsDescription": "Last ned sangtekster",
"TaskExtractMediaSegments": "Skann mediasegment",
"TaskMoveTrickplayImages": "Migrer bildeplassering for Trickplay",
"TaskMoveTrickplayImagesDescription": "Flytter eksisterende Trickplay-filer i henhold til bibliotekseinstillingene.",
"TaskExtractMediaSegmentsDescription": "Trekker ut eller henter mediasegmenter fra plugins som støtter MediaSegment."
} }

View File

@@ -11,21 +11,21 @@
"Collections": "Collecties", "Collections": "Collecties",
"DeviceOfflineWithName": "Verbinding met {0} is verbroken", "DeviceOfflineWithName": "Verbinding met {0} is verbroken",
"DeviceOnlineWithName": "{0} is verbonden", "DeviceOnlineWithName": "{0} is verbonden",
"FailedLoginAttemptWithUserName": "Mislukte aanmeldpoging vanaf {0}", "FailedLoginAttemptWithUserName": "Mislukte inlogpoging van {0}",
"Favorites": "Favorieten", "Favorites": "Favorieten",
"Folders": "Mappen", "Folders": "Mappen",
"Genres": "Genres", "Genres": "Genres",
"HeaderAlbumArtists": "Albumartiesten", "HeaderAlbumArtists": "Albumartiesten",
"HeaderContinueWatching": "Verderkijken", "HeaderContinueWatching": "Kijken hervatten",
"HeaderFavoriteAlbums": "Favoriete albums", "HeaderFavoriteAlbums": "Favoriete albums",
"HeaderFavoriteArtists": "Favoriete artiesten", "HeaderFavoriteArtists": "Favoriete artiesten",
"HeaderFavoriteEpisodes": "Favoriete afleveringen", "HeaderFavoriteEpisodes": "Favoriete afleveringen",
"HeaderFavoriteShows": "Favoriete series", "HeaderFavoriteShows": "Favoriete shows",
"HeaderFavoriteSongs": "Favoriete nummers", "HeaderFavoriteSongs": "Favoriete nummers",
"HeaderLiveTV": "Live-tv", "HeaderLiveTV": "Live TV",
"HeaderNextUp": "Als volgende", "HeaderNextUp": "Volgende",
"HeaderRecordingGroups": "Opnamegroepen", "HeaderRecordingGroups": "Opnamegroepen",
"HomeVideos": "Homevideo's", "HomeVideos": "Thuis video's",
"Inherit": "Erven", "Inherit": "Erven",
"ItemAddedWithName": "{0} is toegevoegd aan de bibliotheek", "ItemAddedWithName": "{0} is toegevoegd aan de bibliotheek",
"ItemRemovedWithName": "{0} is verwijderd uit de bibliotheek", "ItemRemovedWithName": "{0} is verwijderd uit de bibliotheek",
@@ -34,8 +34,8 @@
"Latest": "Nieuwste", "Latest": "Nieuwste",
"MessageApplicationUpdated": "Jellyfin Server is bijgewerkt", "MessageApplicationUpdated": "Jellyfin Server is bijgewerkt",
"MessageApplicationUpdatedTo": "Jellyfin Server is bijgewerkt naar {0}", "MessageApplicationUpdatedTo": "Jellyfin Server is bijgewerkt naar {0}",
"MessageNamedServerConfigurationUpdatedWithValue": "Sectie {0} van de serverconfiguratie is bijgewerkt", "MessageNamedServerConfigurationUpdatedWithValue": "Sectie {0} van de server configuratie is bijgewerkt",
"MessageServerConfigurationUpdated": "Serverconfiguratie is bijgewerkt", "MessageServerConfigurationUpdated": "Server configuratie is bijgewerkt",
"MixedContent": "Gemengde inhoud", "MixedContent": "Gemengde inhoud",
"Movies": "Films", "Movies": "Films",
"Music": "Muziek", "Music": "Muziek",
@@ -50,14 +50,14 @@
"NotificationOptionAudioPlaybackStopped": "Muziek gestopt", "NotificationOptionAudioPlaybackStopped": "Muziek gestopt",
"NotificationOptionCameraImageUploaded": "Camera-afbeelding geüpload", "NotificationOptionCameraImageUploaded": "Camera-afbeelding geüpload",
"NotificationOptionInstallationFailed": "Installatie mislukt", "NotificationOptionInstallationFailed": "Installatie mislukt",
"NotificationOptionNewLibraryContent": "Nieuwe inhoud toegevoegd", "NotificationOptionNewLibraryContent": "Nieuwe content toegevoegd",
"NotificationOptionPluginError": "Plug-in-fout", "NotificationOptionPluginError": "Plug-in fout",
"NotificationOptionPluginInstalled": "Plug-in geïnstalleerd", "NotificationOptionPluginInstalled": "Plug-in geïnstalleerd",
"NotificationOptionPluginUninstalled": "Plug-in verwijderd", "NotificationOptionPluginUninstalled": "Plug-in verwijderd",
"NotificationOptionPluginUpdateInstalled": "Plug-in-update geïnstalleerd", "NotificationOptionPluginUpdateInstalled": "Plug-in-update geïnstalleerd",
"NotificationOptionServerRestartRequired": "Herstarten server vereist", "NotificationOptionServerRestartRequired": "Server herstart nodig",
"NotificationOptionTaskFailed": "Geplande taak mislukt", "NotificationOptionTaskFailed": "Geplande taak mislukt",
"NotificationOptionUserLockedOut": "Gebruiker buitengesloten", "NotificationOptionUserLockedOut": "Gebruiker is vergrendeld",
"NotificationOptionVideoPlayback": "Afspelen van video gestart", "NotificationOptionVideoPlayback": "Afspelen van video gestart",
"NotificationOptionVideoPlaybackStopped": "Afspelen van video gestopt", "NotificationOptionVideoPlaybackStopped": "Afspelen van video gestopt",
"Photos": "Foto's", "Photos": "Foto's",
@@ -72,38 +72,38 @@
"ServerNameNeedsToBeRestarted": "{0} moet herstart worden", "ServerNameNeedsToBeRestarted": "{0} moet herstart worden",
"Shows": "Series", "Shows": "Series",
"Songs": "Nummers", "Songs": "Nummers",
"StartupEmbyServerIsLoading": "Jellyfin Server is aan het laden. Probeer het later opnieuw.", "StartupEmbyServerIsLoading": "Jellyfin Server is aan het laden, probeer het later opnieuw.",
"SubtitleDownloadFailureForItem": "Downloaden van ondertiteling voor {0} is mislukt", "SubtitleDownloadFailureForItem": "Downloaden van ondertiteling voor {0} is mislukt",
"SubtitleDownloadFailureFromForItem": "Ondertiteling kon niet gedownload worden van {0} voor {1}", "SubtitleDownloadFailureFromForItem": "Ondertitels konden niet gedownload worden van {0} voor {1}",
"Sync": "Synchronisatie", "Sync": "Synchronisatie",
"System": "Systeem", "System": "Systeem",
"TvShows": "Tv-series", "TvShows": "TV-series",
"User": "Gebruiker", "User": "Gebruiker",
"UserCreatedWithName": "Gebruiker {0} is aangemaakt", "UserCreatedWithName": "Gebruiker {0} is aangemaakt",
"UserDeletedWithName": "Gebruiker {0} is verwijderd", "UserDeletedWithName": "Gebruiker {0} is verwijderd",
"UserDownloadingItemWithValues": "{0} downloadt {1}", "UserDownloadingItemWithValues": "{0} download {1}",
"UserLockedOutWithName": "Gebruiker {0} is buitengesloten", "UserLockedOutWithName": "Gebruikersaccount {0} is vergrendeld",
"UserOfflineFromDevice": "Verbinding van {0} via {1} is verbroken", "UserOfflineFromDevice": "Verbinding van {0} met {1} is verbroken",
"UserOnlineFromDevice": "{0} is verbonden via {1}", "UserOnlineFromDevice": "{0} heeft verbinding met {1}",
"UserPasswordChangedWithName": "Wachtwoord voor {0} is gewijzigd", "UserPasswordChangedWithName": "Wachtwoord voor {0} is gewijzigd",
"UserPolicyUpdatedWithName": "Gebruikersbeleid gewijzigd voor {0}", "UserPolicyUpdatedWithName": "Gebruikersbeleid gewijzigd voor {0}",
"UserStartedPlayingItemWithValues": "{0} speelt {1} af op {2}", "UserStartedPlayingItemWithValues": "{0} speelt {1} af op {2}",
"UserStoppedPlayingItemWithValues": "{0} heeft afspelen van {1} gestopt op {2}", "UserStoppedPlayingItemWithValues": "{0} heeft afspelen van {1} gestopt op {2}",
"ValueHasBeenAddedToLibrary": "{0} is toegevoegd aan je mediabibliotheek", "ValueHasBeenAddedToLibrary": "{0} is toegevoegd aan je mediabibliotheek",
"ValueSpecialEpisodeName": "Special - {0}", "ValueSpecialEpisodeName": "Speciaal - {0}",
"VersionNumber": "Versie {0}", "VersionNumber": "Versie {0}",
"TaskDownloadMissingSubtitlesDescription": "Zoekt op het internet naar ontbrekende ondertiteling gebaseerd op metadataconfiguratie.", "TaskDownloadMissingSubtitlesDescription": "Zoekt op het internet naar ontbrekende ondertiteling gebaseerd op metadataconfiguratie.",
"TaskDownloadMissingSubtitles": "Ontbrekende ondertiteling downloaden", "TaskDownloadMissingSubtitles": "Ontbrekende ondertiteling downloaden",
"TaskRefreshChannelsDescription": "Vernieuwt informatie van internetkanalen.", "TaskRefreshChannelsDescription": "Vernieuwt informatie van internet kanalen.",
"TaskRefreshChannels": "Kanalen vernieuwen", "TaskRefreshChannels": "Kanalen vernieuwen",
"TaskCleanTranscodeDescription": "Verwijdert transcoderingsbestanden ouder dan een dag.", "TaskCleanTranscodeDescription": "Verwijdert transcode bestanden ouder dan 1 dag.",
"TaskCleanLogs": "Logboekmap opschonen", "TaskCleanLogs": "Logboekmap opschonen",
"TaskCleanTranscode": "Transcoderingsmap opschonen", "TaskCleanTranscode": "Transcoderingsmap opschonen",
"TaskUpdatePluginsDescription": "Downloadt en installeert updates van plug-ins waarvoor automatisch bijwerken is ingeschakeld.", "TaskUpdatePluginsDescription": "Downloadt en installeert updates van plug-ins waarvoor automatisch bijwerken is ingeschakeld.",
"TaskUpdatePlugins": "Plug-ins bijwerken", "TaskUpdatePlugins": "Plug-ins bijwerken",
"TaskRefreshPeopleDescription": "Werkt metadata bij voor acteurs en regisseurs in je mediabibliotheek.", "TaskRefreshPeopleDescription": "Updatet metadata voor acteurs en regisseurs in je mediabibliotheek.",
"TaskRefreshPeople": "Personen vernieuwen", "TaskRefreshPeople": "Personen vernieuwen",
"TaskCleanLogsDescription": "Verwijdert logboekbestanden ouder dan {0} dagen.", "TaskCleanLogsDescription": "Verwijdert log bestanden ouder dan {0} dagen.",
"TaskRefreshLibraryDescription": "Scant de mediabibliotheek op nieuwe bestanden en vernieuwt de metadata.", "TaskRefreshLibraryDescription": "Scant de mediabibliotheek op nieuwe bestanden en vernieuwt de metadata.",
"TaskRefreshLibrary": "Mediabibliotheek scannen", "TaskRefreshLibrary": "Mediabibliotheek scannen",
"TaskRefreshChapterImagesDescription": "Maakt voorbeeldafbeedingen aan voor video's met hoofdstukken.", "TaskRefreshChapterImagesDescription": "Maakt voorbeeldafbeedingen aan voor video's met hoofdstukken.",
@@ -124,17 +124,11 @@
"TaskKeyframeExtractorDescription": "Haalt keyframes uit videobestanden om preciezere HLS-afspeellijsten te maken. Deze taak kan lang duren.", "TaskKeyframeExtractorDescription": "Haalt keyframes uit videobestanden om preciezere HLS-afspeellijsten te maken. Deze taak kan lang duren.",
"TaskKeyframeExtractor": "Keyframes uitpakken", "TaskKeyframeExtractor": "Keyframes uitpakken",
"External": "Extern", "External": "Extern",
"HearingImpaired": "Slechthorenden", "HearingImpaired": "Slechthorend",
"TaskRefreshTrickplayImages": "Trickplay-afbeeldingen genereren", "TaskRefreshTrickplayImages": "Trickplay-afbeeldingen genereren",
"TaskRefreshTrickplayImagesDescription": "Creëert trickplay-voorvertoningen voor video's in bibliotheken waarvoor dit is ingeschakeld.", "TaskRefreshTrickplayImagesDescription": "Creëert trickplay-voorvertoningen voor video's in bibliotheken waarvoor dit is ingeschakeld.",
"TaskCleanCollectionsAndPlaylists": "Collecties en afspeellijsten opruimen", "TaskCleanCollectionsAndPlaylists": "Collecties en afspeellijsten opruimen",
"TaskCleanCollectionsAndPlaylistsDescription": "Verwijdert niet langer bestaande items uit collecties en afspeellijsten.", "TaskCleanCollectionsAndPlaylistsDescription": "Verwijdert niet langer bestaande items uit collecties en afspeellijsten.",
"TaskAudioNormalization": "Geluidsnormalisatie", "TaskAudioNormalization": "Geluidsnormalisatie",
"TaskAudioNormalizationDescription": "Scant bestanden op gegevens voor geluidsnormalisatie.", "TaskAudioNormalizationDescription": "Scant bestanden op gegevens voor geluidsnormalisatie."
"TaskDownloadMissingLyrics": "Ontbrekende liedteksten downloaden",
"TaskDownloadMissingLyricsDescription": "Downloadt liedteksten",
"TaskExtractMediaSegmentsDescription": "Verkrijgt mediasegmenten vanuit plug-ins met MediaSegment-ondersteuning.",
"TaskMoveTrickplayImages": "Locatie trickplay-afbeeldingen migreren",
"TaskMoveTrickplayImagesDescription": "Verplaatst bestaande trickplay-bestanden op basis van de bibliotheekinstellingen.",
"TaskExtractMediaSegments": "Scannen op mediasegmenten"
} }

View File

@@ -118,6 +118,5 @@
"Undefined": "Udefinert", "Undefined": "Udefinert",
"Forced": "Tvungen", "Forced": "Tvungen",
"Default": "Standard", "Default": "Standard",
"External": "Ekstern", "External": "Ekstern"
"HearingImpaired": "Nedsett høyrsel"
} }

View File

@@ -104,7 +104,7 @@
"Forced": "ਮਜਬੂਰ", "Forced": "ਮਜਬੂਰ",
"Folders": "ਫੋਲਡਰ", "Folders": "ਫੋਲਡਰ",
"Favorites": "ਮਨਪਸੰਦ", "Favorites": "ਮਨਪਸੰਦ",
"FailedLoginAttemptWithUserName": "{0} ਤੋਂ ਲਾਗਇਨ ਦੀ ਕੋਸ਼ਿਸ਼ ਫੇਲ ਹੋਈ", "FailedLoginAttemptWithUserName": "{0} ਤੋਂ ਲਾਗਇਨ ਕੋਸ਼ਿਸ਼ ਫੇਲ ਹੋਈ",
"DeviceOnlineWithName": "{0} ਜੁੜਿਆ ਹੋਇਆ ਹੈ", "DeviceOnlineWithName": "{0} ਜੁੜਿਆ ਹੋਇਆ ਹੈ",
"DeviceOfflineWithName": "{0} ਡਿਸਕਨੈਕਟ ਹੋ ਗਿਆ ਹੈ", "DeviceOfflineWithName": "{0} ਡਿਸਕਨੈਕਟ ਹੋ ਗਿਆ ਹੈ",
"Default": "ਡਿਫੌਲਟ", "Default": "ਡਿਫੌਲਟ",
@@ -119,6 +119,5 @@
"AppDeviceValues": "ਐਪ: {0}, ਜੰਤਰ: {1}", "AppDeviceValues": "ਐਪ: {0}, ਜੰਤਰ: {1}",
"Albums": "ਐਲਬਮਾਂ", "Albums": "ਐਲਬਮਾਂ",
"TaskOptimizeDatabase": "ਡਾਟਾਬੇਸ ਅਨੁਕੂਲ ਬਣਾਓ", "TaskOptimizeDatabase": "ਡਾਟਾਬੇਸ ਅਨੁਕੂਲ ਬਣਾਓ",
"External": "ਬਾਹਰੀ", "External": "ਬਾਹਰੀ"
"HearingImpaired": "ਸੁਨਣ ਵਿਚ ਕਮਜ਼ੋਰ"
} }

View File

@@ -11,7 +11,7 @@
"Collections": "Kolekcje", "Collections": "Kolekcje",
"DeviceOfflineWithName": "{0} został rozłączony", "DeviceOfflineWithName": "{0} został rozłączony",
"DeviceOnlineWithName": "{0} połączył się", "DeviceOnlineWithName": "{0} połączył się",
"FailedLoginAttemptWithUserName": "Nieudana próba logowania przez {0}", "FailedLoginAttemptWithUserName": "Próba logowania przez {0} zakończona niepowodzeniem",
"Favorites": "Ulubione", "Favorites": "Ulubione",
"Folders": "Foldery", "Folders": "Foldery",
"Genres": "Gatunki", "Genres": "Gatunki",
@@ -98,8 +98,8 @@
"TaskRefreshChannels": "Odśwież kanały", "TaskRefreshChannels": "Odśwież kanały",
"TaskCleanTranscodeDescription": "Usuwa transkodowane pliki starsze niż 1 dzień.", "TaskCleanTranscodeDescription": "Usuwa transkodowane pliki starsze niż 1 dzień.",
"TaskCleanTranscode": "Wyczyść folder transkodowania", "TaskCleanTranscode": "Wyczyść folder transkodowania",
"TaskUpdatePluginsDescription": "Pobiera i instaluje aktualizacje wtyczek, które są skonfigurowane do automatycznej aktualizacji.", "TaskUpdatePluginsDescription": "Pobiera i instaluje aktualizacje dla pluginów, które są skonfigurowane do automatycznej aktualizacji.",
"TaskUpdatePlugins": "Aktualizuj wtyczki", "TaskUpdatePlugins": "Aktualizuj pluginy",
"TaskRefreshPeopleDescription": "Odświeża metadane o aktorów i reżyserów w Twojej bibliotece mediów.", "TaskRefreshPeopleDescription": "Odświeża metadane o aktorów i reżyserów w Twojej bibliotece mediów.",
"TaskRefreshPeople": "Odśwież obsadę", "TaskRefreshPeople": "Odśwież obsadę",
"TaskCleanLogsDescription": "Kasuje pliki logów starsze niż {0} dni.", "TaskCleanLogsDescription": "Kasuje pliki logów starsze niż {0} dni.",
@@ -130,11 +130,5 @@
"TaskCleanCollectionsAndPlaylistsDescription": "Usuwa elementy z kolekcji i list odtwarzania, które już nie istnieją.", "TaskCleanCollectionsAndPlaylistsDescription": "Usuwa elementy z kolekcji i list odtwarzania, które już nie istnieją.",
"TaskCleanCollectionsAndPlaylists": "Oczyść kolekcje i listy odtwarzania", "TaskCleanCollectionsAndPlaylists": "Oczyść kolekcje i listy odtwarzania",
"TaskAudioNormalization": "Normalizacja dźwięku", "TaskAudioNormalization": "Normalizacja dźwięku",
"TaskAudioNormalizationDescription": "Skanuje pliki w poszukiwaniu danych normalizacji dźwięku.", "TaskAudioNormalizationDescription": "Skanuje pliki w poszukiwaniu danych normalizacji dźwięku."
"TaskDownloadMissingLyrics": "Pobierz brakujące słowa",
"TaskDownloadMissingLyricsDescription": "Pobierz słowa piosenek",
"TaskExtractMediaSegments": "Skanowanie segmentów mediów",
"TaskMoveTrickplayImages": "Migruj lokalizację obrazu Trickplay",
"TaskExtractMediaSegmentsDescription": "Wyodrębnia lub pobiera segmenty mediów z wtyczek obsługujących MediaSegment.",
"TaskMoveTrickplayImagesDescription": "Przenosi istniejące pliki Trickplay zgodnie z ustawieniami biblioteki."
} }

View File

@@ -8,7 +8,7 @@
"CameraImageUploadedFrom": "Uma nova imagem da câmera foi enviada de {0}", "CameraImageUploadedFrom": "Uma nova imagem da câmera foi enviada de {0}",
"Channels": "Canais", "Channels": "Canais",
"ChapterNameValue": "Capítulo {0}", "ChapterNameValue": "Capítulo {0}",
"Collections": "Coleções", "Collections": "Coletâneas",
"DeviceOfflineWithName": "{0} se desconectou", "DeviceOfflineWithName": "{0} se desconectou",
"DeviceOnlineWithName": "{0} se conectou", "DeviceOnlineWithName": "{0} se conectou",
"FailedLoginAttemptWithUserName": "Falha na tentativa de login de {0}", "FailedLoginAttemptWithUserName": "Falha na tentativa de login de {0}",
@@ -130,11 +130,5 @@
"TaskCleanCollectionsAndPlaylists": "Limpe coleções e playlists", "TaskCleanCollectionsAndPlaylists": "Limpe coleções e playlists",
"TaskCleanCollectionsAndPlaylistsDescription": "Remove itens de coleções e playlists que não existem mais.", "TaskCleanCollectionsAndPlaylistsDescription": "Remove itens de coleções e playlists que não existem mais.",
"TaskAudioNormalization": "Normalização de áudio", "TaskAudioNormalization": "Normalização de áudio",
"TaskAudioNormalizationDescription": "Examina os ficheiros em busca de dados de normalização de áudio.", "TaskAudioNormalizationDescription": "Verifica arquivos em busca de dados de normalização de áudio."
"TaskDownloadMissingLyricsDescription": "Baixar letras para músicas",
"TaskDownloadMissingLyrics": "Baixar letra faltante",
"TaskMoveTrickplayImagesDescription": "Move os arquivos do trickplay de acordo com as configurações da biblioteca.",
"TaskExtractMediaSegments": "Varredura do segmento de mídia",
"TaskExtractMediaSegmentsDescription": "Extrai ou obtém segmentos de mídia de plug-ins habilitados para MediaSegment.",
"TaskMoveTrickplayImages": "Migrar o local da imagem do Trickplay"
} }

View File

@@ -8,7 +8,7 @@
"CameraImageUploadedFrom": "Uma nova imagem de câmara foi enviada a partir de {0}", "CameraImageUploadedFrom": "Uma nova imagem de câmara foi enviada a partir de {0}",
"Channels": "Canais", "Channels": "Canais",
"ChapterNameValue": "Capítulo {0}", "ChapterNameValue": "Capítulo {0}",
"Collections": "Coleções", "Collections": "Colecções",
"DeviceOfflineWithName": "{0} desligou-se", "DeviceOfflineWithName": "{0} desligou-se",
"DeviceOnlineWithName": "{0} ligou-se", "DeviceOnlineWithName": "{0} ligou-se",
"FailedLoginAttemptWithUserName": "Tentativa de login falhada a partir de {0}", "FailedLoginAttemptWithUserName": "Tentativa de login falhada a partir de {0}",
@@ -27,8 +27,8 @@
"HeaderRecordingGroups": "Grupos de Gravação", "HeaderRecordingGroups": "Grupos de Gravação",
"HomeVideos": "Vídeos Caseiros", "HomeVideos": "Vídeos Caseiros",
"Inherit": "Herdar", "Inherit": "Herdar",
"ItemAddedWithName": "{0} foi adicionado à mediateca", "ItemAddedWithName": "{0} foi adicionado à biblioteca",
"ItemRemovedWithName": "{0} foi removido da mediateca", "ItemRemovedWithName": "{0} foi removido da biblioteca",
"LabelIpAddressValue": "Endereço IP: {0}", "LabelIpAddressValue": "Endereço IP: {0}",
"LabelRunningTimeValue": "Duração: {0}", "LabelRunningTimeValue": "Duração: {0}",
"Latest": "Mais Recente", "Latest": "Mais Recente",
@@ -89,37 +89,37 @@
"UserPolicyUpdatedWithName": "Política de utilizador alterada para {0}", "UserPolicyUpdatedWithName": "Política de utilizador alterada para {0}",
"UserStartedPlayingItemWithValues": "{0} está a reproduzir {1} em {2}", "UserStartedPlayingItemWithValues": "{0} está a reproduzir {1} em {2}",
"UserStoppedPlayingItemWithValues": "{0} terminou a reprodução de {1} em {2}", "UserStoppedPlayingItemWithValues": "{0} terminou a reprodução de {1} em {2}",
"ValueHasBeenAddedToLibrary": "{0} foi adicionado à sua mediateca", "ValueHasBeenAddedToLibrary": "{0} foi adicionado à sua biblioteca multimédia",
"ValueSpecialEpisodeName": "Especial - {0}", "ValueSpecialEpisodeName": "Especial - {0}",
"VersionNumber": "Versão {0}", "VersionNumber": "Versão {0}",
"TaskDownloadMissingSubtitlesDescription": "Procurar na internet por legendas em falta baseado na configuração de metadados.", "TaskDownloadMissingSubtitlesDescription": "Procurar na internet por legendas em falta baseado na configuração de metadados.",
"TaskDownloadMissingSubtitles": "Transferir legendas em falta", "TaskDownloadMissingSubtitles": "Fazer download de legendas em falta",
"TaskRefreshChannelsDescription": "Atualizar informação sobre canais da Internet.", "TaskRefreshChannelsDescription": "Atualizar informação sobre canais da Internet.",
"TaskRefreshChannels": "Atualizar Canais", "TaskRefreshChannels": "Atualizar Canais",
"TaskCleanTranscodeDescription": "Apagar ficheiros de transcode com mais de um dia.", "TaskCleanTranscodeDescription": "Apagar ficheiros de transcode com mais de um dia.",
"TaskCleanTranscode": "Limpar a Diretoria de Transcode", "TaskCleanTranscode": "Limpar a Diretoria de Transcode",
"TaskUpdatePluginsDescription": "Faz o download e instala updates para os plugins que estão configurados para atualizar automaticamente.", "TaskUpdatePluginsDescription": "Faz o download e instala updates para os plugins que estão configurados para atualizar automaticamente.",
"TaskUpdatePlugins": "Atualizar Plugins", "TaskUpdatePlugins": "Atualizar Plugins",
"TaskRefreshPeopleDescription": "Atualizar metadados para elenco e equipa técnica da tua mediateca.", "TaskRefreshPeopleDescription": "Atualizar metadados para atores e diretores na biblioteca.",
"TaskRefreshPeople": "Atualizar Pessoas", "TaskRefreshPeople": "Atualizar Pessoas",
"TaskCleanLogsDescription": "Apagar ficheiros de log que têm mais de {0} dias.", "TaskCleanLogsDescription": "Apagar ficheiros de log que têm mais de {0} dias.",
"TaskCleanLogs": "Limpar a Diretoria de Logs", "TaskCleanLogs": "Limpar a Diretoria de Logs",
"TaskRefreshLibraryDescription": "Analisar a mediateca para novos ficheiros e atualizar os metadados.", "TaskRefreshLibraryDescription": "Analisar a biblioteca de música para novos ficheiros e atualizar os metadados.",
"TaskRefreshLibrary": "Analisar mediateca", "TaskRefreshLibrary": "Analisar Biblioteca de Música",
"TaskRefreshChapterImagesDescription": "Criar thumbnails para os vídeos que têm capítulos.", "TaskRefreshChapterImagesDescription": "Criar thumbnails para os vídeos que têm capítulos.",
"TaskRefreshChapterImages": "Extrair Imagens dos Capítulos", "TaskRefreshChapterImages": "Extrair Imagens dos Capítulos",
"TaskCleanCacheDescription": "Apagar ficheiros em cache que já não são necessários.", "TaskCleanCacheDescription": "Apagar ficheiros em cache que já não são necessários.",
"TaskCleanCache": "Limpar Cache", "TaskCleanCache": "Limpar Cache",
"TasksChannelsCategory": "Canais da Internet", "TasksChannelsCategory": "Canais da Internet",
"TasksApplicationCategory": "Aplicação", "TasksApplicationCategory": "Aplicação",
"TasksLibraryCategory": "Mediateca", "TasksLibraryCategory": "Biblioteca",
"TasksMaintenanceCategory": "Manutenção", "TasksMaintenanceCategory": "Manutenção",
"TaskCleanActivityLogDescription": "Apaga as entradas do registo de atividade anteriores à data configurada.", "TaskCleanActivityLogDescription": "Apaga as entradas do registo de atividade anteriores à data configurada.",
"TaskCleanActivityLog": "Limpar registo de atividade", "TaskCleanActivityLog": "Limpar registo de atividade",
"Undefined": "Indefinido", "Undefined": "Indefinido",
"Forced": "Forçado", "Forced": "Forçado",
"Default": "Padrão", "Default": "Padrão",
"TaskOptimizeDatabaseDescription": "Otimiza e liberta espaço livre na base de dados. A execução desta tarefa depois de analisar a mediateca ou efetuar outras alterações que impliquem modificações na base de dados pode melhorar o desempenho.", "TaskOptimizeDatabaseDescription": "Base de dados compacta e corta espaço livre. A execução desta tarefa depois de digitalizar a biblioteca ou de fazer outras alterações que impliquem modificações na base de dados pode melhorar o desempenho.",
"TaskOptimizeDatabase": "Otimizar base de dados", "TaskOptimizeDatabase": "Otimizar base de dados",
"TaskKeyframeExtractorDescription": "Extrai quadros-chave de ficheiros de video para criar listas de reprodução HLS mais precisas. Esta tarefa pode demorar algum tempo.", "TaskKeyframeExtractorDescription": "Extrai quadros-chave de ficheiros de video para criar listas de reprodução HLS mais precisas. Esta tarefa pode demorar algum tempo.",
"TaskKeyframeExtractor": "Extrator de Quadros-chave", "TaskKeyframeExtractor": "Extrator de Quadros-chave",
@@ -130,11 +130,5 @@
"TaskCleanCollectionsAndPlaylistsDescription": "Remove itens de coleções e listas de reprodução que já não existem.", "TaskCleanCollectionsAndPlaylistsDescription": "Remove itens de coleções e listas de reprodução que já não existem.",
"TaskCleanCollectionsAndPlaylists": "Limpar coleções e listas de reprodução", "TaskCleanCollectionsAndPlaylists": "Limpar coleções e listas de reprodução",
"TaskAudioNormalizationDescription": "Analisa os ficheiros para obter dados de normalização de áudio.", "TaskAudioNormalizationDescription": "Analisa os ficheiros para obter dados de normalização de áudio.",
"TaskAudioNormalization": "Normalização de áudio", "TaskAudioNormalization": "Normalização de áudio"
"TaskExtractMediaSegments": "Analisar segmentos de multimédia",
"TaskDownloadMissingLyrics": "Transferir letra em falta",
"TaskMoveTrickplayImages": "Migrar a localização da imagem do Trickplay",
"TaskDownloadMissingLyricsDescription": "Transferir letra para músicas",
"TaskExtractMediaSegmentsDescription": "Extrai ou obtém segmentos de multimédia a partir de plugins com suporte para MediaSegment.",
"TaskMoveTrickplayImagesDescription": "Move os ficheiros trickplay existentes de acordo com as definições da mediateca."
} }

View File

@@ -18,7 +18,7 @@
"Channels": "Canais", "Channels": "Canais",
"UserDownloadingItemWithValues": "{0} está sendo baixado {1}", "UserDownloadingItemWithValues": "{0} está sendo baixado {1}",
"VersionNumber": "Versão {0}", "VersionNumber": "Versão {0}",
"ValueHasBeenAddedToLibrary": "{0} foi adicionado à sua mediateca", "ValueHasBeenAddedToLibrary": "{0} foi adicionado à sua biblioteca multimédia",
"UserStoppedPlayingItemWithValues": "{0} terminou a reprodução de {1} em {2}", "UserStoppedPlayingItemWithValues": "{0} terminou a reprodução de {1} em {2}",
"UserStartedPlayingItemWithValues": "{0} está reproduzindo {1} em {2}", "UserStartedPlayingItemWithValues": "{0} está reproduzindo {1} em {2}",
"UserPolicyUpdatedWithName": "A política do usuário {0} foi alterada", "UserPolicyUpdatedWithName": "A política do usuário {0} foi alterada",
@@ -71,8 +71,8 @@
"Latest": "Mais Recente", "Latest": "Mais Recente",
"LabelRunningTimeValue": "Duração: {0}", "LabelRunningTimeValue": "Duração: {0}",
"LabelIpAddressValue": "Endereço de IP: {0}", "LabelIpAddressValue": "Endereço de IP: {0}",
"ItemRemovedWithName": "{0} foi removido da mediateca", "ItemRemovedWithName": "{0} foi removido da biblioteca",
"ItemAddedWithName": "{0} foi adicionado à mediateca", "ItemAddedWithName": "{0} foi adicionado à biblioteca",
"Inherit": "Herdar", "Inherit": "Herdar",
"HomeVideos": "Vídeos Caseiros", "HomeVideos": "Vídeos Caseiros",
"HeaderRecordingGroups": "Grupos de Gravação", "HeaderRecordingGroups": "Grupos de Gravação",
@@ -93,33 +93,33 @@
"AppDeviceValues": "Aplicação: {0}, Dispositivo: {1}", "AppDeviceValues": "Aplicação: {0}, Dispositivo: {1}",
"TaskCleanCache": "Limpar Diretório de Cache", "TaskCleanCache": "Limpar Diretório de Cache",
"TasksApplicationCategory": "Aplicação", "TasksApplicationCategory": "Aplicação",
"TasksLibraryCategory": "Mediateca", "TasksLibraryCategory": "Biblioteca",
"TasksMaintenanceCategory": "Manutenção", "TasksMaintenanceCategory": "Manutenção",
"TaskRefreshChannels": "Atualizar Canais", "TaskRefreshChannels": "Atualizar Canais",
"TaskUpdatePlugins": "Atualizar Plugins", "TaskUpdatePlugins": "Atualizar Plugins",
"TaskCleanLogsDescription": "Deletar arquivos de log que existe a mais de {0} dias.", "TaskCleanLogsDescription": "Deletar arquivos de log que existe a mais de {0} dias.",
"TaskCleanLogs": "Limpar diretório de logs", "TaskCleanLogs": "Limpar diretório de logs",
"TaskRefreshLibrary": "Analisar mediateca", "TaskRefreshLibrary": "Escanear biblioteca de mídias",
"TaskRefreshChapterImagesDescription": "Cria miniaturas para vídeos que têm capítulos.", "TaskRefreshChapterImagesDescription": "Cria miniaturas para vídeos que têm capítulos.",
"TaskCleanCacheDescription": "Apaga ficheiros em cache que já não são usados pelo sistema.", "TaskCleanCacheDescription": "Apaga ficheiros em cache que já não são usados pelo sistema.",
"TasksChannelsCategory": "Canais de Internet", "TasksChannelsCategory": "Canais de Internet",
"TaskRefreshChapterImages": "Extrair Imagens do Capítulo", "TaskRefreshChapterImages": "Extrair Imagens do Capítulo",
"TaskDownloadMissingSubtitlesDescription": "Pesquisa na Internet as legendas em falta com base na configuração de metadados.", "TaskDownloadMissingSubtitlesDescription": "Pesquisa na Internet as legendas em falta com base na configuração de metadados.",
"TaskDownloadMissingSubtitles": "Transferir legendas em falta", "TaskDownloadMissingSubtitles": "Download das legendas em falta",
"TaskRefreshChannelsDescription": "Atualiza as informações do canal da Internet.", "TaskRefreshChannelsDescription": "Atualiza as informações do canal da Internet.",
"TaskCleanTranscodeDescription": "Apagar os ficheiros com mais de um dia, de Transcode.", "TaskCleanTranscodeDescription": "Apagar os ficheiros com mais de um dia, de Transcode.",
"TaskCleanTranscode": "Limpar o diretório de Transcode", "TaskCleanTranscode": "Limpar o diretório de Transcode",
"TaskUpdatePluginsDescription": "Baixa e instala as atualizações para plug-ins configurados para atualização automática.", "TaskUpdatePluginsDescription": "Baixa e instala as atualizações para plug-ins configurados para atualização automática.",
"TaskRefreshPeopleDescription": "Atualizar metadados para elenco e equipa técnica da tua mediateca.", "TaskRefreshPeopleDescription": "Atualiza os metadados para atores e diretores na tua biblioteca de media.",
"TaskRefreshPeople": "Atualizar pessoas", "TaskRefreshPeople": "Atualizar pessoas",
"TaskRefreshLibraryDescription": "Analisar a mediateca para novos ficheiros e atualizar os metadados.", "TaskRefreshLibraryDescription": "Pesquisa sua biblioteca de media por novos arquivos e atualiza os metadados.",
"TaskCleanActivityLog": "Limpar registro de atividade", "TaskCleanActivityLog": "Limpar registro de atividade",
"Undefined": "Indefinido", "Undefined": "Indefinido",
"Forced": "Forçado", "Forced": "Forçado",
"Default": "Predefinição", "Default": "Predefinição",
"TaskCleanActivityLogDescription": "Apaga itens no registro com idade acima do que é configurado.", "TaskCleanActivityLogDescription": "Apaga itens no registro com idade acima do que é configurado.",
"TaskOptimizeDatabase": "Otimizar base de dados", "TaskOptimizeDatabase": "Otimizar base de dados",
"TaskOptimizeDatabaseDescription": "Otimiza e liberta espaço livre na base de dados. A execução desta tarefa depois de analisar a mediateca ou efetuar outras alterações que impliquem modificações na base de dados pode melhorar o desempenho.", "TaskOptimizeDatabaseDescription": "Base de dados compacta e corta espaço livre. A execução desta tarefa depois de digitalizar a biblioteca ou de fazer outras alterações que impliquem modificações na base de dados pode melhorar o desempenho.",
"External": "Externo", "External": "Externo",
"HearingImpaired": "Problemas auditivos", "HearingImpaired": "Problemas auditivos",
"TaskKeyframeExtractor": "Extrator de quadro-chave", "TaskKeyframeExtractor": "Extrator de quadro-chave",
@@ -129,11 +129,5 @@
"TaskCleanCollectionsAndPlaylistsDescription": "Remove itens de coleções e listas de reprodução que já não existem.", "TaskCleanCollectionsAndPlaylistsDescription": "Remove itens de coleções e listas de reprodução que já não existem.",
"TaskCleanCollectionsAndPlaylists": "Limpar coleções e listas de reprodução", "TaskCleanCollectionsAndPlaylists": "Limpar coleções e listas de reprodução",
"TaskAudioNormalizationDescription": "Analisa os ficheiros para obter dados de normalização de áudio.", "TaskAudioNormalizationDescription": "Analisa os ficheiros para obter dados de normalização de áudio.",
"TaskAudioNormalization": "Normalização de áudio", "TaskAudioNormalization": "Normalização de áudio"
"TaskDownloadMissingLyrics": "Transferir letra em falta",
"TaskDownloadMissingLyricsDescription": "Transferir letra para músicas",
"TaskMoveTrickplayImagesDescription": "Move os ficheiros trickplay existentes de acordo com as definições da mediateca.",
"TaskExtractMediaSegments": "Analisar segmentos de multimédia",
"TaskExtractMediaSegmentsDescription": "Extrai ou obtém segmentos de multimédia a partir de plugins com suporte para MediaSegment.",
"TaskMoveTrickplayImages": "Migrar a localização da imagem do Trickplay"
} }

View File

@@ -78,7 +78,7 @@
"Genres": "Genuri", "Genres": "Genuri",
"Folders": "Dosare", "Folders": "Dosare",
"Favorites": "Favorite", "Favorites": "Favorite",
"FailedLoginAttemptWithUserName": "Încercare de conectare eșuată pentru {0}", "FailedLoginAttemptWithUserName": "Încercare de conectare nereușită de la {0}",
"DeviceOnlineWithName": "{0} este conectat", "DeviceOnlineWithName": "{0} este conectat",
"DeviceOfflineWithName": "{0} s-a deconectat", "DeviceOfflineWithName": "{0} s-a deconectat",
"Collections": "Colecții", "Collections": "Colecții",
@@ -125,15 +125,5 @@
"TaskKeyframeExtractor": "Extractor de cadre cheie", "TaskKeyframeExtractor": "Extractor de cadre cheie",
"HearingImpaired": "Ascultare Impară", "HearingImpaired": "Ascultare Impară",
"TaskRefreshTrickplayImages": "Generează imagini Trickplay", "TaskRefreshTrickplayImages": "Generează imagini Trickplay",
"TaskRefreshTrickplayImagesDescription": "Generează previzualizările trickplay pentru videourile din librăriile selectate.", "TaskRefreshTrickplayImagesDescription": "Generează previzualizările trickplay pentru videourile din librăriile selectate."
"TaskAudioNormalizationDescription": "Scanează fișiere pentru date necesare normalizării sunetului.",
"TaskAudioNormalization": "Normalizare sunet",
"TaskCleanCollectionsAndPlaylists": "Curăță colecțiile și listele de redare",
"TaskCleanCollectionsAndPlaylistsDescription": "Elimină elementele care nu mai există din colecții și liste de redare.",
"TaskExtractMediaSegments": "Scanează segmentele media",
"TaskMoveTrickplayImagesDescription": "Mută fișierele trickplay existente conform setărilor librăriei.",
"TaskExtractMediaSegmentsDescription": "Extrage sau obține segmentele media de la pluginurile MediaSegment activate.",
"TaskMoveTrickplayImages": "Migrează locația imaginii Trickplay",
"TaskDownloadMissingLyrics": "Descarcă versurile lipsă",
"TaskDownloadMissingLyricsDescription": "Descarcă versuri pentru melodii"
} }

View File

@@ -11,7 +11,7 @@
"Collections": "Коллекции", "Collections": "Коллекции",
"DeviceOfflineWithName": "{0} - отключено", "DeviceOfflineWithName": "{0} - отключено",
"DeviceOnlineWithName": "{0} - подключено", "DeviceOnlineWithName": "{0} - подключено",
"FailedLoginAttemptWithUserName": "Неудачная попытка входа с {0}", "FailedLoginAttemptWithUserName": "{0} - попытка входа неудачна",
"Favorites": "Избранное", "Favorites": "Избранное",
"Folders": "Папки", "Folders": "Папки",
"Genres": "Жанры", "Genres": "Жанры",
@@ -31,7 +31,7 @@
"ItemRemovedWithName": "{0} - изъято из медиатеки", "ItemRemovedWithName": "{0} - изъято из медиатеки",
"LabelIpAddressValue": "IP-адрес: {0}", "LabelIpAddressValue": "IP-адрес: {0}",
"LabelRunningTimeValue": "Длительность: {0}", "LabelRunningTimeValue": "Длительность: {0}",
"Latest": "Последние", "Latest": "Последние добавленные",
"MessageApplicationUpdated": "Jellyfin Server был обновлён", "MessageApplicationUpdated": "Jellyfin Server был обновлён",
"MessageApplicationUpdatedTo": "Jellyfin Server был обновлён до {0}", "MessageApplicationUpdatedTo": "Jellyfin Server был обновлён до {0}",
"MessageNamedServerConfigurationUpdatedWithValue": "Конфигурация сервера (раздел {0}) была обновлена", "MessageNamedServerConfigurationUpdatedWithValue": "Конфигурация сервера (раздел {0}) была обновлена",
@@ -128,13 +128,5 @@
"TaskRefreshTrickplayImages": "Сгенерировать изображения для Trickplay", "TaskRefreshTrickplayImages": "Сгенерировать изображения для Trickplay",
"TaskRefreshTrickplayImagesDescription": "Создает предпросмотры для Trickplay для видео в библиотеках, где эта функция включена.", "TaskRefreshTrickplayImagesDescription": "Создает предпросмотры для Trickplay для видео в библиотеках, где эта функция включена.",
"TaskCleanCollectionsAndPlaylists": "Очистка коллекций и списков воспроизведения", "TaskCleanCollectionsAndPlaylists": "Очистка коллекций и списков воспроизведения",
"TaskCleanCollectionsAndPlaylistsDescription": "Удаляет элементы из коллекций и списков воспроизведения, которые больше не существуют.", "TaskCleanCollectionsAndPlaylistsDescription": "Удаляет элементы из коллекций и списков воспроизведения, которые больше не существуют."
"TaskAudioNormalization": "Нормализация звука",
"TaskAudioNormalizationDescription": "Сканирует файлы на наличие данных о нормализации звука.",
"TaskDownloadMissingLyrics": "Загрузить недостающий текст",
"TaskDownloadMissingLyricsDescription": "Загружает текст песен",
"TaskMoveTrickplayImages": "Перенесение местоположения изображений Trickplay",
"TaskExtractMediaSegments": "Сканирование медиасегментов",
"TaskExtractMediaSegmentsDescription": "Извлекает или получает медиасегменты из плагинов MediaSegment.",
"TaskMoveTrickplayImagesDescription": "Перемещает существующие файлы trickplay в соответствии с настройками медиатеки."
} }

View File

@@ -130,11 +130,5 @@
"TaskCleanCollectionsAndPlaylists": "Vyčistiť kolekcie a playlisty", "TaskCleanCollectionsAndPlaylists": "Vyčistiť kolekcie a playlisty",
"TaskCleanCollectionsAndPlaylistsDescription": "Odstráni položky z kolekcií a playlistov, ktoré už neexistujú.", "TaskCleanCollectionsAndPlaylistsDescription": "Odstráni položky z kolekcií a playlistov, ktoré už neexistujú.",
"TaskAudioNormalization": "Normalizácia zvuku", "TaskAudioNormalization": "Normalizácia zvuku",
"TaskAudioNormalizationDescription": "Skenovať súbory za účelom normalizácie zvuku.", "TaskAudioNormalizationDescription": "Skenovať súbory za účelom normalizácie zvuku."
"TaskExtractMediaSegments": "Skenovanie segmentov médií",
"TaskExtractMediaSegmentsDescription": "Extrahuje alebo získava segmenty médií zo zásuvných modulov s povolenou funkciou MediaSegment.",
"TaskMoveTrickplayImages": "Presunúť umiestnenie obrázkov Trickplay",
"TaskMoveTrickplayImagesDescription": "Presunie existujúce súbory Trickplay podľa nastavení knižnice.",
"TaskDownloadMissingLyrics": "Stiahnuť chýbajúce texty piesní",
"TaskDownloadMissingLyricsDescription": "Stiahne texty pre piesne"
} }

View File

@@ -3,7 +3,7 @@
"AppDeviceValues": "Aplikacija: {0}, Naprava: {1}", "AppDeviceValues": "Aplikacija: {0}, Naprava: {1}",
"Application": "Aplikacija", "Application": "Aplikacija",
"Artists": "Izvajalci", "Artists": "Izvajalci",
"AuthenticationSucceededWithUserName": "{0} se je uspešno prijavil/a", "AuthenticationSucceededWithUserName": "{0} se je uspešno prijavil",
"Books": "Knjige", "Books": "Knjige",
"CameraImageUploadedFrom": "Nova fotografija je bila naložena iz {0}", "CameraImageUploadedFrom": "Nova fotografija je bila naložena iz {0}",
"Channels": "Kanali", "Channels": "Kanali",

View File

@@ -9,14 +9,14 @@
"Channels": "Kanaler", "Channels": "Kanaler",
"ChapterNameValue": "Kapitel {0}", "ChapterNameValue": "Kapitel {0}",
"Collections": "Samlingar", "Collections": "Samlingar",
"DeviceOfflineWithName": "{0} har kopplat ned", "DeviceOfflineWithName": "{0} har avbrutit uppkopplingen",
"DeviceOnlineWithName": "{0} är ansluten", "DeviceOnlineWithName": "{0} är ansluten",
"FailedLoginAttemptWithUserName": "Misslyckat inloggningsförsök från {0}", "FailedLoginAttemptWithUserName": "Misslyckat inloggningsförsök från {0}",
"Favorites": "Favoriter", "Favorites": "Favoriter",
"Folders": "Mappar", "Folders": "Mappar",
"Genres": "Genrer", "Genres": "Genrer",
"HeaderAlbumArtists": "Albumartister", "HeaderAlbumArtists": "Albumartister",
"HeaderContinueWatching": "Fortsätt titta", "HeaderContinueWatching": "Fortsätt titta",
"HeaderFavoriteAlbums": "Favoritalbum", "HeaderFavoriteAlbums": "Favoritalbum",
"HeaderFavoriteArtists": "Favoritartister", "HeaderFavoriteArtists": "Favoritartister",
"HeaderFavoriteEpisodes": "Favoritavsnitt", "HeaderFavoriteEpisodes": "Favoritavsnitt",
@@ -121,20 +121,11 @@
"Default": "Standard", "Default": "Standard",
"TaskOptimizeDatabase": "Optimera databasen", "TaskOptimizeDatabase": "Optimera databasen",
"TaskOptimizeDatabaseDescription": "Komprimerar databasen och trunkerar ledigt utrymme. Prestandan kan förbättras genom att köra denna aktivitet efter att du har skannat biblioteket eller gjort andra förändringar som indikerar att databasen har modifierats.", "TaskOptimizeDatabaseDescription": "Komprimerar databasen och trunkerar ledigt utrymme. Prestandan kan förbättras genom att köra denna aktivitet efter att du har skannat biblioteket eller gjort andra förändringar som indikerar att databasen har modifierats.",
"TaskKeyframeExtractorDescription": "Exporterar nyckelbildrutor från videofiler för att skapa mer exakta HLS-spellistor. Denna körning kan ta lång tid.", "TaskKeyframeExtractorDescription": "Exporterar nyckelbildrutor från videofiler för att skapa mer exakta HLS-spellistor. Denna rutin kan ta lång tid.",
"TaskKeyframeExtractor": "Extraktor för nyckelbildrutor", "TaskKeyframeExtractor": "Extraktor för nyckelbildrutor",
"External": "Extern", "External": "Extern",
"HearingImpaired": "Hörselskadad", "HearingImpaired": "Hörselskadad",
"TaskRefreshTrickplayImages": "Generera Trickplay-bilder", "TaskRefreshTrickplayImages": "Generera Trickplay-bilder",
"TaskRefreshTrickplayImagesDescription": "Skapar trickplay-förhandsvisningar för videor i aktiverade bibliotek.", "TaskRefreshTrickplayImagesDescription": "Skapar trickplay-förhandsvisningar för videor i aktiverade bibliotek.",
"TaskCleanCollectionsAndPlaylists": "Rensa upp samlingar och spellistor", "TaskCleanCollectionsAndPlaylists": "Rensa samlingar och spellistor"
"TaskAudioNormalization": "Ljudnormalisering",
"TaskCleanCollectionsAndPlaylistsDescription": "Tar bort objekt från samlingar och spellistor som inte längre finns.",
"TaskAudioNormalizationDescription": "Skannar filer för ljudnormaliseringsdata.",
"TaskDownloadMissingLyrics": "Ladda ner saknad låttext",
"TaskDownloadMissingLyricsDescription": "Laddar ner låttexter",
"TaskExtractMediaSegments": "Skanning av mediesegment",
"TaskExtractMediaSegmentsDescription": "Extraherar eller hämtar ut mediesegmen från tillägg som stöder MediaSegment.",
"TaskMoveTrickplayImages": "Migrera platsen för Trickplay-bilder",
"TaskMoveTrickplayImagesDescription": "Flyttar befintliga trickplay-filer enligt bibliotekets inställningar."
} }

View File

@@ -125,9 +125,5 @@
"External": "வெளி", "External": "வெளி",
"HearingImpaired": "செவித்திறன் குறைபாடுடையவர்", "HearingImpaired": "செவித்திறன் குறைபாடுடையவர்",
"TaskRefreshTrickplayImages": "முன்னோட்ட படங்களை உருவாக்கு", "TaskRefreshTrickplayImages": "முன்னோட்ட படங்களை உருவாக்கு",
"TaskRefreshTrickplayImagesDescription": "செயல்பாட்டில் உள்ள தொகுப்புகளுக்கு முன்னோட்ட படங்களை உருவாக்கும்.", "TaskRefreshTrickplayImagesDescription": "செயல்பாட்டில் உள்ள தொகுப்புகளுக்கு முன்னோட்ட படங்களை உருவாக்கும்."
"TaskCleanCollectionsAndPlaylists": "சேகரிப்புகள் மற்றும் பிளேலிஸ்ட்களை சுத்தம் செய்யவும்",
"TaskCleanCollectionsAndPlaylistsDescription": "சேகரிப்புகள் மற்றும் பிளேலிஸ்ட்களில் இருந்து உருப்படிகளை நீக்குகிறது.",
"TaskAudioNormalization": "ஆடியோ இயல்பாக்கம்",
"TaskAudioNormalizationDescription": "ஆடியோ இயல்பாக்குதல் தரவுக்காக கோப்புகளை ஸ்கேன் செய்கிறது."
} }

View File

@@ -123,7 +123,5 @@
"External": "ภายนอก", "External": "ภายนอก",
"HearingImpaired": "บกพร่องทางการได้ยิน", "HearingImpaired": "บกพร่องทางการได้ยิน",
"TaskKeyframeExtractor": "ตัวแยกคีย์เฟรม", "TaskKeyframeExtractor": "ตัวแยกคีย์เฟรม",
"TaskKeyframeExtractorDescription": "แยกคีย์เฟรมจากไฟล์วีดีโอเพื่อสร้างรายการ HLS ให้ถูกต้อง. กระบวนการนี้อาจใช้ระยะเวลานาน", "TaskKeyframeExtractorDescription": "แยกคีย์เฟรมจากไฟล์วีดีโอเพื่อสร้างรายการ HLS ให้ถูกต้อง. กระบวนการนี้อาจใช้ระยะเวลานาน"
"TaskRefreshTrickplayImages": "สร้างไฟล์รูปภาพสำหรับ Trickplay",
"TaskRefreshTrickplayImagesDescription": "สร้างภาพตัวอย่างของวีดีโอในคลังที่เปิดใช้งาน Trickplay"
} }

View File

@@ -11,7 +11,7 @@
"Collections": "Koleksiyonlar", "Collections": "Koleksiyonlar",
"DeviceOfflineWithName": "{0} bağlantısı kesildi", "DeviceOfflineWithName": "{0} bağlantısı kesildi",
"DeviceOnlineWithName": "{0} bağlı", "DeviceOnlineWithName": "{0} bağlı",
"FailedLoginAttemptWithUserName": "{0} kullanıcısının başarısız oturum açma girişimi", "FailedLoginAttemptWithUserName": "{0} kullanıcısının giriş denemesi başarısız oldu",
"Favorites": "Favoriler", "Favorites": "Favoriler",
"Folders": "Klasörler", "Folders": "Klasörler",
"Genres": "Türler", "Genres": "Türler",
@@ -130,11 +130,5 @@
"TaskCleanCollectionsAndPlaylistsDescription": "Artık var olmayan koleksiyon ve çalma listelerindeki ögeleri kaldırır.", "TaskCleanCollectionsAndPlaylistsDescription": "Artık var olmayan koleksiyon ve çalma listelerindeki ögeleri kaldırır.",
"TaskCleanCollectionsAndPlaylists": "Koleksiyonları ve çalma listelerini temizleyin", "TaskCleanCollectionsAndPlaylists": "Koleksiyonları ve çalma listelerini temizleyin",
"TaskAudioNormalizationDescription": "Ses normalleştirme verileri için dosyaları tarar.", "TaskAudioNormalizationDescription": "Ses normalleştirme verileri için dosyaları tarar.",
"TaskAudioNormalization": "Ses Normalleştirme", "TaskAudioNormalization": "Ses Normalleştirme"
"TaskExtractMediaSegments": "Medya Segmenti Tarama",
"TaskMoveTrickplayImages": "Trickplay Görsel Konumunu Taşıma",
"TaskMoveTrickplayImagesDescription": "Mevcut trickplay dosyalarını kütüphane ayarlarına göre taşır.",
"TaskDownloadMissingLyrics": "Eksik şarkı sözlerini indir",
"TaskDownloadMissingLyricsDescription": "Şarkı sözlerini indirir",
"TaskExtractMediaSegmentsDescription": "MediaSegment özelliği etkin olan eklentilerden medya segmentlerini çıkarır veya alır."
} }

View File

@@ -129,11 +129,5 @@
"TaskCleanCollectionsAndPlaylists": "Очистити колекції і списки відтворення", "TaskCleanCollectionsAndPlaylists": "Очистити колекції і списки відтворення",
"TaskCleanCollectionsAndPlaylistsDescription": "Видаляє елементи з колекцій і списків відтворення, які більше не існують.", "TaskCleanCollectionsAndPlaylistsDescription": "Видаляє елементи з колекцій і списків відтворення, які більше не існують.",
"TaskAudioNormalizationDescription": "Сканує файли на наявність даних для нормалізації звуку.", "TaskAudioNormalizationDescription": "Сканує файли на наявність даних для нормалізації звуку.",
"TaskAudioNormalization": "Нормалізація аудіо", "TaskAudioNormalization": "Нормалізація аудіо"
"TaskDownloadMissingLyrics": "Завантажити відсутні тексти пісень",
"TaskDownloadMissingLyricsDescription": "Завантаження текстів пісень",
"TaskMoveTrickplayImagesDescription": "Переміщує наявні Trickplay-зображення відповідно до налаштувань медіатеки.",
"TaskExtractMediaSegments": "Сканування медіа-сегментів",
"TaskMoveTrickplayImages": "Змінити місце розташування Trickplay-зображень",
"TaskExtractMediaSegmentsDescription": "Витягує або отримує медіа-сегменти з плагінів з підтримкою MediaSegment."
} }

View File

@@ -8,20 +8,5 @@
"Channels": "Kanallar", "Channels": "Kanallar",
"Books": "Kitoblar", "Books": "Kitoblar",
"Artists": "Ijrochilar", "Artists": "Ijrochilar",
"Albums": "Albomlar", "Albums": "Albomlar"
"AuthenticationSucceededWithUserName": "{0} muvaffaqiyatli tasdiqlandi",
"AppDeviceValues": "Ilova: {0}, Qurilma: {1}",
"Application": "Ilova",
"CameraImageUploadedFrom": "{0}dan yangi kamera rasmi yuklandi",
"DeviceOnlineWithName": "{0} ulangan",
"ItemRemovedWithName": "{0} kutbxonadan o'chirildi",
"External": "Tashqi",
"FailedLoginAttemptWithUserName": "Muvafaqiyatsiz kirishlar soni {0}",
"Forced": "Majburiy",
"ChapterNameValue": "{0}chi bo'lim",
"DeviceOfflineWithName": "{0} aloqa uzildi",
"HeaderLiveTV": "Jonli TV",
"HeaderNextUp": "Keyingisi",
"ItemAddedWithName": "{0} kutbxonaga qo'shildi",
"LabelIpAddressValue": "IP manzil: {0}"
} }

View File

@@ -103,11 +103,11 @@
"HeaderFavoriteEpisodes": "Tập Phim Yêu Thích", "HeaderFavoriteEpisodes": "Tập Phim Yêu Thích",
"HeaderFavoriteArtists": "Nghệ Sĩ Yêu Thích", "HeaderFavoriteArtists": "Nghệ Sĩ Yêu Thích",
"HeaderFavoriteAlbums": "Album Ưa Thích", "HeaderFavoriteAlbums": "Album Ưa Thích",
"FailedLoginAttemptWithUserName": "Nỗ lực đăng nhập không thành công từ {0}", "FailedLoginAttemptWithUserName": "Đăng nhập không thành công thử từ {0}",
"DeviceOnlineWithName": "{0} đã kết nối", "DeviceOnlineWithName": "{0} đã kết nối",
"DeviceOfflineWithName": "{0} đã ngắt kết nối", "DeviceOfflineWithName": "{0} đã ngắt kết nối",
"ChapterNameValue": "Phân Cảnh {0}", "ChapterNameValue": "Phân Cảnh {0}",
"Channels": "Kênh", "Channels": "Các Kênh",
"CameraImageUploadedFrom": "Một hình ảnh máy ảnh mới đã được tải lên từ {0}", "CameraImageUploadedFrom": "Một hình ảnh máy ảnh mới đã được tải lên từ {0}",
"Books": "Sách", "Books": "Sách",
"AuthenticationSucceededWithUserName": "{0} xác thực thành công", "AuthenticationSucceededWithUserName": "{0} xác thực thành công",
@@ -127,13 +127,5 @@
"TaskRefreshTrickplayImages": "Tạo Ảnh Xem Trước Trickplay", "TaskRefreshTrickplayImages": "Tạo Ảnh Xem Trước Trickplay",
"TaskRefreshTrickplayImagesDescription": "Tạo bản xem trước trịckplay cho video trong thư viện đã bật.", "TaskRefreshTrickplayImagesDescription": "Tạo bản xem trước trịckplay cho video trong thư viện đã bật.",
"TaskCleanCollectionsAndPlaylists": "Dọn dẹp bộ sưu tập và danh sách phát", "TaskCleanCollectionsAndPlaylists": "Dọn dẹp bộ sưu tập và danh sách phát",
"TaskCleanCollectionsAndPlaylistsDescription": "Xóa các mục khỏi bộ sưu tập và danh sách phát không còn tồn tại.", "TaskCleanCollectionsAndPlaylistsDescription": "Xóa các mục khỏi bộ sưu tập và danh sách phát không còn tồn tại."
"TaskAudioNormalization": "Chuẩn Hóa Âm Thanh",
"TaskAudioNormalizationDescription": "Quét tập tin để tìm dữ liệu chuẩn hóa âm thanh.",
"TaskDownloadMissingLyricsDescription": "Tải xuống lời cho bài hát",
"TaskDownloadMissingLyrics": "Tải xuống lời bị thiếu",
"TaskExtractMediaSegmentsDescription": "Trích xuất hoặc lấy các phân đoạn phương tiện từ các plugin hỗ trợ MediaSegment.",
"TaskMoveTrickplayImages": "Di chuyển vị trí hình ảnh Trickplay",
"TaskMoveTrickplayImagesDescription": "Di chuyển các tập tin trickplay hiện có theo cài đặt thư viện.",
"TaskExtractMediaSegments": "Quét Phân Đoạn Phương Tiện"
} }

View File

@@ -11,7 +11,7 @@
"Collections": "合集", "Collections": "合集",
"DeviceOfflineWithName": "{0} 已断开", "DeviceOfflineWithName": "{0} 已断开",
"DeviceOnlineWithName": "{0} 已连接", "DeviceOnlineWithName": "{0} 已连接",
"FailedLoginAttemptWithUserName": "来自 {0} 的登录尝试失败", "FailedLoginAttemptWithUserName": " {0} 尝试登录失败",
"Favorites": "我的最爱", "Favorites": "我的最爱",
"Folders": "文件夹", "Folders": "文件夹",
"Genres": "类型", "Genres": "类型",
@@ -93,7 +93,7 @@
"ValueSpecialEpisodeName": "特典 - {0}", "ValueSpecialEpisodeName": "特典 - {0}",
"VersionNumber": "版本 {0}", "VersionNumber": "版本 {0}",
"TaskUpdatePluginsDescription": "为已设置为自动更新的插件下载和安装更新。", "TaskUpdatePluginsDescription": "为已设置为自动更新的插件下载和安装更新。",
"TaskRefreshPeople": "刷新演职人员", "TaskRefreshPeople": "刷新人员",
"TasksChannelsCategory": "互联网频道", "TasksChannelsCategory": "互联网频道",
"TasksLibraryCategory": "媒体库", "TasksLibraryCategory": "媒体库",
"TaskDownloadMissingSubtitlesDescription": "根据元数据设置在互联网上搜索缺少的字幕。", "TaskDownloadMissingSubtitlesDescription": "根据元数据设置在互联网上搜索缺少的字幕。",
@@ -122,19 +122,13 @@
"TaskOptimizeDatabaseDescription": "压缩数据库并优化可用空间,在扫描库或执行其他数据库修改后运行此任务可能会提高性能。", "TaskOptimizeDatabaseDescription": "压缩数据库并优化可用空间,在扫描库或执行其他数据库修改后运行此任务可能会提高性能。",
"TaskOptimizeDatabase": "优化数据库", "TaskOptimizeDatabase": "优化数据库",
"TaskKeyframeExtractorDescription": "从视频文件中提取关键帧以创建更准确的 HLS 播放列表。这项任务可能需要很长时间。", "TaskKeyframeExtractorDescription": "从视频文件中提取关键帧以创建更准确的 HLS 播放列表。这项任务可能需要很长时间。",
"TaskKeyframeExtractor": "关键帧提取", "TaskKeyframeExtractor": "关键帧提取",
"External": "外部", "External": "外部",
"HearingImpaired": "听力障碍", "HearingImpaired": "听力障碍",
"TaskRefreshTrickplayImages": "生成进度条预览图", "TaskRefreshTrickplayImages": "生成时间轴缩略图",
"TaskRefreshTrickplayImagesDescription": "为启用的媒体库中的视频生成进度条预览图。", "TaskRefreshTrickplayImagesDescription": "为启用的媒体库中的视频生成时间轴缩略图。",
"TaskCleanCollectionsAndPlaylists": "清理合集和播放列表", "TaskCleanCollectionsAndPlaylists": "清理合集和播放列表",
"TaskCleanCollectionsAndPlaylistsDescription": "清理合集和播放列表中已不存在的项目。", "TaskCleanCollectionsAndPlaylistsDescription": "清理合集和播放列表中已不存在的项目。",
"TaskAudioNormalization": "音频标准化", "TaskAudioNormalization": "音频标准化",
"TaskAudioNormalizationDescription": "扫描文件以寻找音频标准化数据。", "TaskAudioNormalizationDescription": "扫描文件以寻找音频标准化数据。"
"TaskDownloadMissingLyrics": "下载缺失的歌词",
"TaskDownloadMissingLyricsDescription": "下载歌曲歌词",
"TaskMoveTrickplayImages": "迁移进度条预览图的存储位置",
"TaskExtractMediaSegments": "媒体分段扫描",
"TaskExtractMediaSegmentsDescription": "从支持 MediaSegment 的插件中提取或获取媒体分段。",
"TaskMoveTrickplayImagesDescription": "根据媒体库设置移动现有的进度条预览图文件。"
} }

View File

@@ -127,13 +127,5 @@
"TaskRefreshTrickplayImages": "生成快轉縮圖", "TaskRefreshTrickplayImages": "生成快轉縮圖",
"TaskRefreshTrickplayImagesDescription": "為啟用快轉縮圖的媒體庫生成快轉縮圖。", "TaskRefreshTrickplayImagesDescription": "為啟用快轉縮圖的媒體庫生成快轉縮圖。",
"TaskCleanCollectionsAndPlaylists": "清理系列和播放清單", "TaskCleanCollectionsAndPlaylists": "清理系列和播放清單",
"TaskCleanCollectionsAndPlaylistsDescription": "清理系列和播放清單中已不存在的項目。", "TaskCleanCollectionsAndPlaylistsDescription": "清理系列和播放清單中已不存在的項目。"
"TaskAudioNormalization": "音量標準化",
"TaskAudioNormalizationDescription": "掃描文件以找出音量標準化資料。",
"TaskDownloadMissingLyrics": "下載缺少的歌詞",
"TaskDownloadMissingLyricsDescription": "卡在歌曲歌詞",
"TaskExtractMediaSegments": "掃描媒體片段",
"TaskExtractMediaSegmentsDescription": "從使用媒體片段的擴充功能取得媒體片段。",
"TaskMoveTrickplayImages": "遷移快轉縮圖位置",
"TaskMoveTrickplayImagesDescription": "根據媒體庫的設定遷移快轉縮圖的檔案。"
} }

View File

@@ -91,29 +91,8 @@ namespace Emby.Server.Implementations.MediaEncoder
return video.DefaultVideoStreamIndex.HasValue; return video.DefaultVideoStreamIndex.HasValue;
} }
private long GetAverageDurationBetweenChapters(IReadOnlyList<ChapterInfo> chapters)
{
if (chapters.Count < 2)
{
return 0;
}
long sum = 0;
for (int i = 1; i < chapters.Count; i++)
{
sum += chapters[i].StartPositionTicks - chapters[i - 1].StartPositionTicks;
}
return sum / chapters.Count;
}
public async Task<bool> RefreshChapterImages(Video video, IDirectoryService directoryService, IReadOnlyList<ChapterInfo> chapters, bool extractImages, bool saveChapters, CancellationToken cancellationToken) public async Task<bool> RefreshChapterImages(Video video, IDirectoryService directoryService, IReadOnlyList<ChapterInfo> chapters, bool extractImages, bool saveChapters, CancellationToken cancellationToken)
{ {
if (chapters.Count == 0)
{
return true;
}
var libraryOptions = _libraryManager.GetLibraryOptions(video); var libraryOptions = _libraryManager.GetLibraryOptions(video);
if (!IsEligibleForChapterImageExtraction(video, libraryOptions)) if (!IsEligibleForChapterImageExtraction(video, libraryOptions))
@@ -121,14 +100,6 @@ namespace Emby.Server.Implementations.MediaEncoder
extractImages = false; extractImages = false;
} }
var averageChapterDuration = GetAverageDurationBetweenChapters(chapters);
var threshold = TimeSpan.FromSeconds(1).Ticks;
if (averageChapterDuration < threshold)
{
_logger.LogInformation("Skipping chapter image extraction for {Video} as the average chapter duration {AverageDuration} was lower than the minimum threshold {Threshold}", video.Name, averageChapterDuration, threshold);
extractImages = false;
}
var success = true; var success = true;
var changesMade = false; var changesMade = false;

Some files were not shown because too many files have changed in this diff Show More