tivohmo 0.2.2 → 0.2.3

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: d174442bc2cdc54f0c321af10235ca9b7b0cd5e6
4
- data.tar.gz: 9879d1b6792705f0838f2f9a12c7fd00f4b1bc1e
3
+ metadata.gz: 82b98cf908b70108f96047411d32f7e1b7fe4b86
4
+ data.tar.gz: d78429acd344c4df742e8e849600a71ad5ccbb91
5
5
  SHA512:
6
- metadata.gz: 82fb8a7e0deb9d7d62be6b8809264dabaf1c23d776d53fa7ea90a0094a99ad354e97ef676663c863b6620ec5a13820b88a8449af865e036f0d7a0e430e4fcd8f
7
- data.tar.gz: fdcae9f54909c5122e99fe76528f3690f58f67cbc0853c535b51100faa3a4ff5eb6caf2c3688a84c968ee581e44cc14899d206252351a3764689ff5b88b7c0f7
6
+ metadata.gz: e1d414df9691878b936744d0ce977806df8b820078876e763b3b116d13167b8fabd71b46c1618c30426ae898152f0105d5b17785b1ff2b8a3642dcbffd925c48
7
+ data.tar.gz: 31eb7b4f97bc01856f0148f9483ebf1746129dfc9f9f552ecf837a8f02d9923222f0a9f1f823e4e339706c9c1f10eb3095aff035fcd49bcf6323c0e9feb08af9
data/.travis.yml CHANGED
@@ -4,7 +4,8 @@ rvm:
4
4
  - 2.1.3
5
5
 
6
6
  before_script:
7
+ - sudo add-apt-repository ppa:djcj/vlc-stable -y
7
8
  - sudo apt-get update
8
- - sudo apt-get install -y ffmpeg libavcodec-extra-53
9
+ - sudo apt-get install -y ffmpeg
9
10
 
10
11
  script: bundle exec rspec
data/CHANGELOG CHANGED
@@ -1,3 +1,26 @@
1
+ 0.2.3 (11/29/2014)
2
+ ------------------
3
+
4
+ add webmock/vcr <98c0a61> [Matt Conway]
5
+ fix transliteration fir ubuntu (replace iconv with unidecoder) <4aa988e> [Matt Conway]
6
+ lookup zap2it series id to enable thumbnails in My Shows UI <b737600> [Matt Conway]
7
+ transliterate for SD UI, xml cleanup <1a80126> [Matt Conway]
8
+ try to fix travis <3efda2a> [Matt Conway]
9
+ try to fix travis <a2c5d08> [Matt Conway]
10
+ warn for expected exceptions <c5e0736> [Matt Conway]
11
+
12
+ 0.2.2 (11/25/2014)
13
+ ------------------
14
+
15
+ decrease default beacon interval to 10s <4fd10c6> [Matt Conway]
16
+ disable recurse for now <c8f0100> [Matt Conway]
17
+ fix sort <33bce77> [Matt Conway]
18
+ handle recurse (no groups) <d2a0019> [Matt Conway]
19
+ improve ordering/sorting <06adca5> [Matt Conway]
20
+ try to prevent beacon thread from erroring out when network temporarily unavailable (e.g. laptop suspend/wake) <73e2ea4> [Matt Conway]
21
+ use movie/episode airdates for sorting if possible <397c50d> [Matt Conway]
22
+ zap2it comment <d5d176d> [Matt Conway]
23
+
1
24
  0.2.1 (11/23/2014)
2
25
  ------------------
3
26
 
@@ -1,3 +1,5 @@
1
+ require 'tivohmo/tvdb_helper'
2
+
1
3
  module TivoHMO
2
4
  module Adapters
3
5
  module Plex
@@ -39,15 +41,7 @@ module TivoHMO
39
41
  md.episode_title = "%i - %s" % [md.episode_number, title]
40
42
  md.title = "%s - %s" % [delegate.grandparent_title, title]
41
43
 
42
- # group tv shows under same name if we can extract a seriesId
43
- guid = delegate.guid
44
- if guid =~ /thetvdb:\/\/(\d+)/
45
- # TODO: figure out how to get zap2it series IDs into plex
46
- # If we had zap2it ids in plex metadata and extracted them
47
- # here, tivo would show a relevant thumbnail image for the
48
- # series in the My Shows UI.
49
- md.series_id = "SH#{$1}"
50
- end
44
+ md.series_id = lookup_series_id
51
45
 
52
46
  rescue => e
53
47
  logger.log_exception e, "Failed to read plex metadata for #{self}"
@@ -56,6 +50,30 @@ module TivoHMO
56
50
  md
57
51
  end
58
52
 
53
+ # groups tv shows under same name if we can extract a seriesId
54
+ def lookup_series_id
55
+ series_id = nil
56
+
57
+ guid = delegate.guid
58
+ if guid =~ /thetvdb:\/\/(\d+)/
59
+ # zap2it ids allow tivo to show a relevant thumbnail image for the
60
+ # series in the My Shows UI.
61
+ tvdb_series_id = $1
62
+ begin
63
+ tvdb_series = TVDBHelper.instance.find_by_id(tvdb_series_id)
64
+ series_id = tvdb_series.zap2it_id
65
+ series_id = series_id.sub(/^EP/, 'SH')
66
+ logger.debug "Using zap2it series id: #{series_id}"
67
+ rescue => e
68
+ logger.log_exception e, "Failed to get zap2it series id", level: :warn
69
+ end
70
+
71
+ series_id ||= "SH#{tvdb_series_id}"
72
+ end
73
+
74
+ series_id
75
+ end
76
+
59
77
  end
60
78
 
61
79
  end
@@ -26,7 +26,7 @@ module TivoHMO
26
26
  begin
27
27
  broadcast
28
28
  rescue => e
29
- logger.log_exception(e, "Ignoring exception in beacon thread")
29
+ logger.log_exception(e, "Ignoring exception in beacon thread", level: :warn)
30
30
  end
31
31
  sleep(@interval)
32
32
  @limit = @limit - 1
@@ -0,0 +1,7 @@
1
+ xml.UnsupportedCommand do
2
+ xml.Query do
3
+ params.each do |key, value|
4
+ xml.param(key: key, value: value)
5
+ end
6
+ end
7
+ end
@@ -3,6 +3,7 @@ require 'sinatra/base'
3
3
  require 'active_support/core_ext/string'
4
4
  require 'zlib'
5
5
  require 'time'
6
+ require 'unidecoder'
6
7
 
7
8
  module TivoHMO
8
9
 
@@ -22,6 +23,16 @@ module TivoHMO
22
23
  logger.debug "Headers: #{headers.inspect}"
23
24
  end
24
25
 
26
+ after do
27
+ if ! response.body.is_a?(Sinatra::Helpers::Stream)
28
+ # Try and reduce invalid chars in browse UI (SD UI) by
29
+ # transliterating from full utf-8 to ascii equivalents
30
+ # The full utf-8 is still provided in tivo_header for
31
+ # display by the HD UI in My Shows
32
+ response.body = response.body.collect{|b| transliterate(b) }
33
+ end
34
+ end
35
+
25
36
  after do
26
37
  logger.info "Response to #{request.ip} for \"#{request.request_method} #{request.url}\" [#{response.status}]"
27
38
  logger.debug "Headers: #{response.header}"
@@ -54,7 +65,7 @@ module TivoHMO
54
65
 
55
66
  def unsupported
56
67
  status 404
57
- erb :unsupported, layout: true
68
+ builder :unsupported, layout: true
58
69
  end
59
70
 
60
71
  def tsn
@@ -179,6 +190,10 @@ module TivoHMO
179
190
  data
180
191
  end
181
192
 
193
+ def transliterate(s)
194
+ # unidecoder gem
195
+ s.to_ascii rescue s
196
+ end
182
197
  end
183
198
 
184
199
  helpers do
@@ -187,6 +202,8 @@ module TivoHMO
187
202
 
188
203
  # Get the xml doc describing the active HME applications
189
204
  get '/TiVoConnect' do
205
+ response["Content-Type"] = 'application/xml'
206
+
190
207
  command = params['Command']
191
208
 
192
209
  # pagination
@@ -293,16 +310,13 @@ module TivoHMO
293
310
  builder :server_info, layout: true
294
311
 
295
312
  when 'QueryItem' then
296
- status 200
297
- body ""
313
+ builder(layout: true) {|xml| xml.QueryItem }
298
314
 
299
315
  when 'FlushServer' then
300
- status 200
301
- body ""
316
+ builder(layout: true) {|xml| xml.FlushServer }
302
317
 
303
318
  when 'ResetServer' then
304
- status 200
305
- body ""
319
+ builder(layout: true) {|xml| xml.ResetServer }
306
320
 
307
321
  else
308
322
  unsupported
@@ -0,0 +1,19 @@
1
+ require 'tvdbr'
2
+
3
+ module TivoHMO
4
+
5
+ class TVDBHelper
6
+ include GemLogger::LoggerSupport
7
+ include Singleton
8
+
9
+ def initialize
10
+ @client = Tvdbr::Client.new('4A7C459A8771A96D')
11
+ @cache = {}
12
+ end
13
+
14
+ def find_by_id(series_id)
15
+ @cache[series_id] ||= @client.find_series_by_id(series_id) rescue nil
16
+ end
17
+
18
+ end
19
+ end
@@ -1,3 +1,3 @@
1
1
  module TivoHMO
2
- VERSION = "0.2.2"
2
+ VERSION = "0.2.3"
3
3
  end
data/spec/server_spec.rb CHANGED
@@ -123,11 +123,24 @@ describe TivoHMO::Server do
123
123
  expect(helpers).to receive(:builder).
124
124
  with(:item_details, layout: true, locals: {item: item}).
125
125
  and_return("<TvBusMarshalledStruct/>")
126
+
127
+ # should not translit for header as HD UI handles more utf8 chars
128
+ expect(helpers).to_not receive(:transliterate)
129
+
126
130
  expect(helpers.tivo_header(item, 'video/x-tivo-mpeg')).to include('TvBusMarshalledStruct')
127
131
  end
128
132
 
129
133
  end
130
134
 
135
+ describe "#transliterate" do
136
+
137
+ it "generates ascii safe string" do
138
+ expect(helpers.transliterate("\u2019")).to eq("'")
139
+ expect(helpers.transliterate("\u2026")).to eq("...")
140
+ end
141
+
142
+ end
143
+
131
144
  end
132
145
 
133
146
  describe "TivoConnect" do
@@ -209,6 +222,16 @@ describe TivoHMO::Server do
209
222
  expect(title).to eq(server.title)
210
223
  end
211
224
 
225
+ it "should transliterate" do
226
+ server.title = "\u2026"
227
+ get "/TiVoConnect?Command=QueryContainer"
228
+ expect(last_response.status).to eq(200)
229
+ doc = Nokogiri::XML(last_response.body)
230
+ title = doc.at_xpath("/TiVoContainer/Details/Title").content
231
+ expect(title).to_not eq(server.title)
232
+ expect(title).to eq('...')
233
+ end
234
+
212
235
  it "uses server as root" do
213
236
  get "/TiVoConnect?Command=QueryContainer&Container=/"
214
237
  expect(last_response.status).to eq(200)
data/spec/spec_helper.rb CHANGED
@@ -14,6 +14,29 @@ Logging.logger.root.level = :error
14
14
  require 'tivohmo'
15
15
  require 'open-uri'
16
16
 
17
+ require 'webmock/rspec'
18
+ WebMock.disable_net_connect!(allow: 'samples.mplayerhq.hu')
19
+
20
+ # require 'vcr'
21
+ # VCR.configure do |c|
22
+ # c.cassette_library_dir = File.expand_path('../fixtures/vcr', __FILE__)
23
+ # c.hook_into :webmock
24
+ # c.default_cassette_options = { :record => :none, :allow_playback_repeats => true }
25
+ # # Uncomment this line to see more information about VCR when running tests
26
+ # #c.debug_logger = $stderr
27
+ # end
28
+ #
29
+ # def setup_vcr
30
+ # fixture_name = self.to_s.gsub(/[:#]+/, '-').gsub(/\s+/, '_').gsub(/^[_-]*/, '')
31
+ # fixture_location = __FILE__.gsub(/.*\/test\//, '').gsub(/\.[^\/]*/, '')
32
+ # @cassette_name = "#{fixture_location}/#{fixture_name}"
33
+ # VCR.insert_cassette(@cassette_name, :record => :once)
34
+ # end
35
+ #
36
+ # def teardown_vcr
37
+ # VCR.eject_cassette(@cassette_name)
38
+ # end
39
+
17
40
  def video_fixture(name)
18
41
  fixture_names = {
19
42
  tiny: 'MPEG4 by philips.mp4',
@@ -30,7 +53,7 @@ def video_fixture(name)
30
53
  video_file = "#{cache_dir}/#{file_name}"
31
54
 
32
55
  if ! File.exist?(video_file)
33
- puts "Downloading video fixture #{name} from #{video_url}"
56
+ Logging.logger.root.info "Downloading video fixture #{name} from #{video_url}"
34
57
  FileUtils.mkdir_p(cache_dir)
35
58
  File.write(video_file, open(video_url).read)
36
59
  end
data/tivohmo.gemspec CHANGED
@@ -27,9 +27,12 @@ Gem::Specification.new do |spec|
27
27
  spec.add_development_dependency "rack-test"
28
28
  spec.add_development_dependency "nokogiri"
29
29
  spec.add_development_dependency "timecop"
30
+ spec.add_development_dependency "webmock"
31
+ # spec.add_development_dependency "vcr"
30
32
 
31
33
  # core dependencies
32
34
  spec.add_dependency "activesupport"
35
+ spec.add_dependency "unidecoder"
33
36
  spec.add_dependency "gem_logger"
34
37
  spec.add_dependency "logging"
35
38
  spec.add_dependency "sigdump"
@@ -37,6 +40,7 @@ Gem::Specification.new do |spec|
37
40
  spec.add_dependency "sinatra"
38
41
  spec.add_dependency "builder"
39
42
  spec.add_dependency "puma"
43
+ spec.add_dependency "tvdbr"
40
44
 
41
45
  # filesystem adapter dependencies, make optional?
42
46
  spec.add_dependency "listen"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tivohmo
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.2
4
+ version: 0.2.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matt Conway
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-11-25 00:00:00.000000000 Z
11
+ date: 2014-11-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -136,6 +136,20 @@ dependencies:
136
136
  - - ">="
137
137
  - !ruby/object:Gem::Version
138
138
  version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: webmock
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
139
153
  - !ruby/object:Gem::Dependency
140
154
  name: activesupport
141
155
  requirement: !ruby/object:Gem::Requirement
@@ -150,6 +164,20 @@ dependencies:
150
164
  - - ">="
151
165
  - !ruby/object:Gem::Version
152
166
  version: '0'
167
+ - !ruby/object:Gem::Dependency
168
+ name: unidecoder
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - ">="
172
+ - !ruby/object:Gem::Version
173
+ version: '0'
174
+ type: :runtime
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - ">="
179
+ - !ruby/object:Gem::Version
180
+ version: '0'
153
181
  - !ruby/object:Gem::Dependency
154
182
  name: gem_logger
155
183
  requirement: !ruby/object:Gem::Requirement
@@ -248,6 +276,20 @@ dependencies:
248
276
  - - ">="
249
277
  - !ruby/object:Gem::Version
250
278
  version: '0'
279
+ - !ruby/object:Gem::Dependency
280
+ name: tvdbr
281
+ requirement: !ruby/object:Gem::Requirement
282
+ requirements:
283
+ - - ">="
284
+ - !ruby/object:Gem::Version
285
+ version: '0'
286
+ type: :runtime
287
+ prerelease: false
288
+ version_requirements: !ruby/object:Gem::Requirement
289
+ requirements:
290
+ - - ">="
291
+ - !ruby/object:Gem::Version
292
+ version: '0'
251
293
  - !ruby/object:Gem::Dependency
252
294
  name: listen
253
295
  requirement: !ruby/object:Gem::Requirement
@@ -345,11 +387,11 @@ files:
345
387
  - lib/tivohmo/server/views/container.builder
346
388
  - lib/tivohmo/server/views/item_details.builder
347
389
  - lib/tivohmo/server/views/layout.builder
348
- - lib/tivohmo/server/views/layout.erb
349
390
  - lib/tivohmo/server/views/server.builder
350
391
  - lib/tivohmo/server/views/server_info.builder
351
- - lib/tivohmo/server/views/unsupported.erb
392
+ - lib/tivohmo/server/views/unsupported.builder
352
393
  - lib/tivohmo/server/views/video_formats.builder
394
+ - lib/tivohmo/tvdb_helper.rb
353
395
  - lib/tivohmo/version.rb
354
396
  - spec/adapters/filesystem/application_spec.rb
355
397
  - spec/adapters/filesystem/file_item_spec.rb
@@ -429,4 +471,3 @@ test_files:
429
471
  - spec/cli_spec.rb
430
472
  - spec/server_spec.rb
431
473
  - spec/spec_helper.rb
432
- has_rdoc:
@@ -1,10 +0,0 @@
1
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
2
- <html>
3
- <head>
4
- <title>TivoHMO</title>
5
- <link rel="stylesheet" type="text/css" href="/main.css">
6
- </head>
7
- <body>
8
- <%= yield %>
9
- </body>
10
- </html>
@@ -1,7 +0,0 @@
1
- <h3>Unsupported Command</h3>
2
- <p>Query:</p>
3
- <ul>
4
- <% params.each do |key, value| %>
5
- <li><%= key %>: <%= value %></li>
6
- <% end %>
7
- </ul>