[TIL_Carrotww] 44 - 22/11/03

์œ ํ˜•์„ยท2022๋…„ 11์›” 3์ผ
0

TIL

๋ชฉ๋ก ๋ณด๊ธฐ
53/138
post-thumbnail

๐Ÿ“Carrotww์˜ ์ฝ”๋”ฉ ๊ธฐ๋ก์žฅ

๐Ÿงฒ API ํ”„๋กœ์ ํŠธ์— ์ ์šฉ์‹œํ‚ค๊ธฐ

๐Ÿ” ์‹ค์ œ ์‚ฌ์ดํŠธ์˜ api๋ฅผ ์š”์ฒญํ•˜์—ฌ ์‚ฌ์šฉํ•ด ๋ณด๋Š”๊ฒƒ์€ ์ฒ˜์Œ์ด์˜€๋‹ค.
ํ”„๋กœ์ ํŠธ๊ฐ€ ์Œ์•… ์ถ”์ฒœ ์‚ฌ์ดํŠธ์ธ๋ฐ ์Œ์•…์— ๊ด€ํ•œ api๋ฅผ ์ œ๊ณตํ•ด ์ฃผ๋Š”๊ณณ์€ ๋“œ๋ฌผ์—ˆ๋‹ค. ๋ฉœ๋ก ๋„ ์ œ๊ณตํ•˜๋‹ค๊ฐ€ ์ด์ œ ์•ˆํ•œ๋‹ค๊ณ  ํ•œ๋‹ค ใ… 
๋Œ€ํ‘œ์ ์œผ๋กœ spotify๊ฐ€ ์œ ๋ช…ํ•œ๋ฐ spotify๋Š” api ์ œ๊ณต์‹œ๊นŒ์ง€ ๊ฒ€์ฆ ํ›„ 2์ฃผ์ •๋„ ์†Œ์š”๋˜์–ด ํŒจ์Šค ํ•˜์˜€๊ณ  last.fm ์ด๋ผ๋Š” ์‚ฌ์ดํŠธ๋Š” ํ•œ๊ตญ ๋…ธ๋ž˜๋„ ๋งŽ๊ณ  api๋„ ๊ฐ€์ž…๋งŒ ํ•˜๋ฉด ๋ฐ”๋กœ ์ œ๊ณตํ•ด์ฃผ์–ด ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.

์Œ์•… ์นดํ…Œ๊ณ ๋ฆฌ ๊ธฐ์ค€์œผ๋กœ ๋…ธ๋ž˜๋ฅผ ์ถ”์ฒœํ•  ๊ฑฐ์˜€๋Š”๋ฐ ํ•ด๋‹น ์‚ฌ์ดํŠธ์— ๋น„์Šทํ•œ tag ๋ผ๋Š” ์‹œ์Šคํ…œ์ด ์žˆ์—ˆ๊ณ  tag ์ข…๋ฅ˜๋„ ๋งŽ์•˜๋Š”๋ฐ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ๋œ tag๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” api ๊ฐ€ ์žˆ์–ด ์‚ฌ์šฉํ•ด๋ดค๋‹ค.
ํŠœํ† ๋ฆฌ์–ผ์„ ๋ณด๋ฉฐ ๋‚ด ๋ฉ‹๋Œ€๋กœ ๋งŽ์ด ๋งŒ๋“ค์–ด ๋ณด์•˜๋‹ค.

๊ตญ๋‚ด ์‚ฌ์ดํŠธ๋กœ mariadb ๋ผ๋Š” ์‚ฌ์ดํŠธ๋„ ์žˆ๋Š”๋ฐ ์—ฌ๊ธฐ๋Š” xml๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „ํ•ด์ฃผ๊ณ  ์˜ค๋ž˜๋œ ์‚ฌ์ดํŠธ๋ผ ํŒจ์Šคํ•˜์˜€๋‹ค.

๐Ÿงฒ Last.fm - request(get) ๊ธฐ๋ณธ ํ˜•์‹

def lastfm_get(payload):
    API_KEY = ''
    USER_AGENT = ''

    headers = {'user-agent': USER_AGENT}
    url = 'https://ws.audioscrobbler.com/2.0/'

    payload['api_key'] = API_KEY
    payload['format'] = 'json'

    response = requests.get(url, headers=headers, params=payload)
    return response

์œ„์™€๊ฐ™์ด ์š”์ฒญํ•˜์—ฌ์„œ

return response.status_code

๋ฅผ ์ฐ์—ˆ์„๋•Œ 200๋ฒˆ์ด ์˜ค๋ฉด ์š”์ฒญ์— ์„ฑ๊ณตํ•œ๊ฒƒ

๐Ÿงฒ Last.fm - tag.getTopTags

๐Ÿ” ํ•„์š” ํŒŒ๋ผ๋ฏธํ„ฐ : API_key
๋‹ค๋ฅธ method๋Š” ์˜ต์…˜์ด ๋งŽ์ด ํ•„์š”ํ•œ๋ฐ ํ•ด๋‹น method๋Š” ํ•„์š” ์—†๋‹ค.
๋‚ด๊ฐ€ ์ž‘์„ฑํ•œ ์ฝ”๋“œ

def lookup_all_tags():
    response = lastfm_get({
        'method': 'tag.getTopTags',
    })
    tags = [t['name'] for t in response.json()['toptags']['tag']]
    result = [x for x in tags]

    if response.status_code != 200:
        return None

    if not getattr(response, 'from_cache', False):
        time.sleep(0.25)

    return result

tag์˜ ์ด๋ฆ„๋“ค๋งŒ ๊ฐ€์ ธ์˜ฌ๊ฑฐ์—ฌ์„œ tags์— ์ด๋ฆ„์„ ์ €์žฅํ•˜๊ณ  result์— ๋‹ด์•„์ฃผ์—ˆ๋‹ค.
getattr ํ•จ์ˆ˜๋Š” ์š”์ฒญ์ด ๊ธธ๊ณ  ๋งŽ์„๋•Œ ๋ฒค์ด ๊ฑธ๋ฆด ์ˆ˜ ์žˆ์œผ๋‹ˆ ์บ์‹œ์— ์ €์žฅ์‹œ์ผœ์ฃผ๋Š” ํ•จ์ˆ˜์ด๋‹ค.
ํ•˜์ง€๋งŒ ์•„์ง ๊ตฌํ˜„ํ•˜์ง€ ์•Š์•˜๋‹ค. ๋งŽ์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์˜ฌ๊ฒƒ์€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ

๐Ÿงฒ Last.fm - track.search

๐Ÿ” track.search ๋Š” ์‚ฌ์ดํŠธ์—์„œ ๊ฒ€์ƒ‰๊ธฐ๋Šฅ์„ ๋‹ด๋‹นํ•˜๋Š” ๊ณณ์ด๋‹ค.
ํŒŒ๋ผ๋ฏธ๋„ˆํ„ฐ๋กœ๋Š” track_name ์ด ํ•„์š”ํ•˜์ง€๋งŒ ๋ชจ๋‘ ๊ฒ€์ƒ‰ํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ์ด๊ธฐ ๋•Œ๋ฌธ์— ํ•ด๋‹น ํ•„๋“œ์— ๊ฐ€์ˆ˜๋‚˜ ํƒœ๊ทธ๋ฅผ ๋„ฃ์–ด๋„ ์•Œ์•„์„œ ๊ฒ€์ƒ‰๋œ๋‹ค๋Š” ๋œป
๊ฒ€์ƒ‰์œผ๋กœ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•ด๋ณด๋‹ˆ ๋‘๊ฐ€์ง€ ํ…Œ๊ทธ๊นŒ์ง€๋Š” ๋‚ด๋ถ€ ๋กœ์ง์„ ํ†ตํ•ด ๊ฒ€์ƒ‰์ด ์ž˜ ๋˜์—ˆ์—ˆ๋‹ค.
ํ•ด์„œ DB์— tag๋ฅผ ์ €์žฅํ•ด๋‘๊ณ  ์‚ฌ์šฉ์ž๊ฐ€ ๊ณ ๋ฅธ ์นดํ…Œ๊ณ ๋ฆฌ์— ๋”ฐ๋ผ 2๊ฐ€์ง€๋ฅผ ์กฐํ•ฉํ•˜์—ฌ ์Œ์•…์„ ์ถ”์ฒœํ•ด์ฃผ๋Š” ๊ฒƒ์œผ๋กœ ๊ตฌ์ƒ์„ ํ•˜๋ฉฐ ๋งŒ๋“ค์–ด ๋ณด์•˜๋‹ค.

def lookup_track_search(tag):
    from pprint import pprint
    # tag ๊ฐ€ ์—ฌ๋Ÿฌ๊ฐœ ์ผ ์‹œ 2๊ฐœ ๊นŒ์ง€ ์ž๋ฅด๋Š” ๋กœ์ง ์ถ”๊ฐ€ ์˜ˆ์ •
    temp = ' '.join(tag)
    response = lastfm_get({
        'method': 'track.search',
        'track': tag
    })
    music = [(x['artist'], x['name']) for x in response.json()['results']['trackmatches']['track']]
    # ๋žœ๋คํ•˜๊ฒŒ 1~3 ๊ฐœ ๋ฝ‘์•„์˜ค๋Š” ๋กœ์ง ์ถ”๊ฐ€ ์˜ˆ์ •

    return music

์œ„์™€ ๊ฐ™์ด ํ•˜๋ฉด ๊ฒ€์ƒ‰๋œ ํŽ˜์ด์ง€(์ง€์ •๊ฐ€๋Šฅ)์˜ music๋“ค์ด ๋ฆฌ์ŠคํŠธ๋กœ ๋ฝ‘ํ˜€๋‚˜์˜จ๋‹ค!!!

pprint๋กœ ์ •๋ ฌํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐ์€ ๋ชจ์Šต์ด๋‹ค.

๐Ÿ’ก ํšŒ๊ณ 

๐Ÿ” ๋“ค์–ด๋งŒ ๋ณธ api๋ฅผ ์ฒ˜์Œ ์‚ฌ์šฉํ•ด๋ณด๋‹ˆ ๋„ˆ๋ฌด ์žฌ๋ฐŒ์—ˆ๋‹ค. ํฌ๋กค๋ง๊ณผ๋Š” ๋‹ค๋ฅธ ์žฌ๋ฏธ์ธ ๊ฒƒ ๊ฐ™๋‹ค. ํฌ๋กค๋ง์€ ๋ถˆ๋ฒ•์œผ๋กœ ๊ฐ€์ ธ์˜ค๋Š” ๋Š๋‚Œ์ด ๋“œ๋Š”๋ฐ api ๋ฅผ ์‚ฌ์šฉํ•˜๋‹ˆ ํ•ฉ๋ฒ•์ ์œผ๋กœ ๋งˆ๊ตฌ์žก์ด๋กœ ๊ฐ€์ ธ์˜ค๋Š” ๋Š๋‚Œ?
์˜ค๋Š˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋ชปํ’€ ๊ฒƒ ๊ฐ™๋‹ค.
์˜ค๋Š˜ ๋!

๐Ÿ”—

0๊ฐœ์˜ ๋Œ“๊ธ€