mirror of
https://github.com/yattee/yattee.git
synced 2025-12-13 19:48:14 +00:00
Compare commits
35 Commits
1.5.2-198
...
actions/bu
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d76c82eb65 | ||
|
|
6935866183 | ||
|
|
0b253a1c5c | ||
|
|
8e4b9ea440 | ||
|
|
b2593c02b9 | ||
|
|
d209602f0e | ||
|
|
04377cbc1a | ||
|
|
d4ebee2b44 | ||
|
|
8609ef7709 | ||
|
|
5b291e6e5a | ||
|
|
3d4b5fc42b | ||
|
|
06c0eaa920 | ||
|
|
06d315a1e8 | ||
|
|
cedeb29c44 | ||
|
|
150562830f | ||
|
|
e41527775a | ||
|
|
2461a33feb | ||
|
|
2a597ab3cb | ||
|
|
4d662115e4 | ||
|
|
e068257f14 | ||
|
|
8b809fb0f1 | ||
|
|
d3e80f500e | ||
|
|
9343e9d023 | ||
|
|
e4b25b0f80 | ||
|
|
09c2fb19a9 | ||
|
|
043b07274e | ||
|
|
7f7e12d719 | ||
|
|
d990c6630e | ||
|
|
5239b36cfe | ||
|
|
addc13ebfb | ||
|
|
2a6f26ec68 | ||
|
|
2e2f502d97 | ||
|
|
59afc2f4c7 | ||
|
|
2f902e74bb | ||
|
|
500b75da4f |
12
.github/workflows/release.yml
vendored
12
.github/workflows/release.yml
vendored
@@ -27,13 +27,14 @@ jobs:
|
|||||||
# lane: ['mac beta', 'ios beta', 'tvos beta']
|
# lane: ['mac beta', 'ios beta', 'tvos beta']
|
||||||
lane: ['ios beta', 'tvos beta']
|
lane: ['ios beta', 'tvos beta']
|
||||||
name: Releasing ${{ matrix.lane }} version to TestFlight
|
name: Releasing ${{ matrix.lane }} version to TestFlight
|
||||||
runs-on: macos-13
|
runs-on: macos-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
- uses: ruby/setup-ruby@v1
|
- uses: ruby/setup-ruby@v1
|
||||||
with:
|
with:
|
||||||
ruby-version: '3.0'
|
ruby-version: '3.0'
|
||||||
bundler-cache: true
|
bundler-cache: true
|
||||||
|
cache-version: 1
|
||||||
- name: Replace signing certificate to AppStore
|
- name: Replace signing certificate to AppStore
|
||||||
run: |
|
run: |
|
||||||
sed -i '' 's/match Development/match AppStore/' Yattee.xcodeproj/project.pbxproj
|
sed -i '' 's/match Development/match AppStore/' Yattee.xcodeproj/project.pbxproj
|
||||||
@@ -44,20 +45,21 @@ jobs:
|
|||||||
- uses: maierj/fastlane-action@v3.0.0
|
- uses: maierj/fastlane-action@v3.0.0
|
||||||
with:
|
with:
|
||||||
lane: ${{ matrix.lane }}
|
lane: ${{ matrix.lane }}
|
||||||
- uses: actions/upload-artifact@v3
|
- uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: ${{ matrix.lane }} build
|
name: ${{ matrix.lane }} build
|
||||||
path: fastlane/builds/**/*.ipa
|
path: fastlane/builds/**/*.ipa
|
||||||
if-no-files-found: ignore
|
if-no-files-found: ignore
|
||||||
mac_notarized:
|
mac_notarized:
|
||||||
name: Build and notarize macOS app
|
name: Build and notarize macOS app
|
||||||
runs-on: macos-13
|
runs-on: macos-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
- uses: ruby/setup-ruby@v1
|
- uses: ruby/setup-ruby@v1
|
||||||
with:
|
with:
|
||||||
ruby-version: '3.0'
|
ruby-version: '3.0'
|
||||||
bundler-cache: true
|
bundler-cache: true
|
||||||
|
cache-version: 1
|
||||||
- name: Replace signing certificate to Direct with Developer ID
|
- name: Replace signing certificate to Direct with Developer ID
|
||||||
run: |
|
run: |
|
||||||
sed -i '' 's/match AppStore/match Direct/' Yattee.xcodeproj/project.pbxproj
|
sed -i '' 's/match AppStore/match Direct/' Yattee.xcodeproj/project.pbxproj
|
||||||
@@ -76,7 +78,7 @@ jobs:
|
|||||||
echo "ZIP_PATH=fastlane/builds/${{ env.VERSION_NUMBER }}-${{ env.BUILD_NUMBER }}/macOS/Yattee-${{ env.VERSION_NUMBER }}-macOS.zip" >> $GITHUB_ENV
|
echo "ZIP_PATH=fastlane/builds/${{ env.VERSION_NUMBER }}-${{ env.BUILD_NUMBER }}/macOS/Yattee-${{ env.VERSION_NUMBER }}-macOS.zip" >> $GITHUB_ENV
|
||||||
- name: ZIP build
|
- name: ZIP build
|
||||||
run: /usr/bin/ditto -c -k --keepParent ${{ env.APP_PATH }} ${{ env.ZIP_PATH }}
|
run: /usr/bin/ditto -c -k --keepParent ${{ env.APP_PATH }} ${{ env.ZIP_PATH }}
|
||||||
- uses: actions/upload-artifact@v3
|
- uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: mac notarized build
|
name: mac notarized build
|
||||||
path: ${{ env.ZIP_PATH }}
|
path: ${{ env.ZIP_PATH }}
|
||||||
@@ -89,7 +91,7 @@ jobs:
|
|||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
- run: echo "BUILD_NUMBER=$(cat Yattee.xcodeproj/project.pbxproj | grep -m 1 CURRENT_PROJECT_VERSION | cut -d' ' -f3 | sed 's/;//g')" >> $GITHUB_ENV
|
- run: echo "BUILD_NUMBER=$(cat Yattee.xcodeproj/project.pbxproj | grep -m 1 CURRENT_PROJECT_VERSION | cut -d' ' -f3 | sed 's/;//g')" >> $GITHUB_ENV
|
||||||
- run: echo "VERSION_NUMBER=$(cat Yattee.xcodeproj/project.pbxproj | grep -m 1 MARKETING_VERSION | cut -d' ' -f3 | sed 's/;//g')" >> $GITHUB_ENV
|
- run: echo "VERSION_NUMBER=$(cat Yattee.xcodeproj/project.pbxproj | grep -m 1 MARKETING_VERSION | cut -d' ' -f3 | sed 's/;//g')" >> $GITHUB_ENV
|
||||||
- uses: actions/download-artifact@v3
|
- uses: actions/download-artifact@v4
|
||||||
with:
|
with:
|
||||||
path: artifacts
|
path: artifacts
|
||||||
- uses: ncipollo/release-action@v1
|
- uses: ncipollo/release-action@v1
|
||||||
|
|||||||
12
CHANGELOG.md
12
CHANGELOG.md
@@ -1,12 +1,12 @@
|
|||||||
## Build 198
|
## Build 201
|
||||||
|
|
||||||
## What's Changed
|
## What's Changed
|
||||||
* Stop making videos with unknown length shorts. by @derspyy in https://github.com/yattee/yattee/pull/849
|
* MPV audio track switching and fix default audio language by @n3d1117 in https://github.com/yattee/yattee/pull/874
|
||||||
* Translations update from Hosted Weblate by @weblate in https://github.com/yattee/yattee/pull/845
|
* Feat: Added caption support for Piped backend by @craftycorvid in https://github.com/yattee/yattee/pull/867
|
||||||
* Add Hungarian to locales list
|
* Translations update from Hosted Weblate by @weblate in https://github.com/yattee/yattee/pull/877
|
||||||
* Update dependencies
|
|
||||||
|
|
||||||
## Previous builds
|
## Previous builds
|
||||||
|
* Add support for invidious companion by @lifo9 in https://github.com/yattee/yattee/pull/863
|
||||||
* Add skip, play/pause, and fullscreen shortcuts to macOS player (by @rickykresslein)
|
* Add skip, play/pause, and fullscreen shortcuts to macOS player (by @rickykresslein)
|
||||||
* Added Settings Import/Export
|
* Added Settings Import/Export
|
||||||
* Export all settings, instances and accounts
|
* Export all settings, instances and accounts
|
||||||
@@ -58,6 +58,8 @@
|
|||||||
* Changes to defaults by @stonerl in https://github.com/yattee/yattee/pull/767
|
* Changes to defaults by @stonerl in https://github.com/yattee/yattee/pull/767
|
||||||
* Fixed fullscreen handling for backgrounding by @stonerl in https://github.com/yattee/yattee/pull/772
|
* Fixed fullscreen handling for backgrounding by @stonerl in https://github.com/yattee/yattee/pull/772
|
||||||
* Update now playing info when using system controls – Partial fix for 503 by @stonerl in https://github.com/yattee/yattee/pull/765
|
* Update now playing info when using system controls – Partial fix for 503 by @stonerl in https://github.com/yattee/yattee/pull/765
|
||||||
|
* Stop making videos with unknown length shorts. by @derspyy in https://github.com/yattee/yattee/pull/849
|
||||||
|
* Add Hungarian to locales list
|
||||||
* Fix crash on HLS live playback by @stonerl in https://github.com/yattee/yattee/pull/775
|
* Fix crash on HLS live playback by @stonerl in https://github.com/yattee/yattee/pull/775
|
||||||
* Fix mpv crashing on macOS by @stonerl in https://github.com/yattee/yattee/pull/754
|
* Fix mpv crashing on macOS by @stonerl in https://github.com/yattee/yattee/pull/754
|
||||||
* Refreshed icons for iOS and macOS by @stonerl in https://github.com/yattee/yattee/pull/752
|
* Refreshed icons for iOS and macOS by @stonerl in https://github.com/yattee/yattee/pull/752
|
||||||
|
|||||||
40
Gemfile.lock
40
Gemfile.lock
@@ -9,21 +9,22 @@ GEM
|
|||||||
public_suffix (>= 2.0.2, < 7.0)
|
public_suffix (>= 2.0.2, < 7.0)
|
||||||
artifactory (3.0.17)
|
artifactory (3.0.17)
|
||||||
atomos (0.1.3)
|
atomos (0.1.3)
|
||||||
aws-eventstream (1.3.0)
|
aws-eventstream (1.3.2)
|
||||||
aws-partitions (1.1028.0)
|
aws-partitions (1.1072.0)
|
||||||
aws-sdk-core (3.214.0)
|
aws-sdk-core (3.220.2)
|
||||||
aws-eventstream (~> 1, >= 1.3.0)
|
aws-eventstream (~> 1, >= 1.3.0)
|
||||||
aws-partitions (~> 1, >= 1.992.0)
|
aws-partitions (~> 1, >= 1.992.0)
|
||||||
aws-sigv4 (~> 1.9)
|
aws-sigv4 (~> 1.9)
|
||||||
|
base64
|
||||||
jmespath (~> 1, >= 1.6.1)
|
jmespath (~> 1, >= 1.6.1)
|
||||||
aws-sdk-kms (1.96.0)
|
aws-sdk-kms (1.99.0)
|
||||||
aws-sdk-core (~> 3, >= 3.210.0)
|
aws-sdk-core (~> 3, >= 3.216.0)
|
||||||
aws-sigv4 (~> 1.5)
|
aws-sigv4 (~> 1.5)
|
||||||
aws-sdk-s3 (1.176.1)
|
aws-sdk-s3 (1.182.0)
|
||||||
aws-sdk-core (~> 3, >= 3.210.0)
|
aws-sdk-core (~> 3, >= 3.216.0)
|
||||||
aws-sdk-kms (~> 1)
|
aws-sdk-kms (~> 1)
|
||||||
aws-sigv4 (~> 1.5)
|
aws-sigv4 (~> 1.5)
|
||||||
aws-sigv4 (1.10.1)
|
aws-sigv4 (1.11.0)
|
||||||
aws-eventstream (~> 1, >= 1.0.2)
|
aws-eventstream (~> 1, >= 1.0.2)
|
||||||
babosa (1.0.4)
|
babosa (1.0.4)
|
||||||
base64 (0.2.0)
|
base64 (0.2.0)
|
||||||
@@ -33,7 +34,7 @@ GEM
|
|||||||
commander (4.6.0)
|
commander (4.6.0)
|
||||||
highline (~> 2.0.0)
|
highline (~> 2.0.0)
|
||||||
declarative (0.0.20)
|
declarative (0.0.20)
|
||||||
digest-crc (0.6.5)
|
digest-crc (0.7.0)
|
||||||
rake (>= 12.0.0, < 14.0.0)
|
rake (>= 12.0.0, < 14.0.0)
|
||||||
domain_name (0.6.20240107)
|
domain_name (0.6.20240107)
|
||||||
dotenv (2.8.1)
|
dotenv (2.8.1)
|
||||||
@@ -67,8 +68,8 @@ GEM
|
|||||||
faraday-retry (1.0.3)
|
faraday-retry (1.0.3)
|
||||||
faraday_middleware (1.2.1)
|
faraday_middleware (1.2.1)
|
||||||
faraday (~> 1.0)
|
faraday (~> 1.0)
|
||||||
fastimage (2.3.1)
|
fastimage (2.4.0)
|
||||||
fastlane (2.226.0)
|
fastlane (2.227.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)
|
||||||
@@ -129,12 +130,12 @@ GEM
|
|||||||
google-apis-core (>= 0.11.0, < 2.a)
|
google-apis-core (>= 0.11.0, < 2.a)
|
||||||
google-apis-storage_v1 (0.31.0)
|
google-apis-storage_v1 (0.31.0)
|
||||||
google-apis-core (>= 0.11.0, < 2.a)
|
google-apis-core (>= 0.11.0, < 2.a)
|
||||||
google-cloud-core (1.7.1)
|
google-cloud-core (1.8.0)
|
||||||
google-cloud-env (>= 1.0, < 3.a)
|
google-cloud-env (>= 1.0, < 3.a)
|
||||||
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.4.0)
|
google-cloud-errors (1.5.0)
|
||||||
google-cloud-storage (1.47.0)
|
google-cloud-storage (1.47.0)
|
||||||
addressable (~> 2.8)
|
addressable (~> 2.8)
|
||||||
digest-crc (~> 0.4)
|
digest-crc (~> 0.4)
|
||||||
@@ -152,15 +153,17 @@ GEM
|
|||||||
highline (2.0.3)
|
highline (2.0.3)
|
||||||
http-cookie (1.0.8)
|
http-cookie (1.0.8)
|
||||||
domain_name (~> 0.5)
|
domain_name (~> 0.5)
|
||||||
httpclient (2.8.3)
|
httpclient (2.9.0)
|
||||||
|
mutex_m
|
||||||
jmespath (1.6.2)
|
jmespath (1.6.2)
|
||||||
json (2.9.1)
|
json (2.10.2)
|
||||||
jwt (2.10.0)
|
jwt (2.10.1)
|
||||||
base64
|
base64
|
||||||
mini_magick (4.13.2)
|
mini_magick (4.13.2)
|
||||||
mini_mime (1.1.5)
|
mini_mime (1.1.5)
|
||||||
multi_json (1.15.0)
|
multi_json (1.15.0)
|
||||||
multipart-post (2.4.1)
|
multipart-post (2.4.1)
|
||||||
|
mutex_m (0.3.0)
|
||||||
nanaimo (0.4.0)
|
nanaimo (0.4.0)
|
||||||
naturally (2.2.1)
|
naturally (2.2.1)
|
||||||
nkf (0.2.0)
|
nkf (0.2.0)
|
||||||
@@ -174,10 +177,10 @@ GEM
|
|||||||
trailblazer-option (>= 0.1.1, < 0.2.0)
|
trailblazer-option (>= 0.1.1, < 0.2.0)
|
||||||
uber (< 0.2.0)
|
uber (< 0.2.0)
|
||||||
retriable (3.1.2)
|
retriable (3.1.2)
|
||||||
rexml (3.4.0)
|
rexml (3.4.1)
|
||||||
rouge (3.28.0)
|
rouge (3.28.0)
|
||||||
ruby2_keywords (0.0.5)
|
ruby2_keywords (0.0.5)
|
||||||
rubyzip (2.3.2)
|
rubyzip (2.4.1)
|
||||||
security (0.1.5)
|
security (0.1.5)
|
||||||
signet (0.19.0)
|
signet (0.19.0)
|
||||||
addressable (~> 2.8)
|
addressable (~> 2.8)
|
||||||
@@ -213,6 +216,7 @@ GEM
|
|||||||
|
|
||||||
PLATFORMS
|
PLATFORMS
|
||||||
arm64-darwin-21
|
arm64-darwin-21
|
||||||
|
arm64-darwin-23
|
||||||
arm64-darwin-24
|
arm64-darwin-24
|
||||||
x86_64-darwin-19
|
x86_64-darwin-19
|
||||||
x86_64-darwin-20
|
x86_64-darwin-20
|
||||||
|
|||||||
@@ -10,14 +10,16 @@ struct Instance: Defaults.Serializable, Hashable, Identifiable {
|
|||||||
let apiURLString: String
|
let apiURLString: String
|
||||||
var frontendURL: String?
|
var frontendURL: String?
|
||||||
var proxiesVideos: Bool
|
var proxiesVideos: Bool
|
||||||
|
var invidiousCompanion: Bool
|
||||||
|
|
||||||
init(app: VideosApp, id: String? = nil, name: String? = nil, apiURLString: String, frontendURL: String? = nil, proxiesVideos: Bool = false) {
|
init(app: VideosApp, id: String? = nil, name: String? = nil, apiURLString: String, frontendURL: String? = nil, proxiesVideos: Bool = false, invidiousCompanion: Bool = false) {
|
||||||
self.app = app
|
self.app = app
|
||||||
self.id = id ?? UUID().uuidString
|
self.id = id ?? UUID().uuidString
|
||||||
self.name = name ?? app.rawValue
|
self.name = name ?? app.rawValue
|
||||||
self.apiURLString = apiURLString
|
self.apiURLString = apiURLString
|
||||||
self.frontendURL = frontendURL
|
self.frontendURL = frontendURL
|
||||||
self.proxiesVideos = proxiesVideos
|
self.proxiesVideos = proxiesVideos
|
||||||
|
self.invidiousCompanion = invidiousCompanion
|
||||||
}
|
}
|
||||||
|
|
||||||
var apiURL: URL! {
|
var apiURL: URL! {
|
||||||
|
|||||||
@@ -16,7 +16,8 @@ struct InstancesBridge: Defaults.Bridge {
|
|||||||
"name": value.name,
|
"name": value.name,
|
||||||
"apiURL": value.apiURLString,
|
"apiURL": value.apiURLString,
|
||||||
"frontendURL": value.frontendURL ?? "",
|
"frontendURL": value.frontendURL ?? "",
|
||||||
"proxiesVideos": value.proxiesVideos ? "true" : "false"
|
"proxiesVideos": value.proxiesVideos ? "true" : "false",
|
||||||
|
"invidiousCompanion": value.invidiousCompanion ? "true" : "false"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -33,7 +34,8 @@ struct InstancesBridge: Defaults.Bridge {
|
|||||||
let name = object["name"] ?? ""
|
let name = object["name"] ?? ""
|
||||||
let frontendURL: String? = object["frontendURL"]!.isEmpty ? nil : object["frontendURL"]
|
let frontendURL: String? = object["frontendURL"]!.isEmpty ? nil : object["frontendURL"]
|
||||||
let proxiesVideos = object["proxiesVideos"] == "true"
|
let proxiesVideos = object["proxiesVideos"] == "true"
|
||||||
|
let invidiousCompanion = object["invidiousCompanion"] == "true"
|
||||||
|
|
||||||
return Instance(app: app, id: id, name: name, apiURLString: apiURL, frontendURL: frontendURL, proxiesVideos: proxiesVideos)
|
return Instance(app: app, id: id, name: name, apiURLString: apiURL, frontendURL: frontendURL, proxiesVideos: proxiesVideos, invidiousCompanion: invidiousCompanion)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -79,6 +79,17 @@ final class InstancesModel: ObservableObject {
|
|||||||
Defaults[.instances][index] = instance
|
Defaults[.instances][index] = instance
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func setInvidiousCompanion(_ instance: Instance, _ invidiousCompanion: Bool) {
|
||||||
|
guard let index = Defaults[.instances].firstIndex(where: { $0.id == instance.id }) else {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
var instance = Defaults[.instances][index]
|
||||||
|
instance.invidiousCompanion = invidiousCompanion
|
||||||
|
|
||||||
|
Defaults[.instances][index] = instance
|
||||||
|
}
|
||||||
|
|
||||||
func remove(_ instance: Instance) {
|
func remove(_ instance: Instance) {
|
||||||
let accounts = accounts(instance.id)
|
let accounts = accounts(instance.id)
|
||||||
if let index = Defaults[.instances].firstIndex(where: { $0.id == instance.id }) {
|
if let index = Defaults[.instances].firstIndex(where: { $0.id == instance.id }) {
|
||||||
|
|||||||
@@ -655,21 +655,29 @@ final class InvidiousAPI: Service, ObservableObject, VideosAPI {
|
|||||||
if json["liveNow"].boolValue {
|
if json["liveNow"].boolValue {
|
||||||
return hls
|
return hls
|
||||||
}
|
}
|
||||||
|
let videoId = json["videoId"].stringValue
|
||||||
|
|
||||||
return extractFormatStreams(from: json["formatStreams"].arrayValue) +
|
return extractFormatStreams(from: json["formatStreams"].arrayValue, videoId: videoId) +
|
||||||
extractAdaptiveFormats(from: json["adaptiveFormats"].arrayValue) +
|
extractAdaptiveFormats(from: json["adaptiveFormats"].arrayValue, videoId: videoId) +
|
||||||
hls
|
hls
|
||||||
}
|
}
|
||||||
|
|
||||||
private func extractFormatStreams(from streams: [JSON]) -> [Stream] {
|
private func extractFormatStreams(from streams: [JSON], videoId: String?) -> [Stream] {
|
||||||
streams.compactMap { stream in
|
streams.compactMap { stream in
|
||||||
guard let streamURL = stream["url"].url else {
|
guard let streamURL = stream["url"].url else {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
let finalURL: URL
|
||||||
|
if let videoId, let itag = stream["itag"].string, account.instance.invidiousCompanion {
|
||||||
|
let companionURLString = "\(account.instance.apiURLString)/latest_version?id=\(videoId)&itag=\(itag)"
|
||||||
|
finalURL = URL(string: companionURLString) ?? streamURL
|
||||||
|
} else {
|
||||||
|
finalURL = streamURL
|
||||||
|
}
|
||||||
|
|
||||||
return SingleAssetStream(
|
return SingleAssetStream(
|
||||||
instance: account.instance,
|
instance: account.instance,
|
||||||
avAsset: AVURLAsset(url: streamURL),
|
avAsset: AVURLAsset(url: finalURL),
|
||||||
resolution: Stream.Resolution.from(resolution: stream["resolution"].string ?? ""),
|
resolution: Stream.Resolution.from(resolution: stream["resolution"].string ?? ""),
|
||||||
kind: .stream,
|
kind: .stream,
|
||||||
encoding: stream["encoding"].string ?? ""
|
encoding: stream["encoding"].string ?? ""
|
||||||
@@ -677,36 +685,93 @@ final class InvidiousAPI: Service, ObservableObject, VideosAPI {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private func extractAdaptiveFormats(from streams: [JSON]) -> [Stream] {
|
func extractXTags(from urlString: String) -> [String: String] {
|
||||||
let audioStreams = streams
|
guard let urlComponents = URLComponents(string: urlString),
|
||||||
|
let queryItems = urlComponents.queryItems,
|
||||||
|
let xtagsValue = queryItems.first(where: { $0.name == "xtags" })?.value else {
|
||||||
|
return [:]
|
||||||
|
}
|
||||||
|
|
||||||
|
guard let decoded = xtagsValue.removingPercentEncoding else { return [:] }
|
||||||
|
|
||||||
|
// Parse key-value pairs (format: key1=value1:key2=value2)
|
||||||
|
// Example: "acont=dubbed-auto:lang=en-US"
|
||||||
|
let pairs = decoded.split(separator: ":")
|
||||||
|
var result: [String: String] = [:]
|
||||||
|
for pair in pairs {
|
||||||
|
let parts = pair.split(separator: "=", maxSplits: 1)
|
||||||
|
if parts.count == 2 {
|
||||||
|
result[String(parts[0])] = String(parts[1])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
private func extractAdaptiveFormats(from streams: [JSON], videoId: String?) -> [Stream] {
|
||||||
|
let audioTracks = streams
|
||||||
.filter { $0["type"].stringValue.starts(with: "audio/mp4") }
|
.filter { $0["type"].stringValue.starts(with: "audio/mp4") }
|
||||||
.sorted {
|
.sorted {
|
||||||
$0.dictionaryValue["bitrate"]?.int ?? 0 >
|
$0.dictionaryValue["bitrate"]?.int ?? 0 >
|
||||||
$1.dictionaryValue["bitrate"]?.int ?? 0
|
$1.dictionaryValue["bitrate"]?.int ?? 0
|
||||||
}
|
}
|
||||||
guard let audioStream = audioStreams.first else {
|
.compactMap { audioStream -> Stream.AudioTrack? in
|
||||||
|
guard let url = audioStream["url"].url,
|
||||||
|
let audioItag = audioStream["itag"].string
|
||||||
|
else { return nil }
|
||||||
|
|
||||||
|
let finalURL: URL
|
||||||
|
if let videoId, account.instance.invidiousCompanion {
|
||||||
|
let audioCompanionURLString = "\(account.instance.apiURLString)/latest_version?id=\(videoId)&itag=\(audioItag)"
|
||||||
|
finalURL = URL(string: audioCompanionURLString) ?? url
|
||||||
|
} else {
|
||||||
|
finalURL = url
|
||||||
|
}
|
||||||
|
|
||||||
|
let xTags = extractXTags(from: url.absoluteString)
|
||||||
|
|
||||||
|
return Stream.AudioTrack(
|
||||||
|
url: finalURL,
|
||||||
|
content: xTags["acont"],
|
||||||
|
language: xTags["lang"]
|
||||||
|
)
|
||||||
|
}
|
||||||
|
.sorted {
|
||||||
|
/// Always prefer original audio streams over dubbed ones
|
||||||
|
!$0.isDubbed && $1.isDubbed
|
||||||
|
}
|
||||||
|
|
||||||
|
guard !audioTracks.isEmpty else {
|
||||||
return .init()
|
return .init()
|
||||||
}
|
}
|
||||||
|
|
||||||
let videoStreams = streams.filter { $0["type"].stringValue.starts(with: "video/") }
|
let videoStreams = streams.filter { $0["type"].stringValue.starts(with: "video/") }
|
||||||
|
|
||||||
return videoStreams.compactMap { videoStream in
|
return videoStreams.compactMap { videoStream in
|
||||||
guard let audioAssetURL = audioStream["url"].url,
|
guard let videoAssetURL = videoStream["url"].url,
|
||||||
let videoAssetURL = videoStream["url"].url
|
let videoItag = videoStream["itag"].string
|
||||||
else {
|
else {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
let finalVideoURL: URL
|
||||||
|
|
||||||
|
if let videoId, account.instance.invidiousCompanion {
|
||||||
|
let videoCompanionURLString = "\(account.instance.apiURLString)/latest_version?id=\(videoId)&itag=\(videoItag)"
|
||||||
|
finalVideoURL = URL(string: videoCompanionURLString) ?? videoAssetURL
|
||||||
|
} else {
|
||||||
|
finalVideoURL = videoAssetURL
|
||||||
|
}
|
||||||
|
|
||||||
return Stream(
|
return Stream(
|
||||||
instance: account.instance,
|
instance: account.instance,
|
||||||
audioAsset: AVURLAsset(url: audioAssetURL),
|
audioAsset: AVURLAsset(url: audioTracks[0].url),
|
||||||
videoAsset: AVURLAsset(url: videoAssetURL),
|
videoAsset: AVURLAsset(url: finalVideoURL),
|
||||||
resolution: Stream.Resolution.from(resolution: videoStream["resolution"].stringValue),
|
resolution: Stream.Resolution.from(resolution: videoStream["resolution"].stringValue),
|
||||||
kind: .adaptive,
|
kind: .adaptive,
|
||||||
encoding: videoStream["encoding"].string,
|
encoding: videoStream["encoding"].string,
|
||||||
videoFormat: videoStream["type"].string,
|
videoFormat: videoStream["type"].string,
|
||||||
bitrate: videoStream["bitrate"].int,
|
bitrate: videoStream["bitrate"].int,
|
||||||
requestRange: videoStream["init"].string ?? videoStream["index"].string
|
requestRange: videoStream["init"].string ?? videoStream["index"].string,
|
||||||
|
audioTracks: audioTracks
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -591,7 +591,8 @@ final class PipedAPI: Service, ObservableObject, VideosAPI {
|
|||||||
dislikes: details["dislikes"]?.int,
|
dislikes: details["dislikes"]?.int,
|
||||||
streams: extractStreams(from: content),
|
streams: extractStreams(from: content),
|
||||||
related: extractRelated(from: content),
|
related: extractRelated(from: content),
|
||||||
chapters: extractChapters(from: content)
|
chapters: extractChapters(from: content),
|
||||||
|
captions: extractCaptions(from: content)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -819,6 +820,24 @@ final class PipedAPI: Service, ObservableObject, VideosAPI {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private func extractCaptions(from content: JSON) -> [Captions] {
|
||||||
|
content["subtitles"].arrayValue.compactMap { details in
|
||||||
|
guard let url = details["url"].url,
|
||||||
|
let code = details["code"].string,
|
||||||
|
let label = details["name"].string,
|
||||||
|
var components = URLComponents(url: url, resolvingAgainstBaseURL: false)
|
||||||
|
else { return nil }
|
||||||
|
|
||||||
|
components.queryItems = components.queryItems?.map { item in
|
||||||
|
item.name == "fmt" ? URLQueryItem(name: "fmt", value: "srt") : item
|
||||||
|
}
|
||||||
|
|
||||||
|
guard let newUrl = components.url else { return nil }
|
||||||
|
|
||||||
|
return Captions(label: label, code: code, url: newUrl)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private func contentItemsDictionary(from content: JSON) -> JSON {
|
private func contentItemsDictionary(from content: JSON) -> JSON {
|
||||||
if let key = Self.contentItemsKeys.first(where: { content.dictionaryValue.keys.contains($0) }),
|
if let key = Self.contentItemsKeys.first(where: { content.dictionaryValue.keys.contains($0) }),
|
||||||
let items = content.dictionaryValue[key]
|
let items = content.dictionaryValue[key]
|
||||||
|
|||||||
@@ -186,6 +186,10 @@ final class MPVBackend: PlayerBackend {
|
|||||||
client?.audioSampleRate ?? "unknown"
|
client?.audioSampleRate ?? "unknown"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var availableAudioTracks: [Stream.AudioTrack] {
|
||||||
|
stream?.audioTracks ?? []
|
||||||
|
}
|
||||||
|
|
||||||
init() {
|
init() {
|
||||||
clientTimer = .init(interval: .seconds(Self.timeUpdateInterval), mode: .infinite) { [weak self] _ in
|
clientTimer = .init(interval: .seconds(Self.timeUpdateInterval), mode: .infinite) { [weak self] _ in
|
||||||
guard let self, self.model.activeBackend == .mpv else {
|
guard let self, self.model.activeBackend == .mpv else {
|
||||||
@@ -243,6 +247,9 @@ final class MPVBackend: PlayerBackend {
|
|||||||
|
|
||||||
let updateCurrentStream = {
|
let updateCurrentStream = {
|
||||||
DispatchQueue.main.async { [weak self] in
|
DispatchQueue.main.async { [weak self] in
|
||||||
|
if self?.video?.id != video.id {
|
||||||
|
self?.model.selectedAudioTrackIndex = 0
|
||||||
|
}
|
||||||
self?.stream = stream
|
self?.stream = stream
|
||||||
self?.video = video
|
self?.video = video
|
||||||
self?.model.stream = stream
|
self?.model.stream = stream
|
||||||
@@ -319,6 +326,7 @@ final class MPVBackend: PlayerBackend {
|
|||||||
startPlaying()
|
startPlaying()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
stream.audioAsset = AVURLAsset(url: stream.audioTracks[stream.selectedAudioTrackIndex].url)
|
||||||
let fileToLoad = self.model.musicMode ? stream.audioAsset.url : stream.videoAsset.url
|
let fileToLoad = self.model.musicMode ? stream.audioAsset.url : stream.videoAsset.url
|
||||||
let audioTrack = self.model.musicMode ? nil : stream.audioAsset.url
|
let audioTrack = self.model.musicMode ? nil : stream.audioAsset.url
|
||||||
|
|
||||||
@@ -728,4 +736,13 @@ final class MPVBackend: PlayerBackend {
|
|||||||
logger.info("MPV backend received unhandled property: \(name)")
|
logger.info("MPV backend received unhandled property: \(name)")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func switchAudioTrack(to index: Int) {
|
||||||
|
guard let stream, let video else { return }
|
||||||
|
|
||||||
|
stream.selectedAudioTrackIndex = index
|
||||||
|
model.saveTime { [weak self] in
|
||||||
|
self?.playStream(stream, of: video, preservingTime: true, upgrading: false)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -210,6 +210,14 @@ final class PlayerModel: ObservableObject {
|
|||||||
var keyPressMonitor: Any?
|
var keyPressMonitor: Any?
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@Published var selectedAudioTrackIndex = 0 {
|
||||||
|
didSet {
|
||||||
|
if oldValue != selectedAudioTrackIndex {
|
||||||
|
handleAudioTrackChange()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
init() {
|
init() {
|
||||||
#if os(iOS)
|
#if os(iOS)
|
||||||
isOrientationLocked = Defaults[.isOrientationLocked]
|
isOrientationLocked = Defaults[.isOrientationLocked]
|
||||||
@@ -1467,4 +1475,12 @@ final class PlayerModel: ObservableObject {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
private func handleAudioTrackChange() {
|
||||||
|
(backend as? MPVBackend)?.switchAudioTrack(to: selectedAudioTrackIndex)
|
||||||
|
}
|
||||||
|
|
||||||
|
var availableAudioTracks: [Stream.AudioTrack] {
|
||||||
|
(backend as? MPVBackend)?.availableAudioTracks ?? []
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -192,6 +192,25 @@ class Stream: Equatable, Hashable, Identifiable {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct AudioTrack: Hashable, Identifiable {
|
||||||
|
let id = UUID().uuidString
|
||||||
|
let url: URL
|
||||||
|
let content: String?
|
||||||
|
let language: String?
|
||||||
|
|
||||||
|
var displayLanguage: String {
|
||||||
|
LanguageCodes(rawValue: language ?? "")?.description.capitalized ?? language ?? "Unknown"
|
||||||
|
}
|
||||||
|
|
||||||
|
var description: String {
|
||||||
|
"\(displayLanguage) (\(content ?? "Unknown"))"
|
||||||
|
}
|
||||||
|
|
||||||
|
var isDubbed: Bool {
|
||||||
|
content?.lowercased().starts(with: "dubbed") ?? false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
let id = UUID()
|
let id = UUID()
|
||||||
|
|
||||||
var instance: Instance!
|
var instance: Instance!
|
||||||
@@ -208,6 +227,8 @@ class Stream: Equatable, Hashable, Identifiable {
|
|||||||
var videoFormat: String?
|
var videoFormat: String?
|
||||||
var bitrate: Int?
|
var bitrate: Int?
|
||||||
var requestRange: String?
|
var requestRange: String?
|
||||||
|
var audioTracks: [AudioTrack] = []
|
||||||
|
var selectedAudioTrackIndex = 0
|
||||||
|
|
||||||
init(
|
init(
|
||||||
instance: Instance? = nil,
|
instance: Instance? = nil,
|
||||||
@@ -220,7 +241,8 @@ class Stream: Equatable, Hashable, Identifiable {
|
|||||||
encoding: String? = nil,
|
encoding: String? = nil,
|
||||||
videoFormat: String? = nil,
|
videoFormat: String? = nil,
|
||||||
bitrate: Int? = nil,
|
bitrate: Int? = nil,
|
||||||
requestRange: String? = nil
|
requestRange: String? = nil,
|
||||||
|
audioTracks: [AudioTrack] = []
|
||||||
) {
|
) {
|
||||||
self.instance = instance
|
self.instance = instance
|
||||||
self.audioAsset = audioAsset
|
self.audioAsset = audioAsset
|
||||||
@@ -233,6 +255,7 @@ class Stream: Equatable, Hashable, Identifiable {
|
|||||||
format = .from(videoFormat ?? "")
|
format = .from(videoFormat ?? "")
|
||||||
self.bitrate = bitrate
|
self.bitrate = bitrate
|
||||||
self.requestRange = requestRange
|
self.requestRange = requestRange
|
||||||
|
self.audioTracks = audioTracks
|
||||||
}
|
}
|
||||||
|
|
||||||
var isLocal: Bool {
|
var isLocal: Bool {
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ enum LanguageCodes: String, CaseIterable {
|
|||||||
case Greek = "el"
|
case Greek = "el"
|
||||||
case English = "en"
|
case English = "en"
|
||||||
case English_GB = "en-GB"
|
case English_GB = "en-GB"
|
||||||
|
case English_US = "en-US"
|
||||||
case Spanish = "es"
|
case Spanish = "es"
|
||||||
case Persian = "fa"
|
case Persian = "fa"
|
||||||
case Finnish = "fi"
|
case Finnish = "fi"
|
||||||
@@ -76,6 +77,8 @@ enum LanguageCodes: String, CaseIterable {
|
|||||||
return "English"
|
return "English"
|
||||||
case .English_GB:
|
case .English_GB:
|
||||||
return "English (United Kingdom)"
|
return "English (United Kingdom)"
|
||||||
|
case .English_US:
|
||||||
|
return "English (United States)"
|
||||||
case .Spanish:
|
case .Spanish:
|
||||||
return "Spanish"
|
return "Spanish"
|
||||||
case .Persian:
|
case .Persian:
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ struct ControlsOverlay: View {
|
|||||||
case increaseRate
|
case increaseRate
|
||||||
case decreaseRate
|
case decreaseRate
|
||||||
case captions
|
case captions
|
||||||
|
case audioTrack
|
||||||
}
|
}
|
||||||
|
|
||||||
@FocusState private var focusedField: Field?
|
@FocusState private var focusedField: Field?
|
||||||
@@ -60,6 +61,15 @@ struct ControlsOverlay: View {
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if !player.availableAudioTracks.isEmpty {
|
||||||
|
Section(header: controlsHeader("Audio Track".localized())) {
|
||||||
|
audioTrackButton
|
||||||
|
#if os(tvOS)
|
||||||
|
.focused($focusedField, equals: .audioTrack)
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Section(header: controlsHeader("Stream & Player".localized())) {
|
Section(header: controlsHeader("Stream & Player".localized())) {
|
||||||
qualityButton
|
qualityButton
|
||||||
#if os(tvOS)
|
#if os(tvOS)
|
||||||
@@ -438,6 +448,46 @@ struct ControlsOverlay: View {
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ViewBuilder private var audioTrackButton: some View {
|
||||||
|
#if os(macOS)
|
||||||
|
audioTrackPicker
|
||||||
|
.labelsHidden()
|
||||||
|
.frame(maxWidth: 300)
|
||||||
|
#elseif os(iOS)
|
||||||
|
Menu {
|
||||||
|
audioTrackPicker
|
||||||
|
} label: {
|
||||||
|
Text(player.availableAudioTracks[player.selectedAudioTrackIndex].displayLanguage)
|
||||||
|
.frame(maxWidth: 240, alignment: .trailing)
|
||||||
|
}
|
||||||
|
.transaction { t in t.animation = .none }
|
||||||
|
.buttonStyle(.plain)
|
||||||
|
.foregroundColor(.accentColor)
|
||||||
|
.frame(maxWidth: 240, alignment: .trailing)
|
||||||
|
.frame(height: 40)
|
||||||
|
#else
|
||||||
|
ControlsOverlayButton(focusedField: $focusedField, field: .audioTrack) {
|
||||||
|
Text(player.availableAudioTracks[player.selectedAudioTrackIndex].displayLanguage)
|
||||||
|
.frame(maxWidth: 320)
|
||||||
|
}
|
||||||
|
.contextMenu {
|
||||||
|
ForEach(Array(player.availableAudioTracks.enumerated()), id: \.offset) { index, track in
|
||||||
|
Button(track.description) { player.selectedAudioTrackIndex = index }
|
||||||
|
}
|
||||||
|
Button("Cancel", role: .cancel) {}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
private var audioTrackPicker: some View {
|
||||||
|
Picker("", selection: $player.selectedAudioTrackIndex) {
|
||||||
|
ForEach(Array(player.availableAudioTracks.enumerated()), id: \.offset) { index, track in
|
||||||
|
Text(track.description).tag(index)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.transaction { t in t.animation = .none }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
struct ControlsOverlay_Previews: PreviewProvider {
|
struct ControlsOverlay_Previews: PreviewProvider {
|
||||||
|
|||||||
@@ -22,6 +22,7 @@ struct PlaybackSettings: View {
|
|||||||
case increaseRate
|
case increaseRate
|
||||||
case decreaseRate
|
case decreaseRate
|
||||||
case captions
|
case captions
|
||||||
|
case audioTrack
|
||||||
}
|
}
|
||||||
|
|
||||||
@FocusState private var focusedField: Field?
|
@FocusState private var focusedField: Field?
|
||||||
@@ -112,6 +113,17 @@ struct PlaybackSettings: View {
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if !player.availableAudioTracks.isEmpty {
|
||||||
|
HStack {
|
||||||
|
controlsHeader("Audio Track".localized())
|
||||||
|
Spacer()
|
||||||
|
audioTrackButton
|
||||||
|
#if os(tvOS)
|
||||||
|
.focused($focusedField, equals: .audioTrack)
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
HStack(spacing: 8) {
|
HStack(spacing: 8) {
|
||||||
controlsHeader("Backend".localized())
|
controlsHeader("Backend".localized())
|
||||||
Spacer()
|
Spacer()
|
||||||
@@ -453,6 +465,46 @@ struct PlaybackSettings: View {
|
|||||||
}
|
}
|
||||||
.disabled(captions.isEmpty)
|
.disabled(captions.isEmpty)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ViewBuilder private var audioTrackButton: some View {
|
||||||
|
#if os(macOS)
|
||||||
|
audioTrackPicker
|
||||||
|
.labelsHidden()
|
||||||
|
.frame(maxWidth: 300)
|
||||||
|
#elseif os(iOS)
|
||||||
|
Menu {
|
||||||
|
audioTrackPicker
|
||||||
|
} label: {
|
||||||
|
Text(player.availableAudioTracks[player.selectedAudioTrackIndex].displayLanguage)
|
||||||
|
.frame(maxWidth: 240, alignment: .trailing)
|
||||||
|
}
|
||||||
|
.transaction { t in t.animation = .none }
|
||||||
|
.buttonStyle(.plain)
|
||||||
|
.foregroundColor(.accentColor)
|
||||||
|
.frame(maxWidth: 240, alignment: .trailing)
|
||||||
|
.frame(height: 40)
|
||||||
|
#else
|
||||||
|
ControlsOverlayButton(focusedField: $focusedField, field: .audioTrack) {
|
||||||
|
Text(player.availableAudioTracks[player.selectedAudioTrackIndex].displayLanguage)
|
||||||
|
.frame(maxWidth: 320)
|
||||||
|
}
|
||||||
|
.contextMenu {
|
||||||
|
ForEach(Array(player.availableAudioTracks.enumerated()), id: \.offset) { index, track in
|
||||||
|
Button(track.description) { player.selectedAudioTrackIndex = index }
|
||||||
|
}
|
||||||
|
Button("Cancel", role: .cancel) {}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
private var audioTrackPicker: some View {
|
||||||
|
Picker("", selection: $player.selectedAudioTrackIndex) {
|
||||||
|
ForEach(Array(player.availableAudioTracks.enumerated()), id: \.offset) { index, track in
|
||||||
|
Text(track.description).tag(index)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.transaction { t in t.animation = .none }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
struct PlaybackSettings_Previews: PreviewProvider {
|
struct PlaybackSettings_Previews: PreviewProvider {
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ struct InstanceSettings: View {
|
|||||||
|
|
||||||
@State private var frontendURL = ""
|
@State private var frontendURL = ""
|
||||||
@State private var proxiesVideos = false
|
@State private var proxiesVideos = false
|
||||||
|
@State private var invidiousCompanion = false
|
||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
List {
|
List {
|
||||||
@@ -87,6 +88,16 @@ struct InstanceSettings: View {
|
|||||||
InstancesModel.shared.setProxiesVideos(instance, newValue)
|
InstancesModel.shared.setProxiesVideos(instance, newValue)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if instance.app == .invidious {
|
||||||
|
invidiousCompanionToggle
|
||||||
|
.onAppear {
|
||||||
|
invidiousCompanion = instance.invidiousCompanion
|
||||||
|
}
|
||||||
|
.onChange(of: invidiousCompanion) { newValue in
|
||||||
|
InstancesModel.shared.setInvidiousCompanion(instance, newValue)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#if os(tvOS)
|
#if os(tvOS)
|
||||||
.frame(maxWidth: 1000)
|
.frame(maxWidth: 1000)
|
||||||
@@ -101,6 +112,10 @@ struct InstanceSettings: View {
|
|||||||
Toggle("Proxy videos", isOn: $proxiesVideos)
|
Toggle("Proxy videos", isOn: $proxiesVideos)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private var invidiousCompanionToggle: some View {
|
||||||
|
Toggle("Invidious companion", isOn: $invidiousCompanion)
|
||||||
|
}
|
||||||
|
|
||||||
private func removeAccount(_ account: Account) {
|
private func removeAccount(_ account: Account) {
|
||||||
AccountsModel.remove(account)
|
AccountsModel.remove(account)
|
||||||
accountsChanged.toggle()
|
accountsChanged.toggle()
|
||||||
|
|||||||
@@ -54,7 +54,7 @@
|
|||||||
"Connected successfully (%@)" = "تم الاتصال بنجاح (%@)";
|
"Connected successfully (%@)" = "تم الاتصال بنجاح (%@)";
|
||||||
"Country" = "البلد";
|
"Country" = "البلد";
|
||||||
"Country Name or Code" = "اسم الدولة أو الرمز";
|
"Country Name or Code" = "اسم الدولة أو الرمز";
|
||||||
"Copy %@ link" = "نسخ رابط %@";
|
"Copy %@ link" = "نسخ رابط%@";
|
||||||
"Contributing" = "المساهمة";
|
"Contributing" = "المساهمة";
|
||||||
"Contact" = "التواصل";
|
"Contact" = "التواصل";
|
||||||
"Continue from %@" = "الإستمرار من %@";
|
"Continue from %@" = "الإستمرار من %@";
|
||||||
|
|||||||
@@ -502,3 +502,18 @@
|
|||||||
"Playlist is empty\n\nTap and hold on a video and then \n\"Add to Playlist\"" = "La llista de reproducció està buida\n\nMantén premut un vídeo i després\n\"Afegir a la llista de reproducció\"";
|
"Playlist is empty\n\nTap and hold on a video and then \n\"Add to Playlist\"" = "La llista de reproducció està buida\n\nMantén premut un vídeo i després\n\"Afegir a la llista de reproducció\"";
|
||||||
"Open logs in Finder" = "Obriu els registres al Finder";
|
"Open logs in Finder" = "Obriu els registres al Finder";
|
||||||
"No locations available at the moment" = "No hi ha ubicacions disponibles en aquest moment";
|
"No locations available at the moment" = "No hi ha ubicacions disponibles en aquest moment";
|
||||||
|
"File information" = "Informació del fitxer";
|
||||||
|
"Account already exists" = "El compte ja existeix";
|
||||||
|
"Your Accounts" = "Els vostres comptes";
|
||||||
|
"Cells" = "Cel·les";
|
||||||
|
"Lock" = "Bloca";
|
||||||
|
"Description" = "Descripció";
|
||||||
|
"Hide player" = "Amaga el reproductor";
|
||||||
|
"Disable filters" = "Desactiva els filtres";
|
||||||
|
"Show cache status" = "Mostra l'estat de la memòria cau";
|
||||||
|
"Cache" = "Memòria cau";
|
||||||
|
"List" = "Llista";
|
||||||
|
"Platform" = "Plataforma";
|
||||||
|
"Total size: %@" = "Mida total: %@";
|
||||||
|
"Close video" = "Tanca el vídeo";
|
||||||
|
"Podcasts" = "Pòdcasts";
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
"Accounts" = "Konten";
|
"Accounts" = "Konten";
|
||||||
"Add Account" = "Konto hinzufügen";
|
"Add Account" = "Konto hinzufügen";
|
||||||
"Add Location" = "Ort hinzufügen";
|
"Add Location" = "Ort hinzufügen";
|
||||||
"Add Location..." = "Ort hinzufügen …";
|
"Add Location..." = "Standort hinzufügen …";
|
||||||
"Add to Playlist" = "Zu Wiedergabeliste hinzufügen";
|
"Add to Playlist" = "Zu Wiedergabeliste hinzufügen";
|
||||||
"Backend" = "Backend";
|
"Backend" = "Backend";
|
||||||
"Badge color" = "Markierungsfarbe";
|
"Badge color" = "Markierungsfarbe";
|
||||||
|
|||||||
@@ -14,10 +14,10 @@
|
|||||||
Video duration filter in search */
|
Video duration filter in search */
|
||||||
"Any" = "Cualquiera";
|
"Any" = "Cualquiera";
|
||||||
"Apply to all" = "Aplicar a todo";
|
"Apply to all" = "Aplicar a todo";
|
||||||
"Are you sure you want to clear history of watched videos?" = "¿Estás seguro de que quieres borrar el historial de vídeos vistos?";
|
"Are you sure you want to clear history of watched videos?" = "¿Confirma que quiere eliminar el historial de vídeos vistos?";
|
||||||
"Bugs and great feature ideas can be sent to the GitHub issues tracker. " = "Si descubres un error o tienes ideas, puedes enviarlas a través de los issues de GitHub. ";
|
"Bugs and great feature ideas can be sent to the GitHub issues tracker. " = "Si descubre un error o tiene ideas, puede enviarlas a través de los informes de GitHub. ";
|
||||||
"Captions" = "Subtítulos";
|
"Captions" = "Subtítulos";
|
||||||
"Categories to Skip" = "Categorías a omitir";
|
"Categories to Skip" = "Categorías para omitir";
|
||||||
"Chapters" = "Capítulos";
|
"Chapters" = "Capítulos";
|
||||||
"Charging" = "Cargando";
|
"Charging" = "Cargando";
|
||||||
"Clear" = "Limpiar";
|
"Clear" = "Limpiar";
|
||||||
@@ -37,23 +37,23 @@
|
|||||||
"Country Name or Code" = "Nombre o código del país";
|
"Country Name or Code" = "Nombre o código del país";
|
||||||
"Create Playlist" = "Crear lista de reproducción";
|
"Create Playlist" = "Crear lista de reproducción";
|
||||||
"10 seconds forwards/backwards" = "10 segundos hacia detrás/hacia delante";
|
"10 seconds forwards/backwards" = "10 segundos hacia detrás/hacia delante";
|
||||||
"Add to Playlist" = "Añadir a playlist";
|
"Add to Playlist" = "Añadir a lista";
|
||||||
"Add to Playlist..." = "Añadir a playlist...";
|
"Add to Playlist..." = "Añadir a lista...";
|
||||||
"Advanced" = "Avanzado";
|
"Advanced" = "Avanzado";
|
||||||
"Always use AVPlayer for live videos" = "Siempre usar AVPlayer para vídeos en vivo";
|
"Always use AVPlayer for live videos" = "Siempre usar AVPlayer para vídeos en vivo";
|
||||||
|
|
||||||
/* Trending category, section containing all kinds of videos */
|
/* Trending category, section containing all kinds of videos */
|
||||||
"All" = "Todo";
|
"All" = "Todo";
|
||||||
"Anonymous" = "Anónimo";
|
"Anonymous" = "Anónimo";
|
||||||
"Backend" = "Backend";
|
"Backend" = "Motor";
|
||||||
"Are you sure you want to delete playlist?" = "¿Estás seguro de que quieres eliminar esta lista de reproducción?";
|
"Are you sure you want to delete playlist?" = "¿Confirma que quiere eliminar esta lista de reproducción?";
|
||||||
"Automatic" = "Automático";
|
"Automatic" = "Automático";
|
||||||
"Badge" = "Insignia";
|
"Badge" = "Insignia";
|
||||||
"Are you sure you want to clear search history?" = "¿Estás seguro de que quieres eliminar tu historial de búsqueda?";
|
"Are you sure you want to clear search history?" = "¿Confirma que quiere eliminar el historial de búsquedas?";
|
||||||
"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?" = "¿Confirma que quiere restablecer la configuración predeterminada 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 %@?" = "¿Confirma que quiere cancelar la suscripción a %@?";
|
||||||
"Cancel" = "Cancelar";
|
"Cancel" = "Cancelar";
|
||||||
"Autoplaying Next" = "Autoreproducir el siguiente";
|
"Autoplaying Next" = "Reproducir siguiente automáticamente";
|
||||||
"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";
|
||||||
@@ -120,7 +120,7 @@
|
|||||||
"Explicit reminders to like, subscribe or interact with them on any paid or free platform(s) (e.g. click on a video)." = "Solicitudes explícitas para dar me gusta, suscribirse o interactuar con ellos en una o más plataformas gratuitas o de pago (por ejemplo, hacer clic en un vídeo).";
|
"Explicit reminders to like, subscribe or interact with them on any paid or free platform(s) (e.g. click on a video)." = "Solicitudes explícitas para dar me gusta, suscribirse o interactuar con ellos en una o más plataformas gratuitas o de pago (por ejemplo, hacer clic en un vídeo).";
|
||||||
"Formats will be selected in order as listed.\nHLS is an adaptive format (resolution setting does not apply)." = "Los formatos se seleccionarán en orden como se indica.\nHLS es un formato adaptable (no aplica la configuración de resolución).";
|
"Formats will be selected in order as listed.\nHLS is an adaptive format (resolution setting does not apply)." = "Los formatos se seleccionarán en orden como se indica.\nHLS es un formato adaptable (no aplica la configuración de resolución).";
|
||||||
"Fullscreen size" = "Tamaño de pantalla completa";
|
"Fullscreen size" = "Tamaño de pantalla completa";
|
||||||
"Badge & Decreased opacity" = "Insignia y opacidad dosminuída";
|
"Badge & Decreased opacity" = "Insignia y opacidad disminuida";
|
||||||
"Browsing" = "Navegando por";
|
"Browsing" = "Navegando por";
|
||||||
"Buffering stream..." = "Cargando flujo de datos...";
|
"Buffering stream..." = "Cargando flujo de datos...";
|
||||||
"Cellular" = "Celular";
|
"Cellular" = "Celular";
|
||||||
@@ -161,10 +161,10 @@
|
|||||||
"Left" = "Izquierda";
|
"Left" = "Izquierda";
|
||||||
"Video Details" = "Datalles del Video";
|
"Video Details" = "Datalles del Video";
|
||||||
"Only for local files and URLs" = "olo para archivos locales y URLs";
|
"Only for local files and URLs" = "olo para archivos locales y URLs";
|
||||||
"\"%@\" will be irreversibly removed from this device." = "\"%@\" será eliminado irreversiblemente de este dispositivo.";
|
"\"%@\" will be irreversibly removed from this device." = "«%@» se eliminará irreversiblemente de este dispositivo.";
|
||||||
|
|
||||||
/* Player controls layout size */
|
/* Player controls layout size */
|
||||||
"Small" = "Achicar";
|
"Small" = "Pequeño";
|
||||||
"Now Playing" = "Reproduciendo";
|
"Now Playing" = "Reproduciendo";
|
||||||
"Stream & Player" = "Transmisión y reproductor";
|
"Stream & Player" = "Transmisión y reproductor";
|
||||||
"Picture in Picture" = "Imagen en imagen";
|
"Picture in Picture" = "Imagen en imagen";
|
||||||
@@ -184,15 +184,15 @@
|
|||||||
"Verified" = "Verificado";
|
"Verified" = "Verificado";
|
||||||
"History" = "Historial";
|
"History" = "Historial";
|
||||||
"Locations Manifest" = "Manifiesto de ubicaciones";
|
"Locations Manifest" = "Manifiesto de ubicaciones";
|
||||||
"Playlist is empty\n\nTap and hold on a video and then \n\"Add to Playlist\"" = "La lista de reproducción está vacía\n\nToca y mantén presionado un video y luego \n\"Agregar a la lista de reproducción\"";
|
"Playlist is empty\n\nTap and hold on a video and then \n\"Add to Playlist\"" = "La lista de reproducción está vacía\n\nToque y mantenga presionado un vídeo y luego\n«Añadir a la lista de reproducción»";
|
||||||
"Play Now" = "Reproducir ahora";
|
"Play Now" = "Reproducir ahora";
|
||||||
"Enter link to open" = "Introduce el enlace para abrir";
|
"Enter link to open" = "Introduce el enlace para abrir";
|
||||||
"Share..." = "Compartir...";
|
"Share..." = "Compartir...";
|
||||||
"Restore default profiles..." = "Restaurar perfiles predeterminados...";
|
"Restore default profiles..." = "Restaurar perfiles predeterminados...";
|
||||||
"Round corners" = "Esquinas redondeadas";
|
"Round corners" = "Esquinas redondeadas";
|
||||||
"SponsorBlock" = "Bloque Patrocinador";
|
"SponsorBlock" = "SponsorBlock";
|
||||||
"Statistics" = "Estadísticas";
|
"Statistics" = "Estadísticas";
|
||||||
"Matrix Channel" = "Canal matriz";
|
"Matrix Channel" = "Canal de Matrix";
|
||||||
"More info can be found in:" = "Se puede encontrar más información en:";
|
"More info can be found in:" = "Se puede encontrar más información en:";
|
||||||
"Resolution" = "Resolución";
|
"Resolution" = "Resolución";
|
||||||
"Open Videos" = "Abrir Videos";
|
"Open Videos" = "Abrir Videos";
|
||||||
@@ -215,7 +215,7 @@
|
|||||||
"Show playback statistics" = "Mostrar estadísticas de reproducción";
|
"Show playback statistics" = "Mostrar estadísticas de reproducción";
|
||||||
"Remove Location" = "Eliminar ubicación";
|
"Remove Location" = "Eliminar ubicación";
|
||||||
"Inspector visibility" = "Visibilidad del inspector";
|
"Inspector visibility" = "Visibilidad del inspector";
|
||||||
"Open \"Playlists\" tab to create new one" = "Abra la pestaña \"Listas de reproducción\" para crear una nueva";
|
"Open \"Playlists\" tab to create new one" = "Abra la pestaña «Listas» para crear una lista de reproducción";
|
||||||
"Show Inspector" = "Mostrar inspector";
|
"Show Inspector" = "Mostrar inspector";
|
||||||
|
|
||||||
/* Video date filter in search */
|
/* Video date filter in search */
|
||||||
@@ -234,7 +234,7 @@
|
|||||||
"Play in PiP" = "Reproducir en PiP";
|
"Play in PiP" = "Reproducir en PiP";
|
||||||
|
|
||||||
/* SponsorBlock category name */
|
/* SponsorBlock category name */
|
||||||
"Sponsor" = "Sponsor";
|
"Sponsor" = "Patrocinador";
|
||||||
"Rate" = "Valorar";
|
"Rate" = "Valorar";
|
||||||
"Reload manifest" = "Recargar manifiesto";
|
"Reload manifest" = "Recargar manifiesto";
|
||||||
"Playback queue is empty" = "La cola de reproducción está vacía";
|
"Playback queue is empty" = "La cola de reproducción está vacía";
|
||||||
@@ -242,7 +242,7 @@
|
|||||||
|
|
||||||
/* Selected video was played on given date */
|
/* Selected video was played on given date */
|
||||||
"Watched %@" = "Visto %@";
|
"Watched %@" = "Visto %@";
|
||||||
"You have no playlists\n\nTap on \"New Playlist\" to create one" = "No tienes listas de reproducción\n\nToca \"Nueva lista de reproducción\" para crear una";
|
"You have no playlists\n\nTap on \"New Playlist\" to create one" = "No tiene listas de reproducción\n\nToque «Lista nueva» para crear una";
|
||||||
"I like this app!" = "¡Me gusta esta aplicación!";
|
"I like this app!" = "¡Me gusta esta aplicación!";
|
||||||
|
|
||||||
/* Video sort order in search */
|
/* Video sort order in search */
|
||||||
@@ -265,7 +265,7 @@
|
|||||||
"Shuffle" = "Mezclar";
|
"Shuffle" = "Mezclar";
|
||||||
|
|
||||||
/* Loading stream OSD */
|
/* Loading stream OSD */
|
||||||
"Loading streams…" = "Cargando secuencias…";
|
"Loading streams…" = "Cargando transmisiones…";
|
||||||
"Public Locations" = "Ubicaciones públicas";
|
"Public Locations" = "Ubicaciones públicas";
|
||||||
"Yattee" = "Yattee";
|
"Yattee" = "Yattee";
|
||||||
"No results" = "No hay resultados";
|
"No results" = "No hay resultados";
|
||||||
@@ -310,7 +310,7 @@
|
|||||||
"Honor orientation lock" = "Bloqueo de orientación de honor";
|
"Honor orientation lock" = "Bloqueo de orientación de honor";
|
||||||
"I found a bug /" = "Encontré un error /";
|
"I found a bug /" = "Encontré un error /";
|
||||||
"I have a feature request" = "Tengo una solicitud de una nueva función";
|
"I have a feature request" = "Tengo una solicitud de una nueva función";
|
||||||
"LIVE" = "VIVO";
|
"LIVE" = "EN VIVO";
|
||||||
|
|
||||||
/* Video duration filter in search */
|
/* Video duration filter in search */
|
||||||
"Long" = "Largo";
|
"Long" = "Largo";
|
||||||
@@ -378,15 +378,15 @@
|
|||||||
"Low" = "Baja";
|
"Low" = "Baja";
|
||||||
"Mark as watched" = "Marcar como visto";
|
"Mark as watched" = "Marcar como visto";
|
||||||
"Mark video as watched after playing" = "Marcar video como visto después de reproducirlo";
|
"Mark video as watched after playing" = "Marcar video como visto después de reproducirlo";
|
||||||
"Mark watched videos with" = "Marar videos vistos con";
|
"Mark watched videos with" = "Marcar videos vistos con";
|
||||||
"Matrix Chat" = "Chat matriz";
|
"Matrix Chat" = "Chat de Matrix";
|
||||||
"Milestones" = "Hitos";
|
"Milestones" = "Hitos";
|
||||||
"No description" = "Sin descripción";
|
"No description" = "Sin descripción";
|
||||||
"No Playlists" = "Sin listas de reproducción";
|
"No Playlists" = "Sin listas de reproducción";
|
||||||
"Not Playing" = "Nada reproduciendo";
|
"Not Playing" = "Nada reproduciendo";
|
||||||
"Normal" = "Normal";
|
"Normal" = "Normal";
|
||||||
"Nothing" = "Nada";
|
"Nothing" = "Nada";
|
||||||
"Only when signed in" = "Solo cuando estás registrado";
|
"Only when signed in" = "Solo al acceder a una cuenta";
|
||||||
"Open Settings" = "Abrir configuración";
|
"Open Settings" = "Abrir configuración";
|
||||||
"Player" = "Reproductor";
|
"Player" = "Reproductor";
|
||||||
"Pause" = "Pausar";
|
"Pause" = "Pausar";
|
||||||
@@ -394,7 +394,7 @@
|
|||||||
"Play Music" = "Reproducir música";
|
"Play Music" = "Reproducir música";
|
||||||
"Play Next" = "Reproducir siguiente";
|
"Play Next" = "Reproducir siguiente";
|
||||||
"Playlist" = "Lista de reproducción";
|
"Playlist" = "Lista de reproducción";
|
||||||
"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" = "Utilizar un proxy para ver los vídeos";
|
"Proxy videos" = "Utilizar un proxy para ver los vídeos";
|
||||||
@@ -419,7 +419,7 @@
|
|||||||
/* Player controls layout size */
|
/* Player controls layout size */
|
||||||
"Smaller" = "Más pequeño";
|
"Smaller" = "Más pequeño";
|
||||||
"Source" = "Fuente";
|
"Source" = "Fuente";
|
||||||
"SponsorBlock API Instance" = "Instancia de API del bloque Sponsor";
|
"SponsorBlock API Instance" = "Instancia de API de SponsorBlock";
|
||||||
"Subscribe" = "Suscribir";
|
"Subscribe" = "Suscribir";
|
||||||
|
|
||||||
/* Subscriptions title */
|
/* Subscriptions title */
|
||||||
@@ -587,12 +587,12 @@
|
|||||||
"Your Accounts" = "Tus cuentas";
|
"Your Accounts" = "Tus cuentas";
|
||||||
"Description" = "Descripción";
|
"Description" = "Descripción";
|
||||||
"Maximum feed items" = "Número máximo de elementos en el feed";
|
"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?";
|
"Are you sure you want to remove %@ from Favorites?" = "¿Confirma que quiere quitar %@ de Favoritos?";
|
||||||
"Limit" = "Límite";
|
"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";
|
"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)";
|
"(shorts hidden)" = "(cortos ocultos)";
|
||||||
"Disable filters" = "Desactivar los filtros";
|
"Disable filters" = "Desactivar los filtros";
|
||||||
"Podcasts" = "Podcasts";
|
"Podcasts" = "Pódcast";
|
||||||
"Releases" = "Lanzamientos";
|
"Releases" = "Lanzamientos";
|
||||||
"Show channel avatars in channels lists" = "Mostrar los avatares de los canales en las listas de los canales";
|
"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";
|
"Play Now in MPV" = "Reproducir ahora en MPV";
|
||||||
@@ -609,7 +609,7 @@
|
|||||||
"Other" = "Otro";
|
"Other" = "Otro";
|
||||||
"Other data" = "Información adicional";
|
"Other data" = "Información adicional";
|
||||||
"Export..." = "Exportar…";
|
"Export..." = "Exportar…";
|
||||||
"Are you sure you want to export unencrypted passwords?" = "¿Estás seguro de que quieres exportar las contraseñas sin cifrar?";
|
"Are you sure you want to export unencrypted passwords?" = "¿Confirma que quiere exportar las contraseñas sin cifrar?";
|
||||||
"Export" = "Exportar";
|
"Export" = "Exportar";
|
||||||
"Build" = "Compilación";
|
"Build" = "Compilación";
|
||||||
"Platform" = "Plataforma";
|
"Platform" = "Plataforma";
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
"No results" = "Nincsenek találatok";
|
"No results" = "Nincsenek találatok";
|
||||||
"No Playlists" = "Nincsenek lejátszási listák";
|
"No Playlists" = "Nincsenek lejátszási listák";
|
||||||
"Mark video as watched after playing" = "Jelölje meg a videót megtekintettként lejátszás után";
|
"Mark video as watched after playing" = "Jelölje meg a videót megtekintettként lejátszás után";
|
||||||
"Mark watched videos with" = "Videó megtekintettnek jelölése a következővel";
|
"Mark watched videos with" = "Megtekintett videók megjelölése a következővel";
|
||||||
"Matrix Channel" = "Matrix csatorna";
|
"Matrix Channel" = "Matrix csatorna";
|
||||||
"Find Other" = "Egyebek keresése";
|
"Find Other" = "Egyebek keresése";
|
||||||
"Hour" = "Óra";
|
"Hour" = "Óra";
|
||||||
@@ -50,13 +50,13 @@
|
|||||||
"Add Location..." = "Hely hozzáadása..";
|
"Add Location..." = "Hely hozzáadása..";
|
||||||
"Add profile..." = "Profil hozzáadása...";
|
"Add profile..." = "Profil hozzáadása...";
|
||||||
"Add Quality Profile" = "Minőségi profil hozzáadása";
|
"Add Quality Profile" = "Minőségi profil hozzáadása";
|
||||||
"Add to %@" = "Hozzáadás a %@-hoz";
|
"Add to %@" = "Hozzáadás a következőhöz: %@";
|
||||||
"Add to Favorites" = "Hozzáadás a kedvencekhez";
|
"Add to Favorites" = "Hozzáadás a kedvencekhez";
|
||||||
"Add to Playlist" = "Hozzáadás a lejátszási listához";
|
"Add to Playlist" = "Hozzáadás a lejátszási listához";
|
||||||
"Add to Playlist..." = "Hozzáadás a lejátszási listához...";
|
"Add to Playlist..." = "Hozzáadás a lejátszási listához...";
|
||||||
"Advanced" = "Speciális";
|
"Advanced" = "Speciális";
|
||||||
"All" = "Összes";
|
"All" = "Összes";
|
||||||
"Always use AVPlayer for live videos" = "Mindig az AVPlayer-t használjon az élő videókhoz";
|
"Always use AVPlayer for live videos" = "Mindig az a AVPlayer-t használja az élő videókhoz";
|
||||||
"Anonymous" = "Névtelen";
|
"Anonymous" = "Névtelen";
|
||||||
"Any" = "Bármely";
|
"Any" = "Bármely";
|
||||||
"Apply to all" = "Alkalmazás az összesre";
|
"Apply to all" = "Alkalmazás az összesre";
|
||||||
@@ -105,7 +105,7 @@
|
|||||||
"Contact" = "Névjegy";
|
"Contact" = "Névjegy";
|
||||||
"Continue" = "Folytatás";
|
"Continue" = "Folytatás";
|
||||||
"Close video after playing last in the queue" = "Videó bezárása a várólistában lévő utolsó lejátszás után";
|
"Close video after playing last in the queue" = "Videó bezárása a várólistában lévő utolsó lejátszás után";
|
||||||
"Continue from %@" = "Folytatás %@-tól";
|
"Continue from %@" = "Folytatás ettől: %@";
|
||||||
"Contributing" = "Közreműködés";
|
"Contributing" = "Közreműködés";
|
||||||
"Controls" = "Vezérlők";
|
"Controls" = "Vezérlők";
|
||||||
"Copy %@ link" = "%@ hivatkozás másolása";
|
"Copy %@ link" = "%@ hivatkozás másolása";
|
||||||
@@ -122,7 +122,7 @@
|
|||||||
"Delete" = "Törlés";
|
"Delete" = "Törlés";
|
||||||
"Disabled" = "Letiltva";
|
"Disabled" = "Letiltva";
|
||||||
"Discord Server" = "Discord-kiszolgáló";
|
"Discord Server" = "Discord-kiszolgáló";
|
||||||
"Discussions take place in Discord and Matrix. It's a good spot for general questions." = "A megbeszélések a Discordon és a Matrixon zajlanak. Ez egy jó hely az általános kérdésekre.";
|
"Discussions take place in Discord and Matrix. It's a good spot for general questions." = "A beszélgetések a Discordon és a Matrixon zajlanak. Ez egy jó hely az általános kérdésekre.";
|
||||||
"Could not load locations manifest" = "Nem sikerült betölteni a helyek listáját";
|
"Could not load locations manifest" = "Nem sikerült betölteni a helyek listáját";
|
||||||
"Don't use public locations" = "Ne használjon nyilvános helyeket";
|
"Don't use public locations" = "Ne használjon nyilvános helyeket";
|
||||||
"Donations" = "Adományok";
|
"Donations" = "Adományok";
|
||||||
@@ -180,7 +180,7 @@
|
|||||||
"Low" = "Alacsony";
|
"Low" = "Alacsony";
|
||||||
"Low quality" = "Alacsony minőség";
|
"Low quality" = "Alacsony minőség";
|
||||||
"Lowest" = "Legalacsonyabb";
|
"Lowest" = "Legalacsonyabb";
|
||||||
"Mark as watched" = "Megtekintettnek jelölés";
|
"Mark as watched" = "Jelölés megtekintettnek";
|
||||||
"Matrix Chat" = "Matrix csevegés";
|
"Matrix Chat" = "Matrix csevegés";
|
||||||
"Medium" = "Közepes";
|
"Medium" = "Közepes";
|
||||||
"Medium quality" = "Közepes minőség";
|
"Medium quality" = "Közepes minőség";
|
||||||
@@ -215,7 +215,7 @@
|
|||||||
"Play Music" = "Zene lejátszása";
|
"Play Music" = "Zene lejátszása";
|
||||||
"Play Next" = "Következő lejátszása";
|
"Play Next" = "Következő lejátszása";
|
||||||
"Play Now" = "Lejátszás most";
|
"Play Now" = "Lejátszás most";
|
||||||
"Playback" = "Lejátszás";
|
"Playback" = "Visszajátszás";
|
||||||
"Player" = "Lejátszó";
|
"Player" = "Lejátszó";
|
||||||
"Playlist" = "Lejátszási lista";
|
"Playlist" = "Lejátszási lista";
|
||||||
"Playlist \"%@\" will be deleted.\nIt cannot be reverted." = "A(z) „%@” lejátszási lista törlésre kerül.\nEzt nem lehet visszaállítani.";
|
"Playlist \"%@\" will be deleted.\nIt cannot be reverted." = "A(z) „%@” lejátszási lista törlésre kerül.\nEzt nem lehet visszaállítani.";
|
||||||
@@ -395,9 +395,9 @@
|
|||||||
"Open Video" = "Videó megnyitása";
|
"Open Video" = "Videó megnyitása";
|
||||||
"Default Profile" = "Alapértelmezett profil";
|
"Default Profile" = "Alapértelmezett profil";
|
||||||
"Share%@link" = "%@ hivatkozás megosztása";
|
"Share%@link" = "%@ hivatkozás megosztása";
|
||||||
"\"%@\" will be irreversibly removed from this device." = "A „%@” visszavonhatatlanul eltávolításra kerül erről az eszközről.";
|
"\"%@\" will be irreversibly removed from this device." = "A(z) „%@” visszavonhatatlanul eltávolításra kerül erről az eszközről.";
|
||||||
"Could not delete document" = "A dokumentum törlése nem sikerült";
|
"Could not delete document" = "A dokumentum törlése nem sikerült";
|
||||||
"Are you sure you want to remove %@ location?" = "Biztosan el akarja távolítani a %@ helyet?";
|
"Are you sure you want to remove %@ location?" = "Biztosan törölni szeretné a(z) %@ helyet?";
|
||||||
"Live Streams" = "Élő közvetítések";
|
"Live Streams" = "Élő közvetítések";
|
||||||
"Verified" = "Ellenőrzött";
|
"Verified" = "Ellenőrzött";
|
||||||
"Channel" = "Csatorna";
|
"Channel" = "Csatorna";
|
||||||
@@ -419,7 +419,7 @@
|
|||||||
"Controls button: forwards" = "Vezérlőgomb: előre";
|
"Controls button: forwards" = "Vezérlőgomb: előre";
|
||||||
"Gesture: backwards" = "Gesztus: hátra";
|
"Gesture: backwards" = "Gesztus: hátra";
|
||||||
"Hide player" = "Lejátszó elrejtése";
|
"Hide player" = "Lejátszó elrejtése";
|
||||||
"Gesture settings control skipping interval for remote arrow buttons (for 2nd generation Siri Remote or newer). Changing system controls settings requires restart." = "A gesztusbeállítások szabályozzák az ugrási intervallumot a távirányítón lévő nyíl gomboknál (a 2. generációs Siri Remote vagy újabb eszközök esetén). A rendszervezérlők beállításainak módosítása újraindítást igényel.";
|
"Gesture settings control skipping interval for remote arrow buttons (for 2nd generation Siri Remote or newer). Changing system controls settings requires restart." = "A gesztusbeállítások vezérlik a kihagyási időközt a távirányítón található nyíl gombok számára (a 2. generációs Siri Remote vagy újabb modellek esetén). A rendszervezérlők beállításainak módosítása újraindítást igényel.";
|
||||||
"Actions Buttons" = "Műveleti gombok";
|
"Actions Buttons" = "Műveleti gombok";
|
||||||
"Play next item" = "Következő elem lejátszása";
|
"Play next item" = "Következő elem lejátszása";
|
||||||
"Lock orientation" = "Tájolás zárolása";
|
"Lock orientation" = "Tájolás zárolása";
|
||||||
@@ -442,22 +442,22 @@
|
|||||||
"Mark all as unwatched" = "Jelölje meg az összeset nem megtekintettnek";
|
"Mark all as unwatched" = "Jelölje meg az összeset nem megtekintettnek";
|
||||||
"Playback Settings" = "Lejátszási beállítások";
|
"Playback Settings" = "Lejátszási beállítások";
|
||||||
"Mark all as watched" = "Jelölje meg az összeset megtekintettnek";
|
"Mark all as watched" = "Jelölje meg az összeset megtekintettnek";
|
||||||
"Replay" = "Visszajátszás";
|
"Replay" = "Újrajátszás";
|
||||||
"Fullscreen" = "Teljes képernyő";
|
"Fullscreen" = "Teljes képernyő";
|
||||||
"Lock" = "Zárolás";
|
"Lock" = "Zárolás";
|
||||||
"Description" = "Leírás";
|
"Description" = "Leírás";
|
||||||
"Loop one" = "Ismétlés egyesével";
|
"Loop one" = "Ismétlés egyesével";
|
||||||
"Autoplay next" = "Következő automatikus lejátszása";
|
"Autoplay next" = "Következő automatikus lejátszása";
|
||||||
"Stream" = "Közvetítés";
|
"Stream" = "Közvetítés";
|
||||||
"Enter location address to connect..." = "Adja meg a hely címét a csatlakozáshoz...";
|
"Enter location address to connect..." = "Adja meg a hely címét a kapcsolódáshoz...";
|
||||||
"Seek" = "Keresés";
|
"Seek" = "Keresés";
|
||||||
"Opened File" = "Megnyitott fájl";
|
"Opened File" = "Megnyitott fájl";
|
||||||
"File Extension" = "Fájl kiterjesztés";
|
"File Extension" = "Fájl kiterjesztése";
|
||||||
"Opening file…" = "Fájl megnyitása…";
|
"Opening file…" = "Fájl megnyitása…";
|
||||||
"Public account" = "Nyilvános fiók";
|
"Public account" = "Nyilvános fiók";
|
||||||
"Your Accounts" = "Az Ön fiókjai";
|
"Your Accounts" = "Saját fiókok";
|
||||||
"Close video and player on end" = "A videó és a lejátszó bezárása a lejátszás befejeztével";
|
"Close video and player on end" = "A videó és a lejátszó bezárása a lejátszás befejeztével";
|
||||||
"Use system controls with AVPlayer" = "A rendszervezérlők használata az AVPlayerrel";
|
"Use system controls with AVPlayer" = "A rendszervezérlők használata az AVPlayer-rel";
|
||||||
"Landscape left" = "Fekvő balra";
|
"Landscape left" = "Fekvő balra";
|
||||||
"Landscape right" = "Fekvő jobbra";
|
"Landscape right" = "Fekvő jobbra";
|
||||||
"No rotation" = "Nincs forgatás";
|
"No rotation" = "Nincs forgatás";
|
||||||
@@ -492,7 +492,7 @@
|
|||||||
"Mark channel feed as unwatched" = "Jelölje meg a csatorna hírfolyamot nem megtekintettként";
|
"Mark channel feed as unwatched" = "Jelölje meg a csatorna hírfolyamot nem megtekintettként";
|
||||||
"Tap and hold channel thumbnail to open context menu with more actions" = "Koppintson és tartsa lenyomva a csatorna miniatűrjét a további műveletekhez tartozó kontextusmenü megnyitásához";
|
"Tap and hold channel thumbnail to open context menu with more actions" = "Koppintson és tartsa lenyomva a csatorna miniatűrjét a további műveletekhez tartozó kontextusmenü megnyitásához";
|
||||||
"Controls button: backwards" = "Vezérlőgomb: hátra";
|
"Controls button: backwards" = "Vezérlőgomb: hátra";
|
||||||
"Enter account credentials to connect..." = "Adja meg a fiók hitelesítő adatait a csatlakozáshoz...";
|
"Enter account credentials to connect..." = "Adja meg a fiók hitelesítő adatait a kapcsolódáshoz...";
|
||||||
"Show scroll to top button in comments" = "Görgetés a tetejére gomb megjelenítése a hozzászólásokban";
|
"Show scroll to top button in comments" = "Görgetés a tetejére gomb megjelenítése a hozzászólásokban";
|
||||||
"Browse without account" = "Böngészés fiók nélkül";
|
"Browse without account" = "Böngészés fiók nélkül";
|
||||||
"Watched: visible" = "Megtekintettek: láthatóak";
|
"Watched: visible" = "Megtekintettek: láthatóak";
|
||||||
@@ -500,7 +500,7 @@
|
|||||||
"Playback history is empty" = "A lejátszási előzmények üresek";
|
"Playback history is empty" = "A lejátszási előzmények üresek";
|
||||||
"Right" = "Jobb";
|
"Right" = "Jobb";
|
||||||
"Gesture: fowards" = "Gesztus: előre";
|
"Gesture: fowards" = "Gesztus: előre";
|
||||||
"Gesture settings control skipping interval for double click on left/right side of the player. Changing system controls settings requires restart." = "A gesztusbeállítások szabályozzák az ugrási intervallumot a dupla kattintásnál a lejátszó bal és jobb oldalán. A rendszervezérlők beállításainak módosítása újraindítást igényel.";
|
"Gesture settings control skipping interval for double click on left/right side of the player. Changing system controls settings requires restart." = "A gesztusbeállítások vezérlik a kihagyási időközt a lejátszó bal/jobb oldalán történő dupla kattintás esetén. A rendszervezérlők beállításainak módosítása újraindítást igényel.";
|
||||||
"Open channel" = "Csatorna megnyitása";
|
"Open channel" = "Csatorna megnyitása";
|
||||||
"Inspector" = "Felügyelő";
|
"Inspector" = "Felügyelő";
|
||||||
"Copy%@link" = "%@ hivatkozás másolása";
|
"Copy%@link" = "%@ hivatkozás másolása";
|
||||||
@@ -518,16 +518,16 @@
|
|||||||
"Share" = "Megosztás";
|
"Share" = "Megosztás";
|
||||||
"Play all unwatched" = "Összes nem megtekintettek lejátszása";
|
"Play all unwatched" = "Összes nem megtekintettek lejátszása";
|
||||||
"Available" = "Elérhető";
|
"Available" = "Elérhető";
|
||||||
"Gesture settings control skipping interval for double tap gesture on left/right side of the player. Changing system controls settings requires restart." = "A gesztusbeállítások vezérlik a dupla koppintás gesztus ugrási intervallumát a lejátszó bal és jobb oldalán. A rendszervezérlő beállításainak módosítása újraindítást igényel.";
|
"Gesture settings control skipping interval for double tap gesture on left/right side of the player. Changing system controls settings requires restart." = "A gesztusbeállítások vezérlik a kihagyási időközt a lejátszó bal/jobb oldalán végzett kétszeri érintéses gesztus számára. A rendszervezérlők beállításainak módosítása újraindítást igényel.";
|
||||||
"Pages buttons" = "Oldalak gombjai";
|
"Pages buttons" = "Oldalak gombjai";
|
||||||
"Only for local files and URLs" = "Csak helyi fájlok és webcímek esetén";
|
"Only for local files and URLs" = "Csak helyi fájlok és webcímek esetén";
|
||||||
"Are you sure you want to remove this document?" = "Biztosan el akarja távolítani ezt a dokumentumot?";
|
"Are you sure you want to remove this document?" = "Biztosan törölni szeretné ezt a dokumentumot?";
|
||||||
"Rotate when entering fullscreen on landscape video" = "Forduljon el fekvő módba teljes képernyőre váltáskor";
|
"Rotate when entering fullscreen on landscape video" = "Forduljon el fekvő módba teljes képernyőre váltáskor";
|
||||||
"Limit" = "Limit";
|
"Limit" = "Limit";
|
||||||
"Are you sure you want to remove %@ from Favorites?" = "Biztosan el akarja távolítani a(z) %@-t a Kedvencek közül?";
|
"Are you sure you want to remove %@ from Favorites?" = "Biztosan törölni szeretné a(z) %@-t a „Kedvencek” közül?";
|
||||||
"Keep channels with unwatched videos on top of subscriptions list" = "A nem megtekintett videókkal rendelkező csatornák a feliratkozási lista tetején maradnak";
|
"Keep channels with unwatched videos on top of subscriptions list" = "A nem megtekintett videókkal rendelkező csatornák a feliratkozási lista tetején maradnak";
|
||||||
"Show video context menu options to force selected backend" = "Videó kontextusmenü beállításainak megjelenítése a kiválasztott háttérprogram kikényszerítéséhez";
|
"Show video context menu options to force selected backend" = "Videó kontextusmenü beállításainak megjelenítése a kiválasztott háttérprogram kikényszerítéséhez";
|
||||||
"Play Now in AVPlayer" = "Lejátszás az AVPlayerben";
|
"Play Now in AVPlayer" = "Lejátszás az AVPlayer-ben";
|
||||||
"Play Now in MPV" = "Lejátszás az MPV-ben";
|
"Play Now in MPV" = "Lejátszás az MPV-ben";
|
||||||
"Show channel avatars in videos lists" = "Csatorna profilképek megjelenítése a videók listájában";
|
"Show channel avatars in videos lists" = "Csatorna profilképek megjelenítése a videók listájában";
|
||||||
"Export" = "Exportálás";
|
"Export" = "Exportálás";
|
||||||
@@ -537,7 +537,7 @@
|
|||||||
"Action button labels" = "Művelet gombok feliratai";
|
"Action button labels" = "Művelet gombok feliratai";
|
||||||
"Build" = "Összeállítási szám";
|
"Build" = "Összeállítási szám";
|
||||||
"Icon and text" = "Ikon és szöveg";
|
"Icon and text" = "Ikon és szöveg";
|
||||||
"Custom Location already exists" = "Egyéni hely már létezik";
|
"Custom Location already exists" = "Az egyéni hely már létezik";
|
||||||
"Account already exists" = "A fiók már létezik";
|
"Account already exists" = "A fiók már létezik";
|
||||||
"Export in progress..." = "Exportálás folyamatban...";
|
"Export in progress..." = "Exportálás folyamatban...";
|
||||||
"In progress..." = "Folyamatban…";
|
"In progress..." = "Folyamatban…";
|
||||||
@@ -554,11 +554,11 @@
|
|||||||
"Other data" = "Egyéb adat";
|
"Other data" = "Egyéb adat";
|
||||||
"Do not share this file with anyone or you can lose access to your accounts. If you don't select to export passwords you will be asked to provide them during import" = "Ne ossza meg ezt a fájlt senkivel, különben elveszítheti hozzáférését a fiókjaihoz. Ha nem választja a jelszavak exportálását, akkor az importálás során meg kell adnia azokat";
|
"Do not share this file with anyone or you can lose access to your accounts. If you don't select to export passwords you will be asked to provide them during import" = "Ne ossza meg ezt a fájlt senkivel, különben elveszítheti hozzáférését a fiókjaihoz. Ha nem választja a jelszavak exportálását, akkor az importálás során meg kell adnia azokat";
|
||||||
"Password required to import" = "Jelszó szükséges az importáláshoz";
|
"Password required to import" = "Jelszó szükséges az importáláshoz";
|
||||||
"Custom Location selected for import" = "Importáláshoz kiválasztott egyéni hely";
|
"Custom Location selected for import" = "Az importáláshoz kiválasztott egyéni hely";
|
||||||
"Password saved in import file" = "Az importfájlba mentett jelszó";
|
"Password saved in import file" = "Az importfájlba mentett jelszó";
|
||||||
"Export..." = "Exportálás…";
|
"Export..." = "Exportálás…";
|
||||||
"Show channel avatars in channels lists" = "Csatorna profilképek megjelenítése a csatornák listájában";
|
"Show channel avatars in channels lists" = "Csatorna profilképek megjelenítése a csatornák listájában";
|
||||||
"Import Settings..." = "Beállítások importálása...";
|
"Import Settings..." = "Beállítások importálása...";
|
||||||
"Custom Location not selected for import" = "Egyéni hely nincs kiválasztva az importáláshoz";
|
"Custom Location not selected for import" = "Nincs kiválasztva egyéni hely az importáláshoz";
|
||||||
"Export Settings" = "Beállítások exportálása";
|
"Export Settings" = "Beállítások exportálása";
|
||||||
"Add %@" = "%@ hozzáadása";
|
"Add %@" = "%@ hozzáadása";
|
||||||
|
|||||||
@@ -68,3 +68,20 @@
|
|||||||
"Close PiP and open player when application enters foreground" = "애플리케이션이 포그라운드에 진입하면 PiP를 닫고 플레이어를 열기";
|
"Close PiP and open player when application enters foreground" = "애플리케이션이 포그라운드에 진입하면 PiP를 닫고 플레이어를 열기";
|
||||||
"Close PiP when player is opened" = "플레이어가 열리면 PiP 닫기";
|
"Close PiP when player is opened" = "플레이어가 열리면 PiP 닫기";
|
||||||
"Close PiP when starting playing other video" = "다른 동영상 재생을 시작하면 PiP 닫기";
|
"Close PiP when starting playing other video" = "다른 동영상 재생을 시작하면 PiP 닫기";
|
||||||
|
"Error when accessing playlist" = "플레이리스트 연결 도중 오류 발생";
|
||||||
|
"Hide sidebar" = "사이드바 숨기기";
|
||||||
|
"Close video after playing last in the queue" = "마지막 동영상 재생 후 , 영상 닫기";
|
||||||
|
"Comments" = "댓글";
|
||||||
|
"Connection failed" = "연결 실패";
|
||||||
|
"Contact" = "연락처";
|
||||||
|
"Create Playlist" = "재생목록 생성";
|
||||||
|
"Donations" = "후원";
|
||||||
|
"Done" = "완료";
|
||||||
|
"Don't use public locations" = "공공장소에서 사용하지 마십시오";
|
||||||
|
"I have a feature request" = "기능 제안하기";
|
||||||
|
"I like this app!" = "저는 이 앱이 좋습니다!";
|
||||||
|
"I want to ask a question" = "질문하기";
|
||||||
|
"Just watched" = "방금 시청한 동영상";
|
||||||
|
"Mark as watched" = "시청 완료로 표시하기";
|
||||||
|
"Mark video as watched after playing" = "동영상 시청 후에 시청 완료 표시하기";
|
||||||
|
"Continue" = "다음";
|
||||||
|
|||||||
@@ -237,12 +237,12 @@
|
|||||||
/* Video date filter in search */
|
/* Video date filter in search */
|
||||||
"Today" = "Hoje";
|
"Today" = "Hoje";
|
||||||
"Trending" = "Em Alta";
|
"Trending" = "Em Alta";
|
||||||
"Unsubscribe" = "Desinscrever";
|
"Unsubscribe" = "Desinscrever-se";
|
||||||
"Upload date" = "Data de upload";
|
"Upload date" = "Data de upload";
|
||||||
|
|
||||||
/* Video date filter in search */
|
/* Video date filter in search */
|
||||||
"Week" = "Semana";
|
"Week" = "Semana";
|
||||||
"Subscribe" = "Inscrever";
|
"Subscribe" = "Inscrever-se";
|
||||||
"Thumbnails" = "Miniaturas";
|
"Thumbnails" = "Miniaturas";
|
||||||
"Typically near or at the end of the video when the credits pop up and/or endcards are shown." = "Geralmente perto do final ou final do vídeo quando os créditos aparecem e/ou os cartões finais são exibidos.";
|
"Typically near or at the end of the video when the credits pop up and/or endcards are shown." = "Geralmente perto do final ou final do vídeo quando os créditos aparecem e/ou os cartões finais são exibidos.";
|
||||||
"unknown" = "desconhecido";
|
"unknown" = "desconhecido";
|
||||||
@@ -406,7 +406,7 @@
|
|||||||
"Country" = "País";
|
"Country" = "País";
|
||||||
"Clear All" = "Limpar Tudo";
|
"Clear All" = "Limpar Tudo";
|
||||||
"Clear All Recents" = "Limpar Todos os Recentes";
|
"Clear All Recents" = "Limpar Todos os Recentes";
|
||||||
"Explicit reminders to like, subscribe or interact with them on any paid or free platform(s) (e.g. click on a video)." = "Lembretes explícitos de dar like, se inscrever ou interagir com eles em qualquer plataforma, paga ou grátis (p.ex. clicar em um vídeo).";
|
"Explicit reminders to like, subscribe or interact with them on any paid or free platform(s) (e.g. click on a video)." = "Lembretes explícitos de curtir, se inscrever ou interagir com eles em qualquer plataforma, paga ou grátis (p.ex. clicar em um vídeo).";
|
||||||
"Duration" = "Duração";
|
"Duration" = "Duração";
|
||||||
"Edit Quality Profile" = "Editar Perfil de Qualidade";
|
"Edit Quality Profile" = "Editar Perfil de Qualidade";
|
||||||
"Discussions take place in Discord and Matrix. It's a good spot for general questions." = "Discussões acontecem no Discord e no Matrix. É um bom lugar para perguntas gerais.";
|
"Discussions take place in Discord and Matrix. It's a good spot for general questions." = "Discussões acontecem no Discord e no Matrix. É um bom lugar para perguntas gerais.";
|
||||||
@@ -537,7 +537,7 @@
|
|||||||
"Gesture: backwards" = "Gesto: para trás";
|
"Gesture: backwards" = "Gesto: para trás";
|
||||||
"Always show controls buttons" = "Sempre mostrar botões de controle";
|
"Always show controls buttons" = "Sempre mostrar botões de controle";
|
||||||
"Controls button: forwards" = "Botão de controle: para frente";
|
"Controls button: forwards" = "Botão de controle: para frente";
|
||||||
"Subscribe/Unsubscribe" = "Inscrever/Desinscrever";
|
"Subscribe/Unsubscribe" = "Inscrever-se/Desinscrever-se";
|
||||||
"Are you sure you want to clear cache?" = "Tem certeza que deseja limpar o cache?";
|
"Are you sure you want to clear cache?" = "Tem certeza que deseja limpar o cache?";
|
||||||
"Gesture settings control skipping interval for double click on left/right side of the player. Changing system controls settings requires restart." = "As configurações de gesto controlam o intervalo de pulo para o clique duplo no lado direito/esquerdo do player. Mudar as configurações dos controles do sistema requer reinício.";
|
"Gesture settings control skipping interval for double click on left/right side of the player. Changing system controls settings requires restart." = "As configurações de gesto controlam o intervalo de pulo para o clique duplo no lado direito/esquerdo do player. Mudar as configurações dos controles do sistema requer reinício.";
|
||||||
"Loop one" = "Um em loop";
|
"Loop one" = "Um em loop";
|
||||||
|
|||||||
@@ -300,14 +300,14 @@
|
|||||||
"Rate & Captions" = "Puan ve Altyazılar";
|
"Rate & Captions" = "Puan ve Altyazılar";
|
||||||
"Format" = "Format";
|
"Format" = "Format";
|
||||||
"Right" = "Sağ";
|
"Right" = "Sağ";
|
||||||
"Stream FPS" = "";
|
"Stream FPS" = "Yayın FPS’i";
|
||||||
"Cached time" = "Önbelleğe alınan zaman";
|
"Cached time" = "Önbelleğe alınan zaman";
|
||||||
"Sign In Required" = "Giriş yapmanız gerekiyor";
|
"Sign In Required" = "Giriş yapmanız gerekiyor";
|
||||||
"Could not create share link" = "Paylaş linki oluşturulamadı";
|
"Could not create share link" = "Paylaş linki oluşturulamadı";
|
||||||
"Locations Manifest" = "";
|
"Locations Manifest" = "";
|
||||||
"When partially watched video is played" = "Video kısmi olarak izlendiyse";
|
"When partially watched video is played" = "Video kısmi olarak izlendiyse";
|
||||||
"Open Video" = "Video aç";
|
"Open Video" = "Video aç";
|
||||||
"Add Channels, Playlists and Searches to Favorites using" = "";
|
"Add Channels, Playlists and Searches to Favorites using" = "Kanallar, oynatma listeleri ve favorileri aramayı ekleyin";
|
||||||
"Always" = "Her zaman";
|
"Always" = "Her zaman";
|
||||||
|
|
||||||
/* Video date filter in search */
|
/* Video date filter in search */
|
||||||
@@ -357,7 +357,7 @@
|
|||||||
"Could not delete document" = "Belge silinemedi";
|
"Could not delete document" = "Belge silinemedi";
|
||||||
"No comments" = "Yorum yok";
|
"No comments" = "Yorum yok";
|
||||||
"Could not open Files" = "Dosyalar açılamadı";
|
"Could not open Files" = "Dosyalar açılamadı";
|
||||||
"You need to select an account\nto access %@ section" = "";
|
"You need to select an account\nto access %@ section" = "%@ kesitine erişebilmek için \nbir hesap seçmeniz gerekiyor";
|
||||||
"Reload manifest" = "Yeniden Yükle";
|
"Reload manifest" = "Yeniden Yükle";
|
||||||
"Could not refresh Subscriptions" = "Abonelikler yenilenemedi";
|
"Could not refresh Subscriptions" = "Abonelikler yenilenemedi";
|
||||||
|
|
||||||
@@ -423,7 +423,7 @@
|
|||||||
"Show sidebar when space permits" = "Alan olduğu sürece kenar çubuğunu göster";
|
"Show sidebar when space permits" = "Alan olduğu sürece kenar çubuğunu göster";
|
||||||
"System controls buttons" = "Sistem kontrol butonları";
|
"System controls buttons" = "Sistem kontrol butonları";
|
||||||
"Could not extract channel information" = "Kanal bilgisi çıkarılamadı";
|
"Could not extract channel information" = "Kanal bilgisi çıkarılamadı";
|
||||||
"Public Locations" = "";
|
"Public Locations" = "Herkese Açık Alanlar";
|
||||||
"You can find information about using Yattee in the Wiki pages." = "Wiki sayfalarında Yattee kullanımı hakkında bilgilere erişebilirsiniz.";
|
"You can find information about using Yattee in the Wiki pages." = "Wiki sayfalarında Yattee kullanımı hakkında bilgilere erişebilirsiniz.";
|
||||||
|
|
||||||
/* Player controls layout size */
|
/* Player controls layout size */
|
||||||
@@ -440,7 +440,7 @@
|
|||||||
"Smaller" = "Küçült";
|
"Smaller" = "Küçült";
|
||||||
"Sort" = "Sırala";
|
"Sort" = "Sırala";
|
||||||
"This cannot be reverted" = "Geriye alınamaz";
|
"This cannot be reverted" = "Geriye alınamaz";
|
||||||
"Public Manifest" = "";
|
"Public Manifest" = "Herkese Açık Bildiri";
|
||||||
"You have no Playlists" = "Çalma listeniz bulunmamaktadır";
|
"You have no Playlists" = "Çalma listeniz bulunmamaktadır";
|
||||||
"Watched" = "İzlendi";
|
"Watched" = "İzlendi";
|
||||||
"Could not open video" = "Video açılamadı";
|
"Could not open video" = "Video açılamadı";
|
||||||
@@ -461,7 +461,7 @@
|
|||||||
"Current Location" = "Şuanki konum";
|
"Current Location" = "Şuanki konum";
|
||||||
"Stream & Player" = "Yayın ve Oynatıcı";
|
"Stream & Player" = "Yayın ve Oynatıcı";
|
||||||
"Hardware decoder" = "Donanımsal çözücü";
|
"Hardware decoder" = "Donanımsal çözücü";
|
||||||
"Honor orientation lock" = "";
|
"Honor orientation lock" = "Yön kilidine sadık kal";
|
||||||
"Seek with horizontal swipe on video" = "Video üzerinde yatay kaydırma";
|
"Seek with horizontal swipe on video" = "Video üzerinde yatay kaydırma";
|
||||||
"Segments typically found at the start of a video that include an animation, still frame or clip which are also seen in other videos by the same creator." = "Genellikle bir videonun başlangıcında bulunan ve aynı içerik oluşturucunun diğer videolarında da görülen bir animasyon, sabit kare veya klip içeren kısımlar.";
|
"Segments typically found at the start of a video that include an animation, still frame or clip which are also seen in other videos by the same creator." = "Genellikle bir videonun başlangıcında bulunan ve aynı içerik oluşturucunun diğer videolarında da görülen bir animasyon, sabit kare veya klip içeren kısımlar.";
|
||||||
"Switch to public locations" = "Herkese açık konumlara geç";
|
"Switch to public locations" = "Herkese açık konumlara geç";
|
||||||
|
|||||||
@@ -4109,7 +4109,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 = 198;
|
CURRENT_PROJECT_VERSION = 202;
|
||||||
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";
|
||||||
@@ -4140,7 +4140,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 = 198;
|
CURRENT_PROJECT_VERSION = 202;
|
||||||
"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";
|
||||||
@@ -4171,7 +4171,7 @@
|
|||||||
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 = 198;
|
CURRENT_PROJECT_VERSION = 202;
|
||||||
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;
|
||||||
@@ -4191,7 +4191,7 @@
|
|||||||
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 = 198;
|
CURRENT_PROJECT_VERSION = 202;
|
||||||
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;
|
||||||
@@ -4355,7 +4355,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 = 198;
|
CURRENT_PROJECT_VERSION = 202;
|
||||||
ENABLE_PREVIEWS = YES;
|
ENABLE_PREVIEWS = YES;
|
||||||
GCC_PREPROCESSOR_DEFINITIONS = (
|
GCC_PREPROCESSOR_DEFINITIONS = (
|
||||||
"DEBUG=1",
|
"DEBUG=1",
|
||||||
@@ -4408,7 +4408,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 = 198;
|
CURRENT_PROJECT_VERSION = 202;
|
||||||
"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";
|
||||||
@@ -4461,7 +4461,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 = 198;
|
CURRENT_PROJECT_VERSION = 202;
|
||||||
DEAD_CODE_STRIPPING = YES;
|
DEAD_CODE_STRIPPING = YES;
|
||||||
ENABLE_APP_SANDBOX = YES;
|
ENABLE_APP_SANDBOX = YES;
|
||||||
ENABLE_HARDENED_RUNTIME = YES;
|
ENABLE_HARDENED_RUNTIME = YES;
|
||||||
@@ -4500,7 +4500,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 = 198;
|
CURRENT_PROJECT_VERSION = 202;
|
||||||
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;
|
||||||
@@ -4535,7 +4535,7 @@
|
|||||||
isa = XCBuildConfiguration;
|
isa = XCBuildConfiguration;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
CODE_SIGN_STYLE = Automatic;
|
CODE_SIGN_STYLE = Automatic;
|
||||||
CURRENT_PROJECT_VERSION = 198;
|
CURRENT_PROJECT_VERSION = 202;
|
||||||
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 = (
|
||||||
@@ -4558,7 +4558,7 @@
|
|||||||
isa = XCBuildConfiguration;
|
isa = XCBuildConfiguration;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
CODE_SIGN_STYLE = Automatic;
|
CODE_SIGN_STYLE = Automatic;
|
||||||
CURRENT_PROJECT_VERSION = 198;
|
CURRENT_PROJECT_VERSION = 202;
|
||||||
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 = (
|
||||||
@@ -4583,7 +4583,7 @@
|
|||||||
buildSettings = {
|
buildSettings = {
|
||||||
CODE_SIGN_STYLE = Automatic;
|
CODE_SIGN_STYLE = Automatic;
|
||||||
COMBINE_HIDPI_IMAGES = YES;
|
COMBINE_HIDPI_IMAGES = YES;
|
||||||
CURRENT_PROJECT_VERSION = 198;
|
CURRENT_PROJECT_VERSION = 202;
|
||||||
DEAD_CODE_STRIPPING = YES;
|
DEAD_CODE_STRIPPING = YES;
|
||||||
GENERATE_INFOPLIST_FILE = YES;
|
GENERATE_INFOPLIST_FILE = YES;
|
||||||
LD_RUNPATH_SEARCH_PATHS = (
|
LD_RUNPATH_SEARCH_PATHS = (
|
||||||
@@ -4607,7 +4607,7 @@
|
|||||||
buildSettings = {
|
buildSettings = {
|
||||||
CODE_SIGN_STYLE = Automatic;
|
CODE_SIGN_STYLE = Automatic;
|
||||||
COMBINE_HIDPI_IMAGES = YES;
|
COMBINE_HIDPI_IMAGES = YES;
|
||||||
CURRENT_PROJECT_VERSION = 198;
|
CURRENT_PROJECT_VERSION = 202;
|
||||||
DEAD_CODE_STRIPPING = YES;
|
DEAD_CODE_STRIPPING = YES;
|
||||||
GENERATE_INFOPLIST_FILE = YES;
|
GENERATE_INFOPLIST_FILE = YES;
|
||||||
LD_RUNPATH_SEARCH_PATHS = (
|
LD_RUNPATH_SEARCH_PATHS = (
|
||||||
@@ -4633,7 +4633,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 = 198;
|
CURRENT_PROJECT_VERSION = 202;
|
||||||
DEVELOPMENT_ASSET_PATHS = "";
|
DEVELOPMENT_ASSET_PATHS = "";
|
||||||
ENABLE_PREVIEWS = YES;
|
ENABLE_PREVIEWS = YES;
|
||||||
GENERATE_INFOPLIST_FILE = YES;
|
GENERATE_INFOPLIST_FILE = YES;
|
||||||
@@ -4649,7 +4649,7 @@
|
|||||||
"@executable_path/Frameworks",
|
"@executable_path/Frameworks",
|
||||||
);
|
);
|
||||||
LIBRARY_SEARCH_PATHS = "$(inherited)";
|
LIBRARY_SEARCH_PATHS = "$(inherited)";
|
||||||
MARKETING_VERSION = 1.5.2;
|
MARKETING_VERSION = 1.5.3;
|
||||||
OTHER_LDFLAGS = (
|
OTHER_LDFLAGS = (
|
||||||
"-Wl,-no_compact_unwind",
|
"-Wl,-no_compact_unwind",
|
||||||
"-lstdc++",
|
"-lstdc++",
|
||||||
@@ -4673,7 +4673,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 = 198;
|
CURRENT_PROJECT_VERSION = 202;
|
||||||
DEVELOPMENT_ASSET_PATHS = "";
|
DEVELOPMENT_ASSET_PATHS = "";
|
||||||
"DEVELOPMENT_TEAM[sdk=appletvos*]" = 78Z5H3M6RJ;
|
"DEVELOPMENT_TEAM[sdk=appletvos*]" = 78Z5H3M6RJ;
|
||||||
ENABLE_PREVIEWS = YES;
|
ENABLE_PREVIEWS = YES;
|
||||||
@@ -4690,7 +4690,7 @@
|
|||||||
"@executable_path/Frameworks",
|
"@executable_path/Frameworks",
|
||||||
);
|
);
|
||||||
LIBRARY_SEARCH_PATHS = "$(inherited)";
|
LIBRARY_SEARCH_PATHS = "$(inherited)";
|
||||||
MARKETING_VERSION = 1.5.2;
|
MARKETING_VERSION = 1.5.3;
|
||||||
OTHER_LDFLAGS = (
|
OTHER_LDFLAGS = (
|
||||||
"-Wl,-no_compact_unwind",
|
"-Wl,-no_compact_unwind",
|
||||||
"-lstdc++",
|
"-lstdc++",
|
||||||
@@ -4713,7 +4713,7 @@
|
|||||||
isa = XCBuildConfiguration;
|
isa = XCBuildConfiguration;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
CODE_SIGN_STYLE = Automatic;
|
CODE_SIGN_STYLE = Automatic;
|
||||||
CURRENT_PROJECT_VERSION = 198;
|
CURRENT_PROJECT_VERSION = 202;
|
||||||
GENERATE_INFOPLIST_FILE = YES;
|
GENERATE_INFOPLIST_FILE = YES;
|
||||||
LD_RUNPATH_SEARCH_PATHS = (
|
LD_RUNPATH_SEARCH_PATHS = (
|
||||||
"$(inherited)",
|
"$(inherited)",
|
||||||
@@ -4736,7 +4736,7 @@
|
|||||||
isa = XCBuildConfiguration;
|
isa = XCBuildConfiguration;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
CODE_SIGN_STYLE = Automatic;
|
CODE_SIGN_STYLE = Automatic;
|
||||||
CURRENT_PROJECT_VERSION = 198;
|
CURRENT_PROJECT_VERSION = 202;
|
||||||
GENERATE_INFOPLIST_FILE = YES;
|
GENERATE_INFOPLIST_FILE = YES;
|
||||||
LD_RUNPATH_SEARCH_PATHS = (
|
LD_RUNPATH_SEARCH_PATHS = (
|
||||||
"$(inherited)",
|
"$(inherited)",
|
||||||
|
|||||||
@@ -51,8 +51,8 @@
|
|||||||
"kind" : "remoteSourceControl",
|
"kind" : "remoteSourceControl",
|
||||||
"location" : "https://github.com/SDWebImage/libwebp-Xcode.git",
|
"location" : "https://github.com/SDWebImage/libwebp-Xcode.git",
|
||||||
"state" : {
|
"state" : {
|
||||||
"revision" : "b2b1d20a90b14d11f6ef4241da6b81c1d3f171e4",
|
"revision" : "0d60654eeefd5d7d2bef3835804892c40225e8b2",
|
||||||
"version" : "1.3.2"
|
"version" : "1.5.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -105,8 +105,8 @@
|
|||||||
"kind" : "remoteSourceControl",
|
"kind" : "remoteSourceControl",
|
||||||
"location" : "https://github.com/SDWebImage/SDWebImage",
|
"location" : "https://github.com/SDWebImage/SDWebImage",
|
||||||
"state" : {
|
"state" : {
|
||||||
"revision" : "10d06f6a33bafae8c164fbfd1f03391f6d4692b3",
|
"revision" : "cac9a55a3ae92478a2c95042dcc8d9695d2129ca",
|
||||||
"version" : "5.20.0"
|
"version" : "5.21.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -150,8 +150,8 @@
|
|||||||
"kind" : "remoteSourceControl",
|
"kind" : "remoteSourceControl",
|
||||||
"location" : "https://github.com/apple/swift-log.git",
|
"location" : "https://github.com/apple/swift-log.git",
|
||||||
"state" : {
|
"state" : {
|
||||||
"revision" : "96a2f8a0fa41e9e09af4585e2724c4e825410b91",
|
"revision" : "3d8596ed08bd13520157f0355e35caed215ffbfa",
|
||||||
"version" : "1.6.2"
|
"version" : "1.6.3"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ struct InstancesSettings: View {
|
|||||||
|
|
||||||
@State private var frontendURL = ""
|
@State private var frontendURL = ""
|
||||||
@State private var proxiesVideos = false
|
@State private var proxiesVideos = false
|
||||||
|
@State private var invidiousCompanion = false
|
||||||
|
|
||||||
@Environment(\.colorScheme) private var colorScheme
|
@Environment(\.colorScheme) private var colorScheme
|
||||||
@ObservedObject private var accounts = AccountsModel.shared
|
@ObservedObject private var accounts = AccountsModel.shared
|
||||||
@@ -105,6 +106,16 @@ struct InstancesSettings: View {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if selectedInstance != nil, selectedInstance.app == .invidious {
|
||||||
|
invidiousCompanionToggle
|
||||||
|
.onAppear {
|
||||||
|
invidiousCompanion = selectedInstance.invidiousCompanion
|
||||||
|
}
|
||||||
|
.onChange(of: invidiousCompanion) { newValue in
|
||||||
|
InstancesModel.shared.setInvidiousCompanion(selectedInstance, newValue)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if selectedInstance != nil, !selectedInstance.app.supportsAccounts {
|
if selectedInstance != nil, !selectedInstance.app.supportsAccounts {
|
||||||
Spacer()
|
Spacer()
|
||||||
Text("Accounts are not supported for the application of this instance")
|
Text("Accounts are not supported for the application of this instance")
|
||||||
@@ -191,6 +202,10 @@ struct InstancesSettings: View {
|
|||||||
private var proxiesVideosToggle: some View {
|
private var proxiesVideosToggle: some View {
|
||||||
Toggle("Proxy videos", isOn: $proxiesVideos)
|
Toggle("Proxy videos", isOn: $proxiesVideos)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private var invidiousCompanionToggle: some View {
|
||||||
|
Toggle("Invidious companion", isOn: $invidiousCompanion)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
struct InstancesSettingsView_Previews: PreviewProvider {
|
struct InstancesSettingsView_Previews: PreviewProvider {
|
||||||
|
|||||||
Reference in New Issue
Block a user