{"id":17196310,"url":"https://github.com/claytongentry/furlex","last_synced_at":"2025-12-11T23:38:13.753Z","repository":{"id":41001551,"uuid":"98813693","full_name":"claytongentry/furlex","owner":"claytongentry","description":"A structured data extraction tool written in Elixir","archived":false,"fork":false,"pushed_at":"2024-08-08T21:53:02.000Z","size":132,"stargazers_count":45,"open_issues_count":7,"forks_count":18,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-10-24T19:56:05.956Z","etag":null,"topics":["elixir","json-ld","oembed","open-graph","structured-data","twitter-cards","unfurl"],"latest_commit_sha":null,"homepage":"https://hex.pm/packages/furlex","language":"Elixir","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/claytongentry.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2017-07-30T17:29:38.000Z","updated_at":"2024-10-15T19:31:58.000Z","dependencies_parsed_at":"2024-07-29T22:19:50.797Z","dependency_job_id":null,"html_url":"https://github.com/claytongentry/furlex","commit_stats":{"total_commits":65,"total_committers":4,"mean_commits":16.25,"dds":"0.15384615384615385","last_synced_commit":"70dbf0f55f5c9834e559ee9555f1a46d7cefde7e"},"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/claytongentry/furlex","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/claytongentry%2Ffurlex","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/claytongentry%2Ffurlex/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/claytongentry%2Ffurlex/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/claytongentry%2Ffurlex/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/claytongentry","download_url":"https://codeload.github.com/claytongentry/furlex/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/claytongentry%2Ffurlex/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":27672188,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-12-11T02:00:11.302Z","response_time":56,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["elixir","json-ld","oembed","open-graph","structured-data","twitter-cards","unfurl"],"created_at":"2024-10-15T01:52:53.614Z","updated_at":"2025-12-11T23:38:13.721Z","avatar_url":"https://github.com/claytongentry.png","language":"Elixir","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Furlex\n\nFurlex is a [structured data](https://moz.com/learn/seo/schema-structured-data) extraction tool written in Elixir.\n\nIt currently supports unfurling oEmbed, Twitter Card, Facebook Open Graph, JSON-LD\nand plain ole' HTML `\u003cmeta /\u003e` data out of any url you supply.\n\n## Installation\n\nAdd `:furlex` to your list of dependencies in `mix.exs`:\n\n```elixir\ndef deps do\n  [{:furlex, \"~\u003e 0.5.0\"}]\nend\n```\n\nThen run `$ mix deps.get`. Also add `:furlex` to your applications list:\n\n```elixir\ndef application do\n  [applications: [:furlex]]\nend\n```\n\n[Jason](http://github.com/michalmuskala/jason) is the default json library in Furlex. You can however configure Furlex to use another library. For example:\n\n```elixir\nconfig :furlex, :json_library, YourLibraryOfChoice\n```\n\n## Usage\n\nTo unfurl a url, simply pass it to `Furlex.unfurl/1`\n\n```elixir\niex(1)\u003e Furlex.unfurl \"https://www.youtube.com/watch?v=Gh6H7Md_L2k\"\n{:ok,\n %Furlex{canonical_url: \"https://www.youtube.com/watch?v=Gh6H7Md_L2k\",\n  facebook: %{\"fb:app_id\" =\u003e \"87741124305\",\n    \"og:description\" =\u003e \"Watch the full episode: https://www.thisoldhouse.com/watch/ask-toh-future-house-offerman Ask This Old House host Kevin O’Connor visits Nick Offerman in Los A...\",\n    \"og:image\" =\u003e \"https://i.ytimg.com/vi/Gh6H7Md_L2k/maxresdefault.jpg\",\n    \"og:site_name\" =\u003e \"YouTube\",\n    \"og:title\" =\u003e \"Touring Nick Offerman’s Wood Shop\", \"og:type\" =\u003e \"video\",\n    \"og:url\" =\u003e \"https://www.youtube.com/watch?v=Gh6H7Md_L2k\",\n    \"og:video:height\" =\u003e [\"720\", \"720\"],\n    \"og:video:secure_url\" =\u003e [\"https://www.youtube.com/embed/Gh6H7Md_L2k\",\n     \"https://www.youtube.com/v/Gh6H7Md_L2k?version=3\u0026autohide=1\"],\n    \"og:video:type\" =\u003e [\"text/html\", \"application/x-shockwave-flash\"],\n    \"og:video:url\" =\u003e [\"https://www.youtube.com/embed/Gh6H7Md_L2k\",\n     \"http://www.youtube.com/v/Gh6H7Md_L2k?version=3\u0026autohide=1\"],\n    \"og:video:width\" =\u003e [\"1280\", \"1280\"]},\n  json_ld: [%{\"@context\" =\u003e \"http://schema.org\", \"@type\" =\u003e \"BreadcrumbList\",\n     \"itemListElement\" =\u003e [%{\"@type\" =\u003e \"ListItem\",\n        \"item\" =\u003e %{\"@id\" =\u003e \"http://www.youtube.com/user/thisoldhouse\",\n          \"name\" =\u003e \"This Old House\"}, \"position\" =\u003e 1}]}],\n  oembed: %{\"author_name\" =\u003e \"This Old House\",\n    \"author_url\" =\u003e \"https://www.youtube.com/user/thisoldhouse\",\n    \"height\" =\u003e 270,\n    \"html\" =\u003e \"\u003ciframe width=\\\"480\\\" height=\\\"270\\\" src=\\\"https://www.youtube.com/embed/Gh6H7Md_L2k?feature=oembed\\\" frameborder=\\\"0\\\" gesture=\\\"media\\\" allow=\\\"encrypted-media\\\" allowfullscreen\u003e\u003c/iframe\u003e\",\n    \"provider_name\" =\u003e \"YouTube\", \"provider_url\" =\u003e \"https://www.youtube.com/\",\n    \"thumbnail_height\" =\u003e 360,\n    \"thumbnail_url\" =\u003e \"https://i.ytimg.com/vi/Gh6H7Md_L2k/hqdefault.jpg\",\n    \"thumbnail_width\" =\u003e 480, \"title\" =\u003e \"Touring Nick Offerman’s Wood Shop\",\n    \"type\" =\u003e \"video\", \"version\" =\u003e \"1.0\", \"width\" =\u003e 480},\n  other: %{\"description\" =\u003e \"Watch the full episode: https://www.thisoldhouse.com/watch/ask-toh-future-house-offerman Ask This Old House host Kevin O’Connor visits Nick Offerman in Los A...\",\n    \"keywords\" =\u003e \"this old house, how-to, home improvement, Episode, TV Show, DIY, Ask This Old House, Nick Offerman, Kevin O'Connor, woodworking, wood shop\",\n    \"theme-color\" =\u003e \"#ff0000\",\n    \"title\" =\u003e \"Touring Nick Offerman’s Wood Shop\"},\n  status_code: 200,\n  twitter: %{\"twitter:app:id:googleplay\" =\u003e \"com.google.android.youtube\",\n    \"twitter:app:id:ipad\" =\u003e \"544007664\",\n    \"twitter:app:id:iphone\" =\u003e \"544007664\",\n    \"twitter:app:name:googleplay\" =\u003e \"YouTube\",\n    \"twitter:app:name:ipad\" =\u003e \"YouTube\",\n    \"twitter:app:name:iphone\" =\u003e \"YouTube\",\n    \"twitter:app:url:googleplay\" =\u003e \"https://www.youtube.com/watch?v=Gh6H7Md_L2k\",\n    \"twitter:app:url:ipad\" =\u003e \"vnd.youtube://www.youtube.com/watch?v=Gh6H7Md_L2k\u0026feature=applinks\",\n    \"twitter:app:url:iphone\" =\u003e \"vnd.youtube://www.youtube.com/watch?v=Gh6H7Md_L2k\u0026feature=applinks\",\n    \"twitter:card\" =\u003e \"player\",\n    \"twitter:description\" =\u003e \"Watch the full episode: https://www.thisoldhouse.com/watch/ask-toh-future-house-offerman Ask This Old House host Kevin O’Connor visits Nick Offerman in Los A...\",\n    \"twitter:image\" =\u003e \"https://i.ytimg.com/vi/Gh6H7Md_L2k/maxresdefault.jpg\",\n    \"twitter:player\" =\u003e \"https://www.youtube.com/embed/Gh6H7Md_L2k\",\n    \"twitter:player:height\" =\u003e \"720\", \"twitter:player:width\" =\u003e \"1280\",\n    \"twitter:site\" =\u003e \"@youtube\",\n    \"twitter:title\" =\u003e \"Touring Nick Offerman’s Wood Shop\",\n    \"twitter:url\" =\u003e \"https://www.youtube.com/watch?v=Gh6H7Md_L2k\"}}}\n```\n\n## Configuration\n\nFurlex accepts a few optional configuration parameters.\n\nYou may configure additional tags to capture under the Facebook\nOpenGraph and TwitterCard parsers.\n\n```elixir\nconfig :furlex, Furlex.Parser.Facebook,\n  tags: ~w(my:custom:facebook:tag another:custom:facebook:tag)\n\nconfig :furlex, Furlex.Parser.Twitter,\n  tags: ~w(my:custom:twitter:tag)\n```\n\nYou may also configure the depth of the resulting Furlex map with a `:group_keys?` boolean.\n\n```elixir\nconfig :furlex, group_keys?: true\n```\n\nIf this option is set to false or unconfigured, Furlex will return values mapped directly beneath OpenGraph and TwitterCard keys, i.e.\n\n```elixir\n%Furlex{twitter: %{\n  \"twitter:app:id:googleplay\" =\u003e \"com.google.android.youtube\",\n  \"twitter:app:id:ipad\"       =\u003e \"544007664\",\n  \"twitter:app:id:iphone\"     =\u003e \"544007664\"\n}}\n```\n\nIf true, Furlex will return values grouped into colon-delimited map structures, i.e.\n\n```elixir\n%Furlex{twitter: %{\n  \"twitter\" =\u003e %{\n    \"app\" =\u003e %{\n      \"id\" =\u003e %{\n        \"googleplay\" =\u003e \"com.google.android.youtube\",\n        \"ipad\"       =\u003e \"544007664\",\n        \"iphone\"     =\u003e \"544007664\"\n      }\n    }\n  }\n}}\n```\n\n## License\n\nCopyright 2017 Clayton Gentry\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n```\nhttp://www.apache.org/licenses/LICENSE-2.0`\n```\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fclaytongentry%2Ffurlex","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fclaytongentry%2Ffurlex","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fclaytongentry%2Ffurlex/lists"}