osdb 0.0.1
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 +3 -0
- data/Manifest +10 -0
- data/Rakefile +23 -0
- data/lib/osdb.rb +8 -0
- data/lib/osdb/movie.rb +45 -0
- data/lib/osdb/server.rb +48 -0
- data/lib/osdb/sub.rb +4 -0
- data/osdb.gemspec +32 -0
- data/spec/fixtures/somemovie.avi +0 -0
- data/spec/osdb/movie_spec.rb +11 -0
- data/spec/osdb/server_spec.rb +78 -0
- data/spec/spec_helper.rb +7 -0
- metadata +100 -0
- metadata.gz.sig +0 -0
data.tar.gz.sig
ADDED
data/Manifest
ADDED
data/Rakefile
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rake'
|
3
|
+
require 'spec/rake/spectask'
|
4
|
+
|
5
|
+
Spec::Rake::SpecTask.new(:spec) do |spec|
|
6
|
+
spec.libs << 'lib' << 'spec'
|
7
|
+
spec.spec_files = FileList['spec/**/*_spec.rb']
|
8
|
+
end
|
9
|
+
|
10
|
+
begin
|
11
|
+
require 'echoe'
|
12
|
+
|
13
|
+
Echoe.new('osdb', '0.0.1') do |p|
|
14
|
+
p.description = "Ruby library to access OSDb services like OpenSubtitles.org"
|
15
|
+
p.url = "http://github.com/byroot/ruby-osdb"
|
16
|
+
p.author = "Jean Boussier"
|
17
|
+
p.email = "jean.boussier @nospam@ gmail.com"
|
18
|
+
end
|
19
|
+
|
20
|
+
rescue LoadError
|
21
|
+
end
|
22
|
+
|
23
|
+
task :default => :spec
|
data/lib/osdb.rb
ADDED
data/lib/osdb/movie.rb
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
module OSDb
|
2
|
+
class Movie
|
3
|
+
|
4
|
+
attr_reader :path
|
5
|
+
|
6
|
+
def initialize(path)
|
7
|
+
@path = path
|
8
|
+
end
|
9
|
+
|
10
|
+
def hash
|
11
|
+
@hash ||= self.class.compute_hash(path)
|
12
|
+
end
|
13
|
+
|
14
|
+
def size
|
15
|
+
@size ||= File.size(path)
|
16
|
+
end
|
17
|
+
|
18
|
+
CHUNK_SIZE = 64 * 1024 # in bytes
|
19
|
+
|
20
|
+
# from http://trac.opensubtitles.org/projects/opensubtitles/wiki/HashSourceCodes
|
21
|
+
def self.compute_hash(path)
|
22
|
+
filesize = File.size(path)
|
23
|
+
hash = filesize
|
24
|
+
|
25
|
+
# Read 64 kbytes, divide up into 64 bits and add each
|
26
|
+
# to hash. Do for beginning and end of file.
|
27
|
+
File.open(path, 'rb') do |f|
|
28
|
+
# Q = unsigned long long = 64 bit
|
29
|
+
f.read(CHUNK_SIZE).unpack("Q*").each do |n|
|
30
|
+
hash = hash + n & 0xffffffffffffffff # to remain as 64 bit number
|
31
|
+
end
|
32
|
+
|
33
|
+
f.seek([0, filesize - CHUNK_SIZE].max, IO::SEEK_SET)
|
34
|
+
|
35
|
+
# And again for the end of the file
|
36
|
+
f.read(CHUNK_SIZE).unpack("Q*").each do |n|
|
37
|
+
hash = hash + n & 0xffffffffffffffff
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
sprintf("%016x", hash)
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
45
|
+
end
|
data/lib/osdb/server.rb
ADDED
@@ -0,0 +1,48 @@
|
|
1
|
+
module OSDb
|
2
|
+
|
3
|
+
class LoginFailed < ::Exception
|
4
|
+
end
|
5
|
+
|
6
|
+
class Server
|
7
|
+
|
8
|
+
attr_reader :username, :password, :language, :useragent, :client
|
9
|
+
|
10
|
+
def initialize(options={})
|
11
|
+
@username = options[:username] || ''
|
12
|
+
@password = options[:password] || ''
|
13
|
+
@language = options[:language] || 'en'
|
14
|
+
@useragent = options[:useragent] || 'ruby-osdb v0.1'
|
15
|
+
@client = ::XMLRPC::Client.new(*options.values_at(:host, :path, :port, :proxy_host, :proxy_port, :http_user, :http_password, :use_ssl, :timeout))
|
16
|
+
end
|
17
|
+
|
18
|
+
def token
|
19
|
+
@token ||= login
|
20
|
+
end
|
21
|
+
|
22
|
+
def login
|
23
|
+
response = client.call('LogIn', username, password, language, useragent)
|
24
|
+
if response['status'] != '200 OK'
|
25
|
+
raise LoginFailed.new("Failed to login with #{username} : #{password}. Server return code: #{response['status']}")
|
26
|
+
end
|
27
|
+
response['token']
|
28
|
+
end
|
29
|
+
|
30
|
+
def logout
|
31
|
+
client.call('LogOut', token)
|
32
|
+
@token = nil
|
33
|
+
end
|
34
|
+
|
35
|
+
def check_movie_hash(*hashes)
|
36
|
+
client.call('CheckMovieHash', token, hashes)
|
37
|
+
end
|
38
|
+
|
39
|
+
def search_subtitles(*queries)
|
40
|
+
client.call('SearchSubtitles', token, queries)
|
41
|
+
end
|
42
|
+
|
43
|
+
def info
|
44
|
+
client.call('ServerInfo')
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
48
|
+
end
|
data/lib/osdb/sub.rb
ADDED
data/osdb.gemspec
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
Gem::Specification.new do |s|
|
4
|
+
s.name = %q{osdb}
|
5
|
+
s.version = "0.0.1"
|
6
|
+
|
7
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
|
8
|
+
s.authors = ["Jean Boussier"]
|
9
|
+
s.cert_chain = ["/Users/byroot/.ssh/gem-public_cert.pem"]
|
10
|
+
s.date = %q{2010-08-29}
|
11
|
+
s.description = %q{Ruby library to access OSDb services like OpenSubtitles.org}
|
12
|
+
s.email = %q{jean.boussier @nospam@ gmail.com}
|
13
|
+
s.extra_rdoc_files = ["lib/osdb.rb", "lib/osdb/movie.rb", "lib/osdb/server.rb", "lib/osdb/sub.rb"]
|
14
|
+
s.files = ["Manifest", "Rakefile", "lib/osdb.rb", "lib/osdb/movie.rb", "lib/osdb/server.rb", "lib/osdb/sub.rb", "spec/fixtures/somemovie.avi", "spec/osdb/movie_spec.rb", "spec/osdb/server_spec.rb", "spec/spec_helper.rb", "osdb.gemspec"]
|
15
|
+
s.homepage = %q{http://github.com/byroot/ruby-osdb}
|
16
|
+
s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Osdb"]
|
17
|
+
s.require_paths = ["lib"]
|
18
|
+
s.rubyforge_project = %q{osdb}
|
19
|
+
s.rubygems_version = %q{1.3.6}
|
20
|
+
s.signing_key = %q{/Users/byroot/.ssh/gem-private_key.pem}
|
21
|
+
s.summary = %q{Ruby library to access OSDb services like OpenSubtitles.org}
|
22
|
+
|
23
|
+
if s.respond_to? :specification_version then
|
24
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
25
|
+
s.specification_version = 3
|
26
|
+
|
27
|
+
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
28
|
+
else
|
29
|
+
end
|
30
|
+
else
|
31
|
+
end
|
32
|
+
end
|
Binary file
|
@@ -0,0 +1,78 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
2
|
+
|
3
|
+
describe OSDb::Server do
|
4
|
+
|
5
|
+
before :all do
|
6
|
+
@server = OSDb::Server.new(
|
7
|
+
:host => 'api.opensubtitles.org',
|
8
|
+
:path => '/xml-rpc',
|
9
|
+
:timeout => 60 # OS.org is very very slow ....
|
10
|
+
)
|
11
|
+
end
|
12
|
+
|
13
|
+
subject { @server }
|
14
|
+
|
15
|
+
it 'should respond to #info' do
|
16
|
+
hash_including(
|
17
|
+
"seconds" => instance_of(Float),
|
18
|
+
"last_update_strings" => instance_of(Hash),
|
19
|
+
"website_url"=>"http://www.opensubtitles.org",
|
20
|
+
"contact"=>"admin@opensubtitles.org",
|
21
|
+
"application"=>"OpenSuber v0.2",
|
22
|
+
"xmlrpc_version"=>"0.1",
|
23
|
+
"xmlrpc_url"=>"http://api.opensubtitles.net/xml-rpc"
|
24
|
+
).should == subject.info
|
25
|
+
end
|
26
|
+
|
27
|
+
it 'should automatically call #login when token is needed' do
|
28
|
+
subject.instance_variable_get('@token').should be_nil
|
29
|
+
subject.token.should match(/[a-z0-9]{26}/)
|
30
|
+
subject.instance_variable_get('@token').should == subject.token
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'should clear @login after #logout' do
|
34
|
+
expect{
|
35
|
+
subject.logout
|
36
|
+
}.to change{ subject.instance_variable_get('@token') }.from(instance_of(String)).to(nil)
|
37
|
+
end
|
38
|
+
|
39
|
+
describe "#check_movie_hash" do
|
40
|
+
|
41
|
+
it 'should identify movie' do
|
42
|
+
subject.check_movie_hash(:moviehash => '37d0c7d0cfcbe280')['data'].should == [{
|
43
|
+
"37d0c7d0cfcbe280" => {
|
44
|
+
"MovieYear" => "1996",
|
45
|
+
"MovieImdbID" => "0117500",
|
46
|
+
"MovieName" => "The Rock",
|
47
|
+
"MovieHash" => "37d0c7d0cfcbe280"
|
48
|
+
}
|
49
|
+
}]
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
53
|
+
|
54
|
+
describe '#search_subtitles' do
|
55
|
+
|
56
|
+
it 'can search by hash and size' do
|
57
|
+
subs = subject.search_subtitles(:moviehash => 'bd71526264fd8bd9', :moviebytesize => '183406990', :sublanguageid => 'fre')['data']
|
58
|
+
subs.should be_a(Array)
|
59
|
+
subs.length.should >= 2
|
60
|
+
subs.each do |sub|
|
61
|
+
sub['LanguageName'].should == 'French'
|
62
|
+
sub['MovieName'].should == '"How I Met Your Mother"'
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
it 'can search by imdbid' do
|
67
|
+
subs = subject.search_subtitles(:imdbid => "0117500", :sublanguageid => 'fre')['data']
|
68
|
+
subs.should be_a(Array)
|
69
|
+
subs.length.should >= 1
|
70
|
+
subs.each do |sub|
|
71
|
+
sub['LanguageName'].should == 'French'
|
72
|
+
sub['MovieName'].should == 'The Rock'
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
end
|
77
|
+
|
78
|
+
end
|
data/spec/spec_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,100 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: osdb
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 0
|
7
|
+
- 0
|
8
|
+
- 1
|
9
|
+
version: 0.0.1
|
10
|
+
platform: ruby
|
11
|
+
authors:
|
12
|
+
- Jean Boussier
|
13
|
+
autorequire:
|
14
|
+
bindir: bin
|
15
|
+
cert_chain:
|
16
|
+
- |
|
17
|
+
-----BEGIN CERTIFICATE-----
|
18
|
+
MIIDPDCCAiSgAwIBAgIBADANBgkqhkiG9w0BAQUFADBEMRYwFAYDVQQDDA1qZWFu
|
19
|
+
LmJvdXNzaWVyMRUwEwYKCZImiZPyLGQBGRYFZ21haWwxEzARBgoJkiaJk/IsZAEZ
|
20
|
+
FgNjb20wHhcNMTAwODI5MTExMDIxWhcNMTEwODI5MTExMDIxWjBEMRYwFAYDVQQD
|
21
|
+
DA1qZWFuLmJvdXNzaWVyMRUwEwYKCZImiZPyLGQBGRYFZ21haWwxEzARBgoJkiaJ
|
22
|
+
k/IsZAEZFgNjb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDN2njY
|
23
|
+
b6NqJSE95vA4hrfh8yWP+O9M9V93prYsk2I+TdANS5WUnSCmrh/hp5I/E91A/MS3
|
24
|
+
m9OWCLYVWvk+4VyagZjfrCfAC8KDgeGJIb12qWnGTu74EPXnKfQe4v4C23VPfyRC
|
25
|
+
5a4gYO7zYohnHhzXHHqwJM+yh/igC/t7tJn4YUK38zmj+PhvIIepDuiE35Ne27G9
|
26
|
+
jqQkXyiAen4qUcNRpX5rRYu6k/9yGmmH9xo5PgGbDaWsgg/HN15BQwqzfJSUrfq0
|
27
|
+
wdnuEwVXAulPP/o3WPnEYluUAxWRj3qzuUxB96MWx/37Tc1mou673F6MV94J6M7S
|
28
|
+
hoSqPUt/yAJMt3HTAgMBAAGjOTA3MAkGA1UdEwQCMAAwCwYDVR0PBAQDAgSwMB0G
|
29
|
+
A1UdDgQWBBSCtLBNhbd1+jrnuT7oUOoceKKGejANBgkqhkiG9w0BAQUFAAOCAQEA
|
30
|
+
FULotPT8gpQ8qM4BwycqqQNDfz4ZPZLiGPKqpGfNOWcPT7KU2asjNKr5HX1BC2iX
|
31
|
+
3M7Tedz8NAyJ9CRftwZ/vLaA32ZQSQqEBt94ExYYACFYcfKIQvwo7nNN7eNxkooh
|
32
|
+
j1wVwmjwouf8ymN9nYqw/2Pxq5atoswAIGuqzfUy3y65n+fnqhqaoiBmwopsmZtC
|
33
|
+
6HQejy3tLMLukAwJXWkDu6p3YZerOVDRVk4TYJrVy0wlYeDt6/jjQrEeG8+74ErU
|
34
|
+
rTLJCndudLnbKo5OeTlwapRqL2NxHRw2No8VtsZhvh+1CNY+fe1SMxY8wJctymkf
|
35
|
+
V/TAGOVlGVotOBnewCUdlw==
|
36
|
+
-----END CERTIFICATE-----
|
37
|
+
|
38
|
+
date: 2010-08-29 00:00:00 +02:00
|
39
|
+
default_executable:
|
40
|
+
dependencies: []
|
41
|
+
|
42
|
+
description: Ruby library to access OSDb services like OpenSubtitles.org
|
43
|
+
email: jean.boussier @nospam@ gmail.com
|
44
|
+
executables: []
|
45
|
+
|
46
|
+
extensions: []
|
47
|
+
|
48
|
+
extra_rdoc_files:
|
49
|
+
- lib/osdb.rb
|
50
|
+
- lib/osdb/movie.rb
|
51
|
+
- lib/osdb/server.rb
|
52
|
+
- lib/osdb/sub.rb
|
53
|
+
files:
|
54
|
+
- Manifest
|
55
|
+
- Rakefile
|
56
|
+
- lib/osdb.rb
|
57
|
+
- lib/osdb/movie.rb
|
58
|
+
- lib/osdb/server.rb
|
59
|
+
- lib/osdb/sub.rb
|
60
|
+
- spec/fixtures/somemovie.avi
|
61
|
+
- spec/osdb/movie_spec.rb
|
62
|
+
- spec/osdb/server_spec.rb
|
63
|
+
- spec/spec_helper.rb
|
64
|
+
- osdb.gemspec
|
65
|
+
has_rdoc: true
|
66
|
+
homepage: http://github.com/byroot/ruby-osdb
|
67
|
+
licenses: []
|
68
|
+
|
69
|
+
post_install_message:
|
70
|
+
rdoc_options:
|
71
|
+
- --line-numbers
|
72
|
+
- --inline-source
|
73
|
+
- --title
|
74
|
+
- Osdb
|
75
|
+
require_paths:
|
76
|
+
- lib
|
77
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
78
|
+
requirements:
|
79
|
+
- - ">="
|
80
|
+
- !ruby/object:Gem::Version
|
81
|
+
segments:
|
82
|
+
- 0
|
83
|
+
version: "0"
|
84
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
85
|
+
requirements:
|
86
|
+
- - ">="
|
87
|
+
- !ruby/object:Gem::Version
|
88
|
+
segments:
|
89
|
+
- 1
|
90
|
+
- 2
|
91
|
+
version: "1.2"
|
92
|
+
requirements: []
|
93
|
+
|
94
|
+
rubyforge_project: osdb
|
95
|
+
rubygems_version: 1.3.6
|
96
|
+
signing_key:
|
97
|
+
specification_version: 3
|
98
|
+
summary: Ruby library to access OSDb services like OpenSubtitles.org
|
99
|
+
test_files: []
|
100
|
+
|
metadata.gz.sig
ADDED
Binary file
|