tivohmo 0.2.2 → 0.2.3

Sign up to get free protection for your applications and to get access to all the features.
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>