Fixed hard-coding of 'en-US' locale

This commit is contained in:
Joshua Askharoun
2021-03-20 23:55:33 -05:00
parent f5627da222
commit 277cecbead
3 changed files with 90 additions and 47 deletions
+81 -47
View File
@@ -5,40 +5,43 @@ import musicbrainzngs
from atom.factory import * from atom.factory import *
from locale import *
locale = getdefaultlocale()[0]
app = Flask(__name__) app = Flask(__name__)
musicbrainzngs.set_useragent("Zune", "4.8", "https://github.com/yoshiask/PyZuneCatalogServer") musicbrainzngs.set_useragent("Zune", "4.8", "https://github.com/yoshiask/PyZuneCatalogServer")
@app.route("/v3.2/en-US/hubs/music") @app.route(f"/v3.2/<string:locale>/hubs/music")
def hubs_music(): def hubs_music(locale: str):
with open('reference/catalog.zune.net_v3.2_en-US_hubs_music.xml', 'r') as file: with open('reference/catalog.zune.net_v3.2_{locale}_hubs_music.xml', 'r') as file:
data: str = file.read().replace('\n', '') data: str = file.read().replace('\n', '')
return Response(data, mimetype='text/xml') return Response(data, mimetype=MIME_ATOM_XML)
@app.route("/v3.2/en-US/music/hub/podcast/") @app.route(f"/v3.2/<string:locale>/music/hub/podcast/")
def hubs_podcasts(): def hubs_podcasts(locale: str):
with open('reference/catalog.zune.net_v3.2_en-US_music_hub_podcast.xml', 'r') as file: with open('reference/catalog.zune.net_v3.2_{locale}_music_hub_podcast.xml', 'r') as file:
data: str = file.read().replace('\n', '') data: str = file.read().replace('\n', '')
return Response(data, mimetype='text/xml') return Response(data, mimetype=MIME_ATOM_XML)
@app.route("/v3.2/en-US/music/genre/<string:id>/") @app.route(f"/v3.2/<string:locale>/music/genre/<string:id>/")
def music_genre_details(id: str): def music_genre_details(id: str, locale: str):
with open('reference/catalog.zune.net_v3.2_en-US_music_genre.xml', 'r') as file: with open('reference/catalog.zune.net_v3.2_{locale}_music_genre.xml', 'r') as file:
data: str = file.read().replace('\n', '') data: str = file.read().replace('\n', '')
return Response(data, mimetype='text/xml') return Response(data, mimetype=MIME_ATOM_XML)
@app.route("/v3.2/en-US/music/genre/<string:id>/albums/") @app.route(f"/v3.2/<string:locale>/music/genre/<string:id>/albums/")
def music_genre_albums(id: str): def music_genre_albums(id: str, locale: str):
with open('reference/catalog.zune.net_v3.2_en-US_music_genre.xml', 'r') as file: with open('reference/catalog.zune.net_v3.2_{locale}_music_genre.xml', 'r') as file:
data: str = file.read().replace('\n', '') data: str = file.read().replace('\n', '')
return Response(data, mimetype='text/xml') return Response(data, mimetype=MIME_ATOM_XML)
@app.route("/v3.2/en-US/music/genre/") @app.route(f"/v3.2/<string:locale>/music/genre/")
def music_genre(): def music_genre(locale: str):
from musizbrainz.genrelist import GENRES from musizbrainz.genrelist import GENRES
lastpulledlist: datetime = datetime(2021, 2, 21) lastpulledlist: datetime = datetime(2021, 2, 21)
@@ -46,15 +49,15 @@ def music_genre():
feed: Element = create_feed(doc, "Genres", "genre", request.endpoint, lastpulledlist) feed: Element = create_feed(doc, "Genres", "genre", request.endpoint, lastpulledlist)
for genre_name, genre_id in GENRES.items(): for genre_name, genre_id in GENRES.items():
entry: Element = create_entry(doc, genre_name, genre_id, "/v3.2/en-US/music/genre" + genre_id, lastpulledlist) entry: Element = create_entry(doc, genre_name, genre_id, "/v3.2/{locale}/music/genre" + genre_id, lastpulledlist)
feed.appendChild(entry) feed.appendChild(entry)
xml_str = doc.toprettyxml(indent="\t") xml_str = doc.toprettyxml(indent="\t")
return Response(xml_str, mimetype=MIME_XML) return Response(xml_str, mimetype=MIME_XML)
@app.route("/v3.2/en-US/music/album/<album_id>/") @app.route(f"/v3.2/<string:locale>/music/album/<album_id>/")
def music_get_album(album_id: str): def music_get_album(album_id: str, locale: str):
album = musicbrainzngs.get_release_by_id(album_id, includes=["artists", "recordings"])["release"] album = musicbrainzngs.get_release_by_id(album_id, includes=["artists", "recordings"])["release"]
album_name: str = album["title"] album_name: str = album["title"]
artist = album["artist-credit"][0]["artist"] artist = album["artist-credit"][0]["artist"]
@@ -76,7 +79,7 @@ def music_get_album(album_id: str):
recording = track["recording"] recording = track["recording"]
track_id: str = recording["id"] track_id: str = recording["id"]
track_title: str = recording["title"] track_title: str = recording["title"]
entry: Element = create_entry(doc, track_title, track_id, f"/v3.2/en-US/") entry: Element = create_entry(doc, track_title, track_id, f"/v3.2/{locale}/")
# Create primaryArtist element # Create primaryArtist element
primary_artist_elem: Element = doc.createElement("primaryArtist") primary_artist_elem: Element = doc.createElement("primaryArtist")
@@ -110,20 +113,20 @@ def music_get_album(album_id: str):
return Response(xml_str, mimetype=MIME_XML) return Response(xml_str, mimetype=MIME_XML)
@app.route("/v3.2/en-US/music/album/<string:id>/<path:fragment>/") @app.route(f"/v3.2/<string:locale>/music/album/<string:id>/<path:fragment>/")
def music_album_details(id: str, fragment: str): def music_album_details(id: str, fragment: str, locale: str):
return fragment return fragment
# Get artist information # Get artist information
@app.route("/v3.2/en-US/music/artist/<string:id>/") @app.route(f"/v3.2/<string:locale>/music/artist/<string:id>/")
def music_get_artist(id: str): def music_get_artist(id: str, locale: str):
return music_get_artist_tracks(id) return music_get_artist_tracks(id)
# Get artist's tracks # Get artist's tracks
@app.route("/v3.2/en-US/music/artist/<string:artist_id>/tracks/") @app.route(f"/v3.2/<string:locale>/music/artist/<string:artist_id>/tracks/")
def music_get_artist_tracks(artist_id: str): def music_get_artist_tracks(artist_id: str, locale: str):
recordings = musicbrainzngs.browse_recordings(artist_id, limit=100)["recording-list"] recordings = musicbrainzngs.browse_recordings(artist_id, limit=100)["recording-list"]
artist = musicbrainzngs.get_artist_by_id(artist_id)["artist"] artist = musicbrainzngs.get_artist_by_id(artist_id)["artist"]
artist_name: str = artist["name"] artist_name: str = artist["name"]
@@ -134,7 +137,7 @@ def music_get_artist_tracks(artist_id: str):
for recording in recordings: for recording in recordings:
id: str = recording["id"] id: str = recording["id"]
title: str = recording["title"] title: str = recording["title"]
entry: Element = create_entry(doc, title, id, f"/v3.2/en-US/music/artist/{artist_id}/tracks/{id}") entry: Element = create_entry(doc, title, id, f"/v3.2/{locale}/music/artist/{artist_id}/tracks/{id}")
feed.appendChild(entry) feed.appendChild(entry)
# Create primaryArtist element # Create primaryArtist element
@@ -155,8 +158,8 @@ def music_get_artist_tracks(artist_id: str):
# Get artist's albums # Get artist's albums
@app.route("/v3.2/en-US/music/artist/<string:artist_id>/albums/") @app.route(f"/v3.2/<string:locale>/music/artist/<string:artist_id>/albums/")
def music_get_artist_albums(artist_id: str): def music_get_artist_albums(artist_id: str, locale: str):
releases = musicbrainzngs.browse_releases(artist_id, limit=100)["release-list"] releases = musicbrainzngs.browse_releases(artist_id, limit=100)["release-list"]
artist = musicbrainzngs.get_artist_by_id(artist_id)["artist"] artist = musicbrainzngs.get_artist_by_id(artist_id)["artist"]
artist_name: str = artist["name"] artist_name: str = artist["name"]
@@ -167,7 +170,7 @@ def music_get_artist_albums(artist_id: str):
for release in releases: for release in releases:
id: str = release["id"] id: str = release["id"]
title: str = release["title"] title: str = release["title"]
entry: Element = create_entry(doc, title, id, f"/v3.2/en-US/music/artist/{artist_id}/albums/{id}") entry: Element = create_entry(doc, title, id, f"/v3.2/{locale}/music/artist/{artist_id}/albums/{id}")
feed.appendChild(entry) feed.appendChild(entry)
# Add front cover # Add front cover
@@ -193,22 +196,22 @@ def music_get_artist_albums(artist_id: str):
return Response(xml_str, mimetype=MIME_XML) return Response(xml_str, mimetype=MIME_XML)
@app.route("/v3.2/en-US/music/artist/<string:id>/<path:fragment>/") @app.route(f"/v3.2/<string:locale>/music/artist/<string:id>/<path:fragment>/")
def music_artist_details(id: str, fragment: str): def music_artist_details(id: str, fragment: str, locale: str):
return fragment return fragment
# Get top tracks # Get top tracks
@app.route("/v3.2/en-US/music/chart/zune/tracks/") @app.route(f"/v3.2/<string:locale>/music/chart/zune/tracks/")
def music_chart_tracks(): def music_chart_tracks(locale: str):
recordings = musicbrainzngs.search_recordings("*", limit=100) recordings = musicbrainzngs.search_recordings("*", limit=100)
doc: Document = minidom.Document() doc: Document = minidom.Document()
feed: Element = create_feed(doc, "tracks", "tracks", "/v3.2/en-US/music/chart/zune/tracks") feed: Element = create_feed(doc, "tracks", "tracks", f"/v3.2/{locale}/music/chart/zune/tracks")
for recording in recordings["recording-list"]: for recording in recordings["recording-list"]:
# Set track ID and Title # Set track ID and Title
id: str = recording["id"] id: str = recording["id"]
title: str = recording["title"] title: str = recording["title"]
entry: Element = create_entry(doc, title, id, "/v3.2/en-US/music/collection/features/" + id) entry: Element = create_entry(doc, title, id, f"/v3.2/{locale}/music/collection/features/" + id)
# Get artist ID and Name # Get artist ID and Name
artist = recording["artist-credit"][0]["artist"] artist = recording["artist-credit"][0]["artist"]
@@ -233,8 +236,8 @@ def music_chart_tracks():
# Search tracks # Search tracks
@app.route("/v3.2/en-US/music/track") @app.route(f"/v3.2/<string:locale>/music/track")
def music_track(): def music_track(locale: str):
query: str = request.args.get("q") query: str = request.args.get("q")
response = musicbrainzngs.search_recordings(query) response = musicbrainzngs.search_recordings(query)
doc: Document = minidom.Document() doc: Document = minidom.Document()
@@ -244,7 +247,7 @@ def music_track():
# Set track ID and Title # Set track ID and Title
id: str = recording["id"] id: str = recording["id"]
title: str = recording["title"] title: str = recording["title"]
entry: Element = create_entry(doc, title, id, "/v3.2/en-US/music/track/" + id) entry: Element = create_entry(doc, title, id, f"/v3.2/{locale}/music/track/" + id)
# Get artist ID and Name # Get artist ID and Name
artist = recording["artist-credit"][0]["artist"] artist = recording["artist-credit"][0]["artist"]
@@ -288,19 +291,19 @@ def music_track():
# Search albums # Search albums
@app.route("/v3.2/en-US/music/album") @app.route(f"/v3.2/<string:locale>/music/album")
def music_album(): def music_album(locale: str):
query: str = request.args.get("q") query: str = request.args.get("q")
response = musicbrainzngs.search_releases(query) response = musicbrainzngs.search_releases(query)
doc: Document = minidom.Document() doc: Document = minidom.Document()
feed: Element = create_feed(doc, "Albums", "albums", "/v3.2/en-US/music/chart/zune/albums") feed: Element = create_feed(doc, "Albums", "albums", f"/v3.2/{locale}/music/chart/zune/albums")
for release in response["release-list"]: for release in response["release-list"]:
print(release) print(release)
# Set track ID and Title # Set track ID and Title
id: str = release["id"] id: str = release["id"]
title: str = release["title"] title: str = release["title"]
entry: Element = create_entry(doc, title, id, "/v3.2/en-US/music/album/" + id) entry: Element = create_entry(doc, title, id, f"/v3.2/{locale}/music/album/" + id)
# Add front cover # Add front cover
image_elem: Element = doc.createElement("image") image_elem: Element = doc.createElement("image")
@@ -336,10 +339,41 @@ def commerce():
return "Howdy, Zune!" return "Howdy, Zune!"
### MOVIES
@app.route(f"/v3.2/<string:locale>/chart/zuneDownload/movie/")
def chart_zunedown_movie(locale: str):
with open('reference/catalog.zune.net_v3.2_en-US_hubs_music.xml', 'r') as file:
data: str = file.read().replace('\n', '')
return Response(data, mimetype=MIME_ATOM_XML)
@app.route(f"/v3.2/<string:locale>/music/hub/movie/")
def hubs_movie(locale: str):
with open('reference/catalog.zune.net_v3.2_en-US_hubs_music.xml', 'r') as file:
data: str = file.read().replace('\n', '')
return Response(data, mimetype=MIME_ATOM_XML)
@app.route(f"/v3.2/<string:locale>/music/hub/video/")
def hubs_video(locale: str):
with open('reference/catalog.zune.net_v3.2_en-US_hubs_music.xml', 'r') as file:
data: str = file.read().replace('\n', '')
return Response(data, mimetype=MIME_ATOM_XML)
### IMAGES ### IMAGES
@app.route("/v3.2/en-US/image/<string:mbid>") @app.route(f"/v3.2/<string:locale>/image/<string:mbid>")
def get_image(mbid: str): def get_image(mbid: str, locale: str):
print("Image request for", mbid) print("Image request for", mbid)
import urllib.request import urllib.request
image = urllib.request.urlopen(f"http://coverartarchive.org/release/{mbid}/front") image = urllib.request.urlopen(f"http://coverartarchive.org/release/{mbid}/front")
return Response(image.read(), mimetype=MIME_JPG) return Response(image.read(), mimetype=MIME_JPG)
### Metadata
# fai.music.metaservices.microsoft.com
@app.route("/ZuneAPI/EndPoints.aspx")
def get_metadata_endpoints():
print(request.full_path)
with open('reference/catalog.zune.net_v3.2_en-US_hubs_music.xml', 'r') as file:
data: str = file.read().replace('\n', '')
return Response(data, mimetype=MIME_ATOM_XML)
+8
View File
@@ -73,3 +73,11 @@ def create_entry(doc: Document, title: str, id: str, href: str, date_updated: da
entry.appendChild(create_id(doc, id)) entry.appendChild(create_id(doc, id))
return entry return entry
def create_author(doc: Document, name: str) -> Element:
author_elem: Element = doc.createElement("a:author")
author_name_elem: Element = doc.createElement("a:name")
set_element_value(author_name_elem, name)
author_elem.appendChild(author_name_elem)
return author_elem
+1
View File
@@ -1 +1,2 @@
Flask>=1.0,<=1.1.2 Flask>=1.0,<=1.1.2
musicbrainzngs==0.7.1