class Soundcloud9000::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/soundcloud9000/models/player.rb, line 10
def initialize
  @track = nil
  @events = Events.new
  @folder = File.expand_path('~/.soundcloud9000')
  @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/soundcloud9000/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/soundcloud9000/models/player.rb, line 85
def download_progress
  @download ? @download.progress / @download.total.to_f : 1
end
duration() click to toggle source
# File lib/soundcloud9000/models/player.rb, line 43
def duration
  @track.duration.to_f / 1000
end
forward() click to toggle source
# File lib/soundcloud9000/models/player.rb, line 122
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/soundcloud9000/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/soundcloud9000/models/player.rb, line 77
def level
  @player.level
end
load(track, location) click to toggle source
# File lib/soundcloud9000/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
    begin
      File.unlink(@file)
    rescue StandardError
      nil
    end
    @download = DownloadThread.new(location, @file)
  else
    @download = nil
  end

  @player.load(@file)
end
log(*args) click to toggle source
# File lib/soundcloud9000/models/player.rb, line 73
def log(*args)
  Soundcloud9000::Application.logger.debug 'Player: ' + args.join(' ')
end
play(track, location) click to toggle source
# File lib/soundcloud9000/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/soundcloud9000/models/player.rb, line 39
def play_progress
  seconds_played / duration
end
playing?() click to toggle source
# File lib/soundcloud9000/models/player.rb, line 89
def playing?
  @player.active
end
rewind() click to toggle source
# File lib/soundcloud9000/models/player.rb, line 118
def rewind
  @player.rewind(seek_speed(:rewind))
end
seconds_played() click to toggle source
# File lib/soundcloud9000/models/player.rb, line 81
def seconds_played
  @player.position
end
seek_position(position) click to toggle source

change song position

# File lib/soundcloud9000/models/player.rb, line 105
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/soundcloud9000/models/player.rb, line 93
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/soundcloud9000/models/player.rb, line 133
def start
  @player.start_stream
end
stop() click to toggle source
# File lib/soundcloud9000/models/player.rb, line 129
def stop
  @player.stop_stream
end
title() click to toggle source
# File lib/soundcloud9000/models/player.rb, line 47
def title
  [@track.title, @track.user.username].join(' - ')
end
toggle() click to toggle source
# File lib/soundcloud9000/models/player.rb, line 137
def toggle
  @player.toggle
end