name: metafeedertmdb # ============================================================================= # MetaFeeder · TMDB — the CARD TIER feeder for MetaMesh. # # A "card" is a metadata-only record identifying a *work* (a series, a film) — # title, poster, description and an id bag (tmdb/imdb/…). It has no bytes and by # design never will. This feeder resolves cards from **TMDB** so a free-text # search in **MetaWatch** returns a clean poster grid of *works* instead of a # wall of raw release names. # # Why it is its own tier: search is split in two halves. # Phase 1 — CARD (this app): → one cached TMDB search # → a poster grid of works # Phase 2 — RETRIEVAL (indexer / usenet / tribler feeders): the user clicks a # card → the full indexer budget is spent on # that ONE work → the episode / version list. # Previously a single query resolved ten speculative candidate works *and* # searched every indexer for all of them against one shared rate bucket, so the # work the user actually wanted got a tenth of the budget. Installing this app # is what makes the first half cheap. # # Cheap and self-contained: it calls TMDB directly, holds no bytes, runs no # enrichment sidecars, and never touches an indexer. It also does NOT talk to # meta-core itself — the MetaGateway core stores and announces the cards it # returns. # # It needs, over the shared `pcs` network: # - the **MetaGateway** app — which must list this feeder's URL # (`http://metafeedertmdb-feeder:8080`) in its feeders config so it gets # discovered. Discovery is startup-only, so restart the gateway afterwards. # # Everything is scoped under the `metafeedertmdb-*` prefix + the per-stack # `metafeedertmdb` network + /DATA/AppData/metafeedertmdb/ data root, so it # installs alongside the other Meta* apps with zero collisions. # ============================================================================= services: # --------------------------------------------------------------------------- # metafeedertmdb-feeder — the feeder (meta-feeder-tmdb) hosting the `tmdb` # upstream. The gateway core reaches it directly on `pcs` for # discovery/query/compute; the human configures it # from the MetaGateway dashboard (configure panel). # --------------------------------------------------------------------------- metafeedertmdb-feeder: image: ipcr-watch.nsl.sh/ipns/metadec.eth/metadec.eth/meta-feeder-tmdb:1.0.6 cpu_shares: 30 container_name: metafeedertmdb-feeder # Hard RAM cap, swap disabled (memswap_limit == mem_limit) → OOM instead of # swap. This feeder holds no bytes and does far less than the indexer feeder # (one TMDB call + a redb cache), so this is generous, not tight. mem_limit: 256m memswap_limit: 256m hostname: metafeedertmdb-feeder restart: unless-stopped user: "0:0" expose: - 8080 environment: # INFRA-ONLY env (the "config: no env if in webui" rule). Operator config — # TMDB token, rate/burst, cards-per-search — is read from the persisted # config.json written by this feeder's config page (opened from # the MetaGateway dashboard (configure panel)). TMDB_TOKEN / TMDB_RATE_PER_SEC / TMDB_BURST / CARD_TOP_N # exist only as deprecated first-boot seeds; don't set them here. # META_FEEDER_STATE_DIR is left at its default (/data/meta-feeder), which # is what the volume below mounts. RUST_LOG: "info,meta_feeder=info,card_feeder=info" TZ: "$TZ" volumes: # Persist feeder config (config.json saved via the config UI) + the redb # TMDB response cache. Wiping the cache is safe but re-burns TMDB budget # on every card the swarm re-discovers. - ${DATA_ROOT:-/DATA}/AppData/metafeedertmdb/state:/data/meta-feeder:rw healthcheck: test: ["CMD", "curl", "-sf", "http://localhost:8080/health"] interval: 5s timeout: 3s retries: 10 start_period: 5s networks: - pcs networks: pcs: name: ${APP_NET:-pcs} external: true x-casaos: architectures: - amd64 - arm64 author: Worph Team category: Media developer: Aptero Team description: en_us: | **The card tier — the half of MetaMesh search that makes it feel like a streaming app.** MetaFeeder · TMDB resolves **cards** from **TMDB**: metadata-only records identifying a *work* — a series or a film — with title, poster, plot and a bag of cross-source ids. A card carries no bytes. Its job is to turn a free-text search in **MetaWatch** into a clean **poster grid of works** instead of a wall of raw release names. **Why it exists.** Search is split in two: 1. **Card** (this app) — one cached TMDB lookup → a grid of works. Costs no indexer requests at all. 2. **Retrieval** (**MetaFeeder · Prowlarr**, **· Usenet**, **· Tribler**) — you click a card, and the *entire* indexer budget is spent on that one work → its episode and version list. Before the split, a single query speculatively resolved ten candidate works *and* searched every indexer for all of them against one shared rate bucket — so the work you actually wanted got a tenth of the budget. **Cheap and self-contained:** it calls TMDB directly, holds no bytes, runs no enrichment sidecars, and never touches an indexer. ~256 MB RAM. **Requires:** **MetaGateway** — its meta-core stores the resolved cards and announces them to the swarm. The gateway must list this feeder in its config. You also need a free **TMDB** read token. **Pairs with:** any retrieval feeder (**Indexer**, **Usenet**, **Tribler**) — cards are what you click *before* those do their work. fr_fr: | **La couche « card » — la moitié de la recherche MetaMesh qui lui donne des allures d'app de streaming.** MetaFeeder · TMDB résout des **cards** depuis **TMDB** : des enregistrements purement métadonnées identifiant une *œuvre* — une série, un film — avec titre, affiche, synopsis et un jeu d'identifiants inter-sources. Une card ne contient aucun octet. Son rôle : transformer une recherche libre dans **MetaWatch** en une **grille d'affiches d'œuvres** plutôt qu'en un mur de noms de releases bruts. **Pourquoi.** La recherche est scindée en deux : 1. **Card** (cette app) — une requête TMDB mise en cache → une grille d'œuvres. Ne consomme aucune requête d'indexeur. 2. **Récupération** (**MetaFeeder · Prowlarr**, **· Usenet**, **· Tribler**) — vous cliquez une card, et *tout* le budget d'indexation est dépensé sur cette seule œuvre → la liste de ses épisodes et versions. Auparavant, une seule requête résolvait spéculativement dix œuvres candidates *et* interrogeait tous les indexeurs pour chacune, sur un même seau de débit — l'œuvre réellement voulue n'obtenait qu'un dixième du budget. **Léger et autonome :** appelle TMDB directement, ne stocke aucun octet, aucun plugin d'enrichissement, ne touche jamais un indexeur. ~256 Mo de RAM. **Nécessite :** l'app **MetaGateway** (son meta-core stocke et annonce les cards) et un jeton de lecture **TMDB** gratuit. tagline: en_us: TMDB card tier — turns MetaMesh search into a poster grid of works fr_fr: Couche « card » TMDB — transforme la recherche MetaMesh en grille d'affiches title: en_us: MetaFeeder · TMDB icon: https://cdn.jsdelivr.net/gh/Worph/MetaAppStore@main/Apps/MetaFeederTMDB/icon.png screenshot_link: - https://cdn.jsdelivr.net/gh/Worph/MetaAppStore@main/Apps/MetaFeederTMDB/screenshot-1.png - https://cdn.jsdelivr.net/gh/Worph/MetaAppStore@main/Apps/MetaFeederTMDB/screenshot-2.png - https://cdn.jsdelivr.net/gh/Worph/MetaAppStore@main/Apps/MetaFeederTMDB/screenshot-3.png thumbnail: https://cdn.jsdelivr.net/gh/Worph/MetaAppStore@main/Apps/MetaFeederTMDB/thumbnail.png store_app_id: metafeedertmdb is_uncontrolled: false tips: before_install: en_us: | **Install order:** install **MetaGateway** first (its meta-core stores and announces the cards this feeder resolves). **After installing this app:** 1. Get a free **TMDB v4 read access token** — themoviedb.org → Settings → API. (The v4 "Read Access Token", not the v3 API key.) 2. Open its config panel (the **MetaGateway** dashboard → this feeder → *configure*) and paste it into **TMDB v4 token**. Leave the rate, burst and cards-per-search fields blank unless you have a reason — the defaults (20 req/s, burst 20, 10 cards per search) are sane. Save, then restart this app: the feeder reads its config at startup, there is no hot reload. 3. In **MetaGateway**, add this feeder to its feeders config — name `tmdb-feeder`, URL `http://metafeedertmdb-feeder:8080` — from the gateway dashboard's *Add a feeder* box. The gateway restarts itself and picks up the `tmdb` upstream (it will show **LIVE**, with the tags CARD / MOVIE / SERIES). **Without a TMDB token** the feeder stays healthy but soft-skips: card searches simply return nothing. That is by design, not a failure. **Cards vs. results.** This app only produces the poster grid. To actually get episodes and streams behind a card you also need a retrieval feeder — **MetaFeeder · Prowlarr**, **· Usenet** or **· Tribler**. **No web UI of its own:** configure it from the **MetaGateway** dashboard → this feeder → *configure* (the gateway proxies this feeder's config page, behind the gateway's login). # Maison (Yundera dashboard) configuration. Read in preference to x-casaos. # schema_version 2 is required for `folders`: an older Maison refuses the app # outright rather than starting it without its directories. x-compose-app: schema_version: 2 # Created and chowned by Maison before any image is pulled, before any hook # runs and before the containers start — on the first boot and every one after. # Compose would otherwise create a missing bind source as a root-owned dir. folders: - path: /DATA/AppData/metafeedertmdb/state user: $PUID group: $PGID