class MusicCompare::Compare

Public Class Methods

new(client_id: ENV['CLIENT_ID'], client_secret: ENV['CLIENT_SECRET']) click to toggle source
# File lib/music_compare.rb, line 12
def initialize(client_id: ENV['CLIENT_ID'], client_secret: ENV['CLIENT_SECRET'])
  RSpotify.authenticate(client_id, client_secret)
end

Public Instance Methods

compare(playlist1, playlist2, dir_path: '') click to toggle source
# File lib/music_compare.rb, line 16
def compare(playlist1, playlist2, dir_path: '')
  fetch_playlists!([playlist1, playlist2], dir_path: dir_path)
  file1 = CSV.read(playlist_path(playlist1, dir_path: @dir_path))
  file2 = CSV.read(playlist_path(playlist2, dir_path: @dir_path))
  matches_arr = file1 & file2
  CSV.open("#{dir_path}matches.csv", 'w') do |matches|
    matches_arr.each { |line| matches << line }
  end
  rm_dir(dir_path)
end
fetch_playlists!(playlists, dir_path: '') click to toggle source
# File lib/music_compare.rb, line 27
def fetch_playlists!(playlists, dir_path: '')
  create_dir(dir_path)
  playlists.each do |playlist|
    response = make_request(playlist_request(playlist))
    CSV.open(playlist_path(playlist, dir_path: @dir_path), 'a') do |playlist_file|
      loop do
        response['items'].each do |track|
          playlist_file << [
            track['track']['name'],
            track['track']['artists'].map { |artist| artist['name'] }.join(' ')
          ]
        end
        break if response['next'].nil?

        response = make_request(response['next'])
      end
    end
  end
end

Private Instance Methods

create_dir(dir_path) click to toggle source
# File lib/music_compare.rb, line 59
def create_dir(dir_path)
  process_dir_path!(dir_path)
  Dir.mkdir("#{dir_path}playlists")
rescue Errno::ENOENT
  @dir_path = ''
  Dir.mkdir('playlists')
end
make_request(request) click to toggle source
# File lib/music_compare.rb, line 49
def make_request(request)
  RSpotify.resolve_auth_request(nil, request)
rescue RestClient::BadRequest
  raise Error, 'invalid playlist id'
end
playlist_path(playlist, dir_path: '') click to toggle source
# File lib/music_compare.rb, line 67
def playlist_path(playlist, dir_path: '')
  "#{dir_path}playlists/#{playlist}.csv"
end
playlist_request(playlist) click to toggle source
# File lib/music_compare.rb, line 71
def playlist_request(playlist)
  "playlists/#{playlist}/tracks?fields=items(track(name,artists(name))),next"
end
process_dir_path!(dir_path) click to toggle source
# File lib/music_compare.rb, line 75
def process_dir_path!(dir_path)
  return if dir_path.empty?

  @dir_path = dir_path
  @dir_path << '/' unless dir_path.end_with?('/')
end
rm_dir(dir_path) click to toggle source
# File lib/music_compare.rb, line 55
def rm_dir(dir_path)
  FileUtils.rm_rf("#{dir_path}playlists")
end