fluncle 0.105.0 → 0.107.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 +3 -65
- package/package.json +1 -1
package/bin/fluncle.mjs
CHANGED
|
@@ -557,7 +557,7 @@ function parseVersion(version) {
|
|
|
557
557
|
var currentVersion;
|
|
558
558
|
var init_version = __esm(() => {
|
|
559
559
|
init_output();
|
|
560
|
-
currentVersion = "0.
|
|
560
|
+
currentVersion = "0.107.0".trim() ? "0.107.0".trim() : "0.1.0";
|
|
561
561
|
});
|
|
562
562
|
|
|
563
563
|
// src/update-notifier.ts
|
|
@@ -2207,7 +2207,7 @@ function parseVersion2(version) {
|
|
|
2207
2207
|
var currentVersion2, latestReleaseUrl = "https://api.github.com/repos/mauricekleine/fluncle/releases/latest";
|
|
2208
2208
|
var init_version2 = __esm(() => {
|
|
2209
2209
|
init_output();
|
|
2210
|
-
currentVersion2 = "0.
|
|
2210
|
+
currentVersion2 = "0.107.0".trim() ? "0.107.0".trim() : "0.1.0";
|
|
2211
2211
|
});
|
|
2212
2212
|
|
|
2213
2213
|
// ../../packages/registry/src/index.ts
|
|
@@ -2864,17 +2864,6 @@ var init_src = __esm(() => {
|
|
|
2864
2864
|
probeConfig: { cadenceMs: 60 * MINUTE_MS, cronName: "fluncle-artist-sweep", kind: "cron" },
|
|
2865
2865
|
weights: { status: "hidden" }
|
|
2866
2866
|
},
|
|
2867
|
-
{
|
|
2868
|
-
command: "fluncle admin artists follow",
|
|
2869
|
-
exposedContent: [
|
|
2870
|
-
"auto-follow high-confidence artists on Spotify + YouTube — the championing motion (--no-agent, Worker HTTP)"
|
|
2871
|
-
],
|
|
2872
|
-
kind: "cron",
|
|
2873
|
-
name: "cron.artist-follow",
|
|
2874
|
-
operatorNotes: "every 6h. Pure HTTP trigger, zero LLM tokens. Agent tier (the box holds no Spotify/YouTube tokens; the Worker does the PUT /me/following + subscriptions.insert and stamps followed_at). Idempotent by followed_at IS NULL, acting only on status IN (auto, confirmed); quota-paced. Mixcloud is link-only (cut). Source: docs/agents/hermes/scripts/artist-follow-sweep.*. Probed on /status as cron.artist-follow.",
|
|
2875
|
-
probeConfig: { cadenceMs: 6 * 60 * MINUTE_MS, cronName: "fluncle-artist-follow", kind: "cron" },
|
|
2876
|
-
weights: { status: "hidden" }
|
|
2877
|
-
},
|
|
2878
2867
|
{
|
|
2879
2868
|
command: "fluncle admin tracks social --capture",
|
|
2880
2869
|
exposedContent: [
|
|
@@ -5205,7 +5194,6 @@ var exports_admin_artists = {};
|
|
|
5205
5194
|
__export(exports_admin_artists, {
|
|
5206
5195
|
resolveArtistCommand: () => resolveArtistCommand,
|
|
5207
5196
|
listArtistsCommand: () => listArtistsCommand,
|
|
5208
|
-
followArtistsCommand: () => followArtistsCommand,
|
|
5209
5197
|
backfillArtistsCommand: () => backfillArtistsCommand
|
|
5210
5198
|
});
|
|
5211
5199
|
async function listArtistsCommand(limit, cursor) {
|
|
@@ -5225,10 +5213,6 @@ async function backfillArtistsCommand(limit, dryRun, cursor) {
|
|
|
5225
5213
|
}
|
|
5226
5214
|
return adminApiPost(`/api/admin/backfill/artists?${params.toString()}`);
|
|
5227
5215
|
}
|
|
5228
|
-
async function followArtistsCommand(limit, dryRun) {
|
|
5229
|
-
const params = new URLSearchParams({ dryRun: String(dryRun), limit: String(limit) });
|
|
5230
|
-
return adminApiPost(`/api/admin/artists/follow?${params.toString()}`);
|
|
5231
|
-
}
|
|
5232
5216
|
var init_admin_artists = __esm(() => {
|
|
5233
5217
|
init_api();
|
|
5234
5218
|
});
|
|
@@ -8047,14 +8031,10 @@ function addAdminCommands(program2) {
|
|
|
8047
8031
|
const { authLastfmCommand: authLastfmCommand2 } = await Promise.resolve().then(() => (init_auth_lastfm(), exports_auth_lastfm));
|
|
8048
8032
|
await authLastfmCommand2(options);
|
|
8049
8033
|
});
|
|
8050
|
-
const artists = configureCommand(admin.command("artists").description("Artist entity +
|
|
8034
|
+
const artists = configureCommand(admin.command("artists").description("Artist entity + resolution commands"));
|
|
8051
8035
|
artists.action(() => {
|
|
8052
8036
|
artists.outputHelp();
|
|
8053
8037
|
});
|
|
8054
|
-
artists.command("follow").description("Auto-follow high-confidence artists on YouTube (drains the queue)").option("--dry-run", "Report who WOULD be followed without calling the platform", false).option("--limit <limit>", "Max artists to follow this run", "20").option("--json", "Print JSON", false).action(async (options) => {
|
|
8055
|
-
const { followArtistsCommand: followArtistsCommand2 } = await Promise.resolve().then(() => (init_admin_artists(), exports_admin_artists));
|
|
8056
|
-
await runFollowArtists(options, followArtistsCommand2);
|
|
8057
|
-
});
|
|
8058
8038
|
const backfill = configureCommand(admin.command("backfills").description("Backfill operator-only archives"));
|
|
8059
8039
|
backfill.action(() => {
|
|
8060
8040
|
backfill.outputHelp();
|
|
@@ -8381,48 +8361,6 @@ async function runArtistResolve(artistId, options, resolveArtistCommand2) {
|
|
|
8381
8361
|
console.log(` wikidata: ${result.wikidataQid}`);
|
|
8382
8362
|
}
|
|
8383
8363
|
}
|
|
8384
|
-
async function runFollowArtists(options, followArtistsCommand2) {
|
|
8385
|
-
const limit = parseListLimit(options.limit);
|
|
8386
|
-
const followed = [];
|
|
8387
|
-
const failed = [];
|
|
8388
|
-
let dryRun = options.dryRun;
|
|
8389
|
-
let remaining = 0;
|
|
8390
|
-
while (followed.length + failed.length < limit) {
|
|
8391
|
-
const batchLimit = Math.min(50, limit - (followed.length + failed.length));
|
|
8392
|
-
const result = await followArtistsCommand2(batchLimit, options.dryRun);
|
|
8393
|
-
dryRun = result.dryRun;
|
|
8394
|
-
remaining = result.remaining;
|
|
8395
|
-
followed.push(...result.followed);
|
|
8396
|
-
failed.push(...result.failed);
|
|
8397
|
-
if (!options.json) {
|
|
8398
|
-
const verb2 = result.dryRun ? "would follow" : "followed";
|
|
8399
|
-
console.log(` \u2026${verb2} ${result.followedCount}; ${result.failedCount} failed; ${result.remaining} remaining`);
|
|
8400
|
-
}
|
|
8401
|
-
if (remaining === 0 || result.dryRun || result.followedCount === 0) {
|
|
8402
|
-
break;
|
|
8403
|
-
}
|
|
8404
|
-
}
|
|
8405
|
-
if (options.json) {
|
|
8406
|
-
printJson({
|
|
8407
|
-
dryRun,
|
|
8408
|
-
failed,
|
|
8409
|
-
failedCount: failed.length,
|
|
8410
|
-
followed,
|
|
8411
|
-
followedCount: followed.length,
|
|
8412
|
-
ok: true,
|
|
8413
|
-
remaining
|
|
8414
|
-
});
|
|
8415
|
-
return;
|
|
8416
|
-
}
|
|
8417
|
-
const verb = dryRun ? "Would follow" : "Followed";
|
|
8418
|
-
console.log(`${verb} ${followed.length} artist(s); ${failed.length} failed; ${remaining} remaining.`);
|
|
8419
|
-
for (const item of followed) {
|
|
8420
|
-
console.log(` ${item.platform}: ${item.artistName}`);
|
|
8421
|
-
}
|
|
8422
|
-
for (const item of failed) {
|
|
8423
|
-
console.log(` ${item.platform} ${item.socialId}: ${item.error}`);
|
|
8424
|
-
}
|
|
8425
|
-
}
|
|
8426
8364
|
async function runTrackVideo(idOrLogId, options, trackVideoCommand2) {
|
|
8427
8365
|
if (!idOrLogId) {
|
|
8428
8366
|
throw new Error("Missing id. Usage: fluncle admin tracks video <track_id|log_id> (--dir <dir> | --footage <file> [--footage-social <file>] [--footage-notext <file>] [--footage-landscape <file>] [--footage-landscape-social <file>] [--poster <file>] [--cover <file>] [--note <file>] [--composition <file>] [--props <file>] [--render <file>] [--intent <file>] [--metrics <file>] [--scene <file>] | --plate <file> [--plate-background <file>]) [--allow-partial]");
|
package/package.json
CHANGED