pig-media-server 2 → 100
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.babelrc +3 -0
- data/Gemfile +1 -0
- data/front/application.js +71 -0
- data/front/components/custom.js +35 -0
- data/front/components/head.js +38 -0
- data/front/components/index.js +23 -0
- data/front/components/item.js +63 -0
- data/front/components/latest.js +32 -0
- data/front/components/new_flag.js +29 -0
- data/front/components/no_match.js +10 -0
- data/front/components/pager.js +38 -0
- data/{javascripts → front}/components/player.js +7 -11
- data/{javascripts → front}/components/query_list.js +6 -23
- data/front/components/recommend.js +41 -0
- data/front/components/search.js +87 -0
- data/front/components/search_box.js +56 -0
- data/{javascripts → front}/components/watch.js +8 -5
- data/front/controller.js +22 -0
- data/{javascripts/event_dispatcher.js → front/models/base.js} +1 -5
- data/front/models/config.js +12 -0
- data/front/models/custom.js +41 -0
- data/front/models/custom_list.js +12 -0
- data/front/models/latest.js +60 -0
- data/front/models/list.js +76 -0
- data/front/models/playing.js +11 -0
- data/front/models/recent.js +34 -0
- data/front/models/recommend.js +13 -0
- data/front/models/session.js +16 -0
- data/lib/pig-media-server/api.rb +35 -3
- data/lib/pig-media-server/backup.rb +3 -7
- data/lib/pig-media-server/model/comic.rb +1 -1
- data/lib/pig-media-server/model/data.rb +85 -81
- data/lib/pig-media-server/model/data_use_rdb.rb +124 -0
- data/lib/pig-media-server/version.rb +1 -1
- data/lib/pig-media-server/views/bundle.js +48 -13
- data/package.json +13 -18
- data/webpack.build.js +25 -0
- data/webpack.config.js +30 -0
- metadata +34 -19
- data/gulpfile.js +0 -33
- data/javascripts/application.js +0 -117
- data/javascripts/components/head.js +0 -106
- data/javascripts/components/list.js +0 -104
- data/javascripts/components/new_flag.js +0 -23
- data/javascripts/components/sort.js +0 -64
- data/javascripts/controller.js +0 -62
- data/javascripts/custom_list.js +0 -14
- data/javascripts/recent.js +0 -34
- data/javascripts/utils.js +0 -22
- data/javascripts/video.js +0 -10
- /data/{javascripts → front}/chromecast.js +0 -0
data/package.json
CHANGED
@@ -1,23 +1,18 @@
|
|
1
1
|
{
|
2
2
|
"main": "javascript/main.js",
|
3
|
-
"description": "
|
3
|
+
"description": "pig",
|
4
4
|
"dependencies": {
|
5
|
-
"react": "",
|
6
|
-
"react-dom": "",
|
7
|
-
"
|
8
|
-
"
|
9
|
-
"
|
10
|
-
|
11
|
-
|
12
|
-
"
|
13
|
-
"
|
14
|
-
"
|
15
|
-
"
|
16
|
-
"
|
17
|
-
"gulp-babel": "",
|
18
|
-
"vinyl-source-stream": "",
|
19
|
-
"vinyl-buffer": "",
|
20
|
-
"babel": "",
|
21
|
-
"gulp-uglify": ""
|
5
|
+
"react": "0.14.7",
|
6
|
+
"react-dom": "0.14.7",
|
7
|
+
"react-router": "2.0.1",
|
8
|
+
"jquery": "2.2.2",
|
9
|
+
"webpack": "1.12.14",
|
10
|
+
"babel-preset-es2016-node5": "1.1.2",
|
11
|
+
"babel-preset-es2015": "6.6.0",
|
12
|
+
"babel-preset-react": "6.5.0",
|
13
|
+
"babel-loader": "6.2.4",
|
14
|
+
"babel-core": "6.7.0",
|
15
|
+
"css-loader": "0.23.1",
|
16
|
+
"style-loader": "0.13.0"
|
22
17
|
}
|
23
18
|
}
|
data/webpack.build.js
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
var webpack = require('webpack');
|
2
|
+
module.exports = {
|
3
|
+
entry: "./front/application.js",
|
4
|
+
output: {
|
5
|
+
path: "./lib/pig-media-server/views/",
|
6
|
+
filename: "bundle.js"
|
7
|
+
},
|
8
|
+
module: {
|
9
|
+
loaders: [
|
10
|
+
{
|
11
|
+
test: /\.css$/,
|
12
|
+
loader: "style!css"
|
13
|
+
},
|
14
|
+
{
|
15
|
+
test: /.js?$/,
|
16
|
+
loader: 'babel-loader',
|
17
|
+
exclude: /node_modules/,
|
18
|
+
query: {
|
19
|
+
presets: ['es2016-node5', 'react', 'es2015']
|
20
|
+
}
|
21
|
+
}
|
22
|
+
]
|
23
|
+
},
|
24
|
+
plugins: [new webpack.optimize.UglifyJsPlugin()]
|
25
|
+
};
|
data/webpack.config.js
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
module.exports = {
|
2
|
+
entry: "./front/application.js",
|
3
|
+
output: {
|
4
|
+
path: "./lib/pig-media-server/views/",
|
5
|
+
filename: "bundle.js"
|
6
|
+
},
|
7
|
+
module: {
|
8
|
+
loaders: [
|
9
|
+
{
|
10
|
+
test: /\.css$/,
|
11
|
+
loader: "style!css"
|
12
|
+
},
|
13
|
+
{
|
14
|
+
test: /.js?$/,
|
15
|
+
loader: 'babel-loader',
|
16
|
+
exclude: /node_modules/,
|
17
|
+
query: {
|
18
|
+
presets: ['es2016-node5', 'react', 'es2015']
|
19
|
+
}
|
20
|
+
}
|
21
|
+
]
|
22
|
+
},
|
23
|
+
devtool: "inline-source-map",
|
24
|
+
module: {
|
25
|
+
loaders: [
|
26
|
+
{test: /\.js$/, exclude: /node_modules/, loader: "babel-loader"},
|
27
|
+
{ test: /\.css$/, loader: "style!css" },
|
28
|
+
]
|
29
|
+
}
|
30
|
+
};
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pig-media-server
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: '
|
4
|
+
version: '100'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- ssig33
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2016-03-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rroonga
|
@@ -298,28 +298,40 @@ executables:
|
|
298
298
|
extensions: []
|
299
299
|
extra_rdoc_files: []
|
300
300
|
files:
|
301
|
+
- ".babelrc"
|
301
302
|
- ".gitignore"
|
302
303
|
- Gemfile
|
303
304
|
- LICENSE.txt
|
304
305
|
- README.md
|
305
306
|
- Rakefile
|
306
307
|
- bin/pig-media-server
|
307
|
-
-
|
308
|
-
-
|
309
|
-
-
|
310
|
-
-
|
311
|
-
-
|
312
|
-
-
|
313
|
-
-
|
314
|
-
-
|
315
|
-
-
|
316
|
-
-
|
317
|
-
-
|
318
|
-
-
|
319
|
-
-
|
320
|
-
-
|
321
|
-
-
|
322
|
-
-
|
308
|
+
- front/application.js
|
309
|
+
- front/chromecast.js
|
310
|
+
- front/components/custom.js
|
311
|
+
- front/components/head.js
|
312
|
+
- front/components/index.js
|
313
|
+
- front/components/item.js
|
314
|
+
- front/components/latest.js
|
315
|
+
- front/components/new_flag.js
|
316
|
+
- front/components/no_match.js
|
317
|
+
- front/components/pager.js
|
318
|
+
- front/components/player.js
|
319
|
+
- front/components/query_list.js
|
320
|
+
- front/components/recommend.js
|
321
|
+
- front/components/search.js
|
322
|
+
- front/components/search_box.js
|
323
|
+
- front/components/watch.js
|
324
|
+
- front/controller.js
|
325
|
+
- front/models/base.js
|
326
|
+
- front/models/config.js
|
327
|
+
- front/models/custom.js
|
328
|
+
- front/models/custom_list.js
|
329
|
+
- front/models/latest.js
|
330
|
+
- front/models/list.js
|
331
|
+
- front/models/playing.js
|
332
|
+
- front/models/recent.js
|
333
|
+
- front/models/recommend.js
|
334
|
+
- front/models/session.js
|
323
335
|
- lib/pig-media-server.rb
|
324
336
|
- lib/pig-media-server/api.rb
|
325
337
|
- lib/pig-media-server/aspect.rb
|
@@ -330,6 +342,7 @@ files:
|
|
330
342
|
- lib/pig-media-server/kindle_send.rb
|
331
343
|
- lib/pig-media-server/model/comic.rb
|
332
344
|
- lib/pig-media-server/model/data.rb
|
345
|
+
- lib/pig-media-server/model/data_use_rdb.rb
|
333
346
|
- lib/pig-media-server/model/migrate.rb
|
334
347
|
- lib/pig-media-server/model/pig.rb
|
335
348
|
- lib/pig-media-server/script.rb
|
@@ -374,6 +387,8 @@ files:
|
|
374
387
|
- lib/pig-media-server/web.rb
|
375
388
|
- package.json
|
376
389
|
- pig-media-server.gemspec
|
390
|
+
- webpack.build.js
|
391
|
+
- webpack.config.js
|
377
392
|
homepage: http://github.com/ssig33/pig-media-server
|
378
393
|
licenses:
|
379
394
|
- MIT
|
@@ -394,7 +409,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
394
409
|
version: '0'
|
395
410
|
requirements: []
|
396
411
|
rubyforge_project:
|
397
|
-
rubygems_version: 2.
|
412
|
+
rubygems_version: 2.5.1
|
398
413
|
signing_key:
|
399
414
|
specification_version: 4
|
400
415
|
summary: Pig Media Server
|
data/gulpfile.js
DELETED
@@ -1,33 +0,0 @@
|
|
1
|
-
var gulp = require('gulp');
|
2
|
-
var browserify = require('browserify');
|
3
|
-
var babelify = require('babelify');
|
4
|
-
var source = require('vinyl-source-stream');
|
5
|
-
var uglify = require('gulp-uglify');
|
6
|
-
var buffer = require('vinyl-buffer');
|
7
|
-
var cssDir = 'stylesheets'
|
8
|
-
|
9
|
-
gulp.task('browserify', function() {
|
10
|
-
browserify('./javascripts/application.js', { debug: true })
|
11
|
-
.transform(babelify)
|
12
|
-
.bundle()
|
13
|
-
.on("error", function (err) { console.log("Error : " + err.message); })
|
14
|
-
.pipe(source('bundle.js'))
|
15
|
-
.pipe(gulp.dest('./lib/pig-media-server/views/'))
|
16
|
-
});
|
17
|
-
|
18
|
-
gulp.task('build', function(){
|
19
|
-
browserify('./javascripts/application.js', { debug: true })
|
20
|
-
.transform(babelify)
|
21
|
-
.bundle()
|
22
|
-
.on("error", function (err) { console.log("Error : " + err.message); })
|
23
|
-
.pipe(source('bundle.js'))
|
24
|
-
.pipe(buffer())
|
25
|
-
.pipe(uglify())
|
26
|
-
.pipe(gulp.dest('./lib/pig-media-server/views/'))
|
27
|
-
|
28
|
-
});
|
29
|
-
|
30
|
-
|
31
|
-
gulp.task('watch', ['browserify'], function(){
|
32
|
-
gulp.watch('./javascripts/**/*.js', ['browserify']);
|
33
|
-
});
|
data/javascripts/application.js
DELETED
@@ -1,117 +0,0 @@
|
|
1
|
-
window.React = require('react');
|
2
|
-
window.ReactDOM = require('react-dom');
|
3
|
-
window.$ = window.jQuery = require('jquery');
|
4
|
-
window.moment = require('moment-timezone');
|
5
|
-
|
6
|
-
require('./chromecast.js');
|
7
|
-
|
8
|
-
require('./utils.js');
|
9
|
-
require('./controller.js');
|
10
|
-
|
11
|
-
require('./event_dispatcher.js');
|
12
|
-
|
13
|
-
require('./recent.js');
|
14
|
-
require('./video.js');
|
15
|
-
require('./custom_list.js');
|
16
|
-
|
17
|
-
require('./components/head.js');
|
18
|
-
require('./components/sort.js');
|
19
|
-
require('./components/list.js');
|
20
|
-
require('./components/query_list.js');
|
21
|
-
require('./components/new_flag.js');
|
22
|
-
require('./components/watch.js');
|
23
|
-
require('./components/player.js');
|
24
|
-
|
25
|
-
class Application extends React.Component {
|
26
|
-
constructor(props){
|
27
|
-
super(props);
|
28
|
-
this.controller = new Controller();
|
29
|
-
this.recent = new Recent(this);
|
30
|
-
this.video = new Video();
|
31
|
-
this.custom_list = new CustomList(this);
|
32
|
-
|
33
|
-
this.state = {
|
34
|
-
config: {},
|
35
|
-
session: {},
|
36
|
-
items: [],
|
37
|
-
recent: {},
|
38
|
-
video: null,
|
39
|
-
|
40
|
-
open: (link)=>{this.open(link)},
|
41
|
-
initialize: ()=>{this.initialize()},
|
42
|
-
update_state: ()=>{this.update_state()},
|
43
|
-
|
44
|
-
controller: this.controller,
|
45
|
-
|
46
|
-
models: {video: this.video, recent: this.recent, custom_list: this.custom_list}
|
47
|
-
}
|
48
|
-
|
49
|
-
this.state.models.video.addEventListener('videoUpdated', ()=>{ this.setState(this.state); });
|
50
|
-
|
51
|
-
window.addEventListener('popstate',(ev)=>{ this.initialize(); },false);
|
52
|
-
}
|
53
|
-
|
54
|
-
open(link){
|
55
|
-
history.pushState('', '', link);
|
56
|
-
this.initialize();
|
57
|
-
}
|
58
|
-
|
59
|
-
update_state(){ this.setState(this.state); }
|
60
|
-
|
61
|
-
load_from_api(url){
|
62
|
-
if(!!url){
|
63
|
-
$.get(url).done((data)=>{ this.state.items = data; this.update_state(); });
|
64
|
-
} else {
|
65
|
-
this.state.items = [];
|
66
|
-
this.update_state();
|
67
|
-
}
|
68
|
-
}
|
69
|
-
|
70
|
-
load_config(){ $.get("/api/r/config").done((data)=>{ this.state.config = data; this.update_state(); })}
|
71
|
-
load_session(){
|
72
|
-
$.get("/api/r/session").done((data)=>{
|
73
|
-
this.state.session = data;
|
74
|
-
this.update_state();
|
75
|
-
this.load_recent();
|
76
|
-
})
|
77
|
-
}
|
78
|
-
|
79
|
-
load_recent(){ this.recent.load() }
|
80
|
-
|
81
|
-
routing(){
|
82
|
-
var route = this.controller.route();
|
83
|
-
switch(route.page){
|
84
|
-
case "list":
|
85
|
-
this.load_from_api(this.controller.route().api_url);
|
86
|
-
this.state.active_page = 'list';
|
87
|
-
this.update_state();
|
88
|
-
break;
|
89
|
-
}
|
90
|
-
}
|
91
|
-
|
92
|
-
initialize(){
|
93
|
-
this.load_config();
|
94
|
-
this.load_session();
|
95
|
-
this.custom_list.load();
|
96
|
-
this.routing()
|
97
|
-
}
|
98
|
-
|
99
|
-
componentDidMount(){ this.initialize() }
|
100
|
-
|
101
|
-
render(){
|
102
|
-
return <div>
|
103
|
-
<Player state={this.state} />
|
104
|
-
<div id='all'>
|
105
|
-
<Head state={this.state} />
|
106
|
-
<SearchBox state={this.state}/>
|
107
|
-
<List state={this.state}/>
|
108
|
-
<QueryList state={this.state}/>
|
109
|
-
</div>
|
110
|
-
</div>
|
111
|
-
}
|
112
|
-
}
|
113
|
-
|
114
|
-
ReactDOM.render(<Application />, document.querySelector("#application"));
|
115
|
-
|
116
|
-
|
117
|
-
|
@@ -1,106 +0,0 @@
|
|
1
|
-
class LoginAs extends React.Component {
|
2
|
-
render(){
|
3
|
-
return <span>Login as {this.props.user_id}</span>
|
4
|
-
}
|
5
|
-
}
|
6
|
-
|
7
|
-
class LoginLink extends React.Component {
|
8
|
-
render(){
|
9
|
-
return <a href='/sessions'>Login</a>
|
10
|
-
}
|
11
|
-
}
|
12
|
-
|
13
|
-
class Session extends React.Component {
|
14
|
-
render(){
|
15
|
-
return <div>
|
16
|
-
{this.props.state.session.user_id ?
|
17
|
-
<LoginAs user_id={this.props.state.session.user_id} /> :
|
18
|
-
<LoginLink />
|
19
|
-
}
|
20
|
-
</div>
|
21
|
-
}
|
22
|
-
}
|
23
|
-
|
24
|
-
class Head extends React.Component {
|
25
|
-
click(){
|
26
|
-
this.props.state.open('/');
|
27
|
-
}
|
28
|
-
render(){
|
29
|
-
return <div>
|
30
|
-
<Session state={this.props.state} />
|
31
|
-
<h2>
|
32
|
-
<a href='javascript:void(0)' onClick={()=> this.click()}>
|
33
|
-
{this.props.state.config.page_title}
|
34
|
-
</a>
|
35
|
-
</h2>
|
36
|
-
</div>
|
37
|
-
}
|
38
|
-
}
|
39
|
-
|
40
|
-
class CustomList extends React.Component{
|
41
|
-
click(){
|
42
|
-
this.props.state.open(`/custom?name=${encodeURIComponent(this.props.name)}`)
|
43
|
-
}
|
44
|
-
render(){
|
45
|
-
return <a href='javascript:void(0)' onClick={()=> this.click()}>{this.props.name}</a>
|
46
|
-
}
|
47
|
-
}
|
48
|
-
|
49
|
-
class Recommend extends React.Component{
|
50
|
-
click(){ this.props.state.open(`/recommend?name=${localStorage.user_id}`) }
|
51
|
-
render(){
|
52
|
-
return <span>
|
53
|
-
{!!localStorage.user_id ? <a href='javascript:void(0)' onClick={()=> this.click()}><b>Recommend</b></a> : null}
|
54
|
-
</span>
|
55
|
-
}
|
56
|
-
}
|
57
|
-
|
58
|
-
class SearchBox extends React.Component {
|
59
|
-
submit(event){
|
60
|
-
event.preventDefault();
|
61
|
-
var query = this.refs.input.value;
|
62
|
-
var url = `/?query=${encodeURIComponent(query)}`
|
63
|
-
history.pushState(url, '', url);
|
64
|
-
this.props.state.initialize();
|
65
|
-
}
|
66
|
-
click(e){ this.props.state.open(e.target.dataset.url); }
|
67
|
-
|
68
|
-
full_screen(){
|
69
|
-
var elem = document.querySelector("body");
|
70
|
-
if (elem.requestFullScreen) {
|
71
|
-
elem.requestFullScreen();
|
72
|
-
} else if (elem.mozRequestFullScreen) {
|
73
|
-
elem.mozRequestFullScreen();
|
74
|
-
} else if (elem.webkitRequestFullScreen) {
|
75
|
-
elem.webkitRequestFullScreen();
|
76
|
-
}
|
77
|
-
}
|
78
|
-
|
79
|
-
componentDidUpdate(){
|
80
|
-
var query = decodeURIComponent(this.props.state.controller.query());
|
81
|
-
if(query == 'undefined' || query == 'null' || !query){query = ''}
|
82
|
-
this.refs.input.value = query;
|
83
|
-
}
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
change(){ }
|
88
|
-
|
89
|
-
render(){
|
90
|
-
var query = decodeURIComponent(this.props.state.controller.query());
|
91
|
-
if(query == 'undefined' || query == 'null' || !query){query = ''}
|
92
|
-
var custom_list = $.map(this.props.state.models.custom_list.list, (v,k)=>{return <CustomList key={k} name={k} state={this.props.state}/>});
|
93
|
-
return <form onSubmit={(e)=> this.submit(e)}>
|
94
|
-
<input ref='input' defaultValue={query} onChange={()=>{this.change()}}/><button>Search</button>
|
95
|
-
<a href='javascript:void(0)' onClick={(e)=>this.click(e)} data-url='/latest'>Latest</a>
|
96
|
-
<a href='/config'>Config</a>
|
97
|
-
<a href='javascript:void(0)' onClick={()=> this.full_screen()}>Full Screen</a>
|
98
|
-
<Recommend state={this.props.state} />
|
99
|
-
<br />
|
100
|
-
{custom_list}
|
101
|
-
</form>
|
102
|
-
}
|
103
|
-
}
|
104
|
-
|
105
|
-
window.Head = Head;
|
106
|
-
window.SearchBox = SearchBox;
|
@@ -1,104 +0,0 @@
|
|
1
|
-
class CustomLinks extends React.Component{
|
2
|
-
render(){
|
3
|
-
return <span dangerouslySetInnerHTML={{__html: this.props.item.custom_links}}/>
|
4
|
-
}
|
5
|
-
}
|
6
|
-
|
7
|
-
class Item extends React.Component {
|
8
|
-
mtime(){
|
9
|
-
//moment(this.props.item.mtime)
|
10
|
-
return this.props.item.mtime;
|
11
|
-
}
|
12
|
-
|
13
|
-
render(){
|
14
|
-
var item = this.props.item;
|
15
|
-
var meta = `/meta/${this.props.item.key}`;
|
16
|
-
var sub = `/sub/${this.props.item.key}`;
|
17
|
-
return <span className='main_span'>
|
18
|
-
<NewFlag
|
19
|
-
item={this.props.item}
|
20
|
-
state={this.props.state}
|
21
|
-
/>
|
22
|
-
<a href={item.url} className='main_link'>{item.name}</a>
|
23
|
-
|
24
|
-
<Watch
|
25
|
-
item={this.props.item}
|
26
|
-
state={this.props.state}
|
27
|
-
/>
|
28
|
-
<ChromeCast
|
29
|
-
item={this.props.item}
|
30
|
-
state={this.props.state}
|
31
|
-
/>
|
32
|
-
<span className='mtime'>{this.mtime()}</span>
|
33
|
-
<span className='size'>{size_pretty(item.size)}</span>
|
34
|
-
<a className='meta' href={meta}>Meta</a>
|
35
|
-
<a className='meta' href={sub}>Sub</a>
|
36
|
-
<CustomLinks item={this.props.item} />
|
37
|
-
</span>
|
38
|
-
}
|
39
|
-
}
|
40
|
-
|
41
|
-
class Pager extends React.Component {
|
42
|
-
constructor(props){
|
43
|
-
super(props);
|
44
|
-
this.page = 1;
|
45
|
-
var page = this.props.state.controller.params().page;
|
46
|
-
if(page){ this.page = parseInt(page)}
|
47
|
-
this.bind();
|
48
|
-
}
|
49
|
-
|
50
|
-
bind(){
|
51
|
-
$(window).on("scroll",()=>{
|
52
|
-
var scrollHeight = $(document).height();
|
53
|
-
var scrollPosition = $(window).height() + $(window).scrollTop();
|
54
|
-
if ((scrollHeight - scrollPosition) / scrollHeight === 0) {
|
55
|
-
if(this.props.state.controller.can_sort_and_paging()|| location.pathname == '/latest'){
|
56
|
-
this.click();
|
57
|
-
}
|
58
|
-
}
|
59
|
-
});
|
60
|
-
}
|
61
|
-
click(){
|
62
|
-
this.page ++;
|
63
|
-
if(location.pathname == '/latest'){
|
64
|
-
var url = this.props.state.controller.route().api_url += `?page=${this.page}`;
|
65
|
-
} else {
|
66
|
-
var url = this.props.state.controller.route().api_url += `&page=${this.page}`;
|
67
|
-
}
|
68
|
-
$.get(url).done((data)=>{
|
69
|
-
this.props.state.items = this.props.state.items.concat(data);
|
70
|
-
this.props.state.update_state();
|
71
|
-
if(location.pathname == '/latest'){
|
72
|
-
var new_url = `/latest?page=${this.page}`;
|
73
|
-
} else {
|
74
|
-
var new_url = `/?query=${this.props.state.controller.query()}&page=${this.page}`;
|
75
|
-
}
|
76
|
-
history.pushState('', '', new_url);
|
77
|
-
});
|
78
|
-
}
|
79
|
-
|
80
|
-
render(){ return <a href='javascript:void(0)' onClick={()=> this.click()}>Next</a> }
|
81
|
-
}
|
82
|
-
|
83
|
-
|
84
|
-
class List extends React.Component {
|
85
|
-
can_sort(){ return this.props.state.controller.can_sort_and_paging()}
|
86
|
-
render(){
|
87
|
-
|
88
|
-
var items = $.map(this.props.state.items, (item)=>{
|
89
|
-
return <Item
|
90
|
-
key={item.key}
|
91
|
-
state={this.props.state}
|
92
|
-
item={item}
|
93
|
-
/>
|
94
|
-
});
|
95
|
-
|
96
|
-
return <div>
|
97
|
-
{this.can_sort() ? <Sort state={this.props.state} /> : null }
|
98
|
-
<p>{items}</p>
|
99
|
-
<p>{this.can_sort() || location.pathname == '/latest' ? <Pager state={this.props.state} /> : null }</p>
|
100
|
-
</div>
|
101
|
-
}
|
102
|
-
}
|
103
|
-
|
104
|
-
window.List = List;
|
@@ -1,23 +0,0 @@
|
|
1
|
-
class NewFlag extends React.Component{
|
2
|
-
is_new(){
|
3
|
-
if(!!this.props.state.recents){
|
4
|
-
var ext = window.ext(this.props.item.name);
|
5
|
-
if(ext == 'mp4' || ext == 'flv'){
|
6
|
-
var result = true;
|
7
|
-
$.each(this.props.state.recents, (k,v)=>{ if(k == `movie/${this.props.item.key}`){ result = false } });
|
8
|
-
return result
|
9
|
-
} else {
|
10
|
-
return false;
|
11
|
-
}
|
12
|
-
} else {
|
13
|
-
return false;
|
14
|
-
}
|
15
|
-
}
|
16
|
-
|
17
|
-
render(){
|
18
|
-
var is_new = this.is_new();
|
19
|
-
return <span>{is_new ? <span className='new_flag' style={{color:'lime', "fontWeight":'bold'}}>New</span> : null }</span>
|
20
|
-
}
|
21
|
-
}
|
22
|
-
|
23
|
-
window.NewFlag = NewFlag;
|
@@ -1,64 +0,0 @@
|
|
1
|
-
class QuerySave extends React.Component{
|
2
|
-
constructor(props){
|
3
|
-
super(props);
|
4
|
-
this.controller = new Controller();
|
5
|
-
}
|
6
|
-
|
7
|
-
click(){
|
8
|
-
var query = decodeURIComponent(this.controller.query());
|
9
|
-
$.post("/api/r/query_list", {query: query})
|
10
|
-
}
|
11
|
-
render(){
|
12
|
-
return <span>
|
13
|
-
<a href='javascript:void(0)' onClick={()=> this.click()}>Save Query</a>
|
14
|
-
</span>
|
15
|
-
}
|
16
|
-
}
|
17
|
-
|
18
|
-
class Sort extends React.Component{
|
19
|
-
constructor(props){
|
20
|
-
super(props);
|
21
|
-
this.controller = new Controller();
|
22
|
-
}
|
23
|
-
|
24
|
-
sort_by_date(){
|
25
|
-
var query = this.controller.query();
|
26
|
-
var new_url = `/?query=${query}&sort=date&order=descending`
|
27
|
-
history.pushState("", "", new_url);
|
28
|
-
this.props.state.initialize();
|
29
|
-
}
|
30
|
-
|
31
|
-
sort_by_name(){
|
32
|
-
var query = this.controller.query();
|
33
|
-
var new_url = `/?query=${query}&sort=name&order=ascending`
|
34
|
-
history.pushState("", "", new_url);
|
35
|
-
this.props.state.initialize();
|
36
|
-
}
|
37
|
-
|
38
|
-
change_order(order){
|
39
|
-
var query = this.controller.query();
|
40
|
-
var sort = this.controller.params().sort;
|
41
|
-
var new_url = `/?query=${query}&sort=${sort}&order=${order}`
|
42
|
-
history.pushState("", "", new_url);
|
43
|
-
this.props.state.initialize();
|
44
|
-
|
45
|
-
}
|
46
|
-
|
47
|
-
can_change_order(){ return !!this.controller.params().sort; }
|
48
|
-
render(){
|
49
|
-
return <p>
|
50
|
-
<a href="javascript:void(0)" onClick={()=> this.sort_by_date()}>Sort By Date</a>
|
51
|
-
<a href="javascript:void(0)" onClick={()=> this.sort_by_name()}>Sort By Name</a>
|
52
|
-
{this.can_change_order() ?
|
53
|
-
<span>
|
54
|
-
<a href="javascript:void(0)" onClick={()=> this.change_order('ascending')}>Ascending</a>
|
55
|
-
<a href="javascript:void(0)" onClick={()=> this.change_order('descending')}>Descending</a>
|
56
|
-
</span>
|
57
|
-
: null
|
58
|
-
}
|
59
|
-
<QuerySave />
|
60
|
-
</p>
|
61
|
-
}
|
62
|
-
}
|
63
|
-
|
64
|
-
window.Sort = Sort;
|