elch_scan 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.
@@ -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: