subfinder 0.0.2.4 → 0.0.2.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.circleci/config.yml +3 -2
- data/.gitignore +2 -0
- data/Gemfile +3 -1
- data/Gemfile.lock +1 -2
- data/README.md +7 -52
- data/Rakefile +2 -0
- data/bin/console +1 -0
- data/bin/subfinder +2 -0
- data/lib/subfinder.rb +4 -0
- data/lib/subfinder/config.rb +6 -1
- data/lib/subfinder/dryrun.rb +52 -0
- data/lib/subfinder/logger.rb +4 -1
- data/lib/subfinder/main.rb +6 -3
- data/lib/subfinder/parser/args.rb +14 -8
- data/lib/subfinder/parser/download.rb +7 -6
- data/lib/subfinder/parser/files.rb +18 -7
- data/lib/subfinder/parser/subscene.rb +11 -3
- data/lib/subfinder/subtitle.rb +16 -12
- data/lib/subfinder/version.rb +3 -1
- data/subfinder.gemspec +10 -8
- metadata +19 -38
- data/.travis.yml +0 -7
- data/fixtures/vcr_cassettes/download_subtitle.yml +0 -5071
- data/fixtures/vcr_cassettes/integration_test.yml +0 -1537
- data/fixtures/vcr_cassettes/wrong_download_url.yml +0 -112
- data/movies_list_creator.rb +0 -23
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5b5c0c954cb1ef5d74e2de7e5112290116330a58264932c14f4dd55ffcf34bd0
|
4
|
+
data.tar.gz: 1ff9be3de677d9060d027823525bb4d06d80a40e070629fe32f374b6baf05bbe
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ecdab554e2d3c5f0bcbb36b41fbbb51dff9d047084f0d82a0332591b77d6a9996716643db6d6f76443e83e194594853cee95ec1b05c6a6c2013dcd2e4032bac3
|
7
|
+
data.tar.gz: 1ebe24da29c9b1628e124ddb9cbbb66a5af5bdb0ae2732220d22d1ad16f487e10a201080dd678b99cefd4aa86f73a48e1ef2eaf1ce6099d6a4573372b0bce8ea
|
data/.circleci/config.yml
CHANGED
@@ -35,7 +35,8 @@ jobs:
|
|
35
35
|
- run:
|
36
36
|
name: install dependencies
|
37
37
|
command: |
|
38
|
-
bundle install --jobs=4 --retry=3 --path vendor/bundle
|
38
|
+
#bundle install --jobs=4 --retry=3 --path vendor/bundle
|
39
|
+
bundle install --jobs=4 --retry=3
|
39
40
|
|
40
41
|
- save_cache:
|
41
42
|
paths:
|
@@ -51,7 +52,7 @@ jobs:
|
|
51
52
|
name: run tests
|
52
53
|
command: |
|
53
54
|
mkdir /tmp/test-results
|
54
|
-
rake test
|
55
|
+
rake test --trace
|
55
56
|
|
56
57
|
# collect reports
|
57
58
|
- store_test_results:
|
data/.gitignore
CHANGED
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
subfinder (0.0.2.
|
4
|
+
subfinder (0.0.2.4)
|
5
5
|
bundler (~> 2.0.1)
|
6
6
|
colorize (~> 0.8)
|
7
7
|
nokogiri (~> 1.10.1)
|
@@ -54,7 +54,6 @@ PLATFORMS
|
|
54
54
|
ruby
|
55
55
|
|
56
56
|
DEPENDENCIES
|
57
|
-
colorize (~> 0.8)
|
58
57
|
minitest (~> 5.0)
|
59
58
|
subfinder!
|
60
59
|
test-unit (~> 3.1.8)
|
data/README.md
CHANGED
@@ -10,26 +10,19 @@ You have a TV series without subtitles. Open the terminal, go to the folder wher
|
|
10
10
|
|
11
11
|
It works fine with the video file names which followed `S01E01` naming format.
|
12
12
|
|
13
|
-
## Installation
|
14
13
|
|
15
|
-
|
14
|
+
## Installation
|
16
15
|
|
17
16
|
First you need to have `Ruby` and `Gem` on your machine.
|
18
17
|
|
19
|
-
|
20
|
-
|
21
18
|
Then simply run:
|
22
19
|
|
23
|
-
|
24
|
-
|
25
20
|
`$ gem install subfinder`
|
26
21
|
|
27
22
|
Without any switches, this will unzip all zipped or compressed files and find/rename them to correspondent video file. Also you can provide the URL for `subscene.com` list page with `-u` and it would download the correct file and do the rest.
|
28
23
|
|
29
|
-
## Usage
|
30
|
-
|
31
24
|
|
32
|
-
|
25
|
+
## Usage
|
33
26
|
|
34
27
|
`$ subfinder -u https://subscene.com/subtitles/the-kominsky-method -l fa`
|
35
28
|
|
@@ -37,69 +30,31 @@ Without any switches, this will unzip all zipped or compressed files and find/re
|
|
37
30
|
|
38
31
|
- Use `-u` or `--url` to specify a URL page of a TV series on `subscene.com` website.
|
39
32
|
|
40
|
-
-
|
33
|
+
- Run `subfinder --dryrun` to create set of mock files on you current directory and running Subfinder.
|
41
34
|
|
42
|
-
|
35
|
+
- Also see `sunfinder -h` for help
|
43
36
|
|
44
37
|
|
38
|
+
|
45
39
|
## Development
|
46
40
|
|
47
41
|
* Please report any broken thing using Github issues *
|
48
42
|
|
49
43
|
To run tests, run `rake test`.
|
50
44
|
|
51
|
-
|
52
|
-
To see all logs, run with `-d` or `--degub`
|
53
|
-
|
45
|
+
To see all logs, run with `-d` or `--degub`
|
54
46
|
|
55
47
|
Clone the project. Make changes and then `rake build` inside the project folder to create Gem.
|
56
48
|
|
57
49
|
Then `gem install pkg/subfinder-0.0.1.gem` to install it locally.
|
58
50
|
|
59
|
-
Create a temp folder and run `movies_list_creator.rb` inside that folder. It will create fake files.
|
60
|
-
|
61
|
-
|
62
|
-
|
63
51
|
|
64
52
|
## License
|
65
53
|
|
66
|
-
|
67
|
-
|
68
54
|
The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
|
69
55
|
|
70
|
-
|
71
|
-
|
72
56
|
|
73
57
|
# TODO
|
74
58
|
|
75
|
-
-
|
76
|
-
|
77
|
-
- [x] extract all files
|
78
|
-
|
79
|
-
- [x] list all files
|
80
|
-
|
81
|
-
- [x] match srt for each video file
|
82
|
-
|
83
|
-
- [x] rename all matches
|
84
|
-
|
85
|
-
- [x] move all other files to extract folder
|
86
|
-
|
87
|
-
- [x] if not available then find it online test
|
88
|
-
|
89
|
-
- [x] if not available then find it online code
|
90
|
-
|
91
|
-
- [x] if language sub is not available then find English
|
92
|
-
|
93
|
-
- [x] download match subtitle
|
94
|
-
|
95
|
-
- [x] check for internet connectivity or issue for accessing blocked websites
|
96
|
-
|
97
|
-
- [ ] add all language codes
|
98
|
-
|
99
|
-
- [ ] move all other files from sub folders to main folder when extracting
|
100
|
-
|
101
|
-
- [ ] add messages for timeout on web browsing
|
102
|
-
|
103
|
-
- [ ] save user entered config for later use
|
59
|
+
- Add all language codes
|
104
60
|
|
105
|
-
- [ ] Writing article about it (VCR)
|
data/Rakefile
CHANGED
data/bin/console
CHANGED
data/bin/subfinder
CHANGED
data/lib/subfinder.rb
CHANGED
@@ -1,14 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'json'
|
2
4
|
require 'colorize'
|
3
5
|
require 'logger'
|
4
6
|
require 'optparse'
|
5
7
|
require 'zip'
|
8
|
+
require 'rest-client'
|
6
9
|
|
7
10
|
require_relative 'subfinder/version'
|
8
11
|
require_relative 'subfinder/subtitle'
|
9
12
|
require_relative 'subfinder/config'
|
10
13
|
require_relative 'subfinder/main'
|
11
14
|
require_relative 'subfinder/logger'
|
15
|
+
require_relative 'subfinder/dryrun'
|
12
16
|
|
13
17
|
require_relative 'subfinder/parser/args'
|
14
18
|
require_relative 'subfinder/parser/files'
|
data/lib/subfinder/config.rb
CHANGED
@@ -1,8 +1,13 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Subfinder
|
4
|
+
# Configuration for different running modes
|
2
5
|
class Config
|
3
6
|
@video_formats = %w[.avi .mp4 .mkv]
|
4
7
|
class << self
|
5
|
-
attr_accessor :subtitles, :language, :url,
|
8
|
+
attr_accessor :subtitles, :language, :url,
|
9
|
+
:working_dir, :video_formats, :debug,
|
10
|
+
:quiet
|
6
11
|
end
|
7
12
|
end
|
8
13
|
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Subfinder
|
4
|
+
# Would create a folder, create fake files and run Subfinder
|
5
|
+
class Dryrun
|
6
|
+
class << self
|
7
|
+
def enable
|
8
|
+
Logger.info 'Runnign in Dryrun mode.'
|
9
|
+
dryrun_dir = Dir.pwd + '/dryrun_test_directory'
|
10
|
+
Dir.mkdir(dryrun_dir)
|
11
|
+
Config.working_dir = dryrun_dir
|
12
|
+
create_mock_files_in dryrun_dir
|
13
|
+
end
|
14
|
+
|
15
|
+
def mock_list_file
|
16
|
+
# files with different subtitle file names
|
17
|
+
files = video_subtitle_pairs
|
18
|
+
|
19
|
+
# Files with space in their names
|
20
|
+
files += ['The Mechanism S01E06 - The Silkworm pt1 x264 RB58.mp4',
|
21
|
+
'The Mechanism S01E06.pilot.720p BluRay BRRip 480p'\
|
22
|
+
' BoB-edited version.srt']
|
23
|
+
|
24
|
+
# Dingle file without subtutles
|
25
|
+
files + %w[The.Mechanism.S02E03.1080p.HDTV.x264.mp4]
|
26
|
+
end
|
27
|
+
|
28
|
+
def video_subtitle_pairs
|
29
|
+
%w(
|
30
|
+
Mechanism.The.S01E01.1080p.5.1Ch.BluRay.ReEnc-DeeJayAhmed.mkv
|
31
|
+
The.Mechanism.S01E02.HDTV.x264-SVA[eztv].mkv
|
32
|
+
The.Mechanism.S01E03.1080p.HDTV.x264.mp4
|
33
|
+
The.Mechanism.S01E04.720p.WEB-DL.DibaMoviez.mkv
|
34
|
+
Agatha.Christies.Poirot.S13E02.1080p.BluRay.x264.mkv
|
35
|
+
The.Mechanism.S01E01.WEB-DL.srt
|
36
|
+
The.Mechanism.S01E02.HDTV.x264-SVA.srt
|
37
|
+
The.Mechanism.S01E03.720p.HDTV.x264-IMMERSE.srt
|
38
|
+
The.Mechanism.S01E04.HDTV.x264.KILLERS.HI.srx.srt
|
39
|
+
The.Mechanism.S01E05.720p.WEB.H264-MEMENTO.srt
|
40
|
+
)
|
41
|
+
end
|
42
|
+
|
43
|
+
def create_mock_files_in(folder)
|
44
|
+
mock_list_file.each do |file_name|
|
45
|
+
File.open(folder + '/' + file_name, 'w') do |f|
|
46
|
+
f.write('this is sample file')
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
data/lib/subfinder/logger.rb
CHANGED
@@ -1,4 +1,7 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Subfinder
|
4
|
+
# Logger class, shoud initiate at the start of the program
|
2
5
|
class Logger < ::Logger
|
3
6
|
class << self
|
4
7
|
def setting
|
@@ -11,7 +14,7 @@ module Subfinder
|
|
11
14
|
end
|
12
15
|
|
13
16
|
def info(str)
|
14
|
-
@logger.info(str)
|
17
|
+
@logger.info(str) unless Config.quiet
|
15
18
|
end
|
16
19
|
|
17
20
|
def debug(str)
|
data/lib/subfinder/main.rb
CHANGED
@@ -1,10 +1,13 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Subfinder
|
4
|
+
# Initialize config and then search and match subtitles
|
2
5
|
class Main
|
3
6
|
class << self
|
4
7
|
def run(args)
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
+
Logger.setting
|
9
|
+
Parser::Args.new args
|
10
|
+
Subtitle.new.match
|
8
11
|
end
|
9
12
|
end
|
10
13
|
end
|
@@ -1,10 +1,13 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Subfinder
|
2
4
|
module Parser
|
3
5
|
class Args
|
6
|
+
# Initialze and parse input args
|
4
7
|
def initialize(args)
|
5
8
|
@args = args
|
6
9
|
parse_args
|
7
|
-
|
10
|
+
set_default_values
|
8
11
|
end
|
9
12
|
|
10
13
|
def parse_args
|
@@ -12,27 +15,30 @@ module Subfinder
|
|
12
15
|
opts.banner = usage_msg
|
13
16
|
opts.separator ''
|
14
17
|
opts.separator 'options:'
|
15
|
-
opts.on('-u', '--url url', 'Set
|
18
|
+
opts.on('-u', '--url url', 'Set Subscene url page') { |url| Config.url = url }
|
16
19
|
opts.on('-l', '--language language', 'Set subtitle language') { |language| Config.language = language }
|
17
|
-
opts.on('-v', '--version', 'Show the
|
18
|
-
opts.on('-h', '--help', '
|
19
|
-
opts.on('-d', '--debug', 'debug') { Config.debug = true }
|
20
|
+
opts.on('-v', '--version', 'Show the Subfinder version') { puts("Subfinder #{Subfinder::VERSION}"); exit }
|
21
|
+
opts.on('-h', '--help', 'You used it just now') { puts(opts); exit }
|
22
|
+
opts.on('-d', '--debug', 'Run in debug mode') { Config.debug = true }
|
23
|
+
opts.on('-q', '--quiet', 'Display no message') { Config.quiet = true }
|
24
|
+
opts.on('--dryrun', 'Test application on mock files') { Subfinder::Dryrun.enable }
|
20
25
|
|
21
26
|
opts.parse!(@args)
|
22
27
|
end
|
23
28
|
|
24
29
|
private
|
25
30
|
|
26
|
-
def
|
31
|
+
def set_default_values
|
32
|
+
# Set English as a default value for subtitle language if not provided
|
27
33
|
Config.language ||= 'en'
|
28
|
-
Config.working_dir
|
34
|
+
Config.working_dir ||= Dir.pwd
|
29
35
|
end
|
30
36
|
|
31
37
|
def usage_msg
|
32
38
|
usage = '
|
33
39
|
Usage:
|
34
40
|
subfinder [options]
|
35
|
-
See https://github.com/sizief/subfinder for more information.
|
41
|
+
See https://github.com/sizief/subfinder for more information.
|
36
42
|
'
|
37
43
|
usage
|
38
44
|
end
|
@@ -1,7 +1,8 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module Subfinder
|
4
4
|
module Parser
|
5
|
+
# Download subtitle files from Internet
|
5
6
|
class Download
|
6
7
|
def initialize(url)
|
7
8
|
@url = url
|
@@ -9,7 +10,7 @@ module Subfinder
|
|
9
10
|
|
10
11
|
def save
|
11
12
|
res = RestClient.get @url
|
12
|
-
return false unless @url =~ URI::
|
13
|
+
return false unless @url =~ URI::DEFAULT_PARSER.make_regexp
|
13
14
|
return false unless response_is_healthy? res
|
14
15
|
|
15
16
|
file_name = res.headers[:content_disposition].split('=')[1]
|
@@ -23,11 +24,11 @@ module Subfinder
|
|
23
24
|
|
24
25
|
def response_is_healthy?(res)
|
25
26
|
if res.code != 200
|
26
|
-
Logger.info "Error when downloading '#{@url}'\n
|
27
|
-
false
|
27
|
+
Logger.info "Error when downloading '#{@url}'\n resposnse code: #{res.code}\n".red
|
28
|
+
return false
|
28
29
|
elsif res.body.include? 'An error occurred while processing your request.'
|
29
|
-
Logger.info "Error
|
30
|
-
false
|
30
|
+
Logger.info "Error downloading '#{@url}'. Try Again in few seconds".red
|
31
|
+
return false
|
31
32
|
else
|
32
33
|
true
|
33
34
|
end
|
@@ -1,15 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Subfinder
|
2
4
|
module Parser
|
5
|
+
# All file and folder related actions
|
3
6
|
class Files
|
4
7
|
class << self
|
5
8
|
def list
|
6
9
|
prepare_file_list
|
7
|
-
Dir["#{
|
10
|
+
Dir["#{pwd}/*"]
|
8
11
|
end
|
9
12
|
|
10
13
|
def prepare_file_list
|
11
|
-
files = Dir["#{
|
12
|
-
compressed_files = files.select
|
14
|
+
files = Dir["#{pwd}/*"]
|
15
|
+
compressed_files = files.select do |file|
|
16
|
+
['.zip', '.rar'].include? File.extname(file)
|
17
|
+
end
|
13
18
|
extract_all compressed_files
|
14
19
|
move_compressed_files compressed_files
|
15
20
|
end
|
@@ -18,7 +23,7 @@ module Subfinder
|
|
18
23
|
array_list.each do |file|
|
19
24
|
Zip::File.open(file) do |zip_file|
|
20
25
|
zip_file.each do |entry|
|
21
|
-
file_path =
|
26
|
+
file_path = pwd + '/' + entry.name
|
22
27
|
unless File.exist? file_path
|
23
28
|
Logger.info "Extracting #{entry.name}"
|
24
29
|
entry.extract(file_path)
|
@@ -29,11 +34,17 @@ module Subfinder
|
|
29
34
|
end
|
30
35
|
|
31
36
|
def move_compressed_files(compressed_files)
|
32
|
-
|
33
|
-
|
34
|
-
|
37
|
+
return if compressed_files.empty?
|
38
|
+
|
39
|
+
Dir.mkdir("#{pwd}/compressed") unless File.exist?("#{pwd}/compressed")
|
40
|
+
compressed_files.each do |f|
|
41
|
+
File.rename(f, File.dirname(f) + '/compressed/' + File.basename(f))
|
35
42
|
end
|
36
43
|
end
|
44
|
+
|
45
|
+
def pwd
|
46
|
+
Config.working_dir
|
47
|
+
end
|
37
48
|
end
|
38
49
|
end
|
39
50
|
end
|