##// END OF EJS Templates
If thread is specified in the post template, do not load it again
If thread is specified in the post template, do not load it again

File last commit:

r1532:320de1f1 merge decentral
r1670:c9facaf1 default
Show More
downloaders.py
79 lines | 2.2 KiB | text/x-python | PythonLexer
neko259
Download webm videos from youtube
r1328 import os
import re
neko259
Download attachments to tmp file, not into memory
r1394 from django.core.files.uploadedfile import SimpleUploadedFile, \
TemporaryUploadedFile
neko259
Download webm videos from youtube
r1328 from pytube import YouTube
import requests
from boards.utils import validate_file_size
YOUTUBE_VIDEO_FORMAT = 'webm'
HTTP_RESULT_OK = 200
HEADER_CONTENT_LENGTH = 'content-length'
HEADER_CONTENT_TYPE = 'content-type'
neko259
Download attachments to tmp file, not into memory
r1394 FILE_DOWNLOAD_CHUNK_BYTES = 200000
neko259
Download webm videos from youtube
r1328
neko259
Youtube links can contain a minus
r1527 YOUTUBE_URL = re.compile(r'https?://((www\.)?youtube\.com/watch\?v=|youtu.be/)[-\w]+')
neko259
Download webm videos from youtube
r1328
class Downloader:
@staticmethod
def handles(url: str) -> bool:
return False
@staticmethod
def download(url: str):
# Verify content headers
response_head = requests.head(url, verify=False)
content_type = response_head.headers[HEADER_CONTENT_TYPE].split(';')[0]
length_header = response_head.headers.get(HEADER_CONTENT_LENGTH)
if length_header:
length = int(length_header)
validate_file_size(length)
# Get the actual content into memory
response = requests.get(url, verify=False, stream=True)
# Download file, stop if the size exceeds limit
size = 0
neko259
Download attachments to tmp file, not into memory
r1394
# Set a dummy file name that will be replaced
# anyway, just keep the valid extension
filename = 'file.' + content_type.split('/')[1]
file = TemporaryUploadedFile(filename, content_type, 0, None, None)
neko259
Download webm videos from youtube
r1328 for chunk in response.iter_content(FILE_DOWNLOAD_CHUNK_BYTES):
size += len(chunk)
validate_file_size(size)
neko259
Download attachments to tmp file, not into memory
r1394 file.write(chunk)
neko259
Download webm videos from youtube
r1328
neko259
Download attachments to tmp file, not into memory
r1394 if response.status_code == HTTP_RESULT_OK:
return file
neko259
Download webm videos from youtube
r1328
neko259
Download attached filed to the post during sync
r1511 def download(url):
for downloader in Downloader.__subclasses__():
if downloader.handles(url):
return downloader.download(url)
# If nobody of the specific downloaders handles this, use generic
# one
return Downloader.download(url)
neko259
Download webm videos from youtube
r1328 class YouTubeDownloader(Downloader):
@staticmethod
def download(url: str):
yt = YouTube()
yt.from_url(url)
videos = yt.filter(YOUTUBE_VIDEO_FORMAT)
if len(videos) > 0:
video = videos[0]
neko259
Download video from youtube directly, use pytube only for getting the link
r1334 return Downloader.download(video.url)
neko259
Download webm videos from youtube
r1328
@staticmethod
def handles(url: str) -> bool:
return YOUTUBE_URL.match(url)
neko259
Added image aliases to upload the same images (like "fake" or "gtfo")
r1500