临时修改音源链接,同步官方蓝牙歌词,替换签名

This commit is contained in:
ikun0014 2024-11-04 16:47:06 +08:00
parent 135419bfbc
commit dba64eda2c
55 changed files with 11765 additions and 230 deletions

View File

@ -1,2 +0,0 @@
BUNDLE_PATH: "vendor/bundle"
BUNDLE_FORCE_RUBY_PLATFORM: 1

View File

@ -33,4 +33,4 @@ runs:
- name: Install dependencies - name: Install dependencies
shell: bash shell: bash
run: npm install run: npm ci

View File

@ -21,7 +21,7 @@ jobs:
run: | run: |
cd android cd android
chmod +x ./gradlew chmod +x ./gradlew
./gradlew assembleRelease -PMYAPP_UPLOAD_STORE_FILE=${{ secrets.KEY_FILE }} -PMYAPP_UPLOAD_KEY_ALIAS=${{ secrets.KEY_ALIAS }}' -PMYAPP_UPLOAD_STORE_PASSWORD=${{ secrets.ALIAS_PASSWORD }} -PMYAPP_UPLOAD_KEY_PASSWORD=${{ secrets.KEY_PASSWORD }} ./gradlew assembleRelease -PMYAPP_UPLOAD_STORE_FILE='${{ secrets.KEY_FILE }}' -PMYAPP_UPLOAD_KEY_ALIAS='${{ secrets.KEY_ALIAS }}' -PMYAPP_UPLOAD_STORE_PASSWORD='${{ secrets.ALIAS_PASSWORD }}' -PMYAPP_UPLOAD_KEY_PASSWORD='${{ secrets.KEY_PASSWORD }}'
# Push tag to GitHub if package.json version's tag is not tagged # Push tag to GitHub if package.json version's tag is not tagged
- name: Get package version - name: Get package version

View File

@ -1,30 +0,0 @@
# .vscode/i18n-ally-custom-framework.yml
# An array of strings which contain Language Ids defined by VS Code
# You can check avaliable language ids here: https://code.visualstudio.com/docs/languages/overview#_language-id
languageIds:
- javascript
- javascriptreact
- typescript
- typescriptreact
# An array of RegExes to find the key usage. **The key should be captured in the first match group**.
# You should unescape RegEx strings in order to fit in the YAML file
# To help with this, you can use https://www.freeformatter.com/json-escape.html
usageMatchRegex:
# The following example shows how to detect `t("your.i18n.keys")`
# the `{key}` will be placed by a proper keypath matching regex,
# you can ignore it and use your own matching rules as well
- "[^\\w\\d]t\\(['\"`]({key})['\"`]"
# An array of strings containing refactor templates.
# The "$1" will be replaced by the keypath specified.
# Optional: uncomment the following two lines to use
# refactorTemplates:
# - i18n.get("$1")
# If set to true, only enables this custom framework (will disable all built-in frameworks)
monopoly: true

View File

@ -1,68 +0,0 @@
{
// Place your LxMusicMobile 工作区 snippets here. Each snippet is defined under a snippet name and has a scope, prefix, body and
// description. Add comma separated ids of the languages where the snippet is applicable in the scope field. If scope
// is left empty or omitted, the snippet gets applied to all languages. The prefix is what is
// used to trigger the snippet and the body will be expanded and inserted. Possible variables are:
// $1, $2 for tab stops, $0 for the final cursor position, and ${1:label}, ${2:another} for placeholders.
// Placeholders with the same ids are connected.
// Example:
// "Print to console": {
// "scope": "javascript,typescript",
// "prefix": "log",
// "body": [
// "console.log('$1');",
// "$2"
// ],
// "description": "Log output to console"
// }
"Import translation": {
"scope": "javascript,typescript,typescriptreact",
"prefix": "imtl",
"body": [
"import { useTranslation } from '@/plugins/i18n'",
"$1const { t } = useTranslation()"
],
"description": "Translation Language"
},
"Import store setting": {
"scope": "javascript,typescript,typescriptreact",
"prefix": "imss",
"body": [
"import settingState from '@/store/setting/state'"
],
"description": "Import store setting"
},
"Import store player": {
"scope": "javascript,typescript,typescriptreact",
"prefix": "imsp",
"body": [
"import playerState from '@/store/player/state'"
],
"description": "Import store player"
},
"Import store list": {
"scope": "javascript,typescript,typescriptreact",
"prefix": "imsl",
"body": [
"import listState from '@/store/list/state'"
],
"description": "Import store list"
},
"Import toast": {
"scope": "javascript,typescript,typescriptreact",
"prefix": "imts",
"body": [
"import { toast } from '@/utils/tools'",
"$1toast(t(''), 'long')"
],
"description": "Import toast"
},
"Use getter theme": {
"scope": "javascript,typescript,typescriptreact",
"prefix": "ugt",
"body": [
"const theme = useGetter('common', 'theme')"
],
"description": "Use getter theme"
},
}

15
.vscode/settings.json vendored
View File

@ -1,15 +0,0 @@
{
"i18n-ally.localesPaths": [
"src/lang"
],
// "i18n-ally.fullReloadOnChanged": true,
"i18n-ally.keystyle": "nested",
"i18n-ally.displayLanguage": "zh_cn",
"i18n-ally.sourceLanguage": "zh_cn",
"i18n-ally.translate.engines": [
"google-cn",
"google"
],
"i18n-ally.sortKeys": true,
"java.configuration.updateBuildConfiguration": "disabled"
}

BIN
android/app/debug.keystore Normal file

Binary file not shown.

View File

@ -1,13 +0,0 @@
package com.ikunshare.music.mobile;
import com.reactnativenavigation.NavigationActivity;
import com.facebook.react.ReactActivityDelegate;
import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint;
import com.facebook.react.defaults.DefaultReactActivityDelegate;
public class MainActivity extends NavigationActivity {
}

View File

@ -1,39 +0,0 @@
package com.ikunshare.music.mobile.utils;
import android.content.Context;
import android.os.storage.StorageManager;
import com.facebook.react.bridge.Promise;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactMethod;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.lang.reflect.Array;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Objects;
import java.util.concurrent.Callable;
public class Utils {
// public static boolean deletePath(File dir) {
// if (dir.isDirectory()) {
// String[] children = dir.list();
// for (int i=0; i< children.length; i++) {
// boolean success = deletePath(new File(dir, children[i]));
// if (!success) {
// return false;
// }
// }
// }
//
// // The directory is now empty so delete it
// return dir.delete();
// }
}

View File

@ -0,0 +1,10 @@
package com.ikunshare.music.mobile;
import com.reactnativenavigation.NavigationActivity;
public class MainActivity extends NavigationActivity {
}

View File

@ -1,19 +1,19 @@
package com.ikunshare.music.mobile; package com.ikunshare.music.mobile;
import com.facebook.react.PackageList; import com.facebook.react.PackageList;
import com.facebook.react.flipper.ReactNativeFlipper;
import com.reactnativenavigation.NavigationApplication;
import com.facebook.react.ReactNativeHost; import com.facebook.react.ReactNativeHost;
import com.facebook.react.ReactPackage; import com.facebook.react.ReactPackage;
import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint; import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint;
import com.reactnativenavigation.react.NavigationReactNativeHost; import com.facebook.react.flipper.ReactNativeFlipper;
import java.util.List;
import com.ikunshare.music.mobile.cache.CachePackage; import com.ikunshare.music.mobile.cache.CachePackage;
import com.ikunshare.music.mobile.crypto.CryptoPackage; import com.ikunshare.music.mobile.crypto.CryptoPackage;
import com.ikunshare.music.mobile.lyric.LyricPackage; import com.ikunshare.music.mobile.lyric.LyricPackage;
import com.ikunshare.music.mobile.userApi.UserApiPackage; import com.ikunshare.music.mobile.userApi.UserApiPackage;
import com.ikunshare.music.mobile.utils.UtilsPackage; import com.ikunshare.music.mobile.utils.UtilsPackage;
import com.reactnativenavigation.NavigationApplication;
import com.reactnativenavigation.react.NavigationReactNativeHost;
import java.util.List;
public class MainApplication extends NavigationApplication { public class MainApplication extends NavigationApplication {

View File

@ -1,5 +1,9 @@
package com.ikunshare.music.mobile.cache; package com.ikunshare.music.mobile.cache;
import static com.ikunshare.music.mobile.cache.Utils.clearCacheFolder;
import static com.ikunshare.music.mobile.cache.Utils.getDirSize;
import static com.ikunshare.music.mobile.cache.Utils.isMethodsCompat;
import com.facebook.react.bridge.Promise; import com.facebook.react.bridge.Promise;
import com.facebook.react.bridge.ReactApplicationContext; import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule; import com.facebook.react.bridge.ReactContextBaseJavaModule;
@ -7,10 +11,6 @@ import com.facebook.react.bridge.ReactMethod;
import java.io.File; import java.io.File;
import static com.ikunshare.music.mobile.cache.Utils.clearCacheFolder;
import static com.ikunshare.music.mobile.cache.Utils.getDirSize;
import static com.ikunshare.music.mobile.cache.Utils.isMethodsCompat;
// https://github.com/midas-gufei/react-native-clear-app-cache/tree/master/android/src/main/java/com/learnta/clear // https://github.com/midas-gufei/react-native-clear-app-cache/tree/master/android/src/main/java/com/learnta/clear
public class CacheModule extends ReactContextBaseJavaModule { public class CacheModule extends ReactContextBaseJavaModule {
private final CacheModule cacheModule; private final CacheModule cacheModule;

View File

@ -1,4 +1,4 @@
package cn.toside.music.mobile.lyric; package com.ikunshare.music.mobile.lyric;
import android.content.BroadcastReceiver; import android.content.BroadcastReceiver;
import android.content.Context; import android.content.Context;

View File

@ -2,7 +2,6 @@ package com.ikunshare.music.mobile.lyric;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
import android.content.Context; import android.content.Context;
import android.graphics.Color;
import android.graphics.Typeface; import android.graphics.Typeface;
import android.text.TextPaint; import android.text.TextPaint;
import android.text.TextUtils; import android.text.TextUtils;

View File

@ -21,13 +21,12 @@ import android.view.WindowManager;
import com.facebook.react.bridge.Arguments; import com.facebook.react.bridge.Arguments;
import com.facebook.react.bridge.ReactApplicationContext; import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.WritableMap; import com.facebook.react.bridge.WritableMap;
import com.ikunshare.music.mobile.R;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.regex.Matcher; import java.util.regex.Matcher;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import com.ikunshare.music.mobile.R;
public class LyricView extends Activity implements View.OnTouchListener { public class LyricView extends Activity implements View.OnTouchListener {
LyricSwitchView textView = null; LyricSwitchView textView = null;
WindowManager windowManager = null; WindowManager windowManager = null;

View File

@ -4,11 +4,10 @@ import android.os.Handler;
import android.os.Looper; import android.os.Looper;
import android.os.Message; import android.os.Message;
import android.util.Log; import android.util.Log;
import com.facebook.react.bridge.Arguments; import com.facebook.react.bridge.Arguments;
import com.facebook.react.bridge.WritableMap; import com.facebook.react.bridge.WritableMap;
import java.util.Objects;
public class JsHandler extends Handler { public class JsHandler extends Handler {
private final UtilsEvent utilsEvent; private final UtilsEvent utilsEvent;

View File

@ -5,19 +5,18 @@ import android.os.Handler;
import android.os.Message; import android.os.Message;
import android.util.Base64; import android.util.Base64;
import android.util.Log; import android.util.Log;
import com.facebook.react.bridge.ReactApplicationContext;
import com.ikunshare.music.mobile.crypto.AES; import com.ikunshare.music.mobile.crypto.AES;
import com.ikunshare.music.mobile.crypto.RSA; import com.ikunshare.music.mobile.crypto.RSA;
import com.facebook.react.bridge.ReactApplicationContext;
import com.whl.quickjs.android.QuickJSLoader; import com.whl.quickjs.android.QuickJSLoader;
import com.whl.quickjs.wrapper.JSCallFunction;
import com.whl.quickjs.wrapper.QuickJSContext; import com.whl.quickjs.wrapper.QuickJSContext;
import java.io.InputStream; import java.io.InputStream;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.security.MessageDigest; import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException; import java.security.NoSuchAlgorithmException;
import java.util.UUID; import java.util.UUID;
import okhttp3.HttpUrl;
public class QuickJS { public class QuickJS {
private final Handler eventHandler; private final Handler eventHandler;

View File

@ -4,12 +4,12 @@ import android.os.Bundle;
import android.os.Handler; import android.os.Handler;
import android.os.Message; import android.os.Message;
import android.util.Log; import android.util.Log;
import com.facebook.react.bridge.Arguments; import com.facebook.react.bridge.Arguments;
import com.facebook.react.bridge.ReactApplicationContext; import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule; import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod; import com.facebook.react.bridge.ReactMethod;
import com.facebook.react.bridge.ReadableMap; import com.facebook.react.bridge.ReadableMap;
import java.lang.Thread;
public class UserApiModule extends ReactContextBaseJavaModule { public class UserApiModule extends ReactContextBaseJavaModule {
private JavaScriptThread javaScriptThread; private JavaScriptThread javaScriptThread;

View File

@ -4,6 +4,7 @@ import com.facebook.react.ReactPackage;
import com.facebook.react.bridge.NativeModule; import com.facebook.react.bridge.NativeModule;
import com.facebook.react.bridge.ReactApplicationContext; import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.uimanager.ViewManager; import com.facebook.react.uimanager.ViewManager;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;

View File

@ -1,7 +1,5 @@
package com.ikunshare.music.mobile.userApi; package com.ikunshare.music.mobile.userApi;
import android.util.Log;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import com.facebook.react.bridge.ReactApplicationContext; import com.facebook.react.bridge.ReactApplicationContext;

View File

@ -0,0 +1,19 @@
package com.ikunshare.music.mobile.utils;
public class Utils {
// public static boolean deletePath(File dir) {
// if (dir.isDirectory()) {
// String[] children = dir.list();
// for (int i=0; i< children.length; i++) {
// boolean success = deletePath(new File(dir, children[i]));
// if (!success) {
// return false;
// }
// }
// }
//
// // The directory is now empty so delete it
// return dir.delete();
// }
}

View File

@ -1,7 +1,5 @@
package com.ikunshare.music.mobile.utils; package com.ikunshare.music.mobile.utils;
import android.util.Log;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import com.facebook.react.bridge.ReactApplicationContext; import com.facebook.react.bridge.ReactApplicationContext;

View File

@ -14,8 +14,6 @@ import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager; import android.net.wifi.WifiManager;
import android.os.Build; import android.os.Build;
import android.util.Log; import android.util.Log;
import android.view.View;
import android.view.ViewTreeObserver;
import android.view.Window; import android.view.Window;
import android.view.WindowManager; import android.view.WindowManager;
@ -29,13 +27,11 @@ import com.facebook.react.bridge.Promise;
import com.facebook.react.bridge.ReactApplicationContext; import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule; import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod; import com.facebook.react.bridge.ReactMethod;
import com.facebook.react.bridge.UiThreadUtil;
import com.facebook.react.bridge.WritableArray; import com.facebook.react.bridge.WritableArray;
import com.facebook.react.bridge.WritableMap; import com.facebook.react.bridge.WritableMap;
import com.facebook.react.bridge.WritableNativeArray; import com.facebook.react.bridge.WritableNativeArray;
import java.io.File; import java.io.File;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Locale; import java.util.Locale;
import java.util.Objects; import java.util.Objects;

11706
package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

View File

@ -208,7 +208,7 @@ export const getOnlineOtherSourcePicByLocal = async(musicInfo: LX.Music.MusicInf
}) })
} }
export const TRY_QUALITYS_LIST = ['flac24bit', 'flac', '320k'] as const export const TRY_QUALITYS_LIST = ['master', 'flac24bit', 'flac', '320k', '128k'] as const
type TryQualityType = typeof TRY_QUALITYS_LIST[number] type TryQualityType = typeof TRY_QUALITYS_LIST[number]
export const getPlayQuality = (highQuality: LX.Quality, musicInfo: LX.Music.MusicInfoOnline): LX.Quality => { export const getPlayQuality = (highQuality: LX.Quality, musicInfo: LX.Music.MusicInfoOnline): LX.Quality => {
let type: LX.Quality = '128k' let type: LX.Quality = '128k'

View File

@ -27,7 +27,7 @@ const Item = ({ id, name }: {
export default memo(() => { export default memo(() => {
const t = useI18n() const t = useI18n()
const playQualityList = useMemo(() => { const playQualityList = useMemo(() => {
return [...TRY_QUALITYS_LIST, '128k'].reverse() as LX.Quality[] return [...TRY_QUALITYS_LIST].reverse() as LX.Quality[]
}, []) }, [])
return ( return (
@ -47,26 +47,3 @@ const styles = StyleSheet.create({
flexWrap: 'wrap', flexWrap: 'wrap',
}, },
}) })
// export default memo(() => {
// const t = useI18n()
// const isPlayHighQuality = useSettingValue('player.isPlayHighQuality')
// const setPlayHighQuality = (isPlayHighQuality: boolean) => {
// updateSetting({ 'player.isPlayHighQuality': isPlayHighQuality })
// }
// return (
// <View style={styles.content}>
// <CheckBoxItem check={isPlayHighQuality} onChange={setPlayHighQuality} label={t('setting_play_quality')} />
// </View>
// )
// })
// const styles = createStyle({
// content: {
// marginTop: 5,
// },
// })

View File

@ -5,7 +5,7 @@ import { dnsLookup } from '../utils'
const api_ikun_zj = { const api_ikun_zj = {
getMusicUrl(songInfo, type) { getMusicUrl(songInfo, type) {
const requestObj = httpFetch(`https://lxmusic.ikunshare.com/url/kg/${songInfo._types[type].hash}/${type}`, { const requestObj = httpFetch(`https://音源.ikunshare.com/url/kg/${songInfo._types[type].hash}/${type}`, {
method: 'get', method: 'get',
timeout, timeout,
headers, headers,

View File

@ -5,7 +5,7 @@ import { dnsLookup } from '../utils'
const api_ikun_cf = { const api_ikun_cf = {
getMusicUrl(songInfo, type) { getMusicUrl(songInfo, type) {
const requestObj = httpFetch(`https://lxmusic.ikunshare.com/url/kg/${songInfo._types[type].hash}/${type}`, { const requestObj = httpFetch(`https://音源.ikunshare.com/url/kg/${songInfo._types[type].hash}/${type}`, {
method: 'get', method: 'get',
timeout, timeout,
headers, headers,

View File

@ -5,7 +5,7 @@ import { dnsLookup } from '../utils'
const api_ikun_zj = { const api_ikun_zj = {
getMusicUrl(songInfo, type) { getMusicUrl(songInfo, type) {
const requestObj = httpFetch(`https://lxmusic.ikunshare.com/url/kw/${songInfo.songmid}/${type}`, { const requestObj = httpFetch(`https://音源.ikunshare.com/url/kw/${songInfo.songmid}/${type}`, {
method: 'get', method: 'get',
timeout, timeout,
headers, headers,

View File

@ -5,7 +5,7 @@ import { dnsLookup } from '../utils'
const api_ikun_zj = { const api_ikun_zj = {
getMusicUrl(songInfo, type) { getMusicUrl(songInfo, type) {
const requestObj = httpFetch(`https://lxmusic.ikunshare.com/url/mg/${songInfo.copyrightId}/${type}`, { const requestObj = httpFetch(`https://音源.ikunshare.com/url/mg/${songInfo.copyrightId}/${type}`, {
method: 'get', method: 'get',
timeout, timeout,
headers, headers,

View File

@ -2,6 +2,7 @@ export const bHh = '624868746c'
export const headers = { export const headers = {
'User-Agent': 'lx-music mobile request', 'User-Agent': 'lx-music mobile request',
'X-Request-Key': 'ikunsource_public',
[bHh]: [bHh], [bHh]: [bHh],
} }

View File

@ -5,7 +5,7 @@ import { dnsLookup } from '../utils'
const api_ikun_zj = { const api_ikun_zj = {
getMusicUrl(songInfo, type) { getMusicUrl(songInfo, type) {
const requestObj = httpFetch(`https://lxmusic.ikunshare.com/url/tx/${songInfo.songmid}/${type}`, { const requestObj = httpFetch(`https://音源.ikunshare.com/url/tx/${songInfo.songmid}/${type}`, {
method: 'get', method: 'get',
timeout, timeout,
headers, headers,

View File

@ -5,7 +5,7 @@ import { dnsLookup } from '../utils'
const api_ikun_cf = { const api_ikun_cf = {
getMusicUrl(songInfo, type) { getMusicUrl(songInfo, type) {
const requestObj = httpFetch(`https://lxmusic.ikunshare.com/url/tx/${songInfo.songmid}/${type}`, { const requestObj = httpFetch(`https://音源.ikunshare.com/url/tx/${songInfo.songmid}/${type}`, {
method: 'get', method: 'get',
timeout, timeout,
headers, headers,

View File

@ -5,7 +5,7 @@ import { dnsLookup } from '../utils'
const api_ikun_zj = { const api_ikun_zj = {
getMusicUrl(songInfo, type) { getMusicUrl(songInfo, type) {
const requestObj = httpFetch(`https://lxmusic.ikunshare.com/url/wy/${songInfo.songmid}/${type}`, { const requestObj = httpFetch(`https://音源.ikunshare.com/url/wy/${songInfo.songmid}/${type}`, {
method: 'get', method: 'get',
timeout, timeout,
headers, headers,

View File

@ -5,7 +5,7 @@ import { dnsLookup } from '../utils'
const api_ikun_cf = { const api_ikun_cf = {
getMusicUrl(songInfo, type) { getMusicUrl(songInfo, type) {
const requestObj = httpFetch(`https://lxmusic.ikunshare.com/url/wy/${songInfo.songmid}/${type}`, { const requestObj = httpFetch(`https://音源.ikunshare.com/url/wy/${songInfo.songmid}/${type}`, {
method: 'get', method: 'get',
timeout, timeout,
headers, headers,