simple_pvr 1.0.0 → 1.1.0

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