osdb 0.0.2 → 0.0.3
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.
- data.tar.gz.sig +0 -0
- data/Manifest +1 -0
- data/README.md +27 -0
- data/Rakefile +4 -2
- data/bin/getsub +62 -5
- data/lib/osdb/sub.rb +2 -1
- data/osdb.gemspec +5 -5
- data/spec/osdb/server_spec.rb +4 -3
- data/spec/osdb/sub_spec.rb +5 -2
- metadata +8 -4
- metadata.gz.sig +0 -0
data.tar.gz.sig
CHANGED
Binary file
|
data/Manifest
CHANGED
data/README.md
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
# OSDb
|
2
|
+
|
3
|
+
Client library for the [OSDb protocol](http://trac.opensubtitles.org/projects/opensubtitles/wiki/XMLRPC).
|
4
|
+
Currently the implentation is limited to movie identification and subtitles search
|
5
|
+
|
6
|
+
## Examples
|
7
|
+
|
8
|
+
Just read the source of `bin/getsub` it is a typical example of OSDb's capacities.
|
9
|
+
|
10
|
+
## getsub
|
11
|
+
|
12
|
+
The osdb gem provide a simple script to find and download the best subtitle on
|
13
|
+
[opensubtitles.org](http://www.opensubtitles.org/) for your video file.
|
14
|
+
|
15
|
+
### Installation
|
16
|
+
|
17
|
+
$ gem install osdb
|
18
|
+
|
19
|
+
### Usage
|
20
|
+
|
21
|
+
You just have to execute `getsub` with some video files in arguments:
|
22
|
+
|
23
|
+
$ getsub somemovie.avi othermovie.mkv
|
24
|
+
|
25
|
+
For options details just run:
|
26
|
+
|
27
|
+
$ getsub --help
|
data/Rakefile
CHANGED
@@ -10,14 +10,16 @@ end
|
|
10
10
|
begin
|
11
11
|
require 'echoe'
|
12
12
|
|
13
|
-
Echoe.new('osdb', '0.0.
|
13
|
+
Echoe.new('osdb', '0.0.3') do |p|
|
14
14
|
p.description = "Ruby library to access OSDb services like OpenSubtitles.org"
|
15
15
|
p.url = "http://github.com/byroot/ruby-osdb"
|
16
16
|
p.author = "Jean Boussier"
|
17
17
|
p.email = "jean.boussier @nospam@ gmail.com"
|
18
18
|
end
|
19
19
|
|
20
|
-
rescue LoadError
|
20
|
+
rescue LoadError => e
|
21
|
+
puts "Failed to load Echoe"
|
22
|
+
puts e.message
|
21
23
|
end
|
22
24
|
|
23
25
|
task :default => :spec
|
data/bin/getsub
CHANGED
@@ -22,7 +22,8 @@ end
|
|
22
22
|
end
|
23
23
|
|
24
24
|
opts.on("-f", "--force", "Download sub even if video already has one") { @options[:force] = true }
|
25
|
-
end
|
25
|
+
end
|
26
|
+
@parser.parse!
|
26
27
|
|
27
28
|
|
28
29
|
class OSDb::Movie
|
@@ -39,6 +40,56 @@ class OSDb::Movie
|
|
39
40
|
|
40
41
|
end
|
41
42
|
|
43
|
+
def curl_available?
|
44
|
+
%x{ curl --version 2> /dev/null > /dev/null }
|
45
|
+
$?.success?
|
46
|
+
end
|
47
|
+
|
48
|
+
def wget_available?
|
49
|
+
%x{ wget --version 2> /dev/null > /dev/null }
|
50
|
+
$?.success?
|
51
|
+
end
|
52
|
+
|
53
|
+
def download!(url, local_path)
|
54
|
+
puts "* download #{url} to #{local_path}"
|
55
|
+
if curl_available?
|
56
|
+
%x{ curl '#{url}' | gunzip > '#{local_path}' }
|
57
|
+
elsif wget_available?
|
58
|
+
%x{ wget -O - '#{url}' | gunzip > '#{local_path}'}
|
59
|
+
else
|
60
|
+
puts "Can't found any curl or wget please install one of them or manualy download your sub"
|
61
|
+
puts url
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def group_by_movie_name(subs)
|
66
|
+
subs.inject({}) do |hash, sub|
|
67
|
+
hash[sub.movie_name] ||= []
|
68
|
+
hash[sub.movie_name] << sub
|
69
|
+
hash
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
def ask_user_to_identify_movie(movies)
|
74
|
+
puts "D'oh! You stumbled upon a hash conflict, please resolve it:"
|
75
|
+
puts
|
76
|
+
movies.keys.each_with_index do |name, index|
|
77
|
+
puts " #{index} - #{name}"
|
78
|
+
end
|
79
|
+
puts
|
80
|
+
print 'id: '
|
81
|
+
str = STDIN.gets
|
82
|
+
movies[movies.keys[str.to_i]]
|
83
|
+
end
|
84
|
+
|
85
|
+
def select_sub(subs)
|
86
|
+
return subs.first if subs.length == 1
|
87
|
+
movies = group_by_movie_name(subs)
|
88
|
+
return movies.values.first.max(&:rating) if movies.length == 1
|
89
|
+
selected_movie_subs = ask_user_to_identify_movie(movies)
|
90
|
+
selected_movie_subs.max(&:rating)
|
91
|
+
end
|
92
|
+
|
42
93
|
movies = ARGV.map{ |path| OSDb::Movie.new(path) }
|
43
94
|
movies.reject!(&:has_sub?) unless @options[:force]
|
44
95
|
|
@@ -50,15 +101,21 @@ server = OSDb::Server.new(
|
|
50
101
|
)
|
51
102
|
STDOUT.sync = true
|
52
103
|
|
104
|
+
if movies.empty?
|
105
|
+
puts "No file provided"
|
106
|
+
puts @parser.help
|
107
|
+
exit 1
|
108
|
+
end
|
109
|
+
|
53
110
|
movies.each do |movie|
|
54
111
|
puts "* search subs for: #{movie.path}"
|
55
112
|
subs = server.search_subtitles(:moviehash => movie.hash, :moviebytesize => movie.size, :sublanguageid => @options[:language])
|
56
113
|
if subs.any?
|
57
|
-
|
58
|
-
|
59
|
-
|
114
|
+
sub = select_sub(subs)
|
115
|
+
sub_path = movie.sub_path(sub.format)
|
116
|
+
download!(sub.url, sub_path)
|
60
117
|
else
|
61
|
-
puts "no sub found"
|
118
|
+
puts "* no sub found"
|
62
119
|
end
|
63
120
|
puts
|
64
121
|
end
|
data/lib/osdb/sub.rb
CHANGED
@@ -4,13 +4,14 @@ module OSDb
|
|
4
4
|
|
5
5
|
class Sub
|
6
6
|
|
7
|
-
attr_reader :url, :format, :language, :rating, :raw_data
|
7
|
+
attr_reader :url, :format, :language, :rating, :movie_name, :raw_data
|
8
8
|
|
9
9
|
def initialize(data)
|
10
10
|
@url = URI.parse(data['SubDownloadLink'])
|
11
11
|
@format = data['SubFormat']
|
12
12
|
@language = Language.from_iso639_2b(data['SubLanguageID'])
|
13
13
|
@rating = data['SubRating']
|
14
|
+
@movie_name = data['MovieName']
|
14
15
|
@raw_data = data
|
15
16
|
end
|
16
17
|
|
data/osdb.gemspec
CHANGED
@@ -2,20 +2,20 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = %q{osdb}
|
5
|
-
s.version = "0.0.
|
5
|
+
s.version = "0.0.3"
|
6
6
|
|
7
7
|
s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
|
8
8
|
s.authors = ["Jean Boussier"]
|
9
9
|
s.cert_chain = ["/Users/byroot/.ssh/gem-public_cert.pem"]
|
10
|
-
s.date = %q{2010-
|
10
|
+
s.date = %q{2010-10-17}
|
11
11
|
s.default_executable = %q{getsub}
|
12
12
|
s.description = %q{Ruby library to access OSDb services like OpenSubtitles.org}
|
13
13
|
s.email = %q{jean.boussier @nospam@ gmail.com}
|
14
14
|
s.executables = ["getsub"]
|
15
|
-
s.extra_rdoc_files = ["bin/getsub", "lib/osdb.rb", "lib/osdb/language.rb", "lib/osdb/movie.rb", "lib/osdb/server.rb", "lib/osdb/sub.rb"]
|
16
|
-
s.files = ["Manifest", "Rakefile", "bin/getsub", "lib/osdb.rb", "lib/osdb/language.rb", "lib/osdb/movie.rb", "lib/osdb/server.rb", "lib/osdb/sub.rb", "osdb.gemspec", "spec/fixtures/somemovie.avi", "spec/osdb/language_spec.rb", "spec/osdb/movie_spec.rb", "spec/osdb/server_spec.rb", "spec/osdb/sub_spec.rb", "spec/spec_helper.rb"]
|
15
|
+
s.extra_rdoc_files = ["README.md", "bin/getsub", "lib/osdb.rb", "lib/osdb/language.rb", "lib/osdb/movie.rb", "lib/osdb/server.rb", "lib/osdb/sub.rb"]
|
16
|
+
s.files = ["Manifest", "README.md", "Rakefile", "bin/getsub", "lib/osdb.rb", "lib/osdb/language.rb", "lib/osdb/movie.rb", "lib/osdb/server.rb", "lib/osdb/sub.rb", "osdb.gemspec", "spec/fixtures/somemovie.avi", "spec/osdb/language_spec.rb", "spec/osdb/movie_spec.rb", "spec/osdb/server_spec.rb", "spec/osdb/sub_spec.rb", "spec/spec_helper.rb"]
|
17
17
|
s.homepage = %q{http://github.com/byroot/ruby-osdb}
|
18
|
-
s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Osdb"]
|
18
|
+
s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Osdb", "--main", "README.md"]
|
19
19
|
s.require_paths = ["lib"]
|
20
20
|
s.rubyforge_project = %q{osdb}
|
21
21
|
s.rubygems_version = %q{1.3.7}
|
data/spec/osdb/server_spec.rb
CHANGED
@@ -6,7 +6,8 @@ describe OSDb::Server do
|
|
6
6
|
@server = OSDb::Server.new(
|
7
7
|
:host => 'api.opensubtitles.org',
|
8
8
|
:path => '/xml-rpc',
|
9
|
-
:timeout => 60 # OS.org is very very slow ....
|
9
|
+
:timeout => 60, # OS.org is very very slow ....
|
10
|
+
:useragent => 'OS Test User Agent'
|
10
11
|
)
|
11
12
|
end
|
12
13
|
|
@@ -39,14 +40,14 @@ describe OSDb::Server do
|
|
39
40
|
describe "#check_movie_hash" do
|
40
41
|
|
41
42
|
it 'should identify movie' do
|
42
|
-
subject.check_movie_hash(
|
43
|
+
subject.check_movie_hash('37d0c7d0cfcbe280')['data'].should == {
|
43
44
|
"37d0c7d0cfcbe280" => {
|
44
45
|
"MovieYear" => "1996",
|
45
46
|
"MovieImdbID" => "0117500",
|
46
47
|
"MovieName" => "The Rock",
|
47
48
|
"MovieHash" => "37d0c7d0cfcbe280"
|
48
49
|
}
|
49
|
-
}
|
50
|
+
}
|
50
51
|
end
|
51
52
|
|
52
53
|
end
|
data/spec/osdb/sub_spec.rb
CHANGED
@@ -7,7 +7,8 @@ describe OSDb::Sub do
|
|
7
7
|
'SubFormat' => 'srt',
|
8
8
|
'SubDownloadLink' => 'http://example.com/foo.srt.gz',
|
9
9
|
'SubRating' => 7.89,
|
10
|
-
'SubLanguageID' => 'dut'
|
10
|
+
'SubLanguageID' => 'dut',
|
11
|
+
'MovieName' => 'Lock, Stock and Two Smoking Barrels'
|
11
12
|
)
|
12
13
|
end
|
13
14
|
|
@@ -19,4 +20,6 @@ describe OSDb::Sub do
|
|
19
20
|
|
20
21
|
its(:rating) { should == 7.89 }
|
21
22
|
|
22
|
-
|
23
|
+
its(:movie_name) { should == 'Lock, Stock and Two Smoking Barrels' }
|
24
|
+
|
25
|
+
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: osdb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 25
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.0.
|
9
|
+
- 3
|
10
|
+
version: 0.0.3
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Jean Boussier
|
@@ -36,7 +36,7 @@ cert_chain:
|
|
36
36
|
V/TAGOVlGVotOBnewCUdlw==
|
37
37
|
-----END CERTIFICATE-----
|
38
38
|
|
39
|
-
date: 2010-
|
39
|
+
date: 2010-10-17 00:00:00 +02:00
|
40
40
|
default_executable:
|
41
41
|
dependencies: []
|
42
42
|
|
@@ -47,6 +47,7 @@ executables:
|
|
47
47
|
extensions: []
|
48
48
|
|
49
49
|
extra_rdoc_files:
|
50
|
+
- README.md
|
50
51
|
- bin/getsub
|
51
52
|
- lib/osdb.rb
|
52
53
|
- lib/osdb/language.rb
|
@@ -55,6 +56,7 @@ extra_rdoc_files:
|
|
55
56
|
- lib/osdb/sub.rb
|
56
57
|
files:
|
57
58
|
- Manifest
|
59
|
+
- README.md
|
58
60
|
- Rakefile
|
59
61
|
- bin/getsub
|
60
62
|
- lib/osdb.rb
|
@@ -79,6 +81,8 @@ rdoc_options:
|
|
79
81
|
- --inline-source
|
80
82
|
- --title
|
81
83
|
- Osdb
|
84
|
+
- --main
|
85
|
+
- README.md
|
82
86
|
require_paths:
|
83
87
|
- lib
|
84
88
|
required_ruby_version: !ruby/object:Gem::Requirement
|
metadata.gz.sig
CHANGED
Binary file
|