peerflixrb 0.5.0 → 1.0.0
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.
- 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:
|