simple_pvr 1.0.0 → 1.1.0

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.
Files changed (93) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +1 -0
  3. data/.ruby-version +1 -0
  4. data/.travis.yml +1 -4
  5. data/Gemfile.lock +72 -61
  6. data/README.md +51 -33
  7. data/bin/pvr_server +14 -6
  8. data/changelog.txt +11 -0
  9. data/development_server +14 -6
  10. data/features/channel_overview.feature +1 -1
  11. data/features/recordings.feature +30 -0
  12. data/features/step_definitions/pvr_steps.rb +34 -0
  13. data/features/support/env.rb +1 -2
  14. data/features/support/paths.rb +2 -0
  15. data/lib/simple_pvr.rb +2 -0
  16. data/lib/simple_pvr/model/database_initializer.rb +8 -0
  17. data/lib/simple_pvr/model/programme.rb +12 -2
  18. data/lib/simple_pvr/model/programme_actor.rb +14 -0
  19. data/lib/simple_pvr/model/programme_category.rb +14 -0
  20. data/lib/simple_pvr/model/programme_director.rb +13 -0
  21. data/lib/simple_pvr/model/programme_presenter.rb +13 -0
  22. data/lib/simple_pvr/model/recording.rb +12 -0
  23. data/lib/simple_pvr/programme_icon_fetcher.rb +15 -0
  24. data/lib/simple_pvr/pvr_initializer.rb +4 -4
  25. data/lib/simple_pvr/recorder.rb +4 -3
  26. data/lib/simple_pvr/recording_manager.rb +44 -24
  27. data/lib/simple_pvr/recording_planner.rb +3 -3
  28. data/lib/simple_pvr/scheduler.rb +12 -4
  29. data/lib/simple_pvr/server/base_controller.rb +12 -13
  30. data/lib/simple_pvr/server/channels_controller.rb +5 -5
  31. data/lib/simple_pvr/server/programmes_controller.rb +2 -2
  32. data/lib/simple_pvr/server/schedules_controller.rb +4 -4
  33. data/lib/simple_pvr/server/secured_controller.rb +71 -0
  34. data/lib/simple_pvr/server/shows_controller.rb +13 -8
  35. data/lib/simple_pvr/server/status_controller.rb +1 -1
  36. data/lib/simple_pvr/server/upcoming_recordings_controller.rb +1 -1
  37. data/lib/simple_pvr/version.rb +1 -1
  38. data/lib/simple_pvr/xmltv_reader.rb +37 -4
  39. data/public/css/typeahead.js-bootstrap.css +83 -0
  40. data/public/index.html +45 -37
  41. data/public/js/angular/http-auth-interceptor.js +122 -0
  42. data/public/js/app.js +4 -37
  43. data/public/js/controllers.js +22 -14
  44. data/public/js/directives.js +102 -0
  45. data/public/js/filters.js +0 -31
  46. data/public/js/services.js +64 -0
  47. data/public/js/typeahead/typeahead.min.js +7 -0
  48. data/public/partials/about.html +15 -13
  49. data/public/partials/channels.html +41 -36
  50. data/public/partials/programme.html +20 -4
  51. data/public/partials/programmeListing.html +14 -13
  52. data/public/partials/schedule.html +91 -86
  53. data/public/partials/schedules.html +28 -16
  54. data/public/partials/search.html +10 -11
  55. data/public/partials/show.html +26 -9
  56. data/public/partials/shows.html +5 -6
  57. data/public/partials/status.html +1 -1
  58. data/public/templates/loginDialog.html +30 -0
  59. data/public/templates/logoutLink.html +1 -0
  60. data/public/templates/titleSearch.html +5 -3
  61. data/simple_pvr.gemspec +6 -4
  62. data/spec/resources/dummyImage.png +1 -0
  63. data/spec/resources/programmes-with-categories.xmltv +27 -0
  64. data/spec/resources/programmes-with-credits.xmltv +24 -0
  65. data/spec/resources/programmes-with-icons.xmltv +25 -0
  66. data/spec/resources/programmes-with-presenters.xmltv +19 -0
  67. data/spec/resources/{programs-without-icon.xmltv → programmes-without-icon.xmltv} +0 -0
  68. data/spec/resources/{programs.xmltv → programmes.xmltv} +0 -4
  69. data/spec/simple_pvr/ffmpeg_spec.rb +24 -22
  70. data/spec/simple_pvr/hdhomerun_spec.rb +69 -67
  71. data/spec/simple_pvr/model/channel_spec.rb +101 -101
  72. data/spec/simple_pvr/model/programme_spec.rb +104 -104
  73. data/spec/simple_pvr/model/schedule_spec.rb +74 -74
  74. data/spec/simple_pvr/programme_icon_fetcher_spec.rb +25 -0
  75. data/spec/simple_pvr/pvr_initializer_spec.rb +40 -38
  76. data/spec/simple_pvr/recorder_spec.rb +37 -26
  77. data/spec/simple_pvr/recording_manager_spec.rb +160 -133
  78. data/spec/simple_pvr/recording_planner_spec.rb +213 -211
  79. data/spec/simple_pvr/scheduler_spec.rb +189 -172
  80. data/spec/simple_pvr/server/secured_controller_spec.rb +118 -0
  81. data/spec/simple_pvr/xmltv_reader_spec.rb +89 -41
  82. data/test/karma.conf.js +7 -4
  83. data/test/unit/filtersSpec.js +0 -36
  84. metadata +79 -63
  85. data/public/css/bootstrap-responsive.min.css +0 -9
  86. data/public/css/bootstrap.min.css +0 -9
  87. data/public/img/glyphicons-halflings-white.png +0 -0
  88. data/public/img/glyphicons-halflings.png +0 -0
  89. data/public/js/angular/angular-resource.min.js +0 -10
  90. data/public/js/angular/angular.min.js +0 -162
  91. data/public/js/bootstrap/bootstrap.min.js +0 -6
  92. data/public/js/jquery/jquery.min.js +0 -5
  93. data/test/lib/angular/angular-mocks.js +0 -1768
@@ -0,0 +1,118 @@
1
+ require 'simple_pvr'
2
+ require 'rack/test'
3
+
4
+ module SimplePvr
5
+ module Server
6
+ class SecuredTestController < SecuredController
7
+ class << self
8
+ attr_accessor :http_username_for_test
9
+ attr_accessor :http_password_for_test
10
+ end
11
+
12
+ get '/action' do
13
+ 'Your response!'
14
+ end
15
+
16
+ def http_username
17
+ SecuredTestController.http_username_for_test
18
+ end
19
+
20
+ def http_password
21
+ SecuredTestController.http_password_for_test
22
+ end
23
+ end
24
+ end
25
+ end
26
+
27
+ module RSpecMixin
28
+ include Rack::Test::Methods
29
+ def app
30
+ SimplePvr::Server::SecuredTestController
31
+ end
32
+ end
33
+
34
+ RSpec.configure { |c| c.include RSpecMixin }
35
+
36
+ module SimplePvr
37
+ module Server
38
+ describe SecuredController do
39
+ context 'when not secured with user name and password' do
40
+ before do
41
+ SecuredTestController.http_username_for_test = nil
42
+ SecuredTestController.http_password_for_test = nil
43
+ end
44
+
45
+ it 'should allow access without credentials' do
46
+ get '/action'
47
+ last_response.should be_ok
48
+ last_response.body.should == 'Your response!'
49
+ last_response.headers['WWW-Authenticate'].should be_nil
50
+ end
51
+ end
52
+
53
+ context 'when secured with user name and password' do
54
+ before do
55
+ SecuredTestController.http_username_for_test = 'me'
56
+ SecuredTestController.http_password_for_test = 'pass'
57
+ end
58
+
59
+ it 'should not allow access without credentials' do
60
+ get '/action'
61
+ last_response.status.should == 401
62
+ last_response.body.should be_empty
63
+ last_response.headers['WWW-Authenticate'].should == 'Basic realm="SimplePVR"'
64
+ end
65
+
66
+ it 'should not allow access with bogus authentication string' do
67
+ get '/action', {}, 'HTTP_AUTHORIZATION' => 'Basic bogus'
68
+ last_response.status.should == 401
69
+ last_response.body.should be_empty
70
+ last_response.headers['WWW-Authenticate'].should == 'Basic realm="SimplePVR"'
71
+ end
72
+
73
+ it 'should not allow access with wrong user name' do
74
+ get '/action', {}, 'HTTP_AUTHORIZATION' => "Basic #{Base64.encode64('wronguser:pass')}"
75
+ last_response.status.should == 401
76
+ last_response.body.should be_empty
77
+ last_response.headers['WWW-Authenticate'].should == 'Basic realm="SimplePVR"'
78
+ end
79
+
80
+ it 'should not allow access with wrong password' do
81
+ get '/action', {}, 'HTTP_AUTHORIZATION' => "Basic #{Base64.encode64('me:wrongpass')}"
82
+ last_response.status.should == 401
83
+ last_response.body.should be_empty
84
+ last_response.headers['WWW-Authenticate'].should == 'Basic realm="SimplePVR"'
85
+ end
86
+
87
+ it 'should allow access with correct credentials' do
88
+ get '/action', {}, 'HTTP_AUTHORIZATION' => "Basic #{Base64.encode64('me:pass')}"
89
+ last_response.should be_ok
90
+ last_response.body.should == 'Your response!'
91
+ last_response.headers['WWW-Authenticate'].should be_nil
92
+ end
93
+
94
+ it 'should also allow access with credentials in cookie' do
95
+ set_cookie "basicCredentials=#{Base64.encode64('me:pass')}"
96
+ get '/action'
97
+ last_response.should be_ok
98
+ last_response.body.should == 'Your response!'
99
+ last_response.headers['WWW-Authenticate'].should be_nil
100
+ end
101
+
102
+ it 'should give bogus authentication scheme when called from XMLHttpRequest to avoid browser popping up its own log-in dialog' do
103
+ get '/action', {}, 'HTTP_X_REQUESTED_WITH' => 'XMLHttpRequest'
104
+ last_response.status.should == 401
105
+ last_response.body.should be_empty
106
+ last_response.headers['WWW-Authenticate'].should == 'xBasic realm="SimplePVR"'
107
+ end
108
+
109
+ it 'should allow access when called from XMLHttpRequest with correct credentials' do
110
+ get '/action', {}, 'HTTP_X_REQUESTED_WITH' => 'XMLHttpRequest', 'HTTP_AUTHORIZATION' => "Basic #{Base64.encode64('me:pass')}"
111
+ last_response.should be_ok
112
+ last_response.body.should == 'Your response!'
113
+ last_response.headers['WWW-Authenticate'].should be_nil
114
+ end
115
+ end
116
+ end
117
+ end
118
+ end
@@ -1,49 +1,97 @@
1
1
  #encoding: UTF-8
2
2
  require 'simple_pvr'
3
3
 
4
- describe SimplePvr::XmltvReader do
5
- before do
6
- @dr_1 = double(name: 'DR 1')
7
- @dr_1.stub(:icon_url=)
8
-
9
- SimplePvr::Model::Channel.stub(all: [@dr_1])
10
- SimplePvr::Model::Programme.stub(:transaction).and_yield
11
- SimplePvr::Model::Programme.stub(:destroy)
12
- @xmltv_reader = SimplePvr::XmltvReader.new({'www.ontv.dk/tv/1' => 'DR 1'})
13
- end
4
+ module SimplePvr
5
+ describe XmltvReader do
6
+ before do
7
+ Model::DatabaseInitializer.prepare_for_test
8
+ Model::DatabaseInitializer.clear
9
+
10
+ Model::Channel.create(name: 'DR 1')
14
11
 
15
- it 'populates programme information through the DAO' do
16
- SimplePvr::Model::Programme.stub(:add)
17
- SimplePvr::Model::Programme.should_receive(:add).with(
18
- @dr_1,
19
- 'Noddy',
20
- 'Bare vær dig selv, Noddy.',
21
- "Tegnefilm.\nHer kommer Noddy - så kom ud og leg! Den lille dreng af træ har altid travlt med at køre sine venner rundt i Legebyen - og du kan altid høre, når han er på vej!",
22
- Time.new(2012, 7, 17, 6, 0, 0, "+02:00"),
23
- 10.minutes,
24
- ' .2/12. ')
12
+ @xmltv_reader = XmltvReader.new({'www.ontv.dk/tv/1' => 'DR 1'})
13
+ end
25
14
 
26
- @xmltv_reader.read(File.new(File.dirname(__FILE__) + '/../resources/programs.xmltv'))
27
- end
15
+ it 'populates programme information through the DAO' do
16
+ @xmltv_reader.read(File.new(File.dirname(__FILE__) + '/../resources/programmes.xmltv'))
17
+
18
+ noddy = Model::Programme.first(title: 'Noddy')
19
+ noddy.channel.name.should == 'DR 1'
20
+ noddy.title.should == 'Noddy'
21
+ noddy.subtitle.should == 'Bare vær dig selv, Noddy.'
22
+ noddy.description.should == "Tegnefilm.\nHer kommer Noddy - så kom ud og leg! Den lille dreng af træ har altid travlt med at køre sine venner rundt i Legebyen - og du kan altid høre, når han er på vej!"
23
+ noddy.start_time.should == Time.new(2012, 7, 17, 6, 0, 0, "+02:00")
24
+ noddy.duration.should == 10.minutes
25
+ noddy.episode_num.should == ' .2/12. '
26
+ end
27
+
28
+ it 'reads programme icons where available' do
29
+ @xmltv_reader.read(File.new(File.dirname(__FILE__) + '/../resources/programmes-with-icons.xmltv'))
30
+
31
+ maria_wern = Model::Programme.first(title: 'Maria Wern: Alle de stille døde')
32
+ maria_wern.icon_url.should == 'http://static.timefor.tv/imgs/print_img.php?sti=imgs/epg/channel/2013-11-17/528381020f0c1.jpg&height=300&width=300'
33
+ end
34
+
35
+ it 'reads programme directors where available' do
36
+ @xmltv_reader.read(File.new(File.dirname(__FILE__) + '/../resources/programmes-with-credits.xmltv'))
37
+
38
+ maria_wern = Model::Programme.first(title: 'Maria Wern: Alle de stille døde')
39
+ maria_wern.directors.length.should == 1
40
+ maria_wern.directors[0].name.should == 'Erik Leijonborg'
41
+ end
42
+
43
+ it 'reads programme presenters where available' do
44
+ @xmltv_reader.read(File.new(File.dirname(__FILE__) + '/../resources/programmes-with-presenters.xmltv'))
45
+
46
+ maria_wern = Model::Programme.first(title: 'Natholdet')
47
+ maria_wern.presenters.length.should == 1
48
+ maria_wern.presenters[0].name.should == 'Anders Breinholt.'
49
+ end
50
+
51
+ it 'reads programme actors where available' do
52
+ @xmltv_reader.read(File.new(File.dirname(__FILE__) + '/../resources/programmes-with-credits.xmltv'))
53
+
54
+ maria_wern = Model::Programme.first(title: 'Maria Wern: Alle de stille døde')
55
+ maria_wern.actors.length.should == 3
56
+ maria_wern.actors[0].role_name.should == 'Maria Wern'
57
+ maria_wern.actors[0].actor_name.should == 'Eva Röse'
58
+ maria_wern.actors[1].role_name.should == 'Thomas Hartman'
59
+ maria_wern.actors[1].actor_name.should == 'Allan Svensson'
60
+ end
61
+
62
+ it 'reads programme categories' do
63
+ @xmltv_reader.read(File.new(File.dirname(__FILE__) + '/../resources/programmes-with-categories.xmltv'))
64
+
65
+ noddy = Model::Programme.first(title: 'Noddy')
66
+ noddy.categories.length.should == 2
67
+ noddy.categories[0].name.should == 'kids'
68
+ noddy.categories[1].name.should == 'serie'
69
+
70
+ black_business = Model::Programme.first(title: 'Black Business')
71
+ black_business.categories.length.should == 2
72
+ black_business.categories[0].name.should == 'documentary'
73
+ black_business.categories[1].name.should == 'serie'
74
+ end
75
+
76
+ it 'ignores programmes for channels with no mapping' do
77
+ # There are two channels in the XMLTV file, but only one with a mapping
78
+ Model::Programme.should_receive(:add).exactly(5).times
28
79
 
29
- it 'ignores programmes for channels with no mapping' do
30
- # There are two channels in the XMLTV file, but only one with a mapping
31
- SimplePvr::Model::Programme.should_receive(:add).exactly(5).times
32
-
33
- @xmltv_reader.read(File.new(File.dirname(__FILE__) + '/../resources/programs.xmltv'))
34
- end
35
-
36
- it 'adds channel icons to existing channels' do
37
- SimplePvr::Model::Programme.stub(:add) # necessary to deal with the way Programme setup its relation to Channel
38
- @dr_1.should_receive(:icon_url=).with("http://ontv.dk/imgs/epg/logos/dr1_big.png")
39
-
40
- @xmltv_reader.read(File.new(File.dirname(__FILE__) + '/../resources/programs.xmltv'))
41
- end
42
-
43
- it 'has no problem with xml with no channel icons' do
44
- SimplePvr::Model::Programme.stub(:add) # necessary to deal with the way Programme setup its relation to Channel
45
- @dr_1.should_not_receive(:icon_url=)
46
-
47
- @xmltv_reader.read(File.new(File.dirname(__FILE__) + '/../resources/programs-without-icon.xmltv'))
80
+ @xmltv_reader.read(File.new(File.dirname(__FILE__) + '/../resources/programmes.xmltv'))
81
+ end
82
+
83
+ it 'adds channel icons to existing channels' do
84
+ @xmltv_reader.read(File.new(File.dirname(__FILE__) + '/../resources/programmes.xmltv'))
85
+
86
+ dr_1 = Model::Channel.first(name: 'DR 1')
87
+ dr_1.icon_url.should == 'http://ontv.dk/imgs/epg/logos/dr1_big.png'
88
+ end
89
+
90
+ it 'has no problem with xml with no channel icons' do
91
+ @xmltv_reader.read(File.new(File.dirname(__FILE__) + '/../resources/programmes-without-icon.xmltv'))
92
+
93
+ dr_1 = Model::Channel.first(name: 'DR 1')
94
+ dr_1.icon_url.should be_nil
95
+ end
48
96
  end
49
97
  end
@@ -3,10 +3,13 @@ basePath = '../';
3
3
  files = [
4
4
  JASMINE,
5
5
  JASMINE_ADAPTER,
6
- 'public/js/jquery/jquery.min.js',
7
- 'public/js/angular/angular.min.js',
8
- 'public/js/angular/angular-*.js',
9
- 'test/lib/angular/angular-mocks.js',
6
+ 'http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js',
7
+ 'http://ajax.googleapis.com/ajax/libs/angularjs/1.2.6/angular.min.js',
8
+ 'http://ajax.googleapis.com/ajax/libs/angularjs/1.2.6/angular-route.min.js',
9
+ 'http://ajax.googleapis.com/ajax/libs/angularjs/1.2.6/angular-resource.min.js',
10
+ 'http://ajax.googleapis.com/ajax/libs/angularjs/1.2.6/angular-cookies.min.js',
11
+ 'http://ajax.googleapis.com/ajax/libs/angularjs/1.2.6/angular-mocks.js',
12
+ 'http://netdna.bootstrapcdn.com/bootstrap/3.0.3/js/bootstrap.min.js',
10
13
  'public/js/**/*.js',
11
14
  'test/unit/**/*.js'
12
15
  ];
@@ -3,42 +3,6 @@
3
3
  describe('filters', function() {
4
4
  beforeEach(module('simplePvr'));
5
5
 
6
- describe('chunk', function() {
7
- it('should let non-Array input pass through', inject(function(chunkFilter) {
8
- var input = 'this is not an array';
9
- expect(chunkFilter(input)).toBe(input);
10
- }));
11
-
12
- it('should let empty arrays pass through', inject(function(chunkFilter) {
13
- expect(chunkFilter([], 3)).toEqual([]);
14
- }));
15
-
16
- it('should chunk up arrays and give them hashKeys corresponding to the chunk numbers', inject(function(chunkFilter) {
17
- var input = [1, 2, 3, 4, 5, 6, 7];
18
- var firstChunk = [1, 2, 3];
19
- var secondChunk = [4, 5, 6];
20
- var thirdChunk = [7];
21
-
22
- firstChunk.$$hashKey = 0;
23
- secondChunk.$$hashKey = 1;
24
- thirdChunk.$$hashKey = 2;
25
-
26
- expect(chunkFilter(input, 3)).toEqual([firstChunk, secondChunk, thirdChunk]);
27
- }));
28
-
29
- it('should create equal outputs given equal inputs', inject(function(chunkFilter) {
30
- var output1 = chunkFilter([1, 2, 3, 4], 3);
31
- var output2 = chunkFilter([1, 2, 3, 4], 3);
32
- expect(angular.equals(output1, output2)).toBeTruthy();
33
- }));
34
-
35
- it('should create non-equal outputs given non-equal inputs', inject(function(chunkFilter) {
36
- var output1 = chunkFilter([1, 2, 3, 4], 3);
37
- var output2 = chunkFilter([4, 3, 2, 1], 3);
38
- expect(angular.equals(output1, output2)).toBeFalsy();
39
- }));
40
- });
41
-
42
6
  describe('weekdayFilter', function() {
43
7
  it('should be blank when there is no weekday filtering', inject(function(filteredWeekdaysFilter) {
44
8
  var scheduleWithNoWeekdayFiltering = { filter_by_weekday: false };
metadata CHANGED
@@ -1,20 +1,18 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: simple_pvr
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
5
- prerelease:
4
+ version: 1.1.0
6
5
  platform: ruby
7
6
  authors:
8
7
  - Ole Friis
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2013-04-20 00:00:00.000000000 Z
11
+ date: 2014-01-14 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: activesupport
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
17
  - - ~>
20
18
  - !ruby/object:Gem::Version
@@ -22,7 +20,6 @@ dependencies:
22
20
  type: :runtime
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
24
  - - ~>
28
25
  - !ruby/object:Gem::Version
@@ -30,7 +27,6 @@ dependencies:
30
27
  - !ruby/object:Gem::Dependency
31
28
  name: nokogiri
32
29
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
30
  requirements:
35
31
  - - ~>
36
32
  - !ruby/object:Gem::Version
@@ -38,7 +34,6 @@ dependencies:
38
34
  type: :runtime
39
35
  prerelease: false
40
36
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
37
  requirements:
43
38
  - - ~>
44
39
  - !ruby/object:Gem::Version
@@ -46,7 +41,6 @@ dependencies:
46
41
  - !ruby/object:Gem::Dependency
47
42
  name: data_mapper
48
43
  requirement: !ruby/object:Gem::Requirement
49
- none: false
50
44
  requirements:
51
45
  - - ~>
52
46
  - !ruby/object:Gem::Version
@@ -54,7 +48,6 @@ dependencies:
54
48
  type: :runtime
55
49
  prerelease: false
56
50
  version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
51
  requirements:
59
52
  - - ~>
60
53
  - !ruby/object:Gem::Version
@@ -62,7 +55,6 @@ dependencies:
62
55
  - !ruby/object:Gem::Dependency
63
56
  name: dm-sqlite-adapter
64
57
  requirement: !ruby/object:Gem::Requirement
65
- none: false
66
58
  requirements:
67
59
  - - ~>
68
60
  - !ruby/object:Gem::Version
@@ -70,7 +62,6 @@ dependencies:
70
62
  type: :runtime
71
63
  prerelease: false
72
64
  version_requirements: !ruby/object:Gem::Requirement
73
- none: false
74
65
  requirements:
75
66
  - - ~>
76
67
  - !ruby/object:Gem::Version
@@ -78,7 +69,6 @@ dependencies:
78
69
  - !ruby/object:Gem::Dependency
79
70
  name: sinatra
80
71
  requirement: !ruby/object:Gem::Requirement
81
- none: false
82
72
  requirements:
83
73
  - - ~>
84
74
  - !ruby/object:Gem::Version
@@ -86,7 +76,6 @@ dependencies:
86
76
  type: :runtime
87
77
  prerelease: false
88
78
  version_requirements: !ruby/object:Gem::Requirement
89
- none: false
90
79
  requirements:
91
80
  - - ~>
92
81
  - !ruby/object:Gem::Version
@@ -94,39 +83,34 @@ dependencies:
94
83
  - !ruby/object:Gem::Dependency
95
84
  name: puma
96
85
  requirement: !ruby/object:Gem::Requirement
97
- none: false
98
86
  requirements:
99
87
  - - ~>
100
88
  - !ruby/object:Gem::Version
101
- version: '1.6'
89
+ version: '2.7'
102
90
  type: :runtime
103
91
  prerelease: false
104
92
  version_requirements: !ruby/object:Gem::Requirement
105
- none: false
106
93
  requirements:
107
94
  - - ~>
108
95
  - !ruby/object:Gem::Version
109
- version: '1.6'
96
+ version: '2.7'
110
97
  - !ruby/object:Gem::Dependency
111
98
  name: rake
112
99
  requirement: !ruby/object:Gem::Requirement
113
- none: false
114
100
  requirements:
115
- - - ! '>='
101
+ - - '>='
116
102
  - !ruby/object:Gem::Version
117
103
  version: 10.0.0
118
104
  type: :development
119
105
  prerelease: false
120
106
  version_requirements: !ruby/object:Gem::Requirement
121
- none: false
122
107
  requirements:
123
- - - ! '>='
108
+ - - '>='
124
109
  - !ruby/object:Gem::Version
125
110
  version: 10.0.0
126
111
  - !ruby/object:Gem::Dependency
127
112
  name: rspec
128
113
  requirement: !ruby/object:Gem::Requirement
129
- none: false
130
114
  requirements:
131
115
  - - ~>
132
116
  - !ruby/object:Gem::Version
@@ -134,7 +118,6 @@ dependencies:
134
118
  type: :development
135
119
  prerelease: false
136
120
  version_requirements: !ruby/object:Gem::Requirement
137
- none: false
138
121
  requirements:
139
122
  - - ~>
140
123
  - !ruby/object:Gem::Version
@@ -142,51 +125,73 @@ dependencies:
142
125
  - !ruby/object:Gem::Dependency
143
126
  name: cucumber
144
127
  requirement: !ruby/object:Gem::Requirement
145
- none: false
146
128
  requirements:
147
129
  - - ~>
148
130
  - !ruby/object:Gem::Version
149
- version: '1.2'
131
+ version: '1.3'
150
132
  type: :development
151
133
  prerelease: false
152
134
  version_requirements: !ruby/object:Gem::Requirement
153
- none: false
154
135
  requirements:
155
136
  - - ~>
156
137
  - !ruby/object:Gem::Version
157
- version: '1.2'
138
+ version: '1.3'
158
139
  - !ruby/object:Gem::Dependency
159
140
  name: capybara
160
141
  requirement: !ruby/object:Gem::Requirement
161
- none: false
162
142
  requirements:
163
143
  - - ~>
164
144
  - !ruby/object:Gem::Version
165
- version: '2.0'
145
+ version: '2.2'
166
146
  type: :development
167
147
  prerelease: false
168
148
  version_requirements: !ruby/object:Gem::Requirement
169
- none: false
170
149
  requirements:
171
150
  - - ~>
172
151
  - !ruby/object:Gem::Version
173
- version: '2.0'
152
+ version: '2.2'
153
+ - !ruby/object:Gem::Dependency
154
+ name: selenium-webdriver
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'
174
167
  - !ruby/object:Gem::Dependency
175
168
  name: poltergeist
176
169
  requirement: !ruby/object:Gem::Requirement
177
- none: false
178
170
  requirements:
179
171
  - - ~>
180
172
  - !ruby/object:Gem::Version
181
- version: '1.1'
173
+ version: '1.5'
182
174
  type: :development
183
175
  prerelease: false
184
176
  version_requirements: !ruby/object:Gem::Requirement
185
- none: false
186
177
  requirements:
187
178
  - - ~>
188
179
  - !ruby/object:Gem::Version
189
- version: '1.1'
180
+ version: '1.5'
181
+ - !ruby/object:Gem::Dependency
182
+ name: pry
183
+ requirement: !ruby/object:Gem::Requirement
184
+ requirements:
185
+ - - '>='
186
+ - !ruby/object:Gem::Version
187
+ version: '0'
188
+ type: :development
189
+ prerelease: false
190
+ version_requirements: !ruby/object:Gem::Requirement
191
+ requirements:
192
+ - - '>='
193
+ - !ruby/object:Gem::Version
194
+ version: '0'
190
195
  description: TV recorder for the HDHomeRun tuners. XMLTV support, nice web GUI for
191
196
  planning your recordings. No playback functionality - use e.g. VLC for that.
192
197
  email:
@@ -198,6 +203,7 @@ extensions: []
198
203
  extra_rdoc_files: []
199
204
  files:
200
205
  - .gitignore
206
+ - .ruby-version
201
207
  - .travis.yml
202
208
  - Gemfile
203
209
  - Gemfile.lock
@@ -206,10 +212,12 @@ files:
206
212
  - Rakefile
207
213
  - bin/pvr_server
208
214
  - bin/pvr_xmltv
215
+ - changelog.txt
209
216
  - development_server
210
217
  - development_xmltv
211
218
  - features/channel_overview.feature
212
219
  - features/programme_search.feature
220
+ - features/recordings.feature
213
221
  - features/scheduling.feature
214
222
  - features/step_definitions/pvr_steps.rb
215
223
  - features/step_definitions/web_steps.rb
@@ -223,8 +231,13 @@ files:
223
231
  - lib/simple_pvr/model/channel.rb
224
232
  - lib/simple_pvr/model/database_initializer.rb
225
233
  - lib/simple_pvr/model/programme.rb
234
+ - lib/simple_pvr/model/programme_actor.rb
235
+ - lib/simple_pvr/model/programme_category.rb
236
+ - lib/simple_pvr/model/programme_director.rb
237
+ - lib/simple_pvr/model/programme_presenter.rb
226
238
  - lib/simple_pvr/model/recording.rb
227
239
  - lib/simple_pvr/model/schedule.rb
240
+ - lib/simple_pvr/programme_icon_fetcher.rb
228
241
  - lib/simple_pvr/pvr_initializer.rb
229
242
  - lib/simple_pvr/pvr_logger.rb
230
243
  - lib/simple_pvr/recorder.rb
@@ -238,25 +251,22 @@ files:
238
251
  - lib/simple_pvr/server/programmes_controller.rb
239
252
  - lib/simple_pvr/server/rack_maps.rb
240
253
  - lib/simple_pvr/server/schedules_controller.rb
254
+ - lib/simple_pvr/server/secured_controller.rb
241
255
  - lib/simple_pvr/server/shows_controller.rb
242
256
  - lib/simple_pvr/server/status_controller.rb
243
257
  - lib/simple_pvr/server/upcoming_recordings_controller.rb
244
258
  - lib/simple_pvr/version.rb
245
259
  - lib/simple_pvr/xmltv_reader.rb
246
- - public/css/bootstrap-responsive.min.css
247
- - public/css/bootstrap.min.css
248
260
  - public/css/simplepvr.css
249
- - public/img/glyphicons-halflings-white.png
250
- - public/img/glyphicons-halflings.png
261
+ - public/css/typeahead.js-bootstrap.css
251
262
  - public/index.html
252
- - public/js/angular/angular-resource.min.js
253
- - public/js/angular/angular.min.js
263
+ - public/js/angular/http-auth-interceptor.js
254
264
  - public/js/app.js
255
- - public/js/bootstrap/bootstrap.min.js
256
265
  - public/js/controllers.js
266
+ - public/js/directives.js
257
267
  - public/js/filters.js
258
- - public/js/jquery/jquery.min.js
259
268
  - public/js/services.js
269
+ - public/js/typeahead/typeahead.min.js
260
270
  - public/partials/about.html
261
271
  - public/partials/channels.html
262
272
  - public/partials/programme.html
@@ -267,59 +277,60 @@ files:
267
277
  - public/partials/show.html
268
278
  - public/partials/shows.html
269
279
  - public/partials/status.html
280
+ - public/templates/loginDialog.html
281
+ - public/templates/logoutLink.html
270
282
  - public/templates/titleSearch.html
271
283
  - simple_pvr.gemspec
272
284
  - spec/resources/channels.txt
273
- - spec/resources/programs-without-icon.xmltv
274
- - spec/resources/programs.xmltv
275
- - spec/resources/recordings/Extensive Metadata/1/metadata.yml
285
+ - spec/resources/dummyImage.png
286
+ - spec/resources/programmes-with-categories.xmltv
287
+ - spec/resources/programmes-with-credits.xmltv
288
+ - spec/resources/programmes-with-icons.xmltv
289
+ - spec/resources/programmes-with-presenters.xmltv
290
+ - spec/resources/programmes-without-icon.xmltv
291
+ - spec/resources/programmes.xmltv
276
292
  - spec/simple_pvr/ffmpeg_spec.rb
277
293
  - spec/simple_pvr/hdhomerun_spec.rb
278
294
  - spec/simple_pvr/model/channel_spec.rb
279
295
  - spec/simple_pvr/model/programme_spec.rb
280
296
  - spec/simple_pvr/model/schedule_spec.rb
297
+ - spec/simple_pvr/programme_icon_fetcher_spec.rb
281
298
  - spec/simple_pvr/pvr_initializer_spec.rb
282
299
  - spec/simple_pvr/recorder_spec.rb
283
300
  - spec/simple_pvr/recording_manager_spec.rb
284
301
  - spec/simple_pvr/recording_planner_spec.rb
285
302
  - spec/simple_pvr/scheduler_spec.rb
303
+ - spec/simple_pvr/server/secured_controller_spec.rb
286
304
  - spec/simple_pvr/xmltv_reader_spec.rb
287
305
  - test/karma.conf.js
288
- - test/lib/angular/angular-mocks.js
289
306
  - test/unit/filtersSpec.js
290
307
  homepage: https://github.com/olefriis/simplepvr
291
308
  licenses: []
309
+ metadata: {}
292
310
  post_install_message:
293
311
  rdoc_options: []
294
312
  require_paths:
295
313
  - lib
296
314
  required_ruby_version: !ruby/object:Gem::Requirement
297
- none: false
298
315
  requirements:
299
- - - ! '>='
316
+ - - '>='
300
317
  - !ruby/object:Gem::Version
301
318
  version: '0'
302
- segments:
303
- - 0
304
- hash: 2300944156541410004
305
319
  required_rubygems_version: !ruby/object:Gem::Requirement
306
- none: false
307
320
  requirements:
308
- - - ! '>='
321
+ - - '>='
309
322
  - !ruby/object:Gem::Version
310
323
  version: '0'
311
- segments:
312
- - 0
313
- hash: 2300944156541410004
314
324
  requirements: []
315
325
  rubyforge_project:
316
- rubygems_version: 1.8.24
326
+ rubygems_version: 2.1.11
317
327
  signing_key:
318
- specification_version: 3
328
+ specification_version: 4
319
329
  summary: PVR made simple, not dumb
320
330
  test_files:
321
331
  - features/channel_overview.feature
322
332
  - features/programme_search.feature
333
+ - features/recordings.feature
323
334
  - features/scheduling.feature
324
335
  - features/step_definitions/pvr_steps.rb
325
336
  - features/step_definitions/web_steps.rb
@@ -327,20 +338,25 @@ test_files:
327
338
  - features/support/paths.rb
328
339
  - features/week_overview.feature
329
340
  - spec/resources/channels.txt
330
- - spec/resources/programs-without-icon.xmltv
331
- - spec/resources/programs.xmltv
332
- - spec/resources/recordings/Extensive Metadata/1/metadata.yml
341
+ - spec/resources/dummyImage.png
342
+ - spec/resources/programmes-with-categories.xmltv
343
+ - spec/resources/programmes-with-credits.xmltv
344
+ - spec/resources/programmes-with-icons.xmltv
345
+ - spec/resources/programmes-with-presenters.xmltv
346
+ - spec/resources/programmes-without-icon.xmltv
347
+ - spec/resources/programmes.xmltv
333
348
  - spec/simple_pvr/ffmpeg_spec.rb
334
349
  - spec/simple_pvr/hdhomerun_spec.rb
335
350
  - spec/simple_pvr/model/channel_spec.rb
336
351
  - spec/simple_pvr/model/programme_spec.rb
337
352
  - spec/simple_pvr/model/schedule_spec.rb
353
+ - spec/simple_pvr/programme_icon_fetcher_spec.rb
338
354
  - spec/simple_pvr/pvr_initializer_spec.rb
339
355
  - spec/simple_pvr/recorder_spec.rb
340
356
  - spec/simple_pvr/recording_manager_spec.rb
341
357
  - spec/simple_pvr/recording_planner_spec.rb
342
358
  - spec/simple_pvr/scheduler_spec.rb
359
+ - spec/simple_pvr/server/secured_controller_spec.rb
343
360
  - spec/simple_pvr/xmltv_reader_spec.rb
344
361
  - test/karma.conf.js
345
- - test/lib/angular/angular-mocks.js
346
362
  - test/unit/filtersSpec.js