libis-format 1.0.2 → 2.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.gitignore +5 -1
- data/.travis.yml +43 -25
- data/README.md +2 -2
- data/base/Dockerfile +35 -0
- data/base/Dockerfile.alpine +20 -0
- data/base/Dockerfile.rvm +56 -0
- data/base/rework_path +20 -0
- data/bin/libis_format +8 -0
- data/docker_cfg.yml +1 -0
- data/lib/libis/format.rb +12 -2
- data/lib/libis/format/cli/convert.rb +310 -0
- data/lib/libis/format/cli/format.rb +77 -0
- data/lib/libis/format/cli/prompt_helper.rb +87 -0
- data/lib/libis/format/cli/sub_command.rb +22 -0
- data/lib/libis/format/command_line.rb +25 -0
- data/lib/libis/format/config.rb +15 -10
- data/lib/libis/format/converter/audio_converter.rb +3 -37
- data/lib/libis/format/converter/base.rb +22 -8
- data/lib/libis/format/converter/chain.rb +3 -3
- data/lib/libis/format/converter/image_assembler.rb +82 -0
- data/lib/libis/format/converter/image_converter.rb +32 -127
- data/lib/libis/format/converter/image_splitter.rb +84 -0
- data/lib/libis/format/converter/image_watermarker.rb +261 -0
- data/lib/libis/format/converter/jp2_converter.rb +2 -2
- data/lib/libis/format/converter/office_converter.rb +2 -2
- data/lib/libis/format/converter/pdf_assembler.rb +66 -0
- data/lib/libis/format/converter/pdf_converter.rb +10 -134
- data/lib/libis/format/converter/pdf_metadata.rb +82 -0
- data/lib/libis/format/converter/pdf_optimizer.rb +67 -0
- data/lib/libis/format/converter/pdf_protecter.rb +147 -0
- data/lib/libis/format/converter/pdf_selecter.rb +77 -0
- data/lib/libis/format/converter/pdf_splitter.rb +70 -0
- data/lib/libis/format/converter/pdf_watermarker_header.rb +71 -0
- data/lib/libis/format/converter/pdf_watermarker_image.rb +76 -0
- data/lib/libis/format/converter/pdf_watermarker_text.rb +93 -0
- data/lib/libis/format/converter/spreadsheet_converter.rb +2 -2
- data/lib/libis/format/converter/video_converter.rb +1 -1
- data/lib/libis/format/identifier.rb +7 -7
- data/lib/libis/format/info.rb +27 -0
- data/lib/libis/format/library.rb +147 -0
- data/lib/libis/format/tool.rb +4 -1
- data/lib/libis/format/tool/droid.rb +2 -2
- data/lib/libis/format/tool/extension_identification.rb +4 -4
- data/lib/libis/format/tool/ffmpeg.rb +1 -1
- data/lib/libis/format/tool/fido.rb +1 -1
- data/lib/libis/format/tool/fop_pdf.rb +1 -1
- data/lib/libis/format/tool/identification_tool.rb +6 -6
- data/lib/libis/format/tool/office_to_pdf.rb +1 -1
- data/lib/libis/format/tool/pdf_merge.rb +4 -4
- data/lib/libis/format/tool/{pdf_copy.rb → pdf_metadata.rb} +6 -6
- data/lib/libis/format/tool/pdf_protect.rb +47 -0
- data/lib/libis/format/tool/pdf_select.rb +47 -0
- data/lib/libis/format/tool/pdf_split.rb +5 -5
- data/lib/libis/format/tool/pdf_to_pdfa.rb +1 -2
- data/lib/libis/format/tool/pdf_watermark.rb +47 -0
- data/lib/libis/format/tool/pdfa_validator.rb +3 -4
- data/lib/libis/format/tool/spreadsheet_to_ods.rb +2 -1
- data/lib/libis/format/version.rb +1 -1
- data/lib/libis/format/yaml_loader.rb +71 -0
- data/libis-format.gemspec +5 -5
- data/tools/PdfTool.jar +0 -0
- data/tools/bcpkix-jdk15on-167.jar +0 -0
- data/tools/bcprov-jdk15on-167.jar +0 -0
- data/tools/fop/build/fop.jar +0 -0
- data/tools/fop/conf/fop.xconf +466 -0
- data/tools/fop/fop +258 -0
- data/tools/fop/fop.bat +75 -0
- data/tools/fop/fop.cmd +31 -0
- data/tools/fop/fop.js +341 -0
- data/tools/fop/lib/README.txt +243 -0
- data/tools/fop/lib/avalon-framework-api-4.3.1.jar +0 -0
- data/tools/fop/lib/avalon-framework-impl-4.3.1.jar +0 -0
- data/tools/fop/lib/avalon-framework.LICENSE.txt +175 -0
- data/tools/fop/lib/avalon-framework.NOTICE.TXT +11 -0
- data/tools/fop/lib/batik-all-1.10.jar +0 -0
- data/tools/fop/lib/batik.LICENSE.txt +201 -0
- data/tools/fop/lib/batik.NOTICE.txt +18 -0
- data/tools/fop/lib/commons-io-1.3.1.jar +0 -0
- data/tools/fop/lib/commons-io.LICENSE.txt +203 -0
- data/tools/fop/lib/commons-io.NOTICE.txt +6 -0
- data/tools/fop/lib/commons-logging-1.0.4.jar +0 -0
- data/tools/fop/lib/commons-logging.LICENSE.txt +202 -0
- data/tools/fop/lib/commons-logging.NOTICE.txt +3 -0
- data/tools/fop/lib/fontbox-2.0.7.jar +0 -0
- data/tools/fop/lib/serializer-2.7.2.jar +0 -0
- data/tools/fop/lib/serializer.LICENSE.txt +201 -0
- data/tools/fop/lib/serializer.NOTICE.txt +15 -0
- data/tools/fop/lib/xalan-2.7.2.jar +0 -0
- data/tools/fop/lib/xalan.BCEL.LICENSE.txt +52 -0
- data/tools/fop/lib/xalan.LICENSE.txt +202 -0
- data/tools/fop/lib/xalan.NOTICE.txt +44 -0
- data/tools/fop/lib/xalan.regexp.LICENSE.txt +52 -0
- data/tools/fop/lib/xalan.runtime.LICENSE.txt +20 -0
- data/tools/fop/lib/xerces.LICENSE.txt +56 -0
- data/tools/fop/lib/xercesImpl-2.9.1.jar +0 -0
- data/tools/fop/lib/xercesImpl.LICENSE.txt +201 -0
- data/tools/fop/lib/xercesImpl.NOTICE.txt +14 -0
- data/tools/fop/lib/xml-apis-1.3.04.jar +0 -0
- data/tools/fop/lib/xml-apis-ext-1.3.04.jar +0 -0
- data/tools/fop/lib/xml-apis-ext.LICENSE.dom-documentation.txt +73 -0
- data/tools/fop/lib/xml-apis-ext.LICENSE.dom-software.txt +61 -0
- data/tools/fop/lib/xml-apis-ext.LICENSE.sac.html +75 -0
- data/tools/fop/lib/xml-apis-ext.LICENSE.txt +202 -0
- data/tools/fop/lib/xml-apis-ext.NOTICE.txt +16 -0
- data/tools/fop/lib/xml-apis-ext.README.dom.txt +56 -0
- data/tools/fop/lib/xml-apis.LICENSE-SAX.html +17 -0
- data/tools/fop/lib/xml-apis.LICENSE.DOM-documentation.html +74 -0
- data/tools/fop/lib/xml-apis.LICENSE.DOM-software.html +66 -0
- data/tools/fop/lib/xml-apis.LICENSE.txt +201 -0
- data/tools/fop/lib/xml-apis.NOTICE.txt +13 -0
- data/tools/fop/lib/xmlgraphics-commons-2.3.jar +0 -0
- data/tools/fop/lib/xmlgraphics-commons.LICENSE.txt +202 -0
- data/tools/fop/lib/xmlgraphics-commons.NOTICE.txt +5 -0
- data/tools/pdfbox/pdfbox-app-2.0.13.jar +0 -0
- data/tools/pdfbox/{pdfbox-app-1.8.10.jar → preflight-app-2.0.13.jar} +0 -0
- metadata +93 -259
- data/lib/libis/format/type_database.rb +0 -201
- data/spec/converter_audio_spec.rb +0 -66
- data/spec/converter_fop_spec.rb +0 -37
- data/spec/converter_image_spec.rb +0 -166
- data/spec/converter_office_spec.rb +0 -84
- data/spec/converter_pdf_spec.rb +0 -30
- data/spec/converter_repository_spec.rb +0 -97
- data/spec/converter_spreadsheet_spec.rb +0 -39
- data/spec/converter_video_spec.rb +0 -97
- data/spec/converter_xsl_spec.rb +0 -56
- data/spec/data/Cevennes2.bmp +0 -0
- data/spec/data/Cevennes2.jp2 +0 -0
- data/spec/data/Cevennes2.ppm +0 -22492
- data/spec/data/NikonRaw-CameraRaw.TIF +0 -0
- data/spec/data/NikonRaw-CaptureOne.tif +0 -0
- data/spec/data/audio/carlin_disappointed.aac +0 -0
- data/spec/data/audio/carlin_disappointed.ac3 +0 -0
- data/spec/data/audio/carlin_disappointed.aiff +0 -0
- data/spec/data/audio/carlin_disappointed.au +0 -0
- data/spec/data/audio/carlin_disappointed.flac +0 -0
- data/spec/data/audio/carlin_disappointed.m4a +0 -0
- data/spec/data/audio/carlin_disappointed.mka +0 -0
- data/spec/data/audio/carlin_disappointed.mp3 +0 -0
- data/spec/data/audio/carlin_disappointed.ogg +0 -0
- data/spec/data/audio/carlin_disappointed.ra +0 -0
- data/spec/data/audio/carlin_disappointed.voc +0 -0
- data/spec/data/audio/carlin_disappointed.wav +0 -0
- data/spec/data/audio/carlin_disappointed.wma +0 -0
- data/spec/data/audio/greensleeves.aac +0 -0
- data/spec/data/audio/greensleeves.ac3 +0 -0
- data/spec/data/audio/greensleeves.aiff +0 -0
- data/spec/data/audio/greensleeves.au +0 -0
- data/spec/data/audio/greensleeves.flac +0 -0
- data/spec/data/audio/greensleeves.m4a +0 -0
- data/spec/data/audio/greensleeves.mka +0 -0
- data/spec/data/audio/greensleeves.mp3 +0 -0
- data/spec/data/audio/greensleeves.ogg +0 -0
- data/spec/data/audio/greensleeves.ra +0 -0
- data/spec/data/audio/greensleeves.voc +0 -0
- data/spec/data/audio/greensleeves.wav +0 -0
- data/spec/data/audio/greensleeves.wma +0 -0
- data/spec/data/audio/king_nonviolence.aac +0 -0
- data/spec/data/audio/king_nonviolence.ac3 +0 -0
- data/spec/data/audio/king_nonviolence.aiff +0 -0
- data/spec/data/audio/king_nonviolence.au +0 -0
- data/spec/data/audio/king_nonviolence.flac +0 -0
- data/spec/data/audio/king_nonviolence.m4a +0 -0
- data/spec/data/audio/king_nonviolence.mka +0 -0
- data/spec/data/audio/king_nonviolence.mp3 +0 -0
- data/spec/data/audio/king_nonviolence.ogg +0 -0
- data/spec/data/audio/king_nonviolence.ra +0 -0
- data/spec/data/audio/king_nonviolence.voc +0 -0
- data/spec/data/audio/king_nonviolence.wav +0 -0
- data/spec/data/audio/king_nonviolence.wma +0 -0
- data/spec/data/audio/top_gun_secret.aac +0 -0
- data/spec/data/audio/top_gun_secret.ac3 +0 -0
- data/spec/data/audio/top_gun_secret.aiff +0 -0
- data/spec/data/audio/top_gun_secret.au +0 -0
- data/spec/data/audio/top_gun_secret.flac +0 -0
- data/spec/data/audio/top_gun_secret.m4a +0 -0
- data/spec/data/audio/top_gun_secret.mka +0 -0
- data/spec/data/audio/top_gun_secret.mp3 +0 -0
- data/spec/data/audio/top_gun_secret.ogg +0 -0
- data/spec/data/audio/top_gun_secret.ra +0 -0
- data/spec/data/audio/top_gun_secret.voc +0 -0
- data/spec/data/audio/top_gun_secret.wav +0 -0
- data/spec/data/audio/top_gun_secret.wma +0 -0
- data/spec/data/multipage.tif +0 -0
- data/spec/data/multipage.tif.jp2 +0 -0
- data/spec/data/test-ead.xml +0 -392
- data/spec/data/test-jpg.tif +0 -0
- data/spec/data/test-lzw.tif +0 -0
- data/spec/data/test-options.jpg +0 -0
- data/spec/data/test-options.png +0 -0
- data/spec/data/test.bmp +0 -0
- data/spec/data/test.doc +0 -0
- data/spec/data/test.docx +0 -0
- data/spec/data/test.gif +0 -0
- data/spec/data/test.jpg +0 -0
- data/spec/data/test.ods +0 -0
- data/spec/data/test.odt +0 -0
- data/spec/data/test.pdf +0 -0
- data/spec/data/test.pdf.tif +0 -0
- data/spec/data/test.png +0 -0
- data/spec/data/test.ps +0 -8631
- data/spec/data/test.psd +0 -0
- data/spec/data/test.rtf +0 -1455
- data/spec/data/test.tif +0 -0
- data/spec/data/test.txt +0 -12
- data/spec/data/test.xcf +0 -0
- data/spec/data/test.xls +0 -0
- data/spec/data/test.xlsx +0 -0
- data/spec/data/test.xml +0 -4
- data/spec/data/test_pdfa.pdf +0 -0
- data/spec/data/video/SampleVideo_1080x720_2mb.flv +0 -0
- data/spec/data/video/SampleVideo_1080x720_2mb.mkv +0 -0
- data/spec/data/video/SampleVideo_1080x720_2mb.mp4 +0 -0
- data/spec/data/video/SampleVideo_176x144_2mb.3gp +0 -0
- data/spec/data/video/SampleVideo_320x240_2mb.3gp +0 -0
- data/spec/data/video/SampleVideo_360x240_2mb.flv +0 -0
- data/spec/data/video/SampleVideo_360x240_2mb.mkv +0 -0
- data/spec/data/video/SampleVideo_360x240_2mb.mp4 +0 -0
- data/spec/data/video/copyright.png +0 -0
- data/spec/data/xml/134476_ead.XML +0 -1
- data/spec/data/xml/134476_ead.pdf +0 -0
- data/spec/data/xml/134476_fo.XML +0 -383
- data/spec/data/xml/134476_raw.XML +0 -141
- data/spec/data/xml/ead2fo_pdf.xsl +0 -1453
- data/spec/data/xml/header_nolink_pdf.xsl +0 -120
- data/spec/data/xml/lookupLists.xsl +0 -488
- data/spec/data/xml/scope_eadToHTML.xsl +0 -2376
- data/spec/data/xml/scope_xmlToEAD_dom.xsl +0 -952
- data/spec/identifier_spec.rb +0 -161
- data/spec/spec_helper.rb +0 -58
- data/spec/test_types.yml +0 -12
- data/spec/type_database_spec.rb +0 -140
- data/tools/bcpkix-jdk15on-1.49.jar +0 -0
- data/tools/bcprov-jdk15on-1.49.jar +0 -0
- data/tools/pdfbox/preflight-app-1.8.10.jar +0 -0
@@ -0,0 +1,77 @@
|
|
1
|
+
require 'awesome_print'
|
2
|
+
require 'libis-format'
|
3
|
+
require 'libis-tools'
|
4
|
+
|
5
|
+
require_relative 'sub_command'
|
6
|
+
|
7
|
+
module Libis
|
8
|
+
module Format
|
9
|
+
module Cli
|
10
|
+
class Format < SubCommand
|
11
|
+
|
12
|
+
no_commands do
|
13
|
+
def self.description(field)
|
14
|
+
"#{STRING_CONFIG[field]}." + (DEFAULT_CONFIG[field].nil? ? '' : " default: #{DEFAULT_CONFIG[field]}")
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
DEFAULT_CONFIG = {
|
19
|
+
droid: true,
|
20
|
+
fido: true,
|
21
|
+
file: true,
|
22
|
+
xml_validation: true
|
23
|
+
}
|
24
|
+
|
25
|
+
STRING_CONFIG = {
|
26
|
+
droid: 'Use Droid to identify the format',
|
27
|
+
fido: 'Use Fido to identify the format',
|
28
|
+
file: 'Use File to identify the format',
|
29
|
+
xml_validation: 'When XML file found, validate the file against known XML schemas',
|
30
|
+
}
|
31
|
+
|
32
|
+
desc 'identify FILE [options]', 'Identify the FILE using a combination of the tools.'
|
33
|
+
long_desc <<-DESC
|
34
|
+
|
35
|
+
'identify FILE [options]' will idnetify a file using a combination of tools.
|
36
|
+
|
37
|
+
The file will be identified by each of the selected tools in turn and the format with best score will be
|
38
|
+
selected to give the final result. The score is determined by the identification method and will be lowered if
|
39
|
+
a known weak format (e.g. zip file) is detected.
|
40
|
+
|
41
|
+
The tool will display as much information about the format as possible, including the format candidates that
|
42
|
+
were not selected.
|
43
|
+
|
44
|
+
DESC
|
45
|
+
|
46
|
+
method_option :droid, default: DEFAULT_CONFIG[:droid], type: :boolean, desc: STRING_CONFIG[:droid]
|
47
|
+
method_option :fido, default: DEFAULT_CONFIG[:fido], type: :boolean, desc: STRING_CONFIG[:fido]
|
48
|
+
method_option :file, default: DEFAULT_CONFIG[:file], type: :boolean, desc: STRING_CONFIG[:file]
|
49
|
+
method_option :xml_validation, default: DEFAULT_CONFIG[:xml_validation], type: :boolean, desc: STRING_CONFIG[:xml_validation]
|
50
|
+
|
51
|
+
def identify(source_file)
|
52
|
+
::Libis::Tools::Config.logger.level = :WARN
|
53
|
+
opts = options.inject({}) { |h, x| h[x.first.to_sym] = x.last; h}
|
54
|
+
opts[:keep_output] = true
|
55
|
+
result = ::Libis::Format::Identifier.get source_file, opts
|
56
|
+
puts '--- messages ---'
|
57
|
+
result[:messages].each do |message|
|
58
|
+
puts "#{message[0]} : #{message[1]}"
|
59
|
+
end
|
60
|
+
|
61
|
+
puts '--- formats ---'
|
62
|
+
result[:formats].each do |file, info|
|
63
|
+
puts "#{file}:"
|
64
|
+
ap info
|
65
|
+
end
|
66
|
+
|
67
|
+
puts '--- tool results ---'
|
68
|
+
result[:output].each do |file, info|
|
69
|
+
puts "#{file}:"
|
70
|
+
ap info
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
@@ -0,0 +1,87 @@
|
|
1
|
+
require 'tty-prompt'
|
2
|
+
require 'pastel'
|
3
|
+
|
4
|
+
module Libis
|
5
|
+
module Format
|
6
|
+
module Cli
|
7
|
+
module PromptHelper
|
8
|
+
|
9
|
+
attr_reader :prompt, :pastel
|
10
|
+
|
11
|
+
def initialize(*args)
|
12
|
+
@prompt = TTY::Prompt.new
|
13
|
+
@pastel = Pastel.new
|
14
|
+
super
|
15
|
+
end
|
16
|
+
|
17
|
+
protected
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
def index_of(list, value)
|
22
|
+
i = list.index(value)
|
23
|
+
i += 1 if i
|
24
|
+
i || 1
|
25
|
+
end
|
26
|
+
|
27
|
+
def ask(question, bool: false, enum: nil, default: nil, mask: false)
|
28
|
+
cmd, args, opts = :ask, [question], {}
|
29
|
+
if enum
|
30
|
+
cmd = :select
|
31
|
+
args << enum
|
32
|
+
# Change default to its index in the enum
|
33
|
+
default = index_of(enum, default)
|
34
|
+
end
|
35
|
+
cmd = :mask if mask
|
36
|
+
opts[:default] = default if default
|
37
|
+
cmd = (opts[:default] ? :yes? : :no?) if bool
|
38
|
+
prompt.send(cmd, *args, opts)
|
39
|
+
end
|
40
|
+
|
41
|
+
def tree_select(path, question: nil, file: false, page_size: 22, filter: true, cycle: false, create: false,
|
42
|
+
default_choices: nil)
|
43
|
+
path = Pathname.new(path) unless path.is_a? Pathname
|
44
|
+
|
45
|
+
return path unless path.exist?
|
46
|
+
path = path.realpath
|
47
|
+
|
48
|
+
dirs = path.children.select(&:directory?).sort
|
49
|
+
files = file ? path.children.select(&:file?).sort : []
|
50
|
+
|
51
|
+
choices = []
|
52
|
+
choices << {name: "Folder: #{path}", value: path, disabled: file ? '' : false}
|
53
|
+
choices += default_choices if default_choices
|
54
|
+
choices << {name: '-- new directory --', value: -> do
|
55
|
+
new_name = prompt.ask('new directory name:', modify: :trim, required: true)
|
56
|
+
new_path = path + new_name
|
57
|
+
FileUtils.mkdir(new_path.to_path)
|
58
|
+
new_path
|
59
|
+
end
|
60
|
+
} if create
|
61
|
+
|
62
|
+
choices << {name: "-- new file --", value: -> do
|
63
|
+
new_name = prompt.ask('new file name:', modify: :trim, required: true)
|
64
|
+
path + new_name
|
65
|
+
end
|
66
|
+
} if file && create
|
67
|
+
|
68
|
+
choices << {name: '[..]', value: path.parent}
|
69
|
+
|
70
|
+
dirs.each {|d| choices << {name: "[#{d.basename}]", value: d}}
|
71
|
+
files.each {|f| choices << {name: f.basename.to_path, value: f}}
|
72
|
+
|
73
|
+
question ||= "Select #{'file or ' if files}directory"
|
74
|
+
selection = prompt.select question, choices,
|
75
|
+
per_page: page_size, filter: filter, cycle: cycle, default: file ? 2 : 1
|
76
|
+
|
77
|
+
return selection unless selection.is_a? Pathname
|
78
|
+
return selection.to_path if selection == path || selection.file?
|
79
|
+
|
80
|
+
tree_select selection, question: question, file: file, page_size: page_size, filter: filter,
|
81
|
+
cycle: cycle, create: create, default_choices: default_choices
|
82
|
+
end
|
83
|
+
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'thor'
|
2
|
+
require_relative 'prompt_helper'
|
3
|
+
|
4
|
+
module Libis
|
5
|
+
module Format
|
6
|
+
module Cli
|
7
|
+
class SubCommand < Thor
|
8
|
+
|
9
|
+
include PromptHelper
|
10
|
+
|
11
|
+
def self.banner(command, namespace = nil, subcommand = false)
|
12
|
+
"#{basename} #{subcommand_prefix} #{command.usage}"
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.subcommand_prefix
|
16
|
+
self.name.gsub(%r{.*::}, '').gsub(%r{^[A-Z]}) { |match| match[0].downcase }.gsub(%r{[A-Z]}) { |match| "-#{match[0].downcase}" }
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'thor'
|
2
|
+
require 'tty-prompt'
|
3
|
+
require 'tty-config'
|
4
|
+
|
5
|
+
require 'libis/format/cli/convert'
|
6
|
+
require 'libis/format/cli/format'
|
7
|
+
|
8
|
+
module Libis
|
9
|
+
module Format
|
10
|
+
|
11
|
+
class CommandLine < Thor
|
12
|
+
|
13
|
+
def self.exit_on_failure?
|
14
|
+
true
|
15
|
+
end
|
16
|
+
|
17
|
+
desc 'convert', 'perform format conversion on a given file'
|
18
|
+
subcommand 'convert', Cli::Convert
|
19
|
+
|
20
|
+
desc 'format', 'perform format identification on a given file or directory'
|
21
|
+
subcommand 'format', Cli::Format
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
end
|
data/lib/libis/format/config.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
require 'os'
|
3
|
+
require 'libis-tools'
|
3
4
|
|
4
5
|
module Libis
|
5
6
|
module Format
|
@@ -9,20 +10,23 @@ module Libis
|
|
9
10
|
|
10
11
|
Config[:converter_chain_max_level] = 8
|
11
12
|
|
12
|
-
Config[:
|
13
|
-
Config[:
|
14
|
-
Config[:
|
15
|
-
Config[:
|
16
|
-
Config[:
|
17
|
-
Config[:
|
18
|
-
Config[:
|
19
|
-
Config[:
|
13
|
+
Config[:java_cmd] = 'java'
|
14
|
+
Config[:j2k_cmd] = 'j2kdriver'
|
15
|
+
Config[:soffice_cmd] = 'soffice'
|
16
|
+
Config[:ghostscript_cmd] = 'gs'
|
17
|
+
Config[:droid_cmd] = '/opt/droid/droid.sh'
|
18
|
+
Config[:droid_temp_path] = '/tmp'
|
19
|
+
Config[:fido_cmd] = '/usr/local/bin/fido'
|
20
|
+
Config[:fop_jar] = File.join(Libis::Format::TOOL_DIR, 'fop', 'build', 'fop.jar')
|
21
|
+
Config[:ffmpeg_cmd] = 'ffmpeg'
|
20
22
|
Config[:fido_formats] = [(File.join(Libis::Format::DATA_DIR, 'lias_formats.xml'))]
|
21
23
|
Config[:pdf_tool] = File.join(Libis::Format::TOOL_DIR, 'PdfTool.jar')
|
24
|
+
Config[:preflight_jar] = File.join(Libis::Format::TOOL_DIR, 'pdfbox', 'preflight-app-2.0.13.jar')
|
22
25
|
# noinspection RubyStringKeysInHashInspection
|
23
26
|
Config[:xml_validations] = [['archive/ead', File.join(Libis::Format::DATA_DIR, 'ead.xsd')]]
|
24
|
-
Config[:
|
25
|
-
Config[:
|
27
|
+
Config[:format_library_implementation] = 'Libis::Format::YamlLoader.instance'
|
28
|
+
Config[:format_library_database] = File.join(Libis::Format::DATA_DIR, 'types.yml')
|
29
|
+
Config[:raw_audio_convert_cmd] = 'sox -V1 %s -e signed -b 16 -t wav %s rate %d channels %d'
|
26
30
|
Config[:watermark_font] = '/usr/share/fonts/truetype/liberation/LiberationSans-Regular.ttf'
|
27
31
|
Config[:timeouts] = {
|
28
32
|
droid: 20 * 60,
|
@@ -32,6 +36,7 @@ module Libis
|
|
32
36
|
fop: 5 * 60,
|
33
37
|
identification_tool: 5 * 60,
|
34
38
|
office_to_pdf: 5 * 60,
|
39
|
+
pdf_select: 5 * 60,
|
35
40
|
pdf_copy: 5 * 60,
|
36
41
|
pdf_merge: 5 * 60,
|
37
42
|
pdf_optimizer: 5 * 60,
|
@@ -15,7 +15,7 @@ module Libis
|
|
15
15
|
end
|
16
16
|
|
17
17
|
def self.output_types(format = nil)
|
18
|
-
return [] unless input_types.include?(format)
|
18
|
+
return [] unless format.nil? || input_types.include?(format)
|
19
19
|
[:MP3, :FLAC, :AC3, :AAC, :WMA, :ALAC, :WAV, :AIFF, :AMR, :AU, :M4A]
|
20
20
|
end
|
21
21
|
|
@@ -69,50 +69,16 @@ module Libis
|
|
69
69
|
(@options[:preset] ||= {})[stream] = name
|
70
70
|
end
|
71
71
|
|
72
|
-
# def encoder(value)
|
73
|
-
# @options[:encoder] = value
|
74
|
-
# end
|
75
|
-
#
|
76
|
-
# def encoder_options(value)
|
77
|
-
# @options[:encoder_options] = value
|
78
|
-
# end
|
79
|
-
|
80
72
|
def convert(source, target, _format, opts = {})
|
81
73
|
super
|
82
74
|
|
83
75
|
FileUtils.mkpath(File.dirname(target))
|
84
76
|
|
85
|
-
|
86
|
-
|
87
|
-
assemble_and_convert(source, target)
|
88
|
-
|
89
|
-
elsif File.directory?(source)
|
90
|
-
|
91
|
-
sources = Dir[File.join(source, '**', '*')].reject {|p| File.directory? p}
|
92
|
-
assemble_and_convert(sources, target)
|
77
|
+
convert_file(source, target)
|
93
78
|
|
94
|
-
else
|
95
|
-
|
96
|
-
convert_file(source, target)
|
97
|
-
|
98
|
-
end
|
99
|
-
|
100
|
-
target
|
101
|
-
|
102
|
-
end
|
103
|
-
|
104
|
-
def assemble_and_convert(sources, target)
|
105
|
-
Tempfile.create(%w(list .txt)) do |f|
|
106
|
-
sources.each {|src| f.puts src}
|
107
|
-
opts[:global] ||= []
|
108
|
-
opts[:global] += %w(-f concat)
|
109
|
-
f.close
|
110
|
-
target = convert_file(f.to_path, target)
|
111
|
-
end
|
112
|
-
target
|
113
79
|
end
|
114
80
|
|
115
|
-
def sounds_like(file1, file2, threshold, rate, channels)
|
81
|
+
def self.sounds_like(file1, file2, threshold, rate, channels)
|
116
82
|
rate ||= 96000
|
117
83
|
channels ||= 2
|
118
84
|
threshold ||= 0.85
|
@@ -4,7 +4,8 @@
|
|
4
4
|
require 'tmpdir'
|
5
5
|
require 'libis/tools/logger'
|
6
6
|
require 'libis/tools/temp_file'
|
7
|
-
require 'libis/
|
7
|
+
require 'libis/tools/extend/string'
|
8
|
+
require 'libis/format/library'
|
8
9
|
|
9
10
|
require_relative 'repository'
|
10
11
|
|
@@ -22,10 +23,23 @@ module Libis
|
|
22
23
|
@flags = {}
|
23
24
|
end
|
24
25
|
|
26
|
+
def self.category
|
27
|
+
:converter
|
28
|
+
end
|
29
|
+
|
30
|
+
def check_file_exist(file)
|
31
|
+
unless File.exist? file
|
32
|
+
error "Cannot find file '#{file}'."
|
33
|
+
return false
|
34
|
+
end
|
35
|
+
true
|
36
|
+
end
|
37
|
+
|
25
38
|
def convert(source, target, format, opts = {})
|
26
|
-
|
27
|
-
|
28
|
-
|
39
|
+
if source.is_a?(Array)
|
40
|
+
return nil unless source.map { |f| check_file_exist(f) }.reduce(:&)
|
41
|
+
else
|
42
|
+
return nil unless check_file_exist(source)
|
29
43
|
end
|
30
44
|
@options.merge!(opts[:options]) if opts[:options]
|
31
45
|
@flags.merge!(opts[:flags]) if opts[:flags]
|
@@ -51,7 +65,7 @@ module Libis
|
|
51
65
|
target
|
52
66
|
end
|
53
67
|
|
54
|
-
def Base.inherited(
|
68
|
+
def Base.inherited(klass)
|
55
69
|
|
56
70
|
Repository.register klass
|
57
71
|
|
@@ -73,12 +87,12 @@ module Libis
|
|
73
87
|
end
|
74
88
|
|
75
89
|
def input_mimetype?(mimetype)
|
76
|
-
type_id =
|
90
|
+
type_id = Libis::Format::Library.get_field_by(:mimetype, mimetype, :format)
|
77
91
|
input_type? type_id
|
78
92
|
end
|
79
93
|
|
80
94
|
def output_mimetype?(mimetype)
|
81
|
-
type_id =
|
95
|
+
type_id = Libis::Format::Library.get_field_by(:mimetype, mimetype, :format)
|
82
96
|
output_type? type_id
|
83
97
|
end
|
84
98
|
|
@@ -91,7 +105,7 @@ module Libis
|
|
91
105
|
end
|
92
106
|
|
93
107
|
def extension?(extension)
|
94
|
-
!
|
108
|
+
!Libis::Format::Library.get_field_by(:extension, extension, :format).nil?
|
95
109
|
end
|
96
110
|
|
97
111
|
end
|
@@ -5,7 +5,7 @@ require 'deep_dive'
|
|
5
5
|
|
6
6
|
require 'libis/tools/logger'
|
7
7
|
require 'libis/tools/extend/hash'
|
8
|
-
require 'libis/format/
|
8
|
+
require 'libis/format/library'
|
9
9
|
|
10
10
|
module Libis
|
11
11
|
module Format
|
@@ -83,8 +83,8 @@ module Libis
|
|
83
83
|
target = target_file
|
84
84
|
|
85
85
|
if i < size - 1
|
86
|
-
target += ".temp.#{
|
87
|
-
target += ".#{
|
86
|
+
target += ".temp.#{Libis::Format::Library.get_field(target_type, :extensions).first}"
|
87
|
+
target += ".#{Libis::Format::Library.get_field(target_type, :extensions).first}" while File.exist? target
|
88
88
|
temp_files << target
|
89
89
|
end
|
90
90
|
|
@@ -0,0 +1,82 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require_relative 'base'
|
4
|
+
require 'libis/format/identifier'
|
5
|
+
|
6
|
+
require 'mini_magick'
|
7
|
+
|
8
|
+
MiniMagick.logger.level = ::Logger::UNKNOWN
|
9
|
+
|
10
|
+
MiniMagick.configure do |config|
|
11
|
+
# config.cli = :graphicsmagick
|
12
|
+
config.validate_on_create = false
|
13
|
+
config.validate_on_write = false
|
14
|
+
config.whiny = false
|
15
|
+
end
|
16
|
+
|
17
|
+
module Libis
|
18
|
+
module Format
|
19
|
+
module Converter
|
20
|
+
|
21
|
+
# noinspection RubyTooManyInstanceVariablesInspection,DuplicatedCode
|
22
|
+
class ImageAssembler < Libis::Format::Converter::Base
|
23
|
+
|
24
|
+
def self.input_types
|
25
|
+
[:TIFF, :JPG, :PNG, :BMP, :GIF, :PDF, :JP2]
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.output_types(format = nil)
|
29
|
+
return [] unless input_types.include?(format) if format
|
30
|
+
[:PDF, :TIFF, :GIF, :PBM, :PGM, :PPM]
|
31
|
+
end
|
32
|
+
|
33
|
+
def self.category
|
34
|
+
:assembler
|
35
|
+
end
|
36
|
+
|
37
|
+
def image_assemble(_)
|
38
|
+
#force usage of this converter
|
39
|
+
end
|
40
|
+
|
41
|
+
def quiet(v)
|
42
|
+
@quiet = !!v
|
43
|
+
end
|
44
|
+
|
45
|
+
def convert(source, target, format, opts = {})
|
46
|
+
super
|
47
|
+
|
48
|
+
FileUtils.mkpath(File.dirname(target))
|
49
|
+
|
50
|
+
if source.is_a? Array
|
51
|
+
assemble(source, target, format)
|
52
|
+
elsif File.directory?(source)
|
53
|
+
source_list = Dir[File.join(source, '**', '*')].reject {|p| File.directory? p}
|
54
|
+
assemble(source_list, target, format)
|
55
|
+
else
|
56
|
+
image = MiniMagick::Image.open(source) {|b| b.quiet}
|
57
|
+
if image.pages.size > 1
|
58
|
+
assemble(image.pages.map {|page| page.path}, target, format)
|
59
|
+
else
|
60
|
+
assemble([source], target, format)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
target
|
65
|
+
|
66
|
+
end
|
67
|
+
|
68
|
+
private
|
69
|
+
|
70
|
+
def assemble(sources, target, format)
|
71
|
+
MiniMagick::Tool::Convert.new do |b|
|
72
|
+
sources.each {|source| b << source}
|
73
|
+
convert.format(format)
|
74
|
+
b << target
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
end
|
79
|
+
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|