Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
2 changes: 1 addition & 1 deletion .github/ISSUE_TEMPLATE/config.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
blank_issues_enabled: false
blank_issues_enabled: true
contact_links:
- name: Feature Request 💡
url: https://github.com/nodefinity/react-native-music-library/discussions/new?category=ideas
Expand Down
10 changes: 8 additions & 2 deletions example/ios/MusicLibraryExample.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -384,7 +384,10 @@
"-DFOLLY_CFG_NO_COROUTINES=1",
"-DFOLLY_HAVE_CLOCK_GETTIME=1",
);
OTHER_LDFLAGS = "$(inherited) ";
OTHER_LDFLAGS = (
"$(inherited)",
" ",
);
REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native";
SDKROOT = iphoneos;
SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) DEBUG";
Expand Down Expand Up @@ -454,7 +457,10 @@
"-DFOLLY_CFG_NO_COROUTINES=1",
"-DFOLLY_HAVE_CLOCK_GETTIME=1",
);
OTHER_LDFLAGS = "$(inherited) ";
OTHER_LDFLAGS = (
"$(inherited)",
" ",
);
REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native";
SDKROOT = iphoneos;
SWIFT_COMPILATION_MODE = wholemodule;
Expand Down
2 changes: 1 addition & 1 deletion example/src/pages/TrackListScreen.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -117,7 +117,7 @@ export default function TrackListScreen({ navigation }: Props) {
/>

<Button
title={`${loading ? 'loading...' : ''} get tracks from directory`}
title={`${loading ? 'loading...' : ''} get tracks from directory (Android only)`}
onPress={getTracksFromPickedDirectory}
disabled={loading}
/>
Expand Down
61 changes: 29 additions & 32 deletions ios/MusicLibrary.mm
Original file line number Diff line number Diff line change
Expand Up @@ -15,99 +15,96 @@ - (instancetype) init {
- (std::shared_ptr<facebook::react::TurboModule>)getTurboModule:
(const facebook::react::ObjCTurboModule::InitParams &)params
{
return std::make_shared<facebook::react::NativeMusicLibrarySpecJSI>(params);
return std::make_shared<facebook::react::NativeMusicLibrarySpecJSI>(params);
}

- (void)getTracksAsync:(JS::NativeMusicLibrary::InternalTrackOptions &)options resolve:(nonnull RCTPromiseResolveBlock)resolve reject:(nonnull RCTPromiseRejectBlock)reject {
NSLog(@"🎵 [MusicLibrary.mm] getTracksAsync called from Objective-C");

// Extract values from Objective-C types with proper casting
// Extract values and create TrackOptions object
int first = (int)options.first();
NSString *after = options.after();
NSString *directory = options.directory();
NSArray *sortBy = (NSArray *)options.sortBy();

// Call Swift function directly
NSDictionary *result = [musicLibrary getTracksAsyncWithFirst:first after:after sortBy:sortBy directory:directory];

NSLog(@"🎵 [MusicLibrary.mm] getTracksAsync resolved with result: %@", result);
resolve(result);

TrackOptions *trackOptions = [[TrackOptions alloc] initAfter:after first:first sortBy:sortBy directory:directory];

// Call Swift function with options object
[musicLibrary getTracksAsyncWithOptions:trackOptions resolve:resolve reject:reject];
}

- (void)getTrackMetadataAsync:(nonnull NSString *)trackId resolve:(nonnull RCTPromiseResolveBlock)resolve reject:(nonnull RCTPromiseRejectBlock)reject {
- (void)getTrackMetadataAsync:(nonnull NSString *)trackId resolve:(nonnull RCTPromiseResolveBlock)resolve reject:(nonnull RCTPromiseRejectBlock)reject {
NSLog(@"🎵 [MusicLibrary.mm] getTrackMetadataAsync called with trackId: %@", trackId);

NSDictionary *result = [musicLibrary getTrackMetadataAsync:trackId];

NSLog(@"🎵 [MusicLibrary.mm] getTrackMetadataAsync resolved with result: %@", result);
resolve(result);
}

- (void)getTracksByAlbumAsync:(nonnull NSString *)albumId resolve:(nonnull RCTPromiseResolveBlock)resolve reject:(nonnull RCTPromiseRejectBlock)reject {
- (void)getTracksByAlbumAsync:(nonnull NSString *)albumId resolve:(nonnull RCTPromiseResolveBlock)resolve reject:(nonnull RCTPromiseRejectBlock)reject {
NSLog(@"🎵 [MusicLibrary.mm] getTracksByAlbumAsync called with albumId: %@", albumId);

NSArray *result = [musicLibrary getTracksByAlbumAsync:albumId];

NSLog(@"🎵 [MusicLibrary.mm] getTracksByAlbumAsync resolved with result: %@", result);
resolve(result);
}

- (void)getTracksByArtistAsync:(nonnull NSString *)artistId options:(JS::NativeMusicLibrary::InternalTrackOptions &)options resolve:(nonnull RCTPromiseResolveBlock)resolve reject:(nonnull RCTPromiseRejectBlock)reject {
- (void)getTracksByArtistAsync:(nonnull NSString *)artistId options:(JS::NativeMusicLibrary::InternalTrackOptions &)options resolve:(nonnull RCTPromiseResolveBlock)resolve reject:(nonnull RCTPromiseRejectBlock)reject {
NSLog(@"🎵 [MusicLibrary.mm] getTracksByArtistAsync called with artistId: %@", artistId);

// Extract values from Objective-C types with proper casting
int first = (int)options.first();
NSString *after = options.after();
NSString *directory = options.directory();
NSArray *sortBy = (NSArray *)options.sortBy();

// Call Swift function directly
NSDictionary *result = [musicLibrary getTracksByArtistAsync:artistId first:first after:after sortBy:sortBy directory:directory];

NSLog(@"🎵 [MusicLibrary.mm] getTracksByArtistAsync resolved with result: %@", result);
resolve(result);
}

- (void)getAlbumsAsync:(JS::NativeMusicLibrary::InternalAlbumOptions &)options resolve:(nonnull RCTPromiseResolveBlock)resolve reject:(nonnull RCTPromiseRejectBlock)reject {
- (void)getAlbumsAsync:(JS::NativeMusicLibrary::InternalAlbumOptions &)options resolve:(nonnull RCTPromiseResolveBlock)resolve reject:(nonnull RCTPromiseRejectBlock)reject {
NSLog(@"🎵 [MusicLibrary.mm] getAlbumsAsync called from Objective-C");

// Extract values from Objective-C types with proper casting
int first = (int)options.first();
NSString *after = options.after();
NSArray *sortBy = (NSArray *)options.sortBy();

// Call Swift function directly
NSDictionary *result = [musicLibrary getAlbumsAsyncWithFirst:first after:after sortBy:sortBy];

NSLog(@"🎵 [MusicLibrary.mm] getAlbumsAsync resolved with result: %@", result);
resolve(result);
}

- (void)getAlbumsByArtistAsync:(nonnull NSString *)artistId resolve:(nonnull RCTPromiseResolveBlock)resolve reject:(nonnull RCTPromiseRejectBlock)reject {
- (void)getAlbumsByArtistAsync:(nonnull NSString *)artistId resolve:(nonnull RCTPromiseResolveBlock)resolve reject:(nonnull RCTPromiseRejectBlock)reject {
NSLog(@"🎵 [MusicLibrary.mm] getAlbumsByArtistAsync called with artistId: %@", artistId);

NSArray *result = [musicLibrary getAlbumsByArtistAsync:artistId];

NSLog(@"🎵 [MusicLibrary.mm] getAlbumsByArtistAsync resolved with result: %@", result);
resolve(result);
}

- (void)getArtistsAsync:(JS::NativeMusicLibrary::InternalArtistOptions &)options resolve:(nonnull RCTPromiseResolveBlock)resolve reject:(nonnull RCTPromiseRejectBlock)reject {
- (void)getArtistsAsync:(JS::NativeMusicLibrary::InternalArtistOptions &)options resolve:(nonnull RCTPromiseResolveBlock)resolve reject:(nonnull RCTPromiseRejectBlock)reject {
NSLog(@"🎵 [MusicLibrary.mm] getArtistsAsync called from Objective-C");

// Extract values from Objective-C types with proper casting
int first = (int)options.first();
NSString *after = options.after();
NSArray *sortBy = (NSArray *)options.sortBy();

// Call Swift function directly
NSDictionary *result = [musicLibrary getArtistsAsyncWithFirst:first after:after sortBy:sortBy];

NSLog(@"🎵 [MusicLibrary.mm] getArtistsAsync resolved with result: %@", result);
resolve(result);
}

+ (NSString *)moduleName {
+ (NSString *)moduleName {
return @"MusicLibraryImpl";
}

Expand Down
61 changes: 30 additions & 31 deletions ios/MusicLibraryImpl.swift
Original file line number Diff line number Diff line change
Expand Up @@ -5,90 +5,89 @@
//

import Foundation
import React

@objc(MusicLibraryImpl)
public class MusicLibraryImpl: NSObject {

@objc
public func getTracksAsync(options: TrackOptions, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
NSLog("🎵 [MusicLibrary] getTracksAsync called with options: %@", options)

@objc public class MusicLibraryImpl: NSObject {

@objc public func getTracksAsync(first: Int, after: String?, sortBy: [String], directory: String?) -> [String: Any] {
NSLog("🎵 [MusicLibrary] getTracksAsync called with first: %d, after: %@, sortBy: %@, directory: %@", first, after ?? "nil", sortBy, directory ?? "nil")

do {
let trackOptions = TrackOptions(after: after, first: first, sortBy: sortBy, directory: directory)
NSLog("🎵 [MusicLibrary] getTracksAsync trackOptions: %@", trackOptions)
let result = GetTracksQuery.getTracks(options: trackOptions)
let getTracks = GetTracks(options: options)
let result = getTracks.execute()
let resultDict = result.toDictionary()

NSLog("🎵 [MusicLibrary] getTracksAsync returning: %@", resultDict)
return resultDict
resolve(resultDict)
} catch {
NSLog("🎵 [MusicLibrary] getTracksAsync error: %@", error.localizedDescription)
return DataConverter.createErrorDictionary(
code: "QUERY_ERROR",
message: "Failed to query tracks: \(error.localizedDescription)"
)
reject("QUERY_ERROR", "Failed to query tracks: \(error.localizedDescription)", error)
}
}

@objc public func getTrackMetadataAsync(_ trackId: String) -> [String: Any] {
NSLog("🎵 [MusicLibrary] getTrackMetadataAsync called with trackId: %@", trackId)

if let metadata = GetTrackMetadataQuery.getTrackMetadata(trackId: trackId) {
let resultDict = metadata.toDictionary()
NSLog("🎵 [MusicLibrary] getTrackMetadataAsync returning: %@", resultDict)
return resultDict
} else {
NSLog("🎵 [MusicLibrary] getTrackMetadataAsync: track not found")
return DataConverter.createErrorDictionary(
code: "TRACK_NOT_FOUND",
code: "TRACK_NOT_FOUND",
message: "Track with id \(trackId) not found"
)
}
}

@objc public func getTracksByAlbumAsync(_ albumId: String) -> [[String: Any]] {
NSLog("🎵 [MusicLibrary] getTracksByAlbumAsync called with albumId: %@", albumId)

let tracks = GetTracksByAlbumQuery.getTracksByAlbum(albumId: albumId)
let result = tracks.map { $0.toDictionary() }

NSLog("🎵 [MusicLibrary] getTracksByAlbumAsync returning: %@", result)
return result
}

@objc public func getTracksByArtistAsync(_ artistId: String, first: Int, after: String?, sortBy: [String], directory: String?) -> [String: Any] {
NSLog("🎵 [MusicLibrary] getTracksByArtistAsync called with artistId: %@, first: %d, after: %@, sortBy: %@, directory: %@", artistId, first, after ?? "nil", sortBy, directory ?? "nil")

let result = PaginatedResult<Track>(items: [], hasNextPage: false)
let resultDict = result.toDictionary()

NSLog("🎵 [MusicLibrary] getTracksByArtistAsync returning: %@", resultDict)
return resultDict
}

@objc public func getAlbumsAsync(first: Int, after: String?, sortBy: [String]) -> [String: Any] {
NSLog("🎵 [MusicLibrary] getAlbumsAsync called with first: %d, after: %@, sortBy: %@", first, after ?? "nil", sortBy)

let result = PaginatedResult<Album>(items: [], hasNextPage: false)
let resultDict = result.toDictionary()

NSLog("🎵 [MusicLibrary] getAlbumsAsync returning: %@", resultDict)
return resultDict
}

@objc public func getAlbumsByArtistAsync(_ artistId: String) -> [[String: Any]] {
NSLog("🎵 [MusicLibrary] getAlbumsByArtistAsync called with artistId: %@", artistId)

let result: [[String: Any]] = []

NSLog("🎵 [MusicLibrary] getAlbumsByArtistAsync returning: %@", result)
return result
}

@objc public func getArtistsAsync(first: Int, after: String?, sortBy: [String]) -> [String: Any] {
NSLog("🎵 [MusicLibrary] getArtistsAsync called with first: %d, after: %@, sortBy: %@", first, after ?? "nil", sortBy)

let result = PaginatedResult<Artist>(items: [], hasNextPage: false)
let resultDict = result.toDictionary()

NSLog("🎵 [MusicLibrary] getArtistsAsync returning: %@", resultDict)
return resultDict
}
Expand Down
20 changes: 11 additions & 9 deletions ios/models/AssetsOptions.swift
Original file line number Diff line number Diff line change
Expand Up @@ -8,24 +8,26 @@ import Foundation

// MARK: - Options Models

@objc(TrackOptions)
public class TrackOptions: NSObject {
public let after: String?
public let first: Int
public let sortBy: [String]
public let directory: String?


@objc
public init(after: String? = nil, first: Int = 20, sortBy: [String] = [], directory: String? = nil) {
self.after = after
self.first = first
self.sortBy = sortBy
self.directory = directory
super.init()
}

public override var description: String {
return "TrackOptions(after: \(after ?? "nil"), first: \(first), sortBy: \(sortBy), directory: \(directory ?? "nil"))"
}

public func toDictionary() -> [String: Any] {
return [
"after": after ?? NSNull(),
Expand All @@ -40,18 +42,18 @@ public class AlbumOptions: NSObject {
public let after: String?
public let first: Int
public let sortBy: [String]

public init(after: String? = nil, first: Int = 20, sortBy: [String] = []) {
self.after = after
self.first = first
self.sortBy = sortBy
super.init()
}

public override var description: String {
return "AlbumOptions(after: \(after ?? "nil"), first: \(first), sortBy: \(sortBy))"
}

public func toDictionary() -> [String: Any] {
return [
"after": after ?? NSNull(),
Expand All @@ -65,18 +67,18 @@ public class ArtistOptions: NSObject {
public let after: String?
public let first: Int
public let sortBy: [String]

public init(after: String? = nil, first: Int = 20, sortBy: [String] = []) {
self.after = after
self.first = first
self.sortBy = sortBy
super.init()
}

public override var description: String {
return "ArtistOptions(after: \(after ?? "nil"), first: \(first), sortBy: \(sortBy))"
}

public func toDictionary() -> [String: Any] {
return [
"after": after ?? NSNull(),
Expand Down
Loading
Loading