@uimaxbai/am-lyrics 1.5.0 → 1.5.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"AmLyrics.d.ts","sourceRoot":"","sources":["../../src/AmLyrics.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"AmLyrics.d.ts","sourceRoot":"","sources":["../../src/AmLyrics.ts"],"names":[],"mappings":"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"}
@@ -319,7 +319,7 @@ class GoogleService {
319
319
  }
320
320
  }
321
321
 
322
- const VERSION = '1.5.0';
322
+ const VERSION = '1.5.2';
323
323
  const INSTRUMENTAL_THRESHOLD_MS = 7000; // Show dots for gaps >= 7s
324
324
  const FETCH_TIMEOUT_MS = 8000; // Timeout for all lyrics fetch requests
325
325
  const SEEK_THRESHOLD_MS = 500;
@@ -597,20 +597,23 @@ class AmLyrics extends i {
597
597
  if (biniResult && biniResult.lines.length > 0) {
598
598
  collectedSources.push(biniResult);
599
599
  }
600
- if (collectedSources.length === 0) {
600
+ const hasWordSync = (sources) => sources.some(s => s.lines.some(l => l.isWordSynced || (l.text && l.text.length > 1)));
601
+ if (collectedSources.length === 0 || !hasWordSync(collectedSources)) {
601
602
  const unisonResult = await AmLyrics.fetchLyricsFromUnison(resolvedMetadata.metadata);
602
603
  if (unisonResult && unisonResult.lines.length > 0) {
603
604
  collectedSources.push(unisonResult);
604
605
  }
605
606
  }
606
- if (collectedSources.length === 0) {
607
+ if (collectedSources.length === 0 || !hasWordSync(collectedSources)) {
607
608
  const youLyResults = await AmLyrics.fetchLyricsFromYouLyPlus(title, artist, resolvedMetadata.catalogIsrc, resolvedMetadata.metadata, true);
608
609
  if (youLyResults && youLyResults.length > 0) {
609
610
  collectedSources.push(...youLyResults);
610
611
  }
611
612
  }
612
613
  }
613
- if (collectedSources.length === 0 && resolvedMetadata?.metadata) {
614
+ const hasLineSync = (sources) => sources.some(s => s.lines.some(l => l.timestamp > 0 || l.endtime > 0));
615
+ if ((collectedSources.length === 0 || !hasLineSync(collectedSources)) &&
616
+ resolvedMetadata?.metadata) {
614
617
  // Fallback: LRCLIB
615
618
  const lrclibResult = await AmLyrics.fetchLyricsFromLrclib(resolvedMetadata.metadata);
616
619
  if (lrclibResult && lrclibResult.lines.length > 0) {
@@ -761,6 +764,23 @@ class AmLyrics extends i {
761
764
  const resolvedMetadata = await this.resolveSongMetadata();
762
765
  if (resolvedMetadata?.metadata) {
763
766
  const newSources = [];
767
+ // Try Unison if not fetched
768
+ if (!this.availableSources.some(s => s.source.toLowerCase().includes('unison'))) {
769
+ const unisonResult = await AmLyrics.fetchLyricsFromUnison(resolvedMetadata.metadata);
770
+ if (unisonResult && unisonResult.lines.length > 0) {
771
+ newSources.push(unisonResult);
772
+ }
773
+ }
774
+ // Try YouLyPlus (KPoe) if we don't have Apple or QQ
775
+ if (!this.availableSources.some(s => s.source.toLowerCase().includes('apple') ||
776
+ s.source.toLowerCase().includes('qq'))) {
777
+ const title = resolvedMetadata.metadata.title?.trim() || '';
778
+ const artist = resolvedMetadata.metadata.artist?.trim() || '';
779
+ const youLyResults = await AmLyrics.fetchLyricsFromYouLyPlus(title, artist, resolvedMetadata.catalogIsrc, resolvedMetadata.metadata, true);
780
+ if (youLyResults && youLyResults.length > 0) {
781
+ newSources.push(...youLyResults);
782
+ }
783
+ }
764
784
  // Try LRCLIB if not fetched
765
785
  if (!this.availableSources.some(s => s.source.toLowerCase().includes('lrclib'))) {
766
786
  const lrclibResult = await AmLyrics.fetchLyricsFromLrclib(resolvedMetadata.metadata);
@@ -2036,6 +2056,15 @@ class AmLyrics extends i {
2036
2056
  const currentGap = this.findInstrumentalGapAt(newTime);
2037
2057
  if (currentGap) {
2038
2058
  this.lastInstrumentalIndex = currentGap.insertBeforeIndex;
2059
+ // Un-highlight the previous line immediately when gap dots are playing
2060
+ if (currentGap.insertBeforeIndex > 0) {
2061
+ const prevLine = this._getLineElement(currentGap.insertBeforeIndex - 1);
2062
+ if (prevLine &&
2063
+ prevLine.classList.contains('persist-highlight') &&
2064
+ !prevLine.classList.contains('active')) {
2065
+ AmLyrics.unfinishSyllables(prevLine);
2066
+ }
2067
+ }
2039
2068
  }
2040
2069
  else if (this.lastInstrumentalIndex !== null) {
2041
2070
  this.lastInstrumentalIndex = null;
@@ -2182,7 +2211,18 @@ class AmLyrics extends i {
2182
2211
  }
2183
2212
  // 1. Compute scroll lookahead based on gap to next line (YouLyPlus style)
2184
2213
  let scrollLookAheadMs = 350;
2185
- const currentAudioIndex = this.getLineIndexAtTime(this.currentTime, this.lastActiveIndex);
2214
+ let currentAudioIndex = -1;
2215
+ for (let i = 0; i < this.lyrics.length; i += 1) {
2216
+ if (this.lyrics[i].timestamp > this.currentTime) {
2217
+ currentAudioIndex = i - 1;
2218
+ break;
2219
+ }
2220
+ }
2221
+ if (currentAudioIndex === -1 && this.lyrics.length > 0) {
2222
+ if (this.currentTime >= this.lyrics[this.lyrics.length - 1].timestamp) {
2223
+ currentAudioIndex = this.lyrics.length - 1;
2224
+ }
2225
+ }
2186
2226
  if (currentAudioIndex !== -1 &&
2187
2227
  currentAudioIndex + 1 < this.lyrics.length) {
2188
2228
  const currentLine = this.lyrics[currentAudioIndex];
@@ -2193,29 +2233,32 @@ class AmLyrics extends i {
2193
2233
  // 2. Find scroll target at predictive time
2194
2234
  const predictiveTime = this.currentTime + scrollLookAheadMs;
2195
2235
  const predictiveActiveIndices = this.findActiveLineIndices(predictiveTime);
2196
- let targetLineIndex;
2236
+ let targetElement = null;
2197
2237
  if (predictiveActiveIndices.length > 0) {
2198
- targetLineIndex = this.getPrimaryScrollLineIndex(predictiveActiveIndices, predictiveTime);
2238
+ const targetLineIdx = this.getPrimaryScrollLineIndex(predictiveActiveIndices, predictiveTime);
2239
+ if (targetLineIdx !== null && targetLineIdx !== -1) {
2240
+ targetElement = this._getLineElement(targetLineIdx);
2241
+ }
2199
2242
  }
2200
- else {
2243
+ if (!targetElement) {
2201
2244
  // Fallback: closest line before predictiveTime
2202
- targetLineIndex = this.getLineIndexAtTime(predictiveTime, 0);
2245
+ const targetLineIdx = this.getLineIndexAtTime(predictiveTime, 0);
2246
+ if (targetLineIdx !== null && targetLineIdx !== -1) {
2247
+ targetElement = this._getLineElement(targetLineIdx);
2248
+ }
2203
2249
  }
2204
- if (targetLineIndex === null || targetLineIndex === -1)
2205
- return;
2206
- const targetLine = this._getLineElement(targetLineIndex);
2207
- if (!targetLine)
2250
+ if (!targetElement)
2208
2251
  return;
2209
2252
  // Unblur the upcoming target line early (pre-active) so background
2210
2253
  // vocals start their max-height/opacity transition in sync with scroll.
2211
- if (!targetLine.classList.contains('active')) {
2212
- targetLine.classList.add('pre-active');
2213
- if (!this.preActiveLineElements.includes(targetLine)) {
2214
- this.preActiveLineElements.push(targetLine);
2254
+ if (!targetElement.classList.contains('active')) {
2255
+ targetElement.classList.add('pre-active');
2256
+ if (!this.preActiveLineElements.includes(targetElement)) {
2257
+ this.preActiveLineElements.push(targetElement);
2215
2258
  }
2216
2259
  }
2217
2260
  const scrollDuration = scrollLookAheadMs;
2218
- this.focusLine(targetLine, forceScroll, scrollDuration);
2261
+ this.focusLine(targetElement, forceScroll, scrollDuration);
2219
2262
  }
2220
2263
  _getTextWidth(text, font) {
2221
2264
  if (!this._textWidthCanvas) {
@@ -3520,7 +3563,17 @@ class AmLyrics extends i {
3520
3563
  syllable.style.removeProperty('--pre-wipe-delay');
3521
3564
  const chars = syllable.querySelectorAll('span.char');
3522
3565
  for (let ci = 0; ci < chars.length; ci += 1) {
3523
- chars[ci].style.animation = '';
3566
+ const charEl = chars[ci];
3567
+ const currentAnim = charEl.style.animation || '';
3568
+ if (currentAnim.includes('grow-dynamic') ||
3569
+ currentAnim.includes('rise-char')) {
3570
+ const parts = currentAnim.split(',').map(p => p.trim());
3571
+ const transformAnim = parts.find(p => p.includes('grow-dynamic') || p.includes('rise-char'));
3572
+ charEl.style.animation = transformAnim || '';
3573
+ }
3574
+ else {
3575
+ charEl.style.animation = '';
3576
+ }
3524
3577
  }
3525
3578
  }
3526
3579
  }
@@ -4869,21 +4922,21 @@ AmLyrics.styles = i$3 `
4869
4922
  .lyrics-line.active:not(.lyrics-gap)
4870
4923
  .lyrics-word:not(.growable)
4871
4924
  .lyrics-syllable.highlight {
4872
- transform: translateY(-3.5%);
4925
+ transform: translate3d(0, var(--char-rise-y, -1.12px), 0);
4873
4926
  }
4874
4927
 
4875
4928
  .lyrics-line.persist-highlight:not(.lyrics-gap)
4876
4929
  .lyrics-word:not(.growable)
4877
4930
  .lyrics-syllable.finished {
4878
- transform: translateY(-3.5%);
4931
+ transform: translate3d(0, var(--char-rise-y, -1.12px), 0);
4879
4932
  }
4880
4933
 
4881
4934
  .lyrics-word.growable .lyrics-syllable.cleanup .char {
4882
- transform: translateY(-3.5%);
4935
+ transform: translate3d(0, var(--char-rise-y, -1.12px), 0);
4883
4936
  }
4884
4937
 
4885
4938
  .lyrics-word.char-rise .lyrics-syllable.cleanup .char {
4886
- transform: translateY(-3.5%);
4939
+ transform: translate3d(0, var(--char-rise-y, -1.12px), 0);
4887
4940
  }
4888
4941
 
4889
4942
  .lyrics-line.persist-highlight
@@ -4894,7 +4947,7 @@ AmLyrics.styles = i$3 `
4894
4947
  .lyrics-word.char-rise
4895
4948
  .lyrics-syllable.finished
4896
4949
  .char {
4897
- transform: translateY(-3.5%);
4950
+ transform: translate3d(0, var(--char-rise-y, -1.12px), 0);
4898
4951
  }
4899
4952
 
4900
4953
  /* Background vocal overrides — placed AFTER main rules so they win
@@ -4988,6 +5041,7 @@ AmLyrics.styles = i$3 `
4988
5041
  background-clip: text;
4989
5042
  -webkit-background-clip: text;
4990
5043
  backface-visibility: hidden;
5044
+ transform-origin: 50% 80%;
4991
5045
  transition:
4992
5046
  color 0.7s,
4993
5047
  background-color 0.7s,
@@ -5025,7 +5079,6 @@ AmLyrics.styles = i$3 `
5025
5079
  background-position:
5026
5080
  -0.5em 0%,
5027
5081
  -0.25em 0%;
5028
- transform-origin: 50% 80%;
5029
5082
  transition:
5030
5083
  transform 0.7s ease,
5031
5084
  color 0.18s;