Added tools for reading and writing WOBUZZM3U and made the sorting parameters human readable.
This commit is contained in:
parent
f7995aee9e
commit
9e20e21e6f
5 changed files with 219 additions and 40 deletions
|
@ -5,7 +5,10 @@ import threading
|
|||
|
||||
from PyQt6.QtCore import Qt
|
||||
from PyQt6.QtWidgets import QAbstractItemView
|
||||
from reactivex.observable.case import case_
|
||||
|
||||
from .track import Track, TrackMetadata
|
||||
from ..wobuzzm3u import WobuzzM3U, WBZM3UData
|
||||
|
||||
|
||||
class Playlist:
|
||||
|
@ -22,14 +25,13 @@ class Playlist:
|
|||
# no other playlist can be created using the same name
|
||||
self.app.utils.unique_names.append(self.title)
|
||||
|
||||
# the number is the index of the header section,
|
||||
# the bool is the sorting order (True = ascending, False = descending)
|
||||
self.sorting: list[tuple[int, bool]] = [
|
||||
(0, True),
|
||||
(1, True),
|
||||
(2, True),
|
||||
(3, True),
|
||||
(4, True)
|
||||
# sort order
|
||||
self.sorting: list[WBZM3UData.SortOrder] = [
|
||||
WBZM3UData.SortOrder(WBZM3UData.SortOrder.track_title, True),
|
||||
WBZM3UData.SortOrder(WBZM3UData.SortOrder.track_artist, True),
|
||||
WBZM3UData.SortOrder(WBZM3UData.SortOrder.track_album, True),
|
||||
WBZM3UData.SortOrder(WBZM3UData.SortOrder.track_genre, True),
|
||||
WBZM3UData.SortOrder(WBZM3UData.SortOrder.custom_sorting, True)
|
||||
]
|
||||
self.tracks: list[Track] = []
|
||||
self.current_track_index = 0
|
||||
|
@ -160,37 +162,39 @@ class Playlist:
|
|||
lambda: i
|
||||
)
|
||||
|
||||
wbzm3u = WobuzzM3U(self.path)
|
||||
track_metadata = TrackMetadata() # cached track metadata from WOBUZZM3U
|
||||
|
||||
while i < num_lines:
|
||||
line = lines[i]
|
||||
|
||||
if line.startswith("#"): # comments and EXTM3U/WOBUZZM3U
|
||||
if line.startswith("#SORT: "): # sort
|
||||
sort_line = line[6:] # delete "#SORT: " from the line
|
||||
line_data = wbzm3u.parse_line(line)
|
||||
|
||||
sorting = sort_line.split(", ") # split into the sort column specifier and the sort order
|
||||
# e.g. ["0", "True"]
|
||||
if line_data is None:
|
||||
i += 1
|
||||
|
||||
continue
|
||||
|
||||
if line_data.is_comment: # comments and EXTM3U/WOBUZZM3U
|
||||
if isinstance(line_data, WBZM3UData.SortOrder): # sort
|
||||
del self.sorting[0] # delete first sort so the length stays at 6
|
||||
|
||||
# convert these from strings back to int and bool and append them to the sorting
|
||||
self.sorting.append((int(sorting[0]), sorting[1] == "True"))
|
||||
self.sorting.append(line_data)
|
||||
|
||||
elif line.startswith("#TRACK_TITLE: "):
|
||||
track_metadata.title = line[14:]
|
||||
if isinstance(line_data, WBZM3UData.TrackMetadata.TrackTitle):
|
||||
track_metadata.title = line_data
|
||||
|
||||
elif line.startswith("#TRACK_ARTIST: "):
|
||||
track_metadata.artist = line[15:]
|
||||
if isinstance(line_data, WBZM3UData.TrackMetadata.TrackArtist):
|
||||
track_metadata.artist = line_data
|
||||
|
||||
elif line.startswith("#TRACK_ALBUM: "):
|
||||
track_metadata.album = line[14:]
|
||||
if isinstance(line_data, WBZM3UData.TrackMetadata.TrackAlbum):
|
||||
track_metadata.album = line_data
|
||||
|
||||
i += 1
|
||||
|
||||
continue
|
||||
|
||||
elif line.startswith("http"): # ignore urls
|
||||
elif isinstance(line_data, WBZM3UData.URL): # ignore urls
|
||||
i += 1
|
||||
|
||||
continue
|
||||
|
@ -283,18 +287,21 @@ class Playlist:
|
|||
first_view.sortItems(4, Qt.SortOrder.AscendingOrder)
|
||||
self.sync(first_view)
|
||||
|
||||
wbz_data = "#WOBUZZM3U\n" # header
|
||||
wbzm3u = WobuzzM3U(self.path)
|
||||
|
||||
for sort_column, order in self.sorting:
|
||||
wbz_data += f"#SORT: {sort_column}, {order}\n"
|
||||
wbz_data = ""
|
||||
|
||||
for order in self.sorting:
|
||||
wbz_data += wbzm3u.assemble_line(order)
|
||||
|
||||
for track in self.tracks:
|
||||
# cache track metadata
|
||||
wbz_data += f"#TRACK_TITLE: {track.metadata.title}\n"
|
||||
wbz_data += f"#TRACK_ARTIST: {track.metadata.artist}\n"
|
||||
wbz_data += f"#TRACK_ALBUM: {track.metadata.album}\n"
|
||||
wbz_data += wbzm3u.assemble_line(WBZM3UData.TrackMetadata.TrackTitle(track.metadata.title))
|
||||
wbz_data += wbzm3u.assemble_line(WBZM3UData.TrackMetadata.TrackArtist(track.metadata.artist))
|
||||
wbz_data += wbzm3u.assemble_line(WBZM3UData.TrackMetadata.TrackAlbum(track.metadata.album))
|
||||
# wbz_data += wbzm3u.assemble_line(WBZM3UData.TrackMetadata.TrackGenre(track.metadata.genre))
|
||||
|
||||
wbz_data += f"{track.path}\n"
|
||||
wbz_data += wbzm3u.assemble_line(WBZM3UData.Path(track.path))
|
||||
|
||||
wbz = open(self.path, "w")
|
||||
wbz.write(wbz_data)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue