Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
49 commits
Select commit Hold shift + click to select a range
64b498b
v4 warning
lumaa-dev Oct 11, 2025
778b0d5
v4 build version
lumaa-dev Oct 11, 2025
626a608
MVVM > all in MusicPlayerView + redesign
lumaa-dev Oct 11, 2025
23cef1e
Queue + Shuffle, Repeat, Autoplay buttons (#31)
lumaa-dev Oct 12, 2025
46b035e
animated cover test
lumaa-dev Oct 12, 2025
2325bfe
conditional artwork + uninteractable video
lumaa-dev Oct 12, 2025
e94cfd9
fix button shape
lumaa-dev Oct 12, 2025
52e2e36
added missing changelog
lumaa-dev Oct 12, 2025
885af68
that thing
lumaa-dev Oct 12, 2025
aa9ab7b
Merge branch 'main' into v4
lumaa-dev Oct 12, 2025
db28a40
fix issue #37 but in v4
lumaa-dev Oct 12, 2025
f4c4111
Merge remote-tracking branch 'refs/remotes/cider/v4'
lumaa-dev Oct 12, 2025
fa86138
v3.1.1 changelog
lumaa-dev Oct 12, 2025
9af6dac
updated changelogs user interface
lumaa-dev Oct 13, 2025
c7f11bf
huh
lumaa-dev Oct 13, 2025
f58e46b
added back lyrics + alt singer lyrics
lumaa-dev Oct 15, 2025
74f4bf5
smaller "Library Browser" button
lumaa-dev Oct 15, 2025
af86cb6
new update popup
lumaa-dev Oct 15, 2025
5b2927a
updated changelog
lumaa-dev Oct 15, 2025
813e533
better header
lumaa-dev Oct 15, 2025
f45b060
old APIs fixed
lumaa-dev Oct 15, 2025
e63686b
color.
lumaa-dev Oct 15, 2025
a0e8c0f
another change of the changelogs
lumaa-dev Oct 15, 2025
c5afe12
all of them all, gone.
lumaa-dev Oct 16, 2025
768cdc0
animated covers in Library Browser
lumaa-dev Oct 17, 2025
409782a
whitespace
lumaa-dev Oct 17, 2025
6366b45
animated album covers
lumaa-dev Oct 17, 2025
6b2a506
better UI
lumaa-dev Oct 17, 2025
6036390
lighter project
lumaa-dev Oct 17, 2025
f1ee04c
branches
lumaa-dev Oct 17, 2025
65184c0
view album button in playlist
lumaa-dev Oct 18, 2025
20818f8
smart reset animated cover
lumaa-dev Oct 18, 2025
9311c35
removed OS condition
lumaa-dev Oct 18, 2025
41c346f
changed macOS & Cider Remote icons
lumaa-dev Oct 18, 2025
453357e
Device list redesign
lumaa-dev Oct 18, 2025
9ad4a86
changed connection guide
lumaa-dev Oct 18, 2025
f4426ba
fix bug
lumaa-dev Oct 18, 2025
0eaf810
overlay might cause crashes
lumaa-dev Oct 18, 2025
869b99e
show loading
lumaa-dev Oct 18, 2025
0d05574
lowered lyric advance time + button per lyric like AM
lumaa-dev Oct 18, 2025
f66b107
adjustments
lumaa-dev Oct 18, 2025
d2cd3c4
lyric special button
lumaa-dev Oct 18, 2025
1e35296
Redesigned connection guide
lumaa-dev Oct 18, 2025
ed44fdd
fix crash
lumaa-dev Oct 18, 2025
a0969ee
well that fixes stuff
lumaa-dev Oct 18, 2025
328d83f
Lyric Share
lumaa-dev Oct 18, 2025
9b7795e
New most-additions changelog
lumaa-dev Oct 18, 2025
e8ad9e4
darker half
lumaa-dev Oct 19, 2025
ce54e8b
for real on god
lumaa-dev Oct 19, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
96 changes: 30 additions & 66 deletions Cider Remote.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -7,16 +7,11 @@
objects = {

/* Begin PBXBuildFile section */
B913FE682E17108A005A4680 /* AppIcon.icon in Resources */ = {isa = PBXBuildFile; fileRef = B913FE672E171089005A4680 /* AppIcon.icon */; };
B99C7C292DBD96E400B6CD36 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = B9D289282CC51497008543A7 /* Assets.xcassets */; };
B9A455622CC51C19006AEB89 /* SocketIO in Frameworks */ = {isa = PBXBuildFile; productRef = B9A455612CC51C19006AEB89 /* SocketIO */; };
B9CDA83D2CC686AA00FBF580 /* WidgetKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B9CDA83C2CC686AA00FBF580 /* WidgetKit.framework */; };
B9CDA83F2CC686AA00FBF580 /* SwiftUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B9CDA83E2CC686AA00FBF580 /* SwiftUI.framework */; };
B9CDA84C2CC686AC00FBF580 /* NowPlayingExtension.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = B9CDA83A2CC686AA00FBF580 /* NowPlayingExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
B9CDA87B2CC6905C00FBF580 /* SocketIO in Frameworks */ = {isa = PBXBuildFile; productRef = B9CDA87A2CC6905C00FBF580 /* SocketIO */; };
B9CDA87D2CC69A7300FBF580 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = B9CDA87C2CC69A7300FBF580 /* AppDelegate.swift */; };
B9D2892E2CC51497008543A7 /* Cider_RemoteApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = B9D2892A2CC51497008543A7 /* Cider_RemoteApp.swift */; };
B9D289322CC51497008543A7 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = B9D289282CC51497008543A7 /* Assets.xcassets */; };
/* End PBXBuildFile section */

/* Begin PBXContainerItemProxy section */
Expand Down Expand Up @@ -54,19 +49,24 @@
/* End PBXCopyFilesBuildPhase section */

/* Begin PBXFileReference section */
B913FE672E171089005A4680 /* AppIcon.icon */ = {isa = PBXFileReference; lastKnownFileType = folder.iconcomposer.icon; path = AppIcon.icon; sourceTree = "<group>"; };
B9BCCEBD2DE2F6F100B003F8 /* NowPlayingExtension.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = NowPlayingExtension.entitlements; sourceTree = "<group>"; };
B9CDA83A2CC686AA00FBF580 /* NowPlayingExtension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = NowPlayingExtension.appex; sourceTree = BUILT_PRODUCTS_DIR; };
B9CDA83C2CC686AA00FBF580 /* WidgetKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WidgetKit.framework; path = System/Library/Frameworks/WidgetKit.framework; sourceTree = SDKROOT; };
B9CDA83E2CC686AA00FBF580 /* SwiftUI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SwiftUI.framework; path = System/Library/Frameworks/SwiftUI.framework; sourceTree = SDKROOT; };
B9CDA87C2CC69A7300FBF580 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
B9D289282CC51497008543A7 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
B9D289292CC51497008543A7 /* Cider Remote.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "Cider Remote.entitlements"; sourceTree = "<group>"; };
B9D2892A2CC51497008543A7 /* Cider_RemoteApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Cider_RemoteApp.swift; sourceTree = "<group>"; };
FA14E3472C7CA1C200904A49 /* Cider Remote.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Cider Remote.app"; sourceTree = BUILT_PRODUCTS_DIR; };
/* End PBXFileReference section */

/* Begin PBXFileSystemSynchronizedBuildFileExceptionSet section */
B998C1862EA2B54500FF1517 /* Exceptions for "Cider Remote" folder in "NowPlayingExtension" target */ = {
isa = PBXFileSystemSynchronizedBuildFileExceptionSet;
membershipExceptions = (
AppDelegate.swift,
AppIcon.icon,
Cider_RemoteApp.swift,
"Preview Content/Preview Assets.xcassets",
);
target = B9CDA8392CC686AA00FBF580 /* NowPlayingExtension */;
};
B9E7DA032D0125E800840996 /* Exceptions for "NowPlaying" folder in "Cider Remote" target */ = {
isa = PBXFileSystemSynchronizedBuildFileExceptionSet;
membershipExceptions = (
Expand All @@ -91,9 +91,12 @@
/* End PBXFileSystemSynchronizedBuildFileExceptionSet section */

/* Begin PBXFileSystemSynchronizedRootGroup section */
B99015492D46931300D4CE93 /* Preview Content */ = {
B998C12B2EA2B54500FF1517 /* Cider Remote */ = {
isa = PBXFileSystemSynchronizedRootGroup;
path = "Preview Content";
exceptions = (
B998C1862EA2B54500FF1517 /* Exceptions for "Cider Remote" folder in "NowPlayingExtension" target */,
);
path = "Cider Remote";
sourceTree = "<group>";
};
B9E7D9FC2D0125E800840996 /* NowPlaying */ = {
Expand All @@ -105,21 +108,6 @@
path = NowPlaying;
sourceTree = "<group>";
};
B9E7DA0A2D0125F100840996 /* Views */ = {
isa = PBXFileSystemSynchronizedRootGroup;
path = Views;
sourceTree = "<group>";
};
B9E7DA182D0125F500840996 /* Components */ = {
isa = PBXFileSystemSynchronizedRootGroup;
path = Components;
sourceTree = "<group>";
};
B9E7DA2F2D01260000840996 /* Data */ = {
isa = PBXFileSystemSynchronizedRootGroup;
path = Data;
sourceTree = "<group>";
};
/* End PBXFileSystemSynchronizedRootGroup section */

/* Begin PBXFrameworksBuildPhase section */
Expand Down Expand Up @@ -153,27 +141,11 @@
name = Frameworks;
sourceTree = "<group>";
};
B9D2892D2CC51497008543A7 /* Cider Remote */ = {
isa = PBXGroup;
children = (
B99015492D46931300D4CE93 /* Preview Content */,
B9D289292CC51497008543A7 /* Cider Remote.entitlements */,
B9D2892A2CC51497008543A7 /* Cider_RemoteApp.swift */,
B9CDA87C2CC69A7300FBF580 /* AppDelegate.swift */,
B9E7DA182D0125F500840996 /* Components */,
B9E7DA0A2D0125F100840996 /* Views */,
B9E7DA2F2D01260000840996 /* Data */,
B913FE672E171089005A4680 /* AppIcon.icon */,
B9D289282CC51497008543A7 /* Assets.xcassets */,
);
path = "Cider Remote";
sourceTree = "<group>";
};
FA14E33E2C7CA1C200904A49 = {
isa = PBXGroup;
children = (
B9BCCEBD2DE2F6F100B003F8 /* NowPlayingExtension.entitlements */,
B9D2892D2CC51497008543A7 /* Cider Remote */,
B998C12B2EA2B54500FF1517 /* Cider Remote */,
B9E7D9FC2D0125E800840996 /* NowPlaying */,
B9CDA83B2CC686AA00FBF580 /* Frameworks */,
FA14E3482C7CA1C200904A49 /* Products */,
Expand Down Expand Up @@ -205,10 +177,8 @@
dependencies = (
);
fileSystemSynchronizedGroups = (
B998C12B2EA2B54500FF1517 /* Cider Remote */,
B9E7D9FC2D0125E800840996 /* NowPlaying */,
B9E7DA0A2D0125F100840996 /* Views */,
B9E7DA182D0125F500840996 /* Components */,
B9E7DA2F2D01260000840996 /* Data */,
);
name = NowPlayingExtension;
packageProductDependencies = (
Expand All @@ -234,10 +204,7 @@
B9CDA84B2CC686AC00FBF580 /* PBXTargetDependency */,
);
fileSystemSynchronizedGroups = (
B99015492D46931300D4CE93 /* Preview Content */,
B9E7DA0A2D0125F100840996 /* Views */,
B9E7DA182D0125F500840996 /* Components */,
B9E7DA2F2D01260000840996 /* Data */,
B998C12B2EA2B54500FF1517 /* Cider Remote */,
);
name = "Cider Remote";
packageProductDependencies = (
Expand Down Expand Up @@ -294,16 +261,13 @@
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
B99C7C292DBD96E400B6CD36 /* Assets.xcassets in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
FA14E3452C7CA1C200904A49 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
B913FE682E17108A005A4680 /* AppIcon.icon in Resources */,
B9D289322CC51497008543A7 /* Assets.xcassets in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
Expand All @@ -321,8 +285,6 @@
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
B9D2892E2CC51497008543A7 /* Cider_RemoteApp.swift in Sources */,
B9CDA87D2CC69A7300FBF580 /* AppDelegate.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
Expand Down Expand Up @@ -352,7 +314,7 @@
INFOPLIST_KEY_CFBundleDisplayName = NowPlaying;
INFOPLIST_KEY_NSHumanReadableCopyright = "";
INFOPLIST_KEY_NSSupportsLiveActivities = YES;
IPHONEOS_DEPLOYMENT_TARGET = 17.0;
IPHONEOS_DEPLOYMENT_TARGET = 26.0;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
Expand Down Expand Up @@ -388,7 +350,7 @@
INFOPLIST_KEY_CFBundleDisplayName = NowPlaying;
INFOPLIST_KEY_NSHumanReadableCopyright = "";
INFOPLIST_KEY_NSSupportsLiveActivities = YES;
IPHONEOS_DEPLOYMENT_TARGET = 17.0;
IPHONEOS_DEPLOYMENT_TARGET = 26.0;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
Expand Down Expand Up @@ -549,13 +511,14 @@
INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
INFOPLIST_KEY_UILaunchScreen_Generation = YES;
INFOPLIST_KEY_UIRequiresFullScreen = YES;
INFOPLIST_KEY_UISupportedInterfaceOrientations = "UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UIInterfaceOrientationPortrait";
IPHONEOS_DEPLOYMENT_TARGET = 17.0;
INFOPLIST_KEY_UISupportedInterfaceOrientations = UIInterfaceOrientationPortrait;
INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UIInterfaceOrientationPortrait";
IPHONEOS_DEPLOYMENT_TARGET = 26.0;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
MARKETING_VERSION = 3.1.1;
MARKETING_VERSION = 4.0.0;
PRODUCT_BUNDLE_IDENTIFIER = "sh.cidercollective.Cider-Remote";
PRODUCT_NAME = "$(TARGET_NAME)";
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
Expand All @@ -564,7 +527,7 @@
SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO;
SWIFT_EMIT_LOC_STRINGS = YES;
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
TARGETED_DEVICE_FAMILY = 1;
};
name = Debug;
};
Expand All @@ -589,13 +552,14 @@
INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
INFOPLIST_KEY_UILaunchScreen_Generation = YES;
INFOPLIST_KEY_UIRequiresFullScreen = YES;
INFOPLIST_KEY_UISupportedInterfaceOrientations = "UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UIInterfaceOrientationPortrait";
IPHONEOS_DEPLOYMENT_TARGET = 17.0;
INFOPLIST_KEY_UISupportedInterfaceOrientations = UIInterfaceOrientationPortrait;
INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UIInterfaceOrientationPortrait";
IPHONEOS_DEPLOYMENT_TARGET = 26.0;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
MARKETING_VERSION = 3.1.1;
MARKETING_VERSION = 4.0.0;
PRODUCT_BUNDLE_IDENTIFIER = "sh.cidercollective.Cider-Remote";
PRODUCT_NAME = "$(TARGET_NAME)";
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
Expand All @@ -604,7 +568,7 @@
SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO;
SWIFT_EMIT_LOC_STRINGS = YES;
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
TARGETED_DEVICE_FAMILY = 1;
};
name = Release;
};
Expand Down
Binary file not shown.
144 changes: 72 additions & 72 deletions Cider Remote/AppDelegate.swift
Original file line number Diff line number Diff line change
Expand Up @@ -22,76 +22,76 @@ public class AppDelegate: UIResponder, UIApplicationDelegate, ObservableObject {
}
}

public func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
print("registering BG TASKs")
BGTaskScheduler.shared.register(forTaskWithIdentifier: BGIdentifier.refreshLiveActivity.fullString, using: nil) { task in
guard let task = task as? BGAppRefreshTask else { return }
print("EXECUTING BG TASK")
self.handleAppRefresh(task: task)
}

#if DEBUG
BGTaskScheduler.shared.cancelAllTaskRequests()
#endif
// manually start BGTask with "e -l objc -- (void)[[BGTaskScheduler sharedScheduler] _simulateLaunchForTaskWithIdentifier:@"sh.cidercollective.Cider-Remote.BGTasks.refreshLiveActivity"]" in lldb
BGTaskScheduler.shared.getPendingTaskRequests { tasks in
print("\(tasks.count) PENDING task(s)")
if tasks.isEmpty {
self.scheduleAppRefresh()
}
}

return true
}

func scheduleAppRefresh() {
do {
let request = BGAppRefreshTaskRequest(identifier: BGIdentifier.refreshLiveActivity.fullString)
request.earliestBeginDate = Date(timeIntervalSinceNow: 15 * 60) // every 15 mins (minimum allowed by iOS)
try BGTaskScheduler.shared.submit(request)
print("SCHEDULED BG TASK")
} catch {
print("Could not schedule app refresh: \(error)")
}
}

func handleAppRefresh(task: BGAppRefreshTask) {
print("HANDLED BG TASK")
self.scheduleAppRefresh()

Task {
let success = await updateLiveActivity()
task.setTaskCompleted(success: success)
}
}

func updateLiveActivity() async -> Bool {
print("BG TASK OPERATING")

let liveActivity: LiveActivityManager = .shared
if let device = liveActivity.device {
let vm: MusicPlayerViewModel = .init(device: device)

await vm.getCurrentTrack()

if let track: Track = vm.currentTrack {
await liveActivity.updateActivity(with: track)
print("UPDATED using BG TASK")
}
} else {
liveActivity.stopActivity()
print("No device for BG TASK")
return false
}

return true
}

enum BGIdentifier: String {
case refreshLiveActivity = "refreshLiveActivity"

var fullString: String {
return "sh.cidercollective.Cider-Remote.BGTasks.\(self.rawValue)"
}
}
// public func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// print("registering BG TASKs")
// BGTaskScheduler.shared.register(forTaskWithIdentifier: BGIdentifier.refreshLiveActivity.fullString, using: nil) { task in
// guard let task = task as? BGAppRefreshTask else { return }
// print("EXECUTING BG TASK")
// self.handleAppRefresh(task: task)
// }
//
// #if DEBUG
// BGTaskScheduler.shared.cancelAllTaskRequests()
// #endif
// // manually start BGTask with "e -l objc -- (void)[[BGTaskScheduler sharedScheduler] _simulateLaunchForTaskWithIdentifier:@"sh.cidercollective.Cider-Remote.BGTasks.refreshLiveActivity"]" in lldb
// BGTaskScheduler.shared.getPendingTaskRequests { tasks in
// print("\(tasks.count) PENDING task(s)")
// if tasks.isEmpty {
// self.scheduleAppRefresh()
// }
// }
//
// return true
// }
//
// func scheduleAppRefresh() {
// do {
// let request = BGAppRefreshTaskRequest(identifier: BGIdentifier.refreshLiveActivity.fullString)
// request.earliestBeginDate = Date(timeIntervalSinceNow: 15 * 60) // every 15 mins (minimum allowed by iOS)
// try BGTaskScheduler.shared.submit(request)
// print("SCHEDULED BG TASK")
// } catch {
// print("Could not schedule app refresh: \(error)")
// }
// }
//
// func handleAppRefresh(task: BGAppRefreshTask) {
// print("HANDLED BG TASK")
// self.scheduleAppRefresh()
//
// Task {
// let success = await updateLiveActivity()
// task.setTaskCompleted(success: success)
// }
// }
//
// func updateLiveActivity() async -> Bool {
// print("BG TASK OPERATING")
//
// let liveActivity: LiveActivityManager = .shared
// if let device = liveActivity.device {
// let vm: MusicPlayerViewModel = .init(device: device)
//
// await vm.getCurrentTrack()
//
// if let track: Track = vm.currentTrack {
// await liveActivity.updateActivity(with: track)
// print("UPDATED using BG TASK")
// }
// } else {
// liveActivity.stopActivity()
// print("No device for BG TASK")
// return false
// }
//
// return true
// }
//
// enum BGIdentifier: String {
// case refreshLiveActivity = "refreshLiveActivity"
//
// var fullString: String {
// return "sh.cidercollective.Cider-Remote.BGTasks.\(self.rawValue)"
// }
// }
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{
"info" : {
"author" : "xcode",
"version" : 1
},
"symbols" : [
{
"filename" : "music.note.square.svg",
"idiom" : "universal"
}
]
}
Loading