-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathapp.py
103 lines (71 loc) · 4.17 KB
/
app.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
from flask import Flask, jsonify
import requests
import json
app = Flask(__name__)
mashUpDict = {"MBID": "", "description": "", "albums": {} } #dictionary där samtlig data sparas och till slut omvandlas till JSON.
finalOutput = {}
def find_wikipedia_url(IDConvert, URLRework): #hittar via WikiData rätt ID för en sökning på Wikipedia.
wikiDataURL = ("https://www.wikidata.org/w/api.php?action=wbgetentities&ids=" + IDConvert + "&format_=json&props=sitelinks&format=json")
response = requests.get(wikiDataURL)
data = response.text
parsed = json.loads(data)
wikipediaID = parsed['entities'][IDConvert]['sitelinks']['enwiki']['title']
return(get_wikipedia_text(wikipediaID.replace(" ", "_"), URLRework))
def get_wikipedia_text(wikipediaID, URLRework): #hämtar description text från Wikipedia.
wikipediaURL = "https://en.wikipedia.org/w/api.php?action=query&format=json&prop=revisions&titles=" + wikipediaID + "&formatversion=2&rvprop=content&rvslots=*&prop=extracts"
response = requests.get(wikipediaURL)
data = response.text
parsed = json.loads(data)
mashUpDict['description'] = (parsed['query']['pages'][0]['extract'])
return(get_cover_art(URLRework))
def get_cover_art(URLRework):
gatheredAlbums = [] #dictionary som sparar datan från albums till slutreturneringen (mashUpDict)
response = requests.get(URLRework)
data = response.text
parsed = json.loads(data)
for entry in parsed['release-groups']:
coverDictionary = {}
coverTitle = entry['title']
coverID = entry['id']
coverUrl = "http://coverartarchive.org/release-group/" + coverID
coverResponse = requests.get(coverUrl)
if coverResponse.status_code == 200: #vissa albums fungerade inte, kanske felaktiga länkar från MusicBrainz. if-satsen fångar dessa
# och hoppar över trasiga länkar.
coverdata = coverResponse.text
coverParsed = json.loads(coverdata)
imageLink = coverParsed['images'][0]['image']
coverDictionary['image'] = imageLink
coverDictionary['id'] = coverID
coverDictionary['title'] = coverTitle
gatheredAlbums.append(coverDictionary) #skapar hela albumet.
mashUpDict['albums'] = gatheredAlbums
finalOutput = json.loads(json.dumps(mashUpDict, indent = 4))
return(finalOutput) #gör om slutlig output till JSON format.
@app.route('/')
def intro():
instructions = "to run the API, go too localhost/search/<>, with your requested MBID inside < >"
return(instructions)
@app.route('/search/<MBID>', methods=['GET'])
def start_up(MBID): #tar ett MBID från användaren och hittar ett ID som skickas vidare till WikiData eller Wikipedia.
musicBrainzURL = "http://musicbrainz.org/ws/2/artist/" + MBID + "?&f%20mt=json&inc=url-rels+release-groups&fmt=json"
URLRework = ((musicBrainzURL.replace('<', '').replace('>', '')))
response = requests.get(URLRework)
if response.status_code != 200: #avslutar programmet ifall det inmatade MBID inte är korrekt eller URL på annat sätt inte går igenom.
errorCode = str(response.status_code)
errorStatus = ("invalid MBID, status code: " + errorCode)
return(errorStatus)
mashUpDict['MBID'] = (MBID.replace('<', '').replace('>', ''))
data = response.text
parsed = json.loads(data)
for entry in parsed['relations']:
if entry['type'] == 'wikidata':
IDConvert = entry['url']['resource']
return(find_wikipedia_url(IDConvert.split("/")[-1], URLRework)) #URLRework skickas med för att kunna hitta cover art senare, som behöver
# komma åt samma URL. Sista splitten av IDConver (-1) innehåller ID till Wikidatas API.
elif entry['type'] == 'wikipedia':
pass
# Hittade inget ID som länkade direkt till Wikipedia, kunde därför inte testa detta case.
# baserat på musicBrainz format bör dock lösningen vara;
# wikipediaID = entry['title] - som sedan skickas direkt till get_wikipedia_text som wikipediaID, utan att gå igenom find_wikipedia_url.
if __name__ == '__main__':
app.run(debug=True)