๐ง Music Monday์ Spotify๋ฅผ ์ฐ๊ฒฐํ๋ ์คํ์์ค Ruby Sync Bot ๋ง๋ค๊ธฐ (50~60์)
# ๐ ์๋ก โ โ์์ ์ ๊ณต์ ํ๋๋ฐ ์ฌ์๋ชฉ๋ก์ ์๋ ๋ฐ์์ด ์๋ผ์!โ
Music Monday(๋ฎค์ง ๋จผ๋ฐ์ด)๋ ๋งค์ฃผ ์์์ผ๋ง๋ค ์ปค๋ฎค๋ํฐ ๋ฉค๋ฒ๋ค์ด ์์ ์ด ์ข์ํ๋ ๊ณก์ ๋๊ธ๋ก ๊ณต์ ํ๋ ์์ ์ถ์ฒ ์ด๋ฒคํธ์ ๋๋ค.
ํ์ง๋ง ์ด๋ ๊ฒ ๊ณต์ ๋ ํธ๋์ ์ผ์ผ์ด Spotify ํ๋ ์ด๋ฆฌ์คํธ์ ์ถ๊ฐํ๋ค๋ฉด ์๊ฐ๋ ๋ง์ด ๋ค๊ณ , ์ค์๋ ๋ฐ์ํ๊ธฐ ์ฝ์ฃ .
๋ฌธ์ :โฏMusic Monday ๋๊ธ์ ์ ํ ๊ณก ์ ๋ณด๋ฅผ ์๋์ผ๋ก Spotify ํ๋ ์ด๋ฆฌ์คํธ์ ๋๊ธฐํํ๊ณ ์ถ์ง๋ง, ์ด๋ฅผ ๊ตฌํํ ์ ์๋ ์ฌ์ด ๋ฐฉ๋ฒ์ด ์๋ค.
์ด ๊ธ์์๋ Ruby ๋ก ๋ง๋ ๊ฐ๋จํ ์คํ์์ค Sync Bot์ ํ์ฉํด, ๋๊ธ์ ์ ํ ๊ณก์ ์๋์ผ๋ก Spotify์ ์ถ๊ฐํ๋ ๋ฐฉ๋ฒ์ ์ด๋ณด์๋ ์ดํดํ๊ธฐ ์ฝ๊ฒ ๋จ๊ณ๋ณ๋ก ์๋ดํฉ๋๋ค.
SEO ํค์๋
Spotify ํ๋ ์ด๋ฆฌ์คํธ ๋ง๋ค๊ธฐ
Ruby ์๋ํ ์คํฌ๋ฆฝํธ
Music Monday ํ์ฉ๋ฒ
# ๐ ๏ธ 1. ์ค๋น ๋จ๊ณ โ ํ์ ๋๊ตฌ์ ๊ณ์ ์ค์
| ํญ๋ชฉ | ์ค๋ช | ์ค์ ๋ฐฉ๋ฒ |
|------|------|----------|
| Ruby | ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ ์ธ์ด | rbenv ํน์ rvm ์ผ๋ก ์ต์ Ruby(โฅโฏ2.7) ์ค์น |
| Spotify ๊ฐ๋ฐ์ ๊ณ์ | API ํค(ํด๋ผ์ด์ธํธ ID/์ํฌ๋ฆฟ) ๋ฐ๊ธ | https://developer.spotify.com/dashboard ์์ ์ฑ ์์ฑ โ โClient IDโ์ โClient Secretโ ๋ณต์ฌ |
| Music Monday API (๋น๊ณต์) | ๋๊ธ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ์๋ํฌ์ธํธ | https://api.musicmonday.com/v1/comments?topic=spotify (์์) |
| Bundler | ์์กด์ฑ ๊ด๋ฆฌ | gem install bundler ํ bundle init |
Tip: Ruby ์ด๋ณด์๋
irb๋ก ๊ฐ๋จํ ์ฝ๋๋ฅผ ํ ์คํธํด ๋ณด์ธ์.
# ๐ฆ 2. ํ๋ก์ ํธ ๊ตฌ์กฐ์ ํต์ฌ ์ฝ๋
# 2-1. ํด๋ ๊ตฌ์ฑ
music-monday-spotify-bot/
โ
โโ Gemfile # ์์กด์ฑ ์ ์
โโ bot.rb # ๋ฉ์ธ ์คํฌ๋ฆฝํธ
โโ lib/
โโ spotify_client.rb # Spotify API ๋ํผ
# 2-2. Gemfile ์์
ruby
source 'https://rubygems.org'
gem 'httparty' # HTTP ์์ฒญ
gem 'rspotify' # Spotify API ๋ํผ
gem 'dotenv' # ํ๊ฒฝ ๋ณ์ ๊ด๋ฆฌ
bundle install ๋ก ํ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ค์นํฉ๋๋ค.
# 2-3. Spotify ํด๋ผ์ด์ธํธ ๊ตฌํ (lib/spotify_client.rb)
ruby
require 'rspotify'
require 'dotenv/load'
RSpotify.authenticate(ENV['SPOTIFY_CLIENT_ID'],
ENV['SPOTIFY_CLIENT_SECRET'])
class SpotifyClient
def initialize(playlist_id)
@playlist = RSpotify::User.find('me').playlists.find { |p| p.id == playlist_id }
end
# ํธ๋์ ๊ฒ์ํ๊ณ ์์ผ๋ฉด ์ถ๊ฐ
def add_track(track_name, artist_name)
results = RSpotify::Track.search('#{track_name} #{artist_name}')
track = results.first
return unless track
unless @playlist.tracks.map(&:id).include?(track.id)
@playlist.add_tracks!([track])
puts 'โ
'#{track_name}' - #{artist_name} ๊ฐ ์ถ๊ฐ๋์์ต๋๋ค.'
else
puts 'โน๏ธ ์ด๋ฏธ ์กด์ฌํ๋ ํธ๋์
๋๋ค.'
end
end
end
# 2-4. ๋ฉ์ธ ๋ก์ง (bot.rb)
ruby
require 'httparty'
require_relative './lib/spotify_client'
# 1๏ธโฃ Music Monday ๋๊ธ ๊ฐ์ ธ์ค๊ธฐ
def fetch_comments
response = HTTParty.get('https://api.musicmonday.com/v1/comments?topic=spotify')
JSON.parse(response.body)['data'] # [{ 'track':'Shape of You', 'artist':'Ed Sheeran' }, ...]
end
# 2๏ธโฃ Spotify ํ๋ ์ด๋ฆฌ์คํธ์ ๋๊ธฐํ
def sync_to_spotify
playlist_id = ENV['SPOTIFY_PLAYLIST_ID']
client = SpotifyClient.new(playlist_id)
fetch_comments.each do |c|
client.add_track(c['track'], c['artist'])
end
end
# ์คํ
sync_to_spotify
ํต์ฌ ํฌ์ธํธ
RSpotify๋ก ์ธ์ฆ ํ ์ฌ์ฉ์ ํ๋ ์ด๋ฆฌ์คํธ์ ์ ๊ทผ๋๊ธ์์ ์ถ์ถํ
trackยทartist๋ฅผ ์กฐํฉํด ๊ฒ์ โ ์ถ๊ฐ ํ๋ฆ ๊ตฌํ์ด๋ฏธ ์กด์ฌํ๋ ํธ๋์ ์ค๋ณต ์ถ๊ฐ๋ฅผ ๋ฐฉ์งํ๋๋ก ๋ก์ง์ ๋ฃ์์ต๋๋ค.
# ๐ 3. ์ค์ ์ด์ ํ โ ์๋ํ์ ์๋ฌ ์ฒ๋ฆฌ
- ํฌ๋ก ์ก์ผ๋ก ๋งค์ฃผ ์์์ผ ์๋ ์คํ
bash
0 9 * * 1 /usr/local/bin/ruby /path/to/bot.rb >> /var/log/music_monday_bot.log 2>&1
๋งค์ฃผ ์์์ผ ์์นจ 9์์ ์๋์ผ๋ก ์คํ๋ฉ๋๋ค.
์๋ฌ ๋ก๊ทธ ๋จ๊ธฐ๊ธฐ
begin ... rescue => e๋ธ๋ก์ ํ์ฉํด API ํธ์ถ ์คํจ ์ ๋ก๊ทธ ํ์ผ์ ๊ธฐ๋กํฉ๋๋ค.Slack webhook ์ฐ๋์ผ๋ก ์ค์๊ฐ ์๋ฆผ์ ๋ฐ์ ์๋ ์์ต๋๋ค.
ํ๊ฒฝ ๋ณ์ ๋ณด์
.envํ์ผ์SPOTIFY_CLIENT_ID,SPOTIFY_CLIENT_SECRET,SPOTIFY_PLAYLIST_ID๋ฅผ ์ ์ฅํ๊ณ , Git์ ์ปค๋ฐํ์ง ์๋๋ก.gitignore์ ์ถ๊ฐํฉ๋๋ค.
ํธ๋ ๋งค์นญ ์ ํ๋ ํฅ์
RSpotify::Track.search๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ์ฒด ํ ์คํธ ๋งค์นญ์ ์ฌ์ฉํฉ๋๋ค.ํ์ ์
limit: 1, market: 'KR'์ต์ ์ ์ถ๊ฐํด ํ๊ตญ ์์ฅ์ ๋ง๋ ๊ฒฐ๊ณผ๋ฅผ ์ฐ์ ๋ฐํํ๋๋ก ํ ์ ์์ต๋๋ค.
# ๐ 4. ๊ธฐ๋ ํจ๊ณผ์ ํ์ฉ ์์ด๋์ด
| ๊ธฐ๋ ํจ๊ณผ | ๊ตฌ์ฒด์ ํ์ฉ |
|-----------|-------------|
| ์๊ฐ ์ ๊ฐ | ์์ญ ๊ฐ์ ๋๊ธ์ ์ผ์ผ์ด ๋ณต์ฌยท๋ถ์ฌ๋ฃ๊ธฐ ํ์ง ์์๋ ์๋์ผ๋ก ํ๋ ์ด๋ฆฌ์คํธ ์ ๋ฐ์ดํธ |
| ์ปค๋ฎค๋ํฐ ํ์ฑํ | Music Monday ์ฐธ์ฌ์๋ค์ด ์์ ์ ๊ณก์ด ๋ฐ๋ก Spotify์ ๋ฐ์๋๋ ๋ชจ์ต์ ๋ณด๋ฉฐ ์ฐธ์ฌ ์์ ์์น |
| ๋ฐ์ดํฐ ๋ถ์ | ์์ง๋ ๋๊ธ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ฃผ๊ฐ ์ธ๊ธฐ ํธ๋ ์ฐจํธ๋ฅผ ์๋ ์์ฑ ๊ฐ๋ฅ |
| ๋ค๋ฅธ ํ๋ซํผ ์ฐ๋ | Apple Music, YouTube Music ๋ฑ ๋ค๋ฅธ ์คํธ๋ฆฌ๋ฐ ์๋น์ค API์ ๊ต์ฒดํ์ฌ ๋ฉํฐํ๋ ์ด๋ฆฌ์คํธ ๊ด๋ฆฌ ๊ฐ๋ฅ |
# ๐ ๊ฒฐ๋ก โ ์ง๊ธ ๋ฐ๋ก ๋ด ํ๋ ์ด๋ฆฌ์คํธ๋ฅผ ์๋ํํด๋ณด์ธ์!
Music Monday์์ ๋งค์ฃผ ๊ณต์ ๋๋ ์์ ์ ์๋์ผ๋ก ๊ด๋ฆฌํ๋๋ผ ์๊ฐ์ ๋ญ๋นํ๊ณ ์๋์?
์์์ ์๊ฐํ Ruby ์๋ํ ์คํฌ๋ฆฝํธ๋ฅผ ํ์ฉํ๋ฉด, ๋๊ธ ํ๋๋ง ๋ฌ์๋ ์๋์ผ๋ก Spotify ํ๋ ์ด๋ฆฌ์คํธ ๋ง๋ค๊ธฐ๊ฐ ์๋ฃ๋ฉ๋๋ค.
1๏ธโฃ ํ๋ก์ ํธ๋ฅผ ๋ณต์ ํ๊ณ (git clone)
2๏ธโฃ bundle install โ .env ์ค์ โ ruby bot.rb ์คํ๋ง ํ๋ฉด ๋!
ํ๋ ์ ๋
์ง๊ธ ๋ฐ๋ก GitHub(https://github.com/mikeydorje/music-monday-spotify-open-source-sync-bot) ์์ ์ฝ๋๋ฅผ ๋ฐ์ ํฌํฌํ๊ณ , ๋๋ง์ ์ปค์คํ ํ๋ ์ด๋ฆฌ์คํธ๋ฅผ ๋ง๋ค์ด ๋ณด์ธ์.
๊ตฌํ ๊ณผ์ ์์ ๊ถ๊ธํ ์ ์ ๋๊ธ์ด๋ Issue ๋ก ๋จ๊ฒจ ์ฃผ์ธ์. ์ปค๋ฎค๋ํฐ์ ํจ๊ป ๋ ํ๋ถํ Music Monday ํ์ฉ๋ฒ์ ๋ง๋ค์ด๊ฐ์๋ค!
์์ ์ ๊ณต์ ํ๊ณ , ์๋ํ๋ ์ค์ค๋ก์๊ฒ ๋งก๊ธฐ์ธ์. ๐ถ๐
Comments
Join the discussionNo comments yet. Be the first to comment.