videos 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +8 -8
- data/app/css/views.index.css +1 -1
- data/app/index.html +1 -1
- data/app/js/controllers.index.js +21 -4
- data/lib/videos/update.rb +12 -5
- data/lib/videos/version.rb +1 -1
- data/lib/videos/video.rb +14 -2
- data/lib/videos/videos.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
MjIwOTliN2Q4YTdhYzNlOWQwMzY3YzZhZTUxM2Y2ZWU0ZmQyNTRhYQ==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
NzdmMjQxODJlMzZkYzg2YjM3YTdiMmM2NTBmNjJjYTM2MzQ1NTM4MA==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
YzIyNDhjOWNkYjY5NjE2MzdmYjBjYTQ5ODdkMDVhODNiZGE5NTI4NTliODcy
|
10
|
+
ZGFmNGVkMGUwNjE2MTMxNGQ2MmQ1NTU4ODJmZDIzM2ZhNWUwNDAxZWI4NjQx
|
11
|
+
ODQyZTJhNTNjNGFjZmIyNGZlMDYzYTIyMWI2NjJlOTYzZWI5MzE=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
YzA4MDE0ZWJkMmRlMjY0NzYwMzAyNzVjMmRmMGYwMDhjYzQ5ZjI5MDY1MzUy
|
14
|
+
YmM0Y2Q2NTc0ZDEzOGM0YzZkZTFmZDA4ZDJjOTdkN2YyN2NkMjhkMjYyMDYy
|
15
|
+
MDZhMTI4NWM2ZjFhZDI1MWQ3YTVhZjgzNDZiMzlhOTIxN2M4MjY=
|
data/app/css/views.index.css
CHANGED
data/app/index.html
CHANGED
@@ -27,7 +27,7 @@
|
|
27
27
|
<input type="text" id="search" class="form-control">
|
28
28
|
<span class="btn-group sort">
|
29
29
|
<button class="btn btn-default" data-sort="publishedOn" type="button">Published On</button>
|
30
|
-
<button class="btn btn-default" data-sort="
|
30
|
+
<button class="btn btn-default" data-sort="length" type="button">Length</button>
|
31
31
|
<button class="btn btn-default" data-sort="title" type="button">Title</button>
|
32
32
|
</span>
|
33
33
|
<span class="btn-group sort-direction">
|
data/app/js/controllers.index.js
CHANGED
@@ -7,9 +7,9 @@ controllers.index = function(search, sort, sortDirection) {
|
|
7
7
|
if(type == "publishedOn") return function(video) {
|
8
8
|
return video.publishedOn;
|
9
9
|
};
|
10
|
-
|
11
|
-
return video.
|
12
|
-
}
|
10
|
+
if(type == "length") return function(video) {
|
11
|
+
return video.length;
|
12
|
+
};
|
13
13
|
if(type == "title") return function(video) {
|
14
14
|
return video.title.toLowerCase();
|
15
15
|
};
|
@@ -84,6 +84,22 @@ controllers.index = function(search, sort, sortDirection) {
|
|
84
84
|
return a.href;
|
85
85
|
}
|
86
86
|
|
87
|
+
function formatLength(length) {
|
88
|
+
var out = [];
|
89
|
+
if(length >= 3600) {
|
90
|
+
out.push(Math.floor(length / 3600) + "h");
|
91
|
+
length = length % 3600;
|
92
|
+
}
|
93
|
+
if(length >= 60) {
|
94
|
+
out.push(Math.floor(length / 60) + "m");
|
95
|
+
length = length % 60;
|
96
|
+
}
|
97
|
+
if(length >= 1) {
|
98
|
+
out.push(Math.floor(length) + "s");
|
99
|
+
}
|
100
|
+
return out.join(" ");
|
101
|
+
}
|
102
|
+
|
87
103
|
function addVideos(videos) {
|
88
104
|
$("#items").empty();
|
89
105
|
|
@@ -97,7 +113,8 @@ controllers.index = function(search, sort, sortDirection) {
|
|
97
113
|
link.append(img);
|
98
114
|
item.append(link);
|
99
115
|
|
100
|
-
item.append('<div class="info-wrapper"><div class="info"><div class="title">' + video.title + '</div
|
116
|
+
item.append('<div class="info-wrapper"><div class="info"><div class="title">' + video.title + '</div>' +
|
117
|
+
'<img src="img/icons/film.png" title="Video Length"> ' + formatLength(video.length) + '</div>');
|
101
118
|
|
102
119
|
$("#items").append(item);
|
103
120
|
});
|
data/lib/videos/update.rb
CHANGED
@@ -7,14 +7,14 @@ class Videos::Update
|
|
7
7
|
|
8
8
|
@files = videos_package.root_path.descendant_files.reject { |p| p.basename.to_s[0..0] == '.' }
|
9
9
|
@videos = []
|
10
|
-
|
10
|
+
load_data
|
11
11
|
process
|
12
12
|
save_data
|
13
13
|
puts "\nDone!"
|
14
14
|
end
|
15
15
|
|
16
16
|
def load_data
|
17
|
-
self.videos = (Videos::Videos.load_json(
|
17
|
+
self.videos = (Videos::Videos.load_json(videos_package.videos_path + "data.json") || []).map { |b| Videos::Video.from_hash(videos_package, b) }
|
18
18
|
end
|
19
19
|
|
20
20
|
def save_data
|
@@ -35,7 +35,13 @@ class Videos::Update
|
|
35
35
|
$stdout.write "\rProcessing #{i + 1} of #{@files.length} (#{(((i + 1) / @files.length.to_f) * 100.0).round}%)"
|
36
36
|
$stdout.flush
|
37
37
|
|
38
|
-
|
38
|
+
#video = videos.find { |v| v.path.to_s == f.to_s }
|
39
|
+
|
40
|
+
#if video
|
41
|
+
# updated video
|
42
|
+
#else
|
43
|
+
created f
|
44
|
+
#end
|
39
45
|
end
|
40
46
|
#handle deleted first
|
41
47
|
#@directories.each do |d|
|
@@ -56,11 +62,12 @@ class Videos::Update
|
|
56
62
|
def created(f)
|
57
63
|
video = Videos::Video.new(videos_package, f)
|
58
64
|
video.generate_thumbnail
|
65
|
+
video.get_metadata
|
59
66
|
videos << video
|
60
67
|
end
|
61
68
|
|
62
69
|
def updated(video)
|
63
|
-
|
64
|
-
|
70
|
+
video.generate_thumbnail
|
71
|
+
video.get_metadata
|
65
72
|
end
|
66
73
|
end
|
data/lib/videos/version.rb
CHANGED
data/lib/videos/video.rb
CHANGED
@@ -1,10 +1,13 @@
|
|
1
1
|
class Videos::Video
|
2
2
|
attr_reader :videos_package
|
3
3
|
attr_reader :path
|
4
|
+
attr_reader :metadata
|
5
|
+
attr_accessor :length
|
4
6
|
|
5
7
|
def initialize(videos_package, path)
|
6
8
|
@videos_package = videos_package
|
7
9
|
@path = path
|
10
|
+
@metadata = {}
|
8
11
|
end
|
9
12
|
|
10
13
|
def path_hash
|
@@ -66,9 +69,17 @@ class Videos::Video
|
|
66
69
|
FileUtils.rm_rf(temp_directory) if temp_directory
|
67
70
|
end
|
68
71
|
|
72
|
+
def get_metadata
|
73
|
+
return unless length.nil?
|
74
|
+
|
75
|
+
output = `mpv --really-quiet -identify --frames=0 --ao=null #{path.to_s.shellescape}`.encode("ASCII-8BIT", undef: :replace, invalid: :replace, replace: "?")
|
76
|
+
@metadata = Hash[output.split("\n").map { |l| l.gsub(/^\[identify\] /, "").split("=", 2) }]
|
77
|
+
@length = metadata["ID_LENGTH"].to_f
|
78
|
+
end
|
79
|
+
|
69
80
|
def self.from_hash(videos_package, data)
|
70
|
-
video = Videos::Video.new(videos_package)
|
71
|
-
video.
|
81
|
+
video = Videos::Video.new(videos_package, videos_package.url_to_pathname(Addressable::URI.parse(data["url"])))
|
82
|
+
video.length = data["length"]
|
72
83
|
video
|
73
84
|
end
|
74
85
|
|
@@ -78,6 +89,7 @@ class Videos::Video
|
|
78
89
|
"title" => title,
|
79
90
|
"publishedOn" => path.mtime.to_i,
|
80
91
|
"thumbnailUrl" => thumbnail_url,
|
92
|
+
"length" => length,
|
81
93
|
"key" => path_hash
|
82
94
|
}
|
83
95
|
end
|
data/lib/videos/videos.rb
CHANGED
@@ -9,7 +9,7 @@ class Videos::Videos
|
|
9
9
|
def url_to_pathname(url)
|
10
10
|
path = Addressable::URI.unencode_component(url.normalized_path)
|
11
11
|
path.gsub!(/^\//, "") #Make relative, if we allow mounting at a different root URL this will need to remove the root instead of just '/'
|
12
|
-
|
12
|
+
root_path + path
|
13
13
|
end
|
14
14
|
|
15
15
|
def self.gem_path
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: videos
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Brenton "B-Train" Fletcher
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-01-
|
11
|
+
date: 2014-01-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|