Compare commits
8 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 00e369677f | |||
| c3e1607ca6 | |||
| 59428e7679 | |||
| 33c4698286 | |||
| 3ac4c34d73 | |||
| 88e303cbe4 | |||
| c13855fadd | |||
| 2b12684960 |
@@ -6,7 +6,7 @@
|
|||||||
<b>SpotiFLAC</b> allows you to download Spotify tracks in true FLAC format through services like Tidal, Amazon Music, and Deezer <code>(via Lucida)</code>, as well as Qobuz <code>(via SquidWTF)</code>.
|
<b>SpotiFLAC</b> allows you to download Spotify tracks in true FLAC format through services like Tidal, Amazon Music, and Deezer <code>(via Lucida)</code>, as well as Qobuz <code>(via SquidWTF)</code>.
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
### [Download](https://github.com/afkarxyz/SpotiFLAC/releases/download/v2.7/SpotiFLAC.exe)
|
### [Download](https://github.com/afkarxyz/SpotiFLAC/releases/download/v3.1/SpotiFLAC.exe)
|
||||||
|
|
||||||
#
|
#
|
||||||
|
|
||||||
|
|||||||
+7
-5
@@ -550,7 +550,7 @@ class QobuzRegionComboBox(QComboBox):
|
|||||||
class SpotiFLACGUI(QWidget):
|
class SpotiFLACGUI(QWidget):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
super().__init__()
|
super().__init__()
|
||||||
self.current_version = "2.8"
|
self.current_version = "3.2"
|
||||||
self.tracks = []
|
self.tracks = []
|
||||||
self.reset_state()
|
self.reset_state()
|
||||||
|
|
||||||
@@ -954,7 +954,7 @@ class SpotiFLACGUI(QWidget):
|
|||||||
sections = [
|
sections = [
|
||||||
("Check for Updates", "https://github.com/afkarxyz/SpotiFLAC/releases"),
|
("Check for Updates", "https://github.com/afkarxyz/SpotiFLAC/releases"),
|
||||||
("Report an Issue", "https://github.com/afkarxyz/SpotiFLAC/issues"),
|
("Report an Issue", "https://github.com/afkarxyz/SpotiFLAC/issues"),
|
||||||
("Lucida Site", "https://lucida.to/stats")
|
("Lucida Status", "https://status.lucida.to")
|
||||||
]
|
]
|
||||||
|
|
||||||
for title, url in sections:
|
for title, url in sections:
|
||||||
@@ -995,7 +995,7 @@ class SpotiFLACGUI(QWidget):
|
|||||||
spacer = QSpacerItem(20, 6, QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Fixed)
|
spacer = QSpacerItem(20, 6, QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Fixed)
|
||||||
about_layout.addItem(spacer)
|
about_layout.addItem(spacer)
|
||||||
|
|
||||||
footer_label = QLabel("v2.8 | May 2025")
|
footer_label = QLabel("v3.2 | June 2025")
|
||||||
footer_label.setStyleSheet("font-size: 12px; margin-top: 10px;")
|
footer_label.setStyleSheet("font-size: 12px; margin-top: 10px;")
|
||||||
about_layout.addWidget(footer_label, alignment=Qt.AlignmentFlag.AlignCenter)
|
about_layout.addWidget(footer_label, alignment=Qt.AlignmentFlag.AlignCenter)
|
||||||
|
|
||||||
@@ -1355,7 +1355,8 @@ class SpotiFLACGUI(QWidget):
|
|||||||
|
|
||||||
def download_tracks(self, indices):
|
def download_tracks(self, indices):
|
||||||
self.log_output.clear()
|
self.log_output.clear()
|
||||||
outpath = self.output_dir.text()
|
raw_outpath = self.output_dir.text().strip()
|
||||||
|
outpath = os.path.normpath(raw_outpath)
|
||||||
if not os.path.exists(outpath):
|
if not os.path.exists(outpath):
|
||||||
self.log_output.append('Warning: Invalid output directory.')
|
self.log_output.append('Warning: Invalid output directory.')
|
||||||
return
|
return
|
||||||
@@ -1363,7 +1364,8 @@ class SpotiFLACGUI(QWidget):
|
|||||||
tracks_to_download = self.tracks if self.is_single_track else [self.tracks[i] for i in indices]
|
tracks_to_download = self.tracks if self.is_single_track else [self.tracks[i] for i in indices]
|
||||||
|
|
||||||
if self.is_album or self.is_playlist:
|
if self.is_album or self.is_playlist:
|
||||||
folder_name = re.sub(r'[<>:"/\\|?*]', '_', self.album_or_playlist_name)
|
name = self.album_or_playlist_name.strip()
|
||||||
|
folder_name = re.sub(r'[<>:"/\\|?*]', '_', name)
|
||||||
outpath = os.path.join(outpath, folder_name)
|
outpath = os.path.join(outpath, folder_name)
|
||||||
os.makedirs(outpath, exist_ok=True)
|
os.makedirs(outpath, exist_ok=True)
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -32,7 +32,7 @@ def generate_totp(
|
|||||||
counter * 30_000,
|
counter * 30_000,
|
||||||
)
|
)
|
||||||
|
|
||||||
token_url = 'https://open.spotify.com/get_access_token'
|
token_url = 'https://open.spotify.com/api/token'
|
||||||
playlist_base_url = 'https://api.spotify.com/v1/playlists/{}'
|
playlist_base_url = 'https://api.spotify.com/v1/playlists/{}'
|
||||||
album_base_url = 'https://api.spotify.com/v1/albums/{}'
|
album_base_url = 'https://api.spotify.com/v1/albums/{}'
|
||||||
track_base_url = 'https://api.spotify.com/v1/tracks/{}'
|
track_base_url = 'https://api.spotify.com/v1/tracks/{}'
|
||||||
|
|||||||
+17
-5
@@ -352,7 +352,9 @@ class SquidWTFDownloader:
|
|||||||
items = data.get("data", {}).get("tracks", {}).get("items", [])
|
items = data.get("data", {}).get("tracks", {}).get("items", [])
|
||||||
priority = {24: 1, 16: 2}
|
priority = {24: 1, 16: 2}
|
||||||
for track in items:
|
for track in items:
|
||||||
if track.get("isrc") == isrc:
|
track_isrc = track.get("isrc", "").upper()
|
||||||
|
search_isrc = isrc.upper()
|
||||||
|
if track_isrc == search_isrc:
|
||||||
current_prio = priority.get(track.get("maximum_bit_depth"), 3)
|
current_prio = priority.get(track.get("maximum_bit_depth"), 3)
|
||||||
if selected_track is None or current_prio < priority.get(selected_track.get("maximum_bit_depth"), 3):
|
if selected_track is None or current_prio < priority.get(selected_track.get("maximum_bit_depth"), 3):
|
||||||
selected_track = track
|
selected_track = track
|
||||||
@@ -646,7 +648,7 @@ class TidalDownloader:
|
|||||||
return result
|
return result
|
||||||
|
|
||||||
if isrc:
|
if isrc:
|
||||||
isrc_items = [item for item in result["items"] if item.get("isrc") == isrc]
|
isrc_items = [item for item in result["items"] if item.get("isrc", "").upper() == isrc.upper()]
|
||||||
|
|
||||||
if len(isrc_items) > 1:
|
if len(isrc_items) > 1:
|
||||||
hires_items = []
|
hires_items = []
|
||||||
@@ -764,8 +766,18 @@ class TidalDownloader:
|
|||||||
if copyright_info:
|
if copyright_info:
|
||||||
audio["COPYRIGHT"] = copyright_info
|
audio["COPYRIGHT"] = copyright_info
|
||||||
|
|
||||||
if album_info.get("releaseDate"):
|
release_date = None
|
||||||
audio["DATE"] = album_info["releaseDate"][:4]
|
if search_info and search_info.get("streamStartDate"):
|
||||||
|
release_date = search_info["streamStartDate"]
|
||||||
|
elif track_info.get("streamStartDate"):
|
||||||
|
release_date = track_info["streamStartDate"]
|
||||||
|
|
||||||
|
if release_date:
|
||||||
|
if "T" in release_date:
|
||||||
|
date_part = release_date.split("T")[0]
|
||||||
|
audio["DATE"] = date_part
|
||||||
|
else:
|
||||||
|
audio["DATE"] = release_date
|
||||||
|
|
||||||
if track_info.get("genre"):
|
if track_info.get("genre"):
|
||||||
audio["GENRE"] = track_info["genre"]
|
audio["GENRE"] = track_info["genre"]
|
||||||
@@ -1014,7 +1026,7 @@ async def main():
|
|||||||
print("\n\n=== SquidWTFDownloader ===")
|
print("\n\n=== SquidWTFDownloader ===")
|
||||||
squid = SquidWTFDownloader(region="us")
|
squid = SquidWTFDownloader(region="us")
|
||||||
|
|
||||||
isrc = "USUM72409273"
|
isrc = "USAT22409172"
|
||||||
output_dir = "."
|
output_dir = "."
|
||||||
|
|
||||||
try:
|
try:
|
||||||
|
|||||||
+1
-1
@@ -1,3 +1,3 @@
|
|||||||
{
|
{
|
||||||
"version": "2.7"
|
"version": "3.1"
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user