[TIL_Carrotww] 46 - 22/11/07

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

TIL

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

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

๐Ÿงฒ Django rest framework

๐Ÿ” backend ๋ถ€๋ถ„์€ serializer๋กœ json ํ˜•ํƒœ์˜ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๊ฐ€ ์‰ฝ๊ฒŒ ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์—ˆ๊ณ  backend server, front server ๋ฅผ ๋ถ„๋ฆฌํ•˜์—ฌ ์›น ๊ฐœ๋ฐœ์„ ์ฒ˜์Œ ํ•ด๋ณด๋‹ˆ javascript๋„ ๋‚˜๋ฆ„ ์žฌ๋ฐŒ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค. ๋ฌผ๋ก  ์กฐ๊ธˆ๋งŒ ๋” ์ง€์‹์ด ์žˆ์—ˆ๋‹ค๋ฉด ๋”์šฑ ์ˆ˜์›”ํ•˜๊ฒŒ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ–ˆ์„ ํ…๋ฐ ์ƒ๊ฐ๋ณด๋‹ค ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ ธ๋‹ค.
json์œผ๋กœ back -> front, front -> back ๋ฐ์ดํ„ฐ ์ „๋‹ฌ์€ ์‰ฌ์› ์ง€๋งŒ javascript ์—์„œ ๋ฐ›์€ ๋ฐ์ดํ„ฐ๋ฅผ html ๋กœ ๋ณด์—ฌ์ฃผ๋Š” ๊ฒƒ์ด ์‹œ๊ฐ„์ด ๊ฑธ๋ ธ๋‹ค..
html์„ ๋ชปํ•ด์„œ... ใ… ใ… 

api์™€ ํฌ๋กค๋ง์„ ๋™์‹œ์— ํ•˜๊ณ  db์— ์ €์žฅ๊นŒ์ง€ ํ•˜๋Š” ๋กœ์ง์ด๋‹ค.
์ด๋ ‡๊ฒŒํ•˜๋ฉด ์—„์ฒญ ์‹œ๊ฐ„์ด ์˜ค๋ž˜๊ฑธ๋ ค ํฌ๋กค๋ง์€ ํ•˜์ง€ ์•Š๋Š”๊ฒƒ์ด ์ข‹๋‹ค. ๋ฏธ๋‹ˆ ํ”„๋กœ์ ํŠธ์ด๊ธฐ๋„ ํ•˜๊ณ  ์ด๋ฏธ์ง€๋ฅผ ๊ฐ€์ ธ์™€ ๋ณด์—ฌ์ฃผ๋Š”๊ฒŒ ์ข‹์„ ๊ฒƒ ๊ฐ™์•„์„œ last_fm api ์—์„œ๋Š” ์ œ๊ณตํ•ด ์ฃผ์ง€ ์•Š๋Š” ์ด๋ฏธ์ง€๋ฅผ url ๋งํฌ๋ฅผ ํƒ€๊ณ  ๋“ค์–ด๊ฐ€ ์ด๋ฏธ์ง€๋งŒ ๊ฐ€์ ธ์™”๋‹ค.

๐Ÿงฒ Crawling

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 ํ˜ธ์ถœ ํ•จ์ˆ˜์—์„œ ๋„ฃ์–ด์ฃผ์—ˆ๋‹ค.

๐Ÿงฒ ์ˆ˜์ •๋œ api search ๊ธฐ๋Šฅ

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 ๋ฌธ์ธ์ง€ ์ถ”๊ฐ€ํ•ด์•ผ ํ•  ๊ฒƒ ๊ฐ™๋‹ค.

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