mvtk 0.1.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 +7 -0
- data/.gitignore +9 -0
- data/.travis.yml +4 -0
- data/Gemfile +4 -0
- data/README.md +38 -0
- data/Rakefile +1 -0
- data/bin/console +19 -0
- data/bin/setup +7 -0
- data/exe/mvtk +51 -0
- data/lib/mvtk/config.rb +31 -0
- data/lib/mvtk/menu.rb +58 -0
- data/lib/mvtk/namecleaner.rb +110 -0
- data/lib/mvtk/proceed.rb +60 -0
- data/lib/mvtk/search.rb +53 -0
- data/lib/mvtk/version.rb +3 -0
- data/lib/mvtk.rb +10 -0
- data/mvtk.gemspec +38 -0
- metadata +174 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 39422d93217ceb93db561d5b63948543aab451ed
|
4
|
+
data.tar.gz: 93a344296775a2fe2ef62bcf3b324f65ceb663b9
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 251892d8400200733ed19356663d731d271e8e65cbdfc2fb9c9b9d356a8140c6a8db830f2aaf6c79523896772a8a63c9070892d5c3287c1c24d3280b7fdb7083
|
7
|
+
data.tar.gz: 7ea3a4082bf76d9f3d5ee337a96d4a02e709fea23d133bb715b4fd6685513d93186005d3472ebbda5ec3d837eeb8bc304a05ca506b843b57f928ecc1e4f0e016
|
data/.gitignore
ADDED
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
# Mvtk
|
2
|
+
|
3
|
+
This gem install a command `mvtk`, it's not a gem you can use in your software.
|
4
|
+
|
5
|
+
The goal is simple: take crappy movie filename from a directory and name them the good way for kodi mediacenter using well known scraper.
|
6
|
+
|
7
|
+
2 scraper supported at this Time
|
8
|
+
|
9
|
+
* [media-passion](http://scraper.media-passion.fr/index2.php?Page=Home)
|
10
|
+
* [themoviedb.org](https://www.themoviedb.org/)
|
11
|
+
|
12
|
+
## Installation
|
13
|
+
|
14
|
+
$ gem install mvtk
|
15
|
+
|
16
|
+
Then first launch will create the configuration file in ~/.config/mvtk.conf
|
17
|
+
|
18
|
+
## Configuration
|
19
|
+
|
20
|
+
Edit **~/.config/mvtk.conf**
|
21
|
+
|
22
|
+
* *scraper* = "themoviedb" or "mediapassion", which scraper you Usage
|
23
|
+
* *saga_enable* = enable or not saga subdir
|
24
|
+
* *saga_prefix* = a string to prefix saga subdir name (.../terminator/... => .../prefix saganame/...)
|
25
|
+
* *source* = source directory to recursively find movie file
|
26
|
+
* *target* = directory to copy movie with right name
|
27
|
+
* *windows_name* = make created file and folder Microsoft Windows compatible (some characters replace witch _ )
|
28
|
+
* *min_movie_time* = Minimum number of minutes to determine if the video file is a movie or a tvshow
|
29
|
+
|
30
|
+
|
31
|
+
|
32
|
+
## Usage
|
33
|
+
|
34
|
+
just launch `mvtk`
|
35
|
+
|
36
|
+
## Contributing
|
37
|
+
|
38
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/Celedhrim/mvtk.
|
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
data/bin/console
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require "bundler/setup"
|
4
|
+
require "mvtk"
|
5
|
+
|
6
|
+
# You can add fixtures and/or initialization code here to make experimenting
|
7
|
+
# with your gem easier. You can also use a different console, if you like.
|
8
|
+
|
9
|
+
# (If you use this, don't forget to add pry to your Gemfile!)
|
10
|
+
# require "pry"
|
11
|
+
# Pry.start
|
12
|
+
|
13
|
+
require "irb"
|
14
|
+
|
15
|
+
CONFFILE="/tmp/test.conf"
|
16
|
+
conffile = File.expand_path(CONFFILE)
|
17
|
+
$conf = Mvtk.confread(conffile)
|
18
|
+
|
19
|
+
IRB.start
|
data/bin/setup
ADDED
data/exe/mvtk
ADDED
@@ -0,0 +1,51 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
#require "bundler/setup"
|
4
|
+
require "mvtk"
|
5
|
+
require "rbconfig"
|
6
|
+
|
7
|
+
#no design for windows
|
8
|
+
is_windows = (RbConfig::CONFIG['host_os'] =~ /mswin|mingw|cygwin/)
|
9
|
+
if is_windows then
|
10
|
+
puts "Sorry not design for windows"
|
11
|
+
exit 1
|
12
|
+
end
|
13
|
+
|
14
|
+
CONFFILE="~/.config/mvtk.conf"
|
15
|
+
conffile = File.expand_path(CONFFILE)
|
16
|
+
|
17
|
+
#Load config file
|
18
|
+
$conf = Mvtk.confread(conffile)
|
19
|
+
|
20
|
+
#doing stuff with config
|
21
|
+
$conf["source"] = $conf["source"].chomp("/")
|
22
|
+
$conf["target"] = $conf["target"].chomp("/")
|
23
|
+
|
24
|
+
mchoice = ""
|
25
|
+
process_hash = {}
|
26
|
+
until mchoice == "proceed" do
|
27
|
+
mchoice = Mvtk.mediamenu
|
28
|
+
exit if mchoice == "quit"
|
29
|
+
next if mchoice == "proceed"
|
30
|
+
schoice = ""
|
31
|
+
schoice = Mvtk.choosescrap(mchoice)
|
32
|
+
process_hash[mchoice] = schoice
|
33
|
+
end
|
34
|
+
|
35
|
+
puts ""
|
36
|
+
puts "-"*80
|
37
|
+
puts "Processing #{process_hash.length} file(s)"
|
38
|
+
|
39
|
+
counter = 0
|
40
|
+
process_hash.each do |source, destination|
|
41
|
+
puts ""
|
42
|
+
Mvtk.copy(source, destination)
|
43
|
+
counter = counter + 1
|
44
|
+
remain = process_hash.length - counter
|
45
|
+
if remain != 0 then
|
46
|
+
puts ""
|
47
|
+
puts "Done ! #{remain} in queue"
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
puts "All done , exit ..."
|
data/lib/mvtk/config.rb
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
require "iniparse"
|
2
|
+
|
3
|
+
module Mvtk
|
4
|
+
|
5
|
+
# create the config
|
6
|
+
def self.confcreate (conffilepath)
|
7
|
+
doc = IniParse.gen do |doc|
|
8
|
+
doc.section("mvtk") do |mvtk|
|
9
|
+
mvtk.option("scraper","mediapassion")
|
10
|
+
mvtk.option("saga_enable","true")
|
11
|
+
mvtk.option("saga_prefix","1-Saga")
|
12
|
+
mvtk.option("source","/home/torrent/finish.seedbox")
|
13
|
+
mvtk.option("target","/home/data/Videos/Films")
|
14
|
+
mvtk.option("windows_name","true")
|
15
|
+
mvtk.option("min_movie_time","60")
|
16
|
+
end
|
17
|
+
end
|
18
|
+
doc.save(conffilepath)
|
19
|
+
puts "Conf file created : #{conffilepath}"
|
20
|
+
puts "Edit to fit your need then run again"
|
21
|
+
#Add exit
|
22
|
+
exit
|
23
|
+
end
|
24
|
+
|
25
|
+
# Read the config
|
26
|
+
def self.confread (conffilepath)
|
27
|
+
confcreate(conffilepath) unless File.exists?(conffilepath)
|
28
|
+
IniParse.parse( File.read(conffilepath) )['mvtk']
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
data/lib/mvtk/menu.rb
ADDED
@@ -0,0 +1,58 @@
|
|
1
|
+
require 'tty-prompt'
|
2
|
+
require 'streamio-ffmpeg'
|
3
|
+
|
4
|
+
module Mvtk
|
5
|
+
|
6
|
+
def self.mediamenu
|
7
|
+
prompt = TTY::Prompt.new
|
8
|
+
choices = self.listfiles
|
9
|
+
choice = prompt.select("Movie to copy ?", choices)
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.listfiles
|
13
|
+
result = Hash.new
|
14
|
+
Dir.glob("#{$conf['source']}/**/*.{mkv,mp4,avi}", File::FNM_CASEFOLD).sort.each do |mfile|
|
15
|
+
begin
|
16
|
+
movie = FFMPEG::Movie.new(mfile)
|
17
|
+
next if movie.duration.round/60.to_i < $conf['min_movie_time']
|
18
|
+
rescue
|
19
|
+
end
|
20
|
+
result[File::basename(mfile)] = mfile
|
21
|
+
end
|
22
|
+
result["[Proceed]"] = "proceed"
|
23
|
+
result["[Quit]"] = "quit"
|
24
|
+
return result
|
25
|
+
end
|
26
|
+
|
27
|
+
def self.manualscrap
|
28
|
+
prompt = TTY::Prompt.new
|
29
|
+
answer = prompt.ask("Enter your search terms : ")
|
30
|
+
return self.choosescrap(answer)
|
31
|
+
end
|
32
|
+
|
33
|
+
def self.choosescrap(mfile)
|
34
|
+
mysearch = File::basename(self::NameCleaner.new(mfile).clean)
|
35
|
+
search = []
|
36
|
+
while search.empty? and mysearch != nil
|
37
|
+
search = self.search(mysearch)
|
38
|
+
if search.empty? then
|
39
|
+
mysearch = mysearch[/(.*)\s/,1]
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
if search.empty? then
|
44
|
+
return self.manualscrap
|
45
|
+
end
|
46
|
+
|
47
|
+
foutput = search.collect { |x| x.split('/')[0]}
|
48
|
+
foutput.push("[Manual] (Do a manual search)")
|
49
|
+
foutput.push("[Return] (Back to file menu)")
|
50
|
+
prompt2 = TTY::Prompt.new
|
51
|
+
choice = prompt2.select("Your choice ?", foutput )
|
52
|
+
if choice == "[Manual] (Do a manual search)" then
|
53
|
+
return self.manualscrap
|
54
|
+
end
|
55
|
+
result = search.keep_if { |v| v.start_with?(choice) }
|
56
|
+
return result.first
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,110 @@
|
|
1
|
+
module Mvtk
|
2
|
+
|
3
|
+
class NameCleaner
|
4
|
+
attr_accessor :raw_name, :clean_name
|
5
|
+
|
6
|
+
def initialize(raw_name)
|
7
|
+
@raw_name = raw_name
|
8
|
+
@clean_name = raw_name
|
9
|
+
end
|
10
|
+
|
11
|
+
def clean_punctuation
|
12
|
+
punctuation_to_remove = /[\.\[\]\(\)-]/
|
13
|
+
@clean_name = @clean_name.gsub(punctuation_to_remove, " ")
|
14
|
+
end
|
15
|
+
|
16
|
+
def remove_release_year
|
17
|
+
@clean_name = @clean_name.gsub(release_year.to_s, "")
|
18
|
+
end
|
19
|
+
|
20
|
+
["filetype"].each do |method|
|
21
|
+
define_method "remove_#{method}" do
|
22
|
+
extractions = Array(self.send(method))
|
23
|
+
extractions.each do |extraction|
|
24
|
+
@clean_name = @clean_name.gsub(extraction, "")
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
["video_types"].each do |method|
|
30
|
+
remove_method_name = :"remove_#{method}"
|
31
|
+
terms_method_name = :"#{method}_terms"
|
32
|
+
|
33
|
+
define_method remove_method_name do
|
34
|
+
extraction_indices = Array(self.send(method))
|
35
|
+
extraction_indices.each do |extraction_index|
|
36
|
+
term = NameCleaner.send(terms_method_name).at(extraction_index)
|
37
|
+
@clean_name = @clean_name.gsub(Regexp.new(term[:name], term[:modifier]), "")
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def remove_whitespace
|
43
|
+
@clean_name = @clean_name.gsub(/\s+/, " ")
|
44
|
+
@clean_name = @clean_name.strip
|
45
|
+
end
|
46
|
+
|
47
|
+
def clean
|
48
|
+
remove_release_year
|
49
|
+
remove_video_types
|
50
|
+
remove_filetype
|
51
|
+
clean_punctuation
|
52
|
+
remove_whitespace
|
53
|
+
end
|
54
|
+
|
55
|
+
def release_year
|
56
|
+
year_matches = @raw_name.scan(/(\d{4})/).flatten
|
57
|
+
two_years_from_now= Time.now.strftime("%Y").to_i + 2
|
58
|
+
|
59
|
+
year_matches = year_matches.map { |year_match|
|
60
|
+
year = year_match.to_i
|
61
|
+
}.select { |year_match|
|
62
|
+
(1895..two_years_from_now).include? year_match
|
63
|
+
}
|
64
|
+
|
65
|
+
year_matches.first if year_matches.size == 1
|
66
|
+
end
|
67
|
+
|
68
|
+
def self.video_types_terms
|
69
|
+
[
|
70
|
+
{ :name => "dvdrip", :modifier => Regexp::IGNORECASE },
|
71
|
+
{ :name => "xvid", :modifier => Regexp::IGNORECASE },
|
72
|
+
{ :name => "720p", :modifier => Regexp::IGNORECASE },
|
73
|
+
{ :name => "1080p", :modifier => Regexp::IGNORECASE },
|
74
|
+
{ :name => "x264", :modifier => Regexp::IGNORECASE },
|
75
|
+
{ :name => "bluray", :modifier => Regexp::IGNORECASE },
|
76
|
+
{ :name => "bdrip", :modifier => Regexp::IGNORECASE },
|
77
|
+
{ :name => "multi", :modifier => Regexp::IGNORECASE },
|
78
|
+
{ :name => "repack", :modifier => Regexp::IGNORECASE },
|
79
|
+
{ :name => "aac", :modifier => Regexp::IGNORECASE },
|
80
|
+
{ :name => "5.1", :modifier => Regexp::IGNORECASE },
|
81
|
+
{ :name => "ac3", :modifier => Regexp::IGNORECASE },
|
82
|
+
{ :name => "DTS", :modifier => Regexp::IGNORECASE },
|
83
|
+
{ :name => "truefrench", :modifier => Regexp::IGNORECASE },
|
84
|
+
{ :name => "french", :modifier => Regexp::IGNORECASE },
|
85
|
+
{ :name => "www.cpasbien.io", :modifier => Regexp::IGNORECASE }
|
86
|
+
]
|
87
|
+
end
|
88
|
+
|
89
|
+
def video_types
|
90
|
+
video_type = []
|
91
|
+
|
92
|
+
NameCleaner.video_types_terms.each_with_index do |term, index|
|
93
|
+
regexp = term[:name]
|
94
|
+
modifier = term[:modifier]
|
95
|
+
video_type << index if @raw_name.match Regexp.new regexp, modifier # case insensitive
|
96
|
+
end
|
97
|
+
|
98
|
+
video_type
|
99
|
+
end
|
100
|
+
|
101
|
+
def filetype
|
102
|
+
filetypes = ["avi", "mp4", "mkv"]
|
103
|
+
filetypes.find do |filetype|
|
104
|
+
regexp = Regexp.new "\.#{filetype}"
|
105
|
+
@raw_name.match regexp
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
end
|
data/lib/mvtk/proceed.rb
ADDED
@@ -0,0 +1,60 @@
|
|
1
|
+
require 'ruby-progressbar'
|
2
|
+
require 'filesize'
|
3
|
+
|
4
|
+
module Mvtk
|
5
|
+
|
6
|
+
def self.winname(fullpath)
|
7
|
+
charfilter = /[\<\>\:\"\|\?\*]/
|
8
|
+
return fullpath.gsub(charfilter,'_')
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.fulldest(source, destination)
|
12
|
+
movie_file = "#{destination.split('/')[0][0..-8]}#{File.extname(source)}"
|
13
|
+
movie_file = self.winname(movie_file) if $conf["windows_name"]
|
14
|
+
movie_dir = destination.split('/')[0]
|
15
|
+
movie_dir = self.winname(movie_dir) if $conf["windows_name"]
|
16
|
+
|
17
|
+
if $conf["saga_enable"] and destination.split('/')[1] then
|
18
|
+
saga = "#{$conf["saga_prefix"]} #{destination.split('/')[1]}"
|
19
|
+
saga = self.winname(saga) if $conf["windows_name"]
|
20
|
+
fullpath = "#{$conf["target"]}/#{saga}/#{movie_dir}/#{movie_file}"
|
21
|
+
else
|
22
|
+
fullpath = "#{$conf["target"]}/#{movie_dir}/#{movie_file}"
|
23
|
+
end
|
24
|
+
|
25
|
+
return fullpath
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.copy_progressbar(in_name, out_name)
|
29
|
+
in_file = File.new(in_name, "r")
|
30
|
+
out_file = File.new(out_name, "w")
|
31
|
+
|
32
|
+
in_size = File.size(in_name)
|
33
|
+
batch_bytes = ( in_size / 100 ).ceil
|
34
|
+
total = 0
|
35
|
+
p_bar = ProgressBar.create(:length => 80, :format => '%e |%b>%i| %p%% %t')
|
36
|
+
|
37
|
+
buffer = in_file.sysread(batch_bytes)
|
38
|
+
while total < in_size do
|
39
|
+
out_file.syswrite(buffer)
|
40
|
+
p_bar.progress += 1 unless p_bar.progress >= 100
|
41
|
+
total += batch_bytes
|
42
|
+
if (in_size - total) < batch_bytes
|
43
|
+
batch_bytes = (in_size - total)
|
44
|
+
end
|
45
|
+
buffer = in_file.sysread(batch_bytes)
|
46
|
+
end
|
47
|
+
p_bar.finish
|
48
|
+
end
|
49
|
+
|
50
|
+
def self.copy(source, destination)
|
51
|
+
finalpath = self.fulldest(source, destination)
|
52
|
+
puts "Source => #{File::basename(source)}"
|
53
|
+
puts "Target => #{finalpath.sub($conf["target"]+"/","")}"
|
54
|
+
puts "Size => #{Filesize.from(File.size(source).to_s + "B").pretty}"
|
55
|
+
puts ""
|
56
|
+
|
57
|
+
FileUtils.mkdir_p File.dirname(finalpath) unless File.directory?(File.dirname(finalpath))
|
58
|
+
self.copy_progressbar(source, finalpath)
|
59
|
+
end
|
60
|
+
end
|
data/lib/mvtk/search.rb
ADDED
@@ -0,0 +1,53 @@
|
|
1
|
+
require 'nokogiri'
|
2
|
+
require 'open-uri'
|
3
|
+
require 'uri'
|
4
|
+
|
5
|
+
module Mvtk
|
6
|
+
|
7
|
+
def self.mediapassion(moviename)
|
8
|
+
result = []
|
9
|
+
searchresult = Nokogiri::HTML(open("http://passion-xbmc.org/scraper/ajax.php?Ajax=Search&Title=#{URI.escape(moviename.tr(' ', '+'))}"), nil , 'UTF-8')
|
10
|
+
searchresult.css('a').take(10).each do |link|
|
11
|
+
mtitle = link.content.tr('[', '(').tr(']', ')')
|
12
|
+
detailpage = Nokogiri::HTML(open("http://passion-xbmc.org/scraper/#{link['href']}"))
|
13
|
+
msaga = detailpage.css("#sagaWrapper").css('p').text[5..-1]
|
14
|
+
unless msaga.nil? then
|
15
|
+
result.push("#{mtitle}/#{msaga.rstrip.lstrip}")
|
16
|
+
else
|
17
|
+
result.push("#{mtitle}/")
|
18
|
+
end
|
19
|
+
end
|
20
|
+
return result
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.themoviedb(moviename)
|
24
|
+
result = []
|
25
|
+
searchresult = Nokogiri::HTML(open("https://www.themoviedb.org/search?query=#{URI.escape(moviename.tr(' ', '+'))}"), nil , 'UTF-8')
|
26
|
+
searchresult.css("div.info").take(10).each do |link|
|
27
|
+
msage = nil
|
28
|
+
myear = link.css('span.release_date').text.split("/")[2].strip
|
29
|
+
mtitle = "#{link.css('a').first.content} (#{myear})"
|
30
|
+
detailpage = Nokogiri::HTML(open("https://www.themoviedb.org#{link.css('a').first['href']}"))
|
31
|
+
msaga = detailpage.at('p:contains("Part of the")').css('a').text if detailpage.at('p:contains("Part of the")')
|
32
|
+
unless msaga.nil? then
|
33
|
+
result.push("#{mtitle}/#{msaga}")
|
34
|
+
else
|
35
|
+
result.push("#{mtitle}/")
|
36
|
+
end
|
37
|
+
end
|
38
|
+
return result
|
39
|
+
end
|
40
|
+
|
41
|
+
def self.search (moviename)
|
42
|
+
if $conf['scraper'] == "mediapassion" then
|
43
|
+
result = self.mediapassion(moviename)
|
44
|
+
elsif $conf['scraper'] == "themoviedb" then
|
45
|
+
result = self.themoviedb(moviename)
|
46
|
+
else
|
47
|
+
puts "Sorry #{$conf['scraper']} is not a valid scraper"
|
48
|
+
exit 1
|
49
|
+
end
|
50
|
+
return result
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
data/lib/mvtk/version.rb
ADDED
data/lib/mvtk.rb
ADDED
data/mvtk.gemspec
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'mvtk/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "mvtk"
|
8
|
+
spec.version = Mvtk::VERSION
|
9
|
+
spec.authors = ["Celedhrim"]
|
10
|
+
spec.email = ["celed+gitlab@ielf.org"]
|
11
|
+
|
12
|
+
spec.summary = %q{Copy movie with right kodi naming.}
|
13
|
+
spec.description = %q{Take movie in a directory , copy them to another with naming from mediapassion or themoviedb.}
|
14
|
+
spec.homepage = "https://github.com/Celedhrim/mvtk"
|
15
|
+
|
16
|
+
# Prevent pushing this gem to RubyGems.org by setting 'allowed_push_host', or
|
17
|
+
# delete this section to allow pushing this gem to any host.
|
18
|
+
if spec.respond_to?(:metadata)
|
19
|
+
spec.metadata['allowed_push_host'] = "https://rubygems.org"
|
20
|
+
else
|
21
|
+
raise "RubyGems 2.0 or newer is required to protect against public gem pushes."
|
22
|
+
end
|
23
|
+
|
24
|
+
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
25
|
+
spec.bindir = "exe"
|
26
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
27
|
+
spec.require_paths = ["lib"]
|
28
|
+
|
29
|
+
spec.add_dependency "iniparse", ">= 1.4.1"
|
30
|
+
spec.add_dependency "nokogiri", ">= 1.6.6.4"
|
31
|
+
spec.add_dependency "tty-prompt", ">= 0.2.0"
|
32
|
+
spec.add_dependency "ruby-progressbar", ">= 1.7.5"
|
33
|
+
spec.add_dependency "filesize", "~> 0.1.1"
|
34
|
+
spec.add_dependency "streamio-ffmpeg", ">= 1.0"
|
35
|
+
|
36
|
+
spec.add_development_dependency "bundler", "~> 1.10"
|
37
|
+
spec.add_development_dependency "rake", "~> 10.0"
|
38
|
+
end
|
metadata
ADDED
@@ -0,0 +1,174 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: mvtk
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Celedhrim
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2015-12-13 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: iniparse
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 1.4.1
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 1.4.1
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: nokogiri
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 1.6.6.4
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 1.6.6.4
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: tty-prompt
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 0.2.0
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 0.2.0
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: ruby-progressbar
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 1.7.5
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: 1.7.5
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: filesize
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: 0.1.1
|
76
|
+
type: :runtime
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: 0.1.1
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: streamio-ffmpeg
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '1.0'
|
90
|
+
type: :runtime
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '1.0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: bundler
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - "~>"
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '1.10'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - "~>"
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '1.10'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: rake
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - "~>"
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '10.0'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - "~>"
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '10.0'
|
125
|
+
description: Take movie in a directory , copy them to another with naming from mediapassion
|
126
|
+
or themoviedb.
|
127
|
+
email:
|
128
|
+
- celed+gitlab@ielf.org
|
129
|
+
executables:
|
130
|
+
- mvtk
|
131
|
+
extensions: []
|
132
|
+
extra_rdoc_files: []
|
133
|
+
files:
|
134
|
+
- ".gitignore"
|
135
|
+
- ".travis.yml"
|
136
|
+
- Gemfile
|
137
|
+
- README.md
|
138
|
+
- Rakefile
|
139
|
+
- bin/console
|
140
|
+
- bin/setup
|
141
|
+
- exe/mvtk
|
142
|
+
- lib/mvtk.rb
|
143
|
+
- lib/mvtk/config.rb
|
144
|
+
- lib/mvtk/menu.rb
|
145
|
+
- lib/mvtk/namecleaner.rb
|
146
|
+
- lib/mvtk/proceed.rb
|
147
|
+
- lib/mvtk/search.rb
|
148
|
+
- lib/mvtk/version.rb
|
149
|
+
- mvtk.gemspec
|
150
|
+
homepage: https://github.com/Celedhrim/mvtk
|
151
|
+
licenses: []
|
152
|
+
metadata:
|
153
|
+
allowed_push_host: https://rubygems.org
|
154
|
+
post_install_message:
|
155
|
+
rdoc_options: []
|
156
|
+
require_paths:
|
157
|
+
- lib
|
158
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
159
|
+
requirements:
|
160
|
+
- - ">="
|
161
|
+
- !ruby/object:Gem::Version
|
162
|
+
version: '0'
|
163
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
164
|
+
requirements:
|
165
|
+
- - ">="
|
166
|
+
- !ruby/object:Gem::Version
|
167
|
+
version: '0'
|
168
|
+
requirements: []
|
169
|
+
rubyforge_project:
|
170
|
+
rubygems_version: 2.4.5.1
|
171
|
+
signing_key:
|
172
|
+
specification_version: 4
|
173
|
+
summary: Copy movie with right kodi naming.
|
174
|
+
test_files: []
|