Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
Pleroma
pleroma
Commits
b8a77c5d
Commit
b8a77c5d
authored
Jan 13, 2019
by
Maxim Filippov
🌚
Browse files
Add OEmbed parser
parent
19b6a823
Changes
5
Hide whitespace changes
Inline
Side-by-side
lib/pleroma/web/rich_media/parser.ex
View file @
b8a77c5d
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
def
parse
(
url
),
do
:
parse_url
(
url
)
...
...
lib/pleroma/web/rich_media/parsers/oembed_parser.ex
0 → 100644
View file @
b8a77c5d
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
test/fixtures/rich_media/oembed.html
0 → 100644
View file @
b8a77c5d
<link
rel=
"alternate"
type=
"application/json+oembed"
href=
"http://example.com/oembed.json"
title=
"Bacon Lollys oEmbed Profile"
/>
test/fixtures/rich_media/oembed.json
0 → 100644
View file @
b8a77c5d
{
"type"
:
"photo"
,
"flickr_type"
:
"photo"
,
"title"
:
"Bacon Lollys"
,
"author_name"
:
"
\u
202e
\u
202d
\u
202cbees
\u
202c"
,
"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
\u
202e
\u
202d
\u
202cbees
\u
202c, 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
\/
"
}
test/web/rich_media/parser_test.exs
View file @
b8a77c5d
...
...
@@ -15,6 +15,18 @@ defmodule Pleroma.Web.RichMedia.ParserTest do
}
->
%
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"
}
->
%
Tesla
.
Env
{
status:
200
,
body:
"hello"
}
end
)
...
...
@@ -48,4 +60,33 @@ test "parses twitter card" do
description:
"View the album on Flickr."
}}
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
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment