diff --git a/AlarmClock.py b/AlarmClock.py deleted file mode 100644 index 571b58c..0000000 --- a/AlarmClock.py +++ /dev/null @@ -1,86 +0,0 @@ -""" ----------------------------------------- -Alarm Clock ----------------------------------------- -This is an interesting Command Line Interface (CLI) -Python application for an intermediate-level developer. -People across the globe use alarm clock features in their -devices but this project can be altered in a bit different -manner. Some certain YouTube links can be added to a text -file and the project is programmed in a way that when a user -sets an alarm then the code shall pick a random link from the -video and will start playing the YouTube link. ----------------------------------------- -""" - -import datetime -import os -import time -import random -import webbrowser - -# If video URL file does not exist, create one -if not os.path.isfile("youtube_alarm_videos.txt"): - print('Creating "youtube_alarm_videos.txt"...') - with open("youtube_alarm_videos.txt", "w") as alarm_file: - alarm_file.write("https://www.youtube.com/channel/UCz6SDxk2KQqJAD6Ra_YPm6A") - -def check_alarm_input(alarm_time): - # Checks to see if the user has entered in a valid alarm time - if len(alarm_time) == 1: # [Hour] Format - if alarm_time[0] < 24 and alarm_time[0] >= 0: - return True - if len(alarm_time) == 2: # [Hour:Minute] Format - if alarm_time[0] < 24 and alarm_time[0] >= 0 and \ - alarm_time[1] < 60 and alarm_time[1] >= 0: - return True - elif len(alarm_time) == 3: # [Hour:Minute:Second] Format - if alarm_time[0] < 24 and alarm_time[0] >= 0 and \ - alarm_time[1] < 60 and alarm_time[1] >= 0 and \ - alarm_time[2] < 60 and alarm_time[2] >= 0: - return True - return False - -# Get user input for the alarm time -print("Set a time for the alarm (Ex. 06:30 or 18:30:00)") -while True: - alarm_input = input(">> ") - try: - alarm_time = [int(n) for n in alarm_input.split(":")] - if check_alarm_input(alarm_time): - break - else: - raise ValueError - except ValueError: - print("ERROR: Enter time in HH:MM or HH:MM:SS format") - -# Convert the alarm time from [H:M] or [H:M:S] to seconds -seconds_hms = [3600, 60, 1] # Number of seconds in an Hour, Minute, and Second -alarm_seconds = sum([a*b for a,b in zip(seconds_hms[:len(alarm_time)], alarm_time)]) - -# Get the current time of day in seconds -now = datetime.datetime.now() -current_time_seconds = sum([a*b for a,b in zip(seconds_hms, [now.hour, now.minute, now.second])]) - -# Calculate the number of seconds until alarm goes off -time_diff_seconds = alarm_seconds - current_time_seconds - -# If time difference is negative, set alarm for next day -if time_diff_seconds < 0: - time_diff_seconds += 86400 # number of seconds in a day - -# Display the amount of time until the alarm goes off -print("Alarm set to go off in %s" % datetime.timedelta(seconds=time_diff_seconds)) - -# Sleep until the alarm goes off -time.sleep(time_diff_seconds) - -# Time for the alarm to go off -print("Wake Up!") - -# Load list of possible video URLs -with open("youtube_alarm_videos.txt", "r") as alarm_file: - videos = alarm_file.readlines() - -# Open a random video from the list -webbrowser.open(random.choice(videos)) \ No newline at end of file diff --git a/BinarySearch.py b/BinarySearch.py new file mode 100644 index 0000000..7a85bab --- /dev/null +++ b/BinarySearch.py @@ -0,0 +1,59 @@ +""" +---------------------------------------- +Binary Search Algorithm +---------------------------------------- +The name is evident enough to give an overview of the project. +The program requires you to create a list of numbers between 0 +to whatever range you prefer, with every succeeding number having +a difference of 2 between them. + +When the user inputs a random number to be searched the program b +egins its search by dividing the list into two halves. The first +half is searched for the required number and if found, the other half +is rejected and vice versa. The search continues until the number is +found or the subarray size becomes zero. This Python project idea could +also help you write a program to search an element in the list. +---------------------------------------- +""" + +# iterative implementation of binary search in Python +def binary_search(a_list, item): + a_list = 'path/to/file/or/array' + """ + Performs iterative binary search to find the position of an integer in a given, sorted, list. + a_list -- sorted list of integers + item -- integer you are searching for the position of + """ + first = 0 + last = len(a_list) - 1 + while first <= last: + i = (first + last) / 2 + if a_list[i] == item: + return ' found at position '.format(item=item, i=i) + elif a_list[i] > item: + last = i - 1 + elif a_list[i] < item: + first = i + 1 + else: + return ' not found in the list'.format(item=item) + +# recursive implementation of binary search in Python +def binary_search_recursive(a_list, item): + """ + Performs recursive binary search of an integer in a given, sorted, list. + a_list -- sorted list of integers + item -- integer you are searching for the position of + """ + first = 0 + last = len(a_list) - 1 + if len(a_list) == 0: + return ' was not found in the list'.format(item=item) + else: + i = (first + last) // 2 + if item == a_list[i]: + return ' found'.format(item=item) + else: + if a_list[i] < item: + return binary_search_recursive(a_list[i+1:], item) + else: + return binary_search_recursive(a_list[:i], item) \ No newline at end of file diff --git a/Calculator.py b/Calculator.py deleted file mode 100644 index 0ad8e18..0000000 --- a/Calculator.py +++ /dev/null @@ -1,76 +0,0 @@ -""" ----------------------------------------- -Calculator ----------------------------------------- -Building this project you would learn to design a graphical UI -and make you familiar with a library like Tkinter. This library -enables you to create buttons to perform different operations and -display results on the screen. ----------------------------------------- -""" - -def addition (): - print("Addition") - n = float(input("Enter the number: ")) - t = 0 # Total number enter - ans = 0 - while n != 0: - ans = ans + n - t+=1 - n = float(input("Enter another number (0 to calculate): ")) - return [ans,t] -def subtraction (): - print("Subtraction"); - n = float(input("Enter the number: ")) - t = 0 # Total number enter - sum = 0 - while n != 0: - ans = ans - n - t+=1 - n = float(input("Enter another number (0 to calculate): ")) - return [ans,t] -def multiplication (): - print("Multiplication") - n = float(input("Enter the number: ")) - t = 0 #Total number enter - ans = 1 - while n != 0: - ans = ans * n - t+=1 - n = float(input("Enter another number (0 to calculate): ")) - return [ans,t] -def average(): - an = [] - an = addition() - t = an[1] - a = an[0] - ans = a / t - return [ans,t] -# main... -while True: - list = [] - print(" My first python program!") - print(" Simple Calculator in python by Puranjay Savar Mattas") - print(" Enter 'a' for addition") - print(" Enter 's' for substraction") - print(" Enter 'm' for multiplication") - print(" Enter 'v' for average") - print(" Enter 'q' for quit") - c = input(" ") - if c != 'q': - if c == 'a': - list = addition() - print("Ans = ", list[0], " total inputs ",list[1]) - elif c == 's': - list = subtraction() - print("Ans = ", list[0], " total inputs ",list[1]) - elif c == 'm': - list = multiplication() - print("Ans = ", list[0], " total inputs ",list[1]) - elif c == 'v': - list = average() - print("Ans = ", list[0], " total inputs ",list[1]) - else: - print ("Sorry, invilid character") - else: - break \ No newline at end of file diff --git a/CurrencyConverter.py b/CurrencyConverter.py deleted file mode 100644 index d8e547b..0000000 --- a/CurrencyConverter.py +++ /dev/null @@ -1,46 +0,0 @@ -""" ----------------------------------------- -Currency Converter ----------------------------------------- -This is a straightforward project with a simple GUI. -The name quite evidently describes the role of the -project is to convert currencies from one unit into another. -For example, converting Indian rupee to USD or euro. Tkinter, -the standard Python interface can be used to design and develop -this application. ----------------------------------------- -""" - -import urllib.request -import json - -def currency_converter(currency_from, currency_to, currency_input): - yql_base_url = "https://query.yahooapis.com/v1/public/yql" - yql_query = 'select%20*%20from%20yahoo.finance.xchange%20where%20pair' \ - '%20in%20("'+currency_from+currency_to+'")' - yql_query_url = yql_base_url + "?q=" + yql_query + "&format=json&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys" - try: - yql_response = urllib.request.urlopen(yql_query_url) - try: - json_string = str(yql_response.read()) - json_string = json_string[2:] - json_string = json_string[:-1] - print(json_string) - yql_json = json.loads(json_string) - last_rate = yql_json['query']['results']['rate']['Rate'] - currency_output = currency_input * float(last_rate) - return currency_output - except (ValueError, KeyError, TypeError): - print(yql_query_url) - return "JSON format error" - except IOError as e: - print(str(e)) - -currency_input = 1 - -# currency codes : http://en.wikipedia.org/wiki/ISO_4217 - -currency_from = "USD" -currency_to = "TRY" -rate = currency_converter(currency_from, currency_to, currency_input) -print(rate) \ No newline at end of file diff --git a/DirectoryTreeGenerator.py b/DirectoryTreeGenerator.py deleted file mode 100644 index 4dac858..0000000 --- a/DirectoryTreeGenerator.py +++ /dev/null @@ -1,77 +0,0 @@ -""" ----------------------------------------- -Directory Tree Generator ----------------------------------------- -This project is useful for visualizing the -relationship between files and directories -and making their positioning easy to comprehend. -Python OS library can be used to list the -files and directories within a specific directory. -The excellent frameworks of this project are Docopt -and Argparse. ----------------------------------------- -Library to import for the project: - `pip install walkdir` ----------------------------------------- -""" - -import argparse -import os -from walkdir import filtered_walk - -parser = argparse.ArgumentParser(description='Print the directory-tree code for the LaTeX dirtree package.') -parser.add_argument(dest='path', type=str, help="Root directory of the tree") -parser.add_argument('-d', '--maxDepth', dest='maxDepth', type=int, help="Max depth for tree expansion") -parser.add_argument('-H', '--includeHidden', dest='includeHidden', action='store_true', help='Include hidden files') -parser.add_argument('-S', '--includeSystem', dest='includeSystem', action='store_true', help='Include system files') -system_file_names = [".DS_Store"] - -# Delete trailing / in rootDir which can lead to errors -def delete_trailing_slash(path_name): - while path_name.endswith('/'): - path_name = path_name[:-1] - return path_name - -# Count how many levels deep is the directory with respect to dirRoot -def get_relative_depth(dir_path, level_offset): - return dir_path.count(os.path.sep) - level_offset - -# Escape illegal symbols for LaTeX -def escape_illegal(name): - illegal_char_array = ['\\', '&', '%', '$', '#', '_', '{', '}', '~', '^'] - for char in illegal_char_array: - name = name.replace(char, "\\" + char) - return name -rootDir = delete_trailing_slash(parser.parse_args().path) -includeHidden = parser.parse_args().includeHidden -includeSystem = parser.parse_args().includeSystem -maxDepth = parser.parse_args().maxDepth - -# if the directory exists -if os.path.isdir(rootDir) and os.path.exists(rootDir): - indentChar = " " - - # Depth of the root (i.e. number of "/") - levelOffset = rootDir.count(os.path.sep) - 1 - - # Create filter - excluded_filter = [] - if not includeHidden: - excluded_filter.append(".*") - if not includeSystem: - excluded_filter += system_file_names - print ("\dirtree{%") - for dirName, subdirList, fileList in sorted(filtered_walk(rootDir, depth=maxDepth, excluded_dirs=excluded_filter, - excluded_files=excluded_filter)): - level = get_relative_depth(dirName, levelOffset) - baseName = os.path.basename(dirName) - if level == 1: # for the first level only print the whole path - print(indentChar + "." + str(level) + " {" + escape_illegal(dirName) + "} .") - else: - print(indentChar * level + "." + str(level) + " {" + escape_illegal((os.path.basename(dirName))) + "} .") - level += 1 - for fileName in sorted(fileList): - print(indentChar * level + "." + str(level) + " {" + escape_illegal(fileName) + "} .") - print ("}") -else: - print ("Error: root directory not found") \ No newline at end of file diff --git a/MadLabGenerator.py b/MadLabGenerator.py new file mode 100644 index 0000000..0c017f5 --- /dev/null +++ b/MadLabGenerator.py @@ -0,0 +1,41 @@ +""" +---------------------------------------- +Mad Libs Generator +---------------------------------------- +This python beginner project is a good start for beginner software developers as it has concepts +like strings, variables, and concatenation. Mad Libs Generator teaches to manipulate user-inputted +data as the Mad Libs refer to a series of inputs that a user enters. The input from the user could be +anything from an adjective, a pronoun, or even a verb. After all the inputs are entered the application +takes all the data and arranges it to build a story template. +---------------------------------------- +""" + +# Loop back to this point once code finishes +loop = 1 +while (loop < 10): +# All the questions that the program asks the user + noun = input("Choose a noun: ") + p_noun = input("Choose a plural noun: ") + noun2 = input("Choose a noun: ") + place = input("Name a place: ") + adjective = input("Choose an adjective (Describing word): ") + noun3 = input("Choose a noun: ") +# Displays the story based on the users input + print ("------------------------------------------") + print ("Be kind to your",noun,"- footed", p_noun) + print ("For a duck may be somebody's", noun2,",") + print ("Be kind to your",p_noun,"in",place) + print ("Where the weather is always",adjective,".") + print () + print ("You may think that is this the",noun3,",") + print ("Well it is.") + print ("------------------------------------------") +# Loop back to "loop = 1" + continue_program = input("Do you want to continue(Y/N): ") + if (continue_program == "n"): + break + elif (continue_program == "y"): + loop = loop + 1 + else: + print("Wrong input!") + break \ No newline at end of file diff --git a/NumberGuessing.py b/NumberGuessing.py new file mode 100644 index 0000000..c891ce3 --- /dev/null +++ b/NumberGuessing.py @@ -0,0 +1,63 @@ +""" +---------------------------------------- +Number Guessing Game +---------------------------------------- +This project is an exciting fun game for beginners to build up. The program generates +a random number from 1 to 10, or 1 to 100 any range that is specified and the user must +guess the number after a hint from the computer. Every time a user’s guess is wrong they +are prompted with more hints to make it easier for them to guess the number but at the +cost of reducing the score. The clue any math clue like multiples, divisible, greater or +smaller, or a combination of all. + +The program also requires functions to check if an actual number is entered by the user +or not, to compare the input number with the actual number, to find the difference between +the two numbers. +---------------------------------------- +""" + +import random + +attempts_list = [] +def show_score(): + if len(attempts_list) <= 0: + print("There is currently no high score, it's yours for the taking!") + else: + print("The current high score is {} attempts".format(min(attempts_list))) +def start_game(): + random_number = int(random.randint(1, 10)) + print("Hello traveler! Welcome to the game of guesses!") + player_name = input("What is your name? ") + wanna_play = input("Hi, {}, would you like to play the guessing game? (Enter Yes/No) ".format(player_name)) + # Where the show_score function USED to be + attempts = 0 + show_score() + while wanna_play.lower() == "yes": + try: + guess = input("Pick a number between 1 and 10 ") + if int(guess) < 1 or int(guess) > 10: + raise ValueError("Please guess a number within the given range") + if int(guess) == random_number: + print("Nice! You got it!") + attempts += 1 + attempts_list.append(attempts) + print("It took you {} attempts".format(attempts)) + play_again = input("Would you like to play again? (Enter Yes/No) ") + attempts = 0 + show_score() + random_number = int(random.randint(1, 10)) + if play_again.lower() == "no": + print("That's cool, have a good one!") + break + elif int(guess) > random_number: + print("It's lower") + attempts += 1 + elif int(guess) < random_number: + print("It's higher") + attempts += 1 + except ValueError as err: + print("Oh no!, that is not a valid value. Try again...") + print("({})".format(err)) + else: + print("That's cool, have a good one!") +if __name__ == '__main__': + start_game() \ No newline at end of file diff --git a/Order Of Programs(BP).MD b/Order Of Programs(BP).MD new file mode 100644 index 0000000..34352e3 --- /dev/null +++ b/Order Of Programs(BP).MD @@ -0,0 +1,9 @@ +# Beginner Projects: + +| Serial No. | Program Name | +|------------|--------------| +|1 | [MadLabGenerator](https://github.com/psavarmattas/Python-Projects/blob/master/MadLabGenerator.py) | +|2 | [NumberGuessing](https://github.com/psavarmattas/Python-Projects/blob/master/NumberGuessing.py) | +|3 | [RockPaperScisors](https://github.com/psavarmattas/Python-Projects/blob/master/RockPaperScissors.py) | +|4 | [WebsiteBlocker](https://github.com/psavarmattas/Python-Projects/blob/master/WebsiteBlocker.py) | +|5 | [BinarySearch](https://github.com/psavarmattas/Python-Projects/blob/master/BinarySearch.py) | \ No newline at end of file diff --git a/Order Of Programs(IP).MD b/Order Of Programs(IP).MD deleted file mode 100644 index ff7325f..0000000 --- a/Order Of Programs(IP).MD +++ /dev/null @@ -1,9 +0,0 @@ -# Intermediate Projects: - -| Serial No. | Program Name | -|------------|--------------| -|1 | [Calculator](https://github.com/psavarmattas/Python-Projects/blob/master/Calculator.py) | -|2 | [AlarmClock](https://github.com/psavarmattas/Python-Projects/blob/master/AlarmClock.py) & [youtube_alarm_videos](https://github.com/psavarmattas/Python-Projects/blob/master/youtube_alarm_videos.txt) | -|3 | [TikTacToe](https://github.com/psavarmattas/Python-Projects/blob/master/TikTacToe.py) | -|4 | [DirectoryTreeGenerator](https://github.com/psavarmattas/Python-Projects/blob/master/DirectoryTreeGenerator.py) | -|5 | [CurrencyConverter](https://github.com/psavarmattas/Python-Projects/blob/master/CurrencyConverter.py) | \ No newline at end of file diff --git a/RockPaperScissors.py b/RockPaperScissors.py new file mode 100644 index 0000000..03fb549 --- /dev/null +++ b/RockPaperScissors.py @@ -0,0 +1,53 @@ +""" +---------------------------------------- +Rock Paper Scissors +---------------------------------------- +This program or a mini-game is designed when you don’t have anyone +to play or you are under lockdown alone. There are a number of functions +that this program requires so let us have an overview of each. + +1. A random function: to generate rock, paper, or scissors. +2. Valid function: to check the validity of the move. +3. Result function: to declare the winner of the round. +4. Scorekeeper: to keep track of the score. + +The program requires the user to make the first move before it makes one +the move. Once the move is validated the input is evaluated, the input entered +could be a string or an alphabet. After evaluating the input string a winner +is decided by the result function and the score of the round is updated by the +scorekeeper function. +---------------------------------------- +""" + +import random +import os +import re + +os.system('cls' if os.name=='nt' else 'clear') +while (1 < 2): + print ("\n") + print ("Rock, Paper, Scissors - Shoot!") + userChoice = input("Choose your weapon [R]ock, [P]aper, or [S]cissors: ") + if not re.match("[SsRrPp]", userChoice): + print ("Please choose a letter:") + print ("[R]ock, [S]cissors or [P]aper.") + continue + # Echo the user's choice + print ("You chose: " + userChoice) + choices = ['R', 'P', 'S'] + opponenetChoice = random.choice(choices) + print ("I chose: " + opponenetChoice) + if opponenetChoice == str.upper(userChoice): + print ("Tie! ") + # if opponenetChoice == str("R") and str.upper(userChoice) == "P" + elif opponenetChoice == 'R' and userChoice.upper() == 'S': + print ("Scissors beats rock, I win! ") + continue + elif opponenetChoice == 'S' and userChoice.upper() == 'P': + print ("Scissors beats paper! I win! ") + continue + elif opponenetChoice == 'P' and userChoice.upper() == 'R': + print ("Paper beat rock, I win! ") + continue + else: + print ("You win!") \ No newline at end of file diff --git a/TikTacToe.py b/TikTacToe.py deleted file mode 100644 index 0a4e2d0..0000000 --- a/TikTacToe.py +++ /dev/null @@ -1,134 +0,0 @@ -""" ----------------------------------------- -Tic Tac Toe ----------------------------------------- -This game is very popular amongst all of us a -nd even fun to build as a Python project. I am -pretty sure most of us know how to play it but -let me give a quick brush up. - -It is a two-player game and consists of a nine-square -grid. Each player chooses their move and with O or X -and marks their square one at each chance. The player -who succeeds in making their marks all in one line whether -diagonally, horizontally, or vertically wins. The challenge -for the other player is to block the game for their opponent -and also to make their chain. - -For building this project in Python who can use the Pygame -Python library that is loaded with all computer graphics and sounds. ----------------------------------------- -""" - -import random -import sys - -board=[i for i in range(0,9)] -player, computer = '','' - -# Corners, Center and Others, respectively -moves=((1,7,3,9),(5,),(2,4,6,8)) - -# Winner combinations -winners=((0,1,2),(3,4,5),(6,7,8),(0,3,6),(1,4,7),(2,5,8),(0,4,8),(2,4,6)) - -# Table -tab=range(1,10) -def print_board(): - x=1 - for i in board: - end = ' | ' - if x%3 == 0: - end = ' \n' - if i != 1: end+='---------\n'; - char=' ' - if i in ('X','O'): char=i; - x+=1 - print(char,end=end) - -def select_char(): - chars=('X','O') - if random.randint(0,1) == 0: - return chars[::-1] - return chars - -def can_move(brd, player, move): - if move in tab and brd[move-1] == move-1: - return True - return False - -def can_win(brd, player, move): - places=[] - x=0 - for i in brd: - if i == player: places.append(x); - x+=1 - win=True - for tup in winners: - win=True - for ix in tup: - if brd[ix] != player: - win=False - break - if win == True: - break - return win - -def make_move(brd, player, move, undo=False): - if can_move(brd, player, move): - brd[move-1] = player - win=can_win(brd, player, move) - if undo: - brd[move-1] = move-1 - return (True, win) - return (False, False) - -# AI goes here -def computer_move(): - move=-1 - - # If I can win, others do not matter. - for i in range(1,10): - if make_move(board, computer, i, True)[1]: - move=i - break - if move == -1: - - # If player can win, block him. - for i in range(1,10): - if make_move(board, player, i, True)[1]: - move=i - break - - if move == -1: - # Otherwise, try to take one of desired places. - for tup in moves: - for mv in tup: - if move == -1 and can_move(board, computer, mv): - move=mv - break - return make_move(board, computer, move) - -def space_exist(): - return board.count('X') + board.count('O') != 9 -player, computer = select_char() -print('Player is [%s] and computer is [%s]' % (player, computer)) -result='%%% Deuce ! %%%' -while space_exist(): - print_board() - print('#Make your move ! [1-9] : ', end='') - move = int(input()) - moved, won = make_move(board, player, move) - if not moved: - print(' >> Invalid number ! Try again !') - continue - - if won: - result='*** Congratulations ! You won ! ***' - break - elif computer_move()[1]: - result='=== You lose ! ==' - break; - -print_board() -print(result) \ No newline at end of file diff --git a/WebsiteBlocker.py b/WebsiteBlocker.py new file mode 100644 index 0000000..3acc883 --- /dev/null +++ b/WebsiteBlocker.py @@ -0,0 +1,43 @@ +""" +---------------------------------------- +Website Blocker +---------------------------------------- +We all know while surfing through the net many unwanted sites +popup to distract us. This project comes at help in such cases +as it can be built up to block certain websites from opening. +The program is beneficial for people who get easily distracted +to switch to social media sites while into something serious. +---------------------------------------- +""" + +import time +from datetime import datetime as dt + + +hosts_path = r"/etc/hosts" # r is for raw string +hosts_temp = "hosts" +redirect = "127.0.0.1" +web_sites_list = ["www.facebook.com", "facebook.com"] # users can modify the list of the websites they want to block + +while True: + if dt(dt.now().year, dt.now().month, dt.now().day, 9) < dt.now() < dt(dt.now().year, dt.now().month, dt.now().day,22): + print("Working hours") + with open(hosts_path, "r+") as file: + content = file.read() + for website in web_sites_list: + if website in content: + pass + else: + file.write(redirect+" "+website+"\n") + else: + print("Fun time") + with open(hosts_path, "r+") as file: + content = file.readlines() + file.seek(0) # reset the pointer to the top of the text file + for line in content: + # here comes the tricky line, basically we overwrite the whole file + if not any(website in line for website in web_sites_list): + file.write(line) + # do nothing otherwise + file.truncate() # this line is used to delete the trailing lines (that contain DNS) + time.sleep(5) \ No newline at end of file diff --git a/youtube_alarm_videos.txt b/youtube_alarm_videos.txt deleted file mode 100644 index 28b37d1..0000000 --- a/youtube_alarm_videos.txt +++ /dev/null @@ -1 +0,0 @@ -https://www.youtube.com/channel/UCz6SDxk2KQqJAD6Ra_YPm6A \ No newline at end of file