Class: Soundcloud2000::Models::Player

Inherits:
Object
  • Object
show all
Defined in:
lib/soundcloud2000/models/player.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initializePlayer

Returns a new instance of Player.



9
10
11
12
13
14
15
16
17
18
# File 'lib/soundcloud2000/models/player.rb', line 9

def initialize
  @track = nil
  @events = Events.new
  @folder = File.expand_path("~/.soundcloud2000")
  @seek_speed = {}
  @seek_time = {}
  create_player

  Dir.mkdir(@folder) unless File.exist?(@folder)
end

Instance Attribute Details

#eventsObject (readonly)

Returns the value of attribute events.



7
8
9
# File 'lib/soundcloud2000/models/player.rb', line 7

def events
  @events
end

#trackObject (readonly)

Returns the value of attribute track.



7
8
9
# File 'lib/soundcloud2000/models/player.rb', line 7

def track
  @track
end

Instance Method Details

#create_playerObject



20
21
22
23
24
25
26
27
28
29
# File 'lib/soundcloud2000/models/player.rb', line 20

def create_player
  @player = Audite.new
  @player.events.on(:position_change) do |position|
    events.trigger(:progress)
  end

  @player.events.on(:complete) do
    events.trigger(:complete)
  end
end

#download_progressObject



80
81
82
83
84
85
86
# File 'lib/soundcloud2000/models/player.rb', line 80

def download_progress
  if @download
    @download.progress / @download.total.to_f
  else
    1
  end
end

#durationObject



42
43
44
# File 'lib/soundcloud2000/models/player.rb', line 42

def duration
  @track.duration.to_f / 1000
end

#forwardObject



120
121
122
123
124
125
126
# File 'lib/soundcloud2000/models/player.rb', line 120

def forward
  seconds = seek_speed(:forward)

  if ((seconds + seconds_played) / duration) < download_progress
    @player.forward(seconds)
  end
end

#length_in_secondsObject



50
51
52
53
# File 'lib/soundcloud2000/models/player.rb', line 50

def length_in_seconds
  mpg = Mpg123.new(@file)
  mpg.length * mpg.tpf / mpg.spf
end

#levelObject



72
73
74
# File 'lib/soundcloud2000/models/player.rb', line 72

def level
  @player.level
end

#load(track, location, &block) ⇒ Object



55
56
57
58
59
60
61
62
63
64
65
66
# File 'lib/soundcloud2000/models/player.rb', line 55

def load(track, location, &block)
  @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) ⇒ Object



68
69
70
# File 'lib/soundcloud2000/models/player.rb', line 68

def log(*args)
  Soundcloud2000::Application.logger.debug 'Player: ' + args.join(" ")
end

#play(track, location) ⇒ Object



31
32
33
34
35
36
# File 'lib/soundcloud2000/models/player.rb', line 31

def play(track, location)
  log :play, track.id
  @track = track
  load(track, location)
  start
end

#play_progressObject



38
39
40
# File 'lib/soundcloud2000/models/player.rb', line 38

def play_progress
  seconds_played / duration
end

#playing?Boolean

Returns:

  • (Boolean)


88
89
90
# File 'lib/soundcloud2000/models/player.rb', line 88

def playing?
  @player.active
end

#rewindObject



116
117
118
# File 'lib/soundcloud2000/models/player.rb', line 116

def rewind
  @player.rewind(seek_speed(:rewind))
end

#seconds_playedObject



76
77
78
# File 'lib/soundcloud2000/models/player.rb', line 76

def seconds_played
  @player.position
end

#seek_position(position) ⇒ Object

change song position



103
104
105
106
107
108
109
110
111
112
113
114
# File 'lib/soundcloud2000/models/player.rb', line 103

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) ⇒ Object



92
93
94
95
96
97
98
99
100
101
# File 'lib/soundcloud2000/models/player.rb', line 92

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

#startObject



132
133
134
# File 'lib/soundcloud2000/models/player.rb', line 132

def start
  @player.start_stream
end

#stopObject



128
129
130
# File 'lib/soundcloud2000/models/player.rb', line 128

def stop
  @player.stop_stream
end

#titleObject



46
47
48
# File 'lib/soundcloud2000/models/player.rb', line 46

def title
  [@track.title, @track.user.username].join(' - ')
end

#toggleObject



136
137
138
# File 'lib/soundcloud2000/models/player.rb', line 136

def toggle
  @player.toggle
end