#!/usr/bin/env python3 import os import shutil import subprocess import sys import time from datetime import datetime import configparser from pathlib import Path import requests channel_list = [] downloading = {} # Config Settings streamlink_location = "streamlink" download_location = str(f"{Path.home()}/Downloads/Streams/") skip_ads = False def load_config(): pass def write_log(channel): """Writes the latest stdout of a process to log.txt""" with open("log.txt", "a") as log: line = downloading[channel].stdout.readline() if line: log.write(line.decode()) def download_stream(channel): """Downloads a given channel name in its own subprocess""" downloading[channel] = subprocess.Popen( ["dl-stream", "-r", channel], start_new_session=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, ) write_log(channel) def check_system(): """Makes sure everything is place for the script to run""" # TODO: Make it fallback to streamlink if dl-stream not present # Checks if dl-stream is in the systems path if not shutil.which("dl-stream"): sys.exit("ERROR: dl-stream is not found in the systems path!") # Checks if the channel_list exists and if not makes one if not os.path.exists("channel_list.txt"): print("ERROR:'channel_list.txt' does not exist, creating now!") with open("channel_list.txt", "w"): pass # Creates empty file sys.exit("Please populate the channel_list.txt with one channel per line!") def stop_downloads(): """Goes through every process and stops it if running""" print("\nCleaning up...") for name, proc in downloading.items(): proc.terminate() print("Stopping download of " + name) def main(): """Main entry point of the app""" # Grab all the channels from channel_list.txt and put them in a list with open("channel_list.txt", "r") as file: # channel_list = file.readlines() channel_list = [ line for line in file if line.strip() ] # Removes all white spaces per line # Run untill progam is killed while True: # Exits the program if there is no channels to grab if not channel_list: sys.exit("Please populate the channel_list.txt with one channel per line!") print("\n------------------------------------") for channel in channel_list: channel = channel.strip() contents = requests.get("https://www.twitch.tv/" + channel).content.decode( "utf-8" ) if "isLiveBroadcast" in contents: print("\033[1m" + channel + "\033[0m is \033[32mlive\033[0m!") if channel not in downloading: download_stream(channel) else: print(channel + " is already downloading") write_log(channel) else: print("\033[1m" + channel + "\033[0m is \033[31mnot live\033[0m.") if channel in downloading: del downloading[channel] print(channel + " is no longer downloading") time.sleep(1) # Wait one second before going to next channel print( "\n\033[3mLast checked: " + datetime.now().strftime("%H:%M:%S") + "\033[0m" ) print("------------------------------------") time.sleep(60) # Wait 60 Seconds before trying again if __name__ == "__main__": """ This is executed when run from the command line """ try: load_config() check_system() main() finally: stop_downloads()