{"record":{"id":"9ad12dcea2fce182","repo":"jackwener/OpenCLI","slug":"page-is-too-large-value","errorCode":null,"errorMessage":"--page is too large: ${value}","messagePattern":"--page is too large: (.+?)","errorType":"validation","errorClass":"ArgumentError","httpStatus":null,"severity":"error","filePath":"clis/bilibili/utils.js","lineNumber":95,"sourceCode":"    });\n}\n/**\n * 解析 --page 选集序号（分P / 视频选集）。\n * 缺省/空串 → null（不下钻，保持整集默认 P1 旧行为）。\n * 非正十进制整数 → 抛 ArgumentError（参数错误，不静默吞）。\n */\nexport function parsePageArg(value) {\n    if (value == null || value === '') return null;\n    if (typeof value === 'number') {\n        if (Number.isSafeInteger(value) && value >= 1) return value;\n        throw new ArgumentError(`--page must be a positive decimal integer, got: ${value}`);\n    }\n    if (typeof value !== 'string' || !/^[1-9]\\d*$/.test(value)) {\n        throw new ArgumentError(`--page must be a positive decimal integer, got: ${String(value)}`);\n    }\n    const n = Number(value);\n    if (!Number.isSafeInteger(n)) {\n        throw new ArgumentError(`--page is too large: ${value}`);\n    }\n    return n;\n}\n\nfunction readApiPositiveInteger(value, label) {\n    if (typeof value === 'number' && Number.isSafeInteger(value) && value >= 1) {\n        return value;\n    }\n    if (typeof value === 'string' && /^[1-9]\\d*$/.test(value)) {\n        const n = Number(value);\n        if (Number.isSafeInteger(n)) return n;\n    }\n    throw new CommandExecutionError(`Bilibili view API returned a malformed ${label}`);\n}\n\n/**\n * 从 view API 的 data.pages 数组取第 N 集（1-based）。\n * page/cid 都以 view API 的 pages[] 为 source-of-truth；缺失、重复或畸形都 fail closed。","sourceCodeStart":77,"sourceCodeEnd":113,"githubUrl":"https://github.com/jackwener/OpenCLI/blob/49907e53dc3ade5c223ff0c4c2c2785687cec4e6/clis/bilibili/utils.js#L77-L113","documentation":"Final guard of parsePageArg: a string passing the /^[1-9]\\d*$/ regex can still exceed Number.MAX_SAFE_INTEGER when converted with Number(), e.g. a 30-digit page number. In that case the function throws '--page is too large: <value>' rather than silently losing precision.","triggerScenarios":"Calling parsePageArg('99999999999999999999') — digits-only string whose numeric value is greater than 2^53-1.","commonSituations":"Pasting a uid or video id into the --page flag by mistake; a script concatenating numbers instead of adding them; fat-fingering a very long digit string.","solutions":["Pass a realistic page number (actual video part counts are small — typically < 1000)","Check you didn't paste a uid/BVID into --page","Validate length upstream: value.length <= 16 before calling","Use BigInt-free logic: if (value.length > 15) reject before Number()"],"exampleFix":"// before\nparsePageArg('123456789012345678901234567890');\n// after\nparsePageArg('3');","handlingStrategy":"validation","validationCode":"function isReasonablePage(v) {\n  const s = String(v ?? '').trim();\n  return /^[1-9]\\d*$/.test(s) && s.length <= 9; // well within MAX_SAFE_INTEGER and real part counts\n}","typeGuard":"function isBoundedPageString(v) {\n  if (typeof v !== 'string' || !/^[1-9]\\d*$/.test(v)) return false;\n  const n = Number(v);\n  return Number.isSafeInteger(n) && n <= 100000;\n}","tryCatchPattern":"try {\n  const page = parsePageArg(value);\n} catch (err) {\n  if (err instanceof ArgumentError && /too large/.test(err.message)) {\n    console.error(`--page '${value}' overflows; did you paste a uid? Using default page.`);\n    const page = null;\n  } else throw err;\n}","preventionTips":["Bound-check string length (<= 9 digits for realistic part counts) before calling","Don't pass uids or BVID digit strings into --page","Sanity-check generated page numbers in loops against the video's actual part count","If very large numbers are legitimate upstream, convert/validate with BigInt before calling this API"],"tags":["argument-validation","cli-input","bilibili"],"backgroundTag":"invalid-page-argument","analyzedSha":"49907e53dc3ade5c223ff0c4c2c2785687cec4e6","analyzedAt":"2026-08-29T08:14:47.543Z","schemaVersion":2},"datasetVersion":"2026-08-29T12:17:43.993Z"}