fluncle 0.268.0 → 0.270.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.
Files changed (2) hide show
  1. package/bin/fluncle.mjs +16 -13
  2. package/package.json +1 -1
package/bin/fluncle.mjs CHANGED
@@ -651,7 +651,7 @@ function parseVersion(version) {
651
651
  var currentVersion;
652
652
  var init_version = __esm(() => {
653
653
  init_output();
654
- currentVersion = "0.268.0".trim() ? "0.268.0".trim() : "0.1.0";
654
+ currentVersion = "0.270.0".trim() ? "0.270.0".trim() : "0.1.0";
655
655
  });
656
656
 
657
657
  // src/update-notifier.ts
@@ -2013,13 +2013,13 @@ var init_subscribe = __esm(() => {
2013
2013
 
2014
2014
  // src/commands/submit.ts
2015
2015
  async function submitCommand(input) {
2016
- const query = input?.trim() || await promptLine("Search or Spotify URL: ", PROMPT_NON_INTERACTIVE_MESSAGE2);
2016
+ const query = input?.trim() || await promptLine("Track or Spotify link: ", PROMPT_NON_INTERACTIVE_MESSAGE2);
2017
2017
  if (!query) {
2018
2018
  throw new CliError2("missing_query", "Missing search input");
2019
2019
  }
2020
2020
  const response = await publicApiGet(`/api/v1/search?q=${encodeURIComponent(query)}`);
2021
2021
  if (response.results.length === 0) {
2022
- throw new CliError2("no_results", "No Spotify tracks found.");
2022
+ throw new CliError2("no_results", "Nothing came back for that search. Try the artist and the title.");
2023
2023
  }
2024
2024
  const selected = await selectCandidate(response.results);
2025
2025
  if (!selected) {
@@ -2035,8 +2035,7 @@ async function submitCommand(input) {
2035
2035
  honeypot: "",
2036
2036
  note,
2037
2037
  source: "cli",
2038
- spotifyTrackId: selected.id,
2039
- spotifyUrl: selected.spotifyUrl,
2038
+ ...selected.provider === "deezer" ? { deezerTrackId: selected.id } : selected.provider === "catalogue" ? { catalogueTrackId: selected.id } : { spotifyTrackId: selected.id, spotifyUrl: selected.spotifyUrl },
2040
2039
  title: selected.title
2041
2040
  });
2042
2041
  console.log("Logged. I'll give it a listen.");
@@ -2364,7 +2363,7 @@ function parseVersion2(version) {
2364
2363
  var currentVersion2, latestReleaseUrl = "https://api.github.com/repos/mauricekleine/fluncle/releases/latest";
2365
2364
  var init_version2 = __esm(() => {
2366
2365
  init_output();
2367
- currentVersion2 = "0.268.0".trim() ? "0.268.0".trim() : "0.1.0";
2366
+ currentVersion2 = "0.270.0".trim() ? "0.270.0".trim() : "0.1.0";
2368
2367
  });
2369
2368
 
2370
2369
  // ../../packages/registry/src/index.ts
@@ -3218,7 +3217,7 @@ var init_src = __esm(() => {
3218
3217
  apiFormat: "application/json",
3219
3218
  discoveryUrl: `${SITE}/.well-known/mcp/server-card.json`,
3220
3219
  exposedContent: [
3221
- "the archive as MCP tools (Streamable HTTP, no auth): list_findings, list_tracks, list_fresh, get_track, get_random_track, get_status, search_archive, get_artist, get_label, build_set, list_similar_artists, list_album_catalogue, list_artist_catalogue, list_label_catalogue, list_artists, list_albums, list_labels, submit_track, subscribe_newsletter, plus the MCP-only search_tracks (Spotify candidate search, not an archive read)",
3220
+ "the archive as MCP tools (Streamable HTTP, no auth): list_findings, list_tracks, list_fresh, get_track, get_random_track, get_status, search_archive, get_artist, get_label, build_set, list_similar_artists, list_album_catalogue, list_artist_catalogue, list_label_catalogue, list_artists, list_albums, list_labels, submit_track, subscribe_newsletter, plus the MCP-only search_tracks (track search for submissions, not an archive read)",
3222
3221
  "the archive as MCP resources: each finding/mixtape at fluncle://finding/<logId> or fluncle://mixtape/<logId> (its public record)",
3223
3222
  "Fluncle-voiced MCP prompts: recommend_finding, walk_recent_night, decode_coordinate"
3224
3223
  ],
@@ -11694,7 +11693,7 @@ var init_admin_artists = __esm(() => {
11694
11693
  method: "POST",
11695
11694
  operationId: "backfillArtistImages",
11696
11695
  path: "/admin/backfill/artist-images",
11697
- summary: "Back-fill artist Spotify avatars (image_url) for existing artists (bounded)",
11696
+ summary: "Back-fill artist avatars (image_url) for existing artists (bounded)",
11698
11697
  tags: ["Admin"]
11699
11698
  }).input(object({
11700
11699
  query: object({
@@ -13435,7 +13434,9 @@ var init__shared = __esm(() => {
13435
13434
  artists: array(string2()),
13436
13435
  artworkUrl: string2().optional(),
13437
13436
  durationMs: number2().optional(),
13437
+ externalUrl: string2().optional(),
13438
13438
  id: string2(),
13439
+ provider: _enum(["catalogue", "deezer", "spotify"]).optional(),
13439
13440
  spotifyArtistIds: array(string2()).optional(),
13440
13441
  spotifyUrl: string2(),
13441
13442
  title: string2()
@@ -17479,7 +17480,7 @@ var init_search2 = __esm(() => {
17479
17480
  method: "GET",
17480
17481
  operationId: "searchTracks",
17481
17482
  path: "/search",
17482
- summary: "Search Spotify for finding candidates",
17483
+ summary: "Search for track candidates to submit",
17483
17484
  tags: ["Search"]
17484
17485
  }).input(object({ q: string2().max(512).optional() })).output(object({ ok: literal(true), results: array(TrackSearchResultSchema) }));
17485
17486
  SearchFiltersSchema = object({
@@ -17579,7 +17580,9 @@ var init_submissions = __esm(() => {
17579
17580
  album: unknown().optional(),
17580
17581
  artists: unknown().optional(),
17581
17582
  artworkUrl: unknown().optional(),
17583
+ catalogueTrackId: unknown().optional(),
17582
17584
  contact: unknown().optional(),
17585
+ deezerTrackId: unknown().optional(),
17583
17586
  honeypot: unknown().optional(),
17584
17587
  note: unknown().optional(),
17585
17588
  source: unknown().optional(),
@@ -25079,7 +25082,7 @@ JSON field reference:
25079
25082
  await Promise.resolve().then(() => init_admin_artists2());
25080
25083
  await runBackfillArtists(options, backfillArtistsCommand);
25081
25084
  });
25082
- backfill.command("artist-images").description("Back-fill artist Spotify avatars (image_url) for existing artists").option("--dry-run", "Report which artists would be filled without touching the DB", false).option("--limit <limit>", "Max artists to process", "50").option("--json", "Print JSON", false).action(async (options) => {
25085
+ backfill.command("artist-images").description("Back-fill artist avatars (image_url) for existing artists").option("--dry-run", "Report which artists would be filled without touching the DB", false).option("--limit <limit>", "Max artists to check", "20").option("--json", "Print JSON", false).action(async (options) => {
25083
25086
  await Promise.resolve().then(() => init_admin_artists2());
25084
25087
  await runBackfillArtistImages(options, backfillArtistImagesCommand);
25085
25088
  });
@@ -26171,8 +26174,8 @@ async function runBackfillArtistImages(options, backfillArtistImagesCommand) {
26171
26174
  let dryRun = options.dryRun;
26172
26175
  let queueDepth = 0;
26173
26176
  let rateLimited = false;
26174
- while (filled.length < limit) {
26175
- const remaining = limit - filled.length;
26177
+ while (checkedCount < limit) {
26178
+ const remaining = limit - checkedCount;
26176
26179
  const result = await backfillArtistImagesCommand(remaining, options.dryRun, cursor);
26177
26180
  budgetLimited ||= result.budgetLimited;
26178
26181
  checkedCount += result.checkedCount;
@@ -26207,7 +26210,7 @@ async function runBackfillArtistImages(options, backfillArtistImagesCommand) {
26207
26210
  return;
26208
26211
  }
26209
26212
  const verb = dryRun ? "Would fill" : "Filled";
26210
- console.log(`${verb} ${filled.length} artist avatar(s); checked ${checkedCount}; ${failed.length} failed; ${skipped.length} without a Spotify image; ${queueDepth} queued.`);
26213
+ console.log(`${verb} ${filled.length} artist avatar(s); checked ${checkedCount}; ${failed.length} failed; ${skipped.length} without an image; ${queueDepth} queued.`);
26211
26214
  for (const artistId of filled) {
26212
26215
  console.log(` ${artistId}`);
26213
26216
  }
package/package.json CHANGED
@@ -31,5 +31,5 @@
31
31
  "url": "git+https://github.com/mauricekleine/fluncle.git"
32
32
  },
33
33
  "type": "module",
34
- "version": "0.268.0"
34
+ "version": "0.270.0"
35
35
  }