[Flask] Web media downloader frontend.
1
# -*- mode: python; -*-
2
3
"""
4
"""
5
6
import os
7
import time
8
import glob
9
from datetime import datetime
10
from concurrent.futures import ThreadPoolExecutor
11
12
from flask import (
13
Blueprint,
14
render_template,
15
send_from_directory,
16
request,
17
redirect,
18
flash,
19
url_for,
20
jsonify,
21
abort,
22
)
23
from flask_login import login_required, current_user
24
import youtube_dl
25
26
from .models import db, Download
27
from .forms import DownloadToRemote, ManageRemote
28
29
main = ("main",__name__)
30
executor = (4)
31
32
33
@main.route("/")
34
@main.route("/index")
35
@login_required
36
defhome():
37
"""Prompt for video URL."""
38
# https://www.youtube.com/watch?v=86khmc6y1yE&list=RDGMEMYH9CUrFO7CfLJpaD7UR85w&index=13
39
download_history = Download..(..()).()
40
downloaded_files = [
41
file for file in os.("downloads") if file.((".mp3",".m4a"))
42
]
43
pending_files = [file for file in os.("downloads") if file.(".part")]
44
return (
45
"home.html",
46
user=,
47
form_download_remote=(),
48
form_manage_remote=(),
49
downloaded_files=,
50
pending_files=,
51
download_history=,
52
)
53
54
55
@main.("/download-remote",methods=["POST"])
56
@login_required
57
def ():
58
"""Download audio from URL onto server."""
59
form = ()
60
if form.():
61
url = request.["url"]
62
ydl_opts = {
63
"format": "bestaudio/best",
64
"outtmpl": os..(
65
.(),
66
"downloads",
67
"%(title)s.%(ext)s",
68
),
69
"noplaylist": True,
70
"postprocessors": [
71
{
72
"key": "FFmpegExtractAudio",
73
"preferredcodec": "mp3",
74
"preferredquality": "192",
75
}
76
],
77
}
78
executor.(.().,[])
79
with youtube_dl.() as ydl:
80
# time.sleep(1)
81
info = ydl.(,download=False)
82
title = info.("title")
83
new_download = (
84
title=,
85
url=,
86
user_id=.,
87
)
88
db..()
89
db..()
90
(f"Successfully started downloading {}.")
91
return (("main.home"))
92
(f"Couldn't download {}.")
93
return (("main.home"))
94
95
96
@main.("/manage-remote/",methods=["POST"])
97
@login_required
98
def ():
99
"""Manage all files downloaded on remote device.
100
101
The value of the submit button pressed is checked, then the
102
appropriate redirection is performed.
103
104
"""
105
form = ()
106
if form.():
107
file_name = request..("file_name")
108
if form..:
109
return (("main.download_local",file=))
110
elif form..:
111
return (("main.remove_remote",file=))
112
("Couldn't manage remote file.","error")
113
return (("main.home"))
114
115
116
@main.("/download-local/<file>",methods=["GET","POST"])
117
@login_required
118
def (file):
119
"""Download file from remote to local device."""
120
downloads = os..(.(),"downloads")
121
return (,file,as_attachment=True)
122
123
124
@main.("/remove-remote/<file>",methods=["GET","POST"])
125
@login_required
126
def (file):
127
"""Remove file from remote device."""
128
file_to_remove = os..(.(),"downloads",file)
129
os.()
130
(f"Successfully removed file {file}.")
131
return (("main.home"))
132