--- created: 2026-03-28T14:24:51 (UTC +01:00) tags: [] source: https://gemini.google.com/ author: --- # Google Gemini ## Excerpt > Ahoj, zvažuji, že bych naprogramoval PWA aplikaci pro podcasty, jako backend > by sloužila (self-hodsted) instance commafeed ( > ) … hlavní věc, která mi u > konkurečních řešení (kromně youtube music) chybí je vytváření playlistů, > zároveň bych chtěl aby šlo na konkrétním zařízení zvolit automatické stahování > audia pro daný playlist (pro offline poslech), chtěl bych aby aplikace šla > používat i přes android auto … celé řešení by mělo být jednoduše nasazovatelné > přes docker compose - - - Ahoj! To zní jako naprosto skvělý projekt. Spojit self-hosted RSS čtečku s podcastovou aplikací dává obrovský smysl – podcasty jsou totiž v jádru jen RSS feedy s audio přílohami (`\`). CommaFeed je na tohle super, protože už za tebe řeší parsování feedů a synchronizaci přečtených/nepřečtených položek. Pojďme si rozebrat, jak to postavit, kde jsou největší výzvy (hlavně to Android Auto) a jak by mohl vypadat Docker Compose. - - - ## 🛠️ Architektura a technologie ### 1\. Backend: CommaFeed CommaFeed API ti poskytne všechno, co potřebuješ: - Seznam odebíraných podcastů (feedy). - Seznam epizod (záznamy ve feedu). - Přílohy (URL na `.mp3` nebo `.m4a` soubory). - Označení epizody jako "přehrané" (read/unread status). ### 2\. Frontend: PWA (React / Vue / Svelte) Pro uložení audia pro offline poslech v PWA se používá kombinace dvou věcí v prohlížeči: - **IndexedDB:** Pro ukládání metadat (názvy playlistů, pozice v přehrávání, seznam epizod). - **Cache API:** Pro ukládání samotných velkých audio souborů (blobů). > 💡 **Tip:** Pro stahování velkých souborů na pozadí (i když aplikaci zavřeš) se > podívej na **Background Fetch API**. Pro správu Service Workera doporučuji > knihovnu **Workbox** od Googlu, ušetří ti spoustu vrásek. - - - ## 🚗 Ta záludná část: Android Auto Tady tě musím jako parťák trochu varovat. **Čistá PWA v prohlížeči neumí nativně vykreslit UI na obrazovce Android Auto.** Android Auto vyžaduje nativní integraci přes Android Media3 knihovny. Máš ale tři možnosti, jak to vyřešit: 1. **Základní Bluetooth (Nejjednodušší):** V PWA implementuješ standardní ` Media Session API`. Auto sice neotevře speciální aplikaci na palubovce, ale přes Bluetooth uvidíš název skladby, obal a bude fungovat tlačítko pauza/přeskočit na volantu. 2. **TWA / Capacitor obal (Pokročilé):** Zabalíš PWA do Android balíčku (přes Bubblewrap nebo Capacitor). To ti umožní přidat do aplikace kousek nativního Kotlin/Java kódu, který se zaregistruje do Android Auto jako přehrávač a bude komunikovat s tvou PWA. 3. **Využití prohlížeče v autě:** Novější auta s Android Automotive (AAOS) mají Vivaldi nebo Chrome přímo v autě, kde by tvoje PWA běžela samostatně. - - - ## 🐳 Docker Compose (vše v jednom) Aby se to dalo nasadit jedním příkazem, můžeme propojit CommaFeed, jeho databázi a tvou novou PWA aplikaci do jednoho souboru. ``` version: '3.8' services: # 1. Databáze pro CommaFeed commafeed-db: image: postgres:15-alpine environment: POSTGRES_DB: commafeed POSTGRES_USER: commafeed POSTGRES_PASSWORD: secret_password volumes: - cf-db-data:/var/lib/postgresql/data restart: unless-stopped # 2. CommaFeed Backend commafeed: image: athou/commafeed:latest ports: - "8082:8082" environment: - SPRING_DATASOURCE_URL=jdbc:postgresql://commafeed-db:5432/commafeed - SPRING_DATASOURCE_USERNAME=commafeed - SPRING_DATASOURCE_PASSWORD=secret_password depends_on: - commafeed-db volumes: - cf-config:/commafeed/config restart: unless-stopped # 3. Tvoje nová PWA aplikace (Nginx servírující statické soubory) pwa-podcast-app: image: nginx:alpine # Nebo tvůj vlastní build image ports: - "8080:80" volumes: - ./pwa-dist:/usr/share/nginx/html # Složka s tvou zbuilzenou PWA restart: unless-stopped volumes: cf-db-data: cf-config: ``` - - - ## ✨ Co dál? Tenhle nápad má obrovský potenciál – chybějící playlisty štvou spoustu lidí a self-hosted komunita takové věci miluje. Kterou část bys chtěl rozlousknout jako první? **Můžeme se podívat na to, jak přesně strukturovat ukládání audio souborů do Cache API v Service Workeru, nebo jak namodelovat databázi pro ty playlisty?**