53 lines
1.5 KiB
Ruby
53 lines
1.5 KiB
Ruby
require "manifique"
|
|
require "down"
|
|
|
|
module AppCatalogManager
|
|
class UpdateMetadata < AppCatalogManagerService
|
|
def initialize(app)
|
|
@app = app
|
|
end
|
|
|
|
def call
|
|
agent = Manifique::Agent.new(url: @app.url)
|
|
metadata = agent.fetch_metadata
|
|
|
|
@app.name = metadata.name
|
|
|
|
[:name, :short_name, :description, :theme_color, :background_color,
|
|
:display, :start_url, :scope, :share_target, :icons].each do |prop|
|
|
@app.metadata[prop] = metadata.send(prop) if prop
|
|
end
|
|
|
|
if icon = metadata.select_icon(sizes: "256x256") ||
|
|
icon = metadata.select_icon(sizes: "192x192")
|
|
attach_remote_image(:icon, icon)
|
|
# TODO elsif get whatever is available
|
|
end
|
|
|
|
if apple_touch_icon = metadata.select_icon(purpose: "apple-touch-icon")
|
|
attach_remote_image(:apple_touch_icon, apple_touch_icon)
|
|
end
|
|
|
|
@app.save!
|
|
rescue Manifique::Error => e
|
|
msg = "Fetching web app manifest failed for #{e.url}: #{e.type}"
|
|
Rails.logger.warn(msg)
|
|
Sentry.capture_message(msg) if Setting.sentry_enabled?
|
|
false
|
|
end
|
|
|
|
def attach_remote_image(attachment_name, icon)
|
|
if icon['src'].start_with?("http")
|
|
download_url = icon['src']
|
|
else
|
|
download_url = "#{@app.url}/#{icon["src"].gsub(/^\//,'')}"
|
|
end
|
|
filename = "#{attachment_name}.png"
|
|
key = "web_apps/#{@app.id}/icons/#{attachment_name}.png"
|
|
|
|
tempfile = Down.download(download_url)
|
|
@app.send(attachment_name).attach(key: key, io: tempfile, filename: filename)
|
|
end
|
|
end
|
|
end
|