Skip to content

Commit

Permalink
chore: v4.2.0 (#109)
Browse files Browse the repository at this point in the history
  • Loading branch information
castdrian authored Jan 16, 2025
2 parents ab812a8 + 2129584 commit 1dafadb
Show file tree
Hide file tree
Showing 21 changed files with 4,940 additions and 4,505 deletions.
3 changes: 2 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -195,9 +195,10 @@ After:

## 📤 Compatible Uploader Services

ishare is confirmed to be compatible with the following uploader services:
ishare is confirmed to be compatible with the following upload services:

- [chibisafe](https://github.com/chibisafe/chibisafe)
- [copyparty](https://github.com/9001/copyparty)
- [lumen](https://github.com/ChecksumDev/lumen)
- [zipline](https://github.com/diced/zipline)
- [discord webhook](https://support.discord.com/hc/en-us/articles/228383668-Intro-to-Webhooks)
Expand Down
10 changes: 10 additions & 0 deletions examples/copyparty.iscu
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{
"name": "copyparty",
"requestURL": "http://127.0.0.1:3923/screenshots/",
"headers": {
"pw": "VALUE",
"accept": "json"
},
"fileFormName": "f",
"responseURL": "{{files[0].url}}",
}
12 changes: 12 additions & 0 deletions ishare.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,10 @@
3ADDAEE32A65D00F00C42406 /* Zip in Frameworks */ = {isa = PBXBuildFile; productRef = 3ADDAEE22A65D00F00C42406 /* Zip */; };
3AE7312A2B47052E006F10F7 /* UploadManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3AE731292B47052E006F10F7 /* UploadManager.swift */; };
3AEFA5672A9FC15800F485B4 /* PreviewImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3AEFA5662A9FC15800F485B4 /* PreviewImage.swift */; };
3AF432E82D390C69003DF3DD /* LocalizableManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3AF432E72D390C69003DF3DD /* LocalizableManager.swift */; };
3AF432E92D390C69003DF3DD /* LocalizableManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3AF432E72D390C69003DF3DD /* LocalizableManager.swift */; };
3AF432EB2D393B6D003DF3DD /* PasteboardExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3AF432EA2D393B6D003DF3DD /* PasteboardExtension.swift */; };
3AF432EC2D393B6D003DF3DD /* PasteboardExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3AF432EA2D393B6D003DF3DD /* PasteboardExtension.swift */; };
3AF7F0212B3EF16B000117DD /* HistoryGridView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3AF7F0202B3EF16B000117DD /* HistoryGridView.swift */; };
3AF9A80F2C4B011A0094B78B /* sharemenuext.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = 3AF9A8052C4B011A0094B78B /* sharemenuext.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
/* End PBXBuildFile section */
Expand Down Expand Up @@ -143,6 +147,8 @@
3ADDAED92A659A0B00C42406 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Assets.xcassets; path = Util/Assets.xcassets; sourceTree = "<group>"; };
3AE731292B47052E006F10F7 /* UploadManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UploadManager.swift; sourceTree = "<group>"; };
3AEFA5662A9FC15800F485B4 /* PreviewImage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PreviewImage.swift; sourceTree = "<group>"; };
3AF432E72D390C69003DF3DD /* LocalizableManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocalizableManager.swift; sourceTree = "<group>"; };
3AF432EA2D393B6D003DF3DD /* PasteboardExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PasteboardExtension.swift; sourceTree = "<group>"; };
3AF7F0202B3EF16B000117DD /* HistoryGridView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HistoryGridView.swift; sourceTree = "<group>"; };
3AF9A8052C4B011A0094B78B /* sharemenuext.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = sharemenuext.appex; sourceTree = BUILT_PRODUCTS_DIR; };
/* End PBXFileReference section */
Expand Down Expand Up @@ -280,11 +286,13 @@
3AB345CA2A5F1A9D00AAEC0E /* Util */ = {
isa = PBXGroup;
children = (
3AF432EA2D393B6D003DF3DD /* PasteboardExtension.swift */,
3AB345C72A5F163800AAEC0E /* AppState.swift */,
3AB345C32A5EEB8D00AAEC0E /* ToastPopover.swift */,
3AB345C52A5F0C7A00AAEC0E /* Constants.swift */,
3AB38D032A62B56B00184E0D /* CustomUploader.swift */,
3AEFA5662A9FC15800F485B4 /* PreviewImage.swift */,
3AF432E72D390C69003DF3DD /* LocalizableManager.swift */,
);
path = Util;
sourceTree = "<group>";
Expand Down Expand Up @@ -489,9 +497,11 @@
3A2994842CFF79CB0079CBB8 /* Upload.swift in Sources */,
3A2994852CFF79CB0079CBB8 /* AppState.swift in Sources */,
3A2994862CFF79CB0079CBB8 /* PreviewImage.swift in Sources */,
3AF432EB2D393B6D003DF3DD /* PasteboardExtension.swift in Sources */,
3A2994872CFF79CB0079CBB8 /* SettingsMenuView.swift in Sources */,
3A2994882CFF79CB0079CBB8 /* ToastPopover.swift in Sources */,
3A2994892CFF79CB0079CBB8 /* ImageCapture.swift in Sources */,
3AF432E92D390C69003DF3DD /* LocalizableManager.swift in Sources */,
3A29948A2CFF79CB0079CBB8 /* Constants.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
Expand All @@ -516,9 +526,11 @@
3AB38D082A62C49C00184E0D /* Upload.swift in Sources */,
3AB345C82A5F163800AAEC0E /* AppState.swift in Sources */,
3AEFA5672A9FC15800F485B4 /* PreviewImage.swift in Sources */,
3AF432EC2D393B6D003DF3DD /* PasteboardExtension.swift in Sources */,
3AB345B62A5E8E6300AAEC0E /* SettingsMenuView.swift in Sources */,
3AB345C42A5EEB8D00AAEC0E /* ToastPopover.swift in Sources */,
3AB345AB2A5D779500AAEC0E /* ImageCapture.swift in Sources */,
3AF432E82D390C69003DF3DD /* LocalizableManager.swift in Sources */,
3AB345C62A5F0C7A00AAEC0E /* Constants.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
Expand Down
286 changes: 126 additions & 160 deletions ishare/App.swift
Original file line number Diff line number Diff line change
Expand Up @@ -10,172 +10,138 @@ import MenuBarExtraAccess
import SwiftUI

#if canImport(Sparkle)
import Sparkle
import Sparkle
#endif

@main
struct ishare: App {
@Default(.menuBarIcon) var menubarIcon
@Default(.showMainMenu) var showMainMenu
@StateObject private var appState = AppState()
@NSApplicationDelegateAdaptor private var appDelegate: AppDelegate

var body: some Scene {
MenuBarExtra {
MainMenuView()
}
label: {
switch menubarIcon {
case .DEFAULT: Image(nsImage: GlyphIcon)
case .APPICON: Image(nsImage: AppIcon)
case .SYSTEM: Image(systemName: "photo.on.rectangle.angled")
}
}
.menuBarExtraAccess(isPresented: $showMainMenu)
Settings {
SettingsMenuView()
}
}
protocol UpdaterProtocol {
init()
func checkForUpdates()
}

#if GITHUB_RELEASE
@MainActor
class AppDelegate: NSObject, NSApplicationDelegate, SPUUpdaterDelegate {
private static let sharedInstance = AppDelegate()
static var shared: AppDelegate { sharedInstance }

var recordGif = false
let screenRecorder = ScreenRecorder()
let updaterController: SPUStandardUpdaterController

override init() {
self.updaterController = SPUStandardUpdaterController(startingUpdater: true, updaterDelegate: nil, userDriverDelegate: nil)
super.init()
}

func applicationDidFinishLaunching(_: Notification) {
NSLog("Application finished launching")
}

func application(_: NSApplication, open urls: [URL]) {
if urls.first!.isFileURL {
NSLog("Attempting to import ISCU file from: %@", urls.first!.path)
importIscu(urls.first!)
}

if let url = urls.first {
NSLog("Processing URL scheme: %@", url.absoluteString)
let path = url.host
let queryItems = URLComponents(url: url, resolvingAgainstBaseURL: false)?.queryItems

if path == "upload" {
if let fileItem = queryItems?.first(where: { $0.name == "file" }) {
if let encodedFileURLString = fileItem.value,
let decodedFileURLString = encodedFileURLString.removingPercentEncoding,
let fileURL = URL(string: decodedFileURLString) {
NSLog("Processing upload request for file: %@", fileURL.absoluteString)

@Default(.uploadType) var uploadType
NSLog("Using upload type: %@", String(describing: uploadType))
let localFileURL = fileURL

uploadFile(fileURL: fileURL, uploadType: uploadType) {
Task { @MainActor in
NSLog("Upload completed, showing toast notification")
showToast(fileURL: localFileURL) {
NSSound.beep()
}
}
}
} else {
NSLog("Error: Failed to process file URL from query parameters")
}
}
}
}
}

@MainActor
func stopRecording() {
let wasRecordingGif = recordGif
let recorder = screenRecorder

Task {
recorder.stop { result in
Task { @MainActor in
switch result {
case let .success(url):
print("Recording stopped successfully. URL: \(url)")
postRecordingTasks(url, wasRecordingGif)
case let .failure(error):
print("Error while stopping recording: \(error.localizedDescription)")
}
}
}
}
}
class SparkleUpdater: NSObject, @preconcurrency UpdaterProtocol, SPUUpdaterDelegate {
let updaterController: SPUStandardUpdaterController

override required init() {
updaterController = SPUStandardUpdaterController(
startingUpdater: true, updaterDelegate: nil, userDriverDelegate: nil)
super.init()
}

@MainActor func checkForUpdates() {
updaterController.checkForUpdates(nil)
}
}
#endif

@main
struct ishare: App {
@Default(.menuBarIcon) var menubarIcon
@Default(.showMainMenu) var showMainMenu
@StateObject private var appState = AppState()
@NSApplicationDelegateAdaptor private var appDelegate: AppDelegate

var body: some Scene {
MenuBarExtra {
MainMenuView()
} label: {
switch menubarIcon {
case .DEFAULT: Image(nsImage: GlyphIcon)
case .APPICON: Image(nsImage: AppIcon)
case .SYSTEM: Image(systemName: "photo.on.rectangle.angled")
}
}
.menuBarExtraAccess(isPresented: $showMainMenu)
Settings {
SettingsMenuView()
.environmentObject(LocalizableManager.shared)
}
}
}
#else

@MainActor
class AppDelegate: NSObject, NSApplicationDelegate {
private static let sharedInstance = AppDelegate()
static var shared: AppDelegate { sharedInstance }

var recordGif = false
let screenRecorder = ScreenRecorder()

func application(_: NSApplication, open urls: [URL]) {
if urls.first!.isFileURL {
importIscu(urls.first!)
}

if let url = urls.first {
let path = url.host
let queryItems = URLComponents(url: url, resolvingAgainstBaseURL: false)?.queryItems

if path == "upload" {
if let fileItem = queryItems?.first(where: { $0.name == "file" }) {
if let encodedFileURLString = fileItem.value, let decodedFileURLString = encodedFileURLString.removingPercentEncoding, let fileURL = URL(string: decodedFileURLString) {
print("Received file URL: \(fileURL.absoluteString)")

@Default(.uploadType) var uploadType
let localFileURL = fileURL

uploadFile(fileURL: fileURL, uploadType: uploadType) {
Task { @MainActor in
showToast(fileURL: localFileURL) {
NSSound.beep()
}
}
}
}
}
}
}
}

func applicationDidFinishLaunching(_: Notification) {
NSLog("Application finished launching")
}

@MainActor
func stopRecording() {
let wasRecordingGif = recordGif
let recorder = screenRecorder

Task {
recorder.stop { result in
Task { @MainActor in
switch result {
case let .success(url):
print("Recording stopped successfully. URL: \(url)")
postRecordingTasks(url, wasRecordingGif)
case let .failure(error):
print("Error while stopping recording: \(error.localizedDescription)")
}
}
}
}
}
private static let sharedInstance = AppDelegate()
static var shared: AppDelegate { sharedInstance }

var recordGif = false
let screenRecorder = ScreenRecorder()

#if GITHUB_RELEASE
private let updater: SparkleUpdater

override init() {
self.updater = SparkleUpdater()
super.init()
}
#endif

func applicationDidFinishLaunching(_: Notification) {
NSLog("Application finished launching")
}

func application(_: NSApplication, open urls: [URL]) {
if urls.first!.isFileURL {
NSLog("Attempting to import ISCU file from: %@", urls.first!.path)
importIscu(urls.first!)
}

if let url = urls.first {
NSLog("Processing URL scheme: %@", url.absoluteString)
let path = url.host
let queryItems = URLComponents(url: url, resolvingAgainstBaseURL: false)?.queryItems

if path == "upload" {
if let fileItem = queryItems?.first(where: { $0.name == "file" }) {
if let encodedFileURLString = fileItem.value,
let decodedFileURLString = encodedFileURLString.removingPercentEncoding,
let fileURL = URL(string: decodedFileURLString)
{
NSLog("Processing upload request for file: %@", fileURL.absoluteString)

@Default(.uploadType) var uploadType
NSLog("Using upload type: %@", String(describing: uploadType))
let localFileURL = fileURL

uploadFile(fileURL: fileURL, uploadType: uploadType) {
Task { @MainActor in
NSLog("Upload completed, showing toast notification")
showToast(fileURL: localFileURL) {
NSSound.beep()
}
}
}
} else {
NSLog("Error: Failed to process file URL from query parameters")
}
}
}
}
}

@MainActor
func stopRecording() {
let wasRecordingGif = recordGif
let recorder = screenRecorder

Task {
recorder.stop { result in
Task { @MainActor in
switch result {
case let .success(url):
print("Recording stopped successfully. URL: \(url)")
postRecordingTasks(url, wasRecordingGif)
case let .failure(error):
print("Error while stopping recording: \(error.localizedDescription)")
}
}
}
}
}

func checkForUpdates() {
#if GITHUB_RELEASE
updater.checkForUpdates()
#endif
}
}
#endif
Loading

0 comments on commit 1dafadb

Please sign in to comment.