0.5.3 - Download fixes, shuffle fix, sorting in library

This commit is contained in:
exttex 2020-10-12 22:49:13 +02:00
parent 952cf0f508
commit 2f471268c6
18 changed files with 556 additions and 167 deletions

View file

@ -312,6 +312,20 @@ public class Deezer {
return original + ".mp3";
}
public static String generateUserUploadedMP3Filename(String original, JSONObject privateJson) throws Exception {
//Remove unavailable tags
String[] ignored = {"%feats%", "%trackNumber%", "%0trackNumber%", "%year%", "%date%"};
for (String i : ignored) {
original = original.replaceAll(i, "");
}
//Basic tags
original = original.replaceAll("%title%", privateJson.getString("SNG_TITLE"));
original = original.replaceAll("%album%", privateJson.getString("ALB_TITLE"));
original = original.replaceAll("%artist%", privateJson.getString("ART_NAME"));
original = original.replaceAll("%artists%", privateJson.getString("ART_NAME"));
return original;
}
//Tag track with data from API
public static void tagTrack(String path, JSONObject publicTrack, JSONObject publicAlbum, String cover, JSONObject lyricsData) throws Exception {
TagOptionSingleton.getInstance().setAndroid(true);

View file

@ -51,6 +51,11 @@ public class Download {
}
}
//Negative TrackIDs = User uploaded MP3s.
public boolean isUserUploaded() {
return trackId.startsWith("-");
}
//Get download from SQLite cursor, HAS TO ALIGN
static Download fromSQL(Cursor cursor) {
return new Download(cursor.getInt(0), cursor.getString(1), cursor.getInt(2) == 1, cursor.getInt(3), DownloadState.values()[cursor.getInt(4)],

View file

@ -274,6 +274,7 @@ public class DownloadService extends Service {
File outFile;
JSONObject trackJson;
JSONObject albumJson;
JSONObject privateJson;
boolean stopDownload = false;
DownloadThread(Download download) {
this.download = download;
@ -293,8 +294,13 @@ public class DownloadService extends Service {
//Fetch metadata
try {
trackJson = Deezer.callPublicAPI("track", download.trackId);
albumJson = Deezer.callPublicAPI("album", Integer.toString(trackJson.getJSONObject("album").getInt("id")));
JSONObject privateRaw = deezer.callGWAPI("song.getListData", "{\"sng_ids\": [" + download.trackId + "]}");
privateJson = privateRaw.getJSONObject("results").getJSONArray("data").getJSONObject(0);
//Don't fetch meta if user uploaded mp3
if (!download.isUserUploaded()) {
trackJson = Deezer.callPublicAPI("track", download.trackId);
albumJson = Deezer.callPublicAPI("album", Integer.toString(trackJson.getJSONObject("album").getInt("id")));
}
} catch (Exception e) {
logger.error("Unable to fetch track and album metadata! " + e.toString(), download);
e.printStackTrace();
@ -305,7 +311,7 @@ public class DownloadService extends Service {
//ISRC Fallback
try {
if (trackJson.has("available_countries") && trackJson.getJSONArray("available_countries").length() == 0) {
if (!download.isUserUploaded() && trackJson.has("available_countries") && trackJson.getJSONArray("available_countries").length() == 0) {
logger.warn("ISRC Fallback!", download);
JSONObject newTrackJson = Deezer.callPublicAPI("track", "isrc:" + trackJson.getString("isrc"));
//Same track check
@ -349,7 +355,11 @@ public class DownloadService extends Service {
if (!download.priv) {
//Check file
try {
outFile = new File(Deezer.generateFilename(download.path, trackJson, albumJson, newQuality));
if (download.isUserUploaded()) {
outFile = new File(Deezer.generateUserUploadedMP3Filename(download.path, privateJson));
} else {
outFile = new File(Deezer.generateFilename(download.path, trackJson, albumJson, newQuality));
}
parentDir = new File(outFile.getParent());
} catch (Exception e) {
logger.error("Error generating track filename (" + download.path + "): " + e.toString(), download);
@ -486,7 +496,8 @@ public class DownloadService extends Service {
}
}
if (!download.priv) {
//Cover & Tags, ignore on user uploaded
if (!download.priv && !download.isUserUploaded()) {
//Download cover for each track
File coverFile = new File(outFile.getPath().substring(0, outFile.getPath().lastIndexOf('.')) + ".jpg");
@ -520,18 +531,18 @@ public class DownloadService extends Service {
JSONObject lyricsData = null;
//Lyrics
if (settings.downloadLyrics) {
try {
lyricsData = deezer.callGWAPI("song.getLyrics", "{\"sng_id\": " + download.trackId + "}");
try {
lyricsData = deezer.callGWAPI("song.getLyrics", "{\"sng_id\": " + download.trackId + "}");
if (settings.downloadLyrics) {
String lrcData = Deezer.generateLRC(lyricsData, trackJson);
//Create file
String lrcFilename = outFile.getPath().substring(0, outFile.getPath().lastIndexOf(".")+1) + "lrc";
FileOutputStream fileOutputStream = new FileOutputStream(lrcFilename);
fileOutputStream.write(lrcData.getBytes());
fileOutputStream.close();
} catch (Exception e) {
logger.warn("Error downloading lyrics! " + e.toString(), download);
}
} catch (Exception e) {
logger.warn("Error downloading lyrics! " + e.toString(), download);
}