Skip to content

Commit 0fd4f45

Browse files
Merge pull request #47 from EatSleepProgramRepeat/39-integrate-a-clicksearch-method
39-integrate-a-clicksearch-method
2 parents 4937461 + 0a8af15 commit 0fd4f45

14 files changed

Lines changed: 792 additions & 90 deletions

.idea/misc.xml

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/main/java/com/CDPrintable/MusicBrainzResources/MusicBrainzArtist.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212

1313
import java.util.Locale;
1414

15-
public class MusicBrainzArtist {
15+
public class MusicBrainzArtist extends MusicBrainzDataObject {
1616
private String name;
1717
private String dateOrganized; // May only be present for groups
1818
private String birthDate; // May only be present for people

src/main/java/com/CDPrintable/MusicBrainzResources/MusicBrainzCDStub.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010

1111
package com.CDPrintable.MusicBrainzResources;
1212

13-
public class MusicBrainzCDStub {
13+
public class MusicBrainzCDStub extends MusicBrainzDataObject {
1414
private String id;
1515
private String title;
1616
private String[] artists;
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
/*
2+
* CDPrintable: A program that prints labels with track listings for your CD cases.
3+
* Copyright (C) 2025 Alexander McLean
4+
*
5+
* This source code is licensed under the GNU General Public License v3.0
6+
* found in the LICENSE file in the root directory of this source tree.
7+
*
8+
* This is an abstract data class for MusicBrainz data objects.
9+
*/
10+
11+
package com.CDPrintable.MusicBrainzResources;
12+
13+
public abstract class MusicBrainzDataObject {
14+
private String id;
15+
16+
public String getId() {
17+
return id;
18+
}
19+
20+
public void setId(String id) {
21+
this.id = id;
22+
}
23+
}

src/main/java/com/CDPrintable/MusicBrainzResources/MusicBrainzJSONReader.java

Lines changed: 71 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
package com.CDPrintable.MusicBrainzResources;
1212

1313
import com.CDPrintable.Constants;
14+
import com.CDPrintable.ProgramWindow;
1415
import com.google.gson.*;
1516

1617
import java.util.ArrayList;
@@ -27,7 +28,7 @@ public class MusicBrainzJSONReader {
2728

2829
/*
2930
* Creates a MusicBrainzJSONReader from a JSON string.
30-
* @param json The JSON string.
31+
* @param JSON The JSON string.
3132
* @throws IllegalArgumentException If the JSON is invalid.
3233
*/
3334
public MusicBrainzJSONReader(String json) throws IllegalArgumentException {
@@ -240,6 +241,49 @@ public MusicBrainzArtist[] getArtists() {
240241
}, new MusicBrainzArtist[0]);
241242
}
242243

244+
/**
245+
* Gets track listing from the JSON from a discID.
246+
*/
247+
public MusicBrainzTrack[] getTracks() {
248+
return parseJsonArray("tracks", jsonObject -> {
249+
String title = jsonHasAndIsNotNull(jsonObject, "title") ? jsonObject.get("title").getAsString() : null;
250+
String artist = jsonHasAndIsNotNull(jsonObject, "artist") ? jsonObject.get("artist").getAsString() : null;
251+
int length = jsonHasAndIsNotNull(jsonObject, "length") ? jsonObject.get("length").getAsInt() : -1;
252+
253+
return new MusicBrainzTrack(title, artist, length);
254+
}, new MusicBrainzTrack[0]);
255+
}
256+
257+
/**
258+
* Gets track listing from a release.
259+
* @return An array of MusicBrainzTrack objects.
260+
*/
261+
public MusicBrainzTrack[] getReleaseTracks() {
262+
List<MusicBrainzTrack> trackList = new ArrayList<>();
263+
264+
JsonArray mediaArray = json.getAsJsonArray("media");
265+
for (JsonElement mediaElement : mediaArray) {
266+
JsonObject mediaObject = mediaElement.getAsJsonObject(); // Cast each element to JsonObject
267+
JsonArray trackArray = mediaObject.getAsJsonArray("tracks");
268+
for (JsonElement trackElement : trackArray) {
269+
JsonObject trackObject = trackElement.getAsJsonObject();
270+
String title = jsonHasAndIsNotNull(trackObject, "title") ? trackObject.get("title").getAsString() : null;
271+
int length = jsonHasAndIsNotNull(trackObject, "length") ? trackObject.get("length").getAsInt() : -1;
272+
int trackNumber = -1;
273+
274+
if (trackObject.has("number")) {
275+
trackNumber = trackObject.get("number").getAsInt();
276+
} else if (trackObject.has("position")) {
277+
trackNumber = trackObject.get("position").getAsInt();
278+
}
279+
280+
trackList.add(new MusicBrainzTrack(title, null, length, trackNumber));
281+
}
282+
}
283+
284+
return trackList.toArray(new MusicBrainzTrack[0]);
285+
}
286+
243287
/**
244288
* Creates a table model from an array of items.
245289
* @param items The array of items. Usually a MusicBrainzRelease, MusicBrainzCDStub, etc.
@@ -266,15 +310,15 @@ private DefaultTableModel createTableModel(Object[] items, String[] columnNames,
266310
* @return The table model.
267311
*/
268312
public DefaultTableModel getReleasesAsTableModel(MusicBrainzRelease[] releaseArray) {
269-
String[] columnNames = {"Release Name", "Artist", "Track Count", "Date", ""};
313+
String[] columnNames = {"Release Name", "Artist", "Track Count", "Date"};
270314
return createTableModel(releaseArray, columnNames, item -> {
271315
MusicBrainzRelease release = (MusicBrainzRelease) item;
316+
ProgramWindow.addId(getOrDefault(release.getId()));
272317
return new String[]{
273318
getOrDefault(release.getTitle()),
274319
getOrDefault(release.getArtistsAsString()),
275320
getOrDefault(release.getTrackCount() != -1 ? String.valueOf(release.getTrackCount()) : null),
276-
getOrDefault(release.getDate()),
277-
""
321+
getOrDefault(release.getDate())
278322
};
279323
});
280324
}
@@ -285,14 +329,14 @@ public DefaultTableModel getReleasesAsTableModel(MusicBrainzRelease[] releaseArr
285329
* @return The table model.
286330
*/
287331
public DefaultTableModel getCDStubsAsTableModel(MusicBrainzCDStub[] cdStubArray) {
288-
String[] columnNames = {"Disc Name", "Artist", "Track Count", ""};
332+
String[] columnNames = {"Disc Name", "Artist", "Track Count"};
289333
return createTableModel(cdStubArray, columnNames, item -> {
290334
MusicBrainzCDStub cdStub = (MusicBrainzCDStub) item;
335+
ProgramWindow.addId(getOrDefault(cdStub.getId()));
291336
return new String[]{
292337
getOrDefault(cdStub.getTitle()),
293338
getOrDefault(cdStub.getArtistsAsString()),
294-
getOrDefault(String.valueOf(cdStub.getTrackCount())),
295-
""
339+
getOrDefault(String.valueOf(cdStub.getTrackCount()))
296340
};
297341
});
298342
}
@@ -303,9 +347,10 @@ public DefaultTableModel getCDStubsAsTableModel(MusicBrainzCDStub[] cdStubArray)
303347
* @return The table model.
304348
*/
305349
public DefaultTableModel getArtistsAsTableModel(MusicBrainzArtist[] artistArray) {
306-
String[] columnNames = {"Name", "Date Organised", "Birthdate", "Sort Name", "Gender", "Type", "Disambiguation", "Life Span", "Country", ""};
350+
String[] columnNames = {"Artist Name", "Date Organised", "Birthdate", "Sort Name", "Gender", "Type", "Disambiguation", "Life Span", "Country"};
307351
return createTableModel(artistArray, columnNames, item -> {
308352
MusicBrainzArtist artist = (MusicBrainzArtist) item;
353+
ProgramWindow.addId(getOrDefault(artist.getId()));
309354
return new String[] {
310355
getOrDefault(artist.getName()),
311356
getOrDefault(artist.getDateOrganized()),
@@ -315,12 +360,28 @@ public DefaultTableModel getArtistsAsTableModel(MusicBrainzArtist[] artistArray)
315360
getOrDefault(artist.getType()),
316361
getOrDefault(artist.getDisambiguation()),
317362
getOrDefault(artist.getLifeSpan()),
318-
getOrDefault(artist.getCountry()),
319-
""
363+
getOrDefault(artist.getCountry())
320364
};
321365
});
322366
}
323367

368+
/**
369+
* Gets the tracks as a table model.
370+
* @param trackArray The array of tracks.
371+
*/
372+
public DefaultTableModel getTracksAsTableModel(MusicBrainzTrack[] trackArray) {
373+
String[] columnNames = {"#", "Track Name", "Artist", "Length"};
374+
return createTableModel(trackArray, columnNames, item -> {
375+
MusicBrainzTrack track = (MusicBrainzTrack) item;
376+
return new String[]{
377+
getOrDefault(Integer.toString(track.getTrackNumber())),
378+
getOrDefault(track.getTitle()),
379+
getOrDefault(track.getArtist()),
380+
getOrDefault(track.getLength())
381+
};
382+
});
383+
}
384+
324385
/**
325386
* Functional interface for extracting data from an item.
326387
*/

src/main/java/com/CDPrintable/MusicBrainzResources/MusicBrainzRelease.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010

1111
package com.CDPrintable.MusicBrainzResources;
1212

13-
public class MusicBrainzRelease {
13+
public class MusicBrainzRelease extends MusicBrainzDataObject {
1414
private String title;
1515
private String[] artists;
1616
private String date;

src/main/java/com/CDPrintable/MusicBrainzResources/MusicBrainzRequest.java

Lines changed: 39 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -41,11 +41,7 @@ public MusicBrainzRequest(String queryType, String query, String otherParams) {
4141
this.otherParams = otherParams;
4242
}
4343

44-
/**
45-
* Builds the request URL for the Musicbrainz API.
46-
* @return The request URL.
47-
*/
48-
public String buildRequestURL() {
44+
private StringBuilder startRequestBuild() {
4945
StringBuilder url = new StringBuilder("https://musicbrainz.org/ws/2/");
5046

5147
switch (queryType) {
@@ -64,17 +60,51 @@ public String buildRequestURL() {
6460
default:
6561
throw new IllegalArgumentException("Invalid query type: " + queryType);
6662
}
67-
url.append("?query=").append(query);
68-
url.append("&fmt=json");
63+
64+
return url;
65+
}
66+
67+
private String endRequestBuild(StringBuilder url) {
68+
if (!url.toString().contains("?")) {
69+
url.append("?fmt=json");
70+
} else {
71+
url.append("&fmt=json");
72+
}
73+
6974
if (otherParams != null) {
7075
url.append(otherParams);
7176
}
7277

73-
return url.toString()
74-
.replace(" ", "%20")
78+
return replaceAllIllegalChars(url.toString());
79+
}
80+
81+
private String replaceAllIllegalChars(String str) {
82+
return str.replace(" ", "%20")
7583
.replace("\"", "%22");
7684
}
7785

86+
/**
87+
* Builds the request URL for the Musicbrainz API.
88+
* @return The request URL.
89+
*/
90+
public String buildRequestURL() {
91+
StringBuilder url = startRequestBuild();
92+
url.append("?query=").append(query);
93+
94+
return endRequestBuild(url);
95+
}
96+
97+
/**
98+
* Builds the request URL for the Musicbrainz API to get a track list.
99+
* @return The request URL.
100+
*/
101+
public String buildTrackListURL() {
102+
StringBuilder url = startRequestBuild();
103+
url.append("/").append(query).append("?inc=recordings");
104+
105+
return endRequestBuild(url);
106+
}
107+
78108
/**
79109
* Gets the query string.
80110
* @return The query string.
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
/*
2+
* CDPrintable: A program that prints labels with track listings for your CD cases.
3+
* Copyright (C) 2025 Alexander McLean
4+
*
5+
* This source code is licensed under the GNU General Public License v3.0
6+
* found in the LICENSE file in the root directory of this source tree.
7+
*
8+
* This class holds data for a track from the MusicBrainz API.
9+
*/
10+
11+
package com.CDPrintable.MusicBrainzResources;
12+
13+
public class MusicBrainzTrack extends MusicBrainzDataObject {
14+
private String title;
15+
private String artist;
16+
private int length;
17+
private int trackNumber;
18+
19+
public MusicBrainzTrack(String title, String artist, int length) {
20+
this.title = title;
21+
this.artist = artist;
22+
this.length = length;
23+
this.trackNumber = 0;
24+
}
25+
26+
public MusicBrainzTrack(String title, String artist, int length, int trackNumber) {
27+
this.title = title;
28+
this.artist = artist;
29+
this.length = length;
30+
this.trackNumber = trackNumber;
31+
}
32+
33+
public String getTitle() {
34+
return title;
35+
}
36+
37+
public void setTitle(String title) {
38+
this.title = title;
39+
}
40+
41+
public String getArtist() {
42+
return artist;
43+
}
44+
45+
public void setArtist(String artist) {
46+
this.artist = artist;
47+
}
48+
49+
public String getLength() {
50+
int seconds = length / 1000;
51+
int minutes = (seconds % 3600) / 60;
52+
seconds = seconds % 60;
53+
54+
return String.format("%02d:%02d", minutes, seconds);
55+
}
56+
57+
public void setLength(int length) {
58+
this.length = length;
59+
}
60+
61+
public int getTrackNumber() {
62+
return trackNumber;
63+
}
64+
65+
public void setTrackNumber(int trackNumber) {
66+
this.trackNumber = trackNumber;
67+
}
68+
}

0 commit comments

Comments
 (0)