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.
- checksums.yaml +7 -0
- data/.gitignore +1 -0
- data/.ruby-version +1 -0
- data/.travis.yml +1 -4
- data/Gemfile.lock +72 -61
- data/README.md +51 -33
- data/bin/pvr_server +14 -6
- data/changelog.txt +11 -0
- data/development_server +14 -6
- data/features/channel_overview.feature +1 -1
- data/features/recordings.feature +30 -0
- data/features/step_definitions/pvr_steps.rb +34 -0
- data/features/support/env.rb +1 -2
- data/features/support/paths.rb +2 -0
- data/lib/simple_pvr.rb +2 -0
- data/lib/simple_pvr/model/database_initializer.rb +8 -0
- data/lib/simple_pvr/model/programme.rb +12 -2
- data/lib/simple_pvr/model/programme_actor.rb +14 -0
- data/lib/simple_pvr/model/programme_category.rb +14 -0
- data/lib/simple_pvr/model/programme_director.rb +13 -0
- data/lib/simple_pvr/model/programme_presenter.rb +13 -0
- data/lib/simple_pvr/model/recording.rb +12 -0
- data/lib/simple_pvr/programme_icon_fetcher.rb +15 -0
- data/lib/simple_pvr/pvr_initializer.rb +4 -4
- data/lib/simple_pvr/recorder.rb +4 -3
- data/lib/simple_pvr/recording_manager.rb +44 -24
- data/lib/simple_pvr/recording_planner.rb +3 -3
- data/lib/simple_pvr/scheduler.rb +12 -4
- data/lib/simple_pvr/server/base_controller.rb +12 -13
- data/lib/simple_pvr/server/channels_controller.rb +5 -5
- data/lib/simple_pvr/server/programmes_controller.rb +2 -2
- data/lib/simple_pvr/server/schedules_controller.rb +4 -4
- data/lib/simple_pvr/server/secured_controller.rb +71 -0
- data/lib/simple_pvr/server/shows_controller.rb +13 -8
- data/lib/simple_pvr/server/status_controller.rb +1 -1
- data/lib/simple_pvr/server/upcoming_recordings_controller.rb +1 -1
- data/lib/simple_pvr/version.rb +1 -1
- data/lib/simple_pvr/xmltv_reader.rb +37 -4
- data/public/css/typeahead.js-bootstrap.css +83 -0
- data/public/index.html +45 -37
- data/public/js/angular/http-auth-interceptor.js +122 -0
- data/public/js/app.js +4 -37
- data/public/js/controllers.js +22 -14
- data/public/js/directives.js +102 -0
- data/public/js/filters.js +0 -31
- data/public/js/services.js +64 -0
- data/public/js/typeahead/typeahead.min.js +7 -0
- data/public/partials/about.html +15 -13
- data/public/partials/channels.html +41 -36
- data/public/partials/programme.html +20 -4
- data/public/partials/programmeListing.html +14 -13
- data/public/partials/schedule.html +91 -86
- data/public/partials/schedules.html +28 -16
- data/public/partials/search.html +10 -11
- data/public/partials/show.html +26 -9
- data/public/partials/shows.html +5 -6
- data/public/partials/status.html +1 -1
- data/public/templates/loginDialog.html +30 -0
- data/public/templates/logoutLink.html +1 -0
- data/public/templates/titleSearch.html +5 -3
- data/simple_pvr.gemspec +6 -4
- data/spec/resources/dummyImage.png +1 -0
- data/spec/resources/programmes-with-categories.xmltv +27 -0
- data/spec/resources/programmes-with-credits.xmltv +24 -0
- data/spec/resources/programmes-with-icons.xmltv +25 -0
- data/spec/resources/programmes-with-presenters.xmltv +19 -0
- data/spec/resources/{programs-without-icon.xmltv → programmes-without-icon.xmltv} +0 -0
- data/spec/resources/{programs.xmltv → programmes.xmltv} +0 -4
- data/spec/simple_pvr/ffmpeg_spec.rb +24 -22
- data/spec/simple_pvr/hdhomerun_spec.rb +69 -67
- data/spec/simple_pvr/model/channel_spec.rb +101 -101
- data/spec/simple_pvr/model/programme_spec.rb +104 -104
- data/spec/simple_pvr/model/schedule_spec.rb +74 -74
- data/spec/simple_pvr/programme_icon_fetcher_spec.rb +25 -0
- data/spec/simple_pvr/pvr_initializer_spec.rb +40 -38
- data/spec/simple_pvr/recorder_spec.rb +37 -26
- data/spec/simple_pvr/recording_manager_spec.rb +160 -133
- data/spec/simple_pvr/recording_planner_spec.rb +213 -211
- data/spec/simple_pvr/scheduler_spec.rb +189 -172
- data/spec/simple_pvr/server/secured_controller_spec.rb +118 -0
- data/spec/simple_pvr/xmltv_reader_spec.rb +89 -41
- data/test/karma.conf.js +7 -4
- data/test/unit/filtersSpec.js +0 -36
- metadata +79 -63
- data/public/css/bootstrap-responsive.min.css +0 -9
- data/public/css/bootstrap.min.css +0 -9
- data/public/img/glyphicons-halflings-white.png +0 -0
- data/public/img/glyphicons-halflings.png +0 -0
- data/public/js/angular/angular-resource.min.js +0 -10
- data/public/js/angular/angular.min.js +0 -162
- data/public/js/bootstrap/bootstrap.min.js +0 -6
- data/public/js/jquery/jquery.min.js +0 -5
- 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
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
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
|
-
|
|
16
|
-
|
|
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
|
-
|
|
27
|
-
|
|
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
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
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
|
data/test/karma.conf.js
CHANGED
|
@@ -3,10 +3,13 @@ basePath = '../';
|
|
|
3
3
|
files = [
|
|
4
4
|
JASMINE,
|
|
5
5
|
JASMINE_ADAPTER,
|
|
6
|
-
'
|
|
7
|
-
'
|
|
8
|
-
'
|
|
9
|
-
'
|
|
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
|
];
|
data/test/unit/filtersSpec.js
CHANGED
|
@@ -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.
|
|
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:
|
|
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: '
|
|
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: '
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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/
|
|
250
|
-
- public/img/glyphicons-halflings.png
|
|
261
|
+
- public/css/typeahead.js-bootstrap.css
|
|
251
262
|
- public/index.html
|
|
252
|
-
- public/js/angular/
|
|
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/
|
|
274
|
-
- spec/resources/
|
|
275
|
-
- spec/resources/
|
|
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.
|
|
326
|
+
rubygems_version: 2.1.11
|
|
317
327
|
signing_key:
|
|
318
|
-
specification_version:
|
|
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/
|
|
331
|
-
- spec/resources/
|
|
332
|
-
- spec/resources/
|
|
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
|