๐ง Music Monday์ Spotify๋ฅผ ์ฐ๊ฒฐํ๋ ์คํ์์ค ๋๊ธฐํ ๋ด ๋ง๋ค๊ธฐ (Ruby ์ด๋ณด์๋ ์ฝ๊ฒ ๋ฐ๋ผํด์)
# ์๋ก โ โ์์ ๊ณต์ ๊ฐ ์ฌ๊ธฐ์ ๋ฉ์ถ๋ฉด ์ ๋์์์?โ
Music Monday๋ ๋งค์ฃผ ์์์ผ๋ง๋ค ์ปค๋ฎค๋ํฐ ๋ฉค๋ฒ๋ค์ด ๋๊ธ์ ์ถ์ฒ๊ณก์ ๋จ๊ธฐ๋ ์์ ๊ณต์ ํ๋ก์ ํธ์ ๋๋ค.
ํ์ง๋ง ๋๊ธ์ ์ ํ ๊ณก๋ค์ ์ผ์ผ์ด ์ฐพ์์ Spotifyโฏํ๋ ์ด๋ฆฌ์คํธ์ ์ถ๊ฐํ๋ค๋ฉด ์๊ฐ๋ ์ค๋ ๊ฑธ๋ฆฌ๊ณ ์ค์๋ ์๊ธฐ๊ธฐ ๋ง๋ จ์ด์ฃ .
์ด๋ฐ ๋ถํธ์ ํด์ํ๊ณ ์ Ruby๋ก ๋ง๋ ์์ ์ ํธ๋ฆฌํฐ, Music Monday Spotify Sync Bot์ ์คํ์์ค๋ก ๊ณต๊ฐํ์ต๋๋ค.
์ด ๊ธ์์๋ Spotify ํ๋ ์ด๋ฆฌ์คํธ, Ruby ์๋ํ, Music Monday ๋ผ๋ SEO ํค์๋๋ฅผ ์ค์ฌ์ผ๋ก, ์ด๋ณด์๋ ์ดํดํ ์ ์๋๋ก ๋จ๊ณ๋ณ๋ก ๊ตฌํ ๊ณผ์ ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
# 1๏ธโฃ ํ๋ก์ ํธ ๊ฐ์ โ ์ด๋ค ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋์?
| ๋ฌธ์ | ๊ธฐ์กด ๋ฐฉ์ | ์๋ํ ์๋ฃจ์ |
|------|-----------|--------------|
| ๋๊ธ์ ์ ํ ๊ณก์ ์๋์ผ๋ก ๊ฒ์ | Spotify ์ฑ์ ์ด๊ณ ๊ฒ์ โ ๊ณก ์ถ๊ฐ | Ruby ์คํฌ๋ฆฝํธ๊ฐ ๋๊ธ์ ํ์ฑ โ ๊ณก ID ์ถ์ถ โ API ํธ์ถ๋ก ์๋ ์ถ๊ฐ |
| ์ฌ๋ฌ ๊ณก์ ์ผ๊ด ์ถ๊ฐํ ๋ ์ค์ ๋ฐ์ | ํ๋์ฉ ํด๋ฆญ | ํ ๋ฒ์ ์ ์ฒด ๊ณก์ ์ฒ๋ฆฌ |
| ์์ ๊ธฐ๋ก์ด ๋จ์ง ์์ | ๊ธฐ์ต์ ์์กด | ๋ก๊ทธ ํ์ผ์ ์ฑ๊ณต/์คํจ ๊ธฐ๋ก ์ ์ฅ |
์ด๋ฌํ ๋ฌธ์ ๋ฅผ Ruby ์๋ํ ์คํฌ๋ฆฝํธ๊ฐ ํด๊ฒฐํฉ๋๋ค. ๊ฐ๋จํ ์ค์ ๋ง์ผ๋ก Music Monday ๋๊ธ์ ์ฝ๊ณ , ํด๋น ๊ณก์ Spotify ํ๋ ์ด๋ฆฌ์คํธ์ ์๋์ผ๋ก ๋๊ธฐํํฉ๋๋ค.
# 2๏ธโฃ ์ค๋น ๋จ๊ณ โ ํ์ ๋๊ตฌ์ ๊ณ์ ์ค์
# 2.1 Ruby ์ค์น
macOS:
brew install rubyWindows: RubyInstaller ์ฌ์ฉ
Linux:
sudo apt-get install ruby-full
# 2.2 Spotify ๊ฐ๋ฐ์ ๊ณ์ ๋ง๋ค๊ธฐ
Spotify Developer Dashboard์ ๋ก๊ทธ์ธ
โCreate an Appโ ํด๋ฆญ โ Client ID์ Client Secret ๋ณต์ฌ
Redirect URI์
http://localhost:8888/callback์ ๋ ฅ ํ ์ ์ฅ
# 2.3 Music Monday API (๋๋ ๋๊ธ ์คํฌ๋ํ) ์ค๋น
Music Monday๋ ๊ณต์ API๊ฐ ์์ผ๋ฏ๋ก, ๊ณต๊ฐ๋ RSS ํผ๋ ํน์ HTML ํ์ฑ์ ์ด์ฉํฉ๋๋ค. ์ด๋ฒ ์์ ์์๋ RSS ํผ๋๋ฅผ ํ์ฉํฉ๋๋ค.
# 2.4 ํ์ํ Gem ์ค์น
bash
gem install httparty json dotenv
httparty: HTTP ์์ฒญ ์ฒ๋ฆฌjson: JSON ํ์ฑdotenv: ํ๊ฒฝ ๋ณ์ ๊ด๋ฆฌ
# 3๏ธโฃ ์ฝ๋ ๊ตฌํ โ ํต์ฌ ๋ก์ง 4๋จ๊ณ
# 3.1 ํ๊ฒฝ ๋ณ์ ๋ก๋ (.env ํ์ผ)
env
SPOTIFY_CLIENT_ID=your_client_id
SPOTIFY_CLIENT_SECRET=your_client_secret
SPOTIFY_PLAYLIST_ID=your_playlist_id
MUSIC_MONDAY_RSS=https://musicmonday.com/rss
# 3.2 Spotify ์ธ์ฆ ํ ํฐ ์ป๊ธฐ
ruby
require 'httparty'
require 'json'
require 'dotenv/load'
def fetch_spotify_token
response = HTTParty.post(
'https://accounts.spotify.com/api/token',
body: { grant_type: 'client_credentials' },
headers: {
'Authorization' => 'Basic #{Base64.strict_encode64('#{ENV['SPOTIFY_CLIENT_ID']}:#{ENV['SPOTIFY_CLIENT_SECRET']}')}'
}
)
JSON.parse(response.body)['access_token']
end
# 3.3 Music Monday ๋๊ธ์์ ํธ๋ ์ ๋ณด ์ถ์ถ
ruby
require 'rss'
def fetch_tracks_from_monday
rss = RSS::Parser.parse(ENV['MUSIC_MONDAY_RSS'], false)
tracks = []
rss.items.each do |item|
# ์์: ๋๊ธ์ 'Artist - Title' ํ์์ผ๋ก ์ ํ ๊ฒฝ์ฐ
if item.title =~ /(.*) - (.*)/
tracks << { artist: $1.strip, title: $2.strip }
end
end
tracks
end
# 3.4 Spotify์ ํธ๋ ์ถ๊ฐ
ruby
def search_spotify_track(token, artist, title)
query = URI.encode_www_form_component('track:#{title} artist:#{artist}')
url = 'https://api.spotify.com/v1/search?q=#{query}&type=track&limit=1'
response = HTTParty.get(url, headers: { 'Authorization' => 'Bearer #{token}' })
items = JSON.parse(response.body)['tracks']['items']
items.empty? ? nil : items.first['uri']
end
def add_tracks_to_playlist(token, uris)
url = 'https://api.spotify.com/v1/playlists/#{ENV['SPOTIFY_PLAYLIST_ID']}/tracks'
HTTParty.post(
url,
body: { uris: uris }.to_json,
headers: {
'Authorization' => 'Bearer #{token}',
'Content-Type' => 'application/json'
}
)
end
# ๋ฉ์ธ ์คํ ํ๋ฆ
token = fetch_spotify_token
tracks = fetch_tracks_from_monday
uris = tracks.map { |t| search_spotify_track(token, t[:artist], t[:title]) }.compact
add_tracks_to_playlist(token, uris) unless uris.empty?
puts 'โ
#{uris.size}๊ฐ์ ๊ณก์ด Spotify ํ๋ ์ด๋ฆฌ์คํธ์ ์ถ๊ฐ๋์์ต๋๋ค.'
Tip
search_spotify_trackํจ์๋ ๊ฒ์ ๊ฒฐ๊ณผ๊ฐ ์์ ๊ฒฝ์ฐnil์ ๋ฐํํฉ๋๋ค. ์ค์ ์ด์ ์์๋ ๋ก๊ทธ ํ์ผ์ ์คํจ ์์ธ์ ๋จ๊ฒจ๋๋ฉด ๋๋ฒ๊น ์ด ์ฌ์์.
# 4๏ธโฃ ๋ฐฐํฌ์ ์๋ ์คํ โ ๋งค์ฃผ ์์์ผ ์๋ ๋๊ธฐํ
- GitHub์ ์ ์ฅ
bash
git init
git add .
git commit -m 'Initial commit โ Music Monday Spotify Sync Bot'
git push origin main
- GitHub Actions ์ค์ (
.github/workflows/sync.yml)
yaml
name: Weekly Sync
on:
schedule:
- cron: '0 9 * * 1' # ๋งค์ฃผ ์์์ผ 09:00 UTC
jobs:
sync:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Set up Ruby
uses: ruby/setup-ruby@v1
with:
ruby-version: '3.2'
- name: Install dependencies
run: gem install httparty json dotenv
- name: Run sync script
env:
SPOTIFY_CLIENT_ID: ${{ secrets.SPOTIFY_CLIENT_ID }}
SPOTIFY_CLIENT_SECRET: ${{ secrets.SPOTIFY_CLIENT_SECRET }}
SPOTIFY_PLAYLIST_ID: ${{ secrets.SPOTIFY_PLAYLIST_ID }}
MUSIC_MONDAY_RSS: ${{ secrets.MUSIC_MONDAY_RSS }}
run: ruby sync.rb
์ด๋ ๊ฒ ํ๋ฉด ๋งค์ฃผ ์์์ผ ์๋์ผ๋ก ์ต์ ๋๊ธ์ ์ฝ๊ณ , Spotify ํ๋ ์ด๋ฆฌ์คํธ์ ๋ฐ์๋ฉ๋๋ค. ๋ณ๋์ ์๋ฒ๋ฅผ ์ด์ํ ํ์ ์์ด GitHubโฏActions๋ง์ผ๋ก ์ถฉ๋ถํฉ๋๋ค.
# 5๏ธโฃ ํ์ฅ ์์ด๋์ด โ ์ฌ๋ฌ๋ถ๋ง์ ์ปค์คํ ๋ด ๋ง๋ค๊ธฐ
| ์์ด๋์ด | ๊ตฌํ ๋ฐฉ๋ฒ |
|----------|-----------|
| ๋ค๋ฅธ ์คํธ๋ฆฌ๋ฐ ์๋น์ค ์ฐ๋ | AppleโฏMusic, YouTube Music API ํ์ฉ |
| ๋๊ธ ํฌ๋งท ๋ค์ํ | ์ ๊ทํํ์ ์ถ๊ฐยท์์ |
| ์๋ฆผ ๊ธฐ๋ฅ | Discord webhook ๋๋ Slack ๋ฉ์์ง ์ ์ก |
| UI ์ ๊ณต | Sinatra ํน์ Rails๋ก ๊ฐ๋จํ ์น ๋์๋ณด๋ ๊ตฌ์ถ |
์์ ๊ฐ์ ๊ธฐ๋ฅ์ ์ฐจ๊ทผ์ฐจ๊ทผ ์ถ๊ฐํ๋ฉด, Ruby ์๋ํ ์คํฌ๋ ์์ฐ์ค๋ฝ๊ฒ ํฅ์๋ฉ๋๋ค.
# ๊ฒฐ๋ก โ ์ง๊ธ ๋ฐ๋ก ์์ํด ๋ณด์ธ์!
Music Monday์ ํ๋ถํ ์์ ์ถ์ฒ์ ๋์น์ง ๋ง๊ณ , Spotify ํ๋ ์ด๋ฆฌ์คํธ์ ์๋์ผ๋ก ๋๊ธฐํํด ๋ณด์ธ์.
1๏ธโฃ Ruby์ ํ๊ฒฝ ๋ณ์๋ง ์ค๋นํ๋ฉด 10๋ถ ์์ ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ ์ ์์ต๋๋ค.
2๏ธโฃ GitHubโฏActions๋ฅผ ์ด์ฉํด ๋งค์ฃผ ์์์ผ ์๋ ์คํ๊น์ง ์ค์ ํ๋ฉด, Music Monday์ Spotify๊ฐ ์๋ฒฝํ ์ฐ๊ฒฐ๋ฉ๋๋ค.
ํ๋ ์ ๋
์ง๊ธ ๋ฐ๋ก ๋ ํฌ์งํ ๋ฆฌ๋ฅผ ํฌํฌํ๊ณ ,
.envํ์ผ์ ๋ณธ์ธ ์ ๋ณด๋ฅผ ์ ๋ ฅํด ๋ณด์ธ์.์คํ ๊ฒฐ๊ณผ๋ฅผ ๋๊ธ๋ก ๊ณต์ ํ๊ฑฐ๋, ๊ฐ์ ์์ด๋์ด๋ฅผ Pull Request๋ก ๋ณด๋ด ์ฃผ์ธ์!
์์ ์ ์ฌ๋ํ๋ ๋ชจ๋ ๊ฐ๋ฐ์์ ์ฒญ์ทจ์๊ฐ ํจ๊ป ๋ง๋๋ ์คํ์์ค ๋๊ธฐํ ๋ด, ์ฌ๋ฌ๋ถ์ ์ฐธ์ฌ๋ฅผ ๊ธฐ๋ค๋ฆฝ๋๋ค. ๐ถ๐
Comments
Join the discussionNo comments yet. Be the first to comment.