bplmodels 0.0.91 → 0.0.93

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 45fa0e10e32adebfefb0eb641cf428a2e6f91fa8
4
- data.tar.gz: 14f75699119c3990c4f8e18ceed8253deca191a7
3
+ metadata.gz: 1d0d4c255a889d52e7b90473c99af4462e38e539
4
+ data.tar.gz: 6421e9f724413858bab031e78c459f1c80c0ab09
5
5
  SHA512:
6
- metadata.gz: 4e63652810c8d068c3eb2f91bb7cefcfe42ca29beae7f04f00cdd3864b6c076a7b6e7e963209675578d0828035d5e1832c0dca8154672c86ff706f62a66636a8
7
- data.tar.gz: c0b1657ed6b96678b9dfb3237c28b561b5ae66da2ef676f55df6b5e12164c27ffc1d9279773482780eb022f05b83c35931318bd1baa9695b925ae0e531fa51ad
6
+ metadata.gz: d09b6154408234cbe5e06018b79fb98c7463716d4e335bdb563ee3d201475ae0a6644fd310fe0e1dcd688ec8dcd58b5c8bf37641d855c097172fe5a890f611ab
7
+ data.tar.gz: 09a2f2086cb22716f088c431caaa5d1de31e96757b4c34353ea4166b3c025ca0d369bccfa78d88f4751e9ee3c9eeb292fcfb5b217c4a850e3e50fa1761c832fd
@@ -24,7 +24,9 @@ module Bplmodels
24
24
  end
25
25
 
26
26
  def fits_config_values
27
- return {:file_title => :title, :file_author => :creator }
27
+ #This is to add that to the end metadata record from FITS...
28
+ #return {:file_title => :title, :file_author => :creator }
29
+ return {}
28
30
  end
29
31
 
30
32
  def width
@@ -8,7 +8,7 @@ module Bplmodels
8
8
 
9
9
  belongs_to :institutions, :class_name => 'Bplmodels::Institution', :property => :is_member_of
10
10
 
11
- has_many :exemplary_image, :class_name => "ActiveFedora::Base", :property=> :is_exemplary_image_of
11
+ #has_many :exemplary_image, :class_name => "ActiveFedora::Base", :property=> :is_exemplary_image_of
12
12
 
13
13
  # Uses the Hydra modsCollection profile for collection list
14
14
  #has_metadata :name => "members", :type => Hydra::ModsCollectionMembers
@@ -52,25 +52,45 @@ module Bplmodels
52
52
  def to_solr(doc = {} )
53
53
  doc = super(doc)
54
54
 
55
+ basic_genre_array = ['Collections']
56
+ Bplmodels::ObjectBase.find_in_batches('is_member_of_collection_ssim'=>"info:fedora/#{self.pid}") do |group|
57
+ group.each { |object_id|
58
+ #object_id_array << Bplmodels::ObjectBase.find(object_id['id']).adapt_to_cmodel
59
+ basic_genre_array += object_id['genre_basic_ssim'] if object_id['genre_basic_ssim'].present?
60
+ }
61
+ end
62
+ doc['genre_basic_ssim'] = basic_genre_array.uniq!
63
+ doc['genre_basic_tsim'] = basic_genre_array.uniq!
64
+
55
65
  # description
56
66
  doc['abstract_tsim'] = self.descMetadata.abstract
57
67
 
68
+ # basic genre
69
+ =begin
70
+ basic_genre = 'Collections'
71
+ doc['genre_basic_ssim'] = basic_genre
72
+ doc['genre_basic_tsim'] = basic_genre
73
+ =end
74
+
58
75
  # institution
59
76
  if self.institutions
60
77
  collex_location = self.institutions.label.to_s
61
78
  doc['physical_location_ssim'] = collex_location
62
79
  doc['physical_location_tsim'] = collex_location
63
- doc['institution_pid_si'] = self.institutions.pid
64
- # TODO: need to remove the 3 above and refactor apps as necessary
65
- # collections (AKA sets) have institutions, not locations
66
80
  doc['institution_name_ssim'] = collex_location
67
81
  doc['institution_name_tsim'] = collex_location
68
82
  doc['institution_pid_ssi'] = self.institutions.pid
69
83
  end
70
84
 
85
+ exemplary_check = Bplmodels::ImageFile.find_with_conditions({"is_exemplary_image_of_ssim"=>"info:fedora/#{self.pid}"}, rows: '1', fl: 'id' )
86
+ if exemplary_check.present?
87
+ doc['exemplary_image_ssi'] = exemplary_check.first["id"]
88
+ end
89
+ =begin
71
90
  if self.exemplary_image.first != nil
72
91
  doc['exemplary_image_ssi'] = self.exemplary_image.first.pid
73
92
  end
93
+ =end
74
94
 
75
95
  doc
76
96
 
@@ -88,7 +108,11 @@ module Bplmodels
88
108
  args[:namespace_id] ||= ARK_CONFIG_GLOBAL['namespace_commonwealth_pid']
89
109
 
90
110
  response = Typhoeus::Request.post(ARK_CONFIG_GLOBAL['url'] + "/arks.json", :params => {:ark=>{:parent_pid=>args[:parent_pid], :namespace_ark => ARK_CONFIG_GLOBAL['namespace_commonwealth_ark'], :namespace_id=>args[:namespace_id], :url_base => ARK_CONFIG_GLOBAL['ark_commonwealth_base'], :model_type => self.name, :local_original_identifier=>args[:local_id], :local_original_identifier_type=>args[:local_id_type]}})
91
- as_json = JSON.parse(response.body)
111
+ begin
112
+ as_json = JSON.parse(response.body)
113
+ rescue => ex
114
+ raise('Error in JSON response for minting a collection pid.')
115
+ end
92
116
 
93
117
  Bplmodels::Collection.find_in_batches('id'=>as_json["pid"]) do |group|
94
118
  group.each { |solr_result|
@@ -0,0 +1,14 @@
1
+ module Bplmodels
2
+ class EreaderFile < Bplmodels::File
3
+
4
+ # Use a callback method to declare which derivatives you want
5
+ makes_derivatives :generate_derivatives
6
+
7
+ def fedora_name
8
+ 'ereader_file'
9
+ end
10
+
11
+
12
+
13
+ end
14
+ end
@@ -18,6 +18,10 @@ module Bplmodels
18
18
 
19
19
  has_file_datastream 'access800', versionable: false, label:'access800 datastream'
20
20
 
21
+ has_file_datastream 'ocrMaster', versionable: false, label:'OCR master datastream'
22
+ has_file_datastream 'djvuCoords', versionable: false, label:'djvu coordinate json datastream'
23
+
24
+
21
25
  belongs_to :object, :class_name => "Bplmodels::ObjectBase", :property => :is_image_of
22
26
 
23
27
  belongs_to :exemplary, :class_name => "Bplmodels::ObjectBase", :property => :is_exemplary_image_of
@@ -29,6 +33,16 @@ module Bplmodels
29
33
 
30
34
  has_metadata :name => "workflowMetadata", :type => WorkflowMetadata
31
35
 
36
+ has_metadata :name => "pageMetadata", :type => PageMetadata
37
+
38
+ def delete
39
+ #FIXME: This should just not be hardcoded in AVI Processor
40
+ if ActiveFedora.config.credentials[:url].match('fedora.digitalcommonwealth.org/fedora')
41
+ #cache_invalidate
42
+ end
43
+ super()
44
+ end
45
+
32
46
  def apply_default_permissions
33
47
  self.datastreams["rightsMetadata"].update_permissions( "group"=>{"Repository Administrators"=>"edit"} )
34
48
  self.save
@@ -46,6 +60,30 @@ module Bplmodels
46
60
  doc['marked_for_deletion_reason_ssi'] = self.workflowMetadata.marked_for_deletion.reason.first
47
61
  end
48
62
 
63
+ if ['image/tiff', 'image/png', 'image/jpg', 'image/jp2'].include?(self.productionMaster.mimeType) and self.accessMaster.blank?
64
+ doc['derivative_processsed_ssi'] = 'false'
65
+ else
66
+ doc['derivative_processsed_ssi'] = 'true'
67
+ end
68
+
69
+ if self.ocrMaster.present?
70
+ doc['ocr_tsiv'] = Bplmodels::DatastreamInputFuncs.strip_value(self.ocrMaster.content.squish)
71
+ doc['has_ocr_text_bsi'] = true
72
+ end
73
+
74
+ if self.pageMetadata.present?
75
+ doc['page_type_ssi'] = self.pageMetadata.pageData.page.page_type.first
76
+ doc['hand_side_ssi'] = self.pageMetadata.pageData.page.hand_side.first
77
+ doc['page_num_label_ssi'] = self.pageMetadata.pageData.page.page_number.first if self.pageMetadata.pageData.page.page_number.present?
78
+ doc['page_num_label_type_ssi'] = self.pageMetadata.pageData.page.page_number.sequence.first if self.pageMetadata.pageData.page.page_number.present?
79
+ #doc['has_ocr_master_ssi'] = self.bookMetadata.book.page_data.page.has_ocrMaster.first
80
+ #doc['has_djvu_json_ssi'] = self.bookMetadata.book.page_data.page.has_djvu.first
81
+
82
+ if self.djvuCoords.present?
83
+ doc['has_djvu_json_ssi'] = 'true'
84
+ end
85
+ end
86
+
49
87
  doc['checksum_file_md5_ssi'] = self.productionMaster.checksum
50
88
 
51
89
  doc
@@ -53,23 +91,59 @@ module Bplmodels
53
91
  end
54
92
 
55
93
  def generate_derivatives
94
+ #Sample object on prod: https://fedora.digitalcommonwealth.org/fedora/objects/commonwealth:9w032896b/datastreams/productionMaster/content
95
+ #Sample object from test book object: https://fedoratest.bpl.org/fedora/objects/bpl-test:rf55zp77f/datastreams/productionMaster/content
56
96
  case self.productionMaster.mimeType
57
97
  when 'application/pdf'
58
98
  #transform_datastream :productionMaster, { :thumb => "100x100>" }
99
+
100
+ pdffile = Tempfile.new(['derivative','.pdf'])
101
+ pdffile.binmode
102
+ pdffile.write(self.productionMaster.content) #ActiveFedora.config.credentials[:url] + '/objects/' + self.pid + '/datastreams/productionMaster/content'
103
+ pdffile.close
104
+
105
+ current_page = 0
106
+ total_colors = 0
107
+ until total_colors > 1 do
108
+ #Won't work... asks for login with the brackets...
109
+ img = Magick::Image.read(pdffile.path + '[' + current_page.to_s + ']'){
110
+ self.quality = 100
111
+ self.density = 200
112
+ }.first
113
+ total_colors = img.total_colors
114
+ current_page = current_page + 1
115
+ end
116
+
117
+ #This is horrible. But if you don't do this, some PDF files won't come out right at all.
118
+ #Multiple attempts have failed to fix this but perhaps the bug will be patched in ImageMagick.
119
+ #To duplicate, one can use the PDF files at: http://libspace.uml.edu/omeka/files/original/7ecb4dc9579b11e2b53ccc2040e58d36.pdf
120
+ img = Magick::Image.from_blob( img.to_blob { self.format = "jpg" } ).first
121
+
122
+ thumb = img.resize_to_fit(300,300)
123
+
124
+ self.thumbnail300.content = thumb.to_blob { self.format = "jpg" }
125
+ self.thumbnail300.mimeType = 'image/jpeg'
126
+ self.thumbnail300.dsLabel = self.productionMaster.label
127
+
128
+ pdffile.delete
59
129
  when 'audio/wav'
60
130
  #transform_datastream :productionMaster, { :mp3 => {format: 'mp3'}, :ogg => {format: 'ogg'} }, processor: :audio
61
131
  when 'video/avi'
62
132
  #transform_datastream :productionMaster, { :mp4 => {format: 'mp4'}, :webm => {format: 'webm'} }, processor: :video
63
- when 'image/tiff', 'image/png', 'image/jpg'
133
+ when 'image/tiff', 'image/png', 'image/jpg', 'image/png'
64
134
  begin
65
135
  transform_datastream :productionMaster, { :testJP2k => { recipe: :default, datastream: 'accessMaster' } }, processor: 'jpeg2k_image'
66
136
  rescue => error
67
- if error.message.include?('compressed TIFF files')
68
- Magick::limit_resource(:memory, 5500000000)
69
- Magick::limit_resource(:map, 5500000000)
70
- #jp2_img = Magick::Image.read("#{self.fedora_connection[0].options[:url]}/objects/#{self.pid}datastreams/productionMaster/content").first
71
- jp2_img = Magick::Image.from_blob(self.productionMaster.content).first
72
- self.accessMaster.content = jp2_img.to_blob { self.format = "jp2" }
137
+ # First one is from Blue Books collection. Second one is from commonwealth:xd07m887b
138
+ if error.message.include?('compressed TIFF files') || error.message.include?("The number of colours associated with the colour space specified using")
139
+ =begin
140
+ jp2_img = MiniMagick::Image.read(self.productionMaster.content) do |b|
141
+ b.format "jp2"
142
+ end
143
+ =end
144
+ jp2_img = MiniMagick::Image.read(self.productionMaster.content)
145
+ jp2_img.format 'jp2'
146
+ self.accessMaster.content = jp2_img.to_blob
73
147
  self.accessMaster.mimeType = 'image/jp2'
74
148
  jp2_img.destroy!
75
149
  else
@@ -82,13 +156,62 @@ module Bplmodels
82
156
  self.thumbnail300.dsLabel = self.productionMaster.label
83
157
  self.access800.dsLabel = self.productionMaster.label
84
158
  when 'image/jpeg' #FIXME
85
- Magick::limit_resource(:memory, 5500000000)
86
- Magick::limit_resource(:map, 5500000000)
87
- jp2_img = Magick::Image.from_blob(self.productionMaster.content).first
88
- self.accessMaster.content = jp2_img.to_blob { self.format = "jp2" }
159
+ =begin
160
+ jp2_img = MiniMagick::Image.read(self.productionMaster.content) do |b|
161
+ b.format "jp2"
162
+ end
163
+ =end
164
+ jp2_img = MiniMagick::Image.read(self.productionMaster.content)
165
+ jp2_img.format 'jp2'
166
+
167
+ self.accessMaster.content = jp2_img.to_blob
89
168
  self.accessMaster.mimeType = 'image/jp2'
90
169
  jp2_img.destroy!
170
+
171
+ transform_datastream :productionMaster, { :thumb => {size: "300x300>", datastream: 'thumbnail300', format: 'jpg'} }
172
+ transform_datastream :productionMaster, { :thumb => {size: "x800>", datastream: 'access800', format: 'jpg'} }
173
+ self.accessMaster.dsLabel = self.productionMaster.label
174
+ self.thumbnail300.dsLabel = self.productionMaster.label
175
+ self.access800.dsLabel = self.productionMaster.label
176
+ when 'image/jp2'
177
+ self.accessMaster.content = self.productionMaster.content
178
+ self.accessMaster.mimeType = 'image/jp2'
179
+
180
+
181
+ =begin
182
+ source_path = "#{ActiveFedora.config.credentials[:url]}/#{self.productionMaster.url}"
183
+ image = MiniMagick::Image.open(source_path)
184
+ quality = image['%[channels]'] == 'gray' ? 'gray' : 'color'
185
+ long_dim = Hydra::Derivatives::Jpeg2kImage.long_dim(image)
186
+ directives = { recipe: :default, datastream: 'accessMaster' }
187
+ recipe = Hydra::Derivatives::Jpeg2kImage.kdu_compress_recipe(directives, quality, long_dim)
188
+
189
+ file_path = Hydra::Derivatives::Jpeg2kImage.tmp_file('.jp2')
190
+ image.write file_path
191
+
192
+
193
+ output_file = Hydra::Derivatives::Jpeg2kImage.tmp_file('.jp2')
194
+ Hydra::Derivatives::Jpeg2kImage.encode(file_path, recipe, output_file)
195
+ self.accessMaster.content = ::File.open(output_file)
196
+ self.accessMaster.mimeType = 'image/jp2'
197
+ #End wonky code
198
+
199
+ #TODO: Move this to a function in Hydra Derivatives...
200
+ self.save
201
+ image.destroy!
202
+ File.unlink(output_file)
203
+ File.unlink(file_path)
204
+ =end
205
+
206
+ transform_datastream :productionMaster, { :thumb => {size: "300x300>", datastream: 'thumbnail300', format: 'jpg'} }
207
+ transform_datastream :productionMaster, { :thumb => {size: "x800>", datastream: 'access800', format: 'jpg'} }
208
+ self.accessMaster.dsLabel = self.productionMaster.label
209
+ self.thumbnail300.dsLabel = self.productionMaster.label
210
+ self.access800.dsLabel = self.productionMaster.label
211
+
212
+
91
213
  end
214
+
92
215
  end
93
216
 
94
217
  def derivative_service(is_new)
@@ -117,7 +240,11 @@ module Bplmodels
117
240
  args[:namespace_id] ||= ARK_CONFIG_GLOBAL['namespace_commonwealth_pid']
118
241
 
119
242
  response = Typhoeus::Request.post(ARK_CONFIG_GLOBAL['url'] + "/arks.json", :params => {:ark=>{:parent_pid=>args[:parent_pid], :namespace_ark => ARK_CONFIG_GLOBAL['namespace_commonwealth_ark'], :namespace_id=>args[:namespace_id], :url_base => ARK_CONFIG_GLOBAL['ark_commonwealth_base'], :model_type => self.name, :local_original_identifier=>args[:local_id], :local_original_identifier_type=>args[:local_id_type]}})
120
- as_json = JSON.parse(response.body)
243
+ begin
244
+ as_json = JSON.parse(response.body)
245
+ rescue => ex
246
+ raise('Error in JSON response for minting a file pid.')
247
+ end
121
248
 
122
249
  #Below stopped working suddenly?
123
250
  =begin
@@ -147,5 +274,18 @@ module Bplmodels
147
274
  return object
148
275
  end
149
276
 
277
+
278
+ def cache_invalidate
279
+ response = Typhoeus::Request.post(DERIVATIVE_CONFIG_GLOBAL['url'] + "/processor/objectcacheinvalidation.json", :params => {:file_pid=>self.pid, :environment=>Bplmodels.environment})
280
+ as_json = JSON.parse(response.body)
281
+
282
+ if as_json['result'] == "false"
283
+ raise "Error Deleting the Cache! Server error!"
284
+ end
285
+
286
+ return true
287
+ end
288
+
289
+
150
290
  end
151
291
  end
@@ -5,6 +5,8 @@ module Bplmodels
5
5
 
6
6
  has_metadata :name => "workflowMetadata", :type => WorkflowMetadata
7
7
 
8
+ has_many :exemplary_image, :class_name => "Bplmodels::File", :property=> :is_exemplary_image_of
9
+
8
10
  #A collection can have another collection as a member, or an image
9
11
  def insert_member(fedora_object)
10
12
  if (fedora_object.instance_of?(Bplmodels::Collection))
@@ -27,9 +29,59 @@ module Bplmodels
27
29
  'institution'
28
30
  end
29
31
 
32
+ def new_examplary_image(file_path, file_name)
33
+
34
+ #Delete any old images
35
+ ActiveFedora::Base.find_in_batches('is_exemplary_image_of_ssim'=>"info:fedora/#{self.pid}") do |group|
36
+ group.each { |image_solr|
37
+ current_image_file = ActiveFedora::Base.find(image_solr['id']).adapt_to_cmodel
38
+ current_image_file.delete
39
+ }
40
+ end
41
+
42
+
43
+ image_file = Bplmodels::ImageFile.mint(:parent_pid=>self.pid, :local_id=>file_name, :local_id_type=>'File Name', :label=>file_name, :institution_pid=>self.pid)
44
+
45
+ datastream = 'productionMaster'
46
+ image_file.send(datastream).content = ::File.open(file_path)
47
+
48
+ if file_name.split('.').last.downcase == 'tif'
49
+ image_file.send(datastream).mimeType = 'image/tiff'
50
+ elsif file_name.split('.').last.downcase == 'jpg'
51
+ image_file.send(datastream).mimeType = 'image/jpeg'
52
+ elsif file_name.split('.').last.downcase == 'jp2'
53
+ image_file.send(datastream).mimeType = 'image/jp2'
54
+ elsif file_name.split('.').last.downcase == 'png'
55
+ image_file.send(datastream).mimeType = 'image/png'
56
+ elsif file_name.split('.').last.downcase == 'txt'
57
+ image_file.send(datastream).mimeType = 'text/plain'
58
+ else
59
+ #image_file.send(datastream).mimeType = 'image/jpeg'
60
+ raise "Could not find a mimeType for #{file_name.split('.').last.downcase}"
61
+ end
62
+
63
+ image_file.send(datastream).dsLabel = file_name.gsub(/\.(tif|TIF|jpg|JPG|jpeg|JPEG|jp2|JP2|png|PNG|txt|TXT)$/, '')
64
+
65
+ #FIXME!!!
66
+ original_file_location = "Uploaded file of #{file_path}"
67
+ image_file.workflowMetadata.insert_file_source(original_file_location,file_name,datastream)
68
+ image_file.workflowMetadata.item_status.state = "published"
69
+ image_file.workflowMetadata.item_status.state_comment = "Added via the institution admin form using Bplmodels new_exemplary_image method on " + Time.new.year.to_s + "/" + Time.new.month.to_s + "/" + Time.new.day.to_s
70
+
71
+ image_file.add_relationship(:is_image_of, "info:fedora/" + self.pid)
72
+ image_file.add_relationship(:is_file_of, "info:fedora/" + self.pid)
73
+ image_file.add_relationship(:is_exemplary_image_of, "info:fedora/" + self.pid)
74
+
75
+
76
+ image_file.save
77
+ image_file
78
+ end
79
+
30
80
  def to_solr(doc = {} )
31
81
  doc = super(doc)
32
82
 
83
+
84
+
33
85
  # description
34
86
  doc['abstract_tsim'] = self.descMetadata.abstract
35
87
 
@@ -118,6 +170,22 @@ module Bplmodels
118
170
  doc['institution_pid_si'] = self.pid
119
171
  doc['institution_pid_ssi'] = self.pid
120
172
 
173
+ # basic genre
174
+ basic_genre = 'Institutions'
175
+ doc['genre_basic_ssim'] = basic_genre
176
+ doc['genre_basic_tsim'] = basic_genre
177
+
178
+ # physical location
179
+ # slightly redundant, but needed for faceting and A-Z filtering
180
+ institution_name = self.descMetadata.mods(0).title.first
181
+ doc['physical_location_ssim'] = institution_name
182
+ doc['physical_location_tsim'] = institution_name
183
+
184
+ exemplary_check = Bplmodels::ImageFile.find_with_conditions({"is_exemplary_image_of_ssim"=>"info:fedora/#{self.pid}"}, rows: '1', fl: 'id' )
185
+ if exemplary_check.present?
186
+ doc['exemplary_image_ssi'] = exemplary_check.first["id"]
187
+ end
188
+
121
189
 
122
190
  doc
123
191
 
@@ -135,7 +203,11 @@ module Bplmodels
135
203
  #TODO: Duplication check here to prevent over-writes?
136
204
 
137
205
  response = Typhoeus::Request.post(ARK_CONFIG_GLOBAL['url'] + "/arks.json", :params => {:ark=>{:namespace_ark => ARK_CONFIG_GLOBAL['namespace_commonwealth_ark'], :namespace_id=>ARK_CONFIG_GLOBAL['namespace_commonwealth_pid'], :url_base => ARK_CONFIG_GLOBAL['ark_commonwealth_base'], :model_type => self.name, :local_original_identifier=>args[:local_id], :local_original_identifier_type=>args[:local_id_type]}})
138
- as_json = JSON.parse(response.body)
206
+ begin
207
+ as_json = JSON.parse(response.body)
208
+ rescue => ex
209
+ raise('Error in JSON response for minting an institution pid.')
210
+ end
139
211
 
140
212
  Bplmodels::Institution.find_in_batches('id'=>as_json["pid"]) do |group|
141
213
  group.each { |solr_result|
@@ -0,0 +1,14 @@
1
+ module Bplmodels
2
+ class MarcFile < Bplmodels::File
3
+
4
+ # Use a callback method to declare which derivatives you want
5
+ makes_derivatives :generate_derivatives
6
+
7
+ def fedora_name
8
+ 'marc_file'
9
+ end
10
+
11
+
12
+
13
+ end
14
+ end