openjutsu
One-click character swap for videos: an open-source, local Higgsfield Genjutsu alternative built on ComfyUI and MiniMax H3, with FLUX.3 Klein relighting.
Lista unificada de series y películas de todas mis plataformas
Translation pending
MediaGitHub @rodri-a91OnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
Repository information has not been collected yet.
No updates detected yet. GitHub releases will appear here.
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full README ↗Lista unificada de películas y series pendientes entre todas tus plataformas de streaming.
CREATE TABLE watchlist_items (
id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
user_id uuid NOT NULL DEFAULT auth.uid() REFERENCES auth.users(id) ON DELETE CASCADE,
tmdb_id int NOT NULL,
type text NOT NULL CHECK (type IN ('movie', 'tv')),
title text NOT NULL,
poster_path text,
year int NOT NULL,
platforms text[] NOT NULL DEFAULT '{}'
CHECK (platforms <@ ARRAY['netflix','hbo','disney','apple','skyshowtime','prime','movistar','plex','filmin']::text[]),
genres text[] NOT NULL DEFAULT '{}'
CHECK (genres <@ ARRAY['Acción','Animación','Aventura','Bélica','Ciencia ficción','Comedia','Crimen','Documental','Drama','Familia','Fantasía','Historia','Misterio','Música','Romance','Suspense','Terror','Western']::text[]),
season_number int,
duration_minutes int,
episode_count int,
rating numeric(3,1),
watched boolean NOT NULL DEFAULT false,
added_at timestamptz NOT NULL DEFAULT now(),
CONSTRAINT watchlist_items_uniqueness UNIQUE NULLS NOT DISTINCT (user_id, tmdb_id, type, season_number),
CONSTRAINT season_only_for_tv CHECK (type = 'tv' OR season_number IS NULL)
);
ALTER TABLE watchlist_items ENABLE ROW LEVEL SECURITY;
-- Cada usuario solo ve y modifica sus propias filas
CREATE POLICY "own_items"
ON watchlist_items
FOR ALL
TO authenticated
USING ((SELECT auth.uid()) = user_id)
WITH CHECK ((SELECT auth.uid()) = user_id);
-- Series que sigues en la pestaña "Próximos" (independiente de la watchlist)
CREATE TABLE followed_shows (
id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
user_id uuid NOT NULL DEFAULT auth.uid() REFERENCES auth.users(id) ON DELETE CASCADE,
tmdb_id int NOT NULL,
title text NOT NULL,
poster_path text,
platforms text[] NOT NULL DEFAULT '{}'
CHECK (platforms <@ ARRAY['netflix','hbo','disney','apple','skyshowtime','prime','movistar','plex','filmin']::text[]),
seen_season int, -- puntero "voy por"; null = sin puntero
seen_episode int,
added_at timestamptz NOT NULL DEFAULT now(),
CONSTRAINT followed_shows_uniqueness UNIQUE (user_id, tmdb_id),
CONSTRAINT seen_pointer_complete CHECK ((seen_season IS NULL) = (seen_episode IS NULL))
);
ALTER TABLE followed_shows ENABLE ROW LEVEL SECURITY;
CREATE POLICY "own_follows"
ON followed_shows
FOR ALL
TO authenticated
USING ((SELECT auth.uid()) = user_id)
WITH CHECK ((SELECT auth.uid()) = user_id);
Pulsa Run. Si todo ha ido bien, verás las tablas en Table Editor.
Para que nadie más pueda crearse una cuenta en tu app:
Abre config.js y pon tus valores reales. El archivo se sube al repo a propósito, porque Vercel lo sirve tal cual y no hay paso de build:
SUPABASE_URL y SUPABASE_ANON_KEY los encuentras en Supabase → Project Settings → APITMDB_API_KEY es la que acabas de copiarLa pestaña Próximos es una lista aparte de series seguidas, con la agenda de capítulos y estrenos sacada de TMDB:
Los datos de TMDB se guardan 12 horas en el navegador (localStorage). El botón Actualizar fuerza la recarga.
Limitación conocida: TMDB da el día de emisión pero no la hora. Una serie de EE. UU. que se emite de noche allí aparece un día antes de cuando se puede ver en España.
La lógica de fechas y calendario (schedule.js) tiene tests sin dependencias:
node --test
Como el proyecto usa ES modules, no puedes abrir index.html con doble clic directamente — necesitas un servidor local. Opciones:
python -m http.server y abre http://localhost:8000.npx serve en la carpeta del proyecto.git push actualiza automáticamente la versión en producción.Mismo flujo en netlify.com.
Este proyecto usa autenticación por email + contraseña gestionada por Supabase Auth. Solo el usuario que tú crees en Supabase puede acceder, y cada usuario solo ve sus propias filas (user_id + RLS). Las claves que viven en config.js son seguras de exponer en el frontend: la SUPABASE_ANON_KEY está diseñada para eso y, gracias a las políticas RLS, no permite leer ni escribir nada sin haber iniciado sesión. La TMDB_API_KEY tampoco es sensible.
La sesión se guarda en localStorage del navegador, así que solo necesitas hacer login una vez por dispositivo. Si quieres invalidar todas las sesiones, en Supabase puedes ir a Authentication → Users, abrir tu usuario y forzar logout.