airplayer 0.0.5 → 0.0.6
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/Gemfile.lock +26 -14
- data/README.markdown +30 -1
- data/airplayer.gemspec +1 -0
- data/lib/airplayer/app.rb +1 -1
- data/lib/airplayer/controller.rb +3 -1
- data/lib/airplayer/media.rb +1 -1
- data/lib/airplayer/playlist.rb +31 -4
- data/lib/airplayer/server.rb +12 -6
- data/lib/airplayer/version.rb +1 -1
- data/spec/airplayer_spec.rb +9 -3
- metadata +21 -5
data/Gemfile.lock
CHANGED
@@ -1,9 +1,10 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
airplayer (0.0.
|
4
|
+
airplayer (0.0.6)
|
5
5
|
airplay
|
6
6
|
mime-types
|
7
|
+
nokogiri
|
7
8
|
rack
|
8
9
|
ruby-progressbar
|
9
10
|
thor
|
@@ -15,29 +16,40 @@ GEM
|
|
15
16
|
dnssd (~> 2.0)
|
16
17
|
net-http-digest_auth (~> 1.2)
|
17
18
|
net-http-persistent (>= 2.6)
|
19
|
+
coderay (1.0.8)
|
18
20
|
diff-lcs (1.1.3)
|
19
21
|
dnssd (2.0)
|
20
|
-
guard (1.4
|
22
|
+
guard (1.5.4)
|
21
23
|
listen (>= 0.4.2)
|
24
|
+
lumberjack (>= 1.0.2)
|
25
|
+
pry (>= 0.9.10)
|
22
26
|
thor (>= 0.14.6)
|
23
|
-
guard-rspec (2.
|
27
|
+
guard-rspec (2.3.0)
|
24
28
|
guard (>= 1.1)
|
25
29
|
rspec (~> 2.11)
|
26
|
-
listen (0.
|
30
|
+
listen (0.6.0)
|
31
|
+
lumberjack (1.0.2)
|
32
|
+
method_source (0.8.1)
|
27
33
|
mime-types (1.19)
|
28
34
|
net-http-digest_auth (1.2.1)
|
29
|
-
net-http-persistent (2.
|
35
|
+
net-http-persistent (2.8)
|
36
|
+
nokogiri (1.5.5)
|
37
|
+
pry (0.9.10)
|
38
|
+
coderay (~> 1.0.5)
|
39
|
+
method_source (~> 0.8)
|
40
|
+
slop (~> 3.3.1)
|
30
41
|
rack (1.4.1)
|
31
|
-
rake (0.
|
32
|
-
rspec (2.
|
33
|
-
rspec-core (~> 2.
|
34
|
-
rspec-expectations (~> 2.
|
35
|
-
rspec-mocks (~> 2.
|
36
|
-
rspec-core (2.
|
37
|
-
rspec-expectations (2.
|
42
|
+
rake (10.0.2)
|
43
|
+
rspec (2.12.0)
|
44
|
+
rspec-core (~> 2.12.0)
|
45
|
+
rspec-expectations (~> 2.12.0)
|
46
|
+
rspec-mocks (~> 2.12.0)
|
47
|
+
rspec-core (2.12.1)
|
48
|
+
rspec-expectations (2.12.0)
|
38
49
|
diff-lcs (~> 1.1.3)
|
39
|
-
rspec-mocks (2.
|
40
|
-
ruby-progressbar (1.0.
|
50
|
+
rspec-mocks (2.12.0)
|
51
|
+
ruby-progressbar (1.0.2)
|
52
|
+
slop (3.3.3)
|
41
53
|
thor (0.16.0)
|
42
54
|
|
43
55
|
PLATFORMS
|
data/README.markdown
CHANGED
@@ -16,7 +16,7 @@ Requirements
|
|
16
16
|
-------------------------------------------------------------------------------
|
17
17
|
|
18
18
|
- OSX or Ubuntu
|
19
|
-
- Ruby 1.9.
|
19
|
+
- Ruby 1.9.3 or later
|
20
20
|
- AppleTV 2G or later
|
21
21
|
|
22
22
|
|
@@ -91,12 +91,41 @@ $ airplayer play ~/Movies/Trailers
|
|
91
91
|
Time: 00:02:36 |==============================================| 100% Complete
|
92
92
|
```
|
93
93
|
|
94
|
+
### Play video podcast()
|
95
|
+
|
96
|
+
Example: CNN video podcast
|
97
|
+
|
98
|
+
```sh
|
99
|
+
$ airplayer play http://rss.cnn.com/services/podcasting/cnnnewsroom/rss.xml
|
100
|
+
|
101
|
+
Source: http://rss.cnn.com/~r/services/podcasting/cnnnewsroom/rss/~5/z7DirHubdP0/exp-travel-insider-hilton-head-island.cnn.m4v
|
102
|
+
Title: exp-travel-insider-hilton-head-island.cnn.m4v
|
103
|
+
Device: Apple TV (10.0.1.2)
|
104
|
+
Time: 00:00:44 |============ | 39% Streaming
|
105
|
+
```
|
106
|
+
|
107
|
+
|
94
108
|
### Repeat play
|
95
109
|
|
110
|
+
Repeat one
|
111
|
+
|
96
112
|
```sh
|
97
113
|
$ airplayer play '~/Movies/Trailers/007 SKYFALL.mp4' --repeat
|
98
114
|
```
|
99
115
|
|
116
|
+
Repeat all
|
117
|
+
|
118
|
+
```sh
|
119
|
+
$ airplayer play '~/Movies/Trailers' --repeat
|
120
|
+
```
|
121
|
+
|
122
|
+
|
123
|
+
### Shuffle play
|
124
|
+
|
125
|
+
```sh
|
126
|
+
$ airplayer play '~/Movies/Trailers' --shuffle
|
127
|
+
```
|
128
|
+
|
100
129
|
|
101
130
|
Supported MIME types
|
102
131
|
--------------------------------------------------------------------------------
|
data/airplayer.gemspec
CHANGED
@@ -20,6 +20,7 @@ Gem::Specification.new do |gem|
|
|
20
20
|
gem.add_runtime_dependency 'airplay'
|
21
21
|
gem.add_runtime_dependency 'rack'
|
22
22
|
gem.add_runtime_dependency 'mime-types'
|
23
|
+
gem.add_runtime_dependency 'nokogiri'
|
23
24
|
|
24
25
|
gem.add_development_dependency 'rake'
|
25
26
|
gem.add_development_dependency 'rspec'
|
data/lib/airplayer/app.rb
CHANGED
@@ -2,7 +2,7 @@ require 'thor'
|
|
2
2
|
|
3
3
|
module AirPlayer
|
4
4
|
class App < Thor
|
5
|
-
desc 'play <URI|FILE|DIR> [-r|--repeat] [-s|--shuffle]', 'Play video(URI or local video file path or video directory)'
|
5
|
+
desc 'play <URI|Podcast XML|FILE|DIR> [-r|--repeat] [-s|--shuffle]', 'Play video(URI or Podcast XML URI or local video file path or video directory)'
|
6
6
|
method_option :repeat, :aliases => '-r', :desc => 'Repeat play', :type => :boolean
|
7
7
|
method_option :shuffle, :aliases => '-s', :desc => 'Shuffle play', :type => :boolean
|
8
8
|
def play(target)
|
data/lib/airplayer/controller.rb
CHANGED
@@ -20,7 +20,7 @@ module AirPlayer
|
|
20
20
|
end
|
21
21
|
|
22
22
|
def play(media)
|
23
|
-
raise TypeError unless media.
|
23
|
+
raise TypeError unless media.is_a? Media
|
24
24
|
|
25
25
|
display_information(media)
|
26
26
|
@player = @airplay.send_video(media.open)
|
@@ -35,6 +35,8 @@ module AirPlayer
|
|
35
35
|
abort '[ERROR] Buffering timeout'
|
36
36
|
rescue TypeError
|
37
37
|
abort '[ERROR] Not media class'
|
38
|
+
rescue
|
39
|
+
abort "Play stopped"
|
38
40
|
end
|
39
41
|
|
40
42
|
def pause
|
data/lib/airplayer/media.rb
CHANGED
data/lib/airplayer/playlist.rb
CHANGED
@@ -1,3 +1,8 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'rss'
|
4
|
+
require 'nokogiri'
|
5
|
+
|
1
6
|
module AirPlayer
|
2
7
|
class Playlist < Array
|
3
8
|
def initialize(options = {})
|
@@ -6,8 +11,14 @@ module AirPlayer
|
|
6
11
|
end
|
7
12
|
|
8
13
|
def add(item)
|
9
|
-
|
10
|
-
|
14
|
+
case type(item)
|
15
|
+
when :local
|
16
|
+
concat(media_in_local(item))
|
17
|
+
when :podcast
|
18
|
+
concat(media_in_podcast(item))
|
19
|
+
when :url
|
20
|
+
push(Media.new(item))
|
21
|
+
end
|
11
22
|
self
|
12
23
|
end
|
13
24
|
|
@@ -20,10 +31,26 @@ module AirPlayer
|
|
20
31
|
end
|
21
32
|
|
22
33
|
private
|
23
|
-
def
|
24
|
-
Dir.
|
34
|
+
def type(item)
|
35
|
+
if Dir.exists?(File.expand_path(item))
|
36
|
+
:local
|
37
|
+
elsif Media.playable? item
|
38
|
+
:url
|
39
|
+
elsif RSS::Parser.parse(open(item))
|
40
|
+
:podcast
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def media_in_local(path)
|
45
|
+
Dir.entries(File.expand_path(path)).sort.map do |node|
|
25
46
|
Media.new(File.expand_path(node, path)) if Media.playable? node
|
26
47
|
end.compact
|
27
48
|
end
|
49
|
+
|
50
|
+
def media_in_podcast(path)
|
51
|
+
Nokogiri::XML(open(path)).search('enclosure').map do |node|
|
52
|
+
Media.new(node.attributes['url'].text)
|
53
|
+
end
|
54
|
+
end
|
28
55
|
end
|
29
56
|
end
|
data/lib/airplayer/server.rb
CHANGED
@@ -6,16 +6,22 @@ module AirPlayer
|
|
6
6
|
attr_reader :uri
|
7
7
|
|
8
8
|
def initialize(video_path)
|
9
|
-
@server = Rack::Server.new(
|
10
|
-
|
9
|
+
@server = Rack::Server.new(
|
10
|
+
:server => :webrick,
|
11
|
+
:Host => local_ip,
|
12
|
+
:Port => 7070,
|
13
|
+
:app => Rack::File.new(video_path)
|
14
|
+
)
|
11
15
|
@uri = "http://#{@server.options[:Host]}:#{@server.options[:Port]}"
|
12
16
|
end
|
13
17
|
|
14
18
|
def start
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
+
Thread.start do
|
20
|
+
# Output WEBrick access log to file
|
21
|
+
$stderr = File.open(Logger.path, File::WRONLY | File::APPEND | File::CREAT)
|
22
|
+
@server.start
|
23
|
+
$stderr = STDERR
|
24
|
+
end
|
19
25
|
end
|
20
26
|
|
21
27
|
def stop
|
data/lib/airplayer/version.rb
CHANGED
data/spec/airplayer_spec.rb
CHANGED
@@ -46,10 +46,16 @@ describe :AirPlayer do
|
|
46
46
|
expect(playlist.first.path).to match 'http'
|
47
47
|
end
|
48
48
|
|
49
|
+
it 'add Podcast rss to list' do
|
50
|
+
playlist.add('http://rss.cnn.com/services/podcasting/cnnnewsroom/rss.xml')
|
51
|
+
playlist.entries do |media|
|
52
|
+
expect(media).to be_kind_of AirPlayer::Media
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
49
56
|
it 'add file to list, and that media type is file' do
|
50
|
-
expect(playlist.add('./
|
51
|
-
expect(playlist.add('./
|
52
|
-
expect(playlist.first.file?).to be_true
|
57
|
+
expect(playlist.add('./video.mp4').size).to eq 1
|
58
|
+
expect(playlist.add('./video.m4v').size).to eq 2
|
53
59
|
end
|
54
60
|
|
55
61
|
it 'has list contains url or file path' do
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: airplayer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.6
|
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: 2012-
|
12
|
+
date: 2012-12-06 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: thor
|
@@ -91,6 +91,22 @@ dependencies:
|
|
91
91
|
- - ! '>='
|
92
92
|
- !ruby/object:Gem::Version
|
93
93
|
version: '0'
|
94
|
+
- !ruby/object:Gem::Dependency
|
95
|
+
name: nokogiri
|
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'
|
94
110
|
- !ruby/object:Gem::Dependency
|
95
111
|
name: rake
|
96
112
|
requirement: !ruby/object:Gem::Requirement
|
@@ -183,7 +199,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
183
199
|
version: '0'
|
184
200
|
segments:
|
185
201
|
- 0
|
186
|
-
hash:
|
202
|
+
hash: 3264263706258799017
|
187
203
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
188
204
|
none: false
|
189
205
|
requirements:
|
@@ -192,10 +208,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
192
208
|
version: '0'
|
193
209
|
segments:
|
194
210
|
- 0
|
195
|
-
hash:
|
211
|
+
hash: 3264263706258799017
|
196
212
|
requirements: []
|
197
213
|
rubyforge_project:
|
198
|
-
rubygems_version: 1.8.
|
214
|
+
rubygems_version: 1.8.24
|
199
215
|
signing_key:
|
200
216
|
specification_version: 3
|
201
217
|
summary: Command-line AirPlay video client for Apple TV
|