From 38f55b5b5650150db139d3150d9ba2269baac1f7 Mon Sep 17 00:00:00 2001 From: agropunx Date: Sun, 31 Dec 2023 16:48:54 +0000 Subject: [PATCH] merge --- README.md | 13 +- __init__.py | 12 ++ app.py | 9 ++ celaigia.py | 301 ---------------------------------------- config.py | 11 ++ data/songs.json | 6 - database.py | 37 +++++ fonts/MonoLisa-Bold.ttf | Bin 84252 -> 0 bytes logo.ico | Bin 3774 -> 0 bytes music/index.json | 102 ++++++++++++++ requirements.txt | 7 +- ui.py | 137 ++++++++++++++++++ utils.py | 28 ++++ 13 files changed, 344 insertions(+), 319 deletions(-) create mode 100644 __init__.py create mode 100644 app.py delete mode 100644 celaigia.py create mode 100644 config.py delete mode 100644 data/songs.json create mode 100644 database.py delete mode 100644 fonts/MonoLisa-Bold.ttf delete mode 100644 logo.ico create mode 100644 music/index.json create mode 100644 ui.py create mode 100644 utils.py diff --git a/README.md b/README.md index f6daa92..28c102d 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,9 @@ -# Celaigia - -ascolti lo stesso pezzo a ripetizione su youtube? provi antipatia per gesu? usa celaigia! - -celaigia è un player musicale scritto con python (pygame & dearpygui mostly). -Oltre alle classiche funzionalità audio player, con celaigia puoi cercare e scaricare le tue canzoncine preferite direttamente da youtube (yt-dlp). +Welcome to celaigia +an app to gently query youtube music, and possibly download only if you don't have already locally +# TODO +- explore the db +- nicer ui +- contenerize +- mobile diff --git a/__init__.py b/__init__.py new file mode 100644 index 0000000..94cbff7 --- /dev/null +++ b/__init__.py @@ -0,0 +1,12 @@ +import importlib +import config +importlib.reload(config) +import utils +importlib.reload(utils) +import database +importlib.reload(database) +import ui +importlib.reload(ui) +import app +importlib.reload(app) + diff --git a/app.py b/app.py new file mode 100644 index 0000000..a8a509d --- /dev/null +++ b/app.py @@ -0,0 +1,9 @@ +from config import music_path +from ui import UIEngine +from database import Database + +if __name__ == "__main__": + # Add your main code here + db = Database(base_path=music_path) + ui = UIEngine(db) + ui.run() diff --git a/celaigia.py b/celaigia.py deleted file mode 100644 index 8507c3d..0000000 --- a/celaigia.py +++ /dev/null @@ -1,301 +0,0 @@ -import pygame -import threading -import time -import random -import os -import atexit -import ntpath -import json -import webbrowser -import subprocess - -import dearpygui.dearpygui as dpg - -from mutagen.mp3 import MP3 -from tkinter import Tk,filedialog, simpledialog, Button, OptionMenu, N, S , E, W, Label, StringVar -import pytube - -dpg.create_context() -dpg.create_viewport(title="celaigia, stai senza pensieri",large_icon="logo.ico",small_icon="logo.ico") -pygame.mixer.init() - -#https://www.redhat.com/sysadmin/write-GUI-applications-python -global state -state=None - -_SONG_FILE = "data/songs.json" -_NUM_YT_SEARCH_RESULTS = 5 -_DEFAULT_DOWNLOAD_PATH = 'data/music' -_DEFAULT_MUSIC_VOLUME = 0.5 -pygame.mixer.music.set_volume(_DEFAULT_MUSIC_VOLUME) - -def bash(cmd): - subprocess.call(['/bin/bash', '-c', cmd]) - -def string_sanitizer(s: str)->str: - s = ''.join(filter(lambda x: x in '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ ', s)) - return s.replace(' ','_') - -def ismusic(filename: str)->bool: - return filename.split('.')[-1] in ['mp3', 'ogg', 'flac', 'wav'] - -def update_volume(sender, app_data): - pygame.mixer.music.set_volume(app_data / 100.0) - -def load_database(): - songs = json.load(open(_SONG_FILE, "r+"))["songs"] - for filename in songs: - dpg.add_button( - label=f"{ntpath.basename(filename)}", - callback=play, - width=-1, - height=25, - user_data=filename.replace("\\", "/"), - parent="list" - ) - dpg.add_spacer(height=2, parent="list") - - -def update_database(filename: str): - data = json.load(open(_SONG_FILE, "r+")) - if filename not in data["songs"]: - data["songs"] += [filename] - dpg.add_button( - label=f"{ntpath.basename(filename)}", - callback=play, - width=-1, - height=25, - user_data=filename.replace("\\", "/"), - parent="list" - ) - dpg.add_spacer(height=2, parent="list") - json.dump(data, open(_SONG_FILE, "r+"), indent=4) - -def update_slider(): - global state - while pygame.mixer.music.get_busy(): - dpg.configure_item(item="pos",default_value=pygame.mixer.music.get_pos()/1000) - time.sleep(0.7) - state=None - dpg.configure_item("cstate",default_value=f"State: None") - dpg.configure_item("csong",default_value="Now Playing : ") - dpg.configure_item("play",label="Play") - dpg.configure_item(item="pos",max_value=100) - dpg.configure_item(item="pos",default_value=0) - -def play(sender, app_data, user_data): - global state - if user_data: - pygame.mixer.music.load(user_data) - audio = MP3(user_data) - dpg.configure_item(item="pos",max_value=audio.info.length) - pygame.mixer.music.play() - thread=threading.Thread(target=update_slider,daemon=False).start() - if pygame.mixer.music.get_busy(): - dpg.configure_item("play",label="Pause") - state="playing" - dpg.configure_item("cstate",default_value=f"State: Playing") - dpg.configure_item("csong",default_value=f"Now Playing : {ntpath.basename(user_data)}") - -def play_pause(): - global state - if state=="playing": - state="paused" - pygame.mixer.music.pause() - dpg.configure_item("play",label="Play") - dpg.configure_item("cstate",default_value=f"State: Paused") - elif state=="paused": - state="playing" - pygame.mixer.music.unpause() - dpg.configure_item("play",label="Pause") - dpg.configure_item("cstate",default_value=f"State: Playing") - else: - song = json.load(open(_SONG_FILE, "r"))["songs"] - if song: - song=random.choice(song) - pygame.mixer.music.load(song) - pygame.mixer.music.play() - thread=threading.Thread(target=update_slider,daemon=False).start() - dpg.configure_item("play",label="Pause") - if pygame.mixer.music.get_busy(): - audio = MP3(song) - dpg.configure_item(item="pos",max_value=audio.info.length) - state="playing" - dpg.configure_item("csong",default_value=f"Now Playing : {ntpath.basename(song)}") - dpg.configure_item("cstate",default_value=f"State: Playing") - -def stop(): - global state - pygame.mixer.music.stop() - state=None - -def add_files(): - data=json.load(open(_SONG_FILE,"r")) - root=Tk() - root.withdraw() - filename=filedialog.askopenfilename(filetypes=[("Music Files", ("*.mp3","*.wav","*.ogg"))]) - root.quit() - if filename.endswith(".mp3" or ".wav" or ".ogg"): - if filename not in data["songs"]: - update_database(filename) - #dpg.add_button(label=f"{ntpath.basename(filename)}",callback=play,width=-1,height=25,,parent="list") - #dpg.add_spacer(height=2,parent="list") - -def add_folder(): - data=json.load(open(_SONG_FILE,"r")) - root=Tk() - root.withdraw() - folder=filedialog.askdirectory() - root.quit() - for filename in os.listdir(folder): - if filename.endswith(".mp3" or ".wav" or ".ogg"): - if filename not in data["songs"]: - update_database(os.path.join(folder,filename).replace("\\","/")) - #dpg.add_button(label=f"{ntpath.basename(filename)}",callback=play,width=-1,height=25,user_data=os.path.join(folder,filename).replace("\\","/"),parent="list") - #dpg.add_spacer(height=2,parent="list") - -def search(sender, app_data, user_data): - songs = json.load(open(_SONG_FILE, "r"))["songs"] - dpg.delete_item("list", children_only=True) - for index, song in enumerate(songs): - if app_data in song.lower(): - dpg.add_button(label=f"{ntpath.basename(song)}", callback=play,width=-1, height=25, user_data=song, parent="list") - dpg.add_spacer(height=2,parent="list") - -def add_download_choices(sender, app_data, user_data)->None: - yt_urls = {string_sanitizer(r.title): r.watch_url for r in pytube.Search(app_data).results[:_NUM_YT_SEARCH_RESULTS]} - - for url_key in yt_urls: - dpg.add_button(label=url_key, tag=url_key, callback= download ,width=-1, height=25, user_data = (url_key,yt_urls), parent="sidebar") - dpg.add_spacer(height=2,parent="sidebar") - -def download(sender, app_data, user_data): - - url_key, yt_urls = user_data - url = yt_urls[url_key] - for tmp_url_key in yt_urls: - dpg.delete_item(tmp_url_key) - video_file = f'{_DEFAULT_DOWNLOAD_PATH}/{url_key}.mp4' - audio_file = f"{video_file[:-4]}.mp3" - stream = pytube.YouTube(url).streams.filter(only_audio=True).first() - stream.download(filename=video_file, skip_existing=True) - bash(f"ffmpeg -i {video_file} -vn -acodec mp3 -y {audio_file}") - bash(f"rm {video_file}") - update_database(audio_file) - -def removeall(): - songs = json.load(open(_SONG_FILE, "r")) - songs["songs"].clear() - json.dump(songs,open(_SONG_FILE, "w"),indent=4) - dpg.delete_item("list", children_only=True) - load_database() - -with dpg.theme(tag="base"): - with dpg.theme_component(): - dpg.add_theme_color(dpg.mvThemeCol_Button, (130, 142, 250)) - dpg.add_theme_color(dpg.mvThemeCol_ButtonActive, (137, 142, 255, 95)) - dpg.add_theme_color(dpg.mvThemeCol_ButtonHovered, (137, 142, 255)) - dpg.add_theme_style(dpg.mvStyleVar_FrameRounding, 3) - dpg.add_theme_style(dpg.mvStyleVar_ChildRounding, 4) - dpg.add_theme_style(dpg.mvStyleVar_FramePadding, 4, 4) - dpg.add_theme_style(dpg.mvStyleVar_WindowRounding, 4, 4) - dpg.add_theme_style(dpg.mvStyleVar_WindowTitleAlign, 0.50, 0.50) - dpg.add_theme_style(dpg.mvStyleVar_WindowBorderSize,0) - dpg.add_theme_style(dpg.mvStyleVar_WindowPadding,10,14) - dpg.add_theme_color(dpg.mvThemeCol_ChildBg, (25, 25, 25)) - dpg.add_theme_color(dpg.mvThemeCol_Border, (0,0,0,0)) - dpg.add_theme_color(dpg.mvThemeCol_ScrollbarBg, (0,0,0,0)) - dpg.add_theme_color(dpg.mvThemeCol_TitleBgActive, (130, 142, 250)) - dpg.add_theme_color(dpg.mvThemeCol_CheckMark, (221, 166, 185)) - dpg.add_theme_color(dpg.mvThemeCol_FrameBgHovered, (172, 174, 197)) - -with dpg.theme(tag="slider_thin"): - with dpg.theme_component(): - dpg.add_theme_color(dpg.mvThemeCol_FrameBgActive, (130, 142, 250,99)) - dpg.add_theme_color(dpg.mvThemeCol_FrameBgHovered, (130, 142, 250,99)) - dpg.add_theme_color(dpg.mvThemeCol_SliderGrabActive, (255, 255, 255)) - dpg.add_theme_color(dpg.mvThemeCol_SliderGrab, (255, 255, 255)) - dpg.add_theme_color(dpg.mvThemeCol_FrameBg, (130, 142, 250,99)) - dpg.add_theme_style(dpg.mvStyleVar_GrabRounding, 3) - dpg.add_theme_style(dpg.mvStyleVar_GrabMinSize, 30) - -with dpg.theme(tag="slider"): - with dpg.theme_component(): - dpg.add_theme_color(dpg.mvThemeCol_FrameBgActive, (130, 142, 250,99)) - dpg.add_theme_color(dpg.mvThemeCol_FrameBgHovered, (130, 142, 250,99)) - dpg.add_theme_color(dpg.mvThemeCol_SliderGrabActive, (255, 255, 255)) - dpg.add_theme_color(dpg.mvThemeCol_SliderGrab, (255, 255, 255)) - dpg.add_theme_color(dpg.mvThemeCol_FrameBg, (130, 142, 250,99)) - dpg.add_theme_style(dpg.mvStyleVar_GrabRounding, 3) - dpg.add_theme_style(dpg.mvStyleVar_GrabMinSize, 30) - -with dpg.theme(tag="songs"): - with dpg.theme_component(): - dpg.add_theme_style(dpg.mvStyleVar_FrameRounding, 2) - dpg.add_theme_color(dpg.mvThemeCol_Button, (89, 89, 144,40)) - dpg.add_theme_color(dpg.mvThemeCol_ButtonHovered, (0,0,0,0)) - -with dpg.font_registry(): - monobold = dpg.add_font("fonts/MonoLisa-Bold.ttf", 12) - head = dpg.add_font("fonts/MonoLisa-Bold.ttf", 15) - -with dpg.window(tag="main",label="window title"): - with dpg.child_window(autosize_x=True,height=45,no_scrollbar=True): - dpg.add_text(f"Now Playing : ",tag="csong") - dpg.add_spacer(height=2) - - with dpg.group(horizontal=True): - with dpg.child_window(width=250, tag="sidebar"): - dpg.add_text("Celaigia",color=(137, 142, 255)) - dpg.add_text("phuturemachine") - dpg.add_spacer(height=2) - dpg.add_button(label="Support",width=-1,height=23,callback=lambda:webbrowser.open(url="gitgitigitigiti")) - dpg.add_spacer(height=5) - dpg.add_separator() - dpg.add_spacer(height=5) - dpg.add_button(label="Add File",width=-1,height=28,callback=add_files) - dpg.add_button(label="Add Folder",width=-1,height=28,callback=add_folder) - dpg.add_button(label="Remove All Songs",width=-1,height=28,callback=removeall) - dpg.add_spacer(height=5) - dpg.add_separator() - dpg.add_spacer(height=5) - dpg.add_text(f"State: {state}",tag="cstate") - dpg.add_spacer(height=5) - dpg.add_separator() - dpg.add_input_text(hint="search youtube",width=-1,callback=add_download_choices, on_enter=True) - dpg.add_spacer(height=5) - - with dpg.child_window(autosize_x=True,border=False): - with dpg.child_window(autosize_x=True,height=50,no_scrollbar=True): - with dpg.group(horizontal=True): - dpg.add_button(label="Play",width=65,height=30,tag="play",callback=play_pause) - dpg.add_button(label="Stop",callback=stop,width=65,height=30) - dpg.add_slider_float(tag="volume", width=120,height=15,pos=(160,19),format="%.0f%.0%",default_value=_DEFAULT_MUSIC_VOLUME * 100,callback=update_volume) - dpg.add_slider_float(tag="pos",width=-1,pos=(295,19),format="") - - with dpg.child_window(autosize_x=True,delay_search=True): - with dpg.group(horizontal=True,tag="query"): - dpg.add_input_text(hint="search for a song locally",width=-1,callback=search) - dpg.add_spacer(height=5) - with dpg.child_window(autosize_x=True,delay_search=True,tag="list"): - load_database() - - dpg.bind_item_theme("volume","slider_thin") - dpg.bind_item_theme("pos","slider") - dpg.bind_item_theme("list","songs") - -dpg.bind_theme("base") -dpg.bind_font(monobold) - -def safe_exit(): - pygame.mixer.music.stop() - pygame.quit() - -atexit.register(safe_exit) - -dpg.setup_dearpygui() -dpg.show_viewport() -dpg.set_primary_window("main",True) -dpg.maximize_viewport() -dpg.start_dearpygui() -dpg.destroy_context() diff --git a/config.py b/config.py new file mode 100644 index 0000000..931daa1 --- /dev/null +++ b/config.py @@ -0,0 +1,11 @@ +music_path = "./music" + +yt_dlp_opts = { + 'format': 'bestaudio/best', + 'default_search': 'ytsearch5', + 'postprocessors': [{ + 'key': 'FFmpegExtractAudio', + 'preferredcodec': 'mp3', + 'preferredquality': '192', + }], +} \ No newline at end of file diff --git a/data/songs.json b/data/songs.json deleted file mode 100644 index f802461..0000000 --- a/data/songs.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "songs": [ - "data/music/Mac_Miller__Self_Care.mp3", - "data/music/COLLE_DER_FOMENTO__Il_cielo_su_Roma.mp3" - ] -} \ No newline at end of file diff --git a/database.py b/database.py new file mode 100644 index 0000000..0627e0b --- /dev/null +++ b/database.py @@ -0,0 +1,37 @@ +# Updated database.py +import json +import datetime + +class Database: + def __init__(self, base_path): + self.base_path = base_path + self.file_path = f'{base_path}/index.json' + try: + with open(self.file_path, 'r') as file: + self.data = json.load(file) + except FileNotFoundError: + self.data = [] + + def add_entry(self, entry): + entry['timestamp'] = datetime.datetime.now().strftime('%d/%m/%Y') + self.data.append(entry) + with open(self.file_path, 'w') as file: + json.dump(self.data, file, indent=4) + + def downloadable(self, url, title): + idx = url.split('https://www.youtube.com/watch?v=')[-1] + for entry in self.data: + if entry['id'] == idx or entry['title'] == title: + return False + return True + + def get_all_entries(self): + return self.data + + def update_entry(self, entry_id, new_data): + for entry in self.data: + if entry['id'] == entry_id: + entry.update(new_data) + with open(self.file_path, 'w') as file: + json.dump(self.data, file, indent=4) + return diff --git a/fonts/MonoLisa-Bold.ttf b/fonts/MonoLisa-Bold.ttf deleted file mode 100644 index 385908d751ebf95ff046287c75ef3dd3e282f692..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 84252 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