# 🎧 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 ruby`

- Windows: [RubyInstaller](https://rubyinstaller.org/) 사용

- Linux: `sudo apt-get install ruby-full`

## # 2.2 Spotify 개발자 계정 만들기

1. [Spotify Developer Dashboard](https://developer.spotify.com/dashboard/)에 로그인

2. “Create an App” 클릭 → **Client ID**와 **Client Secret** 복사

3. **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️⃣ 배포와 자동 실행 – 매주 월요일 자동 동기화

1. **GitHub에 저장**

   
```
bash

   git init

   git add .

   git commit -m 'Initial commit – Music Monday Spotify Sync Bot'

   git push origin main

   
```

2. **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로 보내 주세요!

음악을 사랑하는 모든 개발자와 청취자가 함께 만드는 **오픈소스 동기화 봇**, 여러분의 참여를 기다립니다. 🎶🚀
