fluncle 0.269.0 → 0.271.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 +13 -120
  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.269.0".trim() ? "0.269.0".trim() : "0.1.0";
654
+ currentVersion = "0.271.0".trim() ? "0.271.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.269.0".trim() ? "0.269.0".trim() : "0.1.0";
2366
+ currentVersion2 = "0.271.0".trim() ? "0.271.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
  ],
@@ -3482,23 +3481,6 @@ var init_src = __esm(() => {
3482
3481
  title: "Track crawler",
3483
3482
  weights: { status: "hidden" }
3484
3483
  },
3485
- {
3486
- exposedContent: [
3487
- "tap day-one fresh releases for the operator's enabled seed labels → uncertified catalogue rows"
3488
- ],
3489
- kind: "cron",
3490
- name: "cron.label-releases",
3491
- operatorNotes: "every 15 minutes from 03:00 through 08:45 UTC, run by a Hermes host systemd timer (docs/agents/hermes/label-releases-timer/). The FRESHNESS TAP (D8): MusicBrainz WALKS the graph (cron.crawl) but lags a release ~2 weeks; Spotify has it day one, so this mints METADATA-ONLY catalogue rows (a `tracks` row with no `findings` row) for each ENABLED seed label's fresh releases with their real dates — closing the /fresh lag cliff. The WORKER does all of it (`backfill_label_releases`, agent tier): it searches the official Spotify API (`label:\"<name>\" tag:new`), reads each hit as a SINGLE `GET /albums/{id}` then `GET /tracks/{id}` (the batch endpoints are 403 at our tier), and mints. The box sweep is a thin HTTP TRIGGER that POSTs bounded passes with the agent token — no vendor token, no CLI dependency (a pinned box CLI missing a flag broke an earlier run). The gate, both required: artist-grounding (an album's Spotify artist already in `artists.spotify_artist_id` — the PRIMARY anchor that stops cross-genre homonym junk) AND an EXACT fold-match of the seed name in the ℗/© copyright; an album with no release_date is dropped outright (/fresh could never show it). BUDGET: the tap shares the official app's per-app window with the user-facing paths, so it paces itself against the shared call meter and stops at a FRACTION of the window (its own ceiling) — user write paths get the window, the tap takes only slack. Hitting that ceiling ends the pass cleanly and the durable per-label cadence stamps resume it next tick. It certifies nothing, publishes nothing, never widens the graph (no new labels, no artist hops). Deduped against the MB crawl from both directions (Spotify id/uri/ISRC + same-album title fold). No vendor spend and zero LLM tokens. Source: docs/agents/hermes/scripts/label-releases-sweep.*. See docs/catalogue-crawler.md.",
3492
- probeConfig: {
3493
- cadenceMs: 24 * 60 * MINUTE_MS,
3494
- cronName: "fluncle-label-releases",
3495
- kind: "cron",
3496
- schedule: { time: "03:00", tz: "UTC" }
3497
- },
3498
- statusDescription: "taps day-one releases from the enabled labels",
3499
- title: "Freshness tap",
3500
- weights: { status: "hidden" }
3501
- },
3502
3484
  {
3503
3485
  exposedContent: [
3504
3486
  "checks pipeline yield against measured backlog and alerts the operator on sustained stalls"
@@ -10258,7 +10240,7 @@ var init_zod = __esm(() => {
10258
10240
  });
10259
10241
 
10260
10242
  // ../../packages/contracts/src/orpc/admin-catalogue.ts
10261
- var CatalogueLensSchema, CapturePriorityReasonSchema, CatalogueMatchSchema, CatalogueTrackItemSchema, CatalogueSummarySchema, listCatalogueTracks, rankCatalogue, recordDemand, clearWrongAudio, requeueUnmatchedCaptures, requeueAnchor, requeueIsrcRecovery, flagWrongAudio, forceCapture, certifyTrack, setTrackDismissed, CaptureVerifyItemSchema, listUnverifiedCaptures, verifyCapture, CrawlPassSchema, CrawlPhaseInitializationSchema, MAX_CRAWL_PREPARE_LIMIT = 6, CrawlFetchPlanSchema, SuppliedCrawlBodySchema, MAX_CRAWL_COMMIT_BATCH, CRAWL_COMMIT_TOKEN_MAX_BYTES, CRAWL_COMMIT_BATCH_MAX_TOTAL_BYTES, CrawlCommitItemSchema, CrawlCommitReceiptSchema, CrawlPhaseCapabilitiesSchema, CrawlPhaseInputSchema, CrawlPhaseOutputSchema, CrawlStatusSchema, CrawlPipelineSummarySchema, PipelineWatchBoundedCountSchema, getPipeline, crawlCatalogue, commitCrawlNodes, getCrawlStatus, ANCHOR_CANDIDATE_LIMIT = 100, ANCHOR_ARTIST_LIMIT = 20, ANCHOR_TEXT_MAX = 300, ANCHOR_ISRC_MAX = 64, ANCHOR_ID_MAX = 64, ANCHOR_URL_MAX = 2048, AnchorCandidateSchema, anchorTrack, recordAnchorFailure, DEEZER_CANDIDATE_LIMIT = 5, DEEZER_TEXT_MAX = 300, DEEZER_ISRC_MAX = 64, DEEZER_TRACK_ID_MAX = 32, DeezerIsrcCandidateSchema, AnchorResolveResultSchema, AnchorCommitResultSchema, prepareAnchor, AnchorPhaseBatchItemFailureSchema, prepareAnchorBatch, resolveAnchorCandidate, commitAnchor, commitAnchorBatch, getAnchorReceipt, getAnchorPaidToken, cancelAnchorPaidResult, resolveAnchorPaidResult, resolveAnchor, ReleaseLinkResultSchema, ReleaseLinkProbeSchema, resolveAnchorReleaseProbe, commitAnchorRelease, resolveAnchorReview, CrawlHoldReasonSchema, CrawlHoldStateSchema, CrawlHoldSchema, listCrawlHolds, resolveCrawlHold, setAnchorSearch, setAnchorApify, CaptureBudgetStateSchema, getCaptureBudget, setCaptureBudget, AnchorApifyBudgetSchema, getAnchorApifyBudget, setAnchorApifyBudget, SpotifyAnchorBreakerStateSchema, AnchorRungFlagsSchema, getSpotifyAnchorBreaker, setSpotifyConsumerBudget, LabelReleasesBudgetSchema, getLabelReleasesBudget, setLabelReleasesBudget, resetSpotifyAnchorBreaker, AppleBreakerStateSchema, resetAppleBreaker, adminCatalogueContract;
10243
+ var CatalogueLensSchema, CapturePriorityReasonSchema, CatalogueMatchSchema, CatalogueTrackItemSchema, CatalogueSummarySchema, listCatalogueTracks, rankCatalogue, recordDemand, clearWrongAudio, requeueUnmatchedCaptures, requeueAnchor, requeueIsrcRecovery, flagWrongAudio, forceCapture, certifyTrack, setTrackDismissed, CaptureVerifyItemSchema, listUnverifiedCaptures, verifyCapture, CrawlPassSchema, CrawlPhaseInitializationSchema, MAX_CRAWL_PREPARE_LIMIT = 6, CrawlFetchPlanSchema, SuppliedCrawlBodySchema, MAX_CRAWL_COMMIT_BATCH, CRAWL_COMMIT_TOKEN_MAX_BYTES, CRAWL_COMMIT_BATCH_MAX_TOTAL_BYTES, CrawlCommitItemSchema, CrawlCommitReceiptSchema, CrawlPhaseCapabilitiesSchema, CrawlPhaseInputSchema, CrawlPhaseOutputSchema, CrawlStatusSchema, CrawlPipelineSummarySchema, PipelineWatchBoundedCountSchema, getPipeline, crawlCatalogue, commitCrawlNodes, getCrawlStatus, ANCHOR_CANDIDATE_LIMIT = 100, ANCHOR_ARTIST_LIMIT = 20, ANCHOR_TEXT_MAX = 300, ANCHOR_ISRC_MAX = 64, ANCHOR_ID_MAX = 64, ANCHOR_URL_MAX = 2048, AnchorCandidateSchema, anchorTrack, recordAnchorFailure, DEEZER_CANDIDATE_LIMIT = 5, DEEZER_TEXT_MAX = 300, DEEZER_ISRC_MAX = 64, DEEZER_TRACK_ID_MAX = 32, DeezerIsrcCandidateSchema, AnchorResolveResultSchema, AnchorCommitResultSchema, prepareAnchor, AnchorPhaseBatchItemFailureSchema, prepareAnchorBatch, resolveAnchorCandidate, commitAnchor, commitAnchorBatch, getAnchorReceipt, getAnchorPaidToken, cancelAnchorPaidResult, resolveAnchorPaidResult, resolveAnchor, ReleaseLinkResultSchema, ReleaseLinkProbeSchema, resolveAnchorReleaseProbe, commitAnchorRelease, resolveAnchorReview, CrawlHoldReasonSchema, CrawlHoldStateSchema, CrawlHoldSchema, listCrawlHolds, resolveCrawlHold, setAnchorSearch, setAnchorApify, CaptureBudgetStateSchema, getCaptureBudget, setCaptureBudget, AnchorApifyBudgetSchema, getAnchorApifyBudget, setAnchorApifyBudget, SpotifyAnchorBreakerStateSchema, AnchorRungFlagsSchema, getSpotifyAnchorBreaker, setSpotifyConsumerBudget, resetSpotifyAnchorBreaker, AppleBreakerStateSchema, resetAppleBreaker, adminCatalogueContract;
10262
10244
  var init_admin_catalogue = __esm(() => {
10263
10245
  init_dist3();
10264
10246
  init_zod();
@@ -11161,25 +11143,6 @@ var init_admin_catalogue = __esm(() => {
11161
11143
  consumer: _enum(["anchor", "artist_images", "public_search"]),
11162
11144
  dailyBudget: number2().int().min(0).max(1e6)
11163
11145
  })).output(object({ ok: literal(true) }));
11164
- LabelReleasesBudgetSchema = object({
11165
- callsSpent: number2().int().nonnegative(),
11166
- dailyBudget: number2().int().nonnegative(),
11167
- spotifyDailyCalls: number2().int().nonnegative()
11168
- });
11169
- getLabelReleasesBudget = oc.route({
11170
- method: "GET",
11171
- operationId: "getLabelReleasesBudget",
11172
- path: "/admin/catalogue/label-releases-budget",
11173
- summary: "Read the label releases tap daily budget and Spotify usage",
11174
- tags: ["Admin"]
11175
- }).input(object({})).output(LabelReleasesBudgetSchema.extend({ ok: literal(true) }));
11176
- setLabelReleasesBudget = oc.route({
11177
- method: "PUT",
11178
- operationId: "setLabelReleasesBudget",
11179
- path: "/admin/catalogue/label-releases-budget",
11180
- summary: "Set the label releases tap daily budget (operator)",
11181
- tags: ["Admin"]
11182
- }).input(object({ dailyBudget: number2().int().min(0).max(1e6) })).output(LabelReleasesBudgetSchema.extend({ ok: literal(true) }));
11183
11146
  resetSpotifyAnchorBreaker = oc.route({
11184
11147
  method: "POST",
11185
11148
  operationId: "resetSpotifyAnchorBreaker",
@@ -11217,7 +11180,6 @@ var init_admin_catalogue = __esm(() => {
11217
11180
  get_anchor_receipt: getAnchorReceipt,
11218
11181
  get_capture_budget: getCaptureBudget,
11219
11182
  get_crawl_status: getCrawlStatus,
11220
- get_label_releases_budget: getLabelReleasesBudget,
11221
11183
  get_pipeline: getPipeline,
11222
11184
  get_spotify_anchor_breaker: getSpotifyAnchorBreaker,
11223
11185
  list_catalogue_tracks: listCatalogueTracks,
@@ -11243,7 +11205,6 @@ var init_admin_catalogue = __esm(() => {
11243
11205
  set_anchor_apify_budget: setAnchorApifyBudget,
11244
11206
  set_anchor_search: setAnchorSearch,
11245
11207
  set_capture_budget: setCaptureBudget,
11246
- set_label_releases_budget: setLabelReleasesBudget,
11247
11208
  set_spotify_consumer_budget: setSpotifyConsumerBudget,
11248
11209
  set_track_dismissed: setTrackDismissed,
11249
11210
  verify_capture: verifyCapture
@@ -11971,7 +11932,7 @@ var init_admin_attention2 = __esm(() => {
11971
11932
  });
11972
11933
 
11973
11934
  // ../../packages/contracts/src/orpc/admin-backfills.ts
11974
- var DISCOGS_RELEASE_WORK_LIMIT = 3, DISCOGS_SEARCH_QUERY_LIMIT = 3, DISCOGS_RELEASES_PER_TRACK_LIMIT = 12, DISCOGS_FACTS_WORK_LIMIT = 25, DISCOGS_LABEL_WORK_LIMIT = 4, DISCOGS_ID_MAX, DISCOGS_TEXT_MAX = 500, DISCOGS_URI_MAX = 2048, DISCOGS_QUERY_MAX = 2048, DISCOGS_ARTIST_LIMIT = 20, DISCOGS_LABEL_LIMIT = 20, DISCOGS_STYLE_LIMIT = 50, DISCOGS_FORMAT_LIMIT = 20, DISCOGS_TRACKLIST_LIMIT = 500, DISCOGS_LABEL_DETAIL_IMAGE_LIMIT = 20, MAX_LABEL_IMAGE_BYTES = 5000000, MAX_LABEL_IMAGE_BASE64_CHARS, DiscogsIdSchema, DiscogsTextSchema, DiscogsReleaseEvidenceSchema, DiscogsReleaseCandidateSchema, DiscogsReleaseCandidateBatchSchema, DiscogsReleaseWorkSchema, DiscogsFactsWorkSchema, DiscogsFactsCandidateSchema, DiscogsFactsCandidateBatchSchema, DiscogsLabelDetailImageSchema, DiscogsLabelImageBytesSchema, DiscogsLabelCandidateSchema, DiscogsLabelCandidateBatchSchema, DiscogsLabelWorkSchema, DiscogsResolvedSchema, LastfmFailedSchema, AppleMusicResolvedSchema, AppleMusicFailedSchema, backfillDiscogs, DiscogsFactsResolvedSchema, DiscogsFactsFailedSchema, backfillDiscogsFacts, backfillLastfm, backfillAppleMusic, AppleCatalogueResolvedSchema, AppleCatalogueFailedSchema, backfillAppleCatalogue, BeatportResolvedSchema, BeatportFailedSchema, BeatportCatalogueResolvedSchema, BeatportCatalogueFailedSchema, backfillBeatport, DeezerResolvedSchema, DeezerFailedSchema, backfillDeezer, backfillLabelReleases, LabelImagesBackfillFailedSchema, backfillLabelImages, LabelLineageBackfillFailedSchema, backfillLabelLineage, CoverMastersFailedSchema, backfillCoverMasters, RecordingMbidsFailedSchema, backfillRecordingMbids, backfillArtistEdges, backfillArtistCredits, adminBackfillsContract;
11935
+ var DISCOGS_RELEASE_WORK_LIMIT = 3, DISCOGS_SEARCH_QUERY_LIMIT = 3, DISCOGS_RELEASES_PER_TRACK_LIMIT = 12, DISCOGS_FACTS_WORK_LIMIT = 25, DISCOGS_LABEL_WORK_LIMIT = 4, DISCOGS_ID_MAX, DISCOGS_TEXT_MAX = 500, DISCOGS_URI_MAX = 2048, DISCOGS_QUERY_MAX = 2048, DISCOGS_ARTIST_LIMIT = 20, DISCOGS_LABEL_LIMIT = 20, DISCOGS_STYLE_LIMIT = 50, DISCOGS_FORMAT_LIMIT = 20, DISCOGS_TRACKLIST_LIMIT = 500, DISCOGS_LABEL_DETAIL_IMAGE_LIMIT = 20, MAX_LABEL_IMAGE_BYTES = 5000000, MAX_LABEL_IMAGE_BASE64_CHARS, DiscogsIdSchema, DiscogsTextSchema, DiscogsReleaseEvidenceSchema, DiscogsReleaseCandidateSchema, DiscogsReleaseCandidateBatchSchema, DiscogsReleaseWorkSchema, DiscogsFactsWorkSchema, DiscogsFactsCandidateSchema, DiscogsFactsCandidateBatchSchema, DiscogsLabelDetailImageSchema, DiscogsLabelImageBytesSchema, DiscogsLabelCandidateSchema, DiscogsLabelCandidateBatchSchema, DiscogsLabelWorkSchema, DiscogsResolvedSchema, LastfmFailedSchema, AppleMusicResolvedSchema, AppleMusicFailedSchema, backfillDiscogs, DiscogsFactsResolvedSchema, DiscogsFactsFailedSchema, backfillDiscogsFacts, backfillLastfm, backfillAppleMusic, AppleCatalogueResolvedSchema, AppleCatalogueFailedSchema, backfillAppleCatalogue, BeatportResolvedSchema, BeatportFailedSchema, BeatportCatalogueResolvedSchema, BeatportCatalogueFailedSchema, backfillBeatport, DeezerResolvedSchema, DeezerFailedSchema, backfillDeezer, LabelImagesBackfillFailedSchema, backfillLabelImages, LabelLineageBackfillFailedSchema, backfillLabelLineage, CoverMastersFailedSchema, backfillCoverMasters, RecordingMbidsFailedSchema, backfillRecordingMbids, backfillArtistEdges, backfillArtistCredits, adminBackfillsContract;
11975
11936
  var init_admin_backfills = __esm(() => {
11976
11937
  init_dist3();
11977
11938
  init_zod();
@@ -12342,48 +12303,6 @@ var init_admin_backfills = __esm(() => {
12342
12303
  unvouchable: array(string2()),
12343
12304
  unvouchableCount: number2()
12344
12305
  }));
12345
- backfillLabelReleases = oc.route({
12346
- method: "POST",
12347
- operationId: "backfillLabelReleases",
12348
- path: "/admin/backfill/label-releases",
12349
- summary: "Tap Spotify's fresh releases for enabled seed labels into catalogue rows (bounded)",
12350
- tags: ["Admin"]
12351
- }).input(object({
12352
- dryRun: boolean2().default(false),
12353
- limit: number3().int().min(1).max(200).default(5)
12354
- })).output(object({
12355
- albumsMatched: number2(),
12356
- albumsSeen: number2(),
12357
- blockedReason: _enum([
12358
- "spotify_breaker",
12359
- "spotify_budget",
12360
- "spotify_budget_spent",
12361
- "spotify_quota",
12362
- "spotify_throttle"
12363
- ]).nullable(),
12364
- budgetPaused: boolean2(),
12365
- configured: boolean2(),
12366
- dryRun: boolean2(),
12367
- failedFetches: number2(),
12368
- failedLabels: array(string2()),
12369
- fetchCeilingHit: boolean2(),
12370
- labelSlugs: array(string2()),
12371
- labelsDue: number2(),
12372
- labelsProbed: number2(),
12373
- neverChecked: number2(),
12374
- newRows: number2(),
12375
- newTrackIds: array(string2()),
12376
- ok: literal(true),
12377
- quotaExceeded: boolean2(),
12378
- rateLimited: boolean2(),
12379
- retryAfterMs: number2(),
12380
- skippedKnown: number2(),
12381
- skippedUndated: number2(),
12382
- skippedUngrounded: number2(),
12383
- tapDailyBudget: number2().int(),
12384
- tapDailyCallsSpent: number2().int(),
12385
- tracksSkippedArtistRule: number2().optional()
12386
- }));
12387
12306
  LabelImagesBackfillFailedSchema = object({
12388
12307
  error: string2(),
12389
12308
  slug: string2()
@@ -12582,7 +12501,6 @@ var init_admin_backfills = __esm(() => {
12582
12501
  backfill_discogs_facts: backfillDiscogsFacts,
12583
12502
  backfill_label_images: backfillLabelImages,
12584
12503
  backfill_label_lineage: backfillLabelLineage,
12585
- backfill_label_releases: backfillLabelReleases,
12586
12504
  backfill_lastfm: backfillLastfm,
12587
12505
  backfill_recording_mbids: backfillRecordingMbids
12588
12506
  };
@@ -13435,7 +13353,9 @@ var init__shared = __esm(() => {
13435
13353
  artists: array(string2()),
13436
13354
  artworkUrl: string2().optional(),
13437
13355
  durationMs: number2().optional(),
13356
+ externalUrl: string2().optional(),
13438
13357
  id: string2(),
13358
+ provider: _enum(["catalogue", "deezer", "spotify"]).optional(),
13439
13359
  spotifyArtistIds: array(string2()).optional(),
13440
13360
  spotifyUrl: string2(),
13441
13361
  title: string2()
@@ -17479,7 +17399,7 @@ var init_search2 = __esm(() => {
17479
17399
  method: "GET",
17480
17400
  operationId: "searchTracks",
17481
17401
  path: "/search",
17482
- summary: "Search Spotify for finding candidates",
17402
+ summary: "Search for track candidates to submit",
17483
17403
  tags: ["Search"]
17484
17404
  }).input(object({ q: string2().max(512).optional() })).output(object({ ok: literal(true), results: array(TrackSearchResultSchema) }));
17485
17405
  SearchFiltersSchema = object({
@@ -17579,7 +17499,9 @@ var init_submissions = __esm(() => {
17579
17499
  album: unknown().optional(),
17580
17500
  artists: unknown().optional(),
17581
17501
  artworkUrl: unknown().optional(),
17502
+ catalogueTrackId: unknown().optional(),
17582
17503
  contact: unknown().optional(),
17504
+ deezerTrackId: unknown().optional(),
17583
17505
  honeypot: unknown().optional(),
17584
17506
  note: unknown().optional(),
17585
17507
  source: unknown().optional(),
@@ -20051,12 +19973,6 @@ async function setSpotifyConsumerBudgetCommand(consumer, dailyBudget) {
20051
19973
  dailyBudget
20052
19974
  });
20053
19975
  }
20054
- async function labelReleasesBudgetCommand() {
20055
- return adminApiGet("/api/v1/admin/catalogue/label-releases-budget");
20056
- }
20057
- async function setLabelReleasesBudgetCommand(dailyBudget) {
20058
- return adminApiPut("/api/v1/admin/catalogue/label-releases-budget", { dailyBudget });
20059
- }
20060
19976
  async function anchorApifyBudgetCommand() {
20061
19977
  return adminApiGet("/api/v1/admin/catalogue/anchor/apify-budget");
20062
19978
  }
@@ -24819,29 +24735,6 @@ JSON field reference:
24819
24735
  console.log(`Settled ${paidCleared} pending paid receipt(s); recorded spend remains charged.`);
24820
24736
  }
24821
24737
  });
24822
- const labelReleasesBudget = catalogue.command("label-releases-budget").description("Read or set the label releases tap daily Spotify call budget");
24823
- labelReleasesBudget.option("--json", "Print JSON", false).action(async (options) => {
24824
- await Promise.resolve().then(() => init_admin_catalogue2());
24825
- const state = await labelReleasesBudgetCommand();
24826
- if (options.json) {
24827
- printJson({ ...state, ok: true });
24828
- return;
24829
- }
24830
- console.log(`LABEL RELEASES BUDGET \u2014 ${state.callsSpent}/${state.dailyBudget} tap calls today \xB7 ${state.spotifyDailyCalls} Spotify calls total`);
24831
- });
24832
- labelReleasesBudget.command("set").requiredOption("--calls <count>", "Daily tap Spotify call budget").option("--json", "Print JSON", false).action(async (options) => {
24833
- await Promise.resolve().then(() => init_admin_catalogue2());
24834
- const calls = Number(options.calls);
24835
- if (!Number.isSafeInteger(calls) || calls < 0 || calls > 1e6) {
24836
- throw new Error("--calls must be an integer from 0 to 1000000");
24837
- }
24838
- const state = await setLabelReleasesBudgetCommand(calls);
24839
- if (options.json) {
24840
- printJson({ ...state, ok: true });
24841
- return;
24842
- }
24843
- console.log(`LABEL RELEASES BUDGET \u2014 ${state.callsSpent}/${state.dailyBudget} tap calls today \xB7 ${state.spotifyDailyCalls} Spotify calls total`);
24844
- });
24845
24738
  const spotifyBudget = catalogue.command("spotify-consumer-budget").description("Read or set Spotify daily call budgets by consumer");
24846
24739
  const showSpotifyConsumerBudget = async (options) => {
24847
24740
  await Promise.resolve().then(() => init_admin_catalogue2());
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.269.0"
34
+ "version": "0.271.0"
35
35
  }