coderrr-video-accel 0.0.3 → 0.0.4

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.
@@ -18,8 +18,8 @@ class SpeedStream
18
18
  @output_file = output_file
19
19
  @write_mutex = Mutex.new
20
20
  @finished = []
21
- @bytes_per_conn = 100_000
22
- @concurrent_connections = 10
21
+ @bytes_per_conn = 200_000
22
+ @concurrent_connections = 15
23
23
  @cookies = {}
24
24
  @extra_file_length_headers = {'Range' => 'bytes=1-'}
25
25
  end
@@ -34,8 +34,8 @@ class SpeedStream
34
34
 
35
35
  begin
36
36
  ranges.each do |range|
37
- pool.add_work(range) do |range|
38
- download_range range
37
+ pool.add_work(range) do |drange|
38
+ download_range drange
39
39
  end
40
40
  end
41
41
  ensure
@@ -48,11 +48,18 @@ class SpeedStream
48
48
  private
49
49
 
50
50
  def download_range(range)
51
- file_offset = range.begin
52
-
53
- data = get_with_redirects(range)
54
- write_file(file_offset, data)
55
-
51
+ data = nil
52
+ Timeout.timeout(3*60) do
53
+ data = get_with_redirects(range)
54
+ end
55
+ rescue Timeout::Error
56
+ puts "Timed out, retrying"
57
+ retry
58
+ rescue Exception
59
+ puts $!, $@
60
+ retry
61
+ else
62
+ write_file(range.begin, data)
56
63
  process_progress(range)
57
64
  end
58
65
 
@@ -85,8 +92,8 @@ class SpeedStream
85
92
  end
86
93
 
87
94
  def write_file(pos, buf)
88
- @bytes_written += buf.size
89
95
  @write_mutex.synchronize do
96
+ @bytes_written += buf.size
90
97
  file_handle.seek(pos, IO::SEEK_SET)
91
98
  file_handle.write buf
92
99
  file_handle.flush
@@ -100,6 +107,8 @@ class SpeedStream
100
107
  rs << (n*bytes_per_conn..(n+1)*bytes_per_conn)
101
108
  end
102
109
  rs[-1] = (rs[-1].begin..file_length)
110
+
111
+ puts file_length
103
112
  rs
104
113
  end
105
114
  end
data/lib/vdl.rb CHANGED
@@ -46,10 +46,10 @@ stream.on_progress = lambda do |bytes, bps, percent|
46
46
  puts "downloading #{url} to #{file}..."
47
47
  puts "#{'%.2f'%bps} b/s #{'%.2f%'%percent}"
48
48
 
49
- if !started and bytes > 1_000_000
49
+ if !started and bytes > 200_000
50
50
  started = true
51
51
  system(%{#{terminal} "#{player} #{file}" &})
52
52
  end
53
53
  end
54
54
 
55
- stream.download!
55
+ stream.download!
@@ -21,6 +21,9 @@ class VideoPlayer
21
21
  puts "process #{cmd}"
22
22
  case cmd
23
23
  when 'q' then exit!
24
+ when 'r'
25
+ @pid.kill! if @pid
26
+ @pid = spawn(@last_spawn)
24
27
  when 'm'
25
28
  @pid.kill! if @pid
26
29
  @pid = spawn("mplayer -msglevel all=0 #{MP_ARGS[@mplayer_arg]} #{@file}")
@@ -32,6 +35,7 @@ class VideoPlayer
32
35
  end
33
36
 
34
37
  def spawn(cmd)
38
+ @last_spawn = cmd
35
39
  pid = fork do
36
40
  exec(cmd)
37
41
  end
@@ -1,25 +1,48 @@
1
1
  require 'speed_stream'
2
2
 
3
3
  class YoutubeSpeedStream < SpeedStream
4
+ class YoutubeRange < Range
5
+ attr_accessor :file_offset
6
+ attr_writer :begin
7
+ alias_method :orig_begin, :begin
8
+ def begin
9
+ @begin or orig_begin
10
+ end
11
+ end
12
+
4
13
  def initialize(*a)
5
14
  super
6
- @concurrent_connections = 20
15
+ @concurrent_connections = 4
7
16
  @extra_file_length_headers = {}
17
+ @chunk_beginnings = {}
8
18
  end
9
19
 
10
20
  private
11
21
 
22
+ def ranges
23
+ @ranges ||= begin
24
+ len = 2*60 + 13
25
+ ranges = []
26
+ i = 0
27
+ (0..len).step(2) do |start|
28
+ ranges << YoutubeRange.new(start, i)
29
+ i += 1
30
+ end
31
+ ranges.first.file_offset = 0
32
+ ranges
33
+ end
34
+ end
35
+
12
36
  def get_with_redirects(range)
37
+ start = range.begin
38
+ index = range.end
13
39
  current_uri = uri
14
40
 
15
41
  loop do
16
42
  TCPSocket.open(current_uri.host, current_uri.port) do |s|
17
43
  uri_str = current_uri.request_uri
18
- if uri_str.include? "&start="
19
- uri_str.gsub(/&start=\d+/, "&start=#{range.begin}")
20
- else
21
- uri_str << "&start=#{range.begin}"
22
- end
44
+ uri_str.sub!(/&begin=\d+|$/, "&begin=#{range.begin*1000}")
45
+
23
46
  s.write("GET #{uri_str} HTTP/1.1\r\nHost: #{current_uri.host}\r\nCookie: #{cookie_string}\r\n\r\n")
24
47
 
25
48
  s.while_reading(data = "") { break if data =~ /\r?\n\r?\n/ }
@@ -32,14 +55,26 @@ class YoutubeSpeedStream < SpeedStream
32
55
  # strip off header and keep reading
33
56
  data.gsub!(/\A.+?\r?\n\r?\n/m,'')
34
57
 
35
- while buf = (s.readpartial(16384) rescue nil)
58
+ while buf = (s.readpartial(1024) rescue nil)
36
59
  data << buf
37
- break if range.begin + data.size > range.end
60
+ if ! @chunk_beginnings[index] and data.size > 1024
61
+ @chunk_beginnings[index] = data[0, 1024]
62
+ end
63
+ break if bgn = @chunk_beginnings[index+1] and end_index = data.index(bgn[327..-1])
38
64
  end
65
+ sleep 1 until range.file_offset
66
+
67
+ @bytes_per_conn ||= data.size
68
+ data = data[0...end_index] if end_index
39
69
 
40
70
  # strip FLV headers on all parts except first
41
- start = range.begin == 0 ? 0 : 13
42
- return data[start, range.end - range.begin]
71
+ data = data[327..-1] || '' unless index == 0
72
+
73
+ ranges[index+1].file_offset = range.file_offset + data.size if ranges[index+1]
74
+
75
+ range.begin = range.file_offset
76
+
77
+ return data
43
78
  end
44
79
  end
45
80
  end
@@ -1,6 +1,6 @@
1
1
  spec = Gem::Specification.new do |s|
2
2
  s.name = "video-accel"
3
- s.version = "0.0.3"
3
+ s.version = "0.0.4"
4
4
  s.author = "coderrr"
5
5
  s.email = "coderrr.contact@gmail.com"
6
6
  # s.homepage = "http://blogs.cocoondev.org/crafterm/"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: coderrr-video-accel
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - coderrr
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2008-10-27 00:00:00 -07:00
12
+ date: 2009-02-13 00:00:00 -08:00
13
13
  default_executable:
14
14
  dependencies: []
15
15