storyboard 0.2.3 → 0.2.4
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +2 -0
- data/Gemfile.lock +32 -9
- data/README.md +5 -2
- data/bin/storyboard-ffprobe +0 -0
- data/lib/storyboard/version.rb +1 -1
- data/storyboard.gemspec +2 -3
- data/vendor/suby/lib/suby/downloader/opensubtitles.rb +20 -2
- data/vendor/suby/lib/suby/filename_parser.rb +11 -9
- metadata +9 -10
- data/.gitmodules +0 -3
data/Gemfile
CHANGED
@@ -2,9 +2,11 @@ source :rubygems
|
|
2
2
|
|
3
3
|
gemspec
|
4
4
|
|
5
|
+
gem 'tvdb_party', :git => 'https://github.com/nddrylliog/tvdb_party'
|
5
6
|
gem 'nokogiri'
|
6
7
|
gem 'suby', :path => 'vendor/suby', :require => 'suby'
|
7
8
|
gem 'rmagick'
|
8
9
|
gem 'prawn'
|
9
10
|
gem 'ruby-progressbar'
|
10
11
|
gem 'rubyzip'
|
12
|
+
gem 'levenshtein-ffi', :require => 'levenshtein'
|
data/Gemfile.lock
CHANGED
@@ -1,30 +1,50 @@
|
|
1
1
|
GIT
|
2
|
-
remote:
|
3
|
-
revision:
|
2
|
+
remote: https://github.com/nddrylliog/tvdb_party
|
3
|
+
revision: 60ce3c28e664078da0206075e025ee06547f5826
|
4
4
|
specs:
|
5
|
-
|
5
|
+
tvdb_party (0.6.2)
|
6
|
+
httparty (>= 0.6.1)
|
7
|
+
|
8
|
+
PATH
|
9
|
+
remote: .
|
10
|
+
specs:
|
11
|
+
storyboard (0.2.3)
|
12
|
+
levenshtein-ffi
|
6
13
|
mime-types (>= 1.19)
|
7
14
|
nokogiri
|
8
15
|
path (>= 1.3.0)
|
16
|
+
prawn
|
17
|
+
rmagick
|
18
|
+
ruby-progressbar
|
9
19
|
rubyzip
|
10
20
|
term-ansicolor
|
11
21
|
|
12
22
|
PATH
|
13
|
-
remote:
|
23
|
+
remote: vendor/suby
|
14
24
|
specs:
|
15
|
-
|
25
|
+
suby (0.4.0)
|
26
|
+
mime-types (>= 1.19)
|
16
27
|
nokogiri
|
17
|
-
|
18
|
-
|
19
|
-
|
28
|
+
path (>= 1.3.0)
|
29
|
+
rubyzip
|
30
|
+
term-ansicolor
|
20
31
|
|
21
32
|
GEM
|
22
33
|
remote: http://rubygems.org/
|
23
34
|
specs:
|
24
35
|
Ascii85 (1.0.2)
|
25
36
|
afm (0.2.0)
|
37
|
+
ffi (1.1.5)
|
26
38
|
hashery (2.1.0)
|
39
|
+
httparty (0.10.0)
|
40
|
+
multi_json (~> 1.0)
|
41
|
+
multi_xml
|
42
|
+
levenshtein-ffi (1.0.3)
|
43
|
+
ffi
|
44
|
+
ffi (~> 1.1.5)
|
27
45
|
mime-types (1.19)
|
46
|
+
multi_json (1.5.0)
|
47
|
+
multi_xml (0.5.2)
|
28
48
|
nokogiri (1.5.6)
|
29
49
|
path (1.3.1)
|
30
50
|
pdf-reader (1.3.0)
|
@@ -47,9 +67,12 @@ PLATFORMS
|
|
47
67
|
ruby
|
48
68
|
|
49
69
|
DEPENDENCIES
|
50
|
-
|
70
|
+
levenshtein-ffi
|
51
71
|
nokogiri
|
52
72
|
prawn
|
53
73
|
rmagick
|
54
74
|
ruby-progressbar
|
75
|
+
rubyzip
|
76
|
+
storyboard!
|
55
77
|
suby!
|
78
|
+
tvdb_party!
|
data/README.md
CHANGED
@@ -4,6 +4,8 @@ Read the TV and Movies you don't have time to watch.
|
|
4
4
|
|
5
5
|
## Storyboard
|
6
6
|
|
7
|
+
![Seinfeld](http://i.imgur.com/lTRuC.jpg)
|
8
|
+
|
7
9
|
Storyboard is _very much_ a work in progress, and only works (most of) some of the time. Using it is simple:
|
8
10
|
|
9
11
|
storyboard /path/to/video-file.mkv
|
@@ -29,11 +31,12 @@ Storyboard requires a recent version of *ffmpeg*. This gem includes a build of *
|
|
29
31
|
|
30
32
|
* If there is a scene change followed by dialog in the next frame or two, the dialog may not be shown.
|
31
33
|
* Subtitles are always downloaded, never extracted from video files. Because the subtitles are searched for based on the filename it's best that you have then named in a standard format, e.g., `The X-Files - 1x21 - Tooms.avi`.
|
32
|
-
* Sometimes the wrong subtitle file will be returned from the site. In those cases, download it manually and use the `-s` option to pass in the path to an SRT formatted subtitle file.
|
33
|
-
* Some subtitles are encoded in UTF-16, and I haven't care quite enough yet to get them to work.
|
34
|
+
* Sometimes the wrong subtitle file will be returned from the site. In those cases, download it manually and use the `-s` option to pass in the path to an SRT formatted subtitle file. This is because the data lies, and there's nothing I can do about it.
|
35
|
+
* Some subtitles are encoded in UTF-16, and I haven't care quite enough yet to get them to work. Others use bad UTF8.
|
34
36
|
* The subtitles are uuuuuugly.
|
35
37
|
* Hardcoding 8 for the number of threads is a bad idea
|
36
38
|
* Almost definitely some path-escaping issues, so avoid files with apostrophes and slashes
|
39
|
+
* Some subtitles put all the text on one line, so that has to get broken up.
|
37
40
|
|
38
41
|
## Help
|
39
42
|
|
data/bin/storyboard-ffprobe
CHANGED
Binary file
|
data/lib/storyboard/version.rb
CHANGED
data/storyboard.gemspec
CHANGED
@@ -7,7 +7,7 @@ Gem::Specification.new do |gem|
|
|
7
7
|
gem.summary = %q{Video to PDF/ePub generator}
|
8
8
|
gem.homepage = "http://github.com/markolson/storyboard"
|
9
9
|
|
10
|
-
gem.required_ruby_version = '>= 1.9.
|
10
|
+
gem.required_ruby_version = '>= 1.9.3'
|
11
11
|
|
12
12
|
gem.files = `git ls-files`.split($\) if File.exist?('.git')
|
13
13
|
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
@@ -20,16 +20,15 @@ Gem::Specification.new do |gem|
|
|
20
20
|
gem.add_dependency 'rmagick'
|
21
21
|
gem.add_dependency 'prawn'
|
22
22
|
gem.add_dependency 'ruby-progressbar'
|
23
|
+
gem.add_dependency 'levenshtein-ffi'
|
23
24
|
|
24
25
|
# suby stuff.
|
25
26
|
gem.add_dependency 'path', '>= 1.3.0'
|
26
|
-
gem.add_dependency 'nokogiri'
|
27
27
|
gem.add_dependency 'rubyzip'
|
28
28
|
gem.add_dependency 'term-ansicolor'
|
29
29
|
gem.add_dependency 'mime-types', '>= 1.19'
|
30
30
|
|
31
31
|
if File.exist?('.git')
|
32
|
-
p "RUNNING"
|
33
32
|
`git submodule --quiet foreach 'echo $path'`.split($\).each do |submodule_path|
|
34
33
|
# for each submodule, change working directory to that submodule
|
35
34
|
Dir.chdir(submodule_path) do
|
@@ -1,3 +1,6 @@
|
|
1
|
+
require 'json'
|
2
|
+
require 'levenshtein'
|
3
|
+
|
1
4
|
module Suby
|
2
5
|
# Based on https://github.com/byroot/ruby-osdb/blob/master/lib/osdb/server.rb
|
3
6
|
class Downloader::OpenSubtitles < Downloader
|
@@ -28,12 +31,27 @@ module Suby
|
|
28
31
|
LANG_MAPPING.default = 'all'
|
29
32
|
|
30
33
|
def download_url
|
31
|
-
SEARCH_QUERIES_ORDER.find(lambda { raise NotFoundError, "no subtitles available" }) { |type|
|
34
|
+
s = SEARCH_QUERIES_ORDER.find(lambda { raise NotFoundError, "no subtitles available" }) { |type|
|
32
35
|
if subs = search_subtitles(search_query(type))['data']
|
33
36
|
@type = type
|
34
37
|
break subs
|
35
38
|
end
|
36
|
-
}
|
39
|
+
}
|
40
|
+
x = s.select { |t| t['SeriesSeason'].to_i == @video_data[:season].to_i } if @video_data[:season]
|
41
|
+
x.each {|t|
|
42
|
+
puts t['MovieName'] + '/' + "\"#{@video_data[:show]}\" #{@video_data[:title]}" + " - " + Levenshtein.distance(t['MovieName'], "\"#{@video_data[:show]}\" #{@video_data[:title]}").to_i.to_s
|
43
|
+
}
|
44
|
+
x.sort_by! { |t| Levenshtein.distance(t['MovieName'], "\"#{@video_data[:show]}\" #{@video_data[:title]}").to_i }
|
45
|
+
p "|||||||||||||||"
|
46
|
+
x.each {|t|
|
47
|
+
puts t['MovieName'] + '/' + "\"#{@video_data[:show]}\" #{@video_data[:title]}" + " - " + Levenshtein.distance(t['MovieName'], "\"#{@video_data[:show]}\" #{@video_data[:title]}").to_i.to_s
|
48
|
+
}
|
49
|
+
|
50
|
+
p "======"
|
51
|
+
p x.first
|
52
|
+
p x.last
|
53
|
+
p "-------"
|
54
|
+
x.first['SubDownloadLink']
|
37
55
|
end
|
38
56
|
|
39
57
|
def search_subtitles(query)
|
@@ -11,7 +11,7 @@ module Suby
|
|
11
11
|
[Ss](?<season>[0-9]{2})
|
12
12
|
[\.\- ]?
|
13
13
|
(?<episode>[0-9]{2})
|
14
|
-
[^0-9]
|
14
|
+
(?<title>[^0-9]*)$/x,
|
15
15
|
|
16
16
|
# foo.1x09*
|
17
17
|
/^(?<show>.+?)
|
@@ -21,7 +21,8 @@ module Suby
|
|
21
21
|
[xX]
|
22
22
|
(?<episode>[0-9]+)
|
23
23
|
\]?
|
24
|
-
[
|
24
|
+
[ \._\-]*
|
25
|
+
(?<title>[^\/]*)$/x,
|
25
26
|
|
26
27
|
# foo.s01.e01, foo.s01_e01
|
27
28
|
/^(?<show>.+?)
|
@@ -30,7 +31,8 @@ module Suby
|
|
30
31
|
[Ss](?<season>[0-9]+)[\. _-]?
|
31
32
|
[Ee]?(?<episode>[0-9]+)
|
32
33
|
\]?
|
33
|
-
[
|
34
|
+
[ \._\-]*
|
35
|
+
(?<title>[^\/]*)$/x,
|
34
36
|
|
35
37
|
# foo - [01.09]
|
36
38
|
/^(?<show>.+?)
|
@@ -41,14 +43,14 @@ module Suby
|
|
41
43
|
(?<episode>[0-9]+?)
|
42
44
|
\]
|
43
45
|
[ \._\-]?
|
44
|
-
[^\/]
|
46
|
+
(?<title>[^\/]*)$/x,
|
45
47
|
|
46
48
|
# Foo - S2 E 02 - etc
|
47
49
|
/^(?<show>.+?)
|
48
50
|
[ ]?[ \._\-][ ]?
|
49
51
|
[Ss](?<season>[0-9]+)[\.\- ]?
|
50
52
|
[Ee]?[ ]?(?<episode>[0-9]+)
|
51
|
-
[^\/]
|
53
|
+
(?<title>[^\/]*)$/x,
|
52
54
|
|
53
55
|
# Show - Episode 9999 [S 12 - Ep 131] - etc
|
54
56
|
/(?<show>.+)
|
@@ -60,22 +62,22 @@ module Suby
|
|
60
62
|
([ ]|[ ]-[ ]|-)
|
61
63
|
([eE]|[eE]p)[ ]?(?<episode>\d+)
|
62
64
|
\]
|
63
|
-
|
65
|
+
(?<title>.*)$/x,
|
64
66
|
|
65
67
|
# foo.103*
|
66
68
|
/^(?<show>.+)
|
67
69
|
[ \._\-]
|
68
70
|
(?<season>[0-9]{1})
|
69
71
|
(?<episode>[0-9]{2})
|
70
|
-
[\._ -][^\/]
|
72
|
+
(?<title>[\._ -][^\/]*)$/x,
|
71
73
|
]
|
72
74
|
MOVIE_PATTERN = /^(?<movie>.*)[.\[( ](?<year>(?:19|20)\d{2})/
|
73
75
|
|
74
76
|
def parse(file)
|
75
|
-
filename =
|
77
|
+
filename = File.basename(file, ".*")
|
76
78
|
if TVSHOW_PATTERNS.find { |pattern| pattern.match(filename) }
|
77
79
|
m = $~
|
78
|
-
{ type: :tvshow, show: clean_show_name(m[:show]), season: m[:season].to_i, episode: m[:episode].to_i }
|
80
|
+
{ type: :tvshow, show: clean_show_name(m[:show]), season: m[:season].to_i, episode: m[:episode].to_i, title: m[:title] }
|
79
81
|
elsif m = MOVIE_PATTERN.match(filename)
|
80
82
|
{ type: :movie, name: clean_show_name(m[:movie]), year: m[:year].to_i }
|
81
83
|
else
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: storyboard
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.4
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-01-
|
12
|
+
date: 2013-01-15 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: nokogiri
|
@@ -76,13 +76,13 @@ dependencies:
|
|
76
76
|
- !ruby/object:Gem::Version
|
77
77
|
version: '0'
|
78
78
|
- !ruby/object:Gem::Dependency
|
79
|
-
name:
|
79
|
+
name: levenshtein-ffi
|
80
80
|
requirement: !ruby/object:Gem::Requirement
|
81
81
|
none: false
|
82
82
|
requirements:
|
83
83
|
- - ! '>='
|
84
84
|
- !ruby/object:Gem::Version
|
85
|
-
version:
|
85
|
+
version: '0'
|
86
86
|
type: :runtime
|
87
87
|
prerelease: false
|
88
88
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -90,15 +90,15 @@ dependencies:
|
|
90
90
|
requirements:
|
91
91
|
- - ! '>='
|
92
92
|
- !ruby/object:Gem::Version
|
93
|
-
version:
|
93
|
+
version: '0'
|
94
94
|
- !ruby/object:Gem::Dependency
|
95
|
-
name:
|
95
|
+
name: path
|
96
96
|
requirement: !ruby/object:Gem::Requirement
|
97
97
|
none: false
|
98
98
|
requirements:
|
99
99
|
- - ! '>='
|
100
100
|
- !ruby/object:Gem::Version
|
101
|
-
version:
|
101
|
+
version: 1.3.0
|
102
102
|
type: :runtime
|
103
103
|
prerelease: false
|
104
104
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -106,7 +106,7 @@ dependencies:
|
|
106
106
|
requirements:
|
107
107
|
- - ! '>='
|
108
108
|
- !ruby/object:Gem::Version
|
109
|
-
version:
|
109
|
+
version: 1.3.0
|
110
110
|
- !ruby/object:Gem::Dependency
|
111
111
|
name: rubyzip
|
112
112
|
requirement: !ruby/object:Gem::Requirement
|
@@ -165,7 +165,6 @@ extensions: []
|
|
165
165
|
extra_rdoc_files: []
|
166
166
|
files:
|
167
167
|
- .gitignore
|
168
|
-
- .gitmodules
|
169
168
|
- .rvmrc
|
170
169
|
- Gemfile
|
171
170
|
- Gemfile.lock
|
@@ -216,7 +215,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
216
215
|
requirements:
|
217
216
|
- - ! '>='
|
218
217
|
- !ruby/object:Gem::Version
|
219
|
-
version: 1.9.
|
218
|
+
version: 1.9.3
|
220
219
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
221
220
|
none: false
|
222
221
|
requirements:
|
data/.gitmodules
DELETED