mumbletune 0.1.3 → 0.2.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +3 -0
- data/Gemfile +3 -0
- data/Gemfile.lock +42 -49
- data/README.md +11 -10
- data/bin/mumbletune-ctl +23 -0
- data/conf.example.yaml +3 -4
- data/docs/commands.md +6 -3
- data/lib/mumbletune.rb +40 -35
- data/lib/mumbletune/collection.rb +25 -5
- data/lib/mumbletune/hallon_player.rb +162 -0
- data/lib/mumbletune/messages.rb +24 -19
- data/lib/mumbletune/mumble_client.rb +28 -9
- data/lib/mumbletune/resolver.rb +19 -32
- data/lib/mumbletune/spotify_resolver.rb +51 -0
- data/lib/mumbletune/{templates → template}/commands.mustache +4 -3
- data/lib/mumbletune/{templates → template}/queue.mustache +13 -11
- data/lib/mumbletune/version.rb +1 -1
- data/logs/.gitignore +4 -0
- data/mumbletune.gemspec +5 -10
- metadata +18 -82
- data/lib/mumbletune/handle_sp_error.rb +0 -23
- data/lib/mumbletune/mpd_client.rb +0 -171
- data/lib/mumbletune/sp_uri_server.rb +0 -42
- data/lib/mumbletune/spotify_track.rb +0 -90
- data/lib/mumbletune/track.rb +0 -32
data/lib/mumbletune/messages.rb
CHANGED
@@ -2,8 +2,6 @@ require 'uri'
|
|
2
2
|
require 'text'
|
3
3
|
require 'mustache'
|
4
4
|
|
5
|
-
Thread.abort_on_exception=true # development only
|
6
|
-
|
7
5
|
module Mumbletune
|
8
6
|
|
9
7
|
class Message
|
@@ -29,9 +27,6 @@ module Mumbletune
|
|
29
27
|
else
|
30
28
|
play_now = false
|
31
29
|
end
|
32
|
-
|
33
|
-
# reassurance that it's working
|
34
|
-
message.respond "I'm searching. Hang tight."
|
35
30
|
|
36
31
|
collection = Mumbletune.resolve(message.argument)
|
37
32
|
|
@@ -49,9 +44,6 @@ module Mumbletune
|
|
49
44
|
else
|
50
45
|
message.respond_all "#{message.sender.name} added #{collection.description} to the queue."
|
51
46
|
end
|
52
|
-
|
53
|
-
Mumbletune.player.play unless Mumbletune.player.playing?
|
54
|
-
|
55
47
|
|
56
48
|
else # user wants to unpause
|
57
49
|
if Mumbletune.player.paused?
|
@@ -77,9 +69,13 @@ module Mumbletune
|
|
77
69
|
|
78
70
|
|
79
71
|
when /^next$/i
|
80
|
-
Mumbletune.player.
|
81
|
-
|
82
|
-
|
72
|
+
if Mumbletune.player.any?
|
73
|
+
Mumbletune.player.next
|
74
|
+
current = Mumbletune.player.current_track
|
75
|
+
message.respond_all "#{message.sender.name} skipped to #{current.artist.name} - #{current.name}" if current
|
76
|
+
else
|
77
|
+
message.respond "We're at the end of the queue. Try adding something to play!"
|
78
|
+
end
|
83
79
|
|
84
80
|
when /^clear$/i
|
85
81
|
Mumbletune.player.clear_queue
|
@@ -96,22 +92,29 @@ module Mumbletune
|
|
96
92
|
|
97
93
|
when /^(what|queue)$/i
|
98
94
|
queue = Mumbletune.player.queue
|
95
|
+
current = Mumbletune.player.current_track
|
96
|
+
template_queue = Array.new
|
97
|
+
queue.each do |col|
|
98
|
+
template_col = {description: col.description, tracks: Array.new}
|
99
|
+
col.tracks.each { |t| template_col[:tracks] << {name: t.name, artist: t.artist.name, playing?: current == t, username: col.user} }
|
100
|
+
template_queue << template_col
|
101
|
+
end
|
99
102
|
|
100
103
|
# Now, a template.
|
101
104
|
rendered = Mustache.render Message.template[:queue],
|
102
|
-
:queue =>
|
105
|
+
:queue => template_queue,
|
103
106
|
:anything? => (queue.empty?) ? false : true
|
104
107
|
message.respond rendered
|
105
108
|
|
106
109
|
when /^volume\?$/i
|
107
|
-
message.respond "The volume is #{Mumbletune.
|
110
|
+
message.respond "The volume is #{Mumbletune.mumble.volume}."
|
108
111
|
|
109
112
|
when /^volume/i
|
110
113
|
if message.argument.length == 0
|
111
|
-
message.respond "The volume is #{Mumbletune.
|
114
|
+
message.respond "The volume is #{Mumbletune.mumble.volume}."
|
112
115
|
else
|
113
|
-
Mumbletune.
|
114
|
-
message.respond "Now the volume is #{Mumbletune.
|
116
|
+
Mumbletune.mumble.volume = message.argument
|
117
|
+
message.respond "Now the volume is #{Mumbletune.mumble.volume}."
|
115
118
|
end
|
116
119
|
|
117
120
|
when /^help$/i
|
@@ -126,8 +129,10 @@ module Mumbletune
|
|
126
129
|
|
127
130
|
rescue => err # Catch any command that errored.
|
128
131
|
message.respond "Woah, an error occurred: #{err.message}"
|
129
|
-
|
130
|
-
|
132
|
+
unless Mumbletune.verbose
|
133
|
+
puts "#{err.class}: #{err.message}"
|
134
|
+
puts err.backtrace
|
135
|
+
end
|
131
136
|
end
|
132
137
|
end
|
133
138
|
|
@@ -157,7 +162,7 @@ module Mumbletune
|
|
157
162
|
end
|
158
163
|
|
159
164
|
# load templates
|
160
|
-
Dir.glob(File.dirname(__FILE__) + "/
|
165
|
+
Dir.glob(File.dirname(__FILE__) + "/template/*.mustache").each do |f_path|
|
161
166
|
f = File.open(f_path)
|
162
167
|
Message.template[File.basename(f_path, ".mustache").to_sym] = f.read
|
163
168
|
end
|
@@ -4,16 +4,16 @@ module Mumbletune
|
|
4
4
|
class MumbleClient
|
5
5
|
|
6
6
|
def initialize
|
7
|
-
|
8
|
-
|
7
|
+
m_conf = Mumbletune.config["mumble"]
|
8
|
+
format = {rate: 44100, channels: 2} # Format used by spotify
|
9
|
+
@cli = Mumble::Client.new(m_conf['host'], m_conf['port'], m_conf['username'], m_conf['password'], format)
|
9
10
|
|
10
11
|
@cli.on_server_sync do |message| # Once connected.
|
11
12
|
@cli.session = message.session # housekeeping for mumble-ruby
|
12
|
-
connect_to = @cli.channels.select { |key, hash| hash["name"] ==
|
13
|
-
@cli.join_channel
|
13
|
+
connect_to = @cli.channels.select { |key, hash| hash["name"] == m_conf["channel"] }.first[1][:name]
|
14
|
+
@cli.join_channel connect_to
|
14
15
|
|
15
16
|
@ready = true
|
16
|
-
puts ">> Connected to Mumble server at #{opts['host']}."
|
17
17
|
end
|
18
18
|
|
19
19
|
@cli.on_text_message do |data|
|
@@ -35,15 +35,34 @@ module Mumbletune
|
|
35
35
|
|
36
36
|
def stream
|
37
37
|
@ready_wait.join
|
38
|
-
input = Mumbletune.config['mpd']['fifo_out']
|
39
38
|
Thread.current.priority = 5
|
40
|
-
|
41
|
-
|
39
|
+
queue = Mumbletune.player.audio_queue
|
40
|
+
|
41
|
+
@audio_stream = @cli.stream_from_queue(queue)
|
42
|
+
|
43
|
+
self.volume = Mumbletune.config["player"]["default_volume"]
|
42
44
|
end
|
43
45
|
|
44
46
|
def disconnect
|
47
|
+
@audio_stream.stop if @audio_stream
|
45
48
|
@cli.disconnect
|
46
|
-
|
49
|
+
end
|
50
|
+
|
51
|
+
def message(users, text)
|
52
|
+
users = Array(users) # force into array
|
53
|
+
users.each { |u| @cli.text_user(u.session, text) }
|
54
|
+
end
|
55
|
+
|
56
|
+
def broadcast(text)
|
57
|
+
@cli.text_channel(@cli.me.channel_id, text)
|
58
|
+
end
|
59
|
+
|
60
|
+
def volume
|
61
|
+
(@audio_stream.volume * 100).to_i
|
62
|
+
end
|
63
|
+
|
64
|
+
def volume=(vol)
|
65
|
+
@audio_stream.volume = vol.to_i
|
47
66
|
end
|
48
67
|
end
|
49
68
|
|
data/lib/mumbletune/resolver.rb
CHANGED
@@ -1,8 +1,6 @@
|
|
1
1
|
require 'uri'
|
2
|
-
require 'meta-spotify'
|
3
2
|
require 'text'
|
4
3
|
|
5
|
-
|
6
4
|
module Mumbletune
|
7
5
|
def self.resolve(argument)
|
8
6
|
Resolvers.workers.each do |r|
|
@@ -56,11 +54,14 @@ module Mumbletune
|
|
56
54
|
# behave according to URI type
|
57
55
|
case type
|
58
56
|
when "track" # Return this track
|
59
|
-
|
57
|
+
obj = Hallon::Track.new(sp_uri)
|
58
|
+
SpotifyResolver.track(obj)
|
60
59
|
when "album" # Return all tracks of the album to queue
|
61
|
-
|
60
|
+
obj = Hallon::Album.new(sp_uri)
|
61
|
+
SpotifyResolver.tracks_from_album(obj)
|
62
62
|
when "artist" # Return 10 tracks for this artist
|
63
|
-
|
63
|
+
obj = Hallon::Artist.new(sp_uri)
|
64
|
+
SpotifyResolver.tracks_from_artist(obj)
|
64
65
|
end
|
65
66
|
end
|
66
67
|
end
|
@@ -89,35 +90,21 @@ module Mumbletune
|
|
89
90
|
region = Mumbletune.config["spotify"]["region"]
|
90
91
|
|
91
92
|
# determine result based on a type in the first word
|
93
|
+
search = Hallon::Search.new(query, artists: 1, albums: 1, tracks: 1).load
|
92
94
|
if first_word =~ /^artist$/i
|
93
|
-
|
94
|
-
result = artist[:artists].first
|
95
|
+
result = search.artists.first
|
95
96
|
|
96
97
|
elsif first_word =~ /^album$/i
|
97
|
-
|
98
|
-
album[:albums].select! { |a| a.available_territories.include? region }
|
99
|
-
result = album[:albums].first
|
98
|
+
result = search.albums.first
|
100
99
|
|
101
100
|
elsif first_word =~ /^track$/i
|
102
|
-
|
103
|
-
track[:tracks].select! { |t| t.album.available_territories.include? region }
|
104
|
-
result = track[:tracks].first
|
101
|
+
result = search.tracks.first
|
105
102
|
|
106
103
|
else # determine intended result by similarity to the query
|
107
|
-
artist = Mumbletune.handle_sp_error { MetaSpotify::Artist.search(query) }
|
108
|
-
album = Mumbletune.handle_sp_error { MetaSpotify::Album.search(query) }
|
109
|
-
track = Mumbletune.handle_sp_error { MetaSpotify::Track.search(query) }
|
110
|
-
|
111
|
-
# searches now finished
|
112
|
-
|
113
|
-
# remove anything out-of-region
|
114
|
-
album[:albums].select! { |a| a.available_territories.include? region } if album[:albums].any?
|
115
|
-
track[:tracks].select! { |t| t.album.available_territories.include? region } if track[:tracks].any?
|
116
|
-
|
117
104
|
compare = []
|
118
|
-
compare.push
|
119
|
-
compare.push
|
120
|
-
compare.push
|
105
|
+
compare.push search.tracks.first if search.tracks.any?
|
106
|
+
compare.push search.albums.first if search.albums.any?
|
107
|
+
compare.push search.artists.first if search.artists.any?
|
121
108
|
|
122
109
|
white = Text::WhiteSimilarity.new
|
123
110
|
compare.sort! do |a, b|
|
@@ -134,12 +121,12 @@ module Mumbletune
|
|
134
121
|
result = compare.first
|
135
122
|
end
|
136
123
|
|
137
|
-
if result.class ==
|
138
|
-
|
139
|
-
elsif result.class ==
|
140
|
-
|
141
|
-
elsif result.class ==
|
142
|
-
|
124
|
+
if result.class == Hallon::Artist
|
125
|
+
SpotifyResolver.tracks_from_artist(result)
|
126
|
+
elsif result.class == Hallon::Album
|
127
|
+
SpotifyResolver.tracks_from_album(result)
|
128
|
+
elsif result.class == Hallon::Track
|
129
|
+
SpotifyResolver.track(result)
|
143
130
|
end
|
144
131
|
|
145
132
|
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
require "hallon"
|
2
|
+
|
3
|
+
module Mumbletune
|
4
|
+
class SpotifyResolver
|
5
|
+
def self.track(track)
|
6
|
+
track.load
|
7
|
+
|
8
|
+
raise "#{track.name}: Not available in this region." unless track.available?
|
9
|
+
|
10
|
+
# Technically, a collection of one.
|
11
|
+
Collection.new(
|
12
|
+
:TRACK,
|
13
|
+
track,
|
14
|
+
"<b>#{track.name}</b> by <b>#{track.artist.name}</b>"
|
15
|
+
)
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.tracks_from_album(album)
|
19
|
+
album.load
|
20
|
+
|
21
|
+
raise "#{album.name}: Not available in this region." unless album.available?
|
22
|
+
|
23
|
+
browse = album.browse
|
24
|
+
browse.load
|
25
|
+
|
26
|
+
Collection.new(
|
27
|
+
:ALBUM,
|
28
|
+
browse.tracks.to_a,
|
29
|
+
"the album <b>#{album.name}</b> by <b>#{album.artist.name}</b>"
|
30
|
+
)
|
31
|
+
end
|
32
|
+
|
33
|
+
def self.tracks_from_artist(artist)
|
34
|
+
artist.load
|
35
|
+
|
36
|
+
tracks_needed = Mumbletune.config["player"]["tracks_for_artist"] || 5
|
37
|
+
|
38
|
+
search = Hallon::Search.new("artist:\"#{artist.name}\"",
|
39
|
+
tracks: tracks_needed,
|
40
|
+
artists: 0,
|
41
|
+
albums: 0,
|
42
|
+
playlists: 0).load
|
43
|
+
|
44
|
+
Collection.new(
|
45
|
+
:ARTIST_TOP,
|
46
|
+
search.tracks.to_a,
|
47
|
+
"#{search.tracks.size} tracks by <b>#{artist.name}</b>"
|
48
|
+
)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -63,6 +63,7 @@
|
|
63
63
|
</tbody>
|
64
64
|
</table>
|
65
65
|
<p><br> For example:</p>
|
66
|
-
<
|
67
|
-
play nicki minaj starships</code
|
68
|
-
<p>Mumbletune uses Spotify to find music
|
66
|
+
<p><code>play coldplay</code> plays the top 5 tracks by Coldplay.</p>
|
67
|
+
<p><code>play nicki minaj starships</code> will play the (excellent) song Starships.</p>
|
68
|
+
<p>Mumbletune uses Spotify to find and play music. You can <code>play</code> a Spotify URL directly instead of searching, like</p>
|
69
|
+
<p><code>play spotify:album:1HjSyGjmLNjRAKgT9t1cna</code></p>
|
@@ -18,17 +18,19 @@
|
|
18
18
|
{{/anything?}}
|
19
19
|
|
20
20
|
{{#queue}}
|
21
|
-
|
22
|
-
<
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
21
|
+
{{#tracks}}
|
22
|
+
<tr>
|
23
|
+
<td align="left">
|
24
|
+
{{#playing?}} <span style="#a5a5a5">►</span> {{/playing?}}
|
25
|
+
</td>
|
26
|
+
<td align="left">
|
27
|
+
{{name}}
|
28
|
+
</td>
|
29
|
+
<td align="left">
|
30
|
+
{{artist}} <small style="color:#a5a5a5">{{username}}</small>
|
31
|
+
</td>
|
32
|
+
</tr>
|
33
|
+
{{/tracks}}
|
32
34
|
{{/queue}}
|
33
35
|
|
34
36
|
{{#anything?}}
|
data/lib/mumbletune/version.rb
CHANGED
data/logs/.gitignore
ADDED
data/mumbletune.gemspec
CHANGED
@@ -9,9 +9,8 @@ Gem::Specification.new do |spec|
|
|
9
9
|
spec.authors = ["Elliott Williams"]
|
10
10
|
spec.email = ["e@elliottwillia.ms"]
|
11
11
|
spec.description = "Mumbletune connects to a mumble server and allows users to"\
|
12
|
-
" interact with and play a queue of music
|
13
|
-
|
14
|
-
spec.summary = "A mumble server bot that plays music"
|
12
|
+
" interact with and play a queue of music from Spotify."
|
13
|
+
spec.summary = "A Mumble VOIP bot that plays Spotify."
|
15
14
|
spec.homepage = "http://github.com/elliottwilliams/mumbletune"
|
16
15
|
spec.license = "MIT"
|
17
16
|
|
@@ -24,14 +23,10 @@ Gem::Specification.new do |spec|
|
|
24
23
|
spec.add_development_dependency "rake"
|
25
24
|
|
26
25
|
spec.add_runtime_dependency "mumble-ruby"
|
27
|
-
spec.add_runtime_dependency "
|
28
|
-
spec.add_runtime_dependency "
|
29
|
-
spec.add_runtime_dependency "meta-spotify"
|
30
|
-
spec.add_runtime_dependency "rubypython"
|
26
|
+
spec.add_runtime_dependency "hallon"
|
27
|
+
spec.add_runtime_dependency "ffi", "~>1.3.0"
|
31
28
|
|
32
|
-
spec.add_runtime_dependency "
|
33
|
-
spec.add_runtime_dependency "eventmachine"
|
29
|
+
spec.add_runtime_dependency "daemons"
|
34
30
|
spec.add_runtime_dependency "text"
|
35
31
|
spec.add_runtime_dependency "mustache"
|
36
|
-
spec.add_development_dependency "debugger"
|
37
32
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mumbletune
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1
|
4
|
+
version: 0.2.1
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-
|
12
|
+
date: 2013-06-07 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: bundler
|
@@ -60,7 +60,7 @@ dependencies:
|
|
60
60
|
- !ruby/object:Gem::Version
|
61
61
|
version: '0'
|
62
62
|
- !ruby/object:Gem::Dependency
|
63
|
-
name:
|
63
|
+
name: hallon
|
64
64
|
requirement: !ruby/object:Gem::Requirement
|
65
65
|
none: false
|
66
66
|
requirements:
|
@@ -76,71 +76,23 @@ dependencies:
|
|
76
76
|
- !ruby/object:Gem::Version
|
77
77
|
version: '0'
|
78
78
|
- !ruby/object:Gem::Dependency
|
79
|
-
name:
|
79
|
+
name: ffi
|
80
80
|
requirement: !ruby/object:Gem::Requirement
|
81
81
|
none: false
|
82
82
|
requirements:
|
83
|
-
- -
|
84
|
-
- !ruby/object:Gem::Version
|
85
|
-
version: '0'
|
86
|
-
type: :runtime
|
87
|
-
prerelease: false
|
88
|
-
version_requirements: !ruby/object:Gem::Requirement
|
89
|
-
none: false
|
90
|
-
requirements:
|
91
|
-
- - ! '>='
|
92
|
-
- !ruby/object:Gem::Version
|
93
|
-
version: '0'
|
94
|
-
- !ruby/object:Gem::Dependency
|
95
|
-
name: meta-spotify
|
96
|
-
requirement: !ruby/object:Gem::Requirement
|
97
|
-
none: false
|
98
|
-
requirements:
|
99
|
-
- - ! '>='
|
100
|
-
- !ruby/object:Gem::Version
|
101
|
-
version: '0'
|
102
|
-
type: :runtime
|
103
|
-
prerelease: false
|
104
|
-
version_requirements: !ruby/object:Gem::Requirement
|
105
|
-
none: false
|
106
|
-
requirements:
|
107
|
-
- - ! '>='
|
108
|
-
- !ruby/object:Gem::Version
|
109
|
-
version: '0'
|
110
|
-
- !ruby/object:Gem::Dependency
|
111
|
-
name: rubypython
|
112
|
-
requirement: !ruby/object:Gem::Requirement
|
113
|
-
none: false
|
114
|
-
requirements:
|
115
|
-
- - ! '>='
|
116
|
-
- !ruby/object:Gem::Version
|
117
|
-
version: '0'
|
118
|
-
type: :runtime
|
119
|
-
prerelease: false
|
120
|
-
version_requirements: !ruby/object:Gem::Requirement
|
121
|
-
none: false
|
122
|
-
requirements:
|
123
|
-
- - ! '>='
|
124
|
-
- !ruby/object:Gem::Version
|
125
|
-
version: '0'
|
126
|
-
- !ruby/object:Gem::Dependency
|
127
|
-
name: thin
|
128
|
-
requirement: !ruby/object:Gem::Requirement
|
129
|
-
none: false
|
130
|
-
requirements:
|
131
|
-
- - ! '>='
|
83
|
+
- - ~>
|
132
84
|
- !ruby/object:Gem::Version
|
133
|
-
version:
|
85
|
+
version: 1.3.0
|
134
86
|
type: :runtime
|
135
87
|
prerelease: false
|
136
88
|
version_requirements: !ruby/object:Gem::Requirement
|
137
89
|
none: false
|
138
90
|
requirements:
|
139
|
-
- -
|
91
|
+
- - ~>
|
140
92
|
- !ruby/object:Gem::Version
|
141
|
-
version:
|
93
|
+
version: 1.3.0
|
142
94
|
- !ruby/object:Gem::Dependency
|
143
|
-
name:
|
95
|
+
name: daemons
|
144
96
|
requirement: !ruby/object:Gem::Requirement
|
145
97
|
none: false
|
146
98
|
requirements:
|
@@ -187,28 +139,13 @@ dependencies:
|
|
187
139
|
- - ! '>='
|
188
140
|
- !ruby/object:Gem::Version
|
189
141
|
version: '0'
|
190
|
-
- !ruby/object:Gem::Dependency
|
191
|
-
name: debugger
|
192
|
-
requirement: !ruby/object:Gem::Requirement
|
193
|
-
none: false
|
194
|
-
requirements:
|
195
|
-
- - ! '>='
|
196
|
-
- !ruby/object:Gem::Version
|
197
|
-
version: '0'
|
198
|
-
type: :development
|
199
|
-
prerelease: false
|
200
|
-
version_requirements: !ruby/object:Gem::Requirement
|
201
|
-
none: false
|
202
|
-
requirements:
|
203
|
-
- - ! '>='
|
204
|
-
- !ruby/object:Gem::Version
|
205
|
-
version: '0'
|
206
142
|
description: Mumbletune connects to a mumble server and allows users to interact with
|
207
|
-
and play a queue of music
|
143
|
+
and play a queue of music from Spotify.
|
208
144
|
email:
|
209
145
|
- e@elliottwillia.ms
|
210
146
|
executables:
|
211
147
|
- mumbletune
|
148
|
+
- mumbletune-ctl
|
212
149
|
extensions: []
|
213
150
|
extra_rdoc_files: []
|
214
151
|
files:
|
@@ -219,21 +156,20 @@ files:
|
|
219
156
|
- README.md
|
220
157
|
- Rakefile
|
221
158
|
- bin/mumbletune
|
159
|
+
- bin/mumbletune-ctl
|
222
160
|
- conf.example.yaml
|
223
161
|
- docs/commands.md
|
224
162
|
- lib/mumbletune.rb
|
225
163
|
- lib/mumbletune/collection.rb
|
226
|
-
- lib/mumbletune/
|
164
|
+
- lib/mumbletune/hallon_player.rb
|
227
165
|
- lib/mumbletune/messages.rb
|
228
|
-
- lib/mumbletune/mpd_client.rb
|
229
166
|
- lib/mumbletune/mumble_client.rb
|
230
167
|
- lib/mumbletune/resolver.rb
|
231
|
-
- lib/mumbletune/
|
232
|
-
- lib/mumbletune/
|
233
|
-
- lib/mumbletune/
|
234
|
-
- lib/mumbletune/templates/queue.mustache
|
235
|
-
- lib/mumbletune/track.rb
|
168
|
+
- lib/mumbletune/spotify_resolver.rb
|
169
|
+
- lib/mumbletune/template/commands.mustache
|
170
|
+
- lib/mumbletune/template/queue.mustache
|
236
171
|
- lib/mumbletune/version.rb
|
172
|
+
- logs/.gitignore
|
237
173
|
- mumbletune.gemspec
|
238
174
|
homepage: http://github.com/elliottwilliams/mumbletune
|
239
175
|
licenses:
|
@@ -259,5 +195,5 @@ rubyforge_project:
|
|
259
195
|
rubygems_version: 1.8.25
|
260
196
|
signing_key:
|
261
197
|
specification_version: 3
|
262
|
-
summary: A
|
198
|
+
summary: A Mumble VOIP bot that plays Spotify.
|
263
199
|
test_files: []
|