Merge branch 'main' into PangMo5/coordinator-and-deep-link

# Conflicts:
#	JellyfinPlayer/SettingsView.swift
#	JellyfinPlayer/VideoPlayer.swift
This commit is contained in:
PangMo5 2021-08-25 17:48:32 +09:00
commit 3ad789fe08
21 changed files with 513 additions and 26 deletions

View File

@ -1,18 +1,22 @@
{
"images" : [
{
"filename" : "top shelf.png",
"idiom" : "tv",
"scale" : "1x"
},
{
"filename" : "Untitled-2.png",
"idiom" : "tv",
"scale" : "2x"
},
{
"filename" : "top shelf-1.png",
"idiom" : "tv-marketing",
"scale" : "1x"
},
{
"filename" : "Untitled-1.png",
"idiom" : "tv-marketing",
"scale" : "2x"
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 102 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 102 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

View File

@ -160,7 +160,7 @@ struct ConnectToServerView: View {
.padding(.leading, 90)
.padding(.trailing, 90)
.alert(item: $viewModel.errorMessage) { _ in
Alert(title: Text("Error"), message: Text(viewModel.errorMessage ?? ""), dismissButton: .default(Text("Ok")))
Alert(title: Text("Error"), message: Text(viewModel.errorMessage as? String ?? ""), dismissButton: .default(Text("Ok")))
}
.onChange(of: uri) { uri in
viewModel.uriSubject.send(uri)

View File

@ -98,6 +98,45 @@
53892770263C25230035E14B /* NextUpView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5389276F263C25230035E14B /* NextUpView.swift */; };
53892772263C8C6F0035E14B /* LoadingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53892771263C8C6F0035E14B /* LoadingView.swift */; };
5389277C263CC3DB0035E14B /* BlurHashDecode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5389277B263CC3DB0035E14B /* BlurHashDecode.swift */; };
53913BEF26D323FE00EB3286 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 53913BC926D323FE00EB3286 /* Localizable.strings */; };
53913BF026D323FE00EB3286 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 53913BC926D323FE00EB3286 /* Localizable.strings */; };
53913BF126D323FE00EB3286 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 53913BC926D323FE00EB3286 /* Localizable.strings */; };
53913BF226D323FE00EB3286 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 53913BCC26D323FE00EB3286 /* Localizable.strings */; };
53913BF326D323FE00EB3286 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 53913BCC26D323FE00EB3286 /* Localizable.strings */; };
53913BF426D323FE00EB3286 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 53913BCC26D323FE00EB3286 /* Localizable.strings */; };
53913BF526D323FE00EB3286 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 53913BCF26D323FE00EB3286 /* Localizable.strings */; };
53913BF626D323FE00EB3286 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 53913BCF26D323FE00EB3286 /* Localizable.strings */; };
53913BF726D323FE00EB3286 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 53913BCF26D323FE00EB3286 /* Localizable.strings */; };
53913BF826D323FE00EB3286 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 53913BD226D323FE00EB3286 /* Localizable.strings */; };
53913BF926D323FE00EB3286 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 53913BD226D323FE00EB3286 /* Localizable.strings */; };
53913BFA26D323FE00EB3286 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 53913BD226D323FE00EB3286 /* Localizable.strings */; };
53913BFB26D323FE00EB3286 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 53913BD526D323FE00EB3286 /* Localizable.strings */; };
53913BFC26D323FE00EB3286 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 53913BD526D323FE00EB3286 /* Localizable.strings */; };
53913BFD26D323FE00EB3286 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 53913BD526D323FE00EB3286 /* Localizable.strings */; };
53913BFE26D323FE00EB3286 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 53913BD826D323FE00EB3286 /* Localizable.strings */; };
53913BFF26D323FE00EB3286 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 53913BD826D323FE00EB3286 /* Localizable.strings */; };
53913C0026D323FE00EB3286 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 53913BD826D323FE00EB3286 /* Localizable.strings */; };
53913C0126D323FE00EB3286 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 53913BDB26D323FE00EB3286 /* Localizable.strings */; };
53913C0226D323FE00EB3286 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 53913BDB26D323FE00EB3286 /* Localizable.strings */; };
53913C0326D323FE00EB3286 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 53913BDB26D323FE00EB3286 /* Localizable.strings */; };
53913C0426D323FE00EB3286 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 53913BDE26D323FE00EB3286 /* Localizable.strings */; };
53913C0526D323FE00EB3286 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 53913BDE26D323FE00EB3286 /* Localizable.strings */; };
53913C0626D323FE00EB3286 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 53913BDE26D323FE00EB3286 /* Localizable.strings */; };
53913C0726D323FE00EB3286 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 53913BE126D323FE00EB3286 /* Localizable.strings */; };
53913C0826D323FE00EB3286 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 53913BE126D323FE00EB3286 /* Localizable.strings */; };
53913C0926D323FE00EB3286 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 53913BE126D323FE00EB3286 /* Localizable.strings */; };
53913C0A26D323FE00EB3286 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 53913BE426D323FE00EB3286 /* Localizable.strings */; };
53913C0B26D323FE00EB3286 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 53913BE426D323FE00EB3286 /* Localizable.strings */; };
53913C0C26D323FE00EB3286 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 53913BE426D323FE00EB3286 /* Localizable.strings */; };
53913C0D26D323FE00EB3286 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 53913BE726D323FE00EB3286 /* Localizable.strings */; };
53913C0E26D323FE00EB3286 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 53913BE726D323FE00EB3286 /* Localizable.strings */; };
53913C0F26D323FE00EB3286 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 53913BE726D323FE00EB3286 /* Localizable.strings */; };
53913C1026D323FE00EB3286 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 53913BEA26D323FE00EB3286 /* Localizable.strings */; };
53913C1126D323FE00EB3286 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 53913BEA26D323FE00EB3286 /* Localizable.strings */; };
53913C1226D323FE00EB3286 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 53913BEA26D323FE00EB3286 /* Localizable.strings */; };
53913C1326D323FE00EB3286 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 53913BED26D323FE00EB3286 /* Localizable.strings */; };
53913C1426D323FE00EB3286 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 53913BED26D323FE00EB3286 /* Localizable.strings */; };
53913C1526D323FE00EB3286 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 53913BED26D323FE00EB3286 /* Localizable.strings */; };
5398514526B64DA100101B49 /* SettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5398514426B64DA100101B49 /* SettingsView.swift */; };
5398514626B64DBB00101B49 /* SearchablePickerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 624C21742685CF60007F1390 /* SearchablePickerView.swift */; };
5398514726B64E4100101B49 /* SearchBarView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53DE4BD1267098F300739748 /* SearchBarView.swift */; };
@ -217,6 +256,9 @@
E131691726C583BC0074BFEE /* LogConstructor.swift in Sources */ = {isa = PBXBuildFile; fileRef = E131691626C583BC0074BFEE /* LogConstructor.swift */; };
E131691826C583BC0074BFEE /* LogConstructor.swift in Sources */ = {isa = PBXBuildFile; fileRef = E131691626C583BC0074BFEE /* LogConstructor.swift */; };
E131691926C583BC0074BFEE /* LogConstructor.swift in Sources */ = {isa = PBXBuildFile; fileRef = E131691626C583BC0074BFEE /* LogConstructor.swift */; };
E173DA5026D048D600CC4EB7 /* ServerDetailView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E173DA4F26D048D600CC4EB7 /* ServerDetailView.swift */; };
E173DA5226D04AAF00CC4EB7 /* ColorExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = E173DA5126D04AAF00CC4EB7 /* ColorExtension.swift */; };
E173DA5426D050F500CC4EB7 /* ServerDetailViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = E173DA5326D050F500CC4EB7 /* ServerDetailViewModel.swift */; };
E1F0204E26CCCA74001C1C3B /* VideoPlayerJumpLength.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1F0204D26CCCA74001C1C3B /* VideoPlayerJumpLength.swift */; };
E1F0204F26CCCA74001C1C3B /* VideoPlayerJumpLength.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1F0204D26CCCA74001C1C3B /* VideoPlayerJumpLength.swift */; };
E1FCD08826C35A0D007C8DCF /* NetworkError.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1FCD08726C35A0D007C8DCF /* NetworkError.swift */; };
@ -339,6 +381,19 @@
5389276F263C25230035E14B /* NextUpView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NextUpView.swift; sourceTree = "<group>"; };
53892771263C8C6F0035E14B /* LoadingView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoadingView.swift; sourceTree = "<group>"; };
5389277B263CC3DB0035E14B /* BlurHashDecode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BlurHashDecode.swift; sourceTree = "<group>"; };
53913BCA26D323FE00EB3286 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = Localizable.strings; sourceTree = "<group>"; };
53913BCD26D323FE00EB3286 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = Localizable.strings; sourceTree = "<group>"; };
53913BD026D323FE00EB3286 /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = Localizable.strings; sourceTree = "<group>"; };
53913BD326D323FE00EB3286 /* vi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = vi; path = Localizable.strings; sourceTree = "<group>"; };
53913BD626D323FE00EB3286 /* sv */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sv; path = Localizable.strings; sourceTree = "<group>"; };
53913BD926D323FE00EB3286 /* sl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sl; path = Localizable.strings; sourceTree = "<group>"; };
53913BDC26D323FE00EB3286 /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = Localizable.strings; sourceTree = "<group>"; };
53913BDF26D323FE00EB3286 /* ta */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ta; path = Localizable.strings; sourceTree = "<group>"; };
53913BE226D323FE00EB3286 /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = Localizable.strings; sourceTree = "<group>"; };
53913BE526D323FE00EB3286 /* el */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = el; path = Localizable.strings; sourceTree = "<group>"; };
53913BE826D323FE00EB3286 /* he */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = he; path = Localizable.strings; sourceTree = "<group>"; };
53913BEB26D323FE00EB3286 /* sk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sk; path = Localizable.strings; sourceTree = "<group>"; };
53913BEE26D323FE00EB3286 /* kk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = kk; path = Localizable.strings; sourceTree = "<group>"; };
5398514426B64DA100101B49 /* SettingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsView.swift; sourceTree = "<group>"; };
53987CA326572C1300E7EA70 /* SeasonItemView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SeasonItemView.swift; sourceTree = "<group>"; };
53987CA526572F0700E7EA70 /* SeriesItemView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SeriesItemView.swift; sourceTree = "<group>"; };
@ -417,6 +472,9 @@
DE5004F745B19E28744A7DE7 /* Pods-JellyfinPlayer tvOS.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-JellyfinPlayer tvOS.debug.xcconfig"; path = "Target Support Files/Pods-JellyfinPlayer tvOS/Pods-JellyfinPlayer tvOS.debug.xcconfig"; sourceTree = "<group>"; };
E100720626BDABC100CE3E31 /* MediaPlayButtonRowView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MediaPlayButtonRowView.swift; sourceTree = "<group>"; };
E131691626C583BC0074BFEE /* LogConstructor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LogConstructor.swift; sourceTree = "<group>"; };
E173DA4F26D048D600CC4EB7 /* ServerDetailView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ServerDetailView.swift; sourceTree = "<group>"; };
E173DA5126D04AAF00CC4EB7 /* ColorExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ColorExtension.swift; sourceTree = "<group>"; };
E173DA5326D050F500CC4EB7 /* ServerDetailViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ServerDetailViewModel.swift; sourceTree = "<group>"; };
E1F0204D26CCCA74001C1C3B /* VideoPlayerJumpLength.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VideoPlayerJumpLength.swift; sourceTree = "<group>"; };
E1FCD08726C35A0D007C8DCF /* NetworkError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkError.swift; sourceTree = "<group>"; };
E1FCD09526C47118007C8DCF /* ErrorMessage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ErrorMessage.swift; sourceTree = "<group>"; };
@ -518,6 +576,7 @@
62E632E2267D3BA60063E547 /* MovieItemViewModel.swift */,
62E632E8267D3FF50063E547 /* SeasonItemViewModel.swift */,
62E632EB267D410B0063E547 /* SeriesItemViewModel.swift */,
E173DA5326D050F500CC4EB7 /* ServerDetailViewModel.swift */,
5321753A2671BCFC005491E6 /* SettingsViewModel.swift */,
625CB5692678B71200530A6E /* SplashViewModel.swift */,
09389CC626819B4500AE350E /* VideoPlayerModel.swift */,
@ -530,6 +589,19 @@
534D4FE126A7D7CC000A7A48 /* Translations */ = {
isa = PBXGroup;
children = (
53913BDA26D323FE00EB3286 /* de.lproj */,
53913BE326D323FE00EB3286 /* el.lproj */,
53913BE026D323FE00EB3286 /* es.lproj */,
53913BC826D323FE00EB3286 /* fr.lproj */,
53913BE626D323FE00EB3286 /* he.lproj */,
53913BCE26D323FE00EB3286 /* it.lproj */,
53913BEC26D323FE00EB3286 /* kk.lproj */,
53913BCB26D323FE00EB3286 /* ru.lproj */,
53913BE926D323FE00EB3286 /* sk.lproj */,
53913BD726D323FE00EB3286 /* sl.lproj */,
53913BD426D323FE00EB3286 /* sv.lproj */,
53913BDD26D323FE00EB3286 /* ta.lproj */,
53913BD126D323FE00EB3286 /* vi.lproj */,
534D4FED26A7D7CC000A7A48 /* zh-Hans.lproj */,
534D4FE626A7D7CC000A7A48 /* en.lproj */,
534D4FEA26A7D7CC000A7A48 /* ko.lproj */,
@ -686,6 +758,7 @@
53987CA326572C1300E7EA70 /* SeasonItemView.swift */,
53987CA526572F0700E7EA70 /* SeriesItemView.swift */,
539B2DA4263BA5B8007FF1A4 /* SettingsView.swift */,
E173DA4F26D048D600CC4EB7 /* ServerDetailView.swift */,
535BAEA4264A151C005FA86D /* VideoPlayer.swift */,
0959A5FC2686D29800C7C9A9 /* VideoUpNextView.swift */,
53313B8F265EEA6D00947AA3 /* VideoPlayer.storyboard */,
@ -705,6 +778,123 @@
path = "Preview Content";
sourceTree = "<group>";
};
53913BC826D323FE00EB3286 /* fr.lproj */ = {
isa = PBXGroup;
children = (
53913BC926D323FE00EB3286 /* Localizable.strings */,
);
name = fr.lproj;
path = Translations/fr.lproj;
sourceTree = SOURCE_ROOT;
};
53913BCB26D323FE00EB3286 /* ru.lproj */ = {
isa = PBXGroup;
children = (
53913BCC26D323FE00EB3286 /* Localizable.strings */,
);
name = ru.lproj;
path = Translations/ru.lproj;
sourceTree = SOURCE_ROOT;
};
53913BCE26D323FE00EB3286 /* it.lproj */ = {
isa = PBXGroup;
children = (
53913BCF26D323FE00EB3286 /* Localizable.strings */,
);
name = it.lproj;
path = Translations/it.lproj;
sourceTree = SOURCE_ROOT;
};
53913BD126D323FE00EB3286 /* vi.lproj */ = {
isa = PBXGroup;
children = (
53913BD226D323FE00EB3286 /* Localizable.strings */,
);
name = vi.lproj;
path = Translations/vi.lproj;
sourceTree = SOURCE_ROOT;
};
53913BD426D323FE00EB3286 /* sv.lproj */ = {
isa = PBXGroup;
children = (
53913BD526D323FE00EB3286 /* Localizable.strings */,
);
name = sv.lproj;
path = Translations/sv.lproj;
sourceTree = SOURCE_ROOT;
};
53913BD726D323FE00EB3286 /* sl.lproj */ = {
isa = PBXGroup;
children = (
53913BD826D323FE00EB3286 /* Localizable.strings */,
);
name = sl.lproj;
path = Translations/sl.lproj;
sourceTree = SOURCE_ROOT;
};
53913BDA26D323FE00EB3286 /* de.lproj */ = {
isa = PBXGroup;
children = (
53913BDB26D323FE00EB3286 /* Localizable.strings */,
);
name = de.lproj;
path = Translations/de.lproj;
sourceTree = SOURCE_ROOT;
};
53913BDD26D323FE00EB3286 /* ta.lproj */ = {
isa = PBXGroup;
children = (
53913BDE26D323FE00EB3286 /* Localizable.strings */,
);
name = ta.lproj;
path = Translations/ta.lproj;
sourceTree = SOURCE_ROOT;
};
53913BE026D323FE00EB3286 /* es.lproj */ = {
isa = PBXGroup;
children = (
53913BE126D323FE00EB3286 /* Localizable.strings */,
);
name = es.lproj;
path = Translations/es.lproj;
sourceTree = SOURCE_ROOT;
};
53913BE326D323FE00EB3286 /* el.lproj */ = {
isa = PBXGroup;
children = (
53913BE426D323FE00EB3286 /* Localizable.strings */,
);
name = el.lproj;
path = Translations/el.lproj;
sourceTree = SOURCE_ROOT;
};
53913BE626D323FE00EB3286 /* he.lproj */ = {
isa = PBXGroup;
children = (
53913BE726D323FE00EB3286 /* Localizable.strings */,
);
name = he.lproj;
path = Translations/he.lproj;
sourceTree = SOURCE_ROOT;
};
53913BE926D323FE00EB3286 /* sk.lproj */ = {
isa = PBXGroup;
children = (
53913BEA26D323FE00EB3286 /* Localizable.strings */,
);
name = sk.lproj;
path = Translations/sk.lproj;
sourceTree = SOURCE_ROOT;
};
53913BEC26D323FE00EB3286 /* kk.lproj */ = {
isa = PBXGroup;
children = (
53913BED26D323FE00EB3286 /* Localizable.strings */,
);
name = kk.lproj;
path = Translations/kk.lproj;
sourceTree = SOURCE_ROOT;
};
53D5E3DB264B47EE00BADDC8 /* Frameworks */ = {
isa = PBXGroup;
children = (
@ -748,6 +938,7 @@
isa = PBXGroup;
children = (
53DE4BD1267098F300739748 /* SearchBarView.swift */,
E173DA5126D04AAF00CC4EB7 /* ColorExtension.swift */,
53192D5C265AA78A008A4215 /* DeviceProfileBuilder.swift */,
531AC8BE26750DE20091C7EB /* ImageView.swift */,
5364F454266CA0DC0026ECBA /* APIExtensions.swift */,
@ -962,6 +1153,19 @@
en,
"zh-Hans",
ko,
fr,
ru,
it,
vi,
sv,
sl,
de,
ta,
es,
el,
he,
sk,
kk,
);
mainGroup = 5377CBE8263B596A003A4E83;
packageReferences = (
@ -994,11 +1198,24 @@
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
53913C0B26D323FE00EB3286 /* Localizable.strings in Resources */,
534D4FF126A7D7CC000A7A48 /* Localizable.strings in Resources */,
53913BFC26D323FE00EB3286 /* Localizable.strings in Resources */,
534D4FF426A7D7CC000A7A48 /* Localizable.strings in Resources */,
53913C0226D323FE00EB3286 /* Localizable.strings in Resources */,
53913C1426D323FE00EB3286 /* Localizable.strings in Resources */,
53913BF926D323FE00EB3286 /* Localizable.strings in Resources */,
5310695D2684E7EE00CFFDBA /* VideoPlayer.storyboard in Resources */,
534D4FF726A7D7CC000A7A48 /* Localizable.strings in Resources */,
53913BF326D323FE00EB3286 /* Localizable.strings in Resources */,
53913BF626D323FE00EB3286 /* Localizable.strings in Resources */,
5358706A2669D21700D05A09 /* Preview Assets.xcassets in Resources */,
53913C0526D323FE00EB3286 /* Localizable.strings in Resources */,
53913BFF26D323FE00EB3286 /* Localizable.strings in Resources */,
53913C0E26D323FE00EB3286 /* Localizable.strings in Resources */,
53913BF026D323FE00EB3286 /* Localizable.strings in Resources */,
53913C0826D323FE00EB3286 /* Localizable.strings in Resources */,
53913C1126D323FE00EB3286 /* Localizable.strings in Resources */,
535870672669D21700D05A09 /* Assets.xcassets in Resources */,
5358707E2669D64F00D05A09 /* bitrates.json in Resources */,
);
@ -1008,11 +1225,24 @@
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
53913C0A26D323FE00EB3286 /* Localizable.strings in Resources */,
534D4FF026A7D7CC000A7A48 /* Localizable.strings in Resources */,
53913BFB26D323FE00EB3286 /* Localizable.strings in Resources */,
534D4FF326A7D7CC000A7A48 /* Localizable.strings in Resources */,
53913C0126D323FE00EB3286 /* Localizable.strings in Resources */,
53913C1326D323FE00EB3286 /* Localizable.strings in Resources */,
53913BF826D323FE00EB3286 /* Localizable.strings in Resources */,
5377CBFC263B596B003A4E83 /* Preview Assets.xcassets in Resources */,
534D4FF626A7D7CC000A7A48 /* Localizable.strings in Resources */,
53913BF226D323FE00EB3286 /* Localizable.strings in Resources */,
53913BF526D323FE00EB3286 /* Localizable.strings in Resources */,
53313B90265EEA6D00947AA3 /* VideoPlayer.storyboard in Resources */,
53913C0426D323FE00EB3286 /* Localizable.strings in Resources */,
53913BFE26D323FE00EB3286 /* Localizable.strings in Resources */,
53913C0D26D323FE00EB3286 /* Localizable.strings in Resources */,
53913BEF26D323FE00EB3286 /* Localizable.strings in Resources */,
53913C0726D323FE00EB3286 /* Localizable.strings in Resources */,
53913C1026D323FE00EB3286 /* Localizable.strings in Resources */,
AE8C3159265D6F90008AA076 /* bitrates.json in Resources */,
5377CBF9263B596B003A4E83 /* Assets.xcassets in Resources */,
);
@ -1022,8 +1252,21 @@
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
53913C1526D323FE00EB3286 /* Localizable.strings in Resources */,
53913BF126D323FE00EB3286 /* Localizable.strings in Resources */,
53913C0626D323FE00EB3286 /* Localizable.strings in Resources */,
53913BF426D323FE00EB3286 /* Localizable.strings in Resources */,
53913C0C26D323FE00EB3286 /* Localizable.strings in Resources */,
53913C0326D323FE00EB3286 /* Localizable.strings in Resources */,
628B95292670CABE0091AF3B /* Assets.xcassets in Resources */,
53913BF726D323FE00EB3286 /* Localizable.strings in Resources */,
53913BFD26D323FE00EB3286 /* Localizable.strings in Resources */,
53913C0026D323FE00EB3286 /* Localizable.strings in Resources */,
534D4FF826A7D7CC000A7A48 /* Localizable.strings in Resources */,
53913C0F26D323FE00EB3286 /* Localizable.strings in Resources */,
53913C0926D323FE00EB3286 /* Localizable.strings in Resources */,
53913BFA26D323FE00EB3286 /* Localizable.strings in Resources */,
53913C1226D323FE00EB3286 /* Localizable.strings in Resources */,
534D4FF526A7D7CC000A7A48 /* Localizable.strings in Resources */,
534D4FF226A7D7CC000A7A48 /* Localizable.strings in Resources */,
);
@ -1238,6 +1481,7 @@
536D3D78267BD5C30004248C /* ViewModel.swift in Sources */,
62CB3F4B2685BB77003D0A6F /* DefaultsExtension.swift in Sources */,
E1FCD08826C35A0D007C8DCF /* NetworkError.swift in Sources */,
E173DA5426D050F500CC4EB7 /* ServerDetailViewModel.swift in Sources */,
53DE4BD02670961400739748 /* EpisodeItemView.swift in Sources */,
53F8377D265FF67C00F456B3 /* VideoPlayerSettingsView.swift in Sources */,
53192D5D265AA78A008A4215 /* DeviceProfileBuilder.swift in Sources */,
@ -1246,6 +1490,7 @@
0959A5FD2686D29800C7C9A9 /* VideoUpNextView.swift in Sources */,
62E632DA267D2BC40063E547 /* LatestMediaViewModel.swift in Sources */,
625CB56F2678C23300530A6E /* HomeView.swift in Sources */,
E173DA5226D04AAF00CC4EB7 /* ColorExtension.swift in Sources */,
53892770263C25230035E14B /* NextUpView.swift in Sources */,
625CB5682678B6FB00530A6E /* SplashView.swift in Sources */,
535BAEA5264A151C005FA86D /* VideoPlayer.swift in Sources */,
@ -1273,6 +1518,7 @@
531AC8BF26750DE20091C7EB /* ImageView.swift in Sources */,
62E632E0267D30CA0063E547 /* LibraryViewModel.swift in Sources */,
624C21752685CF60007F1390 /* SearchablePickerView.swift in Sources */,
E173DA5026D048D600CC4EB7 /* ServerDetailView.swift in Sources */,
62EC352F267666A5000E9F2D /* SessionManager.swift in Sources */,
62E632E3267D3BA60063E547 /* MovieItemViewModel.swift in Sources */,
091B5A8A2683142E00D78B61 /* ServerDiscovery.swift in Sources */,
@ -1354,6 +1600,110 @@
name = Localizable.strings;
sourceTree = "<group>";
};
53913BC926D323FE00EB3286 /* Localizable.strings */ = {
isa = PBXVariantGroup;
children = (
53913BCA26D323FE00EB3286 /* fr */,
);
name = Localizable.strings;
sourceTree = "<group>";
};
53913BCC26D323FE00EB3286 /* Localizable.strings */ = {
isa = PBXVariantGroup;
children = (
53913BCD26D323FE00EB3286 /* ru */,
);
name = Localizable.strings;
sourceTree = "<group>";
};
53913BCF26D323FE00EB3286 /* Localizable.strings */ = {
isa = PBXVariantGroup;
children = (
53913BD026D323FE00EB3286 /* it */,
);
name = Localizable.strings;
sourceTree = "<group>";
};
53913BD226D323FE00EB3286 /* Localizable.strings */ = {
isa = PBXVariantGroup;
children = (
53913BD326D323FE00EB3286 /* vi */,
);
name = Localizable.strings;
sourceTree = "<group>";
};
53913BD526D323FE00EB3286 /* Localizable.strings */ = {
isa = PBXVariantGroup;
children = (
53913BD626D323FE00EB3286 /* sv */,
);
name = Localizable.strings;
sourceTree = "<group>";
};
53913BD826D323FE00EB3286 /* Localizable.strings */ = {
isa = PBXVariantGroup;
children = (
53913BD926D323FE00EB3286 /* sl */,
);
name = Localizable.strings;
sourceTree = "<group>";
};
53913BDB26D323FE00EB3286 /* Localizable.strings */ = {
isa = PBXVariantGroup;
children = (
53913BDC26D323FE00EB3286 /* de */,
);
name = Localizable.strings;
sourceTree = "<group>";
};
53913BDE26D323FE00EB3286 /* Localizable.strings */ = {
isa = PBXVariantGroup;
children = (
53913BDF26D323FE00EB3286 /* ta */,
);
name = Localizable.strings;
sourceTree = "<group>";
};
53913BE126D323FE00EB3286 /* Localizable.strings */ = {
isa = PBXVariantGroup;
children = (
53913BE226D323FE00EB3286 /* es */,
);
name = Localizable.strings;
sourceTree = "<group>";
};
53913BE426D323FE00EB3286 /* Localizable.strings */ = {
isa = PBXVariantGroup;
children = (
53913BE526D323FE00EB3286 /* el */,
);
name = Localizable.strings;
sourceTree = "<group>";
};
53913BE726D323FE00EB3286 /* Localizable.strings */ = {
isa = PBXVariantGroup;
children = (
53913BE826D323FE00EB3286 /* he */,
);
name = Localizable.strings;
sourceTree = "<group>";
};
53913BEA26D323FE00EB3286 /* Localizable.strings */ = {
isa = PBXVariantGroup;
children = (
53913BEB26D323FE00EB3286 /* sk */,
);
name = Localizable.strings;
sourceTree = "<group>";
};
53913BED26D323FE00EB3286 /* Localizable.strings */ = {
isa = PBXVariantGroup;
children = (
53913BEE26D323FE00EB3286 /* kk */,
);
name = Localizable.strings;
sourceTree = "<group>";
};
/* End PBXVariantGroup section */
/* Begin XCBuildConfiguration section */
@ -1366,7 +1716,7 @@
ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = NO;
CODE_SIGN_ENTITLEMENTS = "JellyfinPlayer tvOS/JellyfinPlayer tvOS.entitlements";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 59;
CURRENT_PROJECT_VERSION = 60;
DEVELOPMENT_ASSET_PATHS = "\"JellyfinPlayer tvOS/Preview Content\"";
DEVELOPMENT_TEAM = 9R8RREG67J;
ENABLE_PREVIEWS = YES;
@ -1397,7 +1747,7 @@
ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = NO;
CODE_SIGN_ENTITLEMENTS = "JellyfinPlayer tvOS/JellyfinPlayer tvOS.entitlements";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 59;
CURRENT_PROJECT_VERSION = 60;
DEVELOPMENT_ASSET_PATHS = "\"JellyfinPlayer tvOS/Preview Content\"";
DEVELOPMENT_TEAM = 9R8RREG67J;
ENABLE_PREVIEWS = YES;
@ -1549,7 +1899,7 @@
CODE_SIGN_ENTITLEMENTS = JellyfinPlayer/JellyfinPlayer.entitlements;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 59;
CURRENT_PROJECT_VERSION = 60;
DEVELOPMENT_ASSET_PATHS = "";
DEVELOPMENT_TEAM = 9R8RREG67J;
ENABLE_BITCODE = NO;
@ -1585,7 +1935,7 @@
CODE_SIGN_ENTITLEMENTS = JellyfinPlayer/JellyfinPlayer.entitlements;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 59;
CURRENT_PROJECT_VERSION = 60;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
DEVELOPMENT_ASSET_PATHS = "";
DEVELOPMENT_TEAM = 9R8RREG67J;
@ -1618,7 +1968,7 @@
ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground;
CODE_SIGN_ENTITLEMENTS = WidgetExtension/WidgetExtension.entitlements;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 59;
CURRENT_PROJECT_VERSION = 60;
DEVELOPMENT_TEAM = 9R8RREG67J;
INFOPLIST_FILE = WidgetExtension/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 14.1;
@ -1645,7 +1995,7 @@
ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground;
CODE_SIGN_ENTITLEMENTS = WidgetExtension/WidgetExtension.entitlements;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 59;
CURRENT_PROJECT_VERSION = 60;
DEVELOPMENT_TEAM = 9R8RREG67J;
INFOPLIST_FILE = WidgetExtension/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 14.1;

View File

@ -0,0 +1,62 @@
//
/*
* 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 SwiftUI
struct ServerDetailView: View {
@ObservedObject var viewModel = ServerDetailViewModel()
var body: some View {
Form {
Section(header: Text("")) {
HStack {
Text("Name")
Spacer()
Text(ServerEnvironment.current.server.name ?? "")
.foregroundColor(.secondary)
}
HStack {
Text("URI")
Spacer()
Text(ServerEnvironment.current.server.baseURI ?? "")
.foregroundColor(.secondary)
}
HStack {
Text("Version")
Spacer()
Text(ServerEnvironment.current.server.version ?? "")
.foregroundColor(.secondary)
}
HStack {
Text("Operating System")
Spacer()
Text(ServerEnvironment.current.server.os ?? "")
.foregroundColor(.secondary)
}
}
Button(action: {
viewModel.refreshServerLibrary()
}, label: {
HStack {
Text("Refresh Library")
.font(.callout)
Spacer()
if viewModel.isLoading {
ProgressView()
}
}
}).disabled(viewModel.isLoading)
}
}
}

View File

@ -25,16 +25,42 @@ struct SettingsView: View {
@Default(.appAppearance) var appAppearance
@Default(.videoPlayerJumpForward) var jumpForwardLength
@Default(.videoPlayerJumpBackward) var jumpBackwardLength
@State private var username: String = ""
func onAppear() {
username = SessionManager.current.user?.username ?? ""
}
var body: some View {
NavigationView {
Form {
Section(header: Text("Playback settings")) {
Section(header: EmptyView()) {
HStack {
Text("User")
Spacer()
Text(SessionManager.current.user.username ?? "")
.foregroundColor(.jellyfinPurple)
}
NavigationLink(
destination: ServerDetailView(),
label: {
HStack {
Text("Server")
Spacer()
Text(ServerEnvironment.current.server.name ?? "")
.foregroundColor(.jellyfinPurple)
}
})
Button {
close = false
DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
SessionManager.current.logout()
let nc = NotificationCenter.default
nc.post(name: Notification.Name("didSignOut"), object: nil)
}
} label: {
Text("Sign out")
.font(.callout)
}
}
Section(header: Text("Playback")) {
Picker("Default local quality", selection: $inNetworkStreamBitrate) {
ForEach(self.viewModel.bitrates, id: \.self) { bitrate in
Text(bitrate.name).tag(bitrate.value)
@ -122,6 +148,6 @@ struct SettingsView: View {
}
}
}
}.onAppear(perform: onAppear)
}
}
}

View File

@ -18,7 +18,7 @@ class VideoPlayerSettingsView: UINavigationController {
override func viewDidLoad() {
super.viewDidLoad()
self.viewControllers = [UIHostingController(rootView: VideoPlayerSettings(delegate: self.playerDelegate ?? PlayerViewController()))]
}

View File

@ -45,7 +45,7 @@ struct VideoUpNextView: View {
.font(.subheadline)
}
.frame(width: 120, height: 35)
.background(Color(red: 172 / 255, green: 92 / 255, blue: 195 / 255))
.background(Color.jellyfinPurple)
.cornerRadius(10)
}.buttonStyle(PlainButtonStyle())
.frame(width: 120, height: 35)

View File

@ -0,0 +1,16 @@
//
/*
* 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 SwiftUI
extension Color {
static let jellyfinPurple = Color(red: 172 / 255, green: 92 / 255, blue: 195 / 255)
}

View File

@ -14,18 +14,18 @@ enum VideoPlayerJumpLength: Int32, CaseIterable, Defaults.Serializable {
case thirty = 30
case fifteen = 15
case ten = 10
// TODO - Uncomment once iOS 15 released
// case five = 5
var label: String {
return "\(self.rawValue) seconds"
}
func generateForwardImage(with font: UIFont) -> UIImage {
let config = UIImage.SymbolConfiguration(font: font)
let systemName: String
switch self {
case .thirty:
systemName = "goforward.30"
@ -36,14 +36,14 @@ enum VideoPlayerJumpLength: Int32, CaseIterable, Defaults.Serializable {
// case .five:
// systemName = "goforward.5"
}
return UIImage(systemName: systemName, withConfiguration: config)!
}
func generateBackwardImage(with font: UIFont) -> UIImage {
let config = UIImage.SymbolConfiguration(font: font)
let systemName: String
switch self {
case .thirty:
systemName = "gobackward.30"
@ -54,7 +54,7 @@ enum VideoPlayerJumpLength: Int32, CaseIterable, Defaults.Serializable {
// case .five:
// systemName = "gobackward.5"
}
return UIImage(systemName: systemName, withConfiguration: config)!
}
}

View File

@ -1,9 +1,11 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<model type="com.apple.IDECoreDataModeler.DataModel" documentVersion="1.0" lastSavedToolsVersion="19141.11" systemVersion="21A5268h" minimumToolsVersion="Automatic" sourceLanguage="Swift" usedWithCloudKit="YES" userDefinedModelVersionIdentifier="">
<model type="com.apple.IDECoreDataModeler.DataModel" documentVersion="1.0" lastSavedToolsVersion="18154" systemVersion="20G80" minimumToolsVersion="Automatic" sourceLanguage="Swift" usedWithCloudKit="YES" userDefinedModelVersionIdentifier="">
<entity name="Server" representedClassName="Server" syncable="YES" codeGenerationType="class">
<attribute name="baseURI" attributeType="String" defaultValueString=""/>
<attribute name="name" attributeType="String" defaultValueString=""/>
<attribute name="os" optional="YES" attributeType="String"/>
<attribute name="server_id" attributeType="String" defaultValueString=""/>
<attribute name="version" optional="YES" attributeType="String"/>
</entity>
<entity name="SignedInUser" representedClassName="SignedInUser" syncable="YES" codeGenerationType="class">
<attribute name="appletv_id" optional="YES" attributeType="String"/>
@ -12,7 +14,7 @@
<attribute name="username" attributeType="String" defaultValueString=""/>
</entity>
<elements>
<element name="Server" positionX="-63" positionY="-9" width="128" height="74"/>
<element name="Server" positionX="-63" positionY="-9" width="128" height="104"/>
<element name="SignedInUser" positionX="-63" positionY="9" width="128" height="89"/>
</elements>
</model>

View File

@ -44,6 +44,8 @@ final class ServerEnvironment {
server.baseURI = uri
server.name = response.serverName
server.server_id = response.id
server.version = response.version
server.os = response.operatingSystem
return server
}
.handleEvents(receiveOutput: { [unowned self] response in

View File

@ -0,0 +1,25 @@
//
/*
* 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
class ServerDetailViewModel: ViewModel {
func refreshServerLibrary() {
LibraryAPI.refreshLibrary()
.trackActivity(loading)
.sink(receiveCompletion: { completion in
self.handleAPIRequestError(completion: completion)
}, receiveValue: {
LogManager.shared.log.debug("Refreshed server library successfully")
})
.store(in: &cancellables)
}
}

Binary file not shown.