@gentbajko/slopify 3.7.1 → 3.7.2

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.
@@ -19,7 +19,7 @@ import { channelPerformance } from "../../slices/studio/performance.js";
19
19
  import { writeUploadPick } from "../../slices/studio/pick.js";
20
20
  import { postingPlanSchema, readPlan, writePlan } from "../../slices/studio/plan.js";
21
21
  import { leadHoursMax, seriesOf } from "../../slices/studio/plan-model.js";
22
- import { enqueueFill, fillNow, readFillQueue, removeFill, } from "../../slices/studio/queue.js";
22
+ import { enqueueFill, fillOnly, readFillQueue, removeFill, } from "../../slices/studio/queue.js";
23
23
  import { allReleases, freeSlots, planReleases, readLeadHours, releasesOf, setRelease, swapReleases, writeLeadHours, } from "../../slices/studio/releases.js";
24
24
  import { parseStudioExport, readReport, saveReport } from "../../slices/studio/report.js";
25
25
  import { autoCommentKey, bearerToken, isExtensionOrigin, pairStudioExtension, readChannelPlaylists, readStudioPlaylists, resetStudioPairing, saveProjectPlaylists, saveRealFootage, saveStudioPlaylists, studioPairing, studioPlaylistsMax, studioPlaylistsProblem, studioRequestAllowed, } from "../../slices/studio/settings.js";
@@ -639,7 +639,7 @@ export function studioRoutes(deps) {
639
639
  });
640
640
  return c.json({ projects });
641
641
  })
642
- // The popup's click: that upload goes first in line, and the extension opens Studio's
642
+ // The popup's click: only that upload waits, and the extension opens Studio's
643
643
  // upload page, where the dialog takes it.
644
644
  .post("/ext/upload", zValidator("json", queueItemBody, onInvalid), (c) => {
645
645
  allowOrigin(c, false);
@@ -654,7 +654,7 @@ export function studioRoutes(deps) {
654
654
  detail: "That upload isn't in the project any more. Open the popup again.",
655
655
  });
656
656
  planned(projectId);
657
- fillNow(deps.db, projectId, short ?? null, deps.clock.now());
657
+ fillOnly(deps.db, [{ projectId, short: short ?? null }], deps.clock.now());
658
658
  return c.json({ url: studioUploadUrl });
659
659
  })
660
660
  // The popup's Upload all Shorts: each short not on YouTube yet waits, in order, and the
@@ -671,9 +671,7 @@ export function studioRoutes(deps) {
671
671
  const shorts = result.pack.items.filter((item) => item.kind === "short" &&
672
672
  item.video !== null &&
673
673
  videoOf(deps.db, projectId, item.short ?? null)?.uploadState !== "done");
674
- // fillNow puts each first, so the last short goes in first and short 1 ends up first.
675
- for (const item of shorts.toReversed())
676
- fillNow(deps.db, projectId, item.short ?? null, deps.clock.now());
674
+ fillOnly(deps.db, shorts.map((item) => ({ projectId, short: item.short ?? null })), deps.clock.now());
677
675
  return c.json({ url: studioUploadUrl, count: shorts.length });
678
676
  })
679
677
  // One project's upload pack, for a Studio page opened for one of its uploads.
@@ -0,0 +1,11 @@
1
+ # Slopify 3.7.2
2
+
3
+ Released 4 October 2026.
4
+
5
+ ## YouTube Studio extension
6
+
7
+ - **Upload one uploads one.** The extension's Upload now leaves only that video waiting, and Upload all Shorts only that project's shorts. Before, anything left waiting from an earlier click stayed in line, and the next upload dialogs took it. Together with extension 1.1.3 (one video per upload dialog), shorts go up strictly one at a time. If you're still on 1.1.2, download the extension again from Settings → YouTube Studio and reload it.
8
+
9
+ ## Layout
10
+
11
+ - **The sidebar always reaches the bottom of the window.** In a short or zoomed window scrolled to the end, the sidebar could stop partway down and leave an empty band.
@@ -1,4 +1,10 @@
1
1
  [
2
+ {
3
+ "id": "3.7.2",
4
+ "title": "Slopify 3.7.2",
5
+ "version": "3.7.2",
6
+ "date": "2026-10-04"
7
+ },
2
8
  {
3
9
  "id": "3.7.1",
4
10
  "title": "Slopify 3.7.1",
@@ -67,10 +67,12 @@ export function removeFill(db, projectId, short, now) {
67
67
  write(db, queueKey(db), next);
68
68
  return next;
69
69
  }
70
- // The extension popup's pick: this item goes first, so the upload dialog it opens gets it.
71
- export function fillNow(db, projectId, short, now) {
72
- const others = readFillQueue(db, now).filter((entry) => !same(entry, projectId, short));
73
- const next = [{ projectId, short, at: now.toISOString() }, ...others].slice(0, fillQueueMax);
70
+ // The popup's Upload or Upload all: only these wait, in this order, and anything left from an
71
+ // earlier pick is dropped, so Studio's upload dialogs never take more than was asked for.
72
+ export function fillOnly(db, items, now) {
73
+ const next = items
74
+ .slice(0, fillQueueMax)
75
+ .map((item) => ({ projectId: item.projectId, short: item.short, at: now.toISOString() }));
74
76
  write(db, queueKey(db), next);
75
77
  return next;
76
78
  }