Adapter: PublicMetaDB
PublicMetaDB adapter notes for syncing watchlist, history, ratings, and progress with TMDb-based matching.
PublicMetaDB adapter lets CrossWatch sync with PublicMetaDB. It supports watchlist, history, ratings, and progress.
Connect PublicMetaDB first. Use: PublicMetaDB (Authentication provider).
PublicMetaDB uses request pacing, retry/backoff, and hourly rating quotas.
Defaults and tuning: Provider rate limiting.
What it supports
Direction: source or target in a pair (one-way or two-way)
Features:
Watchlist (movies and shows)
History (movies and episodes)
Ratings (movies, shows, and episodes)
Progress (movies and episodes)
Playlists (not supported)
Rating scale: CrossWatch 1–10, converted to PublicMetaDB 0–100
Indexing: present-state snapshot (reads “what exists now”)
How matching works
PublicMetaDB works best with TMDb IDs.
CrossWatch uses TMDb IDs to tell PublicMetaDB exactly which item changed.
For writes, CrossWatch usually needs:
Movies:
ids.tmdbEpisodes: show
ids.tmdbplusseasonandepisodeHistory:
watched_atProgress: current position plus total duration
If an item has no TMDb ID, PublicMetaDB sync often can’t write it.
If an episode is missing show TMDb ID or episode numbers, CrossWatch marks it unresolved.
Using PublicMetaDB in a pair
Open Settings → Authentication and connect PublicMetaDB.
Create or edit a pair.
Choose PublicMetaDB as the source, destination, or both.
Enable Watchlist, History, Ratings, or Progress.
Optionally set a pair-level watchlist name.
Save and run the pair.
Internal provider name: PUBLICMETADB.
Watchlist behavior
Supports movies and shows.
Supports source, destination, or two-way sync.
Uses a PublicMetaDB list as the destination container.
Default list name:
Watchlist.If the list does not exist, CrossWatch can create it automatically.
Created lists are private and marked as managed by CrossWatch.
Pair-level overrides can use a different list name for each pair.
Examples:
Movies to WatchFamily WatchlistAnime Queue
PublicMetaDB watchlist does not support seasons or individual episodes.
History behavior
Supports movies and episodes.
Reads watched items from PublicMetaDB and can sync them elsewhere.
Writes watched movies and watched episodes into PublicMetaDB.
History is event-based.
The same movie or episode can appear more than once if it was watched multiple times.
CrossWatch keeps those events distinct by including watched_at in the internal key.
Ratings behavior
Supports movies, shows, and episodes.
Uses a CrossWatch
1–10rating scale.Converts ratings before sending them to PublicMetaDB.
Examples:
8/10→8010/10→100
Default label: Overall.
Power users can change the default with publicmetadb.ratings_label.
Ratings are label-aware.
A rating for the same item with a different label is treated as a separate rating.
Progress behavior
Supports movies and episodes.
Syncs partial playback state such as resume position.
Requires current position and total duration.
PublicMetaDB needs both values to store progress.
If duration is missing, CrossWatch can’t send the progress entry.
If PublicMetaDB reports an item as completed or ignored after a progress update, CrossWatch removes the local resume reference from shadow state.
Related: Progress.
Settings and state (advanced)
Important config keys
Stored under publicmetadb.
Core settings:
api_keybase_urltimeoutmax_retries
Watchlist:
watchlist_list_idwatchlist_namewatchlist_auto_createwatchlist_page_size
History and progress:
history_per_pagehistory_max_pagesprogress_per_pageprogress_max_pages
Ratings and pacing:
ratings_labelratings_submit_per_hourratings_update_per_hourrate_limit.get_per_secrate_limit.post_per_sec
Defaults:
base_url:https://publicmetadb.comtimeout:15.0max_retries:3ratings_label:Overallrate_limit.get_per_sec:20rate_limit.post_per_sec:3ratings_submit_per_hour:200ratings_update_per_hour:100
Rate control layers
PublicMetaDB uses three layers:
Request pacing for
GETand non-GETcallsRetry and backoff for
429and temporary5xxerrorsPair-scoped hourly rating quotas
DELETE shares the same pacing bucket as POST.
For 429, CrossWatch honors Retry-After when PublicMetaDB sends it.
If a rating quota is reached, CrossWatch marks affected items unresolved and finishes the run.
Watchlist selection order
CrossWatch chooses the destination list in this order:
Use
publicmetadb.watchlist_list_idif set.Find a list matching
watchlist_name.Use the first list with type
watchlist.Fall back to common names like
crosswatchorwatchlist.Create a private list if auto-create is enabled.
Local shadow and quota files
Stored under /config/.cw_state/.
Typical files:
publicmetadb_watchlist.<pair-scope>.shadow.jsonpublicmetadb_history.<pair-scope>.shadow.jsonpublicmetadb_progress.<pair-scope>.shadow.jsonpublicmetadb_ratings.<pair-scope>.shadow.jsonpublicmetadb_ratings.<pair-scope>.quota.json
If no pair scope is available, CrossWatch uses unscoped.
Deletes usually need PublicMetaDB remote item IDs, not only TMDb IDs.
That makes the first sync or build-index pass important.
Common unresolved reasons
missing_tmdb_id— item has no TMDb IDmissing_show_tmdb_or_episode_numbers— episode is missing show TMDb ID, season, or episodemissing_watched_at— history item has no watched timestampmissing_duration— progress item has no runtime or durationmissing_remote_item_id— missing remote ID for watchlist removemissing_remote_history_id— missing remote ID for history removemissing_remote_resume_id— missing remote ID for progress removemissing_remote_rating_id— missing remote ID for rating removepublicmetadb_hourly_rating_submit_limit— local rating submit quota reachedpublicmetadb_hourly_rating_update_limit— local rating update quota reached
Notes and limitations
Watchlist sync does not support seasons or episodes.
History sync does not support whole-show watched state.
Progress sync does not support whole-show progress.
Ratings sync depends on local shadow state for stable remove behavior.
Reliable TMDb IDs are the main compatibility requirement.
Pair compatibility still depends on what the other provider supports.
Good pair examples:
Plex → PublicMetaDB history
PublicMetaDB → Plex watchlist
Jellyfin → PublicMetaDB progress
Last updated
Was this helpful?