diff --git a/app/lib/file_handlers/freecad_thumbnail_extractor.rb b/app/lib/file_handlers/freecad_thumbnail_extractor.rb new file mode 100644 index 000000000..e33c9cdb0 --- /dev/null +++ b/app/lib/file_handlers/freecad_thumbnail_extractor.rb @@ -0,0 +1,4 @@ +class FileHandlers::FreecadThumbnailExtractor < FileHandlers::Base + ENVIRONMENTS = [:server].freeze + INPUT_TYPES = [Mime[:fcstd]].freeze +end diff --git a/app/services/freecad_thumbnail_extractor_service.rb b/app/services/freecad_thumbnail_extractor_service.rb new file mode 100644 index 000000000..7e734f71d --- /dev/null +++ b/app/services/freecad_thumbnail_extractor_service.rb @@ -0,0 +1,19 @@ +class FreecadThumbnailExtractorService + def initialize(file:) + @file = file + end + + def call + thumbnail = nil + Archive::Reader.open_filename(@file.path) do |reader| + reader.each_entry do |entry| + next unless entry.pathname == "thumbnails/Thumbnail.png" + Dir.mktmpdir do |dir| + reader.extract(entry, Archive::EXTRACT_SECURE, destination: dir) + thumbnail = File.read(File.join(dir, "thumbnails/Thumbnail.png")) + end + end + end + thumbnail ? StringIO.new(thumbnail) : nil + end +end diff --git a/app/uploaders/application_uploader.rb b/app/uploaders/application_uploader.rb index 20d930e4b..333694453 100644 --- a/app/uploaders/application_uploader.rb +++ b/app/uploaders/application_uploader.rb @@ -133,6 +133,10 @@ class ApplicationUploader < Shrine Shrine.with_file(original) do {render: GcodeThumbnailExtractorService.new(file: it).call}.compact end + elsif SiteSettings.generate_model_renders && FileHandlers::FreecadThumbnailExtractor.can_load?(context[:record].mime_type) + Shrine.with_file(original) do + {render: FreecadThumbnailExtractorService.new(file: it).call}.compact + end elsif SiteSettings.generate_model_renders && FileHandlers::F3d.can_load?(context[:record].mime_type) && context[:record]&.is_3d_model? Shrine.with_file(original) do up = context[:record]&.up_direction