๐ง Music Monday โ Spotify ์๋ ๋๊ธฐํ Ruby Bot ๋ง๋ค๊ธฐ
(Spotifyโฏํ๋ ์ด๋ฆฌ์คํธ ์๋ํยทRubyโฏ์คํฌ๋ฆฝํธยทMusicโฏMonday ์ฐ๋)
# ๐ ์๋ก โ โ๋๊ธ์ ์ ํ ๊ณก์ ์ผ์ผ์ด ์ถ๊ฐํ๋ ๋ถํธํจ, ์ด์ ๋ ๋!โ
ํ๋ก ํธ์๋ยท๋ฐฑ์๋ ๊ฐ๋ฐ์๋ผ๋ฉด API ํ์ฉ์ ํตํด ์ฌ๋ฌ ์๋น์ค๋ฅผ ์ฐ๊ฒฐํ๋ ์ฌ๋ฏธ๋ฅผ ๋ง์ด ๋๊ปด๋ณด์ จ์ ๊ฒ๋๋ค.
๊ทธ ์ค์์๋ Music Monday๋ ๋งค์ฃผ ์์์ผ ์ปค๋ฎค๋ํฐ ๋ฉค๋ฒ๋ค์ด ๋๊ธ์ ์์ ์ด ์ข์ํ๋ ๊ณก์ ๊ณต์ ํ๋ ์์ ์ถ์ฒ ์ด๋ฒคํธ์ ๋๋ค.
ํ์ง๋ง ์ด๋ ๊ฒ ๊ณต์ ๋ ๊ณก์ Spotify ํ๋ ์ด๋ฆฌ์คํธ์ ์ง์ ์ถ๊ฐํ๋ ค๋ฉด ๋๊ธ์ ํ๋์ฉ ๋ณต์ฌํ๊ณ , ๊ฒ์ํ๊ณ , โ๋ด ํ๋ ์ด๋ฆฌ์คํธ์ ์ถ๊ฐโ ๋ฒํผ์ ๋๋ฌ์ผ ํฉ๋๋ค.
์์ ํ์ด๋ ๊ฐ์ธ ํ๋ก์ ํธ์์๋ ์ด ์์ ์ด ์๊ฐ ๋ญ๋น์ด์ ์ค๋ฅ ๋ฐ์ ๊ฐ๋ฅ์ฑ์ด ๋์์ง๋๋ค.
๋ฌธ์ : Music Monday์ ๋ฌ๋ฆฐ ๋๊ธ์ ์๋์ผ๋ก ์ฝ์ดโฏSpotifyโฏํ๋ ์ด๋ฆฌ์คํธ์ ๋๊ธฐํํ๊ณ ์ถ๋ค.
์ด ๊ธ์์๋ Ruby ๋ก ๋ง๋ ๊ฐ๋ฒผ์ด ์คํ์์ค Sync Bot์ ์ด์ฉํด, ์ ๋ฌธ์ ๋ฅผ ์ด๋ณด์๋ 30๋ถ ์์ ๊ตฌํํ ์ ์๋๋ก ๋จ๊ณ๋ณ๋ก ์๋ดํฉ๋๋ค.
SEO ํค์๋
Spotifyโฏํ๋ ์ด๋ฆฌ์คํธโฏ์๋ํ
Rubyโฏ์คํฌ๋ฆฝํธ
MusicโฏMondayโฏ์ฐ๋
# ๐ ๏ธ 1. ์ค๋น ๋จ๊ณ โ ํ์ ๋๊ตฌ์ ๊ณ์ ์ค์
| ํญ๋ชฉ | ์ด์ | ์ค์ ๋ฐฉ๋ฒ |
|------|------|----------|
| Ruby (โฅโฏ2.7) | ์คํฌ๋ฆฝํธ ์คํ ํ๊ฒฝ | rbenv ํน์ rvm ์ผ๋ก ์ค์น โ ruby -v ํ์ธ |
| Bundler | ์์กด์ฑ ๊ด๋ฆฌ | gem install bundler |
| SpotifyโฏDeveloperโฏAccount | APIโฏํค(ํด๋ผ์ด์ธํธโฏID/์ํฌ๋ฆฟ) ๋ฐ๊ธ | https://developer.spotify.com/dashboard โ โCreate Appโ โ Client ID์ Client Secret ๋ณต์ฌ |
| MusicโฏMondayโฏAPI (๋น๊ณต์) | ๋๊ธ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ค๊ธฐ ์ํ ์๋ํฌ์ธํธ | https://api.musicmonday.com/v1/comments?topic=spotify (์์) |
| dotenv | ํ๊ฒฝ ๋ณ์(.env) ํ์ผ ๊ด๋ฆฌ | .env ํ์ผ์ ํค๊ฐ ์ ์ฅ, .gitignore์ ์ถ๊ฐ |
Tip: Ruby ์ด๋ณด์๋
irb๋ก ํ ์ค์ฉ ์ฝ๋๋ฅผ ์คํํด ๋ณด๋ฉด์ ๋์์ ํ์ธํ๋ฉด ๋๋ฒ๊น ์ด ์ฌ์์ง๋๋ค.
# ๐ 2. ํ๋ก์ ํธ ๊ตฌ์กฐ์ ํต์ฌ ํ์ผ
music-monday-spotify-bot/
โ
โโ Gemfile # ์ฌ์ฉ gem ์ ์
โโ .env # API ํคยทํ๋ ์ด๋ฆฌ์คํธ ID ์ ์ฅ
โโ bot.rb # ๋ฉ์ธ ์คํ ํ์ผ
โโ lib/
โโ spotify_client.rb # Spotify API ๋ํผ
# 2โ1. Gemfile
ruby
source 'https://rubygems.org'
gem 'httparty' # HTTP ์์ฒญ
gem 'rspotify' # Spotify API ๋ํผ
gem 'dotenv' # .env ๋ก ํ๊ฒฝ ๋ณ์ ๋ก๋
bash
bundle install
# 2โ2. Spotify ํด๋ผ์ด์ธํธ ๊ตฌํ (lib/spotify_client.rb)
ruby
require 'rspotify'
require 'dotenv/load'
# Spotify ์ธ์ฆ (ํด๋ผ์ด์ธํธ ID/์ํฌ๋ฆฟ)
RSpotify.authenticate(ENV['SPOTIFY_CLIENT_ID'],
ENV['SPOTIFY_CLIENT_SECRET'])
class SpotifyClient
def initialize(playlist_id)
user = RSpotify::User.find('me')
@playlist = user.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
if @playlist.tracks.map(&:id).include?(track.id)
puts 'โน๏ธ '#{track_name}' ์(๋) ์ด๋ฏธ ์กด์ฌํฉ๋๋ค.'
else
@playlist.add_tracks!([track])
puts 'โ
'#{track_name}' - #{artist_name} ๋ฅผ ์ถ๊ฐํ์ต๋๋ค.'
end
end
end
# 2โ3. ๋ฉ์ธ ๋ก์ง (bot.rb)
ruby
require 'httparty'
require 'json'
require_relative './lib/spotify_client'
# 1๏ธโฃ Music Monday ๋๊ธ์ ๋ฐ์์ค๋ ํจ์
def fetch_comments
url = 'https://api.musicmonday.com/v1/comments?topic=spotify'
resp = HTTParty.get(url)
JSON.parse(resp.body)['data'] # [{ 'track':'Bad Guy','artist':'Billie Eilish' }, ...]
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. ์ค์ ์ด์ ํ โ ์๋ํยท์๋ฌยท๋ณด์
# 3โ1. ํฌ๋ก ์ก์ผ๋ก ๋งค์ฃผ ์๋ ์คํ
bash
# ๋งค์ฃผ ์์์ผ ์๋ฒฝ 6์ (ํ๊ตญ์๊ฐ 15์) ์คํ
0 6 * * 1 /usr/local/bin/ruby /path/to/bot.rb >> /var/log/music_monday_bot.log 2>&1
# 3โ2. ์๋ฌ ๋ก๊ทธ์ ์๋ฆผ
ruby
begin
sync_to_spotify
rescue => e
File.open('error.log', 'a') { |f| f.puts('[#{Time.now}] #{e.message}') }
# Slack webhook ์ผ๋ก ์ค์๊ฐ ์๋ฆผ๋ ๊ฐ๋ฅ
end
# 3โ3. ํ๊ฒฝ ๋ณ์ ๋ณด์
.envํ์ผ์SPOTIFY_CLIENT_ID,SPOTIFY_CLIENT_SECRET,SPOTIFY_PLAYLIST_ID๋ฅผ ์ ์ฅ.gitignore์.env๋ฅผ ๋ฐ๋์ ์ถ๊ฐํด ๋ ํฌ์ ๋ ธ์ถ๋์ง ์๊ฒ
# 3โ4. ๊ฒ์ ์ ํ๋ ํฅ์
ruby
results = RSpotify::Track.search('#{track_name} #{artist_name}',
limit: 1,
market: 'KR')
market ์ต์
์ ์ง์ ํ๋ฉด ํ๊ตญ ๋ด ์ธ๊ธฐ ๋ฒ์ ์ ์ฐ์ ๋ฐํํด ๊ฒ์ ์ ํ๋๊ฐ ๋์์ง๋๋ค.
# ๐ 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 ๋ก ๋จ๊ธฐ๊ฑฐ๋, Devโฏto ๋๊ธ์ ์ง๋ฌธํด ์ฃผ์ธ์. ์ปค๋ฎค๋ํฐ์ ํจ๊ป ์ฑ์ฅํ๋ Music Monday ์ฐ๋ ํ๋ก์ ํธ๊ฐ ๋ ๊ฒ์ ๋๋ค!
์์ ์ ๊ณต์ ํ๊ณ , ์๋ํ๋ ์ค์ค๋ก์๊ฒ ๋งก๊ธฐ์ธ์. ๐ถ๐
Comments
Join the discussionNo comments yet. Be the first to comment.