Cloudflare edition · feed 1.1
Your catalog.
Your hosting.
The public interface is static. A small Worker and a D1 database keep editing and publishing online.
The same public contract
GET /v1/series.json
GET /v1/genres.json
GET /v1/posters/{seriesId}/{file}.webpThe series envelope stays version: 1, schemaVersion: 1.1. Series IDs, title fields, ratings, genres, and editorial flags retain their format. All poster URLs are absolute HTTPS URLs on the origin used to fetch the feed. Public reads allow cross-origin GET without credentials.
Publish from the editor
Sign in at /admin/ with your configured admin key. Upload JPG, PNG, or WebP artwork, edit metadata, then choose Save draft or Publish series. Drafts stay private; published snapshots appear in the public feed. Genre-manager saves appear in the shared genre feed. Unpublish removes the series from public reads.
Posters
The browser creates 330 × 495 WebP posters below 1 MB. New uploads receive fresh UUID filenames. Processing adds no branding or watermark. Ratings display as a score with the label Rating. Compressed uploaded posters are stored in D1; imported images are bundled assets guarded by their series' publication state.
Connect midoriroll after deployment
Copy this site's /v1/series.json URL. Validate it before changing the existing app. Set the catalogUrl constants in midoriroll's catalog-source.js and episode-source.js to that exact HTTPS feed URL. Keep series IDs unchanged so episodes and saved Library entries continue to match. Keep the current catalog running until the new connection is verified.
Prompt for AI Studio
Read this catalog's /v1/series.json with credentials omitted and HTTP/JSON validation. Keep the existing version-1 parser and same-origin poster validation. Use id as the permanent series key, posterUrl unchanged, top-level genres plus series genres for filters, and explicit featured/trending booleans for collections. Preserve numeric ratings including zero, sortOrder, status, publishedAt, and isDemo. Hide isDemo entries. Preserve the last valid feed after refresh failure and show Retry. Do not change episode seriesId values or automatically add an episode source. Display Rating without a source/brand label. Keep 2:3 poster frames, lazy loading, and a placeholder on image errors.