Class: Soundcloud2000::Models::Player
- Inherits:
-
Object
- Object
- Soundcloud2000::Models::Player
- Defined in:
- lib/soundcloud2000/models/player.rb
Instance Attribute Summary collapse
-
#events ⇒ Object
readonly
Returns the value of attribute events.
-
#track ⇒ Object
readonly
Returns the value of attribute track.
Instance Method Summary collapse
- #create_player ⇒ Object
- #download_progress ⇒ Object
- #duration ⇒ Object
- #forward ⇒ Object
-
#initialize ⇒ Player
constructor
A new instance of Player.
- #length_in_seconds ⇒ Object
- #level ⇒ Object
- #load(track, location, &block) ⇒ Object
- #log(*args) ⇒ Object
- #play(track, location) ⇒ Object
- #play_progress ⇒ Object
- #playing? ⇒ Boolean
- #rewind ⇒ Object
- #seconds_played ⇒ Object
-
#seek_position(position) ⇒ Object
change song position.
- #seek_speed(direction) ⇒ Object
- #start ⇒ Object
- #stop ⇒ Object
- #title ⇒ Object
- #toggle ⇒ Object
Constructor Details
#initialize ⇒ Player
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.("~/.soundcloud2000") @seek_speed = {} @seek_time = {} create_player Dir.mkdir(@folder) unless File.exist?(@folder) end |
Instance Attribute Details
#events ⇒ Object (readonly)
Returns the value of attribute events.
7 8 9 |
# File 'lib/soundcloud2000/models/player.rb', line 7 def events @events end |
#track ⇒ Object (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_player ⇒ Object
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_progress ⇒ Object
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 |
#duration ⇒ Object
42 43 44 |
# File 'lib/soundcloud2000/models/player.rb', line 42 def duration @track.duration.to_f / 1000 end |
#forward ⇒ Object
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_seconds ⇒ Object
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 |
#level ⇒ Object
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_progress ⇒ Object
38 39 40 |
# File 'lib/soundcloud2000/models/player.rb', line 38 def play_progress seconds_played / duration end |
#playing? ⇒ Boolean
88 89 90 |
# File 'lib/soundcloud2000/models/player.rb', line 88 def @player.active end |
#rewind ⇒ Object
116 117 118 |
# File 'lib/soundcloud2000/models/player.rb', line 116 def rewind @player.rewind(seek_speed(:rewind)) end |
#seconds_played ⇒ Object
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 |
#start ⇒ Object
132 133 134 |
# File 'lib/soundcloud2000/models/player.rb', line 132 def start @player.start_stream end |
#stop ⇒ Object
128 129 130 |
# File 'lib/soundcloud2000/models/player.rb', line 128 def stop @player.stop_stream end |
#title ⇒ Object
46 47 48 |
# File 'lib/soundcloud2000/models/player.rb', line 46 def title [@track.title, @track.user.username].join(' - ') end |
#toggle ⇒ Object
136 137 138 |
# File 'lib/soundcloud2000/models/player.rb', line 136 def toggle @player.toggle end |