Skip to content

Commit

Permalink
1、修复无版权音乐无法下载的虫子
Browse files Browse the repository at this point in the history
2、修复系统自带资源管理器选择路径错误的虫子
  • Loading branch information
nining377 committed Mar 13, 2021
1 parent 8c645a8 commit 9e0b2d9
Show file tree
Hide file tree
Showing 5 changed files with 161 additions and 45 deletions.
2 changes: 1 addition & 1 deletion .idea/misc.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,8 @@ android {
applicationId "com.raincat.dolby_beta"
minSdkVersion 14
targetSdkVersion 23
versionCode 200
versionName "2.0.0"
versionCode 201
versionName "2.0.1"
}
buildTypes {
release {
Expand Down
75 changes: 38 additions & 37 deletions app/src/main/java/com/raincat/dolby_beta/hook/UnblockMusicHook.java
Original file line number Diff line number Diff line change
Expand Up @@ -53,46 +53,47 @@ public UnblockMusicHook(Context context, int versionCode, boolean isPlayProcess)
classRealCall = "okhttp3.RealCall";
}

if (isPlayProcess) {
final Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("127.0.0.1", 23338));
hookAllConstructors(findClass(classRealCall, context.getClassLoader()), new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
if (param.args.length == 3) {
Object client = param.args[0];
Object request = param.args[1];

Field urlField = request.getClass().getDeclaredField(fieldHttpUrl);
urlField.setAccessible(true);
Field proxyField = client.getClass().getDeclaredField(fieldProxy);
proxyField.setAccessible(true);

Object urlObj = urlField.get(request);
if (urlObj.toString().contains("song/enhance/player/url") || urlObj.toString().contains("song/enhance/download/url")) {
proxyField.set(client, proxy);
} else {
proxyField.set(client, null);
}
final Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("127.0.0.1", 23338));
hookAllConstructors(findClass(classRealCall, context.getClassLoader()), new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
if (param.args.length == 3) {
Object client = param.args[0];
Object request = param.args[1];

Field urlField = request.getClass().getDeclaredField(fieldHttpUrl);
urlField.setAccessible(true);
Field proxyField = client.getClass().getDeclaredField(fieldProxy);
proxyField.setAccessible(true);

Object urlObj = urlField.get(request);
if (urlObj.toString().contains("song/enhance/player/url") || urlObj.toString().contains("song/enhance/download/url")) {
proxyField.set(client, proxy);
} else {
proxyField.set(client, null);
}
}
});
} else {
findAndHookMethod(classMainActivity, context.getClassLoader(), "onCreate", Bundle.class, new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) {
initScript(context);
}
});
}
});

findAndHookMethod(classMainActivity, context.getClassLoader(), "onDestroy", new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) {
Command stop = new Command(0, STOP_PROXY);
Tools.shell(context, stop);
dataPath = null;
}
});
}
if (isPlayProcess)
return;

findAndHookMethod(classMainActivity, context.getClassLoader(), "onCreate", Bundle.class, new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) {
initScript(context);
}
});

findAndHookMethod(classMainActivity, context.getClassLoader(), "onDestroy", new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) {
Command stop = new Command(0, STOP_PROXY);
Tools.shell(context, stop);
dataPath = null;
}
});
}

private void initScript(final Context c) {
Expand Down
10 changes: 5 additions & 5 deletions app/src/main/java/com/raincat/dolby_beta/ui/MainActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
import com.raincat.dolby_beta.dialog.SidebarCutDialog;
import com.raincat.dolby_beta.dialog.SignSongDialog;
import com.raincat.dolby_beta.utils.CloudMusicPackage;
import com.raincat.dolby_beta.utils.FileUnits;
import com.raincat.dolby_beta.utils.Tools;

import java.io.File;
Expand Down Expand Up @@ -145,7 +146,6 @@ private void addListener() {
Preference script = findPreference(getString(R.string.script_key));
script.setOnPreferenceClickListener(preference -> {
Intent intent = new Intent(Intent.ACTION_GET_CONTENT)
.putExtra(Intent.EXTRA_MIME_TYPES, "application/zip")
.setType("*/*")
.addCategory(Intent.CATEGORY_OPENABLE);
startActivityForResult(intent, SCRIPT);
Expand Down Expand Up @@ -282,15 +282,15 @@ protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == NODE) {
Uri uri = data.getData();
if (uri != null && uri.getPath() != null && uri.getPath().toLowerCase().endsWith("node")) {
share.edit().putString("node", uri.getPath()).apply();
findPreference(getString(R.string.node_key)).setSummary(uri.getPath());
share.edit().putString("node", FileUnits.getPath(context, uri)).apply();
findPreference(getString(R.string.node_key)).setSummary(FileUnits.getPath(context, uri));
} else
Toast.makeText(context, "你选择的不是node文件!", Toast.LENGTH_SHORT).show();
} else if (requestCode == SCRIPT) {
Uri uri = data.getData();
if (uri != null && uri.getPath() != null && uri.getPath().toLowerCase().endsWith("zip")) {
share.edit().putString("script", uri.getPath()).apply();
findPreference(getString(R.string.script_key)).setSummary(uri.getPath());
share.edit().putString("script", FileUnits.getPath(context, uri)).apply();
findPreference(getString(R.string.script_key)).setSummary(FileUnits.getPath(context, uri));
} else
Toast.makeText(context, "你选择的不是ZIP文件!", Toast.LENGTH_SHORT).show();
}
Expand Down
115 changes: 115 additions & 0 deletions app/src/main/java/com/raincat/dolby_beta/utils/FileUnits.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,115 @@
package com.raincat.dolby_beta.utils;

import android.content.ContentUris;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.os.Build;
import android.os.Environment;
import android.provider.DocumentsContract;
import android.provider.MediaStore;

/**
* <pre>
* author : RainCat
* org : Shenzhen JingYu Network Technology Co., Ltd.
* e-mail : [email protected]
* time : 2021/03/13
* desc : 说明
* version: 1.0
* </pre>
*/

public class FileUnits {
public static String getPath(final Context context, final Uri uri) {
// DocumentProvider
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT && DocumentsContract.isDocumentUri(context, uri)) {
// ExternalStorageProvider
if (isExternalStorageDocument(uri)) {
final String docId = DocumentsContract.getDocumentId(uri);
final String[] split = docId.split(":");
final String type = split[0];

if ("primary".equalsIgnoreCase(type)) {
return Environment.getExternalStorageDirectory() + "/" + split[1];
}
}
// DownloadsProvider
else if (isDownloadsDocument(uri)) {
final String id = DocumentsContract.getDocumentId(uri);
final Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"), Long.valueOf(id));
return getDataColumn(context, contentUri, null, null);
}
// MediaProvider
else if (isMediaDocument(uri)) {
final String docId = DocumentsContract.getDocumentId(uri);
final String[] split = docId.split(":");
final String type = split[0];

Uri contentUri = null;
if ("image".equals(type)) {
contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
} else if ("video".equals(type)) {
contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
} else if ("audio".equals(type)) {
contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
}

final String selection = "_id=?";
final String[] selectionArgs = new String[]{split[1]};

return getDataColumn(context, contentUri, selection, selectionArgs);
}
}
// MediaStore (and general)
else if ("content".equalsIgnoreCase(uri.getScheme())) {
return getDataColumn(context, uri, null, null);
}
// File
else if ("file".equalsIgnoreCase(uri.getScheme())) {
return uri.getPath();
}
return null;
}

/**
* Get the value of the data column for this Uri. This is useful for
* MediaStore Uris, and other file-based ContentProviders.
*
* @param context The context.
* @param uri The Uri to query.
* @param selection (Optional) Filter used in the query.
* @param selectionArgs (Optional) Selection arguments used in the query.
* @return The value of the _data column, which is typically a file path.
*/
public static String getDataColumn(Context context, Uri uri, String selection, String[] selectionArgs) {
Cursor cursor = null;
final String column = "_data";
final String[] projection = {column};

try {
cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs, null);
if (cursor != null && cursor.moveToFirst()) {
final int column_index = cursor.getColumnIndexOrThrow(column);
return cursor.getString(column_index);
}
} finally {
if (cursor != null)
cursor.close();
}
return null;
}


public static boolean isExternalStorageDocument(Uri uri) {
return "com.android.externalstorage.documents".equals(uri.getAuthority());
}

public static boolean isDownloadsDocument(Uri uri) {
return "com.android.providers.downloads.documents".equals(uri.getAuthority());
}

public static boolean isMediaDocument(Uri uri) {
return "com.android.providers.media.documents".equals(uri.getAuthority());
}
}

0 comments on commit 9e0b2d9

Please sign in to comment.