Skip to content

Commit 69f77bc

Browse files
authored
feat: google music release importer (#1474)
The import function for Google music already currently import of playlist only. The changes will add support for music releases if they exist in the request. Tested via demo-server locally. Exporter added earlier - #1469
1 parent db002d2 commit 69f77bc

3 files changed

Lines changed: 123 additions & 1 deletion

File tree

extensions/data-transfer/portability-data-transfer-google/src/main/java/org/datatransferproject/datatransfer/google/music/GoogleMusicHttpApi.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@
5454
import org.datatransferproject.datatransfer.google.musicModels.BatchPlaylistItemResponse;
5555
import org.datatransferproject.datatransfer.google.musicModels.ExportReleaseResponse;
5656
import org.datatransferproject.datatransfer.google.musicModels.GooglePlaylist;
57+
import org.datatransferproject.datatransfer.google.musicModels.GoogleRelease;
5758
import org.datatransferproject.datatransfer.google.musicModels.ImportPlaylistRequest;
5859
import org.datatransferproject.datatransfer.google.musicModels.PlaylistItemExportResponse;
5960
import org.datatransferproject.datatransfer.google.musicModels.PlaylistExportResponse;
@@ -167,6 +168,17 @@ BatchPlaylistItemResponse importPlaylistItems(BatchPlaylistItemRequest playlistI
167168
BatchPlaylistItemResponse.class);
168169
}
169170

171+
GoogleRelease createRelease(GoogleRelease googleRelease)
172+
throws IOException, InvalidTokenException, PermissionDeniedException {
173+
Map<String, Object> googleReleaseMap = createJsonMap(googleRelease);
174+
Map<String, String> params = new LinkedHashMap<>();
175+
HttpContent content = new JsonHttpContent(jsonFactory, googleReleaseMap);
176+
177+
return makePostRequest(RELEASE_BASE_URL, Optional.of(params),
178+
content,
179+
GoogleRelease.class);
180+
}
181+
170182
private <T> T makeGetRequest(
171183
String baseUrl, Optional<Map<String, String>> parameters, Class<T> clazz)
172184
throws IOException, InvalidTokenException, PermissionDeniedException {

extensions/data-transfer/portability-data-transfer-google/src/main/java/org/datatransferproject/datatransfer/google/music/GoogleMusicImporter.java

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@
5353
import org.datatransferproject.types.common.models.music.MusicGroup;
5454
import org.datatransferproject.types.common.models.music.MusicPlaylist;
5555
import org.datatransferproject.types.common.models.music.MusicPlaylistItem;
56+
import org.datatransferproject.types.common.models.music.MusicRelease;
5657
import org.datatransferproject.types.transfer.auth.TokensAndUrlAuthData;
5758

5859
public class GoogleMusicImporter implements Importer<TokensAndUrlAuthData, MusicContainerResource> {
@@ -117,7 +118,19 @@ public ImportResult importItem(
117118

118119
// TODO: create tracks
119120

120-
// TODO: create releases
121+
for (MusicRelease release: data.getReleases()){
122+
monitor.debug(
123+
() ->
124+
String.format(
125+
"%s: Google Music importing release item: [release title: %s, release icpn: %s]",
126+
jobId,
127+
release.getTitle(),
128+
release.getIcpnCode()));
129+
idempotentImportExecutor.executeAndSwallowIOExceptions(
130+
release.getTitle(),
131+
release.getTitle(),
132+
() -> importSingleRelease(jobId, authData, release));
133+
}
121134

122135
return ImportResult.OK;
123136
}
@@ -136,6 +149,20 @@ String importSinglePlaylist(
136149
return inputPlaylist.getId();
137150
}
138151

152+
@VisibleForTesting
153+
String importSingleRelease(
154+
UUID jobId, TokensAndUrlAuthData authData, MusicRelease musicRelease)
155+
throws IOException, CopyException {
156+
// Set up Release
157+
GoogleRelease googleRelease = new GoogleRelease();
158+
googleRelease.setReleaseTitle(musicRelease.getTitle());
159+
googleRelease.setIcpn(musicRelease.getIcpnCode());
160+
161+
getOrCreateMusicInterface(jobId, authData)
162+
.createRelease(googleRelease);
163+
return musicRelease.getTitle();
164+
}
165+
139166
void importPlaylistItems(
140167
List<MusicPlaylistItem> playlistItems,
141168
IdempotentImportExecutor executor,

extensions/data-transfer/portability-data-transfer-google/src/test/java/org/datatransferproject/datatransfer/google/music/GoogleMusicImporterTest.java

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import static org.mockito.ArgumentMatchers.any;
2323
import static org.mockito.ArgumentMatchers.eq;
2424
import static org.mockito.Mockito.mock;
25+
import static org.mockito.Mockito.times;
2526
import static org.mockito.Mockito.verify;
2627
import static org.mockito.Mockito.when;
2728

@@ -30,6 +31,7 @@
3031
import com.google.common.collect.Lists;
3132
import com.google.protobuf.util.Durations;
3233
import com.google.rpc.Code;
34+
import java.io.IOException;
3335
import java.util.UUID;
3436
import org.datatransferproject.api.launcher.Monitor;
3537
import org.datatransferproject.datatransfer.google.common.GoogleCredentialFactory;
@@ -284,6 +286,87 @@ public void importPlaylistItemsSkippableFauilre() throws Exception {
284286
assertThat(executor.getErrors()).isEmpty();
285287
}
286288

289+
@Test
290+
void importSingleRelease() throws Exception {
291+
// Set up
292+
MusicRelease release = new MusicRelease("icpndevtest", "test-release", null);
293+
ImmutableList<MusicRelease> releases = ImmutableList.of(release);
294+
MusicContainerResource data = new MusicContainerResource(null, null, null, releases);
295+
296+
GoogleRelease googleRelease = new GoogleRelease();
297+
googleRelease.setIcpn("icpndevtest");
298+
googleRelease.setReleaseTitle("test-release");
299+
when(googleMusicHttpApi.createRelease(any(GoogleRelease.class)))
300+
.thenReturn(googleRelease);
301+
302+
// Run test
303+
ImportResult importResult = googleMusicImporter.importItem(uuid, executor, null, data);
304+
305+
// Check results
306+
ArgumentCaptor<GoogleRelease> releaseArgumentCaptor =
307+
ArgumentCaptor.forClass(GoogleRelease.class);
308+
verify(googleMusicHttpApi)
309+
.createRelease(releaseArgumentCaptor.capture());
310+
assertEquals("test-release", releaseArgumentCaptor.getValue().getTitle());
311+
assertTrue(executor.isKeyCached("test-release"));
312+
assertEquals(importResult, ImportResult.OK);
313+
}
314+
315+
@Test
316+
void importMultipleReleases() throws Exception {
317+
// Set up
318+
MusicRelease release1 = new MusicRelease("icpndevtest1", "test-release1", null);
319+
MusicRelease release2 = new MusicRelease("icpndevtest2", "test-release2", null);
320+
MusicRelease release3 = new MusicRelease("icpndevtest3", "test-release3", null);
321+
322+
ImmutableList<MusicRelease> releases = ImmutableList.of(release1, release2, release3);
323+
MusicContainerResource data = new MusicContainerResource(null, null, null, releases);
324+
325+
GoogleRelease googleRelease = new GoogleRelease();
326+
googleRelease.setIcpn("icpndevtest");
327+
googleRelease.setReleaseTitle("test-release");
328+
when(googleMusicHttpApi.createRelease(any(GoogleRelease.class)))
329+
.thenReturn(googleRelease);
330+
331+
// Run test
332+
ImportResult importResult = googleMusicImporter.importItem(uuid, executor, null, data);
333+
334+
// Check results
335+
verify(googleMusicHttpApi,times(3))
336+
.createRelease(any(GoogleRelease.class));
337+
assertTrue(executor.isKeyCached("test-release3"));
338+
assertEquals(importResult, ImportResult.OK);
339+
}
340+
341+
@Test
342+
void importMultipleReleasesWithOneFailure() throws Exception {
343+
// Set up
344+
MusicRelease release1 = new MusicRelease("icpndevtest1", "test-release1", null);
345+
MusicRelease release2 = new MusicRelease("icpndevtest2", "test-release2", null);
346+
MusicRelease release3 = new MusicRelease("icpndevtest3", "test-release3", null);
347+
348+
ImmutableList<MusicRelease> releases = ImmutableList.of(release1, release2, release3);
349+
MusicContainerResource data = new MusicContainerResource(null, null, null, releases);
350+
351+
GoogleRelease googleRelease = new GoogleRelease();
352+
googleRelease.setIcpn("icpndevtest");
353+
googleRelease.setReleaseTitle("test-release");
354+
when(googleMusicHttpApi.createRelease(any(GoogleRelease.class)))
355+
.thenReturn(googleRelease)
356+
.thenThrow(new IOException("Not found"))
357+
.thenReturn(googleRelease);
358+
359+
// Run test
360+
ImportResult importResult = googleMusicImporter.importItem(uuid, executor, null, data);
361+
362+
// Check results
363+
verify(googleMusicHttpApi,times(3))
364+
.createRelease(any(GoogleRelease.class));
365+
assertTrue(executor.isKeyCached("test-release3"));
366+
assertEquals(1, executor.getErrors().size());
367+
assertEquals(importResult, ImportResult.OK);
368+
}
369+
287370
private void importPlaylistSetUp(String playlistId, String playlistTitle)
288371
throws Exception {
289372
MusicPlaylist playlist = new MusicPlaylist(playlistId, playlistTitle, null, null, null);

0 commit comments

Comments
 (0)