fix lockfiles
This commit is contained in:
parent
0cbfa4d3f4
commit
edbec62a55
13 changed files with 33 additions and 33 deletions
|
|
@ -49,7 +49,7 @@ public class AudioPlaybackService extends Service {
|
|||
|
||||
acquireWakeLock();
|
||||
|
||||
// If the system kills this service, don't restart it automatically —
|
||||
// If the system kills this service, don't restart it automatically -
|
||||
// MainActivity will re-start it when audio resumes.
|
||||
return START_NOT_STICKY;
|
||||
}
|
||||
|
|
|
|||
4
bun.lock
4
bun.lock
|
|
@ -18,7 +18,7 @@
|
|||
"@svta/common-media-library": "^0.18.1",
|
||||
"@types/wicg-file-system-access": "^2023.10.7",
|
||||
"@typescript-eslint/eslint-plugin": "^8.57.2",
|
||||
"@uimaxbai/am-lyrics": "^1.1.7",
|
||||
"@uimaxbai/am-lyrics": "^1.1.8",
|
||||
"@vitest/web-worker": "^4.1.2",
|
||||
"appwrite": "^23.0.0",
|
||||
"butterchurn": "^2.6.7",
|
||||
|
|
@ -675,7 +675,7 @@
|
|||
|
||||
"@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.58.0", "", { "dependencies": { "@typescript-eslint/types": "8.58.0", "eslint-visitor-keys": "^5.0.0" } }, "sha512-XJ9UD9+bbDo4a4epraTwG3TsNPeiB9aShrUneAVXy8q4LuwowN+qu89/6ByLMINqvIMeI9H9hOHQtg/ijrYXzQ=="],
|
||||
|
||||
"@uimaxbai/am-lyrics": ["@uimaxbai/am-lyrics@1.1.7", "", { "dependencies": { "@babel/runtime": "^7.27.6", "lit": "^3.1.4" }, "peerDependencies": { "@lit/react": "^1.0.0", "react": ">=17.0.0" }, "optionalPeers": ["@lit/react", "react"] }, "sha512-hEwPl4dFmJ08sJf4VBaR7k7yxA3BNaoINS89j0KrkSFJYpCkohHDy24AIfzEMonPloJ3H6HBA55nCFMnAzm50w=="],
|
||||
"@uimaxbai/am-lyrics": ["@uimaxbai/am-lyrics@1.1.8", "", { "dependencies": { "@babel/runtime": "^7.27.6", "lit": "^3.1.4" }, "peerDependencies": { "@lit/react": "^1.0.0", "react": ">=17.0.0" }, "optionalPeers": ["@lit/react", "react"] }, "sha512-VcbrlB2cOmkOjElmivf2SZujDmj8UAUaBkXyIfJ8dYq/Iv4H3PxmQY/s9VaRfF6UTnCgfix8ZPll1T1MA8eS4A=="],
|
||||
|
||||
"@vitest/browser": ["@vitest/browser@4.1.2", "", { "dependencies": { "@blazediff/core": "1.9.1", "@vitest/mocker": "4.1.2", "@vitest/utils": "4.1.2", "magic-string": "^0.30.21", "pngjs": "^7.0.0", "sirv": "^3.0.2", "tinyrainbow": "^3.1.0", "ws": "^8.19.0" }, "peerDependencies": { "vitest": "4.1.2" } }, "sha512-CwdIf90LNf1Zitgqy63ciMAzmyb4oIGs8WZ40VGYrWkssQKeEKr32EzO8MKUrDPPcPVHFI9oQ5ni2Hp24NaNRQ=="],
|
||||
|
||||
|
|
|
|||
|
|
@ -48,10 +48,10 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
|
|||
|
||||
switch type {
|
||||
case .began:
|
||||
// Interruption began — system pauses audio automatically
|
||||
// Interruption began - system pauses audio automatically
|
||||
break
|
||||
case .ended:
|
||||
// Interruption ended — reactivate session so playback can resume
|
||||
// Interruption ended - reactivate session so playback can resume
|
||||
if let optionsValue = userInfo[AVAudioSessionInterruptionOptionKey] as? UInt {
|
||||
let options = AVAudioSession.InterruptionOptions(rawValue: optionsValue)
|
||||
if options.contains(.shouldResume) {
|
||||
|
|
@ -75,7 +75,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
|
|||
}
|
||||
|
||||
if reason == .oldDeviceUnavailable {
|
||||
// Headphones/Bluetooth disconnected — reactivate session to keep background alive
|
||||
// Headphones/Bluetooth disconnected - reactivate session to keep background alive
|
||||
do {
|
||||
try AVAudioSession.sharedInstance().setActive(true)
|
||||
} catch {
|
||||
|
|
|
|||
20
js/HiFi.ts
20
js/HiFi.ts
|
|
@ -108,7 +108,7 @@ export interface TidalArtistProfile {
|
|||
picture: string | null;
|
||||
/** Fallback album cover UUID used when no artist picture exists, or `null`. */
|
||||
selectedAlbumCoverFallback: string | null;
|
||||
/** Popularity score (0–100). */
|
||||
/** Popularity score (0-100). */
|
||||
popularity: number;
|
||||
/** List of credited roles for this artist. */
|
||||
artistRoles: TidalArtistRole[];
|
||||
|
|
@ -150,7 +150,7 @@ export interface TidalTrackAlbumRef {
|
|||
* Full track object as returned by the `/info` route and embedded in albums, playlists, and mixes.
|
||||
*
|
||||
* @remarks
|
||||
* Fields `bpm`, `key`, and `keyScale` are nullable — they are absent for some tracks.
|
||||
* Fields `bpm`, `key`, and `keyScale` are nullable - they are absent for some tracks.
|
||||
* `version` is present in the payload but may be `null`.
|
||||
*/
|
||||
export interface TidalTrack {
|
||||
|
|
@ -162,7 +162,7 @@ export interface TidalTrack {
|
|||
duration: number;
|
||||
/** Track replay-gain value in dB. */
|
||||
replayGain: number;
|
||||
/** Track peak amplitude (0–1). */
|
||||
/** Track peak amplitude (0-1). */
|
||||
peak: number;
|
||||
/** Whether the track is available for streaming. */
|
||||
allowStreaming: boolean;
|
||||
|
|
@ -186,7 +186,7 @@ export interface TidalTrack {
|
|||
volumeNumber: number;
|
||||
/** Version suffix (e.g. `"Remastered"`), or `null`. */
|
||||
version: string | null;
|
||||
/** Popularity score (0–100). */
|
||||
/** Popularity score (0-100). */
|
||||
popularity: number;
|
||||
/** Copyright notice. */
|
||||
copyright: string;
|
||||
|
|
@ -299,7 +299,7 @@ export interface TidalAlbum {
|
|||
explicit: boolean;
|
||||
/** UPC barcode. */
|
||||
upc: string;
|
||||
/** Popularity score (0–100). */
|
||||
/** Popularity score (0-100). */
|
||||
popularity: number;
|
||||
/** Highest available audio quality. */
|
||||
audioQuality: string;
|
||||
|
|
@ -339,7 +339,7 @@ export interface TidalVideoItem {
|
|||
volumeNumber: number;
|
||||
/** Track number on the disc. */
|
||||
trackNumber: number;
|
||||
/** Popularity score (0–100). */
|
||||
/** Popularity score (0-100). */
|
||||
popularity: number;
|
||||
/** Double-precision popularity score (present in topvideos). */
|
||||
doublePopularity?: number;
|
||||
|
|
@ -452,7 +452,7 @@ export interface TidalSimilarAlbum {
|
|||
releaseDate: string;
|
||||
/** Copyright information. */
|
||||
copyright: { text: string };
|
||||
/** Popularity score (0–1 float). */
|
||||
/** Popularity score (0-1 float). */
|
||||
popularity: number;
|
||||
/** Access type, e.g. `"PUBLIC"`. */
|
||||
accessType: string;
|
||||
|
|
@ -533,7 +533,7 @@ export interface SimilarArtist {
|
|||
url: string;
|
||||
/** Relation type, e.g. `"SIMILAR_ARTIST"`. */
|
||||
relationType: string;
|
||||
/** Popularity score (0–1 float). */
|
||||
/** Popularity score (0-1 float). */
|
||||
popularity: number;
|
||||
/** External link entries (e.g. TIDAL sharing URL). */
|
||||
externalLinks: Array<{ href: string; meta: { type: string } }>;
|
||||
|
|
@ -911,7 +911,7 @@ export interface TopVideosResponse extends VersionedResponse {
|
|||
export interface TidalAudioNormData {
|
||||
/** Replay gain value in dB. */
|
||||
replayGain: number;
|
||||
/** Peak amplitude (0–1). */
|
||||
/** Peak amplitude (0-1). */
|
||||
peakAmplitude: number;
|
||||
}
|
||||
|
||||
|
|
@ -961,7 +961,7 @@ export interface TrackManifestAttributes {
|
|||
export interface TrackManifestResource {
|
||||
/** Resource identifier (track ID as a string). */
|
||||
id: string;
|
||||
/** JSON:API resource type — always `"trackManifests"`. */
|
||||
/** JSON:API resource type - always `"trackManifests"`. */
|
||||
type: string;
|
||||
/** Manifest attributes. */
|
||||
attributes: TrackManifestAttributes;
|
||||
|
|
|
|||
|
|
@ -513,7 +513,7 @@ document.addEventListener('DOMContentLoaded', async () => {
|
|||
* visited the local tab yet).
|
||||
*/
|
||||
async function scanLocalMediaFolder(onlyIfAlreadyScanned = false) {
|
||||
// Skip the scan if the user has never visited the local tab – they'll
|
||||
// Skip the scan if the user has never visited the local tab - they'll
|
||||
// get a fresh scan when they navigate there for the first time.
|
||||
if (onlyIfAlreadyScanned && !window.localFilesCache) return;
|
||||
|
||||
|
|
|
|||
|
|
@ -1252,7 +1252,7 @@ class AudioContextManager {
|
|||
msChanged || this.filters.length !== count || (needsMS && this.midFilters.length !== count);
|
||||
|
||||
if (needsRebuild) {
|
||||
// M/S state changed or band count changed — full rebuild
|
||||
// M/S state changed or band count changed - full rebuild
|
||||
this._destroyMSFilters();
|
||||
this._destroyEQ();
|
||||
this._createEQ();
|
||||
|
|
@ -1261,7 +1261,7 @@ class AudioContextManager {
|
|||
}
|
||||
this._connectGraph();
|
||||
} else if (needsMS) {
|
||||
// M/S active — update both parallel chains in-place
|
||||
// M/S active - update both parallel chains in-place
|
||||
const now = this.audioContext.currentTime;
|
||||
|
||||
// Update main filters (not connected in M/S mode, kept in sync for stereo fallback)
|
||||
|
|
@ -1275,11 +1275,11 @@ class AudioContextManager {
|
|||
const sideGains = newGains.map((g, i) => (newChannels[i] === 'mid' ? 0 : g));
|
||||
this._updateFilterChain(this.sideFilters, newFrequencies, newTypes, newQs, sideGains, now);
|
||||
} else if (this.filters.length === count) {
|
||||
// Normal stereo — update in-place
|
||||
// Normal stereo - update in-place
|
||||
const now = this.audioContext.currentTime;
|
||||
this._updateFilterChain(this.filters, newFrequencies, newTypes, newQs, newGains, now);
|
||||
} else {
|
||||
// Band count changed — must rebuild
|
||||
// Band count changed - must rebuild
|
||||
this._destroyMSFilters();
|
||||
this._destroyEQ();
|
||||
this._createEQ();
|
||||
|
|
@ -1423,7 +1423,7 @@ class AudioContextManager {
|
|||
this.currentQs = qs;
|
||||
this.currentGains = gains;
|
||||
|
||||
// Reset M/S channel assignments — imported config has no channel info
|
||||
// Reset M/S channel assignments - imported config has no channel info
|
||||
this.currentChannels = new Array(this.bandCount).fill('stereo');
|
||||
this.msEnabled = false;
|
||||
|
||||
|
|
|
|||
|
|
@ -410,7 +410,7 @@ export class BinauralDSP {
|
|||
for (let i = 0; i < numChannels; i++) {
|
||||
const chInfo = CHANNEL_ANGLES_51[i];
|
||||
if (chInfo.isLFE) {
|
||||
// Placeholder — LFE uses gain node instead
|
||||
// Placeholder - LFE uses gain node instead
|
||||
this._mcConvolversL.push(null);
|
||||
this._mcConvolversR.push(null);
|
||||
continue;
|
||||
|
|
|
|||
|
|
@ -499,7 +499,7 @@ async function bulkDownload({
|
|||
* to the configured folder (Local Media Folder or saved Folder Picker handle),
|
||||
* or `null` if the feature is not active / no folder is configured.
|
||||
*
|
||||
* In contrast to {@link createBulkWriter}, this never prompts the user – it
|
||||
* In contrast to {@link createBulkWriter}, this never prompts the user - it
|
||||
* only succeeds when the folder is already known.
|
||||
*/
|
||||
async function createSingleTrackFolderWriter() {
|
||||
|
|
@ -533,7 +533,7 @@ async function createSingleTrackFolderWriter() {
|
|||
// fall through to picker
|
||||
}
|
||||
}
|
||||
// No usable saved handle – open the picker so the user can choose a folder.
|
||||
// No usable saved handle - open the picker so the user can choose a folder.
|
||||
try {
|
||||
const writer = await FolderPickerWriter.create();
|
||||
if (rememberFolder) {
|
||||
|
|
@ -542,7 +542,7 @@ async function createSingleTrackFolderWriter() {
|
|||
return writer;
|
||||
} catch (error) {
|
||||
if (error instanceof DOMException && error.name === 'AbortError') {
|
||||
// User cancelled the picker – return null so we fall back to the
|
||||
// User cancelled the picker - return null so we fall back to the
|
||||
// normal browser download instead of erroring out.
|
||||
return null;
|
||||
}
|
||||
|
|
@ -578,7 +578,7 @@ async function createBulkWriter(folderName) {
|
|||
// fall through to picker
|
||||
}
|
||||
}
|
||||
// No usable handle – prompt and persist
|
||||
// No usable handle - prompt and persist
|
||||
try {
|
||||
const writer = await FolderPickerWriter.create();
|
||||
await db.saveSetting('local_folder_handle', writer.getDirHandle());
|
||||
|
|
@ -590,7 +590,7 @@ async function createBulkWriter(folderName) {
|
|||
return null;
|
||||
}
|
||||
}
|
||||
// Browser without File System Access API – fall through to ZIP
|
||||
// Browser without File System Access API - fall through to ZIP
|
||||
}
|
||||
|
||||
// ── Folder Picker method ─────────────────────────────────────────────────
|
||||
|
|
|
|||
|
|
@ -64,7 +64,7 @@ export function generateHRTF(audioContext, azimuthDeg, elevationDeg = 0) {
|
|||
const ipsiData = sourceOnRight ? rightData : leftData;
|
||||
const contraData = sourceOnRight ? leftData : rightData;
|
||||
|
||||
// Generate ipsilateral (near ear) IR — mostly a delayed impulse with slight coloring
|
||||
// Generate ipsilateral (near ear) IR - mostly a delayed impulse with slight coloring
|
||||
// Ipsilateral ear (near source) receives sound first; contralateral ear is delayed by ITD
|
||||
const ipsiDelay = 0;
|
||||
const contraDelay = Math.abs(itdSamples);
|
||||
|
|
|
|||
|
|
@ -2150,7 +2150,7 @@ export class Player {
|
|||
await this._bgAudioPlugin.stop();
|
||||
}
|
||||
} catch {
|
||||
// Not running in Capacitor or plugin unavailable — ignore
|
||||
// Not running in Capacitor or plugin unavailable - ignore
|
||||
} finally {
|
||||
this._bgAudioPending = false;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1354,7 +1354,7 @@ export async function initializeSettings(scrobbler, player, api, ui) {
|
|||
for (let i = 0; i < count; i++) {
|
||||
const t = i / (count - 1);
|
||||
let freq = Math.round(min * Math.pow(max / min, t));
|
||||
// Ensure strictly increasing — rounding can produce duplicates at high band counts
|
||||
// Ensure strictly increasing - rounding can produce duplicates at high band counts
|
||||
if (freqs.length > 0 && freq <= freqs[freqs.length - 1]) {
|
||||
freq = freqs[freqs.length - 1] + 1;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1881,7 +1881,7 @@ export const binauralDspSettings = {
|
|||
try {
|
||||
localStorage.setItem(this.STORAGE_KEY, JSON.stringify(obj));
|
||||
} catch {
|
||||
// QuotaExceededError — storage full
|
||||
// QuotaExceededError - storage full
|
||||
}
|
||||
},
|
||||
|
||||
|
|
|
|||
|
|
@ -37,7 +37,7 @@ export class Visualizer {
|
|||
|
||||
// Pause animation loop when the app is backgrounded so the analyser's
|
||||
// FFT reads don't compete with the EQ biquad filter chain for audio
|
||||
// thread time — the main cause of audio skipping with AutoEQ in background.
|
||||
// thread time - the main cause of audio skipping with AutoEQ in background.
|
||||
document.addEventListener('visibilitychange', () => {
|
||||
if (document.visibilityState === 'hidden' && this.isActive) {
|
||||
this._backgroundPaused = true;
|
||||
|
|
|
|||
Loading…
Reference in a new issue