{"record":{"id":"3e87474669c68067","repo":"ytdl-org/youtube-dl","slug":"this-video-has-been-s","errorCode":null,"errorMessage":"this video has been %s","messagePattern":"this video has been (.+?)","errorType":"exception","errorClass":"ExtractorError","httpStatus":null,"severity":"error","filePath":"youtube_dl/extractor/line.py","lineNumber":186,"sourceCode":"                continue\n            if k == 'abr':\n                formats.extend(self._extract_m3u8_formats(\n                    v, broadcast_id, 'mp4', protocol,\n                    m3u8_id='hls', fatal=False))\n                continue\n            f = {\n                'ext': 'mp4',\n                'format_id': 'hls-' + k,\n                'protocol': protocol,\n                'url': v,\n            }\n            if not k.isdigit():\n                f['vcodec'] = 'none'\n            formats.append(f)\n        if not formats:\n            archive_status = item.get('archiveStatus')\n            if archive_status != 'ARCHIVED':\n                raise ExtractorError('this video has been ' + archive_status.lower(), expected=True)\n        self._sort_formats(formats)\n        info['formats'] = formats\n        return info\n\n\nclass LineLiveChannelIE(LineLiveBaseIE):\n    _VALID_URL = r'https?://live\\.line\\.me/channels/(?P<id>\\d+)(?!/broadcast/\\d+)(?:[/?&#]|$)'\n    _TEST = {\n        'url': 'https://live.line.me/channels/5893542',\n        'info_dict': {\n            'id': '5893542',\n            'title': 'いくらちゃん',\n            'description': 'md5:c3a4af801f43b2fac0b02294976580be',\n        },\n        'playlist_mincount': 29\n    }\n\n    def _archived_broadcasts_entries(self, archived_broadcasts, channel_id):","sourceCodeStart":168,"sourceCodeEnd":204,"githubUrl":"https://github.com/ytdl-org/youtube-dl/blob/956b8c585591b401a543e409accb163eeaaa1193/youtube_dl/extractor/line.py#L168-L204","documentation":"Raised by the LINE LIVE extractor when no broadcast formats were found and the broadcast's archiveStatus is anything other than 'ARCHIVED' — the message embeds the lowercased status (e.g. 'this video has been expired' or 'terminated'). It is expected=True, reporting why the archive is unavailable.","triggerScenarios":"Opening a live.line.me broadcast URL whose protocol URLs (HLS/LLHP) yielded no formats and whose broadcastStatus/archiveStatus JSON field is e.g. 'EXPIRED' or 'TERMINATED' — i.e. the replay window closed or the broadcast was removed.","commonSituations":"LINE LIVE archives expiring after their retention window; broadcasts terminated by policy; following old broadcast links after expiry; attempting to download live-in-progress broadcasts whose archive is not yet generated.","solutions":["If the archive expired, find a fan re-upload or clip of the broadcast","Record broadcasts while they are live or shortly after, before the archive window closes","Verify the broadcast URL still shows a replay in the LINE LIVE app","Update youtube-dl/yt-dlp in case the status enum grew new values"],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"try:\n    ydl.extract_info(url)\nexcept ExtractorError as e:\n    if 'this video has been' in str(e):\n        status = str(e).split('been ', 1)[1]\n        if status == 'expired':\n            find_mirror(broadcast_id)  # archive window closed permanently\n    else:\n        raise","preventionTips":["Download LINE LIVE archives promptly; retention windows are short","For important broadcasts, record live rather than relying on replays"],"tags":["line-live","archive-expired","live-stream","extractor"],"backgroundTag":null,"analyzedSha":"956b8c585591b401a543e409accb163eeaaa1193","analyzedAt":"2026-08-14T18:59:47.863Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}