{"record":{"id":"af91cc50679e8e1f","repo":"jackwener/OpenCLI","slug":"not-found-af91cc","errorCode":"NOT_FOUND","errorMessage":"Episode not found","messagePattern":"Episode not found","errorType":"error_code","errorClass":"CliError","httpStatus":null,"severity":"error","filePath":"clis/xiaoyuzhou/episode.js","lineNumber":23,"sourceCode":"cli({\n    site: 'xiaoyuzhou',\n    name: 'episode',\n    access: 'read',\n    description: 'View details of a Xiaoyuzhou podcast episode',\n    domain: 'www.xiaoyuzhoufm.com',\n    strategy: Strategy.LOCAL,\n    browser: false,\n    args: [{ name: 'id', positional: true, required: true, help: 'Episode ID (eid from podcast-episodes output)' }],\n    columns: ['title', 'podcast', 'duration', 'plays', 'comments', 'likes', 'date'],\n    func: async (args) => {\n        const credentials = loadXiaoyuzhouCredentials();\n        const response = await requestXiaoyuzhouJson('/v1/episode/get', {\n            query: { eid: args.id },\n            credentials,\n        });\n        const ep = response.data;\n        if (!ep)\n            throw new CliError('NOT_FOUND', 'Episode not found', 'Please check the ID');\n        return [{\n                title: ep.title,\n                podcast: ep.podcast?.title,\n                duration: formatDuration(ep.duration),\n                plays: ep.playCount,\n                comments: ep.commentCount,\n                likes: ep.clapCount,\n                date: formatDate(ep.pubDate),\n            }];\n    },\n});\n","sourceCodeStart":5,"sourceCodeEnd":35,"githubUrl":"https://github.com/jackwener/OpenCLI/blob/49907e53dc3ade5c223ff0c4c2c2785687cec4e6/clis/xiaoyuzhou/episode.js#L5-L35","documentation":"Thrown by the Xiaoyuzhou episode info command (clis/xiaoyuzhou/episode.js:23) as a CliError with code NOT_FOUND when /v1/episode/get returns successfully but response.data is falsy. Same root cause as error 4902 but in the metadata/info code path: the library cannot display details for an episode the API does not return.","triggerScenarios":"Running the xiaoyuzhou episode command with an --id the API cannot resolve: nonexistent, deleted, private, or mistyped episode ID, or credentials whose token scope excludes the episode so data comes back empty.","commonSituations":"Typos when hand-typing the 24-char episode ID; referencing an episode from a podcast that removed it; expired auth token silently yielding empty data instead of an auth error; passing a podcast ID where an episode ID is expected.","solutions":["Verify the episode ID against the episode's share URL (segment after /episode/)","Ensure you are passing an episode ID, not a podcast (pid) or user ID","Refresh credentials and retry in case an expired token is causing empty data","If the episode was deleted or is access-restricted, it cannot be fetched — choose another episode"],"exampleFix":"// before\nawait cli.episode({ id: '62d0f3ea' }); // truncated\n// after\nawait cli.episode({ id: '62d0f3ea9a1f2b1a3c4d5e6f' }); // full ID from episode URL","handlingStrategy":"validation","validationCode":"function isValidEpisodeId(id) {\n  return typeof id === 'string' && /^[0-9a-f]{24}$/.test(id);\n}\nif (!isValidEpisodeId(args.id)) throw new Error('Provide the full 24-char episode ID from the episode share URL');","typeGuard":"function hasEpisodeData(res) {\n  return res != null && typeof res === 'object' && res.data != null && typeof res.data === 'object';\n}","tryCatchPattern":"try {\n  const info = await cli.episode({ id });\n} catch (error) {\n  if (error.code === 'NOT_FOUND') {\n    console.error(`No episode found for ${id} — check the ID (eid, not pid) and that the episode still exists`);\n  } else throw error;\n}","preventionTips":["Copy episode IDs from the /episode/ path of share URLs rather than typing them","Confirm you are passing an episode ID, not a podcast or user ID","Refresh credentials if many IDs suddenly return empty data","Handle deleted/private episodes gracefully in batch scripts"],"tags":["not-found","api","invalid-input","cli"],"backgroundTag":"resource-not-found","analyzedSha":"49907e53dc3ade5c223ff0c4c2c2785687cec4e6","analyzedAt":"2026-08-29T08:14:47.543Z","schemaVersion":2},"datasetVersion":"2026-08-29T12:17:43.993Z"}