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
13
wobuzz/wobuzzm3u/__init__.py
Normal file
13
wobuzz/wobuzzm3u/__init__.py
Normal file
|
@ -0,0 +1,13 @@
|
|||
#!/usr/bin/python3
|
||||
|
||||
def __getattr__(name):
|
||||
match name:
|
||||
case "WobuzzM3U":
|
||||
from .wobuzzm3u import WobuzzM3U
|
||||
|
||||
return WobuzzM3U
|
||||
|
||||
case "WBZM3UData":
|
||||
from .wbzm3u_data import WBZM3UData
|
||||
|
||||
return WBZM3UData
|
68
wobuzz/wobuzzm3u/wbzm3u_data.py
Normal file
68
wobuzz/wobuzzm3u/wbzm3u_data.py
Normal file
|
@ -0,0 +1,68 @@
|
|||
#!/usr/bin/python3
|
||||
|
||||
|
||||
class WBZM3UData:
|
||||
is_comment = False
|
||||
type: "WBZM3UData"
|
||||
|
||||
class Header:
|
||||
is_comment = True
|
||||
|
||||
class Path(str):
|
||||
pass
|
||||
|
||||
class URL(str):
|
||||
pass
|
||||
|
||||
class SortOrder:
|
||||
is_comment = True
|
||||
|
||||
track_title = 0
|
||||
track_artist = 1
|
||||
track_album = 2
|
||||
track_genre = 3
|
||||
custom_sorting = 4
|
||||
|
||||
def __init__(self, sort_by: int, ascending: bool):
|
||||
self.sort_by = sort_by
|
||||
self.ascending = ascending
|
||||
|
||||
class TrackMetadata:
|
||||
class TrackTitle(str):
|
||||
is_comment = True
|
||||
|
||||
class TrackArtist(str):
|
||||
is_comment = True
|
||||
|
||||
class TrackAlbum(str):
|
||||
is_comment = True
|
||||
|
||||
class TrackGenre(str):
|
||||
is_comment = True
|
||||
|
||||
|
||||
class WBZM3UData(WBZM3UData):
|
||||
class Header(WBZM3UData.Header, WBZM3UData):
|
||||
pass
|
||||
|
||||
class Path(WBZM3UData.Path, WBZM3UData, str):
|
||||
pass
|
||||
|
||||
class URL(WBZM3UData.URL, WBZM3UData, str):
|
||||
pass
|
||||
|
||||
class SortOrder(WBZM3UData.SortOrder, WBZM3UData):
|
||||
pass
|
||||
|
||||
class TrackMetadata(WBZM3UData.TrackMetadata, WBZM3UData):
|
||||
class TrackTitle(WBZM3UData.TrackMetadata.TrackTitle, WBZM3UData.TrackMetadata, str):
|
||||
pass
|
||||
|
||||
class TrackArtist(WBZM3UData.TrackMetadata.TrackArtist, WBZM3UData.TrackMetadata, str):
|
||||
pass
|
||||
|
||||
class TrackAlbum(WBZM3UData.TrackMetadata.TrackAlbum, WBZM3UData.TrackMetadata, str):
|
||||
pass
|
||||
|
||||
class TrackGenre(WBZM3UData.TrackMetadata.TrackGenre, str):
|
||||
pass
|
87
wobuzz/wobuzzm3u/wobuzzm3u.py
Normal file
87
wobuzz/wobuzzm3u/wobuzzm3u.py
Normal file
|
@ -0,0 +1,87 @@
|
|||
#!/usr/bin/python3
|
||||
|
||||
from . import WBZM3UData
|
||||
|
||||
|
||||
class WobuzzM3U:
|
||||
sort_orders = {
|
||||
"Title": WBZM3UData.SortOrder.track_title,
|
||||
"Artist": WBZM3UData.SortOrder.track_artist,
|
||||
"Album": WBZM3UData.SortOrder.track_album,
|
||||
"Genre": WBZM3UData.SortOrder.track_genre,
|
||||
"Custom": WBZM3UData.SortOrder.custom_sorting
|
||||
}
|
||||
|
||||
sort_order_names = {
|
||||
WBZM3UData.SortOrder.track_title: "Title",
|
||||
WBZM3UData.SortOrder.track_artist: "Artist",
|
||||
WBZM3UData.SortOrder.track_album: "Album",
|
||||
WBZM3UData.SortOrder.track_genre: "Genre",
|
||||
WBZM3UData.SortOrder.custom_sorting: "Custom"
|
||||
}
|
||||
|
||||
def __init__(self, filename: str):
|
||||
self.filename = filename
|
||||
|
||||
def parse_line(self, line: str) -> WBZM3UData | None:
|
||||
if line.startswith("#"): # comments and EXTM3U/WOBUZZM3U
|
||||
if line.startswith("#WOBUZZM3U"):
|
||||
return WBZM3UData.Header()
|
||||
|
||||
elif line.startswith("#SORT: "): # sort
|
||||
sorting_params = line[6:] # delete "#SORT: " from the line
|
||||
|
||||
sorting = sorting_params.split(", ") # split into the sort column specifier and the sort order
|
||||
# e.g. ["Title", "Ascending"]
|
||||
|
||||
if not sorting[0] in self.sort_orders:
|
||||
return None
|
||||
|
||||
sort_by = self.sort_orders[sorting[0]]
|
||||
order = sorting[1] == "Ascending"
|
||||
|
||||
return WBZM3UData.SortOrder(sort_by, order)
|
||||
|
||||
elif line.startswith("#TRACK_TITLE: "):
|
||||
return WBZM3UData.TrackMetadata.TrackTitle(line[14:])
|
||||
|
||||
elif line.startswith("#TRACK_ARTIST: "):
|
||||
return WBZM3UData.TrackMetadata.TrackArtist(line[15:])
|
||||
|
||||
elif line.startswith("#TRACK_ALBUM: "):
|
||||
return WBZM3UData.TrackMetadata.TrackAlbum(line[14:])
|
||||
|
||||
return None
|
||||
|
||||
elif line.startswith("http"):
|
||||
return WBZM3UData.URL("URLs currently aren't supported.")
|
||||
|
||||
# line contains a path
|
||||
return WBZM3UData.Path(line)
|
||||
|
||||
def assemble_line(self, data: WBZM3UData) -> str | None:
|
||||
if isinstance(data, WBZM3UData.Header):
|
||||
return "#WOBUZZM3U\n"
|
||||
|
||||
if isinstance(data, WBZM3UData.Path):
|
||||
return f"{data}\n"
|
||||
|
||||
if isinstance(data, WBZM3UData.URL):
|
||||
return None
|
||||
|
||||
if isinstance(data, WBZM3UData.SortOrder):
|
||||
direction = "Ascending" if data.ascending else "Descending"
|
||||
|
||||
return f"#SORT: {self.sort_order_names[data.sort_by]}, {direction}\n"
|
||||
|
||||
if isinstance(data, WBZM3UData.TrackMetadata.TrackTitle):
|
||||
return f"#TRACK_TITLE: {data}\n"
|
||||
|
||||
if isinstance(data, WBZM3UData.TrackMetadata.TrackArtist):
|
||||
return f"#TRACK_ARTIST: {data}\n"
|
||||
|
||||
if isinstance(data, WBZM3UData.TrackMetadata.TrackAlbum):
|
||||
return f"#TRACK_ALBUM: {data}\n"
|
||||
|
||||
if isinstance(data, WBZM3UData.TrackMetadata.TrackGenre):
|
||||
return f"#TRACK_GENRE: {data}\n"
|
Loading…
Add table
Add a link
Reference in a new issue