diff --git a/README.md b/README.md index ae4c17c..1ba0d76 100644 --- a/README.md +++ b/README.md @@ -97,7 +97,7 @@ You must publish a port on your host machine to bind to the container's web port An example of a minimum run configuration to access maloja via `localhost:42010`: ```console - docker run -p 42010:42010 -v $PWD/malojadata:/mljdata -e MALOJA_DATA_DIRECTORY=/mljdata maloja + docker run -p 42010:42010 -v $PWD/malojadata:/mljdata -e MALOJA_DATA_DIRECTORY=/mljdata krateng/maloja ``` ### Extras diff --git a/dev/releases/3.0.yml b/dev/releases/3.0.yml index 4452a12..3cb6289 100644 --- a/dev/releases/3.0.yml +++ b/dev/releases/3.0.yml @@ -28,3 +28,11 @@ minor_release_name: "Yeonhee" - "[Feature] Added better feedback to native API endpoints" - "[Bugfix] Fixed native API receiving superfluous keywords" - "[Bugfix] Fixed crash when importing scrobbles with artists with similar names" +3.0.5: + commit: "fe21894c5ecf3a53c9c5c00453abfc7f41c6a83e" + notes: + - "[Feature] Added notification system for web interface" + - "[Bugfix] Fixed crash when encountering error in Lastfm import" +3.0.6: + notes: + - "[Bugfix] Better parsing of featuring artists" diff --git a/dev/releases/branch.yml b/dev/releases/branch.yml index 9b2b089..6fd8e81 100644 --- a/dev/releases/branch.yml +++ b/dev/releases/branch.yml @@ -1,2 +1,3 @@ +- "[Architecture] Cleaned up legacy process control" - "[Feature] Implemented track title and artist name editing from web interface" - "[Feature] Implemented track and artist merging from web interface" diff --git a/maloja/__pkginfo__.py b/maloja/__pkginfo__.py index 38f9714..ecf899c 100644 --- a/maloja/__pkginfo__.py +++ b/maloja/__pkginfo__.py @@ -4,7 +4,7 @@ # you know what f*ck it # this is hardcoded for now because of that damn project / package name discrepancy # i'll fix it one day -VERSION = "3.0.4" +VERSION = "3.0.5" HOMEPAGE = "https://github.com/krateng/maloja" diff --git a/maloja/cleanup.py b/maloja/cleanup.py index f8b6623..eb97528 100644 --- a/maloja/cleanup.py +++ b/maloja/cleanup.py @@ -109,9 +109,9 @@ class CleanerAgent: for d in self.delimiters_feat: - if re.match(r"(.*) \(" + d + " (.*)\)",a) is not None: - return self.parseArtists(re.sub(r"(.*) \(" + d + " (.*)\)",r"\1",a)) + \ - self.parseArtists(re.sub(r"(.*) \(" + d + " (.*)\)",r"\2",a)) + if re.match(r"(.*) [\(\[]" + d + " (.*)[\)\]]",a) is not None: + return self.parseArtists(re.sub(r"(.*) [\(\[]" + d + " (.*)[\)\]]",r"\1",a)) + \ + self.parseArtists(re.sub(r"(.*) [\(\[]" + d + " (.*)[\)\]]",r"\2",a)) @@ -141,9 +141,11 @@ class CleanerAgent: t = t.replace("[","(").replace("]",")") - t = re.sub(r" \(as made famous by .*?\)","",t) - t = re.sub(r" \(originally by .*?\)","",t) - t = re.sub(r" \(.*?Remaster.*?\)","",t) + # we'll leave these matching all bracket types so future changes + # won't require readaption + t = re.sub(r" [\(\[]as made famous by .*?[\)\]]","",t) + t = re.sub(r" [\(\[]originally by .*?[\)\]]","",t) + t = re.sub(r" [\(\[].*?Remaster.*?[\)\]]","",t) for s in malojaconfig["REMOVE_FROM_TITLE"]: if s in t: @@ -156,9 +158,9 @@ class CleanerAgent: def parseTitleForArtists(self,t): for d in self.delimiters_feat: - if re.match(r"(.*) \(" + d + " (.*?)\)",t) is not None: - (title,artists) = self.parseTitleForArtists(re.sub(r"(.*) \(" + d + " (.*?)\)",r"\1",t)) - artists += self.parseArtists(re.sub(r"(.*) \(" + d + " (.*?)\).*",r"\2",t)) + if re.match(r"(.*) [\(\[]" + d + " (.*?)[\)\]]",t) is not None: + (title,artists) = self.parseTitleForArtists(re.sub(r"(.*) [\(\[]" + d + " (.*?)[\)\]]",r"\1",t)) + artists += self.parseArtists(re.sub(r"(.*) [\(\[]" + d + " (.*?)[\)\]].*",r"\2",t)) return (title,artists) if re.match(r"(.*) - " + d + " (.*)",t) is not None: (title,artists) = self.parseTitleForArtists(re.sub(r"(.*) - " + d + " (.*)",r"\1",t)) diff --git a/maloja/proccontrol/tasks/import_scrobbles.py b/maloja/proccontrol/tasks/import_scrobbles.py index 6eb1b7e..fd5a567 100644 --- a/maloja/proccontrol/tasks/import_scrobbles.py +++ b/maloja/proccontrol/tasks/import_scrobbles.py @@ -268,11 +268,17 @@ def parse_lastfm(inputf): with open(inputf,'r',newline='') as inputfd: reader = csv.reader(inputfd) + line = 0 for row in reader: + line += 1 try: artist,album,title,time = row except ValueError: - yield ('FAIL',None,f"{row} does not look like a valid entry. Scrobble not imported.") + yield ('FAIL',None,f"{row} (Line {line}) does not look like a valid entry. Scrobble not imported.") + continue + + if time == '': + yield ('FAIL',None,f"{row} (Line {line}) is missing a timestamp.") continue try: @@ -287,7 +293,7 @@ def parse_lastfm(inputf): 'scrobble_duration':None },'') except Exception as e: - yield ('FAIL',None,f"{entry} could not be parsed. Scrobble not imported. ({repr(e)})") + yield ('FAIL',None,f"{row} (Line {line}) could not be parsed. Scrobble not imported. ({repr(e)})") continue diff --git a/pyproject.toml b/pyproject.toml index 4fe6f82..81ea943 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "malojaserver" -version = "3.0.4" +version = "3.0.5" description = "Self-hosted music scrobble database" readme = "./README.md" requires-python = ">=3.6"