diff options
-rw-r--r-- | lib/pleroma/web/rich_media/parser/card.ex | 2 | ||||
-rw-r--r-- | lib/pleroma/web/rich_media/parser/meta_tags.ex | 9 | ||||
-rw-r--r-- | lib/pleroma/web/rich_media/parsers/twitter_card.ex | 3 | ||||
-rw-r--r-- | test/pleroma/web/rich_media/parser_test.exs | 130 |
4 files changed, 81 insertions, 63 deletions
diff --git a/lib/pleroma/web/rich_media/parser/card.ex b/lib/pleroma/web/rich_media/parser/card.ex index 2e06aa562..1eb3ddbdd 100644 --- a/lib/pleroma/web/rich_media/parser/card.ex +++ b/lib/pleroma/web/rich_media/parser/card.ex @@ -103,7 +103,7 @@ defmodule Pleroma.Web.RichMedia.Parser.Card do def validate(%Embed{} = embed) do case Card.parse(embed) do - %Card{} = card -> validate(card) + {:ok, %Card{} = card} -> validate(card) card -> {:error, {:invalid_metadata, card}} end end diff --git a/lib/pleroma/web/rich_media/parser/meta_tags.ex b/lib/pleroma/web/rich_media/parser/meta_tags.ex index e5c6b448d..ea544b110 100644 --- a/lib/pleroma/web/rich_media/parser/meta_tags.ex +++ b/lib/pleroma/web/rich_media/parser/meta_tags.ex @@ -16,6 +16,7 @@ defmodule Pleroma.Web.RichMedia.Parser.MetaTags do _ -> acc end end) + |> clean_data() end defp parse_node({_tag, attrs, _children}) when is_list(attrs) do @@ -27,4 +28,12 @@ defmodule Pleroma.Web.RichMedia.Parser.MetaTags do end defp parse_node(_), do: {:error, :invalid_meta_tag} + + defp clean_data(data) do + data + |> Enum.reject(fn {key, val} -> + not match?({:ok, _}, Jason.encode(%{key => val})) + end) + |> Map.new() + end end diff --git a/lib/pleroma/web/rich_media/parsers/twitter_card.ex b/lib/pleroma/web/rich_media/parsers/twitter_card.ex index a892d16ea..4785ac6df 100644 --- a/lib/pleroma/web/rich_media/parsers/twitter_card.ex +++ b/lib/pleroma/web/rich_media/parsers/twitter_card.ex @@ -14,7 +14,8 @@ defmodule Pleroma.Web.RichMedia.Parsers.TwitterCard do def get_page_title(html) do with [node | _] <- Floki.find(html, "html head title"), - title when is_binary(title) and title != "" <- Floki.text(node) do + title when is_binary(title) and title != "" <- Floki.text(node), + true <- String.valid?(title) do title else _ -> nil diff --git a/test/pleroma/web/rich_media/parser_test.exs b/test/pleroma/web/rich_media/parser_test.exs index 2f363b012..f7d010219 100644 --- a/test/pleroma/web/rich_media/parser_test.exs +++ b/test/pleroma/web/rich_media/parser_test.exs @@ -6,6 +6,7 @@ defmodule Pleroma.Web.RichMedia.ParserTest do use ExUnit.Case, async: true alias Pleroma.Web.RichMedia.Parser + alias Pleroma.Web.RichMedia.Parser.Embed setup do Tesla.Mock.mock(fn @@ -86,76 +87,83 @@ defmodule Pleroma.Web.RichMedia.ParserTest do assert {:error, _} = Parser.parse("http://example.com/empty") end - test "doesn't just add a title" do - assert {:error, {:invalid_metadata, _}} = Parser.parse("http://example.com/non-ogp") - end - test "parses ogp" do - assert Parser.parse("http://example.com/ogp") == - {:ok, - %{ - "image" => "http://ia.media-imdb.com/images/rock.jpg", - "title" => "The Rock", - "description" => - "Directed by Michael Bay. With Sean Connery, Nicolas Cage, Ed Harris, John Spencer.", - "type" => "video.movie", - "url" => "http://example.com/ogp" - }} + url = "http://example.com/ogp" + + expected = %Embed{ + meta: %{ + "og:image" => "http://ia.media-imdb.com/images/rock.jpg", + "og:title" => "The Rock", + "og:description" => + "Directed by Michael Bay. With Sean Connery, Nicolas Cage, Ed Harris, John Spencer.", + "og:type" => "video.movie", + "og:url" => "http://www.imdb.com/title/tt0117500/" + }, + oembed: nil, + title: "The Rock (1996)", + url: "http://example.com/ogp" + } + + assert Parser.parse(url) == {:ok, expected} end - test "falls back to <title> when ogp:title is missing" do - assert Parser.parse("http://example.com/ogp-missing-title") == - {:ok, - %{ - "image" => "http://ia.media-imdb.com/images/rock.jpg", - "title" => "The Rock (1996)", - "description" => - "Directed by Michael Bay. With Sean Connery, Nicolas Cage, Ed Harris, John Spencer.", - "type" => "video.movie", - "url" => "http://example.com/ogp-missing-title" - }} + test "gets <title> tag" do + url = "http://example.com/ogp-missing-title" + expected = "The Rock (1996)" + assert {:ok, %Embed{title: ^expected}} = Parser.parse(url) end test "parses twitter card" do - assert Parser.parse("http://example.com/twitter-card") == - {:ok, - %{ - "card" => "summary", - "site" => "@flickr", - "image" => "https://farm6.staticflickr.com/5510/14338202952_93595258ff_z.jpg", - "title" => "Small Island Developing States Photo Submission", - "description" => "View the album on Flickr.", - "url" => "http://example.com/twitter-card" - }} + url = "http://example.com/twitter-card" + + expected = %Embed{ + meta: %{ + "twitter:card" => "summary", + "twitter:description" => "View the album on Flickr.", + "twitter:image" => "https://farm6.staticflickr.com/5510/14338202952_93595258ff_z.jpg", + "twitter:site" => "@flickr", + "twitter:title" => "Small Island Developing States Photo Submission" + }, + oembed: nil, + title: nil, + url: "http://example.com/twitter-card" + } + + assert Parser.parse(url) == {:ok, expected} end test "parses OEmbed" do - assert 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" => "http://example.com/oembed", - "version" => "1.0", - "web_page" => "https://www.flickr.com/photos/bees/2362225867/", - "web_page_short_url" => "https://flic.kr/p/4AK2sc", - "width" => "1024" - }} + url = "http://example.com/oembed" + + expected = %Embed{ + meta: %{}, + oembed: %{ + "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" + }, + url: "http://example.com/oembed" + } + + assert Parser.parse(url) == {:ok, expected} end test "rejects invalid OGP data" do |