peerflixrb 0.5.0 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +7 -5
- data/bin/peerflixrb +3 -4
- data/lib/peerflixrb.rb +2 -0
- data/lib/peerflixrb/commands.rb +75 -53
- data/lib/peerflixrb/imdb.rb +29 -0
- data/lib/peerflixrb/kat.rb +30 -26
- data/lib/peerflixrb/link.rb +25 -23
- data/lib/peerflixrb/version.rb +1 -1
- data/lib/peerflixrb/yify.rb +48 -0
- data/peerflixrb.gemspec +2 -0
- metadata +31 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7f72fe14a2b2bd54ce3302ac31e79d9a20f2dbc5
|
4
|
+
data.tar.gz: a7f4ed3e378c3b3ca7aaf88565b2e9ccb2eac3fc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7234667bc7be33ab9aab85b7fc961d4dadadbb546795ee0a8c60f8ece60649790201fc28230bcb6a3358d13be10c464b2211d869701d1c3020d19afa7b2a1d90
|
7
|
+
data.tar.gz: 40c64762f88130eb69a4746f4307f3293fd9aebd5889af6480ab932800711f59b4cd4f9f309812483491f2785789e34d5d1ffa7b0f48bca7a175179494a552eb
|
data/README.md
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
# Peerflixrb
|
4
4
|
|
5
|
-
Wrapper for [peerflix](https://github.com/mafintosh/peerflix) with automatic search through [Kickass Torrents](kat.cr) and [Addic7ed](http://www.addic7ed.com/) (with [gem addic7ed](https://github.com/michaelbaudino/addic7ed-ruby)).
|
5
|
+
Wrapper for [peerflix](https://github.com/mafintosh/peerflix) with automatic search through [Kickass Torrents](kat.cr), [YifySubtitles](http://www.yifysubtitles.com/) and [Addic7ed](http://www.addic7ed.com/) (with [gem addic7ed](https://github.com/michaelbaudino/addic7ed-ruby)).
|
6
6
|
|
7
7
|
|
8
8
|
## Requirements
|
@@ -23,16 +23,18 @@ Install the gem:
|
|
23
23
|
Pass a string with what you want to watch and it will search KAT with your query and present you with the first 5 results for you to choose. The file selected will then be sent to **peerflix**.
|
24
24
|
|
25
25
|
$ peerflixrb Suits s05e12
|
26
|
+
$ peerflixrb The Godfather II
|
26
27
|
|
27
28
|
If you prefer to autoplay the first matched result, use the ```-y``` flag:
|
28
29
|
|
29
|
-
$ peerflixrb -y Archer s07e02
|
30
|
+
$ peerflixrb -y Archer s07e02 1080p
|
30
31
|
|
31
|
-
You can play the video with subtitles with the ```-s``` option (Default: English). It will try and find the best match in [Addic7ed](http://www.addic7ed.com/).
|
32
|
+
You can play the video with subtitles with the ```-s``` option (Default: English). It will try and find the best match in [YifySubtitles](http://www.yifysubtitles.com/) if it's a movie and if [Addic7ed](http://www.addic7ed.com/) if it's a TV Show.
|
32
33
|
|
33
|
-
$ peerflixrb -s
|
34
|
+
$ peerflixrb -s Birdman
|
35
|
+
$ peerflixrb -s The Wire s04e05
|
34
36
|
|
35
|
-
Choose the language with ```-l LANGUAGE``` ([Available Languages](https://github.com/michaelbaudino/addic7ed-ruby/blob/master/lib/addic7ed/common.rb))
|
37
|
+
Choose the language with ```-l LANGUAGE``` ([Available Languages](https://github.com/michaelbaudino/addic7ed-ruby/blob/master/lib/addic7ed/common.rb)). Currently only for TV Shows (Choosing movie subtitles language will come soon!)
|
36
38
|
|
37
39
|
$ peerflixrb -sl es-es Breaking Bad s05e03
|
38
40
|
|
data/bin/peerflixrb
CHANGED
@@ -63,12 +63,11 @@ end
|
|
63
63
|
|
64
64
|
# main program
|
65
65
|
begin
|
66
|
-
|
67
|
-
cli = Commands::cli
|
66
|
+
cli = Peerflixrb::Commands::cli
|
68
67
|
|
69
68
|
# KAT Search
|
70
69
|
cli.say "Searching KAT for #{options[:search].blue}".yellow
|
71
|
-
kat_search = KAT.new(options[:search])
|
70
|
+
kat_search = Peerflixrb::KAT.new(options[:search])
|
72
71
|
|
73
72
|
# Did it find results?
|
74
73
|
if not kat_search.results_found
|
@@ -77,7 +76,7 @@ begin
|
|
77
76
|
end
|
78
77
|
|
79
78
|
# Choose link and subtitles
|
80
|
-
link, sub_file = Commands.choose_video_and_subtitles(
|
79
|
+
link, sub_file = Peerflixrb::Commands.choose_video_and_subtitles(kat_search, options)
|
81
80
|
|
82
81
|
# Peerflix command build
|
83
82
|
command = "peerflix '#{link.magnet}'"
|
data/lib/peerflixrb.rb
CHANGED
data/lib/peerflixrb/commands.rb
CHANGED
@@ -1,72 +1,94 @@
|
|
1
1
|
require 'addic7ed'
|
2
2
|
require 'highline'
|
3
3
|
|
4
|
-
module
|
5
|
-
|
6
|
-
|
7
|
-
|
4
|
+
module Peerflixrb
|
5
|
+
module Commands
|
6
|
+
class << self
|
7
|
+
attr_accessor :cli
|
8
|
+
end
|
8
9
|
|
9
|
-
|
10
|
-
|
10
|
+
self.cli = HighLine.new
|
11
|
+
HighLine.colorize_strings
|
11
12
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
13
|
+
def self.select_link(kat_search)
|
14
|
+
cli.choose(*kat_search.links) do |menu|
|
15
|
+
menu.header = 'Choose which file'.yellow
|
16
|
+
menu.default = '1'
|
17
|
+
menu.select_by = :index
|
18
|
+
end
|
17
19
|
end
|
18
|
-
end
|
19
20
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
cli.say 'Episode not found on Addic7ed'.red
|
25
|
-
rescue Addic7ed::ShowNotFound
|
26
|
-
cli.say 'Show not found on Addic7ed'.red
|
27
|
-
rescue Addic7ed::NoSubtitleFound
|
28
|
-
cli.say 'No (acceptable) subtitle has been found on Addic7ed'.red
|
29
|
-
rescue Addic7ed::InvalidFilename
|
30
|
-
cli.say 'Addic7ed gem could not parse the filename correctly'.red
|
31
|
-
end
|
32
|
-
|
33
|
-
def self.choose_video_and_subtitles(options, kat_search)
|
34
|
-
# Proactively declare them because they would be lost in the block scope
|
35
|
-
link = nil
|
36
|
-
sub_file = nil
|
21
|
+
def self.choose_video_and_subtitles(kat_search, options)
|
22
|
+
# Proactively declare them because they would be lost in the block scope
|
23
|
+
link = nil
|
24
|
+
sub_file = nil
|
37
25
|
|
38
|
-
|
39
|
-
|
40
|
-
|
26
|
+
loop do
|
27
|
+
# Choose file
|
28
|
+
link = (options[:auto_select]) ? kat_search.links.first : select_link(kat_search)
|
41
29
|
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
30
|
+
# Subtitle search
|
31
|
+
sub_file = if options[:find_subtitles]
|
32
|
+
cli.say "Searching subtitles for #{link.filename.blue}".yellow
|
33
|
+
find_subtitles(link.filename, options)
|
34
|
+
elsif options[:subtitles]
|
35
|
+
options[:subtitles]
|
36
|
+
end
|
49
37
|
|
50
|
-
|
51
|
-
|
52
|
-
|
38
|
+
# Was there a problem with the subtitle?
|
39
|
+
if options[:find_subtitles] && sub_file.nil?
|
40
|
+
continue = cli.agree "Do you want to continue? #{'[y/n]'.yellow}".green
|
53
41
|
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
42
|
+
unless continue
|
43
|
+
# If :auto_select, exit program
|
44
|
+
# If video chosen, choose video again
|
45
|
+
if options[:auto_select]
|
46
|
+
exit
|
47
|
+
else
|
48
|
+
system 'clear'
|
49
|
+
next
|
50
|
+
end
|
62
51
|
end
|
63
52
|
end
|
53
|
+
|
54
|
+
# If the loop got here then it found subtitles
|
55
|
+
break
|
64
56
|
end
|
65
57
|
|
66
|
-
|
67
|
-
break
|
58
|
+
[link, sub_file]
|
68
59
|
end
|
69
60
|
|
70
|
-
|
61
|
+
# Helper methods (private)
|
62
|
+
def self.find_subtitles(video_file, options)
|
63
|
+
# Imdb search based on initial command input
|
64
|
+
movie = Imdb.find(options[:search])
|
65
|
+
|
66
|
+
if movie
|
67
|
+
# TODO Choose language
|
68
|
+
find_movie_subtitles(movie, 'english')
|
69
|
+
else
|
70
|
+
find_tv_subtitles(video_file, options[:language])
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
def self.find_movie_subtitles(movie, language)
|
75
|
+
sub_file = YifySubtitles.download(movie.imdb_id, language)
|
76
|
+
return sub_file unless sub_file.nil?
|
77
|
+
cli.say "Could not find subtitles for #{movie}".red
|
78
|
+
end
|
79
|
+
|
80
|
+
def self.find_tv_subtitles(video_file, language)
|
81
|
+
# TV Show search based on video filename
|
82
|
+
episode = Addic7ed::Episode.new(video_file)
|
83
|
+
return File.basename episode.download_best_subtitle!(language)
|
84
|
+
rescue Addic7ed::EpisodeNotFound
|
85
|
+
cli.say 'Episode not found on Addic7ed'.red
|
86
|
+
rescue Addic7ed::ShowNotFound
|
87
|
+
cli.say 'Show not found on Addic7ed'.red
|
88
|
+
rescue Addic7ed::NoSubtitleFound
|
89
|
+
cli.say 'No (acceptable) subtitle has been found on Addic7ed'.red
|
90
|
+
rescue Addic7ed::InvalidFilename
|
91
|
+
cli.say 'Addic7ed gem could not parse the filename correctly'.red
|
92
|
+
end
|
71
93
|
end
|
72
94
|
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'httparty'
|
2
|
+
require 'json'
|
3
|
+
|
4
|
+
module Peerflixrb
|
5
|
+
module Imdb
|
6
|
+
def self.find(title)
|
7
|
+
params = { 'json' => '1', 'nr' => 1, 'tt' => 'on', 'q' => title }
|
8
|
+
query = HTTParty.get('http://www.imdb.com/xml/find', query: params)
|
9
|
+
results = JSON.load(query)['title_popular']
|
10
|
+
|
11
|
+
# Return the most popular for that search
|
12
|
+
Movie.new(results.first) if results
|
13
|
+
end
|
14
|
+
|
15
|
+
class Movie
|
16
|
+
attr_accessor :imdb_id, :title, :year
|
17
|
+
|
18
|
+
def initialize(params)
|
19
|
+
@imdb_id = params['id']
|
20
|
+
@title = params['title']
|
21
|
+
@year = params['description'].match(/\A\d+/).to_s
|
22
|
+
end
|
23
|
+
|
24
|
+
def to_s
|
25
|
+
"#{title} (#{year})"
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
data/lib/peerflixrb/kat.rb
CHANGED
@@ -2,39 +2,43 @@ require 'erb'
|
|
2
2
|
require 'nokogiri'
|
3
3
|
require 'yaml'
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
#
|
8
|
-
|
9
|
-
|
5
|
+
module Peerflixrb
|
6
|
+
##
|
7
|
+
# Extract a list of results from your search
|
8
|
+
# KAT.new("Suits s05e16 1080p")
|
9
|
+
class KAT
|
10
|
+
NUMBER_OF_LINKS = 5
|
10
11
|
|
11
|
-
|
12
|
+
attr_accessor :url
|
12
13
|
|
13
|
-
|
14
|
-
|
15
|
-
|
14
|
+
def initialize(search)
|
15
|
+
@url = "https://kat.cr/usearch/#{ERB::Util.url_encode(search)}/"
|
16
|
+
end
|
16
17
|
|
17
|
-
|
18
|
-
|
19
|
-
|
18
|
+
def page
|
19
|
+
@page ||= Nokogiri::HTML(open(@url))
|
20
|
+
end
|
20
21
|
|
21
|
-
|
22
|
-
|
23
|
-
|
22
|
+
def results_found
|
23
|
+
@results_found ||= page.at('p:contains("did not match any documents")').nil?
|
24
|
+
rescue OpenURI::HTTPError
|
25
|
+
@results_found = false
|
26
|
+
end
|
24
27
|
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
+
def links
|
29
|
+
@links ||= generate_links
|
30
|
+
end
|
28
31
|
|
29
|
-
|
32
|
+
private
|
30
33
|
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
34
|
+
def generate_links
|
35
|
+
links = []
|
36
|
+
crawled_links = page.css('.iaconbox > div')
|
37
|
+
crawled_links[0..NUMBER_OF_LINKS - 1].each do |link|
|
38
|
+
links << Link.new(YAML.load(link['data-sc-params']))
|
39
|
+
end
|
37
40
|
|
38
|
-
|
41
|
+
return links
|
42
|
+
end
|
39
43
|
end
|
40
44
|
end
|
data/lib/peerflixrb/link.rb
CHANGED
@@ -1,34 +1,36 @@
|
|
1
1
|
require 'cgi'
|
2
2
|
require 'open-uri'
|
3
3
|
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
4
|
+
module Peerflixrb
|
5
|
+
##
|
6
|
+
# Object that contains the info for a torrent file
|
7
|
+
class Link
|
8
|
+
def initialize(params)
|
9
|
+
@params = params
|
10
|
+
end
|
10
11
|
|
11
|
-
|
12
|
-
|
13
|
-
|
12
|
+
def to_s
|
13
|
+
filename
|
14
|
+
end
|
14
15
|
|
15
|
-
|
16
|
-
|
17
|
-
|
16
|
+
def filename
|
17
|
+
@filename ||= "#{CGI.unescape(@params['name'])}.#{@params['extension']}"
|
18
|
+
end
|
18
19
|
|
19
|
-
|
20
|
-
|
21
|
-
|
20
|
+
def magnet
|
21
|
+
@magnet ||= @params['magnet']
|
22
|
+
end
|
22
23
|
|
23
|
-
|
24
|
-
|
25
|
-
|
24
|
+
def info_hash
|
25
|
+
@info_hash ||= extract_hash
|
26
|
+
end
|
26
27
|
|
27
|
-
|
28
|
+
private
|
28
29
|
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
30
|
+
def extract_hash
|
31
|
+
# Extract magnet properties to a Hash
|
32
|
+
magnet_params = CGI.parse(URI.parse(magnet).query)
|
33
|
+
magnet_params['xt'].first.match(/[0-9A-F]+/).to_s.downcase
|
34
|
+
end
|
33
35
|
end
|
34
36
|
end
|
data/lib/peerflixrb/version.rb
CHANGED
@@ -0,0 +1,48 @@
|
|
1
|
+
require 'httparty'
|
2
|
+
require 'zip'
|
3
|
+
|
4
|
+
module Peerflixrb
|
5
|
+
module YifySubtitles
|
6
|
+
API_URL = 'http://api.yifysubtitles.com/subs/'.freeze
|
7
|
+
BASE_URL = 'http://www.yifysubtitles.com'.freeze
|
8
|
+
|
9
|
+
def self.download(imdb_id, language = 'english')
|
10
|
+
url = get_subtitles_url(imdb_id, language)
|
11
|
+
return if url.nil?
|
12
|
+
|
13
|
+
zip = download_subtitles(url)
|
14
|
+
extract_zip(zip)
|
15
|
+
end
|
16
|
+
|
17
|
+
# Helper methods (private)
|
18
|
+
def self.get_subtitles_url(imdb_id, language)
|
19
|
+
results = HTTParty.get(API_URL + imdb_id)
|
20
|
+
|
21
|
+
if results['success'] && results['subtitles'] > 0
|
22
|
+
BASE_URL + results['subs'][imdb_id][language][0]['url']
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.download_subtitles(url)
|
27
|
+
HTTParty.get(url).body
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.extract_zip(zip_body)
|
31
|
+
sub_file = nil
|
32
|
+
|
33
|
+
Zip::InputStream.open(StringIO.new(zip_body)) do |io|
|
34
|
+
while (entry = io.get_next_entry)
|
35
|
+
# Don't extract if not a subtitle file
|
36
|
+
next unless entry.name =~ /\.(srt|sub|ass)\z/
|
37
|
+
|
38
|
+
sub_file = entry.name
|
39
|
+
open(sub_file, 'w') do |f|
|
40
|
+
f << io.read
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
sub_file
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
data/peerflixrb.gemspec
CHANGED
@@ -22,6 +22,8 @@ Gem::Specification.new do |spec|
|
|
22
22
|
spec.add_runtime_dependency 'nokogiri', '~> 1.6'
|
23
23
|
spec.add_runtime_dependency 'addic7ed', '~> 2.0'
|
24
24
|
spec.add_runtime_dependency 'highline', '~> 1.7'
|
25
|
+
spec.add_runtime_dependency 'httparty', '~> 0.13'
|
26
|
+
spec.add_runtime_dependency 'rubyzip', '~> 1.2'
|
25
27
|
|
26
28
|
spec.add_development_dependency 'bundler', '~> 1.11'
|
27
29
|
spec.add_development_dependency 'rake', '~> 10.0'
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: peerflixrb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- David Marchante
|
@@ -52,6 +52,34 @@ dependencies:
|
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '1.7'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: httparty
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0.13'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0.13'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: rubyzip
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '1.2'
|
76
|
+
type: :runtime
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '1.2'
|
55
83
|
- !ruby/object:Gem::Dependency
|
56
84
|
name: bundler
|
57
85
|
requirement: !ruby/object:Gem::Requirement
|
@@ -183,9 +211,11 @@ files:
|
|
183
211
|
- bin/peerflixrb
|
184
212
|
- lib/peerflixrb.rb
|
185
213
|
- lib/peerflixrb/commands.rb
|
214
|
+
- lib/peerflixrb/imdb.rb
|
186
215
|
- lib/peerflixrb/kat.rb
|
187
216
|
- lib/peerflixrb/link.rb
|
188
217
|
- lib/peerflixrb/version.rb
|
218
|
+
- lib/peerflixrb/yify.rb
|
189
219
|
- peerflixrb.gemspec
|
190
220
|
homepage: https://github.com/iovis9/peerflixrb
|
191
221
|
licenses:
|