Implement Phase 3A playlist management

This commit is contained in:
Media
2026-08-16 20:34:36 -05:00
parent 722c6cf77d
commit e2ecdc97e2
15 changed files with 2955 additions and 7 deletions
+43 -2
View File
@@ -6,24 +6,55 @@ const {
const { createAssetRouter } = require("./assets/routes");
const { createMediaRouter } = require("./assets/media-routes");
const { createAssetService } = require("./assets/service");
const {
createPlaylistRouter,
createPlaylistService,
} = require("./playlists");
const { createSettingsRouter } = require("./settings/routes");
const { createSettingsService } = require("./settings/service");
function safeNotifier(notifier, logger) {
const warn = (error) => {
try {
logger?.warn?.("Playlist invalidation notification failed", error);
} catch {
// A best-effort notification or warning must not undo a database commit.
}
};
return (event) => {
try {
const result = notifier(event);
result?.catch?.(warn);
} catch (error) {
warn(error);
}
};
}
function createApp({
config,
database,
imageProcessor,
lifecycle,
logger = console,
migrations,
now = Date.now,
onPlaylistsChanged = () => {},
storage,
}) {
const app = express();
const notifyPlaylistsChanged = safeNotifier(onPlaylistsChanged, logger);
const settingsService = createSettingsService(database);
const assetService = createAssetService({
database,
imageProcessor,
storage,
});
const playlistService = createPlaylistService({
database,
now,
onChanged: notifyPlaylistsChanged,
});
app.disable("x-powered-by");
app.set("trust proxy", config.trustProxy);
@@ -51,11 +82,21 @@ function createApp({
"/api/status",
createDetailedHealthRouter(detailedHealthRouterOptions),
);
app.use("/api/settings", createSettingsRouter(settingsService));
app.use(
"/api/settings",
createSettingsRouter(settingsService, {
onPlaylistsChanged: notifyPlaylistsChanged,
}),
);
app.use(
"/api/assets",
createAssetRouter({ assetService, processingConfig: config.processing }),
createAssetRouter({
assetService,
onPlaylistsChanged: notifyPlaylistsChanged,
processingConfig: config.processing,
}),
);
app.use("/api/playlists", createPlaylistRouter(playlistService));
app.use("/media", createMediaRouter(assetService));
app.use((request, response) => {