Skip to main content

๐ŸŽง Music Monday์™€ Spotify๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ์˜คํ”ˆ์†Œ์Šค Ruby Sync Bot ๋งŒ๋“ค๊ธฐ (50~60์ž)

Published 4 min readMarkdown

# ๐Ÿ“Œ ์„œ๋ก  โ€“ โ€œ์Œ์•…์„ ๊ณต์œ ํ–ˆ๋Š”๋ฐ ์žฌ์ƒ๋ชฉ๋ก์— ์ž๋™ ๋ฐ˜์˜์ด ์•ˆ๋ผ์š”!โ€

Music Monday(๋ฎค์ง ๋จผ๋ฐ์ด)๋Š” ๋งค์ฃผ ์›”์š”์ผ๋งˆ๋‹ค ์ปค๋ฎค๋‹ˆํ‹ฐ ๋ฉค๋ฒ„๋“ค์ด ์ž์‹ ์ด ์ข‹์•„ํ•˜๋Š” ๊ณก์„ ๋Œ“๊ธ€๋กœ ๊ณต์œ ํ•˜๋Š” ์Œ์•… ์ถ”์ฒœ ์ด๋ฒคํŠธ์ž…๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์ด๋ ‡๊ฒŒ ๊ณต์œ ๋œ ํŠธ๋ž™์„ ์ผ์ผ์ด Spotify ํ”Œ๋ ˆ์ด๋ฆฌ์ŠคํŠธ์— ์ถ”๊ฐ€ํ•œ๋‹ค๋ฉด ์‹œ๊ฐ„๋„ ๋งŽ์ด ๋“ค๊ณ , ์‹ค์ˆ˜๋„ ๋ฐœ์ƒํ•˜๊ธฐ ์‰ฝ์ฃ .

๋ฌธ์ œ:โ€ฏMusic Monday ๋Œ“๊ธ€์— ์ ํžŒ ๊ณก ์ •๋ณด๋ฅผ ์ž๋™์œผ๋กœ Spotify ํ”Œ๋ ˆ์ด๋ฆฌ์ŠคํŠธ์— ๋™๊ธฐํ™”ํ•˜๊ณ  ์‹ถ์ง€๋งŒ, ์ด๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ์‰ฌ์šด ๋ฐฉ๋ฒ•์ด ์—†๋‹ค.

์ด ๊ธ€์—์„œ๋Š” Ruby ๋กœ ๋งŒ๋“  ๊ฐ„๋‹จํ•œ ์˜คํ”ˆ์†Œ์Šค Sync Bot์„ ํ™œ์šฉํ•ด, ๋Œ“๊ธ€์— ์ ํžŒ ๊ณก์„ ์ž๋™์œผ๋กœ Spotify์— ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ดˆ๋ณด์ž๋„ ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๊ฒŒ ๋‹จ๊ณ„๋ณ„๋กœ ์•ˆ๋‚ดํ•ฉ๋‹ˆ๋‹ค.

SEO ํ‚ค์›Œ๋“œ

  1. Spotify ํ”Œ๋ ˆ์ด๋ฆฌ์ŠคํŠธ ๋งŒ๋“ค๊ธฐ

  2. Ruby ์ž๋™ํ™” ์Šคํฌ๋ฆฝํŠธ

  3. 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. ์‹ค์ œ ์šด์˜ ํŒ โ€“ ์ž๋™ํ™”์™€ ์—๋Ÿฌ ์ฒ˜๋ฆฌ

  1. ํฌ๋ก ์žก์œผ๋กœ ๋งค์ฃผ ์›”์š”์ผ ์ž๋™ ์‹คํ–‰
bash

   0 9 * * 1 /usr/local/bin/ruby /path/to/bot.rb >> /var/log/music_monday_bot.log 2>&1

๋งค์ฃผ ์›”์š”์ผ ์•„์นจ 9์‹œ์— ์ž๋™์œผ๋กœ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

  1. ์—๋Ÿฌ ๋กœ๊ทธ ๋‚จ๊ธฐ๊ธฐ

    • begin ... rescue => e ๋ธ”๋ก์„ ํ™œ์šฉํ•ด API ํ˜ธ์ถœ ์‹คํŒจ ์‹œ ๋กœ๊ทธ ํŒŒ์ผ์— ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค.

    • Slack webhook ์—ฐ๋™์œผ๋กœ ์‹ค์‹œ๊ฐ„ ์•Œ๋ฆผ์„ ๋ฐ›์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

  2. ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ๋ณด์•ˆ

    • .env ํŒŒ์ผ์— SPOTIFY_CLIENT_ID, SPOTIFY_CLIENT_SECRET, SPOTIFY_PLAYLIST_ID ๋ฅผ ์ €์žฅํ•˜๊ณ , Git์— ์ปค๋ฐ‹ํ•˜์ง€ ์•Š๋„๋ก .gitignore ์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  3. ํŠธ๋ž™ ๋งค์นญ ์ •ํ™•๋„ ํ–ฅ์ƒ

    • 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 ํ™œ์šฉ๋ฒ•์„ ๋งŒ๋“ค์–ด๊ฐ‘์‹œ๋‹ค!

์Œ์•…์€ ๊ณต์œ ํ•˜๊ณ , ์ž๋™ํ™”๋Š” ์Šค์Šค๋กœ์—๊ฒŒ ๋งก๊ธฐ์„ธ์š”. ๐ŸŽถ๐Ÿš€

No comments yet. Be the first to comment.

More from this blog