mirror of
https://github.com/jellyfin/Swiftfin.git
synced 2024-12-04 04:01:47 +00:00
Merge branch 'main' into advanced-server-settings
This commit is contained in:
commit
1703b6345c
@ -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 |
@ -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)
|
||||
|
@ -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;
|
||||
|
@ -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"/>
|
||||
|
@ -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()
|
||||
|
@ -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.
BIN
Translations/sv.lproj/Localizable.strings
Normal file
BIN
Translations/sv.lproj/Localizable.strings
Normal file
Binary file not shown.
BIN
Translations/vi.lproj/Localizable.strings
Normal file
BIN
Translations/vi.lproj/Localizable.strings
Normal file
Binary file not shown.
Binary file not shown.
Loading…
Reference in New Issue
Block a user