view dlfilesinchannel.py @ 133:0d8eabdd12ab default tip

create: write H:MM:SS timestamps, add option to fill with gaussian-blur instead of black many albums are longer than one hour so writing H:MM:SS is a necessity. if anything there will just be verbose info that isn't important for my use-case. however the gaussian-blur is simply broken. It works, and it plays locally just fine, but YouTube in particular elongates the video to fit the full width. I'm not entirely sure why it does this, but it makes it useless and ugly.
author Paper <paper@tflc.us>
date Sat, 03 Jan 2026 20:25:38 -0500
parents eac6dae753ca
children
line wrap: on
line source

import math
import requests
import shutil
import os
import time
import urllib.parse
import re
ID = "ID"
CHN_ID = "CHN_ID"

def find_urls(s):
    urllist = []
    for findall in re.findall(r"""http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+""", s):
        urllist.append(findall.split("<")[0].split(">")[-1])
    return urllist

def download_file(url, local_filename):
    with requests.get(url, stream=True) as r:
        with open(local_filename, 'wb') as f:
            shutil.copyfileobj(r.raw, f)
    return


session = requests.Session()

session.headers = {
  'authority': 'discord.com',
  'x-super-properties': 'eyJvcyI6IldpbmRvd3MiLCJicm93c2VyIjoiRGlzY29yZCBDbGllbnQiLCJyZWxlYXNlX2NoYW5uZWwiOiJzdGFibGUiLCJjbGllbnRfdmVyc2lvbiI6IjEuMC45MDAyIiwib3NfdmVyc2lvbiI6IjEwLjAuMTkwNDMiLCJvc19hcmNoIjoieDY0Iiwic3lzdGVtX2xvY2FsZSI6ImVuLVVTIiwiY2xpZW50X2J1aWxkX251bWJlciI6OTQyOTQsImNsaWVudF9ldmVudF9zb3VyY2UiOm51bGx9',
  'authorization': 'TOKEN',
  'x-debug-options': 'bugReporterEnabled',
  'accept-language': 'en-US',
  'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) discord/1.0.9002 Chrome/83.0.4103.122 Electron/9.3.5 Safari/537.36',
  'accept': '*/*',
  'sec-fetch-site': 'same-origin',
  'sec-fetch-mode': 'cors',
  'sec-fetch-dest': 'empty',
}

response = session.get("https://discord.com/api/v9/guilds/%s/messages/search?has=link&channel_id=%s&include_nsfw=true" % (ID, CHN_ID)).json()

for done in range(math.ceil(int(response["total_results"])/25)):
    currentresponse = session.get("https://discord.com/api/v9/guilds/%s/messages/search?has=link&channel_id=%s&include_nsfw=true&offset=%d" % (ID, CHN_ID, done*25)).json()
    for i in currentresponse["messages"]:
        for x in find_urls(i[0]["content"]):
            if urllib.parse.urlparse(x).netloc.find("tenor.com") != -1:
                continue
            try:
                headresponse = session.head(x)
            except Exception as e:
                print("failed to download " + x.split("/")[-1] + " " + type(e).__name__)
                time.sleep(1)
                continue
            if headresponse.headers["Content-Type"] == "video/mp4":
                if os.path.exists(x.split("/")[-1]):
                    if not os.path.getsize(x.split("/")[-1]) < int(headresponse.headers["Content-Length"]):
                        print(x.split("/")[-1] + " already downloaded!")
                        continue
                try:
                    download_file(x, x.split("/")[-1])
                    print(x.split("/")[-1] + " downloaded!")
                except Exception as e:
                    print("failed to download " + x.split("/")[-1] + " " + type(e).__name__)
                    continue
            time.sleep(1)
        for x in i[0]["attachments"]:
            if os.path.exists(x["filename"]):
                if not os.path.getsize(x["filename"]) < x["size"]:
                    print(x["filename"] + " already downloaded!")
                    continue
            try:
                download_file(x["url"], x["filename"])
                print(x["filename"] + " downloaded!")
            except Exception as e:
                print(e)
            time.sleep(1)