File size: 2,737 Bytes
bc39353
5961a7a
bc39353
4ddbe7a
d596036
 
 
 
558b354
 
 
d596036
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2815236
4f574fb
2815236
 
4f574fb
 
 
cf0c38d
2815236
4f574fb
cf0c38d
 
 
558b354
cf0c38d
 
99baa8d
9a13e4d
558b354
9a13e4d
 
 
d596036
 
cf0c38d
c0b7006
13158d2
 
 
cf0c38d
13158d2
bc39353
2e18f1a
99baa8d
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
import gradio as gr
import yt_dlp

def extract_info(youtube_url):
    ydl_opts = {
        'quiet': True,
        'no_warnings': True,
        'no_color': True,
        'youtube_include_dash_manifest': False,
        'youtube_include_hls_manifest': False,
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
    }
    try:
        with yt_dlp.YoutubeDL(ydl_opts) as ydl:
            info = ydl.extract_info(youtube_url, download=False)
            
            metadata = {
                "제목": info.get('title', 'N/A'),
                "채널": info.get('channel', 'N/A'),
                "업로드 날짜": info.get('upload_date', 'N/A'),
                "조회수": info.get('view_count', 'N/A'),
                "길이 (초)": info.get('duration', 'N/A'),
            }
            
            formats = info.get('formats', [])
            
            best_video_only = next((f for f in formats if f['ext'] == 'mp4' and f.get('vcodec') != 'none' and f.get('acodec') == 'none'), None)
            
            # 간단히 비디오와 오디오가 모두 있는 첫 번째 mp4 포맷을 선택
            combined = next((f for f in formats if f['ext'] == 'mp4' and f.get('vcodec') != 'none' and f.get('acodec') != 'none'), None)
            
            metadata_str = "\n".join([f"{k}: {v}" for k, v in metadata.items()])
            
            video_only_link = f'<a href="{best_video_only["url"]}" target="_blank">비디오만 다운로드</a>' if best_video_only else ""
            combined_link = f'<a href="{combined["url"]}" target="_blank">비디오+오디오 다운로드</a>' if combined else ""
            
            download_links = f"{video_only_link}<br>{combined_link}" if video_only_link or combined_link else "다운로드 링크를 찾을 수 없습니다."
            
            return metadata_str, download_links

    except Exception as e:
        return f"오류 발생: {str(e)}", "다운로드 링크를 찾을 수 없습니다."

with gr.Blocks() as demo:
    gr.Markdown("## YouTube 메타데이터 및 다운로드 링크 추출기")
    gr.Markdown("주의: 이 도구를 사용하여 저작권이 있는 콘텐츠를 무단으로 다운로드하는 것은 불법입니다.")
    
    youtube_url_input = gr.Textbox(label="YouTube URL 입력")
    extract_button = gr.Button("정보 추출")
    output = gr.Textbox(label="추출된 정보", lines=10)
    download_links = gr.HTML(label="다운로드 링크")
    
    extract_button.click(
        fn=extract_info, 
        inputs=youtube_url_input, 
        outputs=[output, download_links]
    )

if __name__ == "__main__":
    demo.launch()