@@ -251,10 +251,11 @@ # Extract URLs from content for fmt in playlist_fmt_prio: if not urls and fmt in (source, mime, probe, ext, "raw"): urls = cnv.urls(fmt) + urls = filter(None, urls) log.DATA("conversion from:", source, " with extractor:", fmt, "got URLs=", urls) # Return original, or asis for srv targets if not urls: return [url] @@ -452,11 +453,11 @@ url = r"(?s) \"location\" \s*:\s* \"(\w+://[^\"\s]+)\" ", unesc = "json", ), "jamj": dict( url = r" (?x) \"audio\" \s*:\s* \"(\w+:\\?/\\?/[^\"\s]+)\" ", - title = r" (?x) \"name\" \s*:\s* \"([^\"]+)\" ", + #title = r" (?x) \"name\" \s*:\s* \"([^\"]+)\" ", unesc = "json", ), "json": dict( url = r" (?x) \"(?:url|audio|stream)\" \s*:\s* \"(\w+:\\?/\\?/[^\"\s]+)\" ", title = r" (?x) \"(?:title|name|station)\" \s*:\s* \"([^\"]+)\" ", @@ -496,10 +497,24 @@ field = fieldmap.get(field.lower()) if field and len(value): rows[num][field] = value.strip() return [rows[str(i)] for i in sorted(map(int, rows.keys()))] + + # Jamendo JAMJAMJSON playlists + def jamj(self): + rows = [] + for result in json.loads(self.src)["results"]: + for track in result["tracks"]: + rows.append(dict( + title = track["name"], + url = track["audio"], + playing = track.get("artist_name"), + img = track.get("image"), + )) + return rows + # Add placeholder fields to extracted row def mkrow(self, row, title=None): url = row.get("url", "") comb = { @@ -564,12 +579,13 @@ # `title` back into each of the URL rows / or uses row{} template. def export(self, urls=[], row={}, dest="pls", title=None): row["title"] = row.get("title", title or "unnamed stream") rows = [] for url in urls: - row.update(url=url) - rows.append(row) + if url: + row.update(url=url) + rows.append(copy.copy(row)) return self.store(rows, dest) # Export a playlist from rows{} def store(self, rows=None, dest="pls"):