MyGo 云音乐
用 Go 与 MyGo 写成的第三方网易云音乐桌面客户端。原生界面,没有 WebView;边下边播,无损与 Hi-Res,逐字歌词与「律动」,刘海播放器。
Translation pending
Catálogo y estadísticas de un registro personal de películas vistas desde 2018.
Translation pending
MediaTypeScript · HTMLGitHub @ArturogrottoliOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Proyecto con inteligencia artificial y una bbdd de casi 1500 peliculas
Translation pending
Taken from the repository README
Loading the full README. The saved excerpt is shown below.
Un registro personal de películas — ~1.280 vistas desde enero de 2018 — que se mantiene solo: le mandás el nombre de una película a un bot de Telegram, una IA le completa director, año, país y género, y la fila se agrega a una hoja de Google. Un sitio web lee esa hoja en vivo y muestra el catálogo y sus estadísticas. Proyecto integrador del curso IA Automation (Coderhouse). Toca las tres capas del stack: datos, orquestación e inteligencia. La historia completa del proyecto — por qué, en qué orden, qué se rompió y qué se aprendió en el camino — está en docs/historia-del-proyecto.md.Read the full README ↗
Un registro personal de películas — ~1.310 visionados (~1.170 películas distintas) desde enero de 2018 — que se mantiene solo: le mandás el nombre de una película a un bot de Telegram, una IA le completa director, año, país y género, y la fila se agrega a una hoja de Google. Un sitio web lee esa hoja en vivo y la muestra en dos secciones — Películas (índice, listas, búsquedas, mapa) y Datos (gráficos y machine learning) —, con CinefilIA, un chat de cine, en todas las páginas. Pósters, reparto y modelos se actualizan solos todos los días.
Sitio: https://turimoviesdatabase.vercel.app
Proyecto hecho a propósito para mostrar las tres capas del stack: datos, orquestación e inteligencia.
La historia completa del proyecto — por qué, en qué orden, qué se rompió y qué se aprendió en el camino — está en docs/historia-del-proyecto.md.
Funcional de punta a punta. El circuito Telegram → IA → Google Sheets → web anda solo: agregás una película por chat y aparece en el sitio sin tocar nada más.
runtime.json/synopsis.json, de
TMDB) + modal de detalle: click en cualquier película (tabla, grilla o
"quiero ver") abre la ficha completa — póster, género, rating,
duración, sinopsis, reparto y todas las fechas vistas.por_ver + sección en el
sitio; al registrarla como vista sale sola de la lista.Aprobada) cuando tocás ✅.cerebro/ y del repo.editMessageText ("❌ Descartada") →
answerCallbackQuery. Ya no guarda nada en la hoja e incluye el mensaje
de recuperación ("si fue sin querer, mandala de nuevo").ambiguo/opcion1/opcion2.
- Router 7, ruta "1st Registrar": intent = registrar AND ambiguo
not equal true (para no disparar el mensaje normal si es ambigua).
- Router 7, ruta "Ambiguo" (intent = registrar AND ambiguo = true):
Telegram Bot (Make an API Call, sendMessage) con 2 botones (1️⃣/2️⃣),
callback_data = "amb:" + opción completa (título/año/director en
el mismo string, no un código corto — así no hace falta guardar
estado entre mensajes).
- Router 18, ruta "Ambiguo elegido" (Callback Query: Data starts with
amb) → Text parser (sin uso real, quedó de un diseño anterior) →
Gemini nuevo (módulo 31, schema de 5 campos) que arma la ficha
completa recibiendo directo {{2.callbackQuery.data}} como mensaje
(a Gemini no le cuesta nada ignorar el prefijo "amb:") → Telegram Bot
con el mensaje final ✅/❌, con el mismo formato y callback_data
("ok"/"no") que el registro normal — así cae solo en las rutas
"Aprobado"/"Rechazado" que ya existían, sin duplicar esa parte.
- Bug de plataforma encontrado en el camino: el buscador de campos de un
módulo de IA no muestra los campos nuevos del schema hasta que el
módulo corre al menos una vez con datos reales — se resuelve con
"Run this module only" escribiendo un mensaje a mano en el input.Make an API Call (#21, el del setWebhook)
del escenario de Make — borrado.El proyecto sirve tanto para el portfolio de automatización como para el de datos: el trabajo de limpieza (fechas, pósters, typos) ya es data engineering real, solo faltaba mostrarlo.
cerebro/taste_profile.py
(Python/pandas/sklearn), corre offline, escribe taste_profile.json.
Se muestra en el sitio como su propia placa — Placa VII "Lo que mis
películas dicen de mí" (app/src/app/taste-profile) —
no interactiva por película, prosa fija (escrita a mano, no generada
en runtime; la narración por Gemini en vivo queda pendiente de Make)
interpolando los números reales vía TasteProfileService.
Última corrida (2026-09-20, 1.155 películas únicas): Tarantino 63,6%
de tasa de revisión (vs 17,9% del mejor género solo, Animación) — el
director pesa mucho más que el género. Chad Stahelski 57,1%. La
década más fuerte es 2000s (13,6%), no 2010s. El modelo marca la
duración como la variable de más peso para predecir revisión,
pese a que el promedio es casi idéntico entre revisitadas y no
(109,8 vs 110,0 min) — relación no lineal: el rango 160+ min tiene la
tasa más alta (18,4%), pero es casi todo Scorsese/Tarantino — la
duración es proxy del director, no la causa.
Combos director+actor y clustering, hechos (2026-09-21) — sumados
al mismo taste_profile.json, narrados en la misma Placa VII: top
combo real "Ti West + Mia Goth" (100% de tasa de revisión, sobre 3
películas juntos — el combo pesa más que el director solo). Clustering
(KMeans, sklearn) de los 9 años de registro en 3 "familias de gusto"
por década/duración/género promedio: no hay tendencia lineal en el
tiempo, son fases (2019/2020/2021/2024 con 21,9% de tasa de revisión
promedio vs. 16% en 2018/2026).
Descartado (no interesa): cruzar tasa de revisión contra rating de TMDB.cerebro/build_similar_ajustado.py
repondera el mismo candidate pool de build_similar.py, pero con
señales reales de taste_profile.json en vez de pesos fijos a mano:
director/género escalados por tasa de revisión real, década por el
peso del Random Forest, y duración sumada como feature nueva
(el método por contenido no la usa) escalada por su propio peso RF
(el más alto de todos). Buscador de una película ya vista → 2
columnas de chips ("por contenido" vs. "ajustado por tu perfil"),
puramente de lectura.La idea general: tres capas visibles — Automation + IA → Data Science → aplicación final — sin tocar la automatización que ya funciona; la segunda mitad se suma como módulo aparte, empezando por el perfil de gusto.
runtime.json (1.222/1.229, cerebro/build_runtime.js,
mismo patrón que actores/pósters). Ya usada en la Placa VI (duración
promedio por año, distribución de duración) y en el recomendador
ajustado (Placa VIII) como feature nueva.ranking por año o mes visto trae la duración promedio de
cada período, buscar_vistas filtra y ordena por duración, y el resumen
trae las horas vistas. Lo único que no lee es taste_profile.json.manual-de-datos.md describía como "pendiente" el bug de
anio_visto que ya se arregló) — corregidos. Actualizados de nuevo
(2026-10-08) con todo lo de octubre: CinefilIA (función de Vercel),
la sincronización diaria en GitHub Actions, las secciones Películas y
Datos, data/, el selector de conteo, y en costos el caso CinefilIA
(contexto de ~29.000 a ~10.000 tokens). PDF re-exportados con
cerebro/export_docs_pdf.js (Chrome headless).fecha_vista) con el año corrido. Los 8
bloques + 4 typos sueltos, corregidos con una fórmula en una columna
auxiliar (R) y pegado especial (solo valores) sobre G. anio_visto ya
coincide en todas las filas. Ojo con 2 cosas que salieron mal en el
camino, por si se repite el patrón alguna vez:
- Pegar con Ctrl+V normal en vez de Ctrl+Shift+V rompe todo (la fórmula
quedaba circular, #REF! en toda la columna) — pegado especial,
siempre.
- El pegado especial trajo el formato de fecha de la columna auxiliar
(D/M/AAAA) en vez del de la hoja (AAAA-MM-DD) — hubo que reformatear
G2:G1287 a mano (Formato → Número → Fecha personalizada).
Verificado en el CSV publicado: 0 mismatches en las 1.288 filas.
Instantánea embebida del sitio ya refrescada con los datos corregidos.cerebro/check_datos.js, verificadas).
D713 E733 E509 E551 E342 E1000 D942/E942 E659 E674 E1064.por_ver: Amarga Navidad y Charly días de sangre, ya completas.por_ver tenía 3 pelis ya vistas — The Other y Bob & Carol & Ted &
Alice, borradas. Rear Window se deja a propósito (la quiere volver a ver).catalogo_completo: F794 Corea del Sur ·
F716 Hong Kong.posters.json matcheó mal más pelis (remakes/homónimos) — 43 corregidos
hasta ahora (cerebro/rematch_posters.js y rematch_posters2.js, ya
borrados — siguen en el historial de git;
eligen por director en vez de por popularidad). Última corrección:
"Fuck You" (2024) tenía matcheada "Fuck You, Cupid" (ficción de Felipe
Marinheiro) en vez del documental real, "Fuck you! El último show"
(José Luis García) sobre el último recital de Sumo en Obras — mismo
título, director completamente distinto, no detectable por alfabeto.
Última pasada de : 20 alertas, las 19 restantes
revisadas — falsos positivos por nombres de director en otro alfabeto,
o casos de año ambiguos de muy baja prioridad (festival vs. estreno
general). Cerca del techo de lo que este método encuentra solo; lo que
queda requeriría revisión manual. 2 sin match real en TMDB
(Leaving Neverland, La casa de la playa — no están cargadas como
película ahí). Quedan más sueltas; se van encontrando con .
16 son el
mismo falso positivo de siempre (director en cirílico/chino/japonés/
coreano/télugu/griego). De los 3 años marcados, 2 confirmaron que el
catálogo tenía razón — TMDB comparaba contra un relanzamiento, no el
estreno real: "Historia de lo oculto" (catálogo 2020 = estreno en
Argentina 2020-11-22; TMDB devolvía 2023, un relanzamiento en EE.UU.) y
"Terrifier" (catálogo 2016 = estreno en EE.UU. 2016-10-15; TMDB
devolvía 2018, el estreno teatral más amplio).
el tercer caso, "Super Size Me 2", también confirma que el catálogo
tenía razón — TMDB sí tiene registrado un estreno en Canadá
(2017-09-08, premiere de TIFF) que coincide exacto con el 2017 del
catálogo; el campo principal de TMDB solo mostraba el estreno general
de EE.UU. en 2019. Las 19 alertas de la última pasada, cerradas.
mismas 19 alertas de siempre, ya todas
revisadas y confirmadas en pasadas anteriores — nada nuevo. Confirma
que sigue en el techo de lo que encuentra solo; lo
que quede requeriría revisión manual, no un patrón automatizable.
mismas 19 alertas de siempre, sin
cambios. También se revisó el otro ángulo — películas sin ningún match
en (lo que ni evalúa, porque solo
compara contra matches ya existentes) — y siguen siendo las mismas 2
de siempre: "Leaving Neverland" y "La Casa de la playa", que TMDB
directamente no tiene cargadas como película. Nada nuevo para cazar.
mismas 19 alertas, sin cambios; las 5
películas recién sumadas (Sleepaway Camp, Gremlins, Last Night in Soho,
Acusada, RoboCop) no generaron ninguna.flowchart LR
T[Telegram] --> G1[Gemini<br/>¿registrar o consultar?]
G1 --> R{Router · Make}
R -->|registrar| G2[Gemini completa la ficha] --> S[(Google Sheets)]
R -->|consultar| H[lee el catálogo] --> G3[Gemini responde] --> T
S -.->|confirmación| T
S --> GH[GitHub Actions<br/>sync diaria + TMDB + ML] --> D[(data/*.json)]
S --> W[Sitio Angular · Vercel<br/>Películas + Datos]
D --> W
W <--> C[CinefilIA<br/>Vercel → Gemini]
| Capa | Herramienta | Rol |
|---|---|---|
| Cerebro | Google Sheets + data/ | El catálogo (una tabla, una fila por visionado) y "Quiero ver". Alrededor, pósters, reparto, sinopsis y modelos en data/. |
| Corazón | Make + GitHub Actions + Vercel Functions | Make: el bot y los pedidos del sitio. GitHub Actions: la sincronización diaria de los datos. Vercel: la función de CinefilIA. |
| Inteligencia | Google Gemini + scikit-learn | Gemini clasifica, completa fichas y responde (bot y CinefilIA). scikit-learn: perfil de gusto y recomendadores. |
| Voz | Telegram + sitio | Entrada y consultas por chat; el sitio para explorar, buscar y preguntarle a CinefilIA. |
El sitio es una app de Angular en Vercel. Lee el CSV publicado de la hoja (si no
responde, usa una instantánea) y los JSON de data/ directo del repo; lo que
falta lo busca en vivo en TMDB. El detalle completo, con todos los caminos, está
en docs/arquitectura.md.
El bot distingue tres cosas por el texto del mensaje:
app/ el sitio (Angular, en Vercel): secciones Películas y Datos
api/chat.ts CinefilIA, el chat del sitio (función de Vercel → agente de Gemini)
api/_lib/ sus datos y herramientas (el "_" evita que Vercel los publique como endpoints)
src/app/ placas, servicios y componentes
data/ datos de enriquecimiento que el sitio lee del repo
(posters, posters-manual, actors, runtime, synopsis,
similar, similar_ajustado, taste_profile, mis9)
img/ pósters a mano para los que TMDB no tiene
cerebro/ scripts de datos y respaldo de la hoja (ver cerebro/README.md)
.github/workflows/ sync-datos.yml: sincronización diaria de los datos
docs/ documentación técnica — arquitectura, datos, costos
El sitio lee la hoja publicada como CSV (SHEET_CSV_URL en
app/src/app/core/catalog-data.service.ts). Si no responde, usa la
instantánea app/public/data/catalog-snapshot.json
(node cerebro/build_ng_snapshot.js la actualiza).
por_verpor_ver a mano. Automático = intent descartar + Search/Delete Row en Make.
Sumarle: que al registrar "vi X" con éxito, si X ya estaba en por_ver,
se borre esa fila sola (hoy solo se "esconde" en el sitio, sigue en la hoja).accion
("agregar" → Add a Row en por_ver; "quitar" → Search Rows + Delete a
Row). El modal tiene el botón correspondiente según si la película ya
está en la lista o no (openModalAny decide qué modal mostrar).
Probado en vivo de punta a punta (agregar + quitar, confirmado en la
hoja). De paso, el reparto en el modal pasó de texto plano a pills.
Sumado después: botón ✕ directo en las cards de "Quiero ver" (solo ahí,
no en las vistas) para sacarlas sin pasar por el modal — pide
confirmación y pega al mismo webhook. Visible al hover en desktop,
siempre visible en touch. Probado con CDP (headless Chrome): el click
no abre el modal (stopPropagation), la card desaparece de la grilla
tras confirmar. El confirm() nativo del navegador se reemplazó por un
modal propio (mismo estilo del sitio). También se sumó un botón
"+ Agregar película" en la sección, con un formulario para anotar
cualquier título nuevo sin depender de que ya aparezca en el catálogo
o en "Parecidas"; la sección ahora se muestra siempre, incluso con la
lista vacía. En el modal de detalle, el botón de quitar pasó de texto
abajo de todo a un botón "Quitar de la lista" al lado del título.
La rama "agregar" ahora pasa por Gemini antes de escribir la fila
(mismo patrón que el bot de Telegram): se agregó un módulo "Extract
structured data" que recibe el título tal cual lo escribió el usuario
y devuelve título corregido, director, año, país y género en un solo
llamado — el Add a Row quedó remapeado para tomar esos campos en vez
de los crudos del webhook. Por eso el formulario del sitio se
simplificó a un solo campo ("¿Qué querés ver?"): ya no hace falta
tipear director/año a mano, igual que escribirle al bot. Probado
contra el webhook real: mandando solo "parasite" la fila se completó
sola (Bong Joon-ho, 2019, Corea del Sur, Thriller).
Gotcha nuevo: en el schema de "Response Schema" de Gemini, el
campo "Property Name" de cada item hay que escribirlo a mano (texto
literal) — si mapeás ahí un valor de otro módulo (por error, con el
picker), Gemini usa ese valor como nombre de clave en vez de como
contenido, y todo sale mal armado.
Sin verificar desde el 2026-10-04 — revisar con Make: el 22/9
"agregar" no escribía en la hoja, y el 4/10 un "quitar" (Eyes of
Laura Mars) devolvió "Accepted" pero la fila siguió 8 minutos después.
Hoy esa fila ya no está, sin saber si la borró el escenario o se borró
a mano. Para cerrarlo: agregar y quitar una película desde el sitio,
confirmar en por_ver, y si falla, mirar la History de "Integration
Webhooks".cerebro/ (pósters, reparto, duración, sinopsis, perfil de gusto,
recomendador) sobre data/ y commitea solo si cambió algo. Se puede correr a mano
desde Actions → "Sincronizar datos de películas" → Run workflow.
Necesita el secreto TMDB_TOKEN en Settings → Secrets → Actions.
Versiones de Python fijas en cerebro/requirements.txt (mismas que
la máquina local, para que los resultados no cambien solos).
- app/src/app/core/live-poster.service.ts: si una película no figura
en ningún JSON (agregada después de la última sincronización), el
sitio busca su póster en TMDB en el momento. Tope de 30 por visita.cerebro/build_similar.py suma TF-IDF de sinopsis (scikit-learn,
sin dependencias pesadas nuevas) a la similitud categórica que ya
existía, combinando las dos matrices de coseno por separado (70%
categórico + 30% texto). Mismo similar.json, mismos chips "Parecidas"
del modal — mejor señal, sin tocar la UI. Decisión: "director
parecido a otro" queda afuera — no existe nada hoy, necesitaría una UI
nueva; se deja para más adelante si hace falta.img/.cerebro/build_similar.py
(similitud por coseno, director x3 + reparto x2 + género x1 + década
x0.5, incluye catálogo + "quiero ver", 1.212 películas). Se muestra en
el modal de detalle (las dos secciones) como chips clickeables.
Decisión: esto queda tal cual, es la capa de automatización/sitio
— no se ajusta con el perfil de gusto acá. La versión ajustada va
aparte, como pieza de Data Science (ver abajo), no mezclada en el modal.?nueve=) y en el navegador.
La del dueño del sitio se fija con node cerebro/set_mis9.js "<link>" "Nombre"
→ mis9.json, y aparece como pestaña aparte.GEMINI_API_KEY en
Vercel (nunca en el navegador); GEMINI_MODEL es opcional. Desde
2026-10-23 es un agente con herramientas (tool calling): en vez de
recibir el catálogo, pide lo que necesita (buscar_vistas, ranking,
quiero_ver, tmdb_persona, tmdb_pelicula…), que filtran y cuentan en
código sobre los datos reales (app/api/_lib/); lo de TMDB
vuelve marcado vista: true/false para recomendar sin repetir. El chat
muestra qué consultó. Evaluación con respuestas conocidas:
node cerebro/eval_bot.js. Detalle en
docs/arquitectura.md (camino 5). Además verifica
del lado del servidor que no recomiende algo ya visto. Solo habla de cine: lo demás
→ "Solo soy un simple bot peliculero". Límite: 15 consultas cada 10
min por IP. api/ tiene su propio tsconfig (commonjs): con el de
Angular la función se caía en Vercel./ y /datos (Angular
router; app/vercel.json reescribe todo a index.html salvo /api/).
Cada sección numera sus placas desde I. Películas: I Índice ·
II Quiero ver · III Buscar por persona · IV Recomendador (parecidas dentro
del diario; las sugerencias abren la ficha) · V Mis 9 · VI Mapa del mundo. Datos: I La
forma de una obsesión · II Revisitas · III Detrás de los datos ·
IV Dashboard · V Perfil de gusto · VI KPIs. (Las menciones de
"Placa N" más arriba en este README son de la numeración vieja, única.)/discover/movie?with_origin_country=). Lista de países como vista de
tabla. Geometría: world-atlas 110m en app/public/data, d3-geo.
Nombres de país en español con Intl.DisplayNames + alias (USA, UK,
Unión Soviética…), en core/countries.util.ts.cerebro/build_directors.js
→ data/directors.json y cerebro/build_cast_gender.js →
data/genero-reparto.json (los dos en la sincronización diaria), más
correcciones a mano donde TMDB no tiene el dato (data/genero-manual.json).
Con eso: CinefilIA responde "¿cuántas y cuáles directoras vi?" (71),
"¿qué actrices vi más?" y "¿qué vi con Emma Stone?" con conteos y listas
hechos en código (sin la lista exacta inventaba títulos: Birdman); y la
Placa I de Datos tiene dos rankings con pestañas: Dirección
(Todos / Directores / Directoras) y Reparto (Todos / Actores /
Actrices), cada uno con selector Top 10 · 25 · 50 · 100 (con más de 25,
la lista va en un recuadro con scroll propio). Si un empate es enorme (65
directoras con 1 película), muestra solo las de arriba y el texto dice
cuántas más hay.check_datos.jscheck_datos.jscheck_datos.jsposters.jsoncheck_datos.js1974.por_ver: Solaris duplicada, ya sin la fila de más.gemini-3.1-flash-lite se discontinúa el 7/5/2027, y desde 2026-10-25
ya da 503 ("high demand") en casi todos los pedidos. Migrados todos los
módulos "Google Gemini AI" de Make a gemini-3.5-flash-lite (2026-10-25;
responde en ~2 s). CinefilIA también: prueba primero
gemini-3.5-flash-lite y, si está saturado, gemini-3.1-flash-lite
(GEMINI_MODEL en Vercel, si está, va primero).index.html original se
borró del repo el 2026-10-25 (sigue en el historial de git; las URLs de
la hoja que los scripts leían de ahí están en cerebro/hoja.js). Detalle fase por fase en
docs/plan-migracion-angular.md.