diff --git a/bot.py b/bot.py index be9688e..fdac8f8 100644 --- a/bot.py +++ b/bot.py @@ -36,7 +36,7 @@ import spotipy import tiktoken from discord.ext import commands, tasks from spotipy.oauth2 import SpotifyClientCredentials - +from flask import jsonify import yt_dlp from spotify_dl import spotify from spotify_dl import youtube as youtube_download @@ -71,6 +71,7 @@ MUZYKA_MOJEGO_LUDU_PLAJLISTA = 30 FILE_SERVICE_ADDRESS = "http://192.168.1.15:5000" GET_MP3 = "/mp3" +SEND_MP3 = "/update_mp3" # *=========================================== Platform Specific Predefines @@ -162,19 +163,52 @@ logger.addHandler(handler) random.seed() logger.debug(platform) logger.info("Playlist generation") + # *=========================================== Load Data files + +class MusicFileList(object): +# The `MusicFileList` class manages a list of music files, refreshing the list by connecting to a +# file service or scanning a local directory if the service is unavailable. + def __init__(self, uplogger) -> None: + self.music_file_list = [] + self.file_service_active = False + self.logger = uplogger + self.logger.info("Created Playlist organizer class") + + def refresh_file_list(self): + """ + The `refresh_file_list` function attempts to connect to a file service to retrieve a list of music + files, and if unsuccessful, it populates the list by scanning a local directory for .mp3 files. + """ + try: + self.logger.info("Attempt to connect to file service") + response = requests.get(f'{FILE_SERVICE_ADDRESS}{GET_MP3}',timeout=360) + self.music_file_list = response.json()["music_file_list"] + self.file_service_active = True + except requests.exceptions.RequestException as e: + for mp3_item in Path.glob(Path(MUSIC_FOLDER), "**/*.mp3"): + temp_music_file = mp3_item.as_posix() + if platform == "win32": + temp_music_file = temp_music_file.replace("/", "\\") + self.music_file_list.append(temp_music_file) + self.file_service_active = False + self.logger.error(e.strerror) + self.logger.error("Service Unavailable") + def get_file_list(self): + """ + The `get_file_list` function returns the list of music files stored in the object. + :return: The `music_file_list` attribute is being returned. + """ + return self.music_file_list + def update_file_list(self,item): + self.music_file_list.append(item) + data = jsonify({"item" : item}) + requests.post(f'{FILE_SERVICE_ADDRESS}{GET_MP3}', data, timeout = 360) + + music_file_list = [] -try: - logger.info("Attempt to connect to file service") - response = requests.get(f'{FILE_SERVICE_ADDRESS}{GET_MP3}',timeout=360) - music_file_list = response.json()["music_file_list"] -except: - for mp3_item in Path.glob(Path(MUSIC_FOLDER), "**/*.mp3"): - temp_music_file = mp3_item.as_posix() - if platform == "win32": - temp_music_file = temp_music_file.replace("/", "\\") - music_file_list.append(temp_music_file) - logger.error("Service Unavailable") +music_file_list = MusicFileList(logger) +music_file_list.refresh_file_list() logger.info("Playlist generation done") logger.info("Loading GPT settings") @@ -460,8 +494,8 @@ async def play(ctx, zamawial=None, arg=None): zamawial = MUZYKA["requester"].pop() logger.info("Muzyka z listy zamówień") else: - index = random.randint(0, len(music_file_list) - 1) - file_to_play = music_file_list[index] + index = random.randint(0, len(music_file_list.get_file_list()) - 1) + file_to_play = music_file_list.get_file_list()[index] logger.info("Muzyka losowo") logger.info(file_to_play) @@ -567,7 +601,7 @@ async def check_data(): await channel.send(message) # trunk-ignore(codespell/misspelled) # TODO: dlaczego sie tu wypierdala - if os.path.getsize(LOGFILE) > 600000: + if os.path.getsize(LOGFILE) > 6000000: shutil.copyfile(LOGFILE, f"{LOGSTORE}discord{datetime.now()}") logger.info("Log rollover") handler.doRollover() @@ -958,7 +992,7 @@ async def wyszukaj(ctx, how_many=0, slowa_kluczowe=None): word_list = ctx.message.content.split() logger.info("Wyszukuje") search_weight = [] - for _ in range(len(music_file_list)): + for _ in range(len(music_file_list.get_file_list())): search_weight.append((0, "")) time_start = datetime.now() @@ -970,7 +1004,7 @@ async def wyszukaj(ctx, how_many=0, slowa_kluczowe=None): token_weight = len(word) logger.info("Słowo kluczowe: %s", word) itr = 0 - async for file in async_iterator_generator(music_file_list): + async for file in async_iterator_generator(music_file_list.get_file_list()): file = file.split(SEPARATOR_FILE_PATH) char_remove = [ @@ -1016,7 +1050,7 @@ async def wyszukaj(ctx, how_many=0, slowa_kluczowe=None): search_weight[itr][0] + (token_weight + (pingu**1.5) / pattern_len) / matched_times ) - search_weight[itr] = temp_weight, music_file_list[itr] + search_weight[itr] = temp_weight, music_file_list.get_file_list()[itr] matched_times += 1 itr += 1 @@ -1111,7 +1145,7 @@ async def dej_co_ze_spotifaja(ctx): + ".mp3", ) MUZYKA["requester"].insert(0, ctx.author) - music_file_list.append(file) + music_file_list.update_file_list(file) await ctx.send( f"Dodałem do listy {dir_path}{file['artist']} - + {file['name']}.mp3" ) @@ -1144,7 +1178,7 @@ async def dej_co_z_jutuba(ctx): for file_iter in files: global MUZYKA # pylint: disable=global-variable-not-assigned MUZYKA["queue"].insert(0, file_iter) - music_file_list.append(file_iter) + music_file_list.update_file_list(file_iter) MUZYKA["requester"].insert(0, ctx.author) await ctx.send(f"Dodałem do listy {file_iter}") logger.info("Jutub udany") diff --git a/file_webservice/conjurer_musician.py b/file_webservice/conjurer_musician.py index 5088ae3..100f7be 100644 --- a/file_webservice/conjurer_musician.py +++ b/file_webservice/conjurer_musician.py @@ -1,6 +1,7 @@ from pathlib import Path from platform import uname from sys import platform +import json from flask import Flask, jsonify, request import uuid @@ -42,6 +43,14 @@ app = Flask(__name__) def get_music_list(): return jsonify({'music_file_list':music_file_list}) +#TODO: Przyjecie informacji o zmianie i dodanie pliku saute +@app.route('/update_mp3', methods=['POST']) +def update_music_list(): + record = json.loads(request.data) + print(record) + music_file_list.appemd(record["item"]) + + if __name__=='__main__': app.run(debug=True, host="0.0.0.0") @@ -49,6 +58,4 @@ if __name__=='__main__': #TODO: Informacja o zmianie i update -#TODO: Odpowiedz na zapytanie - -#TODO: Przyjecie informacji o zmianie i dodanie pliku saute +#TODO: Move download Youtube i Spotify tuta j \ No newline at end of file