hydra-works 0.16.0 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (62) hide show
  1. checksums.yaml +5 -5
  2. data/.circleci/config.yml +59 -0
  3. data/.gitignore +3 -1
  4. data/.rubocop.yml +2 -6
  5. data/.rubocop_todo.yml +5 -0
  6. data/.solr_wrapper +1 -0
  7. data/CHANGELOG.md +621 -0
  8. data/CODE_OF_CONDUCT.md +36 -0
  9. data/CONTRIBUTING.md +23 -21
  10. data/Gemfile +11 -3
  11. data/LICENSE +14 -16
  12. data/README.md +54 -12
  13. data/SUPPORT.md +5 -0
  14. data/hydra-works.gemspec +15 -13
  15. data/lib/hydra/works/characterization.rb +5 -4
  16. data/lib/hydra/works/characterization/fits_document.rb +348 -144
  17. data/lib/hydra/works/characterization/schema/audio_schema.rb +2 -0
  18. data/lib/hydra/works/characterization/schema/video_schema.rb +2 -0
  19. data/lib/hydra/works/models/concerns/collection_behavior.rb +44 -0
  20. data/lib/hydra/works/models/concerns/file_set_behavior.rb +20 -0
  21. data/lib/hydra/works/models/concerns/work_behavior.rb +54 -0
  22. data/lib/hydra/works/services/add_external_file_to_file_set.rb +1 -1
  23. data/lib/hydra/works/services/add_file_to_file_set.rb +1 -1
  24. data/lib/hydra/works/services/characterization_service.rb +5 -0
  25. data/lib/hydra/works/services/determine_original_name.rb +1 -1
  26. data/lib/hydra/works/version.rb +1 -1
  27. data/lib/hydra/works/virus_scanner.rb +18 -2
  28. data/spec/fixtures/fits_0.8.5_tiff.xml +78 -0
  29. data/spec/fixtures/fits_1.2.0_avi.xml +83 -0
  30. data/spec/fixtures/fits_1.2.0_jpg.xml +76 -0
  31. data/spec/fixtures/fits_1.2.0_mp3.xml +51 -0
  32. data/spec/fixtures/fits_1.2.0_mp4.xml +88 -0
  33. data/spec/fixtures/fits_netcdf_two_mimetypes.xml +35 -0
  34. data/spec/hydra/works/characterization_spec.rb +12 -5
  35. data/spec/hydra/works/models/collection_spec.rb +162 -0
  36. data/spec/hydra/works/models/concerns/file_set/contained_files_spec.rb +3 -16
  37. data/spec/hydra/works/models/file_set_spec.rb +47 -0
  38. data/spec/hydra/works/models/work_spec.rb +213 -7
  39. data/spec/hydra/works/services/characterization_service_spec.rb +90 -27
  40. data/spec/hydra/works/services/persist_derivatives_spec.rb +6 -6
  41. data/spec/hydra/works/virus_scanner_spec.rb +31 -0
  42. data/use-cases/princeton_book_use_case.md +1 -1
  43. metadata +77 -67
  44. data/.travis.yml +0 -15
  45. data/lib/hydra/works/characterization/fits_mapper.rb +0 -0
  46. data/solr/config/_rest_managed.json +0 -3
  47. data/solr/config/admin-extra.html +0 -31
  48. data/solr/config/elevate.xml +0 -36
  49. data/solr/config/mapping-ISOLatin1Accent.txt +0 -246
  50. data/solr/config/protwords.txt +0 -21
  51. data/solr/config/schema.xml +0 -372
  52. data/solr/config/scripts.conf +0 -24
  53. data/solr/config/solrconfig.xml +0 -419
  54. data/solr/config/spellings.txt +0 -2
  55. data/solr/config/stopwords.txt +0 -58
  56. data/solr/config/stopwords_en.txt +0 -58
  57. data/solr/config/synonyms.txt +0 -31
  58. data/solr/config/xslt/example.xsl +0 -132
  59. data/solr/config/xslt/example_atom.xsl +0 -67
  60. data/solr/config/xslt/example_rss.xsl +0 -66
  61. data/solr/config/xslt/luke.xsl +0 -337
  62. data/spec/fixtures/eicar.txt +0 -1
@@ -4,6 +4,8 @@ module Hydra::Works::Characterization
4
4
  property :channels, predicate: RDF::Vocab::NFO.channels
5
5
  property :data_format, predicate: RDF::Vocab::EBUCore.hasDataFormat
6
6
  property :frame_rate, predicate: RDF::Vocab::NFO.frameRate
7
+ # bit_rate might be an array containing multiple values
8
+ property :bit_rate, predicate: RDF::Vocab::EBUCore.bitRate
7
9
  property :duration, predicate: RDF::Vocab::NFO.duration
8
10
  property :sample_rate, predicate: RDF::Vocab::EBUCore.sampleRate
9
11
  # properties without cannonical URIs
@@ -3,7 +3,9 @@ module Hydra::Works::Characterization
3
3
  property :height, predicate: RDF::Vocab::EBUCore.height
4
4
  property :width, predicate: RDF::Vocab::EBUCore.width
5
5
  property :frame_rate, predicate: RDF::Vocab::NFO.frameRate
6
+ property :bit_rate, predicate: RDF::Vocab::EBUCore.bitRate
6
7
  property :duration, predicate: RDF::Vocab::NFO.duration
7
8
  property :sample_rate, predicate: RDF::Vocab::EBUCore.sampleRate
9
+ property :aspect_ratio, predicate: RDF::Vocab::EBUCore.aspectRatio
8
10
  end
9
11
  end
@@ -28,6 +28,30 @@ module Hydra::Works
28
28
  type [Hydra::PCDM::Vocab::PCDMTerms.Collection, Vocab::WorksTerms.Collection]
29
29
  end
30
30
 
31
+ def parent_collections
32
+ in_collections + member_of_collections
33
+ end
34
+
35
+ def parent_collection_ids
36
+ in_collection_ids + member_of_collection_ids
37
+ end
38
+
39
+ def child_collections
40
+ collections + member_collections
41
+ end
42
+
43
+ def child_collection_ids
44
+ collection_ids + member_collection_ids
45
+ end
46
+
47
+ def child_works
48
+ works + member_works
49
+ end
50
+
51
+ def child_work_ids
52
+ work_ids + member_work_ids
53
+ end
54
+
31
55
  def ordered_works
32
56
  ordered_members.to_a.select(&:work?)
33
57
  end
@@ -44,6 +68,26 @@ module Hydra::Works
44
68
  works.map(&:id)
45
69
  end
46
70
 
71
+ def member_collections
72
+ return [] if id.nil?
73
+ member_objects = ActiveFedora::Base.where('member_of_collection_ids_ssim' => id)
74
+ member_objects.select(&:collection?).to_a
75
+ end
76
+
77
+ def member_collection_ids
78
+ member_collections.map(&:id)
79
+ end
80
+
81
+ def member_works
82
+ return [] if id.nil?
83
+ member_objects = ActiveFedora::Base.where('member_of_collection_ids_ssim' => id)
84
+ member_objects.select(&:work?).to_a
85
+ end
86
+
87
+ def member_work_ids
88
+ member_works.map(&:id)
89
+ end
90
+
47
91
  # @return [Boolean] whether this instance is a Hydra::Works Collection.
48
92
  def collection?
49
93
  true
@@ -43,10 +43,30 @@ module Hydra::Works
43
43
  true
44
44
  end
45
45
 
46
+ def parent_works
47
+ in_works + member_of_works
48
+ end
49
+
50
+ def parent_work_ids
51
+ in_work_ids + member_of_work_ids
52
+ end
53
+
46
54
  def in_works
47
55
  ordered_by.select { |parent| parent.class.included_modules.include?(Hydra::Works::WorkBehavior) }.to_a
48
56
  end
49
57
 
58
+ def in_work_ids
59
+ in_works.map(&:id)
60
+ end
61
+
62
+ def member_of_works
63
+ member_of.select(&:work?).to_a
64
+ end
65
+
66
+ def member_of_work_ids
67
+ member_of_works.map(&:id)
68
+ end
69
+
50
70
  private
51
71
 
52
72
  def remove_from_works
@@ -29,6 +29,38 @@ module Hydra::Works
29
29
  type [Hydra::PCDM::Vocab::PCDMTerms.Object, Vocab::WorksTerms.Work]
30
30
  end
31
31
 
32
+ def parent_collections
33
+ in_collections + member_of_collections
34
+ end
35
+
36
+ def parent_collection_ids
37
+ in_collection_ids + member_of_collection_ids
38
+ end
39
+
40
+ def parent_works
41
+ in_works + member_of_works
42
+ end
43
+
44
+ def parent_work_ids
45
+ in_work_ids + member_of_work_ids
46
+ end
47
+
48
+ def child_works
49
+ works + member_works
50
+ end
51
+
52
+ def child_work_ids
53
+ work_ids + member_work_ids
54
+ end
55
+
56
+ def child_file_sets
57
+ file_sets
58
+ end
59
+
60
+ def child_file_set_ids
61
+ file_set_ids
62
+ end
63
+
32
64
  def works
33
65
  members.select(&:work?)
34
66
  end
@@ -37,6 +69,16 @@ module Hydra::Works
37
69
  works.map(&:id)
38
70
  end
39
71
 
72
+ def member_works
73
+ return [] if id.nil?
74
+ member_objects = ActiveFedora::Base.where('object_ids_ssim' => id)
75
+ member_objects.select(&:work?).to_a
76
+ end
77
+
78
+ def member_work_ids
79
+ member_works.map(&:id)
80
+ end
81
+
40
82
  def ordered_works
41
83
  ordered_members.to_a.select(&:work?)
42
84
  end
@@ -82,6 +124,18 @@ module Hydra::Works
82
124
  ordered_by.select { |parent| parent.class.included_modules.include?(Hydra::Works::WorkBehavior) }.to_a
83
125
  end
84
126
 
127
+ def in_work_ids
128
+ in_works.map(&:id)
129
+ end
130
+
131
+ def member_of_works
132
+ in_objects.to_a.select(&:work?)
133
+ end
134
+
135
+ def member_of_work_ids
136
+ member_of_works.map(&:id)
137
+ end
138
+
85
139
  private
86
140
 
87
141
  # Remove this object from parent works or collections
@@ -15,7 +15,7 @@ module Hydra::Works
15
15
  versioning = opts.fetch(:versioning, true)
16
16
  filename = opts.fetch(:filename, external_file_url)
17
17
 
18
- # TODO: required as a workaround for https://github.com/projecthydra/active_fedora/pull/858
18
+ # TODO: required as a workaround for https://github.com/samvera/active_fedora/pull/858
19
19
  file_set.save unless file_set.persisted?
20
20
 
21
21
  updater_class = versioning ? VersioningUpdater : Updater
@@ -11,7 +11,7 @@ module Hydra::Works
11
11
  fail ArgumentError, 'supplied object must be a file set' unless file_set.file_set?
12
12
  fail ArgumentError, 'supplied file must respond to read' unless file.respond_to? :read
13
13
 
14
- # TODO: required as a workaround for https://github.com/projecthydra/active_fedora/pull/858
14
+ # TODO: required as a workaround for https://github.com/samvera/active_fedora/pull/858
15
15
  file_set.save unless file_set.persisted?
16
16
 
17
17
  updater_class = versioning ? VersioningUpdater : Updater
@@ -1,4 +1,5 @@
1
1
  require 'hydra-file_characterization'
2
+ require 'nokogiri'
2
3
 
3
4
  module Hydra::Works
4
5
  class CharacterizationService
@@ -62,6 +63,7 @@ module Hydra::Works
62
63
  def parse_metadata(metadata)
63
64
  omdoc = parser_class.new
64
65
  omdoc.ng_xml = Nokogiri::XML(metadata) if metadata.present?
66
+ omdoc.__cleanup__ if omdoc.respond_to? :__cleanup__
65
67
  characterization_terms(omdoc)
66
68
  end
67
69
 
@@ -101,7 +103,10 @@ module Hydra::Works
101
103
  end
102
104
 
103
105
  def append_property_value(property, value)
106
+ # We don't want multiple mime_types; this overwrites each time to accept last value
104
107
  value = object.send(property) + [value] unless property == :mime_type
108
+ # We don't want multiple heights / widths, pick the max
109
+ value = value.map(&:to_i).max.to_s if property == :height || property == :width
105
110
  object.send("#{property}=", value)
106
111
  end
107
112
  end
@@ -1,7 +1,7 @@
1
1
  module Hydra::Works
2
2
  class DetermineOriginalName
3
3
  # Determines the original name for a given file
4
- # @param [IO, File, Rack::Multipart::UploadedFile, #read] file
4
+ # @param [IO, File, Rack::Multipart::UploadedFile] file
5
5
  # @return [String]
6
6
  def self.call(file)
7
7
  return file.original_name if file.respond_to?(:original_name)
@@ -1,5 +1,5 @@
1
1
  module Hydra
2
2
  module Works
3
- VERSION = '0.16.0'.freeze
3
+ VERSION = '2.0.0'.freeze
4
4
  end
5
5
  end
@@ -30,16 +30,32 @@ module Hydra::Works
30
30
  # Override this method to use your own virus checking software
31
31
  # @return [Boolean]
32
32
  def infected?
33
- defined?(ClamAV) ? clam_av_scanner : null_scanner
33
+ if defined?(Clamby)
34
+ clamby_scanner
35
+ elsif defined?(ClamAV)
36
+ clam_av_scanner
37
+ else
38
+ null_scanner
39
+ end
34
40
  end
35
41
 
36
42
  def clam_av_scanner
43
+ Deprecation.warn(self, "The ClamAV has been replaced by Clamby " \
44
+ "as the supported virus scanner for hydra-works. " \
45
+ "ClamAV support will be removed in hydra-works 2.0 ")
37
46
  scan_result = ClamAV.instance.method(:scanfile).call(file)
38
47
  return false if scan_result == 0
39
48
  warning "A virus was found in #{file}: #{scan_result}"
40
49
  true
41
50
  end
42
51
 
52
+ # @return [Boolean]
53
+ def clamby_scanner
54
+ scan_result = Clamby.virus?(file)
55
+ warning("A virus was found in #{file}") if scan_result
56
+ scan_result
57
+ end
58
+
43
59
  # Always return zero if there's nothing available to check for viruses. This means that
44
60
  # we assume all files have no viruses because we can't conclusively say if they have or not.
45
61
  def null_scanner
@@ -50,7 +66,7 @@ module Hydra::Works
50
66
  private
51
67
 
52
68
  def warning(msg)
53
- ActiveFedora::Base.logger.warn(msg) if ActiveFedora::Base.logger
69
+ ActiveFedora::Base.logger&.warn(msg)
54
70
  end
55
71
  end
56
72
  end
@@ -0,0 +1,78 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <fits xmlns="http://hul.harvard.edu/ois/xml/ns/fits/fits_output" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://hul.harvard.edu/ois/xml/ns/fits/fits_output http://hul
3
+ .harvard.edu/ois/xml/xsd/fits/fits_output.xsd" version="0.8.5" timestamp="6/20/17 11:20 AM">
4
+ <identification>
5
+ <identity format="Tagged Image File Format" mimetype="image/tiff" toolname="FITS" toolversion="0.8.5">
6
+ <tool toolname="Jhove" toolversion="1.5" />
7
+ <tool toolname="file utility" toolversion="5.14" />
8
+ <tool toolname="Exiftool" toolversion="9.13" />
9
+ <tool toolname="ffident" toolversion="0.2" />
10
+ <tool toolname="Tika" toolversion="1.3" />
11
+ <version toolname="Jhove" toolversion="1.5">6.0</version>
12
+ </identity>
13
+ </identification>
14
+ <fileinfo>
15
+ <size toolname="Jhove" toolversion="1.5">11082294</size>
16
+ <creatingApplicationName toolname="Jhove" toolversion="1.5">Capture One 8 Macintosh</creatingApplicationName>
17
+ <lastmodified toolname="Exiftool" toolversion="9.13" status="CONFLICT">2017:06:19 14:26:24-04:00</lastmodified>
18
+ <lastmodified toolname="Tika" toolversion="1.3" status="CONFLICT">2016-08-22T11:40:49</lastmodified>
19
+ <created toolname="Exiftool" toolversion="9.13" status="SINGLE_RESULT">2016:08:22 11:40:49</created>
20
+ <filepath toolname="OIS File Information" toolversion="0.2" status="SINGLE_RESULT">/home/ubuntu/2012-002_928.tif</filepath>
21
+ <filename toolname="OIS File Information" toolversion="0.2" status="SINGLE_RESULT">2012-002_928.tif</filename>
22
+ <md5checksum toolname="OIS File Information" toolversion="0.2" status="SINGLE_RESULT">b8344bf2f88bd421986d9ac988578e28</md5checksum>
23
+ <fslastmodified toolname="OIS File Information" toolversion="0.2" status="SINGLE_RESULT">1497896784000</fslastmodified>
24
+ </fileinfo>
25
+ <filestatus>
26
+ <well-formed toolname="Jhove" toolversion="1.5" status="SINGLE_RESULT">true</well-formed>
27
+ <valid toolname="Jhove" toolversion="1.5" status="SINGLE_RESULT">true</valid>
28
+ </filestatus>
29
+ <metadata>
30
+ <image>
31
+ <byteOrder toolname="Jhove" toolversion="1.5" status="SINGLE_RESULT">little endian</byteOrder>
32
+ <byteOrder toolname="Jhove" toolversion="1.5" status="SINGLE_RESULT">little endian</byteOrder>
33
+ <compressionScheme toolname="Jhove" toolversion="1.5">Uncompressed</compressionScheme>
34
+ <imageWidth toolname="Tika" toolversion="1.3" status="CONFLICT">160</imageWidth>
35
+ <imageWidth toolname="Jhove" toolversion="1.5" status="CONFLICT">2226</imageWidth>
36
+ <imageHeight toolname="Jhove" toolversion="1.5" status="CONFLICT">1650</imageHeight>
37
+ <imageHeight toolname="Tika" toolversion="1.3" status="CONFLICT">119</imageHeight>
38
+ <colorSpace toolname="Jhove" toolversion="1.5">RGB</colorSpace>
39
+ <referenceBlackWhite toolname="Jhove" toolversion="1.5" status="SINGLE_RESULT">0.0 255.0 0.0 255.0 0.0 255.0 0.0 255.0 0.0 255.0 0.0 255.0</referenceBlackWhite>
40
+ <iccProfileName toolname="Exiftool" toolversion="9.13" status="SINGLE_RESULT">Adobe RGB (1998)</iccProfileName>
41
+ <orientation toolname="Jhove" toolversion="1.5">normal*</orientation>
42
+ <samplingFrequencyUnit toolname="Jhove" toolversion="1.5">in.</samplingFrequencyUnit>
43
+ <xSamplingFrequency toolname="Jhove" toolversion="1.5">300</xSamplingFrequency>
44
+ <ySamplingFrequency toolname="Jhove" toolversion="1.5">300</ySamplingFrequency>
45
+ <bitsPerSample toolname="Jhove" toolversion="1.5">8 8 8</bitsPerSample>
46
+ <bitsPerSample toolname="Jhove" toolversion="1.5" status="SINGLE_RESULT">8 8 8</bitsPerSample>
47
+ <samplesPerPixel toolname="Jhove" toolversion="1.5" status="CONFLICT">3 3</samplesPerPixel>
48
+ <samplesPerPixel toolname="Exiftool" toolversion="9.13" status="CONFLICT">3</samplesPerPixel>
49
+ <scanningSoftwareName toolname="Jhove" toolversion="1.5">Capture One 8 Macintosh</scanningSoftwareName>
50
+ <digitalCameraModelName toolname="Exiftool" toolversion="9.13" status="SINGLE_RESULT">IQ3 80MP</digitalCameraModelName>
51
+ <exposureTime toolname="Jhove" toolversion="1.5" status="CONFLICT">0.017</exposureTime>
52
+ <exposureTime toolname="Exiftool" toolversion="9.13" status="CONFLICT">1/60</exposureTime>
53
+ <isoSpeedRating toolname="Jhove" toolversion="1.5">50</isoSpeedRating>
54
+ <lightSource toolname="Jhove" toolversion="1.5" status="CONFLICT">other</lightSource>
55
+ <lightSource toolname="Exiftool" toolversion="9.13" status="CONFLICT">other light source</lightSource>
56
+ <iccProfileVersion toolname="Exiftool" toolversion="9.13" status="SINGLE_RESULT">2.1.0</iccProfileVersion>
57
+ <captureDevice toolname="Exiftool" toolversion="9.13" status="SINGLE_RESULT">digital still camera</captureDevice>
58
+ <digitalCameraManufacturer toolname="Exiftool" toolversion="9.13" status="SINGLE_RESULT">Phase One</digitalCameraManufacturer>
59
+ <exposureProgram toolname="Exiftool" toolversion="9.13" status="SINGLE_RESULT">Manual</exposureProgram>
60
+ <exifVersion toolname="Exiftool" toolversion="9.13" status="SINGLE_RESULT">0220</exifVersion>
61
+ <shutterSpeedValue toolname="Exiftool" toolversion="9.13" status="SINGLE_RESULT">1/60</shutterSpeedValue>
62
+ <sensingMethod toolname="Exiftool" toolversion="9.13" status="SINGLE_RESULT">One-chip color area sensor</sensingMethod>
63
+ </image>
64
+ </metadata>
65
+ <statistics fitsExecutionTime="1523">
66
+ <tool toolname="OIS Audio Information" toolversion="0.1" status="did not run" />
67
+ <tool toolname="ADL Tool" toolversion="0.1" status="did not run" />
68
+ <tool toolname="Jhove" toolversion="1.5" executionTime="1220" />
69
+ <tool toolname="file utility" toolversion="5.14" executionTime="964" />
70
+ <tool toolname="Exiftool" toolversion="9.13" executionTime="1110" />
71
+ <tool toolname="NLNZ Metadata Extractor" toolversion="3.4GA" status="did not run" />
72
+ <tool toolname="OIS File Information" toolversion="0.2" executionTime="225" />
73
+ <tool toolname="OIS XML Metadata" toolversion="0.2" status="did not run" />
74
+ <tool toolname="ffident" toolversion="0.2" executionTime="695" />
75
+ <tool toolname="Tika" toolversion="1.3" executionTime="1371" />
76
+ </statistics>
77
+ </fits>
78
+
@@ -0,0 +1,83 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <fits xmlns="http://hul.harvard.edu/ois/xml/ns/fits/fits_output" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://hul.harvard.edu/ois/xml/ns/fits/fits_output http://hul.harvard.edu/ois/xml/xsd/fits/fits_output.xsd" version="1.2.0" timestamp="4/4/18 4:12 PM">
3
+ <identification status="CONFLICT">
4
+ <identity format="AVI" mimetype="video/avi" toolname="FITS" toolversion="1.2.0">
5
+ <tool toolname="MediaInfo" toolversion="0.7.75" />
6
+ </identity>
7
+ <identity format="Audio/Video Interleaved Format" mimetype="video/x-msvideo" toolname="FITS" toolversion="1.2.0">
8
+ <tool toolname="Droid" toolversion="6.3" />
9
+ <tool toolname="file utility" toolversion="5.31" />
10
+ <tool toolname="ffident" toolversion="0.2" />
11
+ <externalIdentifier toolname="Droid" toolversion="6.3" type="puid">fmt/5</externalIdentifier>
12
+ </identity>
13
+ </identification>
14
+ <fileinfo>
15
+ <filepath toolname="OIS File Information" toolversion="0.2" status="SINGLE_RESULT">/Users/cjcolvar/Documents/Code/samvera/hydra-works/spec/fixtures/countdown.avi</filepath>
16
+ <filename toolname="MediaInfo" toolversion="0.7.75">countdown.avi</filename>
17
+ <size toolname="MediaInfo" toolversion="0.7.75">723678</size>
18
+ <md5checksum toolname="OIS File Information" toolversion="0.2" status="SINGLE_RESULT">d43ffafa098925dae10feeca46dc9a87</md5checksum>
19
+ <fslastmodified toolname="OIS File Information" toolversion="0.2" status="SINGLE_RESULT">1522855873000</fslastmodified>
20
+ </fileinfo>
21
+ <filestatus />
22
+ <metadata>
23
+ <video>
24
+ <location toolname="MediaInfo" toolversion="0.7.75" status="SINGLE_RESULT">/Users/cjcolvar/Documents/Code/samvera/hydra-works/spec/fixtures/countdown.avi</location>
25
+ <mimeType toolname="MediaInfo" toolversion="0.7.75" status="SINGLE_RESULT">video/avi</mimeType>
26
+ <format toolname="MediaInfo" toolversion="0.7.75" status="SINGLE_RESULT">AVI</format>
27
+ <duration toolname="MediaInfo" toolversion="0.7.75" status="SINGLE_RESULT">14148</duration>
28
+ <bitRate toolname="MediaInfo" toolversion="0.7.75" status="SINGLE_RESULT">409204</bitRate>
29
+ <dateModified toolname="MediaInfo" toolversion="0.7.75" status="SINGLE_RESULT">UTC 2018-04-04 15:31:13</dateModified>
30
+ <track type="video" id="0" toolname="MediaInfo" toolversion="0.7.75" status="SINGLE_RESULT">
31
+ <videoDataEncoding>CRAM</videoDataEncoding>
32
+ <codecId>CRAM</codecId>
33
+ <codecCC>CRAM</codecCC>
34
+ <codecName>CRAM</codecName>
35
+ <codecInfo>Microsoft Video 1</codecInfo>
36
+ <compression>Unknown</compression>
37
+ <byteOrder>Unknown</byteOrder>
38
+ <bitDepth>8 bits</bitDepth>
39
+ <bitRate>313826</bitRate>
40
+ <duration>14100</duration>
41
+ <delay>0</delay>
42
+ <trackSize>553118</trackSize>
43
+ <width>356 pixels</width>
44
+ <height>264 pixels</height>
45
+ <frameRate>10.000</frameRate>
46
+ <frameCount>141</frameCount>
47
+ <aspectRatio>4:3</aspectRatio>
48
+ </track>
49
+ <track type="audio" id="1" toolname="MediaInfo" toolversion="0.7.75" status="SINGLE_RESULT">
50
+ <audioDataEncoding>PCM</audioDataEncoding>
51
+ <codecId>1</codecId>
52
+ <codecFamily>PCM</codecFamily>
53
+ <compression>none</compression>
54
+ <bitRate>88200</bitRate>
55
+ <bitRateMode>Constant</bitRateMode>
56
+ <bitDepth>8 bits</bitDepth>
57
+ <duration>14148</duration>
58
+ <delay>0</delay>
59
+ <trackSize>155980</trackSize>
60
+ <samplingRate>11025</samplingRate>
61
+ <numSamples>155982</numSamples>
62
+ <channels>1</channels>
63
+ <byteOrder>Little</byteOrder>
64
+ </track>
65
+ </video>
66
+ </metadata>
67
+ <statistics fitsExecutionTime="692">
68
+ <tool toolname="MediaInfo" toolversion="0.7.75" executionTime="662" />
69
+ <tool toolname="OIS Audio Information" toolversion="0.1" status="did not run" />
70
+ <tool toolname="ADL Tool" toolversion="0.1" status="did not run" />
71
+ <tool toolname="VTT Tool" toolversion="0.1" status="did not run" />
72
+ <tool toolname="Droid" toolversion="6.3" executionTime="273" />
73
+ <tool toolname="Jhove" toolversion="1.16" status="did not run" />
74
+ <tool toolname="file utility" toolversion="5.31" executionTime="644" />
75
+ <tool toolname="Exiftool" toolversion="10.00" status="did not run" />
76
+ <tool toolname="NLNZ Metadata Extractor" toolversion="3.6GA" status="did not run" />
77
+ <tool toolname="OIS File Information" toolversion="0.2" executionTime="80" />
78
+ <tool toolname="OIS XML Metadata" toolversion="0.2" status="did not run" />
79
+ <tool toolname="ffident" toolversion="0.2" executionTime="555" />
80
+ <tool toolname="Tika" toolversion="1.10" status="did not run" />
81
+ </statistics>
82
+ </fits>
83
+