@gentbajko/slopify 3.8.0 → 3.8.1
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/dist/extension/slopify-studio-chrome.zip +0 -0
- package/dist/extension/slopify-studio-firefox.zip +0 -0
- package/dist/patch-notes/3.8.1.md +7 -0
- package/dist/patch-notes/index.json +6 -0
- package/dist/slices/studio/plan-model.js +4 -3
- package/dist/slices/studio/plan.js +14 -2
- package/dist/slices/studio/releases.js +3 -2
- package/dist/web/assets/{index-Cc16nRHK.js → index-DzehNHWU.js} +4 -4
- package/dist/web/assets/{pdf-DK_RqCdk.js → pdf-BPNXDDg1.js} +1 -1
- package/dist/web/index.html +1 -1
- package/package.json +1 -1
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
# Slopify 3.8.1
|
|
2
|
+
|
|
3
|
+
Released 4 October 2026.
|
|
4
|
+
|
|
5
|
+
- **A schedule's release times also take its series' other projects.** A project queued by hand from the schedule's topics (or any project whose title ends with the same series as the schedule's template, the part after "|") takes the schedule's release times too, not only the projects the schedule ran itself.
|
|
6
|
+
- **Deleted on YouTube.** Each upload in the project's On YouTube list has a Deleted on YouTube button: press it after deleting the video in Studio, and Slopify forgets it, so the extension offers the upload again.
|
|
7
|
+
- **No upload deadline to watch.** The release calendar marks each time "goes public", and a video that is ready says "Ready to upload": upload and schedule it whenever you like. Only a video still not uploaded in the last day before it goes public is flagged, "Late · upload now", since YouTube's checks may not finish in time.
|
|
@@ -12,9 +12,10 @@ const rowSchema = z.object({
|
|
|
12
12
|
series: z.string().trim().max(100).default(""),
|
|
13
13
|
long: slotSchema,
|
|
14
14
|
shorts: z.array(slotSchema).max(10),
|
|
15
|
-
// A line from a schedule's release times (never stored here): it takes
|
|
16
|
-
// projects
|
|
17
|
-
// the calendar shows the schedule's name
|
|
15
|
+
// A line from a schedule's release times (never stored here): it takes that schedule's
|
|
16
|
+
// projects and any other of its template's series (`series`), preferring the ones its run day
|
|
17
|
+
// (`runDay`) made, in the schedule's time zone; the calendar shows the schedule's name
|
|
18
|
+
// (`label`).
|
|
18
19
|
schedule: z.string().optional(),
|
|
19
20
|
runDay: z.number().int().min(0).max(6).optional(),
|
|
20
21
|
timeZone: z.string().optional(),
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { templateById } from "../project-templates/repo.js";
|
|
1
2
|
import { scheduleRows } from "../schedules/repo.js";
|
|
2
3
|
import { readSetting, writeSetting } from "../settings/repo.js";
|
|
3
4
|
// The posting plan: a week of long-video slots, each with its shorts. Each schedule sets its
|
|
@@ -7,7 +8,7 @@ import { readSetting, writeSetting } from "../settings/repo.js";
|
|
|
7
8
|
// after its own long video, so a plan never needs "next week" notes. The extension types the
|
|
8
9
|
// times into Studio's schedule, in the browser's own time zone.
|
|
9
10
|
export { postingPlanSchema, weekdays, } from "./plan-model.js";
|
|
10
|
-
import { postingPlanSchema } from "./plan-model.js";
|
|
11
|
+
import { postingPlanSchema, seriesOf } from "./plan-model.js";
|
|
11
12
|
export const postingPlanKey = "studio.postingPlan";
|
|
12
13
|
const key = postingPlanKey;
|
|
13
14
|
// No plan until one is made: nothing is scheduled, and Prepare upload says so.
|
|
@@ -34,6 +35,17 @@ export function readStoredPlan(db) {
|
|
|
34
35
|
}
|
|
35
36
|
return emptyPlan(localTimeZone());
|
|
36
37
|
}
|
|
38
|
+
// The series of a schedule's template, from its project title ("{{Topic}} | Stories" →
|
|
39
|
+
// "Stories"); "" when the template is gone or its title names none.
|
|
40
|
+
function templateSeries(db, templateId) {
|
|
41
|
+
try {
|
|
42
|
+
const title = templateById(db, templateId)?.document.form.title;
|
|
43
|
+
return title === undefined ? "" : seriesOf({ title });
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
return "";
|
|
47
|
+
}
|
|
48
|
+
}
|
|
37
49
|
// The lines every release is planned from: each schedule's release times (one line for each
|
|
38
50
|
// day it runs), then the stored lines.
|
|
39
51
|
export function readPlan(db) {
|
|
@@ -42,7 +54,7 @@ export function readPlan(db) {
|
|
|
42
54
|
.filter((schedule) => schedule.deletedAt === null && schedule.status !== "canceled")
|
|
43
55
|
.flatMap((schedule) => schedule.releases.map((release) => ({
|
|
44
56
|
name: `s${schedule.id.slice(0, 8)}${String(release.day)}`,
|
|
45
|
-
series:
|
|
57
|
+
series: templateSeries(db, schedule.templateId),
|
|
46
58
|
long: release.long,
|
|
47
59
|
shorts: [...release.shorts],
|
|
48
60
|
schedule: schedule.id,
|
|
@@ -47,9 +47,10 @@ function takenHours(db, exceptProject) {
|
|
|
47
47
|
.filter((release) => release.projectId !== exceptProject)
|
|
48
48
|
.map((release) => Math.floor(Date.parse(release.at) / hourMs)));
|
|
49
49
|
}
|
|
50
|
-
// A schedule's line takes
|
|
50
|
+
// A schedule's line takes that schedule's projects and any other of its template's series (a
|
|
51
|
+
// project queued by hand from its topics); a stored line takes its series, or any.
|
|
51
52
|
const fits = (line, who) => line.schedule !== undefined
|
|
52
|
-
? line.schedule === who.schedule
|
|
53
|
+
? line.schedule === who.schedule || (line.series !== "" && line.series === who.series)
|
|
53
54
|
: line.series === "" || line.series === who.series;
|
|
54
55
|
const zoneOf = (plan, line) => line.timeZone ?? plan.timeZone;
|
|
55
56
|
// The plan's long-video times from `from` to `until`, in order, each with its line.
|