rstreamor 0.2.4 → 0.2.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 581d9a126b6ea78ee0ce602daf8adf61363a7890
4
- data.tar.gz: e0924a5564245385bd116ac100245bf5e82109b9
2
+ SHA256:
3
+ metadata.gz: c7df72d8583a6fa7d9e7e148ee53a883fe7e17f032d8449a89c1267583d3f2e3
4
+ data.tar.gz: 5783b2aaf45cee46fde0fa042d0199c2f71a9efb687940c0c877263b13d7c2d1
5
5
  SHA512:
6
- metadata.gz: 380b203fa6028d3523a41aba632bc95c0868df61205ad3a5bdbd70bd0cc622816be8205e859983797e4be42db1a8eeeaede4217468df8dee69b913e55259a6e9
7
- data.tar.gz: 081bfd93d9b5b621316bd8f86d0eca8753651b5e6ba45d6ecec99a8ce2694540fc544ad29c6d241409449b7451c984b70b6585ec7c57c912c494d856cc4a0eec
6
+ metadata.gz: 94b976e8190708b118349cf554b2445dac5d6d3414537fbb81d92c322fd9235999b7a1ef51d7afaee86c76243b347f6960302afa8d46b5ab01a2fab453be3878
7
+ data.tar.gz: 4cf6027f281d1f60274b250af071c60d08c8b1faa64fe9dd7ee6159b73dc7d99be0285870f2820ba108258f3d78b14a12da1b8a1c8c61599e5945c651b4f165b
data/README.md CHANGED
@@ -8,7 +8,7 @@ gem 'rstreamor', git: 'https://github.com/ndea/rstreamor.git', branch: 'master'
8
8
  ```
9
9
  ###### Rubygems
10
10
  ```ruby
11
- gem 'rstreamor', '~> 0.2.4'
11
+ gem 'rstreamor', '~> 0.2.6'
12
12
  ```
13
13
  # Install
14
14
  ```ruby
@@ -34,6 +34,16 @@ If you dont use Carrierwave as a file make sure your file method has the followi
34
34
  - #data
35
35
  - #content_type
36
36
 
37
+ Optionally, you could send some params to the `stream` method like the following example:
38
+ ```ruby
39
+ class VideosController < ApplicationController
40
+ include Rstreamor
41
+ def show
42
+ stream @resource.image_file, { x_sendfile: true, stream: true }
43
+ end
44
+ end
45
+ ```
46
+
37
47
  Please note that if you don't specify any range request headers Rstreamor will return the whole file from byte 0 to EOF with status code *200*
38
48
 
39
49
  # What is a range request?
@@ -94,4 +104,3 @@ Content-Type:application/mp4
94
104
  - Bugfixes
95
105
  - Codestyle
96
106
  - Anything that improves this gem
97
-
@@ -1,26 +1,29 @@
1
1
  module Rstreamor
2
2
  class File
3
- attr_accessor :file
3
+ attr_reader :file
4
4
 
5
5
  def initialize(file)
6
- self.file = file
6
+ @file = file
7
7
  end
8
8
 
9
9
  def data
10
- if self.file.respond_to? :data
11
- self.file.data
10
+ @data ||= if file.respond_to? :data
11
+ file.data
12
12
  else
13
- self.file.read
13
+ file.read
14
14
  end
15
15
  end
16
16
 
17
17
  def content_type
18
- self.file.content_type
18
+ file.content_type
19
19
  end
20
20
 
21
21
  def size
22
- data.size
22
+ # Because of encoding, the string size might not match the stream size,
23
+ # and that may lead to files being truncated when served (i.e. this happens
24
+ # often for MP3 files, were the last few seconds of files longer than a minute
25
+ # gets trimmed).
26
+ @size ||= data.bytesize
23
27
  end
24
-
25
28
  end
26
- end
29
+ end
@@ -1,18 +1,18 @@
1
1
  module Rstreamor
2
2
  class Request
3
- attr_accessor :request, :file
3
+ attr_reader :request, :file
4
4
 
5
5
  def initialize(request, file)
6
- self.request = request
7
- self.file = file
6
+ @request = request
7
+ @file = file
8
8
  end
9
9
 
10
10
  def ranges
11
- self.request.headers['HTTP_RANGE'].gsub('bytes=', '').split('-') if self.request.headers['HTTP_RANGE']
11
+ request.headers['HTTP_RANGE'].gsub('bytes=', '').split('-') if request.headers['HTTP_RANGE']
12
12
  end
13
13
 
14
14
  def upper_bound
15
- ranges[1] ? ranges[1].to_i : self.file.data.size
15
+ ranges[1] ? ranges[1].to_i : (file.size - 1)
16
16
  end
17
17
 
18
18
  def lower_bound
@@ -20,24 +20,23 @@ module Rstreamor
20
20
  end
21
21
 
22
22
  def range_header?
23
- self.request.headers['HTTP_RANGE'].present?
23
+ request.headers['HTTP_RANGE'].present?
24
24
  end
25
25
 
26
26
  def file_content_type
27
- self.file.content_type
27
+ file.content_type
28
28
  end
29
29
 
30
30
  def slice_file
31
- if self.request.headers['HTTP_RANGE'].present?
32
- self.file.data.byteslice(lower_bound, upper_bound)
31
+ if request.headers['HTTP_RANGE'].present?
32
+ file.data.byteslice(lower_bound..upper_bound)
33
33
  else
34
- self.file.data
34
+ file.data
35
35
  end
36
36
  end
37
37
 
38
38
  def file_size
39
- self.file.size
39
+ file.size
40
40
  end
41
-
42
41
  end
43
- end
42
+ end
@@ -1,25 +1,25 @@
1
1
  module Rstreamor
2
2
  class Response
3
- attr_accessor :request
3
+ attr_reader :request
4
4
 
5
5
  def initialize(request)
6
- self.request = request
6
+ @request = request
7
7
  end
8
8
 
9
9
  def response_code
10
- self.request.range_header? ? 206 : 200
10
+ request.range_header? ? 206 : 200
11
11
  end
12
12
 
13
13
  def content_length
14
- if self.request.range_header?
15
- (self.request.upper_bound - self.request.lower_bound).to_s
14
+ if request.range_header?
15
+ (request.upper_bound - request.lower_bound + 1).to_s
16
16
  else
17
- self.request.file.data.size
17
+ request.file_size
18
18
  end
19
19
  end
20
20
 
21
21
  def content_range
22
- "bytes #{self.request.lower_bound}-#{self.request.upper_bound - 1}/#{self.request.file.data.size}"
22
+ "bytes #{request.lower_bound}-#{request.upper_bound}/#{request.file_size}"
23
23
  end
24
24
 
25
25
  def accept_ranges
@@ -29,6 +29,5 @@ module Rstreamor
29
29
  def cache_control
30
30
  'no-cache'
31
31
  end
32
-
33
32
  end
34
- end
33
+ end
@@ -1,17 +1,22 @@
1
1
  module Rstreamor
2
2
  module Stream
3
- def stream(file)
3
+ def stream(file, options = {})
4
4
  request_builder = Rstreamor::Request.new(request, Rstreamor::File.new(file))
5
5
  response_builder = Rstreamor::Response.new(request_builder)
6
6
  set_response_header(request_builder, response_builder)
7
- stream_file(request_builder, response_builder)
7
+ stream_file(request_builder, response_builder, options)
8
8
  end
9
9
 
10
10
  private
11
11
 
12
- def stream_file(request_builder, response_builder)
12
+ def stream_file(request_builder, response_builder, options)
13
13
  content = request_builder.slice_file
14
- send_data content, type: request_builder.file_content_type, disposition: 'inline', status: response_builder.response_code
14
+
15
+ send_data(content, {
16
+ type: request_builder.file_content_type,
17
+ disposition: 'inline',
18
+ status: response_builder.response_code
19
+ }.merge(options))
15
20
  end
16
21
 
17
22
  def set_response_header(request_builder, response_builder)
@@ -1,3 +1,3 @@
1
1
  module Rstreamor
2
- VERSION = "0.2.4"
2
+ VERSION = "0.2.6"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rstreamor
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.4
4
+ version: 0.2.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Erwin Schens
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2015-11-03 00:00:00.000000000 Z
11
+ date: 2019-05-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -101,7 +101,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
101
101
  version: '0'
102
102
  requirements: []
103
103
  rubyforge_project:
104
- rubygems_version: 2.4.8
104
+ rubygems_version: 2.7.9
105
105
  signing_key:
106
106
  specification_version: 4
107
107
  summary: Stream files using HTTP range requests.