Add basic OEmbed provider API, fix #247
This commit is contained in:
		
							parent
							
								
									14bd46946d
								
							
						
					
					
						commit
						6ff93845d5
					
				
					 7 changed files with 65 additions and 0 deletions
				
			
		
							
								
								
									
										21
									
								
								app/controllers/api/oembed_controller.rb
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								app/controllers/api/oembed_controller.rb
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -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
 | 
			
		||||
							
								
								
									
										2
									
								
								app/helpers/api/oembed_helper.rb
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								app/helpers/api/oembed_helper.rb
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,2 @@
 | 
			
		|||
module Api::OembedHelper
 | 
			
		||||
end
 | 
			
		||||
							
								
								
									
										14
									
								
								app/views/api/oembed/show.json.rabl
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								app/views/api/oembed/show.json.rabl
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -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
 | 
			
		||||
  %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: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: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
 | 
			
		||||
  = render partial: @type, locals: { @type.to_sym => @stream_entry.activity, include_threads: true }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -60,6 +60,9 @@ Rails.application.routes.draw do
 | 
			
		|||
    # Salmon
 | 
			
		||||
    post '/salmon/:id', to: 'salmon#update', as: :salmon
 | 
			
		||||
 | 
			
		||||
    # OEmbed
 | 
			
		||||
    get '/oembed', to: 'oembed#show', as: :oembed
 | 
			
		||||
 | 
			
		||||
    # JSON / REST API
 | 
			
		||||
    namespace :v1 do
 | 
			
		||||
      resources :statuses, only: [:create, :show, :destroy] do
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										5
									
								
								spec/controllers/api/oembed_controller_spec.rb
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								spec/controllers/api/oembed_controller_spec.rb
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,5 @@
 | 
			
		|||
require 'rails_helper'
 | 
			
		||||
 | 
			
		||||
RSpec.describe Api::OembedController, type: :controller do
 | 
			
		||||
 | 
			
		||||
end
 | 
			
		||||
							
								
								
									
										15
									
								
								spec/helpers/api/oembed_helper_spec.rb
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								spec/helpers/api/oembed_helper_spec.rb
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -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
 | 
			
		||||
		Loading…
	
	Add table
		
		Reference in a new issue