mirror of
https://github.com/yattee/yattee.git
synced 2025-12-15 12:38:15 +00:00
Compare commits
10 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
75ac11c60d | ||
|
|
0d3138b36e | ||
|
|
582f07388e | ||
|
|
2b18f0cffa | ||
|
|
ef401168ec | ||
|
|
0c7af0351b | ||
|
|
0995e3ee2f | ||
|
|
cbd95ebc58 | ||
|
|
528863bf1b | ||
|
|
c931aa09a2 |
34
.github/workflows/release.yml
vendored
34
.github/workflows/release.yml
vendored
@@ -1,10 +1,9 @@
|
|||||||
name: Build and release to TestFlight and GitHub
|
name: Build and release to TestFlight and GitHub
|
||||||
on:
|
on:
|
||||||
push:
|
|
||||||
branches: [ main ]
|
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
|
|
||||||
env:
|
env:
|
||||||
|
APP_NAME: Yattee
|
||||||
FASTLANE_USER: ${{ secrets.FASTLANE_USER }}
|
FASTLANE_USER: ${{ secrets.FASTLANE_USER }}
|
||||||
FASTLANE_PASSWORD: ${{ secrets.FASTLANE_PASSWORD }}
|
FASTLANE_PASSWORD: ${{ secrets.FASTLANE_PASSWORD }}
|
||||||
ITC_TEAM_ID: ${{ secrets.ITC_TEAM_ID }}
|
ITC_TEAM_ID: ${{ secrets.ITC_TEAM_ID }}
|
||||||
@@ -21,7 +20,29 @@ env:
|
|||||||
TESTFLIGHT_EXTERNAL_GROUPS: ${{ secrets.TESTFLIGHT_EXTERNAL_GROUPS }}
|
TESTFLIGHT_EXTERNAL_GROUPS: ${{ secrets.TESTFLIGHT_EXTERNAL_GROUPS }}
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
|
bump_build:
|
||||||
|
name: Bump build number
|
||||||
|
runs-on: macos-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
- name: Configure git
|
||||||
|
run: |
|
||||||
|
git config --local user.email "github-actions[bot]@users.noreply.github.com"
|
||||||
|
git config --local user.name "github-actions[bot]"
|
||||||
|
- uses: ruby/setup-ruby@v1
|
||||||
|
with:
|
||||||
|
ruby-version: '3.0'
|
||||||
|
bundler-cache: true
|
||||||
|
- uses: maierj/fastlane-action@v3.0.0
|
||||||
|
with:
|
||||||
|
lane: bump_build
|
||||||
|
- name: Push changes
|
||||||
|
uses: ad-m/github-push-action@master
|
||||||
|
with:
|
||||||
|
github_token: ${{ secrets.GIT_AUTHORIZATION }}
|
||||||
|
branch: ${{ github.ref }}
|
||||||
testflight:
|
testflight:
|
||||||
|
needs: bump_build
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
lane: ['mac beta', 'ios beta', 'tvos beta']
|
lane: ['mac beta', 'ios beta', 'tvos beta']
|
||||||
@@ -29,6 +50,8 @@ jobs:
|
|||||||
runs-on: macos-latest
|
runs-on: macos-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
|
with:
|
||||||
|
ref: main
|
||||||
- uses: ruby/setup-ruby@v1
|
- uses: ruby/setup-ruby@v1
|
||||||
with:
|
with:
|
||||||
ruby-version: '3.0'
|
ruby-version: '3.0'
|
||||||
@@ -46,10 +69,13 @@ jobs:
|
|||||||
path: fastlane/builds/**/*.ipa
|
path: fastlane/builds/**/*.ipa
|
||||||
if-no-files-found: ignore
|
if-no-files-found: ignore
|
||||||
mac_notarized:
|
mac_notarized:
|
||||||
|
needs: bump_build
|
||||||
name: Build and notarize macOS app
|
name: Build and notarize macOS app
|
||||||
runs-on: macos-latest
|
runs-on: macos-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
|
with:
|
||||||
|
ref: main
|
||||||
- uses: ruby/setup-ruby@v1
|
- uses: ruby/setup-ruby@v1
|
||||||
with:
|
with:
|
||||||
ruby-version: '3.0'
|
ruby-version: '3.0'
|
||||||
@@ -75,11 +101,13 @@ jobs:
|
|||||||
path: ${{ env.ZIP_PATH }}
|
path: ${{ env.ZIP_PATH }}
|
||||||
if-no-files-found: error
|
if-no-files-found: error
|
||||||
release:
|
release:
|
||||||
needs: ['testflight', 'mac_notarized']
|
needs: ['bump_build', 'testflight', 'mac_notarized']
|
||||||
name: Create GitHub release
|
name: Create GitHub release
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
|
with:
|
||||||
|
ref: main
|
||||||
- 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@v3
|
||||||
|
|||||||
4
.gitignore
vendored
4
.gitignore
vendored
@@ -97,3 +97,7 @@ iOSInjectionProject/
|
|||||||
|
|
||||||
# User-specific xcconfig files
|
# User-specific xcconfig files
|
||||||
Xcode-config/DEVELOPMENT_TEAM.xcconfig
|
Xcode-config/DEVELOPMENT_TEAM.xcconfig
|
||||||
|
|
||||||
|
# Bundler
|
||||||
|
.bundle/
|
||||||
|
Vendor/bundle/
|
||||||
|
|||||||
1
AS_CONNECT_BUILD_VERSION
Normal file
1
AS_CONNECT_BUILD_VERSION
Normal file
@@ -0,0 +1 @@
|
|||||||
|
137
|
||||||
@@ -11,10 +11,10 @@ extension Backport where Content: View {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@ViewBuilder func scrollDismissesKeyboardInteractively() -> some View {
|
@ViewBuilder func scrollDismissesKeyboardInteractively() -> some View {
|
||||||
if #available(iOS 16.0, macOS 13.0, tvOS 16.0, *) {
|
if #available(iOS 16.0, macOS 13.0, tvOS 16.0, *) {
|
||||||
content.scrollDismissesKeyboard(.interactively)
|
content.scrollDismissesKeyboard(.interactively)
|
||||||
} else {
|
} else {
|
||||||
content
|
content
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,10 @@
|
|||||||
## Build 136
|
## Build 137
|
||||||
|
* Added filter to hide Short videos, available via view menu/toolbar button
|
||||||
|
* Added localizations: Arabic, Portugese, Portuguese (Brazil)
|
||||||
|
* Fixed reported crashes
|
||||||
|
* Other minor changes and improvements
|
||||||
|
|
||||||
|
### Previous Builds
|
||||||
|
|
||||||
* Fixed issue with loading channels in Favorites with Invidious
|
* Fixed issue with loading channels in Favorites with Invidious
|
||||||
* Other minor changes and improvements
|
* Other minor changes and improvements
|
||||||
|
|||||||
@@ -211,6 +211,7 @@ GEM
|
|||||||
PLATFORMS
|
PLATFORMS
|
||||||
arm64-darwin-21
|
arm64-darwin-21
|
||||||
x86_64-darwin-19
|
x86_64-darwin-19
|
||||||
|
x86_64-linux
|
||||||
|
|
||||||
DEPENDENCIES
|
DEPENDENCIES
|
||||||
fastlane
|
fastlane
|
||||||
|
|||||||
@@ -461,6 +461,7 @@ final class InvidiousAPI: Service, ObservableObject, VideosAPI {
|
|||||||
}
|
}
|
||||||
|
|
||||||
let description = json["description"].stringValue
|
let description = json["description"].stringValue
|
||||||
|
let length = json["lengthSeconds"].doubleValue
|
||||||
|
|
||||||
return Video(
|
return Video(
|
||||||
instanceID: account.instanceID,
|
instanceID: account.instanceID,
|
||||||
@@ -470,7 +471,7 @@ final class InvidiousAPI: Service, ObservableObject, VideosAPI {
|
|||||||
videoID: videoID,
|
videoID: videoID,
|
||||||
title: json["title"].stringValue,
|
title: json["title"].stringValue,
|
||||||
author: json["author"].stringValue,
|
author: json["author"].stringValue,
|
||||||
length: json["lengthSeconds"].doubleValue,
|
length: length,
|
||||||
published: published,
|
published: published,
|
||||||
views: json["viewCount"].intValue,
|
views: json["viewCount"].intValue,
|
||||||
description: description,
|
description: description,
|
||||||
@@ -480,6 +481,7 @@ final class InvidiousAPI: Service, ObservableObject, VideosAPI {
|
|||||||
indexID: indexID,
|
indexID: indexID,
|
||||||
live: json["liveNow"].boolValue,
|
live: json["liveNow"].boolValue,
|
||||||
upcoming: json["isUpcoming"].boolValue,
|
upcoming: json["isUpcoming"].boolValue,
|
||||||
|
short: length <= Video.shortLength,
|
||||||
publishedAt: publishedAt,
|
publishedAt: publishedAt,
|
||||||
likes: json["likeCount"].int,
|
likes: json["likeCount"].int,
|
||||||
dislikes: json["dislikeCount"].int,
|
dislikes: json["dislikeCount"].int,
|
||||||
|
|||||||
@@ -481,6 +481,8 @@ final class PipedAPI: Service, ObservableObject, VideosAPI {
|
|||||||
chapters = extractChapters(from: description)
|
chapters = extractChapters(from: description)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let length = details["duration"]?.double ?? 0
|
||||||
|
|
||||||
return Video(
|
return Video(
|
||||||
instanceID: account.instanceID,
|
instanceID: account.instanceID,
|
||||||
app: .piped,
|
app: .piped,
|
||||||
@@ -488,13 +490,14 @@ final class PipedAPI: Service, ObservableObject, VideosAPI {
|
|||||||
videoID: extractID(from: content),
|
videoID: extractID(from: content),
|
||||||
title: details["title"]?.string ?? "",
|
title: details["title"]?.string ?? "",
|
||||||
author: author,
|
author: author,
|
||||||
length: details["duration"]?.double ?? 0,
|
length: length,
|
||||||
published: published ?? "",
|
published: published ?? "",
|
||||||
views: details["views"]?.int ?? 0,
|
views: details["views"]?.int ?? 0,
|
||||||
description: description,
|
description: description,
|
||||||
channel: Channel(app: .piped, id: channelId, name: author, thumbnailURL: authorThumbnailURL, subscriptionsCount: subscriptionsCount),
|
channel: Channel(app: .piped, id: channelId, name: author, thumbnailURL: authorThumbnailURL, subscriptionsCount: subscriptionsCount),
|
||||||
thumbnails: thumbnails,
|
thumbnails: thumbnails,
|
||||||
live: live,
|
live: live,
|
||||||
|
short: details["isShort"]?.bool ?? (length <= Video.shortLength),
|
||||||
likes: details["likes"]?.int,
|
likes: details["likes"]?.int,
|
||||||
dislikes: details["dislikes"]?.int,
|
dislikes: details["dislikes"]?.int,
|
||||||
streams: extractStreams(from: content),
|
streams: extractStreams(from: content),
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
import Cache
|
import Cache
|
||||||
import CoreData
|
import CoreData
|
||||||
|
import Defaults
|
||||||
import Foundation
|
import Foundation
|
||||||
import Siesta
|
import Siesta
|
||||||
import SwiftyJSON
|
import SwiftyJSON
|
||||||
@@ -237,6 +238,10 @@ final class FeedModel: ObservableObject, CacheModel {
|
|||||||
let watches = watchFetchRequestResult(videos, context: backgroundContext)
|
let watches = watchFetchRequestResult(videos, context: backgroundContext)
|
||||||
let watchesIDs = watches.map(\.videoID)
|
let watchesIDs = watches.map(\.videoID)
|
||||||
let unwatched = videos.filter { video in
|
let unwatched = videos.filter { video in
|
||||||
|
if Defaults[.hideShorts], video.short {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
if !watchesIDs.contains(video.videoID) {
|
if !watchesIDs.contains(video.videoID) {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,6 +5,8 @@ import SwiftUI
|
|||||||
import SwiftyJSON
|
import SwiftyJSON
|
||||||
|
|
||||||
struct Video: Identifiable, Equatable, Hashable {
|
struct Video: Identifiable, Equatable, Hashable {
|
||||||
|
static let shortLength = 61.0
|
||||||
|
|
||||||
enum VideoID {
|
enum VideoID {
|
||||||
static func isValid(_ id: Video.ID) -> Bool {
|
static func isValid(_ id: Video.ID) -> Bool {
|
||||||
isYouTube(id) || isPeerTube(id)
|
isYouTube(id) || isPeerTube(id)
|
||||||
@@ -40,6 +42,7 @@ struct Video: Identifiable, Equatable, Hashable {
|
|||||||
|
|
||||||
var live: Bool
|
var live: Bool
|
||||||
var upcoming: Bool
|
var upcoming: Bool
|
||||||
|
var short: Bool
|
||||||
|
|
||||||
var streams = [Stream]()
|
var streams = [Stream]()
|
||||||
|
|
||||||
@@ -74,6 +77,7 @@ struct Video: Identifiable, Equatable, Hashable {
|
|||||||
indexID: String? = nil,
|
indexID: String? = nil,
|
||||||
live: Bool = false,
|
live: Bool = false,
|
||||||
upcoming: Bool = false,
|
upcoming: Bool = false,
|
||||||
|
short: Bool = false,
|
||||||
publishedAt: Date? = nil,
|
publishedAt: Date? = nil,
|
||||||
likes: Int? = nil,
|
likes: Int? = nil,
|
||||||
dislikes: Int? = nil,
|
dislikes: Int? = nil,
|
||||||
@@ -101,6 +105,7 @@ struct Video: Identifiable, Equatable, Hashable {
|
|||||||
self.indexID = indexID
|
self.indexID = indexID
|
||||||
self.live = live
|
self.live = live
|
||||||
self.upcoming = upcoming
|
self.upcoming = upcoming
|
||||||
|
self.short = short
|
||||||
self.publishedAt = publishedAt
|
self.publishedAt = publishedAt
|
||||||
self.likes = likes
|
self.likes = likes
|
||||||
self.dislikes = dislikes
|
self.dislikes = dislikes
|
||||||
@@ -154,6 +159,7 @@ struct Video: Identifiable, Equatable, Hashable {
|
|||||||
"indexID": indexID ?? "",
|
"indexID": indexID ?? "",
|
||||||
"live": live,
|
"live": live,
|
||||||
"upcoming": upcoming,
|
"upcoming": upcoming,
|
||||||
|
"short": short,
|
||||||
"publishedAt": publishedAt
|
"publishedAt": publishedAt
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
@@ -180,6 +186,7 @@ struct Video: Identifiable, Equatable, Hashable {
|
|||||||
indexID: json["indexID"].stringValue,
|
indexID: json["indexID"].stringValue,
|
||||||
live: json["live"].boolValue,
|
live: json["live"].boolValue,
|
||||||
upcoming: json["upcoming"].boolValue,
|
upcoming: json["upcoming"].boolValue,
|
||||||
|
short: json["short"].boolValue,
|
||||||
publishedAt: dateFormatter.date(from: json["publishedAt"].stringValue)
|
publishedAt: dateFormatter.date(from: json["publishedAt"].stringValue)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ struct ChannelPlaylistView: View {
|
|||||||
@Environment(\.colorScheme) private var colorScheme
|
@Environment(\.colorScheme) private var colorScheme
|
||||||
@Environment(\.navigationStyle) private var navigationStyle
|
@Environment(\.navigationStyle) private var navigationStyle
|
||||||
@Default(.channelPlaylistListingStyle) private var channelPlaylistListingStyle
|
@Default(.channelPlaylistListingStyle) private var channelPlaylistListingStyle
|
||||||
|
@Default(.hideShorts) private var hideShorts
|
||||||
|
|
||||||
@ObservedObject private var accounts = AccountsModel.shared
|
@ObservedObject private var accounts = AccountsModel.shared
|
||||||
var player = PlayerModel.shared
|
var player = PlayerModel.shared
|
||||||
@@ -104,6 +105,7 @@ struct ChannelPlaylistView: View {
|
|||||||
ToolbarItem(placement: playlistButtonsPlacement) {
|
ToolbarItem(placement: playlistButtonsPlacement) {
|
||||||
HStack {
|
HStack {
|
||||||
ListingStyleButtons(listingStyle: $channelPlaylistListingStyle)
|
ListingStyleButtons(listingStyle: $channelPlaylistListingStyle)
|
||||||
|
HideShortsButtons(hide: $hideShorts)
|
||||||
ShareButton(contentItem: contentItem)
|
ShareButton(contentItem: contentItem)
|
||||||
|
|
||||||
favoriteButton
|
favoriteButton
|
||||||
@@ -131,6 +133,10 @@ struct ChannelPlaylistView: View {
|
|||||||
|
|
||||||
ListingStyleButtons(listingStyle: $channelPlaylistListingStyle)
|
ListingStyleButtons(listingStyle: $channelPlaylistListingStyle)
|
||||||
|
|
||||||
|
Section {
|
||||||
|
HideShortsButtons(hide: $hideShorts)
|
||||||
|
}
|
||||||
|
|
||||||
Section {
|
Section {
|
||||||
SettingsButtons()
|
SettingsButtons()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -32,6 +32,7 @@ struct ChannelVideosView: View {
|
|||||||
|
|
||||||
@Default(.channelPlaylistListingStyle) private var channelPlaylistListingStyle
|
@Default(.channelPlaylistListingStyle) private var channelPlaylistListingStyle
|
||||||
@Default(.expandChannelDescription) private var expandChannelDescription
|
@Default(.expandChannelDescription) private var expandChannelDescription
|
||||||
|
@Default(.hideShorts) private var hideShorts
|
||||||
|
|
||||||
var presentedChannel: Channel? {
|
var presentedChannel: Channel? {
|
||||||
store.item ?? channel ?? recents.presentedChannel
|
store.item ?? channel ?? recents.presentedChannel
|
||||||
@@ -100,6 +101,7 @@ struct ChannelVideosView: View {
|
|||||||
}
|
}
|
||||||
.environment(\.inChannelView, true)
|
.environment(\.inChannelView, true)
|
||||||
.environment(\.listingStyle, channelPlaylistListingStyle)
|
.environment(\.listingStyle, channelPlaylistListingStyle)
|
||||||
|
.environment(\.hideShorts, hideShorts)
|
||||||
#if os(tvOS)
|
#if os(tvOS)
|
||||||
.prefersDefaultFocus(in: focusNamespace)
|
.prefersDefaultFocus(in: focusNamespace)
|
||||||
#endif
|
#endif
|
||||||
@@ -131,6 +133,9 @@ struct ChannelVideosView: View {
|
|||||||
ToolbarItem {
|
ToolbarItem {
|
||||||
ListingStyleButtons(listingStyle: $channelPlaylistListingStyle)
|
ListingStyleButtons(listingStyle: $channelPlaylistListingStyle)
|
||||||
}
|
}
|
||||||
|
ToolbarItem {
|
||||||
|
HideShortsButtons(hide: $hideShorts)
|
||||||
|
}
|
||||||
ToolbarItem {
|
ToolbarItem {
|
||||||
contentTypePicker
|
contentTypePicker
|
||||||
}
|
}
|
||||||
@@ -271,6 +276,10 @@ struct ChannelVideosView: View {
|
|||||||
}
|
}
|
||||||
|
|
||||||
ListingStyleButtons(listingStyle: $channelPlaylistListingStyle)
|
ListingStyleButtons(listingStyle: $channelPlaylistListingStyle)
|
||||||
|
|
||||||
|
Section {
|
||||||
|
HideShortsButtons(hide: $hideShorts)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} label: {
|
} label: {
|
||||||
HStack(spacing: 12) {
|
HStack(spacing: 12) {
|
||||||
|
|||||||
@@ -5,6 +5,14 @@ import SwiftUI
|
|||||||
struct Constants {
|
struct Constants {
|
||||||
static let yatteeProtocol = "yattee://"
|
static let yatteeProtocol = "yattee://"
|
||||||
static let overlayAnimation = Animation.linear(duration: 0.2)
|
static let overlayAnimation = Animation.linear(duration: 0.2)
|
||||||
|
static var isIPhone: Bool {
|
||||||
|
#if os(iOS)
|
||||||
|
UIDevice.current.userInterfaceIdiom == .phone
|
||||||
|
#else
|
||||||
|
false
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
static var progressViewScale: Double {
|
static var progressViewScale: Double {
|
||||||
#if os(macOS)
|
#if os(macOS)
|
||||||
0.4
|
0.4
|
||||||
|
|||||||
@@ -238,6 +238,8 @@ extension Defaults.Keys {
|
|||||||
static let openWatchNextOnFinishedWatching = Key<Bool>("openWatchNextOnFinishedWatching", default: true)
|
static let openWatchNextOnFinishedWatching = Key<Bool>("openWatchNextOnFinishedWatching", default: true)
|
||||||
static let openWatchNextOnClose = Key<Bool>("openWatchNextOnClose", default: false)
|
static let openWatchNextOnClose = Key<Bool>("openWatchNextOnClose", default: false)
|
||||||
static let openWatchNextOnFinishedWatchingDelay = Key<String>("openWatchNextOnFinishedWatchingDelay", default: "5")
|
static let openWatchNextOnFinishedWatchingDelay = Key<String>("openWatchNextOnFinishedWatchingDelay", default: "5")
|
||||||
|
|
||||||
|
static let hideShorts = Key<Bool>("hideShorts", default: false)
|
||||||
}
|
}
|
||||||
|
|
||||||
enum ResolutionSetting: String, CaseIterable, Defaults.Serializable {
|
enum ResolutionSetting: String, CaseIterable, Defaults.Serializable {
|
||||||
|
|||||||
@@ -66,6 +66,10 @@ private struct ScrollViewBottomPaddingKey: EnvironmentKey {
|
|||||||
static let defaultValue: Double = 30
|
static let defaultValue: Double = 30
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private struct HideShortsKey: EnvironmentKey {
|
||||||
|
static let defaultValue = false
|
||||||
|
}
|
||||||
|
|
||||||
extension EnvironmentValues {
|
extension EnvironmentValues {
|
||||||
var inChannelView: Bool {
|
var inChannelView: Bool {
|
||||||
get { self[InChannelViewKey.self] }
|
get { self[InChannelViewKey.self] }
|
||||||
@@ -121,4 +125,9 @@ extension EnvironmentValues {
|
|||||||
get { self[NoListingDividersKey.self] }
|
get { self[NoListingDividersKey.self] }
|
||||||
set { self[NoListingDividersKey.self] = newValue }
|
set { self[NoListingDividersKey.self] = newValue }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var hideShorts: Bool {
|
||||||
|
get { self[HideShortsKey.self] }
|
||||||
|
set { self[HideShortsKey.self] = newValue }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -25,10 +25,14 @@ struct ContentView: View {
|
|||||||
var body: some View {
|
var body: some View {
|
||||||
Group {
|
Group {
|
||||||
#if os(iOS)
|
#if os(iOS)
|
||||||
if horizontalSizeClass == .compact {
|
if Constants.isIPhone {
|
||||||
AppTabNavigation()
|
AppTabNavigation()
|
||||||
} else {
|
} else {
|
||||||
AppSidebarNavigation()
|
if horizontalSizeClass == .compact {
|
||||||
|
AppTabNavigation()
|
||||||
|
} else {
|
||||||
|
AppSidebarNavigation()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#elseif os(macOS)
|
#elseif os(macOS)
|
||||||
AppSidebarNavigation()
|
AppSidebarNavigation()
|
||||||
|
|||||||
@@ -24,6 +24,7 @@ struct PlaylistsView: View {
|
|||||||
|
|
||||||
@Default(.playlistListingStyle) private var playlistListingStyle
|
@Default(.playlistListingStyle) private var playlistListingStyle
|
||||||
@Default(.showCacheStatus) private var showCacheStatus
|
@Default(.showCacheStatus) private var showCacheStatus
|
||||||
|
@Default(.hideShorts) private var hideShorts
|
||||||
|
|
||||||
var items: [ContentItem] {
|
var items: [ContentItem] {
|
||||||
var videos = currentPlaylist?.videos ?? []
|
var videos = currentPlaylist?.videos ?? []
|
||||||
@@ -95,6 +96,7 @@ struct PlaylistsView: View {
|
|||||||
}
|
}
|
||||||
.environment(\.currentPlaylistID, currentPlaylist?.id)
|
.environment(\.currentPlaylistID, currentPlaylist?.id)
|
||||||
.environment(\.listingStyle, playlistListingStyle)
|
.environment(\.listingStyle, playlistListingStyle)
|
||||||
|
.environment(\.hideShorts, hideShorts)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -167,6 +169,9 @@ struct PlaylistsView: View {
|
|||||||
ToolbarItem {
|
ToolbarItem {
|
||||||
ListingStyleButtons(listingStyle: $playlistListingStyle)
|
ListingStyleButtons(listingStyle: $playlistListingStyle)
|
||||||
}
|
}
|
||||||
|
ToolbarItem {
|
||||||
|
HideShortsButtons(hide: $hideShorts)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
.onReceive(NotificationCenter.default.publisher(for: UIApplication.willEnterForegroundNotification)) { _ in
|
.onReceive(NotificationCenter.default.publisher(for: UIApplication.willEnterForegroundNotification)) { _ in
|
||||||
@@ -234,6 +239,10 @@ struct PlaylistsView: View {
|
|||||||
|
|
||||||
ListingStyleButtons(listingStyle: $playlistListingStyle)
|
ListingStyleButtons(listingStyle: $playlistListingStyle)
|
||||||
|
|
||||||
|
Section {
|
||||||
|
HideShortsButtons(hide: $hideShorts)
|
||||||
|
}
|
||||||
|
|
||||||
Section {
|
Section {
|
||||||
SettingsButtons()
|
SettingsButtons()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -30,6 +30,7 @@ struct SearchView: View {
|
|||||||
@Default(.saveRecents) private var saveRecents
|
@Default(.saveRecents) private var saveRecents
|
||||||
@Default(.showHome) private var showHome
|
@Default(.showHome) private var showHome
|
||||||
@Default(.searchListingStyle) private var searchListingStyle
|
@Default(.searchListingStyle) private var searchListingStyle
|
||||||
|
@Default(.hideShorts) private var hideShorts
|
||||||
|
|
||||||
private var videos = [Video]()
|
private var videos = [Video]()
|
||||||
|
|
||||||
@@ -70,10 +71,12 @@ struct SearchView: View {
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
.environment(\.listingStyle, searchListingStyle)
|
.environment(\.listingStyle, searchListingStyle)
|
||||||
|
.environment(\.hideShorts, hideShorts)
|
||||||
.toolbar {
|
.toolbar {
|
||||||
#if os(macOS)
|
#if os(macOS)
|
||||||
ToolbarItemGroup(placement: toolbarPlacement) {
|
ToolbarItemGroup(placement: toolbarPlacement) {
|
||||||
ListingStyleButtons(listingStyle: $searchListingStyle)
|
ListingStyleButtons(listingStyle: $searchListingStyle)
|
||||||
|
HideShortsButtons(hide: $hideShorts)
|
||||||
FavoriteButton(item: favoriteItem)
|
FavoriteButton(item: favoriteItem)
|
||||||
.id(favoriteItem?.id)
|
.id(favoriteItem?.id)
|
||||||
|
|
||||||
@@ -210,6 +213,10 @@ struct SearchView: View {
|
|||||||
|
|
||||||
ListingStyleButtons(listingStyle: $searchListingStyle)
|
ListingStyleButtons(listingStyle: $searchListingStyle)
|
||||||
|
|
||||||
|
Section {
|
||||||
|
HideShortsButtons(hide: $hideShorts)
|
||||||
|
}
|
||||||
|
|
||||||
Section {
|
Section {
|
||||||
SettingsButtons()
|
SettingsButtons()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ struct FeedView: View {
|
|||||||
|
|
||||||
#if os(tvOS)
|
#if os(tvOS)
|
||||||
@Default(.subscriptionsListingStyle) private var subscriptionsListingStyle
|
@Default(.subscriptionsListingStyle) private var subscriptionsListingStyle
|
||||||
|
@Default(.hideShorts) private var hideShorts
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
var videos: [ContentItem] {
|
var videos: [ContentItem] {
|
||||||
@@ -54,6 +55,7 @@ struct FeedView: View {
|
|||||||
#if os(tvOS)
|
#if os(tvOS)
|
||||||
SubscriptionsPageButton()
|
SubscriptionsPageButton()
|
||||||
ListingStyleButtons(listingStyle: $subscriptionsListingStyle)
|
ListingStyleButtons(listingStyle: $subscriptionsListingStyle)
|
||||||
|
HideShortsButtons(hide: $hideShorts)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if showCacheStatus {
|
if showCacheStatus {
|
||||||
@@ -82,6 +84,7 @@ struct FeedView: View {
|
|||||||
.padding(.leading, 30)
|
.padding(.leading, 30)
|
||||||
#if os(tvOS)
|
#if os(tvOS)
|
||||||
.padding(.bottom, 15)
|
.padding(.bottom, 15)
|
||||||
|
.padding(.trailing, 30)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -94,7 +97,7 @@ struct FeedView: View {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
struct SubscriptonsView_Previews: PreviewProvider {
|
struct FeedView_Previews: PreviewProvider {
|
||||||
static var previews: some View {
|
static var previews: some View {
|
||||||
NavigationView {
|
NavigationView {
|
||||||
FeedView()
|
FeedView()
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ struct SubscriptionsView: View {
|
|||||||
|
|
||||||
@Default(.subscriptionsViewPage) private var subscriptionsViewPage
|
@Default(.subscriptionsViewPage) private var subscriptionsViewPage
|
||||||
@Default(.subscriptionsListingStyle) private var subscriptionsListingStyle
|
@Default(.subscriptionsListingStyle) private var subscriptionsListingStyle
|
||||||
|
@Default(.hideShorts) private var hideShorts
|
||||||
|
|
||||||
@ObservedObject private var feed = FeedModel.shared
|
@ObservedObject private var feed = FeedModel.shared
|
||||||
@ObservedObject private var subscriptions = SubscribedChannelsModel.shared
|
@ObservedObject private var subscriptions = SubscribedChannelsModel.shared
|
||||||
@@ -27,6 +28,7 @@ struct SubscriptionsView: View {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
.environment(\.listingStyle, subscriptionsListingStyle)
|
.environment(\.listingStyle, subscriptionsListingStyle)
|
||||||
|
.environment(\.hideShorts, hideShorts)
|
||||||
|
|
||||||
#if os(iOS)
|
#if os(iOS)
|
||||||
.navigationBarTitleDisplayMode(.inline)
|
.navigationBarTitleDisplayMode(.inline)
|
||||||
@@ -46,6 +48,10 @@ struct SubscriptionsView: View {
|
|||||||
ListingStyleButtons(listingStyle: $subscriptionsListingStyle)
|
ListingStyleButtons(listingStyle: $subscriptionsListingStyle)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ToolbarItem {
|
||||||
|
HideShortsButtons(hide: $hideShorts)
|
||||||
|
}
|
||||||
|
|
||||||
ToolbarItem {
|
ToolbarItem {
|
||||||
toggleWatchedButton
|
toggleWatchedButton
|
||||||
}
|
}
|
||||||
@@ -73,6 +79,10 @@ struct SubscriptionsView: View {
|
|||||||
ListingStyleButtons(listingStyle: $subscriptionsListingStyle)
|
ListingStyleButtons(listingStyle: $subscriptionsListingStyle)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Section {
|
||||||
|
HideShortsButtons(hide: $hideShorts)
|
||||||
|
}
|
||||||
|
|
||||||
playUnwatchedButton
|
playUnwatchedButton
|
||||||
|
|
||||||
toggleWatchedButton
|
toggleWatchedButton
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ struct TrendingView: View {
|
|||||||
@Default(.trendingCountry) private var country
|
@Default(.trendingCountry) private var country
|
||||||
|
|
||||||
@Default(.trendingListingStyle) private var trendingListingStyle
|
@Default(.trendingListingStyle) private var trendingListingStyle
|
||||||
|
@Default(.hideShorts) private var hideShorts
|
||||||
|
|
||||||
@State private var presentingCountrySelection = false
|
@State private var presentingCountrySelection = false
|
||||||
|
|
||||||
@@ -51,6 +52,7 @@ struct TrendingView: View {
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
.environment(\.listingStyle, trendingListingStyle)
|
.environment(\.listingStyle, trendingListingStyle)
|
||||||
|
.environment(\.hideShorts, hideShorts)
|
||||||
}
|
}
|
||||||
|
|
||||||
.toolbar {
|
.toolbar {
|
||||||
@@ -133,6 +135,10 @@ struct TrendingView: View {
|
|||||||
ToolbarItem {
|
ToolbarItem {
|
||||||
ListingStyleButtons(listingStyle: $trendingListingStyle)
|
ListingStyleButtons(listingStyle: $trendingListingStyle)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ToolbarItem {
|
||||||
|
HideShortsButtons(hide: $hideShorts)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
.onReceive(NotificationCenter.default.publisher(for: UIApplication.willEnterForegroundNotification)) { _ in
|
.onReceive(NotificationCenter.default.publisher(for: UIApplication.willEnterForegroundNotification)) { _ in
|
||||||
@@ -182,6 +188,10 @@ struct TrendingView: View {
|
|||||||
|
|
||||||
ListingStyleButtons(listingStyle: $trendingListingStyle)
|
ListingStyleButtons(listingStyle: $trendingListingStyle)
|
||||||
|
|
||||||
|
Section {
|
||||||
|
HideShortsButtons(hide: $hideShorts)
|
||||||
|
}
|
||||||
|
|
||||||
Section {
|
Section {
|
||||||
SettingsButtons()
|
SettingsButtons()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,21 +5,32 @@ struct ContentItemView: View {
|
|||||||
let item: ContentItem
|
let item: ContentItem
|
||||||
@Environment(\.listingStyle) private var listingStyle
|
@Environment(\.listingStyle) private var listingStyle
|
||||||
@Environment(\.noListingDividers) private var noListingDividers
|
@Environment(\.noListingDividers) private var noListingDividers
|
||||||
|
@Environment(\.hideShorts) private var hideShorts
|
||||||
|
|
||||||
var body: some View {
|
@ViewBuilder var body: some View {
|
||||||
Group {
|
if itemVisible {
|
||||||
switch item.contentType {
|
Group {
|
||||||
case .video:
|
switch item.contentType {
|
||||||
videoItem(item.video)
|
case .video:
|
||||||
case .channel:
|
videoItem(item.video)
|
||||||
channelItem(item.channel)
|
case .channel:
|
||||||
case .playlist:
|
channelItem(item.channel)
|
||||||
playlistItem(item.playlist)
|
case .playlist:
|
||||||
default:
|
playlistItem(item.playlist)
|
||||||
placeholderItem()
|
default:
|
||||||
|
placeholderItem()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
.id(item.cacheKey)
|
||||||
}
|
}
|
||||||
.id(item.cacheKey)
|
}
|
||||||
|
|
||||||
|
var itemVisible: Bool {
|
||||||
|
guard hideShorts, item.contentType == .video, let video = item.video else {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
return !video.short
|
||||||
}
|
}
|
||||||
|
|
||||||
@ViewBuilder func videoItem(_ video: Video) -> some View {
|
@ViewBuilder func videoItem(_ video: Video) -> some View {
|
||||||
|
|||||||
33
Shared/Views/HideShortsButtons.swift
Normal file
33
Shared/Views/HideShortsButtons.swift
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
import SwiftUI
|
||||||
|
|
||||||
|
struct HideShortsButtons: View {
|
||||||
|
@Binding var hide: Bool
|
||||||
|
|
||||||
|
var body: some View {
|
||||||
|
Button {
|
||||||
|
hide.toggle()
|
||||||
|
} label: {
|
||||||
|
Group {
|
||||||
|
if hide {
|
||||||
|
Label("Short videos: hidden", systemImage: "bolt.slash.fill")
|
||||||
|
.help("Short videos: hidden")
|
||||||
|
} else {
|
||||||
|
Label("Short videos: visible", systemImage: "bolt.fill")
|
||||||
|
.help("Short videos: visible")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#if os(tvOS)
|
||||||
|
.font(.caption2)
|
||||||
|
.imageScale(.small)
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
struct HideShortsButtons_Previews: PreviewProvider {
|
||||||
|
static var previews: some View {
|
||||||
|
VStack {
|
||||||
|
HideShortsButtons(hide: .constant(true))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -10,6 +10,7 @@ struct PopularView: View {
|
|||||||
@State private var error: RequestError?
|
@State private var error: RequestError?
|
||||||
|
|
||||||
@Default(.popularListingStyle) private var popularListingStyle
|
@Default(.popularListingStyle) private var popularListingStyle
|
||||||
|
@Default(.hideShorts) private var hideShorts
|
||||||
|
|
||||||
var resource: Resource? {
|
var resource: Resource? {
|
||||||
accounts.api.popular
|
accounts.api.popular
|
||||||
@@ -69,6 +70,10 @@ struct PopularView: View {
|
|||||||
ToolbarItem {
|
ToolbarItem {
|
||||||
ListingStyleButtons(listingStyle: $popularListingStyle)
|
ListingStyleButtons(listingStyle: $popularListingStyle)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ToolbarItem {
|
||||||
|
HideShortsButtons(hide: $hideShorts)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
.onReceive(NotificationCenter.default.publisher(for: UIApplication.willEnterForegroundNotification)) { _ in
|
.onReceive(NotificationCenter.default.publisher(for: UIApplication.willEnterForegroundNotification)) { _ in
|
||||||
@@ -84,6 +89,10 @@ struct PopularView: View {
|
|||||||
Menu {
|
Menu {
|
||||||
ListingStyleButtons(listingStyle: $popularListingStyle)
|
ListingStyleButtons(listingStyle: $popularListingStyle)
|
||||||
|
|
||||||
|
Section {
|
||||||
|
HideShortsButtons(hide: $hideShorts)
|
||||||
|
}
|
||||||
|
|
||||||
Section {
|
Section {
|
||||||
SettingsButtons()
|
SettingsButtons()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -679,6 +679,9 @@
|
|||||||
379DC3D128BA4EB400B09677 /* Seek.swift in Sources */ = {isa = PBXBuildFile; fileRef = 379DC3D028BA4EB400B09677 /* Seek.swift */; };
|
379DC3D128BA4EB400B09677 /* Seek.swift in Sources */ = {isa = PBXBuildFile; fileRef = 379DC3D028BA4EB400B09677 /* Seek.swift */; };
|
||||||
379DC3D228BA4EB400B09677 /* Seek.swift in Sources */ = {isa = PBXBuildFile; fileRef = 379DC3D028BA4EB400B09677 /* Seek.swift */; };
|
379DC3D228BA4EB400B09677 /* Seek.swift in Sources */ = {isa = PBXBuildFile; fileRef = 379DC3D028BA4EB400B09677 /* Seek.swift */; };
|
||||||
379DC3D328BA4EB400B09677 /* Seek.swift in Sources */ = {isa = PBXBuildFile; fileRef = 379DC3D028BA4EB400B09677 /* Seek.swift */; };
|
379DC3D328BA4EB400B09677 /* Seek.swift in Sources */ = {isa = PBXBuildFile; fileRef = 379DC3D028BA4EB400B09677 /* Seek.swift */; };
|
||||||
|
379EF9E029AA585F009FE6C6 /* HideShortsButtons.swift in Sources */ = {isa = PBXBuildFile; fileRef = 379EF9DF29AA585F009FE6C6 /* HideShortsButtons.swift */; };
|
||||||
|
379EF9E129AA585F009FE6C6 /* HideShortsButtons.swift in Sources */ = {isa = PBXBuildFile; fileRef = 379EF9DF29AA585F009FE6C6 /* HideShortsButtons.swift */; };
|
||||||
|
379EF9E229AA585F009FE6C6 /* HideShortsButtons.swift in Sources */ = {isa = PBXBuildFile; fileRef = 379EF9DF29AA585F009FE6C6 /* HideShortsButtons.swift */; };
|
||||||
379F141F289ECE7F00DE48B5 /* QualitySettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 379F141E289ECE7F00DE48B5 /* QualitySettings.swift */; };
|
379F141F289ECE7F00DE48B5 /* QualitySettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 379F141E289ECE7F00DE48B5 /* QualitySettings.swift */; };
|
||||||
379F1420289ECE7F00DE48B5 /* QualitySettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 379F141E289ECE7F00DE48B5 /* QualitySettings.swift */; };
|
379F1420289ECE7F00DE48B5 /* QualitySettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 379F141E289ECE7F00DE48B5 /* QualitySettings.swift */; };
|
||||||
379F1421289ECE7F00DE48B5 /* QualitySettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 379F141E289ECE7F00DE48B5 /* QualitySettings.swift */; };
|
379F1421289ECE7F00DE48B5 /* QualitySettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 379F141E289ECE7F00DE48B5 /* QualitySettings.swift */; };
|
||||||
@@ -1364,6 +1367,7 @@
|
|||||||
37992DC726CC50BC003D4C27 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
37992DC726CC50BC003D4C27 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
||||||
379B0252287A1CDF001015B5 /* OrientationTracker.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OrientationTracker.swift; sourceTree = "<group>"; };
|
379B0252287A1CDF001015B5 /* OrientationTracker.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OrientationTracker.swift; sourceTree = "<group>"; };
|
||||||
379DC3D028BA4EB400B09677 /* Seek.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Seek.swift; sourceTree = "<group>"; };
|
379DC3D028BA4EB400B09677 /* Seek.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Seek.swift; sourceTree = "<group>"; };
|
||||||
|
379EF9DF29AA585F009FE6C6 /* HideShortsButtons.swift */ = {isa = PBXFileReference; indentWidth = 3; lastKnownFileType = sourcecode.swift; path = HideShortsButtons.swift; sourceTree = "<group>"; };
|
||||||
379F141E289ECE7F00DE48B5 /* QualitySettings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QualitySettings.swift; sourceTree = "<group>"; };
|
379F141E289ECE7F00DE48B5 /* QualitySettings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QualitySettings.swift; sourceTree = "<group>"; };
|
||||||
37A2B345294723850050933E /* CacheModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CacheModel.swift; sourceTree = "<group>"; };
|
37A2B345294723850050933E /* CacheModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CacheModel.swift; sourceTree = "<group>"; };
|
||||||
37A362B92953707F00BDF328 /* ClearQueueButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ClearQueueButton.swift; sourceTree = "<group>"; };
|
37A362B92953707F00BDF328 /* ClearQueueButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ClearQueueButton.swift; sourceTree = "<group>"; };
|
||||||
@@ -1477,6 +1481,9 @@
|
|||||||
37E70926271CDDAE00D34DDE /* OpenSettingsButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OpenSettingsButton.swift; sourceTree = "<group>"; };
|
37E70926271CDDAE00D34DDE /* OpenSettingsButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OpenSettingsButton.swift; sourceTree = "<group>"; };
|
||||||
37E80F3B287B107F00561799 /* VideoDetailsOverlay.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VideoDetailsOverlay.swift; sourceTree = "<group>"; };
|
37E80F3B287B107F00561799 /* VideoDetailsOverlay.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VideoDetailsOverlay.swift; sourceTree = "<group>"; };
|
||||||
37E80F3F287B472300561799 /* ScrollContentBackground+Backport.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ScrollContentBackground+Backport.swift"; sourceTree = "<group>"; };
|
37E80F3F287B472300561799 /* ScrollContentBackground+Backport.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ScrollContentBackground+Backport.swift"; sourceTree = "<group>"; };
|
||||||
|
37E868FD29AA400B003128D0 /* ar */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ar; path = ar.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||||
|
37E868FE29AA402D003128D0 /* pt */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pt; path = pt.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||||
|
37E868FF29AA407B003128D0 /* pt-BR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pt-BR"; path = "pt-BR.lproj/Localizable.strings"; sourceTree = "<group>"; };
|
||||||
37E8B0EB27B326C00024006F /* TimelineView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TimelineView.swift; sourceTree = "<group>"; };
|
37E8B0EB27B326C00024006F /* TimelineView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TimelineView.swift; sourceTree = "<group>"; };
|
||||||
37E8B0EF27B326F30024006F /* Comparable+Clamped.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Comparable+Clamped.swift"; sourceTree = "<group>"; };
|
37E8B0EF27B326F30024006F /* Comparable+Clamped.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Comparable+Clamped.swift"; sourceTree = "<group>"; };
|
||||||
37EAD86A267B9C5600D9E01B /* SponsorBlockAPI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SponsorBlockAPI.swift; sourceTree = "<group>"; };
|
37EAD86A267B9C5600D9E01B /* SponsorBlockAPI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SponsorBlockAPI.swift; sourceTree = "<group>"; };
|
||||||
@@ -1869,6 +1876,7 @@
|
|||||||
372CFD14285F2E2A00B0B54B /* ControlsBar.swift */,
|
372CFD14285F2E2A00B0B54B /* ControlsBar.swift */,
|
||||||
3748186D26A769D60084E870 /* DetailBadge.swift */,
|
3748186D26A769D60084E870 /* DetailBadge.swift */,
|
||||||
37599F37272B4D740087F250 /* FavoriteButton.swift */,
|
37599F37272B4D740087F250 /* FavoriteButton.swift */,
|
||||||
|
379EF9DF29AA585F009FE6C6 /* HideShortsButtons.swift */,
|
||||||
37152EE926EFEB95004FB96D /* LazyView.swift */,
|
37152EE926EFEB95004FB96D /* LazyView.swift */,
|
||||||
371CC7732946963000979C1A /* ListingStyleButtons.swift */,
|
371CC7732946963000979C1A /* ListingStyleButtons.swift */,
|
||||||
37030FF627B0347C00ECDDAA /* MPVPlayerView.swift */,
|
37030FF627B0347C00ECDDAA /* MPVPlayerView.swift */,
|
||||||
@@ -2810,6 +2818,9 @@
|
|||||||
cs,
|
cs,
|
||||||
"zh-Hans",
|
"zh-Hans",
|
||||||
ca,
|
ca,
|
||||||
|
ar,
|
||||||
|
pt,
|
||||||
|
"pt-BR",
|
||||||
);
|
);
|
||||||
mainGroup = 37D4B0BC2671614700C925CA;
|
mainGroup = 37D4B0BC2671614700C925CA;
|
||||||
packageReferences = (
|
packageReferences = (
|
||||||
@@ -3300,6 +3311,7 @@
|
|||||||
37BE0BCF26A0E2D50092E2DB /* VideoPlayerView.swift in Sources */,
|
37BE0BCF26A0E2D50092E2DB /* VideoPlayerView.swift in Sources */,
|
||||||
377692562946476F0055EC18 /* ChannelPlaylistsCacheModel.swift in Sources */,
|
377692562946476F0055EC18 /* ChannelPlaylistsCacheModel.swift in Sources */,
|
||||||
3769C02E2779F18600DDB3EA /* PlaceholderProgressView.swift in Sources */,
|
3769C02E2779F18600DDB3EA /* PlaceholderProgressView.swift in Sources */,
|
||||||
|
379EF9E029AA585F009FE6C6 /* HideShortsButtons.swift in Sources */,
|
||||||
37F5E8B6291BE9D0006C15F5 /* URLBookmarkModel.swift in Sources */,
|
37F5E8B6291BE9D0006C15F5 /* URLBookmarkModel.swift in Sources */,
|
||||||
37579D5D27864F5F00FD0B98 /* Help.swift in Sources */,
|
37579D5D27864F5F00FD0B98 /* Help.swift in Sources */,
|
||||||
37030FFB27B0398000ECDDAA /* MPVClient.swift in Sources */,
|
37030FFB27B0398000ECDDAA /* MPVClient.swift in Sources */,
|
||||||
@@ -3428,6 +3440,7 @@
|
|||||||
372CFD16285F2E2A00B0B54B /* ControlsBar.swift in Sources */,
|
372CFD16285F2E2A00B0B54B /* ControlsBar.swift in Sources */,
|
||||||
37FFC441272734C3009FFD26 /* Throttle.swift in Sources */,
|
37FFC441272734C3009FFD26 /* Throttle.swift in Sources */,
|
||||||
37169AA72729E2CC0011DE61 /* AccountsBridge.swift in Sources */,
|
37169AA72729E2CC0011DE61 /* AccountsBridge.swift in Sources */,
|
||||||
|
379EF9E129AA585F009FE6C6 /* HideShortsButtons.swift in Sources */,
|
||||||
37BA793C26DB8EE4002A0235 /* PlaylistVideosView.swift in Sources */,
|
37BA793C26DB8EE4002A0235 /* PlaylistVideosView.swift in Sources */,
|
||||||
378E510026FE8EEE00F49626 /* AccountViewButton.swift in Sources */,
|
378E510026FE8EEE00F49626 /* AccountViewButton.swift in Sources */,
|
||||||
370F4FA927CC163A001B35DC /* PlayerBackend.swift in Sources */,
|
370F4FA927CC163A001B35DC /* PlayerBackend.swift in Sources */,
|
||||||
@@ -3842,6 +3855,7 @@
|
|||||||
373CFACD26966264003CB2C6 /* SearchQuery.swift in Sources */,
|
373CFACD26966264003CB2C6 /* SearchQuery.swift in Sources */,
|
||||||
37C3A24B27235FAA0087A57A /* ChannelPlaylistCell.swift in Sources */,
|
37C3A24B27235FAA0087A57A /* ChannelPlaylistCell.swift in Sources */,
|
||||||
37F4AD2128612DFD004D0F66 /* Buffering.swift in Sources */,
|
37F4AD2128612DFD004D0F66 /* Buffering.swift in Sources */,
|
||||||
|
379EF9E229AA585F009FE6C6 /* HideShortsButtons.swift in Sources */,
|
||||||
37FD43E52704847C0073EE42 /* View+Fixtures.swift in Sources */,
|
37FD43E52704847C0073EE42 /* View+Fixtures.swift in Sources */,
|
||||||
37FAE000272ED58000330459 /* EditFavorites.swift in Sources */,
|
37FAE000272ED58000330459 /* EditFavorites.swift in Sources */,
|
||||||
37F961A127BD90BB00058149 /* PlayerBackendType.swift in Sources */,
|
37F961A127BD90BB00058149 /* PlayerBackendType.swift in Sources */,
|
||||||
@@ -3946,6 +3960,9 @@
|
|||||||
370D5E4F292423F400D053A6 /* cs */,
|
370D5E4F292423F400D053A6 /* cs */,
|
||||||
3744F85C293CC9B800B09AB9 /* zh-Hans */,
|
3744F85C293CC9B800B09AB9 /* zh-Hans */,
|
||||||
37FFCA1029523283005EC13C /* ca */,
|
37FFCA1029523283005EC13C /* ca */,
|
||||||
|
37E868FD29AA400B003128D0 /* ar */,
|
||||||
|
37E868FE29AA402D003128D0 /* pt */,
|
||||||
|
37E868FF29AA407B003128D0 /* pt-BR */,
|
||||||
);
|
);
|
||||||
name = Localizable.strings;
|
name = Localizable.strings;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
@@ -3959,11 +3976,8 @@
|
|||||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
|
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
|
||||||
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_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
|
CODE_SIGN_STYLE = Automatic;
|
||||||
CODE_SIGN_STYLE = Manual;
|
CURRENT_PROJECT_VERSION = 137;
|
||||||
CURRENT_PROJECT_VERSION = 136;
|
|
||||||
DEVELOPMENT_TEAM = "";
|
|
||||||
"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";
|
||||||
INFOPLIST_KEY_CFBundleDisplayName = "Open in Yattee";
|
INFOPLIST_KEY_CFBundleDisplayName = "Open in Yattee";
|
||||||
@@ -3978,7 +3992,6 @@
|
|||||||
PRODUCT_BUNDLE_IDENTIFIER = "stream.yattee.app.Open-in-Yattee";
|
PRODUCT_BUNDLE_IDENTIFIER = "stream.yattee.app.Open-in-Yattee";
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||||
"PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = "match Development stream.yattee.app.Open-in-Yattee";
|
|
||||||
SDKROOT = iphoneos;
|
SDKROOT = iphoneos;
|
||||||
SKIP_INSTALL = YES;
|
SKIP_INSTALL = YES;
|
||||||
SWIFT_EMIT_LOC_STRINGS = YES;
|
SWIFT_EMIT_LOC_STRINGS = YES;
|
||||||
@@ -3995,8 +4008,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 = 136;
|
CURRENT_PROJECT_VERSION = 137;
|
||||||
DEVELOPMENT_TEAM = "";
|
|
||||||
"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";
|
||||||
@@ -4027,7 +4039,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 = 136;
|
CURRENT_PROJECT_VERSION = 137;
|
||||||
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;
|
||||||
@@ -4047,7 +4059,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 = 136;
|
CURRENT_PROJECT_VERSION = 137;
|
||||||
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;
|
||||||
@@ -4206,11 +4218,8 @@
|
|||||||
CLANG_CXX_LANGUAGE_STANDARD = "c++14";
|
CLANG_CXX_LANGUAGE_STANDARD = "c++14";
|
||||||
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_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
|
CODE_SIGN_STYLE = Automatic;
|
||||||
CODE_SIGN_STYLE = Manual;
|
CURRENT_PROJECT_VERSION = 137;
|
||||||
CURRENT_PROJECT_VERSION = 136;
|
|
||||||
DEVELOPMENT_TEAM = "";
|
|
||||||
"DEVELOPMENT_TEAM[sdk=iphoneos*]" = 78Z5H3M6RJ;
|
|
||||||
ENABLE_PREVIEWS = YES;
|
ENABLE_PREVIEWS = YES;
|
||||||
GCC_PREPROCESSOR_DEFINITIONS = (
|
GCC_PREPROCESSOR_DEFINITIONS = (
|
||||||
"DEBUG=1",
|
"DEBUG=1",
|
||||||
@@ -4242,7 +4251,6 @@
|
|||||||
PRODUCT_BUNDLE_IDENTIFIER = stream.yattee.app;
|
PRODUCT_BUNDLE_IDENTIFIER = stream.yattee.app;
|
||||||
PRODUCT_NAME = Yattee;
|
PRODUCT_NAME = Yattee;
|
||||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||||
"PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = "match Development stream.yattee.app";
|
|
||||||
SDKROOT = iphoneos;
|
SDKROOT = iphoneos;
|
||||||
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
|
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
|
||||||
SUPPORTS_MACCATALYST = NO;
|
SUPPORTS_MACCATALYST = NO;
|
||||||
@@ -4264,8 +4272,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 = 136;
|
CURRENT_PROJECT_VERSION = 137;
|
||||||
DEVELOPMENT_TEAM = "";
|
|
||||||
"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";
|
||||||
@@ -4315,13 +4322,10 @@
|
|||||||
ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = YES;
|
ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = YES;
|
||||||
CODE_SIGN_ENTITLEMENTS = Shared/Yattee.entitlements;
|
CODE_SIGN_ENTITLEMENTS = Shared/Yattee.entitlements;
|
||||||
CODE_SIGN_IDENTITY = "Apple Development";
|
CODE_SIGN_IDENTITY = "Apple Development";
|
||||||
"CODE_SIGN_IDENTITY[sdk=macosx*]" = "3rd Party Mac Developer Application";
|
CODE_SIGN_STYLE = Automatic;
|
||||||
CODE_SIGN_STYLE = Manual;
|
|
||||||
COMBINE_HIDPI_IMAGES = YES;
|
COMBINE_HIDPI_IMAGES = YES;
|
||||||
CURRENT_PROJECT_VERSION = 136;
|
CURRENT_PROJECT_VERSION = 137;
|
||||||
DEAD_CODE_STRIPPING = YES;
|
DEAD_CODE_STRIPPING = YES;
|
||||||
DEVELOPMENT_TEAM = "";
|
|
||||||
"DEVELOPMENT_TEAM[sdk=macosx*]" = 78Z5H3M6RJ;
|
|
||||||
ENABLE_APP_SANDBOX = YES;
|
ENABLE_APP_SANDBOX = YES;
|
||||||
ENABLE_HARDENED_RUNTIME = YES;
|
ENABLE_HARDENED_RUNTIME = YES;
|
||||||
ENABLE_PREVIEWS = YES;
|
ENABLE_PREVIEWS = YES;
|
||||||
@@ -4344,7 +4348,6 @@
|
|||||||
PRODUCT_BUNDLE_IDENTIFIER = stream.yattee.app;
|
PRODUCT_BUNDLE_IDENTIFIER = stream.yattee.app;
|
||||||
PRODUCT_NAME = Yattee;
|
PRODUCT_NAME = Yattee;
|
||||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||||
"PROVISIONING_PROFILE_SPECIFIER[sdk=macosx*]" = "match AppStore stream.yattee.app macos";
|
|
||||||
SDKROOT = macosx;
|
SDKROOT = macosx;
|
||||||
SWIFT_EMIT_LOC_STRINGS = YES;
|
SWIFT_EMIT_LOC_STRINGS = YES;
|
||||||
SWIFT_OBJC_BRIDGING_HEADER = macOS/BridgingHeader.h;
|
SWIFT_OBJC_BRIDGING_HEADER = macOS/BridgingHeader.h;
|
||||||
@@ -4363,9 +4366,8 @@
|
|||||||
"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 = 136;
|
CURRENT_PROJECT_VERSION = 137;
|
||||||
DEAD_CODE_STRIPPING = YES;
|
DEAD_CODE_STRIPPING = YES;
|
||||||
DEVELOPMENT_TEAM = "";
|
|
||||||
"DEVELOPMENT_TEAM[sdk=macosx*]" = 78Z5H3M6RJ;
|
"DEVELOPMENT_TEAM[sdk=macosx*]" = 78Z5H3M6RJ;
|
||||||
ENABLE_APP_SANDBOX = YES;
|
ENABLE_APP_SANDBOX = YES;
|
||||||
ENABLE_HARDENED_RUNTIME = YES;
|
ENABLE_HARDENED_RUNTIME = YES;
|
||||||
@@ -4402,7 +4404,7 @@
|
|||||||
buildSettings = {
|
buildSettings = {
|
||||||
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
|
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
|
||||||
CODE_SIGN_STYLE = Automatic;
|
CODE_SIGN_STYLE = Automatic;
|
||||||
CURRENT_PROJECT_VERSION = 136;
|
CURRENT_PROJECT_VERSION = 137;
|
||||||
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 = (
|
||||||
@@ -4426,7 +4428,7 @@
|
|||||||
buildSettings = {
|
buildSettings = {
|
||||||
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
|
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
|
||||||
CODE_SIGN_STYLE = Automatic;
|
CODE_SIGN_STYLE = Automatic;
|
||||||
CURRENT_PROJECT_VERSION = 136;
|
CURRENT_PROJECT_VERSION = 137;
|
||||||
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 = (
|
||||||
@@ -4452,7 +4454,7 @@
|
|||||||
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
|
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
|
||||||
CODE_SIGN_STYLE = Automatic;
|
CODE_SIGN_STYLE = Automatic;
|
||||||
COMBINE_HIDPI_IMAGES = YES;
|
COMBINE_HIDPI_IMAGES = YES;
|
||||||
CURRENT_PROJECT_VERSION = 136;
|
CURRENT_PROJECT_VERSION = 137;
|
||||||
DEAD_CODE_STRIPPING = YES;
|
DEAD_CODE_STRIPPING = YES;
|
||||||
GENERATE_INFOPLIST_FILE = YES;
|
GENERATE_INFOPLIST_FILE = YES;
|
||||||
LD_RUNPATH_SEARCH_PATHS = (
|
LD_RUNPATH_SEARCH_PATHS = (
|
||||||
@@ -4477,7 +4479,7 @@
|
|||||||
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
|
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
|
||||||
CODE_SIGN_STYLE = Automatic;
|
CODE_SIGN_STYLE = Automatic;
|
||||||
COMBINE_HIDPI_IMAGES = YES;
|
COMBINE_HIDPI_IMAGES = YES;
|
||||||
CURRENT_PROJECT_VERSION = 136;
|
CURRENT_PROJECT_VERSION = 137;
|
||||||
DEAD_CODE_STRIPPING = YES;
|
DEAD_CODE_STRIPPING = YES;
|
||||||
GENERATE_INFOPLIST_FILE = YES;
|
GENERATE_INFOPLIST_FILE = YES;
|
||||||
LD_RUNPATH_SEARCH_PATHS = (
|
LD_RUNPATH_SEARCH_PATHS = (
|
||||||
@@ -4501,12 +4503,10 @@
|
|||||||
buildSettings = {
|
buildSettings = {
|
||||||
ASSETCATALOG_COMPILER_APPICON_NAME = "App Icon & Top Shelf Image";
|
ASSETCATALOG_COMPILER_APPICON_NAME = "App Icon & Top Shelf Image";
|
||||||
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
|
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
|
||||||
"CODE_SIGN_IDENTITY[sdk=appletvos*]" = "iPhone Developer";
|
CODE_SIGN_IDENTITY = "Apple Development";
|
||||||
CODE_SIGN_STYLE = Manual;
|
CODE_SIGN_STYLE = Automatic;
|
||||||
CURRENT_PROJECT_VERSION = 136;
|
CURRENT_PROJECT_VERSION = 137;
|
||||||
DEVELOPMENT_ASSET_PATHS = "";
|
DEVELOPMENT_ASSET_PATHS = "";
|
||||||
DEVELOPMENT_TEAM = "";
|
|
||||||
"DEVELOPMENT_TEAM[sdk=appletvos*]" = 78Z5H3M6RJ;
|
|
||||||
ENABLE_PREVIEWS = YES;
|
ENABLE_PREVIEWS = YES;
|
||||||
GENERATE_INFOPLIST_FILE = YES;
|
GENERATE_INFOPLIST_FILE = YES;
|
||||||
INFOPLIST_FILE = tvOS/Info.plist;
|
INFOPLIST_FILE = tvOS/Info.plist;
|
||||||
@@ -4529,7 +4529,6 @@
|
|||||||
PRODUCT_BUNDLE_IDENTIFIER = stream.yattee.app;
|
PRODUCT_BUNDLE_IDENTIFIER = stream.yattee.app;
|
||||||
PRODUCT_NAME = Yattee;
|
PRODUCT_NAME = Yattee;
|
||||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||||
"PROVISIONING_PROFILE_SPECIFIER[sdk=appletvos*]" = "match Development stream.yattee.app tvos";
|
|
||||||
SDKROOT = appletvos;
|
SDKROOT = appletvos;
|
||||||
SWIFT_EMIT_LOC_STRINGS = YES;
|
SWIFT_EMIT_LOC_STRINGS = YES;
|
||||||
SWIFT_OBJC_BRIDGING_HEADER = tvOS/BridgingHeader.h;
|
SWIFT_OBJC_BRIDGING_HEADER = tvOS/BridgingHeader.h;
|
||||||
@@ -4546,9 +4545,8 @@
|
|||||||
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 = 136;
|
CURRENT_PROJECT_VERSION = 137;
|
||||||
DEVELOPMENT_ASSET_PATHS = "";
|
DEVELOPMENT_ASSET_PATHS = "";
|
||||||
DEVELOPMENT_TEAM = "";
|
|
||||||
"DEVELOPMENT_TEAM[sdk=appletvos*]" = 78Z5H3M6RJ;
|
"DEVELOPMENT_TEAM[sdk=appletvos*]" = 78Z5H3M6RJ;
|
||||||
ENABLE_PREVIEWS = YES;
|
ENABLE_PREVIEWS = YES;
|
||||||
GENERATE_INFOPLIST_FILE = YES;
|
GENERATE_INFOPLIST_FILE = YES;
|
||||||
@@ -4588,7 +4586,7 @@
|
|||||||
buildSettings = {
|
buildSettings = {
|
||||||
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
|
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
|
||||||
CODE_SIGN_STYLE = Automatic;
|
CODE_SIGN_STYLE = Automatic;
|
||||||
CURRENT_PROJECT_VERSION = 136;
|
CURRENT_PROJECT_VERSION = 137;
|
||||||
GENERATE_INFOPLIST_FILE = YES;
|
GENERATE_INFOPLIST_FILE = YES;
|
||||||
LD_RUNPATH_SEARCH_PATHS = (
|
LD_RUNPATH_SEARCH_PATHS = (
|
||||||
"$(inherited)",
|
"$(inherited)",
|
||||||
@@ -4612,7 +4610,7 @@
|
|||||||
buildSettings = {
|
buildSettings = {
|
||||||
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
|
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
|
||||||
CODE_SIGN_STYLE = Automatic;
|
CODE_SIGN_STYLE = Automatic;
|
||||||
CURRENT_PROJECT_VERSION = 136;
|
CURRENT_PROJECT_VERSION = 137;
|
||||||
GENERATE_INFOPLIST_FILE = YES;
|
GENERATE_INFOPLIST_FILE = YES;
|
||||||
LD_RUNPATH_SEARCH_PATHS = (
|
LD_RUNPATH_SEARCH_PATHS = (
|
||||||
"$(inherited)",
|
"$(inherited)",
|
||||||
|
|||||||
@@ -96,7 +96,7 @@
|
|||||||
"location" : "https://github.com/SDWebImage/SDWebImage",
|
"location" : "https://github.com/SDWebImage/SDWebImage",
|
||||||
"state" : {
|
"state" : {
|
||||||
"branch" : "master",
|
"branch" : "master",
|
||||||
"revision" : "554e05a4415fe20add53531c21e593c403685c3d"
|
"revision" : "a812079ae91a7f2e627364c42ea7b98abfa366ed"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,17 +1,19 @@
|
|||||||
CERTIFICATES_GIT_URL="git@github.com:developer/yattee-certificates.git"
|
APP_NAME = "Yattee"
|
||||||
|
|
||||||
|
CERTIFICATES_GIT_URL = "git@github.com:developer/yattee-certificates.git"
|
||||||
GIT_AUTHORIZATION = "" # For certificates repo, https://github.com/settings/tokens/new (repo scope)
|
GIT_AUTHORIZATION = "" # For certificates repo, https://github.com/settings/tokens/new (repo scope)
|
||||||
FASTLANE_USER="developer@mail.com" # Apple ID
|
FASTLANE_USER = "developer@mail.com" # Apple ID
|
||||||
FASTLANE_PASSWORD="" # Apple ID Password
|
FASTLANE_PASSWORD = "" # Apple ID Password
|
||||||
ITC_TEAM_ID="" # https://sarunw.com/posts/fastlane-find-team-id/
|
ITC_TEAM_ID = "" # https://sarunw.com/posts/fastlane-find-team-id/
|
||||||
TEAM_ID="" # Developer ID
|
TEAM_ID = "" # Developer ID
|
||||||
DEVELOPER_NAME="" # Developer Name (Developer ID)
|
DEVELOPER_NAME = "" # Developer Name (Developer ID)
|
||||||
|
|
||||||
# Developer Key
|
# Developer Key
|
||||||
DEVELOPER_KEY_ID=""
|
DEVELOPER_KEY_ID = ""
|
||||||
DEVELOPER_KEY_ISSUER_ID=""
|
DEVELOPER_KEY_ISSUER_ID = ""
|
||||||
DEVELOPER_KEY_CONTENT=""
|
DEVELOPER_KEY_CONTENT = ""
|
||||||
|
|
||||||
FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD="" # Not needed for most users
|
FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD = "" # Not needed for most users
|
||||||
TEMP_KEYCHAIN_USER = "keychain-user"
|
TEMP_KEYCHAIN_USER = "keychain-user"
|
||||||
TEMP_KEYCHAIN_PASSWORD = "keychain-password"
|
TEMP_KEYCHAIN_PASSWORD = "keychain-password"
|
||||||
DEVELOPER_APP_IDENTIFIER = "stream.yattee.app"
|
DEVELOPER_APP_IDENTIFIER = "stream.yattee.app"
|
||||||
|
|||||||
@@ -13,6 +13,7 @@
|
|||||||
# Uncomment the line if you want fastlane to automatically update itself
|
# Uncomment the line if you want fastlane to automatically update itself
|
||||||
# update_fastlane
|
# update_fastlane
|
||||||
|
|
||||||
|
APP_NAME = ENV['APP_NAME']
|
||||||
DEVELOPER_KEY_ID = ENV['DEVELOPER_KEY_ID']
|
DEVELOPER_KEY_ID = ENV['DEVELOPER_KEY_ID']
|
||||||
DEVELOPER_KEY_ISSUER_ID = ENV['DEVELOPER_KEY_ISSUER_ID']
|
DEVELOPER_KEY_ISSUER_ID = ENV['DEVELOPER_KEY_ISSUER_ID']
|
||||||
DEVELOPER_KEY_CONTENT = ENV['DEVELOPER_KEY_CONTENT']
|
DEVELOPER_KEY_CONTENT = ENV['DEVELOPER_KEY_CONTENT']
|
||||||
@@ -23,6 +24,11 @@ DEVELOPER_APP_IDENTIFIER = ENV['DEVELOPER_APP_IDENTIFIER']
|
|||||||
GIT_AUTHORIZATION = ENV['GIT_AUTHORIZATION']
|
GIT_AUTHORIZATION = ENV['GIT_AUTHORIZATION']
|
||||||
TESTFLIGHT_EXTERNAL_GROUPS = ENV['TESTFLIGHT_EXTERNAL_GROUPS']
|
TESTFLIGHT_EXTERNAL_GROUPS = ENV['TESTFLIGHT_EXTERNAL_GROUPS']
|
||||||
|
|
||||||
|
AS_CONNECT_BUILD_VERSION_FILENAME = 'AS_CONNECT_BUILD_VERSION'
|
||||||
|
AS_CONNECT_BUILD_VERSION_PATH = "../#{AS_CONNECT_BUILD_VERSION_FILENAME}"
|
||||||
|
|
||||||
|
XCODEPROJ = "#{APP_NAME}.xcodeproj"
|
||||||
|
|
||||||
def delete_temp_keychain(name)
|
def delete_temp_keychain(name)
|
||||||
delete_keychain(
|
delete_keychain(
|
||||||
name: name
|
name: name
|
||||||
@@ -51,17 +57,38 @@ end
|
|||||||
|
|
||||||
desc "Bump build number and commit"
|
desc "Bump build number and commit"
|
||||||
lane :bump_build do
|
lane :bump_build do
|
||||||
increment_build_number
|
as_connect_build_version = File.read(AS_CONNECT_BUILD_VERSION_PATH).to_i
|
||||||
commit_version_bump(
|
build = get_build_number(xcodeproj: XCODEPROJ).to_i
|
||||||
message: "Bump build number to #{get_build_number}"
|
|
||||||
)
|
puts "AS Connect build version: #{as_connect_build_version}"
|
||||||
|
puts "Current build number: #{build}"
|
||||||
|
|
||||||
|
if build <= as_connect_build_version
|
||||||
|
new_build_number = as_connect_build_version + 1
|
||||||
|
|
||||||
|
increment_build_number
|
||||||
|
actual_build_number = get_build_number(xcodeproj: XCODEPROJ).to_i
|
||||||
|
|
||||||
|
puts "Bumped build number to #{actual_build_number}"
|
||||||
|
|
||||||
|
File.open(AS_CONNECT_BUILD_VERSION_PATH, 'w+') { |file| file.write("#{new_build_number}\n") }
|
||||||
|
|
||||||
|
commit_version_bump(
|
||||||
|
message: "Bump build number to #{get_build_number(xcodeproj: XCODEPROJ)}",
|
||||||
|
include: [AS_CONNECT_BUILD_VERSION_FILENAME],
|
||||||
|
xcodeproj: XCODEPROJ
|
||||||
|
)
|
||||||
|
else
|
||||||
|
puts "Current build number is higher than App Store Connect build version"
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
desc "Bump version number and commit"
|
desc "Bump version number and commit"
|
||||||
lane :bump_version do
|
lane :bump_version do
|
||||||
increment_version_number
|
increment_version_number
|
||||||
commit_version_bump(
|
commit_version_bump(
|
||||||
message: "Bump version number to #{get_version_number}"
|
message: "Bump version number to #{get_version_number}",
|
||||||
|
xcodeproj: XCODEPROJ
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -76,16 +103,16 @@ platform :ios do
|
|||||||
key_content: DEVELOPER_KEY_CONTENT
|
key_content: DEVELOPER_KEY_CONTENT
|
||||||
)
|
)
|
||||||
|
|
||||||
build = get_build_number(xcodeproj: "Yattee.xcodeproj")
|
build = get_build_number(xcodeproj: XCODEPROJ)
|
||||||
version = get_version_number(
|
version = get_version_number(
|
||||||
xcodeproj: "Yattee.xcodeproj",
|
xcodeproj: XCODEPROJ,
|
||||||
target: "Yattee (iOS)"
|
target: "#{APP_NAME} (iOS)"
|
||||||
)
|
)
|
||||||
|
|
||||||
match(
|
match(
|
||||||
type: 'appstore',
|
type: 'appstore',
|
||||||
platform: 'ios',
|
platform: 'ios',
|
||||||
app_identifier: ["#{DEVELOPER_APP_IDENTIFIER}", "#{DEVELOPER_APP_IDENTIFIER}.Open-in-Yattee"],
|
app_identifier: ["#{DEVELOPER_APP_IDENTIFIER}", "#{DEVELOPER_APP_IDENTIFIER}.Open-in-#{APP_NAME}"],
|
||||||
git_basic_authorization: Base64.strict_encode64(GIT_AUTHORIZATION),
|
git_basic_authorization: Base64.strict_encode64(GIT_AUTHORIZATION),
|
||||||
readonly: true,
|
readonly: true,
|
||||||
keychain_name: TEMP_KEYCHAIN_USER,
|
keychain_name: TEMP_KEYCHAIN_USER,
|
||||||
@@ -94,13 +121,13 @@ platform :ios do
|
|||||||
)
|
)
|
||||||
|
|
||||||
build_app(
|
build_app(
|
||||||
scheme: "Yattee (iOS)",
|
scheme: "#{APP_NAME} (iOS)",
|
||||||
output_directory: "fastlane/builds/#{version}-#{build}/iOS",
|
output_directory: "fastlane/builds/#{version}-#{build}/iOS",
|
||||||
output_name: "Yattee-#{version}-iOS.ipa",
|
output_name: "#{APP_NAME}-#{version}-iOS.ipa",
|
||||||
export_options: {
|
export_options: {
|
||||||
provisioningProfiles: {
|
provisioningProfiles: {
|
||||||
"#{DEVELOPER_APP_IDENTIFIER}" => "match AppStore #{DEVELOPER_APP_IDENTIFIER}",
|
"#{DEVELOPER_APP_IDENTIFIER}" => "match AppStore #{DEVELOPER_APP_IDENTIFIER}",
|
||||||
"#{DEVELOPER_APP_IDENTIFIER}.Open-in-Yattee" => "match AppStore #{DEVELOPER_APP_IDENTIFIER}.Open-in-Yattee"
|
"#{DEVELOPER_APP_IDENTIFIER}.Open-in-#{APP_NAME}" => "match AppStore #{DEVELOPER_APP_IDENTIFIER}.Open-in-#{APP_NAME}"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
@@ -128,10 +155,10 @@ platform :tvos do
|
|||||||
key_content: DEVELOPER_KEY_CONTENT
|
key_content: DEVELOPER_KEY_CONTENT
|
||||||
)
|
)
|
||||||
|
|
||||||
build = get_build_number(xcodeproj: "Yattee.xcodeproj")
|
build = get_build_number(xcodeproj: XCODEPROJ)
|
||||||
version = get_version_number(
|
version = get_version_number(
|
||||||
xcodeproj: "Yattee.xcodeproj",
|
xcodeproj: XCODEPROJ,
|
||||||
target: "Yattee (tvOS)"
|
target: "#{APP_NAME} (tvOS)"
|
||||||
)
|
)
|
||||||
|
|
||||||
match(
|
match(
|
||||||
@@ -146,9 +173,9 @@ platform :tvos do
|
|||||||
)
|
)
|
||||||
|
|
||||||
build_app(
|
build_app(
|
||||||
scheme: "Yattee (tvOS)",
|
scheme: "#{APP_NAME} (tvOS)",
|
||||||
output_directory: "fastlane/builds/#{version}-#{build}/tvOS",
|
output_directory: "fastlane/builds/#{version}-#{build}/tvOS",
|
||||||
output_name: "Yattee-#{version}-tvOS.ipa",
|
output_name: "#{APP_NAME}-#{version}-tvOS.ipa",
|
||||||
export_method: "app-store",
|
export_method: "app-store",
|
||||||
export_options: {
|
export_options: {
|
||||||
provisioningProfiles: {
|
provisioningProfiles: {
|
||||||
@@ -180,10 +207,10 @@ platform :mac do
|
|||||||
key_content: DEVELOPER_KEY_CONTENT
|
key_content: DEVELOPER_KEY_CONTENT
|
||||||
)
|
)
|
||||||
|
|
||||||
build = get_build_number(xcodeproj: "Yattee.xcodeproj")
|
build = get_build_number(xcodeproj: XCODEPROJ)
|
||||||
version = get_version_number(
|
version = get_version_number(
|
||||||
xcodeproj: "Yattee.xcodeproj",
|
xcodeproj: XCODEPROJ,
|
||||||
target: "Yattee (macOS)"
|
target: "#{APP_NAME} (macOS)"
|
||||||
)
|
)
|
||||||
|
|
||||||
match(
|
match(
|
||||||
@@ -199,9 +226,9 @@ platform :mac do
|
|||||||
)
|
)
|
||||||
|
|
||||||
build_app(
|
build_app(
|
||||||
scheme: "Yattee (macOS)",
|
scheme: "#{APP_NAME} (macOS)",
|
||||||
output_directory: "fastlane/builds/#{version}-#{build}/macOS",
|
output_directory: "fastlane/builds/#{version}-#{build}/macOS",
|
||||||
output_name: "Yattee-#{version}-macOS.app",
|
output_name: "#{APP_NAME}-#{version}-macOS.app",
|
||||||
export_method: "app-store",
|
export_method: "app-store",
|
||||||
export_options: {
|
export_options: {
|
||||||
provisioningProfiles: {
|
provisioningProfiles: {
|
||||||
@@ -231,10 +258,10 @@ platform :mac do
|
|||||||
key_content: DEVELOPER_KEY_CONTENT
|
key_content: DEVELOPER_KEY_CONTENT
|
||||||
)
|
)
|
||||||
|
|
||||||
build = get_build_number(xcodeproj: "Yattee.xcodeproj")
|
build = get_build_number(xcodeproj: XCODEPROJ)
|
||||||
version = get_version_number(
|
version = get_version_number(
|
||||||
xcodeproj: "Yattee.xcodeproj",
|
xcodeproj: XCODEPROJ,
|
||||||
target: "Yattee (macOS)"
|
target: "#{APP_NAME} (macOS)"
|
||||||
)
|
)
|
||||||
|
|
||||||
match(
|
match(
|
||||||
@@ -249,9 +276,9 @@ platform :mac do
|
|||||||
)
|
)
|
||||||
|
|
||||||
build_mac_app(
|
build_mac_app(
|
||||||
scheme: "Yattee (macOS)",
|
scheme: "#{APP_NAME} (macOS)",
|
||||||
output_directory: "fastlane/builds/#{version}-#{build}/macOS",
|
output_directory: "fastlane/builds/#{version}-#{build}/macOS",
|
||||||
output_name: "Yattee",
|
output_name: "#{APP_NAME}",
|
||||||
export_method: "developer-id",
|
export_method: "developer-id",
|
||||||
export_options: {
|
export_options: {
|
||||||
provisioningProfiles: {
|
provisioningProfiles: {
|
||||||
@@ -261,7 +288,7 @@ platform :mac do
|
|||||||
)
|
)
|
||||||
|
|
||||||
notarize(
|
notarize(
|
||||||
package: "fastlane/builds/#{version}-#{build}/macOS/Yattee.app",
|
package: "fastlane/builds/#{version}-#{build}/macOS/#{APP_NAME}.app",
|
||||||
bundle_id: "#{DEVELOPER_APP_IDENTIFIER}",
|
bundle_id: "#{DEVELOPER_APP_IDENTIFIER}",
|
||||||
api_key: api_key,
|
api_key: api_key,
|
||||||
)
|
)
|
||||||
|
|||||||
Reference in New Issue
Block a user