stirante

SoundCloud downloader

Mar 29th, 2016
1,037
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 5.14 KB | None | 0 0
  1. package com.stirante.soundcloudmodule;
  2.  
  3. import android.app.Application;
  4. import android.app.DownloadManager;
  5. import android.content.Context;
  6. import android.net.Uri;
  7. import android.os.Build;
  8. import android.os.Environment;
  9. import android.view.MenuItem;
  10. import android.widget.PopupMenu;
  11. import android.widget.Toast;
  12.  
  13. import java.io.File;
  14.  
  15. import de.robv.android.xposed.IXposedHookLoadPackage;
  16. import de.robv.android.xposed.XC_MethodHook;
  17. import de.robv.android.xposed.XposedBridge;
  18. import de.robv.android.xposed.XposedHelpers;
  19. import de.robv.android.xposed.callbacks.XC_LoadPackage;
  20.  
  21. /**
  22.  * Created by stirante
  23.  */
  24. public class XposedMain implements IXposedHookLoadPackage {
  25.  
  26.     private Object urlBuilder;
  27.  
  28.     public static final File DEFAULT_DIR = new File(Environment.getExternalStorageDirectory() + "/SoundCloud files/");
  29.  
  30.     public static void download(String src, String title, String creator, Context context) {
  31.         File dst = new File(DEFAULT_DIR, creator + "/" + title + ".mp3");
  32.         if (dst.exists()) dst.delete();
  33.         DownloadManager.Request request = new DownloadManager.Request(Uri.parse(src));
  34.         request.setTitle("Downloading " + creator + " - " + title);
  35.         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
  36.             request.allowScanningByMediaScanner();
  37.             request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
  38.         }
  39.         request.setDestinationUri(Uri.fromFile(dst));
  40.         DownloadManager manager = (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE);
  41.         manager.enqueue(request);
  42.     }
  43.     @Override
  44.     public void handleLoadPackage(final XC_LoadPackage.LoadPackageParam packageParam) throws Throwable {
  45.         if (packageParam.packageName.equalsIgnoreCase("com.soundcloud.android")) {
  46.             XposedBridge.log("In SoundCloud");
  47.             XposedHelpers.findAndHookMethod(Application.class, "attach", Context.class, new XC_MethodHook() {
  48.                 @Override
  49.                 protected void afterHookedMethod(MethodHookParam param) throws Throwable {
  50.                     final Context ctx = (Context) param.args[0];
  51.                     XposedHelpers.findAndHookMethod("com.soundcloud.android.playback.ui.TrackPageMenuController", packageParam.classLoader, "setupMenu", new XC_MethodHook() {
  52.                         @Override
  53.                         protected void afterHookedMethod(MethodHookParam param) throws Throwable {
  54.                             PopupMenu menu = (PopupMenu) XposedHelpers.getObjectField(XposedHelpers.getObjectField(param.thisObject, "popupMenuWrapper"), "popupMenu");
  55.                             menu.getMenu().add("Download");
  56.                         }
  57.                     });
  58.                     XposedHelpers.findAndHookMethod("com.soundcloud.android.playback.ui.TrackPageMenuController", packageParam.classLoader, "onMenuItemClick", XposedHelpers.findClass("android.view.MenuItem", packageParam.classLoader), XposedHelpers.findClass("android.content.Context", packageParam.classLoader), new XC_MethodHook() {
  59.                         @Override
  60.                         protected void afterHookedMethod(MethodHookParam param) throws Throwable {
  61.                             MenuItem item = (MenuItem) param.args[0];
  62.                             if (item.getTitle().toString().equalsIgnoreCase("Download")) {
  63.                                 Object urn = XposedHelpers.callMethod(XposedHelpers.getObjectField(param.thisObject, "track"), "getUrn");
  64.                                 String title = (String) XposedHelpers.callMethod(XposedHelpers.getObjectField(param.thisObject, "track"), "getTitle");
  65.                                 String creator = (String) XposedHelpers.callMethod(XposedHelpers.getObjectField(param.thisObject, "track"), "getUserName");
  66.                                 if (urlBuilder != null) {
  67.                                     String url = (String) XposedHelpers.callMethod(urlBuilder, "buildHttpsStreamUrl", new Class[]{XposedHelpers.findClass("com.soundcloud.android.model.Urn", packageParam.classLoader)}, urn);
  68.                                     download(url, title, creator, ctx);
  69.                                 }
  70.                                 else {
  71.                                     Toast.makeText(ctx, "Failed to download!", Toast.LENGTH_SHORT).show();
  72.                                 }
  73.                                 param.setResult(true);
  74.                             }
  75.                         }
  76.                     });
  77.                     XposedHelpers.findAndHookConstructor("com.soundcloud.android.playback.StreamUrlBuilder", packageParam.classLoader, XposedHelpers.findClass("com.soundcloud.android.accounts.AccountOperations", packageParam.classLoader), XposedHelpers.findClass("com.soundcloud.android.api.ApiUrlBuilder", packageParam.classLoader), new XC_MethodHook() {
  78.                         @Override
  79.                         protected void afterHookedMethod(MethodHookParam param) throws Throwable {
  80.                             urlBuilder = param.thisObject;
  81.                         }
  82.                     });
  83.                 }
  84.             });
  85.         }
  86.     }
  87. }
Add Comment
Please, Sign In to add comment