You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
86 lines
3.4 KiB
Python
86 lines
3.4 KiB
Python
11 months ago
|
import tkinter as tk
|
||
|
from tkinter import ttk
|
||
|
import tkinter.simpledialog as sd
|
||
|
import time
|
||
|
import os
|
||
|
from utils import search_youtube, download_audio
|
||
|
|
||
|
class UIEngine:
|
||
|
def __init__(self, db):
|
||
|
self.db = db
|
||
|
self.root = tk.Tk()
|
||
|
self.root.title("celaigia")
|
||
|
self.root.geometry("400x300") # Set a fixed size
|
||
|
|
||
|
self.status_label = tk.Label(self.root, text="Ready")
|
||
|
self.status_label.pack()
|
||
|
|
||
|
self.search_frame = ttk.Frame(self.root)
|
||
|
self.search_frame.pack()
|
||
|
|
||
|
self.search_status_label = tk.Label(self.search_frame, text="Enter search query:")
|
||
|
self.search_status_label.grid(row=0, column=0)
|
||
|
self.search_entry = tk.Entry(self.search_frame)
|
||
|
self.search_entry.grid(row=0, column=1)
|
||
|
self.search_button = tk.Button(self.search_frame, text="Search", command=lambda: self.search_and_display())
|
||
|
self.search_button.grid(row=0, column=2)
|
||
|
|
||
|
self.results_frame = ttk.Frame(self.root)
|
||
|
self.results_frame.pack()
|
||
|
|
||
|
self.download_status_label = tk.Label(self.root, text="Enter URL to download:")
|
||
|
self.download_status_label.pack()
|
||
|
self.download_entry = tk.Entry(self.root)
|
||
|
self.download_entry.pack()
|
||
|
self.download_button = tk.Button(self.root, text="Download", command=lambda: self.handle_download(self.download_entry.get()))
|
||
|
self.download_button.pack()
|
||
|
|
||
|
def search_and_display(self):
|
||
|
self.set_status("searching")
|
||
|
query = self.search_entry.get()
|
||
|
# Clear the existing results
|
||
|
for widget in self.results_frame.winfo_children():
|
||
|
widget.destroy()
|
||
|
results = search_youtube(query)
|
||
|
self.display_results(results)
|
||
|
self.set_status("Enter search query or select item to download")
|
||
|
|
||
|
def set_status(self, status):
|
||
|
self.status_label.config(text=status)
|
||
|
self.root.update() # Force GUI update
|
||
|
|
||
|
def display_results(self, results):
|
||
|
for i, result in enumerate(results):
|
||
|
result_button = ttk.Button(self.results_frame, text=result['title'], command=lambda url=result['webpage_url'], filename=result['title']: self.handle_download(url, filename))
|
||
|
result_button.pack()
|
||
|
|
||
|
def handle_download(self, url, filename):
|
||
|
|
||
|
if self.db.downloadable(url, filename):
|
||
|
self.set_status("Downloading...")
|
||
|
success = download_audio(url, self.db.base_path)
|
||
|
if success:
|
||
|
self.set_status("Download completed, adding to db")
|
||
|
self.prompt_user_for_details(url, filename)
|
||
|
self.set_status("Enter search query or select item to download")
|
||
|
|
||
|
# Modify the prompt_user_for_details method
|
||
|
def prompt_user_for_details(self,url, filename):
|
||
|
title = sd.askstring("Enter Title", "Enter Title:", initialvalue=filename)
|
||
|
artist = sd.askstring("Enter Artist", "Enter Artist:")
|
||
|
tags = sd.askstring("Enter Tags", "Enter Tags (comma separated):")
|
||
|
entry = {
|
||
|
"id": url.split('https://www.youtube.com/watch?v=')[-1].strip(),
|
||
|
"title": title.strip(),
|
||
|
"artist": artist.strip(),
|
||
|
"filename": filename.strip(),
|
||
|
"tags": [tag.strip() for tag in tags.split(",")] if tags else [],
|
||
|
"timestamp": time.time()
|
||
|
}
|
||
|
self.add_to_db(entry)
|
||
|
|
||
|
def add_to_db(self, entry):
|
||
|
self.db.add_entry(entry)
|
||
|
|
||
|
def run(self):
|
||
|
self.root.mainloop()
|