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.
- package/bin/fluncle.mjs +13 -120
- 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.
|
|
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("
|
|
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", "
|
|
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.
|
|
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 (
|
|
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,
|
|
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,
|
|
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
|
|
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