airplayer 0.0.8 → 0.0.9

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 7bf034c4f9676f92eb321ceb9dd2cddeb1738fb0
4
- data.tar.gz: 798347f078900bec063af19462f77f62d824097e
3
+ metadata.gz: 8498cbf608d7722d098753117793a825b4f65e04
4
+ data.tar.gz: 67b89490ab729572c54f0d3d259b86d0a62183b5
5
5
  SHA512:
6
- metadata.gz: ee3c2abc153a8cd5154071df25d8d2c8a28345ffe7401c2f6531e3e0d123884dc90c36c5dacd72399c4853ee4d33e2cd8de5a124b47b3fceddfac277584ff3e9
7
- data.tar.gz: 7e734aa5e86af89e9a80b42f4bd35c4c11172e4f20d4a363a79571ca3469f6e250bf9468e70c0b9475791cd6905cdb1cc5d2c266d36720c044efb7aa4e987feb
6
+ metadata.gz: 95a6c703fd68fe8975ae9bf567956a13f333dec5cef75cb79e59b5e066a15b812fb5396a934cdb339af5e423e355a62c94db091f736b101cb8f82653b6cd6365
7
+ data.tar.gz: dfe225b835b481d59d6df7dd5416e1b710f58221d42f9ac29b34213d59a7014b88619f0be2c5fd9809c42101637ed82decbab4ccfa757f033912031fa465c377
@@ -1,8 +1,8 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- airplayer (0.0.8)
5
- airplay (~> 0.2.9)
4
+ airplayer (0.0.9)
5
+ airplay (= 1.0.2)
6
6
  mime-types
7
7
  nokogiri
8
8
  rack
@@ -12,75 +12,111 @@ PATH
12
12
  GEM
13
13
  remote: https://rubygems.org/
14
14
  specs:
15
- airplay (0.2.9)
15
+ CFPropertyList (2.2.6)
16
+ airplay (1.0.2)
17
+ CFPropertyList (~> 2.2.0)
18
+ celluloid (>= 0.15.0)
19
+ cuba (~> 3.1.0)
16
20
  dnssd (~> 2.0)
17
- net-http-digest_auth (~> 1.2)
18
- net-http-persistent (>= 2.6)
19
- celluloid (0.15.1)
21
+ log4r (~> 1.1.10)
22
+ micromachine (~> 1.0.4)
23
+ mime-types (>= 1.16)
24
+ net-http-digest_auth (~> 1.2.1)
25
+ net-ptth (= 0.0.17)
26
+ reel-rack (~> 0.1.0)
27
+ celluloid (0.15.2)
20
28
  timers (~> 1.1.0)
21
- coderay (1.0.9)
29
+ celluloid-io (0.15.0)
30
+ celluloid (>= 0.15.0)
31
+ nio4r (>= 0.5.0)
32
+ coderay (1.1.0)
22
33
  coveralls (0.7.0)
23
34
  multi_json (~> 1.3)
24
35
  rest-client
25
36
  simplecov (>= 0.7)
26
37
  term-ansicolor
27
38
  thor
28
- diff-lcs (1.2.4)
39
+ cuba (3.1.0)
40
+ rack
41
+ diff-lcs (1.2.5)
29
42
  dnssd (2.0)
30
- ffi (1.9.0)
43
+ docile (1.1.2)
44
+ fakefs (0.5.0)
45
+ ffi (1.9.3)
31
46
  formatador (0.2.4)
32
- guard (2.0.1)
47
+ guard (2.3.0)
33
48
  formatador (>= 0.2.4)
34
- listen (~> 2.0)
49
+ listen (~> 2.1)
35
50
  lumberjack (~> 1.0)
36
51
  pry (>= 0.9.12)
37
52
  thor (>= 0.18.1)
38
- guard-rspec (3.1.0)
39
- guard (>= 1.8)
40
- rspec (~> 2.13)
41
- listen (2.0.0)
42
- celluloid (>= 0.15.1)
53
+ guard-rspec (4.2.4)
54
+ guard (~> 2.1)
55
+ rspec (>= 2.14, < 4.0)
56
+ http (0.5.0)
57
+ http_parser.rb
58
+ http_parser.rb (0.6.0)
59
+ listen (2.4.0)
60
+ celluloid (>= 0.15.2)
43
61
  rb-fsevent (>= 0.9.3)
44
62
  rb-inotify (>= 0.9)
63
+ log4r (1.1.10)
45
64
  lumberjack (1.0.4)
46
65
  method_source (0.8.2)
47
- mime-types (1.25)
48
- mini_portile (0.5.1)
49
- multi_json (1.8.1)
50
- net-http-digest_auth (1.4)
51
- net-http-persistent (2.9)
52
- nokogiri (1.6.0)
66
+ micromachine (1.0.4)
67
+ mime-types (2.0)
68
+ mini_portile (0.5.2)
69
+ multi_json (1.8.4)
70
+ net-http-digest_auth (1.2.1)
71
+ net-ptth (0.0.17)
72
+ celluloid-io (>= 0.15.0)
73
+ http_parser.rb (>= 0.6.0.beta.2)
74
+ rack (>= 1.4.5)
75
+ nio4r (1.0.0)
76
+ nokogiri (1.6.1)
53
77
  mini_portile (~> 0.5.0)
54
- pry (0.9.12.2)
55
- coderay (~> 1.0.5)
78
+ pry (0.9.12.4)
79
+ coderay (~> 1.0)
56
80
  method_source (~> 0.8)
57
81
  slop (~> 3.4)
58
82
  rack (1.5.2)
59
- rake (10.1.0)
60
- rb-fsevent (0.9.3)
61
- rb-inotify (0.9.2)
83
+ rake (10.1.1)
84
+ rb-fsevent (0.9.4)
85
+ rb-inotify (0.9.3)
62
86
  ffi (>= 0.5.0)
87
+ reel (0.4.0)
88
+ celluloid (>= 0.15.1)
89
+ celluloid-io (>= 0.15.0)
90
+ http (>= 0.5.0)
91
+ http_parser.rb (>= 0.6.0.beta.2)
92
+ websocket_parser (>= 0.1.4)
93
+ reel-rack (0.1.0)
94
+ rack (>= 1.4.0)
95
+ reel (>= 0.4.0)
63
96
  rest-client (1.6.7)
64
97
  mime-types (>= 1.16)
65
98
  rspec (2.14.1)
66
99
  rspec-core (~> 2.14.0)
67
100
  rspec-expectations (~> 2.14.0)
68
101
  rspec-mocks (~> 2.14.0)
69
- rspec-core (2.14.5)
70
- rspec-expectations (2.14.3)
102
+ rspec-core (2.14.7)
103
+ rspec-expectations (2.14.4)
71
104
  diff-lcs (>= 1.1.3, < 2.0)
72
- rspec-mocks (2.14.3)
73
- ruby-progressbar (1.2.0)
74
- simplecov (0.7.1)
75
- multi_json (~> 1.0)
76
- simplecov-html (~> 0.7.1)
77
- simplecov-html (0.7.1)
78
- slop (3.4.6)
105
+ rspec-mocks (2.14.4)
106
+ ruby-progressbar (1.4.0)
107
+ simplecov (0.8.2)
108
+ docile (~> 1.1.0)
109
+ multi_json
110
+ simplecov-html (~> 0.8.0)
111
+ simplecov-html (0.8.0)
112
+ slop (3.4.7)
79
113
  term-ansicolor (1.2.2)
80
114
  tins (~> 0.8)
81
115
  thor (0.18.1)
82
116
  timers (1.1.0)
83
- tins (0.11.0)
117
+ tins (0.13.1)
118
+ websocket_parser (0.1.5)
119
+ http
84
120
 
85
121
  PLATFORMS
86
122
  ruby
@@ -89,6 +125,7 @@ DEPENDENCIES
89
125
  airplayer!
90
126
  bundler
91
127
  coveralls
128
+ fakefs
92
129
  guard-rspec
93
130
  rake
94
131
  rspec
@@ -19,7 +19,7 @@ Gem::Specification.new do |spec|
19
19
 
20
20
  spec.add_runtime_dependency 'thor'
21
21
  spec.add_runtime_dependency 'ruby-progressbar'
22
- spec.add_runtime_dependency 'airplay', '~> 0.2.9'
22
+ spec.add_runtime_dependency 'airplay', '= 1.0.2'
23
23
  spec.add_runtime_dependency 'rack'
24
24
  spec.add_runtime_dependency 'mime-types'
25
25
  spec.add_runtime_dependency 'nokogiri'
@@ -28,5 +28,6 @@ Gem::Specification.new do |spec|
28
28
  spec.add_development_dependency 'rake'
29
29
  spec.add_development_dependency 'rspec'
30
30
  spec.add_development_dependency 'guard-rspec'
31
+ spec.add_development_dependency 'fakefs'
31
32
  spec.add_development_dependency 'coveralls'
32
33
  end
@@ -1,13 +1,11 @@
1
- require 'rubygems'
2
1
  require 'airplay'
2
+ Airplay.configuration.load
3
3
 
4
4
  module AirPlayer
5
5
  require 'airplayer/version'
6
- require 'airplayer/logger'
7
6
  require 'airplayer/app'
8
7
  require 'airplayer/controller'
9
8
  require 'airplayer/device'
10
- require 'airplayer/server'
11
9
  require 'airplayer/playlist'
12
10
  require 'airplayer/media'
13
11
  end
@@ -7,15 +7,18 @@ module AirPlayer
7
7
  method_option :shuffle, aliases: '-s', desc: 'Shuffle play', type: :boolean
8
8
  method_option :device, aliases: '-d', desc: 'Device number', type: :numeric
9
9
  def play(target)
10
- controller = Controller.new
10
+ controller = Controller.new(device: options.fetch('device', 0))
11
11
  Playlist.new(options).add(target).entries do |media|
12
- controller.play(media, device: options.fetch('device', nil))
12
+ controller.play(media)
13
+ controller.pause
13
14
  end
14
15
  end
15
16
 
16
17
  desc 'devices', 'Show AirPlay devices'
17
18
  def devices
18
- Device.new.list
19
+ Device.devices.each_with_index do |device, number|
20
+ puts "#{number}: #{device.name} (Resolution: #{device.info.resolution}, Version: #{device.info.os_version}, IP: #{device.address})"
21
+ end
19
22
  end
20
23
 
21
24
  map '--version' => :version
@@ -1,98 +1,36 @@
1
- require 'timeout'
2
- require 'airplayer/progress_bar/base'
1
+ require 'ruby-progressbar'
3
2
 
4
3
  module AirPlayer
5
4
  class Controller
6
- BufferingTimeoutError = Class.new(TimeoutError)
7
-
8
- def initialize
9
- @airplay = Airplay::Client.new
10
- @player = nil
11
- @progressbar = nil
12
- @timeout = 30
13
- @interval = 1
14
- @total_sec = 0
15
- @current_sec = 0
16
- rescue Airplay::Client::ServerNotFoundError
17
- abort '[ERROR] AirPlay device is not found'
5
+ def initialize(options = { device: nil })
6
+ @device = Device.get(options[:device])
7
+ @player = nil
8
+ @progressbar = nil
18
9
  end
19
10
 
20
- def play(media, options = {})
21
- raise TypeError unless media.is_a? Media
22
-
23
- device = select_device(options.fetch(:device, nil))
24
- @airplay.use(device.name)
25
-
26
- display_information(device, media)
27
- @player = @airplay.send_video(media.open)
28
-
29
- buffering
30
- @progressbar.progress = @current_sec while playing
31
-
32
- @progressbar.title = :Complete
33
- pause
34
- media.close
35
- rescue BufferingTimeoutError
36
- abort '[ERROR] Buffering timeout'
37
- rescue TypeError
38
- abort '[ERROR] Not media class'
39
- rescue
40
- abort 'Play stopped'
11
+ def play(media)
12
+ puts " Source: #{media.path}"
13
+ puts " Title: #{media.title}"
14
+ puts " Device: #{@device.name} (Resolution: #{@device.info.resolution})"
15
+
16
+ @progressbar = ProgressBar.create(format: ' %a |%b%i| %p%% %t')
17
+ @player = @device.play(media.path)
18
+ @player.progress -> playback {
19
+ @progressbar.title = 'Streaming'
20
+ @progressbar.progress = playback.percent if playback.percent
21
+ }
22
+ @player.wait
41
23
  end
42
24
 
43
25
  def pause
44
- @player.stop if @player
45
- @progressbar.finish if @progressbar
46
- end
47
-
48
- def replay
49
- @player.scrub(0)
50
- @player.resume
51
-
52
- @progressbar.reset
53
- @progressbar.resume
54
- end
55
-
56
- private
57
- def display_information(device, media)
58
- puts
59
- puts " Source: #{media.path}"
60
- puts " Title: #{media.title}"
61
- puts " Device: #{device.name} (#{device.ip})"
62
-
63
- @progressbar = ProgressBar.create(format: ' %a |%b%i| %p%% %t')
64
- end
65
-
66
- def buffering
67
- timeout @timeout, BufferingTimeoutError do
68
- @progressbar.title = :Buffering until playing
69
- @progressbar.title = :Streaming
70
- @progressbar.total = @total_sec
71
- end
72
- end
73
-
74
- def playing
75
- scrub = @player.scrub
76
- @total_sec = scrub['duration']
77
- @current_sec = scrub['position']
78
- sleep @interval
79
- progress?
26
+ if @player
27
+ @player.stop
80
28
  end
81
29
 
82
- def progress?
83
- 0 < @current_sec && @total_sec - @current_sec > 1
84
- end
85
-
86
- def select_device(device_number = nil)
87
- device_number ||= 0
88
- device = Device.new
89
-
90
- if device.exist?(device_number)
91
- device.get(device_number)
92
- else
93
- puts "Device number #{device_number} is not found. Use default device"
94
- device.default
95
- end
30
+ if @progressbar
31
+ @progressbar.title = 'Complete'
32
+ @progressbar.finish
96
33
  end
34
+ end
97
35
  end
98
36
  end
@@ -1,26 +1,27 @@
1
1
  module AirPlayer
2
2
  class Device
3
- def initialize
4
- @airplay = Airplay::Client.new
5
- rescue Airplay::Client::ServerNotFoundError
6
- abort "[ERROR] AirPlay device is not found"
7
- end
8
-
9
- def default
10
- @airplay.browse.first
11
- end
3
+ class << self
4
+ def devices
5
+ Airplay.devices.to_a
6
+ rescue Airplay::Browser::NoDevicesFound
7
+ abort 'AirPlay devices not found.'
8
+ end
12
9
 
13
- def exist?(device_number)
14
- !!@airplay.browse.at(device_number)
15
- end
10
+ def get(device_number = 0)
11
+ if exist?(device_number)
12
+ Airplay[devices.at(device_number).name]
13
+ else
14
+ puts "Device number #{device_number} is not found. So choose #{default.name}."
15
+ default
16
+ end
17
+ end
16
18
 
17
- def get(device_number)
18
- @airplay.browse[device_number]
19
- end
19
+ def exist?(device_number)
20
+ !!devices.at(device_number)
21
+ end
20
22
 
21
- def list
22
- @airplay.browse.each_with_index do |device, number|
23
- puts "#{number}: #{device.name} (#{device.ip}:#{device.port})"
23
+ def default
24
+ devices.first
24
25
  end
25
26
  end
26
27
  end
@@ -31,8 +31,7 @@ module AirPlayer
31
31
  path = File.expand_path(target)
32
32
 
33
33
  if File.exist? path
34
- @video_server = AirPlayer::Server.new(path)
35
- @path = @video_server.uri
34
+ @path = path
36
35
  @title = File.basename(path)
37
36
  @type = :file
38
37
  else
@@ -56,15 +55,6 @@ module AirPlayer
56
55
  false
57
56
  end
58
57
 
59
- def open
60
- @video_server.start if file?
61
- @path
62
- end
63
-
64
- def close
65
- @video_server.stop if file?
66
- end
67
-
68
58
  def file?
69
59
  @type == :file
70
60
  end
@@ -1,3 +1,3 @@
1
1
  module AirPlayer
2
- VERSION = '0.0.8'
2
+ VERSION = '0.0.9'
3
3
  end
@@ -2,9 +2,31 @@ require 'spec_helper'
2
2
 
3
3
  module AirPlayer
4
4
  describe App do
5
- context 'class type' do
6
- it 'Thor' do
7
- expect(subject).to be_kind_of Thor
5
+ let (:airplayer) do
6
+ AirPlayer::App.new
7
+ end
8
+
9
+ describe '.new' do
10
+ it 'returns instance of Thor' do
11
+ expect(airplayer).to be_kind_of Thor
12
+ end
13
+ end
14
+
15
+ describe '.devices' do
16
+ before do
17
+ Airplay.devices << double_device
18
+ end
19
+
20
+ it 'display devices' do
21
+ devices = capture(:stdout) { airplayer.devices }
22
+ expect(devices).to match double_device.name
23
+ end
24
+ end
25
+
26
+ describe '.version' do
27
+ it 'display version' do
28
+ version = capture(:stdout) { airplayer.version }
29
+ expect(version.chomp).to eq AirPlayer::VERSION
8
30
  end
9
31
  end
10
32
  end
@@ -0,0 +1,35 @@
1
+ require 'spec_helper'
2
+
3
+ module AirPlayer
4
+ describe Controller do
5
+ let (:controller) do
6
+ AirPlayer::Controller
7
+ end
8
+
9
+ before do
10
+ Airplay.devices << double_device
11
+ end
12
+
13
+ describe '.new' do
14
+ context 'with args' do
15
+ it 'returns instance of Controller' do
16
+ expect(controller.new(device: 0)).to be_kind_of Controller
17
+ end
18
+ end
19
+
20
+ context 'without args' do
21
+ it 'raise TypeError' do
22
+ expect{ controller.new }.to raise_error(TypeError)
23
+ end
24
+ end
25
+ end
26
+
27
+ describe '.pause' do
28
+ context 'with not playing media' do
29
+ it 'do nothing' do
30
+ expect(controller.new(device: 0).pause).to be nil
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,56 @@
1
+ require 'spec_helper'
2
+
3
+ module AirPlayer
4
+ describe Device do
5
+ let (:device) do
6
+ AirPlayer::Device
7
+ end
8
+
9
+ before do
10
+ Airplay.devices << double_device
11
+ end
12
+
13
+ describe '#devices' do
14
+ it 'returns array' do
15
+ expect(device.devices).to be_kind_of Array
16
+ end
17
+ end
18
+
19
+ describe '#get' do
20
+ context 'with exist device number' do
21
+ it 'returns instance of device' do
22
+ expect(device.get(0)).to be_kind_of Airplay::Device
23
+ end
24
+ end
25
+
26
+ context 'with not exist device number' do
27
+ it 'returns default device and display message' do
28
+ default_device = nil
29
+ message = capture(:stdout) { default_device = device.get(99) }
30
+ expect(default_device).to eq device.default
31
+ expect(message).to match('Device number 99 is not found')
32
+ end
33
+ end
34
+ end
35
+
36
+ describe '#exist?' do
37
+ context 'with exist device number' do
38
+ it 'returns true' do
39
+ expect(device.exist?(0)).to be true
40
+ end
41
+ end
42
+
43
+ context 'with not exist device number' do
44
+ it 'returns false' do
45
+ expect(device.exist?(99)).to be false
46
+ end
47
+ end
48
+ end
49
+
50
+ describe '#default' do
51
+ it 'returns first airplay device' do
52
+ expect(device.default).to eq Airplay.devices.first
53
+ end
54
+ end
55
+ end
56
+ end
@@ -1,54 +1,50 @@
1
1
  # encoding: UTF-8
2
+ require 'fakefs/spec_helpers'
2
3
  require 'spec_helper'
3
4
 
4
5
  module AirPlayer
5
6
  describe Media do
6
- subject { AirPlayer::Media }
7
+ include FakeFS::SpecHelpers
7
8
 
8
- context 'valid mime types' do
9
- it 'supported' do
10
- expect(subject.playable?('007 SKYFALL.mp4')).to be_true
11
- expect(subject.playable?('007 SKYFALL.ts')).to be_true
12
- expect(subject.playable?('007 SKYFALL.m4v')).to be_true
13
- expect(subject.playable?('007 SKYFALL.mov')).to be_true
14
- expect(subject.playable?('007 SKYFALL.ts')).to be_true
15
- end
9
+ let (:media) do
10
+ AirPlayer::Media
16
11
  end
17
12
 
18
- context 'invalid mime types' do
19
- it 'unsupported' do
20
- expect(subject.playable?('007 SKYFALL.flv')).to be_false
21
- expect(subject.playable?('007 SKYFALL.wmv')).to be_false
22
- expect(subject.playable?('.DS_Store')).to be_false
23
- expect(subject.playable?('Fate_Kaleid_Liner_プリズマ☆イリヤ')).to be_false
13
+ describe '#playable?' do
14
+ context 'with supported mime types' do
15
+ it 'returns true' do
16
+ expect(media.playable?('007 SKYFALL.mp4')).to be true
17
+ expect(media.playable?('007 SKYFALL.ts')).to be true
18
+ expect(media.playable?('007 SKYFALL.m4v')).to be true
19
+ expect(media.playable?('007 SKYFALL.mov')).to be true
20
+ expect(media.playable?('007 SKYFALL.ts')).to be true
21
+ expect(media.playable?('マルチ☆バイト.mp4')).to be true
22
+ end
24
23
  end
25
- end
26
24
 
27
- context 'give Gemfile' do
28
- it 'file' do
29
- media = subject.new('./Gemfile')
30
- expect(media.file?).to be_true
25
+ context 'with unsupported mime types' do
26
+ it 'returns false' do
27
+ expect(media.playable?('007 SKYFALL.flv')).to be false
28
+ expect(media.playable?('007 SKYFALL.wmv')).to be false
29
+ expect(media.playable?('NOT_PLAYABLE_FILE')).to be false
30
+ end
31
31
  end
32
32
  end
33
33
 
34
- context 'give URL' do
35
- it 'URL' do
36
- #media = subject.new('http://example.com/video.mp4')
37
- #expect(media.url?).to be_true
34
+ describe '.file?' do
35
+ context 'with given local file' do
36
+ it 'returns true' do
37
+ FileUtils.touch('fake_movie.m4v')
38
+ expect(media.new('fake_movie.m4v').file?).to be true
39
+ end
38
40
  end
39
41
  end
40
42
 
41
- context 'give YouTube URL' do
42
- it 'has title and url' do
43
- #media = subject.new('http://www.youtube.com/watch?v=gVNYm9Qncyc')
44
- #expect(media.url?).to be_true
45
- #expect(media.title).to match(/Mogwai/)
46
- end
47
-
48
- it 'has title and short url' do
49
- #media = subject.new('http://youtu.be/gVNYm9Qncyc')
50
- #expect(media.url?).to be_true
51
- #expect(media.title).to match(/Mogwai/)
43
+ describe '.url?' do
44
+ context 'with given URL' do
45
+ it 'returns true' do
46
+ expect(media.new('http://example.com/video.mp4').url?).to be true
47
+ end
52
48
  end
53
49
  end
54
50
  end
@@ -1,37 +1,54 @@
1
+ require 'fakefs/spec_helpers'
1
2
  require 'spec_helper'
2
3
 
3
4
  module AirPlayer
4
5
  describe Playlist do
5
- subject { AirPlayer::Playlist.new }
6
+ let (:playlist) do
7
+ AirPlayer::Playlist.new
8
+ end
9
+
10
+ describe '.add' do
11
+ context 'with local directory' do
12
+ it 'returns media type is local file' do
13
+ FakeFS do
14
+ FileUtils.touch('01.m4v')
15
+ FileUtils.touch('02.m4v')
16
+ end
6
17
 
7
- describe '#add' do
8
- context 'url' do
9
- before { subject.add('http://example.com/video.mp4') }
10
- it 'media type is url' do
11
- expect(subject.first.path).to match 'http'
18
+ playlist.add('.')
19
+ playlist.entries do |media|
20
+ expect(media.file?).to be true
21
+ end
12
22
  end
13
23
  end
14
24
 
15
- context 'Podcast RSS' do
16
- it do
17
- subject.add('http://rss.cnn.com/services/podcasting/cnnnewsroom/rss.xml')
18
- subject.entries do |media|
19
- expect(media).to be_kind_of AirPlayer::Media
20
- end
25
+ context 'with URL' do
26
+ it 'returns media type is url' do
27
+ playlist.add('http://example.com/video.mp4')
28
+ expect(playlist.first.path).to match 'http'
21
29
  end
22
30
  end
23
31
 
24
- context 'multiple files' do
32
+ context 'with multiple files' do
25
33
  it 'have multiple files' do
26
- expect(subject.add('./video.mp4').size).to eq 1
27
- expect(subject.add('./video.m4v').size).to eq 2
34
+ expect(playlist.add('video.mp4').size).to eq 1
35
+ expect(playlist.add('video.m4v').size).to eq 2
36
+ end
37
+ end
38
+
39
+ context 'with podcast RSS' do
40
+ it 'returns media instances' do
41
+ playlist.add('http://rss.cnn.com/services/podcasting/cnnnewsroom/rss.xml')
42
+ playlist.entries do |media|
43
+ expect(media).to be_kind_of AirPlayer::Media
44
+ end
28
45
  end
29
46
  end
30
47
 
31
- context 'local file' do
32
- it 'type is Media' do
33
- subject.add('../airplayer')
34
- subject.entries do |media|
48
+ context 'with local file' do
49
+ it 'returns media instances' do
50
+ playlist.add('video.mp4')
51
+ playlist.entries do |media|
35
52
  expect(media).to be_kind_of AirPlayer::Media
36
53
  end
37
54
  end
@@ -1,4 +1,39 @@
1
- require 'airplayer'
2
-
3
1
  require 'coveralls'
4
2
  Coveralls.wear!
3
+
4
+ require 'stringio'
5
+ RSpec.configure do |c|
6
+ def capture(stream)
7
+ begin
8
+ stream = stream.to_s
9
+ eval "$#{stream} = StringIO.new"
10
+ yield
11
+ result = eval("$#{stream}").string
12
+ ensure
13
+ eval "$#{stream} = #{stream.upcase}"
14
+ end
15
+ result
16
+ end
17
+ end
18
+
19
+
20
+ require 'airplay'
21
+ Airplay.configure do |c|
22
+ c.autodiscover = false
23
+ end
24
+
25
+ # https://github.com/elcuervo/airplay/blob/master/lib/airplay/device.rb
26
+ # https://github.com/elcuervo/airplay/blob/master/lib/airplay/device/info.rb
27
+ def double_device
28
+ device = Airplay::Device.new(name: 'Double Device', address: 'double.appletv.local:7000')
29
+ allow(device).to receive('ip').and_return('127.0.0.1')
30
+ allow(device).to receive('server_info').and_return({
31
+ 'model' => 'AppleTV2,1',
32
+ 'os_version' => '11B554a',
33
+ 'width' => '1280',
34
+ 'height' => '720'
35
+ })
36
+ device
37
+ end
38
+
39
+ require 'airplayer'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: airplayer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.8
4
+ version: 0.0.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tomohiro TAIRA
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-10-06 00:00:00.000000000 Z
11
+ date: 2014-01-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: thor
@@ -42,16 +42,16 @@ dependencies:
42
42
  name: airplay
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - ~>
45
+ - - '='
46
46
  - !ruby/object:Gem::Version
47
- version: 0.2.9
47
+ version: 1.0.2
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - ~>
52
+ - - '='
53
53
  - !ruby/object:Gem::Version
54
- version: 0.2.9
54
+ version: 1.0.2
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: rack
57
57
  requirement: !ruby/object:Gem::Requirement
@@ -150,6 +150,20 @@ dependencies:
150
150
  - - '>='
151
151
  - !ruby/object:Gem::Version
152
152
  version: '0'
153
+ - !ruby/object:Gem::Dependency
154
+ name: fakefs
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - '>='
158
+ - !ruby/object:Gem::Version
159
+ version: '0'
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - '>='
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
153
167
  - !ruby/object:Gem::Dependency
154
168
  name: coveralls
155
169
  requirement: !ruby/object:Gem::Requirement
@@ -187,14 +201,12 @@ files:
187
201
  - lib/airplayer/app.rb
188
202
  - lib/airplayer/controller.rb
189
203
  - lib/airplayer/device.rb
190
- - lib/airplayer/logger.rb
191
204
  - lib/airplayer/media.rb
192
205
  - lib/airplayer/playlist.rb
193
- - lib/airplayer/progress_bar/base.rb
194
- - lib/airplayer/server.rb
195
206
  - lib/airplayer/version.rb
196
207
  - spec/airplayer/app_spec.rb
197
- - spec/airplayer/logger_spec.rb
208
+ - spec/airplayer/controller_spec.rb
209
+ - spec/airplayer/device_spec.rb
198
210
  - spec/airplayer/media_spec.rb
199
211
  - spec/airplayer/playlist_spec.rb
200
212
  - spec/spec_helper.rb
@@ -223,7 +235,8 @@ specification_version: 4
223
235
  summary: Command-line AirPlay video client for Apple TV
224
236
  test_files:
225
237
  - spec/airplayer/app_spec.rb
226
- - spec/airplayer/logger_spec.rb
238
+ - spec/airplayer/controller_spec.rb
239
+ - spec/airplayer/device_spec.rb
227
240
  - spec/airplayer/media_spec.rb
228
241
  - spec/airplayer/playlist_spec.rb
229
242
  - spec/spec_helper.rb
@@ -1,18 +0,0 @@
1
- require 'rbconfig'
2
-
3
- module AirPlayer
4
- class Logger
5
- def self.path
6
- case RbConfig::CONFIG['target_os']
7
- when /darwin|osx/i
8
- File.expand_path('~/Library/Logs/airplayer-access.log')
9
- when /linux|unix/i
10
- '/tmp/airplayer-access.log'
11
- when /mswin|windows|cygwin/i
12
- 'NUL'
13
- else
14
- STDOUT
15
- end
16
- end
17
- end
18
- end
@@ -1,9 +0,0 @@
1
- require 'ruby-progressbar'
2
-
3
- class ProgressBar
4
- class Base
5
- def total=(new_total)
6
- with_update { with_progressables(:total=, new_total) }
7
- end
8
- end
9
- end
@@ -1,41 +0,0 @@
1
- require 'rack'
2
- require 'socket'
3
-
4
- module AirPlayer
5
- class Server
6
- attr_reader :uri
7
-
8
- def initialize(video_path)
9
- @server = Rack::Server.new(server: :webrick, Host: local_ip, Port: 7070, app: Rack::File.new(video_path))
10
- @uri = "http://#{@server.options[:Host]}:#{@server.options[:Port]}"
11
- end
12
-
13
- def start
14
- Thread.start do
15
- # Output WEBrick access log to file
16
- $stderr = File.open(Logger.path, File::WRONLY | File::APPEND | File::CREAT)
17
- @server.start
18
- $stderr = STDERR
19
- end
20
- end
21
-
22
- def stop
23
- @server.server.shutdown
24
- end
25
-
26
- private
27
- # networking - Getting the Hostname or IP in Ruby on Rails - Stack Overflow
28
- # http://stackoverflow.com/questions/42566/getting-the-hostname-or-ip-in-ruby-on-rails
29
- def local_ip
30
- # turn off reverse DNS resolution temporarily
31
- orig, Socket.do_not_reverse_lookup = Socket.do_not_reverse_lookup, true
32
-
33
- UDPSocket.open do |s|
34
- s.connect('8.8.8.8', 1)
35
- s.addr.last
36
- end
37
- ensure
38
- Socket.do_not_reverse_lookup = orig
39
- end
40
- end
41
- end
@@ -1,15 +0,0 @@
1
- require 'spec_helper'
2
-
3
- module AirPlayer
4
- describe Logger do
5
- subject { AirPlayer::Logger }
6
-
7
- context 'file path' do
8
- it '/tmp/airplayer-access.log on Linux' do
9
- if RbConfig::CONFIG['target_os'] =~ /linux|unix/
10
- expect(subject.path).to eq '/tmp/airplayer-access.log'
11
- end
12
- end
13
- end
14
- end
15
- end