File size: 3,490 Bytes
b0fa22e
 
83c91dd
 
940c88d
1954490
 
 
b0fa22e
 
 
 
29b0711
 
1954490
 
32ac84b
b0fa22e
 
1954490
 
b0fa22e
 
 
 
 
 
 
 
 
 
 
 
 
1954490
 
 
29b0711
3fee868
b0fa22e
 
3fee868
 
1954490
 
 
 
b605d72
3fee868
b605d72
3fee868
b605d72
 
 
 
 
3fee868
b605d72
 
0fb735a
3fee868
0fb735a
 
 
 
 
 
 
 
 
 
3fee868
 
 
 
 
 
 
 
b605d72
 
3fee868
 
83c91dd
3fee868
83c91dd
29b0711
b605d72
 
 
3fee868
0fb735a
b605d72
29b0711
b605d72
 
1954490
b605d72
0fb735a
b605d72
b0fa22e
1954490
0fb735a
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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
from flask import Flask, request, jsonify, send_file, render_template
from yt_dlp import YoutubeDL
import random
import string
import os

app = Flask(__name__)

@app.route('/')
def home():
    return render_template('index.html')

@app.route('/get-info', methods=['POST'])
def get_info():
    data = request.json
    url = data.get('url')

    if not url:
        return jsonify({'error': 'URL is required'}), 400

    try:
        ydl_opts = {
            'cookiefile': 'www.youtube.com_cookies.txt'
        }
        
        with YoutubeDL(ydl_opts) as ydl:
            info = ydl.extract_info(url, download=False)
            return jsonify({
                'title': info['title'],
                'thumbnail': info.get('thumbnail'),
                'duration': info.get('duration'),
                'channel': info.get('channel')
            })

    except Exception as e:
        return jsonify({'error': str(e)}), 500

@app.route('/download', methods=['POST'])
def download():
    data = request.json
    url = data.get('url')
    format_type = data.get('format', 'mp3')
    quality = data.get('quality', 'best')

    if not url:
        return jsonify({'error': 'URL is required'}), 400

    try:
        if format_type == 'mp3':
            ydl_opts = {
                'format': 'bestaudio/best',
                'outtmpl': '%(title)s.%(ext)s',
                'cookiefile': 'www.youtube.com_cookies.txt',
                'postprocessors': [{
                    'key': 'FFmpegExtractAudio',
                    'preferredcodec': 'mp3',
                    'preferredquality': '192',
                }],
            }
        else: 
            quality_map = {
                    '144': 'bv*[height=144][ext=mp4]+ba[ext=m4a]/b[height=144][ext=mp4]',
                    '240': 'bv*[height=240][ext=mp4]+ba[ext=m4a]/b[height=240][ext=mp4]',
                    '360': 'bv*[height=360][ext=mp4]+ba[ext=m4a]/b[height=360][ext=mp4]',
                    '480': 'bv*[height=480][ext=mp4]+ba[ext=m4a]/b[height=480][ext=mp4]',
                    '720': 'bv*[height=720][ext=mp4]+ba[ext=m4a]/b[height=720][ext=mp4]',
                    '1080': 'bv*[height=1080][ext=mp4]+ba[ext=m4a]/b[height=1080][ext=mp4]',
                    'best': 'bv*[ext=mp4]+ba[ext=m4a]/b[ext=mp4]'
                }

            selected_quality = quality_map.get(quality, quality_map['best'])
            
            ydl_opts = {
                'format': selected_quality,
                'outtmpl': '%(title)s.%(ext)s',
                'merge_output_format': 'mp4',
                'cookiefile': 'www.youtube.com_cookies.txt',
            }

        with YoutubeDL(ydl_opts) as ydl:
            info = ydl.extract_info(url, download=True)
            
            if format_type == 'mp3':
                file_name = ''.join(random.choices(string.ascii_letters + string.digits, k=19))
            else:
                file_name = ''.join(random.choices(string.ascii_letters + string.digits, k=20))

        return send_file(
            file_name,
            as_attachment=True,
            download_name=os.path.basename(file_name),
            mimetype='video/mp4' if format_type == 'mp4' else 'audio/mp3'
        )

    except Exception as e:
        return jsonify({'error': str(e)}), 500

    finally:
        if 'file_name' in locals() and os.path.exists(file_name):
            os.remove(file_name)

if __name__ == '__main__':
       app.run(host='0.0.0.0', port=7860, debug=True,threaded=True)