mirror of
https://git.pleroma.social/pleroma/pleroma.git
synced 2024-12-23 08:36:29 +00:00
Add OEmbed parser
This commit is contained in:
parent
19b6a82393
commit
b8a77c5d70
5 changed files with 77 additions and 1 deletions
|
@ -1,5 +1,9 @@
|
||||||
defmodule Pleroma.Web.RichMedia.Parser do
|
defmodule Pleroma.Web.RichMedia.Parser do
|
||||||
@parsers [Pleroma.Web.RichMedia.Parsers.OGP, Pleroma.Web.RichMedia.Parsers.TwitterCard]
|
@parsers [
|
||||||
|
Pleroma.Web.RichMedia.Parsers.OGP,
|
||||||
|
Pleroma.Web.RichMedia.Parsers.TwitterCard,
|
||||||
|
Pleroma.Web.RichMedia.Parsers.OEmbed
|
||||||
|
]
|
||||||
|
|
||||||
if Mix.env() == :test do
|
if Mix.env() == :test do
|
||||||
def parse(url), do: parse_url(url)
|
def parse(url), do: parse_url(url)
|
||||||
|
|
27
lib/pleroma/web/rich_media/parsers/oembed_parser.ex
Normal file
27
lib/pleroma/web/rich_media/parsers/oembed_parser.ex
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
defmodule Pleroma.Web.RichMedia.Parsers.OEmbed do
|
||||||
|
def parse(html, _data) do
|
||||||
|
with elements = [_ | _] <- get_discovery_data(html),
|
||||||
|
{:ok, oembed_url} <- get_oembed_url(elements),
|
||||||
|
{:ok, oembed_data} <- get_oembed_data(oembed_url) do
|
||||||
|
{:ok, oembed_data}
|
||||||
|
else
|
||||||
|
_e -> {:error, "No OEmbed data found"}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
defp get_discovery_data(html) do
|
||||||
|
html |> Floki.find("link[type='application/json+oembed']")
|
||||||
|
end
|
||||||
|
|
||||||
|
defp get_oembed_url(nodes) do
|
||||||
|
{"link", attributes, _children} = nodes |> hd()
|
||||||
|
|
||||||
|
{:ok, Enum.into(attributes, %{})["href"]}
|
||||||
|
end
|
||||||
|
|
||||||
|
defp get_oembed_data(url) do
|
||||||
|
{:ok, %Tesla.Env{body: json}} = Pleroma.HTTP.get(url)
|
||||||
|
|
||||||
|
{:ok, Poison.decode!(json)}
|
||||||
|
end
|
||||||
|
end
|
3
test/fixtures/rich_media/oembed.html
vendored
Normal file
3
test/fixtures/rich_media/oembed.html
vendored
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
<link rel="alternate" type="application/json+oembed"
|
||||||
|
href="http://example.com/oembed.json"
|
||||||
|
title="Bacon Lollys oEmbed Profile" />
|
1
test/fixtures/rich_media/oembed.json
vendored
Normal file
1
test/fixtures/rich_media/oembed.json
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
{"type":"photo","flickr_type":"photo","title":"Bacon Lollys","author_name":"\u202e\u202d\u202cbees\u202c","author_url":"https:\/\/www.flickr.com\/photos\/bees\/","width":"1024","height":"768","url":"https:\/\/farm4.staticflickr.com\/3040\/2362225867_4a87ab8baf_b.jpg","web_page":"https:\/\/www.flickr.com\/photos\/bees\/2362225867\/","thumbnail_url":"https:\/\/farm4.staticflickr.com\/3040\/2362225867_4a87ab8baf_q.jpg","thumbnail_width":150,"thumbnail_height":150,"web_page_short_url":"https:\/\/flic.kr\/p\/4AK2sc","license":"All Rights Reserved","license_id":0,"html":"<a data-flickr-embed=\"true\" href=\"https:\/\/www.flickr.com\/photos\/bees\/2362225867\/\" title=\"Bacon Lollys by \u202e\u202d\u202cbees\u202c, on Flickr\"><img src=\"https:\/\/farm4.staticflickr.com\/3040\/2362225867_4a87ab8baf_b.jpg\" width=\"1024\" height=\"768\" alt=\"Bacon Lollys\"><\/a><script async src=\"https:\/\/embedr.flickr.com\/assets\/client-code.js\" charset=\"utf-8\"><\/script>","version":"1.0","cache_age":3600,"provider_name":"Flickr","provider_url":"https:\/\/www.flickr.com\/"}
|
|
@ -15,6 +15,18 @@ defmodule Pleroma.Web.RichMedia.ParserTest do
|
||||||
} ->
|
} ->
|
||||||
%Tesla.Env{status: 200, body: File.read!("test/fixtures/rich_media/twitter_card.html")}
|
%Tesla.Env{status: 200, body: File.read!("test/fixtures/rich_media/twitter_card.html")}
|
||||||
|
|
||||||
|
%{
|
||||||
|
method: :get,
|
||||||
|
url: "http://example.com/oembed"
|
||||||
|
} ->
|
||||||
|
%Tesla.Env{status: 200, body: File.read!("test/fixtures/rich_media/oembed.html")}
|
||||||
|
|
||||||
|
%{
|
||||||
|
method: :get,
|
||||||
|
url: "http://example.com/oembed.json"
|
||||||
|
} ->
|
||||||
|
%Tesla.Env{status: 200, body: File.read!("test/fixtures/rich_media/oembed.json")}
|
||||||
|
|
||||||
%{method: :get, url: "http://example.com/empty"} ->
|
%{method: :get, url: "http://example.com/empty"} ->
|
||||||
%Tesla.Env{status: 200, body: "hello"}
|
%Tesla.Env{status: 200, body: "hello"}
|
||||||
end)
|
end)
|
||||||
|
@ -48,4 +60,33 @@ defmodule Pleroma.Web.RichMedia.ParserTest do
|
||||||
description: "View the album on Flickr."
|
description: "View the album on Flickr."
|
||||||
}}
|
}}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
test "parses OEmbed" do
|
||||||
|
assert Pleroma.Web.RichMedia.Parser.parse("http://example.com/oembed") ==
|
||||||
|
{:ok,
|
||||||
|
%{
|
||||||
|
"author_name" => "bees",
|
||||||
|
"author_url" => "https://www.flickr.com/photos/bees/",
|
||||||
|
"cache_age" => 3600,
|
||||||
|
"flickr_type" => "photo",
|
||||||
|
"height" => "768",
|
||||||
|
"html" =>
|
||||||
|
"<a data-flickr-embed=\"true\" href=\"https://www.flickr.com/photos/bees/2362225867/\" title=\"Bacon Lollys by bees, on Flickr\"><img src=\"https://farm4.staticflickr.com/3040/2362225867_4a87ab8baf_b.jpg\" width=\"1024\" height=\"768\" alt=\"Bacon Lollys\"></a><script async src=\"https://embedr.flickr.com/assets/client-code.js\" charset=\"utf-8\"></script>",
|
||||||
|
"license" => "All Rights Reserved",
|
||||||
|
"license_id" => 0,
|
||||||
|
"provider_name" => "Flickr",
|
||||||
|
"provider_url" => "https://www.flickr.com/",
|
||||||
|
"thumbnail_height" => 150,
|
||||||
|
"thumbnail_url" =>
|
||||||
|
"https://farm4.staticflickr.com/3040/2362225867_4a87ab8baf_q.jpg",
|
||||||
|
"thumbnail_width" => 150,
|
||||||
|
"title" => "Bacon Lollys",
|
||||||
|
"type" => "photo",
|
||||||
|
"url" => "https://farm4.staticflickr.com/3040/2362225867_4a87ab8baf_b.jpg",
|
||||||
|
"version" => "1.0",
|
||||||
|
"web_page" => "https://www.flickr.com/photos/bees/2362225867/",
|
||||||
|
"web_page_short_url" => "https://flic.kr/p/4AK2sc",
|
||||||
|
"width" => "1024"
|
||||||
|
}}
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in a new issue