新增设置-播放设置-显示歌词罗马音

This commit is contained in:
lyswhut 2022-05-10 17:31:52 +08:00
parent 1ae30669da
commit 1289f84985
26 changed files with 396 additions and 257 deletions

View File

@ -174,8 +174,7 @@ android {
// Fix for windows limit on number of character in file paths and in command lines
if (Os.isFamily(Os.FAMILY_WINDOWS)) {
arguments "NDK_OUT=${rootProject.projectDir.getParent()}\\.cxx",
"NDK_APP_SHORT_COMMANDS=true"
arguments "NDK_APP_SHORT_COMMANDS=true"
}
}
}

View File

@ -23,13 +23,16 @@ public class Lyric extends LyricPlayer {
// String lastText = "LX Music ^-^";
int lastLine = 0;
List lines = new ArrayList();
boolean isShowTranslation = false;
boolean isShowTranslation;
boolean isShowRoma;
String lyricText = "";
String lyricTransText = "";
String translationText = "";
String romaLyricText = "";
Lyric(ReactApplicationContext reactContext, boolean isShowTranslation) {
Lyric(ReactApplicationContext reactContext, boolean isShowTranslation, boolean isShowRoma) {
this.reactAppContext = reactContext;
this.isShowTranslation = isShowTranslation;
this.isShowRoma = isShowRoma;
registerScreenBroadcastReceiver();
}
@ -93,9 +96,9 @@ public class Lyric extends LyricPlayer {
if (lineNum < 0 || lineNum > lines.size() - 1) return;
HashMap line = (HashMap) lines.get(lineNum);
if (line == null) {
lyricView.setLyric("", "");
lyricView.setLyric("", new ArrayList<>(0));
} else {
lyricView.setLyric((String) line.get("text"), (String) line.get("translation"));
lyricView.setLyric((String) line.get("text"), (ArrayList<String>) line.get("extendedLyrics"));
}
}
@ -122,19 +125,26 @@ public class Lyric extends LyricPlayer {
isShowLyric = false;
}
@Override
public void setLyric(String lyric, String translationLyric) {
private void refreshLyric() {
ArrayList<String> extendedLyrics = new ArrayList<>(2);
if (isShowTranslation && !"".equals(translationText)) extendedLyrics.add(translationText);
if (isShowRoma && !"".equals(romaLyricText)) extendedLyrics.add(romaLyricText);
if (lyricView != null) super.setLyric(lyricText, extendedLyrics);
}
public void setLyric(String lyric, String translation, String romaLyric) {
lyricText = lyric;
lyricTransText = translationLyric;
if (lyricView != null) super.setLyric(lyric, isShowTranslation ? translationLyric : "");
translationText = translation;
romaLyricText = romaLyric;
refreshLyric();
}
@Override
public void onSetLyric(List lines) {
this.lines = lines;
// for (int i = 0; i < lines.size(); i++) {
// HashMap line = (HashMap) lines.get(i);
// Log.d("Lyric", (String) line.get("text") + " " + (String) line.get("translation"));
// HashMap line = (HashMap) lines.get(i);
// Log.d("Lyric", "onSetLyric: " +(String) line.get("text") + " " + line.get("extendedLyrics"));
// }
}
@ -156,7 +166,12 @@ public class Lyric extends LyricPlayer {
public void toggleTranslation(boolean isShowTranslation) {
this.isShowTranslation = isShowTranslation;
if (lyricView != null) super.setLyric(lyricText, isShowTranslation ? lyricTransText : "");
refreshLyric();
}
public void toggleRoma(boolean isShowRoma) {
this.isShowRoma = isShowRoma;
refreshLyric();
}
public void setColor(String color) {

View File

@ -19,6 +19,7 @@ public class LyricModule extends ReactContextBaseJavaModule {
// final Map<String, Object> constants = new HashMap<>();
boolean isShowTranslation = false;
boolean isShowRoma = false;
LyricModule(ReactApplicationContext reactContext) {
super(reactContext);
@ -46,7 +47,7 @@ public class LyricModule extends ReactContextBaseJavaModule {
@ReactMethod
public void showLyric(ReadableMap data, Promise promise) {
if (lyric == null) lyric = new Lyric(reactContext, isShowTranslation);
if (lyric == null) lyric = new Lyric(reactContext, isShowTranslation, isShowRoma);
lyric.showLyric(Arguments.toBundle(data), promise);
}
@ -58,10 +59,10 @@ public class LyricModule extends ReactContextBaseJavaModule {
@ReactMethod
public void setLyric(String lyric, String translation, Promise promise) {
public void setLyric(String lyric, String translation, String romaLyric, Promise promise) {
// Log.d("Lyric", "set lyric: " + lyric);
// Log.d("Lyric", "set lyric translation: " + translation);
this.lyric.setLyric(lyric, translation);
this.lyric.setLyric(lyric, translation, romaLyric);
promise.resolve(null);
}
@ -73,6 +74,14 @@ public class LyricModule extends ReactContextBaseJavaModule {
promise.resolve(null);
}
@ReactMethod
public void toggleRoma(boolean isShowRoma, Promise promise) {
this.isShowRoma = isShowRoma;
if (lyric == null) return;
lyric.toggleRoma(isShowRoma);
promise.resolve(null);
}
@ReactMethod
public void play(int time, Promise promise) {
Log.d("Lyric", "play lyric: " + time);

View File

@ -17,8 +17,8 @@ public class LyricPlayer {
Pattern timePattern;
String lyric = "";
String translationLyric = "";
List<HashMap> lines = new ArrayList<HashMap>();
ArrayList<String> extendedLyrics = new ArrayList<>();
List<HashMap> lines = new ArrayList<>();
HashMap tags = new HashMap();
boolean isPlay = false;
int curLineNum = 0;
@ -109,9 +109,28 @@ public class LyricPlayer {
}
}
private void parseExtendedLyric(HashMap linesMap, String extendedLyric) {
String[] extendedLyricLines = extendedLyric.split("\r\n|\n|\r");
for (String translationLine : extendedLyricLines) {
String line = translationLine.trim();
Matcher result = timePattern.matcher(line);
if (result.find()) {
String text = line.replaceAll(timeExp, "").trim();
if (text.length() > 0) {
String timeStr = result.group(1);
if (timeStr != null) {
timeStr = timeStr.replace("(\\.\\d\\d)0$", "$1");
HashMap targetLine = (HashMap) linesMap.get(timeStr);
if (targetLine != null) ((ArrayList<String>) targetLine.get("extendedLyrics")).add(text);
}
}
}
}
}
private void initLines() {
String[] linesStr = lyric.split("\r\n|\n|\r");
lines = new ArrayList<HashMap>();
lines = new ArrayList<>();
HashMap linesMap = new HashMap<String, HashMap>();
HashMap timeMap = new HashMap<String, Integer>();
@ -124,6 +143,7 @@ public class LyricPlayer {
if (text.length() > 0) {
String timeStr = result.group(1);
if (timeStr == null) continue;
timeStr = timeStr.replace("(\\.\\d\\d)0$", "$1");
String[] timeArr = timeStr.split(":");
String hours;
String minutes;
@ -148,32 +168,22 @@ public class LyricPlayer {
seconds = timeArr[0];
milliseconds = timeArr[1];
}
HashMap<String, Object> lineInfo = new HashMap<String, Object>();
HashMap<String, Object> lineInfo = new HashMap<>();
int time = Integer.parseInt(hours) * 60 * 60 * 1000
+ Integer.parseInt(minutes) * 60 * 1000
+ Integer.parseInt(seconds) * 1000
+ Integer.parseInt(milliseconds);
lineInfo.put("time", time);
lineInfo.put("text", text);
lineInfo.put("translation", "");
lineInfo.put("extendedLyrics", new ArrayList<String>(extendedLyrics.size()));
timeMap.put(timeStr, time);
linesMap.put(timeStr, lineInfo);
}
}
}
String[] translationLines = translationLyric.split("\r\n|\n|\r");
for (String translationLine : translationLines) {
String line = translationLine.trim();
Matcher result = timePattern.matcher(line);
if (result.find()) {
String text = line.replaceAll(timeExp, "").trim();
if (text.length() > 0) {
String timeStr = result.group(1);
HashMap targetLine = (HashMap) linesMap.get(timeStr);
if (targetLine != null) targetLine.put("translation", text);
}
}
for (String extendedLyric : extendedLyrics) {
parseExtendedLyric(linesMap, extendedLyric);
}
Set<Entry<String, Integer>> set = timeMap.entrySet();
@ -195,7 +205,7 @@ public class LyricPlayer {
private void init() {
if (lyric == null) lyric = "";
if (translationLyric == null) translationLyric = "";
if (extendedLyrics == null) extendedLyrics = new ArrayList<>();
initTag();
initLines();
onSetLyric(lines);
@ -294,10 +304,10 @@ public class LyricPlayer {
refresh();
}
public void setLyric(String lyric, String translationLyric) {
public void setLyric(String lyric, ArrayList<String> extendedLyrics) {
if (isPlay) pause();
this.lyric = lyric;
this.translationLyric = translationLyric;
this.extendedLyrics = extendedLyrics;
init();
}

View File

@ -21,6 +21,8 @@ import com.facebook.react.bridge.Arguments;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.WritableMap;
import java.util.ArrayList;
import cn.toside.music.mobile.R;
public class LyricView extends Activity implements View.OnTouchListener {
@ -52,7 +54,7 @@ public class LyricView extends Activity implements View.OnTouchListener {
private float alpha = 1f;
private float textSize = 18f;
private int maxLineNum = 4;
private final int maxLineNum = 5;
// private float lineHeight = 1;
LyricView(ReactApplicationContext reactContext, LyricEvent lyricEvent) {
@ -217,13 +219,16 @@ public class LyricView extends Activity implements View.OnTouchListener {
windowManager.addView(textView, layoutParams);
}
public void setLyric(String text, String transText) {
public void setLyric(String text, ArrayList<String> extendedLyrics) {
if (textView == null) return;
if (transText.equals("")) {
textView.setText(text);
} else {
textView.setText(text + "\n" + transText);
if (extendedLyrics.size() > 0) {
StringBuilder textBuilder = new StringBuilder(text);
for (String lrc : extendedLyrics) {
textBuilder.append("\n").append(lrc);
}
text = textBuilder.toString();
}
textView.setText(text);
}
@Override

View File

@ -15,10 +15,6 @@ buildscript {
if (System.properties['os.arch'] == "aarch64") {
// For M1 Users we need to use the NDK 24 which added support for aarch64
ndkVersion = "24.0.8215888"
} else if (Os.isFamily(Os.FAMILY_WINDOWS)) {
// For Android Users, we need to use NDK 23, otherwise the build will
// fail due to paths longer than the OS limit
ndkVersion = "23.1.7779620"
} else {
// Otherwise we default to the side-by-side NDK version from AGP.
ndkVersion = "21.4.7075529"

View File

@ -16,7 +16,7 @@ import { action as commonAction } from '@/store/modules/common'
import { action as playerAction } from '@/store/modules/player'
import { action as listAction } from '@/store/modules/list'
import { init as initMusicTools } from '@/utils/music'
import { init as initLyric, toggleTranslation } from '@/utils/lyric'
import { init as initLyric, toggleTranslation, toggleRoma } from '@/utils/lyric'
import { showLyric, onPositionChange } from '@/utils/lyricDesktop'
import { init as initI18n, supportedLngs } from '@/plugins/i18n'
import { deviceLanguage, getPlayInfo, toast, onAppearanceChange, getIsSupportedAutoTheme, getAppearance } from '@/utils/tools'
@ -50,6 +50,7 @@ const init = () => {
}
toggleTranslation(setting.player.isShowLyricTranslation)
toggleRoma(setting.player.isShowLyricRoma)
if (setting.sync.enable) {
connect().catch(err => {
if (err.message == SYNC_CODE.unknownServiceAddress) {

326
package-lock.json generated
View File

@ -10,26 +10,26 @@
"hasInstallScript": true,
"license": "Apache-2.0",
"dependencies": {
"@react-native-async-storage/async-storage": "^1.17.3",
"@react-native-async-storage/async-storage": "^1.17.4",
"@react-native-clipboard/clipboard": "^1.10.0",
"@react-native-community/checkbox": "^0.5.12",
"@react-native-community/slider": "^4.2.2",
"buffer": "^6.0.3",
"console-browserify": "^1.2.0",
"events": "^3.3.0",
"i18next": "^21.6.16",
"i18next": "^21.8.0",
"js-htmlencode": "^0.3.0",
"lrc-file-parser": "^1.2.7",
"lrc-file-parser": "^2.0.0",
"pako": "^2.0.4",
"process": "^0.11.10",
"prop-types": "^15.8.1",
"react": "17.0.2",
"react-i18next": "^11.16.7",
"react-native": "0.68.1",
"react-i18next": "^11.16.9",
"react-native": "0.68.2",
"react-native-background-timer": "^2.4.1",
"react-native-crypto": "^2.2.0",
"react-native-exception-handler": "^2.10.10",
"react-native-fs": "^2.19.0",
"react-native-fs": "^2.20.0",
"react-native-navigation": "^7.27.1",
"react-native-pager-view": "^5.4.15",
"react-native-randombytes": "^3.6.1",
@ -56,7 +56,7 @@
"babel-plugin-module-resolver": "^4.1.0",
"changelog-parser": "^2.8.1",
"cross-env": "^7.0.3",
"eslint": "^8.14.0",
"eslint": "^8.15.0",
"eslint-config-standard": "^17.0.0",
"eslint-plugin-html": "^6.2.0",
"eslint-plugin-import": "^2.26.0",
@ -1417,12 +1417,12 @@
}
},
"node_modules/@babel/plugin-transform-named-capturing-groups-regex": {
"version": "7.16.8",
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.8.tgz",
"integrity": "sha512-j3Jw+n5PvpmhRR+mrgIh04puSANCk/T/UA3m3P1MjJkhlK906+ApHhDIqBQDdOgL/r1UYpz4GNclTXxyZrYGSw==",
"version": "7.17.10",
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.17.10.tgz",
"integrity": "sha512-v54O6yLaJySCs6mGzaVOUw9T967GnH38T6CQSAtnzdNPwu84l2qAjssKzo/WSO8Yi7NF+7ekm5cVbF/5qiIgNA==",
"peer": true,
"dependencies": {
"@babel/helper-create-regexp-features-plugin": "^7.16.7"
"@babel/helper-create-regexp-features-plugin": "^7.17.0"
},
"engines": {
"node": ">=6.9.0"
@ -1730,27 +1730,27 @@
}
},
"node_modules/@babel/preset-env": {
"version": "7.16.11",
"resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.16.11.tgz",
"integrity": "sha512-qcmWG8R7ZW6WBRPZK//y+E3Cli151B20W1Rv7ln27vuPaXU/8TKms6jFdiJtF7UDTxcrb7mZd88tAeK9LjdT8g==",
"version": "7.17.10",
"resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.17.10.tgz",
"integrity": "sha512-YNgyBHZQpeoBSRBg0xixsZzfT58Ze1iZrajvv0lJc70qDDGuGfonEnMGfWeSY0mQ3JTuCWFbMkzFRVafOyJx4g==",
"peer": true,
"dependencies": {
"@babel/compat-data": "^7.16.8",
"@babel/helper-compilation-targets": "^7.16.7",
"@babel/compat-data": "^7.17.10",
"@babel/helper-compilation-targets": "^7.17.10",
"@babel/helper-plugin-utils": "^7.16.7",
"@babel/helper-validator-option": "^7.16.7",
"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.16.7",
"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.16.7",
"@babel/plugin-proposal-async-generator-functions": "^7.16.8",
"@babel/plugin-proposal-class-properties": "^7.16.7",
"@babel/plugin-proposal-class-static-block": "^7.16.7",
"@babel/plugin-proposal-class-static-block": "^7.17.6",
"@babel/plugin-proposal-dynamic-import": "^7.16.7",
"@babel/plugin-proposal-export-namespace-from": "^7.16.7",
"@babel/plugin-proposal-json-strings": "^7.16.7",
"@babel/plugin-proposal-logical-assignment-operators": "^7.16.7",
"@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.7",
"@babel/plugin-proposal-numeric-separator": "^7.16.7",
"@babel/plugin-proposal-object-rest-spread": "^7.16.7",
"@babel/plugin-proposal-object-rest-spread": "^7.17.3",
"@babel/plugin-proposal-optional-catch-binding": "^7.16.7",
"@babel/plugin-proposal-optional-chaining": "^7.16.7",
"@babel/plugin-proposal-private-methods": "^7.16.11",
@ -1776,7 +1776,7 @@
"@babel/plugin-transform-block-scoping": "^7.16.7",
"@babel/plugin-transform-classes": "^7.16.7",
"@babel/plugin-transform-computed-properties": "^7.16.7",
"@babel/plugin-transform-destructuring": "^7.16.7",
"@babel/plugin-transform-destructuring": "^7.17.7",
"@babel/plugin-transform-dotall-regex": "^7.16.7",
"@babel/plugin-transform-duplicate-keys": "^7.16.7",
"@babel/plugin-transform-exponentiation-operator": "^7.16.7",
@ -1785,15 +1785,15 @@
"@babel/plugin-transform-literals": "^7.16.7",
"@babel/plugin-transform-member-expression-literals": "^7.16.7",
"@babel/plugin-transform-modules-amd": "^7.16.7",
"@babel/plugin-transform-modules-commonjs": "^7.16.8",
"@babel/plugin-transform-modules-systemjs": "^7.16.7",
"@babel/plugin-transform-modules-commonjs": "^7.17.9",
"@babel/plugin-transform-modules-systemjs": "^7.17.8",
"@babel/plugin-transform-modules-umd": "^7.16.7",
"@babel/plugin-transform-named-capturing-groups-regex": "^7.16.8",
"@babel/plugin-transform-named-capturing-groups-regex": "^7.17.10",
"@babel/plugin-transform-new-target": "^7.16.7",
"@babel/plugin-transform-object-super": "^7.16.7",
"@babel/plugin-transform-parameters": "^7.16.7",
"@babel/plugin-transform-property-literals": "^7.16.7",
"@babel/plugin-transform-regenerator": "^7.16.7",
"@babel/plugin-transform-regenerator": "^7.17.9",
"@babel/plugin-transform-reserved-words": "^7.16.7",
"@babel/plugin-transform-shorthand-properties": "^7.16.7",
"@babel/plugin-transform-spread": "^7.16.7",
@ -1803,11 +1803,11 @@
"@babel/plugin-transform-unicode-escapes": "^7.16.7",
"@babel/plugin-transform-unicode-regex": "^7.16.7",
"@babel/preset-modules": "^0.1.5",
"@babel/types": "^7.16.8",
"@babel/types": "^7.17.10",
"babel-plugin-polyfill-corejs2": "^0.3.0",
"babel-plugin-polyfill-corejs3": "^0.5.0",
"babel-plugin-polyfill-regenerator": "^0.3.0",
"core-js-compat": "^3.20.2",
"core-js-compat": "^3.22.1",
"semver": "^6.3.0"
},
"engines": {
@ -2053,19 +2053,19 @@
}
},
"node_modules/@eslint/eslintrc": {
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.2.2.tgz",
"integrity": "sha512-lTVWHs7O2hjBFZunXTZYnYqtB9GakA1lnxIf+gKq2nY5gxkkNi/lQvveW6t8gFdOHTg6nG50Xs95PrLqVpcaLg==",
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.2.3.tgz",
"integrity": "sha512-uGo44hIwoLGNyduRpjdEpovcbMdd+Nv7amtmJxnKmI8xj6yd5LncmSwDa5NgX/41lIFJtkjD6YdVfgEzPfJ5UA==",
"dev": true,
"dependencies": {
"ajv": "^6.12.4",
"debug": "^4.3.2",
"espree": "^9.3.1",
"espree": "^9.3.2",
"globals": "^13.9.0",
"ignore": "^5.2.0",
"import-fresh": "^3.2.1",
"js-yaml": "^4.1.0",
"minimatch": "^3.0.4",
"minimatch": "^3.1.2",
"strip-json-comments": "^3.1.1"
},
"engines": {
@ -2096,9 +2096,9 @@
}
},
"node_modules/@eslint/eslintrc/node_modules/globals": {
"version": "13.13.0",
"resolved": "https://registry.npmjs.org/globals/-/globals-13.13.0.tgz",
"integrity": "sha512-EQ7Q18AJlPwp3vUDL4mKA0KXrXyNIQyWon6T6XQiBQF0XHvRsiCSrWmmeATpUzdJN2HhWZU6Pdl0a9zdep5p6A==",
"version": "13.14.0",
"resolved": "https://registry.npmjs.org/globals/-/globals-13.14.0.tgz",
"integrity": "sha512-ERO68sOYwm5UuLvSJTY7w7NP2c8S4UcXs3X1GBX8cwOr+ShOcDBbCY5mH4zxz0jsYCdJ8ve8Mv9n2YGJMB1aeg==",
"dev": true,
"dependencies": {
"type-fest": "^0.20.2"
@ -2630,9 +2630,9 @@
}
},
"node_modules/@react-native-async-storage/async-storage": {
"version": "1.17.3",
"resolved": "https://registry.npmjs.org/@react-native-async-storage/async-storage/-/async-storage-1.17.3.tgz",
"integrity": "sha512-2dxdlGwBjBP2qYu6F72U7cRRFshISYiNEWCaQNOJtxUERCMaYRWcniYqhL248KSbGUMpRhFCEtliztsiGoYYMA==",
"version": "1.17.4",
"resolved": "https://registry.npmjs.org/@react-native-async-storage/async-storage/-/async-storage-1.17.4.tgz",
"integrity": "sha512-c6GglKBRaWkjNyYd0FM8f0/neQEcwQom4MjZNqYSsIz55LcddJb7W8GM/n2dkzZ0JnaMylMX3+Vo+fpmkFEGTQ==",
"dependencies": {
"merge-options": "^3.0.4"
},
@ -4234,9 +4234,9 @@
]
},
"node_modules/browserslist": {
"version": "4.20.2",
"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.2.tgz",
"integrity": "sha512-CQOBCqp/9pDvDbx3xfMi+86pr4KXIf2FDkTTdeuYw8OxS9t898LA1Khq57gtufFILXpfgsSx5woNgsBgvGjpsA==",
"version": "4.20.3",
"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.3.tgz",
"integrity": "sha512-NBhymBQl1zM0Y5dQT/O+xiLP9/rzOIQdKM/eMJBAq7yBgaB6krIYLGejrwVYnSHZdqjscB1SPuAjHwxjvN6Wdg==",
"funding": [
{
"type": "opencollective",
@ -4248,10 +4248,10 @@
}
],
"dependencies": {
"caniuse-lite": "^1.0.30001317",
"electron-to-chromium": "^1.4.84",
"caniuse-lite": "^1.0.30001332",
"electron-to-chromium": "^1.4.118",
"escalade": "^3.1.1",
"node-releases": "^2.0.2",
"node-releases": "^2.0.3",
"picocolors": "^1.0.0"
},
"bin": {
@ -4406,9 +4406,9 @@
}
},
"node_modules/caniuse-lite": {
"version": "1.0.30001331",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001331.tgz",
"integrity": "sha512-Y1xk6paHpUXKP/P6YjQv1xqyTbgAP05ycHBcRdQjTcyXlWol868sJJPlmk5ylOekw2BrucWes5jk+LvVd7WZ5Q==",
"version": "1.0.30001338",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001338.tgz",
"integrity": "sha512-1gLHWyfVoRDsHieO+CaeYe7jSo/MT7D7lhaXUiwwbuR5BwQxORs0f1tAwUSQr3YbxRXJvxHM/PA5FfPQRnsPeQ==",
"funding": [
{
"type": "opencollective",
@ -4744,11 +4744,11 @@
}
},
"node_modules/core-js-compat": {
"version": "3.21.1",
"resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.21.1.tgz",
"integrity": "sha512-gbgX5AUvMb8gwxC7FLVWYT7Kkgu/y7+h/h1X43yJkNqhlK2fuYyQimqvKGNZFAY6CKii/GFKJ2cp/1/42TN36g==",
"version": "3.22.4",
"resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.22.4.tgz",
"integrity": "sha512-dIWcsszDezkFZrfm1cnB4f/J85gyhiCpxbgBdohWCDtSVuAaChTSpPV7ldOQf/Xds2U5xCIJZOK82G4ZPAIswA==",
"dependencies": {
"browserslist": "^4.19.1",
"browserslist": "^4.20.3",
"semver": "7.0.0"
},
"funding": {
@ -5306,9 +5306,9 @@
"integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
},
"node_modules/electron-to-chromium": {
"version": "1.4.107",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.107.tgz",
"integrity": "sha512-Huen6taaVrUrSy8o7mGStByba8PfOWWluHNxSHGBrCgEdFVLtvdQDBr9LBCF9Uci8SYxh28QNNMO0oC17wbGAg=="
"version": "1.4.137",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.137.tgz",
"integrity": "sha512-0Rcpald12O11BUogJagX3HsCN3FE83DSqWjgXoHo5a72KUKMSfI39XBgJpgNNxS9fuGzytaFjE06kZkiVFy2qA=="
},
"node_modules/elliptic": {
"version": "6.5.4",
@ -5661,12 +5661,12 @@
}
},
"node_modules/eslint": {
"version": "8.14.0",
"resolved": "https://registry.npmjs.org/eslint/-/eslint-8.14.0.tgz",
"integrity": "sha512-3/CE4aJX7LNEiE3i6FeodHmI/38GZtWCsAtsymScmzYapx8q1nVVb+eLcLSzATmCPXw5pT4TqVs1E0OmxAd9tw==",
"version": "8.15.0",
"resolved": "https://registry.npmjs.org/eslint/-/eslint-8.15.0.tgz",
"integrity": "sha512-GG5USZ1jhCu8HJkzGgeK8/+RGnHaNYZGrGDzUtigK3BsGESW/rs2az23XqE0WVwDxy1VRvvjSSGu5nB0Bu+6SA==",
"dev": true,
"dependencies": {
"@eslint/eslintrc": "^1.2.2",
"@eslint/eslintrc": "^1.2.3",
"@humanwhocodes/config-array": "^0.9.2",
"ajv": "^6.10.0",
"chalk": "^4.0.0",
@ -5677,7 +5677,7 @@
"eslint-scope": "^7.1.1",
"eslint-utils": "^3.0.0",
"eslint-visitor-keys": "^3.3.0",
"espree": "^9.3.1",
"espree": "^9.3.2",
"esquery": "^1.4.0",
"esutils": "^2.0.2",
"fast-deep-equal": "^3.1.3",
@ -5693,7 +5693,7 @@
"json-stable-stringify-without-jsonify": "^1.0.1",
"levn": "^0.4.1",
"lodash.merge": "^4.6.2",
"minimatch": "^3.0.4",
"minimatch": "^3.1.2",
"natural-compare": "^1.4.0",
"optionator": "^0.9.1",
"regexpp": "^3.2.0",
@ -6397,13 +6397,13 @@
}
},
"node_modules/espree": {
"version": "9.3.1",
"resolved": "https://registry.npmjs.org/espree/-/espree-9.3.1.tgz",
"integrity": "sha512-bvdyLmJMfwkV3NCRl5ZhJf22zBFo1y8bYh3VYb+bfzqNB4Je68P2sSuXyuFquzWLebHpNd2/d5uv7yoP9ISnGQ==",
"version": "9.3.2",
"resolved": "https://registry.npmjs.org/espree/-/espree-9.3.2.tgz",
"integrity": "sha512-D211tC7ZwouTIuY5x9XnS0E9sWNChB7IYKX/Xp5eQj3nFXhqmiUDB9q27y76oFl8jTg3pXcQx/bpxMfs3CIZbA==",
"dev": true,
"dependencies": {
"acorn": "^8.7.0",
"acorn-jsx": "^5.3.1",
"acorn": "^8.7.1",
"acorn-jsx": "^5.3.2",
"eslint-visitor-keys": "^3.3.0"
},
"engines": {
@ -7455,9 +7455,9 @@
}
},
"node_modules/i18next": {
"version": "21.6.16",
"resolved": "https://registry.npmjs.org/i18next/-/i18next-21.6.16.tgz",
"integrity": "sha512-xJlzrVxG9CyAGsbMP1aKuiNr1Ed2m36KiTB7hjGMG2Zo4idfw3p9THUEu+GjBwIgEZ7F11ZbCzJcfv4uyfKNuw==",
"version": "21.8.0",
"resolved": "https://registry.npmjs.org/i18next/-/i18next-21.8.0.tgz",
"integrity": "sha512-opNd7cQj0PDlUX15hPjtzReRxy5/Rn405YvHTBEm1nf1YJhsqYFFFhHMwuU4NEHZNlrepHk5uK+CJbFtB+KO3w==",
"funding": [
{
"type": "individual",
@ -9488,9 +9488,9 @@
}
},
"node_modules/lrc-file-parser": {
"version": "1.2.7",
"resolved": "https://registry.npmjs.org/lrc-file-parser/-/lrc-file-parser-1.2.7.tgz",
"integrity": "sha512-z2+1tUH3N054vFNXvF8F6g0vXWXf66IWJC1cdue8tfdYlK6FXKPsE3ReUmbzHDber+gmSHt1kDlkCJISZ4BBDQ=="
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/lrc-file-parser/-/lrc-file-parser-2.0.0.tgz",
"integrity": "sha512-h7cPj6D0R/7Wsy2F9UhTQNqWCZisl7GmaDhwDKAINruOsryadNJnrDJpCj+HUHioNxtziuw+yPs8FEazqZlRNA=="
},
"node_modules/lru-cache": {
"version": "6.0.0",
@ -11446,9 +11446,9 @@
}
},
"node_modules/react-i18next": {
"version": "11.16.7",
"resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-11.16.7.tgz",
"integrity": "sha512-7yotILJLnKfvUfrl/nt9eK9vFpVFjZPLWAwBzWL6XppSZZEvlmlKk0GBGDCAPfLfs8oND7WAbry8wGzdoiW5Nw==",
"version": "11.16.9",
"resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-11.16.9.tgz",
"integrity": "sha512-euXxWvcEAvsY7ZVkwx9ztCq4butqtsGHEkpkuo0RMj8Ru09IF9o2KxCyN+zyv51Nr0aBh/elaTIiR6fMb8YfVg==",
"dependencies": {
"@babel/runtime": "^7.14.5",
"html-escaper": "^2.0.2",
@ -11478,9 +11478,9 @@
"integrity": "sha512-txfpPCQYiazVdcbMRhatqWKcAxJweUu2wDXvts5/7Wyp6+Y9cHojqXHsLPEckzutfHlxZhG8Oiundbmp8Fd6eQ=="
},
"node_modules/react-native": {
"version": "0.68.1",
"resolved": "https://registry.npmjs.org/react-native/-/react-native-0.68.1.tgz",
"integrity": "sha512-5gfvslo5NO2Ece2k/q41eVOK3ca4u1QAOf+qM+auvOiUA4/QR5Yr0WfSGbRpUr2GaFgv7qP11F4+elCravg7uQ==",
"version": "0.68.2",
"resolved": "https://registry.npmjs.org/react-native/-/react-native-0.68.2.tgz",
"integrity": "sha512-qNMz+mdIirCEmlrhapAtAG+SWVx6MAiSfCbFNhfHqiqu1xw1OKXdzIrjaBEPihRC2pcORCoCHduHGQe/Pz9Yuw==",
"dependencies": {
"@jest/create-cache-key-function": "^27.0.1",
"@react-native-community/cli": "^7.0.3",
@ -11504,7 +11504,7 @@
"pretty-format": "^26.5.2",
"promise": "^8.0.3",
"react-devtools-core": "^4.23.0",
"react-native-codegen": "^0.0.13",
"react-native-codegen": "^0.0.17",
"react-native-gradle-plugin": "^0.0.6",
"react-refresh": "^0.4.0",
"react-shallow-renderer": "16.14.1",
@ -11546,9 +11546,9 @@
}
},
"node_modules/react-native-codegen": {
"version": "0.0.13",
"resolved": "https://registry.npmjs.org/react-native-codegen/-/react-native-codegen-0.0.13.tgz",
"integrity": "sha512-rCh1P+s0Q4N6vNgS97ckafbhJRztz22+0l0VZoyQC06F07J98kI5cUByH0ATypPRIdpkMbAZc59DoPdDFc01bg==",
"version": "0.0.17",
"resolved": "https://registry.npmjs.org/react-native-codegen/-/react-native-codegen-0.0.17.tgz",
"integrity": "sha512-7GIEUmAemH9uWwB6iYXNNsPoPgH06pxzGRmdBzK98TgFBdYJZ7CBuZFPMe4jmHQTPOkQazKZ/w5O6/71JBixmw==",
"dependencies": {
"@babel/parser": "^7.14.0",
"flow-parser": "^0.121.0",
@ -11589,9 +11589,9 @@
}
},
"node_modules/react-native-fs": {
"version": "2.19.0",
"resolved": "https://registry.npmjs.org/react-native-fs/-/react-native-fs-2.19.0.tgz",
"integrity": "sha512-Yl09IbETkV5UJcBtVtBLttyTmiAhJIHpGA/LvredI5dYiw3MXMMVu42bzELiuH2Bwj7F+qd0fMNvgfBDiDxd2A==",
"version": "2.20.0",
"resolved": "https://registry.npmjs.org/react-native-fs/-/react-native-fs-2.20.0.tgz",
"integrity": "sha512-VkTBzs7fIDUiy/XajOSNk0XazFE9l+QlMAce7lGuebZcag5CnjszB+u4BdqzwaQOdcYb5wsJIsqq4kxInIRpJQ==",
"dependencies": {
"base-64": "^0.1.0",
"utf8": "^3.0.0"
@ -13572,9 +13572,9 @@
}
},
"node_modules/tslib": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz",
"integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw=="
"version": "2.4.0",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
"integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
},
"node_modules/type-check": {
"version": "0.4.0",
@ -15088,12 +15088,12 @@
}
},
"@babel/plugin-transform-named-capturing-groups-regex": {
"version": "7.16.8",
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.8.tgz",
"integrity": "sha512-j3Jw+n5PvpmhRR+mrgIh04puSANCk/T/UA3m3P1MjJkhlK906+ApHhDIqBQDdOgL/r1UYpz4GNclTXxyZrYGSw==",
"version": "7.17.10",
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.17.10.tgz",
"integrity": "sha512-v54O6yLaJySCs6mGzaVOUw9T967GnH38T6CQSAtnzdNPwu84l2qAjssKzo/WSO8Yi7NF+7ekm5cVbF/5qiIgNA==",
"peer": true,
"requires": {
"@babel/helper-create-regexp-features-plugin": "^7.16.7"
"@babel/helper-create-regexp-features-plugin": "^7.17.0"
}
},
"@babel/plugin-transform-new-target": {
@ -15275,27 +15275,27 @@
}
},
"@babel/preset-env": {
"version": "7.16.11",
"resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.16.11.tgz",
"integrity": "sha512-qcmWG8R7ZW6WBRPZK//y+E3Cli151B20W1Rv7ln27vuPaXU/8TKms6jFdiJtF7UDTxcrb7mZd88tAeK9LjdT8g==",
"version": "7.17.10",
"resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.17.10.tgz",
"integrity": "sha512-YNgyBHZQpeoBSRBg0xixsZzfT58Ze1iZrajvv0lJc70qDDGuGfonEnMGfWeSY0mQ3JTuCWFbMkzFRVafOyJx4g==",
"peer": true,
"requires": {
"@babel/compat-data": "^7.16.8",
"@babel/helper-compilation-targets": "^7.16.7",
"@babel/compat-data": "^7.17.10",
"@babel/helper-compilation-targets": "^7.17.10",
"@babel/helper-plugin-utils": "^7.16.7",
"@babel/helper-validator-option": "^7.16.7",
"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.16.7",
"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.16.7",
"@babel/plugin-proposal-async-generator-functions": "^7.16.8",
"@babel/plugin-proposal-class-properties": "^7.16.7",
"@babel/plugin-proposal-class-static-block": "^7.16.7",
"@babel/plugin-proposal-class-static-block": "^7.17.6",
"@babel/plugin-proposal-dynamic-import": "^7.16.7",
"@babel/plugin-proposal-export-namespace-from": "^7.16.7",
"@babel/plugin-proposal-json-strings": "^7.16.7",
"@babel/plugin-proposal-logical-assignment-operators": "^7.16.7",
"@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.7",
"@babel/plugin-proposal-numeric-separator": "^7.16.7",
"@babel/plugin-proposal-object-rest-spread": "^7.16.7",
"@babel/plugin-proposal-object-rest-spread": "^7.17.3",
"@babel/plugin-proposal-optional-catch-binding": "^7.16.7",
"@babel/plugin-proposal-optional-chaining": "^7.16.7",
"@babel/plugin-proposal-private-methods": "^7.16.11",
@ -15321,7 +15321,7 @@
"@babel/plugin-transform-block-scoping": "^7.16.7",
"@babel/plugin-transform-classes": "^7.16.7",
"@babel/plugin-transform-computed-properties": "^7.16.7",
"@babel/plugin-transform-destructuring": "^7.16.7",
"@babel/plugin-transform-destructuring": "^7.17.7",
"@babel/plugin-transform-dotall-regex": "^7.16.7",
"@babel/plugin-transform-duplicate-keys": "^7.16.7",
"@babel/plugin-transform-exponentiation-operator": "^7.16.7",
@ -15330,15 +15330,15 @@
"@babel/plugin-transform-literals": "^7.16.7",
"@babel/plugin-transform-member-expression-literals": "^7.16.7",
"@babel/plugin-transform-modules-amd": "^7.16.7",
"@babel/plugin-transform-modules-commonjs": "^7.16.8",
"@babel/plugin-transform-modules-systemjs": "^7.16.7",
"@babel/plugin-transform-modules-commonjs": "^7.17.9",
"@babel/plugin-transform-modules-systemjs": "^7.17.8",
"@babel/plugin-transform-modules-umd": "^7.16.7",
"@babel/plugin-transform-named-capturing-groups-regex": "^7.16.8",
"@babel/plugin-transform-named-capturing-groups-regex": "^7.17.10",
"@babel/plugin-transform-new-target": "^7.16.7",
"@babel/plugin-transform-object-super": "^7.16.7",
"@babel/plugin-transform-parameters": "^7.16.7",
"@babel/plugin-transform-property-literals": "^7.16.7",
"@babel/plugin-transform-regenerator": "^7.16.7",
"@babel/plugin-transform-regenerator": "^7.17.9",
"@babel/plugin-transform-reserved-words": "^7.16.7",
"@babel/plugin-transform-shorthand-properties": "^7.16.7",
"@babel/plugin-transform-spread": "^7.16.7",
@ -15348,11 +15348,11 @@
"@babel/plugin-transform-unicode-escapes": "^7.16.7",
"@babel/plugin-transform-unicode-regex": "^7.16.7",
"@babel/preset-modules": "^0.1.5",
"@babel/types": "^7.16.8",
"@babel/types": "^7.17.10",
"babel-plugin-polyfill-corejs2": "^0.3.0",
"babel-plugin-polyfill-corejs3": "^0.5.0",
"babel-plugin-polyfill-regenerator": "^0.3.0",
"core-js-compat": "^3.20.2",
"core-js-compat": "^3.22.1",
"semver": "^6.3.0"
},
"dependencies": {
@ -15529,19 +15529,19 @@
}
},
"@eslint/eslintrc": {
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.2.2.tgz",
"integrity": "sha512-lTVWHs7O2hjBFZunXTZYnYqtB9GakA1lnxIf+gKq2nY5gxkkNi/lQvveW6t8gFdOHTg6nG50Xs95PrLqVpcaLg==",
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.2.3.tgz",
"integrity": "sha512-uGo44hIwoLGNyduRpjdEpovcbMdd+Nv7amtmJxnKmI8xj6yd5LncmSwDa5NgX/41lIFJtkjD6YdVfgEzPfJ5UA==",
"dev": true,
"requires": {
"ajv": "^6.12.4",
"debug": "^4.3.2",
"espree": "^9.3.1",
"espree": "^9.3.2",
"globals": "^13.9.0",
"ignore": "^5.2.0",
"import-fresh": "^3.2.1",
"js-yaml": "^4.1.0",
"minimatch": "^3.0.4",
"minimatch": "^3.1.2",
"strip-json-comments": "^3.1.1"
},
"dependencies": {
@ -15561,9 +15561,9 @@
}
},
"globals": {
"version": "13.13.0",
"resolved": "https://registry.npmjs.org/globals/-/globals-13.13.0.tgz",
"integrity": "sha512-EQ7Q18AJlPwp3vUDL4mKA0KXrXyNIQyWon6T6XQiBQF0XHvRsiCSrWmmeATpUzdJN2HhWZU6Pdl0a9zdep5p6A==",
"version": "13.14.0",
"resolved": "https://registry.npmjs.org/globals/-/globals-13.14.0.tgz",
"integrity": "sha512-ERO68sOYwm5UuLvSJTY7w7NP2c8S4UcXs3X1GBX8cwOr+ShOcDBbCY5mH4zxz0jsYCdJ8ve8Mv9n2YGJMB1aeg==",
"dev": true,
"requires": {
"type-fest": "^0.20.2"
@ -15993,9 +15993,9 @@
}
},
"@react-native-async-storage/async-storage": {
"version": "1.17.3",
"resolved": "https://registry.npmjs.org/@react-native-async-storage/async-storage/-/async-storage-1.17.3.tgz",
"integrity": "sha512-2dxdlGwBjBP2qYu6F72U7cRRFshISYiNEWCaQNOJtxUERCMaYRWcniYqhL248KSbGUMpRhFCEtliztsiGoYYMA==",
"version": "1.17.4",
"resolved": "https://registry.npmjs.org/@react-native-async-storage/async-storage/-/async-storage-1.17.4.tgz",
"integrity": "sha512-c6GglKBRaWkjNyYd0FM8f0/neQEcwQom4MjZNqYSsIz55LcddJb7W8GM/n2dkzZ0JnaMylMX3+Vo+fpmkFEGTQ==",
"requires": {
"merge-options": "^3.0.4"
}
@ -17290,14 +17290,14 @@
}
},
"browserslist": {
"version": "4.20.2",
"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.2.tgz",
"integrity": "sha512-CQOBCqp/9pDvDbx3xfMi+86pr4KXIf2FDkTTdeuYw8OxS9t898LA1Khq57gtufFILXpfgsSx5woNgsBgvGjpsA==",
"version": "4.20.3",
"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.3.tgz",
"integrity": "sha512-NBhymBQl1zM0Y5dQT/O+xiLP9/rzOIQdKM/eMJBAq7yBgaB6krIYLGejrwVYnSHZdqjscB1SPuAjHwxjvN6Wdg==",
"requires": {
"caniuse-lite": "^1.0.30001317",
"electron-to-chromium": "^1.4.84",
"caniuse-lite": "^1.0.30001332",
"electron-to-chromium": "^1.4.118",
"escalade": "^3.1.1",
"node-releases": "^2.0.2",
"node-releases": "^2.0.3",
"picocolors": "^1.0.0"
}
},
@ -17407,9 +17407,9 @@
"integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg=="
},
"caniuse-lite": {
"version": "1.0.30001331",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001331.tgz",
"integrity": "sha512-Y1xk6paHpUXKP/P6YjQv1xqyTbgAP05ycHBcRdQjTcyXlWol868sJJPlmk5ylOekw2BrucWes5jk+LvVd7WZ5Q=="
"version": "1.0.30001338",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001338.tgz",
"integrity": "sha512-1gLHWyfVoRDsHieO+CaeYe7jSo/MT7D7lhaXUiwwbuR5BwQxORs0f1tAwUSQr3YbxRXJvxHM/PA5FfPQRnsPeQ=="
},
"capture-exit": {
"version": "2.0.0",
@ -17669,11 +17669,11 @@
"integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40="
},
"core-js-compat": {
"version": "3.21.1",
"resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.21.1.tgz",
"integrity": "sha512-gbgX5AUvMb8gwxC7FLVWYT7Kkgu/y7+h/h1X43yJkNqhlK2fuYyQimqvKGNZFAY6CKii/GFKJ2cp/1/42TN36g==",
"version": "3.22.4",
"resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.22.4.tgz",
"integrity": "sha512-dIWcsszDezkFZrfm1cnB4f/J85gyhiCpxbgBdohWCDtSVuAaChTSpPV7ldOQf/Xds2U5xCIJZOK82G4ZPAIswA==",
"requires": {
"browserslist": "^4.19.1",
"browserslist": "^4.20.3",
"semver": "7.0.0"
},
"dependencies": {
@ -18126,9 +18126,9 @@
"integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
},
"electron-to-chromium": {
"version": "1.4.107",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.107.tgz",
"integrity": "sha512-Huen6taaVrUrSy8o7mGStByba8PfOWWluHNxSHGBrCgEdFVLtvdQDBr9LBCF9Uci8SYxh28QNNMO0oC17wbGAg=="
"version": "1.4.137",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.137.tgz",
"integrity": "sha512-0Rcpald12O11BUogJagX3HsCN3FE83DSqWjgXoHo5a72KUKMSfI39XBgJpgNNxS9fuGzytaFjE06kZkiVFy2qA=="
},
"elliptic": {
"version": "6.5.4",
@ -18386,12 +18386,12 @@
}
},
"eslint": {
"version": "8.14.0",
"resolved": "https://registry.npmjs.org/eslint/-/eslint-8.14.0.tgz",
"integrity": "sha512-3/CE4aJX7LNEiE3i6FeodHmI/38GZtWCsAtsymScmzYapx8q1nVVb+eLcLSzATmCPXw5pT4TqVs1E0OmxAd9tw==",
"version": "8.15.0",
"resolved": "https://registry.npmjs.org/eslint/-/eslint-8.15.0.tgz",
"integrity": "sha512-GG5USZ1jhCu8HJkzGgeK8/+RGnHaNYZGrGDzUtigK3BsGESW/rs2az23XqE0WVwDxy1VRvvjSSGu5nB0Bu+6SA==",
"dev": true,
"requires": {
"@eslint/eslintrc": "^1.2.2",
"@eslint/eslintrc": "^1.2.3",
"@humanwhocodes/config-array": "^0.9.2",
"ajv": "^6.10.0",
"chalk": "^4.0.0",
@ -18402,7 +18402,7 @@
"eslint-scope": "^7.1.1",
"eslint-utils": "^3.0.0",
"eslint-visitor-keys": "^3.3.0",
"espree": "^9.3.1",
"espree": "^9.3.2",
"esquery": "^1.4.0",
"esutils": "^2.0.2",
"fast-deep-equal": "^3.1.3",
@ -18418,7 +18418,7 @@
"json-stable-stringify-without-jsonify": "^1.0.1",
"levn": "^0.4.1",
"lodash.merge": "^4.6.2",
"minimatch": "^3.0.4",
"minimatch": "^3.1.2",
"natural-compare": "^1.4.0",
"optionator": "^0.9.1",
"regexpp": "^3.2.0",
@ -18905,13 +18905,13 @@
"dev": true
},
"espree": {
"version": "9.3.1",
"resolved": "https://registry.npmjs.org/espree/-/espree-9.3.1.tgz",
"integrity": "sha512-bvdyLmJMfwkV3NCRl5ZhJf22zBFo1y8bYh3VYb+bfzqNB4Je68P2sSuXyuFquzWLebHpNd2/d5uv7yoP9ISnGQ==",
"version": "9.3.2",
"resolved": "https://registry.npmjs.org/espree/-/espree-9.3.2.tgz",
"integrity": "sha512-D211tC7ZwouTIuY5x9XnS0E9sWNChB7IYKX/Xp5eQj3nFXhqmiUDB9q27y76oFl8jTg3pXcQx/bpxMfs3CIZbA==",
"dev": true,
"requires": {
"acorn": "^8.7.0",
"acorn-jsx": "^5.3.1",
"acorn": "^8.7.1",
"acorn-jsx": "^5.3.2",
"eslint-visitor-keys": "^3.3.0"
},
"dependencies": {
@ -19709,9 +19709,9 @@
"dev": true
},
"i18next": {
"version": "21.6.16",
"resolved": "https://registry.npmjs.org/i18next/-/i18next-21.6.16.tgz",
"integrity": "sha512-xJlzrVxG9CyAGsbMP1aKuiNr1Ed2m36KiTB7hjGMG2Zo4idfw3p9THUEu+GjBwIgEZ7F11ZbCzJcfv4uyfKNuw==",
"version": "21.8.0",
"resolved": "https://registry.npmjs.org/i18next/-/i18next-21.8.0.tgz",
"integrity": "sha512-opNd7cQj0PDlUX15hPjtzReRxy5/Rn405YvHTBEm1nf1YJhsqYFFFhHMwuU4NEHZNlrepHk5uK+CJbFtB+KO3w==",
"requires": {
"@babel/runtime": "^7.17.2"
}
@ -21225,9 +21225,9 @@
}
},
"lrc-file-parser": {
"version": "1.2.7",
"resolved": "https://registry.npmjs.org/lrc-file-parser/-/lrc-file-parser-1.2.7.tgz",
"integrity": "sha512-z2+1tUH3N054vFNXvF8F6g0vXWXf66IWJC1cdue8tfdYlK6FXKPsE3ReUmbzHDber+gmSHt1kDlkCJISZ4BBDQ=="
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/lrc-file-parser/-/lrc-file-parser-2.0.0.tgz",
"integrity": "sha512-h7cPj6D0R/7Wsy2F9UhTQNqWCZisl7GmaDhwDKAINruOsryadNJnrDJpCj+HUHioNxtziuw+yPs8FEazqZlRNA=="
},
"lru-cache": {
"version": "6.0.0",
@ -22765,9 +22765,9 @@
}
},
"react-i18next": {
"version": "11.16.7",
"resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-11.16.7.tgz",
"integrity": "sha512-7yotILJLnKfvUfrl/nt9eK9vFpVFjZPLWAwBzWL6XppSZZEvlmlKk0GBGDCAPfLfs8oND7WAbry8wGzdoiW5Nw==",
"version": "11.16.9",
"resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-11.16.9.tgz",
"integrity": "sha512-euXxWvcEAvsY7ZVkwx9ztCq4butqtsGHEkpkuo0RMj8Ru09IF9o2KxCyN+zyv51Nr0aBh/elaTIiR6fMb8YfVg==",
"requires": {
"@babel/runtime": "^7.14.5",
"html-escaper": "^2.0.2",
@ -22785,9 +22785,9 @@
"integrity": "sha512-txfpPCQYiazVdcbMRhatqWKcAxJweUu2wDXvts5/7Wyp6+Y9cHojqXHsLPEckzutfHlxZhG8Oiundbmp8Fd6eQ=="
},
"react-native": {
"version": "0.68.1",
"resolved": "https://registry.npmjs.org/react-native/-/react-native-0.68.1.tgz",
"integrity": "sha512-5gfvslo5NO2Ece2k/q41eVOK3ca4u1QAOf+qM+auvOiUA4/QR5Yr0WfSGbRpUr2GaFgv7qP11F4+elCravg7uQ==",
"version": "0.68.2",
"resolved": "https://registry.npmjs.org/react-native/-/react-native-0.68.2.tgz",
"integrity": "sha512-qNMz+mdIirCEmlrhapAtAG+SWVx6MAiSfCbFNhfHqiqu1xw1OKXdzIrjaBEPihRC2pcORCoCHduHGQe/Pz9Yuw==",
"requires": {
"@jest/create-cache-key-function": "^27.0.1",
"@react-native-community/cli": "^7.0.3",
@ -22811,7 +22811,7 @@
"pretty-format": "^26.5.2",
"promise": "^8.0.3",
"react-devtools-core": "^4.23.0",
"react-native-codegen": "^0.0.13",
"react-native-codegen": "^0.0.17",
"react-native-gradle-plugin": "^0.0.6",
"react-refresh": "^0.4.0",
"react-shallow-renderer": "16.14.1",
@ -22836,9 +22836,9 @@
"dev": true
},
"react-native-codegen": {
"version": "0.0.13",
"resolved": "https://registry.npmjs.org/react-native-codegen/-/react-native-codegen-0.0.13.tgz",
"integrity": "sha512-rCh1P+s0Q4N6vNgS97ckafbhJRztz22+0l0VZoyQC06F07J98kI5cUByH0ATypPRIdpkMbAZc59DoPdDFc01bg==",
"version": "0.0.17",
"resolved": "https://registry.npmjs.org/react-native-codegen/-/react-native-codegen-0.0.17.tgz",
"integrity": "sha512-7GIEUmAemH9uWwB6iYXNNsPoPgH06pxzGRmdBzK98TgFBdYJZ7CBuZFPMe4jmHQTPOkQazKZ/w5O6/71JBixmw==",
"requires": {
"@babel/parser": "^7.14.0",
"flow-parser": "^0.121.0",
@ -22870,9 +22870,9 @@
"requires": {}
},
"react-native-fs": {
"version": "2.19.0",
"resolved": "https://registry.npmjs.org/react-native-fs/-/react-native-fs-2.19.0.tgz",
"integrity": "sha512-Yl09IbETkV5UJcBtVtBLttyTmiAhJIHpGA/LvredI5dYiw3MXMMVu42bzELiuH2Bwj7F+qd0fMNvgfBDiDxd2A==",
"version": "2.20.0",
"resolved": "https://registry.npmjs.org/react-native-fs/-/react-native-fs-2.20.0.tgz",
"integrity": "sha512-VkTBzs7fIDUiy/XajOSNk0XazFE9l+QlMAce7lGuebZcag5CnjszB+u4BdqzwaQOdcYb5wsJIsqq4kxInIRpJQ==",
"requires": {
"base-64": "^0.1.0",
"utf8": "^3.0.0"
@ -24442,9 +24442,9 @@
}
},
"tslib": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz",
"integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw=="
"version": "2.4.0",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
"integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
},
"type-check": {
"version": "0.4.0",

View File

@ -1,6 +1,6 @@
{
"name": "lx-music-mobile",
"version": "0.12.1-beta",
"version": "0.13.0-beta",
"versionCode": 41,
"scripts": {
"ar": "react-native run-android",
@ -38,26 +38,26 @@
},
"homepage": "https://github.com/lyswhut/lx-music-mobile#readme",
"dependencies": {
"@react-native-async-storage/async-storage": "^1.17.3",
"@react-native-async-storage/async-storage": "^1.17.4",
"@react-native-clipboard/clipboard": "^1.10.0",
"@react-native-community/checkbox": "^0.5.12",
"@react-native-community/slider": "^4.2.2",
"buffer": "^6.0.3",
"console-browserify": "^1.2.0",
"events": "^3.3.0",
"i18next": "^21.6.16",
"i18next": "^21.8.0",
"js-htmlencode": "^0.3.0",
"lrc-file-parser": "^1.2.7",
"lrc-file-parser": "^2.0.0",
"pako": "^2.0.4",
"process": "^0.11.10",
"prop-types": "^15.8.1",
"react": "17.0.2",
"react-i18next": "^11.16.7",
"react-native": "0.68.1",
"react-i18next": "^11.16.9",
"react-native": "0.68.2",
"react-native-background-timer": "^2.4.1",
"react-native-crypto": "^2.2.0",
"react-native-exception-handler": "^2.10.10",
"react-native-fs": "^2.19.0",
"react-native-fs": "^2.20.0",
"react-native-navigation": "^7.27.1",
"react-native-pager-view": "^5.4.15",
"react-native-randombytes": "^3.6.1",
@ -84,7 +84,7 @@
"babel-plugin-module-resolver": "^4.1.0",
"changelog-parser": "^2.8.1",
"cross-env": "^7.0.3",
"eslint": "^8.14.0",
"eslint": "^8.15.0",
"eslint-config-standard": "^17.0.0",
"eslint-plugin-html": "^6.2.0",
"eslint-plugin-import": "^2.26.0",

View File

@ -1,3 +1,7 @@
### 新增
- 新增设置-播放设置-显示歌词罗马音默认关闭目前只有网易源能获取到罗马音歌词如果你知道其他源的歌词罗马音获取方式欢迎PR
### 修复
- 修复潜在的桌面歌词导致应用崩溃问题

View File

@ -4,7 +4,7 @@
import { MUSIC_TOGGLE_MODE } from './constant'
const defaultSetting = {
version: '1.19',
version: '1.20',
player: {
togglePlayMethod: MUSIC_TOGGLE_MODE.listLoop,
highQuality: false,
@ -14,6 +14,7 @@ const defaultSetting = {
timeoutExitPlayed: true,
isHandleAudioFocus: true,
isShowLyricTranslation: false,
isShowLyricRoma: false,
isShowNotificationImage: true,
portrait: {
style: {

View File

@ -176,7 +176,8 @@
"setting_play_quality": "Play 320K quality songs first (if supported)",
"setting_play_save_play_time": "Remember playback progress",
"setting_play_show_notification_image": "Show song picture in notification bar",
"setting_play_show_translation": "Show lyrics translation",
"setting_play_show_roma": "Show lyrics roman (if available)",
"setting_play_show_translation": "Show lyrics translation (if available)",
"setting_sync": "Synchronization [It is recommended to back up the playlist before using it for the first time]",
"setting_sync_address": "Local IP address: {{address}}",
"setting_sync_code_fail": "Invalid connection code",

View File

@ -177,7 +177,8 @@
"setting_play_quality": "优先播放320K品质的歌曲如果支持",
"setting_play_save_play_time": "记住播放进度",
"setting_play_show_notification_image": "在通知栏显示歌曲图片",
"setting_play_show_translation": "显示歌词翻译",
"setting_play_show_roma": "显示歌词罗马音(如果可用)",
"setting_play_show_translation": "显示歌词翻译(如果可用)",
"setting_sync": "同步 [首次使用前建议先备份一次歌单]",
"setting_sync_address": "本机IP地址{{address}}",
"setting_sync_code_fail": "连接码无效",

View File

@ -11,8 +11,10 @@ const lrcTools = {
setLyricHooks: [],
isPlay: false,
isShowTranslation: false,
isShowRoma: false,
lyricText: '',
translationText: '',
romaText: '',
init() {
if (this.isInited) return
this.isInited = true
@ -47,6 +49,12 @@ const lrcTools = {
removeSetLyricHook(callback) {
this.setLyricHooks.splice(this.setLyricHooks.indexOf(callback), 1)
},
setLyric() {
const extendedLyrics = []
if (this.isShowTranslation && this.translationText) extendedLyrics.push(this.translationText)
if (this.isShowRoma && this.romaText) extendedLyrics.push(this.romaText)
this.lrc.setLyric(this.lyricText, extendedLyrics)
},
}
@ -54,16 +62,22 @@ export const init = async() => {
lrcTools.init()
}
export const setLyric = (lyric, translation = '') => {
export const setLyric = (lyric, translation, romalrc) => {
lrcTools.isPlay = false
lrcTools.lyricText = lyric
lrcTools.translationText = translation
lrcTools.lrc.setLyric(lrcTools.lyricText, lrcTools.isShowTranslation ? lrcTools.translationText : '')
lrcTools.romaText = romalrc
lrcTools.setLyric()
}
export const toggleTranslation = isShow => {
lrcTools.isShowTranslation = isShow
if (!lrcTools.lyricText) return
lrcTools.lrc.setLyric(lrcTools.lyricText, isShow ? lrcTools.translationText : '')
lrcTools.setLyric()
}
export const toggleRoma = isShow => {
lrcTools.isShowRoma = isShow
if (!lrcTools.lyricText) return
lrcTools.setLyric()
}
export const play = time => {
// console.log(time)

View File

@ -0,0 +1,20 @@
import React, { memo } from 'react'
import { View } from 'react-native'
import { useGetter, useDispatch } from '@/store'
import CheckBoxItem from '../components/CheckBoxItem'
import { useTranslation } from '@/plugins/i18n'
export default memo(() => {
const { t } = useTranslation()
const isShowLyricRoma = useGetter('common', 'isShowLyricRoma')
const setIsShowLyricRoma = useDispatch('common', 'setIsShowLyricRoma')
return (
<View style={{ marginTop: 15 }}>
<CheckBoxItem check={isShowLyricRoma} onChange={setIsShowLyricRoma} label={t('setting_play_show_roma')} />
</View>
)
})

View File

@ -5,6 +5,7 @@ import IsPlayHighQuality from './IsPlayHighQuality'
import IsHandleAudioFocus from './IsHandleAudioFocus'
import IsShowNotificationImage from './IsShowNotificationImage'
import IsShowLyricTranslation from './IsShowLyricTranslation'
import IsShowLyricRoma from './IsShowLyricRoma'
import MaxCache from './MaxCache'
import { useTranslation } from '@/plugins/i18n'
@ -43,6 +44,7 @@ export default memo(() => {
<IsHandleAudioFocus />
<IsShowNotificationImage />
<IsShowLyricTranslation />
<IsShowLyricRoma />
<MaxCache />
{/* <View style={{ marginLeft: 15, marginBottom: 15 }}>
<Text>播放歌曲切换方式</Text>

View File

@ -17,17 +17,17 @@ const LrcLine = memo(({ lrc, line, activeLine }) => {
...styles.lineText,
fontSize: playerLandscapeStyle.lrcFontSize / 10,
lineHeight: playerLandscapeStyle.lrcFontSize / 10 * 1.25,
color: activeLine == line ? theme.secondary : theme.normal30,
color: activeLine == line ? theme.secondary : theme.normal50,
}}>{lrc.text}</Text>
{
lrc.translation
? <Text style={{
lrc.extendedLyrics.map((lrc, index) => {
return (<Text style={{
...styles.lineTranslationText,
fontSize: playerLandscapeStyle.lrcFontSize / 10 * 0.8,
lineHeight: playerLandscapeStyle.lrcFontSize / 10 * 0.8 * 1.25,
color: activeLine == line ? theme.secondary : theme.normal30,
}}>{lrc.translation}</Text>
: null
color: activeLine == line ? theme.secondary : theme.normal50,
}} key={index}>{lrc}</Text>)
})
}
</View>
)

View File

@ -1,6 +1,6 @@
import React, { memo, useMemo, useCallback, useEffect, useRef } from 'react'
import { View, Text, StyleSheet, FlatList } from 'react-native'
import { useGetter, useDispatch } from '@/store'
import { useGetter } from '@/store'
// import { useLayout } from '@/utils/hooks'
import { useLrcPlay, useLrcSet } from '@/plugins/lyric'
// import { log } from '@/utils/log'
@ -19,14 +19,14 @@ const LrcLine = memo(({ lrc, line, activeLine }) => {
color: activeLine == line ? theme.secondary : theme.normal50,
}}>{lrc.text}</Text>
{
lrc.translation
? <Text style={{
lrc.extendedLyrics.map((lrc, index) => {
return (<Text style={{
...styles.lineTranslationText,
fontSize: playerPortraitStyle.lrcFontSize / 10 * 0.8,
lineHeight: playerPortraitStyle.lrcFontSize / 10 * 0.8 * 1.25,
color: activeLine == line ? theme.secondary : theme.normal50,
}}>{lrc.translation}</Text>
: null
}} key={index}>{lrc}</Text>)
})
}
</View>
)

View File

@ -38,6 +38,7 @@ export const TYPES = {
setIsHandleAudioFocus: null,
setAddMusicLocationType: null,
setIsShowLyricTranslation: null,
setIsShowLyricRoma: null,
setIsEnableSync: null,
setSyncStatus: null,
setIsClickPlayList: null,
@ -320,6 +321,16 @@ export const setIsShowLyricTranslation = flag => async(dispatch, getState) => {
await setData(settingKey, common.setting)
}
export const setIsShowLyricRoma = flag => async(dispatch, getState) => {
dispatch(playerAction.toggleRoma(flag))
dispatch({
type: TYPES.setIsShowLyricRoma,
payload: flag,
})
const { common } = getState()
await setData(settingKey, common.setting)
}
export const setIsShowDesktopLyric = flag => async(dispatch, getState) => {
await dispatch(playerAction.toggleDesktopLyric(flag))
dispatch({

View File

@ -61,6 +61,7 @@ export const desktopLyricStyle = state => state.common.setting.desktopLyric.styl
export const timeoutExit = state => state.common.setting.player.timeoutExit
export const timeoutExitPlayed = state => state.common.setting.player.timeoutExitPlayed
export const isShowLyricTranslation = state => state.common.setting.player.isShowLyricTranslation
export const isShowLyricRoma = state => state.common.setting.player.isShowLyricRoma
export const activeApiSourceId = state => state.common.setting.apiSource

View File

@ -306,6 +306,18 @@ const mutations = {
},
}
},
[TYPES.setIsShowLyricRoma](state, isShowLyricRoma) {
return {
...state,
setting: {
...state.setting,
player: {
...state.setting.player,
isShowLyricRoma,
},
},
}
},
[TYPES.setIsShowDesktopLyric](state, isShowDesktopLyric) {
return {
...state,

View File

@ -20,7 +20,7 @@ import {
import { getRandom } from '@/utils'
import { getMusicUrl, saveMusicUrl, getLyric, saveLyric, assertApiSupport, savePlayInfo, saveList, checkNotificationPermission } from '@/utils/tools'
import { playInfo as playInfoGetter } from './getter'
import { play as lrcPlay, setLyric, pause as lrcPause, toggleTranslation as lrcToggleTranslation } from '@/utils/lyric'
import { play as lrcPlay, setLyric, pause as lrcPause, toggleTranslation as lrcToggleTranslation, toggleRoma as lrcToggleRoma } from '@/utils/lyric'
import { showLyric, hideLyric, setLyric as lrcdSetLyric, toggleLock, setTheme, setLyricTextPosition, setAlpha, setTextSize } from '@/utils/lyricDesktop'
import { action as listAction } from '@/store/modules/list'
import { LIST_ID_PLAY_LATER, MUSIC_TOGGLE_MODE } from '@/config/constant'
@ -142,10 +142,10 @@ const handlePlayMusic = async({ getState, dispatch, playMusicInfo, musicInfo, is
}
})
}
dispatch(getLrc(musicInfo)).then(({ lyric, tlyric }) => {
dispatch(getLrc(musicInfo)).then(({ lyric, tlyric, rlyric }) => {
if (playMusicId != id) return
const player = getState().player
setLyric(lyric, tlyric)
setLyric(lyric, tlyric, rlyric)
if (player.status == STATUS.playing && !player.isGettingUrl) {
getPosition().then(position => {
lrcPlay(position * 1000)
@ -201,10 +201,10 @@ const handlePlayMusic = async({ getState, dispatch, playMusicInfo, musicInfo, is
delayUpdateMusicInfo(buildTrack({ musicInfo, type }))
})
}
dispatch(getLrc(musicInfo)).then(({ lyric, tlyric }) => {
dispatch(getLrc(musicInfo)).then(({ lyric, tlyric, rlyric }) => {
if (playMusicId != id) return
const player = getState().player
setLyric(lyric, tlyric)
setLyric(lyric, tlyric, rlyric)
if (player.status == STATUS.playing && !player.isGettingUrl) {
getPosition().then(position => {
lrcPlay(position * 1000)
@ -513,11 +513,15 @@ export const getPic = musicInfo => (dispatch, getState) => {
}
export const getLrc = musicInfo => async(dispatch, getState) => {
let lyricInfo = await getLyric(musicInfo)
if (lyricInfo.lyric && lyricInfo.tlyric != null) return lyricInfo
if (lyricInfo.lyric && lyricInfo.tlyric != null) {
if (lyricInfo.rlyric == null) {
if (musicInfo.source != 'wy') return lyricInfo
} return lyricInfo
}
return handleGetLyric(dispatch, getState().player.listInfo.id, musicInfo).then(({ lyric, tlyric }) => {
return handleGetLyric(dispatch, getState().player.listInfo.id, musicInfo).then(({ lyric, tlyric, rlyric }) => {
// picRequest = null
lyricInfo = { lyric, tlyric }
lyricInfo = { lyric, tlyric, rlyric }
saveLyric(musicInfo, lyricInfo)
return lyricInfo
}).catch(err => {
@ -799,14 +803,24 @@ export const toggleTranslation = isShow => async(dispatch, getState) => {
}
}
export const toggleRoma = isShow => async(dispatch, getState) => {
lrcToggleRoma(isShow)
const player = getState().player
if (player.status == STATUS.playing && !player.isGettingUrl) {
getPosition().then(position => {
lrcPlay(position * 1000)
})
}
}
export const toggleDesktopLyric = isShow => async(dispatch, getState) => {
if (isShow) {
const { common, player } = getState()
const desktopLyric = common.setting.desktopLyric
const [{ lyric, tlyric }] = await Promise.all([
const [{ lyric, tlyric, rlyric }] = await Promise.all([
_playMusicInfo
? getLyric(_playMusicInfo).catch(() => ({ lyric: '', tlyric: '' }))
: Promise.resolve({ lyric: '', tlyric: '' }),
? getLyric(_playMusicInfo).catch(() => ({ lyric: '', tlyric: '', rlyric: '' }))
: Promise.resolve({ lyric: '', tlyric: '', rlyric: '' }),
showLyric({
isLock: desktopLyric.isLock,
themeId: desktopLyric.theme,
@ -818,7 +832,7 @@ export const toggleDesktopLyric = isShow => async(dispatch, getState) => {
textPositionY: desktopLyric.textPosition.y,
}),
])
await lrcdSetLyric(lyric, tlyric)
await lrcdSetLyric(lyric, tlyric, rlyric)
if (player.status == STATUS.playing && !player.isGettingUrl) {
getPosition().then(position => {
lrcPlay(position * 1000)

View File

@ -3,6 +3,7 @@ import {
setLyric as lrcSetLyric,
pause as lrcPause,
toggleTranslation as lrcToggleTranslation,
toggleRoma as lrcToggleRoma,
init as lrcInit,
} from '@/plugins/lyric'
import {
@ -10,6 +11,7 @@ import {
setLyric as lrcdSetLyric,
pause as lrcdPause,
toggleTranslation as lrcdToggleTranslation,
toggleRoma as lrcdToggleRoma,
} from '@/utils/lyricDesktop'
/**
@ -25,9 +27,9 @@ export const init = () => {
* @param {String} lyric lyric str
* @param {String} translation lyric translation
*/
export const setLyric = (lyric, translation) => {
lrcdSetLyric(lyric, translation)
lrcSetLyric(lyric, translation)
export const setLyric = (lyric, translation = '', romalrc = '') => {
lrcdSetLyric(lyric, translation, romalrc)
lrcSetLyric(lyric, translation, romalrc)
}
/**
@ -56,3 +58,12 @@ export const toggleTranslation = isShowTranslation => {
lrcdToggleTranslation(isShowTranslation)
}
/**
* toggle show roma lyric
* @param {Boolean} isShowLyricRoma is show roma lyric
*/
export const toggleRoma = isShowLyricRoma => {
lrcToggleRoma(isShowLyricRoma)
lrcdToggleRoma(isShowLyricRoma)
}

View File

@ -92,9 +92,9 @@ export const pause = () => {
* @param {String} translation lyric translation
* @returns {Promise} Promise
*/
export const setLyric = (lyric, translation) => {
export const setLyric = (lyric, translation, romalrc) => {
if (!isShowLyric) return Promise.resolve()
return LyricModule.setLyric(lyric, translation)
return LyricModule.setLyric(lyric, translation || '', romalrc || '')
}
/**
@ -107,6 +107,16 @@ export const toggleTranslation = isShowTranslation => {
return LyricModule.toggleTranslation(isShowTranslation)
}
/**
* toggle show roma lyric
* @param {Boolean} isShowRoma is show roma lyric
* @returns {Promise} Promise
*/
export const toggleRoma = isShowRoma => {
// if (!isShowLyric) return Promise.resolve()
return LyricModule.toggleRoma(isShowRoma)
}
/**
* toggle is lock lyric window
* @param {Boolean} isLock is lock lyric window

View File

@ -40,12 +40,13 @@ export default songmid => {
'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36',
form: linuxapi({
method: 'POST',
url: 'https://music.163.com/api/song/lyric',
url: 'https://music.163.com/api/song/lyric?_nmclfl=1',
params: {
id: songmid,
lv: -1,
kv: -1,
tv: -1,
lv: -1,
rv: -1,
kv: -1,
},
}),
})
@ -54,6 +55,7 @@ export default songmid => {
return {
lyric: body.lrc.lyric,
tlyric: body.tlyric.lyric,
rlyric: body.romalrc?.lyric ?? '',
// lxlyric: parseLyric(body.klyric.lyric),
}
})

View File

@ -187,7 +187,7 @@ export const clearMusicUrl = async() => {
}
export const getLyric = musicInfo => getData(`${storageDataPrefix.lyric}${musicInfo.source}_${musicInfo.songmid}`).then(lrcInfo => lrcInfo || {})
export const saveLyric = (musicInfo, { lyric, tlyric, lxlyric }) => setData(`${storageDataPrefix.lyric}${musicInfo.source}_${musicInfo.songmid}`, { lyric, tlyric, lxlyric })
export const saveLyric = (musicInfo, { lyric, tlyric, rlyric, lxlyric }) => setData(`${storageDataPrefix.lyric}${musicInfo.source}_${musicInfo.songmid}`, { lyric, tlyric, rlyric, lxlyric })
export const clearLyric = async() => {
let keys = (await getAllKeys()).filter(key => key.startsWith(storageDataPrefix.lyric))
await removeDataMultiple(keys)