An episode can have a catalog ID, a publisher GUID, a public page address, and an audio enclosure URL. The values may look related, but they should not be used as substitutes without a documented mapping.

A catalog ID belongs to a provider's record system. A publisher GUID identifies an item in its feed context. An enclosure URL tells the player where a media file is located. A changed hosting address does not automatically mean a new conversation was published.

Choose identity at the storage boundary

For API-backed listener state, use the episode identifier required by that API. Store external identifiers as additional metadata when useful for reconciliation. Keep the provider or source namespace so two unrelated values cannot collide accidentally.

Do not create your own episode ID by hashing a title alone. Titles such as “Episode 1” repeat across many shows. A title can also be corrected after release.

Likewise, removing query parameters from every audio URL is not a safe identity rule. Some parameters are meaningful for access or delivery. Treat the documented record ID as the stable reference and the URL as current media metadata.

Review a migration case

Prepare one episode fixture whose enclosure address changes but whose provider ID remains stable. A saved item and listening history entry should still open the same episode. Then add two different episodes with identical titles and verify that both remain visible.

If you import data from another catalog, make uncertain matches reviewable. A wrong automatic merge can hide an episode or attach playback progress to unrelated audio. Clear identity boundaries protect the listener from those silent mistakes.