anyplayer 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +4 -0
- data/Gemfile +5 -0
- data/Rakefile +2 -0
- data/Readme.markdown +12 -0
- data/anyplayer.gemspec +19 -0
- data/lib/anyplayer.rb +24 -0
- data/lib/anyplayer/player.rb +23 -0
- data/lib/anyplayer/players/amarok.rb +53 -0
- data/lib/anyplayer/players/itunes.rb +55 -0
- data/lib/anyplayer/players/ituneswindows.rb +56 -0
- data/lib/anyplayer/players/mpd.rb +55 -0
- data/lib/anyplayer/players/rhythmbox.rb +49 -0
- data/lib/anyplayer/players/xmms2.rb +61 -0
- data/lib/anyplayer/version.rb +3 -0
- data/test/anyplayer_test.rb +13 -0
- metadata +82 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/Rakefile
ADDED
data/Readme.markdown
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
Anyplayer
|
2
|
+
=========
|
3
|
+
|
4
|
+
Ruby library to interact with the running music player (iTunes, Rythmbox, MPD, XMMS).
|
5
|
+
|
6
|
+
require 'anyplayer'
|
7
|
+
player = Anyplayer::launched
|
8
|
+
player.name # => Rythmbox
|
9
|
+
player.track # => "Frontier Psychiatrist"
|
10
|
+
player.next
|
11
|
+
player.track # => "Ready For The Floor"
|
12
|
+
|
data/anyplayer.gemspec
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "anyplayer/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "anyplayer"
|
7
|
+
s.version = Anyplayer::VERSION
|
8
|
+
s.platform = Gem::Platform::RUBY
|
9
|
+
s.authors = ["Sunny Ripert"]
|
10
|
+
s.email = ["sunny@sunfox.org"]
|
11
|
+
s.homepage = "http://github.com/sunny/anyplayer"
|
12
|
+
s.summary = %q{Interact with the running music player}
|
13
|
+
s.description = %q{Play/pause/skip songs in iTunes, Rythmbox, MPD, XMMS}
|
14
|
+
|
15
|
+
s.files = `git ls-files`.split("\n")
|
16
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
17
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
18
|
+
s.require_paths = ["lib"]
|
19
|
+
end
|
data/lib/anyplayer.rb
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
require "timeout"
|
2
|
+
require "anyplayer/player"
|
3
|
+
|
4
|
+
module Anyplayer
|
5
|
+
PLAYERS = :itunes, :rhythmbox, :ituneswindows, :mpd, :xmms2, :amarok
|
6
|
+
for player in PLAYERS
|
7
|
+
require "anyplayer/players/#{player}"
|
8
|
+
end
|
9
|
+
|
10
|
+
# Return the first music player that's launched
|
11
|
+
def self::launched(verbose = false)
|
12
|
+
PLAYERS.each { |player|
|
13
|
+
player = const_get(player.to_s.capitalize).new
|
14
|
+
puts "Trying #{player.name}..." if verbose
|
15
|
+
|
16
|
+
begin
|
17
|
+
Timeout::timeout(5) { return player if player.launched? }
|
18
|
+
rescue Timeout::Error
|
19
|
+
puts "Timed out" if verbose
|
20
|
+
end
|
21
|
+
}
|
22
|
+
nil
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Anyplayer
|
2
|
+
class Player
|
3
|
+
|
4
|
+
# Guess the player name
|
5
|
+
def name
|
6
|
+
self.class.to_s.gsub(/^.*::/, '')
|
7
|
+
end
|
8
|
+
|
9
|
+
# Methods to override
|
10
|
+
def launched?; false; end
|
11
|
+
def playpause; end
|
12
|
+
def next; end
|
13
|
+
def prev; end
|
14
|
+
def voldown; end
|
15
|
+
def volup; end
|
16
|
+
def volume; end
|
17
|
+
def track; end
|
18
|
+
def artist; end
|
19
|
+
def album; end
|
20
|
+
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
@@ -0,0 +1,53 @@
|
|
1
|
+
module Anyplayer
|
2
|
+
class Amarok < Player
|
3
|
+
def playpause
|
4
|
+
tell_to 'PlayPause'
|
5
|
+
end
|
6
|
+
|
7
|
+
def prev
|
8
|
+
tell_to 'Prev'
|
9
|
+
end
|
10
|
+
|
11
|
+
def next
|
12
|
+
tell_to 'Next'
|
13
|
+
end
|
14
|
+
|
15
|
+
def voldown
|
16
|
+
tell_to 'VolumeDown 5'
|
17
|
+
end
|
18
|
+
|
19
|
+
def volup
|
20
|
+
tell_to 'VolumeUp 5'
|
21
|
+
end
|
22
|
+
|
23
|
+
def volume
|
24
|
+
tell_to 'VolumeGet'
|
25
|
+
end
|
26
|
+
|
27
|
+
def track
|
28
|
+
get_metadata('title')
|
29
|
+
end
|
30
|
+
|
31
|
+
def artist
|
32
|
+
get_metadata('artist')
|
33
|
+
end
|
34
|
+
|
35
|
+
def album
|
36
|
+
get_metadata('album')
|
37
|
+
end
|
38
|
+
|
39
|
+
def launched?
|
40
|
+
not %x(qdbus org.kde.amarok 2>&1).match(/does not exist/)
|
41
|
+
end
|
42
|
+
|
43
|
+
private
|
44
|
+
def tell_to(command)
|
45
|
+
%x(qdbus org.kde.amarok /Player org.freedesktop.MediaPlayer.#{command}).rstrip
|
46
|
+
end
|
47
|
+
|
48
|
+
def get_metadata(name)
|
49
|
+
tell_to('GetMetadata').match(/#{name}: (\S.*)/)[1] rescue nil
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
@@ -0,0 +1,55 @@
|
|
1
|
+
module Anyplayer
|
2
|
+
class Itunes < Player
|
3
|
+
def playpause
|
4
|
+
tell_to 'playpause'
|
5
|
+
end
|
6
|
+
|
7
|
+
def prev
|
8
|
+
tell_to 'previous track'
|
9
|
+
end
|
10
|
+
|
11
|
+
def next
|
12
|
+
tell_to 'next track'
|
13
|
+
end
|
14
|
+
|
15
|
+
def voldown
|
16
|
+
tell_to 'set sound volume to sound volume - 10'
|
17
|
+
end
|
18
|
+
|
19
|
+
def volup
|
20
|
+
tell_to 'set sound volume to sound volume + 10'
|
21
|
+
end
|
22
|
+
|
23
|
+
def volume
|
24
|
+
tell_to 'return sound volume'
|
25
|
+
end
|
26
|
+
|
27
|
+
def track
|
28
|
+
tell_to 'return name of current track'
|
29
|
+
end
|
30
|
+
|
31
|
+
def artist
|
32
|
+
tell_to 'return artist of current track'
|
33
|
+
end
|
34
|
+
|
35
|
+
def album
|
36
|
+
tell_to 'return album of current track'
|
37
|
+
end
|
38
|
+
|
39
|
+
def launched?
|
40
|
+
return false if RUBY_PLATFORM !~ /darwin/
|
41
|
+
nb = %x(osascript -e 'tell app "System Events" to count (every process whose name is "iTunes")' 2>/dev/null).rstrip
|
42
|
+
nb.match(/^\d+/) and nb.to_i > 0 ? true : false
|
43
|
+
end
|
44
|
+
|
45
|
+
def name
|
46
|
+
"iTunes"
|
47
|
+
end
|
48
|
+
|
49
|
+
private
|
50
|
+
def tell_to(command)
|
51
|
+
%x(osascript -e 'tell app "iTunes" to #{command}').rstrip
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
@@ -0,0 +1,56 @@
|
|
1
|
+
module Anyplayer
|
2
|
+
class Ituneswindows < Player
|
3
|
+
def playpause
|
4
|
+
@itunes.PlayPause()
|
5
|
+
end
|
6
|
+
|
7
|
+
def prev
|
8
|
+
@itunes.PreviousTrack()
|
9
|
+
end
|
10
|
+
|
11
|
+
def next
|
12
|
+
@itunes.NextTrack()
|
13
|
+
end
|
14
|
+
|
15
|
+
def voldown
|
16
|
+
@itunes.SoundVolume=@itunes.SoundVolume - 10
|
17
|
+
end
|
18
|
+
|
19
|
+
def volup
|
20
|
+
@itunes.SoundVolume=@itunes.SoundVolume + 10
|
21
|
+
end
|
22
|
+
|
23
|
+
def volume
|
24
|
+
@itunes.SoundVolume
|
25
|
+
end
|
26
|
+
|
27
|
+
def track
|
28
|
+
@itunes.CurrentTrack.name
|
29
|
+
end
|
30
|
+
|
31
|
+
def artist
|
32
|
+
@itunes.CurrentTrack.Artist
|
33
|
+
end
|
34
|
+
|
35
|
+
def album
|
36
|
+
@itunes.CurrentTrack.Album
|
37
|
+
end
|
38
|
+
|
39
|
+
def launched?
|
40
|
+
return false if RUBY_PLATFORM !~ /cygwin|mswin|mingw|bccwin|wince|emx/
|
41
|
+
|
42
|
+
begin
|
43
|
+
require 'win32ole'
|
44
|
+
@itunes = WIN32OLE.new("iTunes.Application")
|
45
|
+
return true
|
46
|
+
rescue LoadError
|
47
|
+
return false
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def name
|
52
|
+
"iTunes Windows"
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
@@ -0,0 +1,55 @@
|
|
1
|
+
module Anyplayer
|
2
|
+
class Mpd < Player
|
3
|
+
def playpause
|
4
|
+
mpc 'toggle'
|
5
|
+
end
|
6
|
+
|
7
|
+
def prev
|
8
|
+
mpc 'prev'
|
9
|
+
end
|
10
|
+
|
11
|
+
def next
|
12
|
+
mpc 'next'
|
13
|
+
end
|
14
|
+
|
15
|
+
def voldown
|
16
|
+
mpc 'volume -10'
|
17
|
+
end
|
18
|
+
|
19
|
+
def volup
|
20
|
+
mpc 'volume +10'
|
21
|
+
end
|
22
|
+
|
23
|
+
def volume
|
24
|
+
mpc('volume').grep(/([0-9]+)/)
|
25
|
+
$1
|
26
|
+
end
|
27
|
+
|
28
|
+
def track
|
29
|
+
mpc '-f "%title%" current'
|
30
|
+
end
|
31
|
+
|
32
|
+
def artist
|
33
|
+
mpc '-f "%artist%" current'
|
34
|
+
end
|
35
|
+
|
36
|
+
def album
|
37
|
+
mpc '-f "%album%" current'
|
38
|
+
end
|
39
|
+
|
40
|
+
def launched?
|
41
|
+
%x(mpc 2> /dev/null)
|
42
|
+
$? == 0
|
43
|
+
end
|
44
|
+
|
45
|
+
def host
|
46
|
+
ENV['MPD_HOST'] || super
|
47
|
+
end
|
48
|
+
|
49
|
+
private
|
50
|
+
def mpc(command)
|
51
|
+
%x(mpc #{command}).split("\n").first
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
@@ -0,0 +1,49 @@
|
|
1
|
+
module Anyplayer
|
2
|
+
class Rhythmbox < Player
|
3
|
+
def playpause
|
4
|
+
tell_to 'play-pause'
|
5
|
+
end
|
6
|
+
|
7
|
+
def prev
|
8
|
+
tell_to 'previous'
|
9
|
+
end
|
10
|
+
|
11
|
+
def next
|
12
|
+
tell_to 'next'
|
13
|
+
end
|
14
|
+
|
15
|
+
def voldown
|
16
|
+
tell_to 'volume-down'
|
17
|
+
end
|
18
|
+
|
19
|
+
def volup
|
20
|
+
tell_to 'volume-up'
|
21
|
+
end
|
22
|
+
|
23
|
+
def volume
|
24
|
+
tell_to 'print-volume'
|
25
|
+
end
|
26
|
+
|
27
|
+
def track
|
28
|
+
tell_to 'print-playing-format=%tt'
|
29
|
+
end
|
30
|
+
|
31
|
+
def artist
|
32
|
+
tell_to 'print-playing-format=%ta'
|
33
|
+
end
|
34
|
+
|
35
|
+
def album
|
36
|
+
tell_to 'print-playing-format=%at'
|
37
|
+
end
|
38
|
+
|
39
|
+
def launched?
|
40
|
+
%x(rhythmbox-client --no-start --print-playing 2>/dev/null).rstrip != ""
|
41
|
+
end
|
42
|
+
|
43
|
+
private
|
44
|
+
def tell_to(command)
|
45
|
+
%x(rhythmbox-client --no-start --#{command}).rstrip
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
@@ -0,0 +1,61 @@
|
|
1
|
+
module Anyplayer
|
2
|
+
class Xmms2 < Player
|
3
|
+
def playpause
|
4
|
+
xmms2 'toggle'
|
5
|
+
end
|
6
|
+
|
7
|
+
def prev
|
8
|
+
xmms2 'prev'
|
9
|
+
end
|
10
|
+
|
11
|
+
def next
|
12
|
+
xmms2 'next'
|
13
|
+
end
|
14
|
+
|
15
|
+
def voldown
|
16
|
+
current = volume.to_i
|
17
|
+
new_volume = (current < 11 ? 0 : current - 10)
|
18
|
+
xmms2 "server volume #{new_volume}"
|
19
|
+
end
|
20
|
+
|
21
|
+
def volup
|
22
|
+
current = volume.to_i
|
23
|
+
new_volume = (current > 89 ? 100 : current + 10)
|
24
|
+
xmms2 "server volume #{new_volume}"
|
25
|
+
end
|
26
|
+
|
27
|
+
def volume
|
28
|
+
#currently just the first (left?) channel
|
29
|
+
xmms2('server volume').split("\n").first.sub /([^0-9]*)/, ''
|
30
|
+
$1
|
31
|
+
end
|
32
|
+
|
33
|
+
def track
|
34
|
+
xmms2 "status -f '${title}'"
|
35
|
+
end
|
36
|
+
|
37
|
+
def artist
|
38
|
+
xmms2 "status -f '${artist}'"
|
39
|
+
end
|
40
|
+
|
41
|
+
def album
|
42
|
+
xmms2 "status -f '${album}'"
|
43
|
+
end
|
44
|
+
|
45
|
+
def launched?
|
46
|
+
# xmms2 autolaunches the daemon, so this should always be true
|
47
|
+
%x(xmms2 status 2> /dev/null)
|
48
|
+
$? == 0
|
49
|
+
end
|
50
|
+
|
51
|
+
def host
|
52
|
+
ENV['XMMS_PATH'] || super
|
53
|
+
end
|
54
|
+
|
55
|
+
private
|
56
|
+
def xmms2(command)
|
57
|
+
%x(xmms2 #{command}).split("\n").first
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
2
|
+
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
3
|
+
|
4
|
+
require 'test/unit'
|
5
|
+
require 'anyplayer'
|
6
|
+
|
7
|
+
class AnyplayerTest < Test::Unit::TestCase
|
8
|
+
def test_music_player_running
|
9
|
+
player = Anyplayer::launched
|
10
|
+
assert_not_nil player
|
11
|
+
assert player.is_a?(Anyplayer::Player)
|
12
|
+
end
|
13
|
+
end
|
metadata
ADDED
@@ -0,0 +1,82 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: anyplayer
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 29
|
5
|
+
prerelease: false
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 0
|
9
|
+
- 1
|
10
|
+
version: 0.0.1
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- Sunny Ripert
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2011-01-18 00:00:00 +01:00
|
19
|
+
default_executable:
|
20
|
+
dependencies: []
|
21
|
+
|
22
|
+
description: Play/pause/skip songs in iTunes, Rythmbox, MPD, XMMS
|
23
|
+
email:
|
24
|
+
- sunny@sunfox.org
|
25
|
+
executables: []
|
26
|
+
|
27
|
+
extensions: []
|
28
|
+
|
29
|
+
extra_rdoc_files: []
|
30
|
+
|
31
|
+
files:
|
32
|
+
- .gitignore
|
33
|
+
- Gemfile
|
34
|
+
- Rakefile
|
35
|
+
- Readme.markdown
|
36
|
+
- anyplayer.gemspec
|
37
|
+
- lib/anyplayer.rb
|
38
|
+
- lib/anyplayer/player.rb
|
39
|
+
- lib/anyplayer/players/amarok.rb
|
40
|
+
- lib/anyplayer/players/itunes.rb
|
41
|
+
- lib/anyplayer/players/ituneswindows.rb
|
42
|
+
- lib/anyplayer/players/mpd.rb
|
43
|
+
- lib/anyplayer/players/rhythmbox.rb
|
44
|
+
- lib/anyplayer/players/xmms2.rb
|
45
|
+
- lib/anyplayer/version.rb
|
46
|
+
- test/anyplayer_test.rb
|
47
|
+
has_rdoc: true
|
48
|
+
homepage: http://github.com/sunny/anyplayer
|
49
|
+
licenses: []
|
50
|
+
|
51
|
+
post_install_message:
|
52
|
+
rdoc_options: []
|
53
|
+
|
54
|
+
require_paths:
|
55
|
+
- lib
|
56
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
hash: 3
|
62
|
+
segments:
|
63
|
+
- 0
|
64
|
+
version: "0"
|
65
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
66
|
+
none: false
|
67
|
+
requirements:
|
68
|
+
- - ">="
|
69
|
+
- !ruby/object:Gem::Version
|
70
|
+
hash: 3
|
71
|
+
segments:
|
72
|
+
- 0
|
73
|
+
version: "0"
|
74
|
+
requirements: []
|
75
|
+
|
76
|
+
rubyforge_project:
|
77
|
+
rubygems_version: 1.3.7
|
78
|
+
signing_key:
|
79
|
+
specification_version: 3
|
80
|
+
summary: Interact with the running music player
|
81
|
+
test_files: []
|
82
|
+
|