๐ backend ๋ถ๋ถ์ serializer๋ก json ํํ์ ๋ฐ์ดํฐ ์ฒ๋ฆฌ๊ฐ ์ฝ๊ฒ ๊ฐ๋ฅํ๋ค๋ ๊ฒ์ ์๊ฒ ๋์๊ณ backend server, front server ๋ฅผ ๋ถ๋ฆฌํ์ฌ ์น ๊ฐ๋ฐ์ ์ฒ์ ํด๋ณด๋ javascript๋ ๋๋ฆ ์ฌ๋ฐ๋ค๊ณ ์๊ฐํ๋ค. ๋ฌผ๋ก ์กฐ๊ธ๋ง ๋ ์ง์์ด ์์๋ค๋ฉด ๋์ฑ ์์ํ๊ฒ ํ๋ก์ ํธ๋ฅผ ์งํํ์ ํ ๋ฐ ์๊ฐ๋ณด๋ค ์๊ฐ์ด ์ค๋ ๊ฑธ๋ ธ๋ค.
json์ผ๋ก back -> front, front -> back ๋ฐ์ดํฐ ์ ๋ฌ์ ์ฌ์ ์ง๋ง javascript ์์ ๋ฐ์ ๋ฐ์ดํฐ๋ฅผ html ๋ก ๋ณด์ฌ์ฃผ๋ ๊ฒ์ด ์๊ฐ์ด ๊ฑธ๋ ธ๋ค..
html์ ๋ชปํด์... ใ ใapi์ ํฌ๋กค๋ง์ ๋์์ ํ๊ณ db์ ์ ์ฅ๊น์ง ํ๋ ๋ก์ง์ด๋ค.
์ด๋ ๊ฒํ๋ฉด ์์ฒญ ์๊ฐ์ด ์ค๋๊ฑธ๋ ค ํฌ๋กค๋ง์ ํ์ง ์๋๊ฒ์ด ์ข๋ค. ๋ฏธ๋ ํ๋ก์ ํธ์ด๊ธฐ๋ ํ๊ณ ์ด๋ฏธ์ง๋ฅผ ๊ฐ์ ธ์ ๋ณด์ฌ์ฃผ๋๊ฒ ์ข์ ๊ฒ ๊ฐ์์ last_fm api ์์๋ ์ ๊ณตํด ์ฃผ์ง ์๋ ์ด๋ฏธ์ง๋ฅผ url ๋งํฌ๋ฅผ ํ๊ณ ๋ค์ด๊ฐ ์ด๋ฏธ์ง๋ง ๊ฐ์ ธ์๋ค.
def get_youtube_url(url): headers = {'User-Agent': 'Mozilla/5.0'} default_url = 'https://www.youtube.com' default_img = '' response = requests.get(url, headers=headers) if response.status_code == 200: html = response.text soup = BeautifulSoup(html, 'html.parser') try: result_url = soup.find('a', {'class': "image-overlay-playlink-link js-playlink"})['data-youtube-url'] except: result_url = default_url try: result_image_url = soup.find('img', {'class': "video-preview"})['src'] except: result_image_url = default_img return result_url, result_image_url else: return default_url, default_img
ํค๋๋ฅผ ๊ตณ์ด ์ ๋ถ์ฌ๋ ๋๊ธฐ๋ ํ์ง๋ง ๋ณด์ ์์ง๋์ด ์ผ์ ํ ๋ ips ์ฅ๋น์์ ํฌ๋กค๋ง ์ ๊ทผ์ ์ฐจ๋จํ๋ ๊ธฐ์ต์ด ์์ด ํค๋๋ฅผ ๊ทธ๋ฅ ๋ถ์ฌ์ฃผ์๋ค.
ํฌ๋กค๋ง์ด ๋์ง ์๋๋ค๋ฉด ํค๋๋ฅผ ๋ถ์ฌ๋ณด์. ๋ณด์์ฅ๋น์์ ์ฐจ๋จ๋ ์ ์๋ค.์ ์ฝ๋์์ api๋ก ๋ถ๋ฌ์จ ์์ url์ ๋ฃ์ด์ฃผ๋ฉด ํด๋น ์์ ์ youtube url๊ณผ image๋ฅผ ๋ค์ ํฌ๋กค๋ง ํ์ฌ ๋ถ๋ฌ์จ๋ค.
try except๋ฅผ ์ฌ์ฉํ์ฌ youtube url, image๊ฐ ์์ผ๋ฉด default๋ก ๋ฃ์ด์ฃผ์๋ค. -> default image๋ api ํธ์ถ ํจ์์์ ๋ฃ์ด์ฃผ์๋ค.
def lookup_track_search(tag:list): # tag๊ฐ 5๊ฐ ๋ค์ด์ด recommend_music_list = [] default_img = 'https://www.shutterstock.com/image-vector/picture-icon-image-photo-600w-1672289161.jpg' if len(tag) >= 2: tag_list = list(combinations(tag, 2)) for i in tag_list: temp = ' '.join(i) response = lastfm_get({ 'method': 'track.search', 'track': temp}) music_list = [(x['artist'], x['name'], x['url']) for x in response.json()['results']['trackmatches']['track']] if music_list: recommend_music_list.append(random.choice(music_list)) recommend_result_music = [(x[0], x[1], x[2]) for x in recommend_music_list] result_music = [] for x in recommend_result_music: try: youtube_url, music_image = get_youtube_url(x[2]) if music_image == '': music_image = default_img except: result_music.append(x[0], x[1], x[2], 'https://youtube.com', default_img) continue try: youtube_url = youtube_url.replace('watch?v=','embed/') except: pass result_music.append((x[0], x[1], x[2], youtube_url, music_image)) return result_music elif len(tag) == 1: result_music = [] response = lastfm_get({ 'method': 'track.search', 'track': tag}) music_list = [(x['artist'], x['name'], x['url']) for x in response.json()['results']['trackmatches']['track']][0:5] if music_list: for x in music_list: try: youtube_url, music_image = get_youtube_url(x[2]) if music_image == '': music_image = default_img except: result_music.append(x[0], x[1], x[2], 'https://youtube.com', default_img) continue try: youtube_url = youtube_url.replace('watch?v=','embed/') except: pass result_music.append((x[0], x[1], x[2], youtube_url, music_image)) return result_music
์๊พธ ์์ธ๊ฐ ๋ฐ์ํด์ ๋๋ฌด ํ๋ค์๋ค ใ ใ ใ ใ ใ ใ ใ ใ
api ํธ์ถ๋ ํ๊ณ ํฌ๋กค๋ง๋ ํ ํ return ํ๋ ํจ์์ฌ์ ์ค๋ ๊ฑธ๋ฆฌ๊ธฐ๋ ํ์ง๋ง ์์ธ์ฒ๋ฆฌ๋ฅผ ๋ชจ๋ ํด์ฃผ์๊ณ ๊ธฐ๋ณธ๊ฐ๋ ๋ฃ์ด์ฃผ์ด์ ๋๋ฌด ๊ธฐ๋ถ์ด ์ข๋ค.์ ๋ฒ์ ์ผ๋ len == 1 ๊ณผ >= 2๋ก if ๋ฌธ์ด ๋๋๊ฒ์
์์ ์นดํ ์ฝ๋ฆฌ ์ถ์ฒ ์ ์ฌ๋ฌ ๊ฐ์ด ๋ค์ด์ค๋ฉด split ํด์ค์ 2๊ฐ์ฉ ์กฐํฉํ๊ณ ๊ฒ์ํ์ฌ ๋๋ค์ผ๋ก ์์ ์ ์ถ์ฒํ๊ณ , ๊ฒ์์ด๊ฐ ํ๋๋ฉด ํด๋น ๊ฒ์์ด์ ์์ ์์5๊ฐ๋ฅผ ๋ฝ์์ค๋ ๋ก์ง์ด๋ค.
์ ํ๋ธ ๋งํฌ๊ฐ ์๋ ์์ ๋ ์๊ณ , ๊ฒ์์ด ์๋๋ ์นดํ ๊ณ ๋ฆฌ๋ ์์ผ๋ฉฐ, ์ด๋ฏธ์ง๊ฐ ์๋ ์์ ๋ ์์ด ํ๋ํ๋ ์์ธ์ฒ๋ฆฌ ํด์คฌ๋ค.์ง๊ธ์ except ๋ฌธ์ ์ ํํ ์๋ฌ ํธ๋ค๋ง์ ํด์ฃผ์ง ์์์ง๋ง ์๊ฐ์ด ๋๋ฉด ์ด๋ค ์๋ฌ์ ๋ํ except ๋ฌธ์ธ์ง ์ถ๊ฐํด์ผ ํ ๊ฒ ๊ฐ๋ค.