Compare commits

...

71 Commits

Author SHA1 Message Date
Arkadiusz Fal
eb1dfe69cd Bump build number to 170 2023-11-26 19:09:45 +01:00
Arkadiusz Fal
9f5720d393 Update CHANGELOG 2023-11-26 19:09:26 +01:00
Arkadiusz Fal
675db6f651 Update packages 2023-11-26 18:59:10 +01:00
Arkadiusz Fal
fb5e86c2cb Merge pull request #559 from stonerl/collapsable-details
make description collapsible
2023-11-26 18:57:27 +01:00
Toni Förster
d384a4c520 iOS click on collapsed description text expands it 2023-11-26 15:42:47 +01:00
Toni Förster
6994271eca iOS - the description header is a button now 2023-11-26 15:42:47 +01:00
Toni Förster
ed5fa8e4aa no preview shows nothing now 2023-11-26 15:42:47 +01:00
Toni Förster
cbdf295d67 fix macOS layout 2023-11-26 15:42:47 +01:00
Toni Förster
5d78946320 add stepper for previewed line (broken on macOS) 2023-11-26 15:42:47 +01:00
Toni Förster
84fdc22861 formatting 2023-11-26 15:42:46 +01:00
Toni Förster
a57645f824 make description collapsible 2023-11-26 15:42:46 +01:00
Arkadiusz Fal
e78f40c555 Merge pull request #560 from stonerl/clickable-links
make links in description clickable
2023-11-26 12:28:58 +01:00
Arkadiusz Fal
23f5fc9575 Merge pull request #562 from stonerl/honor-aspect-ratio
honour the aspect ratio when resizing
2023-11-26 12:27:02 +01:00
Toni Förster
fc7a7b085f fixed styling 2023-11-26 10:33:58 +01:00
Arkadiusz Fal
7ffa34b0f9 Merge pull request #554 from weblate/weblate-yattee-localizable-strings
Translations update from Hosted Weblate
2023-11-25 22:26:26 +01:00
maboroshin
177e28121b Translated using Weblate (Japanese)
Currently translated at 100.0% (533 of 533 strings)

Translation: Yattee/Localizable.strings
Translate-URL: https://hosted.weblate.org/projects/yattee/localizable-strings/ja/
2023-11-25 22:26:19 +01:00
gallegonovato
68a35b8804 Translated using Weblate (Spanish)
Currently translated at 100.0% (533 of 533 strings)

Translation: Yattee/Localizable.strings
Translate-URL: https://hosted.weblate.org/projects/yattee/localizable-strings/es/
2023-11-25 22:26:19 +01:00
ooosssay
9ec9a680a6 Translated using Weblate (Spanish)
Currently translated at 100.0% (533 of 533 strings)

Translation: Yattee/Localizable.strings
Translate-URL: https://hosted.weblate.org/projects/yattee/localizable-strings/es/
2023-11-25 22:26:19 +01:00
gallegonovato
7629931747 Translated using Weblate (Spanish)
Currently translated at 100.0% (533 of 533 strings)

Translation: Yattee/Localizable.strings
Translate-URL: https://hosted.weblate.org/projects/yattee/localizable-strings/es/
2023-11-25 22:26:19 +01:00
ooosssay
afb22e6c25 Translated using Weblate (Spanish)
Currently translated at 100.0% (533 of 533 strings)

Translation: Yattee/Localizable.strings
Translate-URL: https://hosted.weblate.org/projects/yattee/localizable-strings/es/
2023-11-25 22:26:19 +01:00
gallegonovato
052fc86388 Translated using Weblate (Spanish)
Currently translated at 100.0% (533 of 533 strings)

Translation: Yattee/Localizable.strings
Translate-URL: https://hosted.weblate.org/projects/yattee/localizable-strings/es/
2023-11-25 22:26:19 +01:00
ooosssay
4de51f29c8 Translated using Weblate (Spanish)
Currently translated at 98.4% (525 of 533 strings)

Translation: Yattee/Localizable.strings
Translate-URL: https://hosted.weblate.org/projects/yattee/localizable-strings/es/
2023-11-25 22:26:19 +01:00
gallegonovato
d1a1f4da38 Translated using Weblate (Spanish)
Currently translated at 98.4% (525 of 533 strings)

Translation: Yattee/Localizable.strings
Translate-URL: https://hosted.weblate.org/projects/yattee/localizable-strings/es/
2023-11-25 22:26:18 +01:00
ooosssay
d1153ed97d Translated using Weblate (Spanish)
Currently translated at 97.5% (520 of 533 strings)

Translation: Yattee/Localizable.strings
Translate-URL: https://hosted.weblate.org/projects/yattee/localizable-strings/es/
2023-11-25 22:26:18 +01:00
gallegonovato
1c356560d5 Translated using Weblate (Spanish)
Currently translated at 97.5% (520 of 533 strings)

Translation: Yattee/Localizable.strings
Translate-URL: https://hosted.weblate.org/projects/yattee/localizable-strings/es/
2023-11-25 22:26:18 +01:00
gallegonovato
bbd18d921b Translated using Weblate (Spanish)
Currently translated at 91.5% (488 of 533 strings)

Translation: Yattee/Localizable.strings
Translate-URL: https://hosted.weblate.org/projects/yattee/localizable-strings/es/
2023-11-25 22:26:18 +01:00
gallegonovato
9e4860d97c Translated using Weblate (Spanish)
Currently translated at 88.7% (473 of 533 strings)

Translation: Yattee/Localizable.strings
Translate-URL: https://hosted.weblate.org/projects/yattee/localizable-strings/es/
2023-11-25 22:26:18 +01:00
ooosssay
50d42f721f Translated using Weblate (Spanish)
Currently translated at 88.7% (473 of 533 strings)

Translation: Yattee/Localizable.strings
Translate-URL: https://hosted.weblate.org/projects/yattee/localizable-strings/es/
2023-11-25 22:26:18 +01:00
gallegonovato
9bfccb49e3 Translated using Weblate (Spanish)
Currently translated at 86.3% (460 of 533 strings)

Translation: Yattee/Localizable.strings
Translate-URL: https://hosted.weblate.org/projects/yattee/localizable-strings/es/
2023-11-25 22:26:18 +01:00
Sergio Varela
919126f9b0 Translated using Weblate (Spanish)
Currently translated at 86.1% (459 of 533 strings)

Translation: Yattee/Localizable.strings
Translate-URL: https://hosted.weblate.org/projects/yattee/localizable-strings/es/
2023-11-25 22:26:18 +01:00
Toni Förster
d00903569f Translated using Weblate (German)
Currently translated at 100.0% (533 of 533 strings)

Translation: Yattee/Localizable.strings
Translate-URL: https://hosted.weblate.org/projects/yattee/localizable-strings/de/
2023-11-25 22:26:18 +01:00
Toni Förster
25e7b0d3e1 Translated using Weblate (German)
Currently translated at 99.8% (532 of 533 strings)

Translation: Yattee/Localizable.strings
Translate-URL: https://hosted.weblate.org/projects/yattee/localizable-strings/de/
2023-11-25 22:26:18 +01:00
Arkadiusz Fal
2aafe33417 Merge pull request #565 from stonerl/private-instances
support for private instances
2023-11-25 22:26:13 +01:00
Toni Förster
e525f36824 formatting 2023-11-22 10:24:41 +01:00
Toni Förster
5a5f5a8696 code formatting 2023-11-22 10:21:21 +01:00
Toni Förster
45d2968d9e support for private instances
closes #552

and some formatting
2023-11-21 18:14:17 +01:00
Toni Förster
c3e1465f31 fix broken fullscreen on macOS 2023-11-21 17:58:44 +01:00
Toni Förster
df47ffb013 change default minWidth with hidden sidebar 2023-11-21 17:49:29 +01:00
Toni Förster
8900f96ce7 honour the aspect ratio when resizing
The `defaultMinimumHeightLeft? has been adjusted to make the radio of the video view 16:9 in its initial state. Also on macOS when resizing the window, the aspect ratio of the view now correlates with the video.
2023-11-21 13:47:51 +01:00
Toni Förster
ed69780d52 removed superfluous braces 2023-11-21 01:13:01 +01:00
Toni Förster
691a3305e7 make links in description clickable
Adds clickable links to macOS. I it is a naive approach, but it works.

Probably closes #51
2023-11-21 00:58:40 +01:00
Arkadiusz Fal
987f6dcac8 Bump build number to 169 2023-11-04 11:34:45 +01:00
Arkadiusz Fal
1113a94d67 Update CHANGELOG 2023-11-04 11:34:25 +01:00
Arkadiusz Fal
8c6fc7d561 Update dependencies 2023-11-04 11:33:01 +01:00
Arkadiusz Fal
fb84927fc8 Bump build number to 168 2023-10-24 09:17:22 +02:00
Arkadiusz Fal
c452e66999 Update CHANGELOG 2023-10-24 09:17:22 +02:00
Arkadiusz Fal
7ab91e08f4 Update dependencies 2023-10-24 09:16:37 +02:00
Arkadiusz Fal
bdd18dba4e Merge pull request #543 from weblate/weblate-yattee-localizable-strings
Translations update from Hosted Weblate
2023-10-24 09:15:59 +02:00
maboroshin
026654d3a2 Translated using Weblate (Japanese)
Currently translated at 100.0% (533 of 533 strings)

Translation: Yattee/Localizable.strings
Translate-URL: https://hosted.weblate.org/projects/yattee/localizable-strings/ja/
2023-10-22 19:40:21 +02:00
mere
e9729bc9b3 Translated using Weblate (Romanian)
Currently translated at 100.0% (533 of 533 strings)

Translation: Yattee/Localizable.strings
Translate-URL: https://hosted.weblate.org/projects/yattee/localizable-strings/ro/
2023-10-22 19:40:21 +02:00
Arkadiusz Fal
a04159969e Use AF for Piped token request 2023-10-22 19:39:34 +02:00
Arkadiusz Fal
3624d186bc Bump build number to 167 2023-10-16 15:53:58 +02:00
Arkadiusz Fal
31ea4860cf Bump version number to 1.5.1 2023-10-16 15:53:41 +02:00
Arkadiusz Fal
5a074d7607 Bump build number to 166 2023-10-15 14:10:05 +02:00
Arkadiusz Fal
9d8b20148b Update CHANGELOG 2023-10-15 14:09:37 +02:00
Arkadiusz Fal
0ffb9d0606 Fix date parsing for piped videos 2023-10-15 14:08:38 +02:00
Arkadiusz Fal
8258d8d5b4 Bring back iOS 14 and macOS 11 2023-10-15 14:08:08 +02:00
Arkadiusz Fal
94915b0496 Revert "Drop iOS 14 and macOS 11 support"
This reverts commit dcef7f47ff.
2023-10-15 13:35:23 +02:00
Arkadiusz Fal
053b4a22b8 Fix style 2023-10-15 13:33:46 +02:00
Arkadiusz Fal
e6a9f39477 Bump build number to 165 2023-10-15 00:46:59 +02:00
Arkadiusz Fal
ff4f80b7ef Update CHANGELOG 2023-10-15 00:46:59 +02:00
Arkadiusz Fal
7e1218ce13 Update packages 2023-10-15 00:46:59 +02:00
Arkadiusz Fal
4c707271c3 Add setting to disable chapters and related, add info section in
player settings
2023-10-15 00:46:59 +02:00
Arkadiusz Fal
04e56638ce Fix possible crash 2023-10-15 00:46:59 +02:00
Arkadiusz Fal
674269c4c1 Fix issue with tvOS screensaver 2023-10-15 00:46:58 +02:00
Arkadiusz Fal
2b4627c3d6 Fix lint 2023-10-15 00:46:58 +02:00
Arkadiusz Fal
4260c6d6b5 Merge pull request #539 from weblate/weblate-yattee-localizable-strings
Translations update from Hosted Weblate
2023-10-15 00:46:13 +02:00
maboroshin
4057021cb9 Translated using Weblate (Japanese)
Currently translated at 99.4% (530 of 533 strings)

Translation: Yattee/Localizable.strings
Translate-URL: https://hosted.weblate.org/projects/yattee/localizable-strings/ja/
2023-10-10 15:04:11 +00:00
gallegonovato
151a99c2a3 Translated using Weblate (Spanish)
Currently translated at 84.2% (449 of 533 strings)

Translation: Yattee/Localizable.strings
Translate-URL: https://hosted.weblate.org/projects/yattee/localizable-strings/es/
2023-10-08 12:03:32 +00:00
Radical
bd606a4cf8 Translated using Weblate (Norwegian Bokmål)
Currently translated at 59.6% (318 of 533 strings)

Translation: Yattee/Localizable.strings
Translate-URL: https://hosted.weblate.org/projects/yattee/localizable-strings/nb_NO/
2023-10-08 12:03:31 +00:00
Ophiushi
4dbf2551d9 Translated using Weblate (French)
Currently translated at 100.0% (533 of 533 strings)

Translation: Yattee/Localizable.strings
Translate-URL: https://hosted.weblate.org/projects/yattee/localizable-strings/fr/
2023-09-28 19:02:38 +02:00
66 changed files with 1393 additions and 333 deletions

View File

@@ -0,0 +1,15 @@
import SwiftUI
extension Backport where Content: View {
@ViewBuilder func badge(_ count: Text?) -> some View {
#if os(tvOS)
content
#else
if #available(iOS 15.0, macOS 12.0, tvOS 15.0, *) {
content.badge(count)
} else {
content
}
#endif
}
}

View File

@@ -0,0 +1,15 @@
import Foundation
import SwiftUI
extension Backport where Content: View {
@ViewBuilder func listRowSeparator(_ visible: Bool) -> some View {
if #available(iOS 15, macOS 13, *) {
content
#if !os(tvOS)
.listRowSeparator(visible ? .visible : .hidden)
#endif
} else {
content
}
}
}

View File

@@ -0,0 +1,11 @@
import SwiftUI
extension Backport where Content: View {
@ViewBuilder func refreshable(action: @Sendable @escaping () async -> Void) -> some View {
if #available(iOS 15.0, macOS 12.0, tvOS 15.0, *) {
content.refreshable(action: action)
} else {
content
}
}
}

View File

@@ -0,0 +1,11 @@
import SwiftUI
extension Backport where Content: View {
@ViewBuilder func tint(_ color: Color?) -> some View {
if #available(iOS 15.0, macOS 12.0, tvOS 15.0, *) {
content.tint(color)
} else {
content.foregroundColor(color)
}
}
}

View File

@@ -0,0 +1,97 @@
/*
Copyright © 2020 Apple Inc.
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
import SwiftUI
#if os(iOS)
public struct VisualEffectBlur<Content: View>: View {
/// Defaults to .systemMaterial
var blurStyle: UIBlurEffect.Style
/// Defaults to nil
var vibrancyStyle: UIVibrancyEffectStyle?
var content: Content
public init(blurStyle: UIBlurEffect.Style = .systemMaterial, vibrancyStyle: UIVibrancyEffectStyle? = nil, @ViewBuilder content: () -> Content) {
self.blurStyle = blurStyle
self.vibrancyStyle = vibrancyStyle
self.content = content()
}
public var body: some View {
Representable(blurStyle: blurStyle, vibrancyStyle: vibrancyStyle, content: ZStack { content })
.accessibility(hidden: Content.self == EmptyView.self)
}
}
// MARK: - Representable
extension VisualEffectBlur {
struct Representable<Content: View>: UIViewRepresentable {
var blurStyle: UIBlurEffect.Style
var vibrancyStyle: UIVibrancyEffectStyle?
var content: Content
func makeUIView(context: Context) -> UIVisualEffectView {
context.coordinator.blurView
}
func updateUIView(_: UIVisualEffectView, context: Context) {
context.coordinator.update(content: content, blurStyle: blurStyle, vibrancyStyle: vibrancyStyle)
}
func makeCoordinator() -> Coordinator {
Coordinator(content: content)
}
}
}
// MARK: - Coordinator
extension VisualEffectBlur.Representable {
class Coordinator {
let blurView = UIVisualEffectView()
let vibrancyView = UIVisualEffectView()
let hostingController: UIHostingController<Content>
init(content: Content) {
hostingController = UIHostingController(rootView: content)
hostingController.view.autoresizingMask = [.flexibleWidth, .flexibleHeight]
hostingController.view.backgroundColor = nil
blurView.contentView.addSubview(vibrancyView)
blurView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
vibrancyView.contentView.addSubview(hostingController.view)
vibrancyView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
}
func update(content: Content, blurStyle: UIBlurEffect.Style, vibrancyStyle: UIVibrancyEffectStyle?) {
hostingController.rootView = content
let blurEffect = UIBlurEffect(style: blurStyle)
blurView.effect = blurEffect
if let vibrancyStyle {
vibrancyView.effect = UIVibrancyEffect(blurEffect: blurEffect, style: vibrancyStyle)
} else {
vibrancyView.effect = nil
}
hostingController.view.setNeedsDisplay()
}
}
}
extension VisualEffectBlur where Content == EmptyView {
init(blurStyle: UIBlurEffect.Style = .systemMaterial) {
self.init(blurStyle: blurStyle, vibrancyStyle: nil) {
EmptyView()
}
}
}
#endif

View File

@@ -0,0 +1,83 @@
/*
Copyright © 2020 Apple Inc.
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
import SwiftUI
#if os(macOS)
public struct VisualEffectBlur: View {
private var material: NSVisualEffectView.Material
private var blendingMode: NSVisualEffectView.BlendingMode
private var state: NSVisualEffectView.State
public init(
material: NSVisualEffectView.Material = .headerView,
blendingMode: NSVisualEffectView.BlendingMode = .withinWindow,
state: NSVisualEffectView.State = .followsWindowActiveState
) {
self.material = material
self.blendingMode = blendingMode
self.state = state
}
public var body: some View {
Representable(
material: material,
blendingMode: blendingMode,
state: state
).accessibility(hidden: true)
}
}
// MARK: - Representable
extension VisualEffectBlur {
struct Representable: NSViewRepresentable {
var material: NSVisualEffectView.Material
var blendingMode: NSVisualEffectView.BlendingMode
var state: NSVisualEffectView.State
func makeNSView(context: Context) -> NSVisualEffectView {
context.coordinator.visualEffectView
}
func updateNSView(_: NSVisualEffectView, context: Context) {
context.coordinator.update(material: material)
context.coordinator.update(blendingMode: blendingMode)
context.coordinator.update(state: state)
}
func makeCoordinator() -> Coordinator {
Coordinator()
}
}
class Coordinator {
let visualEffectView = NSVisualEffectView()
init() {
visualEffectView.blendingMode = .withinWindow
}
func update(material: NSVisualEffectView.Material) {
visualEffectView.material = material
}
func update(blendingMode: NSVisualEffectView.BlendingMode) {
visualEffectView.blendingMode = blendingMode
}
func update(state: NSVisualEffectView.State) {
visualEffectView.state = state
}
}
}
#endif

View File

@@ -1,21 +1,14 @@
## Build 164 ## Build 170
* Search text field focuses automatically (macOS) * Description is collapsible with a button
* Fixed crash when trying to create Quality Profile * Links in description are clickable on macOS
* Other minor fixes and improvements * Aspect ratio is honored on resize on macOS
* Added support for private Invidious instances
* Updated dependencies
**Big thanks to [@stonerl](https://github.com/stonerl) for these contributions!**
**And to all other project contributors!**
## Previous builds ## Previous builds
* Added support for "Podcasts" and "Releases" channel tabs (Invidious) * Fixed issue where Piped login token would not refresh
* Added button in Location settings to add current used public location to "Custom Locations" * Fixed issue with MPV subtitles not working
* Updated mpv and dependencies (using mpvkit library, mpv 0.36.0, ffmpeg 6.0) * Other minor changes and improvements
* Increased controls timeline/scrubber gesture area for easier handling
* Fixed handling playlist links
* Fixed issue where Piped videos would use audio for other language version
* Fixed issue with handling opening URLs on macOS
* Fixed issue with "Keep channels with unwatched videos on top of subscriptions list" setting not honored in sidebar
* Fixed performance issues with accounts with large amount of subscribed channels
* Fixed regression with opening videos links
* Fixed issue with deselecting formats in Quality profiles
* Fixed compatibility with iOS 17, macOS 14 and tvOS 17
* Dropped support for iOS 14 and macOS 11
* Fixed reported crashes
* Other minor fixes and improvements

View File

@@ -7,21 +7,21 @@ GEM
public_suffix (>= 2.0.2, < 6.0) public_suffix (>= 2.0.2, < 6.0)
artifactory (3.0.15) artifactory (3.0.15)
atomos (0.1.3) atomos (0.1.3)
aws-eventstream (1.2.0) aws-eventstream (1.3.0)
aws-partitions (1.827.0) aws-partitions (1.856.0)
aws-sdk-core (3.183.0) aws-sdk-core (3.188.0)
aws-eventstream (~> 1, >= 1.0.2) aws-eventstream (~> 1, >= 1.0.2)
aws-partitions (~> 1, >= 1.651.0) aws-partitions (~> 1, >= 1.651.0)
aws-sigv4 (~> 1.5) aws-sigv4 (~> 1.5)
jmespath (~> 1, >= 1.6.1) jmespath (~> 1, >= 1.6.1)
aws-sdk-kms (1.71.0) aws-sdk-kms (1.73.0)
aws-sdk-core (~> 3, >= 3.177.0) aws-sdk-core (~> 3, >= 3.188.0)
aws-sigv4 (~> 1.1) aws-sigv4 (~> 1.1)
aws-sdk-s3 (1.135.0) aws-sdk-s3 (1.139.0)
aws-sdk-core (~> 3, >= 3.181.0) aws-sdk-core (~> 3, >= 3.188.0)
aws-sdk-kms (~> 1) aws-sdk-kms (~> 1)
aws-sigv4 (~> 1.6) aws-sigv4 (~> 1.6)
aws-sigv4 (1.6.0) aws-sigv4 (1.7.0)
aws-eventstream (~> 1, >= 1.0.2) aws-eventstream (~> 1, >= 1.0.2)
babosa (1.0.4) babosa (1.0.4)
claide (1.1.0) claide (1.1.0)
@@ -32,11 +32,10 @@ GEM
declarative (0.0.20) declarative (0.0.20)
digest-crc (0.6.5) digest-crc (0.6.5)
rake (>= 12.0.0, < 14.0.0) rake (>= 12.0.0, < 14.0.0)
domain_name (0.5.20190701) domain_name (0.6.20231109)
unf (>= 0.0.5, < 1.0.0)
dotenv (2.8.1) dotenv (2.8.1)
emoji_regex (3.2.3) emoji_regex (3.2.3)
excon (0.103.0) excon (0.104.0)
faraday (1.10.3) faraday (1.10.3)
faraday-em_http (~> 1.0) faraday-em_http (~> 1.0)
faraday-em_synchrony (~> 1.0) faraday-em_synchrony (~> 1.0)
@@ -66,7 +65,7 @@ GEM
faraday_middleware (1.2.0) faraday_middleware (1.2.0)
faraday (~> 1.0) faraday (~> 1.0)
fastimage (2.2.7) fastimage (2.2.7)
fastlane (2.216.0) fastlane (2.217.0)
CFPropertyList (>= 2.3, < 4.0.0) CFPropertyList (>= 2.3, < 4.0.0)
addressable (>= 2.8, < 3.0.0) addressable (>= 2.8, < 3.0.0)
artifactory (~> 3.0) artifactory (~> 3.0)
@@ -107,9 +106,9 @@ GEM
xcpretty (~> 0.3.0) xcpretty (~> 0.3.0)
xcpretty-travis-formatter (>= 0.0.3) xcpretty-travis-formatter (>= 0.0.3)
gh_inspector (1.1.3) gh_inspector (1.1.3)
google-apis-androidpublisher_v3 (0.49.0) google-apis-androidpublisher_v3 (0.53.0)
google-apis-core (>= 0.11.0, < 2.a) google-apis-core (>= 0.11.0, < 2.a)
google-apis-core (0.11.1) google-apis-core (0.11.2)
addressable (~> 2.5, >= 2.5.1) addressable (~> 2.5, >= 2.5.1)
googleauth (>= 0.16.2, < 2.a) googleauth (>= 0.16.2, < 2.a)
httpclient (>= 2.8.1, < 3.a) httpclient (>= 2.8.1, < 3.a)
@@ -122,19 +121,19 @@ GEM
google-apis-core (>= 0.11.0, < 2.a) google-apis-core (>= 0.11.0, < 2.a)
google-apis-playcustomapp_v1 (0.13.0) google-apis-playcustomapp_v1 (0.13.0)
google-apis-core (>= 0.11.0, < 2.a) google-apis-core (>= 0.11.0, < 2.a)
google-apis-storage_v1 (0.19.0) google-apis-storage_v1 (0.29.0)
google-apis-core (>= 0.9.0, < 2.a) google-apis-core (>= 0.11.0, < 2.a)
google-cloud-core (1.6.0) google-cloud-core (1.6.0)
google-cloud-env (~> 1.0) google-cloud-env (~> 1.0)
google-cloud-errors (~> 1.0) google-cloud-errors (~> 1.0)
google-cloud-env (1.6.0) google-cloud-env (1.6.0)
faraday (>= 0.17.3, < 3.0) faraday (>= 0.17.3, < 3.0)
google-cloud-errors (1.3.1) google-cloud-errors (1.3.1)
google-cloud-storage (1.44.0) google-cloud-storage (1.45.0)
addressable (~> 2.8) addressable (~> 2.8)
digest-crc (~> 0.4) digest-crc (~> 0.4)
google-apis-iamcredentials_v1 (~> 0.1) google-apis-iamcredentials_v1 (~> 0.1)
google-apis-storage_v1 (~> 0.19.0) google-apis-storage_v1 (~> 0.29.0)
google-cloud-core (~> 1.6) google-cloud-core (~> 1.6)
googleauth (>= 0.16.2, < 2.a) googleauth (>= 0.16.2, < 2.a)
mini_mime (~> 1.0) mini_mime (~> 1.0)
@@ -160,8 +159,8 @@ GEM
optparse (0.1.1) optparse (0.1.1)
os (1.1.4) os (1.1.4)
plist (3.7.0) plist (3.7.0)
public_suffix (5.0.3) public_suffix (5.0.4)
rake (13.0.6) rake (13.1.0)
representable (3.2.0) representable (3.2.0)
declarative (< 0.1.0) declarative (< 0.1.0)
trailblazer-option (>= 0.1.1, < 0.2.0) trailblazer-option (>= 0.1.1, < 0.2.0)
@@ -189,10 +188,7 @@ GEM
tty-spinner (0.9.3) tty-spinner (0.9.3)
tty-cursor (~> 0.7) tty-cursor (~> 0.7)
uber (0.1.0) uber (0.1.0)
unf (0.1.4) unicode-display_width (2.5.0)
unf_ext
unf_ext (0.0.8.2)
unicode-display_width (2.4.2)
webrick (1.8.1) webrick (1.8.1)
word_wrap (1.0.0) word_wrap (1.0.0)
xcodeproj (1.23.0) xcodeproj (1.23.0)

View File

@@ -1,3 +1,4 @@
import Alamofire
import AVFoundation import AVFoundation
import Foundation import Foundation
import Siesta import Siesta
@@ -148,13 +149,21 @@ final class PipedAPI: Service, ObservableObject, VideosAPI {
return return
} }
login.request( AF.request(
.post, login.url,
json: ["username": username, "password": password] method: .post,
) parameters: ["username": username, "password": password],
.onSuccess { response in encoding: JSONEncoding.default
let token = response.json.dictionaryValue["token"]?.string ?? "" ).responseDecodable(of: JSON.self) { [weak self] response in
if let error = response.json.dictionaryValue["error"]?.string { guard let self else {
return
}
switch response.result {
case let .success(value):
let json = JSON(value)
let token = json.dictionaryValue["token"]?.string ?? ""
if let error = json.dictionaryValue["error"]?.string {
NavigationModel.shared.presentAlert( NavigationModel.shared.presentAlert(
title: "Account Error", title: "Account Error",
message: error message: error
@@ -170,6 +179,13 @@ final class PipedAPI: Service, ObservableObject, VideosAPI {
} }
self.configure() self.configure()
case let .failure(error):
NavigationModel.shared.presentAlert(
title: "Account Error",
message: error.localizedDescription
)
}
} }
} }
@@ -496,7 +512,17 @@ final class PipedAPI: Service, ObservableObject, VideosAPI {
let uploaded = details["uploaded"]?.double let uploaded = details["uploaded"]?.double
var published = (uploaded.isNil || uploaded == -1) ? nil : (uploaded! / 1000).formattedAsRelativeTime() var published = (uploaded.isNil || uploaded == -1) ? nil : (uploaded! / 1000).formattedAsRelativeTime()
if published.isNil { var publishedAt: Date?
let dateFormatter = ISO8601DateFormatter()
dateFormatter.formatOptions = [.withInternetDateTime]
if published.isNil,
let date = details["uploadDate"]?.string,
let formattedDate = dateFormatter.date(from: date)
{
publishedAt = formattedDate
} else {
published = (details["uploadedDate"] ?? details["uploadDate"])?.string ?? "" published = (details["uploadedDate"] ?? details["uploadDate"])?.string ?? ""
} }
@@ -526,6 +552,7 @@ final class PipedAPI: Service, ObservableObject, VideosAPI {
thumbnails: thumbnails, thumbnails: thumbnails,
live: live, live: live,
short: details["isShort"]?.bool ?? (length <= Video.shortLength), short: details["isShort"]?.bool ?? (length <= Video.shortLength),
publishedAt: publishedAt,
likes: details["likes"]?.int, likes: details["likes"]?.int,
dislikes: details["dislikes"]?.int, dislikes: details["dislikes"]?.int,
streams: extractStreams(from: content), streams: extractStreams(from: content),

View File

@@ -666,6 +666,10 @@ final class AVPlayerBackend: PlayerBackend {
} else { } else {
ScreenSaverManager.shared.enable() ScreenSaverManager.shared.enable()
} }
#else
DispatchQueue.main.async {
UIApplication.shared.isIdleTimerDisabled = self.model.presentingPlayer && self.isPlaying
}
#endif #endif
self.timeObserverThrottle.execute { self.timeObserverThrottle.execute {

View File

@@ -105,6 +105,7 @@ extension PlayerModel {
func playerAPI(_ video: Video) -> VideosAPI? { func playerAPI(_ video: Video) -> VideosAPI? {
guard let url = video.instanceURL else { return accounts.api } guard let url = video.instanceURL else { return accounts.api }
if accounts.current?.url == url { return accounts.api }
switch video.app { switch video.app {
case .local: case .local:
return nil return nil

View File

@@ -290,8 +290,8 @@ struct Video: Identifiable, Equatable, Hashable {
} }
var localStreamIsFile: Bool { var localStreamIsFile: Bool {
guard let localStream else { return false } guard let url = localStream?.localURL else { return false }
return localStream.localURL.isFileURL return url.isFileURL
} }
var localStreamIsRemoteURL: Bool { var localStreamIsRemoteURL: Bool {

View File

@@ -40,7 +40,7 @@ struct ChannelVideosView: View {
} }
var body: some View { var body: some View {
VStack { let content = VStack {
#if os(tvOS) #if os(tvOS)
VStack { VStack {
HStack(spacing: 24) { HStack(spacing: 24) {
@@ -181,12 +181,19 @@ struct ChannelVideosView: View {
.navigationTitle(navigationTitle) .navigationTitle(navigationTitle)
#endif #endif
return Group {
if #available(macOS 12.0, *) {
content
#if os(tvOS) #if os(tvOS)
.background(Color.background(scheme: colorScheme)) .background(Color.background(scheme: colorScheme))
#endif #endif
#if !os(iOS) #if !os(iOS)
.focusScope(focusNamespace) .focusScope(focusNamespace)
#endif #endif
} else {
content
}
}
} }
var verticalCellsEdgesIgnoringSafeArea: Edge.Set { var verticalCellsEdgesIgnoringSafeArea: Edge.Set {

View File

@@ -63,9 +63,16 @@ struct Constants {
static func seekIcon(_ type: String, _ interval: TimeInterval) -> String { static func seekIcon(_ type: String, _ interval: TimeInterval) -> String {
let interval = Int(interval) let interval = Int(interval)
let allVersions = [5, 10, 15, 30, 45, 60, 75, 90] let allVersions = [10, 15, 30, 45, 60, 75, 90]
let iOS15 = [5]
let iconName = "go\(type).\(interval)" let iconName = "go\(type).\(interval)"
if #available(iOS 15, macOS 12, *) {
if iOS15.contains(interval) {
return iconName
}
}
if allVersions.contains(interval) { if allVersions.contains(interval) {
return iconName return iconName
} }

View File

@@ -147,6 +147,7 @@ extension Defaults.Keys {
static let expandVideoDescriptionDefault = true static let expandVideoDescriptionDefault = true
#endif #endif
static let expandVideoDescription = Key<Bool>("expandVideoDescription", default: expandVideoDescriptionDefault) static let expandVideoDescription = Key<Bool>("expandVideoDescription", default: expandVideoDescriptionDefault)
static let collapsedLinesDescription = Key<Int>("collapsedLinesDescription", default: 5)
static let showChannelAvatarInChannelsLists = Key<Bool>("showChannelAvatarInChannelsLists", default: true) static let showChannelAvatarInChannelsLists = Key<Bool>("showChannelAvatarInChannelsLists", default: true)
static let showChannelAvatarInVideosListing = Key<Bool>("showChannelAvatarInVideosListing", default: true) static let showChannelAvatarInVideosListing = Key<Bool>("showChannelAvatarInVideosListing", default: true)
@@ -263,6 +264,8 @@ extension Defaults.Keys {
static let hideShorts = Key<Bool>("hideShorts", default: false) static let hideShorts = Key<Bool>("hideShorts", default: false)
static let hideWatched = Key<Bool>("hideWatched", default: false) static let hideWatched = Key<Bool>("hideWatched", default: false)
static let showInspector = Key<ShowInspectorSetting>("showInspector", default: .onlyLocal) static let showInspector = Key<ShowInspectorSetting>("showInspector", default: .onlyLocal)
static let showChapters = Key<Bool>("showChapters", default: true)
static let showRelated = Key<Bool>("showRelated", default: true)
static let widgetsSettings = Key<[WidgetSettings]>("widgetsSettings", default: []) static let widgetsSettings = Key<[WidgetSettings]>("widgetsSettings", default: [])
} }

View File

@@ -34,7 +34,8 @@ struct DocumentsView: View {
} }
.navigationTitle(directoryLabel) .navigationTitle(directoryLabel)
.padding(.horizontal) .padding(.horizontal)
.navigationBarTitleDisplayMode(.inline) .navigationBarTitleDisplayMode(RefreshControl.navigationBarTitleDisplayMode)
.backport
.refreshable { .refreshable {
DispatchQueue.main.async { DispatchQueue.main.async {
self.refresh() self.refresh()

View File

@@ -15,6 +15,7 @@ struct AccountViewButton: View {
} label: { } label: {
HStack(spacing: 6) { HStack(spacing: 6) {
if !accountPickerDisplaysUsername || !(model.current?.isPublic ?? true) { if !accountPickerDisplaysUsername || !(model.current?.isPublic ?? true) {
if #available(iOS 15, macOS 12, *) {
if let name = model.current?.app?.rawValue.capitalized { if let name = model.current?.app?.rawValue.capitalized {
Image(name) Image(name)
.resizable() .resizable()
@@ -22,6 +23,9 @@ struct AccountViewButton: View {
} else { } else {
Image(systemName: "globe") Image(systemName: "globe")
} }
} else {
Image(systemName: "globe")
}
} }
if accountPickerDisplaysUsername { if accountPickerDisplaysUsername {

View File

@@ -38,6 +38,7 @@ struct AppSidebarPlaylists: View {
if accounts.app.userPlaylistsEndpointIncludesVideos, !playlist.videos.isEmpty { if accounts.app.userPlaylistsEndpointIncludesVideos, !playlist.videos.isEmpty {
label label
.backport
.badge(Text("\(playlist.videos.count)")) .badge(Text("\(playlist.videos.count)"))
} else { } else {
label label

View File

@@ -33,6 +33,7 @@ struct AppSidebarSubscriptions: View {
Spacer() Spacer()
} }
.lineLimit(1) .lineLimit(1)
.backport
.badge(showUnwatchedFeedBadges ? feedCount.unwatchedByChannelText(channel) : nil) .badge(showUnwatchedFeedBadges ? feedCount.unwatchedByChannelText(channel) : nil)
} }
.contextMenu { .contextMenu {

View File

@@ -95,6 +95,7 @@ struct AppTabNavigation: View {
.accessibility(label: Text("Subscriptions")) .accessibility(label: Text("Subscriptions"))
} }
.tag(TabSelection.subscriptions) .tag(TabSelection.subscriptions)
.backport
.badge(showUnwatchedFeedBadges ? feedCount.unwatchedText : nil) .badge(showUnwatchedFeedBadges ? feedCount.unwatchedText : nil)
} }

View File

@@ -36,7 +36,7 @@ struct Sidebar: View {
} }
.onChange(of: navigation.sidebarSectionChanged) { _ in .onChange(of: navigation.sidebarSectionChanged) { _ in
if let tabSelection = navigation.tabSelection { if let tabSelection = navigation.tabSelection {
scrollScrollViewToItem(scrollView: scrollView, for: navigation.tabSelection) scrollScrollViewToItem(scrollView: scrollView, for: tabSelection)
} }
} }
.listStyle(.sidebar) .listStyle(.sidebar)
@@ -81,6 +81,7 @@ struct Sidebar: View {
Label("Subscriptions", systemImage: "star.circle") Label("Subscriptions", systemImage: "star.circle")
.accessibility(label: Text("Subscriptions")) .accessibility(label: Text("Subscriptions"))
} }
.backport
.badge(showUnwatchedFeedBadges ? feedCount.unwatchedText : nil) .badge(showUnwatchedFeedBadges ? feedCount.unwatchedText : nil)
.contextMenu { .contextMenu {
playUnwatchedButton playUnwatchedButton

View File

@@ -47,7 +47,7 @@ final class AppleAVPlayerViewController: UIViewController {
infoViewControllers.append(infoViewController([.chapters], title: "Chapters")) infoViewControllers.append(infoViewController([.chapters], title: "Chapters"))
infoViewControllers.append(infoViewController([.comments], title: "Comments")) infoViewControllers.append(infoViewController([.comments], title: "Comments"))
let queueSections = [NowPlayingView.ViewSection.playingNext] var queueSections = [NowPlayingView.ViewSection.playingNext]
infoViewControllers.append(contentsOf: [ infoViewControllers.append(contentsOf: [
infoViewController([.related], title: "Related"), infoViewController([.related], title: "Related"),

View File

@@ -7,8 +7,19 @@ struct ControlBackgroundModifier: ViewModifier {
func body(content: Content) -> some View { func body(content: Content) -> some View {
if enabled { if enabled {
if #available(iOS 15, macOS 12, *) {
content content
.background(.thinMaterial) .background(.thinMaterial)
} else {
content
#if os(macOS)
.background(VisualEffectBlur(material: .hudWindow))
#elseif os(iOS)
.background(VisualEffectBlur(blurStyle: .systemThinMaterial).edgesIgnoringSafeArea(edgesIgnoringSafeArea))
#else
.background(.thinMaterial)
#endif
}
} else { } else {
content content
} }

View File

@@ -255,6 +255,8 @@ struct PlayerControls: View {
{ {
ThumbnailView(url: url) ThumbnailView(url: url)
.frame(maxWidth: .infinity, maxHeight: .infinity) .frame(maxWidth: .infinity, maxHeight: .infinity)
.transition(.opacity)
.animation(.default)
} else if player.videoForDisplay == nil { } else if player.videoForDisplay == nil {
Color.black Color.black
} }

View File

@@ -18,9 +18,8 @@ struct RelatedView: View {
Color.clear.padding(.bottom, 50) Color.clear.padding(.bottom, 50)
.listRowBackground(Color.clear) .listRowBackground(Color.clear)
#if os(iOS) .backport
.listRowSeparator(.hidden) .listRowSeparator(false)
#endif
} }
} }
} }

View File

@@ -219,10 +219,8 @@ struct CommentView: View {
} }
private var commentText: some View { private var commentText: some View {
Text(comment.text) Group {
#if !os(tvOS) let text = Text(comment.text)
.textSelection(.enabled)
#endif
#if os(macOS) #if os(macOS)
.font(.system(size: 14)) .font(.system(size: 14))
#elseif os(iOS) #elseif os(iOS)
@@ -230,6 +228,16 @@ struct CommentView: View {
#endif #endif
.lineSpacing(3) .lineSpacing(3)
.fixedSize(horizontal: false, vertical: true) .fixedSize(horizontal: false, vertical: true)
if #available(iOS 15.0, macOS 12.0, *) {
text
#if !os(tvOS)
.textSelection(.enabled)
#endif
} else {
text
}
}
} }
private func openChannelAction() { private func openChannelAction() {

View File

@@ -32,8 +32,13 @@ struct CommentsView: View {
struct CommentsView_Previews: PreviewProvider { struct CommentsView_Previews: PreviewProvider {
static var previews: some View { static var previews: some View {
if #available(iOS 15.0, macOS 12.0, tvOS 15.0, *) {
CommentsView() CommentsView()
.previewInterfaceOrientation(.landscapeRight) .previewInterfaceOrientation(.landscapeRight)
.injectFixtureEnvironmentObjects() .injectFixtureEnvironmentObjects()
} }
CommentsView()
.injectFixtureEnvironmentObjects()
}
} }

View File

@@ -79,10 +79,15 @@ struct InspectorView: View {
Text(detail.localized()) Text(detail.localized())
.foregroundColor(.secondary) .foregroundColor(.secondary)
Spacer() Spacer()
Text(value).lineLimit(1) let value = Text(value).lineLimit(1)
if #available(iOS 15.0, macOS 12.0, *) {
value
#if !os(tvOS) #if !os(tvOS)
.textSelection(.enabled) .textSelection(.enabled)
#endif #endif
} else {
value
}
} }
.font(.caption) .font(.caption)
} }

View File

@@ -30,9 +30,8 @@ struct PlayerQueueView: View {
#endif #endif
Color.clear.padding(.bottom, 50) Color.clear.padding(.bottom, 50)
.listRowBackground(Color.clear) .listRowBackground(Color.clear)
#if os(iOS) .backport
.listRowSeparator(.hidden) .listRowSeparator(false)
#endif
} }
.environment(\.inNavigationView, false) .environment(\.inNavigationView, false)
} }

View File

@@ -6,11 +6,10 @@ import Foundation
import SwiftUI import SwiftUI
struct VideoDescription: View { struct VideoDescription: View {
static let collapsedLines = 5
private var search: SearchModel { .shared } private var search: SearchModel { .shared }
@Default(.showKeywords) private var showKeywords @Default(.showKeywords) private var showKeywords
@Default(.expandVideoDescription) private var expandVideoDescription @Default(.expandVideoDescription) private var expandVideoDescription
@Default(.collapsedLinesDescription) private var collapsedLinesDescription
var video: Video var video: Video
var detailsSize: CGSize? var detailsSize: CGSize?
@@ -21,28 +20,19 @@ struct VideoDescription: View {
} }
var body: some View { var body: some View {
Group { descriptionView.id(video.videoID)
if !expandVideoDescription && !expand {
Button {
expand = true
} label: {
descriptionView
}
.buttonStyle(.plain)
} else {
descriptionView
}
}
.id(video.videoID)
} }
var descriptionView: some View { @ViewBuilder var descriptionView: some View {
if !expand && collapsedLinesDescription == 0 {
EmptyView()
} else {
VStack { VStack {
#if os(iOS) #if os(iOS)
ActiveLabelDescriptionRepresentable( ActiveLabelDescriptionRepresentable(
description: description, description: description,
detailsSize: detailsSize, detailsSize: detailsSize,
expand: shouldExpand expand: expand
) )
#else #else
textDescription textDescription
@@ -51,26 +41,72 @@ struct VideoDescription: View {
keywords keywords
} }
.contentShape(Rectangle()) .contentShape(Rectangle())
.overlay(
Group {
#if canImport(UIKit)
if !expand {
Button(action: { expand.toggle() }) {
Rectangle()
.foregroundColor(.clear)
}
}
#endif
}
)
}
} }
var shouldExpand: Bool { var shouldExpand: Bool {
expandVideoDescription || expand expand
} }
@ViewBuilder var textDescription: some View { @ViewBuilder var textDescription: some View {
#if !os(iOS) #if canImport(AppKit)
Group {
if #available(macOS 12, *) {
DescriptionWithLinks(description: description, detailsSize: detailsSize)
.frame(maxWidth: .infinity, alignment: .leading)
.lineLimit(shouldExpand ? 500 : collapsedLinesDescription)
.textSelection(.enabled)
} else {
Text(description) Text(description)
.frame(maxWidth: .infinity, alignment: .leading) .frame(maxWidth: .infinity, alignment: .leading)
.lineLimit(shouldExpand ? 500 : Self.collapsedLines) .lineLimit(shouldExpand ? 500 : collapsedLinesDescription)
#if !os(tvOS) }
.textSelection(.enabled) }
#endif
.multilineTextAlignment(.leading) .multilineTextAlignment(.leading)
.font(.system(size: 14)) .font(.system(size: 14))
.lineSpacing(3) .lineSpacing(3)
#endif #endif
} }
// If possibe convert URLs to clickable links
#if canImport(AppKit)
@available(macOS 12, *)
struct DescriptionWithLinks: View {
let description: String
let detailsSize: CGSize?
let separators = CharacterSet(charactersIn: " \n")
var formattedString: AttributedString {
var attrString = AttributedString(description)
let words = description.unicodeScalars.split(whereSeparator: separators.contains).map(String.init)
words.forEach { word in
if word.hasPrefix("https://") || word.hasPrefix("http://"), let url = URL(string: String(word)) {
if let range = attrString.range(of: word) {
attrString[range].link = url
}
}
}
return attrString
}
var body: some View {
Text(formattedString)
}
}
#endif
@ViewBuilder var keywords: some View { @ViewBuilder var keywords: some View {
if showKeywords { if showKeywords {
ScrollView(.horizontal, showsIndicators: showScrollIndicators) { ScrollView(.horizontal, showsIndicators: showScrollIndicators) {
@@ -101,7 +137,7 @@ struct VideoDescription: View {
} }
var showScrollIndicators: Bool { var showScrollIndicators: Bool {
#if os(macOS) #if canImport(AppKit)
false false
#else #else
true true
@@ -119,6 +155,8 @@ struct VideoDescription: View {
@Environment(\.openURL) private var openURL @Environment(\.openURL) private var openURL
@Default(.collapsedLinesDescription) private var collapsedLinesDescription
var player = PlayerModel.shared var player = PlayerModel.shared
func makeUIView(context _: Context) -> some UIView { func makeUIView(context _: Context) -> some UIView {
@@ -152,7 +190,12 @@ struct VideoDescription: View {
} }
func updateNumberOfLines() { func updateNumberOfLines() {
label.numberOfLines = expand ? 0 : VideoDescription.collapsedLines if expand || collapsedLinesDescription > 0 {
label.numberOfLines = expand ? 0 : collapsedLinesDescription
label.isHidden = false
} else {
label.isHidden = true
}
} }
func urlTapHandler(_ url: URL) { func urlTapHandler(_ url: URL) {

View File

@@ -184,6 +184,8 @@ struct VideoDetails: View {
@Default(.enableReturnYouTubeDislike) private var enableReturnYouTubeDislike @Default(.enableReturnYouTubeDislike) private var enableReturnYouTubeDislike
@Default(.playerSidebar) private var playerSidebar @Default(.playerSidebar) private var playerSidebar
@Default(.showInspector) private var showInspector @Default(.showInspector) private var showInspector
@Default(.showChapters) private var showChapters
@Default(.showRelated) private var showRelated
#if !os(tvOS) #if !os(tvOS)
@Default(.showScrollToTopInComments) private var showScrollToTopInComments @Default(.showScrollToTopInComments) private var showScrollToTopInComments
#endif #endif
@@ -241,6 +243,9 @@ struct VideoDetails: View {
} }
}) })
.background(colorScheme == .dark ? Color.black : .white) .background(colorScheme == .dark ? Color.black : .white)
.onAppear {
descriptionExpanded = expandVideoDescription
}
} }
#if os(iOS) #if os(iOS)
@@ -309,7 +314,8 @@ struct VideoDetails: View {
.padding(.horizontal) .padding(.horizontal)
} }
if player.videoBeingOpened.isNil, if player.videoBeingOpened.isNil {
if showChapters,
!video.isLocal, !video.isLocal,
!video.chapters.isEmpty !video.chapters.isEmpty
{ {
@@ -318,14 +324,12 @@ struct VideoDetails: View {
} }
} }
if player.videoBeingOpened.isNil, if showInspector == .always || video.isLocal {
video.isLocal || showInspector == .always
{
InspectorView(video: player.videoForDisplay) InspectorView(video: player.videoForDisplay)
.padding(.horizontal) .padding(.horizontal)
} }
if player.videoBeingOpened.isNil, if showRelated,
!sidebarQueue, !sidebarQueue,
!(player.videoForDisplay?.related.isEmpty ?? true) !(player.videoForDisplay?.related.isEmpty ?? true)
{ {
@@ -336,6 +340,7 @@ struct VideoDetails: View {
} }
} }
} }
}
.onAppear { .onAppear {
if video != nil, !pageAvailable(page) { if video != nil, !pageAvailable(page) {
page = .info page = .info
@@ -405,18 +410,34 @@ struct VideoDetails: View {
} }
var descriptionHeader: some View { var descriptionHeader: some View {
#if canImport(UIKit)
Button(action: {
descriptionExpanded.toggle()
}) {
HStack { HStack {
Text("Description".localized()) Text("Description".localized())
if !expandVideoDescription, !descriptionExpanded {
Spacer() Spacer()
Image(systemName: "arrow.up.and.down") Image(systemName: descriptionExpanded ? "chevron.up" : "chevron.down")
.imageScale(.small)
}
.padding(.horizontal)
.font(.caption)
.foregroundColor(.secondary)
}
#elseif canImport(AppKit)
HStack {
Text("Description".localized())
Spacer()
Button { descriptionExpanded.toggle()
} label: {
Image(systemName: descriptionExpanded ? "chevron.up" : "chevron.down")
.imageScale(.small) .imageScale(.small)
} }
} }
.padding(.horizontal) .padding(.horizontal)
.font(.caption) .font(.caption)
.foregroundColor(.secondary) .foregroundColor(.secondary)
#endif
} }
var chaptersHeader: some View { var chaptersHeader: some View {

View File

@@ -27,10 +27,7 @@ struct VideoPlayerSizeModifier: ViewModifier {
content content
.frame(width: geometry.size.width) .frame(width: geometry.size.width)
.frame(maxHeight: maxHeight) .frame(maxHeight: maxHeight)
#if !os(macOS)
.aspectRatio(ratio, contentMode: usedAspectRatioContentMode) .aspectRatio(ratio, contentMode: usedAspectRatioContentMode)
#endif
} }
var ratio: CGFloat? { // swiftlint:disable:this no_cgfloat var ratio: CGFloat? { // swiftlint:disable:this no_cgfloat
@@ -46,10 +43,10 @@ struct VideoPlayerSizeModifier: ViewModifier {
} }
var usedAspectRatioContentMode: ContentMode { var usedAspectRatioContentMode: ContentMode {
#if os(iOS) #if os(tvOS)
fullScreen ? .fill : .fit
#else
.fit .fit
#else
fullScreen ? .fill : .fit
#endif #endif
} }

View File

@@ -22,7 +22,7 @@ struct VideoPlayerView: View {
static let defaultAspectRatio = 16 / 9.0 static let defaultAspectRatio = 16 / 9.0
static var defaultMinimumHeightLeft: Double { static var defaultMinimumHeightLeft: Double {
#if os(macOS) #if os(macOS)
300 335
#else #else
200 200
#endif #endif
@@ -156,7 +156,7 @@ struct VideoPlayerView: View {
.persistentSystemOverlays(!fullScreenPlayer) .persistentSystemOverlays(!fullScreenPlayer)
#endif #endif
#if os(macOS) #if os(macOS)
.frame(minWidth: 1100, minHeight: 700) .frame(minWidth: playerSidebar != .never ? 1100 : 650, minHeight: 700)
#endif #endif
} }
@@ -294,6 +294,9 @@ struct VideoPlayerView: View {
} }
}) })
#endif #endif
.background(Color.black)
if !detailsHiddenInFullScreen { if !detailsHiddenInFullScreen {
VideoDetails( VideoDetails(
video: player.videoForDisplay, video: player.videoForDisplay,

View File

@@ -91,6 +91,13 @@ struct PlaylistsView: View {
loadResource() loadResource()
} }
#if os(iOS) #if os(iOS)
.refreshControl { refreshControl in
model.load(force: true) {
model.reloadPlaylists.toggle()
refreshControl.endRefreshing()
}
}
.backport
.refreshable { .refreshable {
DispatchQueue.main.async { DispatchQueue.main.async {
model.load(force: true) { model.reloadPlaylists.toggle() } model.load(force: true) { model.reloadPlaylists.toggle() }

View File

@@ -2,6 +2,7 @@ import Repeat
import SwiftUI import SwiftUI
import SwiftUIIntrospect import SwiftUIIntrospect
@available(iOS 15.0, macOS 12, *)
struct FocusableSearchTextField: View { struct FocusableSearchTextField: View {
@ObservedObject private var state = SearchModel.shared @ObservedObject private var state = SearchModel.shared

View File

@@ -95,7 +95,11 @@ struct SearchView: View {
filtersMenu filtersMenu
} }
if #available(macOS 12, *) {
FocusableSearchTextField() FocusableSearchTextField()
} else {
SearchTextField()
}
} }
#endif #endif
} }
@@ -175,7 +179,11 @@ struct SearchView: View {
searchMenu searchMenu
} }
ToolbarItem(placement: .principal) { ToolbarItem(placement: .principal) {
if #available(iOS 15, *) {
FocusableSearchTextField() FocusableSearchTextField()
} else {
SearchTextField()
}
} }
} }
.navigationBarTitleDisplayMode(.inline) .navigationBarTitleDisplayMode(.inline)

View File

@@ -10,6 +10,7 @@ struct PlayerSettings: View {
@Default(.showKeywords) private var showKeywords @Default(.showKeywords) private var showKeywords
#if !os(tvOS) #if !os(tvOS)
@Default(.showScrollToTopInComments) private var showScrollToTopInComments @Default(.showScrollToTopInComments) private var showScrollToTopInComments
@Default(.collapsedLinesDescription) private var collapsedLinesDescription
#endif #endif
@Default(.expandVideoDescription) private var expandVideoDescription @Default(.expandVideoDescription) private var expandVideoDescription
@Default(.pauseOnHidingPlayer) private var pauseOnHidingPlayer @Default(.pauseOnHidingPlayer) private var pauseOnHidingPlayer
@@ -30,6 +31,8 @@ struct PlayerSettings: View {
@Default(.enableReturnYouTubeDislike) private var enableReturnYouTubeDislike @Default(.enableReturnYouTubeDislike) private var enableReturnYouTubeDislike
@Default(.showInspector) private var showInspector @Default(.showInspector) private var showInspector
@Default(.showChapters) private var showChapters
@Default(.showRelated) private var showRelated
@ObservedObject private var accounts = AccountsModel.shared @ObservedObject private var accounts = AccountsModel.shared
@@ -73,9 +76,21 @@ struct PlayerSettings: View {
} }
#if !os(tvOS) #if !os(tvOS)
Section(header: SettingsHeader(text: "Inspector".localized())) { Section(header: SettingsHeader(text: "Info".localized())) {
expandVideoDescriptionToggle
collapsedLineDescriptionStepper
showChaptersToggle
showRelatedToggle
#if os(macOS)
HStack {
Text("Inspector")
inspectorVisibilityPicker inspectorVisibilityPicker
} }
.padding(.leading, 20)
#else
inspectorVisibilityPicker
#endif
}
#endif #endif
let interface = Section(header: SettingsHeader(text: "Interface".localized())) { let interface = Section(header: SettingsHeader(text: "Interface".localized())) {
@@ -96,9 +111,6 @@ struct PlayerSettings: View {
showScrollToTopInCommentsToggle showScrollToTopInCommentsToggle
#endif #endif
#if !os(tvOS)
expandVideoDescriptionToggle
#endif
returnYouTubeDislikeToggle returnYouTubeDislikeToggle
} }
} }
@@ -184,6 +196,24 @@ struct PlayerSettings: View {
Toggle("Open video description expanded", isOn: $expandVideoDescription) Toggle("Open video description expanded", isOn: $expandVideoDescription)
} }
#if !os(tvOS)
private var collapsedLineDescriptionStepper: some View {
LazyVStack {
Stepper(value: $collapsedLinesDescription, in: 0 ... 10) {
Text("Description preview")
#if os(macOS)
Spacer()
#endif
if collapsedLinesDescription == 0 {
Text("No preview")
} else {
Text("\(collapsedLinesDescription) lines")
}
}
}
}
#endif
private var returnYouTubeDislikeToggle: some View { private var returnYouTubeDislikeToggle: some View {
Toggle("Enable Return YouTube Dislike", isOn: $enableReturnYouTubeDislike) Toggle("Enable Return YouTube Dislike", isOn: $enableReturnYouTubeDislike)
} }
@@ -240,8 +270,9 @@ struct PlayerSettings: View {
} }
#endif #endif
#if !os(tvOS)
private var inspectorVisibilityPicker: some View { private var inspectorVisibilityPicker: some View {
Picker("Visibility", selection: $showInspector) { Picker("Inspector", selection: $showInspector) {
Text("Always").tag(ShowInspectorSetting.always) Text("Always").tag(ShowInspectorSetting.always)
Text("Only for local files and URLs").tag(ShowInspectorSetting.onlyLocal) Text("Only for local files and URLs").tag(ShowInspectorSetting.onlyLocal)
} }
@@ -249,6 +280,15 @@ struct PlayerSettings: View {
.labelsHidden() .labelsHidden()
#endif #endif
} }
private var showChaptersToggle: some View {
Toggle("Chapters", isOn: $showChapters)
}
private var showRelatedToggle: some View {
Toggle("Related", isOn: $showRelated)
}
#endif
} }
struct PlayerSettings_Previews: PreviewProvider { struct PlayerSettings_Previews: PreviewProvider {

View File

@@ -201,7 +201,7 @@ struct QualityProfileForm: View {
@ViewBuilder var formatsPicker: some View { @ViewBuilder var formatsPicker: some View {
#if os(macOS) #if os(macOS)
ForEach(QualityProfile.Format.allCases, id: \.self) { format in let list = ForEach(QualityProfile.Format.allCases, id: \.self) { format in
MultiselectRow( MultiselectRow(
title: format.description, title: format.description,
selected: isFormatSelected(format), selected: isFormatSelected(format),
@@ -210,8 +210,16 @@ struct QualityProfileForm: View {
toggleFormat(format, value: value) toggleFormat(format, value: value)
} }
} }
.listStyle(.inset(alternatesRowBackgrounds: true))
Group {
if #available(macOS 12.0, *) {
list
.listStyle(.inset(alternatesRowBackgrounds: true))
} else {
list
.listStyle(.inset)
}
}
Spacer() Spacer()
#else #else
ForEach(QualityProfile.Format.allCases, id: \.self) { format in ForEach(QualityProfile.Format.allCases, id: \.self) { format in

View File

@@ -175,6 +175,7 @@ struct QualitySettings: View {
} }
} }
if #available(macOS 12.0, *) {
#if os(macOS) #if os(macOS)
List { List {
list list
@@ -183,6 +184,15 @@ struct QualitySettings: View {
#else #else
list list
#endif #endif
} else {
#if os(macOS)
List {
list
}
#else
list
#endif
}
} }
} }

View File

@@ -266,7 +266,7 @@ struct SettingsView: View {
case .browsing: case .browsing:
return 800 return 800
case .player: case .player:
return 480 return 500
case .controls: case .controls:
return 920 return 920
case .quality: case .quality:

View File

@@ -50,8 +50,15 @@ struct SponsorBlockSettings: View {
} }
} }
Group {
if #available(macOS 12.0, *) {
list list
.listStyle(.inset(alternatesRowBackgrounds: true)) .listStyle(.inset(alternatesRowBackgrounds: true))
} else {
list
.listStyle(.inset)
}
}
Spacer() Spacer()
#else #else
ForEach(SponsorBlockAPI.categories, id: \.self) { category in ForEach(SponsorBlockAPI.categories, id: \.self) { category in

View File

@@ -34,9 +34,8 @@ struct ChannelsView: View {
Text(channel.name) Text(channel.name)
.lineLimit(1) .lineLimit(1)
} }
#if !os(tvOS) .backport
.badge(showUnwatchedFeedBadges ? feedCount.unwatchedByChannelText(channel) : nil) .badge(showUnwatchedFeedBadges ? feedCount.unwatchedByChannelText(channel) : nil)
#endif
Group { Group {
#if os(tvOS) #if os(tvOS)
@@ -74,9 +73,8 @@ struct ChannelsView: View {
Color.clear.padding(.bottom, 50) Color.clear.padding(.bottom, 50)
.listRowBackground(Color.clear) .listRowBackground(Color.clear)
#if os(iOS) .backport
.listRowSeparator(.hidden) .listRowSeparator(false)
#endif
} }
} }
#if !os(tvOS) #if !os(tvOS)
@@ -91,8 +89,14 @@ struct ChannelsView: View {
subscriptions.load(force: true) subscriptions.load(force: true)
} }
#if os(iOS) #if os(iOS)
.refreshControl { refreshControl in
subscriptions.load(force: true) {
refreshControl.endRefreshing()
}
}
.backport
.refreshable { .refreshable {
subscriptions.load(force: true) await subscriptions.load(force: true)
} }
#endif #endif
#if !os(tvOS) #if !os(tvOS)

View File

@@ -22,8 +22,14 @@ struct FeedView: View {
feed.loadResources() feed.loadResources()
} }
#if os(iOS) #if os(iOS)
.refreshControl { refreshControl in
feed.loadResources(force: true) {
refreshControl.endRefreshing()
}
}
.backport
.refreshable { .refreshable {
feed.loadResources(force: true) await feed.loadResources(force: true)
} }
#endif #endif
#if !os(tvOS) #if !os(tvOS)

View File

@@ -16,7 +16,11 @@ struct TrendingCountry: View {
VStack { VStack {
#if !os(tvOS) #if !os(tvOS)
HStack { HStack {
if #available(iOS 15.0, macOS 12.0, *) {
TextField("Country", text: $query, prompt: Text(Self.prompt)) TextField("Country", text: $query, prompt: Text(Self.prompt))
} else {
TextField(Self.prompt, text: $query)
}
Button("Done") { selectCountryAndDismiss() } Button("Done") { selectCountryAndDismiss() }
.keyboardShortcut(.defaultAction) .keyboardShortcut(.defaultAction)
@@ -53,8 +57,12 @@ struct TrendingCountry: View {
return Group { return Group {
#if os(macOS) #if os(macOS)
if #available(macOS 12.0, *) {
list list
.listStyle(.inset(alternatesRowBackgrounds: true)) .listStyle(.inset(alternatesRowBackgrounds: true))
} else {
list
}
#else #else
list list
#endif #endif

View File

@@ -95,7 +95,12 @@ struct TrendingView: View {
.navigationTitle("Trending") .navigationTitle("Trending")
#endif #endif
#if os(iOS) #if os(iOS)
.refreshControl { refreshControl in
resource.load().onCompletion { _ in
refreshControl.endRefreshing()
}
}
.backport
.refreshable { .refreshable {
DispatchQueue.main.async { DispatchQueue.main.async {
resource.load() resource.load()

View File

@@ -48,7 +48,8 @@ struct ThumbnailView: View {
} }
@ViewBuilder var asyncImageIfAvailable: some View { @ViewBuilder var asyncImageIfAvailable: some View {
CachedAsyncImage(url: url, urlCache: BaseCacheModel.imageCache, transaction: Transaction(animation: .default)) { phase in if #available(iOS 15, macOS 12, *) {
CachedAsyncImage(url: url, urlCache: BaseCacheModel.imageCache) { phase in
switch phase { switch phase {
case let .success(image): case let .success(image):
image image
@@ -62,6 +63,9 @@ struct ThumbnailView: View {
placeholder placeholder
} }
} }
} else {
webImage
}
} }
var placeholder: some View { var placeholder: some View {

View File

@@ -8,7 +8,7 @@ struct OpenSettingsButton: View {
#endif #endif
var body: some View { var body: some View {
Button { let button = Button {
presentationMode.wrappedValue.dismiss() presentationMode.wrappedValue.dismiss()
#if os(macOS) #if os(macOS)
@@ -20,7 +20,13 @@ struct OpenSettingsButton: View {
Label("Open Settings", systemImage: "gearshape.2") Label("Open Settings", systemImage: "gearshape.2")
} }
.buttonStyle(.plain) .buttonStyle(.plain)
if #available(iOS 15.0, macOS 12.0, tvOS 15.0, *) {
button
.buttonStyle(.borderedProminent) .buttonStyle(.borderedProminent)
} else {
button
}
} }
} }

View File

@@ -47,6 +47,14 @@ struct PopularView: View {
} }
} }
.navigationBarTitleDisplayMode(.inline) .navigationBarTitleDisplayMode(.inline)
.refreshControl { refreshControl in
resource?.load().onCompletion { _ in
refreshControl.endRefreshing()
}
.onFailure { self.error = $0 }
.onSuccess { _ in self.error = nil }
}
.backport
.refreshable { .refreshable {
DispatchQueue.main.async { DispatchQueue.main.async {
resource?.load() resource?.load()
@@ -54,7 +62,7 @@ struct PopularView: View {
.onSuccess { _ in self.error = nil } .onSuccess { _ in self.error = nil }
} }
} }
.navigationBarTitleDisplayMode(.inline) .navigationBarTitleDisplayMode(RefreshControl.navigationBarTitleDisplayMode)
#endif #endif
#if os(macOS) #if os(macOS)
.toolbar { .toolbar {

View File

@@ -281,7 +281,11 @@ struct VideoContextMenuView: View {
let label = Label("Remove…", systemImage: "trash.fill") let label = Label("Remove…", systemImage: "trash.fill")
.foregroundColor(Color("AppRedColor")) .foregroundColor(Color("AppRedColor"))
if #available(iOS 15, macOS 12, *) {
Button(role: .destructive, action: action) { label } Button(role: .destructive, action: action) { label }
} else {
Button(action: action) { label }
}
} }
#endif #endif

View File

@@ -93,10 +93,10 @@
"Player" = "Player"; "Player" = "Player";
"Charging" = "Aufladen"; "Charging" = "Aufladen";
"Clear" = "Löschen"; "Clear" = "Löschen";
"Clear Search History..." = "Suchverlauf löschen..."; "Clear Search History..." = "Suchverlauf löschen";
"Filter: active" = "Filter: aktiv"; "Filter: active" = "Filter: aktiv";
"Find Other" = "Andere finden"; "Find Other" = "Andere finden";
"Edit..." = "Bearbeiten..."; "Edit..." = "Bearbeiten";
/* Selected video has just finished playing */ /* Selected video has just finished playing */
"Just watched" = "Kürzlich angesehen"; "Just watched" = "Kürzlich angesehen";
@@ -133,7 +133,7 @@
"Are you sure you want to restore default quality profiles?" = "Möchten Sie die Standardqualitätsprofile wirklich wiederherstellen?"; "Are you sure you want to restore default quality profiles?" = "Möchten Sie die Standardqualitätsprofile wirklich wiederherstellen?";
"Autoplaying Next" = "Nächstes Element automatisch abspielen"; "Autoplaying Next" = "Nächstes Element automatisch abspielen";
"Based on system color scheme" = "Basierend auf System Farbschema"; "Based on system color scheme" = "Basierend auf System Farbschema";
"Buffering stream..." = "Lädt…"; "Buffering stream..." = "Lädt …";
"Bugs and great feature ideas can be sent to the GitHub issues tracker. " = "Fehler und tolle Ideen für Funktionen können an den Github Issue Tracker gesendet werden. "; "Bugs and great feature ideas can be sent to the GitHub issues tracker. " = "Fehler und tolle Ideen für Funktionen können an den Github Issue Tracker gesendet werden. ";
"Categories to Skip" = "Zu überspringende Kategorien"; "Categories to Skip" = "Zu überspringende Kategorien";
"Close PiP and open player when application enters foreground" = "Schließe Bild-in-Bild und öffne den Player wenn die App in den Vordergrund geholt wird"; "Close PiP and open player when application enters foreground" = "Schließe Bild-in-Bild und öffne den Player wenn die App in den Vordergrund geholt wird";
@@ -167,7 +167,7 @@
"Issues Tracker" = "Issues Tracker"; "Issues Tracker" = "Issues Tracker";
"Enter fullscreen in landscape" = "Vollbild im Querformat aufrufen"; "Enter fullscreen in landscape" = "Vollbild im Querformat aufrufen";
"Error when accessing playlist" = "Fehler beim Zugriff auf Wiedergabeliste"; "Error when accessing playlist" = "Fehler beim Zugriff auf Wiedergabeliste";
"Finding something to play..." = "Etwas zu spielen finden..."; "Finding something to play..." = "Etwas zu spielen finden";
"Fullscreen size" = "Vollbildgröße"; "Fullscreen size" = "Vollbildgröße";
/* Video date filter in search */ /* Video date filter in search */
@@ -182,7 +182,7 @@
"Large" = "Groß"; "Large" = "Groß";
/* Loading stream OSD */ /* Loading stream OSD */
"Loading streams..." = "Lädt Streams..."; "Loading streams..." = "Lädt Streams";
/* Video duration filter in search */ /* Video duration filter in search */
"Long" = "Lang"; "Long" = "Lang";
@@ -199,7 +199,7 @@
"More info can be found in:" = "Weitere Informationen finden Sie in:"; "More info can be found in:" = "Weitere Informationen finden Sie in:";
"Movies" = "Filme"; "Movies" = "Filme";
"Music" = "Musik"; "Music" = "Musik";
"Loading..." = "Lädt..."; "Loading..." = "Lädt";
"Lock portrait mode" = "Hochformatmodus sperren"; "Lock portrait mode" = "Hochformatmodus sperren";
"Mark as watched" = "Als gesehen markieren"; "Mark as watched" = "Als gesehen markieren";
"Mark video as watched after playing" = "Video nach dem Abspielen als angesehen markieren"; "Mark video as watched after playing" = "Video nach dem Abspielen als angesehen markieren";
@@ -210,7 +210,7 @@
"Only when signed in" = "Nur wenn Sie eingeloggt sind"; "Only when signed in" = "Nur wenn Sie eingeloggt sind";
/* Loading stream OSD */ /* Loading stream OSD */
"Opening %@ stream..." = "Öffne %@-stream..."; "Opening %@ stream..." = "Öffne %@-stream";
"Connection failed" = "Verbindung fehlgeschlagen"; "Connection failed" = "Verbindung fehlgeschlagen";
"Continue from %@" = "Ab %@ fortsetzen"; "Continue from %@" = "Ab %@ fortsetzen";
"Contributing" = "Beitragen"; "Contributing" = "Beitragen";
@@ -227,7 +227,7 @@
"I want to ask a question" = "Ich möchte eine Frage stellen"; "I want to ask a question" = "Ich möchte eine Frage stellen";
"If you are interested what's coming in future updates, you can track project Milestones." = "Wenn Sie sich für künftige Updates interessieren, können Sie die Meilensteine des Projekts verfolgen."; "If you are interested what's coming in future updates, you can track project Milestones." = "Wenn Sie sich für künftige Updates interessieren, können Sie die Meilensteine des Projekts verfolgen.";
"Large layout is not suitable for all devices and using it may cause controls not to fit on the screen." = "Das große Layout ist nicht für alle Geräte geeignet und kann dazu führen, dass die Bedienelemente nicht auf den Bildschirm passen."; "Large layout is not suitable for all devices and using it may cause controls not to fit on the screen." = "Das große Layout ist nicht für alle Geräte geeignet und kann dazu führen, dass die Bedienelemente nicht auf den Bildschirm passen.";
"Opening audio stream..." = "Audiostream wird geöffnet..."; "Opening audio stream..." = "Audiostream wird geöffnet";
"Orientation" = "Ausrichtung"; "Orientation" = "Ausrichtung";
"Playlist \"%@\" will be deleted.\nIt cannot be reverted." = "Die Wiedergabeliste \"%@\" wird gelöscht.\nDies kann nicht rückgängig gemacht werden."; "Playlist \"%@\" will be deleted.\nIt cannot be reverted." = "Die Wiedergabeliste \"%@\" wird gelöscht.\nDies kann nicht rückgängig gemacht werden.";
"Preferred Formats" = "Bevorzugte Formate"; "Preferred Formats" = "Bevorzugte Formate";
@@ -248,7 +248,7 @@
/* Video sort order in search */ /* Video sort order in search */
"Rating" = "Bewertung"; "Rating" = "Bewertung";
"Settings" = "Einstellungen"; "Settings" = "Einstellungen";
"Share..." = "Teilen..."; "Share..." = "Teilen";
"Remove from Playlist" = "Aus Wiedergabeliste entfernen"; "Remove from Playlist" = "Aus Wiedergabeliste entfernen";
"Remove from the queue" = "Aus der Warteschlange entfernen"; "Remove from the queue" = "Aus der Warteschlange entfernen";
"Replies" = "Antworten anzeigen"; "Replies" = "Antworten anzeigen";
@@ -257,7 +257,7 @@
"Resolution" = "Auflösung"; "Resolution" = "Auflösung";
"Restart the app to apply the settings above." = "Starten Sie die App neu, um die Einstellungen zu übernehmen."; "Restart the app to apply the settings above." = "Starten Sie die App neu, um die Einstellungen zu übernehmen.";
"Restart/Play next" = "Von Anfang an/Als Nächstes spielen"; "Restart/Play next" = "Von Anfang an/Als Nächstes spielen";
"Restore default profiles..." = "Standardprofile wiederherstellen..."; "Restore default profiles..." = "Standardprofile wiederherstellen";
"Rotate to portrait when exiting fullscreen" = "Auf Hochformat drehen, wenn der Vollbildmodus beendet wird"; "Rotate to portrait when exiting fullscreen" = "Auf Hochformat drehen, wenn der Vollbildmodus beendet wird";
"Round corners" = "Runde Ecken"; "Round corners" = "Runde Ecken";
"Switch to public locations" = "Zu öffentlichen Adressen wechseln"; "Switch to public locations" = "Zu öffentlichen Adressen wechseln";
@@ -271,10 +271,10 @@
/* Video sort order in search */ /* Video sort order in search */
"Views" = "Aufrufe"; "Views" = "Aufrufe";
"Watched" = "Beobachtet"; "Watched" = "Gesehen";
/* Selected video was played on given date */ /* Selected video was played on given date */
"Watched %@" = "Beobachtet %@"; "Watched %@" = "%@ gesehen";
/* Selected video is being played */ /* Selected video is being played */
"Watching now" = "Jetzt anschauen"; "Watching now" = "Jetzt anschauen";
@@ -309,7 +309,7 @@
/* Player controls layout size for TV */ /* Player controls layout size for TV */
"TV" = "Fernsehen"; "TV" = "Fernsehen";
"unknown" = "unbekannt"; "unknown" = "unbekannt";
"Unsubscribe" = "Deabonnieren"; "Unsubscribe" = "Abbestellen";
"Upload date" = "Uploaddatum"; "Upload date" = "Uploaddatum";
"URL" = "URL"; "URL" = "URL";
"Wi-Fi" = "Wi-Fi"; "Wi-Fi" = "Wi-Fi";
@@ -357,7 +357,7 @@
"Hardware decoder" = "Hardware-Decoder"; "Hardware decoder" = "Hardware-Decoder";
"Save history of searches, channels and playlists" = "Verlauf von Suchen, Kanälen und Wiedergabelisten speichern"; "Save history of searches, channels and playlists" = "Verlauf von Suchen, Kanälen und Wiedergabelisten speichern";
"Search history is empty" = "Suchverlauf ist leer"; "Search history is empty" = "Suchverlauf ist leer";
"Search..." = "Suche..."; "Search..." = "Suche";
"Sections" = "Abschnitte"; "Sections" = "Abschnitte";
"Seek gesture sensitivity" = "Suchgesten-Sensibilität"; "Seek gesture sensitivity" = "Suchgesten-Sensibilität";
"Seek gesture speed" = "Geschwindigkeit der Suchgesten"; "Seek gesture speed" = "Geschwindigkeit der Suchgesten";
@@ -427,7 +427,7 @@
"Could not refresh Trending" = "Trends kann nicht aktualisiert werden"; "Could not refresh Trending" = "Trends kann nicht aktualisiert werden";
"Could not open channel" = "Kanal kann nicht geöffnet werden"; "Could not open channel" = "Kanal kann nicht geöffnet werden";
"This URL could not be opened" = "Diese URL kann nicht geöffnet werden"; "This URL could not be opened" = "Diese URL kann nicht geöffnet werden";
"Share Logs..." = "Logs teilen…"; "Share Logs..." = "Logs teilen …";
"Channel could not be found" = "Der Kanal konnte nicht gefunden werden"; "Channel could not be found" = "Der Kanal konnte nicht gefunden werden";
"Could not refresh Subscriptions" = "Abonnements konnten nicht aktualisiert werden"; "Could not refresh Subscriptions" = "Abonnements konnten nicht aktualisiert werden";
"If you want this app to be available in your language, join translation project." = "Wenn Sie wünschen, dass diese App auch in Ihrer Sprache verfügbar ist, nehmen Sie am Übersetzungsprojekt teil."; "If you want this app to be available in your language, join translation project." = "Wenn Sie wünschen, dass diese App auch in Ihrer Sprache verfügbar ist, nehmen Sie am Übersetzungsprojekt teil.";
@@ -439,11 +439,11 @@
"Show Home" = "Startseite anzeigen"; "Show Home" = "Startseite anzeigen";
"Video Details" = "Videodetails"; "Video Details" = "Videodetails";
"Share files from Finder on a Mac\nor iTunes on Windows" = "Teilen von Dateien über den Finder auf einem Mac\noder iTunes unter Windows"; "Share files from Finder on a Mac\nor iTunes on Windows" = "Teilen von Dateien über den Finder auf einem Mac\noder iTunes unter Windows";
"Recent History" = "Neueste Verlauf"; "Recent History" = "Neuester Verlauf";
"Show Open Videos toolbar button" = "Schaltfläche \"Videos öffnen\" in der Symbolleiste anzeigen"; "Show Open Videos toolbar button" = "Schaltfläche \"Videos öffnen\" in der Symbolleiste anzeigen";
"Edit Favorites…" = "Favoriten bearbeiten…"; "Edit Favorites…" = "Favoriten bearbeiten …";
"Show Documents" = "Dokumente anzeigen"; "Show Documents" = "Dokumente anzeigen";
"Buttons labels" = "Tasten-Etiketten"; "Buttons labels" = "Schaltflächen-Etiketten";
"Inspector visibility" = "Sichtbarkeit der Inspector"; "Inspector visibility" = "Sichtbarkeit der Inspector";
"Pages toolbar position" = "Position der Seitensymbolleiste"; "Pages toolbar position" = "Position der Seitensymbolleiste";
"Clear Queue before opening" = "Warteschlange vor dem Öffnen löschen"; "Clear Queue before opening" = "Warteschlange vor dem Öffnen löschen";
@@ -482,7 +482,7 @@
"Sample Rate" = "Samplerate"; "Sample Rate" = "Samplerate";
"Files" = "Dateien"; "Files" = "Dateien";
"Could not find any links to open in your clipboard" = "Kann keine Links zum Öffnen in Ihrer Zwischenablage finden"; "Could not find any links to open in your clipboard" = "Kann keine Links zum Öffnen in Ihrer Zwischenablage finden";
"Remove…" = "Entfernen…"; "Remove…" = "Entfernen …";
"Show Inspector" = "Inspector einblenden"; "Show Inspector" = "Inspector einblenden";
"Actions buttons" = "Aktionsschaltflächen"; "Actions buttons" = "Aktionsschaltflächen";
"Show sidebar" = "Seitenleiste anzeigen"; "Show sidebar" = "Seitenleiste anzeigen";
@@ -503,7 +503,7 @@
"Verified" = "Verifiziert"; "Verified" = "Verifiziert";
"Channel" = "Kanal"; "Channel" = "Kanal";
"Short videos: visible" = "Kurze Videos: sichtbar"; "Short videos: visible" = "Kurze Videos: sichtbar";
"Player Bar" = "Spielerleiste"; "Player Bar" = "Video-Player-Leiste";
"Short videos: hidden" = "Kurze Videos: versteckt"; "Short videos: hidden" = "Kurze Videos: versteckt";
"Play all unwatched" = "Alle ungesehen abspielen"; "Play all unwatched" = "Alle ungesehen abspielen";
"Double tap gesture" = "Doppeltippgeste"; "Double tap gesture" = "Doppeltippgeste";
@@ -539,7 +539,7 @@
"Subscribe/Unsubscribe" = "Abonnieren/abbestellen"; "Subscribe/Unsubscribe" = "Abonnieren/abbestellen";
"Are you sure you want to clear cache?" = "Möchten Sie den Cache wirklich löschen?"; "Are you sure you want to clear cache?" = "Möchten Sie den Cache wirklich löschen?";
"Single tap gesture" = "Einmalige Antippen-Geste"; "Single tap gesture" = "Einmalige Antippen-Geste";
"Seeking" = "Suchend"; "Seeking" = "Suchen";
"List" = "Liste"; "List" = "Liste";
"Cells" = "Zellen"; "Cells" = "Zellen";
"Show Next in Queue" = "Nächste in Warteschlange anzeigen"; "Show Next in Queue" = "Nächste in Warteschlange anzeigen";
@@ -564,12 +564,12 @@
"Lock" = "Sperre"; "Lock" = "Sperre";
"Description" = "Beschreibung"; "Description" = "Beschreibung";
"Seek" = "Suchen"; "Seek" = "Suchen";
"Enter account credentials to connect..." = "Geben Sie die Kontozugangsdaten ein, um eine Verbindung herzustellen..."; "Enter account credentials to connect..." = "Geben Sie die Kontozugangsdaten ein, um eine Verbindung herzustellen";
"Show scroll to top button in comments" = "Schaltfläche Nach oben scrollen in Kommentaren anzeigen"; "Show scroll to top button in comments" = "Schaltfläche Nach oben scrollen in Kommentaren anzeigen";
"Enter location address to connect..." = "Geben Sie die Internetadresse ein, um eine Verbindung herzustellen..."; "Enter location address to connect..." = "Geben Sie die Internetadresse ein, um eine Verbindung herzustellen";
"Opened File" = "Geöffnete Datei"; "Opened File" = "Geöffnete Datei";
"File Extension" = "Dateierweiterung"; "File Extension" = "Dateierweiterung";
"Opening file..." = "Datei öffnen..."; "Opening file..." = "Datei öffnen";
"Close video and player on end" = "Video und Player am Ende beenden"; "Close video and player on end" = "Video und Player am Ende beenden";
"Use system controls with AVPlayer" = "Systemsteuerung mit AVPlayer verwenden"; "Use system controls with AVPlayer" = "Systemsteuerung mit AVPlayer verwenden";
"Public account" = "Öffentliches Konto"; "Public account" = "Öffentliches Konto";
@@ -582,12 +582,12 @@
"Available" = "Verfügbar"; "Available" = "Verfügbar";
"Startup section" = "Bereich Startup"; "Startup section" = "Bereich Startup";
"Home Settings" = "Startseite Einstellungen"; "Home Settings" = "Startseite Einstellungen";
"Watched: hidden" = "Beobachtet: versteckt"; "Watched: hidden" = "Gesehene: versteckt";
"(watched and shorts hidden)" = "(beobachtet und shorts versteckt)"; "(watched and shorts hidden)" = "(gesehene und Shorts versteckt)";
"Watched: visible" = "Beobachtet: sichtbar"; "Watched: visible" = "Gesehene: sichtbar";
"No videos to show" = "Keine Videos zu zeigen"; "No videos to show" = "Keine Videos zu zeigen";
"(watched hidden)" = "(versteckt beobachtet)"; "(watched hidden)" = "(gesehene versteckt)";
"(shorts hidden)" = "(shorts versteckt)"; "(shorts hidden)" = "(Shorts versteckt)";
"Disable filters" = "Filter deaktivieren"; "Disable filters" = "Filter deaktivieren";
"Limit" = "Grenze"; "Limit" = "Grenze";
"Are you sure you want to remove %@ from Favorites?" = "Möchten Sie %@ wirklich aus den Favoriten entfernen?"; "Are you sure you want to remove %@ from Favorites?" = "Möchten Sie %@ wirklich aus den Favoriten entfernen?";
@@ -597,3 +597,6 @@
"Play Now in AVPlayer" = "Jetzt in AVPlayer abspielen"; "Play Now in AVPlayer" = "Jetzt in AVPlayer abspielen";
"Show channel avatars in videos lists" = "Kanal-Avatare in Videolisten anzeigen"; "Show channel avatars in videos lists" = "Kanal-Avatare in Videolisten anzeigen";
"Show channel avatars in channels lists" = "Kanal-Avatare in Kanallisten anzeigen"; "Show channel avatars in channels lists" = "Kanal-Avatare in Kanallisten anzeigen";
"Podcasts" = "Podcasts";
"Add %@" = "%@ hinzufügen";
"Releases" = "Veröffentlichungen";

View File

@@ -53,7 +53,7 @@
"Are you sure you want to restore default quality profiles?" = "¿Estás seguro de que quieres restablecer los ajustes por defecto de los perfiles de calidad?"; "Are you sure you want to restore default quality profiles?" = "¿Estás seguro de que quieres restablecer los ajustes por defecto de los perfiles de calidad?";
"Are you sure you want to unsubscribe from %@?" = "¿Estás seguro de que quieres dejar de estar suscrito a %@?"; "Are you sure you want to unsubscribe from %@?" = "¿Estás seguro de que quieres dejar de estar suscrito a %@?";
"Cancel" = "Cancelar"; "Cancel" = "Cancelar";
"Autoplaying Next" = "Autorreproducir el siguiente"; "Autoplaying Next" = "Autoreproducir el siguiente";
"Based on system color scheme" = "Basado en el tema del sistema"; "Based on system color scheme" = "Basado en el tema del sistema";
"Clear Search History..." = "Limpiar el historial de búsqueda..."; "Clear Search History..." = "Limpiar el historial de búsqueda...";
"Battery" = "Batería"; "Battery" = "Batería";
@@ -169,7 +169,7 @@
"Stream & Player" = "Transmisión y reproductor"; "Stream & Player" = "Transmisión y reproductor";
"Picture in Picture" = "Imagen en imagen"; "Picture in Picture" = "Imagen en imagen";
"Visibility" = "Visibilidad"; "Visibility" = "Visibilidad";
"Edit Favorites…" = "Editar Favoritos..."; "Edit Favorites…" = "Editar los favoritos";
"Center" = "Centrar"; "Center" = "Centrar";
"Wiki" = "Wiki"; "Wiki" = "Wiki";
"Live Streams" = "Transmisiones en vivo"; "Live Streams" = "Transmisiones en vivo";
@@ -250,7 +250,7 @@
"Actions buttons" = "Botones de acciones"; "Actions buttons" = "Botones de acciones";
"Files" = "Archivos"; "Files" = "Archivos";
"Sign In Required" = "Inicio de sesión requerido"; "Sign In Required" = "Inicio de sesión requerido";
"Buttons labels" = "Etiquetas de botones"; "Buttons labels" = "Etiquetas de los botones";
"Next" = "Siguiente"; "Next" = "Siguiente";
"Default Profile" = "Perfil por defecto"; "Default Profile" = "Perfil por defecto";
"Paste" = "Pegar"; "Paste" = "Pegar";
@@ -258,7 +258,7 @@
"File" = "Archivo"; "File" = "Archivo";
"Right" = "Derecha"; "Right" = "Derecha";
"Reset search filters" = "Restablecer filtros de búsqueda"; "Reset search filters" = "Restablecer filtros de búsqueda";
"Channel" = "Vanal"; "Channel" = "Canal";
"Open Files" = "Abrir archivos"; "Open Files" = "Abrir archivos";
"You can find information about using Yattee in the Wiki pages." = "Puede encontrar información sobre el uso de Yattee en la Wiki."; "You can find information about using Yattee in the Wiki pages." = "Puede encontrar información sobre el uso de Yattee en la Wiki.";
"Lock portrait mode" = "Bloquear modo retrato"; "Lock portrait mode" = "Bloquear modo retrato";
@@ -266,7 +266,7 @@
/* Loading stream OSD */ /* Loading stream OSD */
"Loading streams..." = "Cargando secuencias..."; "Loading streams..." = "Cargando secuencias...";
"Public Locations" = "Ubicaciones Públicas"; "Public Locations" = "Ubicaciones públicas";
"Yattee" = "Yattee"; "Yattee" = "Yattee";
"No results" = "No hay resultados"; "No results" = "No hay resultados";
"Driver" = "Driver"; "Driver" = "Driver";
@@ -331,7 +331,7 @@
"Replies" = "Respuestas"; "Replies" = "Respuestas";
"Reset" = "Reiniciar"; "Reset" = "Reiniciar";
"Save history of searches, channels and playlists" = "Guardar historial de búsquedas, canales y listas de reproducción"; "Save history of searches, channels and playlists" = "Guardar historial de búsquedas, canales y listas de reproducción";
"Search" = "Buscar; "Search" = "Buscar";
"Seek gesture sensitivity" = "Buscar sensibilidad en los gestos"; "Seek gesture sensitivity" = "Buscar sensibilidad en los gestos";
"Select location closest to you:" = "Seleccione la ubicación más cercana:"; "Select location closest to you:" = "Seleccione la ubicación más cercana:";
@@ -397,7 +397,7 @@
"Playlist \"%@\" will be deleted.\nIt cannot be reverted." = "Se eliminará la lista de reproducción \"%@\".\nNo se puede revertir."; "Playlist \"%@\" will be deleted.\nIt cannot be reverted." = "Se eliminará la lista de reproducción \"%@\".\nNo se puede revertir.";
"Playlists" = "Listas de reproducción"; "Playlists" = "Listas de reproducción";
"Popular" = "Popular"; "Popular" = "Popular";
"Proxy videos" = "Proxy videos"; "Proxy videos" = "Utilizar un proxy para ver los vídeos";
"Regular size" = "Tamaño regular"; "Regular size" = "Tamaño regular";
"Related" = "Relacionado"; "Related" = "Relacionado";
@@ -456,7 +456,7 @@
"Press and hold remote button to open captions and quality menus" = "Mantenga presionado el botón del control remoto para abrir subtítulos y menús de calidad"; "Press and hold remote button to open captions and quality menus" = "Mantenga presionado el botón del control remoto para abrir subtítulos y menús de calidad";
"Comments are disabled" = "Los comentarios están deshabilitados"; "Comments are disabled" = "Los comentarios están deshabilitados";
"No comments" = "Sin comentarios"; "No comments" = "Sin comentarios";
"Share Logs..." = "Compartir registros..."; "Share Logs..." = "Compartir registros";
"Open logs in Finder" = "Abrir registros en Finder"; "Open logs in Finder" = "Abrir registros en Finder";
"Could not open video" = "No se pudo abrir el video"; "Could not open video" = "No se pudo abrir el video";
"Channel could not be found" = "No se pudo encontrar el canal"; "Channel could not be found" = "No se pudo encontrar el canal";
@@ -481,14 +481,14 @@
"Playback" = "Reproducción"; "Playback" = "Reproducción";
"Restart/Play next" = "Reiniciar/Reproducir siguiente"; "Restart/Play next" = "Reiniciar/Reproducir siguiente";
"This cannot be reverted" = "Esto no se puede revertir"; "This cannot be reverted" = "Esto no se puede revertir";
"This cannot be reverted. You might need to switch between views or restart the app to see changes." = "Esto no se puede revertir. Es posible que deba cambiar entre vistas o reiniciar la aplicación para ver los cambios"; "This cannot be reverted. You might need to switch between views or restart the app to see changes." = "Esto no se puede revertir. Es posible que deba cambiar entre vistas o reiniciar la aplicación para ver los cambios.";
"Could not open channel" = "No se pudo abrir el canal"; "Could not open channel" = "No se pudo abrir el canal";
"Recent History" = "Historial reciente"; "Recent History" = "Historial reciente";
"Share files from Finder on a Mac\nor iTunes on Windows" = "Comparta archivos desde Finder en una Mac\no iTunes en Windows"; "Share files from Finder on a Mac\nor iTunes on Windows" = "Comparta archivos desde Finder en una Mac\no iTunes en Windows";
"Pages toolbar position" = "Posición de la barra de herramientas de páginas"; "Pages toolbar position" = "Posición de la barra de herramientas de páginas";
"Video actions buttons" = "Botones de acciones de video"; "Video actions buttons" = "Botones de acciones de video";
"Video" = "Video"; "Video" = "Video";
"Show Open Videos toolbar button" = "Mostrar el botón de la barra de herramientas Abrir videos"; "Show Open Videos toolbar button" = "Mostrar el botón de los vídeos abiertos en la barra de herramientas";
"Show Documents" = "Mostrar documentos"; "Show Documents" = "Mostrar documentos";
"Clear Queue before opening" = "Borrar cola antes de abrir"; "Clear Queue before opening" = "Borrar cola antes de abrir";
"Open" = "Abrir"; "Open" = "Abrir";
@@ -498,7 +498,105 @@
"Audio" = "Audio"; "Audio" = "Audio";
"Codec" = "Codec"; "Codec" = "Codec";
"Size" = "Tamaño"; "Size" = "Tamaño";
"Remove…" = "Eliminar..."; "Remove…" = "Eliminar";
"Playback history is empty" = "El historial de reproducción está vacío"; "Playback history is empty" = "El historial de reproducción está vacío";
"Copy%@link" = "Copiar%@enlace"; "Copy%@link" = "Copiar%@enlace";
"Share%@link" = "Compartir%@enlace"; "Share%@link" = "Compartir%@enlace";
"Open expanded" = "Abrir maximizado";
"Single tap gesture" = "Gesto de un solo toque";
"Right click channel thumbnail to open context menu with more actions" = "Haz clic con el botón derecho en la miniatura del canal para abrir el menú contextual con más acciones";
"Short videos: visible" = "Videos cortos: visible";
"Tap and hold channel thumbnail to open context menu with more actions" = "Mantén pulsada la miniatura del canal para abrir el menú contextual con más acciones";
"Maximum width expanded" = "Ancho máximo expandido";
"Short videos: hidden" = "Videos cortos: oculto";
"Clear all" = "Borrar todo";
"Always show controls buttons" = "Mostrar siempre los botones de control";
"Mark channel feed as unwatched" = "Marcar el feed del canal como no visto";
"Play all unwatched" = "Reproducir todo lo no visto";
"Mark channel feed as watched" = "Marcar el feed del canal como visto";
"Double tap gesture" = "Gesto de doble toque";
"Player Bar" = "Barra del reproductor";
"Controls Buttons" = "Botones de control";
"Seeking" = "Buscando";
"Total size: %@" = "Tamaño total: %@";
"Gesture: backwards" = "Gesto: atrás";
"Gesture: fowards" = "Gesto: adelante";
"System controls" = "Controles del sistema";
"Close video" = "Cerrar vídeo";
"Controls button: backwards" = "Botón de control: hacia atrás";
"Controls button: forwards" = "Botón de control: hacia delante";
"Show unwatched feed badges" = "Mostrar insignias de feeds no vistos";
"Gesture settings control skipping interval for double tap gesture on left/right side of the player. Changing system controls settings requires restart." = "Los ajustes de los gestos controlan el intervalo de salto para el gesto de doble toque en el lado izquierdo/derecho del reproductor. Para cambiar los ajustes de los controles del sistema es necesario reiniciar.";
"Gesture settings control skipping interval for double click on left/right side of the player. Changing system controls settings requires restart." = "Los ajustes gestuales controlan el intervalo de salto para el doble clic en el lado izquierdo/derecho del reproductor. Para cambiar la configuración de los controles del sistema es necesario reiniciar.";
"Open channels with description expanded" = "Canales abiertos con la descripción ampliada";
"Subscribe/Unsubscribe" = "Suscribirse/Desuscribirse";
"Are you sure you want to clear cache?" = "¿Seguro que quieres borrar la caché?";
"Lock orientation" = "Bloquear orientación";
"Cache" = "Cache";
"Actions Buttons" = "Botones de Acción";
"Music Mode" = "Modo Música";
"Play next item" = "Reproducir siguiente elemento";
"Gesture settings control skipping interval for remote arrow buttons (for 2nd generation Siri Remote or newer). Changing system controls settings requires restart." = "Los ajustes gestuales controlan el intervalo del salto de los botones de la flecha del mando a distancia (para Siri Remote de 2ª generación o posterior). Para cambiar los ajustes de los controles del sistema es necesario reiniciar.";
"Show cache status" = "Mostrar estado de cache";
"Show Next in Queue" = "Mostrar el siguiente en la cola";
"Hide player" = "Ocultar al jugador";
"Toggle player" = "Alternar el reproductor";
"Inspector" = "Inspector";
"Playback Settings" = "Ajustes de la reproducción";
"Show toggle watch status button" = "Mostrar el botón para alternar estado de la visualización";
"Queue - shuffled" = "Cola - aleatoria";
"Cells" = "Celdas";
"Do nothing" = "No hacer nada";
"Next in Queue" = "Siguiente en la cola";
"Open video description expanded" = "Abrir la descripción del vídeo ampliada";
"Mark all as unwatched" = "Marcar todo como no visto";
"Mark all as watched" = "Marcar todo como visto";
"List" = "Lista";
"Toggle size" = "Alternar el tamaño";
"Open channel" = "Abrir el canal";
"Feed" = "Feed";
"Available" = "Disponible";
"Loop one" = "Bucle uno";
"Use system controls with AVPlayer" = "Utilizar los controles del sistema con AVPlayer";
"Opening file..." = "Abriendo el archivo...";
"No videos to show" = "No hay vídeos que mostrar";
"Autoplay next" = "Reproducir automáticamente la siguiente";
"Home Settings" = "Ajustes iniciales";
"Watched: visible" = "Visto: visible";
"Fullscreen" = "A pantalla completa";
"Seek" = "Buscar";
"Landscape left" = "Apaisado a la izquierda";
"(watched and shorts hidden)" = "(ocultar videos reproducidos y cortos)";
"Rotate when entering fullscreen on landscape video" = "Rotar al entrar en pantalla completa en un vídeo apaisado";
"Enter account credentials to connect..." = "Introduce las credenciales de la cuenta para conectarte...";
"Watched: hidden" = "Visto: oculto";
"Stream" = "Stream";
"Replay" = "Repetir";
"(watched hidden)" = "(ocultar lo reproducido)";
"Show scroll to top button in comments" = "Mostrar el botón de desplazamiento hacia arriba en los comentarios";
"Enter location address to connect..." = "Introduzca la dirección para conectarse...";
"File Extension" = "Extensión del archivo";
"Opened File" = "Archivo abierto";
"Public account" = "Cuenta pública";
"Lock" = "Bloquear";
"No rotation" = "Sin rotación";
"Startup section" = "Sección de inicio";
"Browse without account" = "Navegar sin cuenta";
"Close video and player on end" = "Cerrar el vídeo y el reproductor al final";
"Landscape right" = "Apaisado a la derecha";
"Your Accounts" = "Tus cuentas";
"Description" = "Descripción";
"Maximum feed items" = "Número máximo de elementos en el feed";
"Are you sure you want to remove %@ from Favorites?" = "¿Estás seguro de que quieres eliminar %@ de favoritos?";
"Limit" = "Límite";
"Keep channels with unwatched videos on top of subscriptions list" = "Mantén los canales con los vídeos sin ver en la parte superior de la lista de suscripciones";
"(shorts hidden)" = "(cortos ocultos)";
"Disable filters" = "Desactivar los filtros";
"Podcasts" = "Podcasts";
"Releases" = "Lanzamientos";
"Show channel avatars in channels lists" = "Mostrar los avatares de los canales en las listas de los canales";
"Play Now in MPV" = "Reproducir ahora en MPV";
"Show channel avatars in videos lists" = "Mostrar los avatares de los canales en las listas de los vídeos";
"Add %@" = "Añada %@";
"Show video context menu options to force selected backend" = "Mostrar las opciones del menú contextual del vídeo para forzar el backend seleccionado";
"Play Now in AVPlayer" = "Reproducir ahora en AVPlayer";

View File

@@ -597,3 +597,6 @@
"Play Now in MPV" = "Lire maintenant dans MPV"; "Play Now in MPV" = "Lire maintenant dans MPV";
"Show channel avatars in videos lists" = "Afficher les avatars des chaînes dans les listes de vidéos"; "Show channel avatars in videos lists" = "Afficher les avatars des chaînes dans les listes de vidéos";
"Show channel avatars in channels lists" = "Afficher les avatars des chaînes dans les listes de chaînes"; "Show channel avatars in channels lists" = "Afficher les avatars des chaînes dans les listes de chaînes";
"Podcasts" = "Podcasts";
"Releases" = "Sorties";
"Add %@" = "Ajouter %@";

View File

@@ -105,7 +105,7 @@
"Not available" = "利用できません"; "Not available" = "利用できません";
/* SponsorBlock category name */ /* SponsorBlock category name */
"Offtopic in Music Videos" = "音楽動画の脱線した内容"; "Offtopic in Music Videos" = "音楽動画の非音楽部分";
"Only when signed in" = "ログイン時のみ"; "Only when signed in" = "ログイン時のみ";
"Orientation" = "向き"; "Orientation" = "向き";
"Opening audio stream..." = "音声ストリーム 開始中..."; "Opening audio stream..." = "音声ストリーム 開始中...";
@@ -487,13 +487,13 @@
"Category" = "分類"; "Category" = "分類";
/* SponsorBlock category name */ /* SponsorBlock category name */
"Interaction" = "操作の要求"; "Interaction" = "操作の依頼";
/* SponsorBlock category name */ /* SponsorBlock category name */
"Self-promotion" = "自己宣伝"; "Self-promotion" = "自己宣伝";
"Quality" = "品質"; "Quality" = "品質";
"Are you sure you want to clear search history?" = "検索履歴を消去しますか?"; "Are you sure you want to clear search history?" = "検索履歴を消去しますか?";
"For videos which feature music as the primary content." = "音楽主なコンテンツとする動画用です。"; "For videos which feature music as the primary content." = "音楽主な内容の動画が対象です。";
"Always use AVPlayer for live videos" = "ライブ配信には常に AVPlayer を使用"; "Always use AVPlayer for live videos" = "ライブ配信には常に AVPlayer を使用";
"Clear Search History" = "検索履歴を消去"; "Clear Search History" = "検索履歴を消去";
"Disabled" = "無効化"; "Disabled" = "無効化";
@@ -567,7 +567,7 @@
"Opened File" = "開いたファイル"; "Opened File" = "開いたファイル";
"File Extension" = "ファイル拡張子"; "File Extension" = "ファイル拡張子";
"Opening file..." = "ファイルを読み込み中..."; "Opening file..." = "ファイルを読み込み中...";
"Your Accounts" = "使用するアカウント"; "Your Accounts" = "アカウントを使用";
"Public account" = "公開アカウント"; "Public account" = "公開アカウント";
"Browse without account" = "アカウントなしで閲覧"; "Browse without account" = "アカウントなしで閲覧";
"Rotate when entering fullscreen on landscape video" = "横長動画を全画面にしたら回転するか"; "Rotate when entering fullscreen on landscape video" = "横長動画を全画面にしたら回転するか";
@@ -597,3 +597,6 @@
"Landscape right" = "右を下に横長"; "Landscape right" = "右を下に横長";
"Show channel avatars in channels lists" = "チャンネル一覧にチャンネルのアイコンを表示"; "Show channel avatars in channels lists" = "チャンネル一覧にチャンネルのアイコンを表示";
"Show channel avatars in videos lists" = "動画一覧にチャンネルのアイコンを表示"; "Show channel avatars in videos lists" = "動画一覧にチャンネルのアイコンを表示";
"Podcasts" = "ポッドキャスト";
"Releases" = "リリース";
"Add %@" = "追加 %@";

View File

@@ -271,7 +271,7 @@
"Popular" = "Populært"; "Popular" = "Populært";
"Connection failed" = "Kunne ikke koble til"; "Connection failed" = "Kunne ikke koble til";
"Add Location" = "Legg til sted"; "Add Location" = "Legg til sted";
"Always use AVPlayer for live videos" = "AVPlayer for direkte-videoer"; "Always use AVPlayer for live videos" = "Alltid bruk AVPlayer for direktesendinger";
"Apply to all" = "Bruk for alle"; "Apply to all" = "Bruk for alle";
"Automatic" = "Automatisk"; "Automatic" = "Automatisk";
"Autoplaying Next" = "Spiller neste også"; "Autoplaying Next" = "Spiller neste også";

View File

@@ -254,7 +254,7 @@
"Play Now" = "Redă acum"; "Play Now" = "Redă acum";
"Play All" = "Reda toate"; "Play All" = "Reda toate";
"Play Next" = "Redă Următorul"; "Play Next" = "Redă Următorul";
"Playlists" = "Playlist"; "Playlists" = "Playlist-uri";
"Profiles" = "Profiluri"; "Profiles" = "Profiluri";
"Preferred Formats" = "Formate preferate"; "Preferred Formats" = "Formate preferate";
"Quality" = "Calitate"; "Quality" = "Calitate";
@@ -597,3 +597,6 @@
"Show video context menu options to force selected backend" = "Afișați opțiunile din meniul contextual video pentru a forța backend-ul selectat"; "Show video context menu options to force selected backend" = "Afișați opțiunile din meniul contextual video pentru a forța backend-ul selectat";
"Show channel avatars in videos lists" = "Afișați avatarele canalului în listele de videoclipuri"; "Show channel avatars in videos lists" = "Afișați avatarele canalului în listele de videoclipuri";
"Show channel avatars in channels lists" = "Afișați avatarele canalelor în listele de canale"; "Show channel avatars in channels lists" = "Afișați avatarele canalelor în listele de canale";
"Podcasts" = "Podcast-uri";
"Releases" = "Lansări";
"Add %@" = "Adaugă %@";

View File

@@ -0,0 +1,15 @@
//
// UIResponder+Extensions.swift
// SwiftUI_Pull_to_Refresh
//
// Created by Geri Borbás on 21/09/2021.
//
import Foundation
import UIKit
extension UIResponder {
var parentViewController: UIViewController? {
next as? UIViewController ?? next?.parentViewController
}
}

View File

@@ -0,0 +1,70 @@
//
// UIView+Extensions.swift
// SwiftUI_Pull_to_Refresh
//
// Created by Geri Borbás on 19/09/2021.
//
import Foundation
import UIKit
extension UIView {
/// Returs frame in screen coordinates.
var globalFrame: CGRect {
if let window {
return convert(bounds, to: window.screen.coordinateSpace)
} else {
return .zero
}
}
/// Returns with all the instances of the given view type in the view hierarchy.
func viewsInHierarchy<ViewType: UIView>() -> [ViewType]? {
var views: [ViewType] = []
viewsInHierarchy(views: &views)
return views.isEmpty ? nil : views
}
private func viewsInHierarchy<ViewType: UIView>(views: inout [ViewType]) {
subviews.forEach { eachSubView in
if let matchingView = eachSubView as? ViewType {
views.append(matchingView)
}
eachSubView.viewsInHierarchy(views: &views)
}
}
/// Search ancestral view hierarcy for the given view type.
func searchViewAnchestorsFor<ViewType: UIView>(
_ onViewFound: (ViewType) -> Void
) {
if let matchingView = superview as? ViewType {
onViewFound(matchingView)
} else {
superview?.searchViewAnchestorsFor(onViewFound)
}
}
/// Search ancestral view hierarcy for the given view type.
func searchViewAnchestorsFor<ViewType: UIView>() -> ViewType? {
if let matchingView = superview as? ViewType {
return matchingView
} else {
return superview?.searchViewAnchestorsFor()
}
}
func printViewHierarchyInformation(_ level: Int = 0) {
printViewInformation(level)
subviews.forEach { $0.printViewHierarchyInformation(level + 1) }
}
func printViewInformation(_ level: Int) {
let leadingWhitespace = String(repeating: " ", count: level)
let className = "\(Self.self)"
let superclassName = "\(superclass!)"
let frame = "\(self.frame)"
let id = (accessibilityIdentifier == nil) ? "" : " `\(accessibilityIdentifier!)`"
print("\(leadingWhitespace)\(className): \(superclassName)\(id) \(frame)")
}
}

View File

@@ -0,0 +1,56 @@
//
// RefreshControl.swift
// SwiftUI_Pull_to_Refresh
//
// Created by Geri Borbás on 18/09/2021.
//
import Combine
import Foundation
import SwiftUI
import UIKit
final class RefreshControl: ObservableObject {
static var navigationBarTitleDisplayMode: NavigationBarItem.TitleDisplayMode {
if #available(iOS 15.0, *) {
return .automatic
}
return .inline
}
let onValueChanged: (_ refreshControl: UIRefreshControl) -> Void
init(onValueChanged: @escaping ((UIRefreshControl) -> Void)) {
self.onValueChanged = onValueChanged
}
/// Adds a `UIRefreshControl` to the `UIScrollView` provided.
func add(to scrollView: UIScrollView) {
scrollView.refreshControl = UIRefreshControl().withTarget(
self,
action: #selector(onValueChangedAction),
for: .valueChanged
)
.testable(as: "RefreshControl")
}
@objc private func onValueChangedAction(sender: UIRefreshControl) {
onValueChanged(sender)
}
}
extension UIRefreshControl {
/// Convinience method to assign target action inline.
func withTarget(_ target: Any?, action: Selector, for controlEvents: UIControl.Event) -> UIRefreshControl {
addTarget(target, action: action, for: controlEvents)
return self
}
/// Convinience method to match refresh control for UI testing.
func testable(as id: String) -> UIRefreshControl {
isAccessibilityElement = true
accessibilityIdentifier = id
return self
}
}

View File

@@ -0,0 +1,46 @@
//
// RefreshControlModifier.swift
// SwiftUI_Pull_to_Refresh
//
// Created by Geri Borbás on 18/09/2021.
//
import Foundation
import SwiftUI
struct RefreshControlModifier: ViewModifier {
@State private var geometryReaderFrame: CGRect = .zero
let refreshControl: RefreshControl
init(onValueChanged: @escaping (UIRefreshControl) -> Void) {
refreshControl = RefreshControl(onValueChanged: onValueChanged)
}
func body(content: Content) -> some View {
if #available(iOS 15.0, macOS 12.0, tvOS 15.0, *) {
return content
} else {
return content
.background(
GeometryReader { geometry in
ScrollViewMatcher(
onResolve: { scrollView in
refreshControl.add(to: scrollView)
},
geometryReaderFrame: $geometryReaderFrame
)
.preference(key: FramePreferenceKey.self, value: geometry.frame(in: .global))
.onPreferenceChange(FramePreferenceKey.self) { frame in
self.geometryReaderFrame = frame
}
}
)
}
}
}
extension View {
func refreshControl(onValueChanged: @escaping (_ refreshControl: UIRefreshControl) -> Void) -> some View {
modifier(RefreshControlModifier(onValueChanged: onValueChanged))
}
}

View File

@@ -0,0 +1,18 @@
//
// FramePreferenceKey.swift
// SwiftUI_Pull_to_Refresh
//
// Created by Geri Borbás on 21/09/2021.
//
import Foundation
import SwiftUI
struct FramePreferenceKey: PreferenceKey {
typealias Value = CGRect
static var defaultValue = CGRect.zero
static func reduce(value: inout CGRect, nextValue: () -> CGRect) {
value = nextValue()
}
}

View File

@@ -0,0 +1,106 @@
//
// ScrollViewMatcher.swift
// SwiftUI_Pull_to_Refresh
//
// Created by Geri Borbás on 17/09/2021.
//
import Foundation
import SwiftUI
final class ScrollViewMatcher: UIViewControllerRepresentable {
let onMatch: (UIScrollView) -> Void
@Binding var geometryReaderFrame: CGRect
init(onResolve: @escaping (UIScrollView) -> Void, geometryReaderFrame: Binding<CGRect>) {
onMatch = onResolve
_geometryReaderFrame = geometryReaderFrame
}
func makeUIViewController(context _: Context) -> ScrollViewMatcherViewController {
ScrollViewMatcherViewController(onResolve: onMatch, geometryReaderFrame: geometryReaderFrame)
}
func updateUIViewController(_ viewController: ScrollViewMatcherViewController, context _: Context) {
viewController.geometryReaderFrame = geometryReaderFrame
}
}
final class ScrollViewMatcherViewController: UIViewController {
let onMatch: (UIScrollView) -> Void
private var scrollView: UIScrollView? {
didSet {
if oldValue != scrollView,
let scrollView
{
onMatch(scrollView)
}
}
}
var geometryReaderFrame: CGRect {
didSet {
match()
}
}
init(onResolve: @escaping (UIScrollView) -> Void, geometryReaderFrame: CGRect, debug _: Bool = false) {
onMatch = onResolve
self.geometryReaderFrame = geometryReaderFrame
super.init(nibName: nil, bundle: nil)
}
@available(*, unavailable)
required init?(coder _: NSCoder) {
fatalError("Use init(onMatch:) to instantiate ScrollViewMatcherViewController.")
}
func match() {
// matchUsingHierarchy()
matchUsingGeometry()
}
func matchUsingHierarchy() {
if parent != nil {
// Lookup view ancestry for any `UIScrollView`.
view.searchViewAnchestorsFor { (scrollView: UIScrollView) in
self.scrollView = scrollView
}
}
}
func matchUsingGeometry() {
if let parent {
if let scrollViewsInHierarchy: [UIScrollView] = parent.view.viewsInHierarchy() {
// Return first match if only a single scroll view is found in the hierarchy.
if scrollViewsInHierarchy.count == 1,
let firstScrollViewInHierarchy = scrollViewsInHierarchy.first
{
scrollView = firstScrollViewInHierarchy
// Filter by frame origins if multiple matches found.
} else {
if let firstMatchingFrameOrigin = scrollViewsInHierarchy.filter({
$0.globalFrame.origin.close(to: geometryReaderFrame.origin)
}).first {
scrollView = firstMatchingFrameOrigin
}
}
}
}
}
override func didMove(toParent parent: UIViewController?) {
super.didMove(toParent: parent)
match()
}
}
extension CGPoint {
/// Returns `true` if this point is close the other point (considering a ~1 pt tolerance).
func close(to point: CGPoint) -> Bool {
let inset = Double(1)
let rect = CGRect(x: x - inset, y: y - inset, width: inset * 2, height: inset * 2)
return rect.contains(point)
}
}

View File

@@ -172,7 +172,9 @@
371F2F1A269B43D300E4A7AB /* NavigationModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 371F2F19269B43D300E4A7AB /* NavigationModel.swift */; }; 371F2F1A269B43D300E4A7AB /* NavigationModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 371F2F19269B43D300E4A7AB /* NavigationModel.swift */; };
371F2F1B269B43D300E4A7AB /* NavigationModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 371F2F19269B43D300E4A7AB /* NavigationModel.swift */; }; 371F2F1B269B43D300E4A7AB /* NavigationModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 371F2F19269B43D300E4A7AB /* NavigationModel.swift */; };
371F2F1C269B43D300E4A7AB /* NavigationModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 371F2F19269B43D300E4A7AB /* NavigationModel.swift */; }; 371F2F1C269B43D300E4A7AB /* NavigationModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 371F2F19269B43D300E4A7AB /* NavigationModel.swift */; };
3722AEBC274DA396005EA4D6 /* Badge+Backport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3722AEBB274DA396005EA4D6 /* Badge+Backport.swift */; };
3722AEBE274DA401005EA4D6 /* Backport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3722AEBD274DA401005EA4D6 /* Backport.swift */; }; 3722AEBE274DA401005EA4D6 /* Backport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3722AEBD274DA401005EA4D6 /* Backport.swift */; };
3726386E2948A4B80043702D /* Badge+Backport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3722AEBB274DA396005EA4D6 /* Badge+Backport.swift */; };
37270F1C28E06E3E00856150 /* String+Localizable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37270F1B28E06E3E00856150 /* String+Localizable.swift */; }; 37270F1C28E06E3E00856150 /* String+Localizable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37270F1B28E06E3E00856150 /* String+Localizable.swift */; };
37270F1D28E06E3E00856150 /* String+Localizable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37270F1B28E06E3E00856150 /* String+Localizable.swift */; }; 37270F1D28E06E3E00856150 /* String+Localizable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37270F1B28E06E3E00856150 /* String+Localizable.swift */; };
37270F1E28E06E3E00856150 /* String+Localizable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37270F1B28E06E3E00856150 /* String+Localizable.swift */; }; 37270F1E28E06E3E00856150 /* String+Localizable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37270F1B28E06E3E00856150 /* String+Localizable.swift */; };
@@ -322,6 +324,7 @@
37579D5E27864F5F00FD0B98 /* Help.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37579D5C27864F5F00FD0B98 /* Help.swift */; }; 37579D5E27864F5F00FD0B98 /* Help.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37579D5C27864F5F00FD0B98 /* Help.swift */; };
37579D5F27864F5F00FD0B98 /* Help.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37579D5C27864F5F00FD0B98 /* Help.swift */; }; 37579D5F27864F5F00FD0B98 /* Help.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37579D5C27864F5F00FD0B98 /* Help.swift */; };
3758638A2721B0A9000CB14E /* ChannelCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3743B86727216D3600261544 /* ChannelCell.swift */; }; 3758638A2721B0A9000CB14E /* ChannelCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3743B86727216D3600261544 /* ChannelCell.swift */; };
3759234628C26C7B00C052EC /* Refreshable+Backport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3759234528C26C7B00C052EC /* Refreshable+Backport.swift */; };
37599F30272B42810087F250 /* FavoriteItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37599F2F272B42810087F250 /* FavoriteItem.swift */; }; 37599F30272B42810087F250 /* FavoriteItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37599F2F272B42810087F250 /* FavoriteItem.swift */; };
37599F31272B42810087F250 /* FavoriteItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37599F2F272B42810087F250 /* FavoriteItem.swift */; }; 37599F31272B42810087F250 /* FavoriteItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37599F2F272B42810087F250 /* FavoriteItem.swift */; };
37599F32272B42810087F250 /* FavoriteItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37599F2F272B42810087F250 /* FavoriteItem.swift */; }; 37599F32272B42810087F250 /* FavoriteItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37599F2F272B42810087F250 /* FavoriteItem.swift */; };
@@ -429,6 +432,24 @@
37732FF42703D32400F04329 /* Sidebar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37732FF32703D32400F04329 /* Sidebar.swift */; }; 37732FF42703D32400F04329 /* Sidebar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37732FF32703D32400F04329 /* Sidebar.swift */; };
37732FF52703D32400F04329 /* Sidebar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37732FF32703D32400F04329 /* Sidebar.swift */; }; 37732FF52703D32400F04329 /* Sidebar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37732FF32703D32400F04329 /* Sidebar.swift */; };
37737786276F9858000521C1 /* Windows.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37737785276F9858000521C1 /* Windows.swift */; }; 37737786276F9858000521C1 /* Windows.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37737785276F9858000521C1 /* Windows.swift */; };
3773B7FE2ADC076800B5FEF3 /* RefreshControl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3773B7F52ADC076800B5FEF3 /* RefreshControl.swift */; };
3773B8012ADC076800B5FEF3 /* README in Resources */ = {isa = PBXBuildFile; fileRef = 3773B7F62ADC076800B5FEF3 /* README */; };
3773B8022ADC076800B5FEF3 /* README in Resources */ = {isa = PBXBuildFile; fileRef = 3773B7F62ADC076800B5FEF3 /* README */; };
3773B8032ADC076800B5FEF3 /* README in Resources */ = {isa = PBXBuildFile; fileRef = 3773B7F62ADC076800B5FEF3 /* README */; };
3773B8042ADC076800B5FEF3 /* UIView+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3773B7F82ADC076800B5FEF3 /* UIView+Extensions.swift */; };
3773B8062ADC076800B5FEF3 /* UIView+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3773B7F82ADC076800B5FEF3 /* UIView+Extensions.swift */; };
3773B8072ADC076800B5FEF3 /* UIResponder+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3773B7F92ADC076800B5FEF3 /* UIResponder+Extensions.swift */; };
3773B8092ADC076800B5FEF3 /* UIResponder+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3773B7F92ADC076800B5FEF3 /* UIResponder+Extensions.swift */; };
3773B80A2ADC076800B5FEF3 /* RefreshControlModifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3773B7FA2ADC076800B5FEF3 /* RefreshControlModifier.swift */; };
3773B80D2ADC076800B5FEF3 /* FramePreferenceKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3773B7FC2ADC076800B5FEF3 /* FramePreferenceKey.swift */; };
3773B80E2ADC076800B5FEF3 /* FramePreferenceKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3773B7FC2ADC076800B5FEF3 /* FramePreferenceKey.swift */; };
3773B80F2ADC076800B5FEF3 /* FramePreferenceKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3773B7FC2ADC076800B5FEF3 /* FramePreferenceKey.swift */; };
3773B8102ADC076800B5FEF3 /* ScrollViewMatcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3773B7FD2ADC076800B5FEF3 /* ScrollViewMatcher.swift */; };
3773B8122ADC076800B5FEF3 /* ScrollViewMatcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3773B7FD2ADC076800B5FEF3 /* ScrollViewMatcher.swift */; };
3773B8152ADC081300B5FEF3 /* VisualEffectBlur-iOS.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3773B8132ADC081300B5FEF3 /* VisualEffectBlur-iOS.swift */; };
3773B8162ADC081300B5FEF3 /* VisualEffectBlur-iOS.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3773B8132ADC081300B5FEF3 /* VisualEffectBlur-iOS.swift */; };
3773B8172ADC081300B5FEF3 /* VisualEffectBlur-macOS.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3773B8142ADC081300B5FEF3 /* VisualEffectBlur-macOS.swift */; };
3773B8182ADC081300B5FEF3 /* VisualEffectBlur-macOS.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3773B8142ADC081300B5FEF3 /* VisualEffectBlur-macOS.swift */; };
3774123327387CB000423605 /* Defaults.swift in Sources */ = {isa = PBXBuildFile; fileRef = 372915E52687E3B900F5A35B /* Defaults.swift */; }; 3774123327387CB000423605 /* Defaults.swift in Sources */ = {isa = PBXBuildFile; fileRef = 372915E52687E3B900F5A35B /* Defaults.swift */; };
3774124927387D2300423605 /* Channel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37AAF28F26740715007FC770 /* Channel.swift */; }; 3774124927387D2300423605 /* Channel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37AAF28F26740715007FC770 /* Channel.swift */; };
3774124A27387D2300423605 /* ContentItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37FB28402721B22200A57617 /* ContentItem.swift */; }; 3774124A27387D2300423605 /* ContentItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37FB28402721B22200A57617 /* ContentItem.swift */; };
@@ -500,6 +521,9 @@
377ABC48286E5887009C986F /* Sequence+Unique.swift in Sources */ = {isa = PBXBuildFile; fileRef = 377ABC47286E5887009C986F /* Sequence+Unique.swift */; }; 377ABC48286E5887009C986F /* Sequence+Unique.swift in Sources */ = {isa = PBXBuildFile; fileRef = 377ABC47286E5887009C986F /* Sequence+Unique.swift */; };
377ABC49286E5887009C986F /* Sequence+Unique.swift in Sources */ = {isa = PBXBuildFile; fileRef = 377ABC47286E5887009C986F /* Sequence+Unique.swift */; }; 377ABC49286E5887009C986F /* Sequence+Unique.swift in Sources */ = {isa = PBXBuildFile; fileRef = 377ABC47286E5887009C986F /* Sequence+Unique.swift */; };
377ABC4A286E5887009C986F /* Sequence+Unique.swift in Sources */ = {isa = PBXBuildFile; fileRef = 377ABC47286E5887009C986F /* Sequence+Unique.swift */; }; 377ABC4A286E5887009C986F /* Sequence+Unique.swift in Sources */ = {isa = PBXBuildFile; fileRef = 377ABC47286E5887009C986F /* Sequence+Unique.swift */; };
377E17142928265900894889 /* ListRowSeparator+Backport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 377E17132928265900894889 /* ListRowSeparator+Backport.swift */; };
377E17152928265900894889 /* ListRowSeparator+Backport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 377E17132928265900894889 /* ListRowSeparator+Backport.swift */; };
377E17162928265900894889 /* ListRowSeparator+Backport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 377E17132928265900894889 /* ListRowSeparator+Backport.swift */; };
377F9F74294403770043F856 /* Cache in Frameworks */ = {isa = PBXBuildFile; productRef = 377F9F73294403770043F856 /* Cache */; }; 377F9F74294403770043F856 /* Cache in Frameworks */ = {isa = PBXBuildFile; productRef = 377F9F73294403770043F856 /* Cache */; };
377F9F76294403880043F856 /* Cache in Frameworks */ = {isa = PBXBuildFile; productRef = 377F9F75294403880043F856 /* Cache */; }; 377F9F76294403880043F856 /* Cache in Frameworks */ = {isa = PBXBuildFile; productRef = 377F9F75294403880043F856 /* Cache */; };
377F9F7B294403F20043F856 /* VideosCacheModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 377F9F7A294403F20043F856 /* VideosCacheModel.swift */; }; 377F9F7B294403F20043F856 /* VideosCacheModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 377F9F7A294403F20043F856 /* VideosCacheModel.swift */; };
@@ -543,8 +567,12 @@
3788AC2726F6840700F6BAA9 /* FavoriteItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3788AC2626F6840700F6BAA9 /* FavoriteItemView.swift */; }; 3788AC2726F6840700F6BAA9 /* FavoriteItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3788AC2626F6840700F6BAA9 /* FavoriteItemView.swift */; };
3788AC2826F6840700F6BAA9 /* FavoriteItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3788AC2626F6840700F6BAA9 /* FavoriteItemView.swift */; }; 3788AC2826F6840700F6BAA9 /* FavoriteItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3788AC2626F6840700F6BAA9 /* FavoriteItemView.swift */; };
3788AC2926F6840700F6BAA9 /* FavoriteItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3788AC2626F6840700F6BAA9 /* FavoriteItemView.swift */; }; 3788AC2926F6840700F6BAA9 /* FavoriteItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3788AC2626F6840700F6BAA9 /* FavoriteItemView.swift */; };
378AE93A274EDFAF006A4EE1 /* Badge+Backport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3722AEBB274DA396005EA4D6 /* Badge+Backport.swift */; };
378AE93C274EDFB2006A4EE1 /* Backport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3722AEBD274DA401005EA4D6 /* Backport.swift */; }; 378AE93C274EDFB2006A4EE1 /* Backport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3722AEBD274DA401005EA4D6 /* Backport.swift */; };
378AE93D274EDFB3006A4EE1 /* Backport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3722AEBD274DA401005EA4D6 /* Backport.swift */; }; 378AE93D274EDFB3006A4EE1 /* Backport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3722AEBD274DA401005EA4D6 /* Backport.swift */; };
378AE93E274EDFB4006A4EE1 /* Tint+Backport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3722AEBF274DAEB8005EA4D6 /* Tint+Backport.swift */; };
378AE93F274EDFB5006A4EE1 /* Tint+Backport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3722AEBF274DAEB8005EA4D6 /* Tint+Backport.swift */; };
378AE940274EDFB5006A4EE1 /* Tint+Backport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3722AEBF274DAEB8005EA4D6 /* Tint+Backport.swift */; };
378AE943274EF00A006A4EE1 /* Color+Background.swift in Sources */ = {isa = PBXBuildFile; fileRef = 378AE942274EF00A006A4EE1 /* Color+Background.swift */; }; 378AE943274EF00A006A4EE1 /* Color+Background.swift in Sources */ = {isa = PBXBuildFile; fileRef = 378AE942274EF00A006A4EE1 /* Color+Background.swift */; };
378AE944274EF00A006A4EE1 /* Color+Background.swift in Sources */ = {isa = PBXBuildFile; fileRef = 378AE942274EF00A006A4EE1 /* Color+Background.swift */; }; 378AE944274EF00A006A4EE1 /* Color+Background.swift in Sources */ = {isa = PBXBuildFile; fileRef = 378AE942274EF00A006A4EE1 /* Color+Background.swift */; };
378AE945274EF00A006A4EE1 /* Color+Background.swift in Sources */ = {isa = PBXBuildFile; fileRef = 378AE942274EF00A006A4EE1 /* Color+Background.swift */; }; 378AE945274EF00A006A4EE1 /* Color+Background.swift in Sources */ = {isa = PBXBuildFile; fileRef = 378AE942274EF00A006A4EE1 /* Color+Background.swift */; };
@@ -1065,7 +1093,9 @@
371CC76F29468BDC00979C1A /* SettingsButtons.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsButtons.swift; sourceTree = "<group>"; }; 371CC76F29468BDC00979C1A /* SettingsButtons.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsButtons.swift; sourceTree = "<group>"; };
371CC7732946963000979C1A /* ListingStyleButtons.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ListingStyleButtons.swift; sourceTree = "<group>"; }; 371CC7732946963000979C1A /* ListingStyleButtons.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ListingStyleButtons.swift; sourceTree = "<group>"; };
371F2F19269B43D300E4A7AB /* NavigationModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavigationModel.swift; sourceTree = "<group>"; }; 371F2F19269B43D300E4A7AB /* NavigationModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavigationModel.swift; sourceTree = "<group>"; };
3722AEBB274DA396005EA4D6 /* Badge+Backport.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Badge+Backport.swift"; sourceTree = "<group>"; };
3722AEBD274DA401005EA4D6 /* Backport.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Backport.swift; sourceTree = "<group>"; }; 3722AEBD274DA401005EA4D6 /* Backport.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Backport.swift; sourceTree = "<group>"; };
3722AEBF274DAEB8005EA4D6 /* Tint+Backport.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Tint+Backport.swift"; sourceTree = "<group>"; };
37270F1B28E06E3E00856150 /* String+Localizable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "String+Localizable.swift"; sourceTree = "<group>"; }; 37270F1B28E06E3E00856150 /* String+Localizable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "String+Localizable.swift"; sourceTree = "<group>"; };
3728203F2945E4A8009A0E2D /* SubscriptionsPageButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SubscriptionsPageButton.swift; sourceTree = "<group>"; }; 3728203F2945E4A8009A0E2D /* SubscriptionsPageButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SubscriptionsPageButton.swift; sourceTree = "<group>"; };
3729037D2739E47400EA99F6 /* MenuCommands.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MenuCommands.swift; sourceTree = "<group>"; }; 3729037D2739E47400EA99F6 /* MenuCommands.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MenuCommands.swift; sourceTree = "<group>"; };
@@ -1124,6 +1154,7 @@
3756C2A52861131100E4B059 /* NetworkState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkState.swift; sourceTree = "<group>"; }; 3756C2A52861131100E4B059 /* NetworkState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkState.swift; sourceTree = "<group>"; };
3756C2A92861151C00E4B059 /* NetworkStateModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkStateModel.swift; sourceTree = "<group>"; }; 3756C2A92861151C00E4B059 /* NetworkStateModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkStateModel.swift; sourceTree = "<group>"; };
37579D5C27864F5F00FD0B98 /* Help.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Help.swift; sourceTree = "<group>"; }; 37579D5C27864F5F00FD0B98 /* Help.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Help.swift; sourceTree = "<group>"; };
3759234528C26C7B00C052EC /* Refreshable+Backport.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Refreshable+Backport.swift"; sourceTree = "<group>"; };
37599F2F272B42810087F250 /* FavoriteItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FavoriteItem.swift; sourceTree = "<group>"; }; 37599F2F272B42810087F250 /* FavoriteItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FavoriteItem.swift; sourceTree = "<group>"; };
37599F33272B44000087F250 /* FavoritesModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FavoritesModel.swift; sourceTree = "<group>"; }; 37599F33272B44000087F250 /* FavoritesModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FavoritesModel.swift; sourceTree = "<group>"; };
37599F37272B4D740087F250 /* FavoriteButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FavoriteButton.swift; sourceTree = "<group>"; }; 37599F37272B4D740087F250 /* FavoriteButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FavoriteButton.swift; sourceTree = "<group>"; };
@@ -1175,6 +1206,15 @@
37732FEF2703A26300F04329 /* AccountValidationStatus.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountValidationStatus.swift; sourceTree = "<group>"; }; 37732FEF2703A26300F04329 /* AccountValidationStatus.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountValidationStatus.swift; sourceTree = "<group>"; };
37732FF32703D32400F04329 /* Sidebar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Sidebar.swift; sourceTree = "<group>"; }; 37732FF32703D32400F04329 /* Sidebar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Sidebar.swift; sourceTree = "<group>"; };
37737785276F9858000521C1 /* Windows.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Windows.swift; sourceTree = "<group>"; }; 37737785276F9858000521C1 /* Windows.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Windows.swift; sourceTree = "<group>"; };
3773B7F52ADC076800B5FEF3 /* RefreshControl.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RefreshControl.swift; sourceTree = "<group>"; };
3773B7F62ADC076800B5FEF3 /* README */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = README; sourceTree = "<group>"; };
3773B7F82ADC076800B5FEF3 /* UIView+Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIView+Extensions.swift"; sourceTree = "<group>"; };
3773B7F92ADC076800B5FEF3 /* UIResponder+Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIResponder+Extensions.swift"; sourceTree = "<group>"; };
3773B7FA2ADC076800B5FEF3 /* RefreshControlModifier.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RefreshControlModifier.swift; sourceTree = "<group>"; };
3773B7FC2ADC076800B5FEF3 /* FramePreferenceKey.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FramePreferenceKey.swift; sourceTree = "<group>"; };
3773B7FD2ADC076800B5FEF3 /* ScrollViewMatcher.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ScrollViewMatcher.swift; sourceTree = "<group>"; };
3773B8132ADC081300B5FEF3 /* VisualEffectBlur-iOS.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "VisualEffectBlur-iOS.swift"; sourceTree = "<group>"; };
3773B8142ADC081300B5FEF3 /* VisualEffectBlur-macOS.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "VisualEffectBlur-macOS.swift"; sourceTree = "<group>"; };
37758C0A2A1D1C8B001FD900 /* HideWatchedButtons.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HideWatchedButtons.swift; sourceTree = "<group>"; }; 37758C0A2A1D1C8B001FD900 /* HideWatchedButtons.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HideWatchedButtons.swift; sourceTree = "<group>"; };
3776924D294630110055EC18 /* ChannelAvatarView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChannelAvatarView.swift; sourceTree = "<group>"; }; 3776924D294630110055EC18 /* ChannelAvatarView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChannelAvatarView.swift; sourceTree = "<group>"; };
3776925129463C310055EC18 /* PlaylistsCacheModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PlaylistsCacheModel.swift; sourceTree = "<group>"; }; 3776925129463C310055EC18 /* PlaylistsCacheModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PlaylistsCacheModel.swift; sourceTree = "<group>"; };
@@ -1185,6 +1225,7 @@
377ABC3F286E4AD5009C986F /* InstancesManifest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = InstancesManifest.swift; sourceTree = "<group>"; }; 377ABC3F286E4AD5009C986F /* InstancesManifest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = InstancesManifest.swift; sourceTree = "<group>"; };
377ABC43286E4B74009C986F /* ManifestedInstance.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ManifestedInstance.swift; sourceTree = "<group>"; }; 377ABC43286E4B74009C986F /* ManifestedInstance.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ManifestedInstance.swift; sourceTree = "<group>"; };
377ABC47286E5887009C986F /* Sequence+Unique.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Sequence+Unique.swift"; sourceTree = "<group>"; }; 377ABC47286E5887009C986F /* Sequence+Unique.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Sequence+Unique.swift"; sourceTree = "<group>"; };
377E17132928265900894889 /* ListRowSeparator+Backport.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ListRowSeparator+Backport.swift"; sourceTree = "<group>"; };
377F9F7A294403F20043F856 /* VideosCacheModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VideosCacheModel.swift; sourceTree = "<group>"; }; 377F9F7A294403F20043F856 /* VideosCacheModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VideosCacheModel.swift; sourceTree = "<group>"; };
377F9F7E2944175F0043F856 /* FeedCacheModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeedCacheModel.swift; sourceTree = "<group>"; }; 377F9F7E2944175F0043F856 /* FeedCacheModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeedCacheModel.swift; sourceTree = "<group>"; };
377FF88A291A60310028EB0B /* OpenVideosModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OpenVideosModel.swift; sourceTree = "<group>"; }; 377FF88A291A60310028EB0B /* OpenVideosModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OpenVideosModel.swift; sourceTree = "<group>"; };
@@ -1321,6 +1362,12 @@
37DCD3162A191A180059A470 /* AVPlayerViewController+FullScreen.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "AVPlayerViewController+FullScreen.swift"; sourceTree = "<group>"; }; 37DCD3162A191A180059A470 /* AVPlayerViewController+FullScreen.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "AVPlayerViewController+FullScreen.swift"; sourceTree = "<group>"; };
37DD87C6271C9CFE0027CBF9 /* PlayerStreams.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PlayerStreams.swift; sourceTree = "<group>"; }; 37DD87C6271C9CFE0027CBF9 /* PlayerStreams.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PlayerStreams.swift; sourceTree = "<group>"; };
37DD9DA22785BBC900539416 /* NoCommentsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NoCommentsView.swift; sourceTree = "<group>"; }; 37DD9DA22785BBC900539416 /* NoCommentsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NoCommentsView.swift; sourceTree = "<group>"; };
37DD9DAF2785D58D00539416 /* RefreshControl.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RefreshControl.swift; sourceTree = "<group>"; };
37DD9DB02785D58D00539416 /* RefreshControlModifier.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RefreshControlModifier.swift; sourceTree = "<group>"; };
37DD9DB82785D60200539416 /* FramePreferenceKey.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FramePreferenceKey.swift; sourceTree = "<group>"; };
37DD9DB92785D60200539416 /* ScrollViewMatcher.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ScrollViewMatcher.swift; sourceTree = "<group>"; };
37DD9DC12785D63A00539416 /* UIView+Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIView+Extensions.swift"; sourceTree = "<group>"; };
37DD9DC22785D63A00539416 /* UIResponder+Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIResponder+Extensions.swift"; sourceTree = "<group>"; };
37E04C0E275940FB00172673 /* VerticalScrollingFix.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VerticalScrollingFix.swift; sourceTree = "<group>"; }; 37E04C0E275940FB00172673 /* VerticalScrollingFix.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VerticalScrollingFix.swift; sourceTree = "<group>"; };
37E084AB2753D95F00039B7D /* AccountsNavigationLink.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountsNavigationLink.swift; sourceTree = "<group>"; }; 37E084AB2753D95F00039B7D /* AccountsNavigationLink.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountsNavigationLink.swift; sourceTree = "<group>"; };
37E64DD026D597EB00C71877 /* SubscribedChannelsModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SubscribedChannelsModel.swift; sourceTree = "<group>"; }; 37E64DD026D597EB00C71877 /* SubscribedChannelsModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SubscribedChannelsModel.swift; sourceTree = "<group>"; };
@@ -1651,9 +1698,15 @@
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
3722AEBD274DA401005EA4D6 /* Backport.swift */, 3722AEBD274DA401005EA4D6 /* Backport.swift */,
3722AEBB274DA396005EA4D6 /* Badge+Backport.swift */,
377E17132928265900894889 /* ListRowSeparator+Backport.swift */,
37136CAB286273060095C0CF /* PersistentSystemOverlays+Backport.swift */, 37136CAB286273060095C0CF /* PersistentSystemOverlays+Backport.swift */,
3773B8132ADC081300B5FEF3 /* VisualEffectBlur-iOS.swift */,
3773B8142ADC081300B5FEF3 /* VisualEffectBlur-macOS.swift */,
3759234528C26C7B00C052EC /* Refreshable+Backport.swift */,
37E80F3F287B472300561799 /* ScrollContentBackground+Backport.swift */, 37E80F3F287B472300561799 /* ScrollContentBackground+Backport.swift */,
376E331128AD3B320070E30C /* ScrollDismissesKeyboard+Backport.swift */, 376E331128AD3B320070E30C /* ScrollDismissesKeyboard+Backport.swift */,
3722AEBF274DAEB8005EA4D6 /* Tint+Backport.swift */,
37B7CFE82A19603B001B0564 /* ToolbarBackground+Backport.swift */, 37B7CFE82A19603B001B0564 /* ToolbarBackground+Backport.swift */,
37B7CFEA2A1960EC001B0564 /* ToolbarColorScheme+Backport.swift */, 37B7CFEA2A1960EC001B0564 /* ToolbarColorScheme+Backport.swift */,
); );
@@ -1822,6 +1875,57 @@
path = Modifiers; path = Modifiers;
sourceTree = "<group>"; sourceTree = "<group>";
}; };
3773B7D12ADC05FF00B5FEF3 /* Recovered References */ = {
isa = PBXGroup;
children = (
37DD9DC12785D63A00539416 /* UIView+Extensions.swift */,
37DD9DAF2785D58D00539416 /* RefreshControl.swift */,
37DD9DB02785D58D00539416 /* RefreshControlModifier.swift */,
37DD9DB82785D60200539416 /* FramePreferenceKey.swift */,
37DD9DB92785D60200539416 /* ScrollViewMatcher.swift */,
37DD9DC22785D63A00539416 /* UIResponder+Extensions.swift */,
);
name = "Recovered References";
sourceTree = "<group>";
};
3773B7F32ADC076800B5FEF3 /* Vendor */ = {
isa = PBXGroup;
children = (
3773B7F42ADC076800B5FEF3 /* RefreshControl */,
);
path = Vendor;
sourceTree = "<group>";
};
3773B7F42ADC076800B5FEF3 /* RefreshControl */ = {
isa = PBXGroup;
children = (
3773B7F52ADC076800B5FEF3 /* RefreshControl.swift */,
3773B7F62ADC076800B5FEF3 /* README */,
3773B7F72ADC076800B5FEF3 /* Extensions */,
3773B7FA2ADC076800B5FEF3 /* RefreshControlModifier.swift */,
3773B7FB2ADC076800B5FEF3 /* ScrollViewMatcher */,
);
path = RefreshControl;
sourceTree = "<group>";
};
3773B7F72ADC076800B5FEF3 /* Extensions */ = {
isa = PBXGroup;
children = (
3773B7F82ADC076800B5FEF3 /* UIView+Extensions.swift */,
3773B7F92ADC076800B5FEF3 /* UIResponder+Extensions.swift */,
);
path = Extensions;
sourceTree = "<group>";
};
3773B7FB2ADC076800B5FEF3 /* ScrollViewMatcher */ = {
isa = PBXGroup;
children = (
3773B7FC2ADC076800B5FEF3 /* FramePreferenceKey.swift */,
3773B7FD2ADC076800B5FEF3 /* ScrollViewMatcher.swift */,
);
path = ScrollViewMatcher;
sourceTree = "<group>";
};
377F9F79294403DC0043F856 /* Cache */ = { 377F9F79294403DC0043F856 /* Cache */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
@@ -1975,6 +2079,7 @@
37D4B159267164AE00C925CA /* tvOS */, 37D4B159267164AE00C925CA /* tvOS */,
37D4B1B72672CFE300C925CA /* Model */, 37D4B1B72672CFE300C925CA /* Model */,
37D4B0C12671614700C925CA /* Shared */, 37D4B0C12671614700C925CA /* Shared */,
3773B7F32ADC076800B5FEF3 /* Vendor */,
3722AEBA274DA312005EA4D6 /* Backports */, 3722AEBA274DA312005EA4D6 /* Backports */,
37C7A9022679058300E721B4 /* Extensions */, 37C7A9022679058300E721B4 /* Extensions */,
3748186426A762300084E870 /* Fixtures */, 3748186426A762300084E870 /* Fixtures */,
@@ -1987,6 +2092,7 @@
37D4B0E12671614900C925CA /* Tests macOS */, 37D4B0E12671614900C925CA /* Tests macOS */,
3DA101AC287C30F50027D920 /* Xcode-config */, 3DA101AC287C30F50027D920 /* Xcode-config */,
37D9169A27388A81002B1BAA /* README.md */, 37D9169A27388A81002B1BAA /* README.md */,
3773B7D12ADC05FF00B5FEF3 /* Recovered References */,
); );
sourceTree = "<group>"; sourceTree = "<group>";
}; };
@@ -2560,6 +2666,7 @@
isa = PBXResourcesBuildPhase; isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
3773B8012ADC076800B5FEF3 /* README in Resources */,
37D4B0E82671614900C925CA /* Assets.xcassets in Resources */, 37D4B0E82671614900C925CA /* Assets.xcassets in Resources */,
375B537428DF6CBB004C1D19 /* Localizable.strings in Resources */, 375B537428DF6CBB004C1D19 /* Localizable.strings in Resources */,
); );
@@ -2569,6 +2676,7 @@
isa = PBXResourcesBuildPhase; isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
3773B8022ADC076800B5FEF3 /* README in Resources */,
37D4B0E92671614900C925CA /* Assets.xcassets in Resources */, 37D4B0E92671614900C925CA /* Assets.xcassets in Resources */,
375B537528DF6CBB004C1D19 /* Localizable.strings in Resources */, 375B537528DF6CBB004C1D19 /* Localizable.strings in Resources */,
); );
@@ -2592,6 +2700,7 @@
isa = PBXResourcesBuildPhase; isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
3773B8032ADC076800B5FEF3 /* README in Resources */,
37D4B1862671691600C925CA /* Assets.xcassets in Resources */, 37D4B1862671691600C925CA /* Assets.xcassets in Resources */,
375B537628DF6CBB004C1D19 /* Localizable.strings in Resources */, 375B537628DF6CBB004C1D19 /* Localizable.strings in Resources */,
37D4B15F267164AF00C925CA /* Assets.xcassets in Resources */, 37D4B15F267164AF00C925CA /* Assets.xcassets in Resources */,
@@ -2755,6 +2864,7 @@
37A362BE29537AAA00BDF328 /* PlaybackSettings.swift in Sources */, 37A362BE29537AAA00BDF328 /* PlaybackSettings.swift in Sources */,
371B7E612759706A00D21217 /* CommentsView.swift in Sources */, 371B7E612759706A00D21217 /* CommentsView.swift in Sources */,
37D9BA0629507F69002586BD /* PlayerControlsSettings.swift in Sources */, 37D9BA0629507F69002586BD /* PlayerControlsSettings.swift in Sources */,
3773B80A2ADC076800B5FEF3 /* RefreshControlModifier.swift in Sources */,
379DC3D128BA4EB400B09677 /* Seek.swift in Sources */, 379DC3D128BA4EB400B09677 /* Seek.swift in Sources */,
371B7E6A2759791900D21217 /* CommentsModel.swift in Sources */, 371B7E6A2759791900D21217 /* CommentsModel.swift in Sources */,
37E8B0F027B326F30024006F /* Comparable+Clamped.swift in Sources */, 37E8B0F027B326F30024006F /* Comparable+Clamped.swift in Sources */,
@@ -2778,6 +2888,7 @@
37BD07B52698AA4D003EBB87 /* ContentView.swift in Sources */, 37BD07B52698AA4D003EBB87 /* ContentView.swift in Sources */,
37D2E0D428B67EFC00F64D52 /* Delay.swift in Sources */, 37D2E0D428B67EFC00F64D52 /* Delay.swift in Sources */,
3776925229463C310055EC18 /* PlaylistsCacheModel.swift in Sources */, 3776925229463C310055EC18 /* PlaylistsCacheModel.swift in Sources */,
3759234628C26C7B00C052EC /* Refreshable+Backport.swift in Sources */,
374924ED2921669B0017D862 /* PreferenceKeys.swift in Sources */, 374924ED2921669B0017D862 /* PreferenceKeys.swift in Sources */,
37130A5B277657090033018A /* Yattee.xcdatamodeld in Sources */, 37130A5B277657090033018A /* Yattee.xcdatamodeld in Sources */,
37152EEA26EFEB95004FB96D /* LazyView.swift in Sources */, 37152EEA26EFEB95004FB96D /* LazyView.swift in Sources */,
@@ -2822,6 +2933,7 @@
37DD87C7271C9CFE0027CBF9 /* PlayerStreams.swift in Sources */, 37DD87C7271C9CFE0027CBF9 /* PlayerStreams.swift in Sources */,
37F7D82C289EB05F00E2B3D0 /* SettingsPickerModifier.swift in Sources */, 37F7D82C289EB05F00E2B3D0 /* SettingsPickerModifier.swift in Sources */,
375EC95D289EEEE000751258 /* QualityProfile.swift in Sources */, 375EC95D289EEEE000751258 /* QualityProfile.swift in Sources */,
3773B8102ADC076800B5FEF3 /* ScrollViewMatcher.swift in Sources */,
371B7E662759786B00D21217 /* Comment+Fixtures.swift in Sources */, 371B7E662759786B00D21217 /* Comment+Fixtures.swift in Sources */,
37BE0BD326A1D4780092E2DB /* AppleAVPlayerView.swift in Sources */, 37BE0BD326A1D4780092E2DB /* AppleAVPlayerView.swift in Sources */,
37A9965E26D6F9B9006E3224 /* HomeView.swift in Sources */, 37A9965E26D6F9B9006E3224 /* HomeView.swift in Sources */,
@@ -2830,8 +2942,10 @@
378AE943274EF00A006A4EE1 /* Color+Background.swift in Sources */, 378AE943274EF00A006A4EE1 /* Color+Background.swift in Sources */,
37F4AE7226828F0900BD60EA /* VerticalCells.swift in Sources */, 37F4AE7226828F0900BD60EA /* VerticalCells.swift in Sources */,
376578852685429C00D4EA09 /* CaseIterable+Next.swift in Sources */, 376578852685429C00D4EA09 /* CaseIterable+Next.swift in Sources */,
3722AEBC274DA396005EA4D6 /* Badge+Backport.swift in Sources */,
3748186626A7627F0084E870 /* Video+Fixtures.swift in Sources */, 3748186626A7627F0084E870 /* Video+Fixtures.swift in Sources */,
37599F34272B44000087F250 /* FavoritesModel.swift in Sources */, 37599F34272B44000087F250 /* FavoritesModel.swift in Sources */,
3773B8152ADC081300B5FEF3 /* VisualEffectBlur-iOS.swift in Sources */,
3717407D2949D40800FDDBC7 /* ChannelLinkView.swift in Sources */, 3717407D2949D40800FDDBC7 /* ChannelLinkView.swift in Sources */,
379ACB512A1F8DB000E01914 /* HomeSettingsButton.swift in Sources */, 379ACB512A1F8DB000E01914 /* HomeSettingsButton.swift in Sources */,
37030FF727B0347C00ECDDAA /* MPVPlayerView.swift in Sources */, 37030FF727B0347C00ECDDAA /* MPVPlayerView.swift in Sources */,
@@ -2844,6 +2958,7 @@
37FFC440272734C3009FFD26 /* Throttle.swift in Sources */, 37FFC440272734C3009FFD26 /* Throttle.swift in Sources */,
3709528A29283E14001ECA40 /* NoDocumentsView.swift in Sources */, 3709528A29283E14001ECA40 /* NoDocumentsView.swift in Sources */,
3705B182267B4E4900704544 /* TrendingCategory.swift in Sources */, 3705B182267B4E4900704544 /* TrendingCategory.swift in Sources */,
378AE940274EDFB5006A4EE1 /* Tint+Backport.swift in Sources */,
376BE50927347B5F009AD608 /* SettingsHeader.swift in Sources */, 376BE50927347B5F009AD608 /* SettingsHeader.swift in Sources */,
376527BB285F60F700102284 /* PlayerTimeModel.swift in Sources */, 376527BB285F60F700102284 /* PlayerTimeModel.swift in Sources */,
37270F1C28E06E3E00856150 /* String+Localizable.swift in Sources */, 37270F1C28E06E3E00856150 /* String+Localizable.swift in Sources */,
@@ -2911,6 +3026,7 @@
377A20A92693C9A2002842B8 /* TypedContentAccessors.swift in Sources */, 377A20A92693C9A2002842B8 /* TypedContentAccessors.swift in Sources */,
37484C3126FCB8F900287258 /* AccountValidator.swift in Sources */, 37484C3126FCB8F900287258 /* AccountValidator.swift in Sources */,
377ABC48286E5887009C986F /* Sequence+Unique.swift in Sources */, 377ABC48286E5887009C986F /* Sequence+Unique.swift in Sources */,
3773B8172ADC081300B5FEF3 /* VisualEffectBlur-macOS.swift in Sources */,
37520699285E8DD300CA655F /* Chapter.swift in Sources */, 37520699285E8DD300CA655F /* Chapter.swift in Sources */,
37C7B21429ABD9F20013C196 /* ChannelPage.swift in Sources */, 37C7B21429ABD9F20013C196 /* ChannelPage.swift in Sources */,
37319F0527103F94004ECCD0 /* PlayerQueue.swift in Sources */, 37319F0527103F94004ECCD0 /* PlayerQueue.swift in Sources */,
@@ -2925,6 +3041,7 @@
3784B23B272894DA00B09468 /* ShareSheet.swift in Sources */, 3784B23B272894DA00B09468 /* ShareSheet.swift in Sources */,
379775932689365600DD52A8 /* Array+Next.swift in Sources */, 379775932689365600DD52A8 /* Array+Next.swift in Sources */,
37CFB48528AFE2510070024C /* VideoDescription.swift in Sources */, 37CFB48528AFE2510070024C /* VideoDescription.swift in Sources */,
3773B8042ADC076800B5FEF3 /* UIView+Extensions.swift in Sources */,
37B81AFC26D2C9C900675966 /* VideoDetailsPaddingModifier.swift in Sources */, 37B81AFC26D2C9C900675966 /* VideoDetailsPaddingModifier.swift in Sources */,
371CC77029468BDC00979C1A /* SettingsButtons.swift in Sources */, 371CC77029468BDC00979C1A /* SettingsButtons.swift in Sources */,
37C7A1D5267BFD9D0010EAD6 /* SponsorBlockSegment.swift in Sources */, 37C7A1D5267BFD9D0010EAD6 /* SponsorBlockSegment.swift in Sources */,
@@ -2950,6 +3067,7 @@
371AC09F294D13AA0085989E /* UnwatchedFeedCountModel.swift in Sources */, 371AC09F294D13AA0085989E /* UnwatchedFeedCountModel.swift in Sources */,
370015A928BBAE7F000149FD /* ProgressBar.swift in Sources */, 370015A928BBAE7F000149FD /* ProgressBar.swift in Sources */,
37C3A24927235FAA0087A57A /* ChannelPlaylistCell.swift in Sources */, 37C3A24927235FAA0087A57A /* ChannelPlaylistCell.swift in Sources */,
377E17142928265900894889 /* ListRowSeparator+Backport.swift in Sources */,
373CFACB26966264003CB2C6 /* SearchQuery.swift in Sources */, 373CFACB26966264003CB2C6 /* SearchQuery.swift in Sources */,
37F7AB4D28A9361F00FB46B5 /* UIDevice+Cellular.swift in Sources */, 37F7AB4D28A9361F00FB46B5 /* UIDevice+Cellular.swift in Sources */,
37141673267A8E10006CA35D /* Country.swift in Sources */, 37141673267A8E10006CA35D /* Country.swift in Sources */,
@@ -2966,6 +3084,7 @@
37EF5C222739D37B00B03725 /* MenuModel.swift in Sources */, 37EF5C222739D37B00B03725 /* MenuModel.swift in Sources */,
37599F30272B42810087F250 /* FavoriteItem.swift in Sources */, 37599F30272B42810087F250 /* FavoriteItem.swift in Sources */,
374924E729215FB60017D862 /* TapRecognizerViewModifier.swift in Sources */, 374924E729215FB60017D862 /* TapRecognizerViewModifier.swift in Sources */,
3773B8072ADC076800B5FEF3 /* UIResponder+Extensions.swift in Sources */,
373197D92732015300EF734F /* RelatedView.swift in Sources */, 373197D92732015300EF734F /* RelatedView.swift in Sources */,
3710A55529488C7D006F8025 /* PlaceholderListItem.swift in Sources */, 3710A55529488C7D006F8025 /* PlaceholderListItem.swift in Sources */,
37F4AD1B28612B23004D0F66 /* OpeningStream.swift in Sources */, 37F4AD1B28612B23004D0F66 /* OpeningStream.swift in Sources */,
@@ -2974,6 +3093,7 @@
370E990A2A1EA8C500D144E9 /* WatchModel.swift in Sources */, 370E990A2A1EA8C500D144E9 /* WatchModel.swift in Sources */,
371AC0B6294D1D6E0085989E /* PlayingIndicatorView.swift in Sources */, 371AC0B6294D1D6E0085989E /* PlayingIndicatorView.swift in Sources */,
37E084AC2753D95F00039B7D /* AccountsNavigationLink.swift in Sources */, 37E084AC2753D95F00039B7D /* AccountsNavigationLink.swift in Sources */,
3773B7FE2ADC076800B5FEF3 /* RefreshControl.swift in Sources */,
378E9C38294552A700B2D696 /* ThumbnailView.swift in Sources */, 378E9C38294552A700B2D696 /* ThumbnailView.swift in Sources */,
37732FF42703D32400F04329 /* Sidebar.swift in Sources */, 37732FF42703D32400F04329 /* Sidebar.swift in Sources */,
37D4B19726717E1500C925CA /* Video.swift in Sources */, 37D4B19726717E1500C925CA /* Video.swift in Sources */,
@@ -3015,6 +3135,7 @@
3784CDE227772EE40055BBF2 /* Watch.swift in Sources */, 3784CDE227772EE40055BBF2 /* Watch.swift in Sources */,
37FB285E272225E800A57617 /* ContentItemView.swift in Sources */, 37FB285E272225E800A57617 /* ContentItemView.swift in Sources */,
3797758B2689345500DD52A8 /* Store.swift in Sources */, 3797758B2689345500DD52A8 /* Store.swift in Sources */,
3773B80D2ADC076800B5FEF3 /* FramePreferenceKey.swift in Sources */,
377F9F7B294403F20043F856 /* VideosCacheModel.swift in Sources */, 377F9F7B294403F20043F856 /* VideosCacheModel.swift in Sources */,
37B795902771DAE0001CF27B /* OpenURLHandler.swift in Sources */, 37B795902771DAE0001CF27B /* OpenURLHandler.swift in Sources */,
37732FF02703A26300F04329 /* AccountValidationStatus.swift in Sources */, 37732FF02703A26300F04329 /* AccountValidationStatus.swift in Sources */,
@@ -3029,6 +3150,7 @@
374710062755291C00CE0F87 /* SearchTextField.swift in Sources */, 374710062755291C00CE0F87 /* SearchTextField.swift in Sources */,
37B7CFEC2A197844001B0564 /* AppleAVPlayerView.swift in Sources */, 37B7CFEC2A197844001B0564 /* AppleAVPlayerView.swift in Sources */,
37F0F4EB286F397E00C06C2E /* SettingsModel.swift in Sources */, 37F0F4EB286F397E00C06C2E /* SettingsModel.swift in Sources */,
378AE93F274EDFB5006A4EE1 /* Tint+Backport.swift in Sources */,
379ACB4D2A1F8A4100E01914 /* NSManagedObjectContext+ExecuteAndMergeChanges.swift in Sources */, 379ACB4D2A1F8A4100E01914 /* NSManagedObjectContext+ExecuteAndMergeChanges.swift in Sources */,
37C194C826F6A9C8005D3B96 /* RecentsModel.swift in Sources */, 37C194C826F6A9C8005D3B96 /* RecentsModel.swift in Sources */,
37737786276F9858000521C1 /* Windows.swift in Sources */, 37737786276F9858000521C1 /* Windows.swift in Sources */,
@@ -3079,6 +3201,7 @@
37192D5828B179D60012EEDD /* ChaptersView.swift in Sources */, 37192D5828B179D60012EEDD /* ChaptersView.swift in Sources */,
3784CDE327772EE40055BBF2 /* Watch.swift in Sources */, 3784CDE327772EE40055BBF2 /* Watch.swift in Sources */,
371AC0B7294D1D6E0085989E /* PlayingIndicatorView.swift in Sources */, 371AC0B7294D1D6E0085989E /* PlayingIndicatorView.swift in Sources */,
3773B8182ADC081300B5FEF3 /* VisualEffectBlur-macOS.swift in Sources */,
37E80F3D287B107F00561799 /* VideoDetailsOverlay.swift in Sources */, 37E80F3D287B107F00561799 /* VideoDetailsOverlay.swift in Sources */,
375DFB5926F9DA010013F468 /* InstancesModel.swift in Sources */, 375DFB5926F9DA010013F468 /* InstancesModel.swift in Sources */,
3705B183267B4E4900704544 /* TrendingCategory.swift in Sources */, 3705B183267B4E4900704544 /* TrendingCategory.swift in Sources */,
@@ -3109,6 +3232,8 @@
37EAD870267B9ED100D9E01B /* Segment.swift in Sources */, 37EAD870267B9ED100D9E01B /* Segment.swift in Sources */,
3788AC2826F6840700F6BAA9 /* FavoriteItemView.swift in Sources */, 3788AC2826F6840700F6BAA9 /* FavoriteItemView.swift in Sources */,
377FF88C291A60310028EB0B /* OpenVideosModel.swift in Sources */, 377FF88C291A60310028EB0B /* OpenVideosModel.swift in Sources */,
378AE93A274EDFAF006A4EE1 /* Badge+Backport.swift in Sources */,
3773B8162ADC081300B5FEF3 /* VisualEffectBlur-iOS.swift in Sources */,
37599F35272B44000087F250 /* FavoritesModel.swift in Sources */, 37599F35272B44000087F250 /* FavoritesModel.swift in Sources */,
376527BC285F60F700102284 /* PlayerTimeModel.swift in Sources */, 376527BC285F60F700102284 /* PlayerTimeModel.swift in Sources */,
37F64FE526FE70A60081B69E /* RedrawOnModifier.swift in Sources */, 37F64FE526FE70A60081B69E /* RedrawOnModifier.swift in Sources */,
@@ -3170,6 +3295,7 @@
3748186F26A769D60084E870 /* DetailBadge.swift in Sources */, 3748186F26A769D60084E870 /* DetailBadge.swift in Sources */,
3744A96128B99ADD005DE0A7 /* PlayerControlsLayout.swift in Sources */, 3744A96128B99ADD005DE0A7 /* PlayerControlsLayout.swift in Sources */,
372915E72687E3B900F5A35B /* Defaults.swift in Sources */, 372915E72687E3B900F5A35B /* Defaults.swift in Sources */,
377E17152928265900894889 /* ListRowSeparator+Backport.swift in Sources */,
371CC76929466ED000979C1A /* AccountsView.swift in Sources */, 371CC76929466ED000979C1A /* AccountsView.swift in Sources */,
37C3A242272359900087A57A /* Double+Format.swift in Sources */, 37C3A242272359900087A57A /* Double+Format.swift in Sources */,
37B795912771DAE0001CF27B /* OpenURLHandler.swift in Sources */, 37B795912771DAE0001CF27B /* OpenURLHandler.swift in Sources */,
@@ -3279,6 +3405,7 @@
377ABC41286E4AD5009C986F /* InstancesManifest.swift in Sources */, 377ABC41286E4AD5009C986F /* InstancesManifest.swift in Sources */,
373CFAF02697A78B003CB2C6 /* AddToPlaylistView.swift in Sources */, 373CFAF02697A78B003CB2C6 /* AddToPlaylistView.swift in Sources */,
3763495226DFF59D00B9A393 /* AppSidebarRecents.swift in Sources */, 3763495226DFF59D00B9A393 /* AppSidebarRecents.swift in Sources */,
3773B80E2ADC076800B5FEF3 /* FramePreferenceKey.swift in Sources */,
370015AA28BBAE7F000149FD /* ProgressBar.swift in Sources */, 370015AA28BBAE7F000149FD /* ProgressBar.swift in Sources */,
371B7E672759786B00D21217 /* Comment+Fixtures.swift in Sources */, 371B7E672759786B00D21217 /* Comment+Fixtures.swift in Sources */,
3769C02F2779F18600DDB3EA /* PlaceholderProgressView.swift in Sources */, 3769C02F2779F18600DDB3EA /* PlaceholderProgressView.swift in Sources */,
@@ -3410,6 +3537,7 @@
376BE50D27349108009AD608 /* BrowsingSettings.swift in Sources */, 376BE50D27349108009AD608 /* BrowsingSettings.swift in Sources */,
37CFB48728AFE2510070024C /* VideoDescription.swift in Sources */, 37CFB48728AFE2510070024C /* VideoDescription.swift in Sources */,
37DD87C9271C9CFE0027CBF9 /* PlayerStreams.swift in Sources */, 37DD87C9271C9CFE0027CBF9 /* PlayerStreams.swift in Sources */,
378AE93E274EDFB4006A4EE1 /* Tint+Backport.swift in Sources */,
37FFC442272734C3009FFD26 /* Throttle.swift in Sources */, 37FFC442272734C3009FFD26 /* Throttle.swift in Sources */,
377FF88D291A60310028EB0B /* OpenVideosModel.swift in Sources */, 377FF88D291A60310028EB0B /* OpenVideosModel.swift in Sources */,
37F4AD2828613B81004D0F66 /* Color+Debug.swift in Sources */, 37F4AD2828613B81004D0F66 /* Color+Debug.swift in Sources */,
@@ -3438,6 +3566,7 @@
37A362C429537FED00BDF328 /* PlaybackSettingsPresentationDetents+Backport.swift in Sources */, 37A362C429537FED00BDF328 /* PlaybackSettingsPresentationDetents+Backport.swift in Sources */,
37BDFF1929487B99000C6404 /* PlaylistVideosView.swift in Sources */, 37BDFF1929487B99000C6404 /* PlaylistVideosView.swift in Sources */,
37B7CFEF2A197A08001B0564 /* SafeAreaModel.swift in Sources */, 37B7CFEF2A197A08001B0564 /* SafeAreaModel.swift in Sources */,
3773B8092ADC076800B5FEF3 /* UIResponder+Extensions.swift in Sources */,
37C0698427260B2100F7F6CB /* ThumbnailsModel.swift in Sources */, 37C0698427260B2100F7F6CB /* ThumbnailsModel.swift in Sources */,
374924DC2921050B0017D862 /* LocationsSettings.swift in Sources */, 374924DC2921050B0017D862 /* LocationsSettings.swift in Sources */,
37D6025B28C17375009E8D98 /* PlaybackStatsView.swift in Sources */, 37D6025B28C17375009E8D98 /* PlaybackStatsView.swift in Sources */,
@@ -3452,6 +3581,7 @@
37B044B926F7AB9000E1419D /* SettingsView.swift in Sources */, 37B044B926F7AB9000E1419D /* SettingsView.swift in Sources */,
3743B86A27216D3600261544 /* ChannelCell.swift in Sources */, 3743B86A27216D3600261544 /* ChannelCell.swift in Sources */,
3751BA8527E6914F007B1A60 /* ReturnYouTubeDislikeAPI.swift in Sources */, 3751BA8527E6914F007B1A60 /* ReturnYouTubeDislikeAPI.swift in Sources */,
3773B8062ADC076800B5FEF3 /* UIView+Extensions.swift in Sources */,
37769250294630110055EC18 /* ChannelAvatarView.swift in Sources */, 37769250294630110055EC18 /* ChannelAvatarView.swift in Sources */,
37030FFD27B0398000ECDDAA /* MPVClient.swift in Sources */, 37030FFD27B0398000ECDDAA /* MPVClient.swift in Sources */,
378E9C4229455A5800B2D696 /* ChannelsView.swift in Sources */, 378E9C4229455A5800B2D696 /* ChannelsView.swift in Sources */,
@@ -3530,6 +3660,7 @@
37C069802725C8D400F7F6CB /* CMTime+DefaultTimescale.swift in Sources */, 37C069802725C8D400F7F6CB /* CMTime+DefaultTimescale.swift in Sources */,
37EBD8CC27AF26C200F1C24B /* MPVBackend.swift in Sources */, 37EBD8CC27AF26C200F1C24B /* MPVBackend.swift in Sources */,
3711404126B206A6005B3555 /* SearchModel.swift in Sources */, 3711404126B206A6005B3555 /* SearchModel.swift in Sources */,
3773B80F2ADC076800B5FEF3 /* FramePreferenceKey.swift in Sources */,
37FD77022932C4DA00D91A5F /* URL+ByReplacingYatteeProtocol.swift in Sources */, 37FD77022932C4DA00D91A5F /* URL+ByReplacingYatteeProtocol.swift in Sources */,
37FEF11527EFD8580033912F /* PlaceholderCell.swift in Sources */, 37FEF11527EFD8580033912F /* PlaceholderCell.swift in Sources */,
37FD43F02704A9C00073EE42 /* RecentsModel.swift in Sources */, 37FD43F02704A9C00073EE42 /* RecentsModel.swift in Sources */,
@@ -3550,6 +3681,7 @@
37D9BA0829507F69002586BD /* PlayerControlsSettings.swift in Sources */, 37D9BA0829507F69002586BD /* PlayerControlsSettings.swift in Sources */,
37599F32272B42810087F250 /* FavoriteItem.swift in Sources */, 37599F32272B42810087F250 /* FavoriteItem.swift in Sources */,
37E8B0EE27B326C00024006F /* TimelineView.swift in Sources */, 37E8B0EE27B326C00024006F /* TimelineView.swift in Sources */,
3726386E2948A4B80043702D /* Badge+Backport.swift in Sources */,
37141675267A8E10006CA35D /* Country.swift in Sources */, 37141675267A8E10006CA35D /* Country.swift in Sources */,
370F500C27CC1821001B35DC /* MPVViewController.swift in Sources */, 370F500C27CC1821001B35DC /* MPVViewController.swift in Sources */,
3782B9542755667600990149 /* String+Format.swift in Sources */, 3782B9542755667600990149 /* String+Format.swift in Sources */,
@@ -3587,10 +3719,12 @@
3761ABFF26F0F8DE00AA496F /* EnvironmentValues.swift in Sources */, 3761ABFF26F0F8DE00AA496F /* EnvironmentValues.swift in Sources */,
37C3A24F272360470087A57A /* ChannelPlaylist+Fixtures.swift in Sources */, 37C3A24F272360470087A57A /* ChannelPlaylist+Fixtures.swift in Sources */,
3718B9A02921A9620003DB2E /* VideoDetailsOverlay.swift in Sources */, 3718B9A02921A9620003DB2E /* VideoDetailsOverlay.swift in Sources */,
377E17162928265900894889 /* ListRowSeparator+Backport.swift in Sources */,
37FB28432721B22200A57617 /* ContentItem.swift in Sources */, 37FB28432721B22200A57617 /* ContentItem.swift in Sources */,
37D2E0D228B67DBC00F64D52 /* AnimationCompletionObserverModifier.swift in Sources */, 37D2E0D228B67DBC00F64D52 /* AnimationCompletionObserverModifier.swift in Sources */,
37AAF2A226741C97007FC770 /* FeedView.swift in Sources */, 37AAF2A226741C97007FC770 /* FeedView.swift in Sources */,
37484C1B26FC837400287258 /* PlayerSettings.swift in Sources */, 37484C1B26FC837400287258 /* PlayerSettings.swift in Sources */,
3773B8122ADC076800B5FEF3 /* ScrollViewMatcher.swift in Sources */,
372915E82687E3B900F5A35B /* Defaults.swift in Sources */, 372915E82687E3B900F5A35B /* Defaults.swift in Sources */,
37BAB54C269B39FD00E75ED1 /* TVNavigationView.swift in Sources */, 37BAB54C269B39FD00E75ED1 /* TVNavigationView.swift in Sources */,
3718B9A62921A9BE0003DB2E /* PreferenceKeys.swift in Sources */, 3718B9A62921A9BE0003DB2E /* PreferenceKeys.swift in Sources */,
@@ -3667,7 +3801,7 @@
CODE_SIGN_ENTITLEMENTS = "Open in Yattee/Open in Yattee.entitlements"; CODE_SIGN_ENTITLEMENTS = "Open in Yattee/Open in Yattee.entitlements";
CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 164; CURRENT_PROJECT_VERSION = 170;
GENERATE_INFOPLIST_FILE = YES; GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = "Open in Yattee/Info.plist"; INFOPLIST_FILE = "Open in Yattee/Info.plist";
INFOPLIST_KEY_CFBundleDisplayName = "Open in Yattee"; INFOPLIST_KEY_CFBundleDisplayName = "Open in Yattee";
@@ -3678,7 +3812,7 @@
"@executable_path/Frameworks", "@executable_path/Frameworks",
"@executable_path/../../Frameworks", "@executable_path/../../Frameworks",
); );
MARKETING_VERSION = 1.5; MARKETING_VERSION = 1.5.1;
PRODUCT_BUNDLE_IDENTIFIER = "stream.yattee.app.Open-in-Yattee"; PRODUCT_BUNDLE_IDENTIFIER = "stream.yattee.app.Open-in-Yattee";
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = ""; PROVISIONING_PROFILE_SPECIFIER = "";
@@ -3698,7 +3832,7 @@
CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_IDENTITY = "Apple Development";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
CODE_SIGN_STYLE = Manual; CODE_SIGN_STYLE = Manual;
CURRENT_PROJECT_VERSION = 164; CURRENT_PROJECT_VERSION = 170;
"DEVELOPMENT_TEAM[sdk=iphoneos*]" = 78Z5H3M6RJ; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 78Z5H3M6RJ;
GENERATE_INFOPLIST_FILE = YES; GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = "Open in Yattee/Info.plist"; INFOPLIST_FILE = "Open in Yattee/Info.plist";
@@ -3710,7 +3844,7 @@
"@executable_path/Frameworks", "@executable_path/Frameworks",
"@executable_path/../../Frameworks", "@executable_path/../../Frameworks",
); );
MARKETING_VERSION = 1.5; MARKETING_VERSION = 1.5.1;
PRODUCT_BUNDLE_IDENTIFIER = "stream.yattee.app.Open-in-Yattee"; PRODUCT_BUNDLE_IDENTIFIER = "stream.yattee.app.Open-in-Yattee";
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = ""; PROVISIONING_PROFILE_SPECIFIER = "";
@@ -3729,11 +3863,11 @@
buildSettings = { buildSettings = {
CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; CLANG_CXX_LANGUAGE_STANDARD = "gnu++17";
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 164; CURRENT_PROJECT_VERSION = 170;
GENERATE_INFOPLIST_FILE = YES; GENERATE_INFOPLIST_FILE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 14.0; IPHONEOS_DEPLOYMENT_TARGET = 14.0;
MACOSX_DEPLOYMENT_TARGET = 11.0; MACOSX_DEPLOYMENT_TARGET = 11.0;
MARKETING_VERSION = 1.5; MARKETING_VERSION = 1.5.1;
PRODUCT_BUNDLE_IDENTIFIER = "net.arekf.Shared-Tests"; PRODUCT_BUNDLE_IDENTIFIER = "net.arekf.Shared-Tests";
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
SDKROOT = auto; SDKROOT = auto;
@@ -3749,11 +3883,11 @@
buildSettings = { buildSettings = {
CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; CLANG_CXX_LANGUAGE_STANDARD = "gnu++17";
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 164; CURRENT_PROJECT_VERSION = 170;
GENERATE_INFOPLIST_FILE = YES; GENERATE_INFOPLIST_FILE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 14.0; IPHONEOS_DEPLOYMENT_TARGET = 14.0;
MACOSX_DEPLOYMENT_TARGET = 11.0; MACOSX_DEPLOYMENT_TARGET = 11.0;
MARKETING_VERSION = 1.5; MARKETING_VERSION = 1.5.1;
PRODUCT_BUNDLE_IDENTIFIER = "net.arekf.Shared-Tests"; PRODUCT_BUNDLE_IDENTIFIER = "net.arekf.Shared-Tests";
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
SDKROOT = auto; SDKROOT = auto;
@@ -3913,7 +4047,7 @@
CODE_SIGN_ENTITLEMENTS = "iOS/Yattee (iOS).entitlements"; CODE_SIGN_ENTITLEMENTS = "iOS/Yattee (iOS).entitlements";
CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 164; CURRENT_PROJECT_VERSION = 170;
ENABLE_PREVIEWS = YES; ENABLE_PREVIEWS = YES;
GCC_PREPROCESSOR_DEFINITIONS = ( GCC_PREPROCESSOR_DEFINITIONS = (
"DEBUG=1", "DEBUG=1",
@@ -3931,13 +4065,13 @@
INFOPLIST_KEY_UIRequiresFullScreen = YES; INFOPLIST_KEY_UIRequiresFullScreen = YES;
INFOPLIST_KEY_UIStatusBarHidden = NO; INFOPLIST_KEY_UIStatusBarHidden = NO;
INFOPLIST_KEY_UISupportedInterfaceOrientations = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UIInterfaceOrientationPortraitUpsideDown"; INFOPLIST_KEY_UISupportedInterfaceOrientations = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UIInterfaceOrientationPortraitUpsideDown";
IPHONEOS_DEPLOYMENT_TARGET = 15.0; IPHONEOS_DEPLOYMENT_TARGET = 14.0;
LD_RUNPATH_SEARCH_PATHS = ( LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
); );
LIBRARY_SEARCH_PATHS = "$(inherited)"; LIBRARY_SEARCH_PATHS = "$(inherited)";
MARKETING_VERSION = 1.5; MARKETING_VERSION = 1.5.1;
OTHER_LDFLAGS = ( OTHER_LDFLAGS = (
"-lstdc++", "-lstdc++",
"-Wl,-no_compact_unwind", "-Wl,-no_compact_unwind",
@@ -3966,7 +4100,7 @@
CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_IDENTITY = "Apple Development";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
CODE_SIGN_STYLE = Manual; CODE_SIGN_STYLE = Manual;
CURRENT_PROJECT_VERSION = 164; CURRENT_PROJECT_VERSION = 170;
"DEVELOPMENT_TEAM[sdk=iphoneos*]" = 78Z5H3M6RJ; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 78Z5H3M6RJ;
ENABLE_PREVIEWS = YES; ENABLE_PREVIEWS = YES;
GCC_PREPROCESSOR_DEFINITIONS = "GLES_SILENCE_DEPRECATION=1"; GCC_PREPROCESSOR_DEFINITIONS = "GLES_SILENCE_DEPRECATION=1";
@@ -3981,13 +4115,13 @@
INFOPLIST_KEY_UIRequiresFullScreen = YES; INFOPLIST_KEY_UIRequiresFullScreen = YES;
INFOPLIST_KEY_UIStatusBarHidden = NO; INFOPLIST_KEY_UIStatusBarHidden = NO;
INFOPLIST_KEY_UISupportedInterfaceOrientations = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UIInterfaceOrientationPortraitUpsideDown"; INFOPLIST_KEY_UISupportedInterfaceOrientations = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UIInterfaceOrientationPortraitUpsideDown";
IPHONEOS_DEPLOYMENT_TARGET = 15.0; IPHONEOS_DEPLOYMENT_TARGET = 14.0;
LD_RUNPATH_SEARCH_PATHS = ( LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
); );
LIBRARY_SEARCH_PATHS = "$(inherited)"; LIBRARY_SEARCH_PATHS = "$(inherited)";
MARKETING_VERSION = 1.5; MARKETING_VERSION = 1.5.1;
OTHER_LDFLAGS = ( OTHER_LDFLAGS = (
"-lstdc++", "-lstdc++",
"-Wl,-no_compact_unwind", "-Wl,-no_compact_unwind",
@@ -4018,7 +4152,7 @@
CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
COMBINE_HIDPI_IMAGES = YES; COMBINE_HIDPI_IMAGES = YES;
CURRENT_PROJECT_VERSION = 164; CURRENT_PROJECT_VERSION = 170;
DEAD_CODE_STRIPPING = YES; DEAD_CODE_STRIPPING = YES;
ENABLE_APP_SANDBOX = YES; ENABLE_APP_SANDBOX = YES;
ENABLE_HARDENED_RUNTIME = YES; ENABLE_HARDENED_RUNTIME = YES;
@@ -4033,8 +4167,8 @@
"@executable_path/../Frameworks", "@executable_path/../Frameworks",
); );
LIBRARY_SEARCH_PATHS = "$(inherited)"; LIBRARY_SEARCH_PATHS = "$(inherited)";
MACOSX_DEPLOYMENT_TARGET = 12.0; MACOSX_DEPLOYMENT_TARGET = 11.0;
MARKETING_VERSION = 1.5; MARKETING_VERSION = 1.5.1;
OTHER_LDFLAGS = "-Wl,-no_compact_unwind"; OTHER_LDFLAGS = "-Wl,-no_compact_unwind";
PRODUCT_BUNDLE_IDENTIFIER = stream.yattee.app; PRODUCT_BUNDLE_IDENTIFIER = stream.yattee.app;
PRODUCT_NAME = Yattee; PRODUCT_NAME = Yattee;
@@ -4057,7 +4191,7 @@
"CODE_SIGN_IDENTITY[sdk=macosx*]" = "3rd Party Mac Developer Application"; "CODE_SIGN_IDENTITY[sdk=macosx*]" = "3rd Party Mac Developer Application";
CODE_SIGN_STYLE = Manual; CODE_SIGN_STYLE = Manual;
COMBINE_HIDPI_IMAGES = YES; COMBINE_HIDPI_IMAGES = YES;
CURRENT_PROJECT_VERSION = 164; CURRENT_PROJECT_VERSION = 170;
DEAD_CODE_STRIPPING = YES; DEAD_CODE_STRIPPING = YES;
"DEVELOPMENT_TEAM[sdk=macosx*]" = 78Z5H3M6RJ; "DEVELOPMENT_TEAM[sdk=macosx*]" = 78Z5H3M6RJ;
ENABLE_APP_SANDBOX = YES; ENABLE_APP_SANDBOX = YES;
@@ -4073,8 +4207,8 @@
"@executable_path/../Frameworks", "@executable_path/../Frameworks",
); );
LIBRARY_SEARCH_PATHS = "$(inherited)"; LIBRARY_SEARCH_PATHS = "$(inherited)";
MACOSX_DEPLOYMENT_TARGET = 12.0; MACOSX_DEPLOYMENT_TARGET = 11.0;
MARKETING_VERSION = 1.5; MARKETING_VERSION = 1.5.1;
OTHER_LDFLAGS = "-Wl,-no_compact_unwind"; OTHER_LDFLAGS = "-Wl,-no_compact_unwind";
PRODUCT_BUNDLE_IDENTIFIER = stream.yattee.app; PRODUCT_BUNDLE_IDENTIFIER = stream.yattee.app;
PRODUCT_NAME = Yattee; PRODUCT_NAME = Yattee;
@@ -4092,7 +4226,7 @@
buildSettings = { buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 164; CURRENT_PROJECT_VERSION = 170;
GENERATE_INFOPLIST_FILE = YES; GENERATE_INFOPLIST_FILE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 15.0; IPHONEOS_DEPLOYMENT_TARGET = 15.0;
LD_RUNPATH_SEARCH_PATHS = ( LD_RUNPATH_SEARCH_PATHS = (
@@ -4100,7 +4234,7 @@
"@executable_path/Frameworks", "@executable_path/Frameworks",
"@loader_path/Frameworks", "@loader_path/Frameworks",
); );
MARKETING_VERSION = 1.5; MARKETING_VERSION = 1.5.1;
PRODUCT_BUNDLE_IDENTIFIER = "stream.yattee.Tests-iOS"; PRODUCT_BUNDLE_IDENTIFIER = "stream.yattee.Tests-iOS";
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
SDKROOT = iphoneos; SDKROOT = iphoneos;
@@ -4116,7 +4250,7 @@
buildSettings = { buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 164; CURRENT_PROJECT_VERSION = 170;
GENERATE_INFOPLIST_FILE = YES; GENERATE_INFOPLIST_FILE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 15.0; IPHONEOS_DEPLOYMENT_TARGET = 15.0;
LD_RUNPATH_SEARCH_PATHS = ( LD_RUNPATH_SEARCH_PATHS = (
@@ -4124,7 +4258,7 @@
"@executable_path/Frameworks", "@executable_path/Frameworks",
"@loader_path/Frameworks", "@loader_path/Frameworks",
); );
MARKETING_VERSION = 1.5; MARKETING_VERSION = 1.5.1;
PRODUCT_BUNDLE_IDENTIFIER = "stream.yattee.Tests-iOS"; PRODUCT_BUNDLE_IDENTIFIER = "stream.yattee.Tests-iOS";
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
SDKROOT = iphoneos; SDKROOT = iphoneos;
@@ -4142,7 +4276,7 @@
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
COMBINE_HIDPI_IMAGES = YES; COMBINE_HIDPI_IMAGES = YES;
CURRENT_PROJECT_VERSION = 164; CURRENT_PROJECT_VERSION = 170;
DEAD_CODE_STRIPPING = YES; DEAD_CODE_STRIPPING = YES;
GENERATE_INFOPLIST_FILE = YES; GENERATE_INFOPLIST_FILE = YES;
LD_RUNPATH_SEARCH_PATHS = ( LD_RUNPATH_SEARCH_PATHS = (
@@ -4151,7 +4285,7 @@
"@loader_path/../Frameworks", "@loader_path/../Frameworks",
); );
MACOSX_DEPLOYMENT_TARGET = 12.0; MACOSX_DEPLOYMENT_TARGET = 12.0;
MARKETING_VERSION = 1.5; MARKETING_VERSION = 1.5.1;
PRODUCT_BUNDLE_IDENTIFIER = "stream.yattee.Tests-macOS"; PRODUCT_BUNDLE_IDENTIFIER = "stream.yattee.Tests-macOS";
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
SDKROOT = macosx; SDKROOT = macosx;
@@ -4167,7 +4301,7 @@
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
COMBINE_HIDPI_IMAGES = YES; COMBINE_HIDPI_IMAGES = YES;
CURRENT_PROJECT_VERSION = 164; CURRENT_PROJECT_VERSION = 170;
DEAD_CODE_STRIPPING = YES; DEAD_CODE_STRIPPING = YES;
GENERATE_INFOPLIST_FILE = YES; GENERATE_INFOPLIST_FILE = YES;
LD_RUNPATH_SEARCH_PATHS = ( LD_RUNPATH_SEARCH_PATHS = (
@@ -4176,7 +4310,7 @@
"@loader_path/../Frameworks", "@loader_path/../Frameworks",
); );
MACOSX_DEPLOYMENT_TARGET = 12.0; MACOSX_DEPLOYMENT_TARGET = 12.0;
MARKETING_VERSION = 1.5; MARKETING_VERSION = 1.5.1;
PRODUCT_BUNDLE_IDENTIFIER = "stream.yattee.Tests-macOS"; PRODUCT_BUNDLE_IDENTIFIER = "stream.yattee.Tests-macOS";
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
SDKROOT = macosx; SDKROOT = macosx;
@@ -4193,7 +4327,7 @@
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 164; CURRENT_PROJECT_VERSION = 170;
DEVELOPMENT_ASSET_PATHS = ""; DEVELOPMENT_ASSET_PATHS = "";
ENABLE_PREVIEWS = YES; ENABLE_PREVIEWS = YES;
GENERATE_INFOPLIST_FILE = YES; GENERATE_INFOPLIST_FILE = YES;
@@ -4209,7 +4343,7 @@
"@executable_path/Frameworks", "@executable_path/Frameworks",
); );
LIBRARY_SEARCH_PATHS = "$(inherited)"; LIBRARY_SEARCH_PATHS = "$(inherited)";
MARKETING_VERSION = 1.5; MARKETING_VERSION = 1.5.1;
OTHER_LDFLAGS = ( OTHER_LDFLAGS = (
"-Wl,-no_compact_unwind", "-Wl,-no_compact_unwind",
"-lstdc++", "-lstdc++",
@@ -4233,7 +4367,7 @@
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
"CODE_SIGN_IDENTITY[sdk=appletvos*]" = "iPhone Distribution"; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = "iPhone Distribution";
CODE_SIGN_STYLE = Manual; CODE_SIGN_STYLE = Manual;
CURRENT_PROJECT_VERSION = 164; CURRENT_PROJECT_VERSION = 170;
DEVELOPMENT_ASSET_PATHS = ""; DEVELOPMENT_ASSET_PATHS = "";
"DEVELOPMENT_TEAM[sdk=appletvos*]" = 78Z5H3M6RJ; "DEVELOPMENT_TEAM[sdk=appletvos*]" = 78Z5H3M6RJ;
ENABLE_PREVIEWS = YES; ENABLE_PREVIEWS = YES;
@@ -4250,7 +4384,7 @@
"@executable_path/Frameworks", "@executable_path/Frameworks",
); );
LIBRARY_SEARCH_PATHS = "$(inherited)"; LIBRARY_SEARCH_PATHS = "$(inherited)";
MARKETING_VERSION = 1.5; MARKETING_VERSION = 1.5.1;
OTHER_LDFLAGS = ( OTHER_LDFLAGS = (
"-Wl,-no_compact_unwind", "-Wl,-no_compact_unwind",
"-lstdc++", "-lstdc++",
@@ -4274,14 +4408,14 @@
buildSettings = { buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 164; CURRENT_PROJECT_VERSION = 170;
GENERATE_INFOPLIST_FILE = YES; GENERATE_INFOPLIST_FILE = YES;
LD_RUNPATH_SEARCH_PATHS = ( LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
"@loader_path/Frameworks", "@loader_path/Frameworks",
); );
MARKETING_VERSION = 1.5; MARKETING_VERSION = 1.5.1;
PRODUCT_BUNDLE_IDENTIFIER = stream.yattee.YatteeUITests; PRODUCT_BUNDLE_IDENTIFIER = stream.yattee.YatteeUITests;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
SDKROOT = appletvos; SDKROOT = appletvos;
@@ -4298,14 +4432,14 @@
buildSettings = { buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 164; CURRENT_PROJECT_VERSION = 170;
GENERATE_INFOPLIST_FILE = YES; GENERATE_INFOPLIST_FILE = YES;
LD_RUNPATH_SEARCH_PATHS = ( LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
"@loader_path/Frameworks", "@loader_path/Frameworks",
); );
MARKETING_VERSION = 1.5; MARKETING_VERSION = 1.5.1;
PRODUCT_BUNDLE_IDENTIFIER = stream.yattee.YatteeUITests; PRODUCT_BUNDLE_IDENTIFIER = stream.yattee.YatteeUITests;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
SDKROOT = appletvos; SDKROOT = appletvos;
@@ -4608,8 +4742,8 @@
isa = XCRemoteSwiftPackageReference; isa = XCRemoteSwiftPackageReference;
repositoryURL = "https://github.com/cxfksword/MPVKit.git"; repositoryURL = "https://github.com/cxfksword/MPVKit.git";
requirement = { requirement = {
kind = upToNextMajorVersion; branch = main;
minimumVersion = 0.35.1; kind = branch;
}; };
}; };
/* End XCRemoteSwiftPackageReference section */ /* End XCRemoteSwiftPackageReference section */

View File

@@ -14,8 +14,8 @@
"kind" : "remoteSourceControl", "kind" : "remoteSourceControl",
"location" : "https://github.com/Alamofire/Alamofire.git", "location" : "https://github.com/Alamofire/Alamofire.git",
"state" : { "state" : {
"revision" : "b2fa556e4e48cbf06cf8c63def138c98f4b811fa", "revision" : "3dc6a42c7727c49bf26508e29b0a0b35f9c7e1ad",
"version" : "5.8.0" "version" : "5.8.1"
} }
}, },
{ {
@@ -42,7 +42,7 @@
"location" : "https://github.com/kishikawakatsumi/KeychainAccess.git", "location" : "https://github.com/kishikawakatsumi/KeychainAccess.git",
"state" : { "state" : {
"branch" : "master", "branch" : "master",
"revision" : "ecb18d8ce4d88277cc4fb103973352d91e18c535" "revision" : "e0c7eebc5a4465a3c4680764f26b7a61f567cdaf"
} }
}, },
{ {
@@ -59,8 +59,8 @@
"kind" : "remoteSourceControl", "kind" : "remoteSourceControl",
"location" : "https://github.com/cxfksword/MPVKit.git", "location" : "https://github.com/cxfksword/MPVKit.git",
"state" : { "state" : {
"revision" : "96825b3dc2b38e5550268156148d47798ce6aa74", "branch" : "main",
"version" : "0.36.0" "revision" : "dca1e345a26d09a3d621d7656a94e6427f3f7b83"
} }
}, },
{ {
@@ -105,7 +105,7 @@
"location" : "https://github.com/SDWebImage/SDWebImage", "location" : "https://github.com/SDWebImage/SDWebImage",
"state" : { "state" : {
"branch" : "master", "branch" : "master",
"revision" : "936f1c7067728d16c362ba4fb93c17df78b5fd79" "revision" : "191b94cd545274603fcffce275dd4c1247587b6e"
} }
}, },
{ {
@@ -122,8 +122,8 @@
"kind" : "remoteSourceControl", "kind" : "remoteSourceControl",
"location" : "https://github.com/SDWebImage/SDWebImageSwiftUI.git", "location" : "https://github.com/SDWebImage/SDWebImageSwiftUI.git",
"state" : { "state" : {
"revision" : "e837c37d45449fbd3b4745c10c5b5274e73edead", "revision" : "5f025e54a03d3d33dff24d7a19331f446f00ed9d",
"version" : "2.2.3" "version" : "2.2.4"
} }
}, },
{ {
@@ -131,8 +131,8 @@
"kind" : "remoteSourceControl", "kind" : "remoteSourceControl",
"location" : "https://github.com/SDWebImage/SDWebImageWebPCoder.git", "location" : "https://github.com/SDWebImage/SDWebImageWebPCoder.git",
"state" : { "state" : {
"revision" : "3819cb70faa2454b54d8364779bfacd8c216a6e2", "revision" : "db4603921b31a6ce0f8c26d36d6a3fffc2dba481",
"version" : "0.13.0" "version" : "0.14.2"
} }
}, },
{ {

View File

@@ -38,7 +38,7 @@ struct InstancesSettings: View {
if !selectedInstance.isNil, selectedInstance.app.supportsAccounts { if !selectedInstance.isNil, selectedInstance.app.supportsAccounts {
SettingsHeader(text: "Accounts".localized()) SettingsHeader(text: "Accounts".localized())
List(selection: $selectedAccount) { let list = List(selection: $selectedAccount) {
if selectedInstanceAccounts.isEmpty { if selectedInstanceAccounts.isEmpty {
Text("You have no accounts for this location") Text("You have no accounts for this location")
.foregroundColor(.secondary) .foregroundColor(.secondary)
@@ -69,7 +69,13 @@ struct InstancesSettings: View {
.tag(account) .tag(account)
} }
} }
if #available(macOS 12.0, *) {
list
.listStyle(.inset(alternatesRowBackgrounds: true)) .listStyle(.inset(alternatesRowBackgrounds: true))
} else {
list
}
} }
if selectedInstance != nil, selectedInstance.app.hasFrontendURL { if selectedInstance != nil, selectedInstance.app.hasFrontendURL {

View File

@@ -4,6 +4,7 @@ final class MPVOGLView: NSView {
override init(frame frameRect: CGRect) { override init(frame frameRect: CGRect) {
super.init(frame: frameRect) super.init(frame: frameRect)
autoresizingMask = [.width, .height] autoresizingMask = [.width, .height]
wantsBestResolutionOpenGLSurface = true
} }
@available(*, unavailable) @available(*, unavailable)