1
0
mirror of https://github.com/yattee/yattee.git synced 2024-12-13 13:50:32 +05:30

Basic Safari extension

This commit is contained in:
Arkadiusz Fal 2021-10-24 14:31:10 +02:00
parent 60c7027429
commit ca8298a9e9
32 changed files with 740 additions and 168 deletions

93
.gitignore vendored
View File

@ -1,2 +1,93 @@
# Xcode
#
# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore
## User settings
xcuserdata/
## compatibility with Xcode 8 and earlier (ignoring not required starting Xcode 9)
*.xcscmblueprint
*.xccheckout
## compatibility with Xcode 3 and earlier (ignoring not required starting Xcode 4)
build/
DerivedData/
*.moved-aside
*.pbxuser
!default.pbxuser
*.mode1v3
!default.mode1v3
*.mode2v3
!default.mode2v3
*.perspectivev3
!default.perspectivev3
## Obj-C/Swift specific
*.hmap
## App packaging
*.ipa
*.dSYM.zip
*.dSYM
## Playgrounds
timeline.xctimeline
playground.xcworkspace
# Swift Package Manager
#
# Add this line if you want to avoid checking in source code from Swift Package Manager dependencies.
# Packages/
# Package.pins
# Package.resolved
# *.xcodeproj
#
# Xcode automatically generates this directory with a .xcworkspacedata file and xcuserdata
# hence it is not needed unless you have added a package configuration file to your project
# .swiftpm
.build/
# CocoaPods
#
# We recommend against adding the Pods directory to your .gitignore. However
# you should judge for yourself, the pros and cons are mentioned at:
# https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control
#
# Pods/
#
# Add this line if you want to avoid checking in source code from the Xcode workspace
# *.xcworkspace
# Carthage
#
# Add this line if you want to avoid checking in source code from Carthage dependencies.
# Carthage/Checkouts
Carthage/Build/
# Accio dependency management
Dependencies/
.accio/
# fastlane
#
# It is recommended to not store the screenshots in the git repo.
# Instead, use fastlane to re-generate the screenshots whenever they are needed.
# For more information about the recommended setup visit:
# https://docs.fastlane.tools/best-practices/source-control/#source-control
fastlane/report.xml
fastlane/Preview.html
fastlane/screenshots/**/*.png
fastlane/test_output
# Code Injection
#
# After new code Injection tools there's a generated folder /iOSInjectionProject
# https://github.com/johnno1962/injectionforxcode
iOSInjectionProject/
# SwiftLint Remote Config Cache
.swiftlint/RemoteConfigCache
.swiftlint/RemoteConfigCache

View File

@ -36,7 +36,7 @@ extension PlayerModel {
}
return UIAction(
title: "Restore \(segment.category)",
title: "Restore \(segment.title())",
image: UIImage(systemName: "arrow.uturn.left.circle")
) { _ in
self.restoreLastSkippedSegment()

View File

@ -13,10 +13,6 @@ class Segment: ObservableObject, Hashable {
segment.first!
}
var startTime: CMTime {
CMTime(seconds: start, preferredTimescale: 1000)
}
var end: Double {
segment.last!
}
@ -25,10 +21,6 @@ class Segment: ObservableObject, Hashable {
CMTime(seconds: end, preferredTimescale: 1000)
}
var duration: Double {
end - start
}
init(category: String, segment: [Double], uuid: String, videoDuration: Int) {
self.category = category
self.segment = segment

13
Open in Yattee/Info.plist Normal file
View File

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>NSExtension</key>
<dict>
<key>NSExtensionPointIdentifier</key>
<string>com.apple.Safari.web-extension</string>
<key>NSExtensionPrincipalClass</key>
<string>$(PRODUCT_MODULE_NAME).SafariWebExtensionHandler</string>
</dict>
</dict>
</plist>

View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.security.app-sandbox</key>
<true/>
<key>com.apple.security.files.user-selected.read-only</key>
<true/>
</dict>
</plist>

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 128 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 454 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 569 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 919 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@ -0,0 +1,36 @@
{
"manifest_version": 2,
"default_locale": "en",
"name": "Open in Yattee",
"description": "Open YouTube videos in Yattee app",
"version": "1.0",
"icons": {
"48": "images/icon-48.png",
"96": "images/icon-96.png",
"128": "images/icon-128.png",
"256": "images/icon-256.png",
"512": "images/icon-512.png"
},
"content_scripts": [{
"js": [ "content.js" ],
"matches": [
"*://*.youtube-nocookie.com/*",
"*://*.youtube.com/*",
"*://*.youtu.be/*"
]
}],
"browser_action": {
"default_popup": "popup.html",
"default_icon": {
"16": "images/toolbar-icon-16.png",
"19": "images/toolbar-icon-19.png",
"32": "images/toolbar-icon-32.png",
"38": "images/toolbar-icon-38.png"
}
},
"permissions": [ ]
}

View File

@ -0,0 +1,15 @@
:root {
color-scheme: light dark;
}
body {
width: 100px;
padding: 10px;
font-family: system-ui;
text-align: center;
}
@media (prefers-color-scheme: dark) {
/* Dark Mode styles go here. */
}

View File

@ -0,0 +1,11 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="popup.css">
<script type="module" src="popup.js"></script>
</head>
<body>
<strong>Hello World!</strong>
</body>
</html>

View File

@ -0,0 +1 @@
console.log("Hello World!", browser);

View File

@ -0,0 +1,15 @@
import os.log
import SafariServices
final class SafariWebExtensionHandler: NSObject, NSExtensionRequestHandling {
func beginRequest(with context: NSExtensionContext) {
let item = context.inputItems[0] as! NSExtensionItem
let message = item.userInfo?[SFExtensionMessageKey]
os_log(.default, "Received message from browser.runtime.sendNativeMessage: %@", message as! CVarArg)
let response = NSExtensionItem()
response.userInfo = [SFExtensionMessageKey: ["Response to": message]]
context.completeRequest(returningItems: [response], completionHandler: nil)
}
}

26
Open in Yattee/content.js Normal file
View File

@ -0,0 +1,26 @@
if (document.readyState !== 'complete') {
window.addEventListener('load', redirectAndReplaceContentWithLink);
} else {
redirectAndReplaceContentWithLink();
}
function yatteeUrl() {
return window.location.href.replace(/^https?:\/\//, 'yattee://');
}
function yatteeLink() {
return '<a href="'+ yatteeUrl() +'" onclick=\'window.location.href="'+ yatteeUrl() +'"\'>Open in Yattee</a>';
}
function redirect() {
window.location.href = yatteeUrl()
}
function replaceContentWithLink() {
document.querySelector('body').innerHTML = yatteeLink();
}
function redirectAndReplaceContentWithLink(){
redirect()
replaceContentWithLink()
}

View File

@ -7,6 +7,17 @@
objects = {
/* Begin PBXAggregateTarget section */
37A3B19C27258492000FB5EE /* Periphery (iOS) */ = {
isa = PBXAggregateTarget;
buildConfigurationList = 37A3B19D27258492000FB5EE /* Build configuration list for PBXAggregateTarget "Periphery (iOS)" */;
buildPhases = (
37A3B1A0272584A6000FB5EE /* ShellScript */,
);
dependencies = (
);
name = "Periphery (iOS)";
productName = "Periphery (iOS)";
};
37FD43E62704A2240073EE42 /* Periphery (macOS) */ = {
isa = PBXAggregateTarget;
buildConfigurationList = 37FD43E72704A2240073EE42 /* Build configuration list for PBXAggregateTarget "Periphery (macOS)" */;
@ -201,6 +212,22 @@
379775932689365600DD52A8 /* Array+Next.swift in Sources */ = {isa = PBXBuildFile; fileRef = 379775922689365600DD52A8 /* Array+Next.swift */; };
379775942689365600DD52A8 /* Array+Next.swift in Sources */ = {isa = PBXBuildFile; fileRef = 379775922689365600DD52A8 /* Array+Next.swift */; };
379775952689365600DD52A8 /* Array+Next.swift in Sources */ = {isa = PBXBuildFile; fileRef = 379775922689365600DD52A8 /* Array+Next.swift */; };
37A3B15A27255E7F000FB5EE /* SafariWebExtensionHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37A3B15927255E7F000FB5EE /* SafariWebExtensionHandler.swift */; };
37A3B15F27255E7F000FB5EE /* images in Resources */ = {isa = PBXBuildFile; fileRef = 37A3B15E27255E7F000FB5EE /* images */; };
37A3B16127255E7F000FB5EE /* manifest.json in Resources */ = {isa = PBXBuildFile; fileRef = 37A3B16027255E7F000FB5EE /* manifest.json */; };
37A3B16527255E7F000FB5EE /* content.js in Resources */ = {isa = PBXBuildFile; fileRef = 37A3B16427255E7F000FB5EE /* content.js */; };
37A3B16727255E7F000FB5EE /* popup.html in Resources */ = {isa = PBXBuildFile; fileRef = 37A3B16627255E7F000FB5EE /* popup.html */; };
37A3B16927255E7F000FB5EE /* popup.css in Resources */ = {isa = PBXBuildFile; fileRef = 37A3B16827255E7F000FB5EE /* popup.css */; };
37A3B16B27255E7F000FB5EE /* popup.js in Resources */ = {isa = PBXBuildFile; fileRef = 37A3B16A27255E7F000FB5EE /* popup.js */; };
37A3B17027255E7F000FB5EE /* Open in Yattee (macOS).appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = 37A3B15727255E7F000FB5EE /* Open in Yattee (macOS).appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
37A3B18F2725735F000FB5EE /* Open in Yattee (iOS).appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = 37A3B1792725735F000FB5EE /* Open in Yattee (iOS).appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
37A3B194272574FB000FB5EE /* SafariWebExtensionHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37A3B15927255E7F000FB5EE /* SafariWebExtensionHandler.swift */; };
37A3B19627257503000FB5EE /* content.js in Resources */ = {isa = PBXBuildFile; fileRef = 37A3B16427255E7F000FB5EE /* content.js */; };
37A3B1972725750B000FB5EE /* popup.js in Resources */ = {isa = PBXBuildFile; fileRef = 37A3B16A27255E7F000FB5EE /* popup.js */; };
37A3B1982725750B000FB5EE /* manifest.json in Resources */ = {isa = PBXBuildFile; fileRef = 37A3B16027255E7F000FB5EE /* manifest.json */; };
37A3B1992725750B000FB5EE /* popup.html in Resources */ = {isa = PBXBuildFile; fileRef = 37A3B16627255E7F000FB5EE /* popup.html */; };
37A3B19A2725750B000FB5EE /* popup.css in Resources */ = {isa = PBXBuildFile; fileRef = 37A3B16827255E7F000FB5EE /* popup.css */; };
37A3B19B2725750F000FB5EE /* images in Resources */ = {isa = PBXBuildFile; fileRef = 37A3B15E27255E7F000FB5EE /* images */; };
37A9965A26D6F8CA006E3224 /* HorizontalCells.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37A9965926D6F8CA006E3224 /* HorizontalCells.swift */; };
37A9965B26D6F8CA006E3224 /* HorizontalCells.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37A9965926D6F8CA006E3224 /* HorizontalCells.swift */; };
37A9965C26D6F8CA006E3224 /* HorizontalCells.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37A9965926D6F8CA006E3224 /* HorizontalCells.swift */; };
@ -387,6 +414,20 @@
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
37A3B16E27255E7F000FB5EE /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 37D4B0BD2671614700C925CA /* Project object */;
proxyType = 1;
remoteGlobalIDString = 37A3B15627255E7F000FB5EE;
remoteInfo = "Open in Yattee";
};
37A3B18D2725735F000FB5EE /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 37D4B0BD2671614700C925CA /* Project object */;
proxyType = 1;
remoteGlobalIDString = 37A3B1782725735F000FB5EE;
remoteInfo = "Open in Yattee";
};
37D4B0D52671614900C925CA /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 37D4B0BD2671614700C925CA /* Project object */;
@ -410,6 +451,31 @@
};
/* End PBXContainerItemProxy section */
/* Begin PBXCopyFilesBuildPhase section */
37A3B17127255E7F000FB5EE /* Embed App Extensions */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
dstPath = "";
dstSubfolderSpec = 13;
files = (
37A3B17027255E7F000FB5EE /* Open in Yattee (macOS).appex in Embed App Extensions */,
);
name = "Embed App Extensions";
runOnlyForDeploymentPostprocessing = 0;
};
37A3B1932725735F000FB5EE /* Embed App Extensions */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
dstPath = "";
dstSubfolderSpec = 13;
files = (
37A3B18F2725735F000FB5EE /* Open in Yattee (iOS).appex in Embed App Extensions */,
);
name = "Embed App Extensions";
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXCopyFilesBuildPhase section */
/* Begin PBXFileReference section */
3700155A271B0D4D0049C794 /* PipedAPI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PipedAPI.swift; sourceTree = "<group>"; };
3700155E271B12DD0049C794 /* SiestaConfiguration.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SiestaConfiguration.swift; sourceTree = "<group>"; };
@ -469,6 +535,17 @@
3797758A2689345500DD52A8 /* Store.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Store.swift; sourceTree = "<group>"; };
379775922689365600DD52A8 /* Array+Next.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Array+Next.swift"; sourceTree = "<group>"; };
37992DC726CC50BC003D4C27 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
37A3B15727255E7F000FB5EE /* Open in Yattee (macOS).appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = "Open in Yattee (macOS).appex"; sourceTree = BUILT_PRODUCTS_DIR; };
37A3B15927255E7F000FB5EE /* SafariWebExtensionHandler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SafariWebExtensionHandler.swift; sourceTree = "<group>"; };
37A3B15E27255E7F000FB5EE /* images */ = {isa = PBXFileReference; lastKnownFileType = folder; path = images; sourceTree = "<group>"; };
37A3B16027255E7F000FB5EE /* manifest.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = manifest.json; sourceTree = "<group>"; };
37A3B16427255E7F000FB5EE /* content.js */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.javascript; path = content.js; sourceTree = "<group>"; };
37A3B16627255E7F000FB5EE /* popup.html */ = {isa = PBXFileReference; lastKnownFileType = text.html; path = popup.html; sourceTree = "<group>"; };
37A3B16827255E7F000FB5EE /* popup.css */ = {isa = PBXFileReference; lastKnownFileType = text.css; path = popup.css; sourceTree = "<group>"; };
37A3B16A27255E7F000FB5EE /* popup.js */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.javascript; path = popup.js; sourceTree = "<group>"; };
37A3B16C27255E7F000FB5EE /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
37A3B16D27255E7F000FB5EE /* Open in Yattee.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "Open in Yattee.entitlements"; sourceTree = "<group>"; };
37A3B1792725735F000FB5EE /* Open in Yattee (iOS).appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = "Open in Yattee (iOS).appex"; sourceTree = BUILT_PRODUCTS_DIR; };
37A9965926D6F8CA006E3224 /* HorizontalCells.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HorizontalCells.swift; sourceTree = "<group>"; };
37A9965D26D6F9B9006E3224 /* WatchNowView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WatchNowView.swift; sourceTree = "<group>"; };
37AAF27D26737323007FC770 /* PopularView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PopularView.swift; sourceTree = "<group>"; };
@ -547,6 +624,20 @@
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
37A3B15427255E7F000FB5EE /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
37A3B1762725735F000FB5EE /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
37D4B0C62671614900C925CA /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
@ -811,6 +902,30 @@
path = iOS;
sourceTree = "<group>";
};
37A3B15827255E7F000FB5EE /* Open in Yattee */ = {
isa = PBXGroup;
children = (
37A3B15B27255E7F000FB5EE /* Resources */,
37A3B16427255E7F000FB5EE /* content.js */,
37A3B16C27255E7F000FB5EE /* Info.plist */,
37A3B16D27255E7F000FB5EE /* Open in Yattee.entitlements */,
37A3B15927255E7F000FB5EE /* SafariWebExtensionHandler.swift */,
);
path = "Open in Yattee";
sourceTree = "<group>";
};
37A3B15B27255E7F000FB5EE /* Resources */ = {
isa = PBXGroup;
children = (
37A3B15E27255E7F000FB5EE /* images */,
37A3B16027255E7F000FB5EE /* manifest.json */,
37A3B16627255E7F000FB5EE /* popup.html */,
37A3B16827255E7F000FB5EE /* popup.css */,
37A3B16A27255E7F000FB5EE /* popup.js */,
);
path = Resources;
sourceTree = "<group>";
};
37BA796C26DC4105002A0235 /* Extensions */ = {
isa = PBXGroup;
children = (
@ -854,6 +969,7 @@
37D4B1B72672CFE300C925CA /* Model */,
37C7A9022679058300E721B4 /* Extensions */,
3748186426A762300084E870 /* Fixtures */,
37A3B15827255E7F000FB5EE /* Open in Yattee */,
377FC7D1267A080300A6BBAF /* Frameworks */,
37D4B0CA2671614900C925CA /* Products */,
37D4B174267164B000C925CA /* Tests Apple TV */,
@ -896,6 +1012,8 @@
37D4B0DE2671614900C925CA /* Tests (macOS).xctest */,
37D4B158267164AE00C925CA /* Pearvidious (tvOS).app */,
37D4B171267164B000C925CA /* Tests (tvOS).xctest */,
37A3B15727255E7F000FB5EE /* Open in Yattee (macOS).appex */,
37A3B1792725735F000FB5EE /* Open in Yattee (iOS).appex */,
);
name = Products;
sourceTree = "<group>";
@ -994,6 +1112,40 @@
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
37A3B15627255E7F000FB5EE /* Open in Yattee (macOS) */ = {
isa = PBXNativeTarget;
buildConfigurationList = 37A3B17427255E7F000FB5EE /* Build configuration list for PBXNativeTarget "Open in Yattee (macOS)" */;
buildPhases = (
37A3B15327255E7F000FB5EE /* Sources */,
37A3B15427255E7F000FB5EE /* Frameworks */,
37A3B15527255E7F000FB5EE /* Resources */,
);
buildRules = (
);
dependencies = (
);
name = "Open in Yattee (macOS)";
productName = "Open in Yattee";
productReference = 37A3B15727255E7F000FB5EE /* Open in Yattee (macOS).appex */;
productType = "com.apple.product-type.app-extension";
};
37A3B1782725735F000FB5EE /* Open in Yattee (iOS) */ = {
isa = PBXNativeTarget;
buildConfigurationList = 37A3B1902725735F000FB5EE /* Build configuration list for PBXNativeTarget "Open in Yattee (iOS)" */;
buildPhases = (
37A3B1752725735F000FB5EE /* Sources */,
37A3B1762725735F000FB5EE /* Frameworks */,
37A3B1772725735F000FB5EE /* Resources */,
);
buildRules = (
);
dependencies = (
);
name = "Open in Yattee (iOS)";
productName = "Open in Yattee";
productReference = 37A3B1792725735F000FB5EE /* Open in Yattee (iOS).appex */;
productType = "com.apple.product-type.app-extension";
};
37D4B0C82671614900C925CA /* Pearvidious (iOS) */ = {
isa = PBXNativeTarget;
buildConfigurationList = 37D4B0EC2671614900C925CA /* Build configuration list for PBXNativeTarget "Pearvidious (iOS)" */;
@ -1002,10 +1154,12 @@
37D4B0C62671614900C925CA /* Frameworks */,
37D4B0C72671614900C925CA /* Resources */,
37CC3F48270CE89B00608308 /* ShellScript */,
37A3B1932725735F000FB5EE /* Embed App Extensions */,
);
buildRules = (
);
dependencies = (
37A3B18E2725735F000FB5EE /* PBXTargetDependency */,
);
name = "Pearvidious (iOS)";
packageProductDependencies = (
@ -1032,10 +1186,12 @@
37D4B0CC2671614900C925CA /* Frameworks */,
37D4B0CD2671614900C925CA /* Resources */,
37CC3F4A270CE8D000608308 /* ShellScript */,
37A3B17127255E7F000FB5EE /* Embed App Extensions */,
);
buildRules = (
);
dependencies = (
37A3B16F27255E7F000FB5EE /* PBXTargetDependency */,
);
name = "Pearvidious (macOS)";
packageProductDependencies = (
@ -1143,9 +1299,18 @@
isa = PBXProject;
attributes = {
BuildIndependentTargetsInParallel = 1;
LastSwiftUpdateCheck = 1300;
LastSwiftUpdateCheck = 1310;
LastUpgradeCheck = 1310;
TargetAttributes = {
37A3B15627255E7F000FB5EE = {
CreatedOnToolsVersion = 13.1;
};
37A3B1782725735F000FB5EE = {
CreatedOnToolsVersion = 13.1;
};
37A3B19C27258492000FB5EE = {
CreatedOnToolsVersion = 13.1;
};
37D4B0C82671614900C925CA = {
CreatedOnToolsVersion = 13.0;
};
@ -1203,16 +1368,45 @@
37D4B0C82671614900C925CA /* Pearvidious (iOS) */,
37D4B0CE2671614900C925CA /* Pearvidious (macOS) */,
37D4B157267164AE00C925CA /* Pearvidious (tvOS) */,
37A3B1782725735F000FB5EE /* Open in Yattee (iOS) */,
37A3B15627255E7F000FB5EE /* Open in Yattee (macOS) */,
37A3B19C27258492000FB5EE /* Periphery (iOS) */,
37FD43E62704A2240073EE42 /* Periphery (macOS) */,
37FD43EB2704A7710073EE42 /* Periphery (tvOS) */,
37D4B0D32671614900C925CA /* Tests (iOS) */,
37D4B0DD2671614900C925CA /* Tests (macOS) */,
37D4B170267164B000C925CA /* Tests (tvOS) */,
37FD43E62704A2240073EE42 /* Periphery (macOS) */,
37FD43EB2704A7710073EE42 /* Periphery (tvOS) */,
);
};
/* End PBXProject section */
/* Begin PBXResourcesBuildPhase section */
37A3B15527255E7F000FB5EE /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
37A3B16927255E7F000FB5EE /* popup.css in Resources */,
37A3B16727255E7F000FB5EE /* popup.html in Resources */,
37A3B15F27255E7F000FB5EE /* images in Resources */,
37A3B16127255E7F000FB5EE /* manifest.json in Resources */,
37A3B16527255E7F000FB5EE /* content.js in Resources */,
37A3B16B27255E7F000FB5EE /* popup.js in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
37A3B1772725735F000FB5EE /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
37A3B1982725750B000FB5EE /* manifest.json in Resources */,
37A3B1992725750B000FB5EE /* popup.html in Resources */,
37A3B19A2725750B000FB5EE /* popup.css in Resources */,
37A3B19627257503000FB5EE /* content.js in Resources */,
37A3B1972725750B000FB5EE /* popup.js in Resources */,
37A3B19B2725750F000FB5EE /* images in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
37D4B0C72671614900C925CA /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
@ -1262,6 +1456,23 @@
/* End PBXResourcesBuildPhase section */
/* Begin PBXShellScriptBuildPhase section */
37A3B1A0272584A6000FB5EE /* ShellScript */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
);
inputPaths = (
);
outputFileListPaths = (
);
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "periphery scan \\\n --project \"Pearvidious.xcodeproj\" \\\n --schemes \"Pearvidious (iOS)\" \\\n --targets \"Pearvidious (iOS)\" \\\n --retain-objc-accessible \\\n --retain-public \\\n -- -destination \"platform=iOS\\ Simulator,name=iPhone\\ 8,OS=15.0\"\n";
};
37CC3F48270CE89B00608308 /* ShellScript */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
@ -1350,6 +1561,22 @@
/* End PBXShellScriptBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
37A3B15327255E7F000FB5EE /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
37A3B15A27255E7F000FB5EE /* SafariWebExtensionHandler.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
37A3B1752725735F000FB5EE /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
37A3B194272574FB000FB5EE /* SafariWebExtensionHandler.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
37D4B0C52671614900C925CA /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
@ -1715,6 +1942,16 @@
/* End PBXSourcesBuildPhase section */
/* Begin PBXTargetDependency section */
37A3B16F27255E7F000FB5EE /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = 37A3B15627255E7F000FB5EE /* Open in Yattee (macOS) */;
targetProxy = 37A3B16E27255E7F000FB5EE /* PBXContainerItemProxy */;
};
37A3B18E2725735F000FB5EE /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = 37A3B1782725735F000FB5EE /* Open in Yattee (iOS) */;
targetProxy = 37A3B18D2725735F000FB5EE /* PBXContainerItemProxy */;
};
37D4B0D62671614900C925CA /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = 37D4B0C82671614900C925CA /* Pearvidious (iOS) */;
@ -1733,6 +1970,157 @@
/* End PBXTargetDependency section */
/* Begin XCBuildConfiguration section */
37A3B17227255E7F000FB5EE /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
CLANG_CXX_LANGUAGE_STANDARD = "gnu++17";
CODE_SIGN_ENTITLEMENTS = "Open in Yattee/Open in Yattee.entitlements";
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_TEAM = 78Z5H3M6RJ;
ENABLE_HARDENED_RUNTIME = YES;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = "Open in Yattee/Info.plist";
INFOPLIST_KEY_CFBundleDisplayName = "Open in Yattee";
INFOPLIST_KEY_NSHumanReadableCopyright = "";
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/../Frameworks",
"@executable_path/../../../../Frameworks",
);
MACOSX_DEPLOYMENT_TARGET = 12.0;
MARKETING_VERSION = 1.0;
OTHER_LDFLAGS = (
"-framework",
SafariServices,
);
PRODUCT_BUNDLE_IDENTIFIER = "net.arekf.Pearvidious.Open-in-Yattee";
PRODUCT_NAME = "$(TARGET_NAME)";
SDKROOT = macosx;
SKIP_INSTALL = YES;
SWIFT_EMIT_LOC_STRINGS = YES;
SWIFT_VERSION = 5.0;
};
name = Debug;
};
37A3B17327255E7F000FB5EE /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
CLANG_CXX_LANGUAGE_STANDARD = "gnu++17";
CODE_SIGN_ENTITLEMENTS = "Open in Yattee/Open in Yattee.entitlements";
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_TEAM = 78Z5H3M6RJ;
ENABLE_HARDENED_RUNTIME = YES;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = "Open in Yattee/Info.plist";
INFOPLIST_KEY_CFBundleDisplayName = "Open in Yattee";
INFOPLIST_KEY_NSHumanReadableCopyright = "";
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/../Frameworks",
"@executable_path/../../../../Frameworks",
);
MACOSX_DEPLOYMENT_TARGET = 12.0;
MARKETING_VERSION = 1.0;
OTHER_LDFLAGS = (
"-framework",
SafariServices,
);
PRODUCT_BUNDLE_IDENTIFIER = "net.arekf.Pearvidious.Open-in-Yattee";
PRODUCT_NAME = "$(TARGET_NAME)";
SDKROOT = macosx;
SKIP_INSTALL = YES;
SWIFT_EMIT_LOC_STRINGS = YES;
SWIFT_VERSION = 5.0;
};
name = Release;
};
37A3B1912725735F000FB5EE /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
CLANG_CXX_LANGUAGE_STANDARD = "gnu++17";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_TEAM = 78Z5H3M6RJ;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = "Open in Yattee/Info.plist";
INFOPLIST_KEY_CFBundleDisplayName = "Open in Yattee";
INFOPLIST_KEY_NSHumanReadableCopyright = "";
IPHONEOS_DEPLOYMENT_TARGET = 15.0;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
"@executable_path/../../Frameworks",
);
MARKETING_VERSION = 1.0;
OTHER_LDFLAGS = (
"-framework",
SafariServices,
);
PRODUCT_BUNDLE_IDENTIFIER = "net.arekf.Pearvidious.Open-in-Yattee";
PRODUCT_NAME = "$(TARGET_NAME)";
SDKROOT = iphoneos;
SKIP_INSTALL = YES;
SWIFT_EMIT_LOC_STRINGS = YES;
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Debug;
};
37A3B1922725735F000FB5EE /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
CLANG_CXX_LANGUAGE_STANDARD = "gnu++17";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_TEAM = 78Z5H3M6RJ;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = "Open in Yattee/Info.plist";
INFOPLIST_KEY_CFBundleDisplayName = "Open in Yattee";
INFOPLIST_KEY_NSHumanReadableCopyright = "";
IPHONEOS_DEPLOYMENT_TARGET = 15.0;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
"@executable_path/../../Frameworks",
);
MARKETING_VERSION = 1.0;
OTHER_LDFLAGS = (
"-framework",
SafariServices,
);
PRODUCT_BUNDLE_IDENTIFIER = "net.arekf.Pearvidious.Open-in-Yattee";
PRODUCT_NAME = "$(TARGET_NAME)";
SDKROOT = iphoneos;
SKIP_INSTALL = YES;
SWIFT_EMIT_LOC_STRINGS = YES;
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
VALIDATE_PRODUCT = YES;
};
name = Release;
};
37A3B19E27258492000FB5EE /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
CODE_SIGN_STYLE = Automatic;
DEVELOPMENT_TEAM = 78Z5H3M6RJ;
PRODUCT_NAME = "$(TARGET_NAME)";
};
name = Debug;
};
37A3B19F27258492000FB5EE /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
CODE_SIGN_STYLE = Automatic;
DEVELOPMENT_TEAM = 78Z5H3M6RJ;
PRODUCT_NAME = "$(TARGET_NAME)";
};
name = Release;
};
37D4B0EA2671614900C925CA /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
@ -1847,6 +2235,7 @@
37D4B0ED2671614900C925CA /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
CODE_SIGN_STYLE = Automatic;
@ -1878,6 +2267,7 @@
37D4B0EE2671614900C925CA /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
CODE_SIGN_STYLE = Automatic;
@ -1910,10 +2300,11 @@
37D4B0F02671614900C925CA /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
CODE_SIGN_ENTITLEMENTS = Shared/Pearvidious.entitlements;
CODE_SIGN_IDENTITY = "-";
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
COMBINE_HIDPI_IMAGES = YES;
CURRENT_PROJECT_VERSION = 1;
@ -1943,10 +2334,11 @@
37D4B0F12671614900C925CA /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
CODE_SIGN_ENTITLEMENTS = Shared/Pearvidious.entitlements;
CODE_SIGN_IDENTITY = "-";
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
COMBINE_HIDPI_IMAGES = YES;
CURRENT_PROJECT_VERSION = 1;
@ -2231,6 +2623,33 @@
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
37A3B17427255E7F000FB5EE /* Build configuration list for PBXNativeTarget "Open in Yattee (macOS)" */ = {
isa = XCConfigurationList;
buildConfigurations = (
37A3B17227255E7F000FB5EE /* Debug */,
37A3B17327255E7F000FB5EE /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
37A3B1902725735F000FB5EE /* Build configuration list for PBXNativeTarget "Open in Yattee (iOS)" */ = {
isa = XCConfigurationList;
buildConfigurations = (
37A3B1912725735F000FB5EE /* Debug */,
37A3B1922725735F000FB5EE /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
37A3B19D27258492000FB5EE /* Build configuration list for PBXAggregateTarget "Periphery (iOS)" */ = {
isa = XCConfigurationList;
buildConfigurations = (
37A3B19E27258492000FB5EE /* Debug */,
37A3B19F27258492000FB5EE /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
37D4B0C02671614700C925CA /* Build configuration list for PBXProject "Pearvidious" */ = {
isa = XCConfigurationList;
buildConfigurations = (

View File

@ -0,0 +1,67 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1310"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "37A3B19C27258492000FB5EE"
BuildableName = "Periphery (iOS)"
BlueprintName = "Periphery (iOS)"
ReferencedContainer = "container:Pearvidious.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES">
<Testables>
</Testables>
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES">
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES">
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "37A3B19C27258492000FB5EE"
BuildableName = "Periphery (iOS)"
BlueprintName = "Periphery (iOS)"
ReferencedContainer = "container:Pearvidious.xcodeproj">
</BuildableReference>
</MacroExpansion>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>

View File

@ -1,6 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<Bucket
uuid = "E30DA302-B258-4C14-8808-5E4CE238A4FF"
type = "1"
version = "2.0">
</Bucket>

View File

@ -1,109 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>SchemeUserState</key>
<dict>
<key>Pearvidious (iOS).xcscheme_^#shared#^_</key>
<dict>
<key>orderHint</key>
<integer>1</integer>
</dict>
<key>Pearvidious (macOS).xcscheme_^#shared#^_</key>
<dict>
<key>orderHint</key>
<integer>0</integer>
</dict>
<key>Pearvidious (tvOS).xcscheme_^#shared#^_</key>
<dict>
<key>orderHint</key>
<integer>2</integer>
</dict>
<key>Periphery (iOS).xcscheme_^#shared#^_</key>
<dict>
<key>orderHint</key>
<integer>7</integer>
</dict>
<key>Periphery (macOS).xcscheme_^#shared#^_</key>
<dict>
<key>orderHint</key>
<integer>3</integer>
</dict>
<key>Periphery (tvOS).xcscheme_^#shared#^_</key>
<dict>
<key>orderHint</key>
<integer>4</integer>
</dict>
<key>Playground (Playground) 1.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>6</integer>
</dict>
<key>Playground (Playground) 2.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>7</integer>
</dict>
<key>Playground (Playground) 3.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>3</integer>
</dict>
<key>Playground (Playground) 4.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>7</integer>
</dict>
<key>Playground (Playground) 5.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>8</integer>
</dict>
<key>Playground (Playground).xcscheme</key>
<dict>
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>5</integer>
</dict>
</dict>
<key>SuppressBuildableAutocreation</key>
<dict>
<key>37D4B0CE2671614900C925CA</key>
<dict>
<key>primary</key>
<true/>
</dict>
<key>37D4B0DD2671614900C925CA</key>
<dict>
<key>primary</key>
<true/>
</dict>
<key>37D4B157267164AE00C925CA</key>
<dict>
<key>primary</key>
<true/>
</dict>
<key>37D4B170267164B000C925CA</key>
<dict>
<key>primary</key>
<true/>
</dict>
<key>37FD43E62704A2240073EE42</key>
<dict>
<key>primary</key>
<true/>
</dict>
</dict>
</dict>
</plist>

View File

@ -35,9 +35,6 @@ struct ContentView: View {
}
.onAppear(perform: configure)
.handlesExternalEvents(preferring: Set(["*"]), allowing: Set(["*"]))
.onOpenURL(perform: handleOpenedURL)
.environmentObject(accounts)
.environmentObject(instances)
.environmentObject(navigation)
@ -72,6 +69,8 @@ struct ContentView: View {
}
#endif
#if !os(tvOS)
.handlesExternalEvents(preferring: Set(["*"]), allowing: Set(["*"]))
.onOpenURL(perform: handleOpenedURL)
.sheet(isPresented: $navigation.presentingAddToPlaylist) {
AddToPlaylistView(video: navigation.videoToAddToPlaylist)
.environmentObject(playlists)
@ -118,24 +117,26 @@ struct ContentView: View {
navigation.presentingWelcomeScreen = true
}
func handleOpenedURL(_ url: URL) {
guard !accounts.current.isNil else {
return
}
#if !os(tvOS)
func handleOpenedURL(_ url: URL) {
guard !accounts.current.isNil else {
return
}
let parser = VideoURLParser(url: url)
let parser = VideoURLParser(url: url)
guard let id = parser.id else {
return
}
guard let id = parser.id else {
return
}
accounts.api.video(id).load().onSuccess { response in
if let video: Video = response.typedContent() {
self.player.playNow(video, at: parser.time)
self.player.presentPlayer()
accounts.api.video(id).load().onSuccess { response in
if let video: Video = response.typedContent() {
self.player.playNow(video, at: parser.time)
self.player.presentPlayer()
}
}
}
}
#endif
}
struct ContentView_Previews: PreviewProvider {

View File

@ -11,8 +11,8 @@ struct PearvidiousApp: App {
WindowGroup {
ContentView()
}
.handlesExternalEvents(matching: Set(["*"]))
#if !os(tvOS)
.handlesExternalEvents(matching: Set(["*"]))
.commands {
SidebarCommands()
}

View File

@ -95,16 +95,19 @@ struct PlaybackBar: View {
}
private var restoreLastSkippedSegmentButton: some View {
Button {
player.restoreLastSkippedSegment()
} label: {
HStack(spacing: 4) {
Image(systemName: "arrow.uturn.left.circle")
Text(player.lastSkipped!.category)
Text("")
HStack(spacing: 4) {
Button {
player.restoreLastSkippedSegment()
} label: {
HStack(spacing: 4) {
Image(systemName: "arrow.uturn.left.circle")
Text(player.lastSkipped!.title())
}
}
.buttonStyle(.plain)
Text("")
}
.buttonStyle(.plain)
}
private var streamControl: some View {

View File

@ -5,9 +5,6 @@ struct InstancesSettings: View {
@Default(.instances) private var instances
@EnvironmentObject<AccountsModel> private var accounts
@EnvironmentObject<InstancesModel> private var instancesModel
@EnvironmentObject<SubscriptionsModel> private var subscriptions
@EnvironmentObject<PlaylistsModel> private var playlists
@State private var selectedInstanceID: Instance.ID?
@State private var selectedAccount: Account?
@ -69,6 +66,5 @@ struct InstancesSettingsView_Previews: PreviewProvider {
InstancesSettings()
}
.frame(width: 400, height: 270)
.environmentObject(InstancesModel())
}
}

View File

@ -2,10 +2,6 @@ import Defaults
import SwiftUI
struct HorizontalCells: View {
#if os(iOS)
@Environment(\.verticalSizeClass) private var verticalSizeClass
#endif
var items = [ContentItem]()
var body: some View {

View File

@ -7,10 +7,6 @@ struct SignInRequiredView<Content: View>: View {
@EnvironmentObject<AccountsModel> private var accounts
#if !os(macOS)
@EnvironmentObject<NavigationModel> private var navigation
#endif
@Default(.instances) private var instances
init(title: String, @ViewBuilder content: @escaping () -> Content) {

View File

@ -5,7 +5,6 @@ struct WelcomeScreen: View {
@Environment(\.dismiss) private var dismiss
@EnvironmentObject<AccountsModel> private var accounts
@EnvironmentObject<NavigationModel> private var navigation
@Default(.accounts) private var allAccounts