From fd62abcf8ff4f8d95d75c82f886d5bfcd9707929 Mon Sep 17 00:00:00 2001 From: Kwangmin Bae Date: Wed, 10 Nov 2021 08:35:06 +0000 Subject: [PATCH 1/8] 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 2/8] 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 3/8] 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 4/8] 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 5/8] 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 6/8] 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 7/8] 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 8/8] 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