anyplayer 1.1.2 → 1.2.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.
- checksums.yaml +7 -0
- data/.gitignore +1 -1
- data/.ruby-version +1 -0
- data/.travis.yml +1 -2
- data/CHANGELOG.md +82 -0
- data/CONTRIBUTING.md +22 -0
- data/Gemfile +0 -2
- data/README.md +17 -16
- data/Rakefile +10 -0
- data/anyplayer.gemspec +3 -1
- data/bin/rake +29 -0
- data/lib/anyplayer.rb +8 -2
- data/lib/anyplayer/command_line.rb +56 -26
- data/lib/anyplayer/player.rb +15 -7
- data/lib/anyplayer/players/amarok.rb +25 -19
- data/lib/anyplayer/players/itunes_mac.rb +22 -17
- data/lib/anyplayer/players/itunes_windows.rb +9 -6
- data/lib/anyplayer/players/mpd.rb +14 -8
- data/lib/anyplayer/players/noplayer.rb +2 -2
- data/lib/anyplayer/players/rdio_mac.rb +22 -18
- data/lib/anyplayer/players/rhythmbox.rb +15 -15
- data/lib/anyplayer/players/spotify_mac.rb +21 -17
- data/lib/anyplayer/players/xmms2.rb +34 -24
- data/lib/anyplayer/selector.rb +63 -32
- data/lib/anyplayer/version.rb +1 -1
- data/test/anyplayer_test.rb +12 -6
- data/test/command_line_test.rb +150 -0
- data/test/player_test.rb +44 -7
- data/test/players/mpd_test.rb +2 -4
- data/test/selector_test.rb +2 -2
- data/test/test_helper.rb +1 -2
- metadata +35 -32
- data/.envrc +0 -1
- data/Gemfile.lock +0 -22
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: db0d0a016e49bc83fdef8aa9aec374fc8c5c593569b3ff5d2d9270a05b493458
|
4
|
+
data.tar.gz: 28b16e0ffeb7d097da4432700ebccb2ce08bf682609695b64b7125b90450a6cb
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 86bc595bacbe1256a03503ece20a14ff368c82955ed8bd168d6b8d68c7c4616909086ec5549ae3c0915a4155392b6bb4223ef9c3c257aa20c421874fdb171ceb
|
7
|
+
data.tar.gz: f3ccc7caac60e7fec74a9bc3dcf3270ec3b6ffd89e0454130e914774c82306b5751c98dc95f1dca0fe3ec7ecb58ae1dbfb2b0f4364f858d2e093a07e9763a064
|
data/.gitignore
CHANGED
data/.ruby-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
2.7.1
|
data/.travis.yml
CHANGED
data/CHANGELOG.md
ADDED
@@ -0,0 +1,82 @@
|
|
1
|
+
Changelog
|
2
|
+
---------
|
3
|
+
|
4
|
+
Anyplayer tries its best to follow Semantic Versioning.
|
5
|
+
|
6
|
+
## Unreleased
|
7
|
+
|
8
|
+
## v1.2.1 (2020-12-19)
|
9
|
+
|
10
|
+
Fixes:
|
11
|
+
|
12
|
+
- Remove rake executable in gemspec.
|
13
|
+
|
14
|
+
## v1.2.0 (2020-10-08)
|
15
|
+
|
16
|
+
Features:
|
17
|
+
|
18
|
+
- When using mpd, fallback to the file name if there is no track name.
|
19
|
+
|
20
|
+
Dependencies:
|
21
|
+
|
22
|
+
- Drop Ruby 1.9.3 and 2.0.0 support.
|
23
|
+
|
24
|
+
## v1.1.5 (2014-07-07)
|
25
|
+
|
26
|
+
Bugfixes:
|
27
|
+
|
28
|
+
- Better platform detection by letting players list the platforms
|
29
|
+
they are intended to work on (thanks @inspire22)
|
30
|
+
|
31
|
+
## v1.1.4 (2014-07-07)
|
32
|
+
|
33
|
+
Bugfixes:
|
34
|
+
|
35
|
+
- Fix iTunes Windows support by moving iTunes first
|
36
|
+
- New developement task "rake console"
|
37
|
+
- Refactorisations & tests
|
38
|
+
|
39
|
+
## v1.1.3 (2014-01-27)
|
40
|
+
|
41
|
+
Bugfixes:
|
42
|
+
|
43
|
+
- xmms2.0.8 support (thanks @ofa-)
|
44
|
+
|
45
|
+
## v1.1.2 (2013-12-18)
|
46
|
+
|
47
|
+
Bugfixes:
|
48
|
+
|
49
|
+
- MIT License
|
50
|
+
|
51
|
+
## v1.1.1 (2013-12-18)
|
52
|
+
|
53
|
+
Bugfixes:
|
54
|
+
|
55
|
+
- Better MPD support (thanks @nkoehring)
|
56
|
+
- Encoding fixes
|
57
|
+
|
58
|
+
## v1.1.0 (2013-10-27)
|
59
|
+
|
60
|
+
Features:
|
61
|
+
|
62
|
+
- Add Rdio Mac support (thanks @irosenb)
|
63
|
+
|
64
|
+
## v1.0.0 (2013-07-26)
|
65
|
+
|
66
|
+
First major release.
|
67
|
+
|
68
|
+
## v0.0.4
|
69
|
+
|
70
|
+
Unstable version.
|
71
|
+
|
72
|
+
## v0.0.3
|
73
|
+
|
74
|
+
Unstable version.
|
75
|
+
|
76
|
+
## v0.0.2
|
77
|
+
|
78
|
+
Unstable version.
|
79
|
+
|
80
|
+
## v0.0.1
|
81
|
+
|
82
|
+
Unstable version.
|
data/CONTRIBUTING.md
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Contributing
|
2
|
+
============
|
3
|
+
|
4
|
+
All contributions are welcome! Head to the [Github issues](https://github.com/sunny/anyplayer/issues) to report bugs, questions or code.
|
5
|
+
|
6
|
+
|
7
|
+
Submit code
|
8
|
+
-----------
|
9
|
+
|
10
|
+
1. Fork the repository on Github
|
11
|
+
1. Create a topic branch
|
12
|
+
1. Implement your feature and the accompanying tests
|
13
|
+
1. Run `rake test` to make sure the tests are passing
|
14
|
+
1. Add documentation for your feature or bug fix
|
15
|
+
1. Add, commit, and push your changes
|
16
|
+
1. Submit a pull request
|
17
|
+
|
18
|
+
|
19
|
+
Versionning
|
20
|
+
-----------
|
21
|
+
|
22
|
+
This library aims to adhere to [Semantic Versioning 2.0](http://semver.org/).
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -43,8 +43,17 @@ a player is running
|
|
43
43
|
Or in Ruby
|
44
44
|
----------
|
45
45
|
|
46
|
+
In your Gemfile:
|
47
|
+
|
48
|
+
```rb
|
49
|
+
# Interact with the current music player
|
50
|
+
gem "anyplayer"
|
51
|
+
```
|
52
|
+
|
53
|
+
In your code:
|
54
|
+
|
46
55
|
```ruby
|
47
|
-
require
|
56
|
+
require "anyplayer"
|
48
57
|
player = Anyplayer::Selector.new.player
|
49
58
|
|
50
59
|
player.launched? # => true
|
@@ -62,28 +71,20 @@ With the [So Nice](https://github.com/sunny/so-nice/) Web interface:
|
|
62
71
|

|
63
72
|
|
64
73
|
|
65
|
-
|
74
|
+
Contribute!
|
66
75
|
-----------
|
67
76
|
|
68
|
-
|
69
|
-
|
70
|
-
```sh
|
71
|
-
$ ruby -Ilib bin/anyplayer
|
72
|
-
```
|
73
|
-
|
74
|
-
Launch tests:
|
75
|
-
|
76
|
-
```sh
|
77
|
-
$ bundle exec rake test
|
78
|
-
```
|
77
|
+
All contributions are welcome! Head to the [Github issues](https://github.com/sunny/anyplayer/issues) to report bugs, questions or code. Also, check out `CONTRIBUTING.md`.
|
79
78
|
|
80
|
-
|
79
|
+
Here a few useful commands while developping:
|
81
80
|
|
82
81
|
```sh
|
83
|
-
$
|
82
|
+
$ ruby -Ilib bin/anyplayer # Use the anyplayer command-line from source
|
83
|
+
$ bin/rake test # Launch tests
|
84
|
+
$ bin/rake install # Install from source
|
85
|
+
$ bin/rake console # Launch console
|
84
86
|
```
|
85
87
|
|
86
|
-
All contributions are welcome! Head to the [Github issues](https://github.com/sunny/anyplayer/issues) to report bugs, questions or code.
|
87
88
|
|
88
89
|
License
|
89
90
|
-------
|
data/Rakefile
CHANGED
@@ -7,6 +7,16 @@ task :default => :test
|
|
7
7
|
|
8
8
|
Rake::TestTask.new do |t|
|
9
9
|
t.libs << "test"
|
10
|
+
t.libs << "lib"
|
10
11
|
t.pattern = "test/**/*_test.rb"
|
11
12
|
t.verbose = true
|
12
13
|
end
|
14
|
+
|
15
|
+
# Via http://erniemiller.org/2014/02/05/7-lines-every-gems-rakefile-should-have/
|
16
|
+
task :console do
|
17
|
+
require 'irb'
|
18
|
+
require 'irb/completion'
|
19
|
+
require 'anyplayer'
|
20
|
+
ARGV.clear
|
21
|
+
IRB.start
|
22
|
+
end
|
data/anyplayer.gemspec
CHANGED
@@ -15,10 +15,12 @@ Gem::Specification.new do |s|
|
|
15
15
|
|
16
16
|
s.files = `git ls-files`.split("\n")
|
17
17
|
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
18
|
-
s.executables =
|
18
|
+
s.executables = ["anyplayer"]
|
19
19
|
s.require_paths = ["lib"]
|
20
20
|
|
21
21
|
s.add_runtime_dependency 'ruby-mpd', '~> 0.3.0'
|
22
|
+
|
22
23
|
s.add_development_dependency 'minitest'
|
23
24
|
s.add_development_dependency 'flexmock'
|
25
|
+
s.add_development_dependency 'rake'
|
24
26
|
end
|
data/bin/rake
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
#
|
5
|
+
# This file was generated by Bundler.
|
6
|
+
#
|
7
|
+
# The application 'rake' is installed as part of a gem, and
|
8
|
+
# this file is here to facilitate running it.
|
9
|
+
#
|
10
|
+
|
11
|
+
require "pathname"
|
12
|
+
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
|
13
|
+
Pathname.new(__FILE__).realpath)
|
14
|
+
|
15
|
+
bundle_binstub = File.expand_path("../bundle", __FILE__)
|
16
|
+
|
17
|
+
if File.file?(bundle_binstub)
|
18
|
+
if File.read(bundle_binstub, 300) =~ /This file was generated by Bundler/
|
19
|
+
load(bundle_binstub)
|
20
|
+
else
|
21
|
+
abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
|
22
|
+
Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
require "rubygems"
|
27
|
+
require "bundler/setup"
|
28
|
+
|
29
|
+
load Gem.bin_path("rake", "rake")
|
data/lib/anyplayer.rb
CHANGED
@@ -1,13 +1,20 @@
|
|
1
1
|
require "timeout"
|
2
2
|
|
3
3
|
module Anyplayer
|
4
|
+
# Ordering of the players should put the most-used players and the fastest to
|
5
|
+
# test at the top.
|
6
|
+
#
|
7
|
+
# iTunes Windows has been placed at the top because of some linux false
|
8
|
+
# positives.
|
9
|
+
# https://github.com/sunny/anyplayer/issues/8
|
10
|
+
|
4
11
|
PLAYERS = %w(
|
12
|
+
itunes_windows
|
5
13
|
rhythmbox
|
6
14
|
mpd
|
7
15
|
xmms2
|
8
16
|
amarok
|
9
17
|
itunes_mac
|
10
|
-
itunes_windows
|
11
18
|
spotify_mac
|
12
19
|
rdio_mac
|
13
20
|
)
|
@@ -20,4 +27,3 @@ end
|
|
20
27
|
require "anyplayer/player"
|
21
28
|
require "anyplayer/selector"
|
22
29
|
require "anyplayer/version"
|
23
|
-
|
@@ -4,12 +4,31 @@ require "anyplayer"
|
|
4
4
|
module Anyplayer::CommandLine
|
5
5
|
extend self
|
6
6
|
|
7
|
+
COMMANDS = %w(
|
8
|
+
playpause
|
9
|
+
play
|
10
|
+
pause
|
11
|
+
next
|
12
|
+
prev
|
13
|
+
voldown
|
14
|
+
volup
|
15
|
+
volume
|
16
|
+
track
|
17
|
+
artist
|
18
|
+
album
|
19
|
+
vote
|
20
|
+
name
|
21
|
+
launched
|
22
|
+
paused
|
23
|
+
playing
|
24
|
+
)
|
25
|
+
|
7
26
|
def parse(argv)
|
8
27
|
# Create a selector
|
9
28
|
selector = Anyplayer::Selector.new
|
10
29
|
if argv.first == "-v"
|
11
30
|
selector.verbose = true
|
12
|
-
argv.
|
31
|
+
argv.shift
|
13
32
|
|
14
33
|
$stderr.puts "anyplayer v#{Anyplayer::VERSION}"
|
15
34
|
end
|
@@ -18,36 +37,47 @@ module Anyplayer::CommandLine
|
|
18
37
|
player = selector.player
|
19
38
|
abort "Error: no player connected.\n" + selector.errors.join("\n") if !player
|
20
39
|
|
21
|
-
# Call
|
22
|
-
|
23
|
-
|
24
|
-
when "play" then player.play
|
25
|
-
when "pause" then player.pause
|
26
|
-
when "next" then player.next
|
27
|
-
when "prev" then player.next
|
28
|
-
when "voldown" then player.voldown
|
29
|
-
when "volup" then player.volup
|
30
|
-
when "volume" then puts player.volume
|
31
|
-
when "track" then puts player.track
|
32
|
-
when "artist" then puts player.artist
|
33
|
-
when "album" then puts player.album
|
34
|
-
when "vote" then player.vote
|
35
|
-
when "name" then puts player.name
|
36
|
-
when "launched" then exit(player.launched? ? 0 : 1)
|
37
|
-
when "playing" then exit(player.playing? ? 0 : 1)
|
38
|
-
when "paused" then exit(player.playing? ? 0 : 1)
|
40
|
+
# Call a command
|
41
|
+
if argv.empty?
|
42
|
+
usage(player)
|
39
43
|
else
|
40
|
-
|
41
|
-
|
44
|
+
command(player, argv.first)
|
45
|
+
end
|
46
|
+
end
|
42
47
|
|
43
|
-
|
44
|
-
volume, track, artist, album, vote, name, launched.
|
48
|
+
private
|
45
49
|
|
46
|
-
|
47
|
-
|
48
|
-
|
50
|
+
# Call
|
51
|
+
def command(player, command)
|
52
|
+
response = call(player, command)
|
53
|
+
|
54
|
+
case response
|
55
|
+
when :undefined_command then usage(player)
|
56
|
+
when true then exit(0)
|
57
|
+
when false then exit(1)
|
58
|
+
when String, Numeric then puts response
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
# Call the method on the player
|
63
|
+
# Tries the boolean method as well
|
64
|
+
def call(player, command)
|
65
|
+
[command, "#{command}?"].each do |method|
|
66
|
+
method = method.to_sym
|
67
|
+
return player.send(method) if player.respond_to?(method)
|
49
68
|
end
|
50
69
|
|
70
|
+
:undefined_command
|
51
71
|
end
|
52
72
|
|
73
|
+
def usage(player)
|
74
|
+
$stderr.puts <<USAGE
|
75
|
+
Usage: anyplayer [-v] [command]
|
76
|
+
|
77
|
+
Where command is one of: #{COMMANDS.join(', ')}.
|
78
|
+
|
79
|
+
Player connected: #{player.name}.
|
80
|
+
USAGE
|
81
|
+
exit(1)
|
82
|
+
end
|
53
83
|
end
|
data/lib/anyplayer/player.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Default Player class that is
|
1
|
+
# Default Player class that is inherited by all players.
|
2
2
|
#
|
3
3
|
# All players should override these methods:
|
4
4
|
# launched? (return bool)
|
@@ -31,7 +31,12 @@ class Anyplayer::Player
|
|
31
31
|
# Example:
|
32
32
|
# player.name # => iTunes
|
33
33
|
def name
|
34
|
-
self.class.to_s.gsub(/^.*::/,
|
34
|
+
self.class.to_s.gsub(/^.*::/, "")
|
35
|
+
end
|
36
|
+
|
37
|
+
# Default paused is not playing
|
38
|
+
def paused?
|
39
|
+
!playing?
|
35
40
|
end
|
36
41
|
|
37
42
|
# Tells the player to toggle the pause state
|
@@ -65,11 +70,14 @@ class Anyplayer::Player
|
|
65
70
|
reset_votes
|
66
71
|
end
|
67
72
|
|
68
|
-
|
73
|
+
# Operating systems where this player should work
|
74
|
+
def platforms
|
75
|
+
[:mac, :windows, :linux, :unix]
|
76
|
+
end
|
69
77
|
|
70
|
-
|
71
|
-
@votes = 0
|
72
|
-
end
|
78
|
+
private
|
73
79
|
|
80
|
+
def reset_votes
|
81
|
+
@votes = 0
|
82
|
+
end
|
74
83
|
end
|
75
|
-
|
@@ -1,61 +1,67 @@
|
|
1
1
|
class Anyplayer::Amarok < Anyplayer::Player
|
2
2
|
def playpause
|
3
|
-
amarok
|
3
|
+
amarok "PlayPause"
|
4
4
|
end
|
5
5
|
|
6
6
|
def play
|
7
|
-
amarok
|
7
|
+
amarok "Play"
|
8
8
|
end
|
9
9
|
|
10
10
|
def pause
|
11
|
-
amarok
|
11
|
+
amarok "Pause"
|
12
12
|
end
|
13
13
|
|
14
14
|
def prev
|
15
|
-
amarok
|
15
|
+
amarok "Prev"
|
16
16
|
super
|
17
17
|
end
|
18
18
|
|
19
19
|
def next
|
20
|
-
amarok
|
20
|
+
amarok "Next"
|
21
21
|
super
|
22
22
|
end
|
23
23
|
|
24
24
|
def voldown
|
25
|
-
amarok
|
25
|
+
amarok "VolumeDown 5"
|
26
26
|
end
|
27
27
|
|
28
28
|
def volup
|
29
|
-
amarok
|
29
|
+
amarok "VolumeUp 5"
|
30
30
|
end
|
31
31
|
|
32
32
|
def volume
|
33
|
-
amarok
|
33
|
+
amarok "VolumeGet"
|
34
34
|
end
|
35
35
|
|
36
36
|
def track
|
37
|
-
amarok_get_meta
|
37
|
+
amarok_get_meta "title"
|
38
38
|
end
|
39
39
|
|
40
40
|
def artist
|
41
|
-
amarok_get_meta
|
41
|
+
amarok_get_meta "artist"
|
42
42
|
end
|
43
43
|
|
44
44
|
def album
|
45
|
-
amarok_get_meta
|
45
|
+
amarok_get_meta "album"
|
46
46
|
end
|
47
47
|
|
48
48
|
def launched?
|
49
|
-
not %x(qdbus org.kde.amarok 2>&1).match(
|
49
|
+
not %x(qdbus org.kde.amarok 2>&1).match(
|
50
|
+
/does not exist|not found|cannot find the path specified/
|
51
|
+
)
|
52
|
+
end
|
53
|
+
|
54
|
+
def platforms
|
55
|
+
[:unix, :linux]
|
50
56
|
end
|
51
57
|
|
52
58
|
private
|
53
|
-
def amarok(command)
|
54
|
-
%x(qdbus org.kde.amarok /Player org.freedesktop.MediaPlayer.#{command}).rstrip
|
55
|
-
end
|
56
59
|
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
end
|
60
|
+
def amarok(command)
|
61
|
+
%x(qdbus org.kde.amarok /Player org.freedesktop.MediaPlayer.#{command}).rstrip
|
62
|
+
end
|
61
63
|
|
64
|
+
def amarok_get_meta(name)
|
65
|
+
amarok("GetMetadata").match(/#{name}: (\S.*)/)[1] rescue nil
|
66
|
+
end
|
67
|
+
end
|