sufia-models 4.0.0.beta2 → 4.0.0.beta3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/actors/sufia/generic_file/actor.rb +118 -0
- data/app/models/batch.rb +3 -3
- data/app/models/checksum_audit_log.rb +3 -3
- data/app/models/collection.rb +41 -0
- data/{lib/sufia/models → app/models/concerns/sufia}/generic_file.rb +33 -43
- data/{lib/sufia/models → app/models/concerns/sufia}/generic_file/accessible_attributes.rb +3 -3
- data/{lib/sufia/models → app/models/concerns/sufia}/generic_file/audit.rb +12 -18
- data/{lib/sufia/models → app/models/concerns/sufia}/generic_file/characterization.rb +1 -8
- data/app/models/concerns/sufia/generic_file/derivatives.rb +26 -0
- data/{lib/sufia/models → app/models/concerns/sufia}/generic_file/export.rb +13 -13
- data/{lib/sufia/models → app/models/concerns/sufia}/generic_file/featured.rb +0 -0
- data/{lib/sufia/models → app/models/concerns/sufia}/generic_file/metadata.rb +0 -0
- data/{lib/sufia/models → app/models/concerns/sufia}/generic_file/mime_types.rb +15 -1
- data/{lib/sufia/models → app/models/concerns/sufia}/generic_file/permissions.rb +5 -1
- data/{lib/sufia/models → app/models/concerns/sufia}/generic_file/reload_on_save.rb +0 -0
- data/{lib/sufia/models → app/models/concerns/sufia}/generic_file/trophies.rb +0 -0
- data/app/models/concerns/sufia/generic_file/versions.rb +16 -0
- data/{lib/sufia/models → app/models/concerns/sufia}/generic_file/virus_check.rb +2 -3
- data/{lib/sufia/models → app/models/concerns/sufia}/generic_file/web_form.rb +9 -2
- data/app/models/concerns/sufia/properties_datastream_behavior.rb +3 -4
- data/app/models/concerns/sufia/user.rb +2 -2
- data/app/models/datastreams/fits_datastream.rb +137 -136
- data/app/models/datastreams/generic_file_rdf_datastream.rb +6 -0
- data/app/models/datastreams/paranoid_rights_datastream.rb +3 -3
- data/app/models/file_usage.rb +53 -0
- data/app/models/follow.rb +2 -4
- data/app/models/geo_names_resource.rb +5 -7
- data/app/models/local_authority.rb +14 -14
- data/app/models/single_use_link.rb +1 -1
- data/app/models/sufia/download.rb +9 -0
- data/app/models/trophy.rb +1 -1
- data/app/services/sufia/{usage_statistics.rb → analytics.rb} +1 -24
- data/app/services/sufia/id_service.rb +2 -2
- data/lib/generators/sufia/models/install_generator.rb +5 -2
- data/lib/generators/sufia/models/templates/config/setup_mail.rb +1 -1
- data/lib/generators/sufia/models/templates/config/sufia.rb +5 -3
- data/lib/generators/sufia/models/templates/migrations/acts_as_follower_migration.rb +6 -6
- data/lib/generators/sufia/models/templates/migrations/create_checksum_audit_logs.rb +2 -3
- data/lib/generators/sufia/models/templates/migrations/create_local_authorities.rb +20 -20
- data/lib/sufia/ability.rb +1 -1
- data/lib/sufia/models/engine.rb +3 -9
- data/lib/sufia/models/file_content/versions.rb +3 -3
- data/lib/sufia/models/jobs/active_fedora_pid_based_job.rb +6 -2
- data/lib/sufia/models/jobs/batch_update_job.rb +6 -10
- data/lib/sufia/models/jobs/characterize_job.rb +1 -13
- data/lib/sufia/models/jobs/create_derivatives_job.rb +14 -0
- data/lib/sufia/models/jobs/import_url_job.rb +27 -23
- data/lib/sufia/models/version.rb +1 -1
- data/lib/tasks/sufia-models_tasks.rake +1 -1
- data/sufia-models.gemspec +1 -1
- metadata +65 -64
- data/lib/sufia/models/generic_file/actions.rb +0 -50
- data/lib/sufia/models/generic_file/derivatives.rb +0 -31
- data/lib/sufia/models/generic_file/thumbnail.rb +0 -37
- data/lib/sufia/models/generic_file/versions.rb +0 -16
- data/lib/sufia/models/jobs/transcode_audio_job.rb +0 -15
- data/lib/sufia/models/jobs/transcode_video_job.rb +0 -15
- data/lib/sufia/models/solr_document_behavior.rb +0 -118
@@ -1,50 +0,0 @@
|
|
1
|
-
module Sufia::GenericFile
|
2
|
-
# Actions are decoupled from controller logic so that they may be called from a controller or a background job.
|
3
|
-
module Actions
|
4
|
-
def self.create_metadata(generic_file, user, batch_id)
|
5
|
-
generic_file.apply_depositor_metadata(user)
|
6
|
-
generic_file.date_uploaded = Date.today
|
7
|
-
generic_file.date_modified = Date.today
|
8
|
-
generic_file.creator = user.name
|
9
|
-
|
10
|
-
if batch_id
|
11
|
-
generic_file.add_relationship("isPartOf", "info:fedora/#{Sufia::Noid.namespaceize(batch_id)}")
|
12
|
-
else
|
13
|
-
logger.warn "unable to find batch to attach to"
|
14
|
-
end
|
15
|
-
yield(generic_file) if block_given?
|
16
|
-
generic_file.save!
|
17
|
-
end
|
18
|
-
|
19
|
-
def self.create_content(generic_file, file, file_name, dsid, user)
|
20
|
-
generic_file.add_file(file, dsid, file_name)
|
21
|
-
|
22
|
-
save_tries = 0
|
23
|
-
begin
|
24
|
-
generic_file.save!
|
25
|
-
rescue RSolr::Error::Http => error
|
26
|
-
logger.warn "GenericFilesController::create_and_save_generic_file Caught RSOLR error #{error.inspect}"
|
27
|
-
save_tries+=1
|
28
|
-
# fail for good if the tries is greater than 3
|
29
|
-
raise error if save_tries >=3
|
30
|
-
sleep 0.01
|
31
|
-
retry
|
32
|
-
end
|
33
|
-
|
34
|
-
generic_file.record_version_committer(user)
|
35
|
-
if Sufia.config.respond_to?(:after_create_content)
|
36
|
-
Sufia.config.after_create_content.call(generic_file, user)
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
def self.virus_check(file)
|
41
|
-
path = file.is_a?(String) ? file : file.path
|
42
|
-
unless defined?(ClamAV)
|
43
|
-
logger.warn "Virus checking disabled, #{path} not checked"
|
44
|
-
return
|
45
|
-
end
|
46
|
-
scan_result = ClamAV.instance.scanfile(path)
|
47
|
-
raise Sufia::VirusFoundError.new("A virus was found in #{path}: #{scan_result}") unless scan_result == 0
|
48
|
-
end
|
49
|
-
end
|
50
|
-
end
|
@@ -1,31 +0,0 @@
|
|
1
|
-
module Sufia
|
2
|
-
module GenericFile
|
3
|
-
module Derivatives
|
4
|
-
extend ActiveSupport::Concern
|
5
|
-
|
6
|
-
included do
|
7
|
-
include Hydra::Derivatives
|
8
|
-
|
9
|
-
makes_derivatives do |obj|
|
10
|
-
case obj.mime_type
|
11
|
-
when *pdf_mime_types
|
12
|
-
obj.transform_datastream :content,
|
13
|
-
{ :thumbnail => {size: "338x493", datastream: 'thumbnail'} }
|
14
|
-
when *audio_mime_types
|
15
|
-
obj.transform_datastream :content,
|
16
|
-
{ :mp3 => {format: 'mp3', datastream: 'mp3'},
|
17
|
-
:ogg => {format: 'ogg', datastream: 'ogg'} }, processor: :audio
|
18
|
-
when *video_mime_types
|
19
|
-
obj.transform_datastream :content,
|
20
|
-
{ :webm => {format: "webm", datastream: 'webm'},
|
21
|
-
:mp4 => {format: "mp4", datastream: 'mp4'} }, processor: :video
|
22
|
-
when *image_mime_types
|
23
|
-
obj.transform_datastream :content, { :thumbnail => {size: "200x150>", datastream: 'thumbnail'} }
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
@@ -1,37 +0,0 @@
|
|
1
|
-
module Sufia
|
2
|
-
module GenericFile
|
3
|
-
module Thumbnail
|
4
|
-
extend ActiveSupport::Concern
|
5
|
-
# Create thumbnail requires that the characterization has already been run (so mime_type, width and height is available)
|
6
|
-
# and that the object is already has a pid set
|
7
|
-
def create_thumbnail
|
8
|
-
return unless self.content.has_content?
|
9
|
-
|
10
|
-
if video?
|
11
|
-
create_video_thumbnail
|
12
|
-
else
|
13
|
-
create_derivatives
|
14
|
-
end
|
15
|
-
self.save
|
16
|
-
end
|
17
|
-
|
18
|
-
protected
|
19
|
-
def create_video_thumbnail
|
20
|
-
return unless Sufia.config.enable_ffmpeg
|
21
|
-
|
22
|
-
output_file = Dir::Tmpname.create(['sufia', ".png"], Sufia.config.temp_file_base){}
|
23
|
-
content.to_tempfile do |f|
|
24
|
-
# we could use something like this in order to find a frame in the middle.
|
25
|
-
#ffprobe -show_files video.avi 2> /dev/null | grep duration | cut -d= -f2 53.399999
|
26
|
-
command = "#{Sufia.config.ffmpeg_path} -i \"#{f.path}\" -loglevel quiet -vf \"scale=338:-1\" -r 1 -t 1 #{output_file}"
|
27
|
-
system(command)
|
28
|
-
raise "Unable to execute command \"#{command}\"" unless $?.success?
|
29
|
-
end
|
30
|
-
|
31
|
-
self.thumbnail.content = File.open(output_file, 'rb').read
|
32
|
-
self.thumbnail.mimeType = 'image/png'
|
33
|
-
end
|
34
|
-
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|
@@ -1,16 +0,0 @@
|
|
1
|
-
module Sufia
|
2
|
-
module GenericFile
|
3
|
-
module Versions
|
4
|
-
def record_version_committer(user)
|
5
|
-
version = content.latest_version
|
6
|
-
# content datastream not (yet?) present
|
7
|
-
return if version.nil?
|
8
|
-
VersionCommitter.create(:obj_id => version.pid,
|
9
|
-
:datastream_id => version.dsid,
|
10
|
-
:version_id => version.versionID,
|
11
|
-
:committer_login => user.user_key)
|
12
|
-
end
|
13
|
-
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
@@ -1,15 +0,0 @@
|
|
1
|
-
# Created by: Justin Coyne
|
2
|
-
# 7 Feb 2013
|
3
|
-
# An asyncronous job for transcoding audio files using FFMpeg
|
4
|
-
|
5
|
-
class TranscodeAudioJob < ActiveFedoraPidBasedJob
|
6
|
-
def queue_name
|
7
|
-
:audio
|
8
|
-
end
|
9
|
-
|
10
|
-
def run
|
11
|
-
generic_file.create_derivatives
|
12
|
-
generic_file.save
|
13
|
-
end
|
14
|
-
|
15
|
-
end
|
@@ -1,15 +0,0 @@
|
|
1
|
-
# Created by: Justin Coyne
|
2
|
-
# 13 Dec 2012
|
3
|
-
# An asyncronous job for transcoding video files using FFMpeg
|
4
|
-
|
5
|
-
class TranscodeVideoJob < ActiveFedoraPidBasedJob
|
6
|
-
def queue_name
|
7
|
-
:video
|
8
|
-
end
|
9
|
-
|
10
|
-
def run
|
11
|
-
generic_file.create_derivatives
|
12
|
-
generic_file.save
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
@@ -1,118 +0,0 @@
|
|
1
|
-
# -*- encoding : utf-8 -*-
|
2
|
-
module Sufia
|
3
|
-
module SolrDocumentBehavior
|
4
|
-
def title_or_label
|
5
|
-
title || label
|
6
|
-
end
|
7
|
-
|
8
|
-
##
|
9
|
-
# Give our SolrDocument an ActiveModel::Naming appropriate route_key
|
10
|
-
def route_key
|
11
|
-
get(Solrizer.solr_name('has_model', :symbol)).split(':').last.downcase
|
12
|
-
end
|
13
|
-
|
14
|
-
def to_param
|
15
|
-
noid
|
16
|
-
end
|
17
|
-
|
18
|
-
##
|
19
|
-
# Offer the source (ActiveFedora-based) model to Rails for some of the
|
20
|
-
# Rails methods (e.g. link_to).
|
21
|
-
# @example
|
22
|
-
# link_to '...', SolrDocument(:id => 'bXXXXXX5').new => <a href="/dams_object/bXXXXXX5">...</a>
|
23
|
-
def to_model
|
24
|
-
m = ActiveFedora::Base.load_instance_from_solr(id, self)
|
25
|
-
return self if m.class == ActiveFedora::Base
|
26
|
-
m
|
27
|
-
end
|
28
|
-
|
29
|
-
def noid
|
30
|
-
self[Solrizer.solr_name('noid', Sufia::GenericFile.noid_indexer)]
|
31
|
-
end
|
32
|
-
|
33
|
-
def date_uploaded
|
34
|
-
field = self[Solrizer.solr_name("desc_metadata__date_uploaded", :stored_sortable, type: :date)]
|
35
|
-
return unless field.present?
|
36
|
-
begin
|
37
|
-
Date.parse(field).to_formatted_s(:standard)
|
38
|
-
rescue
|
39
|
-
logger.info "Unable to parse date: #{field.first.inspect} for #{self['id']}"
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
def depositor(default = '')
|
44
|
-
val = Array(self[Solrizer.solr_name("depositor")]).first
|
45
|
-
val.present? ? val : default
|
46
|
-
end
|
47
|
-
|
48
|
-
def title
|
49
|
-
Array(self[Solrizer.solr_name('desc_metadata__title')]).first
|
50
|
-
end
|
51
|
-
|
52
|
-
def description
|
53
|
-
Array(self[Solrizer.solr_name('desc_metadata__description')]).first
|
54
|
-
end
|
55
|
-
|
56
|
-
def label
|
57
|
-
Array(self[Solrizer.solr_name('label')]).first
|
58
|
-
end
|
59
|
-
|
60
|
-
def file_format
|
61
|
-
Array(self[Solrizer.solr_name('file_format')]).first
|
62
|
-
end
|
63
|
-
|
64
|
-
def creator
|
65
|
-
Array(self[Solrizer.solr_name("desc_metadata__creator")]).first
|
66
|
-
end
|
67
|
-
|
68
|
-
def tags
|
69
|
-
Array(self[Solrizer.solr_name("desc_metadata__tag")])
|
70
|
-
end
|
71
|
-
|
72
|
-
def resource_type
|
73
|
-
Array(self[Solrizer.solr_name("desc_metadata__resource_type")])
|
74
|
-
end
|
75
|
-
|
76
|
-
def mime_type
|
77
|
-
Array(self[Solrizer.solr_name("mime_type")]).first
|
78
|
-
end
|
79
|
-
|
80
|
-
def read_groups
|
81
|
-
Array(self[::Ability.read_group_field])
|
82
|
-
end
|
83
|
-
|
84
|
-
def edit_groups
|
85
|
-
Array(self[::Ability.edit_group_field])
|
86
|
-
end
|
87
|
-
|
88
|
-
def edit_people
|
89
|
-
Array(self[::Ability.edit_user_field])
|
90
|
-
end
|
91
|
-
|
92
|
-
def public?
|
93
|
-
read_groups.include?('public')
|
94
|
-
end
|
95
|
-
|
96
|
-
def registered?
|
97
|
-
read_groups.include?('registered')
|
98
|
-
end
|
99
|
-
|
100
|
-
def pdf?
|
101
|
-
['application/pdf'].include? self.mime_type
|
102
|
-
end
|
103
|
-
|
104
|
-
def image?
|
105
|
-
['image/png','image/jpeg', 'image/jpg', 'image/jp2', 'image/bmp', 'image/gif'].include? self.mime_type
|
106
|
-
end
|
107
|
-
|
108
|
-
def video?
|
109
|
-
['video/mpeg', 'video/mp4', 'video/webm', 'video/x-msvideo', 'video/avi', 'video/quicktime', 'application/mxf'].include? self.mime_type
|
110
|
-
end
|
111
|
-
|
112
|
-
def audio?
|
113
|
-
# audio/x-wave is the mime type that fits 0.6.0 returns for a wav file.
|
114
|
-
# audio/mpeg is the mime type that fits 0.6.0 returns for an mp3 file.
|
115
|
-
['audio/mp3', 'audio/mpeg', 'audio/x-wave', 'audio/x-wav', 'audio/ogg'].include? self.mime_type
|
116
|
-
end
|
117
|
-
end
|
118
|
-
end
|