package com.skyguy126.soundclouddownloader; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.drawable.Drawable; import android.net.Uri; import com.squareup.picasso.Picasso; import com.squareup.picasso.Target; import org.jaudiotagger.audio.AudioFile; import org.jaudiotagger.audio.AudioFileIO; import org.jaudiotagger.tag.FieldKey; import org.jaudiotagger.tag.Tag; import org.jaudiotagger.tag.TagOptionSingleton; import org.jaudiotagger.tag.images.Artwork; import org.jaudiotagger.tag.images.ArtworkFactory; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileOutputStream; import de.robv.android.xposed.XposedBridge; public class MetadataInjector extends BroadcastReceiver { private DownloadPayload downloadPayload; public MetadataInjector(DownloadPayload downloadPayload) { this.downloadPayload = downloadPayload; } @Override public void onReceive(final Context context, Intent intent) { XposedBridge.log("[SoundCloud Downloader] Entering album art downloader..."); context.unregisterReceiver(this); XposedBridge.log("[SoundCloud Downloader] Unregistered receiver, starting Picasso..."); Picasso.with(XposedMod.currentActivity).setLoggingEnabled(true); // enable logging to see why picasso fails to load Picasso.with(XposedMod.currentActivity).load(downloadPayload.getImageUrl()).into(new Target() { @Override public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) { try { File downloadedFile = new File(downloadPayload.getSaveDirectory(), downloadPayload.getFileName()); if (!downloadedFile.exists()) { XposedBridge.log("[SoundCloud Downloader] downloaded file does not exist, exiting..."); return; } TagOptionSingleton.getInstance().setAndroid(true); AudioFile audioFile = AudioFileIO.read(downloadedFile); Tag tag = audioFile.getTagOrCreateAndSetDefault(); tag.setField(FieldKey.ARTIST,downloadPayload.getArtistName()); tag.setField(FieldKey.GENRE, downloadPayload.getGenre()); tag.setField(FieldKey.TITLE, downloadPayload.getTitle()); tag.setField(FieldKey.ALBUM, downloadPayload.getTitle()); ByteArrayOutputStream imgStream = new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.JPEG, 90, imgStream); File artworkFile = File.createTempFile(downloadPayload.getTitle(), ".jpg"); FileOutputStream artworkFileStream = new FileOutputStream(artworkFile); artworkFileStream.write(imgStream.toByteArray()); artworkFileStream.close(); artworkFile.deleteOnExit(); imgStream.close(); Artwork artwork = ArtworkFactory.createArtworkFromFile(artworkFile); artwork.setPictureType(3); tag.deleteArtworkField(); tag.addField(artwork); tag.setField(artwork); audioFile.setTag(tag); AudioFileIO.write(audioFile); XposedBridge.log("[SoundCloud Downloader] Finished writing metadata..."); XposedMod.currentActivity.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(audioFile.getFile()))); XposedBridge.log("[SoundCloud Downloader] Broadcasting update to media scanner..."); } catch (Exception e) { XposedBridge.log("[SoundCloud Downloader] Metadata error: " + e.getMessage()); } } @Override public void onBitmapFailed(Drawable errorDrawable) { XposedBridge.log("[SoundCloud Downloader] Album art fetch failed!"); } @Override public void onPrepareLoad(Drawable placeHolderDrawable) { XposedBridge.log("[SoundCloud Downloader] Preparing to load picasso..."); } }); } }