osu-play 1.3.2 → 1.4.0
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.
- package/README.md +54 -6
- package/dist/cli.cjs +967 -97
- package/dist/cli.cjs.map +10 -7
- package/dist/cli.js +956 -86
- package/dist/cli.js.map +10 -7
- package/dist/core/api/catalog.d.ts +61 -0
- package/dist/core/api/server.d.ts +13 -0
- package/dist/core/cli/main.d.ts +6 -0
- package/dist/core/lazer/library.d.ts +17 -0
- package/dist/core/player/mod.d.ts +1 -1
- package/dist/core/player/session.d.ts +13 -0
- package/dist/core/player/types.d.ts +1 -0
- package/dist/core/utils/mod.d.ts +1 -0
- package/dist/index.cjs +30 -4
- package/dist/index.cjs.map +3 -3
- package/dist/index.js +29 -3
- package/dist/index.js.map +3 -3
- package/package.json +5 -2
package/dist/cli.cjs.map
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../src/core/utils/mod.ts", "../src/core/lazer/compat.ts", "../src/core/lazer/schema/beatmap.ts", "../src/core/lazer/schema/beatmapMetadata.ts", "../src/core/lazer/schema/beatmapSet.ts", "../src/core/lazer/schema/realmFile.ts", "../src/core/lazer/schema/realmUser.ts", "../src/core/lazer/schema/realmNamedFileUsage.ts", "../src/core/lazer/schema/mod.ts", "../src/core/lazer/mod.ts", "../src/core/cli/main.ts", "../src/core/playlist/mod.ts", "../src/core/player/mpv.ts", "../src/core/player/session.ts", "../src/core/tui/player-screen.ts", "../src/cli.ts"],
|
|
3
|
+
"sources": ["../src/core/utils/mod.ts", "../src/core/lazer/compat.ts", "../src/core/lazer/schema/beatmap.ts", "../src/core/lazer/schema/beatmapMetadata.ts", "../src/core/lazer/schema/beatmapSet.ts", "../src/core/lazer/schema/realmFile.ts", "../src/core/lazer/schema/realmUser.ts", "../src/core/lazer/schema/realmNamedFileUsage.ts", "../src/core/lazer/schema/mod.ts", "../src/core/lazer/mod.ts", "../src/core/cli/main.ts", "../src/core/api/server.ts", "../src/core/lazer/library.ts", "../src/core/api/catalog.ts", "../src/core/playlist/mod.ts", "../src/core/player/mpv.ts", "../src/core/player/session.ts", "../src/core/tui/player-screen.ts", "../src/cli.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"import path from \"node:path\";\nimport { existsSync } from \"node:fs\";\n\nexport function getDataDir(): string | undefined {\n switch (process.platform) {\n case \"linux\":\n case \"openbsd\":\n case \"freebsd\": {\n const xdg = process.env.XDG_DATA_HOME;\n if (xdg) return xdg;\n\n const home = process.env.HOME;\n if (home) return path.join(home, \".local\", \"share\");\n break;\n }\n\n case \"darwin\": {\n const home = process.env.HOME;\n if (home) return path.join(home, \"Library\", \"Application Support\");\n break;\n }\n\n case \"win32\":\n return process.env.LOCALAPPDATA ?? undefined;\n }\n\n return undefined;\n}\n\nexport function getConfigDir(): string | undefined {\n switch (process.platform) {\n case \"openbsd\":\n case \"freebsd\":\n case \"linux\": {\n const xdg = process.env.XDG_CONFIG_HOME;\n if (xdg) return xdg;\n\n const home = process.env.HOME;\n if (home) return path.join(home, \".config\");\n break;\n }\n\n case \"darwin\": {\n const home = process.env.HOME;\n if (home) return path.join(home, \"Library\", \"Preferences\");\n break;\n }\n\n case \"win32\":\n return process.env.APPDATA ?? undefined;\n }\n\n return undefined;\n}\n\nexport function getDefaultOsuDataDir() {\n return path.join(getDataDir() ?? \".\", \"osu\");\n}\n\nexport function getDefaultConfigPath(appName: string = \"osu-play\") {\n return path.join(getConfigDir() ?? \".\", appName);\n}\n\nexport function hashedFilePath(\n hash: string,\n osuDataDir: string = getDefaultOsuDataDir(),\n) {\n return path.join(\n osuDataDir,\n \"files\",\n hash.slice(0, 1),\n hash.slice(0, 2),\n hash,\n );\n}\n\ntype RealmPathOptions = {\n osuDataDir?: string;\n};\n\n/**\n * Returns osu!lazer's live Realm DB path directly.\n * The legacy `appConfigDir` positional argument is accepted for backwards\n * compatibility but no longer used.\n */\nexport function getRealmDBPath(options?: RealmPathOptions): string | null;\nexport function getRealmDBPath(\n legacyAppConfigDir: string,\n options?: RealmPathOptions,\n): string | null;\nexport function getRealmDBPath(\n legacyAppConfigDirOrOptions: string | RealmPathOptions = {},\n maybeOptions: RealmPathOptions = {},\n) {\n const options =\n typeof legacyAppConfigDirOrOptions === \"string\"\n ? maybeOptions\n : legacyAppConfigDirOrOptions;\n const osuDataDir = options.osuDataDir ?? getDefaultOsuDataDir();\n const osuDBPath = path.join(osuDataDir, \"client.realm\");\n\n if (!existsSync(osuDBPath)) {\n console.log(`[getRealmDBPath]: ${osuDBPath} not found`);\n return null;\n }\n\n return osuDBPath;\n}\n",
|
|
5
|
+
"import path from \"node:path\";\nimport { existsSync } from \"node:fs\";\nimport { spawn } from \"node:child_process\";\n\nexport function revealFile(filePath: string) {\n const command =\n process.platform === \"darwin\"\n ? { args: [\"-R\", filePath], executable: \"open\" }\n : process.platform === \"win32\"\n ? { args: [\"/select,\", filePath], executable: \"explorer.exe\" }\n : { args: [path.dirname(filePath)], executable: \"xdg-open\" };\n\n return new Promise<void>((resolve, reject) => {\n const child = spawn(command.executable, command.args, {\n detached: true,\n stdio: \"ignore\",\n });\n\n child.once(\"error\", reject);\n child.once(\"spawn\", () => {\n child.unref();\n resolve();\n });\n });\n}\n\nexport function getDataDir(): string | undefined {\n switch (process.platform) {\n case \"linux\":\n case \"openbsd\":\n case \"freebsd\": {\n const xdg = process.env.XDG_DATA_HOME;\n if (xdg) return xdg;\n\n const home = process.env.HOME;\n if (home) return path.join(home, \".local\", \"share\");\n break;\n }\n\n case \"darwin\": {\n const home = process.env.HOME;\n if (home) return path.join(home, \"Library\", \"Application Support\");\n break;\n }\n\n case \"win32\":\n return process.env.LOCALAPPDATA ?? undefined;\n }\n\n return undefined;\n}\n\nexport function getConfigDir(): string | undefined {\n switch (process.platform) {\n case \"openbsd\":\n case \"freebsd\":\n case \"linux\": {\n const xdg = process.env.XDG_CONFIG_HOME;\n if (xdg) return xdg;\n\n const home = process.env.HOME;\n if (home) return path.join(home, \".config\");\n break;\n }\n\n case \"darwin\": {\n const home = process.env.HOME;\n if (home) return path.join(home, \"Library\", \"Preferences\");\n break;\n }\n\n case \"win32\":\n return process.env.APPDATA ?? undefined;\n }\n\n return undefined;\n}\n\nexport function getDefaultOsuDataDir() {\n return path.join(getDataDir() ?? \".\", \"osu\");\n}\n\nexport function getDefaultConfigPath(appName: string = \"osu-play\") {\n return path.join(getConfigDir() ?? \".\", appName);\n}\n\nexport function hashedFilePath(\n hash: string,\n osuDataDir: string = getDefaultOsuDataDir(),\n) {\n return path.join(\n osuDataDir,\n \"files\",\n hash.slice(0, 1),\n hash.slice(0, 2),\n hash,\n );\n}\n\ntype RealmPathOptions = {\n osuDataDir?: string;\n};\n\n/**\n * Returns osu!lazer's live Realm DB path directly.\n * The legacy `appConfigDir` positional argument is accepted for backwards\n * compatibility but no longer used.\n */\nexport function getRealmDBPath(options?: RealmPathOptions): string | null;\nexport function getRealmDBPath(\n legacyAppConfigDir: string,\n options?: RealmPathOptions,\n): string | null;\nexport function getRealmDBPath(\n legacyAppConfigDirOrOptions: string | RealmPathOptions = {},\n maybeOptions: RealmPathOptions = {},\n) {\n const options =\n typeof legacyAppConfigDirOrOptions === \"string\"\n ? maybeOptions\n : legacyAppConfigDirOrOptions;\n const osuDataDir = options.osuDataDir ?? getDefaultOsuDataDir();\n const osuDBPath = path.join(osuDataDir, \"client.realm\");\n\n if (!existsSync(osuDBPath)) {\n console.log(`[getRealmDBPath]: ${osuDBPath} not found`);\n return null;\n }\n\n return osuDBPath;\n}\n",
|
|
6
6
|
"type SchemaPropertyLike = {\n type?: string;\n objectType?: string;\n};\n\ntype SchemaEntryLike = {\n name: string;\n properties: Record<string, SchemaPropertyLike>;\n};\n\ntype RequiredSchemaShape = Record<\n string,\n Record<string, { type?: string; objectType?: string }>\n>;\n\nexport type LazerSchemaCompatibilityIssue = {\n objectName: string;\n propertyName: string;\n expected: string;\n actual: string;\n};\n\nexport type LazerSchemaCompatibilityReport = {\n compatible: boolean;\n version: number;\n missingObjects: string[];\n issues: LazerSchemaCompatibilityIssue[];\n};\n\nexport const LAST_STATIC_LAZER_SCHEMA_VERSION = 46;\n\nconst REQUIRED_PLAYLIST_SCHEMA: RequiredSchemaShape = {\n BeatmapSet: {\n Beatmaps: { type: \"list\", objectType: \"Beatmap\" },\n Files: { type: \"list\", objectType: \"RealmNamedFileUsage\" },\n },\n Beatmap: {\n Metadata: { type: \"object\", objectType: \"BeatmapMetadata\" },\n },\n BeatmapMetadata: {\n AudioFile: { type: \"string\" },\n Title: { type: \"string\" },\n Artist: { type: \"string\" },\n TitleUnicode: { type: \"string\" },\n ArtistUnicode: { type: \"string\" },\n },\n RealmNamedFileUsage: {\n File: { type: \"object\", objectType: \"File\" },\n Filename: { type: \"string\" },\n },\n File: {\n Hash: { type: \"string\" },\n },\n};\n\nfunction describeRequirement(requirement: { type?: string; objectType?: string }) {\n if (requirement.type === \"object\" || requirement.type === \"list\") {\n return `${requirement.type}:${requirement.objectType ?? \"unknown\"}`;\n }\n\n return requirement.type ?? \"unknown\";\n}\n\nfunction describeProperty(property: SchemaPropertyLike | undefined) {\n if (!property?.type) {\n return \"missing\";\n }\n\n if (property.type === \"object\" || property.type === \"list\") {\n return `${property.type}:${property.objectType ?? \"unknown\"}`;\n }\n\n return property.type;\n}\n\nexport function inspectLazerSchemaEntries(\n schemaEntries: SchemaEntryLike[],\n version: number,\n): LazerSchemaCompatibilityReport {\n const schemaByName = new Map(schemaEntries.map((entry) => [entry.name, entry]));\n const missingObjects: string[] = [];\n const issues: LazerSchemaCompatibilityIssue[] = [];\n\n for (const [objectName, requirements] of Object.entries(REQUIRED_PLAYLIST_SCHEMA)) {\n const schemaEntry = schemaByName.get(objectName);\n if (!schemaEntry) {\n missingObjects.push(objectName);\n continue;\n }\n\n for (const [propertyName, requirement] of Object.entries(requirements)) {\n const property = schemaEntry.properties[propertyName];\n const typeMatches = !requirement.type || property?.type === requirement.type;\n const objectTypeMatches =\n !requirement.objectType || property?.objectType === requirement.objectType;\n\n if (!typeMatches || !objectTypeMatches) {\n issues.push({\n objectName,\n propertyName,\n expected: describeRequirement(requirement),\n actual: describeProperty(property),\n });\n }\n }\n }\n\n return {\n compatible: missingObjects.length === 0 && issues.length === 0,\n version,\n missingObjects,\n issues,\n };\n}\n\nexport function formatLazerSchemaCompatibilityError(\n report: LazerSchemaCompatibilityReport,\n) {\n const details = [\n `Detected osu!lazer schema version ${report.version}, but the playlist reader is missing fields it needs.`,\n ];\n\n if (report.missingObjects.length > 0) {\n details.push(`Missing objects: ${report.missingObjects.join(\", \")}`);\n }\n\n if (report.issues.length > 0) {\n details.push(\n `Mismatched properties: ${report.issues\n .map(\n (issue) =>\n `${issue.objectName}.${issue.propertyName} expected ${issue.expected}, got ${issue.actual}`,\n )\n .join(\"; \")}`,\n );\n }\n\n details.push(\n \"This app now reflects the live lazer schema and only depends on a small playlist-safe subset, so version bumps are fine until those required fields change.\",\n );\n\n return details.join(\"\\n\");\n}\n",
|
|
7
7
|
"import Realm from \"realm\";\nimport type { ObjectSchema } from \"realm\";\nimport { BeatmapMetadata } from \"./beatmapMetadata.js\";\n\nexport class Beatmap extends Realm.Object<Beatmap> {\n ID!: string;\n DifficultyName?: string;\n Metadata!: BeatmapMetadata;\n BeatmapSet!: any;\n Status!: number;\n OnlineID!: number;\n Length!: number;\n BPM!: number;\n Hash?: string;\n StarRating!: number;\n MD5Hash?: string;\n OnlineMD5Hash?: string;\n LastLocalUpdate?: Date;\n LastOnlineUpdate?: Date;\n Hidden!: boolean;\n AudioLeadIn!: number;\n StackLeniency!: number;\n SpecialStyle!: boolean;\n LetterboxInBreaks!: boolean;\n WidescreenStoryboard!: boolean;\n EpilepsyWarning!: boolean;\n SamplesMatchPlaybackRate!: boolean;\n LastPlayed?: Date;\n DistanceSpacing!: number;\n BeatDivisor!: number;\n GridSize!: number;\n TimelineZoom!: number;\n EditorTimestamp?: number;\n CountdownOffset!: number;\n\n static schema: ObjectSchema = {\n name: \"Beatmap\",\n primaryKey: \"ID\",\n properties: {\n ID: { type: \"uuid\", default: \"\" },\n DifficultyName: { type: \"string\", default: \"\", optional: true },\n Metadata: {\n type: \"object\",\n objectType: \"BeatmapMetadata\",\n default: null,\n },\n BeatmapSet: { type: \"object\", objectType: \"BeatmapSet\", default: null },\n Status: { type: \"int\", default: -3 },\n OnlineID: { type: \"int\", default: -1 },\n Length: { type: \"double\", default: 0 },\n BPM: { type: \"double\", default: 0 },\n Hash: { type: \"string\", default: \"\", optional: true },\n StarRating: { type: \"double\", default: -1 },\n MD5Hash: { type: \"string\", default: \"\", optional: true },\n OnlineMD5Hash: { type: \"string\", default: \"\", optional: true },\n LastLocalUpdate: { type: \"date\", optional: true },\n LastOnlineUpdate: { type: \"date\", optional: true },\n Hidden: { type: \"bool\", default: false },\n AudioLeadIn: { type: \"double\", default: 0 },\n StackLeniency: { type: \"float\", default: 0.7 },\n SpecialStyle: { type: \"bool\", default: false },\n LetterboxInBreaks: { type: \"bool\", default: false },\n WidescreenStoryboard: { type: \"bool\", default: false },\n EpilepsyWarning: { type: \"bool\", default: false },\n SamplesMatchPlaybackRate: { type: \"bool\", default: false },\n LastPlayed: { type: \"date\", optional: true },\n DistanceSpacing: { type: \"double\", default: 0 },\n BeatDivisor: { type: \"int\", default: 0 },\n GridSize: { type: \"int\", default: 0 },\n TimelineZoom: { type: \"double\", default: 0 },\n EditorTimestamp: { type: \"double\", optional: true },\n CountdownOffset: { type: \"int\", default: 0 },\n },\n };\n}\n",
|
|
8
8
|
"import Realm from \"realm\";\nimport type { ObjectSchema } from \"realm\";\nimport { RealmUser } from \"./realmUser.js\";\n\nexport class BeatmapMetadata extends Realm.Object<BeatmapMetadata> {\n Title?: string;\n TitleUnicode?: string;\n Artist?: string;\n ArtistUnicode?: string;\n Author?: RealmUser;\n Source?: string;\n Tags?: string;\n PreviewTime?: number;\n AudioFile?: string;\n BackgroundFile?: string;\n\n static schema: ObjectSchema = {\n name: \"BeatmapMetadata\",\n properties: {\n Title: { type: \"string\", default: \"\", optional: true },\n TitleUnicode: { type: \"string\", default: \"\", optional: true },\n Artist: { type: \"string\", default: \"\", optional: true },\n ArtistUnicode: { type: \"string\", default: \"\", optional: true },\n Author: { type: \"object\", objectType: \"RealmUser\", default: null },\n Source: { type: \"string\", default: \"\", optional: true },\n Tags: { type: \"string\", default: \"\", optional: true },\n PreviewTime: { type: \"int\", default: 0 },\n AudioFile: { type: \"string\", default: \"\", optional: true },\n BackgroundFile: { type: \"string\", default: \"\", optional: true },\n },\n };\n}\n",
|
|
@@ -12,14 +12,17 @@
|
|
|
12
12
|
"import Realm from \"realm\";\nimport type { ObjectSchema } from \"realm\";\nimport { RealmFile } from \"./realmFile.js\";\n\nexport class RealmNamedFileUsage extends Realm.Object<RealmNamedFileUsage> {\n File!: RealmFile;\n Filename?: string;\n\n static embedded = true;\n\n static schema: ObjectSchema = {\n name: \"RealmNamedFileUsage\",\n embedded: true,\n properties: {\n File: \"File\",\n Filename: { type: \"string\", optional: true },\n },\n };\n}\n",
|
|
13
13
|
"export { Beatmap } from \"./beatmap.js\";\nexport { BeatmapMetadata } from \"./beatmapMetadata.js\";\nexport { BeatmapSet } from \"./beatmapSet.js\";\nexport { RealmFile } from \"./realmFile.js\";\nexport { RealmUser } from \"./realmUser.js\";\nexport { RealmNamedFileUsage } from \"./realmNamedFileUsage.js\";\n",
|
|
14
14
|
"import Realm from \"realm\";\nimport type { PlaylistBeatmapSet, PlaylistTrack } from \"../playlist/mod.js\";\nimport type { BeatmapSet } from \"./schema/beatmapSet.js\";\nimport { inspectLazerSchemaEntries } from \"./compat.js\";\nimport { getRealmDBPath } from \"../utils/mod.js\";\n\nexport {\n Beatmap,\n BeatmapMetadata,\n BeatmapSet,\n RealmFile,\n RealmNamedFileUsage,\n RealmUser,\n} from \"./schema/mod.js\";\nexport {\n formatLazerSchemaCompatibilityError,\n inspectLazerSchemaEntries,\n LAST_STATIC_LAZER_SCHEMA_VERSION,\n} from \"./compat.js\";\nexport { hashedFilePath } from \"../utils/mod.js\";\n\ntype SchemaPropertyLike = {\n type?: string;\n objectType?: string;\n};\n\ntype SchemaEntryLike = {\n name: string;\n properties: Record<string, SchemaPropertyLike>;\n};\n\nexport function inspectLazerSchema(realm: Realm) {\n return inspectLazerSchemaEntries(\n realm.schema as unknown as SchemaEntryLike[],\n Realm.schemaVersion(realm.path),\n );\n}\n\nexport const getLazerDB = async (realmDBPath: string) => {\n return Realm.open({\n path: realmDBPath,\n readOnly: true,\n });\n};\n\nexport function getBeatmapSets(realm: Realm) {\n return realm.objects(\"BeatmapSet\") as unknown as Iterable<PlaylistBeatmapSet>;\n}\n\nfunction queryBeatmapSet(\n realm: Realm,\n track: Pick<PlaylistTrack, \"beatmapSetHash\" | \"beatmapSetId\">,\n) {\n const beatmapSets = realm.objects(\"BeatmapSet\");\n\n if (track.beatmapSetId !== null && track.beatmapSetId !== undefined) {\n const byId =\n realm.objectForPrimaryKey(\n \"BeatmapSet\",\n track.beatmapSetId as Parameters<Realm[\"objectForPrimaryKey\"]>[1],\n )\n ?? beatmapSets.filtered(\"ID == $0\", track.beatmapSetId)[0];\n\n if (byId) {\n return byId;\n }\n }\n\n if (track.beatmapSetHash) {\n return beatmapSets.filtered(\"Hash == $0\", track.beatmapSetHash)[0] ?? null;\n }\n\n return null;\n}\n\nexport async function deleteBeatmapSet(\n track: Pick<PlaylistTrack, \"beatmapSetHash\" | \"beatmapSetId\" | \"title\">,\n osuDataDir: string,\n) {\n const realmDBPath = getRealmDBPath({ osuDataDir });\n if (!realmDBPath) {\n throw new Error(\"Realm DB not found\");\n }\n\n const realm = await Realm.open({ path: realmDBPath });\n\n try {\n let markedForDeletion = false;\n\n realm.write(() => {\n const beatmapSet = queryBeatmapSet(realm, track);\n if (!beatmapSet) {\n throw new Error(`Beatmap set for \"${track.title}\" no longer exists.`);\n }\n\n if (beatmapSet.Protected) {\n throw new Error(`\"${track.title}\" is protected and cannot be deleted.`);\n }\n\n if (beatmapSet.DeletePending) {\n return;\n }\n\n beatmapSet.DeletePending = true;\n markedForDeletion = true;\n });\n\n if (!markedForDeletion) {\n throw new Error(`\"${track.title}\" is already pending deletion.`);\n }\n } finally {\n realm.close();\n }\n}\n\nexport const getNamedFileHash = (fileName: string, beatmapSet: BeatmapSet) => {\n const files = beatmapSet.Files;\n for (const file of files) {\n if (file.Filename == fileName) return file.File.Hash;\n }\n return undefined;\n};\n",
|
|
15
|
-
"import path from \"node:path\";\nimport { writeFileSync } from \"node:fs\";\n\nimport { ProcessTerminal, TUI } from \"@earendil-works/pi-tui\";\nimport yargs from \"yargs/yargs\";\nimport { hideBin } from \"yargs/helpers\";\n\nimport {
|
|
15
|
+
"import path from \"node:path\";\nimport { writeFileSync } from \"node:fs\";\n\nimport { ProcessTerminal, TUI } from \"@earendil-works/pi-tui\";\nimport yargs from \"yargs/yargs\";\nimport { hideBin } from \"yargs/helpers\";\n\nimport { startApiServer } from \"../api/server.js\";\nimport {\n createLazerCatalogStore,\n deleteBeatmapSetFromLazer,\n loadPlaylistFromLazer,\n} from \"../lazer/library.js\";\nimport type { PlaylistTrack } from \"../playlist/mod.js\";\nimport { MpvPlayerBackend, PlaylistPlayerSession } from \"../player/mod.js\";\nimport { PlaylistPlayerScreen } from \"../tui/player-screen.js\";\nimport { getDefaultOsuDataDir } from \"../utils/mod.js\";\n\nexport function getArgs() {\n return yargs(hideBin(process.argv))\n .scriptName(\"osu-play\")\n .usage(\n \"Play or serve music from your osu!lazer beatmaps\\nUsage: $0 [options]\",\n )\n .option(\"api\", {\n type: \"boolean\",\n default: false,\n describe: \"Run a localhost Subsonic API for music clients such as Kopuz\",\n })\n .option(\"apiPort\", {\n type: \"number\",\n default: 4533,\n describe: \"Port for --api mode (binds to 127.0.0.1)\",\n })\n .option(\"reload\", {\n type: \"boolean\",\n default: false,\n alias: \"r\",\n describe: \"Deprecated: ignored. osu-play now reads the live lazer database directly\",\n })\n .option(\"exportPlaylist\", {\n type: \"string\",\n describe: \"Export playlist to a file instead of launching the player\",\n })\n .option(\"osuDataDir\", {\n type: \"string\",\n default: getDefaultOsuDataDir(),\n alias: \"d\",\n describe: \"Osu!lazer data directory\",\n })\n .option(\"configDir\", {\n type: \"string\",\n alias: \"c\",\n describe: \"Deprecated: ignored. osu-play no longer copies the lazer database\",\n })\n .option(\"loop\", {\n type: \"boolean\",\n default: false,\n alias: \"l\",\n describe: \"Loop the playlist when playback reaches the end\",\n })\n .option(\"shuffle\", {\n type: \"boolean\",\n default: false,\n alias: \"s\",\n describe: \"Play the playlist in shuffled order\",\n })\n .check((argv) => {\n if (\n !Number.isInteger(argv.apiPort)\n || argv.apiPort < 1\n || argv.apiPort > 65_535\n ) {\n throw new Error(\"--apiPort must be an integer between 1 and 65535\");\n }\n\n const conflictingMode = [\n argv.exportPlaylist ? \"exportPlaylist\" : null,\n argv.loop ? \"loop\" : null,\n argv.shuffle ? \"shuffle\" : null,\n ].find(Boolean);\n if (argv.api && conflictingMode) {\n throw new Error(\n `--api cannot be combined with --${conflictingMode}`,\n );\n }\n\n return true;\n })\n .alias(\"help\", \"h\")\n .help()\n .parse();\n}\n\nasync function deleteTrackFromCollection(\n track: PlaylistTrack,\n osuDataDir: string,\n) {\n await deleteBeatmapSetFromLazer(track, osuDataDir);\n}\n\nasync function runTuiPlayer(\n playlist: Awaited<ReturnType<typeof loadPlaylistFromLazer>>,\n osuDataDir: string,\n loop: boolean,\n shuffle: boolean,\n) {\n const { revealFile } = await import(\"../utils/mod.js\");\n const backend = new MpvPlayerBackend();\n const session = new PlaylistPlayerSession(playlist, backend, {\n deleteTrack: (track) => deleteTrackFromCollection(track, osuDataDir),\n loop,\n reloadPlaylist: () => loadPlaylistFromLazer(osuDataDir),\n revealTrack: (track) => revealFile(track.path),\n shuffle,\n });\n const terminal = new ProcessTerminal();\n const tui = new TUI(terminal);\n const screen = new PlaylistPlayerScreen(session, () => terminal.rows);\n\n let started = false;\n\n const exitPromise = new Promise<void>((resolve) => {\n screen.onQuit = () => resolve();\n });\n\n const unsubscribe = session.subscribe((snapshot) => {\n screen.setSnapshot(snapshot);\n if (started) {\n tui.requestRender();\n }\n });\n\n try {\n await session.start();\n\n tui.addChild(screen);\n tui.setFocus(screen);\n tui.start();\n started = true;\n\n await exitPromise;\n } finally {\n unsubscribe();\n\n if (started) {\n await terminal.drainInput().catch(() => {});\n tui.stop();\n }\n\n await session.dispose();\n }\n}\n\nasync function runApiMode(osuDataDir: string, port: number) {\n const catalogStore = await createLazerCatalogStore(osuDataDir);\n const server = await startApiServer({\n catalogStore,\n port,\n });\n\n console.log(`[INFO] osu-play API listening at ${server.url}`);\n console.log(\n \"[INFO] In Kopuz, add a Custom server with this URL and any non-empty username/password.\",\n );\n console.log(\"[INFO] Press Ctrl+C to stop.\");\n\n let resolveShutdown: (() => void) | undefined;\n const shutdown = new Promise<void>((resolve) => {\n resolveShutdown = resolve;\n });\n const handleSignal = () => resolveShutdown?.();\n\n process.once(\"SIGINT\", handleSignal);\n process.once(\"SIGTERM\", handleSignal);\n\n try {\n await shutdown;\n } finally {\n process.off(\"SIGINT\", handleSignal);\n process.off(\"SIGTERM\", handleSignal);\n await server.close();\n }\n}\n\nexport async function main() {\n const argv = await getArgs();\n\n if (argv.reload) {\n console.log(\n \"[INFO] `--reload` is deprecated and ignored because osu-play reads osu!lazer's live Realm DB directly.\",\n );\n }\n\n if (argv.configDir) {\n console.log(\n \"[INFO] `--configDir` is deprecated and ignored because osu-play no longer copies the Realm DB.\",\n );\n }\n\n if (argv.api) {\n await runApiMode(argv.osuDataDir, argv.apiPort);\n return;\n }\n\n const playlist = await loadPlaylistFromLazer(argv.osuDataDir);\n\n if (argv.exportPlaylist) {\n const playlistContents = playlist.map((track) => track.path).join(\"\\n\");\n writeFileSync(argv.exportPlaylist, playlistContents);\n console.log(\n `[INFO] Exported ${playlist.length} tracks to ${argv.exportPlaylist}.`,\n );\n console.log(\n `[INFO] Use something like \\`mpv --playlist=${path.resolve(argv.exportPlaylist)}\\` to play the playlist.`,\n );\n return;\n }\n\n await runTuiPlayer(playlist, argv.osuDataDir, argv.loop, argv.shuffle);\n}\n",
|
|
16
|
+
"import { createReadStream } from \"node:fs\";\nimport { stat } from \"node:fs/promises\";\nimport { createServer, type IncomingMessage, type ServerResponse } from \"node:http\";\nimport path from \"node:path\";\n\nimport type {\n CatalogAlbum,\n CatalogMedia,\n CatalogSong,\n MusicCatalog,\n} from \"./catalog.js\";\nimport type { CatalogStore } from \"../lazer/library.js\";\n\nconst API_VERSION = \"1.16.1\";\nconst SERVER_VERSION = \"1.4.0\";\nconst DEFAULT_HOST = \"127.0.0.1\";\nconst DEFAULT_PORT = 4533;\n\ntype ApiError = {\n code: number;\n message: string;\n};\n\nexport type StartApiServerOptions = {\n catalogStore: CatalogStore;\n host?: string;\n port?: number;\n};\n\nexport type RunningApiServer = {\n close(): Promise<void>;\n host: string;\n port: number;\n url: string;\n};\n\nfunction responseBase(status: \"failed\" | \"ok\") {\n return {\n openSubsonic: true,\n serverVersion: SERVER_VERSION,\n status,\n type: \"osu-play\",\n version: API_VERSION,\n };\n}\n\nfunction sendJson(\n response: ServerResponse,\n body: Record<string, unknown>,\n statusCode = 200,\n) {\n const encoded = JSON.stringify(body);\n response.writeHead(statusCode, {\n \"Cache-Control\": \"no-store\",\n \"Content-Length\": Buffer.byteLength(encoded),\n \"Content-Type\": \"application/json; charset=utf-8\",\n });\n response.end(encoded);\n}\n\nfunction sendSuccess(response: ServerResponse, data: Record<string, unknown> = {}) {\n sendJson(response, {\n \"subsonic-response\": {\n ...responseBase(\"ok\"),\n ...data,\n },\n });\n}\n\nfunction sendFailure(\n response: ServerResponse,\n error: ApiError,\n statusCode = 200,\n) {\n sendJson(\n response,\n {\n \"subsonic-response\": {\n ...responseBase(\"failed\"),\n error,\n },\n },\n statusCode,\n );\n}\n\nfunction requiredParameter(\n response: ServerResponse,\n params: URLSearchParams,\n name: string,\n) {\n const value = params.get(name)?.trim();\n if (!value) {\n sendFailure(response, {\n code: 10,\n message: `Required parameter '${name}' is missing.`,\n });\n return null;\n }\n\n return value;\n}\n\nfunction hasValidCredentials(params: URLSearchParams) {\n const username = params.get(\"u\")?.trim();\n const token = params.get(\"t\")?.trim();\n const salt = params.get(\"s\")?.trim();\n\n return Boolean(\n username\n && token\n && salt\n && /^[a-f0-9]{32}$/i.test(token)\n && params.get(\"f\") === \"json\"\n && params.get(\"c\")?.trim()\n && params.get(\"v\")?.trim(),\n );\n}\n\nfunction parseNonNegativeInteger(\n value: string | null,\n fallback: number,\n maximum?: number,\n) {\n if (value === null) {\n return fallback;\n }\n\n if (!/^\\d+$/.test(value)) {\n return null;\n }\n\n const parsed = Number(value);\n if (!Number.isSafeInteger(parsed) || parsed < 0) {\n return null;\n }\n\n return maximum === undefined ? parsed : Math.min(parsed, maximum);\n}\n\nfunction albumPayload(album: CatalogAlbum) {\n return {\n artist: album.artist,\n ...(album.coverArt ? { coverArt: album.coverArt } : {}),\n id: album.id,\n name: album.name,\n };\n}\n\nfunction songPayload(song: CatalogSong) {\n return {\n album: song.album,\n albumId: song.albumId,\n artist: song.artist,\n ...(song.coverArt ? { coverArt: song.coverArt } : {}),\n ...(song.duration ? { duration: song.duration } : {}),\n id: song.id,\n title: song.title,\n track: song.track,\n };\n}\n\nfunction artistIndex(catalog: MusicCatalog) {\n const groups = new Map<string, Array<Record<string, unknown>>>();\n\n for (const artist of catalog.artists) {\n const firstCharacter = artist.name.trim().charAt(0).toUpperCase();\n const name = /^[A-Z]$/.test(firstCharacter) ? firstCharacter : \"#\";\n const group = groups.get(name) ?? [];\n group.push({\n ...(artist.coverArt ? { coverArt: artist.coverArt } : {}),\n id: artist.id,\n name: artist.name,\n });\n groups.set(name, group);\n }\n\n return [...groups.entries()]\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([name, artist]) => ({ artist, name }));\n}\n\nfunction contentType(fileName: string) {\n switch (path.extname(fileName).toLowerCase()) {\n case \".aac\":\n return \"audio/aac\";\n case \".flac\":\n return \"audio/flac\";\n case \".jpeg\":\n case \".jpg\":\n return \"image/jpeg\";\n case \".m4a\":\n case \".mp4\":\n return \"audio/mp4\";\n case \".mp3\":\n return \"audio/mpeg\";\n case \".ogg\":\n case \".oga\":\n case \".opus\":\n return \"audio/ogg\";\n case \".png\":\n return \"image/png\";\n case \".wav\":\n return \"audio/wav\";\n case \".webm\":\n return \"audio/webm\";\n case \".webp\":\n return \"image/webp\";\n default:\n return \"application/octet-stream\";\n }\n}\n\nfunction parseRange(rangeHeader: string, size: number) {\n const match = /^bytes=(\\d*)-(\\d*)$/.exec(rangeHeader.trim());\n if (!match || (!match[1] && !match[2])) {\n return null;\n }\n\n if (!match[1]) {\n const suffixLength = Number(match[2]);\n if (!Number.isSafeInteger(suffixLength) || suffixLength <= 0) {\n return null;\n }\n\n return {\n end: size - 1,\n start: Math.max(0, size - suffixLength),\n };\n }\n\n const start = Number(match[1]);\n const requestedEnd = match[2] ? Number(match[2]) : size - 1;\n if (\n !Number.isSafeInteger(start)\n || !Number.isSafeInteger(requestedEnd)\n || start < 0\n || requestedEnd < start\n || start >= size\n ) {\n return null;\n }\n\n return {\n end: Math.min(requestedEnd, size - 1),\n start,\n };\n}\n\nasync function serveMedia(\n request: IncomingMessage,\n response: ServerResponse,\n media: CatalogMedia,\n etag: string,\n) {\n let file;\n try {\n file = await stat(media.path);\n } catch {\n sendFailure(\n response,\n {\n code: 70,\n message: \"Requested media is no longer available.\",\n },\n 404,\n );\n return;\n }\n\n if (!file.isFile()) {\n sendFailure(\n response,\n {\n code: 70,\n message: \"Requested media is not a file.\",\n },\n 404,\n );\n return;\n }\n\n const commonHeaders = {\n \"Accept-Ranges\": \"bytes\",\n \"Cache-Control\": \"public, max-age=31536000, immutable\",\n \"Content-Type\": contentType(media.fileName),\n ETag: `\"${etag}\"`,\n };\n const rangeHeader = request.headers.range;\n const range = rangeHeader ? parseRange(rangeHeader, file.size) : undefined;\n\n if (rangeHeader && !range) {\n response.writeHead(416, {\n ...commonHeaders,\n \"Content-Range\": `bytes */${file.size}`,\n });\n response.end();\n return;\n }\n\n const start = range?.start ?? 0;\n const end = range?.end ?? file.size - 1;\n const contentLength = Math.max(0, end - start + 1);\n response.writeHead(range ? 206 : 200, {\n ...commonHeaders,\n \"Content-Length\": contentLength,\n ...(range ? { \"Content-Range\": `bytes ${start}-${end}/${file.size}` } : {}),\n });\n\n if (request.method === \"HEAD\" || file.size === 0) {\n response.end();\n return;\n }\n\n const stream = createReadStream(media.path, { end, start });\n const destroyStream = () => stream.destroy();\n response.once(\"close\", destroyStream);\n stream.once(\"error\", (error) => {\n response.destroy(error);\n });\n stream.once(\"close\", () => {\n response.off(\"close\", destroyStream);\n });\n stream.pipe(response);\n}\n\nasync function routeRequest(\n request: IncomingMessage,\n response: ServerResponse,\n catalogStore: CatalogStore,\n) {\n const requestUrl = new URL(request.url ?? \"/\", `http://${DEFAULT_HOST}`);\n const match = /^\\/rest\\/([A-Za-z0-9]+)\\.view$/.exec(requestUrl.pathname);\n if (!match) {\n sendFailure(\n response,\n {\n code: 0,\n message: \"Unsupported API endpoint.\",\n },\n 404,\n );\n return;\n }\n\n const endpoint = match[1]!;\n const isMedia = endpoint === \"stream\" || endpoint === \"getCoverArt\";\n const allowedMethod =\n request.method === \"GET\" || (isMedia && request.method === \"HEAD\");\n if (!allowedMethod) {\n response.setHeader(\"Allow\", isMedia ? \"GET, HEAD\" : \"GET\");\n sendFailure(\n response,\n {\n code: 0,\n message: \"Unsupported HTTP method.\",\n },\n 405,\n );\n return;\n }\n\n if (!hasValidCredentials(requestUrl.searchParams)) {\n sendFailure(response, {\n code: 40,\n message: \"Wrong username or password.\",\n });\n return;\n }\n\n if (endpoint === \"getArtists\" || endpoint === \"getAlbumList2\") {\n const offset =\n endpoint === \"getAlbumList2\"\n ? parseNonNegativeInteger(requestUrl.searchParams.get(\"offset\"), 0)\n : 0;\n if (offset === 0) {\n await catalogStore.refreshIfChanged();\n }\n }\n\n const catalog = catalogStore.getCatalog();\n\n switch (endpoint) {\n case \"ping\":\n sendSuccess(response);\n return;\n case \"getArtists\":\n sendSuccess(response, {\n artists: {\n index: artistIndex(catalog),\n },\n });\n return;\n case \"getAlbumList2\": {\n if (requestUrl.searchParams.get(\"type\") !== \"alphabeticalByName\") {\n sendFailure(response, {\n code: 10,\n message: \"Only type=alphabeticalByName is supported.\",\n });\n return;\n }\n\n const offset = parseNonNegativeInteger(\n requestUrl.searchParams.get(\"offset\"),\n 0,\n );\n const size = parseNonNegativeInteger(\n requestUrl.searchParams.get(\"size\"),\n 10,\n 500,\n );\n if (offset === null || size === null) {\n sendFailure(response, {\n code: 10,\n message: \"Album offset and size must be non-negative integers.\",\n });\n return;\n }\n\n sendSuccess(response, {\n albumList2: {\n album: catalog.albums.slice(offset, offset + size).map(albumPayload),\n },\n });\n return;\n }\n case \"getAlbum\": {\n const id = requiredParameter(response, requestUrl.searchParams, \"id\");\n if (!id) return;\n const album = catalog.albumsById.get(id);\n if (!album) {\n sendFailure(response, {\n code: 70,\n message: \"Album not found.\",\n });\n return;\n }\n\n sendSuccess(response, {\n album: {\n ...albumPayload(album),\n song: album.songs.map(songPayload),\n },\n });\n return;\n }\n case \"stream\": {\n const id = requiredParameter(response, requestUrl.searchParams, \"id\");\n if (!id) return;\n const song = catalog.songsById.get(id);\n if (!song) {\n sendFailure(\n response,\n {\n code: 70,\n message: \"Song not found.\",\n },\n 404,\n );\n return;\n }\n\n await serveMedia(\n request,\n response,\n {\n fileName: song.fileName,\n path: song.path,\n },\n song.id,\n );\n return;\n }\n case \"getCoverArt\": {\n const id = requiredParameter(response, requestUrl.searchParams, \"id\");\n if (!id) return;\n const cover = catalog.coversById.get(id);\n if (!cover) {\n sendFailure(\n response,\n {\n code: 70,\n message: \"Cover art not found.\",\n },\n 404,\n );\n return;\n }\n\n await serveMedia(request, response, cover, id);\n return;\n }\n case \"getPlaylists\":\n sendSuccess(response, {\n playlists: {\n playlist: [],\n },\n });\n return;\n case \"getStarred2\":\n sendSuccess(response, {\n starred2: {\n song: [],\n },\n });\n return;\n case \"scrobble\": {\n const id = requiredParameter(response, requestUrl.searchParams, \"id\");\n if (!id) return;\n if (!catalog.songsById.has(id)) {\n sendFailure(response, {\n code: 70,\n message: \"Song not found.\",\n });\n return;\n }\n sendSuccess(response);\n return;\n }\n case \"getLyricsBySongId\":\n sendSuccess(response, {\n lyricsList: {\n structuredLyrics: [],\n },\n });\n return;\n case \"getLyrics\":\n sendSuccess(response, {\n lyrics: {\n value: \"\",\n },\n });\n return;\n case \"getPlaylist\":\n sendFailure(response, {\n code: 70,\n message: \"Playlist not found; osu-play API mode is read-only.\",\n });\n return;\n case \"createPlaylist\":\n case \"updatePlaylist\":\n case \"star\":\n case \"unstar\":\n sendFailure(response, {\n code: 0,\n message: \"This operation is not supported by read-only osu-play API mode.\",\n });\n return;\n default:\n sendFailure(response, {\n code: 0,\n message: `Endpoint '${endpoint}.view' is not supported.`,\n });\n }\n}\n\nexport async function startApiServer(\n options: StartApiServerOptions,\n): Promise<RunningApiServer> {\n const host = options.host ?? DEFAULT_HOST;\n const requestedPort = options.port ?? DEFAULT_PORT;\n const server = createServer((request, response) => {\n void routeRequest(request, response, options.catalogStore).catch((error) => {\n if (!response.headersSent) {\n sendFailure(\n response,\n {\n code: 0,\n message: \"Internal server error.\",\n },\n 500,\n );\n } else {\n response.destroy(error instanceof Error ? error : new Error(String(error)));\n }\n });\n });\n\n server.requestTimeout = 30_000;\n server.headersTimeout = 10_000;\n\n await new Promise<void>((resolve, reject) => {\n const handleError = (error: Error) => {\n server.off(\"listening\", handleListening);\n reject(error);\n };\n const handleListening = () => {\n server.off(\"error\", handleError);\n resolve();\n };\n\n server.once(\"error\", handleError);\n server.once(\"listening\", handleListening);\n server.listen(requestedPort, host);\n });\n\n const address = server.address();\n if (!address || typeof address === \"string\") {\n await new Promise<void>((resolve) => server.close(() => resolve()));\n throw new Error(\"Could not determine the API server address.\");\n }\n\n const port = address.port;\n\n return {\n async close() {\n if (!server.listening) {\n return;\n }\n\n await new Promise<void>((resolve, reject) => {\n server.close((error) => {\n if (error) reject(error);\n else resolve();\n });\n server.closeIdleConnections();\n });\n },\n host,\n port,\n url: `http://${host}:${port}`,\n };\n}\n",
|
|
17
|
+
"import { stat } from \"node:fs/promises\";\n\nimport {\n buildMusicCatalog,\n type MusicCatalog,\n} from \"../api/catalog.js\";\nimport { buildPlaylist, type PlaylistTrack } from \"../playlist/mod.js\";\nimport { getRealmDBPath } from \"../utils/mod.js\";\n\nfunction formatRealmLoadError(error: unknown) {\n return [\n \"Realm native bindings could not be loaded.\",\n `Current Node runtime: ${process.version}.`,\n \"To repair Realm bindings in this project, run `bun run repair:realm` (or `bun run setup` to reinstall dependencies).\",\n \"If you installed dependencies on Node 22, switch to Node 20 LTS and rerun the repair command.\",\n `Original error: ${error instanceof Error ? error.message : String(error)}`,\n ].join(\"\\n\");\n}\n\nasync function loadRealmDependencies() {\n try {\n const [{ default: Realm }, lazerModule] = await Promise.all([\n import(\"realm\"),\n import(\"./mod.js\"),\n ]);\n\n return {\n Realm,\n ...lazerModule,\n };\n } catch (error) {\n throw new Error(formatRealmLoadError(error), { cause: error });\n }\n}\n\nasync function projectLazerLibrary<T>(\n osuDataDir: string,\n projector: (beatmapSets: Iterable<any>) => T,\n) {\n const realmDBPath = getRealmDBPath({ osuDataDir });\n if (!realmDBPath) {\n throw new Error(\"Realm DB not found\");\n }\n\n const {\n Realm,\n formatLazerSchemaCompatibilityError,\n getBeatmapSets,\n getLazerDB,\n inspectLazerSchema,\n } = await loadRealmDependencies();\n\n Realm.flags.ALLOW_CLEAR_TEST_STATE = true;\n const realm = await getLazerDB(realmDBPath);\n\n try {\n const schemaReport = inspectLazerSchema(realm);\n if (!schemaReport.compatible) {\n throw new Error(formatLazerSchemaCompatibilityError(schemaReport));\n }\n\n return projector(getBeatmapSets(realm));\n } finally {\n realm.close();\n }\n}\n\nexport function loadPlaylistFromLazer(osuDataDir: string) {\n return projectLazerLibrary<PlaylistTrack[]>(osuDataDir, (beatmapSets) =>\n buildPlaylist(beatmapSets, osuDataDir),\n );\n}\n\nexport function loadMusicCatalogFromLazer(osuDataDir: string) {\n return projectLazerLibrary<MusicCatalog>(osuDataDir, (beatmapSets) =>\n buildMusicCatalog(beatmapSets, osuDataDir),\n );\n}\n\nexport async function deleteBeatmapSetFromLazer(\n track: Pick<PlaylistTrack, \"beatmapSetHash\" | \"beatmapSetId\" | \"title\">,\n osuDataDir: string,\n) {\n const { deleteBeatmapSet } = await loadRealmDependencies();\n await deleteBeatmapSet(track, osuDataDir);\n}\n\nexport type CatalogStore = {\n getCatalog(): MusicCatalog;\n refreshIfChanged(): Promise<MusicCatalog>;\n};\n\ntype RefreshingCatalogStoreOptions = {\n getSignature: () => Promise<string>;\n loadCatalog: () => Promise<MusicCatalog>;\n onRefreshError?: (error: unknown) => void;\n};\n\nexport async function createRefreshingCatalogStore(\n options: RefreshingCatalogStoreOptions,\n): Promise<CatalogStore> {\n let catalog = await options.loadCatalog();\n let signature = await options.getSignature();\n let refreshPromise: Promise<MusicCatalog> | null = null;\n\n return {\n getCatalog() {\n return catalog;\n },\n async refreshIfChanged() {\n if (refreshPromise) {\n return refreshPromise;\n }\n\n refreshPromise = (async () => {\n try {\n const nextSignature = await options.getSignature();\n if (nextSignature === signature) {\n return catalog;\n }\n\n const nextCatalog = await options.loadCatalog();\n catalog = nextCatalog;\n signature = nextSignature;\n } catch (error) {\n options.onRefreshError?.(error);\n }\n\n return catalog;\n })();\n\n try {\n return await refreshPromise;\n } finally {\n refreshPromise = null;\n }\n },\n };\n}\n\nexport async function createLazerCatalogStore(\n osuDataDir: string,\n onRefreshError: (error: unknown) => void = (error) => {\n console.warn(\n `[WARN] Could not refresh the osu!lazer catalog; continuing with the last good snapshot: ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n },\n) {\n const realmDBPath = getRealmDBPath({ osuDataDir });\n if (!realmDBPath) {\n throw new Error(\"Realm DB not found\");\n }\n\n return createRefreshingCatalogStore({\n async getSignature() {\n const file = await stat(realmDBPath);\n return `${file.mtimeMs}:${file.size}`;\n },\n loadCatalog: () => loadMusicCatalogFromLazer(osuDataDir),\n onRefreshError,\n });\n}\n",
|
|
18
|
+
"import { createHash } from \"node:crypto\";\n\nimport { hashedFilePath } from \"../utils/mod.js\";\n\nexport type CatalogBeatmapMetadata = {\n Artist?: string | null;\n ArtistUnicode?: string | null;\n AudioFile?: string | null;\n BackgroundFile?: string | null;\n Title?: string | null;\n TitleUnicode?: string | null;\n};\n\nexport type CatalogBeatmap = {\n Length?: number | null;\n Metadata: CatalogBeatmapMetadata;\n};\n\nexport type CatalogBeatmapSet = {\n Beatmaps: Iterable<CatalogBeatmap>;\n DeletePending?: boolean;\n Files: Iterable<{\n File?: {\n Hash?: string | null;\n } | null;\n Filename?: string | null;\n }>;\n Hash?: string | null;\n ID?: unknown;\n};\n\nexport type CatalogMedia = {\n fileName: string;\n path: string;\n};\n\nexport type CatalogSong = {\n album: string;\n albumId: string;\n artist: string;\n coverArt?: string;\n duration?: number;\n fileName: string;\n id: string;\n path: string;\n title: string;\n track: number;\n};\n\nexport type CatalogAlbum = {\n artist: string;\n coverArt?: string;\n id: string;\n name: string;\n songs: CatalogSong[];\n};\n\nexport type CatalogArtist = {\n coverArt?: string;\n id: string;\n name: string;\n};\n\nexport type MusicCatalog = {\n albums: CatalogAlbum[];\n albumsById: Map<string, CatalogAlbum>;\n artists: CatalogArtist[];\n coversById: Map<string, CatalogMedia>;\n songsById: Map<string, CatalogSong>;\n};\n\ntype PendingSong = {\n artist: string;\n coverArt?: string;\n durationMs: number;\n fileName: string;\n hash: string;\n title: string;\n};\n\nfunction stableId(kind: string, value: string) {\n return createHash(\"sha256\").update(`${kind}\\0${value}`).digest(\"hex\");\n}\n\nfunction normalizedParts(parts: Array<string | null | undefined>) {\n return [...new Set(parts.map((part) => part?.trim()).filter(Boolean))] as string[];\n}\n\nfunction formatMetadataText(\n primary: string | null | undefined,\n unicode: string | null | undefined,\n fallback: string,\n) {\n return normalizedParts([primary, unicode]).join(\" / \") || fallback;\n}\n\nfunction getNamedFile(\n fileName: string | null | undefined,\n beatmapSet: CatalogBeatmapSet,\n) {\n if (!fileName) {\n return null;\n }\n\n for (const file of beatmapSet.Files) {\n if (file.Filename === fileName && file.File?.Hash) {\n return {\n fileName,\n hash: file.File.Hash,\n };\n }\n }\n\n return null;\n}\n\nfunction beatmapSetKey(beatmapSet: CatalogBeatmapSet) {\n return String(beatmapSet.ID ?? beatmapSet.Hash ?? \"\");\n}\n\nfunction compareText(left: string, right: string) {\n return left.localeCompare(right, undefined, {\n sensitivity: \"base\",\n usage: \"sort\",\n });\n}\n\nexport function emptyMusicCatalog(): MusicCatalog {\n return {\n albums: [],\n albumsById: new Map(),\n artists: [],\n coversById: new Map(),\n songsById: new Map(),\n };\n}\n\nexport function buildMusicCatalog(\n beatmapSets: Iterable<CatalogBeatmapSet>,\n osuDataDir: string,\n): MusicCatalog {\n const albums: CatalogAlbum[] = [];\n const coversById = new Map<string, CatalogMedia>();\n const seenAudioHashes = new Set<string>();\n\n const sortedSets = [...beatmapSets]\n .filter((beatmapSet) => !beatmapSet.DeletePending)\n .sort((left, right) => compareText(beatmapSetKey(left), beatmapSetKey(right)));\n\n for (const beatmapSet of sortedSets) {\n const pendingByHash = new Map<string, PendingSong>();\n let albumCoverArt: string | undefined;\n\n for (const beatmap of beatmapSet.Beatmaps) {\n const metadata = beatmap.Metadata;\n const audio = getNamedFile(metadata.AudioFile, beatmapSet);\n if (!audio) {\n continue;\n }\n\n const background = getNamedFile(metadata.BackgroundFile, beatmapSet);\n if (background) {\n coversById.set(background.hash, {\n fileName: background.fileName,\n path: hashedFilePath(background.hash, osuDataDir),\n });\n albumCoverArt ??= background.hash;\n }\n\n const durationMs = Math.max(0, beatmap.Length ?? 0);\n const existing = pendingByHash.get(audio.hash);\n if (existing) {\n existing.durationMs = Math.max(existing.durationMs, durationMs);\n existing.coverArt ??= background?.hash;\n continue;\n }\n\n pendingByHash.set(audio.hash, {\n artist: formatMetadataText(\n metadata.Artist,\n metadata.ArtistUnicode,\n \"Unknown Artist\",\n ),\n coverArt: background?.hash,\n durationMs,\n fileName: audio.fileName,\n hash: audio.hash,\n title: formatMetadataText(\n metadata.Title,\n metadata.TitleUnicode,\n \"Unknown Title\",\n ),\n });\n }\n\n const retained = [...pendingByHash.values()].filter(\n (song) => !seenAudioHashes.has(song.hash),\n );\n if (retained.length === 0) {\n continue;\n }\n\n for (const song of retained) {\n seenAudioHashes.add(song.hash);\n }\n\n const firstSong = retained[0]!;\n const setKey = beatmapSetKey(beatmapSet) || firstSong.hash;\n const albumId = stableId(\"album\", setKey);\n const albumName = firstSong.title;\n const albumArtist = firstSong.artist;\n const coverArt = albumCoverArt ?? firstSong.coverArt;\n const songs = retained.map<CatalogSong>((song, index) => {\n const duration = Math.round(song.durationMs / 1000);\n\n return {\n album: albumName,\n albumId,\n artist: song.artist,\n ...(coverArt ? { coverArt } : {}),\n ...(duration > 0 ? { duration } : {}),\n fileName: song.fileName,\n id: song.hash,\n path: hashedFilePath(song.hash, osuDataDir),\n title: song.title,\n track: index + 1,\n };\n });\n\n albums.push({\n artist: albumArtist,\n ...(coverArt ? { coverArt } : {}),\n id: albumId,\n name: albumName,\n songs,\n });\n }\n\n albums.sort(\n (left, right) => compareText(left.name, right.name) || left.id.localeCompare(right.id),\n );\n\n const albumsById = new Map(albums.map((album) => [album.id, album]));\n const songsById = new Map(\n albums.flatMap((album) => album.songs.map((song) => [song.id, song] as const)),\n );\n const artistsByName = new Map<string, CatalogArtist>();\n\n for (const album of albums) {\n const normalizedName = album.artist.trim().toLocaleLowerCase();\n const existing = artistsByName.get(normalizedName);\n if (existing) {\n existing.coverArt ??= album.coverArt;\n continue;\n }\n\n artistsByName.set(normalizedName, {\n ...(album.coverArt ? { coverArt: album.coverArt } : {}),\n id: stableId(\"artist\", normalizedName),\n name: album.artist,\n });\n }\n\n const artists = [...artistsByName.values()].sort(\n (left, right) => compareText(left.name, right.name) || left.id.localeCompare(right.id),\n );\n\n return {\n albums,\n albumsById,\n artists,\n coversById,\n songsById,\n };\n}\n",
|
|
16
19
|
"import { hashedFilePath } from \"../utils/mod.js\";\n\nexport type PlaylistBeatmapMetadata = {\n AudioFile?: string | null;\n Title?: string | null;\n Artist?: string | null;\n TitleUnicode?: string | null;\n ArtistUnicode?: string | null;\n};\n\nexport type PlaylistBeatmap = {\n Metadata: PlaylistBeatmapMetadata;\n};\n\nexport type PlaylistFile = {\n Filename?: string | null;\n File?: {\n Hash?: string | null;\n } | null;\n};\n\nexport type PlaylistBeatmapSet = {\n DeletePending?: boolean;\n Beatmaps: Iterable<PlaylistBeatmap>;\n Files: Iterable<PlaylistFile>;\n Hash?: string | null;\n ID?: unknown;\n};\n\nexport type PlaylistTrack = {\n beatmapSetHash: string | null;\n beatmapSetId: unknown;\n beatmapSetKey: string;\n hash: string;\n path: string;\n title: string;\n};\n\nfunction uniqueParts(parts: Array<string | null | undefined>) {\n return [...new Set(parts.map((part) => part?.trim()).filter(Boolean))];\n}\n\nexport function formatTrackTitle(metadata: PlaylistBeatmapMetadata) {\n const title = uniqueParts([metadata.Title, metadata.TitleUnicode]).join(\" / \");\n const artist = uniqueParts([metadata.Artist, metadata.ArtistUnicode]).join(\" / \");\n\n return `${title || \"Unknown Title\"} - ${artist || \"Unknown Artist\"}`;\n}\n\nexport function getNamedFileHash(fileName: string, beatmapSet: PlaylistBeatmapSet) {\n for (const file of beatmapSet.Files) {\n if (file.Filename === fileName && file.File?.Hash) {\n return file.File.Hash;\n }\n }\n\n return undefined;\n}\n\nexport function buildPlaylist(\n beatmapSets: Iterable<PlaylistBeatmapSet>,\n osuDataDir: string,\n) {\n const seenHashes = new Set<string>();\n const playlist: PlaylistTrack[] = [];\n\n for (const beatmapSet of beatmapSets) {\n if (beatmapSet.DeletePending) {\n continue;\n }\n\n for (const beatmap of beatmapSet.Beatmaps) {\n const hash = getNamedFileHash(beatmap.Metadata.AudioFile ?? \"\", beatmapSet);\n if (!hash || seenHashes.has(hash)) {\n continue;\n }\n\n seenHashes.add(hash);\n playlist.push({\n beatmapSetHash: beatmapSet.Hash ?? null,\n beatmapSetId: beatmapSet.ID,\n beatmapSetKey: String(beatmapSet.ID ?? hash),\n hash,\n path: hashedFilePath(hash, osuDataDir),\n title: formatTrackTitle(beatmap.Metadata),\n });\n }\n }\n\n return playlist;\n}\n",
|
|
17
20
|
"import { spawn, type ChildProcess } from \"node:child_process\";\nimport { existsSync, rmSync } from \"node:fs\";\nimport net from \"node:net\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { setTimeout as delay } from \"node:timers/promises\";\n\nimport type {\n PlayerBackend,\n PlayerBackendEvent,\n PlayerBackendListener,\n PlayerBackendSnapshot,\n} from \"./types.js\";\n\ntype PendingCommand = {\n reject: (error: Error) => void;\n resolve: (value: unknown) => void;\n};\n\ntype MpvResponse = {\n data?: unknown;\n error?: string;\n event?: string;\n name?: string;\n reason?: string;\n request_id?: number;\n};\n\nfunction getErrorCode(error: unknown) {\n if (error && typeof error === \"object\" && \"code\" in error) {\n const { code } = error as NodeJS.ErrnoException;\n return typeof code === \"string\" ? code : null;\n }\n\n return null;\n}\n\nfunction isRetryableSocketError(error: unknown) {\n const code = getErrorCode(error);\n if (code) {\n return (\n code === \"ENOENT\"\n || code === \"ECONNREFUSED\"\n || code === \"EPERM\"\n || code === \"EACCES\"\n );\n }\n\n const message = error instanceof Error ? error.message : String(error);\n return (\n message.includes(\"ENOENT\")\n || message.includes(\"ECONNREFUSED\")\n || message.includes(\"EPERM\")\n || message.includes(\"EACCES\")\n );\n}\n\nfunction createSocketPath() {\n const id = `osu-play-mpv-${process.pid}-${Date.now()}`;\n if (process.platform === \"win32\") {\n return `\\\\\\\\.\\\\pipe\\\\${id}`;\n }\n\n return path.join(os.tmpdir(), `${id}.sock`);\n}\n\nfunction isControlText(value: string) {\n return [...value].some((character) => {\n const code = character.charCodeAt(0);\n return code < 32 || code === 0x7f || (code >= 0x80 && code <= 0x9f);\n });\n}\n\nexport class MpvPlayerBackend implements PlayerBackend {\n readonly name = \"mpv\";\n\n private connectPromise: Promise<void> | null = null;\n\n private disposePromise: Promise<void> | null = null;\n\n private disposing = false;\n\n private readonly listeners = new Set<PlayerBackendListener>();\n\n private readonly pendingCommands = new Map<number, PendingCommand>();\n\n private idleActive = true;\n\n private process: ChildProcess | null = null;\n\n private requestId = 0;\n\n private responseBuffer = \"\";\n\n private snapshot: PlayerBackendSnapshot = {\n backendName: \"mpv\",\n currentPath: null,\n durationSeconds: null,\n errorMessage: null,\n status: \"stopped\",\n timePositionSeconds: null,\n };\n\n private socket: net.Socket | null = null;\n\n private readonly socketPath = createSocketPath();\n\n private stderrBuffer = \"\";\n\n getSnapshot() {\n return this.snapshot;\n }\n\n subscribe(listener: PlayerBackendListener) {\n this.listeners.add(listener);\n listener({\n snapshot: this.snapshot,\n type: \"state\",\n });\n\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n async start() {\n if (this.socket && !this.socket.destroyed) {\n return;\n }\n\n if (this.connectPromise) {\n return this.connectPromise;\n }\n\n this.connectPromise = this.startInternal();\n\n try {\n await this.connectPromise;\n } finally {\n this.connectPromise = null;\n }\n }\n\n async play(filePath: string) {\n await this.start();\n\n const previousSnapshot = this.snapshot;\n\n try {\n await this.sendCommand([\"loadfile\", filePath, \"replace\"]);\n await this.sendCommand([\"set_property\", \"pause\", false]);\n } catch (error) {\n this.snapshot = previousSnapshot;\n this.emit({\n snapshot: this.snapshot,\n type: \"state\",\n });\n throw error;\n }\n\n this.idleActive = false;\n this.snapshot = {\n ...this.snapshot,\n currentPath: filePath,\n errorMessage: null,\n status: \"playing\",\n timePositionSeconds: this.snapshot.timePositionSeconds ?? 0,\n };\n this.emit({\n snapshot: this.snapshot,\n type: \"state\",\n });\n }\n\n async togglePause() {\n await this.start();\n await this.sendCommand([\"cycle\", \"pause\"]);\n }\n\n async seekBy(seconds: number) {\n await this.start();\n await this.sendCommand([\"seek\", seconds, \"relative\"]);\n }\n\n async stop() {\n if (!this.socket || this.socket.destroyed) {\n return;\n }\n\n await this.sendCommand([\"stop\"]);\n this.idleActive = true;\n this.snapshot = {\n ...this.snapshot,\n status: \"stopped\",\n timePositionSeconds: null,\n };\n this.emit({\n snapshot: this.snapshot,\n type: \"state\",\n });\n }\n\n async dispose() {\n if (this.disposePromise) {\n return this.disposePromise;\n }\n\n this.disposePromise = this.disposeInternal();\n\n try {\n await this.disposePromise;\n } finally {\n this.disposePromise = null;\n }\n }\n\n private emit(event: PlayerBackendEvent) {\n for (const listener of this.listeners) {\n listener(event);\n }\n }\n\n private async startInternal() {\n this.cleanupSocketPath();\n this.disposing = false;\n this.stderrBuffer = \"\";\n\n const processHandle = spawn(\n \"mpv\",\n [\n \"--no-config\",\n \"--no-terminal\",\n \"--idle=yes\",\n \"--force-window=no\",\n \"--audio-display=no\",\n \"--really-quiet\",\n `--input-ipc-server=${this.socketPath}`,\n ],\n {\n stdio: [\"ignore\", \"ignore\", \"pipe\"],\n },\n );\n\n this.process = processHandle;\n\n processHandle.stderr.setEncoding(\"utf8\");\n processHandle.stderr.on(\"data\", (chunk: string) => {\n this.stderrBuffer = `${this.stderrBuffer}${chunk}`.slice(-4000);\n });\n\n processHandle.once(\"error\", (error) => {\n this.handleError(error);\n });\n\n processHandle.once(\"exit\", (code, signal) => {\n if (this.disposing) {\n return;\n }\n\n const detail = this.stderrBuffer.trim();\n const suffix = detail ? `\\n${detail}` : \"\";\n this.handleError(\n new Error(\n `mpv exited unexpectedly with ${signal ? `signal ${signal}` : `code ${code}`}.${suffix}`,\n ),\n );\n });\n\n await this.connectSocket();\n await Promise.all([\n this.sendCommand([\"observe_property\", 1, \"pause\"]),\n this.sendCommand([\"observe_property\", 2, \"time-pos\"]),\n this.sendCommand([\"observe_property\", 3, \"duration\"]),\n this.sendCommand([\"observe_property\", 4, \"idle-active\"]),\n ]);\n }\n\n private async connectSocket() {\n const start = Date.now();\n const timeoutMs = 5000;\n\n while (Date.now() - start < timeoutMs) {\n if (!this.process || this.process.exitCode !== null) {\n throw new Error(this.formatStartupError(\"mpv exited before opening its IPC socket.\"));\n }\n\n try {\n await this.attachSocket();\n return;\n } catch (error) {\n if (!isRetryableSocketError(error)) {\n throw error;\n }\n }\n\n await delay(50);\n }\n\n throw new Error(this.formatStartupError(\"Timed out waiting for mpv IPC to become ready.\"));\n }\n\n private async attachSocket() {\n await new Promise<void>((resolve, reject) => {\n const socket = net.createConnection(this.socketPath);\n\n const onError = (error: Error) => {\n socket.destroy();\n reject(error);\n };\n\n socket.once(\"error\", onError);\n socket.once(\"connect\", () => {\n socket.removeListener(\"error\", onError);\n socket.setEncoding(\"utf8\");\n socket.on(\"data\", (chunk: string) => {\n this.handleSocketData(chunk);\n });\n socket.on(\"error\", (error) => {\n if (!this.disposing) {\n this.handleError(error);\n }\n });\n socket.on(\"close\", () => {\n if (!this.disposing) {\n this.handleError(new Error(\"mpv IPC socket closed unexpectedly.\"));\n }\n });\n this.socket = socket;\n resolve();\n });\n });\n }\n\n private async sendCommand(command: unknown[]) {\n const socket = this.socket;\n if (!socket || socket.destroyed) {\n throw new Error(\"mpv IPC socket is not connected.\");\n }\n\n const requestId = ++this.requestId;\n\n return new Promise<unknown>((resolve, reject) => {\n this.pendingCommands.set(requestId, { reject, resolve });\n\n socket.write(\n `${JSON.stringify({ command, request_id: requestId })}\\n`,\n (error) => {\n if (!error) {\n return;\n }\n\n this.pendingCommands.delete(requestId);\n reject(error);\n },\n );\n });\n }\n\n private handleSocketData(chunk: string) {\n this.responseBuffer += chunk;\n\n while (true) {\n const newlineIndex = this.responseBuffer.indexOf(\"\\n\");\n if (newlineIndex === -1) {\n return;\n }\n\n const line = this.responseBuffer.slice(0, newlineIndex).trim();\n this.responseBuffer = this.responseBuffer.slice(newlineIndex + 1);\n\n if (!line) {\n continue;\n }\n\n try {\n const response = JSON.parse(line) as MpvResponse;\n this.handleResponse(response);\n } catch (error) {\n this.handleError(\n new Error(\n `Failed to parse mpv IPC message: ${\n error instanceof Error ? error.message : String(error)\n }`,\n ),\n );\n }\n }\n }\n\n private handleResponse(response: MpvResponse) {\n if (typeof response.request_id === \"number\") {\n const pending = this.pendingCommands.get(response.request_id);\n if (pending) {\n this.pendingCommands.delete(response.request_id);\n if (response.error && response.error !== \"success\") {\n pending.reject(new Error(`mpv command failed: ${response.error}`));\n } else {\n pending.resolve(response.data);\n }\n }\n return;\n }\n\n if (response.event === \"property-change\") {\n this.applyPropertyChange(response.name, response.data);\n return;\n }\n\n if (response.event === \"end-file\") {\n const reason = response.reason ?? \"unknown\";\n if (reason !== \"stop\" && reason !== \"redirect\") {\n this.snapshot = {\n ...this.snapshot,\n status: \"stopped\",\n timePositionSeconds:\n reason === \"eof\" ? this.snapshot.durationSeconds : this.snapshot.timePositionSeconds,\n };\n this.emit({\n snapshot: this.snapshot,\n type: \"state\",\n });\n }\n this.emit({\n reason,\n type: \"ended\",\n });\n }\n }\n\n private applyPropertyChange(name: string | undefined, data: unknown) {\n switch (name) {\n case \"pause\":\n this.snapshot = {\n ...this.snapshot,\n status: data === true ? \"paused\" : this.idleActive ? \"stopped\" : \"playing\",\n };\n break;\n case \"time-pos\":\n this.snapshot = {\n ...this.snapshot,\n timePositionSeconds: typeof data === \"number\" ? data : null,\n };\n break;\n case \"duration\":\n this.snapshot = {\n ...this.snapshot,\n durationSeconds: typeof data === \"number\" ? data : null,\n };\n break;\n case \"idle-active\":\n this.idleActive = data === true;\n this.snapshot = {\n ...this.snapshot,\n status:\n data === true\n ? \"stopped\"\n : this.snapshot.status === \"paused\"\n ? \"paused\"\n : \"playing\",\n timePositionSeconds:\n data === true ? this.snapshot.durationSeconds : this.snapshot.timePositionSeconds,\n };\n break;\n default:\n return;\n }\n\n this.emit({\n snapshot: this.snapshot,\n type: \"state\",\n });\n }\n\n private handleError(error: unknown) {\n const normalizedError =\n error instanceof Error ? error : new Error(String(error));\n\n this.snapshot = {\n ...this.snapshot,\n errorMessage: normalizedError.message,\n status: \"stopped\",\n };\n\n this.emit({\n error: normalizedError,\n type: \"error\",\n });\n\n for (const [requestId, pending] of this.pendingCommands) {\n this.pendingCommands.delete(requestId);\n pending.reject(normalizedError);\n }\n }\n\n private async disposeInternal() {\n this.disposing = true;\n\n if (this.socket && !this.socket.destroyed) {\n try {\n await this.sendCommand([\"quit\"]);\n } catch {\n // Ignore quit errors during shutdown.\n }\n }\n\n this.socket?.destroy();\n this.socket = null;\n\n const processHandle = this.process;\n this.process = null;\n if (processHandle && processHandle.exitCode === null) {\n processHandle.kill(\"SIGTERM\");\n await Promise.race([\n new Promise<void>((resolve) => {\n processHandle.once(\"exit\", () => resolve());\n }),\n delay(1000),\n ]);\n\n if (processHandle.exitCode === null) {\n processHandle.kill(\"SIGKILL\");\n }\n }\n\n this.cleanupSocketPath();\n }\n\n private cleanupSocketPath() {\n if (process.platform === \"win32\") {\n return;\n }\n\n if (existsSync(this.socketPath)) {\n rmSync(this.socketPath, { force: true });\n }\n }\n\n private formatStartupError(message: string) {\n const stderr = this.stderrBuffer.trim();\n const cleanStderr = stderr && !isControlText(stderr) ? `\\n${stderr}` : \"\";\n\n return [\n message,\n \"osu-play now expects `mpv` to be installed and available on PATH for TUI playback.\",\n cleanStderr,\n ]\n .filter(Boolean)\n .join(\"\\n\");\n }\n}\n",
|
|
18
|
-
"import type { PlaylistTrack } from \"../playlist/mod.js\";\nimport type {\n PlayerBackend,\n PlayerBackendEvent,\n PlaylistPlayerListener,\n PlaylistPlayerSnapshot,\n} from \"./types.js\";\n\nfunction clampIndex(index: number, length: number) {\n if (length <= 0) {\n return 0;\n }\n\n return Math.max(0, Math.min(index, length - 1));\n}\n\nfunction wrapIndex(index: number, length: number) {\n if (length <= 0) {\n return 0;\n }\n\n return ((index % length) + length) % length;\n}\n\nfunction normalizeSearchText(text: string) {\n return text.trim().toLowerCase();\n}\n\nexport function findTrackIndexByQuery(\n playlist: PlaylistTrack[],\n query: string,\n) {\n const normalizedQuery = normalizeSearchText(query);\n if (!normalizedQuery) {\n return -1;\n }\n\n return playlist.findIndex((track) =>\n normalizeSearchText(track.title).includes(normalizedQuery),\n );\n}\n\ntype PlaylistPlayerSessionOptions = {\n deleteTrack?: (track: PlaylistTrack) => Promise<void>;\n loop?: boolean;\n reloadPlaylist?: () => Promise<PlaylistTrack[]>;\n};\n\nexport class PlaylistPlayerSession {\n private readonly listeners = new Set<PlaylistPlayerListener>();\n\n private currentIndex: number | null = null;\n\n private errorMessage: string | null = null;\n\n private loop: boolean;\n\n private deleteTrack?: (track: PlaylistTrack) => Promise<void>;\n\n private playlist: PlaylistTrack[];\n\n private readonly reloadPlaylist?: () => Promise<PlaylistTrack[]>;\n\n private searchQuery = \"\";\n\n private selectedIndex = 0;\n\n private operationQueue: Promise<void> = Promise.resolve();\n\n private readonly unsubscribeBackend: () => void;\n\n constructor(\n playlist: PlaylistTrack[],\n private readonly backend: PlayerBackend,\n options: PlaylistPlayerSessionOptions = {},\n ) {\n this.playlist = playlist;\n this.deleteTrack = options.deleteTrack;\n this.loop = options.loop ?? false;\n this.reloadPlaylist = options.reloadPlaylist;\n this.unsubscribeBackend = backend.subscribe((event) => {\n void this.handleBackendEvent(event);\n });\n }\n\n getSnapshot(): PlaylistPlayerSnapshot {\n const backendSnapshot = this.backend.getSnapshot();\n const currentTrack =\n this.currentIndex !== null ? this.playlist[this.currentIndex] ?? null : null;\n\n return {\n backendName: backendSnapshot.backendName,\n currentIndex: this.currentIndex,\n currentTrack,\n durationSeconds: backendSnapshot.durationSeconds,\n errorMessage: this.errorMessage ?? backendSnapshot.errorMessage,\n loop: this.loop,\n playlist: this.playlist,\n searchQuery: this.searchQuery,\n selectedIndex: this.selectedIndex,\n status: backendSnapshot.status,\n timePositionSeconds: backendSnapshot.timePositionSeconds,\n };\n }\n\n subscribe(listener: PlaylistPlayerListener) {\n this.listeners.add(listener);\n listener(this.getSnapshot());\n\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n async start() {\n await this.backend.start();\n this.emit();\n }\n\n async dispose() {\n this.unsubscribeBackend();\n await this.backend.dispose();\n }\n\n moveSelection(delta: number) {\n if (this.playlist.length === 0) {\n return;\n }\n\n this.selectedIndex = wrapIndex(\n this.selectedIndex + delta,\n this.playlist.length,\n );\n this.emit();\n }\n\n moveSelectionPage(delta: number, pageSize: number) {\n this.moveSelection(delta * Math.max(1, pageSize));\n }\n\n selectHome() {\n if (this.playlist.length === 0) {\n return;\n }\n\n this.selectedIndex = 0;\n this.emit();\n }\n\n selectEnd() {\n if (this.playlist.length === 0) {\n return;\n }\n\n this.selectedIndex = this.playlist.length - 1;\n this.emit();\n }\n\n setSelectionIndex(index: number) {\n if (this.playlist.length === 0) {\n return;\n }\n\n this.selectedIndex = clampIndex(index, this.playlist.length);\n this.emit();\n }\n\n toggleLoop() {\n this.loop = !this.loop;\n this.emit();\n }\n\n appendSearchQuery(text: string) {\n if (!text) {\n return;\n }\n\n this.searchQuery += text;\n this.syncSelectionToSearch();\n }\n\n deleteSearchCharacter() {\n if (!this.searchQuery) {\n return;\n }\n\n this.searchQuery = this.searchQuery.slice(0, -1);\n this.syncSelectionToSearch();\n }\n\n clearSearch() {\n if (!this.searchQuery) {\n return;\n }\n\n this.searchQuery = \"\";\n this.emit();\n }\n\n async playSelected() {\n const selectedIndex = this.selectedIndex;\n await this.enqueueOperation(async () => {\n await this.playIndex(selectedIndex);\n });\n }\n\n async playNext() {\n await this.enqueueOperation(async () => {\n const nextIndex = this.getAdjacentIndex(1, true);\n if (nextIndex === null) {\n return;\n }\n\n await this.playIndex(nextIndex);\n });\n }\n\n async playPrevious() {\n await this.enqueueOperation(async () => {\n const previousIndex = this.getAdjacentIndex(-1, true);\n if (previousIndex === null) {\n return;\n }\n\n await this.playIndex(previousIndex);\n });\n }\n\n async togglePause() {\n const selectedIndex = this.selectedIndex;\n await this.enqueueOperation(async () => {\n if (this.playlist.length === 0) {\n return;\n }\n\n const { status } = this.backend.getSnapshot();\n if (status === \"stopped\") {\n const restartIndex = this.currentIndex ?? selectedIndex;\n await this.playIndex(restartIndex);\n return;\n }\n\n try {\n this.clearError();\n await this.backend.togglePause();\n } catch (error) {\n this.reportError(error);\n }\n });\n }\n\n async seekBy(seconds: number) {\n await this.enqueueOperation(async () => {\n if (seconds === 0) {\n return;\n }\n\n const { status } = this.backend.getSnapshot();\n if (status === \"stopped\") {\n return;\n }\n\n try {\n this.clearError();\n await this.backend.seekBy(seconds);\n } catch (error) {\n this.reportError(error);\n }\n });\n }\n\n async stop() {\n await this.enqueueOperation(async () => {\n try {\n this.clearError();\n await this.backend.stop();\n } catch (error) {\n this.reportError(error);\n }\n });\n }\n\n async deleteSelectedTrack() {\n const selectedIndex = this.selectedIndex;\n await this.enqueueOperation(async () => {\n const track = this.playlist[selectedIndex];\n if (!track) {\n return;\n }\n\n if (!this.deleteTrack || !this.reloadPlaylist) {\n this.reportError(new Error(\"Beatmap deletion is unavailable in this session.\"));\n return;\n }\n\n const currentTrack =\n this.currentIndex !== null ? this.playlist[this.currentIndex] ?? null : null;\n const deletingCurrentTrack =\n currentTrack !== null && currentTrack.beatmapSetKey === track.beatmapSetKey;\n\n try {\n this.clearError();\n\n if (deletingCurrentTrack) {\n await this.backend.stop();\n this.currentIndex = null;\n }\n\n await this.deleteTrack(track);\n this.playlist = await this.reloadPlaylist();\n this.selectedIndex = clampIndex(selectedIndex, this.playlist.length);\n\n if (this.searchQuery) {\n const matchedIndex = findTrackIndexByQuery(this.playlist, this.searchQuery);\n if (matchedIndex !== -1) {\n this.selectedIndex = matchedIndex;\n }\n }\n\n if (!deletingCurrentTrack && currentTrack) {\n const nextCurrentIndex = this.playlist.findIndex(\n (playlistTrack) => playlistTrack.hash === currentTrack.hash,\n );\n this.currentIndex = nextCurrentIndex === -1 ? null : nextCurrentIndex;\n }\n\n this.emit();\n } catch (error) {\n this.reportError(error);\n }\n });\n }\n\n reportError(error: unknown) {\n this.errorMessage =\n error instanceof Error ? error.message : String(error);\n this.emit();\n }\n\n private clearError() {\n if (this.errorMessage === null) {\n return;\n }\n\n this.errorMessage = null;\n }\n\n private emit() {\n const snapshot = this.getSnapshot();\n for (const listener of this.listeners) {\n listener(snapshot);\n }\n }\n\n private async playIndex(index: number) {\n const track = this.playlist[index];\n if (!track) {\n return;\n }\n\n const previousIndex = this.currentIndex;\n this.currentIndex = index;\n\n try {\n this.clearError();\n await this.backend.play(track.path);\n } catch (error) {\n this.currentIndex = previousIndex;\n this.reportError(error);\n return;\n }\n\n // Keep the cursor on the track that is now playing so n/p (and\n // auto-advance) move the selection along with playback.\n this.selectedIndex = index;\n this.emit();\n }\n\n private getAdjacentIndex(delta: number, wrap = false) {\n if (this.playlist.length === 0) {\n return null;\n }\n\n const baseIndex = this.currentIndex ?? this.selectedIndex;\n const nextIndex = baseIndex + delta;\n const shouldWrap = wrap || this.loop;\n\n if (nextIndex < 0) {\n return shouldWrap ? this.playlist.length - 1 : null;\n }\n\n if (nextIndex >= this.playlist.length) {\n return shouldWrap ? 0 : null;\n }\n\n return nextIndex;\n }\n\n private handleBackendEvent(event: PlayerBackendEvent) {\n switch (event.type) {\n case \"state\":\n this.emit();\n return;\n case \"error\":\n this.reportError(event.error);\n return;\n case \"ended\":\n void this.enqueueOperation(async () => {\n if (event.reason === \"eof\") {\n const nextIndex = this.getAdjacentIndex(1);\n if (nextIndex !== null) {\n await this.playIndex(nextIndex);\n return;\n }\n }\n\n this.emit();\n });\n }\n }\n\n private enqueueOperation(operation: () => Promise<void>) {\n const queuedOperation = this.operationQueue.then(operation, operation);\n this.operationQueue = queuedOperation.catch(() => {});\n return queuedOperation;\n }\n\n private syncSelectionToSearch() {\n const matchedIndex = findTrackIndexByQuery(this.playlist, this.searchQuery);\n if (matchedIndex !== -1) {\n this.selectedIndex = matchedIndex;\n }\n\n this.emit();\n }\n}\n",
|
|
19
|
-
"import {\n type Component,\n decodeKittyPrintable,\n Key,\n matchesKey,\n truncateToWidth,\n} from \"@earendil-works/pi-tui\";\n\nimport type { PlaylistPlayerSession } from \"../player/mod.js\";\nimport type { PlaylistPlayerSnapshot } from \"../player/types.js\";\n\nconst RESET = \"\\x1b[0m\";\nconst DIM = \"\\x1b[2m\";\nconst RED = \"\\x1b[31m\";\nconst CYAN = \"\\x1b[36m\";\nconst BOLD = \"\\x1b[1m\";\nconst INVERSE = \"\\x1b[7m\";\n\nconst MIN_LIST_ROWS = 4;\nconst RESERVED_ROWS = 5;\nconst PAGE_SIZE = 10;\nconst PENDING_G_TIMEOUT_MS = 400;\nconst SEEK_SECONDS = 5;\n\nconst STATUS_GLYPH: Record<string, string> = {\n paused: \"⏸\",\n playing: \"▶\",\n stopped: \"■\",\n};\n\nfunction style(text: string, code: string) {\n return `${code}${text}${RESET}`;\n}\n\nfunction progressBar(\n position: number | null,\n duration: number | null,\n width: number,\n) {\n const span = Math.max(4, width);\n const ratio =\n duration && duration > 0 && position !== null\n ? Math.max(0, Math.min(position / duration, 1))\n : 0;\n const filled = Math.round(ratio * span);\n\n return (\n style(\"━\".repeat(filled), CYAN) + style(\"─\".repeat(span - filled), DIM)\n );\n}\n\nfunction padIndex(index: number, total: number) {\n const width = String(Math.max(total, 1)).length;\n return String(index + 1).padStart(width, \" \");\n}\n\nfunction formatSeconds(seconds: number | null) {\n if (seconds === null || Number.isNaN(seconds)) {\n return \"--:--\";\n }\n\n const rounded = Math.max(0, Math.floor(seconds));\n const minutes = Math.floor(rounded / 60);\n const remainingSeconds = rounded % 60;\n\n return `${String(minutes).padStart(2, \"0\")}:${String(remainingSeconds).padStart(2, \"0\")}`;\n}\n\nfunction decodePrintableText(data: string) {\n const kittyPrintable = decodeKittyPrintable(data);\n if (kittyPrintable !== undefined) {\n return kittyPrintable;\n }\n\n const hasControlChars = [...data].some((character) => {\n const code = character.charCodeAt(0);\n return code < 32 || code === 0x7f || (code >= 0x80 && code <= 0x9f);\n });\n\n return hasControlChars ? undefined : data;\n}\n\nexport function getVisibleTrackRange(\n selectedIndex: number,\n totalTracks: number,\n maxVisible: number,\n) {\n if (totalTracks <= 0 || maxVisible <= 0) {\n return { end: 0, start: 0 };\n }\n\n const clampedSelectedIndex = Math.max(\n 0,\n Math.min(selectedIndex, totalTracks - 1),\n );\n const start = Math.max(\n 0,\n Math.min(\n clampedSelectedIndex - Math.floor(maxVisible / 2),\n totalTracks - maxVisible,\n ),\n );\n\n return {\n end: Math.min(totalTracks, start + maxVisible),\n start,\n };\n}\n\nexport class PlaylistPlayerScreen implements Component {\n private deleteConfirmationTrackKey: string | null = null;\n\n private pendingGoToTop = false;\n\n private pendingGoToTopTimer: ReturnType<typeof setTimeout> | null = null;\n\n private searchMode = false;\n\n private snapshot: PlaylistPlayerSnapshot;\n\n onQuit?: () => void;\n\n constructor(\n private readonly session: PlaylistPlayerSession,\n private readonly getViewportHeight: () => number,\n ) {\n this.snapshot = session.getSnapshot();\n }\n\n setSnapshot(snapshot: PlaylistPlayerSnapshot) {\n this.snapshot = snapshot;\n }\n\n invalidate() {\n // This screen renders from live snapshot state only.\n }\n\n handleInput(data: string) {\n if (this.deleteConfirmationTrackKey !== null) {\n this.handleDeleteConfirmationInput(data);\n return;\n }\n\n if (this.searchMode) {\n this.handleSearchInput(data);\n return;\n }\n\n if (matchesKey(data, Key.slash)) {\n this.searchMode = true;\n return;\n }\n\n if (matchesKey(data, \"g\")) {\n if (this.pendingGoToTop) {\n this.clearPendingGoToTop();\n this.session.selectHome();\n } else {\n this.armPendingGoToTop();\n }\n return;\n }\n\n this.clearPendingGoToTop();\n\n if (matchesKey(data, Key.ctrl(\"c\")) || matchesKey(data, \"q\")) {\n this.onQuit?.();\n return;\n }\n\n if (matchesKey(data, Key.up) || matchesKey(data, \"k\")) {\n this.session.moveSelection(-1);\n return;\n }\n\n if (matchesKey(data, Key.down) || matchesKey(data, \"j\")) {\n this.session.moveSelection(1);\n return;\n }\n\n if (matchesKey(data, Key.left) || matchesKey(data, \"h\")) {\n void this.session.seekBy(-SEEK_SECONDS);\n return;\n }\n\n if (matchesKey(data, Key.right) || matchesKey(data, \"l\")) {\n void this.session.seekBy(SEEK_SECONDS);\n return;\n }\n\n if (\n matchesKey(data, Key.pageUp)\n || matchesKey(data, Key.ctrl(\"u\"))\n || matchesKey(data, Key.ctrl(\"b\"))\n ) {\n this.session.moveSelectionPage(-1, PAGE_SIZE);\n return;\n }\n\n if (\n matchesKey(data, Key.pageDown)\n || matchesKey(data, Key.ctrl(\"d\"))\n || matchesKey(data, Key.ctrl(\"f\"))\n ) {\n this.session.moveSelectionPage(1, PAGE_SIZE);\n return;\n }\n\n if (matchesKey(data, Key.home) || matchesKey(data, \"0\")) {\n this.session.selectHome();\n return;\n }\n\n if (matchesKey(data, Key.end) || matchesKey(data, Key.shift(\"g\"))) {\n this.session.selectEnd();\n return;\n }\n\n if (matchesKey(data, Key.shift(\"h\"))) {\n this.moveSelectionToVisibleAnchor(\"top\");\n return;\n }\n\n if (matchesKey(data, Key.shift(\"m\"))) {\n this.moveSelectionToVisibleAnchor(\"middle\");\n return;\n }\n\n if (matchesKey(data, Key.shift(\"l\"))) {\n this.moveSelectionToVisibleAnchor(\"bottom\");\n return;\n }\n\n if (matchesKey(data, Key.enter)) {\n void this.session.playSelected();\n return;\n }\n\n if (matchesKey(data, \"d\")) {\n this.armDeleteConfirmation();\n return;\n }\n\n if (matchesKey(data, Key.space)) {\n void this.session.togglePause();\n return;\n }\n\n if (matchesKey(data, \"n\")) {\n void this.session.playNext();\n return;\n }\n\n if (matchesKey(data, \"p\")) {\n void this.session.playPrevious();\n return;\n }\n\n if (matchesKey(data, \"s\")) {\n void this.session.stop();\n return;\n }\n\n if (matchesKey(data, \"r\")) {\n this.session.toggleLoop();\n return;\n }\n\n if (matchesKey(data, Key.backspace)) {\n this.session.deleteSearchCharacter();\n return;\n }\n\n if (matchesKey(data, Key.escape)) {\n this.session.clearSearch();\n return;\n }\n }\n\n render(width: number) {\n const { playlist } = this.snapshot;\n const viewportHeight = Math.max(this.getViewportHeight(), RESERVED_ROWS);\n const listHeight = this.getListHeight(viewportHeight);\n const { start, end } = getVisibleTrackRange(\n this.snapshot.selectedIndex,\n playlist.length,\n listHeight,\n );\n\n const position = formatSeconds(this.snapshot.timePositionSeconds);\n const duration = formatSeconds(this.snapshot.durationSeconds);\n const glyph = STATUS_GLYPH[this.snapshot.status] ?? \"·\";\n const isIdle = this.snapshot.currentTrack === null;\n const nowPlaying = `${glyph} ${\n this.snapshot.currentTrack?.title ?? \"nothing playing\"\n }`;\n const barWidth = Math.max(\n 4,\n width - position.length - duration.length - 2,\n );\n\n const lines: string[] = [\n truncateToWidth(\n isIdle ? style(nowPlaying, DIM) : style(nowPlaying, BOLD + CYAN),\n width,\n ),\n truncateToWidth(\n `${style(position, DIM)} ${progressBar(\n this.snapshot.timePositionSeconds,\n this.snapshot.durationSeconds,\n barWidth,\n )} ${style(duration, DIM)}`,\n width,\n ),\n ];\n\n if (this.snapshot.errorMessage) {\n lines.push(\n truncateToWidth(style(`✗ ${this.snapshot.errorMessage}`, RED), width),\n );\n } else if (this.deleteConfirmationTrackKey !== null) {\n lines.push(\n truncateToWidth(\n style(\"delete this beatmap set? enter/d/y confirm · any key cancel\", RED),\n width,\n ),\n );\n } else if (this.searchMode || this.snapshot.searchQuery) {\n lines.push(\n truncateToWidth(\n style(\n `/ ${this.snapshot.searchQuery}${this.searchMode ? \"▏\" : \"\"}`,\n CYAN,\n ),\n width,\n ),\n );\n } else {\n lines.push(\n truncateToWidth(\n style(\n `${this.snapshot.selectedIndex + 1}/${Math.max(\n playlist.length,\n 1,\n )} · loop ${this.snapshot.loop ? \"on\" : \"off\"} · ${\n this.snapshot.backendName\n }`,\n DIM,\n ),\n width,\n ),\n );\n }\n\n if (playlist.length === 0) {\n lines.push(\n truncateToWidth(\"No tracks were found in your osu!lazer library.\", width),\n );\n } else {\n for (let index = start; index < end; index += 1) {\n const track = playlist[index];\n if (!track) {\n continue;\n }\n\n const isCurrent = index === this.snapshot.currentIndex;\n const isSelected = index === this.snapshot.selectedIndex;\n const marker = isCurrent ? \"▶\" : \" \";\n const line = ` ${marker} ${padIndex(index, playlist.length)} ${track.title}`;\n lines.push(\n truncateToWidth(\n isSelected\n ? style(line, INVERSE)\n : isCurrent\n ? style(line, CYAN)\n : line,\n width,\n ),\n );\n }\n }\n\n while (lines.length < viewportHeight - 1) {\n lines.push(\"\");\n }\n\n lines.push(\n truncateToWidth(\n style(\n this.searchMode\n ? \"type to jump · backspace edit · enter keep · esc leave\"\n : \"j/k move · ⏎ play · space pause · n/p track · h/l seek · r loop · d delete · / search · q quit\",\n DIM,\n ),\n width,\n ),\n );\n\n return lines;\n }\n\n private armPendingGoToTop() {\n this.pendingGoToTop = true;\n this.pendingGoToTopTimer = setTimeout(() => {\n this.pendingGoToTop = false;\n this.pendingGoToTopTimer = null;\n }, PENDING_G_TIMEOUT_MS);\n }\n\n private clearPendingGoToTop() {\n if (this.pendingGoToTopTimer) {\n clearTimeout(this.pendingGoToTopTimer);\n this.pendingGoToTopTimer = null;\n }\n\n this.pendingGoToTop = false;\n }\n\n private armDeleteConfirmation() {\n const selectedTrack = this.snapshot.playlist[this.snapshot.selectedIndex];\n if (!selectedTrack) {\n return;\n }\n\n this.deleteConfirmationTrackKey = selectedTrack.beatmapSetKey;\n }\n\n private clearDeleteConfirmation() {\n this.deleteConfirmationTrackKey = null;\n }\n\n private handleDeleteConfirmationInput(data: string) {\n if (\n matchesKey(data, Key.enter)\n || matchesKey(data, \"d\")\n || matchesKey(data, \"y\")\n ) {\n this.clearDeleteConfirmation();\n void this.session.deleteSelectedTrack();\n return;\n }\n\n this.clearDeleteConfirmation();\n }\n\n private handleSearchInput(data: string) {\n if (matchesKey(data, Key.ctrl(\"c\"))) {\n this.onQuit?.();\n return;\n }\n\n if (matchesKey(data, Key.enter)) {\n this.searchMode = false;\n return;\n }\n\n if (matchesKey(data, Key.escape)) {\n this.searchMode = false;\n return;\n }\n\n if (matchesKey(data, Key.backspace)) {\n this.session.deleteSearchCharacter();\n return;\n }\n\n if (matchesKey(data, Key.ctrl(\"u\"))) {\n this.session.clearSearch();\n return;\n }\n\n const printable = decodePrintableText(data);\n if (!printable) {\n return;\n }\n\n this.session.appendSearchQuery(printable);\n }\n\n private getListHeight(viewportHeight: number) {\n return Math.max(MIN_LIST_ROWS, viewportHeight - RESERVED_ROWS);\n }\n\n private moveSelectionToVisibleAnchor(\n anchor: \"bottom\" | \"middle\" | \"top\",\n ) {\n if (this.snapshot.playlist.length === 0) {\n return;\n }\n\n const { start, end } = getVisibleTrackRange(\n this.snapshot.selectedIndex,\n this.snapshot.playlist.length,\n this.getListHeight(Math.max(this.getViewportHeight(), RESERVED_ROWS)),\n );\n const lastVisibleIndex = Math.max(start, end - 1);\n\n switch (anchor) {\n case \"top\":\n this.session.setSelectionIndex(start);\n return;\n case \"middle\":\n this.session.setSelectionIndex(\n start + Math.floor((lastVisibleIndex - start) / 2),\n );\n return;\n case \"bottom\":\n this.session.setSelectionIndex(lastVisibleIndex);\n }\n }\n}\n",
|
|
21
|
+
"import type { PlaylistTrack } from \"../playlist/mod.js\";\nimport type {\n PlayerBackend,\n PlayerBackendEvent,\n PlaylistPlayerListener,\n PlaylistPlayerSnapshot,\n} from \"./types.js\";\n\nfunction clampIndex(index: number, length: number) {\n if (length <= 0) {\n return 0;\n }\n\n return Math.max(0, Math.min(index, length - 1));\n}\n\nfunction wrapIndex(index: number, length: number) {\n if (length <= 0) {\n return 0;\n }\n\n return ((index % length) + length) % length;\n}\n\nfunction normalizeSearchText(text: string) {\n return text.trim().toLowerCase();\n}\n\nexport function findTrackIndexByQuery(\n playlist: PlaylistTrack[],\n query: string,\n) {\n const normalizedQuery = normalizeSearchText(query);\n if (!normalizedQuery) {\n return -1;\n }\n\n return playlist.findIndex((track) =>\n normalizeSearchText(track.title).includes(normalizedQuery),\n );\n}\n\nexport function findTrackIndicesByQuery(\n playlist: PlaylistTrack[],\n query: string,\n) {\n const normalizedQuery = normalizeSearchText(query);\n if (!normalizedQuery) {\n return playlist.map((_, index) => index);\n }\n\n return playlist.flatMap((track, index) =>\n normalizeSearchText(track.title).includes(normalizedQuery) ? [index] : [],\n );\n}\n\ntype PlaylistPlayerSessionOptions = {\n deleteTrack?: (track: PlaylistTrack) => Promise<void>;\n loop?: boolean;\n random?: () => number;\n reloadPlaylist?: () => Promise<PlaylistTrack[]>;\n revealTrack?: (track: PlaylistTrack) => Promise<void>;\n shuffle?: boolean;\n};\n\nexport class PlaylistPlayerSession {\n private readonly listeners = new Set<PlaylistPlayerListener>();\n\n private currentIndex: number | null = null;\n\n private errorMessage: string | null = null;\n\n private loop: boolean;\n\n private deleteTrack?: (track: PlaylistTrack) => Promise<void>;\n\n private playlist: PlaylistTrack[];\n\n private readonly random: () => number;\n\n private readonly reloadPlaylist?: () => Promise<PlaylistTrack[]>;\n\n private readonly revealTrack?: (track: PlaylistTrack) => Promise<void>;\n\n private searchQuery = \"\";\n\n private selectedIndex = 0;\n\n private shuffle: boolean;\n\n private shuffleOrder: number[] = [];\n\n private operationQueue: Promise<void> = Promise.resolve();\n\n private readonly unsubscribeBackend: () => void;\n\n constructor(\n playlist: PlaylistTrack[],\n private readonly backend: PlayerBackend,\n options: PlaylistPlayerSessionOptions = {},\n ) {\n this.playlist = playlist;\n this.deleteTrack = options.deleteTrack;\n this.loop = options.loop ?? false;\n this.random = options.random ?? Math.random;\n this.reloadPlaylist = options.reloadPlaylist;\n this.revealTrack = options.revealTrack;\n this.shuffle = options.shuffle ?? false;\n if (this.shuffle) {\n this.resetShuffleOrder(this.selectedIndex);\n }\n this.unsubscribeBackend = backend.subscribe((event) => {\n void this.handleBackendEvent(event);\n });\n }\n\n getSnapshot(): PlaylistPlayerSnapshot {\n const backendSnapshot = this.backend.getSnapshot();\n const currentTrack =\n this.currentIndex !== null ? this.playlist[this.currentIndex] ?? null : null;\n\n return {\n backendName: backendSnapshot.backendName,\n currentIndex: this.currentIndex,\n currentTrack,\n durationSeconds: backendSnapshot.durationSeconds,\n errorMessage: this.errorMessage ?? backendSnapshot.errorMessage,\n loop: this.loop,\n playlist: this.playlist,\n searchQuery: this.searchQuery,\n selectedIndex: this.selectedIndex,\n shuffle: this.shuffle,\n status: backendSnapshot.status,\n timePositionSeconds: backendSnapshot.timePositionSeconds,\n };\n }\n\n subscribe(listener: PlaylistPlayerListener) {\n this.listeners.add(listener);\n listener(this.getSnapshot());\n\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n async start() {\n await this.backend.start();\n this.emit();\n }\n\n async dispose() {\n this.unsubscribeBackend();\n await this.backend.dispose();\n }\n\n moveSelection(delta: number) {\n if (this.playlist.length === 0) {\n return;\n }\n\n if (this.searchQuery) {\n this.moveSearchSelection(delta);\n return;\n }\n\n this.selectedIndex = wrapIndex(\n this.selectedIndex + delta,\n this.playlist.length,\n );\n this.emit();\n }\n\n moveSelectionPage(delta: number, pageSize: number) {\n if (this.searchQuery) {\n this.moveSearchSelection(delta * Math.max(1, pageSize));\n return;\n }\n\n this.moveSelection(delta * Math.max(1, pageSize));\n }\n\n moveSearchSelection(delta: number) {\n const matches = findTrackIndicesByQuery(this.playlist, this.searchQuery);\n if (matches.length === 0) {\n return;\n }\n\n const currentMatchIndex = matches.indexOf(this.selectedIndex);\n const nextMatchIndex = wrapIndex(currentMatchIndex + delta, matches.length);\n this.selectedIndex = matches[nextMatchIndex] ?? this.selectedIndex;\n this.emit();\n }\n\n selectHome() {\n if (this.playlist.length === 0) {\n return;\n }\n\n const matches = findTrackIndicesByQuery(this.playlist, this.searchQuery);\n this.selectedIndex = matches[0] ?? 0;\n this.emit();\n }\n\n selectEnd() {\n if (this.playlist.length === 0) {\n return;\n }\n\n const matches = findTrackIndicesByQuery(this.playlist, this.searchQuery);\n this.selectedIndex = matches.at(-1) ?? this.playlist.length - 1;\n this.emit();\n }\n\n setSelectionIndex(index: number) {\n if (this.playlist.length === 0) {\n return;\n }\n\n this.selectedIndex = clampIndex(index, this.playlist.length);\n this.emit();\n }\n\n toggleLoop() {\n this.loop = !this.loop;\n this.emit();\n }\n\n toggleShuffle() {\n this.shuffle = !this.shuffle;\n if (this.shuffle) {\n this.resetShuffleOrder(this.currentIndex ?? this.selectedIndex);\n }\n this.emit();\n }\n\n appendSearchQuery(text: string) {\n if (!text) return;\n this.searchQuery += text;\n this.syncSelectionToSearch();\n }\n\n deleteSearchCharacter() {\n if (!this.searchQuery) return;\n\n this.searchQuery = this.searchQuery.slice(0, -1);\n this.syncSelectionToSearch();\n }\n\n deleteSearchWord() {\n if (!this.searchQuery) return;\n this.searchQuery = this.searchQuery.replace(/\\s*\\S+\\s*$/, \"\");\n this.syncSelectionToSearch();\n }\n\n clearSearch() {\n if (!this.searchQuery) return;\n this.searchQuery = \"\";\n this.emit();\n }\n\n async playSelected() {\n const selectedIndex = this.selectedIndex;\n await this.enqueueOperation(async () => {\n if (this.shuffle) {\n this.resetShuffleOrder(selectedIndex);\n }\n await this.playIndex(selectedIndex);\n });\n }\n\n async playNext() {\n await this.enqueueOperation(async () => {\n const nextIndex = this.getAdjacentIndex(1, true);\n if (nextIndex === null) {\n return;\n }\n\n await this.playIndex(nextIndex);\n });\n }\n\n async playPrevious() {\n await this.enqueueOperation(async () => {\n const previousIndex = this.getAdjacentIndex(-1, true);\n if (previousIndex === null) {\n return;\n }\n\n await this.playIndex(previousIndex);\n });\n }\n\n async togglePause() {\n const selectedIndex = this.selectedIndex;\n await this.enqueueOperation(async () => {\n if (this.playlist.length === 0) {\n return;\n }\n\n const { status } = this.backend.getSnapshot();\n if (status === \"stopped\") {\n const restartIndex = this.currentIndex ?? selectedIndex;\n await this.playIndex(restartIndex);\n return;\n }\n\n try {\n this.clearError();\n await this.backend.togglePause();\n } catch (error) {\n this.reportError(error);\n }\n });\n }\n\n async seekBy(seconds: number) {\n await this.enqueueOperation(async () => {\n if (seconds === 0) {\n return;\n }\n\n const { status } = this.backend.getSnapshot();\n if (status === \"stopped\") {\n return;\n }\n\n try {\n this.clearError();\n await this.backend.seekBy(seconds);\n } catch (error) {\n this.reportError(error);\n }\n });\n }\n\n async stop() {\n await this.enqueueOperation(async () => {\n try {\n this.clearError();\n await this.backend.stop();\n } catch (error) {\n this.reportError(error);\n }\n });\n }\n\n async revealSelectedTrack() {\n const track = this.playlist[this.selectedIndex];\n if (!track) {\n return;\n }\n\n if (!this.revealTrack) {\n this.reportError(new Error(\"Opening the containing folder is unavailable.\"));\n return;\n }\n\n try {\n this.clearError();\n await this.revealTrack(track);\n } catch (error) {\n this.reportError(error);\n }\n }\n\n async deleteSelectedTrack() {\n const selectedIndex = this.selectedIndex;\n await this.enqueueOperation(async () => {\n const track = this.playlist[selectedIndex];\n if (!track) {\n return;\n }\n\n if (!this.deleteTrack || !this.reloadPlaylist) {\n this.reportError(new Error(\"Beatmap deletion is unavailable in this session.\"));\n return;\n }\n\n const currentTrack =\n this.currentIndex !== null ? this.playlist[this.currentIndex] ?? null : null;\n const deletingCurrentTrack =\n currentTrack !== null && currentTrack.beatmapSetKey === track.beatmapSetKey;\n\n try {\n this.clearError();\n\n if (deletingCurrentTrack) {\n await this.backend.stop();\n this.currentIndex = null;\n }\n\n await this.deleteTrack(track);\n this.playlist = await this.reloadPlaylist();\n this.selectedIndex = clampIndex(selectedIndex, this.playlist.length);\n\n if (this.searchQuery) {\n const matchedIndex = findTrackIndexByQuery(this.playlist, this.searchQuery);\n if (matchedIndex !== -1) {\n this.selectedIndex = matchedIndex;\n }\n }\n\n if (!deletingCurrentTrack && currentTrack) {\n const nextCurrentIndex = this.playlist.findIndex(\n (playlistTrack) => playlistTrack.hash === currentTrack.hash,\n );\n this.currentIndex = nextCurrentIndex === -1 ? null : nextCurrentIndex;\n }\n\n if (this.shuffle) {\n this.resetShuffleOrder(this.currentIndex ?? this.selectedIndex);\n }\n\n this.emit();\n } catch (error) {\n this.reportError(error);\n }\n });\n }\n\n reportError(error: unknown) {\n this.errorMessage =\n error instanceof Error ? error.message : String(error);\n this.emit();\n }\n\n private clearError() {\n if (this.errorMessage === null) {\n return;\n }\n\n this.errorMessage = null;\n }\n\n private emit() {\n const snapshot = this.getSnapshot();\n for (const listener of this.listeners) {\n listener(snapshot);\n }\n }\n\n private async playIndex(index: number) {\n const track = this.playlist[index];\n if (!track) {\n return;\n }\n\n const previousIndex = this.currentIndex;\n this.currentIndex = index;\n\n try {\n this.clearError();\n await this.backend.play(track.path);\n } catch (error) {\n this.currentIndex = previousIndex;\n this.reportError(error);\n return;\n }\n\n // Keep the cursor on the track that is now playing so n/p (and\n // auto-advance) move the selection along with playback.\n this.selectedIndex = index;\n this.emit();\n }\n\n private getAdjacentIndex(delta: number, wrap = false) {\n if (this.playlist.length === 0) {\n return null;\n }\n\n const baseIndex = this.currentIndex ?? this.selectedIndex;\n if (this.shuffle) {\n let orderIndex = this.shuffleOrder.indexOf(baseIndex);\n if (orderIndex === -1) {\n this.resetShuffleOrder(baseIndex);\n orderIndex = 0;\n }\n\n const nextOrderIndex = orderIndex + delta;\n const shouldWrap = wrap || this.loop;\n if (nextOrderIndex < 0 || nextOrderIndex >= this.shuffleOrder.length) {\n return shouldWrap\n ? this.shuffleOrder[wrapIndex(nextOrderIndex, this.shuffleOrder.length)] ?? null\n : null;\n }\n\n return this.shuffleOrder[nextOrderIndex] ?? null;\n }\n\n const nextIndex = baseIndex + delta;\n const shouldWrap = wrap || this.loop;\n\n if (nextIndex < 0) {\n return shouldWrap ? this.playlist.length - 1 : null;\n }\n\n if (nextIndex >= this.playlist.length) {\n return shouldWrap ? 0 : null;\n }\n\n return nextIndex;\n }\n\n private resetShuffleOrder(firstIndex: number) {\n const remainingIndices = this.playlist\n .map((_, index) => index)\n .filter((index) => index !== firstIndex);\n\n for (let index = remainingIndices.length - 1; index > 0; index -= 1) {\n const swapIndex = Math.floor(this.random() * (index + 1));\n [remainingIndices[index], remainingIndices[swapIndex]] = [\n remainingIndices[swapIndex]!,\n remainingIndices[index]!,\n ];\n }\n\n this.shuffleOrder = this.playlist[firstIndex]\n ? [firstIndex, ...remainingIndices]\n : remainingIndices;\n }\n\n private handleBackendEvent(event: PlayerBackendEvent) {\n switch (event.type) {\n case \"state\":\n this.emit();\n return;\n case \"error\":\n this.reportError(event.error);\n return;\n case \"ended\":\n void this.enqueueOperation(async () => {\n if (event.reason === \"eof\") {\n const nextIndex = this.getAdjacentIndex(1);\n if (nextIndex !== null) {\n await this.playIndex(nextIndex);\n return;\n }\n }\n\n this.emit();\n });\n }\n }\n\n private enqueueOperation(operation: () => Promise<void>) {\n const queuedOperation = this.operationQueue.then(operation, operation);\n this.operationQueue = queuedOperation.catch(() => {});\n return queuedOperation;\n }\n\n private syncSelectionToSearch() {\n const matchedIndex = findTrackIndexByQuery(this.playlist, this.searchQuery);\n if (matchedIndex !== -1) {\n this.selectedIndex = matchedIndex;\n }\n\n this.emit();\n }\n}\n",
|
|
22
|
+
"import {\n type Component,\n decodeKittyPrintable,\n Key,\n matchesKey,\n truncateToWidth,\n} from \"@earendil-works/pi-tui\";\n\nimport type { PlaylistPlayerSession } from \"../player/mod.js\";\nimport { findTrackIndicesByQuery } from \"../player/mod.js\";\nimport type { PlaylistPlayerSnapshot } from \"../player/types.js\";\n\nconst RESET = \"\\x1b[0m\";\nconst DIM = \"\\x1b[2m\";\nconst RED = \"\\x1b[31m\";\nconst CYAN = \"\\x1b[36m\";\nconst BOLD = \"\\x1b[1m\";\nconst INVERSE = \"\\x1b[7m\";\n\nconst MIN_LIST_ROWS = 4;\nconst RESERVED_ROWS = 5;\nconst PAGE_SIZE = 10;\nconst PENDING_G_TIMEOUT_MS = 400;\nconst SEEK_SECONDS = 5;\n\nconst STATUS_GLYPH: Record<string, string> = {\n paused: \"⏸\",\n playing: \"▶\",\n stopped: \"■\",\n};\n\nfunction style(text: string, code: string) {\n return `${code}${text}${RESET}`;\n}\n\nfunction progressBar(\n position: number | null,\n duration: number | null,\n width: number,\n) {\n const span = Math.max(4, width);\n const ratio =\n duration && duration > 0 && position !== null\n ? Math.max(0, Math.min(position / duration, 1))\n : 0;\n const filled = Math.round(ratio * span);\n\n return (\n style(\"━\".repeat(filled), CYAN) + style(\"─\".repeat(span - filled), DIM)\n );\n}\n\nfunction padIndex(index: number, total: number) {\n const width = String(Math.max(total, 1)).length;\n return String(index + 1).padStart(width, \" \");\n}\n\nfunction formatSeconds(seconds: number | null) {\n if (seconds === null || Number.isNaN(seconds)) {\n return \"--:--\";\n }\n\n const rounded = Math.max(0, Math.floor(seconds));\n const minutes = Math.floor(rounded / 60);\n const remainingSeconds = rounded % 60;\n\n return `${String(minutes).padStart(2, \"0\")}:${String(remainingSeconds).padStart(2, \"0\")}`;\n}\n\nfunction decodePrintableText(data: string) {\n const kittyPrintable = decodeKittyPrintable(data);\n if (kittyPrintable !== undefined) {\n return kittyPrintable;\n }\n\n const hasControlChars = [...data].some((character) => {\n const code = character.charCodeAt(0);\n return code < 32 || code === 0x7f || (code >= 0x80 && code <= 0x9f);\n });\n\n return hasControlChars ? undefined : data;\n}\n\nexport function getVisibleTrackRange(\n selectedIndex: number,\n totalTracks: number,\n maxVisible: number,\n) {\n if (totalTracks <= 0 || maxVisible <= 0) {\n return { end: 0, start: 0 };\n }\n\n const clampedSelectedIndex = Math.max(\n 0,\n Math.min(selectedIndex, totalTracks - 1),\n );\n const start = Math.max(\n 0,\n Math.min(\n clampedSelectedIndex - Math.floor(maxVisible / 2),\n totalTracks - maxVisible,\n ),\n );\n\n return {\n end: Math.min(totalTracks, start + maxVisible),\n start,\n };\n}\n\nexport class PlaylistPlayerScreen implements Component {\n private deleteConfirmationTrackKey: string | null = null;\n\n private pendingGoToTop = false;\n\n private pendingGoToTopTimer: ReturnType<typeof setTimeout> | null = null;\n\n private searchMode = false;\n\n private snapshot: PlaylistPlayerSnapshot;\n\n onQuit?: () => void;\n\n constructor(\n private readonly session: PlaylistPlayerSession,\n private readonly getViewportHeight: () => number,\n ) {\n this.snapshot = session.getSnapshot();\n }\n\n setSnapshot(snapshot: PlaylistPlayerSnapshot) {\n this.snapshot = snapshot;\n }\n\n invalidate() {\n // This screen renders from live snapshot state only.\n }\n\n handleInput(data: string) {\n if (this.deleteConfirmationTrackKey !== null) {\n this.handleDeleteConfirmationInput(data);\n return;\n }\n\n if (this.searchMode) {\n this.handleSearchInput(data);\n return;\n }\n\n if (matchesKey(data, Key.slash)) {\n this.searchMode = true;\n return;\n }\n\n if (matchesKey(data, \"g\")) {\n if (this.pendingGoToTop) {\n this.clearPendingGoToTop();\n this.session.selectHome();\n } else {\n this.armPendingGoToTop();\n }\n return;\n }\n\n this.clearPendingGoToTop();\n\n if (matchesKey(data, Key.ctrl(\"c\")) || matchesKey(data, \"q\")) {\n this.onQuit?.();\n return;\n }\n\n if (matchesKey(data, Key.up) || matchesKey(data, \"k\")) {\n this.session.moveSelection(-1);\n return;\n }\n\n if (matchesKey(data, Key.down) || matchesKey(data, \"j\")) {\n this.session.moveSelection(1);\n return;\n }\n\n if (matchesKey(data, Key.left) || matchesKey(data, \"h\")) {\n void this.session.seekBy(-SEEK_SECONDS);\n return;\n }\n\n if (matchesKey(data, Key.right) || matchesKey(data, \"l\")) {\n void this.session.seekBy(SEEK_SECONDS);\n return;\n }\n\n if (\n matchesKey(data, Key.pageUp)\n || matchesKey(data, Key.ctrl(\"u\"))\n || matchesKey(data, Key.ctrl(\"b\"))\n ) {\n this.session.moveSelectionPage(-1, PAGE_SIZE);\n return;\n }\n\n if (\n matchesKey(data, Key.pageDown)\n || matchesKey(data, Key.ctrl(\"d\"))\n || matchesKey(data, Key.ctrl(\"f\"))\n ) {\n this.session.moveSelectionPage(1, PAGE_SIZE);\n return;\n }\n\n if (matchesKey(data, Key.home) || matchesKey(data, \"0\")) {\n this.session.selectHome();\n return;\n }\n\n if (matchesKey(data, Key.end) || matchesKey(data, Key.shift(\"g\"))) {\n this.session.selectEnd();\n return;\n }\n\n if (matchesKey(data, Key.shift(\"h\"))) {\n this.moveSelectionToVisibleAnchor(\"top\");\n return;\n }\n\n if (matchesKey(data, Key.shift(\"m\"))) {\n this.moveSelectionToVisibleAnchor(\"middle\");\n return;\n }\n\n if (matchesKey(data, Key.shift(\"l\"))) {\n this.moveSelectionToVisibleAnchor(\"bottom\");\n return;\n }\n\n if (matchesKey(data, Key.enter)) {\n void this.session.playSelected();\n return;\n }\n\n if (matchesKey(data, \"d\")) {\n this.armDeleteConfirmation();\n return;\n }\n\n if (matchesKey(data, Key.space)) {\n void this.session.togglePause();\n return;\n }\n\n if (matchesKey(data, \"n\")) {\n void this.session.playNext();\n return;\n }\n\n if (matchesKey(data, \"p\")) {\n void this.session.playPrevious();\n return;\n }\n\n if (matchesKey(data, \"s\")) {\n void this.session.stop();\n return;\n }\n\n if (matchesKey(data, \"r\")) {\n this.session.toggleLoop();\n return;\n }\n\n if (matchesKey(data, \"x\")) {\n this.session.toggleShuffle();\n return;\n }\n\n if (matchesKey(data, \"o\")) {\n void this.session.revealSelectedTrack();\n return;\n }\n\n if (matchesKey(data, Key.backspace)) {\n this.session.deleteSearchCharacter();\n return;\n }\n\n if (matchesKey(data, Key.escape)) {\n this.session.clearSearch();\n return;\n }\n }\n\n render(width: number) {\n const { playlist } = this.snapshot;\n const visibleIndices = this.snapshot.searchQuery\n ? findTrackIndicesByQuery(playlist, this.snapshot.searchQuery)\n : playlist.map((_, index) => index);\n const selectedVisibleIndex = Math.max(\n 0,\n visibleIndices.indexOf(this.snapshot.selectedIndex),\n );\n const viewportHeight = Math.max(this.getViewportHeight(), RESERVED_ROWS);\n const listHeight = this.getListHeight(viewportHeight);\n const { start, end } = getVisibleTrackRange(\n selectedVisibleIndex,\n visibleIndices.length,\n listHeight,\n );\n\n const position = formatSeconds(this.snapshot.timePositionSeconds);\n const duration = formatSeconds(this.snapshot.durationSeconds);\n const glyph = STATUS_GLYPH[this.snapshot.status] ?? \"·\";\n const isIdle = this.snapshot.currentTrack === null;\n const nowPlaying = `${glyph} ${\n this.snapshot.currentTrack?.title ?? \"nothing playing\"\n }`;\n const barWidth = Math.max(\n 4,\n width - position.length - duration.length - 2,\n );\n\n const lines: string[] = [\n truncateToWidth(\n isIdle ? style(nowPlaying, DIM) : style(nowPlaying, BOLD + CYAN),\n width,\n ),\n truncateToWidth(\n `${style(position, DIM)} ${progressBar(\n this.snapshot.timePositionSeconds,\n this.snapshot.durationSeconds,\n barWidth,\n )} ${style(duration, DIM)}`,\n width,\n ),\n ];\n\n if (this.snapshot.errorMessage) {\n lines.push(\n truncateToWidth(style(`✗ ${this.snapshot.errorMessage}`, RED), width),\n );\n } else if (this.deleteConfirmationTrackKey !== null) {\n lines.push(\n truncateToWidth(\n style(\"delete this beatmap set? enter/d/y confirm · any key cancel\", RED),\n width,\n ),\n );\n } else if (this.searchMode || this.snapshot.searchQuery) {\n lines.push(\n truncateToWidth(\n style(\n `/ ${this.snapshot.searchQuery}${this.searchMode ? \"▏\" : \"\"}`,\n CYAN,\n ),\n width,\n ),\n );\n } else {\n lines.push(\n truncateToWidth(\n style(\n `${this.snapshot.selectedIndex + 1}/${Math.max(\n playlist.length,\n 1,\n )} · loop ${this.snapshot.loop ? \"on\" : \"off\"} · shuffle ${\n this.snapshot.shuffle ? \"on\" : \"off\"\n } · ${\n this.snapshot.backendName\n }`,\n DIM,\n ),\n width,\n ),\n );\n }\n\n if (playlist.length === 0) {\n lines.push(\n truncateToWidth(\"No tracks were found in your osu!lazer library.\", width),\n );\n } else if (visibleIndices.length === 0) {\n lines.push(truncateToWidth(\"No tracks match the current search.\", width));\n } else {\n for (let visibleIndex = start; visibleIndex < end; visibleIndex += 1) {\n const index = visibleIndices[visibleIndex];\n if (index === undefined) {\n continue;\n }\n const track = playlist[index];\n if (!track) {\n continue;\n }\n\n const isCurrent = index === this.snapshot.currentIndex;\n const isSelected = index === this.snapshot.selectedIndex;\n const marker = isCurrent ? \"▶\" : \" \";\n const line = ` ${marker} ${padIndex(index, playlist.length)} ${track.title}`;\n lines.push(\n truncateToWidth(\n isSelected\n ? style(line, INVERSE)\n : isCurrent\n ? style(line, CYAN)\n : line,\n width,\n ),\n );\n }\n }\n\n while (lines.length < viewportHeight - 1) {\n lines.push(\"\");\n }\n\n lines.push(\n truncateToWidth(\n style(\n this.searchMode\n ? \"type to filter · ↑/↓ results · enter play · ctrl-w word · esc leave\"\n : \"j/k move · ⏎ play · space pause · n/p track · h/l seek · x shuffle · r loop · o reveal · d delete · / search · q quit\",\n DIM,\n ),\n width,\n ),\n );\n\n return lines;\n }\n\n private armPendingGoToTop() {\n this.pendingGoToTop = true;\n this.pendingGoToTopTimer = setTimeout(() => {\n this.pendingGoToTop = false;\n this.pendingGoToTopTimer = null;\n }, PENDING_G_TIMEOUT_MS);\n }\n\n private clearPendingGoToTop() {\n if (this.pendingGoToTopTimer) {\n clearTimeout(this.pendingGoToTopTimer);\n this.pendingGoToTopTimer = null;\n }\n\n this.pendingGoToTop = false;\n }\n\n private armDeleteConfirmation() {\n const selectedTrack = this.snapshot.playlist[this.snapshot.selectedIndex];\n if (!selectedTrack) {\n return;\n }\n\n this.deleteConfirmationTrackKey = selectedTrack.beatmapSetKey;\n }\n\n private clearDeleteConfirmation() {\n this.deleteConfirmationTrackKey = null;\n }\n\n private handleDeleteConfirmationInput(data: string) {\n if (\n matchesKey(data, Key.enter)\n || matchesKey(data, \"d\")\n || matchesKey(data, \"y\")\n ) {\n this.clearDeleteConfirmation();\n void this.session.deleteSelectedTrack();\n return;\n }\n\n this.clearDeleteConfirmation();\n }\n\n private handleSearchInput(data: string) {\n if (matchesKey(data, Key.ctrl(\"c\"))) {\n this.onQuit?.();\n return;\n }\n\n if (matchesKey(data, Key.enter)) {\n this.searchMode = false;\n void this.session.playSelected();\n return;\n }\n\n if (matchesKey(data, Key.escape)) {\n this.searchMode = false;\n return;\n }\n\n if (matchesKey(data, Key.backspace)) {\n this.session.deleteSearchCharacter();\n return;\n }\n\n if (matchesKey(data, Key.ctrl(\"w\"))) {\n this.session.deleteSearchWord();\n return;\n }\n\n if (matchesKey(data, Key.ctrl(\"u\"))) {\n this.session.clearSearch();\n return;\n }\n\n if (matchesKey(data, Key.up) || matchesKey(data, Key.ctrl(\"p\"))) {\n this.session.moveSearchSelection(-1);\n return;\n }\n\n if (matchesKey(data, Key.down) || matchesKey(data, Key.ctrl(\"n\"))) {\n this.session.moveSearchSelection(1);\n return;\n }\n\n const printable = decodePrintableText(data);\n if (!printable) {\n return;\n }\n\n this.session.appendSearchQuery(printable);\n }\n\n private getListHeight(viewportHeight: number) {\n return Math.max(MIN_LIST_ROWS, viewportHeight - RESERVED_ROWS);\n }\n\n private moveSelectionToVisibleAnchor(\n anchor: \"bottom\" | \"middle\" | \"top\",\n ) {\n if (this.snapshot.playlist.length === 0) {\n return;\n }\n\n const { start, end } = getVisibleTrackRange(\n this.snapshot.selectedIndex,\n this.snapshot.playlist.length,\n this.getListHeight(Math.max(this.getViewportHeight(), RESERVED_ROWS)),\n );\n const lastVisibleIndex = Math.max(start, end - 1);\n\n switch (anchor) {\n case \"top\":\n this.session.setSelectionIndex(start);\n return;\n case \"middle\":\n this.session.setSelectionIndex(\n start + Math.floor((lastVisibleIndex - start) / 2),\n );\n return;\n case \"bottom\":\n this.session.setSelectionIndex(lastVisibleIndex);\n }\n }\n}\n",
|
|
20
23
|
"#!/usr/bin/env node\nimport { main } from \"./core/cli/main.js\";\n\nmain()\n .then(() => {\n process.exit(0);\n })\n .catch((error: unknown) => {\n console.error(\"Error:\", error);\n process.exit(1);\n });\n"
|
|
21
24
|
],
|
|
22
|
-
"mappings": "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",
|
|
23
|
-
"debugId": "
|
|
25
|
+
"mappings": "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",
|
|
26
|
+
"debugId": "B22693114D23F24364756E2164756E21",
|
|
24
27
|
"names": []
|
|
25
28
|
}
|