Merge branch 'main' into advanced-server-settings

This commit is contained in:
aiden 3 2021-08-22 20:35:44 -04:00 committed by GitHub
commit 1703b6345c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
14 changed files with 434 additions and 80 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 */; };
@ -325,6 +364,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>"; };
@ -506,6 +558,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 */,
@ -682,6 +747,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 = (
@ -920,6 +1102,19 @@
en,
"zh-Hans",
ko,
fr,
ru,
it,
vi,
sv,
sl,
de,
ta,
es,
el,
he,
sk,
kk,
);
mainGroup = 5377CBE8263B596A003A4E83;
packageReferences = (
@ -951,11 +1146,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 */,
);
@ -965,11 +1173,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 */,
);
@ -979,8 +1200,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 */,
);
@ -1298,6 +1532,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 */
@ -1310,7 +1648,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;
@ -1341,7 +1679,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;
@ -1493,7 +1831,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;
@ -1529,7 +1867,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;
@ -1562,7 +1900,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;
@ -1589,7 +1927,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

@ -1,9 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="19115.3" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="18122" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
<device id="retina6_5" orientation="landscape" appearance="light"/>
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="19107.5"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="18093"/>
<capability name="Image references" minToolsVersion="12.0"/>
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
<capability name="System colors in document resources" minToolsVersion="11.0"/>
@ -30,7 +29,7 @@
<rect key="frame" x="0.0" y="0.0" width="896" height="414"/>
<subviews>
<slider opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" minValue="0.0" maxValue="1" translatesAutoresizingMaskIntoConstraints="NO" id="e9f-8l-RdN" userLabel="SeekSlider">
<rect key="frame" x="50" y="355" width="689" height="31"/>
<rect key="frame" x="133" y="355" width="630" height="31"/>
<color key="tintColor" red="0.66666666666666663" green="0.36078431372549019" blue="0.76470588235294112" alpha="1" colorSpace="calibratedRGB"/>
<color key="thumbTintColor" red="0.66666666666666663" green="0.36078431372549019" blue="0.76470588235294112" alpha="1" colorSpace="calibratedRGB"/>
<connections>
@ -39,7 +38,7 @@
<action selector="seekSliderValueChanged:" destination="Y6W-OH-hqX" eventType="valueChanged" id="tfF-Zl-CdU"/>
</connections>
</slider>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="-:--:--" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="qft-iu-f1z">
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="-:--:--" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="qft-iu-f1z" userLabel="Time Left Text">
<rect key="frame" x="766" y="353" width="91" height="34"/>
<constraints>
<constraint firstAttribute="width" constant="91" id="LbL-h0-EYA"/>
@ -49,6 +48,16 @@
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="-:--:--" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="knf-PP-UIS" userLabel="Time Text">
<rect key="frame" x="39" y="353" width="91" height="34"/>
<constraints>
<constraint firstAttribute="width" constant="91" id="FcP-Mk-OIL"/>
<constraint firstAttribute="height" constant="34" id="yXx-PI-kXn"/>
</constraints>
<fontDescription key="fontDescription" type="system" weight="semibold" pointSize="18"/>
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<nil key="highlightedColor"/>
</label>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="t2L-Oz-fe9" userLabel="MainActionButton">
<rect key="frame" x="406.66666666666669" y="165.66666666666666" width="83" height="83"/>
<constraints>
@ -156,13 +165,16 @@
<constraint firstItem="o8N-R1-DhT" firstAttribute="centerY" secondItem="riN-y1-ABZ" secondAttribute="centerY" id="Hs5-Bc-iPB"/>
<constraint firstAttribute="bottom" secondItem="qft-iu-f1z" secondAttribute="bottom" constant="27" id="NPi-py-0qd"/>
<constraint firstItem="rLx-SN-RHr" firstAttribute="leading" secondItem="Qcb-Fb-qZl" secondAttribute="leading" constant="30" id="Oe7-LK-6Tl"/>
<constraint firstItem="e9f-8l-RdN" firstAttribute="leading" secondItem="knf-PP-UIS" secondAttribute="trailing" constant="5" id="ShK-80-ij1"/>
<constraint firstItem="t2L-Oz-fe9" firstAttribute="centerY" secondItem="Qcb-Fb-qZl" secondAttribute="centerY" id="TOk-sG-UXV"/>
<constraint firstItem="knf-PP-UIS" firstAttribute="leading" secondItem="Qcb-Fb-qZl" secondAttribute="leading" constant="39" id="XNC-Q4-nE0"/>
<constraint firstItem="o8N-R1-DhT" firstAttribute="centerX" secondItem="t2L-Oz-fe9" secondAttribute="centerX" id="a5g-8U-9S5"/>
<constraint firstAttribute="bottom" secondItem="qft-iu-f1z" secondAttribute="bottom" constant="27" id="aOB-Uz-cbQ"/>
<constraint firstItem="qft-iu-f1z" firstAttribute="leading" secondItem="e9f-8l-RdN" secondAttribute="trailing" constant="29" id="auL-Vv-ZMV"/>
<constraint firstItem="qft-iu-f1z" firstAttribute="leading" secondItem="e9f-8l-RdN" secondAttribute="trailing" constant="5" id="auL-Vv-ZMV"/>
<constraint firstItem="bYM-Xp-bZO" firstAttribute="top" secondItem="An8-jF-FAY" secondAttribute="top" id="cVS-eI-vv2"/>
<constraint firstItem="e9f-8l-RdN" firstAttribute="leading" secondItem="Qcb-Fb-qZl" secondAttribute="leading" constant="52" id="ed3-xq-0Ug"/>
<constraint firstItem="t2L-Oz-fe9" firstAttribute="leading" secondItem="bYM-Xp-bZO" secondAttribute="trailing" constant="118.5" id="fci-L5-1f6"/>
<constraint firstItem="e9f-8l-RdN" firstAttribute="centerX" secondItem="Qcb-Fb-qZl" secondAttribute="centerX" id="jFy-Sb-aYi"/>
<constraint firstAttribute="bottom" secondItem="knf-PP-UIS" secondAttribute="bottom" constant="27" id="nLN-ju-9qC"/>
<constraint firstItem="o8N-R1-DhT" firstAttribute="leading" secondItem="rLx-SN-RHr" secondAttribute="trailing" constant="16" id="qnV-Qf-y9m"/>
<constraint firstItem="rLx-SN-RHr" firstAttribute="top" secondItem="Qcb-Fb-qZl" secondAttribute="top" constant="22" id="v4G-B1-7y6"/>
</constraints>
@ -197,7 +209,8 @@
<outlet property="mainActionButton" destination="t2L-Oz-fe9" id="nQR-2e-64l"/>
<outlet property="playerSettingsButton" destination="riN-y1-ABZ" id="I6r-z9-Jy2"/>
<outlet property="seekSlider" destination="e9f-8l-RdN" id="b3H-tn-TPG"/>
<outlet property="timeText" destination="qft-iu-f1z" id="pAX-J3-I53"/>
<outlet property="timeLeftText" destination="qft-iu-f1z" id="cSg-fO-9nF"/>
<outlet property="timeText" destination="knf-PP-UIS" id="KhK-BX-rqT"/>
<outlet property="titleLabel" destination="o8N-R1-DhT" id="E7D-iU-bMi"/>
<outlet property="upNextView" destination="CY9-gw-dv8" id="BP6-bc-6Vk"/>
<outlet property="videoContentView" destination="Tsh-rC-BwO" id="5uR-No-wLy"/>

View File

@ -34,6 +34,7 @@ class PlayerViewController: UIViewController, GCKDiscoveryManagerListener, GCKRe
@IBOutlet weak var upNextView: UIView!
@IBOutlet weak var timeText: UILabel!
@IBOutlet weak var timeLeftText: UILabel!
@IBOutlet weak var videoContentView: UIView!
@IBOutlet weak var videoControlsView: UIView!
@IBOutlet weak var seekSlider: UISlider!
@ -102,16 +103,26 @@ class PlayerViewController: UIViewController, GCKDiscoveryManagerListener, GCKRe
@IBAction func seekSliderValueChanged(_ sender: Any) {
let videoDuration: Double = Double(manifest.runTimeTicks! / Int64(10_000_000))
let secondsScrubbedTo = round(Double(seekSlider.value) * videoDuration)
let scrubRemaining = videoDuration - secondsScrubbedTo
let remainingTime = scrubRemaining
let hours = floor(remainingTime / 3600)
let minutes = (remainingTime.truncatingRemainder(dividingBy: 3600)) / 60
let seconds = (remainingTime.truncatingRemainder(dividingBy: 3600)).truncatingRemainder(dividingBy: 60)
let secondsScrubbedRemaining = videoDuration - secondsScrubbedTo
timeText.text = calculateTimeText(from: secondsScrubbedTo)
timeLeftText.text = calculateTimeText(from: secondsScrubbedRemaining)
}
private func calculateTimeText(from duration: Double) -> String {
let hours = floor(duration / 3600)
let minutes = (duration.truncatingRemainder(dividingBy: 3600)) / 60
let seconds = (duration.truncatingRemainder(dividingBy: 3600)).truncatingRemainder(dividingBy: 60)
let timeText: String
if hours != 0 {
timeText.text = "\(Int(hours)):\(String(Int(floor(minutes))).leftPad(toWidth: 2, withString: "0")):\(String(Int(floor(seconds))).leftPad(toWidth: 2, withString: "0"))"
timeText = "\(Int(hours)):\(String(Int(floor(minutes))).leftPad(toWidth: 2, withString: "0")):\(String(Int(floor(seconds))).leftPad(toWidth: 2, withString: "0"))"
} else {
timeText.text = "\(String(Int(floor(minutes))).leftPad(toWidth: 2, withString: "0")):\(String(Int(floor(seconds))).leftPad(toWidth: 2, withString: "0"))"
timeText = "\(String(Int(floor(minutes))).leftPad(toWidth: 2, withString: "0")):\(String(Int(floor(seconds))).leftPad(toWidth: 2, withString: "0"))"
}
return timeText
}
@IBAction func seekSliderEnd(_ sender: Any) {
@ -211,7 +222,7 @@ class PlayerViewController: UIViewController, GCKDiscoveryManagerListener, GCKRe
@IBAction func settingsButtonTapped(_ sender: UIButton) {
optionsVC = VideoPlayerSettingsView()
optionsVC?.delegate = self
optionsVC?.playerDelegate = self
optionsVC?.modalPresentationStyle = .popover
optionsVC?.popoverPresentationController?.sourceView = playerSettingsButton
@ -791,17 +802,11 @@ extension PlayerViewController: GCKGenericChannelDelegate {
}
if isSeeking == false {
let remainingTime = (manifest.runTimeTicks! - Int64(remotePositionTicks))/10_000_000
let hours = remainingTime / 3600
let minutes = (remainingTime % 3600) / 60
let seconds = (remainingTime % 3600) % 60
var timeTextStr = ""
if hours != 0 {
timeTextStr = "\(Int(hours)):\(String(Int((minutes))).leftPad(toWidth: 2, withString: "0")):\(String(Int((seconds))).leftPad(toWidth: 2, withString: "0"))"
} else {
timeTextStr = "\(String(Int((minutes))).leftPad(toWidth: 2, withString: "0")):\(String(Int((seconds))).leftPad(toWidth: 2, withString: "0"))"
}
timeText.text = timeTextStr
let positiveSeconds = Double(remotePositionTicks/10_000_000)
let remainingSeconds = Double((manifest.runTimeTicks! - Int64(remotePositionTicks))/10_000_000)
timeText.text = calculateTimeText(from: positiveSeconds)
timeLeftText.text = calculateTimeText(from: remainingSeconds)
let playbackProgress = Float(remotePositionTicks) / Float(manifest.runTimeTicks!)
seekSlider.setValue(playbackProgress, animated: true)
@ -984,7 +989,8 @@ extension PlayerViewController: VLCMediaPlayerDelegate {
}
}
timeText.text = String(mediaPlayer.remainingTime.stringValue.dropFirst())
timeText.text = mediaPlayer.time.stringValue
timeLeftText.text = String(mediaPlayer.remainingTime.stringValue.dropFirst())
if CACurrentMediaTime() - controlsAppearTime > 5 {
self.smallNextUpView()

View File

@ -8,9 +8,9 @@
import Foundation
import SwiftUI
class VideoPlayerSettingsView: UIViewController {
class VideoPlayerSettingsView: UINavigationController {
private var contentView: UIHostingController<VideoPlayerSettings>!
weak var delegate: PlayerViewController?
weak var playerDelegate: PlayerViewController?
override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
.landscape
@ -18,18 +18,13 @@ class VideoPlayerSettingsView: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
contentView = UIHostingController(rootView: VideoPlayerSettings(delegate: self.delegate ?? PlayerViewController()))
self.view.addSubview(contentView.view)
contentView.view.translatesAutoresizingMaskIntoConstraints = false
contentView.view.topAnchor.constraint(equalTo: view.topAnchor).isActive = true
contentView.view.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true
contentView.view.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true
contentView.view.rightAnchor.constraint(equalTo: view.rightAnchor).isActive = true
self.viewControllers = [UIHostingController(rootView: VideoPlayerSettings(delegate: self.playerDelegate ?? PlayerViewController()))]
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
self.delegate?.settingsPopoverDismissed()
self.playerDelegate?.settingsPopoverDismissed()
}
}
@ -44,44 +39,42 @@ struct VideoPlayerSettings: View {
}
var body: some View {
NavigationView {
Form {
Picker(NSLocalizedString("Closed Captions", comment: ""), selection: $captionTrack) {
ForEach(delegate.subtitleTrackArray, id: \.id) { caption in
Text(caption.name).tag(caption.id)
}
Form {
Picker(NSLocalizedString("Closed Captions", comment: ""), selection: $captionTrack) {
ForEach(delegate.subtitleTrackArray, id: \.id) { caption in
Text(caption.name).tag(caption.id)
}
.onChange(of: captionTrack) { track in
self.delegate.subtitleTrackChanged(newTrackID: track)
}
.onChange(of: captionTrack) { track in
self.delegate.subtitleTrackChanged(newTrackID: track)
}
Picker(NSLocalizedString("Audio Track", comment: ""), selection: $audioTrack) {
ForEach(delegate.audioTrackArray, id: \.id) { caption in
Text(caption.name).tag(caption.id).lineLimit(1)
}
Picker(NSLocalizedString("Audio Track", comment: ""), selection: $audioTrack) {
ForEach(delegate.audioTrackArray, id: \.id) { caption in
Text(caption.name).tag(caption.id).lineLimit(1)
}
}.onChange(of: audioTrack) { track in
self.delegate.audioTrackChanged(newTrackID: track)
}.onChange(of: audioTrack) { track in
self.delegate.audioTrackChanged(newTrackID: track)
}
Picker(NSLocalizedString("Playback Speed", comment: ""), selection: $playbackSpeedSelection) {
ForEach(delegate.playbackSpeeds.indices, id: \.self) { speedIndex in
let speed = delegate.playbackSpeeds[speedIndex]
Text("\(String(speed))x").tag(speedIndex)
}
Picker(NSLocalizedString("Playback Speed", comment: ""), selection: $playbackSpeedSelection) {
ForEach(delegate.playbackSpeeds.indices, id: \.self) { speedIndex in
let speed = delegate.playbackSpeeds[speedIndex]
Text("\(String(speed))x").tag(speedIndex)
}
}
.onChange(of: playbackSpeedSelection, perform: { index in
self.delegate.playbackSpeedChanged(index: index)
})
}.navigationBarTitleDisplayMode(.inline)
.navigationTitle(NSLocalizedString("Audio & Captions", comment: ""))
.toolbar {
ToolbarItemGroup(placement: .navigationBarLeading) {
if UIDevice.current.userInterfaceIdiom == .phone {
Button {
self.delegate.settingsPopoverDismissed()
} label: {
HStack {
Image(systemName: "chevron.left")
Text("Back").font(.callout)
}
}
.onChange(of: playbackSpeedSelection, perform: { index in
self.delegate.playbackSpeedChanged(index: index)
})
}.navigationBarTitleDisplayMode(.inline)
.navigationTitle(NSLocalizedString("Audio & Captions", comment: ""))
.toolbar {
ToolbarItemGroup(placement: .navigationBarLeading) {
if UIDevice.current.userInterfaceIdiom == .phone {
Button {
self.delegate.settingsPopoverDismissed()
} label: {
HStack {
Image(systemName: "chevron.left")
Text("Back").font(.callout)
}
}
}

Binary file not shown.

Binary file not shown.