elch_scan 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,17 @@
1
+ module ElchScan
2
+ module Formatter
3
+ class Base
4
+ def initialize app
5
+ @app = app
6
+ end
7
+
8
+ def logger
9
+ @app.logger
10
+ end
11
+
12
+ def c *a
13
+ @app.c(*a)
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,9 @@
1
+ module ElchScan
2
+ module Formatter
3
+ class HTML
4
+ def format results
5
+ raise NotImplementedError, "Coming soon!"
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,76 @@
1
+ module ElchScan
2
+ module Formatter
3
+ class Plain < Base
4
+ def format results
5
+ return ["no results"] if results.empty?
6
+ # name, resolution, languages
7
+ table = [[], [], [], []]
8
+
9
+ results.each do |name, movie|
10
+ table[0] << name
11
+ table[1] << (movie.source.resolution rescue "?")
12
+ table[2] << (movie.nfo! do |n|
13
+ n["fileinfo"][0]["streamdetails"][0]["audio"].map do |s|
14
+ s.try(:[], "language").try(:[], 0)
15
+ end.reject(&:nil?)
16
+ end.presence || ["–"]).join(", ")
17
+
18
+ size = movie.source.size rescue nil
19
+ table[3] << (size ? ActiveSupport::NumberHelper::NumberToHumanSizeConverter.convert(size, {}) : "?")
20
+ end
21
+
22
+ [nil] + render_table(table, ["Name", "Resolution", "Audio languages", "Movie size"])
23
+ end
24
+
25
+ def colorize_name str
26
+ m = str.match(/(.*?)(?:\s*)(\(.*?\))(?:\s*)(\[[0-9]+\])?(\s*)?/)
27
+ return str if !m
28
+ c("#{m[1]}").tap do |r|
29
+ r << m[4] if m[4]
30
+ r << c(" #{m[2]}", :blue) if m[2]
31
+ r << c(" #{m[3]}", :magenta) if m[3]
32
+ end
33
+ end
34
+
35
+ def render_table table, headers = []
36
+ [].tap do |r|
37
+ col_sizes = table.map{|col| col.map(&:to_s).map(&:length).max }
38
+ headers.map(&:length).each_with_index do |length, header|
39
+ col_sizes[header] = [col_sizes[header], length].max
40
+ end
41
+
42
+ # header
43
+ if headers.any?
44
+ r << [].tap do |line|
45
+ col_sizes.count.times do |col|
46
+ line << "#{c headers[col].ljust(col_sizes[col])}"
47
+ end
48
+ end.join(c " | ", :red)
49
+ r << c("".ljust(col_sizes.sum + ((col_sizes.count - 1) * 3), "-"), :red)
50
+ end
51
+
52
+ # prettify movie sizes
53
+ table[3].map! do |size|
54
+ size = size.ljust(col_sizes[3])
55
+ m = size.match(/(.*?) ([^\s]*)(\s*)/)
56
+ color = case(m[2])
57
+ when "B", "KB" then :magenta
58
+ when "MB" then :green
59
+ else :red
60
+ end
61
+ c("#{m[3]}#{m[1]} #{m[2]}", color)
62
+ end
63
+
64
+ # records
65
+ table[0].count.times do |row|
66
+ r << [].tap do |line|
67
+ col_sizes.count.times do |col|
68
+ line << "#{c colorize_name("#{table[col][row]}".encode!('UTF-8','UTF8-MAC').ljust(col_sizes[col]))}"
69
+ end
70
+ end.join(c " | ", :red)
71
+ end
72
+ end
73
+ end
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,92 @@
1
+ module ElchScan
2
+ class Movie
3
+ # dir => source movie directory (e.g. C:/Movies)
4
+ # path => folder path of movie (e.g. C:/Movies/BestFilmEver)
5
+ # dirname => source movie directory name (e.g. BestFilmEver)
6
+ # nfo => path to nfo file
7
+ attr_reader :attrs, :files
8
+
9
+ def initialize app, attrs = {}
10
+ @app = ->{app}
11
+ @attrs = {}.merge(attrs).with_indifferent_access
12
+ analyze!
13
+ end
14
+
15
+ def app
16
+ @app.call
17
+ end
18
+
19
+ def method_missing(meth, *args, &blk)
20
+ qmeth = meth.to_s.gsub("?", "") if meth.to_s.end_with?("?")
21
+ smeth = meth.to_s.gsub("=", "") if meth.to_s.end_with?("=")
22
+
23
+ if @attrs.keys.include?(meth.to_s)
24
+ @attrs[meth]
25
+ elsif @attrs.keys.include?(smeth)
26
+ @attrs[smeth] = args.first
27
+ @attrs[smeth]
28
+ elsif @attrs.keys.include?(qmeth)
29
+ !!@attrs[qmeth]
30
+ else
31
+ return false if qmeth
32
+ super
33
+ end
34
+ end
35
+
36
+ def set name, value
37
+ @attrs[name] = value
38
+ @attrs[name]
39
+ end
40
+
41
+ def analyze!
42
+ set :dirname, File.basename(path)
43
+ @files = Dir.glob("#{path.gsub("[", "\\[")}/*.*")
44
+ matched = naming_select(@files)
45
+
46
+ matched.each_with_object({}) {|(name, matches), r| set name, matches.try(:first) }
47
+ set :movie, select_movies(@files).sort_by(&:length).first
48
+ app.warn "No movie file found for #{dirname}" unless movie?
49
+ end
50
+
51
+ def naming_select strings
52
+ raw_patterns = app.cfg(:application, :naming).symbolize_keys
53
+ patterns = raw_patterns.map do |name, pattern|
54
+ [name, /#{Regexp.escape(pattern).gsub("<baseFileName>", ".*?")}/]
55
+ end
56
+
57
+ patterns.each_with_object({}) do |(name, pattern), result|
58
+ result[name] = strings.select{|s| s.match(pattern) }
59
+ end
60
+ end
61
+
62
+ def select_movies strings
63
+ strings.map{|s| File.basename(s) }.select do |s|
64
+ app.cfg(:application, :video_extensions).split("\s").include?(s.split(".").last)
65
+ end
66
+ end
67
+
68
+ def source
69
+ FFMPEG::Movie.new("#{path}/#{movie}") rescue $!.message
70
+ end
71
+
72
+ def nfo!
73
+ if nfo?
74
+ XmlSimple.xml_in(nfo).tap do |nfo|
75
+ if block_given?
76
+ begin
77
+ return yield(nfo)
78
+ rescue
79
+ return false
80
+ end
81
+ end
82
+ end
83
+ end
84
+ rescue
85
+ false
86
+ end
87
+
88
+ def name
89
+ movie.split(".")[0..-2].join(".") if movie?
90
+ end
91
+ end
92
+ end
@@ -0,0 +1,4 @@
1
+ module ElchScan
2
+ VERSION = "0.1.0"
3
+ UPDATE_URL = "https://raw.githubusercontent.com/2called-chaos/elch_scan/master/VERSION"
4
+ end
data/lib/elch_scan.rb ADDED
@@ -0,0 +1,31 @@
1
+ require "pathname"
2
+ require "yaml"
3
+ require "find"
4
+ require "optparse"
5
+ require "tempfile"
6
+ require "bundler"
7
+ require "securerandom"
8
+
9
+ require "pry"
10
+ require "streamio-ffmpeg"
11
+ require "xmlsimple"
12
+ require "active_support/core_ext"
13
+ require "active_support/number_helper/number_converter"
14
+ require "active_support/number_helper/number_to_rounded_converter"
15
+ require "active_support/number_helper/number_to_delimited_converter"
16
+ require "active_support/number_helper/number_to_human_size_converter"
17
+
18
+ require "banana/logger"
19
+ require "elch_scan/version"
20
+ require "elch_scan/movie"
21
+ require "elch_scan/formatter/base"
22
+ require "elch_scan/formatter/plain"
23
+ require "elch_scan/formatter/html"
24
+ require "elch_scan/application/dispatch"
25
+ require "elch_scan/application/filter"
26
+ require "elch_scan/application"
27
+
28
+ module ElchScan
29
+ I18n.enforce_available_locales = false
30
+ ROOT = Pathname.new(File.expand_path("../..", __FILE__))
31
+ end
metadata ADDED
@@ -0,0 +1,169 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: elch_scan
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Sven Pachnit
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-04-16 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: active_support
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '>='
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '>='
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: i18n
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: pry
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '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'
55
+ - !ruby/object:Gem::Dependency
56
+ name: xml-simple
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: streamio-ffmpeg
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - '>='
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - '>='
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: bundler
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ~>
88
+ - !ruby/object:Gem::Version
89
+ version: '1.5'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ~>
95
+ - !ruby/object:Gem::Version
96
+ version: '1.5'
97
+ - !ruby/object:Gem::Dependency
98
+ name: rake
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - '>='
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - '>='
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ description: 'ODO: Write a longer description. Optional.'
112
+ email:
113
+ - sven@bmonkeys.net
114
+ executables:
115
+ - elch_scan
116
+ extensions: []
117
+ extra_rdoc_files: []
118
+ files:
119
+ - .gitignore
120
+ - Gemfile
121
+ - LICENSE.txt
122
+ - README.md
123
+ - Rakefile
124
+ - VERSION
125
+ - bin/elch_scan
126
+ - doc/config.yml
127
+ - doc/filter.rb
128
+ - elch_scan.gemspec
129
+ - elch_scan.rb
130
+ - lib/active_support/number_helper/number_converter.rb
131
+ - lib/active_support/number_helper/number_to_delimited_converter.rb
132
+ - lib/active_support/number_helper/number_to_human_size_converter.rb
133
+ - lib/active_support/number_helper/number_to_rounded_converter.rb
134
+ - lib/banana/logger.rb
135
+ - lib/elch_scan.rb
136
+ - lib/elch_scan/application.rb
137
+ - lib/elch_scan/application/dispatch.rb
138
+ - lib/elch_scan/application/filter.rb
139
+ - lib/elch_scan/formatter/base.rb
140
+ - lib/elch_scan/formatter/html.rb
141
+ - lib/elch_scan/formatter/plain.rb
142
+ - lib/elch_scan/movie.rb
143
+ - lib/elch_scan/version.rb
144
+ homepage: ''
145
+ licenses:
146
+ - MIT
147
+ metadata: {}
148
+ post_install_message:
149
+ rdoc_options: []
150
+ require_paths:
151
+ - lib
152
+ required_ruby_version: !ruby/object:Gem::Requirement
153
+ requirements:
154
+ - - '>='
155
+ - !ruby/object:Gem::Version
156
+ version: '0'
157
+ required_rubygems_version: !ruby/object:Gem::Requirement
158
+ requirements:
159
+ - - '>='
160
+ - !ruby/object:Gem::Version
161
+ version: '0'
162
+ requirements: []
163
+ rubyforge_project:
164
+ rubygems_version: 2.0.3
165
+ signing_key:
166
+ specification_version: 4
167
+ summary: 'ODO: Write a short summary. Required.'
168
+ test_files: []
169
+ has_rdoc: