Skip to content

Commit ea712d9

Browse files
committed
feat: add track lookup by ISRC
Deezer's API supports GET /track/isrc:{isrc} as an alternative to GET /track/{trackId}, letting callers look up a track directly by its ISRC (International Standard Recording Code) instead of Deezer's own numeric ID. This is the standard way cross-platform music tools match the same recording across services that use different internal IDs. Adds TrackService.getTrackByIsrc and TrackRequestFactory.getTrackByIsrc, reusing the existing unauthenticated SimpleDeezerRequest wrapper (this endpoint needs no access token, same as getTrack). Includes unit test, WireMock-backed integration test, and a bruno-collection request for manual testing, following the project's existing conventions.
1 parent 01bbf62 commit ea712d9

6 files changed

Lines changed: 63 additions & 0 deletions

File tree

bruno-collection/opencollection.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ request:
3333
value: "605632582"
3434
- name: track-id
3535
value: "541999"
36+
- name: track-isrc
37+
value: "USRC18207933"
3638
bundled: false
3739
extensions:
3840
ignore:
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
info:
2+
name: get-track-by-isrc
3+
type: http
4+
seq: 3
5+
6+
http:
7+
method: GET
8+
url: "{{api-host}}/track/isrc:{{track-isrc}}"
9+
auth: inherit
10+
11+
settings:
12+
encodeUrl: true
13+
timeout: 0
14+
followRedirects: true
15+
maxRedirects: 5

src/integrationTest/java/io/github/yvasyliev/dz4j/TrackIT.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,20 @@ void shouldReturnTrack(long trackId, String file) throws IOException {
4545
assertEquals(expected, deezerClient.track().getTrack(trackId));
4646
}
4747

48+
@Test
49+
void shouldReturnTrackByIsrc() throws IOException {
50+
var isrc = "USRC18207933";
51+
var body = read("/response/track/get-track-maneater.json");
52+
var expected = MAPPER.readValue(body, Track.class);
53+
54+
stubFor(get(urlPathTemplate("/track/isrc:{isrc}"))
55+
.withPathParam("isrc", equalTo(isrc))
56+
.willReturn(okJson(body))
57+
);
58+
59+
assertEquals(expected, deezerClient.track().getTrackByIsrc(isrc));
60+
}
61+
4862
@Test
4963
void shouldUpdateTrack() throws IOException {
5064
var trackId = 541999L;

src/main/java/io/github/yvasyliev/dz4j/factory/TrackRequestFactory.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import io.github.yvasyliev.dz4j.model.Track;
55
import io.github.yvasyliev.dz4j.request.DeezerRequest;
66
import io.github.yvasyliev.dz4j.request.IdDeezerRequest;
7+
import io.github.yvasyliev.dz4j.request.SimpleDeezerRequest;
78
import io.github.yvasyliev.dz4j.request.UpdateTrackDeezerRequest;
89
import io.github.yvasyliev.dz4j.service.TrackService;
910
import lombok.RequiredArgsConstructor;
@@ -26,6 +27,16 @@ public DeezerRequest<Track> getTrack(long trackId) {
2627
return new IdDeezerRequest<>(trackId, trackService::getTrack);
2728
}
2829

30+
/**
31+
* Creates a request to get a track by its ISRC (International Standard Recording Code).
32+
*
33+
* @param isrc track ISRC
34+
* @return request to get a track
35+
*/
36+
public DeezerRequest<Track> getTrackByIsrc(String isrc) {
37+
return new SimpleDeezerRequest<>(() -> trackService.getTrackByIsrc(isrc));
38+
}
39+
2940
/**
3041
* Creates a request to update a track.
3142
*

src/main/java/io/github/yvasyliev/dz4j/service/TrackService.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,15 @@ public interface TrackService {
2424
@RequestLine("GET /track/{trackId}")
2525
CompletableFuture<Track> getTrack(@Param("trackId") long trackId);
2626

27+
/**
28+
* Returns a track by its ISRC (International Standard Recording Code).
29+
*
30+
* @param isrc the track's ISRC
31+
* @return a track
32+
*/
33+
@RequestLine("GET /track/isrc:{isrc}")
34+
CompletableFuture<Track> getTrackByIsrc(@Param("isrc") String isrc);
35+
2736
/**
2837
* Updates a user's track information.
2938
*

src/test/java/io/github/yvasyliev/dz4j/factory/TrackRequestFactoryTest.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,18 @@ void testGetTrack() {
3434
assertEquals(expected, actual);
3535
}
3636

37+
@Test
38+
void testGetTrackByIsrc() {
39+
var isrc = "USRC18207933";
40+
var expected = Track.builder().isrc(isrc).build();
41+
42+
when(trackService.getTrackByIsrc(isrc)).thenReturn(CompletableFuture.completedFuture(expected));
43+
44+
var actual = trackRequestFactory.getTrackByIsrc(isrc).execute();
45+
46+
assertEquals(expected, actual);
47+
}
48+
3749
@Test
3850
void testUpdateTrack() {
3951
var trackId = 123L;

0 commit comments

Comments
 (0)