Class: Relay::Jukebox

Inherits:
Object
  • Object
show all
Defined in:
lib/relay/jukebox.rb

Instance Method Summary collapse

Instance Method Details

#add(name:, title:, track:) ⇒ Object

Raises:

  • (ArgumentError)


48
49
50
51
52
53
54
55
56
57
58
59
# File 'lib/relay/jukebox.rb', line 48

def add(name:, title:, track:)
  normalized_track = normalize_track(track)
  entry = {"name" => scrub_text(name), "title" => scrub_text(title), "track" => normalized_track}
  raise ArgumentError, "name is required" if entry["name"].empty?
  raise ArgumentError, "title is required" if entry["title"].empty?
  songs.each do |song|
    existing = entry(song)
    song.delete if same_track?(existing, entry) || same_song?(existing, entry)
  end
  Relay::Models::Song.create(**entry.transform_keys(&:to_sym))
  entry
end

#loadObject



8
9
10
# File 'lib/relay/jukebox.rb', line 8

def load
  Relay::Models::Song.order(:id).map { entry(_1) }
end

#normalize_track(url) ⇒ Object



12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# File 'lib/relay/jukebox.rb', line 12

def normalize_track(url)
  uri = URI.parse(url.to_s.strip)
  host = uri.host.to_s.downcase
  video_id =
    case host
    when "youtu.be"
      uri.path.split("/").reject(&:empty?).first
    when "youtube.com", "www.youtube.com", "m.youtube.com",
         "youtube-nocookie.com", "www.youtube-nocookie.com"
      extract_youtube_id(uri)
    end
  raise ArgumentError, "unsupported YouTube URL" if video_id.to_s.empty?
  "https://www.youtube-nocookie.com/embed/#{video_id}"
rescue URI::InvalidURIError
  raise ArgumentError, "invalid YouTube URL"
end

#remove(name: nil, title: nil, track: nil) ⇒ Object

Raises:

  • (ArgumentError)


29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
# File 'lib/relay/jukebox.rb', line 29

def remove(name: nil, title: nil, track: nil)
  normalized_name = name && normalize_text(name)
  normalized_title = title && normalize_text(title)
  normalized_track = track && normalize_track(track)
  raise ArgumentError, "name, title, or track is required" unless [normalized_name, normalized_title, normalized_track].any?
  removed = []
  songs.each do |song|
    entry = entry(song)
    matched = true
    matched &&= normalize_text(entry["name"]) == normalized_name if normalized_name
    matched &&= normalize_text(entry["title"]) == normalized_title if normalized_title
    matched &&= normalize_track(entry["track"]) == normalized_track if normalized_track
    next unless matched
    removed << entry
    song.delete
  end
  {removed: removed.length, entries: removed}
end