From 2dc8ac2af75f8e05d640a890250f1c688fd18ac9 Mon Sep 17 00:00:00 2001 From: Rain Date: Wed, 3 Apr 2024 18:00:04 -0400 Subject: [PATCH] Refactored & kills subprocess on exit --- main.py | 100 ++++++++++++++++++++++++++++++++++---------------------- 1 file changed, 61 insertions(+), 39 deletions(-) diff --git a/main.py b/main.py index eb81a52..d4809d2 100755 --- a/main.py +++ b/main.py @@ -13,6 +13,7 @@ downloading = {} 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: @@ -20,6 +21,7 @@ def write_log(channel): 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, @@ -29,53 +31,73 @@ def download_stream(channel): write_log(channel) -# TODO: Clean things up intp their own method +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 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!") -# Checks if the channel_list exists and if not makes one -if os.path.exists("channel_list.txt"): +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 -else: - print("ERROR:'channel_list.txt' does not exist, creating now!") - with open("channel_list.txt", "w") as file: - pass # Writes Nothing - sys.exit("Please populate the channel_list.txt with one channel per line!") -# Run untill progam is killed -# TODO: Make it so user can kill gracefully -# TODO: This includes all the subprocess too! -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) + # 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(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 + 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: + check_system() + main() + finally: + stop_downloads()