You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

61 lines
2.0 KiB
Python

from urllib.parse import urlparse, quote
from pathlib import Path
import os.path
import os
import configparser
import subprocess
import datetime
import time
import sys
def read_config():
config = configparser.RawConfigParser()
config.read("config.ini")
return config
def get_mixes(mixes_dir):
mixes = []
for path in Path(mixes_dir).rglob('url.txt'):
with open(path, "r") as fd:
first_line = fd.readline()
first_line = first_line.strip()
url = quote(urlparse(first_line).geturl(), safe=":/") # do a sanity url parse and quote
mixes.append((path.parent, url))
return mixes
def download_channel(target_directory, channel_url, options="", update_mpd=False, mpd_root=""):
mpd_update_options = []
if update_mpd:
mpd_update_options = ["--exec", "mpc update \"{}\"".format(str(target_directory).replace(mpd_root, "", 1).lstrip("/"))]
p = subprocess.Popen(["youtube-dl", *options.split(" "), *mpd_update_options, channel_url], cwd=target_directory)
p.wait()
def lock_downloader():
if os.path.isfile("lockfile"):
return False
else:
with open("lockfile", "w") as fd:
print("Creating lockfile")
timestamp = int(datetime.datetime.now().timestamp())
fd.write(str(timestamp) + "\n")
return True
def unlock_downloader():
os.remove("lockfile")
lock_success = lock_downloader()
if not lock_success:
with open("lockfile", "r") as fd:
timestamp = fd.readline().strip()
time = datetime.datetime.fromtimestamp(int(timestamp))
print("Downloader already running. It was started at {}".format(time))
sys.exit(1)
config = read_config()
mixes = get_mixes(config["general"]["mixes_dir"])
for folder,url in mixes:
download_channel(folder, url, config["youtube-dl"]["options"], update_mpd=config["mpd"]["update"], mpd_root=config["mpd"]["mpd_root"])
print("Download operation finished. Releasing lockfile now.")
unlock_downloader()