{"record":{"id":"2565db8403c4b162","repo":"DIYgod/RSSHub","slug":"baseinfo-name-is-not-available-in-this-server-r","errorCode":null,"errorMessage":"${baseInfo.name} is not available in this server region.","messagePattern":"(.+?) is not available in this server region\\.","errorType":"validation","errorClass":"InvalidParameterError","httpStatus":null,"severity":"error","filePath":"lib/routes/iqiyi/album.tsx","lineNumber":44,"sourceCode":"可抓取內容根据服务器所在地区而定\n:::`,\n};\n\nasync function handler(ctx) {\n    const id = ctx.req.param('id');\n\n    const { data: response } = await got(`https://www.iq.com/album/${id}`);\n\n    const $ = load(response);\n    const nextData = JSON.parse($('#__NEXT_DATA__').text());\n    const { album } = nextData.props.initialState;\n\n    const {\n        data: { data: baseInfo },\n    } = await got(`https://pcw-api.iqiyi.com/album/album/baseinfo/${album.videoAlbumInfo.albumId}`);\n\n    if (Object.keys(album.cacheAlbumList).length === 0) {\n        throw new InvalidParameterError(`${baseInfo.name} is not available in this server region.`);\n    }\n\n    let pos = 1;\n    let hasMore: boolean;\n    let epgs: any[] = [];\n    do {\n        const {\n            data: { data },\n            // eslint-disable-next-line no-await-in-loop\n        } = await got(`https://pcw-api.iq.com/api/v2/episodeListSource/${album.videoAlbumInfo.albumId}`, {\n            searchParams: {\n                platformId: 3,\n                modeCode: 'intl',\n                langCode: 'zh_cn',\n                endOrder: album.videoAlbumInfo.maxOrder,\n                startOrder: pos,\n            },\n        });","sourceCodeStart":26,"sourceCodeEnd":62,"githubUrl":"https://github.com/DIYgod/RSSHub/blob/bed535e0879dc71c5aff6f1e7bd1ac21ede40115/lib/routes/iqiyi/album.tsx#L26-L62","documentation":"The iQiyi album route fetches album metadata from iq.com and checks `album.cacheAlbumList`; if it has no keys the album is treated as unavailable in the RSSHub server's region and InvalidParameterError is thrown with the album name. Region is determined by where RSSHub itself runs, not by a user parameter.","triggerScenarios":"The album is geo-restricted and the RSSHub server's egress IP is in a region iq.com does not serve that album to; the album was delisted; cross-region licensing changed.","commonSituations":"Self-hosting in a region blocked for that title; a VPS in a restricted country; content that is CN-only or overseas-only.","solutions":["Deploy or proxy RSSHub through an egress in a region where the album is available on iq.com.","Verify the album plays on iq.com from your server's region before relying on the feed.","If unavailable everywhere you can deploy, choose a different album."],"exampleFix":null,"handlingStrategy":"retry","validationCode":"// Region is server-side; pre-check album availability from the server's egress\nasync function albumAvailableInRegion(id: string): Promise<boolean> {\n  const { data } = await got(`https://www.iq.com/album/${id}`);\n  const $ = load(data);\n  const next = JSON.parse($('#__NEXT_DATA__').text());\n  return Object.keys(next.props.initialState.album.cacheAlbumList).length > 0;\n}","typeGuard":null,"tryCatchPattern":"try {\n  await buildAlbumFeed(id);\n} catch (e) {\n  // retry through a different egress / proxy region, then surface geo-block clearly\n  throw e;\n}","preventionTips":["Deploy RSSHub behind an egress in a region iq.com serves; or proxy per-route.","Detect empty cacheAlbumList before rendering and return a clear geo-availability error.","Do not retry in a loop from the same blocked region — it will keep failing."],"tags":["geo","region","licensing"],"backgroundTag":null,"analyzedSha":"bed535e0879dc71c5aff6f1e7bd1ac21ede40115","analyzedAt":"2026-08-12T19:29:35.364Z","schemaVersion":2},"datasetVersion":"2026-08-12T23:17:12.415Z"}