sufia-models 4.0.0.beta2 → 4.0.0.beta3
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.
- 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
|