mirror of
https://github.com/KevinMidboe/spotify-downloader.git
synced 2025-10-29 18:00:15 +00:00
Download while simultaneously encoding
This commit is contained in:
@@ -1 +1,3 @@
|
|||||||
__version__ = "1.2.6"
|
__version__ = "1.2.6"
|
||||||
|
|
||||||
|
from spotdl.download import Track
|
||||||
|
|||||||
66
spotdl/download.py
Normal file
66
spotdl/download.py
Normal file
@@ -0,0 +1,66 @@
|
|||||||
|
import tqdm
|
||||||
|
|
||||||
|
import subprocess
|
||||||
|
import urllib.request
|
||||||
|
|
||||||
|
from spotdl.encode.encoders import EncoderFFmpeg
|
||||||
|
|
||||||
|
CHUNK_SIZE= 16 * 1024
|
||||||
|
HEADERS = [('Range', 'bytes=0-'),]
|
||||||
|
|
||||||
|
class Track:
|
||||||
|
def __init__(self, metadata):
|
||||||
|
self.metadata = metadata
|
||||||
|
self.network_headers = HEADERS
|
||||||
|
self._chunksize = CHUNK_SIZE
|
||||||
|
|
||||||
|
def _make_request(self, url):
|
||||||
|
request = urllib.request.Request(url)
|
||||||
|
for header in self.network_headers:
|
||||||
|
request.add_header(*header)
|
||||||
|
return urllib.request.urlopen(request)
|
||||||
|
|
||||||
|
def _calculate_total_chunks(self, filesize):
|
||||||
|
return (filesize // self._chunksize) + 1
|
||||||
|
|
||||||
|
def download_while_re_encoding(self, path, encoder=EncoderFFmpeg(), show_progress=True):
|
||||||
|
stream = self.metadata["streams"].getbest()
|
||||||
|
total_chunks = self._calculate_total_chunks(stream["filesize"])
|
||||||
|
response = self._make_request(stream["download_url"])
|
||||||
|
process = encoder.re_encode_from_stdin(
|
||||||
|
stream["encoding"],
|
||||||
|
path
|
||||||
|
)
|
||||||
|
for _ in tqdm.trange(total_chunks):
|
||||||
|
chunk = response.read(self._chunksize)
|
||||||
|
process.stdin.write(chunk)
|
||||||
|
|
||||||
|
process.stdin.close()
|
||||||
|
process.wait()
|
||||||
|
|
||||||
|
def download(self, path, show_progress=True):
|
||||||
|
stream = self.metadata["streams"].getbest()
|
||||||
|
total_chunks = self._calculate_total_chunks(stream["filesize"])
|
||||||
|
response = self._make_request(stream["download_url"])
|
||||||
|
with open(path, "wb") as fout:
|
||||||
|
for _ in tqdm.trange(total_chunks):
|
||||||
|
chunk = response.read(self._chunksize)
|
||||||
|
fout.write(chunk)
|
||||||
|
|
||||||
|
def re_encode(self, input_path, target_path, encoder=EncoderFFmpeg(), show_progress=True):
|
||||||
|
stream = self.metadata["streams"].getbest()
|
||||||
|
total_chunks = self._calculate_total_chunks(stream["filesize"])
|
||||||
|
process = encoder.re_encode_from_stdin(
|
||||||
|
stream["encoding"],
|
||||||
|
target_path
|
||||||
|
)
|
||||||
|
with open(input_path, "rb") as fin:
|
||||||
|
for _ in tqdm.trange(total_chunks):
|
||||||
|
chunk = fin.read(self._chunksize)
|
||||||
|
process.stdin.write(chunk)
|
||||||
|
|
||||||
|
process.stdin.close()
|
||||||
|
process.wait()
|
||||||
|
|
||||||
|
def apply_metadata(path):
|
||||||
|
pass
|
||||||
@@ -13,7 +13,7 @@ RULES = {
|
|||||||
"m4a": "-acodec copy",
|
"m4a": "-acodec copy",
|
||||||
"flac": "-codec:a flac -ar 48000",
|
"flac": "-codec:a flac -ar 48000",
|
||||||
},
|
},
|
||||||
"webm": {
|
"opus": {
|
||||||
"mp3": "-codec:a libmp3lame -ar 48000",
|
"mp3": "-codec:a libmp3lame -ar 48000",
|
||||||
"m4a": "-cutoff 20000 -codec:a aac -ar 48000",
|
"m4a": "-cutoff 20000 -codec:a aac -ar 48000",
|
||||||
"flac": "-codec:a flac -ar 48000",
|
"flac": "-codec:a flac -ar 48000",
|
||||||
@@ -99,6 +99,6 @@ class EncoderFFmpeg(EncoderBase):
|
|||||||
output_file,
|
output_file,
|
||||||
input_encoding=input_encoding,
|
input_encoding=input_encoding,
|
||||||
)
|
)
|
||||||
process = subprocess.Popen(encode_command)
|
process = subprocess.Popen(encode_command, stdin=subprocess.PIPE)
|
||||||
return process
|
return process
|
||||||
|
|
||||||
|
|||||||
20
spotdl/helpers.py
Normal file
20
spotdl/helpers.py
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
import subprocess
|
||||||
|
import threading
|
||||||
|
|
||||||
|
|
||||||
|
def download(url, path=".", progress_bar=True, ):
|
||||||
|
command = ("ffmpeg", "-y", "-i", "-", "output.wav")
|
||||||
|
|
||||||
|
content = pytube.YouTube("https://www.youtube.com/watch?v=SE0nYFJ0ZvQ")
|
||||||
|
stream = content.streams[0]
|
||||||
|
response = urllib.request.urlopen(stream.url)
|
||||||
|
|
||||||
|
process = subprocess.Popen(command, stdin=subprocess.PIPE)
|
||||||
|
|
||||||
|
while True:
|
||||||
|
chunk = response.read(16 * 1024)
|
||||||
|
if not chunk:
|
||||||
|
break
|
||||||
|
process.stdin.write(chunk)
|
||||||
|
|
||||||
|
process.stdin.close()
|
||||||
Reference in New Issue
Block a user