<?php
// m3u8_crawler.php - chunklist 요청 URL을 playlist body 기반, 올바른 경로 구조로 수정

if(isset($_POST['playlist_url'])){
    $playlist_url = trim($_POST['playlist_url']);
    $output = [];

    // playlist.m3u8 가져오기
    $playlist_content = @file_get_contents($playlist_url);
    if($playlist_content === false){
        $playlist_content = '[ERROR] playlist.m3u8 가져오기 실패';
    }

    $output[] = '<h3>playlist.m3u8</h3><div style="display:flex;gap:20px;">'
             .'<pre style="flex:1">'.htmlspecialchars($playlist_content).'</pre>'
             .'<textarea style="flex:1" readonly>'.htmlspecialchars($playlist_content).'</textarea></div>';

    // playlist body에서 chunklist URL 찾기 (첫 번째 .m3u8 포함 줄)
    $lines = array_filter(array_map('trim', explode("\n", $playlist_content)), fn($l)=>$l && $l[0] != '#');
    $chunklist_rel = null;
    foreach($lines as $l){
        if(strpos(strtolower($l), 'chunklist') !== false || strtolower(substr($l,-5)) === '.m3u8'){
            $chunklist_rel = $l;
            break;
        }
    }

    if(!$chunklist_rel){
        $chunklist_content = '[ERROR] chunklist.m3u8 없음';
        $chunklist_url_display = '[N/A]';
    } else {
        // playlist body 기반으로 chunklist URL 생성
        // 예: https://livecloud.pstatic.net/…/720p/.../chunklist.m3u8 형태로
        $parsed_playlist = parse_url($playlist_url);
        $path_parts = explode('/', $parsed_playlist['path']);
        $base_path = implode('/', array_slice($path_parts, 0, -1)); // 마지막 파일 제거
        $chunklist_url = $parsed_playlist['scheme'] . '://' . $parsed_playlist['host'] . $base_path . '/' . $chunklist_rel;

        $chunklist_url_display = $chunklist_url;

        // chunklist 요청
        $chunklist_content = @file_get_contents($chunklist_url);
        if($chunklist_content === false){
            $chunklist_content = '[ERROR] chunklist.m3u8 가져오기 실패';
        }
    }

    $output[] = '<h3>chunklist.m3u8</h3><div style="display:flex;gap:20px;">'
             .'<pre style="flex:1">'.htmlspecialchars($chunklist_content).'</pre>'
             .'<textarea style="flex:1" readonly>'.htmlspecialchars($chunklist_content).'</textarea>'
             .'<textarea style="flex:1" readonly>'.htmlspecialchars($chunklist_url_display).'</textarea></div>';

    // ts 파일 목록
    $ts_urls = [];
    if(strpos($chunklist_content,'[ERROR]')===false){
        $ts_lines = array_filter(array_map('trim', explode("\n", $chunklist_content)), fn($l)=>$l && $l[0]!='#' && strtolower(substr($l,-3))==='.ts');
        $ts_urls = array_map(fn($l)=> (strpos($l,'http')===0 ? $l : rtrim(dirname($chunklist_url), '/') . '/' . $l), $ts_lines);
    }

    $output[] = '<h3>TS 파일 확인</h3><ul>';
    foreach($ts_urls as $ts){
        $headers = @get_headers($ts, 1);
        $status = $headers ? substr($headers[0],9,3) : 'ERR';
        $size = isset($headers['Content-Length']) ? $headers['Content-Length'] : '-';
        $ok = ($status>=200 && $status<300) ? '✔' : '✖';

        $body = @file_get_contents($ts);
        $body_preview = $body ? htmlspecialchars(substr($body,0,200)) : '[ERROR] 가져오기 실패';

        $output[] = "<li>$ok $ts (status: $status, size: $size)";
        $output[] = '<div style="display:flex;gap:20px; margin-top:5px;">'
                 . '<pre style="flex:1">'. $body_preview .'</pre>'
                 . '<textarea style="flex:1" readonly>'. $body_preview .'</textarea></div></li>';
    }
    $output[] = '</ul>';

    echo implode("\n", $output);
    exit;
}
?>

<!doctype html>
<html>
<head><meta charset="utf-8"><title>m3u8 Crawler</title></head>
<body>
<h2>m3u8 Crawler (PHP) - playlist body 기반 chunklist 올바른 경로</h2>
<form method="post">
  playlist.m3u8 URL: <input type="text" name="playlist_url" size="80">
  <button type="submit">실행</button>
</form>
</body>
</html>
