class Sc20XX::Models::Player
responsible for drawing and updating the player above tracklist
Attributes
events[R]
track[R]
Public Class Methods
new()
click to toggle source
# File lib/sc20XX/models/player.rb, line 10 def initialize @track = nil @events = Events.new @folder = File.expand_path('~/.sc20XX') @seek_speed = {} @seek_time = {} create_player Dir.mkdir(@folder) unless File.exist?(@folder) end
Public Instance Methods
create_player()
click to toggle source
# File lib/sc20XX/models/player.rb, line 21 def create_player @player = Audite.new @player.events.on(:position_change) do events.trigger(:progress) end @player.events.on(:complete) do events.trigger(:complete) end end
download_progress()
click to toggle source
# File lib/sc20XX/models/player.rb, line 81 def download_progress @download ? @download.progress / @download.total.to_f : 1 end
duration()
click to toggle source
# File lib/sc20XX/models/player.rb, line 43 def duration @track.duration.to_f / 1000 end
forward()
click to toggle source
# File lib/sc20XX/models/player.rb, line 118 def forward seconds = seek_speed(:forward) seek_percentage = (seconds + seconds_played) / duration @player.forward(seconds) if seek_percentage < download_progress end
length_in_seconds()
click to toggle source
# File lib/sc20XX/models/player.rb, line 51 def length_in_seconds mpg = Mpg123.new(@file) mpg.length * mpg.tpf / mpg.spf end
level()
click to toggle source
# File lib/sc20XX/models/player.rb, line 73 def level @player.level end
load(track, location)
click to toggle source
# File lib/sc20XX/models/player.rb, line 56 def load(track, location) @file = "#{@folder}/#{track.id}.mp3" if !File.exist?(@file) || track.duration / 1000 > length_in_seconds * 0.95 File.unlink(@file) rescue nil @download = DownloadThread.new(location, @file) else @download = nil end @player.load(@file) end
log(*args)
click to toggle source
# File lib/sc20XX/models/player.rb, line 69 def log(*args) Soundcloud2000::Application.logger.debug 'Player: ' + args.join(' ') end
play(track, location)
click to toggle source
# File lib/sc20XX/models/player.rb, line 32 def play(track, location) log :play, track.id @track = track load(track, location) start end
play_progress()
click to toggle source
# File lib/sc20XX/models/player.rb, line 39 def play_progress seconds_played / duration end
playing?()
click to toggle source
# File lib/sc20XX/models/player.rb, line 85 def playing? @player.active end
rewind()
click to toggle source
# File lib/sc20XX/models/player.rb, line 114 def rewind @player.rewind(seek_speed(:rewind)) end
seconds_played()
click to toggle source
# File lib/sc20XX/models/player.rb, line 77 def seconds_played @player.position end
seek_position(position)
click to toggle source
change song position
# File lib/sc20XX/models/player.rb, line 101 def seek_position(position) position *= 0.1 relative_position = position * duration if relative_position < seconds_played difference = seconds_played - relative_position @player.rewind(difference) elsif download_progress > (relative_position / duration) && relative_position > seconds_played log download_progress difference = relative_position - seconds_played @player.forward(difference) end end
seek_speed(direction)
click to toggle source
# File lib/sc20XX/models/player.rb, line 89 def seek_speed(direction) if @seek_time[direction] && Time.now - @seek_time[direction] < 0.5 @seek_speed[direction] *= 1.05 else @seek_speed[direction] = 1 end @seek_time[direction] = Time.now @seek_speed[direction] end
start()
click to toggle source
# File lib/sc20XX/models/player.rb, line 129 def start @player.start_stream end
stop()
click to toggle source
# File lib/sc20XX/models/player.rb, line 125 def stop @player.stop_stream end
title()
click to toggle source
# File lib/sc20XX/models/player.rb, line 47 def title [@track.title, @track.user.username].join(' - ') end
toggle()
click to toggle source
# File lib/sc20XX/models/player.rb, line 133 def toggle @player.toggle end