Skip to content

Commit 9b7abcb

Browse files
committed
fix: cant get tracks from directory
1 parent 92a96d6 commit 9b7abcb

File tree

2 files changed

+33
-15
lines changed

2 files changed

+33
-15
lines changed

android/src/main/java/com/musiclibrary/tracks/GetTracksQuery.kt

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
package com.musiclibrary.tracks
22

33
import android.content.ContentResolver
4-
import android.content.ContentUris
54
import android.os.Build
65
import android.provider.MediaStore
76
import android.net.Uri
7+
import android.provider.DocumentsContract
88
import com.musiclibrary.models.*
9+
import androidx.core.net.toUri
910

1011
object GetTracksQuery {
1112

@@ -85,7 +86,7 @@ object GetTracksQuery {
8586
val fileSize = c.getLong(sizeColumn)
8687
val genre = c.getString(genreColumn) ?: ""
8788
val albumId = c.getLong(albumIdColumn)
88-
val artworkUri: Uri = Uri.parse("content://media/external/audio/media/${id}/albumart")
89+
val artworkUri: Uri = "content://media/external/audio/media/${id}/albumart".toUri()
8990

9091
// Skip invalid data
9192
if (data.isEmpty()) {
@@ -148,12 +149,34 @@ object GetTracksQuery {
148149
val args = mutableListOf<String>()
149150

150151
if (!options.directory.isNullOrEmpty()) {
151-
args.add("${options.directory}%")
152+
val dir = if (options.directory.startsWith("content://")) {
153+
uriToFullPath(options.directory.toUri())
154+
} else {
155+
options.directory
156+
}
157+
158+
if (!dir.isNullOrEmpty()) {
159+
args.add("$dir%")
160+
}
152161
}
153162

154163
return if (args.isEmpty()) null else args.toTypedArray()
155164
}
156165

166+
private fun uriToFullPath(treeUri: Uri): String? {
167+
val docId = DocumentsContract.getTreeDocumentId(treeUri) // "primary:Music/abc"
168+
val parts = docId.split(":")
169+
if (parts.size < 2) return null
170+
171+
val type = parts[0]
172+
val relativePath = parts[1]
173+
174+
return when (type) {
175+
"primary" -> "/storage/emulated/0/$relativePath"
176+
else -> "/storage/$type/$relativePath"
177+
}
178+
}
179+
157180
private fun buildSortOrder(sortBy: List<String>): String {
158181
if (sortBy.isEmpty()) {
159182
return "${MediaStore.Audio.Media.DATE_ADDED} DESC"

example/src/TrackList.tsx

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import {
99
} from 'react-native';
1010
import { getTracksAsync } from '@nodefinity/react-native-music-library';
1111
import { useState } from 'react';
12-
import type { Track } from '../../src/NativeMusicLibrary';
12+
import type { AssetsOptions, Track } from '../../src/NativeMusicLibrary';
1313
import { usePermission } from './usePermission';
1414
import { pickDirectory } from '@react-native-documents/picker';
1515

@@ -49,14 +49,15 @@ export default function TrackList() {
4949
}
5050
};
5151

52-
const loadAllTracks = async () => {
52+
const loadAllTracks = async (options: AssetsOptions = {}) => {
5353
let allTracks: Track[] = [];
5454
let hasMore = true;
5555
let cursor;
5656

5757
while (hasMore) {
5858
const result = await getTracksAsync({
5959
first: 100,
60+
...options,
6061
after: cursor,
6162
});
6263

@@ -95,19 +96,13 @@ export default function TrackList() {
9596
requestLongTermAccess: false,
9697
});
9798

98-
console.log('uri', uri);
99-
10099
if (!uri) return;
101100

102-
const results = await getTracksAsync({
103-
first: 100,
104-
directory: uri,
105-
});
101+
const results = await loadAllTracks({ directory: uri });
106102

107-
Alert.alert(
108-
'Success',
109-
`Picked ${results.items.length} tracks from:\n${uri}`
110-
);
103+
setTracks(results);
104+
105+
Alert.alert('Success', `Picked ${results.length} tracks from:\n${uri}`);
111106
} catch (err) {
112107
Alert.alert('Error', err as string);
113108
} finally {

0 commit comments

Comments
 (0)