diff --git a/app/src/main/java/ru/vtosters/lite/music/Genius.java b/app/src/main/java/ru/vtosters/lite/music/Genius.java index 04ef54211..53cbdec95 100644 --- a/app/src/main/java/ru/vtosters/lite/music/Genius.java +++ b/app/src/main/java/ru/vtosters/lite/music/Genius.java @@ -11,7 +11,9 @@ import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import ru.vtosters.lite.di.singleton.VtOkHttpClient; +import ru.vtosters.lite.music.downloader.M3UDownloader; import ru.vtosters.lite.utils.AndroidUtils; +import ru.vtosters.sponsorpost.utils.GzipDecompressor; import java.io.IOException; import java.net.URLEncoder; @@ -22,10 +24,10 @@ public class Genius { private static final OkHttpClient client = VtOkHttpClient.getInstance(); public static String getTextMusic(MusicTrack musictrack) { - var uid = musictrack.y1(); - var artist = removeExtras(musictrack.C); - var title = removeExtras(musictrack.f); - var duration = musictrack.h; + String uid = musictrack.y1(); + String artist = removeExtras(M3UDownloader.getArtists(musictrack)); + String title = removeExtras(musictrack.f); + int duration = musictrack.h; if (TextUtils.isEmpty(uid) || TextUtils.isEmpty(artist) || TextUtils.isEmpty(title) || duration == 0) { Log.d("Genius", "grabTrackInfo: " + "Empty track, info: " + artist + " - " + title + " - " + duration + " - " + uid); @@ -42,17 +44,18 @@ public class Genius { } Request request = new Request.a() - .b(URL + "/search/songs?q=" + URLEncoder.encode(artist + " " + track) + "&from_background=0" + "&page=1") - .a("User-Agent", "Genius/5.14.0 (Android; Android 13; Google Pixel 4 XL)") + .b(String.format("%s/search/songs?q=%s&from_background=0&page=1", URL, URLEncoder.encode(artist + " " + track))) + .a("User-Agent", "Genius/5.21.3 (Android; Android 13; Google Pixel 4 XL)") .a("Authorization", KEY) .a("x-genius-app-background-request", "0") .a("x-genius-logged-out", "true") .a("host", "api.genius.com") .a("Content-Type", "application/x-www-form-urlencoded") + .a("Accept-Encoding", "gzip") .b() .a(); try (Response resp = client.a(request).execute()) { - String payload = resp.a().g(); + String payload = GzipDecompressor.decompressResponse(resp); JSONArray sections = new JSONObject(payload).getJSONObject("response").getJSONArray("sections"); for (int i = 0; i < sections.length(); i++) { @@ -86,17 +89,18 @@ public class Genius { private static String getText(String track) { Request request = new Request.a() - .b(URL + track + "?text_format=plain") - .a("User-Agent", "Genius/5.14.0 (Android; Android 13; Google Pixel 4 XL)") + .b(String.format("%s%s?text_format=plain", URL, track)) + .a("User-Agent", "Genius/5.21.3 (Android; Android 13; Google Pixel 4 XL)") .a("Authorization", KEY) .a("x-genius-app-background-request", "0") .a("x-genius-logged-out", "true") .a("host", "api.genius.com") .a("Content-Type", "application/x-www-form-urlencoded") + .a("Accept-Encoding", "gzip") .b() .a(); - try { - JSONObject payload = new JSONObject(client.a(request).execute().a().g()); + try (Response resp = client.a(request).execute()) { + JSONObject payload = new JSONObject(GzipDecompressor.decompressResponse(resp)); if (!payload.has("response")) { return AndroidUtils.getString("error_no_text"); @@ -107,4 +111,4 @@ public class Genius { return AndroidUtils.getString("error_no_text") + "\n\n" + AndroidUtils.getString(R.string.error) + ": \n" + e.getMessage(); } } -} +} \ No newline at end of file diff --git a/app/src/main/java/ru/vtosters/lite/music/LastFMScrobbler.java b/app/src/main/java/ru/vtosters/lite/music/LastFMScrobbler.java index 1a4a334a7..add611186 100644 --- a/app/src/main/java/ru/vtosters/lite/music/LastFMScrobbler.java +++ b/app/src/main/java/ru/vtosters/lite/music/LastFMScrobbler.java @@ -14,6 +14,7 @@ import ru.vtosters.hooks.other.Preferences; import ru.vtosters.lite.di.singleton.VtOkHttpClient; import ru.vtosters.lite.downloaders.AudioDownloader; import ru.vtosters.lite.music.cache.MusicCacheImpl; +import ru.vtosters.lite.music.downloader.M3UDownloader; import ru.vtosters.lite.utils.AndroidUtils; import java.io.IOException; @@ -32,7 +33,7 @@ public class LastFMScrobbler { public static void grabMusicTrack(MusicTrack musictrack) { var uid = musictrack.y1(); - var artist = musictrack.C; + var artist = M3UDownloader.getArtists(musictrack); var title = musictrack.f; var duration = musictrack.h; var track_id = musictrack.d; diff --git a/app/src/main/java/ru/vtosters/lite/music/cache/MusicCacheImpl.java b/app/src/main/java/ru/vtosters/lite/music/cache/MusicCacheImpl.java index 6c50a8a1a..e68c6e200 100644 --- a/app/src/main/java/ru/vtosters/lite/music/cache/MusicCacheImpl.java +++ b/app/src/main/java/ru/vtosters/lite/music/cache/MusicCacheImpl.java @@ -6,6 +6,7 @@ import bruhcollective.itaysonlab.libvkx.ILibVkxService; import bruhcollective.itaysonlab.libvkx.client.LibVKXClient; import bruhcollective.itaysonlab.libvkx.client.LibVKXClientImpl; import com.vk.dto.music.MusicTrack; +import ru.vtosters.lite.music.downloader.M3UDownloader; import ru.vtosters.lite.utils.AndroidUtils; import ru.vtosters.lite.utils.music.MusicCacheStorageUtils; @@ -19,7 +20,7 @@ public class MusicCacheImpl { track.I != null ? track.I.getId() + "" : "-1", track.f, !TextUtils.isEmpty(track.g) ? track.g : "", - track.C, + M3UDownloader.getArtists(track), track.I != null ? track.I.getTitle() : "", track.K, track.h, diff --git a/app/src/main/java/ru/vtosters/lite/music/cache/db/MusicCacheDb.java b/app/src/main/java/ru/vtosters/lite/music/cache/db/MusicCacheDb.java index fb0b738f8..e13e2c1ce 100644 --- a/app/src/main/java/ru/vtosters/lite/music/cache/db/MusicCacheDb.java +++ b/app/src/main/java/ru/vtosters/lite/music/cache/db/MusicCacheDb.java @@ -13,6 +13,7 @@ import com.vk.dto.music.AlbumLink; import com.vk.dto.music.MusicTrack; import com.vk.dto.music.Thumb; import org.json.JSONObject; +import ru.vtosters.lite.music.downloader.M3UDownloader; import ru.vtosters.lite.utils.AndroidUtils; import ru.vtosters.lite.utils.music.MusicCacheStorageUtils; @@ -116,7 +117,7 @@ public class MusicCacheDb extends SQLiteOpenHelper implements AutoCloseable { // vals.put(Constants.COLUMN_ALBUM_ID, track.I != null ? track.I.getId() + "" : "-1"); vals.put(Constants.COLUMN_TITLE, track.f); vals.put(Constants.COLUMN_SUBTITLE, track.g); - vals.put(Constants.COLUMN_ARTIST, track.C); + vals.put(Constants.COLUMN_ARTIST, M3UDownloader.getArtists(track)); vals.put(Constants.COLUMN_ALBUM_TITLE, track.I != null ? track.I.getTitle() : ""); vals.put(Constants.COLUMN_EXPLICIT, Boolean.compare(track.K, true)); vals.put(Constants.COLUMN_DURATION, track.h); diff --git a/app/src/main/java/ru/vtosters/lite/music/cache/helpers/PlaylistHelper.java b/app/src/main/java/ru/vtosters/lite/music/cache/helpers/PlaylistHelper.java index 9c86118d1..38f3c65ec 100644 --- a/app/src/main/java/ru/vtosters/lite/music/cache/helpers/PlaylistHelper.java +++ b/app/src/main/java/ru/vtosters/lite/music/cache/helpers/PlaylistHelper.java @@ -7,6 +7,7 @@ import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import ru.vtosters.lite.music.cache.MusicCacheImpl; +import ru.vtosters.lite.music.downloader.M3UDownloader; import ru.vtosters.lite.utils.AndroidUtils; import ru.vtosters.lite.utils.music.MusicCacheStorageUtils; @@ -33,7 +34,7 @@ public class PlaylistHelper { return createAlbum( thumb != null ? thumb.h(600) : "", albumLink.getTitle(), - track.C, + M3UDownloader.getArtists(track), track.y1(), albumLink.getId() ); @@ -75,7 +76,7 @@ public class PlaylistHelper { list.add(createAlbum( thumb != null ? thumb.h(600) : "", albumLink.getTitle(), - track.C, + M3UDownloader.getArtists(track), track.y1(), albumLink.getId() )); diff --git a/app/src/main/java/ru/vtosters/lite/music/downloader/M3UDownloader.java b/app/src/main/java/ru/vtosters/lite/music/downloader/M3UDownloader.java index a1698a9be..06b49b095 100644 --- a/app/src/main/java/ru/vtosters/lite/music/downloader/M3UDownloader.java +++ b/app/src/main/java/ru/vtosters/lite/music/downloader/M3UDownloader.java @@ -6,6 +6,7 @@ import android.util.Log; import com.google.android.exoplayer2.source.hls.playlist.e; import com.google.android.exoplayer2.source.hls.playlist.f; import com.google.android.exoplayer2.source.hls.playlist.f.a; +import com.vk.dto.music.Artist; import com.vk.dto.music.MusicTrack; import java8.util.concurrent.CompletableFuture; import java8.util.concurrent.CompletionException; @@ -26,6 +27,7 @@ import java.io.IOException; import java.util.Arrays; import java.util.List; import java.util.concurrent.atomic.AtomicInteger; +import java.util.stream.Collectors; public class M3UDownloader implements ITrackDownloader { @@ -151,7 +153,7 @@ public class M3UDownloader } static File getResultMp3File(File outDir, boolean cache, MusicTrack track) { - return new File(outDir, IOUtils.getValidFileName((cache ? "track" : track.C + " - " + getTitle(track)) + ".mp3")); + return new File(outDir, IOUtils.getValidFileName((cache ? "track" : getArtists(track) + " - " + getTitle(track)) + ".mp3")); } @Override @@ -178,4 +180,14 @@ public class M3UDownloader private static class Holder { private static final M3UDownloader INSTANCE = new M3UDownloader(); } -} + + public static String getArtists(MusicTrack track) { + return (track.L == null || track.I == null + ? normalizeMetadata(track.C) + : normalizeMetadata(track.L.stream().map(Artist::w1).collect(Collectors.joining(", ")))); + } + + private static String normalizeMetadata(String in) { + return in.replaceAll("[\\\\/:*?\"<>|]", ""); + } +} \ No newline at end of file