From 443fcc4b66ba24b69ed97ca2a149ae1deebc64df Mon Sep 17 00:00:00 2001 From: PangMo5 Date: Wed, 10 Nov 2021 18:50:08 +0900 Subject: [PATCH 01/15] fix layout issue of ItemView when landscape --- .../Landscape/ItemLandscapeMainView.swift | 54 ++++++++++--------- 1 file changed, 28 insertions(+), 26 deletions(-) diff --git a/JellyfinPlayer/Views/ItemView/Landscape/ItemLandscapeMainView.swift b/JellyfinPlayer/Views/ItemView/Landscape/ItemLandscapeMainView.swift index 22390b34..251c1cd6 100644 --- a/JellyfinPlayer/Views/ItemView/Landscape/ItemLandscapeMainView.swift +++ b/JellyfinPlayer/Views/ItemView/Landscape/ItemLandscapeMainView.swift @@ -15,25 +15,25 @@ struct ItemLandscapeMainView: View { @Binding private var videoIsLoading: Bool @EnvironmentObject private var viewModel: ItemViewModel @EnvironmentObject private var videoPlayerItem: VideoPlayerItem - + init(videoIsLoading: Binding) { self._videoIsLoading = videoIsLoading } - + // MARK: innerBody - + private var innerBody: some View { HStack { // MARK: Sidebar Image - + VStack { ImageView(src: viewModel.item.getPrimaryImage(maxWidth: 130), bh: viewModel.item.getPrimaryImageBlurHash()) .frame(width: 130, height: 195) .cornerRadius(10) - + Spacer().frame(height: 15) - + Button { if let playButtonItem = viewModel.playButtonItem { self.videoPlayerItem.itemToPlay = playButtonItem @@ -41,7 +41,7 @@ struct ItemLandscapeMainView: View { } } label: { // MARK: Play - + HStack { Image(systemName: "play.fill") .foregroundColor(viewModel.playButtonItem == nil ? Color(UIColor.secondaryLabel) : Color.white) @@ -55,19 +55,19 @@ struct ItemLandscapeMainView: View { .background(viewModel.playButtonItem == nil ? Color(UIColor.secondarySystemFill) : Color.jellyfinPurple) .cornerRadius(10) }.disabled(viewModel.playButtonItem == nil) - + Spacer() } - + ScrollView { VStack(alignment: .leading) { // MARK: ItemLandscapeTopBarView - + ItemLandscapeTopBarView() .environmentObject(viewModel) - + // MARK: ItemViewBody - + if let episodeViewModel = viewModel as? SeasonItemViewModel { EpisodeCardVStackView(items: episodeViewModel.episodes) { episode in itemRouter.route(to: \.item, episode) @@ -80,28 +80,30 @@ struct ItemLandscapeMainView: View { } } } - + // MARK: body - + var body: some View { - VStack { - ZStack { - // MARK: Backdrop - - ImageView(src: viewModel.item.getBackdropImage(maxWidth: 200), - bh: viewModel.item.getBackdropImageBlurHash()) - .opacity(0.3) - .edgesIgnoringSafeArea(.all) - .blur(radius: 4) - - // iPadOS is making the view go all the way to the edge. - // We have to accomodate this here + ZStack { + // MARK: Backdrop + + ImageView(src: viewModel.item.getBackdropImage(maxWidth: 200), + bh: viewModel.item.getBackdropImageBlurHash()) + .opacity(0.3) + .edgesIgnoringSafeArea(.all) + .blur(radius: 4) + .layoutPriority(1) + + // iPadOS is making the view go all the way to the edge. + // We have to accomodate this here + Group { if UIDevice.current.userInterfaceIdiom == .pad { innerBody.padding(.horizontal, 25) } else { innerBody } } + .layoutPriority(2) } } } From 6841fbe43e3a4d861147e095ec6589593e105e94 Mon Sep 17 00:00:00 2001 From: PangMo5 Date: Wed, 10 Nov 2021 19:09:08 +0900 Subject: [PATCH 02/15] change more simpler. --- .../ItemView/Landscape/ItemLandscapeMainView.swift | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/JellyfinPlayer/Views/ItemView/Landscape/ItemLandscapeMainView.swift b/JellyfinPlayer/Views/ItemView/Landscape/ItemLandscapeMainView.swift index 251c1cd6..85ca7248 100644 --- a/JellyfinPlayer/Views/ItemView/Landscape/ItemLandscapeMainView.swift +++ b/JellyfinPlayer/Views/ItemView/Landscape/ItemLandscapeMainView.swift @@ -92,18 +92,15 @@ struct ItemLandscapeMainView: View { .opacity(0.3) .edgesIgnoringSafeArea(.all) .blur(radius: 4) - .layoutPriority(1) + .layoutPriority(-1) // iPadOS is making the view go all the way to the edge. // We have to accomodate this here - Group { - if UIDevice.current.userInterfaceIdiom == .pad { - innerBody.padding(.horizontal, 25) - } else { - innerBody - } + if UIDevice.current.userInterfaceIdiom == .pad { + innerBody.padding(.horizontal, 25) + } else { + innerBody } - .layoutPriority(2) } } } From fd62abcf8ff4f8d95d75c82f886d5bfcd9707929 Mon Sep 17 00:00:00 2001 From: Kwangmin Bae Date: Wed, 10 Nov 2021 08:35:06 +0000 Subject: [PATCH 03/15] Translated using Weblate (Tamil) Currently translated at 100.0% (68 of 68 strings) Translation: Swiftfin/Swiftfin Translate-URL: https://translate.jellyfin.org/projects/swiftfin/swiftfin/ta/ --- Translations/ta.lproj/Localizable.strings | Bin 0 -> 4872 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/Translations/ta.lproj/Localizable.strings b/Translations/ta.lproj/Localizable.strings index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..6c5fac3803307ef639841bc804a3b5663f2a5b33 100644 GIT binary patch literal 4872 zcmbVQO>Y}j6n*QyKVez4LS2Ah8H6Bw3Pf9p5LGOl*i9@PJF+K%tWg@34HD8Uu#mE- z7l{{kKCr~fsad2^tNbP4oOkEWePhRIf<{iqo_D{`J@-!k{ip0IZWUL}b#T?)3O)^d z61U^ZuH-(%r|fq9b3gH^Kk=8o>^^XJaJ}p9B>d$-^w!40SyA*fnt^BAW%C`IAhF<7t z^WnGP!4S3&VSC^&Ze_iLTy_v`&28M!gIL16*bSEZ@Su-s+@=nTsL>|uGYb{uob@ij zr(zWvc(#Jy8c{_mS4f&iJ^$Jt!=Gb#rpPEG+Lqgbr7xgw8~5#iCnC%wpZVV*ks`0e z74Ig9>e827A6eeVr-yGnKgx4mc0WSTW~5`}UjmUAkU4s0*KgxWPJMom7^!q8Ee*~Y{6J5hp8Ba@}B!ecMMqCRtVmL;J|?S?FoW;(~iSk0e19J8lu(SP6MCiv#~6 z%dXlOK<_Z%pbLF!)9{c$$6BHKtoAX^N>9HEvc!VPbV9YIF3VX~%?HUQV;UnWR(cF+ zsnr1YvzY9lHfy+uLh?=vHHz`rhxA#Fp(EsU+Mfg(szEZA`zu(V1gs6w4T6wjBqnJQ zOv@=2I-y?@_X)CZr$@oNF1*spX(g2h%7}*C*+hg@V5#XA@r&YS2{E$^$+o6d5c3p1 zm)x_E{R7nHPgv1jVjQQaH#0k(58`|q*4l0vQ{bCOZx?;Zz8ykFx>$I#l%JGtkzNrU z^!Q1LeIxXvRLFdtud@d$qi8ZQ6XdWOdOC5RLK`do8NN&9*_(<0)34`<-j|4%*d`B& z{}zdCa8gFMYgMDxMR+7U5gfeGW#c2T!ZWk;yKBQQmWJfmIf8=B|4`+^Zg)_(>!| zW{_^Q30V%DRsotJy?|PoM;fc1dWih|1nk)9-H=_u2MN=8ddb zbC1v$+Q$#UK^tL4x1rDc=w~*C^R;dzY*m~K#maHka64n)N(aVzINLabby{f-TBw|z z>jpm3XPjT$1Ie)sXpcSPY~VC!l#+Yqh;ee}yaS!W1=OKENE~hhld_eP6}AFW&3+2> z3xmpx8>2rDqn?^)L+ZDT+?uXp4UJDXLbYmOwmM?3VfJ!ED8|P9LpyR0K5+Z!V+x$) zec6DPHOMs~-^%NF9Um8&czA^-^ZmNBtH4hK-DW%;`!15F{_nsd!g|Wtv)sfeDnRb^ z1o<_aw5;v)e#KpW1t{ar8PBo<*gV1ccw=O5b3Z0SE7q^h5#In_U<&G786xAHV~Qj0 zbj8h!2u!oNY1L(CHQ^a;T0Ui)DssdV#6eUukHxdZH9J@~&G}L{?G5tBD0GWzot`T6 zp^XUJk>Q-5vYSUS!F-y*~x-I`dbH({Ojhzo8H z#Z1TCeo&ac^p5Yo?2j$T&VQ%q;oW3E$m)(o#?ZG3=5D&?qMLgiJtB+5(HnMWHzYDI zrz+X-IqD<1c(eYmVT)VH4kiyHG8=!O+QQvu{%7`{en29}2PU#^|-L`ddnYQ)dKRM*4wP0`Cn~Cud zS(>b8p7ULnyb^DBx;xn^+j7RCBI;WOStWv7Knl5+8<$Bv&Ek6vZ)oKx>)2Uo*$wCC zD%NxlTgC|e8&6=<$p3jL)_4zISOx?G4?=C~@YuYKcVAA{Um%xW!CIo>OK6y7^l2T& K@G`f>&;J0Odqiab literal 0 HcmV?d00001 From 12b3536fc95cd692fd4c0508fb453d364b4cbc27 Mon Sep 17 00:00:00 2001 From: Kwangmin Bae Date: Wed, 10 Nov 2021 05:04:54 +0000 Subject: [PATCH 04/15] Translated using Weblate (Esperanto) Currently translated at 100.0% (68 of 68 strings) Translation: Swiftfin/Swiftfin Translate-URL: https://translate.jellyfin.org/projects/swiftfin/swiftfin/eo/ --- Translations/eo.lproj/Localizable.strings | Bin 4980 -> 9568 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/Translations/eo.lproj/Localizable.strings b/Translations/eo.lproj/Localizable.strings index 8561f8d7fba141e59eb4278e56b40bd3649dc5cf..e3aaaec58d893d26d7e57e065dfffe1100940780 100644 GIT binary patch delta 1142 zcmZuxJ7|+p6h60U^5^~M;e%L8lh(F`5ZVwVNGK9(l=^6fwv4p@TR% z)-yO%aO@-qE;?xkQ5VHgD(LFupyH_CiD^kohn)Z3^Sa-69{Dx)?dr3ZpWivhc-=Xv z%Dm%js~iuyHdT|iT@RGOqwWc9gKE^K1}~aZ<~vlPIxo2s+9It&-{gvYfM1(~s?A&O zc&rLti)N@obt+RH-#k^J$y1J&AX~JE3@yaY(*}Iz;yP6~q zwI~b61&&za0QAG1Fq+V{k*Xw5(=Y{T3cq2R>(SrFJxO-RUhiJtd0L=L0Ga9WtN}xd zE^^5d9&aLl5wHdH48AF3+J`MKHDIq&k#$pmeJbc^!m~l^BKe6We(3(ya>XxpDMl8t z(_{!P4)xtKi$2d$EdqA;^=K!~Kqj!}T|GP`cJZ!tFjRpijgpl*nj9kk=wa31kSD53 zu?^I41u{!(T+$NWBRZPn=UQ6pYI&<~^x&+lF;(Y`Cl;zBzKB;dR5)Nfi;7o}SvWTN znmT8b7O%>krx01=d!B#^jpt2UfL|y#KenD3kwNHk1@1hmQv$L)uoqxygHev3s+*cr z`7Y}5${NuturzSL4&OEKd*2rem7yzk>OGIs@m-j}=x%!=Hu24ZL79JBr=WZ5i9r7J zB!;9qGK4Y_$K{x|Mb#=tyd$c}L(Y@@(0f7^c*h%a6!3Pr6Waj4l*;pG? zU59OhX1grrOw+ndXR|Z@(vb{*w8gMg%I@b=_RAfsaFkg9TfX2M(X%+olE_rG!MkEl zd;jaCI^qfLY&cHy7rT=`n1aVxP5m>jLovK-Pae^HvIqS8yO9Me*&)n0FZU1dS;wS9 zw#@(rOaNX>YEny?)knUNTH%+zkj>cNKHhOe^@AHWMEbehe*=FRd%kfqdVntMIg;Je Opfhe7CWDjy^Zx(@at@>b delta 7 OcmaFh^+jz%i7)^VN&|cV From d07963ae3e0e117f6447a6ebf78a0cee9cf56f09 Mon Sep 17 00:00:00 2001 From: Kwangmin Bae Date: Wed, 10 Nov 2021 05:20:41 +0000 Subject: [PATCH 05/15] Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (68 of 68 strings) Translation: Swiftfin/Swiftfin Translate-URL: https://translate.jellyfin.org/projects/swiftfin/swiftfin/zh_Hant/ --- .../zh-Hant.lproj/Localizable.strings | Bin 3918 -> 7440 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/Translations/zh-Hant.lproj/Localizable.strings b/Translations/zh-Hant.lproj/Localizable.strings index dbfd118527c70de6df80f3a040aedaeedb492a7a..713548a5f7f6f9c86f822369610525a2745b074d 100644 GIT binary patch delta 1162 zcmZ`(O=uHQ5T2Jb*<|x)tfh#oYqG2o)`B8MR1|6vDN0LiOOaY6-E5MQG>O?n+k<%U z(1RDtoU9;-f~Qi!n;;%UyjcXH2NChmg9i^DMGAgzlk`XGVPD>S^Sya9-^|O$!w=8C z98U0zIJ$KFgeWgf-x9f{HCMPiDDH_YzY`f{fvVJ`I#2le0(WSZYP{&vlP*nCmKtPJ z5mU@P>mcO^k}Kq#S%zaw$zm=sdnOZA{-7c|Mh|R! zV=f{Vkh_D}L--v)j83LwVAbK5mA&ZFA}&~Ux-D1!)Mf0lMc`Do^q2A3I5!AokPSZ$ z^amvF@OmJHT7Cyo-nlFyK{vL72X*O}?5cNv1({reLbD!{!^zR0CF*=Ps3&TOpM_#G zSZyltO3+OHgV7jo1T$s_-Bw{GcfslC)b{d_Vu~796*E;s!~*gdq5M|;!%%z1+OpT*zMIVE3At$UkU4B$+b~inVVq? z*we6y^+VXyrIHQr_U+l++3`)pD6*z%qQF@-CGvbHrHV!OD!7PW-Uf1*ajMn>{2$-AwX1-l4EFzdL(j%5s~ zntV^&6I2}iynLYgeY`V8GrStp!dYbHy-Qw?r4m~fUXtvm6+6V~_ Date: Wed, 10 Nov 2021 05:29:44 +0000 Subject: [PATCH 06/15] Translated using Weblate (Czech) Currently translated at 100.0% (68 of 68 strings) Translation: Swiftfin/Swiftfin Translate-URL: https://translate.jellyfin.org/projects/swiftfin/swiftfin/cs/ --- Translations/cs.lproj/Localizable.strings | Bin 4992 -> 9584 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/Translations/cs.lproj/Localizable.strings b/Translations/cs.lproj/Localizable.strings index 5394ced2344f85a29eb0d6e16be41819605bcb6a..17818a995c21e31df28d868289f9797e6c2d05a6 100644 GIT binary patch delta 1111 zcmZuxO-~b16n&3UrqgLVoi<1aQ8FMjq#>mt*bqX&Yc?AruI zUUg5%Dt+y4$pWSQE$PyM|Fz7~WKUXYiJE8%hmLz@{m(>2)Jaz|hASS4oM?!=C?mHc zO0=OQWs~-m`ScDt8e&mwi@K-^8&4aE24X?1BR0@mK`e_k(E`RMHL$KUgoBesTY*X0 zp!WeY>64mB zxacT>3G-OQ(*pj2$pfGq)OnK6k-m4qTbc`?Bc5`kWH5E*Tnc96T<7ufXq|@`xSWoI zSwH7(8rIUF`$kK6eL1`dQqgzK9OOEqYaWFikXe8T6)#gjXHFZF4*k?dbe1m%Q8p3t zVv7bs^Tt0p@qnI$7M1fX9fkV!3o$NozeAR+lNC;yb-bs9+q0s0Irs{s+{O(&t4lA# z8I_k;<})3Jr(}&z!~H(2ln$c(bSE-8%jOL>_}w$<$}z+Q)hd z@vWX3WU<&~?1JlF*U`sinND?6mS{PekVSH%Nv#M9Rj<#%hzruDljsPd<{LBEyLHrB zVxwvHvdERq9ck_C(v}(-6*^e%m)y^yfe1Se1md<$xC$e)(}WDQKlHShZv2mFH$ZBCr=wT~{|df%!Vmqifn}LF N|FtitQE7Eqe*j^`3~c}a delta 7 Ocmez1)u6tiK^OoIk^?0G From 5c245502288ed9e22f6a34d7de299ec32b35656c Mon Sep 17 00:00:00 2001 From: PangMo5 Date: Fri, 12 Nov 2021 22:38:07 +0900 Subject: [PATCH 07/15] Change to utilize image API Change the url image format to webp --- JellyfinPlayer.xcodeproj/project.pbxproj | 16 ++- .../Landscape/ItemLandscapeMainView.swift | 2 +- .../BaseItemDtoExtensions.swift | 118 +++++++++++------- .../BaseItemPersonExtensions.swift | 26 ++-- Shared/Extensions/URLExtensions.swift | 26 ++++ 5 files changed, 125 insertions(+), 63 deletions(-) create mode 100644 Shared/Extensions/URLExtensions.swift diff --git a/JellyfinPlayer.xcodeproj/project.pbxproj b/JellyfinPlayer.xcodeproj/project.pbxproj index eec8530e..2b4d2ddb 100644 --- a/JellyfinPlayer.xcodeproj/project.pbxproj +++ b/JellyfinPlayer.xcodeproj/project.pbxproj @@ -199,6 +199,9 @@ 62C29EA326D1030F00C1D2E7 /* ConnectToServerCoodinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 62C29EA226D1030F00C1D2E7 /* ConnectToServerCoodinator.swift */; }; 62C29EA626D1036A00C1D2E7 /* HomeCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 62C29EA526D1036A00C1D2E7 /* HomeCoordinator.swift */; }; 62C29EA826D103D500C1D2E7 /* LibraryListCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 62C29EA726D103D500C1D2E7 /* LibraryListCoordinator.swift */; }; + 62E1DCC3273CE19800C9AE76 /* URLExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 62E1DCC2273CE19800C9AE76 /* URLExtensions.swift */; }; + 62E1DCC4273CE19800C9AE76 /* URLExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 62E1DCC2273CE19800C9AE76 /* URLExtensions.swift */; }; + 62E1DCC5273CE19800C9AE76 /* URLExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 62E1DCC2273CE19800C9AE76 /* URLExtensions.swift */; }; 62E632DA267D2BC40063E547 /* LatestMediaViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 62E632D9267D2BC40063E547 /* LatestMediaViewModel.swift */; }; 62E632DC267D2E130063E547 /* LibrarySearchViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 62E632DB267D2E130063E547 /* LibrarySearchViewModel.swift */; }; 62E632DD267D2E130063E547 /* LibrarySearchViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 62E632DB267D2E130063E547 /* LibrarySearchViewModel.swift */; }; @@ -534,6 +537,7 @@ 62C29EA226D1030F00C1D2E7 /* ConnectToServerCoodinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConnectToServerCoodinator.swift; sourceTree = ""; }; 62C29EA526D1036A00C1D2E7 /* HomeCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeCoordinator.swift; sourceTree = ""; }; 62C29EA726D103D500C1D2E7 /* LibraryListCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LibraryListCoordinator.swift; sourceTree = ""; }; + 62E1DCC2273CE19800C9AE76 /* URLExtensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = URLExtensions.swift; sourceTree = ""; }; 62E632D9267D2BC40063E547 /* LatestMediaViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LatestMediaViewModel.swift; sourceTree = ""; }; 62E632DB267D2E130063E547 /* LibrarySearchViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LibrarySearchViewModel.swift; sourceTree = ""; }; 62E632DF267D30CA0063E547 /* LibraryViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LibraryViewModel.swift; sourceTree = ""; }; @@ -1059,6 +1063,7 @@ isa = PBXGroup; children = ( 5389277B263CC3DB0035E14B /* BlurHashDecode.swift */, + 62E1DCC2273CE19800C9AE76 /* URLExtensions.swift */, 6267B3D526710B8900A7371D /* CollectionExtensions.swift */, E173DA5126D04AAF00CC4EB7 /* ColorExtension.swift */, 6267B3D92671138200A7371D /* ImageExtensions.swift */, @@ -1818,6 +1823,7 @@ E1AD104E26D96CE3003E4A08 /* BaseItemDtoExtensions.swift in Sources */, 62E632DD267D2E130063E547 /* LibrarySearchViewModel.swift in Sources */, 536D3D81267BDFC60004248C /* PortraitItemElement.swift in Sources */, + 62E1DCC4273CE19800C9AE76 /* URLExtensions.swift in Sources */, 5310695B2684E7EE00CFFDBA /* AudioView.swift in Sources */, 5398514726B64E4100101B49 /* SearchBarView.swift in Sources */, 091B5A8D268315D400D78B61 /* ServerDiscovery.swift in Sources */, @@ -1977,6 +1983,7 @@ 535870AD2669D8DD00D05A09 /* Typings.swift in Sources */, E1AD105F26D9ADDD003E4A08 /* NameGUIDPairExtensions.swift in Sources */, E13DD3D5271693CD009D4DAF /* SwiftfinStoreDefaults.swift in Sources */, + 62E1DCC3273CE19800C9AE76 /* URLExtensions.swift in Sources */, C4BE0769271FC164003F4AD1 /* TVLibrariesView.swift in Sources */, E1267D3E271A1F46003C492E /* PreferenceUIHostingController.swift in Sources */, 6220D0BA26D6092100B8E046 /* FilterCoordinator.swift in Sources */, @@ -2025,6 +2032,7 @@ E13DD3D7271693CD009D4DAF /* SwiftfinStoreDefaults.swift in Sources */, E131691926C583BC0074BFEE /* LogConstructor.swift in Sources */, E13DD3CA27164B80009D4DAF /* SwiftfinStore.swift in Sources */, + 62E1DCC5273CE19800C9AE76 /* URLExtensions.swift in Sources */, 62EC353226766849000E9F2D /* SessionManager.swift in Sources */, 536D3D79267BD5D00004248C /* ViewModel.swift in Sources */, E1D4BF8C2719F39F00A11E64 /* AppAppearance.swift in Sources */, @@ -2365,7 +2373,7 @@ CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 66; DEVELOPMENT_ASSET_PATHS = ""; - DEVELOPMENT_TEAM = ""; + DEVELOPMENT_TEAM = 4BHXT8RHFR; ENABLE_BITCODE = NO; ENABLE_PREVIEWS = YES; EXCLUDED_ARCHS = ""; @@ -2402,7 +2410,7 @@ CURRENT_PROJECT_VERSION = 66; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_ASSET_PATHS = ""; - DEVELOPMENT_TEAM = ""; + DEVELOPMENT_TEAM = 4BHXT8RHFR; ENABLE_BITCODE = NO; ENABLE_PREVIEWS = YES; EXCLUDED_ARCHS = ""; @@ -2433,7 +2441,7 @@ ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 66; - DEVELOPMENT_TEAM = ""; + DEVELOPMENT_TEAM = 4BHXT8RHFR; INFOPLIST_FILE = WidgetExtension/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = ( @@ -2460,7 +2468,7 @@ ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 66; - DEVELOPMENT_TEAM = ""; + DEVELOPMENT_TEAM = 4BHXT8RHFR; INFOPLIST_FILE = WidgetExtension/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = ( diff --git a/JellyfinPlayer/Views/ItemView/Landscape/ItemLandscapeMainView.swift b/JellyfinPlayer/Views/ItemView/Landscape/ItemLandscapeMainView.swift index 22390b34..91fcf5d7 100644 --- a/JellyfinPlayer/Views/ItemView/Landscape/ItemLandscapeMainView.swift +++ b/JellyfinPlayer/Views/ItemView/Landscape/ItemLandscapeMainView.swift @@ -92,7 +92,7 @@ struct ItemLandscapeMainView: View { bh: viewModel.item.getBackdropImageBlurHash()) .opacity(0.3) .edgesIgnoringSafeArea(.all) - .blur(radius: 4) + .blur(radius: 8) // iPadOS is making the view go all the way to the edge. // We have to accomodate this here diff --git a/Shared/Extensions/JellyfinAPIExtensions/BaseItemDtoExtensions.swift b/Shared/Extensions/JellyfinAPIExtensions/BaseItemDtoExtensions.swift index 95036a2f..4d52a410 100644 --- a/Shared/Extensions/JellyfinAPIExtensions/BaseItemDtoExtensions.swift +++ b/Shared/Extensions/JellyfinAPIExtensions/BaseItemDtoExtensions.swift @@ -1,11 +1,11 @@ // - /* - * SwiftFin is subject to the terms of the Mozilla Public - * License, v2.0. If a copy of the MPL was not distributed with this - * file, you can obtain one at https://mozilla.org/MPL/2.0/. - * - * Copyright 2021 Aiden Vigue & Jellyfin Contributors - */ +/* + * SwiftFin is subject to the terms of the Mozilla Public + * License, v2.0. If a copy of the MPL was not distributed with this + * file, you can obtain one at https://mozilla.org/MPL/2.0/. + * + * Copyright 2021 Aiden Vigue & Jellyfin Contributors + */ import Foundation import JellyfinAPI @@ -14,35 +14,48 @@ import UIKit // 001fC^ = dark grey plain blurhash public extension BaseItemDto { - // MARK: Images func getSeriesBackdropImageBlurHash() -> String { - let rawImgURL = getSeriesBackdropImage(maxWidth: 1).absoluteString - let imgTag = rawImgURL.components(separatedBy: "&tag=")[1] + let imgURL = getSeriesBackdropImage(maxWidth: 1) + guard let imgTag = imgURL.queryParameters?["tag"], + let hash = imageBlurHashes?.backdrop?[imgTag] + else { + return "001fC^" + } - return imageBlurHashes?.backdrop?[imgTag] ?? "001fC^" + return hash } func getSeriesPrimaryImageBlurHash() -> String { - let rawImgURL = getSeriesPrimaryImage(maxWidth: 1).absoluteString - let imgTag = rawImgURL.components(separatedBy: "&tag=")[1] + let imgURL = getSeriesPrimaryImage(maxWidth: 1) + guard let imgTag = imgURL.queryParameters?["tag"], + let hash = imageBlurHashes?.primary?[imgTag] + else { + return "001fC^" + } - return imageBlurHashes?.primary?[imgTag] ?? "001fC^" + return hash } func getPrimaryImageBlurHash() -> String { - let rawImgURL = getPrimaryImage(maxWidth: 1).absoluteString - let imgTag = rawImgURL.components(separatedBy: "&tag=")[1] + let imgURL = getPrimaryImage(maxWidth: 1) + guard let imgTag = imgURL.queryParameters?["tag"], + let hash = imageBlurHashes?.primary?[imgTag] + else { + return "001fC^" + } - return imageBlurHashes?.primary?[imgTag] ?? "001fC^" + return hash } func getBackdropImageBlurHash() -> String { - let rawImgURL = getBackdropImage(maxWidth: 1).absoluteString - let imgTag = rawImgURL.components(separatedBy: "&tag=")[1] + let imgURL = getBackdropImage(maxWidth: 1) + guard let imgTag = imgURL.queryParameters?["tag"] else { + return "001fC^" + } - if rawImgURL.contains("Backdrop") { + if imgURL.queryParameters?[ImageType.backdrop.rawValue] == nil { return imageBlurHashes?.backdrop?[imgTag] ?? "001fC^" } else { return imageBlurHashes?.primary?[imgTag] ?? "001fC^" @@ -50,31 +63,34 @@ public extension BaseItemDto { } func getBackdropImage(maxWidth: Int) -> URL { - var imageType = "" - var imageTag = "" + var imageType = ImageType.backdrop + var imageTag: String? var imageItemId = id ?? "" if primaryImageAspectRatio ?? 0.0 < 1.0 { - imageType = "Backdrop" if !(backdropImageTags?.isEmpty ?? true) { - imageTag = (backdropImageTags ?? [""])[0] + imageTag = backdropImageTags?.first } } else { - imageType = "Primary" - imageTag = imageTags?["Primary"] ?? "" + imageType = .primary + imageTag = imageTags?[ImageType.primary.rawValue] ?? "" } - if imageTag == "" || imageItemId == "" { - imageType = "Backdrop" + if imageTag == nil || imageItemId.isEmpty { if !(parentBackdropImageTags?.isEmpty ?? true) { - imageTag = (parentBackdropImageTags ?? [""])[0] + imageTag = parentBackdropImageTags?.first imageItemId = parentBackdropItemId ?? "" } } let x = UIScreen.main.nativeScale * CGFloat(maxWidth) - let urlString = - "\(SessionManager.main.currentLogin.server.uri)/Items/\(imageItemId)/Images/\(imageType)?maxWidth=\(String(Int(x)))&quality=96&tag=\(imageTag)" + + let urlString = ImageAPI.getItemImageWithRequestBuilder(itemId: imageItemId, + imageType: imageType, + maxWidth: Int(x), + quality: 85, + tag: imageTag, + format: .webp).URLString return URL(string: urlString)! } @@ -86,39 +102,45 @@ public extension BaseItemDto { } func getSeriesBackdropImage(maxWidth: Int) -> URL { - let imageType = "Backdrop" - let imageTag = (parentBackdropImageTags ?? [""])[0] - let x = UIScreen.main.nativeScale * CGFloat(maxWidth) - let urlString = - "\(SessionManager.main.currentLogin.server.uri)/Items/\(parentBackdropItemId ?? "")/Images/\(imageType)?maxWidth=\(String(Int(x)))&quality=96&tag=\(imageTag)" + let urlString = ImageAPI.getItemImageWithRequestBuilder(itemId: parentBackdropItemId ?? "", + imageType: .backdrop, + maxWidth: Int(x), + quality: 85, + tag: parentBackdropImageTags?.first, + format: .webp).URLString return URL(string: urlString)! } func getSeriesPrimaryImage(maxWidth: Int) -> URL { - let imageType = "Primary" - let imageTag = seriesPrimaryImageTag ?? "" let x = UIScreen.main.nativeScale * CGFloat(maxWidth) - let urlString = - "\(SessionManager.main.currentLogin.server.uri)/Items/\(seriesId ?? "")/Images/\(imageType)?maxWidth=\(String(Int(x)))&quality=96&tag=\(imageTag)" + let urlString = ImageAPI.getItemImageWithRequestBuilder(itemId: seriesId ?? "", + imageType: .primary, + maxWidth: Int(x), + quality: 85, + tag: seriesPrimaryImageTag, + format: .webp).URLString return URL(string: urlString)! } func getPrimaryImage(maxWidth: Int) -> URL { - let imageType = "Primary" - var imageTag = imageTags?["Primary"] ?? "" + let imageType = ImageType.primary + var imageTag = imageTags?[ImageType.primary.rawValue] ?? "" var imageItemId = id ?? "" - if imageTag == "" || imageItemId == "" { + if imageTag.isEmpty || imageItemId.isEmpty { imageTag = seriesPrimaryImageTag ?? "" imageItemId = seriesId ?? "" } let x = UIScreen.main.nativeScale * CGFloat(maxWidth) - let urlString = - "\(SessionManager.main.currentLogin.server.uri)/Items/\(imageItemId)/Images/\(imageType)?maxWidth=\(String(Int(x)))&quality=96&tag=\(imageTag)" - // print(urlString) + let urlString = ImageAPI.getItemImageWithRequestBuilder(itemId: imageItemId, + imageType: imageType, + maxWidth: Int(x), + quality: 85, + tag: imageTag, + format: .webp).URLString return URL(string: urlString)! } @@ -174,14 +196,14 @@ public extension BaseItemDto { } var itemType: ItemType { - guard let originalType = self.type, let knownType = ItemType(rawValue: originalType) else { return .unknown } + guard let originalType = type, let knownType = ItemType(rawValue: originalType) else { return .unknown } return knownType } // MARK: PortraitHeaderViewURL func portraitHeaderViewURL(maxWidth: Int) -> URL { - switch self.itemType { + switch itemType { case .movie, .season, .series: return getPrimaryImage(maxWidth: maxWidth) case .episode: diff --git a/Shared/Extensions/JellyfinAPIExtensions/BaseItemPersonExtensions.swift b/Shared/Extensions/JellyfinAPIExtensions/BaseItemPersonExtensions.swift index 007ed999..23770cc4 100644 --- a/Shared/Extensions/JellyfinAPIExtensions/BaseItemPersonExtensions.swift +++ b/Shared/Extensions/JellyfinAPIExtensions/BaseItemPersonExtensions.swift @@ -10,23 +10,29 @@ import JellyfinAPI import UIKit extension BaseItemPerson { - + // MARK: Get Image func getImage(baseURL: String, maxWidth: Int) -> URL { - let imageType = "Primary" - let imageTag = primaryImageTag ?? "" - let x = UIScreen.main.nativeScale * CGFloat(maxWidth) - - let urlString = "\(baseURL)/Items/\(id ?? "")/Images/\(imageType)?maxWidth=\(String(Int(x)))&quality=85&tag=\(imageTag)" + + let urlString = ImageAPI.getItemImageWithRequestBuilder(itemId: id ?? "", + imageType: .primary, + maxWidth: Int(x), + quality: 85, + tag: primaryImageTag, + format: .webp).URLString return URL(string: urlString)! } - + func getBlurHash() -> String { - let rawImgURL = getImage(baseURL: "", maxWidth: 1).absoluteString - let imgTag = rawImgURL.components(separatedBy: "&tag=")[1] + let imgURL = getImage(baseURL: "", maxWidth: 1) + guard let imgTag = imgURL.queryParameters?["tag"], + let hash = imageBlurHashes?.primary?[imgTag] + else { + return "001fC^" + } - return imageBlurHashes?.primary?[imgTag] ?? "001fC^" + return hash } // MARK: First Role diff --git a/Shared/Extensions/URLExtensions.swift b/Shared/Extensions/URLExtensions.swift new file mode 100644 index 00000000..ec7ea5d2 --- /dev/null +++ b/Shared/Extensions/URLExtensions.swift @@ -0,0 +1,26 @@ +// +/* + * SwiftFin is subject to the terms of the Mozilla Public + * License, v2.0. If a copy of the MPL was not distributed with this + * file, you can obtain one at https://mozilla.org/MPL/2.0/. + * + * Copyright 2021 Aiden Vigue & Jellyfin Contributors + */ + +import Foundation + +public extension URL { + /// Dictionary of the URL's query parameters + var queryParameters: [String: String]? { + guard let components = URLComponents(url: self, resolvingAgainstBaseURL: false), + let queryItems = components.queryItems else { return nil } + + var items: [String: String] = [:] + + for queryItem in queryItems { + items[queryItem.name] = queryItem.value + } + + return items + } +} From e43c75c8e5090477e5bdb1c3564f060f253fe541 Mon Sep 17 00:00:00 2001 From: Kwangmin Bae Date: Fri, 12 Nov 2021 23:17:44 +0900 Subject: [PATCH 08/15] Remove development team --- JellyfinPlayer.xcodeproj/project.pbxproj | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/JellyfinPlayer.xcodeproj/project.pbxproj b/JellyfinPlayer.xcodeproj/project.pbxproj index 2b4d2ddb..54cc4ac8 100644 --- a/JellyfinPlayer.xcodeproj/project.pbxproj +++ b/JellyfinPlayer.xcodeproj/project.pbxproj @@ -2373,7 +2373,7 @@ CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 66; DEVELOPMENT_ASSET_PATHS = ""; - DEVELOPMENT_TEAM = 4BHXT8RHFR; + DEVELOPMENT_TEAM = ""; ENABLE_BITCODE = NO; ENABLE_PREVIEWS = YES; EXCLUDED_ARCHS = ""; @@ -2410,7 +2410,7 @@ CURRENT_PROJECT_VERSION = 66; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_ASSET_PATHS = ""; - DEVELOPMENT_TEAM = 4BHXT8RHFR; + DEVELOPMENT_TEAM = ""; ENABLE_BITCODE = NO; ENABLE_PREVIEWS = YES; EXCLUDED_ARCHS = ""; @@ -2441,7 +2441,7 @@ ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 66; - DEVELOPMENT_TEAM = 4BHXT8RHFR; + DEVELOPMENT_TEAM = ""; INFOPLIST_FILE = WidgetExtension/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = ( @@ -2468,7 +2468,7 @@ ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 66; - DEVELOPMENT_TEAM = 4BHXT8RHFR; + DEVELOPMENT_TEAM = ""; INFOPLIST_FILE = WidgetExtension/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = ( From 9cafa44dfbf3bc29fc96ebe3827dff2de591acb6 Mon Sep 17 00:00:00 2001 From: PangMo5 Date: Fri, 12 Nov 2021 23:34:58 +0900 Subject: [PATCH 09/15] back to jpg --- .../BaseItemDtoExtensions.swift | 20 ++++++++----------- .../BaseItemPersonExtensions.swift | 5 ++--- 2 files changed, 10 insertions(+), 15 deletions(-) diff --git a/Shared/Extensions/JellyfinAPIExtensions/BaseItemDtoExtensions.swift b/Shared/Extensions/JellyfinAPIExtensions/BaseItemDtoExtensions.swift index 4d52a410..2f27801d 100644 --- a/Shared/Extensions/JellyfinAPIExtensions/BaseItemDtoExtensions.swift +++ b/Shared/Extensions/JellyfinAPIExtensions/BaseItemDtoExtensions.swift @@ -88,9 +88,8 @@ public extension BaseItemDto { let urlString = ImageAPI.getItemImageWithRequestBuilder(itemId: imageItemId, imageType: imageType, maxWidth: Int(x), - quality: 85, - tag: imageTag, - format: .webp).URLString + quality: 96, + tag: imageTag).URLString return URL(string: urlString)! } @@ -106,9 +105,8 @@ public extension BaseItemDto { let urlString = ImageAPI.getItemImageWithRequestBuilder(itemId: parentBackdropItemId ?? "", imageType: .backdrop, maxWidth: Int(x), - quality: 85, - tag: parentBackdropImageTags?.first, - format: .webp).URLString + quality: 96, + tag: parentBackdropImageTags?.first).URLString return URL(string: urlString)! } @@ -117,9 +115,8 @@ public extension BaseItemDto { let urlString = ImageAPI.getItemImageWithRequestBuilder(itemId: seriesId ?? "", imageType: .primary, maxWidth: Int(x), - quality: 85, - tag: seriesPrimaryImageTag, - format: .webp).URLString + quality: 96, + tag: seriesPrimaryImageTag).URLString return URL(string: urlString)! } @@ -138,9 +135,8 @@ public extension BaseItemDto { let urlString = ImageAPI.getItemImageWithRequestBuilder(itemId: imageItemId, imageType: imageType, maxWidth: Int(x), - quality: 85, - tag: imageTag, - format: .webp).URLString + quality: 96, + tag: imageTag).URLString return URL(string: urlString)! } diff --git a/Shared/Extensions/JellyfinAPIExtensions/BaseItemPersonExtensions.swift b/Shared/Extensions/JellyfinAPIExtensions/BaseItemPersonExtensions.swift index 23770cc4..4d307df0 100644 --- a/Shared/Extensions/JellyfinAPIExtensions/BaseItemPersonExtensions.swift +++ b/Shared/Extensions/JellyfinAPIExtensions/BaseItemPersonExtensions.swift @@ -18,9 +18,8 @@ extension BaseItemPerson { let urlString = ImageAPI.getItemImageWithRequestBuilder(itemId: id ?? "", imageType: .primary, maxWidth: Int(x), - quality: 85, - tag: primaryImageTag, - format: .webp).URLString + quality: 96, + tag: primaryImageTag).URLString return URL(string: urlString)! } From 2940539360cdd181c0f664289d43b17caa093dd5 Mon Sep 17 00:00:00 2001 From: Haadiy Rozzaq Date: Sat, 13 Nov 2021 15:54:01 -0500 Subject: [PATCH 10/15] Added translation using Weblate (Indonesian) --- Translations/id.lproj/Localizable.strings | Bin 0 -> 4 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 Translations/id.lproj/Localizable.strings diff --git a/Translations/id.lproj/Localizable.strings b/Translations/id.lproj/Localizable.strings new file mode 100644 index 0000000000000000000000000000000000000000..ed60b89c47319bc2c37b5775c777dddd6a16d56b GIT binary patch literal 4 LcmezWkBb2S2Mz)V literal 0 HcmV?d00001 From e21b2e973e824aa61726663695b9163f678f7c71 Mon Sep 17 00:00:00 2001 From: Haadiy Rozzaq Date: Sat, 13 Nov 2021 21:20:04 +0000 Subject: [PATCH 11/15] Translated using Weblate (Indonesian) Currently translated at 100.0% (68 of 68 strings) Translation: Swiftfin/Swiftfin Translate-URL: https://translate.jellyfin.org/projects/swiftfin/swiftfin/id/ --- Translations/id.lproj/Localizable.strings | Bin 4 -> 4572 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/Translations/id.lproj/Localizable.strings b/Translations/id.lproj/Localizable.strings index ed60b89c47319bc2c37b5775c777dddd6a16d56b..87e113f77d90b4706b83b064717493d5b12c22dd 100644 GIT binary patch literal 4572 zcmb7{TW?xd5QX=1e#H@Lswxky+Q(E?Lz31`|9O%4`ystbRr-|1X`MED-|DqYwfEFWF5RX30+a`Doj>(%Gc1M_Mk@ZudlX=fYUahvTho z(@qT3(p?;BIcm7|p13JE|Hpn;{;p-6*x_uX&sEM%KP%x~ zOQTjiQ%O@bE)Q3DKNP}F?^aV(+ESX-B=5iO5$`e|8=Vo;I3Qi*6L7Aw_C$8>vRv^M z#9IEr#auFGg@|v{XT8_*69%TL+nr=0dOycGPOpXkGQH8e<={>zmGq4{^0rpp5=SN3 z@AiJzVs|I@CVB=3&cHi)b)(ZNo#}m|r^Vkoe~;N9ldwlkcf0UL5yCvhX(( z@>7g##SlD^b0pz9+Up6!YSC@h(ji{*>ehPFFXwHtQL>)~>AmuB86u(j>hx9|x#U1+ zcRDS6TAw>VTX`{&$K>yW{&(e3$sqnv&&_JHc{CO3jb2u3%rp46%vg3k0_NAfBsTK- zlQQJq_427btM*SzW?T=?zKE@jDupgEmK~@0oS3Q$_!+emKOw z5*l-SD$Kqj{!=fj&4Lio$6|1w;`PEwX;p!H>sPb1o_3ScLrARAT}-IzEu2 z@AF?9YFFIdrr*?4Ow^S=$DZt|6MszKs2g8P=4JXRe=a!XUaNz}t|DRLkuT<`Rfpw_ znJ`rSQ41s0TrW=mYRf(TnEB_{gcD`+DjK+2y-Du>4q5Z zsbsNAM=&W%9+{+86Pz{k$?Rq`p%dxZO(P=i3!nHlOX>a+$x0b@1}^hA%R9FMn-H^b zE*sI$zT(3pHj!ceR3&_;y639ef(}OMC~EXx&$+#~x$~Jck-Iija&38^$eMLrL5w$J zxoM~in~QXh`(e2rs6stjrpePeUgX@4HQQ!F9BWQ+OGg$y%O9JSAepDkno6&wUd8%c zNZembVXXEw&_0RJ_OeyB+MK(N&N+w6#Hfs(nBH4T z6HD$L6Md%B=+PIQQ0e#`W$m^vTo`JUeX2{MUhI#;0CqO=Hg+tNbStl@%W1=gGwW8UjGU<+~{wjTxM|OAlMnxrTg@#uz$1Rkm&9XE_^o z8`y-Y68#YO@g^!87{1W;F&by>R5r`TRWO+~?VFDI8d3j{ESt$r^OX8@Wb=&QsZUur z)U~>4S~<^A)A44MtqeN`y7?Y zzQC*e((UA&;t%tnJsX3(%hA)^_HgL8!cg8(u`78D z0=t##a7IM@vMh3i5!dW0p66I`-70@4D!%5&q*D(6Hphf_Feb~8IoE@8#?1vZNty Date: Sun, 14 Nov 2021 13:42:15 -0500 Subject: [PATCH 12/15] Added translation using Weblate (Dutch) --- Translations/nl.lproj/Localizable.strings | Bin 0 -> 4 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 Translations/nl.lproj/Localizable.strings diff --git a/Translations/nl.lproj/Localizable.strings b/Translations/nl.lproj/Localizable.strings new file mode 100644 index 0000000000000000000000000000000000000000..ed60b89c47319bc2c37b5775c777dddd6a16d56b GIT binary patch literal 4 LcmezWkBb2S2Mz)V literal 0 HcmV?d00001 From 179e527d14dec4eec4bba9a589c7ab8408a49bbd Mon Sep 17 00:00:00 2001 From: cm3-family Date: Sun, 14 Nov 2021 18:22:38 -0500 Subject: [PATCH 13/15] Added translation using Weblate (Portuguese) --- Translations/pt.lproj/Localizable.strings | Bin 0 -> 4 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 Translations/pt.lproj/Localizable.strings diff --git a/Translations/pt.lproj/Localizable.strings b/Translations/pt.lproj/Localizable.strings new file mode 100644 index 0000000000000000000000000000000000000000..ed60b89c47319bc2c37b5775c777dddd6a16d56b GIT binary patch literal 4 LcmezWkBb2S2Mz)V literal 0 HcmV?d00001 From 48f5b9db66a1c2d10940be8d528b0369177cb350 Mon Sep 17 00:00:00 2001 From: el-tiuri Date: Sun, 14 Nov 2021 19:29:45 +0000 Subject: [PATCH 14/15] Translated using Weblate (Dutch) Currently translated at 67.6% (46 of 68 strings) Translation: Swiftfin/Swiftfin Translate-URL: https://translate.jellyfin.org/projects/swiftfin/swiftfin/nl/ --- Translations/nl.lproj/Localizable.strings | Bin 4 -> 2956 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/Translations/nl.lproj/Localizable.strings b/Translations/nl.lproj/Localizable.strings index ed60b89c47319bc2c37b5775c777dddd6a16d56b..1d5616faaf3250b0ff2f7dac81e97b5d78eb0057 100644 GIT binary patch literal 2956 zcmai$-EI>x5QXQuPqC^fmzCfWghZ*@0_qQHN-J@on- zsYa4&kLN4JhbD359JP|lXp#KC2@wyJuJyz!Jm+4eSh8xaEi2sGZ;hiU->yfay%}}Z z!E$W7;nTHs^gUq=?Z9TjWn?J(#IvUycx5k?2X7R^j=c`g5vP$Ys?9Txk9u#!&_}zu zbE?r_9qXRfB`0cWfktHArC8L;5u$?)GuNv)V;<%l6GqvwM8Vd63a=4T^0<=L=rj*= zaW---!`f#;ij{L}3++%}TpHmeoG-$;k!}aU80qRY)r#aVdFk1fuzVkw zBjO|d_Vv6F`Z#z*&8K=#UT1pyv(jdwNY7>6%CFX1Iad(93Vqkyg4||wcZG2m)T&f9 zzVd|_lNo8vlYrESC3#5JvTH+Gkq53~tr=J5LQhf0r#evVKF+Z(wC_Q|)PWLa;^N&a z_stm$0=v8_^Ei&hY#c05-1md7U{{~ z%*Je>J`-!-5&GxTsvQd%Tko{pUOf^vnk1bfzE_oJK$;~tCgMrvM9XV2B!{9N@w_;E zFz!0#)|)ag_bisHb+a(8&6 zI4d{h2+I7BrFSA~dVQXNiGBky?D9TWZ#~jk+|%bEoJWxd3?{ON;X=N2rFrN}&N=PR zrDo}1{1(ag1W1zrkhwLYdQ%L4{cv-&cYr%JZaB@LMYA-`E4fdON?O@ zc#~aEsSV?}cbCCq{Y`;xMKve>`?e?Ki&ag=yH~Qf(Au05+~}NDsW-B5DnGgpceP|s zKG(9~2GxeU9NZrJ`f0RTogAmIm&%~$^+IV*?|gsBR4Um|>O7-87dUH(rp#jCo Date: Sun, 14 Nov 2021 23:36:25 +0000 Subject: [PATCH 15/15] Translated using Weblate (Portuguese) Currently translated at 100.0% (68 of 68 strings) Translation: Swiftfin/Swiftfin Translate-URL: https://translate.jellyfin.org/projects/swiftfin/swiftfin/pt/ --- Translations/pt.lproj/Localizable.strings | Bin 4 -> 4806 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/Translations/pt.lproj/Localizable.strings b/Translations/pt.lproj/Localizable.strings index ed60b89c47319bc2c37b5775c777dddd6a16d56b..f698fdb9786c3664597b2a02a6d70de8feee4a82 100644 GIT binary patch literal 4806 zcmb7|%Wfk@6ozY^r?4yrp^+E_%RvY{iDwj)#36Pj0;WAu=iJsb_6~5Bd4ui1J z+CukSyZWAoQgnaC)pqz&=Xb(q;i+~{w0;|w`Yv=qS7@~i*LrG+|0IlcU#`|>aUI%H zpNUS4wf9uq&?(U;ZFaRfl!S%$A20bLp1FCXT&GS_yRu^x?*6yjB0T6MXw4oeJ3o=+ z_l1q~!8eb$yd!_yNwYP% zvAvMS9!)(xwRByIlDn%K?IO}*T|2zd>D%n&S=bN9mF?|trZ|H7Oy^5kbzMbIlJuP< z8186LhF>IYsOw&<%kcGz6MC>R*DmpxIGpO#Bu3#|?U4h^)v39jN@+Bcj?*Z|;+_2Y zUeBd8!}@FG&qG8i@f}3V7U8+Hc@n;fdJ+4?T}!{eig!yi>%7qcis#{zl^&&ZdI%lm z%}^)inf3!|K?dS^xGrS5S!nrdQPhqUY>dg4PQaVC$buAa(RjeN(oPV`CJZs^M+@4}vZ z*IS`ji04vVUI@!XdmvfxHUw`YP11&1HkXDM;xv~Bh(+^wUuTGYs#)UJkJc2GcR4dr z+)``Jt0VEB>9Uwea)?cf*;CcmgN&m+gF2_+59K62r%1KvHV#O=igwH-7cYT-(y_k( zzS8x-`I7-7@!J(w5ZjBk!k?_#l!MQ(cdGnA>sIXq))*!O?NPM~A%iary&RiMAy4N@ zHoUGldfy^eJR+!r__`i*WD2=P44608&n#nwNivQ_xzHLNf#`S^KTUEvl64Wf;*S1w z(!9d-mH(fIk5mJmi{?rABHlY6@1tdA9UT@_J$90xsY64>@43E5;YRU5eI`DW-e5D0 zniD11O1|2+_il8&3+8**WRrK^vGZ)i^H-II?}KHqd-E|8lCE{?x8k{J>yf1Wr1<*q zDXaVB$5@ut`4A7(H+-KXbu4ti^FDg`Q(Ozius6QBJ5-hq_Q=LkBbab{U2B^8%OSQkz?;y?+IVy*ehh8@QT8-YkiDC!osyF8isz9s^WquWz}v%m;2)l98-}SE>bOq4UYljby`g)g!36xrN}8 z_YQPv2@z_X*`D(vBB()mcLQBwVi~by8cEs89DlB7*7E-PBCfMb#M421wq^FGZ=gq- zq?*xu7o(VI$s#33j2W>$)8*K^O=R&r>YZcqD*UEZaDlJWQrpOybp&5l>)WZfxG!1{0^!03F z%{A~Wwtm!;epHEEXJ4ZhSoa}giIT}$=P_Q?3Y%c)XCAHVKJay)fGmo;^5SN#$#o_B znO^F+o~R>tlmq+W2mS7;&Y!F-bbe$3ZyDR)LUzTKdD|!rKdP8n<60O$q76N$AZ|+? zH~e6^m3ms9x7+!BE8fgW4^?+g@w3izlhXP|T}Nsnw%h*(c~X4s))*)vI?9;7{x{i| z*Y>jr@hL1>^;#BCIfw!0ITV6K_(G?tkIZf91n