Class: Relay::Jukebox
- Inherits:
-
Object
- Object
- Relay::Jukebox
- Defined in:
- lib/relay/jukebox.rb
Instance Method Summary collapse
- #add(name:, title:, track:) ⇒ Object
- #load ⇒ Object
- #normalize_track(url) ⇒ Object
- #remove(name: nil, title: nil, track: nil) ⇒ Object
Instance Method Details
#add(name:, title:, track:) ⇒ Object
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 |
#load ⇒ Object
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
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 |