Compare commits

..

16 Commits

Author SHA1 Message Date
Arkadiusz Fal
af75afa912 Bump build number to 187 2024-07-06 13:51:40 +02:00
Arkadiusz Fal
f32bcae5eb Update CHANGELOG 2024-07-06 13:51:04 +02:00
Arkadiusz Fal
c55161b6b6 Fix typo 2024-07-06 13:44:40 +02:00
Arkadiusz Fal
3fd99f464a Revert change to OSD positions 2024-07-06 13:44:40 +02:00
Arkadiusz Fal
43c8484514 Allow import of accounts to manually added (not imported) instances 2024-07-06 13:44:40 +02:00
Arkadiusz Fal
7755b392b7 Fix seek OSD layout on tvOS
Fix #707
2024-07-06 12:51:07 +02:00
Arkadiusz Fal
e0998638b1 Fix macOS settings windows
Fix #699
Fix #710
2024-07-06 12:45:44 +02:00
Arkadiusz Fal
511a528eb6 Add import export of missing settings 2024-07-06 12:32:31 +02:00
Arkadiusz Fal
89dfbdb5c7 Fix swiftformat offenses 2024-07-06 11:48:49 +02:00
Arkadiusz Fal
f88a1d17d6 Update dependecies 2024-07-06 11:45:15 +02:00
Toni Förster
9e05909659 fix duplicated share button
fixes #691

add `--initial-audio-sync=<yes|no>` to MPV settings. Might fix #690 but needs to be toggled by the user. We leave the standard settings.

Also added links to the icons on macOS.
2024-07-06 11:35:21 +02:00
Arkadiusz Fal
b966f4509a Merge pull request #704 from patelhiren/subscriptions-account-picker
tvOS: Allow account picker by long pressing channels button in subscriptions view
2024-07-06 11:35:15 +02:00
Arkadiusz Fal
dc7073dcb5 Merge pull request #701 from weblate/weblate-yattee-localizable-strings
Translations update from Hosted Weblate
2024-07-06 11:28:49 +02:00
Hyunjae Chung
a258ee3be4 Translated using Weblate (Korean)
Currently translated at 11.2% (63 of 562 strings)

Translation: Yattee/Localizable.strings
Translate-URL: https://hosted.weblate.org/projects/yattee/localizable-strings/ko/
2024-06-19 15:09:16 +02:00
Hiren Patel
b626f50adc - tvOS: Allow account picker by long pressing channels button in subscription view. 2024-06-16 23:21:49 -04:00
Pieter Janssens
78dc47dc24 Translated using Weblate (Dutch)
Currently translated at 80.7% (454 of 562 strings)

Translation: Yattee/Localizable.strings
Translate-URL: https://hosted.weblate.org/projects/yattee/localizable-strings/nl/
2024-06-14 19:09:21 +00:00
31 changed files with 611 additions and 209 deletions

View File

@@ -1,7 +1,9 @@
## Build 186
* tvOS: Refined Subscriptions View by @patelhiren in https://github.com/yattee/yattee/pull/697
* More responsive UI when Favorites are used. by @stonerl in https://github.com/yattee/yattee/pull/695
* Improved conditional proxying by @stonerl in https://github.com/yattee/yattee/pull/696
## Build 187
* Allow import of accounts to manually added (not imported) instances
* Add import export of missing settings
* tvOS: Allow account picker by long pressing channels button in subscriptions view by @patelhiren in https://github.com/yattee/yattee/pull/704
* macOS: Fix settings windows layout
* Fix seek OSD layout on tvOS, revert OSD position
* Translations update from Hosted Weblate by @weblate in https://github.com/yattee/yattee/pull/694
## Previous builds
@@ -17,6 +19,9 @@
* History Setting: hide the recent activity in the sidebar or limit the number of items shown (by @rickykresslein)
* Fix issues with empty comments (by @stonerl)
* Improved Invidious comments (by @stonerl)
* tvOS: Refined Subscriptions View by @patelhiren in https://github.com/yattee/yattee/pull/697
* More responsive UI when Favorites are used. by @stonerl in https://github.com/yattee/yattee/pull/695
* Improved conditional proxying by @stonerl in https://github.com/yattee/yattee/pull/696
* Don't show related in sidebar when disabled in settings by @stonerl in https://github.com/yattee/yattee/pull/635
* Handle audio session interrupts by other media by @stonerl in https://github.com/yattee/yattee/pull/640
* Only show Queue header in sidebar view by @stonerl in https://github.com/yattee/yattee/pull/642

View File

@@ -1,6 +1,6 @@
source "https://rubygems.org"
gem 'fastlane', git: 'https://github.com/nekrich/fastlane.git', branch: 'fix/match-tvos-devices-fetch'
gem 'fastlane'
plugins_path = File.join(File.dirname(__FILE__), 'fastlane', 'Pluginfile')
eval_gemfile(plugins_path) if File.exist?(plugins_path)

View File

@@ -1,50 +1,3 @@
GIT
remote: https://github.com/nekrich/fastlane.git
revision: d2d51a9af37f9b04a157e78fd25d147cecc89980
branch: fix/match-tvos-devices-fetch
specs:
fastlane (2.219.0)
CFPropertyList (>= 2.3, < 4.0.0)
addressable (>= 2.8, < 3.0.0)
artifactory (~> 3.0)
aws-sdk-s3 (~> 1.0)
babosa (>= 1.0.3, < 2.0.0)
bundler (>= 1.12.0, < 3.0.0)
colored (~> 1.2)
commander (~> 4.6)
dotenv (>= 2.1.1, < 3.0.0)
emoji_regex (>= 0.1, < 4.0)
excon (>= 0.71.0, < 1.0.0)
faraday (~> 1.0)
faraday-cookie_jar (~> 0.0.6)
faraday_middleware (~> 1.0)
fastimage (>= 2.1.0, < 3.0.0)
gh_inspector (>= 1.1.2, < 2.0.0)
google-apis-androidpublisher_v3 (~> 0.3)
google-apis-playcustomapp_v1 (~> 0.1)
google-cloud-env (>= 1.6.0, < 2.0.0)
google-cloud-storage (~> 1.31)
highline (~> 2.0)
http-cookie (~> 1.0.5)
json (< 3.0.0)
jwt (>= 2.1.0, < 3)
mini_magick (>= 4.9.4, < 5.0.0)
multipart-post (>= 2.0.0, < 3.0.0)
naturally (~> 2.2)
optparse (>= 0.1.1, < 1.0.0)
plist (>= 3.1.0, < 4.0.0)
rubyzip (>= 2.0.0, < 3.0.0)
security (= 0.1.3)
simctl (~> 1.6.3)
terminal-notifier (>= 2.0.0, < 3.0.0)
terminal-table (~> 3)
tty-screen (>= 0.6.3, < 1.0.0)
tty-spinner (>= 0.8.0, < 1.0.0)
word_wrap (~> 1.0.0)
xcodeproj (>= 1.13.0, < 2.0.0)
xcpretty (~> 0.3.0)
xcpretty-travis-formatter (>= 0.0.3, < 2.0.0)
GEM
remote: https://rubygems.org/
specs:
@@ -52,24 +5,24 @@ GEM
base64
nkf
rexml
addressable (2.8.6)
public_suffix (>= 2.0.2, < 6.0)
addressable (2.8.7)
public_suffix (>= 2.0.2, < 7.0)
artifactory (3.0.17)
atomos (0.1.3)
aws-eventstream (1.3.0)
aws-partitions (1.944.0)
aws-sdk-core (3.197.0)
aws-partitions (1.952.0)
aws-sdk-core (3.201.1)
aws-eventstream (~> 1, >= 1.3.0)
aws-partitions (~> 1, >= 1.651.0)
aws-sigv4 (~> 1.8)
jmespath (~> 1, >= 1.6.1)
aws-sdk-kms (1.83.0)
aws-sdk-core (~> 3, >= 3.197.0)
aws-sigv4 (~> 1.1)
aws-sdk-s3 (1.152.2)
aws-sdk-core (~> 3, >= 3.197.0)
aws-sdk-kms (1.88.0)
aws-sdk-core (~> 3, >= 3.201.0)
aws-sigv4 (~> 1.5)
aws-sdk-s3 (1.156.0)
aws-sdk-core (~> 3, >= 3.201.0)
aws-sdk-kms (~> 1)
aws-sigv4 (~> 1.8)
aws-sigv4 (~> 1.5)
aws-sigv4 (1.8.0)
aws-eventstream (~> 1, >= 1.0.2)
babosa (1.0.4)
@@ -115,6 +68,47 @@ GEM
faraday_middleware (1.2.0)
faraday (~> 1.0)
fastimage (2.3.1)
fastlane (2.221.1)
CFPropertyList (>= 2.3, < 4.0.0)
addressable (>= 2.8, < 3.0.0)
artifactory (~> 3.0)
aws-sdk-s3 (~> 1.0)
babosa (>= 1.0.3, < 2.0.0)
bundler (>= 1.12.0, < 3.0.0)
colored (~> 1.2)
commander (~> 4.6)
dotenv (>= 2.1.1, < 3.0.0)
emoji_regex (>= 0.1, < 4.0)
excon (>= 0.71.0, < 1.0.0)
faraday (~> 1.0)
faraday-cookie_jar (~> 0.0.6)
faraday_middleware (~> 1.0)
fastimage (>= 2.1.0, < 3.0.0)
gh_inspector (>= 1.1.2, < 2.0.0)
google-apis-androidpublisher_v3 (~> 0.3)
google-apis-playcustomapp_v1 (~> 0.1)
google-cloud-env (>= 1.6.0, < 2.0.0)
google-cloud-storage (~> 1.31)
highline (~> 2.0)
http-cookie (~> 1.0.5)
json (< 3.0.0)
jwt (>= 2.1.0, < 3)
mini_magick (>= 4.9.4, < 5.0.0)
multipart-post (>= 2.0.0, < 3.0.0)
naturally (~> 2.2)
optparse (>= 0.1.1, < 1.0.0)
plist (>= 3.1.0, < 4.0.0)
rubyzip (>= 2.0.0, < 3.0.0)
security (= 0.1.5)
simctl (~> 1.6.3)
terminal-notifier (>= 2.0.0, < 3.0.0)
terminal-table (~> 3)
tty-screen (>= 0.6.3, < 1.0.0)
tty-spinner (>= 0.8.0, < 1.0.0)
word_wrap (~> 1.0.0)
xcodeproj (>= 1.13.0, < 2.0.0)
xcpretty (~> 0.3.0)
xcpretty-travis-formatter (>= 0.0.3, < 2.0.0)
gh_inspector (1.1.3)
google-apis-androidpublisher_v3 (0.54.0)
google-apis-core (>= 0.11.0, < 2.a)
@@ -158,9 +152,9 @@ GEM
httpclient (2.8.3)
jmespath (1.6.2)
json (2.7.2)
jwt (2.8.1)
jwt (2.8.2)
base64
mini_magick (4.12.0)
mini_magick (4.13.1)
mini_mime (1.1.5)
multi_json (1.15.0)
multipart-post (2.4.1)
@@ -170,7 +164,7 @@ GEM
optparse (0.5.0)
os (1.1.4)
plist (3.7.1)
public_suffix (5.0.5)
public_suffix (6.0.0)
rake (13.2.1)
representable (3.2.0)
declarative (< 0.1.0)
@@ -182,7 +176,7 @@ GEM
rouge (2.0.7)
ruby2_keywords (0.0.5)
rubyzip (2.3.2)
security (0.1.3)
security (0.1.5)
signet (0.19.0)
addressable (~> 2.8)
faraday (>= 0.17.5, < 3.a)
@@ -222,7 +216,7 @@ PLATFORMS
x86_64-linux
DEPENDENCIES
fastlane!
fastlane
BUNDLED WITH
2.3.6

View File

@@ -415,6 +415,7 @@ final class PipedAPI: Service, ObservableObject, VideosAPI {
if let channel = extractChannel(from: content) {
return ContentItem(channel: channel)
}
default:
return nil
}

View File

@@ -9,7 +9,11 @@ final class AdvancedSettingsGroupExporter: SettingsGroupExporter {
"mpvEnableLogging": Defaults[.mpvEnableLogging],
"mpvCacheSecs": Defaults[.mpvCacheSecs],
"mpvCachePauseWait": Defaults[.mpvCachePauseWait],
"mpvCachePauseInital": Defaults[.mpvCachePauseInital],
"mpvDeinterlace": Defaults[.mpvDeinterlace],
"mpvHWdec": Defaults[.mpvHWdec],
"mpvDemuxerLavfProbeInfo": Defaults[.mpvDemuxerLavfProbeInfo],
"mpvInitialAudioSync": Defaults[.mpvInitialAudioSync],
"showCacheStatus": Defaults[.showCacheStatus],
"feedCacheSize": Defaults[.feedCacheSize]
]

View File

@@ -6,6 +6,9 @@ final class HistorySettingsGroupExporter: SettingsGroupExporter {
[
"saveRecents": Defaults[.saveRecents],
"saveHistory": Defaults[.saveHistory],
"showRecents": Defaults[.showRecents],
"limitRecents": Defaults[.limitRecents],
"limitRecentsAmount": Defaults[.limitRecentsAmount],
"showWatchingProgress": Defaults[.showWatchingProgress],
"saveLastPlayed": Defaults[.saveLastPlayed],
@@ -15,11 +18,7 @@ final class HistorySettingsGroupExporter: SettingsGroupExporter {
"watchedVideoStyle": Defaults[.watchedVideoStyle].rawValue,
"watchedVideoBadgeColor": Defaults[.watchedVideoBadgeColor].rawValue,
"showToggleWatchedStatusButton": Defaults[.showToggleWatchedStatusButton],
"showRecents": Defaults[.showRecents],
"limitRecents": Defaults[.limitRecents],
"limitRecentsAmount": Defaults[.limitRecentsAmount]
"showToggleWatchedStatusButton": Defaults[.showToggleWatchedStatusButton]
]
}
}

View File

@@ -10,6 +10,8 @@ final class PlayerSettingsGroupExporter: SettingsGroupExporter {
"expandVideoDescription": Defaults[.expandVideoDescription],
"collapsedLinesDescription": Defaults[.collapsedLinesDescription],
"showChapters": Defaults[.showChapters],
"showChapterThumbnails": Defaults[.showChapterThumbnails],
"showChapterThumbnailsOnlyWhenDifferent": Defaults[.showChapterThumbnailsOnlyWhenDifferent],
"expandChapters": Defaults[.expandChapters],
"showRelated": Defaults[.showRelated],
"showInspector": Defaults[.showInspector].rawValue,
@@ -18,7 +20,12 @@ final class PlayerSettingsGroupExporter: SettingsGroupExporter {
"enableReturnYouTubeDislike": Defaults[.enableReturnYouTubeDislike],
"closePiPOnNavigation": Defaults[.closePiPOnNavigation],
"closePiPOnOpeningPlayer": Defaults[.closePiPOnOpeningPlayer],
"closePlayerOnOpeningPiP": Defaults[.closePlayerOnOpeningPiP]
"closePlayerOnOpeningPiP": Defaults[.closePlayerOnOpeningPiP],
"captionsAutoShow": Defaults[.captionsAutoShow],
"captionsDefaultLanguageCode": Defaults[.captionsDefaultLanguageCode],
"captionsFallbackLanguageCode": Defaults[.captionsFallbackLanguageCode],
"captionsFontScaleSize": Defaults[.captionsFontScaleSize],
"captionsFontColor": Defaults[.captionsFontColor]
]
}

View File

@@ -5,7 +5,11 @@ final class SponsorBlockSettingsGroupExporter: SettingsGroupExporter {
override var globalJSON: JSON {
[
"sponsorBlockInstance": Defaults[.sponsorBlockInstance],
"sponsorBlockCategories": Array(Defaults[.sponsorBlockCategories])
"sponsorBlockCategories": Array(Defaults[.sponsorBlockCategories]),
"sponsorBlockColors": Defaults[.sponsorBlockColors],
"sponsorBlockShowTimeWithSkipsRemoved": Defaults[.sponsorBlockShowTimeWithSkipsRemoved],
"sponsorBlockShowCategoriesInTimeline": Defaults[.sponsorBlockShowCategoriesInTimeline],
"sponsorBlockShowNoticeAfterSkip": Defaults[.sponsorBlockShowNoticeAfterSkip]
]
}
}

View File

@@ -25,10 +25,26 @@ struct AdvancedSettingsGroupImporter {
Defaults[.mpvCachePauseWait] = mpvCachePauseWait
}
if let mpvCachePauseInital = json["mpvCachePauseInital"].bool {
Defaults[.mpvCachePauseInital] = mpvCachePauseInital
}
if let mpvDeinterlace = json["mpvDeinterlace"].bool {
Defaults[.mpvDeinterlace] = mpvDeinterlace
}
if let mpvHWdec = json["mpvHWdec"].string {
Defaults[.mpvHWdec] = mpvHWdec
}
if let mpvDemuxerLavfProbeInfo = json["mpvDemuxerLavfProbeInfo"].string {
Defaults[.mpvDemuxerLavfProbeInfo] = mpvDemuxerLavfProbeInfo
}
if let mpvInitialAudioSync = json["mpvInitialAudioSync"].bool {
Defaults[.mpvInitialAudioSync] = mpvInitialAudioSync
}
if let showCacheStatus = json["showCacheStatus"].bool {
Defaults[.showCacheStatus] = showCacheStatus
}

View File

@@ -13,6 +13,18 @@ struct HistorySettingsGroupImporter {
Defaults[.saveHistory] = saveHistory
}
if let showRecents = json["showRecents"].bool {
Defaults[.showRecents] = showRecents
}
if let limitRecents = json["limitRecents"].bool {
Defaults[.limitRecents] = limitRecents
}
if let limitRecentsAmount = json["limitRecentsAmount"].int {
Defaults[.limitRecentsAmount] = limitRecentsAmount
}
if let showWatchingProgress = json["showWatchingProgress"].bool {
Defaults[.showWatchingProgress] = showWatchingProgress
}
@@ -50,17 +62,5 @@ struct HistorySettingsGroupImporter {
if let showToggleWatchedStatusButton = json["showToggleWatchedStatusButton"].bool {
Defaults[.showToggleWatchedStatusButton] = showToggleWatchedStatusButton
}
if let showRecents = json["showRecents"].bool {
Defaults[.showRecents] = showRecents
}
if let limitRecents = json["limitRecents"].bool {
Defaults[.limitRecents] = limitRecents
}
if let limitRecentsAmount = json["limitRecentsAmount"].int {
Defaults[.limitRecentsAmount] = limitRecentsAmount
}
}
}

View File

@@ -68,7 +68,7 @@ struct LocationsSettingsGroupImporter {
if let password,
!password.isEmpty,
let instanceID = account.instanceID,
let instance = InstancesModel.shared.find(instanceID)
let instance = InstancesModel.shared.find(instanceID) ?? InstancesModel.shared.findByURLString(account.urlString)
{
if !instance.accounts.contains(where: { instanceAccount in
let (username, _) = instanceAccount.credentials

View File

@@ -29,6 +29,14 @@ struct PlayerSettingsGroupImporter {
Defaults[.showChapters] = showChapters
}
if let showChapterThumbnails = json["showChapterThumbnails"].bool {
Defaults[.showChapterThumbnails] = showChapterThumbnails
}
if let showChapterThumbnailsOnlyWhenDifferent = json["showChapterThumbnailsOnlyWhenDifferent"].bool {
Defaults[.showChapterThumbnailsOnlyWhenDifferent] = showChapterThumbnailsOnlyWhenDifferent
}
if let expandChapters = json["expandChapters"].bool {
Defaults[.expandChapters] = expandChapters
}
@@ -96,5 +104,25 @@ struct PlayerSettingsGroupImporter {
Defaults[.rotateToLandscapeOnEnterFullScreen] = rotateToLandscapeOnEnterFullScreen
}
#endif
if let captionsAutoShow = json["captionsAutoShow"].bool {
Defaults[.captionsAutoShow] = captionsAutoShow
}
if let captionsDefaultLanguageCode = json["captionsDefaultLanguageCode"].string {
Defaults[.captionsDefaultLanguageCode] = captionsDefaultLanguageCode
}
if let captionsFallbackLanguageCode = json["captionsFallbackLanguageCode"].string {
Defaults[.captionsFallbackLanguageCode] = captionsFallbackLanguageCode
}
if let captionsFontScaleSize = json["captionsFontScaleSize"].string {
Defaults[.captionsFontScaleSize] = captionsFontScaleSize
}
if let captionsFontColor = json["captionsFontColor"].string {
Defaults[.captionsFontColor] = captionsFontColor
}
}
}

View File

@@ -12,5 +12,22 @@ struct SponsorBlockSettingsGroupImporter {
if let sponsorBlockCategories = json["sponsorBlockCategories"].array {
Defaults[.sponsorBlockCategories] = Set(sponsorBlockCategories.compactMap { $0.string })
}
if let sponsorBlockColors = json["sponsorBlockColors"].dictionary {
let colors = sponsorBlockColors.mapValues { json in json.stringValue }
Defaults[.sponsorBlockColors] = colors
}
if let sponsorBlockShowTimeWithSkipsRemoved = json["sponsorBlockShowTimeWithSkipsRemoved"].bool {
Defaults[.sponsorBlockShowTimeWithSkipsRemoved] = sponsorBlockShowTimeWithSkipsRemoved
}
if let sponsorBlockShowCategoriesInTimeline = json["sponsorBlockShowCategoriesInTimeline"].bool {
Defaults[.sponsorBlockShowCategoriesInTimeline] = sponsorBlockShowCategoriesInTimeline
}
if let sponsorBlockShowNoticeAfterSkip = json["sponsorBlockShowNoticeAfterSkip"].bool {
Defaults[.sponsorBlockShowNoticeAfterSkip] = sponsorBlockShowNoticeAfterSkip
}
}
}

View File

@@ -542,6 +542,7 @@ final class AVPlayerBackend: PlayerBackend {
}
}
}
case .failed:
DispatchQueue.main.async {
self.model.playerError = item.error

View File

@@ -72,6 +72,7 @@ final class MPVClient: ObservableObject {
checkError(mpv_set_option_string(mpv, "sub-scale", Defaults[.captionsFontScaleSize]))
checkError(mpv_set_option_string(mpv, "sub-color", Defaults[.captionsFontColor]))
checkError(mpv_set_option_string(mpv, "user-agent", UserAgentManager.shared.userAgent))
checkError(mpv_set_option_string(mpv, "initial-audio-sync", Defaults[.mpvInitialAudioSync] ? "yes" : "no"))
// GPU //

View File

@@ -106,6 +106,12 @@ extension Defaults.Keys {
static let closePiPAndOpenPlayerOnEnteringForeground = Key<Bool>("closePiPAndOpenPlayerOnEnteringForeground", default: false)
#endif
static let captionsAutoShow = Key<Bool>("captionsAutoShow", default: false)
static let captionsDefaultLanguageCode = Key<String>("captionsDefaultLanguageCode", default: LanguageCodes.English.rawValue)
static let captionsFallbackLanguageCode = Key<String>("captionsDefaultFallbackCode", default: LanguageCodes.English.rawValue)
static let captionsFontScaleSize = Key<String>("captionsFontScale", default: "1.0")
static let captionsFontColor = Key<String>("captionsFontColor", default: "#FFFFFF")
// MARK: GROUP - Controls
static let avPlayerUsesSystemControls = Key<Bool>("avPlayerUsesSystemControls", default: true)
@@ -270,6 +276,7 @@ extension Defaults.Keys {
static let mpvDeinterlace = Key<Bool>("mpvDeinterlace", default: false)
static let mpvHWdec = Key<String>("hwdec", default: "auto-safe")
static let mpvDemuxerLavfProbeInfo = Key<String>("mpvDemuxerLavfProbeInfo", default: "no")
static let mpvInitialAudioSync = Key<Bool>("mpvInitialAudioSync", default: true)
static let showCacheStatus = Key<Bool>("showCacheStatus", default: false)
static let feedCacheSize = Key<String>("feedCacheSize", default: "50")
@@ -303,13 +310,7 @@ extension Defaults.Keys {
static let lastPlayed = Key<PlayerQueueItem?>("lastPlayed")
static let activeBackend = Key<PlayerBackendType>("activeBackend", default: .mpv)
static let captionsAutoShow = Key<Bool>("captionsAutoShow", default: false)
static let captionsLanguageCode = Key<String?>("captionsLanguageCode")
static let captionsDefaultLanguageCode = Key<String>("captionsDefaultLanguageCode", default: LanguageCodes.English.rawValue)
static let captionsFallbackLanguageCode = Key<String>("captionsDefaultFallbackCode", default: LanguageCodes.English.rawValue)
static let captionsFontScaleSize = Key<String>("captionsFontScale", default: "1.0")
static let captionsFontColor = Key<String>("captionsFontColor", default: "#FFFFFF")
static let lastUsedPlaylistID = Key<Playlist.ID?>("lastPlaylistID")
static let lastAccountIsPublic = Key<Bool>("lastAccountIsPublic", default: false)

View File

@@ -469,6 +469,7 @@ struct FavoriteItemView: View {
switch item.section {
case .history:
return nil
case .subscriptions:
if accounts.app.supportsSubscriptions {
return accounts.api.feed(1)

View File

@@ -75,20 +75,16 @@ struct PlayerControls: View {
}
VStack {
Spacer()
ZStack {
GeometryReader { geometry in
VStack(spacing: 0) {
ZStack {
OpeningStream()
NetworkState()
}
VStack(spacing: 0) {
ZStack {
OpeningStream()
NetworkState()
}
.position(
x: geometry.size.width / 2,
y: geometry.size.height / 2
)
Spacer()
}
.offset(y: playerControlsLayout.osdVerticalOffset + 5)
if showControls {
Section {

View File

@@ -30,7 +30,6 @@ enum PlayerControlsLayout: String, CaseIterable, Defaults.Serializable {
#else
return isIPad
#endif
case .large:
return true
case .medium:
@@ -264,7 +263,7 @@ enum PlayerControlsLayout: String, CaseIterable, Defaults.Serializable {
var seekOSDWidth: Double {
switch self {
case .tvRegular:
return 240
return 280
case .veryLarge:
return 240
case .large:
@@ -278,6 +277,10 @@ enum PlayerControlsLayout: String, CaseIterable, Defaults.Serializable {
}
}
var osdVerticalOffset: Double {
buttonSize
}
var osdProgressBarHeight: Double {
switch self {
case .tvRegular:

View File

@@ -164,7 +164,6 @@ struct VideoActions: View {
}
case .musicMode:
actionButton("Music", systemImage: "music.note", active: player.musicMode, action: player.toggleMusicMode)
case .settings:
actionButton("Settings", systemImage: "gear") {
withAnimation(ControlOverlaysModel.animation) {
@@ -179,7 +178,6 @@ struct VideoActions: View {
actionButton("Hide", systemImage: "chevron.down") {
player.hide(animate: true)
}
case .close:
actionButton("Close", systemImage: "xmark") {
player.closeCurrentItem()

View File

@@ -10,6 +10,7 @@ struct AdvancedSettings: View {
@Default(.mpvEnableLogging) private var mpvEnableLogging
@Default(.mpvHWdec) private var mpvHWdec
@Default(.mpvDemuxerLavfProbeInfo) private var mpvDemuxerLavfProbeInfo
@Default(.mpvInitialAudioSync) private var mpvInitialAudioSync
@Default(.showCacheStatus) private var showCacheStatus
@Default(.feedCacheSize) private var feedCacheSize
@Default(.showPlayNowInBackendContextMenu) private var showPlayNowInBackendContextMenu
@@ -83,6 +84,9 @@ struct AdvancedSettings: View {
UIApplication.shared.open(URL(string: "https://mpv.io/manual/stable/#options-cache-pause-initial")!)
}
#elseif os(macOS)
.onTapGesture {
NSWorkspace.shared.open(URL(string: "https://mpv.io/manual/stable/#options-cache-pause-initial")!)
}
.onHover(perform: onHover(_:))
#endif
#endif
@@ -100,6 +104,9 @@ struct AdvancedSettings: View {
UIApplication.shared.open(URL(string: "https://mpv.io/manual/stable/#options-cache-secs")!)
}
#elseif os(macOS)
.onTapGesture {
NSWorkspace.shared.open(URL(string: "https://mpv.io/manual/stable/#options-cache-secs")!)
}
.onHover(perform: onHover(_:))
#endif
@@ -123,6 +130,9 @@ struct AdvancedSettings: View {
UIApplication.shared.open(URL(string: "https://mpv.io/manual/stable/#options-cache-pause-wait")!)
}
#elseif os(macOS)
.onTapGesture {
NSWorkspace.shared.open(URL(string: "https://mpv.io/manual/stable/#options-cache-pause-wait")!)
}
.onHover(perform: onHover(_:))
#endif
#endif
@@ -147,6 +157,30 @@ struct AdvancedSettings: View {
UIApplication.shared.open(URL(string: "https://mpv.io/manual/stable/#options-deinterlace")!)
}
#elseif os(macOS)
.onTapGesture {
NSWorkspace.shared.open(URL(string: "https://mpv.io/manual/stable/#options-deinterlace")!)
}
.onHover(perform: onHover(_:))
#endif
#endif
}
}
Toggle(isOn: $mpvInitialAudioSync) {
HStack {
Text("initial-audio-sync")
#if !os(tvOS)
Image(systemName: "link")
.accessibilityAddTraits([.isButton, .isLink])
.font(.footnote)
#if os(iOS)
.onTapGesture {
UIApplication.shared.open(URL(string: "https://mpv.io/manual/stable/#options-initial-audio-sync")!)
}
#elseif os(macOS)
.onTapGesture {
NSWorkspace.shared.open(URL(string: "https://mpv.io/manual/stable/#options-initial-audio-sync")!)
}
.onHover(perform: onHover(_:))
#endif
#endif
@@ -165,6 +199,9 @@ struct AdvancedSettings: View {
UIApplication.shared.open(URL(string: "https://mpv.io/manual/stable/#options-hwdec")!)
}
#elseif os(macOS)
.onTapGesture {
NSWorkspace.shared.open(URL(string: "https://mpv.io/manual/stable/#options-hwdec")!)
}
.onHover(perform: onHover(_:))
#endif
#endif
@@ -191,6 +228,9 @@ struct AdvancedSettings: View {
UIApplication.shared.open(URL(string: "https://mpv.io/manual/stable/#options-demuxer-lavf-probe-info")!)
}
#elseif os(macOS)
.onTapGesture {
NSWorkspace.shared.open(URL(string: "https://mpv.io/manual/stable/#options-demuxer-lavf-probe-info")!)
}
.onHover(perform: onHover(_:))
#endif
#endif

View File

@@ -62,7 +62,7 @@ struct ImportSettingsAccountRow: View {
}
} else {
Group {
if InstancesModel.shared.find(instanceID) != nil {
if InstancesModel.shared.find(instanceID) != nil || InstancesModel.shared.findByURLString(account.urlString) != nil {
HStack {
Image(systemName: "checkmark.circle.fill")
.foregroundColor(.green)

View File

@@ -42,7 +42,7 @@ final class ImportSettingsSheetViewModel: ObservableObject {
return ((account.password != nil && !account.password!.isEmpty) ||
importableAccounts.contains(account.id)) && (
(InstancesModel.shared.find(instanceID) != nil) ||
(InstancesModel.shared.find(instanceID) != nil || InstancesModel.shared.findByURLString(account.urlString) != nil) ||
selectedInstances.contains(instanceID)
)
}

View File

@@ -57,7 +57,7 @@ struct QualityProfileForm: View {
.frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: .infinity)
.background(Color.background(scheme: colorScheme))
#else
.frame(width: 400, height: 400)
.frame(width: 400, height: 450)
.padding(.vertical, 10)
#endif
}

View File

@@ -316,19 +316,19 @@ struct SettingsView: View {
case .browsing:
return 800
case .player:
return 550
return 800
case .controls:
return 920
case .quality:
return 420
case .history:
return 500
return 600
case .sponsorBlock:
return 700
return 970
case .locations:
return 600
case .advanced:
return 500
return 550
case .importExport:
return 580
case .help:

View File

@@ -74,7 +74,7 @@ struct SponsorBlockSettings: View {
)
)
} label: {
Text("Restore Default Colors ")
Text("Restore Default Colors…")
.foregroundColor(.red)
}
#endif

View File

@@ -11,6 +11,7 @@ struct FeedView: View {
#if os(tvOS)
@Default(.subscriptionsListingStyle) private var subscriptionsListingStyle
@StateObject private var accountsModel = AccountsViewModel()
#endif
var videos: [ContentItem] {
@@ -30,7 +31,7 @@ struct FeedView: View {
@State private var selectedChannel: Channel?
#if os(tvOS)
@FocusState private var focusedChannel: String?
@FocusState private var focusedChannel: String?
#endif
@State private var feedChannelsViewVisible = false
private var navigation = NavigationModel.shared
@@ -76,90 +77,107 @@ struct FeedView: View {
selectedFeedView
#endif
}
#if os(tvOS)
var feedChannelsView: some View {
ScrollViewReader { proxy in
VStack {
Text("Channels")
.font(.subheadline)
if #available(tvOS 17.0, *) {
List(selection: $selectedChannel) {
Button(action: {
self.selectedChannel = nil
self.feedChannelsViewVisible = false
}) {
HStack(spacing: 16) {
Image(systemName: RecentsModel.symbolSystemImage("A"))
.imageScale(.large)
.foregroundColor(.accentColor)
.frame(width: 35, height: 35)
Text("All")
Spacer()
feedCount.unwatchedText
}
}
.padding(.all)
.background(RoundedRectangle(cornerRadius: 8.0)
.fill(self.selectedChannel == nil ? Color.secondary : Color.clear))
.font(.caption)
.buttonStyle(PlainButtonStyle())
.focused(self.$focusedChannel, equals: "all")
ForEach(channels, id: \.self) { channel in
#if os(tvOS)
var accountsPicker: some View {
ForEach(accountsModel.sortedAccounts.filter { $0.anonymous == false }) { account in
Button(action: {
AccountsModel.shared.setCurrent(account)
}) {
HStack {
Text("\(account.description) (\(account.instance.app.rawValue))")
if account == accountsModel.currentAccount {
Image(systemName: "checkmark")
}
}
}
.buttonStyle(PlainButtonStyle())
}
}
var feedChannelsView: some View {
ScrollViewReader { proxy in
VStack {
Text("Channels")
.font(.subheadline)
if #available(tvOS 17.0, *) {
List(selection: $selectedChannel) {
Button(action: {
self.selectedChannel = channel
self.selectedChannel = nil
self.feedChannelsViewVisible = false
}) {
HStack(spacing: 16) {
ChannelAvatarView(channel: channel, subscribedBadge: false)
.frame(width: 50, height: 50)
Text(channel.name)
.lineLimit(1)
Image(systemName: RecentsModel.symbolSystemImage("A"))
.imageScale(.large)
.foregroundColor(.accentColor)
.frame(width: 35, height: 35)
Text("All")
Spacer()
if let unwatchedCount = feedCount.unwatchedByChannelText(channel) {
unwatchedCount
}
feedCount.unwatchedText
}
}
.padding(.all)
.background(RoundedRectangle(cornerRadius: 8.0)
.fill(self.selectedChannel == channel ? Color.secondary : Color.clear))
.fill(self.selectedChannel == nil ? Color.secondary : Color.clear))
.font(.caption)
.buttonStyle(PlainButtonStyle())
.focused(self.$focusedChannel, equals: channel.id)
}
}
.onChange(of: self.focusedChannel) {
if self.focusedChannel == "all" {
withAnimation {
self.selectedChannel = nil
.focused(self.$focusedChannel, equals: "all")
ForEach(channels, id: \.self) { channel in
Button(action: {
self.selectedChannel = channel
self.feedChannelsViewVisible = false
}) {
HStack(spacing: 16) {
ChannelAvatarView(channel: channel, subscribedBadge: false)
.frame(width: 50, height: 50)
Text(channel.name)
.lineLimit(1)
Spacer()
if let unwatchedCount = feedCount.unwatchedByChannelText(channel) {
unwatchedCount
}
}
}
.padding(.all)
.background(RoundedRectangle(cornerRadius: 8.0)
.fill(self.selectedChannel == channel ? Color.secondary : Color.clear))
.font(.caption)
.buttonStyle(PlainButtonStyle())
.focused(self.$focusedChannel, equals: channel.id)
}
} else if self.focusedChannel == dismiss_channel_list_id {
self.feedChannelsViewVisible = false
} else {
withAnimation {
self.selectedChannel = channels.first {
$0.id == self.focusedChannel
}
.onChange(of: self.focusedChannel) {
if self.focusedChannel == "all" {
withAnimation {
self.selectedChannel = nil
}
} else if self.focusedChannel == dismiss_channel_list_id {
self.feedChannelsViewVisible = false
} else {
withAnimation {
self.selectedChannel = channels.first {
$0.id == self.focusedChannel
}
}
}
}
}
.onAppear {
guard let selectedChannel = self.selectedChannel else {
return
.onAppear {
guard let selectedChannel = self.selectedChannel else {
return
}
proxy.scrollTo(selectedChannel, anchor: .top)
}
proxy.scrollTo(selectedChannel, anchor: .top)
}
.onExitCommand {
withAnimation {
self.feedChannelsViewVisible = false
.onExitCommand {
withAnimation {
self.feedChannelsViewVisible = false
}
}
}
}
}
}
}
#endif
var selectedFeedView: some View {
@@ -198,19 +216,23 @@ struct FeedView: View {
var header: some View {
HStack(spacing: 16) {
#if os(tvOS)
Button(action: {
withAnimation {
self.feedChannelsViewVisible = true
self.focusedChannel = selectedChannel?.id ?? "all"
if #available(tvOS 17.0, *) {
Menu {
accountsPicker
} label: {
Label("Channels", systemImage: "filemenu.and.selection")
.labelStyle(.iconOnly)
.imageScale(.small)
.font(.caption)
} primaryAction: {
withAnimation {
self.feedChannelsViewVisible = true
self.focusedChannel = selectedChannel?.id ?? "all"
}
}
}) {
Label("Channels", systemImage: "filemenu.and.selection")
.labelStyle(.iconOnly)
.imageScale(.small)
.font(.caption)
.opacity(feedChannelsViewVisible ? 0 : 1)
.frame(minWidth: feedChannelsViewVisible ? 0 : nil, maxWidth: feedChannelsViewVisible ? 0 : nil)
}
.opacity(feedChannelsViewVisible ? 0 : 1)
.frame(minWidth: feedChannelsViewVisible ? 0 : nil, maxWidth: feedChannelsViewVisible ? 0 : nil)
channelHeaderView
if selectedChannel == nil {
Spacer()

View File

@@ -41,3 +41,30 @@
"Add Account..." = "계정 추가...";
"Automatic" = "자동";
"Close" = "닫기";
"Badge color" = "배지 색상";
"Bugs and great feature ideas can be sent to the GitHub issues tracker. " = "깃허브 이슈 트래커를 통해 버그 제보 또는 개발 아이디어를 제공해주실 수 있습니다. ";
"Category" = "카테고리";
"Captions" = "자막";
"Close Video" = "동영상 닫기";
"Close player when closing video" = "동영상 종료 시 플레이어 닫기";
"Close player when starting PiP" = "PiP 시작 시 플레이어 닫기";
"Button" = "버튼";
"Cancel" = "취소";
"Based on system color scheme" = "시스템 색 구성표 기반";
"Blue" = "파란색";
"Categories to Skip" = "건너뛸 카테고리";
"Chapters" = "챕터";
"Charging" = "충전중";
"Badge & Decreased opacity" = "배지와 불투명도 감소";
"Browsing" = "탐색";
"Buffering stream..." = "스트림 버퍼링...";
"Clear" = "지우기";
"Clear All" = "모두 지우기";
"Clear All Recents" = "최근내역 모두 지우기";
"Clear History" = "기록 지우기";
"Clear Search History" = "검색기록 지우기";
"Clear Search History..." = "검색기록 지우기...";
"Clear the queue" = "대기열 지우기";
"Close PiP and open player when application enters foreground" = "애플리케이션이 포그라운드에 진입하면 PiP를 닫고 플레이어를 열기";
"Close PiP when player is opened" = "플레이어가 열리면 PiP 닫기";
"Close PiP when starting playing other video" = "다른 동영상 재생을 시작하면 PiP 닫기";

View File

@@ -294,3 +294,240 @@
"Show anonymous accounts" = "Anonieme accounts laten zien";
"Show channel name" = "Naam van kanaal laten zien";
"Show history" = "Geschiedenis laten zien";
"Show keywords" = "Toon sleutelwoorden";
"Show progress of watching on thumbnails" = "Toon vooruitgang bovenop voorvertoning";
"Show playback statistics" = "Toon afspeelstatistieken";
"Show sidebar when space permits" = "Toon zijbalk wanneer de ruimte dit toelaat";
"Show video length" = "Toon videoduur";
"Shuffle" = "Shuffle";
"Shuffle All" = "Shuffle alles";
"Sidebar" = "Zijbalk";
"Sign In Required" = "Aanmelden vereist";
/* Player controls layout size */
"Small" = "Klein";
/* Player controls layout size */
"Smaller" = "Kleiner";
"Subscribe" = "Abonneer";
/* Subscriptions title */
"Subscriptions" = "Abonnementen";
"Switch to other public location" = "Schakel naar andere publieke locatie";
"System controls show buttons for %@" = "Knoppen systeemcontrole voor %@";
"That's nice to hear. It is fun to deliver apps other people want to use. You can consider donating to the project or help by contributing to new features development." = "Dat is fijn om te horen. Het is leuk om apps aan te bieden die mensen willen gebruiken. Je kan een donatie overwegen of een bijdrage leveren in de ontwikkeling van nieuwe functionaliteiten.";
"This cannot be reverted" = "Dit kan niet ongedaan worden gemaakt";
"Switch to public locations" = "Schakel naar publieke locatie";
"System controls buttons" = "Knoppen voor systeemcontrole";
"This cannot be reverted. You might need to switch between views or restart the app to see changes." = "Dit kan niet ongedaan worden gemaakt. Je zou mogelijks tussen de weergave moeten schakelen of de app opnieuw te openen om de wijzigingen te zien.";
"This information will be processed only on your device and used to connect you to the server in the specified country." = "Deze informatie zal enkel verwerkt worden binnen het toestel zelf en gebruikt worden om te verbinden met de server in het gekozen land.";
"This will remove all your custom profiles and return their default values. This cannot be reverted." = "Dit zal alle profielen verwijderen en terug naar de initiële waarden brengen. Dit kan niet ongedaan worden gemaakt.";
"Thumbnails" = "Voorvertoningen";
/* Video date filter in search */
"Today" = "Vandaag";
"Trending" = "Trending";
/* Player controls layout size for TV */
"TV" = "TV";
"unknown" = "onbekend";
"Unsubscribe" = "Afmelden";
"Upload date" = "Datum van opladen";
"URL" = "URL";
"Videos" = "Videos";
/* Video sort order in search */
"Views" = "Views";
/* Selected video is being played */
"Watching now" = "Aan het bekijken";
/* Video date filter in search */
"Week" = "Week";
"Welcome" = "Welkom";
"When partially watched video is played" = "Wanneer een gedeeltelijk bekeken video wordt afgespeeld";
"Wi-Fi" = "Wi-Fi";
"Wiki" = "Wiki";
"Yattee" = "Yattee";
"Yattee %@ (build %@)" = "Yattee %@ (build %@)";
"You can use automatic profile selection based on current device status or switch it in video playback settings controls." = "Je kan gebruik maken van een automatische profielselectie gebaseerd op de status van het toestel of maak een keuze in de aspeelinstellingen.";
"You have no Playlists" = "Je hebt geen afspeellijsten";
"You have no playlists\n\nTap on \"New Playlist\" to create one" = "Je hebt geen afspeellijsten\n\nTik op \"Nieuwe afspeellijst\" om er een aan te maken";
"You need to create an instance and accounts\nto access %@ section" = "Je moet een instance en een account aanmaken\nom toegang te krijgen tot het onderdeel %@";
"You need to select an account\nto access %@ section" = "Je moet een account selecteren\nom toegang te krijgen tot het onderdeel %@";
"Public" = "Publiek";
"Unlisted" = "Onopgelijst";
"Now Playing" = "Wordt nu afgespeeld";
"Current Location" = "Huidige Locatie";
"Private" = "Privé";
"Playback queue is empty" = "Afspeellijst is leeg";
"Playing Next" = "Speelt Hierna";
"You can switch between profiles in playback settings controls." = "Je kan schakelen tussen profielen via de afspeelinstellingen.";
"Add Channels, Playlists and Searches to Favorites using" = "Voeg Kanalen, Afspeellijsten en Zoekopdrachten toe aan Favorieten gebruik makend van";
"Make default" = "Stel in als standaard";
"Visibility" = "Zichtbaarheid";
"Current Playlist" = "Huidige Afspeellijst";
"Stream & Player" = "Stream & Speler";
"Statistics" = "Statistieken";
"Hardware decoder" = "Hardware decoder";
"Stream FPS" = "Stream FPS";
"Cached time" = "Cache duurtijd";
"Rate & Captions" = "Beoordelen & Ondertiteling";
"Dropped frames" = "Verloren frames";
"Any format" = "Elk formaat";
"%@ formats" = "%@ formaten";
"Keep last played video in the queue after restart" = "Behoud de laatst gespeelde video in de afspeellijst na herstart";
"Playlist is empty\n\nTap and hold on a video and then \n\"Add to Playlist\"" = "Afspeellijst is leeg\n\nTik en houd de video vast en\nkies dan \"Voeg toe aan afspeellijst\"";
"It can be changed later in settings. You can use your own locations too." = "Dit kan later aangepast worden in de instellingen. Je kan tevens je eigen locatie gebruiken.";
"Press and hold remote button to open captions and quality menus" = "Tik en houd de knop van de afstandsbediening ingedrukt om het menu van de ondertitelingen en streamkwaliteit te openen";
"Comments are disabled" = "Commentaar is uitgeschakeld";
"No comments" = "Geen commentaren";
"No chapters information available" = "Geen hoofdstukinformatie beschikbaar";
"Share Logs..." = "Deel logboek…";
"Open logs in Finder" = "Open logboek in Finder";
"Channel could not be found" = "Kanaal kan niet gevonden worden";
"Could not extract channel information" = "Kan geen informatie van het kanaal vinden";
"Could not extract SID from received cookies: %@" = "Kon de SID niet bepalen van de ontvangen cookies: %@";
"Could not update your token." = "Kan jouw token niet updaten.";
"Could not refresh Trending" = "Kon Trending niet verversen";
"Could not create share link" = "Kon geen link aanmaken om te delen";
"Could not open playlist" = "Kon de afspeellijst niet openen";
"Could not extract video ID" = "Kon de video ID niet bepalen";
"This video could not be opened" = "Deze video kon niet worden geopend";
"Could not extract playlist ID" = "Kon de playlist ID niet bepalen";
"No locations available at the moment" = "Geen locaties beschikbaar op dit moment";
"Could not refresh Playlists" = "Kon de Afspeellijsten niet verversen";
"If you want this app to be available in your language, join translation project." = "Als je deze app in jouw taal wenst te gebruiken, neem deel aan het vertalingsproject.";
"Translations" = "Vertalingen";
"No documents" = "Geen documenten";
"Recent Documents" = "Recente Documenten";
"Home" = "Home";
"Pages buttons" = "Paginas knoppen";
"Only for local files and URLs" = "Enkel voor lokale bestanden en URLs";
"Right" = "Rechts";
"Playback Mode" = "Afspeelmodus";
"Add" = "Voeg toe";
"Hide" = "Verberg";
"Always" = "Altijd";
"Channels" = "Kanalen";
"Open Files" = "Open Bestanden";
"Share" = "Deel";
"Show icons and text when space permits" = "Toon iconen en tekst wanneer de ruimte dit toelaat";
"Left" = "Links";
"Format" = "Formaat";
"Driver" = "Driver";
"Show only icons" = "Toon enkel iconen";
"Audio" = "Audio";
"File" = "Bestand";
"Documents" = "Documenten";
"Video" = "Video";
"Codec" = "Codec";
"Size" = "Grootte";
"FPS" = "FPS";
"Sample Rate" = "Sample Rate";
"Could not find any links to open in your clipboard" = "Kon geen links vinden om te openen in het klembord";
"Address" = "Adres";
"Show sidebar" = "Toon zijbalk";
"Locations Manifest" = "Locatie Manifest";
"Remove Location" = "Verwijder Locatie";
"Could not delete document" = "Kon het document niet verwijderen";
"Verified" = "Geverifiëerd";
"Channel" = "Kanaal";
"Open expanded" = "Open uitgeklapt";
"Mark channel feed as unwatched" = "Markeer het kanaal als onbekeken";
"Mark channel feed as watched" = "Markeer het kanaal als bekeken";
"Short videos: visible" = "Korte videos: zichtbaar";
"Player Bar" = "Afspeelbalk";
"Short videos: hidden" = "Korte videos: verborgen";
"Play all unwatched" = "Speel alle onbekeken af";
"Seeking" = "Scrollen";
"System controls" = "Systeembediening";
"Controls button: backwards" = "Bedieningsknop: terug";
/* Loading stream OSD */
"Loading streams…" = "Streams laden…";
/* Loading stream OSD */
"Opening %@ stream…" = "Stream %@ openen…";
"Opening audio stream…" = "Audio stream openen…";
"Sort" = "Sorteer";
"Sort: %@" = "Sorteer: %@";
/* SponsorBlock category name */
"Sponsor" = "Sponsor";
"SponsorBlock" = "SponsorBlock";
"Source" = "Bron";
"SponsorBlock API Instance" = "SponsorBlock API Instance";
"Username" = "Gebruikersnaam";
/* Player controls layout size */
"Very Large" = "Heel Groot";
"Watched" = "Bekeken";
/* Selected video was played on given date */
"Watched %@" = "%@ Bekeken";
/* Video date filter in search */
"Year" = "Jaar";
"Typically near or at the end of the video when the credits pop up and/or endcards are shown." = "Typisch dicht bij of op het einde van een video wanneer de aftiteling getoond wordt.";
"Used to create links from videos, channels and playlists" = "Gebruikt om links te maken van videos, kanalen en afspeellijsten";
"You can find information about using Yattee in the Wiki pages." = "Je vindt informatie over het gebruik van Yattee in de Wiki.";
"Share files from Finder on a Mac\nor iTunes on Windows" = "Deel bestanden van Finder op Mac\nof iTunes op Windows";
"Show Favorites" = "Toon Favorieten";
"Inspector visibility" = "Inspector zichtbaarheid";
"Edit Favorites…" = "Pas Favorieten aan…";
"Show Open Videos toolbar button" = "Toon Open Videos werkbalkknop";
"Show Inspector" = "Toon Inspector";
"Open" = "Open";
"Open Videos" = "Open Videos";
"Enter links to open, one per line" = "Voeg links toe om te openen, één per lijn";
"Could not refresh Subscriptions" = "Kan Abonnementen niet verversen";
"Show Home" = "Toon Home";
"Recent History" = "Recente Geschiedenis";
"Enter link to open" = "Voeg de link in om te openen";
"Show Open Videos quick actions" = "Toon Open Videos snelle acties";
"Files" = "Bestanden";
"Could not open Files" = "Kon Bestanden niet openen";
"Could not load streams" = "Kan de streams niet laden";
"Could not open video" = "Kan de video niet openen";
"Buttons labels" = "Knoppen labels";
"Show Documents" = "Toon Documenten";
"Video Details" = "Video Eigenschappen";
"Clear Queue before opening" = "Maak de wachtrij leeg voor het openen";
"For custom locations you can configure Frontend URL in Locations settings" = "Voor aangepaste locaties kan je de URL instellen in de locatie instellingen";
"This URL could not be opened" = "Deze URL kon niet geopend worden";
"Could not load video" = "Kon de video niet laden";
"Pages toolbar position" = "Paginas werkbalk positie";
"Reload manifest" = "Ververs het manifest";
"Video actions buttons" = "Video actie knoppen";
"URL to Open" = "URL om te Openen";
"Paste" = "Plakken";
"Share%@link" = "Deel %@link";
"Could not open channel" = "Kan het Kanaal niet openen";
"Could not refresh Popular" = "Kon Populair niet verversen";
"Center" = "Midden";
"Open Video" = "Open Video";
"Default Profile" = "Standaard Profiel";
"Playback history is empty" = "Afspeelgeschiedenis is leeg";
"Shorts" = "Shorts";
"Double tap gesture" = "Dubbele tik gebaar";
"Tap and hold channel thumbnail to open context menu with more actions" = "Tik en houd voorvertoningsafbeelding vast om het contextmenu te openen met meer acties";
"Always show controls buttons" = "Toon altijd bedieningsknoppen";
"Single tap gesture" = "Enkel tikgebaar";
"Maximum width expanded" = "Maximale breedte uitgeklapt";
"Clear all" = "Verwijder alle";
"Show unwatched feed badges" = "Toon onbekeken feed badges";
"Controls button: forwards" = "Bedieningsknop: voorwaarts";
"Remove…" = "Verwijder…";
"Actions buttons" = "Actieknoppen";
"\"%@\" will be irreversibly removed from this device." = "\"%@\" zal onherroepelijk verwijderd worden van dit toestel.";
"Right click channel thumbnail to open context menu with more actions" = "Rechts klikken op voorvertoningsafbeelding om de contextmenu te openen met meer acties";
"Gesture: backwards" = "Gebaar: achteruit";
"Copy%@link" = "Kopieer %@link";
"Live Streams" = "Livestreams";
"Gesture: fowards" = "Gebaar: voorwaarts";
"Controls Buttons" = "Bedieningsknoppen";
"Are you sure you want to remove this document?" = "Ben je zeker om dit document te verwijderen?";
"Are you sure you want to remove %@ location?" = "Ben je zeker om locatie %a te verwijderen?";

View File

@@ -4103,7 +4103,7 @@
CODE_SIGN_ENTITLEMENTS = "Open in Yattee/Open in Yattee.entitlements";
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 186;
CURRENT_PROJECT_VERSION = 187;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = "Open in Yattee/Info.plist";
INFOPLIST_KEY_CFBundleDisplayName = "Open in Yattee";
@@ -4134,7 +4134,7 @@
CODE_SIGN_IDENTITY = "Apple Development";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
CODE_SIGN_STYLE = Manual;
CURRENT_PROJECT_VERSION = 186;
CURRENT_PROJECT_VERSION = 187;
"DEVELOPMENT_TEAM[sdk=iphoneos*]" = 78Z5H3M6RJ;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = "Open in Yattee/Info.plist";
@@ -4165,7 +4165,7 @@
buildSettings = {
CLANG_CXX_LANGUAGE_STANDARD = "gnu++17";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 186;
CURRENT_PROJECT_VERSION = 187;
GENERATE_INFOPLIST_FILE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 14.0;
MACOSX_DEPLOYMENT_TARGET = 11.0;
@@ -4185,7 +4185,7 @@
buildSettings = {
CLANG_CXX_LANGUAGE_STANDARD = "gnu++17";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 186;
CURRENT_PROJECT_VERSION = 187;
GENERATE_INFOPLIST_FILE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 14.0;
MACOSX_DEPLOYMENT_TARGET = 11.0;
@@ -4349,7 +4349,7 @@
CODE_SIGN_ENTITLEMENTS = "iOS/Yattee (iOS).entitlements";
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 186;
CURRENT_PROJECT_VERSION = 187;
ENABLE_PREVIEWS = YES;
GCC_PREPROCESSOR_DEFINITIONS = (
"DEBUG=1",
@@ -4402,7 +4402,7 @@
CODE_SIGN_IDENTITY = "Apple Development";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
CODE_SIGN_STYLE = Manual;
CURRENT_PROJECT_VERSION = 186;
CURRENT_PROJECT_VERSION = 187;
"DEVELOPMENT_TEAM[sdk=iphoneos*]" = 78Z5H3M6RJ;
ENABLE_PREVIEWS = YES;
GCC_PREPROCESSOR_DEFINITIONS = "GLES_SILENCE_DEPRECATION=1";
@@ -4454,7 +4454,7 @@
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
COMBINE_HIDPI_IMAGES = YES;
CURRENT_PROJECT_VERSION = 186;
CURRENT_PROJECT_VERSION = 187;
DEAD_CODE_STRIPPING = YES;
ENABLE_APP_SANDBOX = YES;
ENABLE_HARDENED_RUNTIME = YES;
@@ -4493,7 +4493,7 @@
"CODE_SIGN_IDENTITY[sdk=macosx*]" = "3rd Party Mac Developer Application";
CODE_SIGN_STYLE = Manual;
COMBINE_HIDPI_IMAGES = YES;
CURRENT_PROJECT_VERSION = 186;
CURRENT_PROJECT_VERSION = 187;
DEAD_CODE_STRIPPING = YES;
"DEVELOPMENT_TEAM[sdk=macosx*]" = 78Z5H3M6RJ;
ENABLE_APP_SANDBOX = YES;
@@ -4528,7 +4528,7 @@
buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 186;
CURRENT_PROJECT_VERSION = 187;
GENERATE_INFOPLIST_FILE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 15.0;
LD_RUNPATH_SEARCH_PATHS = (
@@ -4552,7 +4552,7 @@
buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 186;
CURRENT_PROJECT_VERSION = 187;
GENERATE_INFOPLIST_FILE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 15.0;
LD_RUNPATH_SEARCH_PATHS = (
@@ -4578,7 +4578,7 @@
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
CODE_SIGN_STYLE = Automatic;
COMBINE_HIDPI_IMAGES = YES;
CURRENT_PROJECT_VERSION = 186;
CURRENT_PROJECT_VERSION = 187;
DEAD_CODE_STRIPPING = YES;
GENERATE_INFOPLIST_FILE = YES;
LD_RUNPATH_SEARCH_PATHS = (
@@ -4603,7 +4603,7 @@
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
CODE_SIGN_STYLE = Automatic;
COMBINE_HIDPI_IMAGES = YES;
CURRENT_PROJECT_VERSION = 186;
CURRENT_PROJECT_VERSION = 187;
DEAD_CODE_STRIPPING = YES;
GENERATE_INFOPLIST_FILE = YES;
LD_RUNPATH_SEARCH_PATHS = (
@@ -4629,7 +4629,7 @@
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 186;
CURRENT_PROJECT_VERSION = 187;
DEVELOPMENT_ASSET_PATHS = "";
ENABLE_PREVIEWS = YES;
GENERATE_INFOPLIST_FILE = YES;
@@ -4669,7 +4669,7 @@
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
"CODE_SIGN_IDENTITY[sdk=appletvos*]" = "iPhone Distribution";
CODE_SIGN_STYLE = Manual;
CURRENT_PROJECT_VERSION = 186;
CURRENT_PROJECT_VERSION = 187;
DEVELOPMENT_ASSET_PATHS = "";
"DEVELOPMENT_TEAM[sdk=appletvos*]" = 78Z5H3M6RJ;
ENABLE_PREVIEWS = YES;
@@ -4710,7 +4710,7 @@
buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 186;
CURRENT_PROJECT_VERSION = 187;
GENERATE_INFOPLIST_FILE = YES;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
@@ -4734,7 +4734,7 @@
buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 186;
CURRENT_PROJECT_VERSION = 187;
GENERATE_INFOPLIST_FILE = YES;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",

View File

@@ -25,7 +25,7 @@
"location" : "https://github.com/hyperoslo/Cache.git",
"state" : {
"branch" : "master",
"revision" : "fd97438a85d44aa4f7186145cdba90e3c36f1c94"
"revision" : "dff9930c559aa2d1f7ed818d490d30c8852f57a6"
}
},
{
@@ -105,8 +105,8 @@
"kind" : "remoteSourceControl",
"location" : "https://github.com/SDWebImage/SDWebImage",
"state" : {
"revision" : "b8523c1642f3c142b06dd98443ea7c48343a4dfd",
"version" : "5.19.3"
"revision" : "be0bcd7823ce56629948491f2eaeaa19979514f7",
"version" : "5.19.4"
}
},
{