@ -0,0 +1,21 @@ | |||||
# frozen_string_literal: true | |||||
class Api::OembedController < ApiController | |||||
respond_to :json | |||||
def show | |||||
@stream_entry = stream_entry_from_url(params[:url]) | |||||
@width = [300, params[:maxwidth].to_i].min | |||||
@height = [200, params[:maxheight].to_i].min | |||||
end | |||||
private | |||||
def stream_entry_from_url(url) | |||||
params = Rails.application.routes.recognize_path(url) | |||||
raise ActiveRecord::NotFound unless params[:controller] == 'stream_entries' && params[:action] == 'show' | |||||
StreamEntry.find(params[:id]) | |||||
end | |||||
end |
@ -0,0 +1,2 @@ | |||||
module Api::OembedHelper | |||||
end |
@ -0,0 +1,14 @@ | |||||
# frozen_string_literal: true | |||||
object @stream_entry | |||||
node(:type) { 'rich' } | |||||
node(:version) { '1.0' } | |||||
node(:title, &:title) | |||||
node(:author_name) { |entry| entry.account.display_name.blank? ? entry.account.username : entry.account.display_name } | |||||
node(:author_url) { |entry| account_url(entry.account) } | |||||
node(:provider_name) { Rails.configuration.x.local_domain } | |||||
node(:provider_url) { root_url } | |||||
node(:cache_age) { 86_400 } | |||||
node(:html, &:content) | |||||
node(:width) { @width } | |||||
node(:height) { @height } |
@ -1,8 +1,13 @@ | |||||
- content_for :header_tags do | - content_for :header_tags do | ||||
%link{ rel: 'alternate', type: 'application/atom+xml', href: account_stream_entry_url(@account, @stream_entry, format: 'atom') }/ | %link{ rel: 'alternate', type: 'application/atom+xml', href: account_stream_entry_url(@account, @stream_entry, format: 'atom') }/ | ||||
%link{ rel: 'alternate', type: 'application/json+oembed', href: api_oembed_url(url: account_stream_entry_url(@account, @stream_entry), format: 'json') }/ | |||||
%meta{ name: 'og:site_name', content: 'Mastodon' }/ | %meta{ name: 'og:site_name', content: 'Mastodon' }/ | ||||
%meta{ name: 'og:type', content: 'article' }/ | %meta{ name: 'og:type', content: 'article' }/ | ||||
%meta{ name: 'og:title', content: "#{@account.username} on #{Rails.configuration.x.local_domain}" }/ | |||||
%meta{ name: 'og:article:author', content: @account.username }/ | %meta{ name: 'og:article:author', content: @account.username }/ | ||||
%meta{ name: 'og:description', content: @stream_entry.activity.content }/ | |||||
%meta{ name: 'og:image', content: @stream_entry.activity.is_a?(Status) && @stream_entry.activity.media_attachments.size > 0 ? full_asset_url(@stream_entry.activity.media_attachments.first.file.url(:preview)) : full_asset_url(@account.avatar.url(:large)) }/ | |||||
.activity-stream.activity-stream-headless | .activity-stream.activity-stream-headless | ||||
= render partial: @type, locals: { @type.to_sym => @stream_entry.activity, include_threads: true } | = render partial: @type, locals: { @type.to_sym => @stream_entry.activity, include_threads: true } |
@ -0,0 +1,5 @@ | |||||
require 'rails_helper' | |||||
RSpec.describe Api::OembedController, type: :controller do | |||||
end |
@ -0,0 +1,15 @@ | |||||
require 'rails_helper' | |||||
# Specs in this file have access to a helper object that includes | |||||
# the Api::OembedHelper. For example: | |||||
# | |||||
# describe Api::OembedHelper do | |||||
# describe "string concat" do | |||||
# it "concats two strings with spaces" do | |||||
# expect(helper.concat_strings("this","that")).to eq("this that") | |||||
# end | |||||
# end | |||||
# end | |||||
RSpec.describe Api::OembedHelper, type: :helper do | |||||
pending "add some examples to (or delete) #{__FILE__}" | |||||
end |