Compare commits

..

3 Commits

Author SHA1 Message Date
afkarxyz d6abe2bae3 Update v2.0 2025-03-02 14:48:15 +07:00
afkarxyz 7b858dd0ce Update v2.0 2025-03-02 14:47:55 +07:00
afkarxyz cfeb9a2ef2 Update v1.9 2025-03-02 14:05:17 +07:00
3 changed files with 61 additions and 10 deletions
+7 -4
View File
@@ -1,8 +1,8 @@
import sys import sys
import os import os
import requests
import time import time
from datetime import datetime from datetime import datetime
import requests
from pathlib import Path from pathlib import Path
from packaging import version from packaging import version
from PyQt6.QtWidgets import (QApplication, QMainWindow, QWidget, QVBoxLayout, from PyQt6.QtWidgets import (QApplication, QMainWindow, QWidget, QVBoxLayout,
@@ -130,6 +130,9 @@ class DownloaderWorker(QThread):
time_diff = current_time - self.last_update_time time_diff = current_time - self.last_update_time
if time_diff > 0: if time_diff > 0:
speed = (downloaded_size - self.last_downloaded_size) / time_diff speed = (downloaded_size - self.last_downloaded_size) / time_diff
if downloaded_size == 0 and total_size == 0:
status = "Preparing metadata..."
else:
status = f"Downloading... {self.format_size(downloaded_size)}/{self.format_size(total_size)} | {self.format_speed(speed)}" status = f"Downloading... {self.format_size(downloaded_size)}/{self.format_size(total_size)} | {self.format_speed(speed)}"
self.status.emit(status) self.status.emit(status)
@@ -303,7 +306,7 @@ class UpdateDialog(QDialog):
class SpotiFlacGUI(QMainWindow): class SpotiFlacGUI(QMainWindow):
def __init__(self): def __init__(self):
super().__init__() super().__init__()
self.current_version = "1.9" self.current_version = "2.0"
self.settings = QSettings('SpotiFlac', 'Settings') self.settings = QSettings('SpotiFlac', 'Settings')
self.setWindowTitle("SpotiFLAC") self.setWindowTitle("SpotiFLAC")
self.check_for_updates = self.settings.value('check_for_updates', True, type=bool) self.check_for_updates = self.settings.value('check_for_updates', True, type=bool)
@@ -362,7 +365,7 @@ class SpotiFlacGUI(QMainWindow):
self.fallback_checkbox.setChecked(fallback) self.fallback_checkbox.setChecked(fallback)
for i in range(self.service_combo.count()): for i in range(self.service_combo.count()):
if self.service_combo.itemData(i) == service: if self.service_combo.itemData(i, Qt.ItemDataRole.UserRole + 1) == service:
self.service_combo.setCurrentIndex(i) self.service_combo.setCurrentIndex(i)
break break
@@ -374,7 +377,7 @@ class SpotiFlacGUI(QMainWindow):
self.fallback_checkbox.stateChanged.connect( self.fallback_checkbox.stateChanged.connect(
lambda x: self.settings.setValue('fallback', bool(x))) lambda x: self.settings.setValue('fallback', bool(x)))
self.service_combo.currentIndexChanged.connect( self.service_combo.currentIndexChanged.connect(
lambda i: self.settings.setValue('service', self.service_combo.itemData(i))) lambda i: self.settings.setValue('service', self.service_combo.itemData(i, Qt.ItemDataRole.UserRole + 1)))
self.format_title_artist.toggled.connect( self.format_title_artist.toggled.connect(
lambda x: self.settings.setValue('format', 'title_artist' if x else 'artist_title')) lambda x: self.settings.setValue('format', 'title_artist' if x else 'artist_title'))
self.dir_input.textChanged.connect( self.dir_input.textChanged.connect(
+51 -3
View File
@@ -101,10 +101,31 @@ class TrackDownloader:
print("Waiting for track processing to complete") print("Waiting for track processing to complete")
while True: while True:
completion_response = self.client.get(completion_url, headers=self.headers).json() completion_response = self.client.get(completion_url, headers=self.headers).json()
if completion_response["status"] == "completed":
status = completion_response["status"]
if status == "completed":
print("Processing completed: 100%")
break break
elif completion_response["status"] == "error": elif status == "error":
raise Exception(f"API request failed: {completion_response.get('message', 'Unknown error')}") raise Exception(f"API request failed: {completion_response.get('message', 'Unknown error')}")
else:
progress = completion_response.get("progress", {})
if progress:
current = progress.get("current", 0)
total = progress.get("total", 100)
percent = int((current / total) * 100) if total > 0 else 0
action = progress.get("action", "Processing")
print(f"Progress: {percent}% - {action} ({current}/{total})")
if action.lower() == "metadata":
if self.progress_callback:
self.progress_callback(0, 0)
else:
print(f"Status: {status} - Waiting for progress information...")
if status.lower() == "metadata":
if self.progress_callback:
self.progress_callback(0, 0)
time.sleep(1) time.sleep(1)
download_url = f"https://{server}.{self.base_domain}/api/fetch/request/{handoff}/download" download_url = f"https://{server}.{self.base_domain}/api/fetch/request/{handoff}/download"
@@ -118,16 +139,33 @@ class TrackDownloader:
try: try:
with open(file_path, 'wb') as file: with open(file_path, 'wb') as file:
start_time = time.time()
last_update_time = start_time
for chunk in response.iter_content(chunk_size=8192): for chunk in response.iter_content(chunk_size=8192):
if chunk: if chunk:
file.write(chunk) file.write(chunk)
downloaded_size += len(chunk) downloaded_size += len(chunk)
current_time = time.time()
if current_time - last_update_time >= 1:
if total_size > 0:
progress_percent = (downloaded_size / total_size) * 100
elapsed_time = current_time - start_time
speed = downloaded_size / (1024 * 1024 * elapsed_time) if elapsed_time > 0 else 0
print(f"Download progress: {progress_percent:.2f}% ({downloaded_size}/{total_size}) - {speed:.2f} MB/s")
else:
print(f"Downloaded {downloaded_size / (1024 * 1024):.2f} MB")
last_update_time = current_time
if self.progress_callback: if self.progress_callback:
self.progress_callback(downloaded_size, total_size) self.progress_callback(downloaded_size, total_size)
if downloaded_size == 0: if downloaded_size == 0:
raise Exception("No data received from server") raise Exception("No data received from server")
print(f"Download completed: {file_path}")
return file_path return file_path
except Exception as e: except Exception as e:
@@ -144,10 +182,20 @@ async def main():
track_id = "2plbrEY59IikOBgBGLjaoe" track_id = "2plbrEY59IikOBgBGLjaoe"
service = "amazon" service = "amazon"
def progress_update(current, total):
if total > 0:
percent = (current / total) * 100
print(f"\rDownload progress: {percent:.2f}% ({current}/{total})", end="")
downloader.set_progress_callback(progress_update)
try: try:
print(f"Getting track info for ID: {track_id} from {service}")
metadata = await downloader.get_track_info(track_id, service) metadata = await downloader.get_track_info(track_id, service)
print(f"Track info received: {metadata['title']} by {metadata['artists']}")
downloaded_file = downloader.download(metadata, output_dir) downloaded_file = downloader.download(metadata, output_dir)
print(f"File downloaded successfully: {downloaded_file}") print(f"\nFile downloaded successfully: {downloaded_file}")
except Exception as e: except Exception as e:
print(f"An error occurred: {str(e)}") print(f"An error occurred: {str(e)}")
+1 -1
View File
@@ -1,3 +1,3 @@
{ {
"version": "1.8" "version": "1.9"
} }