Full Code of ianstormtaylor/metascraper for AI

master 306c5b0a9b7f cached
794 files
72.7 MB
19.1M tokens
74 symbols
1 requests
Copy disabled (too large) Download .txt
Showing preview only (76,488K chars total). Download the full file to get everything.
Repository: ianstormtaylor/metascraper
Branch: master
Commit: 306c5b0a9b7f
Files: 794
Total size: 72.7 MB

Directory structure:
gitextract_gvsn9m4r/

├── .editorconfig
├── .gitattributes
├── .github/
│   ├── FUNDING.yml
│   ├── ISSUE_TEMPLATE.md
│   ├── dependabot.yml
│   └── workflows/
│       ├── get-matrix.mjs
│       ├── main.yml
│       └── pull_request.yml
├── .gitignore
├── .nojekyll
├── .npmrc
├── CHANGELOG.md
├── CNAME
├── CONTRIBUTING.md
├── LICENSE.md
├── README.md
├── benchmark/
│   ├── README.md
│   ├── accuracy-readability-vs-defuddle.js
│   ├── index.js
│   ├── package.json
│   ├── results/
│   │   ├── html-metadata.json
│   │   ├── metascraper.json
│   │   ├── node-metainspector.json
│   │   ├── open-graph-scraper.json
│   │   └── unfluff.json
│   ├── scrapers.js
│   └── urls.js
├── gulpfile.js
├── index.html
├── lerna.json
├── package.json
├── packages/
│   ├── cheerio-repl/
│   │   ├── bin/
│   │   │   └── index.mjs
│   │   └── package.json
│   ├── metascraper/
│   │   ├── CHANGELOG.md
│   │   ├── README.md
│   │   ├── benchmark/
│   │   │   └── merge-rules.js
│   │   ├── package.json
│   │   ├── src/
│   │   │   ├── get-data.js
│   │   │   ├── index.d.ts
│   │   │   ├── index.js
│   │   │   └── rules.js
│   │   └── test/
│   │       ├── integration/
│   │       │   ├── acast/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── anandtech/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── arstechnica/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── astier/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── atlasobscura/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       ├── index.js.md.3629819930
│   │       │   │       ├── index.js.snap
│   │       │   │       └── index.js.snap.2409065053
│   │       │   ├── audiense/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── bbc/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       ├── index.js.md.1566904539
│   │       │   │       ├── index.js.snap
│   │       │   │       └── index.js.snap.366348725
│   │       │   ├── belfusto/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── bfi/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── blogger/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── bloomberg/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── bukvy/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── business-today/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── cio/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── cnet/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── computerworld/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── crn/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── economic-times/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── engadget/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── entrepreneur/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── eweek/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── fast-company/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── financial-times/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── forbes/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── fortune/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── github/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── globenewswire/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── googleblog/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── hola/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── inc/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── indiehackers/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── information-week/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── instagram/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── itpro/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── jewish-business-news/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── lean-data/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── learnnode/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── linkedin-company/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── linkedin-pulse/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── los-angeles-times/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── mac-rumors/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── marketing-land/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── mashable/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── medium/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── milanocittastato/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── nbcnews/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── npr/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── nytimes/
│   │       │   │   ├── index.js
│   │       │   │   ├── input/
│   │       │   │   │   ├── article.html
│   │       │   │   │   └── opinion.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── pikabu/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── postplanner/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── pr-newswire/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── qz/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── reactpodcast/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── recode/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── reuters/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── san-francisco-chronicle/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── segment/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── segment-academy/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── sfstandard/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── silicon-angle/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── silicon-beat/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── silicon-valley-business-journal/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── smitten-kitchen/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── softwarefordays/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── startup-grind/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── stuff/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── substack/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── techcrunch/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── techmonitor/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── teslahunt/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── the-boston-globe/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── the-guardian/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── the-register/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── the-verge/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── theflip/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── therams/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── transistor/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── twitter-gif/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── twitter-image/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── usa-today/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── venture-beat/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── vice/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── vimeo/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── wikipedia/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── wired/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── wnycstudios/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── wsj/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── yahoo-news/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── yandex/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   └── zdnet/
│   │       │       ├── index.js
│   │       │       ├── input.html
│   │       │       └── snapshots/
│   │       │           ├── index.js.md
│   │       │           └── index.js.snap
│   │       ├── types/
│   │       │   └── index.test-d.ts
│   │       └── unit/
│   │           ├── decode/
│   │           │   ├── index.js
│   │           │   └── input.html
│   │           ├── index.js
│   │           ├── interface.js
│   │           └── merge-rules.js
│   ├── metascraper-amazon/
│   │   ├── CHANGELOG.md
│   │   ├── README.md
│   │   ├── package.json
│   │   ├── src/
│   │   │   ├── index.d.ts
│   │   │   └── index.js
│   │   └── test/
│   │       ├── fixtures/
│   │       │   ├── amazon-co-uk/
│   │       │   │   └── product-url.html
│   │       │   ├── amazon-com/
│   │       │   │   ├── ansi-url.html
│   │       │   │   └── product-url.html
│   │       │   └── amazon-es/
│   │       │       └── product-url.html
│   │       ├── index.js
│   │       ├── snapshots/
│   │       │   ├── index.js.md
│   │       │   └── index.js.snap
│   │       └── test.js
│   ├── metascraper-audio/
│   │   ├── CHANGELOG.md
│   │   ├── README.md
│   │   ├── package.json
│   │   ├── src/
│   │   │   ├── index.d.ts
│   │   │   └── index.js
│   │   └── test/
│   │       ├── fixtures/
│   │       │   └── providers/
│   │       │       ├── deezer.com.html
│   │       │       ├── ivoox.com.html
│   │       │       ├── music.apple.com.html
│   │       │       ├── open.spotify.com.html
│   │       │       ├── podcasts.apple.com.html
│   │       │       ├── podcasts.google.com.html
│   │       │       ├── tidal.com.html
│   │       │       └── transistor.fm.html
│   │       ├── helpers.js
│   │       ├── iframe.js
│   │       ├── index.js
│   │       ├── providers.js
│   │       └── snapshots/
│   │           ├── index.js.md
│   │           └── index.js.snap
│   ├── metascraper-author/
│   │   ├── CHANGELOG.md
│   │   ├── README.md
│   │   ├── package.json
│   │   └── src/
│   │       ├── index.d.ts
│   │       └── index.js
│   ├── metascraper-bluesky/
│   │   ├── CHANGELOG.md
│   │   ├── README.md
│   │   ├── package.json
│   │   ├── src/
│   │   │   ├── index.d.ts
│   │   │   └── index.js
│   │   └── test/
│   │       ├── fixtures/
│   │       │   ├── post-image.html
│   │       │   ├── post-link.html
│   │       │   ├── post.html
│   │       │   └── profile.html
│   │       ├── index.js
│   │       ├── snapshots/
│   │       │   ├── index.js.md
│   │       │   └── index.js.snap
│   │       └── test.js
│   ├── metascraper-date/
│   │   ├── CHANGELOG.md
│   │   ├── README.md
│   │   ├── package.json
│   │   └── src/
│   │       ├── index.d.ts
│   │       └── index.js
│   ├── metascraper-defuddle/
│   │   ├── CHANGELOG.md
│   │   ├── README.md
│   │   ├── package.json
│   │   ├── src/
│   │   │   ├── index.d.ts
│   │   │   └── index.js
│   │   └── test/
│   │       ├── fixtures/
│   │       │   └── article.html
│   │       └── index.js
│   ├── metascraper-description/
│   │   ├── CHANGELOG.md
│   │   ├── README.md
│   │   ├── package.json
│   │   ├── src/
│   │   │   ├── index.d.ts
│   │   │   └── index.js
│   │   └── test/
│   │       └── index.js
│   ├── metascraper-dribbble/
│   │   ├── CHANGELOG.md
│   │   ├── README.md
│   │   ├── package.json
│   │   ├── src/
│   │   │   ├── index.d.ts
│   │   │   └── index.js
│   │   └── test/
│   │       ├── fixtures/
│   │       │   ├── post.html
│   │       │   └── profile.html
│   │       ├── index.js
│   │       ├── snapshots/
│   │       │   ├── index.js.md
│   │       │   └── index.js.snap
│   │       └── test.js
│   ├── metascraper-feed/
│   │   ├── CHANGELOG.md
│   │   ├── README.md
│   │   ├── package.json
│   │   ├── src/
│   │   │   ├── index.d.ts
│   │   │   └── index.js
│   │   └── test/
│   │       └── index.js
│   ├── metascraper-helpers/
│   │   ├── CHANGELOG.md
│   │   ├── README.md
│   │   ├── package.json
│   │   ├── src/
│   │   │   ├── index.js
│   │   │   └── load-iframe/
│   │   │       ├── index.js
│   │   │       └── worker.js
│   │   └── test/
│   │       ├── has.js
│   │       ├── index.js
│   │       ├── is-url/
│   │       │   ├── absolute.js
│   │       │   └── relative.js
│   │       ├── jsonld.js
│   │       ├── load-iframe.js
│   │       ├── memoize-one.js
│   │       ├── snapshots/
│   │       │   ├── jsonld.js.md
│   │       │   ├── jsonld.js.snap
│   │       │   ├── load-iframe.js.md
│   │       │   └── load-iframe.js.snap
│   │       └── titleize.js
│   ├── metascraper-iframe/
│   │   ├── CHANGELOG.md
│   │   ├── README.md
│   │   ├── package.json
│   │   ├── src/
│   │   │   ├── from-html.js
│   │   │   ├── from-provider.js
│   │   │   ├── from-twitter.js
│   │   │   ├── index.d.ts
│   │   │   └── index.js
│   │   └── test/
│   │       ├── fixtures/
│   │       │   ├── genially.html
│   │       │   ├── indiehacker-with-dimensions.html
│   │       │   ├── indiehacker.html
│   │       │   └── youtube.html
│   │       ├── get-oembed-url.js
│   │       ├── helpers.js
│   │       ├── index.js
│   │       └── test.js
│   ├── metascraper-image/
│   │   ├── CHANGELOG.md
│   │   ├── README.md
│   │   ├── package.json
│   │   └── src/
│   │       ├── index.d.ts
│   │       └── index.js
│   ├── metascraper-instagram/
│   │   ├── CHANGELOG.md
│   │   ├── README.md
│   │   ├── package.json
│   │   ├── src/
│   │   │   ├── index.d.ts
│   │   │   └── index.js
│   │   └── test/
│   │       ├── fixtures/
│   │       │   ├── post-with-clip.html
│   │       │   ├── post-with-igtv.html
│   │       │   ├── post-with-multi-photo.html
│   │       │   ├── post-with-photo.html
│   │       │   ├── post-with-video.html
│   │       │   ├── profile.html
│   │       │   └── story.html
│   │       ├── index.js
│   │       ├── snapshots/
│   │       │   ├── index.js.md
│   │       │   └── index.js.snap
│   │       └── test.js
│   ├── metascraper-lang/
│   │   ├── CHANGELOG.md
│   │   ├── README.md
│   │   ├── package.json
│   │   ├── src/
│   │   │   ├── index.d.ts
│   │   │   └── index.js
│   │   └── test/
│   │       ├── fixtures/
│   │       │   └── html-lang.html
│   │       ├── index.js
│   │       └── snapshots/
│   │           ├── index.js.md
│   │           └── index.js.snap
│   ├── metascraper-logo/
│   │   ├── CHANGELOG.md
│   │   ├── README.md
│   │   ├── package.json
│   │   └── src/
│   │       ├── index.d.ts
│   │       └── index.js
│   ├── metascraper-logo-favicon/
│   │   ├── CHANGELOG.md
│   │   ├── README.md
│   │   ├── package.json
│   │   ├── src/
│   │   │   ├── index.d.ts
│   │   │   └── index.js
│   │   └── test/
│   │       ├── favicon.js
│   │       ├── fixtures/
│   │       │   ├── liuedu.html
│   │       │   └── theverge.html
│   │       ├── get-logo.js
│   │       ├── google.js
│   │       ├── helpers.js
│   │       ├── index.js
│   │       ├── pick-fn.js
│   │       ├── resolve-favicon-url.js
│   │       └── root-favicon.js
│   ├── metascraper-manifest/
│   │   ├── CHANGELOG.md
│   │   ├── README.md
│   │   ├── package.json
│   │   ├── src/
│   │   │   ├── index.d.ts
│   │   │   └── index.js
│   │   └── test/
│   │       ├── get-size.js
│   │       ├── index.js
│   │       └── snapshots/
│   │           ├── index.js.md
│   │           └── index.js.snap
│   ├── metascraper-media-provider/
│   │   ├── CHANGELOG.md
│   │   ├── README.md
│   │   ├── bench/
│   │   │   ├── constants.js
│   │   │   └── index.js
│   │   ├── package.json
│   │   ├── src/
│   │   │   ├── get-media.js
│   │   │   ├── index.d.ts
│   │   │   └── index.js
│   │   └── test/
│   │       ├── audio.js
│   │       ├── fixtures/
│   │       │   ├── generate.js
│   │       │   └── provider/
│   │       │       ├── acast.json
│   │       │       ├── castbox.json
│   │       │       ├── google.json
│   │       │       ├── podcastaddict.json
│   │       │       ├── stitcher.json
│   │       │       ├── substack.json
│   │       │       ├── twitter.json
│   │       │       ├── vimeo-m3u8.json
│   │       │       ├── vimeo.json
│   │       │       ├── youtube-video-audio.json
│   │       │       └── youtube.json
│   │       ├── get-audio.js
│   │       ├── get-format-urls.js
│   │       ├── get-image.js
│   │       ├── get-media.js
│   │       ├── get-video.js
│   │       ├── helpers.js
│   │       ├── snapshots/
│   │       │   ├── get-audio.js.md
│   │       │   ├── get-audio.js.snap
│   │       │   ├── get-video.js.md
│   │       │   └── get-video.js.snap
│   │       └── video/
│   │           ├── format.js
│   │           ├── index.js
│   │           └── unsupported.js
│   ├── metascraper-publisher/
│   │   ├── CHANGELOG.md
│   │   ├── README.md
│   │   ├── package.json
│   │   ├── src/
│   │   │   ├── index.d.ts
│   │   │   └── index.js
│   │   └── test/
│   │       └── get-from-title.js
│   ├── metascraper-readability/
│   │   ├── CHANGELOG.md
│   │   ├── README.md
│   │   ├── benchmark/
│   │   │   ├── document-write.js
│   │   │   ├── fixture.html
│   │   │   ├── index.js
│   │   │   └── package.json
│   │   ├── package.json
│   │   ├── src/
│   │   │   ├── index.d.ts
│   │   │   └── index.js
│   │   └── test/
│   │       ├── fixtures/
│   │       │   ├── chowhanandsons.com.html
│   │       │   ├── kikobeats.com.html
│   │       │   ├── learnnode.com.html
│   │       │   ├── malformed.html
│   │       │   └── microlink.io.html
│   │       ├── index.js
│   │       └── snapshots/
│   │           ├── index.js.md
│   │           └── index.js.snap
│   ├── metascraper-reddit/
│   │   ├── CHANGELOG.md
│   │   ├── README.md
│   │   ├── package.json
│   │   ├── src/
│   │   │   ├── index.d.ts
│   │   │   └── index.js
│   │   └── test/
│   │       ├── fixtures/
│   │       │   └── post.html
│   │       ├── index.js
│   │       ├── snapshots/
│   │       │   ├── index.js.md
│   │       │   └── index.js.snap
│   │       └── test.js
│   ├── metascraper-soundcloud/
│   │   ├── CHANGELOG.md
│   │   ├── README.md
│   │   ├── package.json
│   │   ├── src/
│   │   │   ├── index.d.ts
│   │   │   └── index.js
│   │   └── test/
│   │       ├── fixtures/
│   │       │   └── song.html
│   │       ├── index.js
│   │       ├── snapshots/
│   │       │   ├── index.js.md
│   │       │   └── index.js.snap
│   │       └── test.js
│   ├── metascraper-spotify/
│   │   ├── CHANGELOG.md
│   │   ├── README.md
│   │   ├── package.json
│   │   ├── src/
│   │   │   ├── index.d.ts
│   │   │   └── index.js
│   │   └── test/
│   │       ├── description.js
│   │       ├── fixtures/
│   │       │   ├── album.html
│   │       │   ├── artist.html
│   │       │   ├── episode.html
│   │       │   ├── show.html
│   │       │   └── track.html
│   │       ├── helpers.js
│   │       ├── index.js
│   │       ├── snapshots/
│   │       │   ├── index.js.md
│   │       │   └── index.js.snap
│   │       └── test.js
│   ├── metascraper-telegram/
│   │   ├── CHANGELOG.md
│   │   ├── README.md
│   │   ├── package.json
│   │   ├── src/
│   │   │   ├── index.d.ts
│   │   │   └── index.js
│   │   └── test/
│   │       ├── fixtures/
│   │       │   ├── channel.html
│   │       │   ├── no-iframe.html
│   │       │   ├── post-full-image.html
│   │       │   ├── post-link-image.html
│   │       │   └── post-right-preview.html
│   │       ├── index.js
│   │       ├── snapshots/
│   │       │   ├── index.js.md
│   │       │   └── index.js.snap
│   │       └── test.js
│   ├── metascraper-tiktok/
│   │   ├── CHANGELOG.md
│   │   ├── README.md
│   │   ├── package.json
│   │   ├── src/
│   │   │   ├── index.d.ts
│   │   │   └── index.js
│   │   └── test/
│   │       ├── Untitled
│   │       ├── fixtures/
│   │       │   ├── profile.html
│   │       │   └── video.html
│   │       ├── index.js
│   │       ├── snapshots/
│   │       │   ├── index.js.md
│   │       │   └── index.js.snap
│   │       └── test.js
│   ├── metascraper-title/
│   │   ├── CHANGELOG.md
│   │   ├── README.md
│   │   ├── package.json
│   │   └── src/
│   │       ├── index.d.ts
│   │       └── index.js
│   ├── metascraper-uol/
│   │   ├── CHANGELOG.md
│   │   ├── package.json
│   │   ├── src/
│   │   │   ├── index.d.ts
│   │   │   └── index.js
│   │   └── test/
│   │       ├── fixtures/
│   │       │   ├── entretenimento.html
│   │       │   ├── folha.html
│   │       │   └── torcedores.html
│   │       ├── index.js
│   │       ├── snapshots/
│   │       │   ├── index.js.md
│   │       │   └── index.js.snap
│   │       └── test.js
│   ├── metascraper-url/
│   │   ├── CHANGELOG.md
│   │   ├── README.md
│   │   ├── package.json
│   │   └── src/
│   │       ├── index.d.ts
│   │       └── index.js
│   ├── metascraper-video/
│   │   ├── CHANGELOG.md
│   │   ├── README.md
│   │   ├── package.json
│   │   ├── src/
│   │   │   ├── index.d.ts
│   │   │   └── index.js
│   │   └── test/
│   │       ├── fixtures/
│   │       │   ├── providers/
│   │       │   │   ├── 9gag.com.html
│   │       │   │   ├── bluecadet.com.html
│   │       │   │   ├── clip.twitch.tv.html
│   │       │   │   ├── giphy.com.html
│   │       │   │   └── medal.tv.html
│   │       │   ├── source-src.html
│   │       │   ├── tweet.html
│   │       │   └── video-src.html
│   │       ├── helpers.js
│   │       ├── iframe.js
│   │       ├── index.js
│   │       ├── providers.js
│   │       └── snapshots/
│   │           ├── index.js.md
│   │           ├── index.js.snap
│   │           ├── providers.js.md
│   │           └── providers.js.snap
│   ├── metascraper-x/
│   │   ├── CHANGELOG.md
│   │   ├── README.md
│   │   ├── package.json
│   │   ├── src/
│   │   │   ├── index.d.ts
│   │   │   └── index.js
│   │   └── test/
│   │       ├── fixtures/
│   │       │   ├── post-gif-og.html
│   │       │   ├── post-gif.html
│   │       │   ├── post-image-og.html
│   │       │   ├── post-image.html
│   │       │   ├── post-link.html
│   │       │   ├── post-og.html
│   │       │   ├── post-on-x.html
│   │       │   ├── post-video-og.html
│   │       │   ├── post-video.html
│   │       │   ├── post.html
│   │       │   ├── profile-og.html
│   │       │   ├── profile-video-og.html
│   │       │   ├── profile-video.html
│   │       │   └── profile.html
│   │       ├── index.js
│   │       ├── snapshots/
│   │       │   ├── index.js.md
│   │       │   └── index.js.snap
│   │       └── test.js
│   └── metascraper-youtube/
│       ├── CHANGELOG.md
│       ├── README.md
│       ├── package.json
│       ├── src/
│       │   ├── index.d.ts
│       │   └── index.js
│       └── test/
│           ├── fixtures/
│           │   ├── image-size.html
│           │   ├── youtube-channel.html
│           │   ├── youtube-list.html
│           │   ├── youtube-title.html
│           │   ├── youtube-video-old.html
│           │   └── youtube-video.html
│           ├── helpers.js
│           ├── index.js
│           ├── snapshots/
│           │   ├── index.js.md
│           │   └── index.js.snap
│           └── test.js
├── pnpm-workspace.yaml
└── src/
    ├── css/
    │   └── style.css
    ├── design/
    │   └── metascraper-logo.sketch
    └── js/
        └── main.js

================================================
FILE CONTENTS
================================================

================================================
FILE: .editorconfig
================================================
# http://editorconfig.org

root = true

[*]
indent_style = space
indent_size = 2
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
max_line_length = 80
indent_brace_style = 1TBS
spaces_around_operators = true
quote_type = auto

[package.json]
indent_style = space
indent_size = 2

[*.md]
trim_trailing_whitespace = false


================================================
FILE: .gitattributes
================================================
* text=auto


================================================
FILE: .github/FUNDING.yml
================================================
custom: https://microlink.io/#pricing


================================================
FILE: .github/ISSUE_TEMPLATE.md
================================================
### Prerequisites

- [ ] I'm using the last version.
- [ ] My node version is the same as declared as `package.json`.

### Subject of the issue

Describe your issue here.

### Steps to reproduce

> **Note**: You can reproduce the code using [interactive Node.js shell by Runkit](https://npm.runkit.com/metascraper).

Tell us how to reproduce this issue.

### Expected behaviour

Tell us what should happen

### Actual behaviour

Tell us what happens instead


================================================
FILE: .github/dependabot.yml
================================================
version: 2
updates:
  - package-ecosystem: npm
    directory: "/"
    schedule:
      interval: daily
  - package-ecosystem: "github-actions"
    directory: "/"
    schedule:
      # Check for updates to GitHub Actions every weekday
      interval: "daily"


================================================
FILE: .github/workflows/get-matrix.mjs
================================================
import { readdir, readFile } from 'fs/promises'
import { dirname, join } from 'path'
import { fileURLToPath } from 'url'

const __dirname = dirname(fileURLToPath(import.meta.url))

const packages = []

const packagesPath = join(__dirname, '../../packages')

for (const packagePath of await readdir(packagesPath)) {
  const pkg = join(packagesPath, packagePath, 'package.json')
  const { name, scripts } = JSON.parse(await readFile(pkg))
  if (scripts && scripts.test && scripts.test !== 'exit 0') {
    packages.push({
      name,
      filter: `./packages/${packagePath}`
    })
  }
}

console.log(JSON.stringify({ package: packages }))


================================================
FILE: .github/workflows/main.yml
================================================
name: main

on:
  push:
    branches:
      - master

jobs:
  contributors:
    if: "${{ github.event.head_commit.message != 'build: contributors' }}"
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v6
        with:
          fetch-depth: 0
      - name: Setup Node.js
        uses: actions/setup-node@v6
        with:
          node-version: lts/*
      - name: Setup PNPM
        uses: pnpm/action-setup@v6
        with:
          version: latest
      - name: Install
        run: pnpm install --dangerously-allow-all-builds
      - name: Contributors
        run: |
          git config --global user.email ${{ secrets.GIT_EMAIL }}
          git config --global user.name ${{ secrets.GIT_USERNAME }}
          pnpm run contributors
      - name: Push changes
        run: |
          git push origin ${{ github.head_ref }}
  matrix:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6
      - uses: actions/setup-node@v6
      - id: matrix
        run: echo "matrix=$(node .github/workflows/get-matrix.mjs)" >> $GITHUB_OUTPUT
      - run: echo ${{ steps.matrix.outputs.matrix }}
    outputs:
      matrix: ${{ steps.matrix.outputs.matrix }}
  test:
    name: Test ${{ matrix.package.name }}
    if: |
      !startsWith(github.event.head_commit.message, 'chore(release):') &&
      !startsWith(github.event.head_commit.message, 'docs:') &&
      !startsWith(github.event.head_commit.message, 'ci:')
    needs: [contributors, matrix]
    runs-on: ubuntu-latest
    strategy:
      fail-fast: false
      matrix: ${{fromJson(needs.matrix.outputs.matrix)}}
    steps:
      - name: Checkout
        uses: actions/checkout@v6
      - name: Setup Node.js
        uses: actions/setup-node@v6
        with:
          node-version: lts/*
      - name: Setup PNPM
        uses: pnpm/action-setup@v6
        with:
          version: latest
      - name: Install
        run: pnpm install --dangerously-allow-all-builds
      - name: Test
        run: pnpm --filter "${{ matrix.package.filter }}" exec c8 pnpm test
      - name: Coverage
        run: pnpm --filter "${{ matrix.package.filter }}" exec c8 report --reporter=lcov --report-dir=coverage
      - name: Upload
        continue-on-error: true
        uses: coverallsapp/github-action@main
        with:
          flag-name: ${{ matrix.package.name }}
          parallel: true
          file: $(pnpm --filter "${{ matrix.package.filter }}" exec pwd)/coverage/lcov.info

  finish:
    needs: test
    runs-on: ubuntu-latest
    steps:
      - name: Coveralls Finished
        continue-on-error: true
        uses: coverallsapp/github-action@main
        with:
          parallel-finished: true


================================================
FILE: .github/workflows/pull_request.yml
================================================
name: pull_request

on:
  push:
    branches:
      - master
  pull_request:
    branches:
      - master

jobs:
  matrix:
    if: github.ref != 'refs/heads/master'
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6
      - uses: actions/setup-node@v6
      - id: matrix
        run: echo "matrix=$(node .github/workflows/get-matrix.mjs)" >> $GITHUB_OUTPUT
      - run: echo ${{ steps.matrix.outputs.matrix }}
    outputs:
      matrix: ${{ steps.matrix.outputs.matrix }}
  test:
    name: Test ${{ matrix.package.name }}
    needs: matrix
    runs-on: ubuntu-latest
    strategy:
      fail-fast: false
      matrix: ${{fromJson(needs.matrix.outputs.matrix)}}
    steps:
      - name: Checkout
        uses: actions/checkout@v6
      - name: Setup Node.js
        uses: actions/setup-node@v6
        with:
          node-version: lts/*
      - name: Setup PNPM
        uses: pnpm/action-setup@v6
        with:
          version: latest
      - name: Install
        run: pnpm install --dangerously-allow-all-builds
      - name: Test
        run: pnpm --filter "${{ matrix.package.filter }}" exec c8 pnpm test
      - name: Coverage
        run: pnpm --filter "${{ matrix.package.filter }}" exec c8 report --reporter=lcov --report-dir=coverage
      - name: Upload
        continue-on-error: true
        uses: coverallsapp/github-action@main
        with:
          flag-name: ${{ matrix.package.name }}
          parallel: true
          file: $(pnpm --filter "${{ matrix.package.filter }}" exec pwd)/coverage/lcov.info

  finish:
    needs: test
    runs-on: ubuntu-latest
    steps:
      - name: Coveralls Finished
        continue-on-error: true
        uses: coverallsapp/github-action@main
        with:
          parallel-finished: true


================================================
FILE: .gitignore
================================================
############################
# npm
############################
node_modules
npm-debug.log
lerna-debug.log

############################
# tmp, editor & OS files
############################
.tmp
*.swo
*.swp
*.swn
*.swm
.DS_Store
*#
*~
.idea
*sublime*
nbproject

############################
# Tests
############################
testApp
coverage
.nyc_output

############################
# Other
############################
.node_history
.envrc


================================================
FILE: .nojekyll
================================================


================================================
FILE: .npmrc
================================================
audit=false
fund=false
loglevel=error
package-lock=false
prefer-dedupe=true
prefer-offline=false
resolution-mode=highest
save-prefix=~
save=false
shamefully-hoist=true
strict-peer-dependencies=false
unsafe-perm=true
block-exotic-subdeps=false


================================================
FILE: CHANGELOG.md
================================================
# Change Log

All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.

## [5.50.2](https://github.com/microlinkhq/metascraper/compare/v5.50.1...v5.50.2) (2026-04-24)

**Note:** Version bump only for package metascraper

## [5.50.1](https://github.com/microlinkhq/metascraper/compare/v5.50.0...v5.50.1) (2026-04-14)

### Bug Fixes

* **security:** bump lodash from ~4.17.23 to ~4.18.0 ([#833](https://github.com/microlinkhq/metascraper/issues/833)) ([e89d9d3](https://github.com/microlinkhq/metascraper/commit/e89d9d3f0bfdebd76aba8cb5561b146152872cfb)), closes [#832](https://github.com/microlinkhq/metascraper/issues/832)

# [5.50.0](https://github.com/microlinkhq/metascraper/compare/v5.49.25...v5.50.0) (2026-03-20)

### Features

* defuddle ([#829](https://github.com/microlinkhq/metascraper/issues/829)) ([eb5b8eb](https://github.com/microlinkhq/metascraper/commit/eb5b8eb4e83d1e6f9cbc03a48b16c0e90a4fa686))

## [5.49.25](https://github.com/microlinkhq/metascraper/compare/v5.49.24...v5.49.25) (2026-03-07)

### Bug Fixes

* **helpers:** terminate iframe workers after settle ([#809](https://github.com/microlinkhq/metascraper/issues/809)) ([c7317ac](https://github.com/microlinkhq/metascraper/commit/c7317ac628c3112dc7bda259de815f9d651b2f6c))
* **instagram:** avoid stale description cache for date parsing ([#804](https://github.com/microlinkhq/metascraper/issues/804)) ([31ac6c3](https://github.com/microlinkhq/metascraper/commit/31ac6c3b870484ffd4fa8d5d368d59728eab2299))
* **manifest:** fallback publisher to name when short_name missing ([#803](https://github.com/microlinkhq/metascraper/issues/803)) ([0fc8043](https://github.com/microlinkhq/metascraper/commit/0fc8043050a12d0acf0478e80833a3d1942ef0c7))
* **media-provider:** bound retry loop and add coverage ([#800](https://github.com/microlinkhq/metascraper/issues/800)) ([2be6d3b](https://github.com/microlinkhq/metascraper/commit/2be6d3b08d63a6edbd601b184cae338e911f6114))
* regression ([#813](https://github.com/microlinkhq/metascraper/issues/813)) ([64aa483](https://github.com/microlinkhq/metascraper/commit/64aa483a9b4b076b907f292d926f74c3c8bab7eb))
* rule error isolation ([#801](https://github.com/microlinkhq/metascraper/issues/801)) ([5c702f0](https://github.com/microlinkhq/metascraper/commit/5c702f00b56b351b8ed0b2f959682853213c58b5))
* **tiktok:** fallback date parsing when video id is invalid ([#807](https://github.com/microlinkhq/metascraper/issues/807)) ([f92682a](https://github.com/microlinkhq/metascraper/commit/f92682a0ee770552d39d164dee161e9f9504704a))

### Performance Improvements

* **audio,video:** replace lodash media scans with native loops ([#811](https://github.com/microlinkhq/metascraper/issues/811)) ([c175eb4](https://github.com/microlinkhq/metascraper/commit/c175eb4d02c69dddd82f5083c0ac41222bcf78f3))
* **audio,video:** short-circuit iframe probing on first hit ([#810](https://github.com/microlinkhq/metascraper/issues/810)) ([ac8fc2a](https://github.com/microlinkhq/metascraper/commit/ac8fc2a03e983a194a8b34e6a14b1b133502a1c8))
* **audio:** cache iframe fetches and dedupe probing urls ([#818](https://github.com/microlinkhq/metascraper/issues/818)) ([db184af](https://github.com/microlinkhq/metascraper/commit/db184af45f94dc079d5382f66c0e984ec8d885df))
* **helpers:** use reference-only html dom memoization ([#816](https://github.com/microlinkhq/metascraper/issues/816)) ([bb90b1c](https://github.com/microlinkhq/metascraper/commit/bb90b1cbb1a0470c61611539d339e952a6018690))
* **logo-favicon:** reduce favicon candidate allocations ([#814](https://github.com/microlinkhq/metascraper/issues/814)) ([d2f4291](https://github.com/microlinkhq/metascraper/commit/d2f429164af7f2d32c6c63ca21e940d13584eb2b))
* **media-provider:** select best format in linear time ([#819](https://github.com/microlinkhq/metascraper/issues/819)) ([97587f3](https://github.com/microlinkhq/metascraper/commit/97587f33ed2e4244600a27cb3816d31abb2cc566))
* **metascraper:** fast-path mergeRules in common case ([#820](https://github.com/microlinkhq/metascraper/issues/820)) ([7dc559a](https://github.com/microlinkhq/metascraper/commit/7dc559ab2435b61fffa1822dd75aac9c204ee05f))
* **metascraper:** reduce getData allocations ([#827](https://github.com/microlinkhq/metascraper/issues/827)) ([5c674af](https://github.com/microlinkhq/metascraper/commit/5c674af31952a85907bb8d6fdbdb15e65d9ce2aa))
* **readability:** cache html serialization per htmlDom ([#823](https://github.com/microlinkhq/metascraper/issues/823)) ([a1b10fc](https://github.com/microlinkhq/metascraper/commit/a1b10fcb5708d6cc6ee5ec90c945d6960863b929))
* **readability:** use happy-dom window parser ([#822](https://github.com/microlinkhq/metascraper/issues/822)) ([0333253](https://github.com/microlinkhq/metascraper/commit/033325361132fcb56093e46c6b9ca70b09018c29))
* **video:** share iframe fetch cache across rules ([#817](https://github.com/microlinkhq/metascraper/issues/817)) ([a54cc73](https://github.com/microlinkhq/metascraper/commit/a54cc73e99a67e14237f42c74d2d9cdb3bdbed3d))

### Reverts

* Revert "fix(instagram): avoid stale description cache for date parsing" ([0677cd6](https://github.com/microlinkhq/metascraper/commit/0677cd66f325378c3b0e70e3a0eb4b6ee678c42a))

## [5.49.24](https://github.com/microlinkhq/metascraper/compare/v5.49.23...v5.49.24) (2026-02-17)

### Bug Fixes

* **jsonld:** respect root nodes ([#799](https://github.com/microlinkhq/metascraper/issues/799)) ([b60173a](https://github.com/microlinkhq/metascraper/commit/b60173aa1e06966ac08b16d52c1ed4ae82bc7f33))

## [5.49.23](https://github.com/microlinkhq/metascraper/compare/v5.49.22...v5.49.23) (2026-02-17)

### Bug Fixes

* **helpers:** [@graph](https://github.com/graph) must be an array ([#798](https://github.com/microlinkhq/metascraper/issues/798)) ([9d58749](https://github.com/microlinkhq/metascraper/commit/9d587491ca9073f653d2bdb0eeb3fab241fe2041))

## [5.49.22](https://github.com/microlinkhq/metascraper/compare/v5.49.21...v5.49.22) (2026-01-30)

**Note:** Version bump only for package metascraper

## [5.49.21](https://github.com/microlinkhq/metascraper/compare/v5.49.20...v5.49.21) (2026-01-27)

### Bug Fixes

* **x:** detect embedded image in a post ([#794](https://github.com/microlinkhq/metascraper/issues/794)) ([225e362](https://github.com/microlinkhq/metascraper/commit/225e362728fc6c60e86ea61c1a7d42d14b0e0ce9))

## [5.49.20](https://github.com/microlinkhq/metascraper/compare/v5.49.19...v5.49.20) (2026-01-24)

**Note:** Version bump only for package metascraper

## [5.49.19](https://github.com/microlinkhq/metascraper/compare/v5.49.18...v5.49.19) (2026-01-24)

### Bug Fixes

* declare missing dependency ([#791](https://github.com/microlinkhq/metascraper/issues/791)) ([e26330c](https://github.com/microlinkhq/metascraper/commit/e26330ca038c6c848d97a5c5cce664933af62316)), closes [#790](https://github.com/microlinkhq/metascraper/issues/790)

## [5.49.18](https://github.com/microlinkhq/metascraper/compare/v5.49.17...v5.49.18) (2026-01-23)

**Note:** Version bump only for package metascraper

## [5.49.17](https://github.com/microlinkhq/metascraper/compare/v5.49.16...v5.49.17) (2026-01-22)

**Note:** Version bump only for package metascraper

## [5.49.16](https://github.com/microlinkhq/metascraper/compare/v5.49.15...v5.49.16) (2026-01-22)

### Bug Fixes

* **helpers:** handle invalid data uris ([#788](https://github.com/microlinkhq/metascraper/issues/788)) ([ccad74d](https://github.com/microlinkhq/metascraper/commit/ccad74db0ab4013e8c37dd2eec5ce02218f75b47))

## [5.49.15](https://github.com/microlinkhq/metascraper/compare/v5.49.14...v5.49.15) (2025-12-30)

**Note:** Version bump only for package metascraper

## [5.49.14](https://github.com/microlinkhq/metascraper/compare/v5.49.13...v5.49.14) (2025-12-30)

**Note:** Version bump only for package metascraper

## [5.49.13](https://github.com/microlinkhq/metascraper/compare/v5.49.12...v5.49.13) (2025-12-30)

**Note:** Version bump only for package metascraper

## [5.49.12](https://github.com/microlinkhq/metascraper/compare/v5.49.11...v5.49.12) (2025-12-30)

**Note:** Version bump only for package metascraper

## [5.49.11](https://github.com/microlinkhq/metascraper/compare/v5.49.10...v5.49.11) (2025-12-23)

**Note:** Version bump only for package metascraper

## [5.49.10](https://github.com/microlinkhq/metascraper/compare/v5.49.9...v5.49.10) (2025-12-23)

**Note:** Version bump only for package metascraper

## [5.49.9](https://github.com/microlinkhq/metascraper/compare/v5.49.8...v5.49.9) (2025-12-23)

**Note:** Version bump only for package metascraper

## [5.49.8](https://github.com/microlinkhq/metascraper/compare/v5.49.7...v5.49.8) (2025-12-23)

**Note:** Version bump only for package metascraper

## [5.49.7](https://github.com/microlinkhq/metascraper/compare/v5.49.6...v5.49.7) (2025-12-03)

**Note:** Version bump only for package metascraper

## [5.49.6](https://github.com/microlinkhq/metascraper/compare/v5.49.5...v5.49.6) (2025-10-20)

### Bug Fixes

* **readability:** don't throw under parsing error ([2c11db1](https://github.com/microlinkhq/metascraper/commit/2c11db14fae656d796d2dfb5c5966fc16c9118c2))

## [5.49.5](https://github.com/microlinkhq/metascraper/compare/v5.49.4...v5.49.5) (2025-10-19)

**Note:** Version bump only for package metascraper

## [5.49.4](https://github.com/microlinkhq/metascraper/compare/v5.49.3...v5.49.4) (2025-09-15)

### Bug Fixes

* return ([a5a56a8](https://github.com/microlinkhq/metascraper/commit/a5a56a8d5b06fccd0906c6d5ced9caef72244f72))

## [5.49.3](https://github.com/microlinkhq/metascraper/compare/v5.49.2...v5.49.3) (2025-09-09)

**Note:** Version bump only for package metascraper

## [5.49.2](https://github.com/microlinkhq/metascraper/compare/v5.49.1...v5.49.2) (2025-09-06)

**Note:** Version bump only for package metascraper

## [5.49.1](https://github.com/microlinkhq/metascraper/compare/v5.49.0...v5.49.1) (2025-06-28)

**Note:** Version bump only for package metascraper

# [5.49.0](https://github.com/microlinkhq/metascraper/compare/v5.48.0...v5.49.0) (2025-06-26)

### Features

* add `pickPropNames` ([010125e](https://github.com/microlinkhq/metascraper/commit/010125e4b04a3ffb6307a4f7c3515dbec33f7f27))

# [5.48.0](https://github.com/microlinkhq/metascraper/compare/v5.47.2...v5.48.0) (2025-06-26)

### Features

* omit rules names ([e2d2fa1](https://github.com/microlinkhq/metascraper/commit/e2d2fa186a3f9dcf932f9d854209b56a639533fa))

### Performance Improvements

* optimize loadRules ([31b11f0](https://github.com/microlinkhq/metascraper/commit/31b11f0b397c132510092c4af13f7f61663e0c54))

## [5.47.2](https://github.com/microlinkhq/metascraper/compare/v5.47.1...v5.47.2) (2025-06-23)

**Note:** Version bump only for package metascraper

## [5.47.1](https://github.com/microlinkhq/metascraper/compare/v5.47.0...v5.47.1) (2025-06-06)

**Note:** Version bump only for package metascraper

# [5.47.0](https://github.com/microlinkhq/metascraper/compare/v5.46.19...v5.47.0) (2025-05-26)

### Features

* **media-provider:** flags → args ([2f1f9e2](https://github.com/microlinkhq/metascraper/commit/2f1f9e2633520094ef413f9f95cd4dd3245b520c))

## [5.46.19](https://github.com/microlinkhq/metascraper/compare/v5.46.18...v5.46.19) (2025-05-25)

**Note:** Version bump only for package metascraper

## [5.46.18](https://github.com/microlinkhq/metascraper/compare/v5.46.17...v5.46.18) (2025-05-25)

**Note:** Version bump only for package metascraper

## [5.46.17](https://github.com/microlinkhq/metascraper/compare/v5.46.16...v5.46.17) (2025-05-24)

**Note:** Version bump only for package metascraper

## [5.46.16](https://github.com/microlinkhq/metascraper/compare/v5.46.15...v5.46.16) (2025-05-24)

**Note:** Version bump only for package metascraper

## [5.46.15](https://github.com/microlinkhq/metascraper/compare/v5.46.14...v5.46.15) (2025-05-11)

### Bug Fixes

* **helpers:** publish folder ([7cd9469](https://github.com/microlinkhq/metascraper/commit/7cd9469c3c8ee8c1a2c1d968b7381f472a513f17))

## [5.46.14](https://github.com/microlinkhq/metascraper/compare/v5.46.13...v5.46.14) (2025-05-11)

### Bug Fixes

* **test:** flaky ([d447ee6](https://github.com/microlinkhq/metascraper/commit/d447ee6d17786b63d4d8c440099c0dba7934d72b))

## [5.46.13](https://github.com/microlinkhq/metascraper/compare/v5.46.12...v5.46.13) (2025-05-07)

### Bug Fixes

* **types:** allow pkgName and test properties on Rules ([1b386cc](https://github.com/microlinkhq/metascraper/commit/1b386cc234113e78c5bf6092da113fbdad61c98d))

## [5.46.12](https://github.com/microlinkhq/metascraper/compare/v5.46.11...v5.46.12) (2025-04-27)

**Note:** Version bump only for package metascraper

## [5.46.11](https://github.com/microlinkhq/metascraper/compare/v5.46.10...v5.46.11) (2025-04-04)

**Note:** Version bump only for package metascraper

## [5.46.10](https://github.com/microlinkhq/metascraper/compare/v5.46.9...v5.46.10) (2025-04-03)

### Bug Fixes

* **helpers:** is-uri take ride of whitespaces ([1c058b6](https://github.com/microlinkhq/metascraper/commit/1c058b65009555ad9a11b6c48e63f3c190faa044))
* typo ([cb2d6f6](https://github.com/microlinkhq/metascraper/commit/cb2d6f67ed300ef0f78f52e888ab2c954b991284))

## [5.46.9](https://github.com/microlinkhq/metascraper/compare/v5.46.8...v5.46.9) (2025-03-08)

### Bug Fixes

* **logo-favicon:** check content-type correctly ([e98c1ca](https://github.com/microlinkhq/metascraper/commit/e98c1cafb2c691b0ba51361ddcf5698d5550452a))

## [5.46.8](https://github.com/microlinkhq/metascraper/compare/v5.46.7...v5.46.8) (2025-02-03)

### Bug Fixes

* **docs:** corner github link ([d64004a](https://github.com/microlinkhq/metascraper/commit/d64004a588ed81bb89dae39233d456d50e180968))
* **logo-favicon:** ensure body is present ([ae909c5](https://github.com/microlinkhq/metascraper/commit/ae909c5309c49c9b64310dacc9a51c385dabdf6c))

### Performance Improvements

* **logo-favicon:** use raw comparison ([a2ecb27](https://github.com/microlinkhq/metascraper/commit/a2ecb278a8f80a3a7fa67bd21d02149b2a833374))

## [5.46.7](https://github.com/microlinkhq/metascraper/compare/v5.46.6...v5.46.7) (2025-01-28)

### Bug Fixes

* **docs:** corner github link ([e5c73d2](https://github.com/microlinkhq/metascraper/commit/e5c73d2a15cab3428990d78f7cf6c39da600b575))

## [5.46.6](https://github.com/microlinkhq/metascraper/compare/v5.46.5...v5.46.6) (2025-01-25)

**Note:** Version bump only for package metascraper

## [5.46.5](https://github.com/microlinkhq/metascraper/compare/v5.46.4...v5.46.5) (2025-01-19)

### Performance Improvements

* **helpers:** remove isMediaUrl memoize ([91b1fe6](https://github.com/microlinkhq/metascraper/commit/91b1fe6f2d9c8932d162dfd0d650cd69be8625d7))

## [5.46.4](https://github.com/microlinkhq/metascraper/compare/v5.46.3...v5.46.4) (2025-01-19)

### Bug Fixes

* **helpers:** add missing memoize.EqualityFirstArgument ([d350837](https://github.com/microlinkhq/metascraper/commit/d3508376409dc80f280b8489fb4f16ba0015b30a))

## [5.46.3](https://github.com/microlinkhq/metascraper/compare/v5.46.2...v5.46.3) (2025-01-19)

### Bug Fixes

* **metrascraper:** add pkgName type ([8b8b9d0](https://github.com/microlinkhq/metascraper/commit/8b8b9d06c8c053a844e764ed6ab5c90ab49da0ee))

### Performance Improvements

* **readability:** add document-write benchmark ([18fdbdd](https://github.com/microlinkhq/metascraper/commit/18fdbddfbd0757ef6c8018b3764e9328c5512dab))

## [5.46.2](https://github.com/microlinkhq/metascraper/compare/v5.46.1...v5.46.2) (2025-01-16)

**Note:** Version bump only for package metascraper

## [5.46.1](https://github.com/microlinkhq/metascraper/compare/v5.46.0...v5.46.1) (2025-01-13)

### Bug Fixes

* add missing dependency ([c044771](https://github.com/microlinkhq/metascraper/commit/c0447715e3b57db39adfeb541558bb22ec4851d3))

# [5.46.0-beta.0](https://github.com/microlinkhq/metascraper/compare/v5.45.29...v5.46.0-beta.0) (2025-01-10)

### Bug Fixes

* load dependency ([6344788](https://github.com/microlinkhq/metascraper/commit/6344788ddbfc27a03f3ce12b2a842cd438574cc5))

### Features

* add profiling support ([9370e3c](https://github.com/microlinkhq/metascraper/commit/9370e3cdde056e86dcc2d189b3b22dd01a310372))

## [5.45.29](https://github.com/microlinkhq/metascraper/compare/v5.45.28...v5.45.29) (2025-01-07)

### Bug Fixes

* **instagram:** remove debug log ([835e5fd](https://github.com/microlinkhq/metascraper/commit/835e5fd4d3460fc9784fbc2b2b25e0358239d12d))

## [5.45.28](https://github.com/microlinkhq/metascraper/compare/v5.45.27...v5.45.28) (2025-01-01)

### Bug Fixes

* **readability:** cache key ([aa41e12](https://github.com/microlinkhq/metascraper/commit/aa41e127c7a872fb199df520170555238e60505f))

## [5.45.27](https://github.com/microlinkhq/metascraper/compare/v5.45.26...v5.45.27) (2024-12-04)

**Note:** Version bump only for package metascraper

## [5.45.26](https://github.com/microlinkhq/metascraper/compare/v5.45.25...v5.45.26) (2024-11-26)

### Bug Fixes

* **logo-favicon:** don't resolve roo path as logo ([16cff65](https://github.com/microlinkhq/metascraper/commit/16cff653f1f920b62e3d5ca2ff5fb4ecf230bb0c))

## [5.45.25](https://github.com/microlinkhq/metascraper/compare/v5.45.24...v5.45.25) (2024-10-18)

**Note:** Version bump only for package metascraper

## [5.45.24](https://github.com/microlinkhq/metascraper/compare/v5.45.23...v5.45.24) (2024-10-05)

### Bug Fixes

* linter ([05c4d30](https://github.com/microlinkhq/metascraper/commit/05c4d305fb3468c493e4e8f48262f20e399b9e9b))
* **metascraper-logo-favicon:** allow URL input and apply priority. closes [#724](https://github.com/microlinkhq/metascraper/issues/724) ([cfe41bb](https://github.com/microlinkhq/metascraper/commit/cfe41bb4ef30ce7d4e6dee418270057706db937c))

## [5.45.23](https://github.com/microlinkhq/metascraper/compare/v5.45.22...v5.45.23) (2024-08-11)

**Note:** Version bump only for package metascraper

## [5.45.22](https://github.com/microlinkhq/metascraper/compare/v5.45.21...v5.45.22) (2024-07-25)

### Bug Fixes

* **logo-favicon:** pass resolveFaviconUrl ([92d1030](https://github.com/microlinkhq/metascraper/commit/92d1030b8e50baae8a3f38279da80d8acf904b58))

## [5.45.21](https://github.com/microlinkhq/metascraper/compare/v5.45.20...v5.45.21) (2024-07-15)

### Bug Fixes

* **logo-favicon:** expose resolveFaviconUrl ([e4ede2d](https://github.com/microlinkhq/metascraper/commit/e4ede2d93340dbacca05e80e0bdb3e3ecf8e1acb))

## [5.45.20](https://github.com/microlinkhq/metascraper/compare/v5.45.19...v5.45.20) (2024-07-15)

**Note:** Version bump only for package metascraper

## [5.45.19](https://github.com/microlinkhq/metascraper/compare/v5.45.18...v5.45.19) (2024-07-03)

**Note:** Version bump only for package metascraper

## [5.45.18](https://github.com/microlinkhq/metascraper/compare/v5.45.17...v5.45.18) (2024-07-02)

**Note:** Version bump only for package metascraper

## [5.45.17](https://github.com/microlinkhq/metascraper/compare/v5.45.16...v5.45.17) (2024-07-01)

**Note:** Version bump only for package metascraper

## [5.45.16](https://github.com/microlinkhq/metascraper/compare/v5.45.15...v5.45.16) (2024-06-30)

### Bug Fixes

* **x:** strip query parameter from title ([9fcf3d7](https://github.com/microlinkhq/metascraper/commit/9fcf3d7b1b72978748d47dd94da0380af9815d22))

## [5.45.15](https://github.com/microlinkhq/metascraper/compare/v5.45.14...v5.45.15) (2024-06-30)

**Note:** Version bump only for package metascraper

## [5.45.14](https://github.com/microlinkhq/metascraper/compare/v5.45.13...v5.45.14) (2024-06-24)

### Bug Fixes

* add htmlDom type ([7fd2bbf](https://github.com/microlinkhq/metascraper/commit/7fd2bbf0409d7b72eb2c8d22e9210b32688598b7))

## [5.45.13](https://github.com/microlinkhq/metascraper/compare/v5.45.12...v5.45.13) (2024-06-24)

**Note:** Version bump only for package metascraper

## [5.45.12](https://github.com/microlinkhq/metascraper/compare/v5.45.11...v5.45.12) (2024-06-18)

### Bug Fixes

* **logo-favicon:** verify body first character ([a3665f4](https://github.com/microlinkhq/metascraper/commit/a3665f4fd2e2ccfb16020ecebbeed23f95e66715))

## [5.45.11](https://github.com/microlinkhq/metascraper/compare/v5.45.10...v5.45.11) (2024-06-17)

### Bug Fixes

* ensure favicon detect in markup is expected content-type ([e366887](https://github.com/microlinkhq/metascraper/commit/e3668875f56dd6264615fe084c4df73acdd679d3))

## [5.45.10](https://github.com/microlinkhq/metascraper/compare/v5.45.9...v5.45.10) (2024-06-03)

**Note:** Version bump only for package metascraper

## [5.45.9](https://github.com/microlinkhq/metascraper/compare/v5.45.8...v5.45.9) (2024-05-28)

**Note:** Version bump only for package metascraper

## [5.45.8](https://github.com/microlinkhq/metascraper/compare/v5.45.7...v5.45.8) (2024-05-20)

**Note:** Version bump only for package metascraper

## [5.45.7](https://github.com/microlinkhq/metascraper/compare/v5.45.6...v5.45.7) (2024-05-20)

**Note:** Version bump only for package metascraper

## [5.45.6](https://github.com/microlinkhq/metascraper/compare/v5.45.5...v5.45.6) (2024-05-19)

**Note:** Version bump only for package metascraper

## [5.45.5](https://github.com/microlinkhq/metascraper/compare/v5.45.4...v5.45.5) (2024-04-25)

### Bug Fixes

* **publisher:** remove too generic rule ([592309e](https://github.com/microlinkhq/metascraper/commit/592309ed428b681880dc415f2ac18d60029fec66))

## [5.45.4](https://github.com/microlinkhq/metascraper/compare/v5.45.3...v5.45.4) (2024-04-18)

**Note:** Version bump only for package metascraper

## [5.45.3](https://github.com/microlinkhq/metascraper/compare/v5.45.2...v5.45.3) (2024-03-23)

### Bug Fixes

* work with tsconfig `module: node16` in ESM ([7e11ac8](https://github.com/microlinkhq/metascraper/commit/7e11ac8fddb738d1764386d4e59455594f8df2b4))

## [5.45.2](https://github.com/microlinkhq/metascraper/compare/v5.45.1...v5.45.2) (2024-03-14)

### Bug Fixes

* **logo-favicon:** ensure url exists ([989448e](https://github.com/microlinkhq/metascraper/commit/989448e37d1ef5839ca8cd123ca09029988ea1e7))

## [5.45.1](https://github.com/microlinkhq/metascraper/compare/v5.45.0...v5.45.1) (2024-02-25)

**Note:** Version bump only for package metascraper

# [5.45.0](https://github.com/microlinkhq/metascraper/compare/v5.44.0...v5.45.0) (2024-02-25)

### Bug Fixes

* **logo-favicon:** favicon.ico with valid content-type ([4c7007d](https://github.com/microlinkhq/metascraper/commit/4c7007d0b6ac76a24d9bf7b2fc8dd5fb31cf0906))

### Features

* **logo-favicon:** add favicon.png support ([8f68b3e](https://github.com/microlinkhq/metascraper/commit/8f68b3e496abf016b1fa472d0e11453246f52b27))

# [5.44.0](https://github.com/microlinkhq/metascraper/compare/v5.43.7...v5.44.0) (2024-02-11)

### Bug Fixes

* linter ([f0700cf](https://github.com/microlinkhq/metascraper/commit/f0700cff8fec522fc06deaa0ab232d1769ec9a96))

### Features

* **logo:** ensure logo from markup is reachable ([9f81b91](https://github.com/microlinkhq/metascraper/commit/9f81b91b64d55c47e2d0a8821b72202cefdf554d))

## [5.43.7](https://github.com/microlinkhq/metascraper/compare/v5.43.6...v5.43.7) (2024-02-10)

### Bug Fixes

* **logo:** avoid data uri with no length ([e4f7eed](https://github.com/microlinkhq/metascraper/commit/e4f7eed5b6ab34ea02d075241ebf16ed4823256a))

## [5.43.6](https://github.com/microlinkhq/metascraper/compare/v5.43.5...v5.43.6) (2024-02-09)

### Bug Fixes

* pass any for keyv types ([711424c](https://github.com/microlinkhq/metascraper/commit/711424c5716fc05567f1cb3fe669750871c7a7c6)), closes [#686](https://github.com/microlinkhq/metascraper/issues/686)

## [5.43.5](https://github.com/microlinkhq/metascraper/compare/v5.43.4...v5.43.5) (2024-01-30)

### Bug Fixes

* **media-provider:** remove debug log ([a5f4e42](https://github.com/microlinkhq/metascraper/commit/a5f4e42c6ff611fc87571c639846ff60d0198530))

## [5.43.4](https://github.com/microlinkhq/metascraper/compare/v5.43.3...v5.43.4) (2024-01-23)

**Note:** Version bump only for package metascraper

## [5.43.3](https://github.com/microlinkhq/metascraper/compare/v5.43.2...v5.43.3) (2024-01-17)

### Performance Improvements

* memoize isMediaUrl ([#688](https://github.com/microlinkhq/metascraper/issues/688)) ([7f577b9](https://github.com/microlinkhq/metascraper/commit/7f577b9afb46c1938e68e14d316ec6fc3c68b14a))

## [5.43.2](https://github.com/microlinkhq/metascraper/compare/v5.43.1...v5.43.2) (2024-01-06)

**Note:** Version bump only for package metascraper

## [5.43.1](https://github.com/microlinkhq/metascraper/compare/v5.43.0...v5.43.1) (2024-01-02)

**Note:** Version bump only for package metascraper

# [5.43.0](https://github.com/microlinkhq/metascraper/compare/v5.42.6...v5.43.0) (2023-12-30)

### Features

* **video:** improve iframe detection ([#683](https://github.com/microlinkhq/metascraper/issues/683)) ([49a37e5](https://github.com/microlinkhq/metascraper/commit/49a37e551f0c6aa36d746906dfdd45559f103f11))

## [5.42.6](https://github.com/microlinkhq/metascraper/compare/v5.42.5...v5.42.6) (2023-12-22)

### Bug Fixes

* **audio:** only consider http URLs ([#678](https://github.com/microlinkhq/metascraper/issues/678)) ([3f03005](https://github.com/microlinkhq/metascraper/commit/3f030056af3b9f3c4f7bd53ef654b92a1809da26))
* **date:** types ([c7bd5c3](https://github.com/microlinkhq/metascraper/commit/c7bd5c3655c93c903530f6245d9157dba5f751db)), closes [#682](https://github.com/microlinkhq/metascraper/issues/682)

## [5.42.5](https://github.com/microlinkhq/metascraper/compare/v5.42.4...v5.42.5) (2023-12-20)

**Note:** Version bump only for package metascraper

## [5.42.4](https://github.com/microlinkhq/metascraper/compare/v5.42.3...v5.42.4) (2023-12-19)

### Bug Fixes

* **metascraper-logo-favicon:** types reference in package.json ([#680](https://github.com/microlinkhq/metascraper/issues/680)) ([ea74174](https://github.com/microlinkhq/metascraper/commit/ea74174fde394248d55263a14a2b38577e5d01f4))

## [5.42.3](https://github.com/microlinkhq/metascraper/compare/v5.42.2...v5.42.3) (2023-12-19)

### Bug Fixes

* types ([0977767](https://github.com/microlinkhq/metascraper/commit/09777671126255c27027701991e1762a6e1fc2ca))

## [5.42.2](https://github.com/microlinkhq/metascraper/compare/v5.42.1...v5.42.2) (2023-12-19)

### Bug Fixes

* **types:** use src folder ([#679](https://github.com/microlinkhq/metascraper/issues/679)) ([bbdf735](https://github.com/microlinkhq/metascraper/commit/bbdf735f8c5ab6fcfa0db39728c018e94f289812))

## [5.42.1](https://github.com/microlinkhq/metascraper/compare/v5.42.0...v5.42.1) (2023-12-18)

### Bug Fixes

* **media-provider:** serialize error to be printed ([c5c40bd](https://github.com/microlinkhq/metascraper/commit/c5c40bd88c0fff2ec3125891cf730dba9845276e))

# [5.42.0](https://github.com/microlinkhq/metascraper/compare/v5.41.0...v5.42.0) (2023-12-18)

### Features

* add types for packages ([#677](https://github.com/microlinkhq/metascraper/issues/677)) ([8b8339c](https://github.com/microlinkhq/metascraper/commit/8b8339c4bf9793df17244d2ce7aacc7224540437)), closes [#676](https://github.com/microlinkhq/metascraper/issues/676)

# [5.41.0](https://github.com/microlinkhq/metascraper/compare/v5.40.0...v5.41.0) (2023-12-07)

### Features

* better type definitions ([#673](https://github.com/microlinkhq/metascraper/issues/673)) ([c3b9b4f](https://github.com/microlinkhq/metascraper/commit/c3b9b4fd3aee3f8b802ee2b92579a8bcb806bfcc))

# [5.40.0](https://github.com/microlinkhq/metascraper/compare/v5.38.0...v5.40.0) (2023-12-06)

### Features

* **description:** don't truncate by default ([#668](https://github.com/microlinkhq/metascraper/issues/668)) ([383d1b3](https://github.com/microlinkhq/metascraper/commit/383d1b3b2437470d8ac54877b782a1fbcb8cea13))
* **media-provider:** stream support ([#671](https://github.com/microlinkhq/metascraper/issues/671)) ([fec73f8](https://github.com/microlinkhq/metascraper/commit/fec73f80af0541ba00ecaafecd03e823c79856fc))

# [5.39.0](https://github.com/microlinkhq/metascraper/compare/v5.38.0...v5.39.0) (2023-11-23)

### Features

* **description:** don't truncate by default ([#668](https://github.com/microlinkhq/metascraper/issues/668)) ([383d1b3](https://github.com/microlinkhq/metascraper/commit/383d1b3b2437470d8ac54877b782a1fbcb8cea13))

# [5.38.0](https://github.com/microlinkhq/metascraper/compare/v5.37.2...v5.38.0) (2023-11-09)

### Features

* **logo-favicon:** granular control ([#667](https://github.com/microlinkhq/metascraper/issues/667)) ([5a22fc3](https://github.com/microlinkhq/metascraper/commit/5a22fc33f68b73d990bc7027baad03e138b50a69))

## [5.37.2](https://github.com/microlinkhq/metascraper/compare/v5.37.1...v5.37.2) (2023-09-18)

**Note:** Version bump only for package metascraper

## [5.37.1](https://github.com/microlinkhq/metascraper/compare/v5.37.0...v5.37.1) (2023-09-18)

### Bug Fixes

* **audio:** don't consider iframe referencing itself ([#663](https://github.com/microlinkhq/metascraper/issues/663)) ([134ec60](https://github.com/microlinkhq/metascraper/commit/134ec60adb29d415f4156059d8f576ce4294a9ab))

# [5.37.0](https://github.com/microlinkhq/metascraper/compare/v5.36.0...v5.37.0) (2023-08-30)

### Features

* **logo:** support filter method ([#659](https://github.com/microlinkhq/metascraper/issues/659)) ([b53b726](https://github.com/microlinkhq/metascraper/commit/b53b726528049a069079346bca66c309d093a276))

# [5.36.0](https://github.com/microlinkhq/metascraper/compare/v5.35.2...v5.36.0) (2023-08-16)

### Features

* be possible to skip re2 ([#656](https://github.com/microlinkhq/metascraper/issues/656)) ([7dd62e7](https://github.com/microlinkhq/metascraper/commit/7dd62e7e5343fb8a52b8908529f83803a4b71088))

## [5.35.2](https://github.com/microlinkhq/metascraper/compare/v5.35.1...v5.35.2) (2023-08-15)

### Bug Fixes

* **audio,video:** load twitter:player as iframe ([#655](https://github.com/microlinkhq/metascraper/issues/655)) ([1bda60a](https://github.com/microlinkhq/metascraper/commit/1bda60a8920e1d9ec6d287843b3ea243feae962e))

## [5.35.1](https://github.com/microlinkhq/metascraper/compare/v5.35.0...v5.35.1) (2023-08-10)

### Bug Fixes

* use node16 or above ([#653](https://github.com/microlinkhq/metascraper/issues/653)) ([a1ad033](https://github.com/microlinkhq/metascraper/commit/a1ad0332cc74164f40ea7e39a76e811bcfb51c7a))

# [5.35.0](https://github.com/microlinkhq/metascraper/compare/v5.34.10...v5.35.0) (2023-08-09)

### Features

* **helpers:** infer audio/video from content type ([#651](https://github.com/microlinkhq/metascraper/issues/651)) ([d6eed13](https://github.com/microlinkhq/metascraper/commit/d6eed1331a56794b7a38ee94b5c68b32b0b12deb))

## [5.34.10](https://github.com/microlinkhq/metascraper/compare/v5.34.9...v5.34.10) (2023-07-29)

**Note:** Version bump only for package metascraper

## [5.34.9](https://github.com/microlinkhq/metascraper/compare/v5.34.8...v5.34.9) (2023-07-17)

**Note:** Version bump only for package metascraper

## [5.34.8](https://github.com/microlinkhq/metascraper/compare/v5.34.7...v5.34.8) (2023-06-27)

### Bug Fixes

* update Typescript types ([#643](https://github.com/microlinkhq/metascraper/issues/643)) ([c6e84b9](https://github.com/microlinkhq/metascraper/commit/c6e84b9c654be1e8a3acdb405f7e9fe4753a95eb))

## [5.34.7](https://github.com/microlinkhq/metascraper/compare/v5.34.6...v5.34.7) (2023-05-29)

**Note:** Version bump only for package metascraper

## [5.34.6](https://github.com/microlinkhq/metascraper/compare/v5.34.5...v5.34.6) (2023-05-26)

**Note:** Version bump only for package metascraper

## [5.34.5](https://github.com/microlinkhq/metascraper/compare/v5.34.4...v5.34.5) (2023-05-05)

**Note:** Version bump only for package metascraper

## [5.34.4](https://github.com/microlinkhq/metascraper/compare/v5.34.3...v5.34.4) (2023-05-03)

**Note:** Version bump only for package metascraper

## [5.34.3](https://github.com/microlinkhq/metascraper/compare/v5.34.2...v5.34.3) (2023-04-24)

**Note:** Version bump only for package metascraper

## [5.34.2](https://github.com/microlinkhq/metascraper/compare/v5.34.1...v5.34.2) (2023-04-03)

### Bug Fixes

* **instagram:** metadata ([f7b9ca4](https://github.com/microlinkhq/metascraper/commit/f7b9ca41f9e7c009dae1b0ad33bdb7d4794af405))

## [5.34.1](https://github.com/microlinkhq/metascraper/compare/v5.34.0...v5.34.1) (2023-03-29)

**Note:** Version bump only for package metascraper

# [5.34.0](https://github.com/microlinkhq/metascraper/compare/v5.33.9...v5.34.0) (2023-03-11)

### Features

* **date:** add `datePublished` and `datemodified` support ([#374](https://github.com/microlinkhq/metascraper/issues/374)) ([d219b58](https://github.com/microlinkhq/metascraper/commit/d219b58015551cf5a051942e410fb840a189738d))

## [5.33.9](https://github.com/microlinkhq/metascraper/compare/v5.33.8...v5.33.9) (2023-03-09)

### Bug Fixes

* **media-provider:** ensure publisher is not a boolean ([#623](https://github.com/microlinkhq/metascraper/issues/623)) ([1a55af7](https://github.com/microlinkhq/metascraper/commit/1a55af7f07f20f75919c451264c0a01fdddfdb9f))

## [5.33.8](https://github.com/microlinkhq/metascraper/compare/v5.33.7...v5.33.8) (2023-02-07)

**Note:** Version bump only for package metascraper

## [5.33.7](https://github.com/microlinkhq/metascraper/compare/v5.33.6...v5.33.7) (2023-01-30)

**Note:** Version bump only for package metascraper

## [5.33.6](https://github.com/microlinkhq/metascraper/compare/v5.33.5...v5.33.6) (2023-01-27)

### Bug Fixes

* get tweet image when it's a tweet ([#617](https://github.com/microlinkhq/metascraper/issues/617)) ([f3540a6](https://github.com/microlinkhq/metascraper/commit/f3540a6f4a34e81a4724cdf78c51edfc2958b376))

## [5.33.5](https://github.com/microlinkhq/metascraper/compare/v5.33.4...v5.33.5) (2023-01-23)

**Note:** Version bump only for package metascraper

## [5.33.4](https://github.com/microlinkhq/metascraper/compare/v5.33.3...v5.33.4) (2023-01-09)

**Note:** Version bump only for package metascraper

## [5.33.3](https://github.com/microlinkhq/metascraper/compare/v5.33.2...v5.33.3) (2023-01-03)

**Note:** Version bump only for package metascraper

## [5.33.2](https://github.com/microlinkhq/metascraper/compare/v5.33.1...v5.33.2) (2023-01-02)

**Note:** Version bump only for package metascraper

## [5.33.1](https://github.com/microlinkhq/metascraper/compare/v5.33.0...v5.33.1) (2023-01-01)

### Bug Fixes

* **twitter:** check value exists ([#609](https://github.com/microlinkhq/metascraper/issues/609)) ([a8dafe7](https://github.com/microlinkhq/metascraper/commit/a8dafe79fd55c182501e4b0fe417f28d625e616b))

# [5.33.0](https://github.com/microlinkhq/metascraper/compare/v5.32.4...v5.33.0) (2023-01-01)

### Features

* add metascraper-twitter ([#608](https://github.com/microlinkhq/metascraper/issues/608)) ([075c0ab](https://github.com/microlinkhq/metascraper/commit/075c0ab1141f9104b21a3496c43fe5c6b3bf17c0)), closes [#260](https://github.com/microlinkhq/metascraper/issues/260)

## [5.32.4](https://github.com/microlinkhq/metascraper/compare/v5.32.3...v5.32.4) (2022-12-30)

### Bug Fixes

* **build:** install dependencies for contributors ([7e0dd8b](https://github.com/microlinkhq/metascraper/commit/7e0dd8b9440454e7470e3284ecee077d42bc7e41))

## [5.32.3](https://github.com/microlinkhq/metascraper/compare/v5.32.2...v5.32.3) (2022-12-12)

**Note:** Version bump only for package metascraper

## [5.32.2](https://github.com/microlinkhq/metascraper/compare/v5.32.1...v5.32.2) (2022-11-29)

### Bug Fixes

* **logo-favicon:** ignore 3xx favicon url ([#602](https://github.com/microlinkhq/metascraper/issues/602)) ([d3477d9](https://github.com/microlinkhq/metascraper/commit/d3477d90d4307f6880e8d607e25f4fe520b1fdf8))

## [5.32.1](https://github.com/microlinkhq/metascraper/compare/v5.32.0...v5.32.1) (2022-11-21)

**Note:** Version bump only for package metascraper

# [5.32.0](https://github.com/microlinkhq/metascraper/compare/v5.31.3...v5.32.0) (2022-11-14)

### Features

* **logo:** use google logo endpoint ([#599](https://github.com/microlinkhq/metascraper/issues/599)) ([f68f93d](https://github.com/microlinkhq/metascraper/commit/f68f93d220fbbedf355b14684976aa7f77fd49cc))

## [5.31.3](https://github.com/microlinkhq/metascraper/compare/v5.31.2...v5.31.3) (2022-11-11)

### Bug Fixes

* remove tldts import ([#597](https://github.com/microlinkhq/metascraper/issues/597)) ([be666e3](https://github.com/microlinkhq/metascraper/commit/be666e34962056d27c61ff455b053bdf8fda0a11))

## [5.31.2](https://github.com/microlinkhq/metascraper/compare/v5.31.1...v5.31.2) (2022-11-11)

### Bug Fixes

* bugs url ([24f318a](https://github.com/microlinkhq/metascraper/commit/24f318a74c9c6ae379a8f076bc3cbf6481ff0753))

### Performance Improvements

* avoid spread for initialization ([#592](https://github.com/microlinkhq/metascraper/issues/592)) ([0691a6d](https://github.com/microlinkhq/metascraper/commit/0691a6da881be2967493a843b61bad18c3d376b2))
* unify tldts ([#596](https://github.com/microlinkhq/metascraper/issues/596)) ([00a0633](https://github.com/microlinkhq/metascraper/commit/00a0633851bd87b1dcf27c0f0795cb85457eb409))

## [5.31.1](https://github.com/microlinkhq/metascraper/compare/v5.31.0...v5.31.1) (2022-09-24)

**Note:** Version bump only for package metascraper

# [5.31.0](https://github.com/microlinkhq/metascraper/compare/v5.30.4...v5.31.0) (2022-09-18)

### Features

* **metascraper-feed:** create new feed plugin ([#586](https://github.com/microlinkhq/metascraper/issues/586)) ([232a71f](https://github.com/microlinkhq/metascraper/commit/232a71f66e576416390e5ee7b528e19a79c82fe2))

## [5.30.4](https://github.com/microlinkhq/metascraper/compare/v5.30.3...v5.30.4) (2022-09-02)

**Note:** Version bump only for package metascraper

## [5.30.3](https://github.com/microlinkhq/metascraper/compare/v5.30.2...v5.30.3) (2022-08-22)

**Note:** Version bump only for package metascraper

## [5.30.2](https://github.com/microlinkhq/metascraper/compare/v5.30.1...v5.30.2) (2022-08-13)

**Note:** Version bump only for package metascraper

## [5.30.1](https://github.com/microlinkhq/metascraper/compare/v5.30.0...v5.30.1) (2022-08-05)

**Note:** Version bump only for package metascraper

# [5.30.0](https://github.com/microlinkhq/metascraper/compare/v5.29.18...v5.30.0) (2022-07-21)

### Features

* **manifest:** support data uris ([#572](https://github.com/microlinkhq/metascraper/issues/572)) ([91ce4aa](https://github.com/microlinkhq/metascraper/commit/91ce4aa4c6b94d51572a88567d600771c955bb94))

## [5.29.18](https://github.com/microlinkhq/metascraper/compare/v5.29.17...v5.29.18) (2022-07-20)

### Bug Fixes

* **types:** validateUrl is optional ([#571](https://github.com/microlinkhq/metascraper/issues/571)) ([f0156f1](https://github.com/microlinkhq/metascraper/commit/f0156f161b33a012534b58fcd65425e45fd443a8))

## [5.29.17](https://github.com/microlinkhq/metascraper/compare/v5.29.16...v5.29.17) (2022-07-20)

### Bug Fixes

* **audio:** only consider http urls ([#569](https://github.com/microlinkhq/metascraper/issues/569)) ([624a776](https://github.com/microlinkhq/metascraper/commit/624a776ad915ca580f01c11a42847c9b5f0fbaf9))

## [5.29.16](https://github.com/microlinkhq/metascraper/compare/v5.29.15...v5.29.16) (2022-07-18)

**Note:** Version bump only for package metascraper

## [5.29.15](https://github.com/microlinkhq/metascraper/compare/v5.29.14...v5.29.15) (2022-07-09)

**Note:** Version bump only for package metascraper

## [5.29.14](https://github.com/microlinkhq/metascraper/compare/v5.29.13...v5.29.14) (2022-06-30)

**Note:** Version bump only for package metascraper

## [5.29.13](https://github.com/microlinkhq/metascraper/compare/v5.29.12...v5.29.13) (2022-06-29)

### Bug Fixes

* **helpers:** ensure image is a string ([#560](https://github.com/microlinkhq/metascraper/issues/560)) ([57e6df5](https://github.com/microlinkhq/metascraper/commit/57e6df5588977df2ebc73f37bd6fab4450ff9997))

## [5.29.12](https://github.com/microlinkhq/metascraper/compare/v5.29.11...v5.29.12) (2022-06-27)

**Note:** Version bump only for package metascraper

## [5.29.11](https://github.com/microlinkhq/metascraper/compare/v5.29.10...v5.29.11) (2022-06-21)

**Note:** Version bump only for package metascraper

## [5.29.10](https://github.com/microlinkhq/metascraper/compare/v5.29.9...v5.29.10) (2022-06-18)

### Bug Fixes

* **telegram:** avoid non http iframe src ([#553](https://github.com/microlinkhq/metascraper/issues/553)) ([aa45d4d](https://github.com/microlinkhq/metascraper/commit/aa45d4d2678745b7a389efa190b7e81190584911))

## [5.29.9](https://github.com/microlinkhq/metascraper/compare/v5.29.8...v5.29.9) (2022-05-31)

**Note:** Version bump only for package metascraper

## [5.29.8](https://github.com/microlinkhq/metascraper/compare/v5.29.7...v5.29.8) (2022-05-29)

**Note:** Version bump only for package metascraper

## [5.29.7](https://github.com/microlinkhq/metascraper/compare/v5.29.6...v5.29.7) (2022-05-29)

**Note:** Version bump only for package metascraper

## [5.29.6](https://github.com/microlinkhq/metascraper/compare/v5.29.5...v5.29.6) (2022-05-24)

**Note:** Version bump only for package metascraper

## [5.29.5](https://github.com/microlinkhq/metascraper/compare/v5.29.4...v5.29.5) (2022-05-23)

**Note:** Version bump only for package metascraper

## [5.29.4](https://github.com/microlinkhq/metascraper/compare/v5.29.3...v5.29.4) (2022-04-18)

**Note:** Version bump only for package metascraper

## [5.29.3](https://github.com/microlinkhq/metascraper/compare/v5.29.2...v5.29.3) (2022-04-11)

**Note:** Version bump only for package metascraper

## [5.29.2](https://github.com/microlinkhq/metascraper/compare/v5.29.1...v5.29.2) (2022-04-10)

### Bug Fixes

* **media-provider:** tweet id without query parameters ([#531](https://github.com/microlinkhq/metascraper/issues/531)) ([8706d79](https://github.com/microlinkhq/metascraper/commit/8706d797e981c3717737997792a4bd52bac71de4))

## [5.29.1](https://github.com/microlinkhq/metascraper/compare/v5.29.0...v5.29.1) (2022-04-08)

**Note:** Version bump only for package metascraper

# [5.29.0](https://github.com/microlinkhq/metascraper/compare/v5.28.9...v5.29.0) (2022-04-03)

### Features

* **helpers:** add JSON-LD [@graph](https://github.com/graph) support ([#527](https://github.com/microlinkhq/metascraper/issues/527)) ([7604210](https://github.com/microlinkhq/metascraper/commit/7604210a33aa131a709c43a7c366bb798bf954f2))

## [5.28.9](https://github.com/microlinkhq/metascraper/compare/v5.28.8...v5.28.9) (2022-04-03)

**Note:** Version bump only for package metascraper

## [5.28.8](https://github.com/microlinkhq/metascraper/compare/v5.28.7...v5.28.8) (2022-04-03)

### Bug Fixes

* **clearbit:** call memoizer ([ffe1283](https://github.com/microlinkhq/metascraper/commit/ffe128369f262052ea6225930d8c494ee055b681))

## [5.28.7](https://github.com/microlinkhq/metascraper/compare/v5.28.6...v5.28.7) (2022-04-02)

**Note:** Version bump only for package metascraper

## [5.28.6](https://github.com/microlinkhq/metascraper/compare/v5.28.5...v5.28.6) (2022-03-30)

### Performance Improvements

* **spotify:** remove all key query parameters ([6f25f71](https://github.com/microlinkhq/metascraper/commit/6f25f712eb9789f9108983e3cbd6fceac5f3d431))

## [5.28.5](https://github.com/microlinkhq/metascraper/compare/v5.28.4...v5.28.5) (2022-03-30)

### Performance Improvements

* **spotify:** remove key query parameters ([#520](https://github.com/microlinkhq/metascraper/issues/520)) ([94e8680](https://github.com/microlinkhq/metascraper/commit/94e868031665010e304b53b5657a0330ba19b13c))

## [5.28.4](https://github.com/microlinkhq/metascraper/compare/v5.28.3...v5.28.4) (2022-03-28)

**Note:** Version bump only for package metascraper

## [5.28.3](https://github.com/microlinkhq/metascraper/compare/v5.28.2...v5.28.3) (2022-03-27)

### Bug Fixes

* **logo-favicon:** dedupe memoize key from input ([1e21849](https://github.com/microlinkhq/metascraper/commit/1e218490f8320a1457805efddb2615dbe62ec64d))

## [5.28.2](https://github.com/microlinkhq/metascraper/compare/v5.28.1...v5.28.2) (2022-03-27)

### Performance Improvements

* remove reachable-url when is not necessary ([#516](https://github.com/microlinkhq/metascraper/issues/516)) ([3e9f58d](https://github.com/microlinkhq/metascraper/commit/3e9f58dcb90dea7b3f15440d5a055b0744184c24))

## [5.28.1](https://github.com/microlinkhq/metascraper/compare/v5.28.0...v5.28.1) (2022-03-25)

**Note:** Version bump only for package metascraper

# [5.28.0](https://github.com/microlinkhq/metascraper/compare/v5.27.3...v5.28.0) (2022-03-25)

### Features

* **logo-favicon:** root domain resolution ([#514](https://github.com/microlinkhq/metascraper/issues/514)) ([98f806d](https://github.com/microlinkhq/metascraper/commit/98f806da015d87924c99045d2f8c408a188d9711))

## [5.27.3](https://github.com/microlinkhq/metascraper/compare/v5.27.2...v5.27.3) (2022-03-25)

**Note:** Version bump only for package metascraper

## [5.27.2](https://github.com/microlinkhq/metascraper/compare/v5.27.1...v5.27.2) (2022-03-24)

### Performance Improvements

* **logo-favicon:** memoize urls resolution ([#512](https://github.com/microlinkhq/metascraper/issues/512)) ([20e6c32](https://github.com/microlinkhq/metascraper/commit/20e6c32743e14a23a9982945999e3f2a587b3c98))

## [5.27.1](https://github.com/microlinkhq/metascraper/compare/v5.27.0...v5.27.1) (2022-03-24)

### Bug Fixes

* **logo-favicon:** start relative path with slash ([5d9e628](https://github.com/microlinkhq/metascraper/commit/5d9e628853c10c8f4dd494bfffe08266957deafa))

# [5.27.0](https://github.com/microlinkhq/metascraper/compare/v5.26.3...v5.27.0) (2022-03-23)

### Features

* unify `gotOpts` ([#507](https://github.com/microlinkhq/metascraper/issues/507)) ([e36306a](https://github.com/microlinkhq/metascraper/commit/e36306a9301963c7408cc1b08aaed692412b32c9))

## [5.26.3](https://github.com/microlinkhq/metascraper/compare/v5.26.2...v5.26.3) (2022-03-20)

**Note:** Version bump only for package metascraper

## [5.26.2](https://github.com/microlinkhq/metascraper/compare/v5.26.1...v5.26.2) (2022-03-18)

**Note:** Version bump only for package metascraper

## [5.26.1](https://github.com/microlinkhq/metascraper/compare/v5.26.0...v5.26.1) (2022-03-17)

### Bug Fixes

* **media-provider:** invert condition ([219b2a5](https://github.com/microlinkhq/metascraper/commit/219b2a5a8caeef77d15de0eee8fb9ddae88b026a))

# [5.26.0](https://github.com/microlinkhq/metascraper/compare/v5.25.8...v5.26.0) (2022-03-13)

### Bug Fixes

* **iframe:** strict comparison ([#502](https://github.com/microlinkhq/metascraper/issues/502)) ([1ae08c4](https://github.com/microlinkhq/metascraper/commit/1ae08c429805b5559592b6aa51021fb078ab53d8))

### Features

* **readability:** add lang detection ([910589e](https://github.com/microlinkhq/metascraper/commit/910589eeb977804125d9600f8d7364d9c636ede8))

## [5.25.8](https://github.com/microlinkhq/metascraper/compare/v5.25.7...v5.25.8) (2022-02-01)

### Bug Fixes

* **manifest:** ensure at least one icon is present ([dc7e346](https://github.com/microlinkhq/metascraper/commit/dc7e346bca7f46e6eac179a79dbc5522c697501b))

## [5.25.7](https://github.com/microlinkhq/metascraper/compare/v5.25.6...v5.25.7) (2022-01-04)

**Note:** Version bump only for package metascraper

## [5.25.6](https://github.com/microlinkhq/metascraper/compare/v5.25.5...v5.25.6) (2021-12-28)

**Note:** Version bump only for package metascraper

## [5.25.5](https://github.com/microlinkhq/metascraper/compare/v5.25.4...v5.25.5) (2021-12-07)

**Note:** Version bump only for package metascraper

## [5.25.4](https://github.com/microlinkhq/metascraper/compare/v5.25.3...v5.25.4) (2021-12-01)

**Note:** Version bump only for package metascraper

## [5.25.3](https://github.com/microlinkhq/metascraper/compare/v5.25.2...v5.25.3) (2021-11-24)

**Note:** Version bump only for package metascraper

## [5.25.2](https://github.com/microlinkhq/metascraper/compare/v5.25.1...v5.25.2) (2021-11-19)

**Note:** Version bump only for package metascraper

## [5.25.1](https://github.com/microlinkhq/metascraper/compare/v5.25.0...v5.25.1) (2021-11-15)

### Bug Fixes

* sort ([ad04568](https://github.com/microlinkhq/metascraper/commit/ad04568fcdae1e52bcecf09c00b7a4ba99b28f23))

# [5.25.0](https://github.com/microlinkhq/metascraper/compare/v5.24.9...v5.25.0) (2021-10-24)

### Features

* add `metascraper-manifest` package ([#465](https://github.com/microlinkhq/metascraper/issues/465)) ([40a6abb](https://github.com/microlinkhq/metascraper/commit/40a6abb02eb67225ef2daafa1d7cb60f16783210))

## [5.24.9](https://github.com/microlinkhq/metascraper/compare/v5.24.8...v5.24.9) (2021-10-11)

**Note:** Version bump only for package metascraper

## [5.24.8](https://github.com/microlinkhq/metascraper/compare/v5.24.7...v5.24.8) (2021-10-02)

**Note:** Version bump only for package metascraper

## [5.24.7](https://github.com/microlinkhq/metascraper/compare/v5.24.6...v5.24.7) (2021-09-27)

**Note:** Version bump only for package metascraper

## [5.24.6](https://github.com/microlinkhq/metascraper/compare/v5.24.5...v5.24.6) (2021-09-12)

**Note:** Version bump only for package metascraper

## [5.24.5](https://github.com/microlinkhq/metascraper/compare/v5.24.4...v5.24.5) (2021-09-02)

**Note:** Version bump only for package metascraper

## [5.24.4](https://github.com/microlinkhq/metascraper/compare/v5.24.3...v5.24.4) (2021-09-01)

**Note:** Version bump only for package metascraper

## [5.24.3](https://github.com/microlinkhq/metascraper/compare/v5.24.2...v5.24.3) (2021-08-19)

### Bug Fixes

* avoid returns a boolean ([c492848](https://github.com/microlinkhq/metascraper/commit/c4928487d8068f23442e293713b478e22432eb90))

## [5.24.2](https://github.com/microlinkhq/metascraper/compare/v5.24.1...v5.24.2) (2021-08-16)

**Note:** Version bump only for package metascraper

## [5.24.1](https://github.com/microlinkhq/metascraper/compare/v5.24.0...v5.24.1) (2021-08-09)

**Note:** Version bump only for package metascraper

# [5.24.0](https://github.com/microlinkhq/metascraper/compare/v5.23.3...v5.24.0) (2021-08-02)

### Features

* avoid null ([#441](https://github.com/microlinkhq/metascraper/issues/441)) ([bc18f7e](https://github.com/microlinkhq/metascraper/commit/bc18f7e62499d5328843f589b772d5d0c4d767be))

## [5.23.3](https://github.com/microlinkhq/metascraper/compare/v5.23.2...v5.23.3) (2021-08-01)

**Note:** Version bump only for package metascraper

## [5.23.2](https://github.com/microlinkhq/metascraper/compare/v5.23.1...v5.23.2) (2021-08-01)

**Note:** Version bump only for package metascraper

## [5.23.1](https://github.com/microlinkhq/metascraper/compare/v5.23.0...v5.23.1) (2021-07-27)

### Bug Fixes

* pass titleize options ([a13bde5](https://github.com/microlinkhq/metascraper/commit/a13bde5434cf37fc99c1a8dc86acbe8c97fae5dc))

# [5.23.0](https://github.com/microlinkhq/metascraper/compare/v5.22.11...v5.23.0) (2021-07-26)

### Features

* **helper:** add number validator ([#435](https://github.com/microlinkhq/metascraper/issues/435)) ([5b0e6ba](https://github.com/microlinkhq/metascraper/commit/5b0e6bad6a82dc118768d8986c05dbf6544cef1d))

## [5.22.11](https://github.com/microlinkhq/metascraper/compare/v5.22.10...v5.22.11) (2021-07-19)

**Note:** Version bump only for package metascraper

## [5.22.10](https://github.com/microlinkhq/metascraper/compare/v5.22.9...v5.22.10) (2021-07-11)

### Bug Fixes

* **favicon-logo:** avoid wide images ([3bfec5d](https://github.com/microlinkhq/metascraper/commit/3bfec5d39b896bfd8c6b1551389304912106b37b))

## [5.22.9](https://github.com/microlinkhq/metascraper/compare/v5.22.8...v5.22.9) (2021-07-11)

### Bug Fixes

* memoize-one ESM ([309633f](https://github.com/microlinkhq/metascraper/commit/309633fc33b1e025d3bc5c4c5503735d057885db)), closes [#432](https://github.com/microlinkhq/metascraper/issues/432)

## [5.22.8](https://github.com/microlinkhq/metascraper/compare/v5.22.7...v5.22.8) (2021-07-10)

**Note:** Version bump only for package metascraper

## [5.22.7](https://github.com/microlinkhq/metascraper/compare/v5.22.6...v5.22.7) (2021-07-08)

**Note:** Version bump only for package metascraper

## [5.22.6](https://github.com/microlinkhq/metascraper/compare/v5.22.5...v5.22.6) (2021-06-30)

**Note:** Version bump only for package metascraper

## [5.22.5](https://github.com/microlinkhq/metascraper/compare/v5.22.4...v5.22.5) (2021-06-29)

### Performance Improvements

* **audio:** ensure href is present ([52d8598](https://github.com/microlinkhq/metascraper/commit/52d8598415802e92e10fcdffc4bc21aa28a640ea))

## [5.22.4](https://github.com/microlinkhq/metascraper/compare/v5.22.3...v5.22.4) (2021-06-27)

**Note:** Version bump only for package metascraper

## [5.22.3](https://github.com/microlinkhq/metascraper/compare/v5.22.2...v5.22.3) (2021-06-25)

**Note:** Version bump only for package metascraper

## [5.22.2](https://github.com/microlinkhq/metascraper/compare/v5.22.1...v5.22.2) (2021-06-23)

**Note:** Version bump only for package metascraper

## [5.22.1](https://github.com/microlinkhq/metascraper/compare/v5.22.0...v5.22.1) (2021-06-09)

**Note:** Version bump only for package metascraper

# [5.22.0](https://github.com/microlinkhq/metascraper/compare/v5.21.10...v5.22.0) (2021-05-31)

### Bug Fixes

* getAuthor default options ([1ffc1d4](https://github.com/microlinkhq/metascraper/commit/1ffc1d40168fb3ae063fb441127b2b3ffc269bb9))
* pass author helper options ([5b8faf9](https://github.com/microlinkhq/metascraper/commit/5b8faf9c763ea52cad3e3994641b25d49af1640f))

### Features

* add instagram integration ([#419](https://github.com/microlinkhq/metascraper/issues/419)) ([b5228e1](https://github.com/microlinkhq/metascraper/commit/b5228e1ff5981dfac12629d669d2a6ceb2302f59))

## [5.21.10](https://github.com/microlinkhq/metascraper/compare/v5.21.9...v5.21.10) (2021-05-24)

**Note:** Version bump only for package metascraper

## [5.21.9](https://github.com/microlinkhq/metascraper/compare/v5.21.8...v5.21.9) (2021-05-21)

### Bug Fixes

* **author:** be sure byline rule is not a date ([#410](https://github.com/microlinkhq/metascraper/issues/410)) ([c8c035d](https://github.com/microlinkhq/metascraper/commit/c8c035d361508551bfe3637ac43bde69ad63371c)), closes [#408](https://github.com/microlinkhq/metascraper/issues/408)
* **helpers:** JSON+LD detects number pproperly ([#409](https://github.com/microlinkhq/metascraper/issues/409)) ([8f4a174](https://github.com/microlinkhq/metascraper/commit/8f4a17402acad2595208df355f3a0eec99ec2d24))

## [5.21.8](https://github.com/microlinkhq/metascraper/compare/v5.21.7...v5.21.8) (2021-04-26)

**Note:** Version bump only for package metascraper

## [5.21.7](https://github.com/microlinkhq/metascraper/compare/v5.21.6...v5.21.7) (2021-04-24)

**Note:** Version bump only for package metascraper

## [5.21.6](https://github.com/microlinkhq/metascraper/compare/v5.21.5...v5.21.6) (2021-04-23)

**Note:** Version bump only for package metascraper

## [5.21.5](https://github.com/microlinkhq/metascraper/compare/v5.21.4...v5.21.5) (2021-04-05)

**Note:** Version bump only for package metascraper

## [5.21.4](https://github.com/microlinkhq/metascraper/compare/v5.21.3...v5.21.4) (2021-03-30)

**Note:** Version bump only for package metascraper

## [5.21.3](https://github.com/microlinkhq/metascraper/compare/v5.21.2...v5.21.3) (2021-03-21)

**Note:** Version bump only for package metascraper

## [5.21.2](https://github.com/microlinkhq/metascraper/compare/v5.21.1...v5.21.2) (2021-03-15)

**Note:** Version bump only for package metascraper

## [5.21.1](https://github.com/microlinkhq/metascraper/compare/v5.21.0...v5.21.1) (2021-03-10)

**Note:** Version bump only for package metascraper

# [5.21.0](https://github.com/microlinkhq/metascraper/compare/v5.20.0...v5.21.0) (2021-03-10)

### Bug Fixes

* property author is not valid ([#384](https://github.com/microlinkhq/metascraper/issues/384)) ([8036930](https://github.com/microlinkhq/metascraper/commit/8036930fd4c202b9b75b2f5e0f4edb7c7cd741d4))
* use name instead of property ([#383](https://github.com/microlinkhq/metascraper/issues/383)) ([4e636ae](https://github.com/microlinkhq/metascraper/commit/4e636ae12c66ab789484aa47d4ff4bace2a598ba))

### Features

* add twitter property support ([#385](https://github.com/microlinkhq/metascraper/issues/385)) ([5201ede](https://github.com/microlinkhq/metascraper/commit/5201edecf2f707562d960f9762f389cf7f15cbc5))

# [5.20.0](https://github.com/microlinkhq/metascraper/compare/v5.19.2...v5.20.0) (2021-03-08)

### Bug Fixes

* markup issue ([4508d2e](https://github.com/microlinkhq/metascraper/commit/4508d2ec20ff0e36ce9ed95893b7e4cd38269c6d))

### Features

* add support for meta name & twitter:player video urls ([#379](https://github.com/microlinkhq/metascraper/issues/379)) ([acd8cc7](https://github.com/microlinkhq/metascraper/commit/acd8cc76e8233556f3017c5839172392a018b160))

## [5.19.2](https://github.com/microlinkhq/metascraper/compare/v5.19.1...v5.19.2) (2021-03-03)

**Note:** Version bump only for package metascraper

## [5.19.1](https://github.com/microlinkhq/metascraper/compare/v5.19.0...v5.19.1) (2021-02-28)

**Note:** Version bump only for package metascraper

# [5.19.0](https://github.com/microlinkhq/metascraper/compare/v5.18.12...v5.19.0) (2021-02-24)

**Note:** Version bump only for package metascraper

## [5.18.12](https://github.com/microlinkhq/metascraper/compare/v5.18.11...v5.18.12) (2021-02-22)

### Bug Fixes

* ensure iframe is present ([b4c68c1](https://github.com/microlinkhq/metascraper/commit/b4c68c1c5d55e533f8d6bd33fd3f621a88f98021))

## [5.18.11](https://github.com/microlinkhq/metascraper/compare/v5.18.10...v5.18.11) (2021-02-22)

### Bug Fixes

* ensure to process only telegram urls ([215bf2d](https://github.com/microlinkhq/metascraper/commit/215bf2d0fa3b4ad2792aee66c5927eb72f7330cd))

## [5.18.10](https://github.com/microlinkhq/metascraper/compare/v5.18.9...v5.18.10) (2021-02-22)

**Note:** Version bump only for package metascraper

## [5.18.9](https://github.com/microlinkhq/metascraper/compare/v5.18.8...v5.18.9) (2021-02-21)

**Note:** Version bump only for package metascraper

## [5.18.8](https://github.com/microlinkhq/metascraper/compare/v5.18.7...v5.18.8) (2021-02-18)

**Note:** Version bump only for package metascraper

## [5.18.7](https://github.com/microlinkhq/metascraper/compare/v5.18.6...v5.18.7) (2021-02-18)

**Note:** Version bump only for package metascraper

## [5.18.6](https://github.com/microlinkhq/metascraper/compare/v5.18.5...v5.18.6) (2021-02-18)

**Note:** Version bump only for package metascraper

## [5.18.5](https://github.com/microlinkhq/metascraper/compare/v5.18.4...v5.18.5) (2021-02-17)

### Bug Fixes

* handle normalize url error ([d15d765](https://github.com/microlinkhq/metascraper/commit/d15d765d16d51e1f82cbcc4eeaf13f233bfdafd7))

## [5.18.4](https://github.com/microlinkhq/metascraper/compare/v5.18.3...v5.18.4) (2021-02-16)

**Note:** Version bump only for package metascraper

## [5.18.3](https://github.com/microlinkhq/metascraper/compare/v5.18.2...v5.18.3) (2021-02-11)

### Bug Fixes

* interface ([676fd08](https://github.com/microlinkhq/metascraper/commit/676fd08953cb7fdb0bf4ab8e1d46f04a6cef3dde))

## [5.18.2](https://github.com/microlinkhq/metascraper/compare/v5.18.1...v5.18.2) (2021-02-10)

### Bug Fixes

* ensure iframe src is absolute ([#367](https://github.com/microlinkhq/metascraper/issues/367)) ([e1dfb17](https://github.com/microlinkhq/metascraper/commit/e1dfb1726f7a20c62e5bbec0daef0bb718804a12))

## [5.18.1](https://github.com/microlinkhq/metascraper/compare/v5.18.0...v5.18.1) (2021-02-07)

**Note:** Version bump only for package metascraper

# [5.18.0](https://github.com/microlinkhq/metascraper/compare/v5.17.0...v5.18.0) (2021-02-06)

### Bug Fixes

* delete settings.json ([170e23b](https://github.com/microlinkhq/metascraper/commit/170e23b46be3a23cfbcc9dd7dd1337bd1e38a1ec))
* don't wait when there are no iframes ([d1641db](https://github.com/microlinkhq/metascraper/commit/d1641db702da0d487661a1393f6936f35fd824c0))

### Features

* **audio:** pull download link from iframe ([30375da](https://github.com/microlinkhq/metascraper/commit/30375da010927cfe7e06949f92ea5a4154e024a2))
* **audio:** run all audio rules on subframes ([0819fb4](https://github.com/microlinkhq/metascraper/commit/0819fb4c3ab820519466c715d87567c3ad627f1b))

# [5.17.0](https://github.com/microlinkhq/metascraper/compare/v5.16.16...v5.17.0) (2021-01-30)

### Features

* **audio/video:** add support for ld+json contentUrl property ([#355](https://github.com/microlinkhq/metascraper/issues/355)) ([eb17d3e](https://github.com/microlinkhq/metascraper/commit/eb17d3e391af0aeda9d43bb23d4cfefc0ecfbc59))

## [5.16.16](https://github.com/microlinkhq/metascraper/compare/v5.16.15...v5.16.16) (2021-01-26)

### Bug Fixes

* ensure whitespace after by ([1aaa860](https://github.com/microlinkhq/metascraper/commit/1aaa86010503403a704c89b1586f293dbc6bc0fe)), closes [#352](https://github.com/microlinkhq/metascraper/issues/352)

## [5.16.15](https://github.com/microlinkhq/metascraper/compare/v5.16.14...v5.16.15) (2021-01-25)

**Note:** Version bump only for package metascraper

## [5.16.14](https://github.com/microlinkhq/metascraper/compare/v5.16.13...v5.16.14) (2021-01-20)

### Bug Fixes

* add mpga audio extension ([#348](https://github.com/microlinkhq/metascraper/issues/348)) ([087e2de](https://github.com/microlinkhq/metascraper/commit/087e2de3c14c265658c0d8de0433b7b9a4da7571)), closes [#345](https://github.com/microlinkhq/metascraper/issues/345)

## [5.16.13](https://github.com/microlinkhq/metascraper/compare/v5.16.12...v5.16.13) (2021-01-11)

### Bug Fixes

* **helpers:** safe way to get a WHATWG URL ([8c45f54](https://github.com/microlinkhq/metascraper/commit/8c45f54cc28454ef69beb09e22a9ce75c92e6285))

## [5.16.12](https://github.com/microlinkhq/metascraper/compare/v5.16.11...v5.16.12) (2021-01-11)

**Note:** Version bump only for package metascraper

## [5.16.11](https://github.com/microlinkhq/metascraper/compare/v5.16.10...v5.16.11) (2021-01-10)

### Bug Fixes

* **iframe:** ensure oembed url is absolute ([#342](https://github.com/microlinkhq/metascraper/issues/342)) ([31d4a50](https://github.com/microlinkhq/metascraper/commit/31d4a50a32f0663c809ac413423701f5b977e844))

## [5.16.10](https://github.com/microlinkhq/metascraper/compare/v5.16.9...v5.16.10) (2021-01-08)

### Bug Fixes

* preinstall → postinstall ([2d9f5f6](https://github.com/microlinkhq/metascraper/commit/2d9f5f690e25b13253e800c29f04ebb55a67f1b5))

## [5.16.9](https://github.com/microlinkhq/metascraper/compare/v5.16.8...v5.16.9) (2021-01-08)

**Note:** Version bump only for package metascraper

## [5.16.8](https://github.com/microlinkhq/metascraper/compare/v5.16.7...v5.16.8) (2021-01-07)

**Note:** Version bump only for package metascraper

## [5.16.7](https://github.com/microlinkhq/metascraper/compare/v5.16.6...v5.16.7) (2021-01-03)

**Note:** Version bump only for package metascraper

## [5.16.6](https://github.com/microlinkhq/metascraper/compare/v5.16.5...v5.16.6) (2020-12-29)

**Note:** Version bump only for package metascraper

## [5.16.5](https://github.com/microlinkhq/metascraper/compare/v5.16.4...v5.16.5) (2020-12-29)

**Note:** Version bump only for package metascraper

## [5.16.4](https://github.com/microlinkhq/metascraper/compare/v5.16.3...v5.16.4) (2020-12-29)

### Bug Fixes

* ensure to handle malformed HTML ([170cd6a](https://github.com/microlinkhq/metascraper/commit/170cd6ae12645b4cec35b12cf4759573f2683dab))

## [5.16.3](https://github.com/microlinkhq/metascraper/compare/v5.16.2...v5.16.3) (2020-12-28)

### Bug Fixes

* package link reference ([802e629](https://github.com/microlinkhq/metascraper/commit/802e629352affd0c660d970be8728b2542d2a61f)), closes [#335](https://github.com/microlinkhq/metascraper/issues/335)

## [5.16.2](https://github.com/microlinkhq/metascraper/compare/v5.16.1...v5.16.2) (2020-12-24)

**Note:** Version bump only for package metascraper

## [5.16.1](https://github.com/microlinkhq/metascraper/compare/v5.16.0...v5.16.1) (2020-12-23)

**Note:** Version bump only for package metascraper

# [5.16.0](https://github.com/microlinkhq/metascraper/compare/v5.15.4...v5.16.0) (2020-12-22)

**Note:** Version bump only for package metascraper

## [5.15.4](https://github.com/microlinkhq/metascraper/compare/v5.15.3...v5.15.4) (2020-12-17)

**Note:** Version bump only for package metascraper

## [5.15.3](https://github.com/microlinkhq/metascraper/compare/v5.15.2...v5.15.3) (2020-12-17)

**Note:** Version bump only for package metascraper

## [5.15.2](https://github.com/microlinkhq/metascraper/compare/v5.15.1...v5.15.2) (2020-12-09)

### Bug Fixes

* reporter ([a5128ba](https://github.com/microlinkhq/metascraper/commit/a5128ba860ac53e1da1beaabed3a19161577d99a))

## [5.15.1](https://github.com/microlinkhq/metascraper/compare/v5.15.0...v5.15.1) (2020-12-03)

**Note:** Version bump only for package metascraper

# [5.15.0](https://github.com/microlinkhq/metascraper/compare/v5.14.27...v5.15.0) (2020-12-03)

### Bug Fixes

* memoize resolver function ([#326](https://github.com/microlinkhq/metascraper/issues/326)) ([b0ea8b8](https://github.com/microlinkhq/metascraper/commit/b0ea8b80aa4c6dbabc1ad91776911ac21ebe94c7))

### Features

* add telegram integration ([78dcdab](https://github.com/microlinkhq/metascraper/commit/78dcdaba1572115e8265dbcc4e5df59628115330))

## [5.14.27](https://github.com/microlinkhq/metascraper/compare/v5.14.26...v5.14.27) (2020-11-30)

### Bug Fixes

* use a specific prop for retrieving iframe values ([a8fa896](https://github.com/microlinkhq/metascraper/commit/a8fa896760bd86351ce5f817e81f25f6c08ebdeb))

## [5.14.26](https://github.com/microlinkhq/metascraper/compare/v5.14.25...v5.14.26) (2020-11-29)

**Note:** Version bump only for package metascraper

## [5.14.25](https://github.com/microlinkhq/metascraper/compare/v5.14.24...v5.14.25) (2020-11-28)

**Note:** Version bump only for package metascraper

## [5.14.24](https://github.com/microlinkhq/metascraper/compare/v5.14.23...v5.14.24) (2020-11-17)

**Note:** Version bump only for package metascraper

## [5.14.23](https://github.com/microlinkhq/metascraper/compare/v5.14.22...v5.14.23) (2020-11-10)

**Note:** Version bump only for package metascraper

## [5.14.22](https://github.com/microlinkhq/metascraper/compare/v5.14.21...v5.14.22) (2020-11-10)

**Note:** Version bump only for package metascraper

## [5.14.21](https://github.com/microlinkhq/metascraper/compare/v5.14.20...v5.14.21) (2020-11-10)

**Note:** Version bump only for package metascraper

## [5.14.20](https://github.com/microlinkhq/metascraper/compare/v5.14.19...v5.14.20) (2020-11-01)

**Note:** Version bump only for package metascraper

## [5.14.19](https://github.com/microlinkhq/metascraper/compare/v5.14.18...v5.14.19) (2020-10-21)

**Note:** Version bump only for package metascraper

## [5.14.18](https://github.com/microlinkhq/metascraper/compare/v5.14.17...v5.14.18) (2020-10-21)

**Note:** Version bump only for package metascraper

## [5.14.17](https://github.com/microlinkhq/metascraper/compare/v5.14.16...v5.14.17) (2020-10-14)

### Bug Fixes

* require old dependency ([c276529](https://github.com/microlinkhq/metascraper/commit/c276529a537b59cc6f0bc9dbd8b27ba5c1d40c62)), closes [#317](https://github.com/microlinkhq/metascraper/issues/317)

## [5.14.16](https://github.com/microlinkhq/metascraper/compare/v5.14.15...v5.14.16) (2020-10-13)

**Note:** Version bump only for package metascraper

## [5.14.15](https://github.com/microlinkhq/metascraper/compare/v5.14.14...v5.14.15) (2020-10-12)

**Note:** Version bump only for package metascraper

## [5.14.14](https://github.com/microlinkhq/metascraper/compare/v5.14.13...v5.14.14) (2020-09-29)

**Note:** Version bump only for package metascraper

## [5.14.13](https://github.com/microlinkhq/metascraper/compare/v5.14.12...v5.14.13) (2020-09-20)

**Note:** Version bump only for package metascraper

## [5.14.12](https://github.com/microlinkhq/metascraper/compare/v5.14.11...v5.14.12) (2020-09-18)

### Bug Fixes

* ensure to accept urls with parens ([#308](https://github.com/microlinkhq/metascraper/issues/308)) ([6f1a027](https://github.com/microlinkhq/metascraper/commit/6f1a02788d5e169f0ea073593bf2597d69c7b791)), closes [#307](https://github.com/microlinkhq/metascraper/issues/307)
* update flag ([b5f795b](https://github.com/microlinkhq/metascraper/commit/b5f795bb502978d6e85db321843f131c5c43a9dc))

## [5.14.11](https://github.com/microlinkhq/metascraper/compare/v5.14.10...v5.14.11) (2020-09-15)

**Note:** Version bump only for package metascraper

## [5.14.10](https://github.com/microlinkhq/metascraper/compare/v5.14.9...v5.14.10) (2020-09-04)

**Note:** Version bump only for package metascraper

## [5.14.9](https://github.com/microlinkhq/metascraper/compare/v5.14.8...v5.14.9) (2020-09-04)

**Note:** Version bump only for package metascraper

## [5.14.8](https://github.com/microlinkhq/metascraper/compare/v5.14.7...v5.14.8) (2020-09-01)

**Note:** Version bump only for package metascraper

## [5.14.7](https://github.com/microlinkhq/metascraper/compare/v5.14.6...v5.14.7) (2020-08-31)

**Note:** Version bump only for package metascraper

## [5.14.6](https://github.com/microlinkhq/metascraper/compare/v5.14.5...v5.14.6) (2020-08-25)

**Note:** Version bump only for package metascraper

## [5.14.5](https://github.com/microlinkhq/metascraper/compare/v5.14.4...v5.14.5) (2020-08-25)

**Note:** Version bump only for package metascraper

## [5.14.4](https://github.com/microlinkhq/metascraper/compare/v5.14.3...v5.14.4) (2020-08-20)

### Bug Fixes

* Use url-regex-safe to fix url-regex vulnerability ([#297](https://github.com/microlinkhq/metascraper/issues/297)) ([157ef61](https://github.com/microlinkhq/metascraper/commit/157ef61146b9b72feeaef8004bf60e9e754f28e8))

## [5.14.3](https://github.com/microlinkhq/metascraper/compare/v5.14.2...v5.14.3) (2020-08-18)

**Note:** Version bump only for package metascraper

## [5.14.2](https://github.com/microlinkhq/metascraper/compare/v5.14.1...v5.14.2) (2020-08-10)

### Bug Fixes

* ensure to parse timestamp dates ([#295](https://github.com/microlinkhq/metascraper/issues/295)) ([7b1c9db](https://github.com/microlinkhq/metascraper/commit/7b1c9dbb7ca3d193673f5c723e3052f760b7bab3))

## [5.14.1](https://github.com/microlinkhq/metascraper/compare/v5.14.0...v5.14.1) (2020-08-06)

### Bug Fixes

* interface ([0394a4d](https://github.com/microlinkhq/metascraper/commit/0394a4d1f34eb4fceaa1239d830befa6705fd8f1))
* package reference ([1cf26ff](https://github.com/microlinkhq/metascraper/commit/1cf26ff8f5af7f051b11091a96a9c6522fd86986))

# [5.14.0](https://github.com/microlinkhq/metascraper/compare/v5.13.2...v5.14.0) (2020-08-04)

### Features

* add spotify episode support ([b5bc508](https://github.com/microlinkhq/metascraper/commit/b5bc5083cbbd5507a7f428c41a1fac1ba48276d9))

## [5.13.2](https://github.com/microlinkhq/metascraper/compare/v5.13.1...v5.13.2) (2020-08-03)

**Note:** Version bump only for package metascraper

## [5.13.1](https://github.com/microlinkhq/metascraper/compare/v5.13.0...v5.13.1) (2020-07-28)

**Note:** Version bump only for package metascraper

# [5.13.0](https://github.com/microlinkhq/metascraper/compare/v5.12.20...v5.13.0) (2020-07-20)

### Features

* change .getProxy interface ([1901fa4](https://github.com/microlinkhq/metascraper/commit/1901fa4375609a94e216843d9dc0749b5fd0692c))

## [5.12.20](https://github.com/microlinkhq/metascraper/compare/v5.12.19...v5.12.20) (2020-07-20)

**Note:** Version bump only for package metascraper

## [5.12.19](https://github.com/microlinkhq/metascraper/compare/v5.12.18...v5.12.19) (2020-07-20)

**Note:** Version bump only for package metascraper

## [5.12.18](https://github.com/microlinkhq/metascraper/compare/v5.12.17...v5.12.18) (2020-07-17)

**Note:** Version bump only for package metascraper

## [5.12.17](https://github.com/microlinkhq/metascraper/compare/v5.12.16...v5.12.17) (2020-07-08)

**Note:** Version bump only for package metascraper

## [5.12.16](https://github.com/microlinkhq/metascraper/compare/v5.12.15...v5.12.16) (2020-07-08)

### Reverts

* Revert "fix: use chrono english parsing" ([dbf5a19](https://github.com/microlinkhq/metascraper/commit/dbf5a19e7fbf74813314d49d1c3a9ee436d8613d))

## [5.12.15](https://github.com/microlinkhq/metascraper/compare/v5.12.14...v5.12.15) (2020-07-08)

### Bug Fixes

* use chrono english parsing ([692e5ca](https://github.com/microlinkhq/metascraper/commit/692e5ca3f27dbfd9913d3f1fa68bdc3bb8b8d270))

## [5.12.14](https://github.com/microlinkhq/metascraper/compare/v5.12.13...v5.12.14) (2020-07-08)

**Note:** Version bump only for package metascraper

## [5.12.13](https://github.com/microlinkhq/metascraper/compare/v5.12.12...v5.12.13) (2020-07-05)

### Bug Fixes

* handle null urls ([fdbec2d](https://github.com/microlinkhq/metascraper/commit/fdbec2db80d63122df7b950d749d23a9b7aa9192))

## [5.12.12](https://github.com/microlinkhq/metascraper/compare/v5.12.11...v5.12.12) (2020-07-04)

**Note:** Version bump only for package metascraper

## [5.12.11](https://github.com/microlinkhq/metascraper/compare/v5.12.10...v5.12.11) (2020-07-04)

**Note:** Version bump only for package metascraper

## [5.12.10](https://github.com/microlinkhq/metascraper/compare/v5.12.9...v5.12.10) (2020-07-02)

### Bug Fixes

* ensure keys are lowercase ([50d9d49](https://github.com/microlinkhq/metascraper/commit/50d9d4906d07228cbe13066263e18a69cf69dd60))

## [5.12.9](https://github.com/microlinkhq/metascraper/compare/v5.12.8...v5.12.9) (2020-06-29)

**Note:** Version bump only for package metascraper

## [5.12.8](https://github.com/microlinkhq/metascraper/compare/v5.12.7...v5.12.8) (2020-06-24)

**Note:** Version bump only for package metascraper

## [5.12.7](https://github.com/microlinkhq/metascraper/compare/v5.12.6...v5.12.7) (2020-06-23)

### Bug Fixes

* setup a default timeout ([fb5809f](https://github.com/microlinkhq/metascraper/commit/fb5809fc74c4905346c531e413f09b581e85b97a)), closes [#280](https://github.com/microlinkhq/metascraper/issues/280)

## [5.12.6](https://github.com/microlinkhq/metascraper/compare/v5.12.5...v5.12.6) (2020-06-15)

**Note:** Version bump only for package metascraper

## [5.12.5](https://github.com/microlinkhq/metascraper/compare/v5.12.4...v5.12.5) (2020-06-14)

**Note:** Version bump only for package metascraper

## [5.12.4](https://github.com/microlinkhq/metascraper/compare/v5.12.3...v5.12.4) (2020-06-12)

**Note:** Version bump only for package metascraper

## [5.12.3](https://github.com/microlinkhq/metascraper/compare/v5.12.2...v5.12.3) (2020-06-12)

**Note:** Version bump only for package metascraper

## [5.12.2](https://github.com/microlinkhq/metascraper/compare/v5.12.1...v5.12.2) (2020-06-12)

**Note:** Version bump only for package metascraper

## [5.12.1](https://github.com/microlinkhq/metascraper/compare/v5.12.0...v5.12.1) (2020-06-12)

**Note:** Version bump only for package metascraper

# [5.12.0](https://github.com/microlinkhq/metascraper/compare/v5.11.22...v5.12.0) (2020-06-10)

### Features

* improve proxy capabilities ([#277](https://github.com/microlinkhq/metascraper/issues/277)) ([55c688c](https://github.com/microlinkhq/metascraper/commit/55c688cc8b5a285a428c6105b8af4b1f74c97b5b))

## [5.11.22](https://github.com/microlinkhq/metascraper/compare/v5.11.21...v5.11.22) (2020-06-06)

**Note:** Version bump only for package metascraper

## [5.11.21](https://github.com/microlinkhq/metascraper/compare/v5.11.20...v5.11.21) (2020-06-06)

### Bug Fixes

* .isUrl for relative URLs ([4590fdf](https://github.com/microlinkhq/metascraper/commit/4590fdf48eec95cb01082a7232104a4c5e90e2f9))

## [5.11.20](https://github.com/microlinkhq/metascraper/compare/v5.11.19...v5.11.20) (2020-06-06)

**Note:** Version bump only for package metascraper

## [5.11.19](https://github.com/microlinkhq/metascraper/compare/v5.11.18...v5.11.19) (2020-06-01)

**Note:** Version bump only for package metascraper

## [5.11.18](https://github.com/microlinkhq/metascraper/compare/v5.11.17...v5.11.18) (2020-05-31)

**Note:** Version bump only for package metascraper

## [5.11.17](https://github.com/microlinkhq/metascraper/compare/v5.11.16...v5.11.17) (2020-05-31)

**Note:** Version bump only for package metascraper

## [5.11.16](https://github.com/microlinkhq/metascraper/compare/v5.11.15...v5.11.16) (2020-05-30)

**Note:** Version bump only for package metascraper

## [5.11.15](https://github.com/microlinkhq/metascraper/compare/v5.11.14...v5.11.15) (2020-05-30)

**Note:** Version bump only for package metascraper

## [5.11.14](https://github.com/microlinkhq/metascraper/compare/v5.11.13...v5.11.14) (2020-05-24)

### Bug Fixes

* consider NaN as falsy value ([bec5c10](https://github.com/microlinkhq/metascraper/commit/bec5c10d59563b39272004be1f9242d2417cd846))

## [5.11.13](https://github.com/microlinkhq/metascraper/compare/v5.11.12...v5.11.13) (2020-05-08)

### Bug Fixes

* agent interface ([b3f899c](https://github.com/microlinkhq/metascraper/commit/b3f899c9ba158ca0cc17808c97ba20982c211b69))

## [5.11.12](https://github.com/microlinkhq/metascraper/compare/v5.11.11...v5.11.12) (2020-05-04)

**Note:** Version bump only for package metascraper

## [5.11.11](https://github.com/microlinkhq/metascraper/compare/v5.11.10...v5.11.11) (2020-04-30)

**Note:** Version bump only for package metascraper

## [5.11.10](https://github.com/microlinkhq/metascraper/compare/v5.11.9...v5.11.10) (2020-04-27)

### Bug Fixes

* identation ([a90843a](https://github.com/microlinkhq/metascraper/commit/a90843a4530c71aea61319b473af2ca271c9cae4))

## [5.11.9](https://github.com/microlinkhq/metascraper/compare/v5.11.8...v5.11.9) (2020-04-14)

**Note:** Version bump only for package metascraper

## [5.11.8](https://github.com/microlinkhq/metascraper/compare/v5.11.7...v5.11.8) (2020-04-04)

**Note:** Version bump only for package metascraper

## [5.11.7](https://github.com/microlinkhq/metascraper/compare/v5.11.6...v5.11.7) (2020-03-19)

**Note:** Version bump only for package metascraper

## [5.11.6](https://github.com/microlinkhq/metascraper/compare/v5.11.5...v5.11.6) (2020-03-05)

### Bug Fixes

* resolve memoize-one esm ([f0d2d5e](https://github.com/microlinkhq/metascraper/commit/f0d2d5e469f8775d155509bd5b264aaae3a5018b))

## [5.11.5](https://github.com/microlinkhq/metascraper/compare/v5.11.4...v5.11.5) (2020-03-01)

**Note:** Version bump only for package metascraper

## [5.11.4](https://github.com/microlinkhq/metascraper/compare/v5.11.3...v5.11.4) (2020-02-21)

**Note:** Version bump only for package metascraper

## [5.11.3](https://github.com/microlinkhq/metascraper/compare/v5.11.2...v5.11.3) (2020-02-17)

### Bug Fixes

* avoid to reuse virtual console ([eec0404](https://github.com/microlinkhq/metascraper/commit/eec04045cc8ff3cff19a4786be39864b88d1e1a4))

## [5.11.2](https://github.com/microlinkhq/metascraper/compare/v5.11.1...v5.11.2) (2020-02-17)

**Note:** Version bump only for package metascraper

## [5.11.1](https://github.com/microlinkhq/metascraper/compare/v5.11.0...v5.11.1) (2020-02-13)

**Note:** Version bump only for package metascraper

# [5.11.0](https://github.com/microlinkhq/metascraper/compare/v5.10.7...v5.11.0) (2020-02-02)

### Bug Fixes

* get statusCode from response ([a07cb68](https://github.com/microlinkhq/metascraper/commit/a07cb687162637adb9e7d5e6f7a5ea76c9dd2d3d))

### Features

* update got ([f11838b](https://github.com/microlinkhq/metascraper/commit/f11838b20742a60a87124878ade2761b31828b7f))
* update got ([aa9481e](https://github.com/microlinkhq/metascraper/commit/aa9481e2487a9054b2f5586e014c18dd6fb42626))

## [5.10.7](https://github.com/microlinkhq/metascraper/compare/v5.10.6...v5.10.7) (2020-02-01)

**Note:** Version bump only for package metascraper

## [5.10.6](https://github.com/microlinkhq/metascraper/compare/v5.10.5...v5.10.6) (2020-01-22)

**Note:** Version bump only for package metascraper

## [5.10.5](https://github.com/microlinkhq/metascraper/compare/v5.10.4...v5.10.5) (2020-01-18)

**Note:** Version bump only for package metascraper

## [5.10.4](https://github.com/microlinkhq/metascraper/compare/v5.10.3...v5.10.4) (2020-01-17)

**Note:** Version bump only for package metascraper

## [5.10.3](https://github.com/microlinkhq/metascraper/compare/v5.10.2...v5.10.3) (2020-01-15)

**Note:** Version bump only for package metascraper

## [5.10.2](https://github.com/microlinkhq/metascraper/compare/v5.10.1...v5.10.2) (2020-01-14)

**Note:** Version bump only for package metascraper

## [5.10.1](https://github.com/microlinkhq/metascraper/compare/v5.10.0...v5.10.1) (2020-01-07)

**Note:** Version bump only for package metascraper

# [5.10.0](https://github.com/microlinkhq/metascraper/compare/v5.9.5...v5.10.0) (2020-01-07)

### Features

* support pass custom got opts ([8b04337](https://github.com/microlinkhq/metascraper/commit/8b04337d8009b988f4798dd760f0a241196d9ada))

## [5.9.5](https://github.com/microlinkhq/metascraper/compare/v5.9.4...v5.9.5) (2020-01-07)

**Note:** Version bump only for package metascraper

## [5.9.4](https://github.com/microlinkhq/metascraper/compare/v5.9.3...v5.9.4) (2020-01-03)

**Note:** Version bump only for package metascraper

## [5.9.3](https://github.com/microlinkhq/metascraper/compare/v5.9.2...v5.9.3) (2020-01-02)

**Note:** Version bump only for package metascraper

## [5.9.2](https://github.com/microlinkhq/metascraper/compare/v5.9.1...v5.9.2) (2020-01-01)

### Bug Fixes

* interface ([4c824a2](https://github.com/microlinkhq/metascraper/commit/4c824a278fc327f913832231e0149688f9f87337))

## [5.9.1](https://github.com/microlinkhq/metascraper/compare/v5.9.0...v5.9.1) (2020-01-01)

**Note:** Version bump only for package metascraper

# [5.9.0](https://github.com/microlinkhq/metascraper/compare/v5.8.15...v5.9.0) (2019-12-30)

### Features

* remove xss ([#252](https://github.com/microlinkhq/metascraper/issues/252)) ([87670c1](https://github.com/microlinkhq/metascraper/commit/87670c1e9fe0a91aef86af920b23cf6a98cdf5d5)), closes [#251](https://github.com/microlinkhq/metascraper/issues/251)

## [5.8.15](https://github.com/microlinkhq/metascraper/compare/v5.8.14...v5.8.15) (2019-12-28)

### Bug Fixes

* ensure to pass description options ([#250](https://github.com/microlinkhq/metascraper/issues/250)) ([9637022](https://github.com/microlinkhq/metascraper/commit/9637022a5fe9049c3454fe35aa672511639e0acb))

## [5.8.14](https://github.com/microlinkhq/metascraper/compare/v5.8.13...v5.8.14) (2019-12-23)

### Bug Fixes

* omit 404 twitter urls ([93674e0](https://github.com/microlinkhq/metascraper/commit/93674e0dc2de03d6a5e694928e10fad67d028bb5))

## [5.8.13](https://github.com/microlinkhq/metascraper/compare/v5.8.12...v5.8.13) (2019-12-21)

### Bug Fixes

* get protocol based on URL schema ([dce1863](https://github.com/microlinkhq/metascraper/commit/dce18637bbf65a40d8bfc316efe2b14c424d6d99))

## [5.8.12](https://github.com/microlinkhq/metascraper/compare/v5.8.11...v5.8.12) (2019-12-17)

### Bug Fixes

* parse years ([c65f73e](https://github.com/microlinkhq/metascraper/commit/c65f73ed4c3446ec9f72dd2d8a7b7e97d815fabd))

## [5.8.11](https://github.com/microlinkhq/metascraper/compare/v5.8.10...v5.8.11) (2019-12-15)

### Bug Fixes

* files field ([6c57864](https://github.com/microlinkhq/metascraper/commit/6c5786474f02192078e5a0ea68707ecb738ec54b))

## [5.8.10](https://github.com/microlinkhq/metascraper/compare/v5.8.9...v5.8.10) (2019-12-13)

### Bug Fixes

* **metascrapper-date:** chrono as default date parser fix [#241](https://github.com/microlinkhq/metascraper/issues/241) ([#244](https://github.com/microlinkhq/metascraper/issues/244)) ([87e40fe](https://github.com/microlinkhq/metascraper/commit/87e40fe65e0c01039793e0ffa359cd07e4315d89))

## [5.8.9](https://github.com/microlinkhq/metascraper/compare/v5.8.8...v5.8.9) (2019-11-19)

**Note:** Version bump only for package metascraper

## [5.8.8](https://github.com/microlinkhq/metascraper/compare/v5.8.7...v5.8.8) (2019-11-13)

### Bug Fixes

* ensure inline rules merged are collections ([#237](https://github.com/microlinkhq/metascraper/issues/237)) ([7327236](https://github.com/microlinkhq/metascraper/commit/7327236cd45643e46b767ae523d97f8a0e9c7814))

## [5.8.7](https://github.com/microlinkhq/metascraper/compare/v5.8.6...v5.8.7) (2019-11-12)

**Note:** Version bump only for package metascraper

## [5.8.6](https://github.com/microlinkhq/metascraper/compare/v5.8.5...v5.8.6) (2019-11-11)

**Note:** Version bump only for package metascraper

## [5.8.5](https://github.com/microlinkhq/metascraper/compare/v5.8.4...v5.8.5) (2019-11-11)

### Bug Fixes

* ensure chrono output is a date ([2391f15](https://github.com/microlinkhq/metascraper/commit/2391f15a31de63943a4296baaec21b632da0a5c0))

## [5.8.4](https://github.com/microlinkhq/metascraper/compare/v5.8.3...v5.8.4) (2019-11-11)

**Note:** Version bump only for package metascraper

## [5.8.3](https://github.com/microlinkhq/metascraper/compare/v5.8.2...v5.8.3) (2019-11-09)

### Bug Fixes

* ensure only spotify urls are valid ([a707c57](https://github.com/microlinkhq/metascraper/commit/a707c574d1afd0f1765260bba69b7fbb29a90600))

## [5.8.2](https://github.com/microlinkhq/metascraper/compare/v5.8.1...v5.8.2) (2019-11-09)

**Note:** Version bump only for package metascraper

## [5.8.1](https://github.com/microlinkhq/metascraper/compare/v5.8.0...v5.8.1) (2019-11-09)

### Bug Fixes

* ensure innerRules is a collection ([#234](https://github.com/microlinkhq/metascraper/issues/234)) ([04fe20d](https://github.com/microlinkhq/metascraper/commit/04fe20dd9db5686d778ad614f69f545728368dbb))

# [5.8.0](https://github.com/microlinkhq/metascraper/compare/v5.7.21...v5.8.0) (2019-11-08)

### Features

* add spotify integration ([#232](https://github.com/microlinkhq/metascraper/issues/232)) ([74cd3ac](https://github.com/microlinkhq/metascraper/commit/74cd3ac112323baef229b5b49075343997bc628a))

## [5.7.21](https://github.com/microlinkhq/metascraper/compare/v5.7.20...v5.7.21) (2019-11-08)

**Note:** Version bump only for package metascraper

## [5.7.20](https://github.com/microlinkhq/metascraper/compare/v5.7.19...v5.7.20) (2019-11-07)

**Note:** Version bump only for package metascraper

## [5.7.19](https://github.com/microlinkhq/metascraper/compare/v5.7.18...v5.7.19) (2019-11-07)

### Bug Fixes

* compose absolute url properly ([17b55ca](https://github.com/microlinkhq/metascraper/commit/17b55cabf06f95f1aef9bce305cafba623b811e8))
* remove only ([a81002c](https://github.com/microlinkhq/metascraper/commit/a81002cd76748bf6603c75318e2616b856557d56))

## [5.7.18](https://github.com/microlinkhq/metascraper/compare/v5.7.17...v5.7.18) (2019-11-07)

**Note:** Version bump only for package metascraper

## [5.7.17](https://github.com/microlinkhq/metascraper/compare/v5.7.16...v5.7.17) (2019-10-29)

**Note:** Version bump only for package metascraper

## [5.7.16](https://github.com/microlinkhq/metascraper/compare/v5.7.15...v5.7.16) (2019-10-26)

**Note:** Version bump only for package metascraper

## [5.7.15](https://github.com/microlinkhq/metascraper/compare/v5.7.14...v5.7.15) (2019-10-24)

### Bug Fixes

* retry ([b768aa1](https://github.com/microlinkhq/metascraper/commit/b768aa15a589ba2da54267c3e4f0f60a455d90f6))

## [5.7.14](https://github.com/microlinkhq/metascraper/compare/v5.7.13...v5.7.14) (2019-10-24)

**Note:** Version bump only for package metascraper

## [5.7.13](https://github.com/microlinkhq/metascraper/compare/v5.7.12...v5.7.13) (2019-10-23)

**Note:** Version bump only for package metascraper

## [5.7.12](https://github.com/microlinkhq/metascraper/compare/v5.7.11...v5.7.12) (2019-10-20)

### Bug Fixes

* use undefined ([ae693e3](https://github.com/microlinkhq/metascraper/commit/ae693e3))

## [5.7.11](https://github.com/microlinkhq/metascraper/compare/v5.7.10...v5.7.11) (2019-10-20)

**Note:** Version bump only for package metascraper

## [5.7.10](https://github.com/microlinkhq/metascraper/compare/v5.7.9...v5.7.10) (2019-10-20)

**Note:** Version bump only for package metascraper

## [5.7.9](https://github.com/microlinkhq/metascraper/compare/v5.7.8...v5.7.9) (2019-10-18)

### Bug Fixes

* missing await ([7fbd220](https://github.com/microlinkhq/metascraper/commit/7fbd220))

## [5.7.8](https://github.com/microlinkhq/metascraper/compare/v5.7.7...v5.7.8) (2019-10-18)

**Note:** Version bump only for package metascraper

## [5.7.7](https://github.com/microlinkhq/metascraper/compare/v5.7.6...v5.7.7) (2019-10-17)

### Bug Fixes

* condition under no tunnel ([a1866f1](https://github.com/microlinkhq/metascraper/commit/a1866f1))
* don't loop if max tunnel size is reached ([3a014f4](https://github.com/microlinkhq/metascraper/commit/3a014f4))

## [5.7.6](https://github.com/microlinkhq/metascraper/compare/v5.7.5...v5.7.6) (2019-09-29)

**Note:** Version bump only for package metascraper

## [5.7.5](https://github.com/microlinkhq/metascraper/compare/v5.7.4...v5.7.5) (2019-09-23)

**Note:** Version bump only for package metascraper

## [5.7.4](https://github.com/microlinkhq/metascraper/compare/v5.7.3...v5.7.4) (2019-09-13)

**Note:** Version bump only for package metascraper

## [5.7.3](https://github.com/microlinkhq/metascraper/compare/v5.7.2...v5.7.3) (2019-09-13)

**Note:** Version bump only for package metascraper

## [5.7.2](https://github.com/microlinkhq/metascraper/compare/v5.7.1...v5.7.2) (2019-09-12)

**Note:** Version bump only for package metascraper

## [5.7.1](https://github.com/microlinkhq/metascraper/compare/v5.7.0...v5.7.1) (2019-09-12)

**Note:** Version bump only for package metascraper

# [5.7.0](https://github.com/microlinkhq/metascraper/compare/v5.6.8...v5.7.0) (2019-09-12)

### Features

* fixes [#207](https://github.com/microlinkhq/metascraper/issues/207): parse multiple json-ld blocks ([#208](https://github.com/microlinkhq/metascraper/issues/208)) ([0c8ee94](https://github.com/microlinkhq/metascraper/commit/0c8ee94))

## [5.6.8](https://github.com/microlinkhq/metascraper/compare/v5.6.7...v5.6.8) (2019-08-30)

**Note:** Version bump only for package metascraper

## [5.6.7](https://github.com/microlinkhq/metascraper/compare/v5.6.6...v5.6.7) (2019-08-30)

**Note:** Version bump only for package metascraper

## [5.6.6](https://github.com/microlinkhq/metascraper/compare/v5.6.5...v5.6.6) (2019-08-22)

### Bug Fixes

* linter ([ef3c6ed](https://github.com/microlinkhq/metascraper/commit/ef3c6ed))

## [5.6.5](https://github.com/microlinkhq/metascraper/compare/v5.6.4...v5.6.5) (2019-08-01)

**Note:** Version bump only for package metascraper

## [5.6.4](https://github.com/microlinkhq/metascraper/compare/v5.6.3...v5.6.4) (2019-08-01)

**Note:** Version bump only for package metascraper

## [5.6.3](https://github.com/microlinkhq/metascraper/compare/v5.6.2...v5.6.3) (2019-07-20)

**Note:** Version bump only for package metascraper

## [5.6.2](https://github.com/microlinkhq/metascraper/compare/v5.6.1...v5.6.2) (2019-07-12)

**Note:** Version bump only for package metascraper

## [5.6.1](https://github.com/microlinkhq/metascraper/compare/v5.6.0...v5.6.1) (2019-07-10)

### Bug Fixes

* value detection ([#190](https://github.com/microlinkhq/metascraper/issues/190)) ([db84e16](https://github.com/microlinkhq/metascraper/commit/db84e16))

# [5.6.0](https://github.com/microlinkhq/metascraper/compare/v5.5.4...v5.6.0) (2019-07-10)

### Features

* add test function to rules bundle ([#189](https://github.com/microlinkhq/metascraper/issues/189)) ([7c209e9](https://github.com/microlinkhq/metascraper/commit/7c209e9)), closes [#184](https://github.com/microlinkhq/metascraper/issues/184)

## [5.5.4](https://github.com/microlinkhq/metascraper/compare/v5.5.3...v5.5.4) (2019-07-04)

**Note:** Version bump only for package metascraper

## [5.5.3](https://github.com/microlinkhq/metascraper/compare/v5.5.2...v5.5.3) (2019-06-29)

**Note:** Version bump only for package metascraper

## [5.5.2](https://github.com/microlinkhq/metascraper/compare/v5.5.1...v5.5.2) (2019-06-20)

**Note:** Version bump only for package metascraper

## [5.5.1](https://github.com/microlinkhq/metascraper/compare/v5.5.0...v5.5.1) (2019-06-20)

**Note:** Version bump only for package metascraper

# [5.5.0](https://github.com/microlinkhq/metascraper/compare/v5.4.7...v5.5.0) (2019-06-20)

### Features

* add metascraper-uol ([#183](https://github.com/microlinkhq/metascraper/issues/183)) ([2a06b1d](https://github.com/microlinkhq/metascraper/commit/2a06b1d))

## [5.4.7](https://github.com/microlinkhq/metascraper/compare/v5.4.6...v5.4.7) (2019-06-20)

**Note:** Version bump only for package metascraper

## [5.4.6](https://github.com/microlinkhq/metascraper/compare/v5.4.5...v5.4.6) (2019-06-19)

**Note:** Version bump only for package metascraper

## [5.4.5](https://github.com/microlinkhq/metascraper/compare/v5.4.4...v5.4.5) (2019-06-19)

**Note:** Version bump only for package metascraper

## [5.4.4](https://github.com/microlinkhq/metascraper/compare/v5.4.3...v5.4.4) (2019-06-14)

**Note:** Version bump only for package metascraper

## [5.4.3](https://github.com/microlinkhq/metascraper/compare/v5.4.2...v5.4.3) (2019-06-12)

### Bug Fixes

* only use entry-title selector when only one entry-title exists ([#178](https://github.com/microlinkhq/metascraper/issues/178)) ([83aec6f](https://github.com/microlinkhq/metascraper/commit/83aec6f))

## [5.4.2](https://github.com/microlinkhq/metascraper/compare/v5.4.1...v5.4.2) (2019-06-05)

**Note:** Version bump only for package metascraper

## [5.4.1](https://github.com/microlinkhq/metascraper/compare/v5.4.0...v5.4.1) (2019-06-05)

### Bug Fixes

* ensure value exist ([3132a92](https://github.com/microlinkhq/metascraper/commit/3132a92))

## [5.3.4](https://github.com/microlinkhq/metascraper/compare/v5.3.3...v5.3.4) (2019-05-30)

**Note:** Version bump only for package metascraper

## [5.3.3](https://github.com/microlinkhq/metascraper/compare/v5.3.2...v5.3.3) (2019-05-28)

### Bug Fixes

* ensure to access just if exist ([#174](https://github.com/microlinkhq/metascraper/issues/174)) ([9350086](https://github.com/microlinkhq/metascraper/commit/9350086))

## [5.3.2](https://github.com/microlinkhq/metascraper/compare/v5.3.1...v5.3.2) (2019-05-20)

**Note:** Version bump only for package metascraper

## [5.3.1](https://github.com/microlinkhq/metascraper/compare/v5.3.0...v5.3.1) (2019-05-17)

### Bug Fixes

* count ([bb12aaf](https://github.com/microlinkhq/metascraper/commit/bb12aaf))

## [5.2.4](https://github.com/microlinkhq/metascraper/compare/v5.2.3...v5.2.4) (2019-05-07)

### Bug Fixes

* gif as image format ([#171](https://github.com/microlinkhq/metascraper/issues/171)) ([1fbdae2](https://github.com/microlinkhq/metascraper/commit/1fbdae2))

## [5.2.3](https://github.com/microlinkhq/metascraper/compare/v5.2.2...v5.2.3) (2019-05-05)

**Note:** Version bump only for package metascraper

## [5.2.2](https://github.com/microlinkhq/metascraper/compare/v5.2.1...v5.2.2) (2019-05-05)

### Bug Fixes

* resolve collection of objects ([d2b2b45](https://github.com/microlinkhq/metascraper/commit/d2b2b45))

## [5.2.1](https://github.com/microlinkhq/metascraper/compare/v5.2.0...v5.2.1) (2019-05-05)

### Bug Fixes

* ensure to escape values in a collection ([e65ffec](https://github.com/microlinkhq/metascraper/commit/e65ffec))

## [5.1.1](https://github.com/microlinkhq/metascraper/compare/v5.1.0...v5.1.1) (2019-04-04)

**Note:** Version bump only for package metascraper

# [5.1.0](https://github.com/microlinkhq/metascraper/compare/v5.0.2...v5.1.0) (2019-04-03)

### Features

* add inline rules at the end ([#163](https://github.com/microlinkhq/metascraper/issues/163)) ([936749a](https://github.com/microlinkhq/metascraper/commit/936749a))

## [5.0.2](https://github.com/microlinkhq/metascraper/compare/v5.0.1...v5.0.2) (2019-03-31)

### Bug Fixes

* ensure external requests has early timeout ([#162](https://github.com/microlinkhq/metascraper/issues/162)) ([f7a7816](https://github.com/microlinkhq/metascraper/commit/f7a7816))

## [5.0.1](https://github.com/microlinkhq/metascraper/compare/v5.0.0...v5.0.1) (2019-03-17)

**Note:** Version bump only for package metascraper

# [5.0.0](https://github.com/microlinkhq/metascraper/compare/v4.10.3...v5.0.0) (2019-03-17)

### Features

* reduce rules on parallel ([#157](https://github.com/microlinkhq/metascraper/issues/157)) ([bce6eb5](https://github.com/microlinkhq/metascraper/commit/bce6eb5))

### BREAKING CHANGES

* 'meta' can't be passed as shared resource

* build: deprecated lang-detector

## [4.10.3](https://github.com/microlinkhq/metascraper/compare/v4.10.2...v4.10.3) (2019-03-17)

**Note:** Version bump only for package metascraper

## [4.10.2](https://github.com/microlinkhq/metascraper/compare/v4.10.1...v4.10.2) (2019-03-16)

### Bug Fixes

* add author size limitation ([#154](https://github.com/microlinkhq/metascraper/issues/154)) ([c1df0d3](https://github.com/microlinkhq/metascraper/commit/c1df0d3))

## [4.10.1](https://github.com/microlinkhq/metascraper/compare/v4.10.0...v4.10.1) (2019-01-25)

**Note:** Version bump only for package metascraper

# [4.10.0](https://github.com/microlinkhq/metascraper/compare/v4.9.0...v4.10.0) (2019-01-13)

### Features

* remove unnecessary dependency ([8dbb1ac](https://github.com/microlinkhq/metascraper/commit/8dbb1ac))

## [4.8.5](https://github.com/microlinkhq/metascraper/compare/v4.8.4...v4.8.5) (2018-12-25)

**Note:** Version bump only for package metascraper

## [4.8.4](https://github.com/microlinkhq/metascraper/compare/v4.8.3...v4.8.4) (2018-12-16)

### Bug Fixes

* avoid use generic publisher ([#141](https://github.com/microlinkhq/metascraper/issues/141)) ([c13f833](https://github.com/microlinkhq/metascraper/commit/c13f833))

## [4.8.3](https://github.com/microlinkhq/metascraper/compare/v4.8.2...v4.8.3) (2018-12-15)

**Note:** Version bump only for package metascraper

## [4.8.2](https://github.com/microlinkhq/metascraper/compare/v4.8.1...v4.8.2) (2018-12-12)

### Bug Fixes

* ensure buffer has enough space ([#136](https://github.com/microlinkhq/metascraper/issues/136)) ([8bd7be3](https://github.com/microlinkhq/metascraper/commit/8bd7be3)), closes [#issuecomment-253184229](https://github.com/microlinkhq/metascraper/issues/issuecomment-253184229)

## [4.8.1](https://github.com/microlinkhq/metascraper/compare/v4.8.0...v4.8.1) (2018-12-07)

### Bug Fixes

* use agent for Twitter request ([#135](https://github.com/microlinkhq/metascraper/issues/135)) ([ed3e1a2](https://github.com/microlinkhq/metascraper/commit/ed3e1a2))

# [4.8.0](https://github.com/microlinkhq/metascraper/compare/v4.7.0...v4.8.0) (2018-11-19)

### Features

* fulfilled twitter promise ([#133](https://github.com/microlinkhq/metascraper/issues/133)) ([5e89fe5](https://github.com/microlinkhq/metascraper/commit/5e89fe5))

##  (2018-11-16)

## 4.7.0 (2018-11-16)

* Update dependencies (#132) ([a256f0c](https://github.com/microlinkhq/metascraper/commit/a256f0c)), closes [#132](https://github.com/microlinkhq/metascraper/issues/132)
* v4.7.0 ([a7d53da](https://github.com/microlinkhq/metascraper/commit/a7d53da))
* fix: reset token every 10min ([cf8cd92](https://github.com/microlinkhq/metascraper/commit/cf8cd92))

## <small>4.6.1 (2018-10-28)</small>

* v4.6.1 ([dc664c3](https://github.com/microlinkhq/metascraper/commit/dc664c3))
* fix: use `onError` for capture error (#130) ([dcf9e23](https://github.com/microlinkhq/metascraper/commit/dcf9e23)), closes [#130](https://github.com/microlinkhq/metascraper/issues/130)

## 4.6.0 (2018-10-24)

* v4.6.0 ([0ef7ad5](https://github.com/microlinkhq/metascraper/commit/0ef7ad5))
* feat: get language from twitter payload (#129) ([80d5ddf](https://github.com/microlinkhq/metascraper/commit/80d5ddf)), closes [#129](https://github.com/microlinkhq/metascraper/issues/129)

## <small>4.5.6 (2018-10-23)</small>

* v4.5.6 ([e90bb13](https://github.com/microlinkhq/metascraper/commit/e90bb13))
* fix: add proxy support at youtube-dl ([c2c0fea](https://github.com/microlinkhq/metascraper/commit/c2c0fea))
* fix: iterate over new formats detected ([14db749](https://github.com/microlinkhq/metascraper/commit/14db749))

## <small>4.5.5 (2018-10-21)</small>

* v4.5.5 ([679424c](https://github.com/microlinkhq/metascraper/commit/679424c))
* build: setup conventional workflow ([b3e0a9e](https://github.com/microlinkhq/metascraper/commit/b3e0a9e))

## <small>4.5.5-alpha.0 (2018-10-21)</small>

* Update Changelog ([5107f87](https://github.com/microlinkhq/metascraper/commit/5107f87))
* v4.5.5-alpha.0 ([a9acb05](https://github.com/microlinkhq/metascraper/commit/a9acb05))
* build: add automate-release workflow ([a6b0493](https://github.com/microlinkhq/metascraper/commit/a6b0493))
* build: update dependencies ([8597ea7](https://github.com/microlinkhq/metascraper/commit/8597ea7))

## <small>4.5.4 (2018-10-17)</small>

* Prefer mp4 video if it is available (#127) ([2d92376](https://github.com/microlinkhq/metascraper/commit/2d92376)), closes [#127](https://github.com/microlinkhq/metascraper/issues/127)
* Update Changelog ([b8d5445](https://github.com/microlinkhq/metascraper/commit/b8d5445))
* v4.5.4 ([5fc2f5c](https://github.com/microlinkhq/metascraper/commit/5fc2f5c))

## <small>4.5.3 (2018-10-11)</small>

* Get original tweet id ([ac7e5e9](https://github.com/microlinkhq/metascraper/commit/ac7e5e9))
* Update Changelog ([f8167ed](https://github.com/microlinkhq/metascraper/commit/f8167ed))
* v4.5.3 ([e01b4b2](https://github.com/microlinkhq/metascraper/commit/e01b4b2))

## <small>4.5.2 (2018-10-05)</small>

* Add tunnel support (#124) ([084e9e6](https://github.com/microlinkhq/metascraper/commit/084e9e6)), closes [#124](https://github.com/microlinkhq/metascraper/issues/124)
* Update Changelog ([1319563](https://github.com/microlinkhq/metascraper/commit/1319563))
* v4.5.2 ([29bcc2c](https://github.com/microlinkhq/metascraper/commit/29bcc2c))

## <small>4.5.1 (2018-10-04)</small>

* Revert "Avoid use Twitter API (#122)" ([66ca721](https://github.com/microlinkhq/metascraper/commit/66ca721)), closes [#122](https://github.com/microlinkhq/metascraper/issues/122)
* Update Changelog ([6481681](https://github.com/microlinkhq/metascraper/commit/6481681))
* v4.5.1 ([af004a4](https://github.com/microlinkhq/metascraper/commit/af004a4))

## 4.5.0 (2018-09-30)

* Refactor tests ([b9d4c5f](https://github.com/microlinkhq/metascraper/commit/b9d4c5f))
* Update Changelog ([024d5f3](https://github.com/microlinkhq/metascraper/commit/024d5f3))
* Use prerender for extracting HTML ([4b6c034](https://github.com/microlinkhq/metascraper/commit/4b6c034))
* v4.5.0 ([3c6970b](https://github.com/microlinkhq/metascraper/commit/3c6970b))

## <small>4.4.4 (2018-09-29)</small>

* Avoid use Twitter API (#122) ([71c7071](https://github.com/microlinkhq/metascraper/commit/71c7071)), closes [#122](https://github.com/microlinkhq/metascraper/issues/122) [/github.com/loklak/loklak_server/blob/7c513ae7949718399a7cf06bb19e80da362ef396/src/org/loklak/harvester/TwitterScraper.java#L486-L506](https://github.com//github.com/loklak/loklak_server/blob/7c513ae7949718399a7cf06bb19e80da362ef396/src/org/loklak/harvester/TwitterScraper.java/issues/L486-L506)
* Update Changelog ([3b581b6](https://github.com/microlinkhq/metascraper/commit/3b581b6))
* v4.4.4 ([fd0c0a9](https://github.com/microlinkhq/metascraper/commit/fd0c0a9))

## <small>4.4.3 (2018-09-26)</small>

* Disable retry ([5dc9c54](https://github.com/microlinkhq/metascraper/commit/5dc9c54))
* Update Changelog ([65de378](https://github.com/microlinkhq/metascraper/commit/65de378))
* Update rate limit window ([82b1218](https://github.com/microlinkhq/metascraper/commit/82b1218))
* v4.4.3 ([8ecb4f5](https://github.com/microlinkhq/metascraper/commit/8ecb4f5))

## <small>4.4.2 (2018-09-21)</small>

* Update Changelog ([82e44fa](https://github.com/microlinkhq/metascraper/commit/82e44fa))
* Update limit rates ([d7d0052](https://github.com/microlinkhq/metascraper/commit/d7d0052))
* v4.4.2 ([f6df434](https://github.com/microlinkhq/metascraper/commit/f6df434))

## <small>4.4.1 (2018-09-20)</small>

* Refresh token after expiration ([c99b57b](https://github.com/microlinkhq/metascraper/commit/c99b57b))
* v4.4.1 ([817663a](https://github.com/microlinkhq/metascraper/commit/817663a))

## 4.4.0 (2018-09-19)

* Move memoize token into an external dependency (#120) ([96b3bcc](https://github.com/microlinkhq/metascraper/commit/96b3bcc)), closes [#120](https://github.com/microlinkhq/metascraper/issues/120)
* Update Changelog ([32fc3dd](https://github.com/microlinkhq/metascraper/commit/32fc3dd))
* Update scripts ([c64a111](https://github.com/microlinkhq/metascraper/commit/c64a111))
* v4.4.0 ([933b562](https://github.com/microlinkhq/metascraper/commit/933b562))

## <small>4.3.6 (2018-09-19)</small>

* Add memoize for successive API calls (#119) ([d615b36](https://github.com/microlinkhq/metascraper/commit/d615b36)), closes [#119](https://github.com/microlinkhq/metascraper/issues/119)
* Update Changelog ([d4cf08b](https://github.com/microlinkhq/metascraper/commit/d4cf08b))
* Update contributors ([ad4468c](https://github.com/microlinkhq/metascraper/commit/ad4468c))
* Update scripts ([760657b](https://github.com/microlinkhq/metascraper/commit/760657b))
* v4.3.6 ([4bc9178](https://github.com/microlinkhq/metascraper/commit/4bc9178))

## <small>4.3.5 (2018-09-18)</small>

* Throw qualified errors (#118) ([efe7710](https://github.com/microlinkhq/metascraper/commit/efe7710)), closes [#118](https://github.com/microlinkhq/metascraper/issues/118)
* Update Changelog ([6639bdb](https://github.com/microlinkhq/metascraper/commit/6639bdb))
* Update dependencies ([795aeb5](https://github.com/microlinkhq/metascraper/commit/795aeb5))
* v4.3.5 ([049ef06](https://github.com/microlinkhq/metascraper/commit/049ef06))

## <small>4.3.4 (2018-09-15)</small>

* Fix lint ([395c98c](https://github.com/microlinkhq/metascraper/commit/395c98c))
* Only get video from tweets urls from Twitter ([1313fd7](https://github.com/microlinkhq/metascraper/commit/1313fd7))
* Update Changelog ([0f84e19](https://github.com/microlinkhq/metascraper/commit/0f84e19))
* v4.3.4 ([82a5abf](https://github.com/microlinkhq/metascraper/commit/82a5abf))

## <small>4.3.3 (2018-09-09)</small>

* Handle unsupported urls gracefully ([93d37a3](https://github.com/microlinkhq/metascraper/commit/93d37a3))
* Update Changelog ([86b443f](https://github.com/microlinkhq/metascraper/commit/86b443f))
* Update scripts ([3fa3fed](https://github.com/microlinkhq/metascraper/commit/3fa3fed))
* v4.3.3 ([b7d0526](https://github.com/microlinkhq/metascraper/commit/b7d0526))

## <small>4.3.2 (2018-09-07)</small>

* Fix publisher (#117) ([501940e](https://github.com/microlinkhq/metascraper/commit/501940e)), closes [#117](https://github.com/microlinkhq/metascraper/issues/117)
* More authors to root project ([57638a7](https://github.com/microlinkhq/metascraper/commit/57638a7)), closes [#116](https://github.com/microlinkhq/metascraper/issues/116)
* Update Changelog ([59f0216](https://github.com/microlinkhq/metascraper/commit/59f0216))
* v4.3.2 ([0ece288](https://github.com/microlinkhq/metascraper/commit/0ece288))

## <small>4.3.1 (2018-09-05)</small>

* Exit early if no twitter videos detected (#115) ([a69979f](https://github.com/microlinkhq/metascraper/commit/a69979f)), closes [#115](https://github.com/microlinkhq/metascraper/issues/115)
* Update Changelog ([25cec6f](https://github.com/microlinkhq/metascraper/commit/25cec6f))
* v4.3.1 ([24c388e](https://github.com/microlinkhq/metascraper/commit/24c388e))

## 4.3.0 (2018-09-04)

* Add metascraper lang detector package (#114) ([f379837](https://github.com/microlinkhq/metascraper/commit/f379837)), closes [#114](https://github.com/microlinkhq/metascraper/issues/114)
* Add metascraper-audio (#113) ([face7e1](https://github.com/microlinkhq/metascraper/commit/face7e1)), closes [#113](https://github.com/microlinkhq/metascraper/issues/113)
* Fix generate rule interface correctly ([b41007e](https://github.com/microlinkhq/metascraper/commit/b41007e))
* Update Changelog ([531093b](https://github.com/microlinkhq/metascraper/commit/531093b))
* Update rules bundles ([5131af0](https://github.com/microlinkhq/metascraper/commit/5131af0))
* v4.3.0 ([1ab950c](https://github.com/microlinkhq/metascraper/commit/1ab950c))

## 4.2.0 (2018-09-01)

* Add image url helper ([b7e2987](https://github.com/microlinkhq/metascraper/commit/b7e2987))
* Update Changelog ([c0b9ef5](https://github.com/microlinkhq/metascraper/commit/c0b9ef5))
* v4.2.0 ([e035974](https://github.com/microlinkhq/metascraper/commit/e035974))

## 4.1.0 (2018-09-01)

* Add `greyscale` option to Clearbit logo API (#110) ([137b2f4](https://github.com/microlinkhq/metascraper/commit/137b2f4)), closes [#110](https://github.com/microlinkhq/metascraper/issues/110)
* Add audio support ([7d5ad34](https://github.com/microlinkhq/metascraper/commit/7d5ad34))
* Add audio support ([9f09429](https://github.com/microlinkhq/metascraper/commit/9f09429))
* Fix tests ([00584d3](https://github.com/microlinkhq/metascraper/commit/00584d3))
* Fix tests ([6fd95b4](https://github.com/microlinkhq/metascraper/commit/6fd95b4))
* Lock standard version ([82c6108](https://github.com/microlinkhq/metascraper/commit/82c6108))
* Lock standard version ([b61e68d](https://github.com/microlinkhq/metascraper/commit/b61e68d))
* Move helpers method into helpers package ([b845f45](https://github.com/microlinkhq/metascraper/commit/b845f45))
* Move helpers method into helpers package ([a807b70](https://github.com/microlinkhq/metascraper/commit/a807b70))
* Remove unnecesary test ([fe3efa6](https://github.com/microlinkhq/metascraper/commit/fe3efa6))
* Remove unnecesary test ([153f5d1](https://github.com/microlinkhq/metascraper/commit/153f5d1))
* Rename video-provider → media-provider ([2838e12](https://github.com/microlinkhq/metascraper/commit/2838e12))
* Rename video-provider → media-provider ([77080db](https://github.com/microlinkhq/metascraper/commit/77080db))
* Return a collection of urls ([7f54518](https://github.com/microlinkhq/metascraper/commit/7f54518))
* Return a collection of urls ([9ffcd67](https://github.com/microlinkhq/metascraper/commit/9ffcd67))
* Strict url validation ([edfb8a0](https://github.com/microlinkhq/metascraper/commit/edfb8a0))
* Strict url validation ([b63564f](https://github.com/microlinkhq/metascraper/commit/b63564f))
* Tweaks ([10faffd](https://github.com/microlinkhq/metascraper/commit/10faffd))
* Tweaks ([99a52ef](https://github.com/microlinkhq/metascraper/commit/99a52ef))
* Update Changelog ([4ddd209](https://github.com/microlinkhq/metascraper/commit/4ddd209))
* Update dependencies (#112) ([4ecf92d](https://github.com/microlinkhq/metascraper/commit/4ecf92d)), closes [#112](https://github.com/microlinkhq/metascraper/issues/112)
* v4.1.0 ([6b08dfa](https://github.com/microlinkhq/metascraper/commit/6b08dfa))
* Video is a collection ([97fcfae](https://github.com/microlinkhq/metascraper/commit/97fcfae))
* Video is a collection ([19405c2](https://github.com/microlinkhq/metascraper/commit/19405c2))
* video is string ([1e3227b](https://github.com/microlinkhq/metascraper/commit/1e3227b))
* video is string ([41e5806](https://github.com/microlinkhq/metascraper/commit/41e5806))

## <small>4.0.3 (2018-08-28)</small>

* Add condition to stop ([e49a85c](https://github.com/microlinkhq/metascraper/commit/e49a85c))
* Update Changelog ([8766f13](https://github.com/microlinkhq/metascraper/commit/8766f13))
* v4.0.3 ([a2027c9](https://github.com/microlinkhq/metascraper/commit/a2027c9))

## <small>4.0.2 (2018-08-27)</small>

* Update Changelog ([321a2ab](https://github.com/microlinkhq/metascraper/commit/321a2ab))
* Update peer dependency to metascraper 4 ([a837299](https://github.com/microlinkhq/metascraper/commit/a837299))
* v4.0.2 ([a287d23](https://github.com/microlinkhq/metascraper/commit/a287d23))

## <small>4.0.1 (2018-08-26)</small>

* Add tests ([58c26f0](https://github.com/microlinkhq/metascraper/commit/58c26f0))
* Improve publisher detection based on title (#109) ([840ac8b](https://github.com/microlinkhq/metascraper/commit/840ac8b)), closes [#109](https://github.com/microlinkhq/metascraper/issues/109)
* Update Changelog ([2a3dc73](https://github.com/microlinkhq/metascraper/commit/2a3dc73))
* Update ISSUE_TEMPLATE.md ([f35ca69](https://github.com/microlinkhq/metascraper/commit/f35ca69))
* v4.0.1 ([94c0281](https://github.com/microlinkhq/metascraper/commit/94c0281))

## 4.0.0 (2018-08-24)

* Remove autoload ([9d3745b](https://github.com/microlinkhq/metascraper/commit/9d3745b))
* Remove autoload (#106) ([60b0adb](https://github.com/microlinkhq/metascraper/commit/60b0adb)), closes [#106](https://github.com/microlinkhq/metascraper/issues/106)
* Remove lazy intializer ([d63fcc8](https://github.com/microlinkhq/metascraper/commit/d63fcc8))
* Update Changelog ([76d5329](https://github.com/microlinkhq/metascraper/commit/76d5329))
* Update dependencies ([19aca42](https://github.com/microlinkhq/metascraper/commit/19aca42))
* Update Docs ([7fd6b15](https://github.com/microlinkhq/metascraper/commit/7fd6b15))
* v4.0.0 ([7901fb6](https://github.com/microlinkhq/metascraper/commit/7901fb6))

## <small>3.13.2 (2018-08-18)</small>

* Oh twitter ([23f641d](https://github.com/microlinkhq/metascraper/commit/23f641d))
* Update Changelog ([9c5463b](https://github.com/microlinkhq/metascraper/commit/9c5463b))
* v3.13.2 ([f4a0b21](https://github.com/microlinkhq/metascraper/commit/f4a0b21))

## <small>3.13.1 (2018-08-18)</small>

* At least video need to be mp4 format ([f6fd92a](https://github.com/microlinkhq/metascraper/commit/f6fd92a))
* Update Changelog ([b012514](https://github.com/microlinkhq/metascraper/commit/b012514))
* v3.13.1 ([8928e95](https://github.com/microlinkhq/metascraper/commit/8928e95))

## 3.13.0 (2018-08-17)

* Better twitter video extraction (#104) ([eb8778c](https://github.com/microlinkhq/metascraper/commit/eb8778c)), closes [#104](https://github.com/microlinkhq/metascraper/issues/104)
* Unify lint-staged ([4e2ae4d](https://github.com/microlinkhq/metascraper/commit/4e2ae4d))
* Update Changelog ([840ff6f](https://github.com/microlinkhq/metascraper/commit/840ff6f))
* v3.13.0 ([3327bab](https://github.com/microlinkhq/metascraper/commit/3327bab))

## <small>3.12.1 (2018-08-17)</small>

* Update Changelog ([718b0c8](https://github.com/microlinkhq/metascraper/commit/718b0c8))
* Update dependencies ([51c7c52](https://github.com/microlinkhq/metascraper/commit/51c7c52))
* Use title instead of to-title-case (#103) ([5d25245](https://github.com/microlinkhq/metascraper/commit/5d25245)), closes [#103](https://github.com/microlinkhq/metascraper/issues/103)
* v3.12.1 ([9baa717](https://github.com/microlinkhq/metascraper/commit/9baa717))

## 3.12.0 (2018-08-15)

* Use twdown for twitter videos ([0a74da4](https://github.com/microlinkhq/metascraper/commit/0a74da4))
* v3.12.0 ([355b404](https://github.com/microlinkhq/metascraper/commit/355b404))

## <small>3.11.12 (2018-08-13)</small>

* Fix typo ([35b0ca6](https://github.com/microlinkhq/metascraper/commit/35b0ca6))
* Remove residual data ([b66a28c](https://github.com/microlinkhq/metascraper/commit/b66a28c))
* v3.11.12 ([815ba2b](https://github.com/microlinkhq/metascraper/commit/815ba2b))

## <small>3.11.11 (2018-08-13)</small>

* Improve video detection ([3a326ab](https://github.com/microlinkhq/metascraper/commit/3a326ab))
* v3.11.11 ([0d5ee77](https://github.com/microlinkhq/metascraper/commit/0d5ee77))

## <small>3.11.10 (2018-08-11)</small>

* v3.11.10 ([63b10e1](https://github.com/microlinkhq/metascraper/commit/63b10e1))

## <small>3.11.9 (2018-08-11)</small>

* Add file extension ([3236005](https://github.com/microlinkhq/metascraper/commit/3236005))
* Add providers script ([68ece2b](https://github.com/microlinkhq/metascraper/commit/68ece2b))
* Cache non supported urls as well ([837c76c](https://github.com/microlinkhq/metascraper/commit/837c76c))
* Detect extractors without HTTP request ([1a64a14](https://github.com/microlinkhq/metascraper/commit/1a64a14))
* Ensure `normalizeHttp` is false by default (#101) ([339d473](https://github.com/microlinkhq/metascraper/commit/339d473)), closes [#101](https://github.com/microlinkhq/metascraper/issues/101)
* Fix linter ([569a6bd](https://github.com/microlinkhq/metascraper/commit/569a6bd))
* Remove postinstall script ([f8734db](https://github.com/microlinkhq/metascraper/commit/f8734db)), closes [/github.com/rg3/youtube-dl/issues/17208#issuecomment-412262556](https://github.com//github.com/rg3/youtube-dl/issues/17208/issues/issuecomment-412262556)
* Tweaks ([c3bd078](https://github.com/microlinkhq/metascraper/commit/c3bd078))
* Update Changelog ([3c06b83](https://github.com/microlinkhq/metascraper/commit/3c06b83))
* Update dependencies ([234bd91](https://github.com/microlinkhq/metascraper/commit/234bd91))
* Update index.html ([5587ade](https://github.com/microlinkhq/metascraper/commit/5587ade))
* Update index.html ([3f16409](https://github.com/microlinkhq/metascraper/commit/3f16409))
* v3.11.9 ([c8e22e2](https://github.com/microlinkhq/metascraper/commit/c8e22e2))

## <small>3.11.8 (2018-07-10)</small>

* Update Changelog ([1b7685f](https://github.com/microlinkhq/metascraper/commit/1b7685f))
* Update dependencies (#100) ([630baec](https://github.com/microlinkhq/metascraper/commit/630baec)), closes [#100](https://github.com/microlinkhq/metascraper/issues/100)
* v3.11.8 ([841f367](https://github.com/microlinkhq/metascraper/commit/841f367))

## <small>3.11.7 (2018-07-06)</small>

* Update Changelog ([5c2e904](https://github.com/microlinkhq/metascraper/commit/5c2e904))
* Update dependencies (#98) ([44e2f03](https://github.com/microlinkhq/metascraper/commit/44e2f03)), closes [#98](https://github.com/microlinkhq/metascraper/issues/98)
* v3.11.7 ([4197edc](https://github.com/microlinkhq/metascraper/commit/4197edc))

## <small>3.11.6 (2018-06-02)</small>

* Add abbility to use dom pseudo selectors ([8677a0d](https://github.com/microlinkhq/metascraper/commit/8677a0d))
* Update Changelog ([5f3d1da](https://github.com/microlinkhq/metascraper/commit/5f3d1da))
* Update dependencies ([4a74f0b](https://github.com/microlinkhq/metascraper/commit/4a74f0b))
* v3.11.6 ([43ce89f](https://github.com/microlinkhq/metascraper/commit/43ce89f))

## <small>3.11.5 (2018-05-29)</small>

* Don't remove trailing slash (#91) ([79f3330](https://github.com/microlinkhq/metascraper/commit/79f3330)), closes [#91](https://github.com/microlinkhq/metascraper/issues/91)
* Update Changelog ([d016735](https://github.com/microlinkhq/metascraper/commit/d016735))
* v3.11.5 ([bf8fd25](https://github.com/microlinkhq/metascraper/commit/bf8fd25))

## <small>3.11.4 (2018-05-27)</small>

* Expose validators for core rules (#89) ([feb2a4b](https://github.com/microlinkhq/metascraper/commit/feb2a4b)), closes [#89](https://github.com/microlinkhq/metascraper/issues/89)
* Update Changelog ([aba7526](https://github.com/microlinkhq/metascraper/commit/aba7526))
* Update dependency (#90) ([a7b1457](https://github.com/microlinkhq/metascraper/commit/a7b1457)), closes [#90](https://github.com/microlinkhq/metascraper/issues/90)
* v3.11.4 ([ca4b7d8](https://github.com/microlinkhq/metascraper/commit/ca4b7d8))

## <small>3.11.3 (2018-05-17)</small>

* Revert youtube-dl-installer ([33989b9](https://github.com/microlinkhq/metascraper/commit/33989b9))
* Update Changelog ([7e3e1fb](https://github.com/microlinkhq/metascraper/commit/7e3e1fb))
* v3.11.3 ([49af94c](https://github.com/microlinkhq/metascraper/commit/49af94c))

## <small>3.11.2 (2018-05-17)</small>

* Update Changelog ([1e7bf0f](https://github.com/microlinkhq/metascraper/commit/1e7bf0f))
* Update deps ([56ec5e6](https://github.com/microlinkhq/metascraper/commit/56ec5e6))
* v3.11.2 ([ffe6811](https://github.com/microlinkhq/metascraper/commit/ffe6811))

## <small>3.11.1 (2018-05-17)</small>

* Update Changelog ([d8a629f](https://github.com/microlinkhq/metascraper/commit/d8a629f))
* Use youtube-dl binary directly (#88) ([2409771](https://github.com/microlinkhq/metascraper/commit/2409771)), closes [#88](https://github.com/microlinkhq/metascraper/issues/88)
* v3.11.1 ([6b80d23](https://github.com/microlinkhq/metascraper/commit/6b80d23))

## 3.11.0 (2018-05-15)

* Avoid mutate state ([9a56e7d](https://github.com/microlinkhq/metascraper/commit/9a56e7d))
* Ensure to auto load rules just once ([cb18d36](https://github.com/microlinkhq/metascraper/commit/cb18d36))
* Pass rules as argument (#87) ([7c5e236](https://github.com/microlinkhq/metascraper/commit/7c5e236)), closes [#87](https://github.com/microlinkhq/metascraper/issues/87)
* Pass rules support ([766bff3](https://github.com/microlinkhq/metascraper/commit/766bff3))
* Update Changelog ([0bcc5ce](https://github.com/microlinkhq/metascraper/commit/0bcc5ce))
* v3.11.0 ([1558856](https://github.com/microlinkhq/metascraper/commit/1558856))

## <small>3.10.9 (2018-05-12)</small>

* Add itemprop image ([8e81660](https://github.com/microlinkhq/metascraper/commit/8e81660))
* Remove sailthru rules ([a36e240](https://github.com/microlinkhq/metascraper/commit/a36e240))
* Remove unnecessary author rules ([296fda7](https://github.com/microlinkhq/metascraper/commit/296fda7))
* Simplify publisher rules ([47ec0e5](https://github.com/microlinkhq/metascraper/commit/47ec0e5))
* Update Changelog ([9d49f87](https://github.com/microlinkhq/metascraper/commit/9d49f87))
* v3.10.9 ([810a1e5](https://github.com/microlinkhq/metascraper/commit/810a1e5))

## <small>3.10.8 (2018-05-10)</small>

* Update Changelog ([2dc8f84](https://github.com/microlinkhq/metascraper/commit/2dc8f84))
* Update dependencies (#85) ([672facc](https://github.com/microlinkhq/metascraper/commit/672facc)), closes [#85](https://github.com/microlinkhq/metascraper/issues/85)
* Use microlinkhq/normalize-url (#83) ([817fce6](https://github.com/microlinkhq/metascraper/commit/817fce6)), closes [#83](https://github.com/microlinkhq/metascraper/issues/83)
* v3.10.8 ([8ce6ecc](https://github.com/microlinkhq/metascraper/commit/8ce6ecc))

## <small>3.10.7 (2018-04-29)</small>

* Be possible pass opts ([d675cc9](https://github.com/microlinkhq/metascraper/commit/d675cc9))
* Update Changelog ([3a1e5da](https://github.com/microlinkhq/metascraper/commit/3a1e5da))
* Update meta ([7a16eba](https://github.com/microlinkhq/metascraper/commit/7a16eba))
* v3.10.7 ([47eac4c](https://github.com/microlinkhq/metascraper/commit/47eac4c))

## <small>3.10.6 (2018-04-12)</small>

* Avoid extract video for non supported domains ([19792e6](https://github.com/microlinkhq/metascraper/commit/19792e6))
* Update Changelog ([ab464ac](https://github.com/microlinkhq/metascraper/commit/ab464ac))
* v3.10.6 ([4a80b36](https://github.com/microlinkhq/metascraper/commit/4a80b36))

## <small>3.10.5 (2018-04-11)</small>

* Ensure to resolve a valid logo url ([e004596](https://github.com/microlinkhq/metascraper/commit/e004596))
* Update Changelog ([5727dde](https://github.com/microlinkhq/metascraper/commit/5727dde))
* Update README.md ([7ad710d](https://github.com/microlinkhq/metascraper/commit/7ad710d))
* v3.10.5 ([71ff1f9](https://github.com/microlinkhq/metascraper/commit/71ff1f9))

## <small>3.10.4 (2018-04-10)</small>

* Extract more video fields ([69f40c5](https://github.com/microlinkhq/metascraper/commit/69f40c5))
* Update Changelog ([a67e147](https://github.com/microlinkhq/metascraper/commit/a67e147))
* v3.10.4 ([754fc1c](https://github.com/microlinkhq/metascraper/commit/754fc1c))

## <small>3.10.3 (2018-04-08)</small>

* Ensure to return a http protocol url ([f1595f1](https://github.com/microlinkhq/metascraper/commit/f1595f1))
* Update Changelog ([ded6cc4](https://github.com/microlinkhq/metascraper/commit/ded6cc4))
* v3.10.3 ([f5cc2b1](https://github.com/microlinkhq/metascraper/commit/f5cc2b1))

## <small>3.10.2 (2018-04-08)</small>

* Improve mp4 detection ([4f7f26b](https://github.com/microlinkhq/metascraper/commit/4f7f26b))
* Update Changelog ([0f66a1b](https://github.com/microlinkhq/metascraper/commit/0f66a1b))
* Update README.md ([3fedeaa](https://github.com/microlinkhq/metascraper/commit/3fedeaa))
* v3.10.2 ([c4aa6b6](https://github.com/microlinkhq/metascraper/commit/c4aa6b6))

## <small>3.10.1 (2018-04-08)</small>

* Change implementation ([b14e3a0](https://github.com/microlinkhq/metascraper/commit/b14e3a0))
* Update Changelog ([bd7dc2d](https://github.com/microlinkhq/metascraper/commit/bd7dc2d))
* v3.10.1 ([fe3320c](https://github.com/microlinkhq/metascraper/commit/fe3320c))

## 3.10.0 (2018-04-07)

* Add metascraper-social-video (#79) ([51959cf](https://github.com/microlinkhq/metascraper/commit/51959cf)), closes [#79](https://github.com/microlinkhq/metascraper/issues/79)
* Ensure to concat rules as array ([dff7a6d](https://github.com/microlinkhq/metascraper/commit/dff7a6d))
* Refactor and expose internal method ([ab0a1ac](https://github.com/microlinkhq/metascraper/commit/ab0a1ac))
* Update Changelog ([1a88468](https://github.com/microlinkhq/metascraper/commit/1a88468))
* v3.10.0 ([f8e5ed5](https://github.com/microlinkhq/metascraper/commit/f8e5ed5))

## <small>3.9.3 (2018-03-29)</small>

* Add copy clipboard button ([8ad33bb](https://github.com/microlinkhq/metascraper/commit/8ad33bb))
* Avoid sort url query params ([4fb8095](https://github.com/microlinkhq/metascraper/commit/4fb8095))
* Remove unnecessary code ([bd6e970](https://github.com/microlinkhq/metascraper/commit/bd6e970))
* Update Changelog ([cb89351](https://github.com/microlinkhq/metascraper/commit/cb89351))
* Update index.html ([e392c60](https://github.com/microlinkhq/metascraper/commit/e392c60))
* v3.9.3 ([b3e562d](https://github.com/microlinkhq/metascraper/commit/b3e562d))

## <small>3.9.2 (2018-02-22)</small>

* Call getValue() correctly ([afe0915](https://github.com/microlinkhq/metascraper/commit/afe0915))
* Fix badge ([fd6d2b0](https://github.com/microlinkhq/metascraper/commit/fd6d2b0))
* Fix lint ([c1eb1ef](https://github.com/microlinkhq/metascraper/commit/c1eb1ef))
* Only return first title element value ([da30009](https://github.com/microlinkhq/metascraper/commit/da30009))
* Update Changelog ([672ebef](https://github.com/microlinkhq/metascraper/commit/672ebef))
* Update deps ([327eea8](https://github.com/microlinkhq/metascraper/commit/327eea8))
* v3.9.2 ([a9c94bc](https://github.com/microlinkhq/metascraper/commit/a9c94bc))

## <small>3.9.1 (2018-02-17)</small>

* Fix resolve absolute video URL ([97a8026](https://github.com/microlinkhq/metascraper/commit/97a8026))
* Update Changelog ([96b5d84](https://github.com/microlinkhq/metascraper/commit/96b5d84))
* v3.9.1 ([44a2d29](https://github.com/microlinkhq/metascraper/commit/44a2d29))

## 3.9.0 (2018-02-13)

* Add missing test script ([c594242](https://github.com/microlinkhq/metascraper/commit/c594242))
* Get the highest image size ([63ce77d](https://github.com/microlinkhq/metascraper/commit/63ce77d))
* Omit date from tests ([7511145](https://github.com/microlinkhq/metascraper/commit/7511145))
* Remove unnecessary dependencies ([21f2a1f](https://github.com/microlinkhq/metascraper/commit/21f2a1f))
* Support async logic into rules set ([06fa950](https://github.com/microlinkhq/metascraper/commit/06fa950))
* Update Changelog ([759b538](https://github.com/microlinkhq/metascraper/commit/759b538))
* Update test mock ([a4c6c54](https://github.com/microlinkhq/metascraper/commit/a4c6c54))
* v3.9.0 ([41aa1bc](https://github.com/microlinkhq/metascraper/commit/41aa1bc))

## 3.8.0 (2018-02-11)

* Add metascraper video as default rules set ([d14e1e1](https://github.com/microlinkhq/metascraper/commit/d14e1e1))
* Avoid mutation ([f1d380c](https://github.com/microlinkhq/metascraper/commit/f1d380c))
* Extract .getSuffix method ([34f8565](https://github.com/microlinkhq/metascraper/commit/34f8565))
* Refactor URL helpers ([4869eaf](https://github.com/microlinkhq/metascraper/commit/4869eaf))
* Update Changelog ([3161f79](https://github.com/microlinkhq/metascraper/commit/3161f79))
* v3.8.0 ([dfb6d4a](https://github.com/microlinkhq/metascraper/commit/dfb6d4a))

## <small>3.7.3 (2018-02-08)</small>

* Add metascraper-lang tests ([c5f73bb](https://github.com/microlinkhq/metascraper/commit/c5f73bb))
* Ensure get lang only for amazon urls ([24d5a19](https://github.com/microlinkhq/metascraper/commit/24d5a19))
* Remove unnecessary file ([c2e90ce](https://github.com/microlinkhq/metascraper/commit/c2e90ce))
* Update Changelog ([66a7424](https://github.com/microlinkhq/metascraper/commit/66a7424))
* Update timestamp ([979c538](https://github.com/microlinkhq/metascraper/commit/979c538))
* v3.7.3 ([fe11521](https://github.com/microlinkhq/metascraper/commit/fe11521))

## <small>3.7.2 (2018-02-04)</small>

* Fix get video extension from url ([b98d2db](https://github.com/microlinkhq/metascraper/commit/b98d2db))
* Update Changelog ([fa47e32](https://github.com/microlinkhq/metascraper/commit/fa47e32))
* v3.7.2 ([498a0d5](https://github.com/microlinkhq/metascraper/commit/498a0d5))

## <small>3.7.1 (2018-02-04)</small>

* Ensure video is an absolute video url ([b193dcd](https://github.com/microlinkhq/metascraper/commit/b193dcd))
* Update Changelog ([b3cac2a](https://github.com/microlinkhq/metascraper/commit/b3cac2a))
* v3.7.1 ([c839265](https://github.com/microlinkhq/metascraper/commit/c839265))

## 3.7.0 (2018-02-03)

* Expose load and autoload methods ([327fae4](https://github.com/microlinkhq/metascraper/commit/327fae4))
* Update Changelog ([3951637](https://github.com/microlinkhq/metascraper/commit/3951637))
* Update docs ([b75dc59](https://github.com/microlinkhq/metascraper/commit/b75dc59))
* Update tests ([274cb27](https://github.com/microlinkhq/metascraper/commit/274cb27))
* v3.7.0 ([4c62dce](https://github.com/microlinkhq/metascraper/commit/4c62dce))

## <small>3.6.4 (2018-02-01)</small>

* Update Changelog ([caa6855](https://github.com/microlinkhq/metascraper/commit/caa6855))
* Update get-video-id dependency ([fc0bf94](https://github.com/microlinkhq/metascraper/commit/fc0bf94))
* v3.6.4 ([eed68e0](https://github.com/microlinkhq/metascraper/commit/eed68e0))

## <small>3.6.3 (2018-01-30)</small>

* Update Changelog ([09efd46](https://github.com/microlinkhq/metascraper/commit/09efd46))
* Use src poster value as image ([d2e16c3](https://github.com/microlinkhq/metascraper/commit/d2e16c3))
* v3.6.3 ([53e1461](https://github.com/microlinkhq/metascraper/commit/53e1461))

## <small>3.6.2 (2018-01-28)</small>

* Avoid repeat parsing steps ([566f9d1](https://github.com/microlinkhq/metascraper/commit/566f9d1))
* Update Changelog ([2d1cb53](https://github.com/microlinkhq/metascraper/commit/2d1cb53))
* Update README.md ([56409d1](https://github.com/microlinkhq/metascraper/commit/56409d1))
* v3.6.2 ([2653c7d](https://github.com/microlinkhq/metascraper/commit/2653c7d))
* docs(readme): add Greenkeeper badge ([777f511](https://github.com/microlinkhq/metascraper/commit/777f511))

## <small>3.6.1 (2018-01-23)</small>

* Add og:video test ([1ced9f9](https://github.com/microlinkhq/metascraper/commit/1ced9f9))
* Update Changelog ([011fae2](https://github.com/microlinkhq/metascraper/commit/011fae2))
* v3.6.1 ([d80789e](https://github.com/microlinkhq/metascraper/commit/d80789e))

## 3.6.0 (2018-01-23)

* Add metascraper-video first approach ([79e98c9](https://github.com/microlinkhq/metascraper/commit/79e98c9))
* Check upgrade package dependencies before publish ([5c70cdb](https://github.com/microlinkhq/metascraper/commit/5c70cdb))
* Ensure output is an object ([dbfac33](https://github.com/microlinkhq/metascraper/commit/dbfac33))
* Extract removeBy into titleize helper ([627abfc](https://github.com/microlinkhq/metascraper/commit/627abfc))
* Normalize meta property tag ([df96522](https://github.com/microlinkhq/metascraper/commit/df96522))
* Remove date from snapshot ([818fa90](https://github.com/microlinkhq/metascraper/commit/818fa90))
* Update Changelog ([b5749c3](https://github.com/microlinkhq/metascraper/commit/b5749c3))
* Update deps ([281088f](https://github.com/microlinkhq/metascraper/commit/281088f))
* v3.6.0 ([c28a942](https://github.com/microlinkhq/metascraper/commit/c28a942))

## 3.5.0 (2018-01-23)

* Add METASCRAPER_CWD tests and documentation ([73be24f](https://github.com/microlinkhq/metascraper/commit/73be24f)), closes [#52](https://github.com/microlinkhq/metascraper/issues/52)
* Add metascraper-youtube ([a043f93](https://github.com/microlinkhq/metascraper/commit/a043f93))
* Add missing dep ([31122be](https://github.com/microlinkhq/metascraper/commit/31122be))
* Add YouTube rules package ([4749216](https://github.com/microlinkhq/metascraper/commit/4749216))
* Adjust style ([272c2a3](https://github.com/microlinkhq/metascraper/commit/272c2a3))
* Avoid get first directly, use .getValue helper ([12dd21e](https://github.com/microlinkhq/metascraper/commit/12dd21e))
* Avoid non deterministic date ([3fc6130](https://github.com/microlinkhq/metascraper/commit/3fc6130))
* Docs tweaks ([9dac9f6](https://github.com/microlinkhq/metascraper/commit/9dac9f6))
* Move soundcloud test ([ab03d97](https://github.com/microlinkhq/metascraper/commit/ab03d97))
* Refactor ([a7dea20](https://github.com/microlinkhq/metascraper/commit/a7dea20))
* Remove browser mention ([6cb0d73](https://github.com/microlinkhq/metascraper/commit/6cb0d73))
* Remove unnecessary deps ([ddf4384](https://github.com/microlinkhq/metascraper/commit/ddf4384))
* Update ([d246295](https://github.com/microlinkhq/metascraper/commit/d246295))
* Update README.md ([c8609cd](https://github.com/microlinkhq/metascraper/commit/c8609cd))
* Update scripts ([8b158e0](https://github.com/microlinkhq/metascraper/commit/8b158e0))
* Update testing setup ([ba6253c](https://github.com/microlinkhq/metascraper/commit/ba6253c))
* Update testing setup ([d75c74f](https://github.com/microlinkhq/metascraper/commit/d75c74f))
* Update toc ([853f8d3](https://github.com/microlinkhq/metascraper/commit/853f8d3))
* v3.5.0 ([88a1e6f](https://github.com/microlinkhq/metascraper/commit/88a1e6f))

## <small>3.4.3 (2017-12-31)</small>

* Improve author & description accuracy ([7e14b48](https://github.com/microlinkhq/metascraper/commit/7e14b48))
* Refactor ([447280c](https://github.com/microlinkhq/metascraper/commit/447280c))
* v3.4.3 ([9ca8926](https://github.com/microlinkhq/metascraper/commit/9ca8926))

## <small>3.4.2 (2017-12-30)</small>

* Add `metascraper-lang` as part of defaults rule sets ([5ec9472](https://github.com/microlinkhq/metascraper/commit/5ec9472))
* Add get language from amazon urls ([f6de069](https://github.com/microlinkhq/metascraper/commit/f6de069))
* Update Changelog ([38ce74c](https://github.com/microlinkhq/metascraper/commit/38ce74c))
* v3.4.2 ([df4f572](https://github.com/microlinkhq/metascraper/commit/df4f572))

## <small>3.4.1 (2017-12-29)</small>

* Ensure url is string ([4402622](https://github.com/microlinkhq/metascraper/commit/4402622))
* Update changelog ([ad5efe8](https://github.com/microlinkhq/metascraper/commit/ad5efe8))
* Update README.md ([f875152](https://github.com/microlinkhq/metascraper/commit/f875152))
* v3.4.1 ([d13dfb8](https://github.com/microlinkhq/metascraper/commit/d13dfb8))

## 3.4.0 (2017-12-29)

* Add a.co amazon urls ([eb75363](https://github.com/microlinkhq/metascraper/commit/eb75363))
* Add language property ([656bb97](https://github.com/microlinkhq/metascraper/commit/656bb97)), closes [#45](https://github.com/microlinkhq/metascraper/issues/45)
* Add missing readme ([76201b0](https://github.com/microlinkhq/metascraper/commit/76201b0))
* Avoid non deterministic tests ([d63d5aa](https://github.com/microlinkhq/metascraper/commit/d63d5aa))
* Ensure favicon path is absolute ([266b404](https://github.com/microlinkhq/metascraper/commit/266b404))
* Refactor ([3a412be](https://github.com/microlinkhq/metascraper/commit/3a412be))
* Remove coveralls as dev dependency ([2aab9e7](https://github.com/microlinkhq/metascraper/commit/2aab9e7))
* Tweaks ([2ea632f](https://github.com/microlinkhq/metascraper/commit/2ea632f))
* Update Changelog ([f2bee3d](https://github.com/microlinkhq/metascraper/commit/f2bee3d))
* v3.4.0 ([3f73396](https://github.com/microlinkhq/metascraper/commit/3f73396))

## 3.3.0 (2017-12-20)

* Add indidivual package doc ([253ca09](https://github.com/microlinkhq/metascraper/commit/253ca09))
* Add more tests ([e7143f6](https://github.com/microlinkhq/metascraper/commit/e7143f6))
* Ensure to resolve absolute path ([70b03bb](https://github.com/microlinkhq/metascraper/commit/70b03bb))
* Refactor url helpers ([9da1325](https://github.com/microlinkhq/metascraper/commit/9da1325))
* Regenerate changelog ([9c314e5](https://github.com/microlinkhq/metascraper/commit/9c314e5))
* Resolve closest node_modules folder ([13a5498](https://github.com/microlinkhq/metascraper/commit/13a5498))
* Update package urls ([5ed88e5](https://github.com/microlinkhq/metascraper/commit/5ed88e5))
* Use ~ version ([895a0bd](https://github.com/microlinkhq/metascraper/commit/895a0bd))
* v3.3.0 ([4eabdec](https://github.com/microlinkhq/metascraper/commit/4eabdec))

## 3.2.0 (2017-12-19)

* Add build command ([8a23e81](https://github.com/microlinkhq/metascraper/commit/8a23e81))
* Add clearbit-logo tests ([3e87ec4](https://github.com/microlinkhq/metascraper/commit/3e87ec4))
* Add metascraper amazon ([daa7c11](https://github.com/microlinkhq/metascraper/commit/daa7c11))
* Add missing dep ([03c970a](https://github.com/microlinkhq/metascraper/commit/03c970a))
* Add missing dependency ([eae7d9a](https://github.com/microlinkhq/metascraper/commit/eae7d9a))
* Add npmrc ([6e72266](https://github.com/microlinkhq/metascraper/commit/6e72266))
* Concat specific rules first ([9ecc857](https://github.com/microlinkhq/metascraper/commit/9ecc857))
* Customize selection color ([a336d9a](https://github.com/microlinkhq/metascraper/commit/a336d9a))
* Extract fixed favicon value into separate package ([7a5619f](https://github.com/microlinkhq/metascraper/commit/7a5619f))
* Extract titleize into helpers ([ae3a515](https://github.com/microlinkhq/metascraper/commit/ae3a515))
* Fix badge style ([c17b46d](https://github.com/microlinkhq/metascraper/commit/c17b46d))
* Fix test ([1757ff1](https://github.com/microlinkhq/metascraper/commit/1757ff1))
* Improve docs ([9b00438](https://github.com/microlinkhq/metascraper/commit/9b00438))
* Remove unnecessary badges ([7ab34eb](https://github.com/microlinkhq/metascraper/commit/7ab34eb))
* Resolve package properly ([e61d33f](https://github.com/microlinkhq/metascraper/commit/e61d33f))
* Setup better DX ([2c47bfa](https://github.com/microlinkhq/metascraper/commit/2c47bfa))
* Titleize description without capitalization ([048d398](https://github.com/microlinkhq/metascraper/commit/048d398))
* Tweak doc style ([ffd57f1](https://github.com/microlinkhq/metascraper/commit/ffd57f1))
* Unify changelog ([8f0c23e](https://github.com/microlinkhq/metascraper/commit/8f0c23e))
* Update changelog ([bc9d757](https://github.com/microlinkhq/metascraper/commit/bc9d757))
* Update lint staged hooks ([9ed1812](https://github.com/microlinkhq/metascraper/commit/9ed1812))
* Update plugins directory ([d989c14](https://github.com/microlinkhq/metascraper/commit/d989c14))
* Update test ([2f327d9](https://github.com/microlinkhq/metascraper/commit/2f327d9))
* Update tests snapshot ([93bb754](https://github.com/microlinkhq/metascraper/commit/93bb754))
* v3.2.0 ([7cead99](https://github.com/microlinkhq/metascraper/commit/7cead99))

## 3.1.0 (2017-12-17)

* Add metasraper-soundcloud ([9814253](https://github.com/microlinkhq/metascraper/commit/9814253))
* Add publish script ([b96eb09](https://github.com/microlinkhq/metascraper/commit/b96eb09))
* Add soundcloud example ([1b3aa93](https://github.com/microlinkhq/metascraper/commit/1b3aa93))
* Fix linter ([d1ce9ea](https://github.com/microlinkhq/metascraper/commit/d1ce9ea))
* Improve plugins interface ([563c583](https://github.com/microlinkhq/metascraper/commit/563c583))
* Remove unnecessary test ([7b7d249](https://github.com/microlinkhq/metascraper/commit/7b7d249))
* Remove version from pkg ([9acc123](https://github.com/microlinkhq/metascraper/commit/9acc123))
* Update docs ([03d29e0](https://github.com/microlinkhq/metascraper/commit/03d29e0))
* v3.1.0 ([578ef2a](https://github.com/microlinkhq/metascraper/commit/578ef2a))

## 3.0.0 (2017-12-15)

* Add CNAME ([a5a1b59](https://github.com/microlinkhq/metascraper/commit/a5a1b59))
* Add custom travis install ([5768cbf](https://github.com/microlinkhq/metascraper/commit/5768cbf))
* Add design assets ([2f1a19b](https://github.com/microlinkhq/metascraper/commit/2f1a19b))
* Add documentation site ([2bb6933](https://github.com/microlinkhq/metascraper/commit/2bb6933))
* Add lerna debug into gitignore ([bbf5ea9](https://github.com/microlinkhq/metascraper/commit/bbf5ea9))
* Add metascraper clearbit logo package ([4ab612b](https://github.com/microlinkhq/metascraper/commit/4ab612b))
* Add plugins documentation ([e37a4ee](https://github.com/microlinkhq/metascraper/commit/e37a4ee))
* Add plugins documentation ([6af5082](https://github.com/microlinkhq/metascraper/commit/6af5082))
* Add possibility to load rules from config file ([71b83b3](https://github.com/microlinkhq/metascraper/commit/71b83b3))
* Add support for plugins ([f065096](https://github.com/microlinkhq/metascraper/commit/f065096))
* Be possible specify config cwd ([8b34f50](https://github.com/microlinkhq/metascraper/commit/8b34f50))
* Migrate into monorepo ([1bf8ee6](https://github.com/microlinkhq/metascraper/commit/1bf8ee6))
* Optimize assets ([3ac8a88](https://github.com/microlinkhq/metascraper/commit/3ac8a88))
* Refactor to be more readable ([c85c9b8](https://github.com/microlinkhq/metascraper/commit/c85c9b8))
* Setup travis ([b87bd58](https://github.com/microlinkhq/metascraper/commit/b87bd58))
* Support load config ([329452b](https://github.com/microlinkhq/metascraper/commit/329452b))
* Update TOC ([2edb17c](https://github.com/microlinkhq/metascraper/commit/2edb17c))
* v3.0.0 ([6df48b3](https://github.com/microlinkhq/metascraper/commit/6df48b3))

## 2.0.0 (2017-12-11)

* Add anandtech case ([da392f6](https://github.com/microlinkhq/metascraper/commit/da392f6))
* Add arstechnica case ([0c27159](https://github.com/microlinkhq/metascraper/commit/0c27159))
* Add astier case ([fdebba6](https://github.com/microlinkhq/metascraper/commit/fdebba6))
* Add atlasobscura case ([d2a8f22](https://github.com/microlinkhq/metascraper/commit/d2a8f22))
* Add bbc case ([30f2cff](https://github.com/microlinkhq/metascraper/commit/30f2cff))
* Add bench ([57ddb65](https://github.com/microlinkhq/metascraper/commit/57ddb65))
* Add env for testing ([366eda1](https://github.com/microlinkhq/metascraper/commit/366eda1))
* Add favicon support ([f413a31](https://github.com/microlinkhq/metascraper/commit/f413a31))
* Add github case ([f9cb980](https://github.com/microlinkhq/metascraper/commit/f9cb980))
* Add GitLab conf ([fe3df07](https://github.com/microlinkhq/metascraper/commit/fe3df07))
* Add googleblog case ([bb76141](https://github.com/microlinkhq/metascraper/commit/bb76141))
* Add html sanitization ([818a19b](https://github.com/microlinkhq/metascraper/commit/818a19b))
* Add instagram ([2522915](https://github.com/microlinkhq/metascraper/commit/2522915))
* Add issue template ([8967e15](https://github.com/microlinkhq/metascraper/commit/8967e15))
* Add linkedin company profile ([a103ea4](https://github.com/microlinkhq/metascraper/commit/a103ea4))
* Add logo support ([1ad56ae](https://github.com/microlinkhq/metascraper/commit/1ad56ae))
* Add meta and new docs ([96a5601](https://github.com/microlinkhq/metascraper/commit/96a5601))
* Add missing rules ([26d299b](https://github.com/microlinkhq/metascraper/commit/26d299b))
* Add missing timestamp selector ([aebe5ef](https://github.com/microlinkhq/metascraper/commit/aebe5ef))
* add nytimes case ([194a71a](https://github.com/microlinkhq/metascraper/commit/194a71a))
* Add pikabu test ([4a27d08](https://github.com/microlinkhq/metascraper/commit/4a27d08))
* Add prettier ([d93dd39](https://github.com/microlinkhq/metascraper/commit/d93dd39))
* Add req-all dep ([9da03a5](https://github.com/microlinkhq/metascraper/commit/9da03a5))
* Add smart quotes ([61a4574](https://github.com/microlinkhq/metascraper/commit/61a4574))
* Add the guardian case ([1c9068e](https://github.com/microlinkhq/metascraper/commit/1c9068e))
* Add ToC ([d6d7a6c](https://github.com/microlinkhq/metascraper/commit/d6d7a6c))
* Add twitter case ([cd42526](https://github.com/microlinkhq/metascraper/commit/cd42526))
* Add url and html as required options ([a285914](https://github.com/microlinkhq/metascraper/commit/a285914))
* Add vimeo test ([3e9eff2](https://github.com/microlinkhq/metascraper/commit/3e9eff2))
* Add Wikipedia case ([7c37449](https://github.com/microlinkhq/metascraper/commit/7c37449))
* Add wired case ([fefd105](https://github.com/microlinkhq/metascraper/commit/fefd105))
* Add youtube case ([486a964](https://github.com/microlinkhq/metascraper/commit/486a964))
* Automatize snapshots ([d7a640c](https://github.com/microlinkhq/metascraper/commit/d7a640c))
* clean a tags ([aea5787](https://github.com/microlinkhq/metascraper/commit/aea5787))
* Delete migration script ([108e79c](https://github.com/microlinkhq/metascraper/commit/108e79c))
* Extract url helpers into utils ([efd5694](https://github.com/microlinkhq/metascraper/commit/efd5694))
* Fix author ([65de0ce](https://github.com/microlinkhq/metascraper/commit/65de0ce))
* Fix output date ([6c572f9](https://github.com/microlinkhq/metascraper/commit/6c572f9))
* Fix output dates ([5bf8d93](https://github.com/microlinkhq/metascraper/commit/5bf8d93))
* Fix test ([3b04f96](https://github.com/microlinkhq/metascraper/commit/3b04f96))
* Fix test ([f58cccd](https://github.com/microlinkhq/metascraper/commit/f58cccd))
* Fix test ([6149cde](https://github.com/microlinkhq/metascraper/commit/6149cde))
* Fix test ([7039590](https://github.com/microlinkhq/metascraper/commit/7039590))
* Fix typo ([e2138bd](https://github.com/microlinkhq/metascraper/commit/e2138bd))
* Improve author connector ([a8ae1aa](https://github.com/microlinkhq/metascraper/commit/a8ae1aa))
* Improve docs ([9676b93](https://github.com/microlinkhq/metascraper/commit/9676b93))
* Improve get url value ([5020eb5](https://github.com/microlinkhq/metascraper/commit/5020eb5))
* Improve logo detection ([3040379](https://github.com/microlinkhq/metascraper/commit/3040379))
* Improve logo detection ([64d439a](https://github.com/microlinkhq/metascraper/commit/64d439a))
* Merge favicon into logo ([d2d66fb](https://github.com/microlinkhq/metascraper/commit/d2d66fb))
* Merge props correctly ([32b9610](https://github.com/microlinkhq/metascraper/commit/32b9610))
* Migrate from gitlab to travis ([6e6f70a](https://github.com/microlinkhq/metascraper/commit/6e6f70a))
* Pretty ([1892ea5](https://github.com/microlinkhq/metascraper/commit/1892ea5))
* Publisher refactor ([76bb282](https://github.com/microlinkhq/metascraper/commit/76bb282))
* Refactor ([e9df18f](https://github.com/microlinkhq/metascraper/commit/e9df18f))
* Refactor ([cef0f1e](https://github.com/microlinkhq/metascraper/commit/cef0f1e))
* Refactor ([20eee39](https://github.com/microlinkhq/metascraper/commit/20eee39))
* Refactor author ([760b503](https://github.com/microlinkhq/metascraper/commit/760b503))
* Refactor date ([ae355f3](https://github.com/microlinkhq/metascraper/commit/ae355f3))
* Refactor description ([2d1ae48](https://github.com/microlinkhq/metascraper/commit/2d1ae48))
* Refactor image ([6eb017f](https://github.com/microlinkhq/metascraper/commit/6eb017f))
* Refactor testing ([e120498](https://github.com/microlinkhq/metascraper/commit/e120498))
* Refactor testing scaffold ([31e5d02](https://github.com/microlinkhq/metascraper/commit/31e5d02))
* Refactor url ([2337f70](https://github.com/microlinkhq/metascraper/commit/2337f70))
* Release 2.0.0 ([3a81306](https://github.com/microlinkhq/metascraper/commit/3a81306))
* Remove callback interface ([7a1ef68](https://github.com/microlinkhq/metascraper/commit/7a1ef68))
* Remove debug ([fab5432](https://github.com/microlinkhq/metascraper/commit/fab5432))
* Remove duplicate field ([e3566ff](https://github.com/microlinkhq/metascraper/commit/e3566ff))
* Remove node6 build ([95b9f67](https://github.com/microlinkhq/metascraper/commit/95b9f67))
* Remove non tested lines ([1fcaa50](https://github.com/microlinkhq/metascraper/commit/1fcaa50))
* Remove npmignore ([a24aaa9](https://github.com/microlinkhq/metascraper/commit/a24aaa9))
* Remove unnecessary code ([c19f8ff](https://github.com/microlinkhq/metascraper/commit/c19f8ff))
* Remove whitespaces from title ([b7ea017](https://github.com/microlinkhq/metascraper/commit/b7ea017))
* Rename branding ([a811e7a](https://github.com/microlinkhq/metascraper/commit/a811e7a))
* Rename the-washington-post → washington-post ([9967f1e](https://github.com/microlinkhq/metascraper/commit/9967f1e))
* Setup depdendencies ([40206ca](https://github.com/microlinkhq/metascraper/commit/40206ca))
* Support resolve URL ([dbdba26](https://github.com/microlinkhq/metascraper/commit/dbdba26))
* Support URL ([9bb261d](https://github.com/microlinkhq/metascraper/commit/9bb261d))
* Tweak ([28cf2b9](https://github.com/microlinkhq/metascraper/commit/28cf2b9))
* Tweaks ([1d7ee60](https://github.com/microlinkhq/metascraper/commit/1d7ee60))
* Update ([d509c8a](https://github.com/microlinkhq/metascraper/commit/d509c8a))
* Update dependencies ([dbb54e6](https://github.com/microlinkhq/metascraper/commit/dbb54e6))
* Update deps ([828d908](https://github.com/microlinkhq/metascraper/commit/828d908))
* Update image url ([33d99bf](https://github.com/microlinkhq/metascraper/commit/33d99bf))
* Update license ([84c0588](https://github.com/microlinkhq/metascraper/commit/84c0588))
* Update medium case ([84dbfe5](https://github.com/microlinkhq/metascraper/commit/84dbfe5))
* Update nullable URL's ([cc1d147](https://github.com/microlinkhq/metascraper/commit/cc1d147))
* Update README.md ([e9b8858](https://github.com/microlinkhq/metascraper/commit/e9b8858))
* Use mocha for testing ([07967ca](https://github.com/microlinkhq/metascraper/commit/07967ca))
* WIP ([e3120a2](https://github.com/microlinkhq/metascraper/commit/e3120a2))
* docs(readme): add Greenkeeper badge ([5e92ea7](https://github.com/microlinkhq/metascraper/commit/5e92ea7))


================================================
FILE: CNAME
================================================
metascraper.js.org


================================================
FILE: CONTRIBUTING.md
================================================
# Contributing

## Rules Bundles

A rule bundle is the simplest way for extending **metascraper** functionality.

Rules bundles are a collection of HTML selectors around a determinate property.

## Writing Your Own Rules

### Get value from HTML

Every rule receives `htmlDom` (*cheerio*) and `url` as parameters inside an object:

```js
'use strict'

/**
 * A set of rules we want to declare under `metascraper-logo` namespace.
 *
**/
module.exports = () => {
  const rules = {
    logo: [
      // They receive as parameter:
      // - `htmlDom`: the cheerio HTML instance.
      // - `url`: The input URL used for extracting the content.
      ({ htmlDom: $, url }) => $('meta[property="og:logo"]').attr('content'),
      ({ htmlDom: $, url }) => $('meta[itemprop="logo"]').attr('content')
    ]
  }
  return rules
}
```

You can declare any logic you need in order to determine the output.

A set of rules under the same namespace runs in series and only the value returned by the first rule that outputs a [truthy](https://developer.mozilla.org/en-US/docs/Glossary/Falsy) value will be taken. So remember, the order is important!.

### Defining `test` function

You can associate a `test` function with your rule bundle:

```js
rules.test = ({ url }) => getVideoInfo(url).service === 'youtube'
```

The `test` function will receive the same arguments as a rule. This is useful for skipping all rules that doesn't target a specific URL.

A good practice is to use a memoize function to prevent unnecessary CPU cycles for a previously computed value:

```js
const { memoizeOne } = require('@metascraper/helpers')

const test = memoizeOne(url => getVideoInfo(url).service === 'youtube')

const rules = []
rules.test = ({ url }) => test(url)
```

### Defining `pkgName` property

Additionally you can define `pkgName` property associated with your rules:

```js
const { memoizeOne } = require('@metascraper/helpers')

const rules = []
rules.pkgName = 'metascraper-module'
```

This is using for printing debug logs, see debugging section to know how to use it.

## Debugging your Rules

In case you need to see what's happening under the hood, you can set `DEBUG='metascraper*'.

This is useful for verifying rule precedence and detecting slow rules.

## Testing your Rules

Since the order of the rules is important, testing it is also an important thing in order to be sure more popular rules are executed first over less popular rules.

### Writing Unitary Test

Just write some HTML markup and as many tests as you need in order to determine the rules are sorted correctly:

```js
/* test/unit/index.js */
const should = require('should')
const metascraper = require('metascraper')([
  // loading our rules!
  require('metascraper-logo')()
])

describe('metascraper-logo', () => {
  it('creates an absolute favicon url if the logo is not present', async () => {
    const html = `
    <!DOCTYPE html>
    <html lang="en">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <meta http-equiv="X-UA-Compatible" content="ie=edge">
      <title>My Test Html</title>
      <meta property="og:logo" content="open graph value">
      <meta itemprop="logo" content="itemprop value">
    </head>
    <body>
    </body>
    </html>
    `
    const meta = await metascraper({ html, url })
    should(meta.log).be.equal('open graph value')
  })
})
```

### Writing Integration Tests

Although unit tests are a good start, the rules need to be evaluated in a real environment to demonstrate their effectiveness.

To do that, first you need to get some production HTML markup.

You can do that easily using [html-microservice](https://microlink-html.herokuapp.com/).

It is just a tiny microservice for getting the HTML of any file.

You can save the result into a file:

```
curl https://microlink-html.herokuapp.com/https://metascraper.js.org > index.html
```

Then use the file as html in your tests:

```js
/* test/integration/index.js */
const should = require('should')
const fs = require('fs')

const metascraper = require('metascraper')([
  // loading our rules!
  require('metascraper-logo')()
])

describe('metascraper-logo', () => {
  it('it resolves logo value', async () => {
    const html = fs.readFileSync('index.html', 'utf-8')
    const meta = await metascraper({ html, url })
    should(meta.logo).be.equal('https://metascraper.js.org/static/logo.png')
  })
})
```


================================================
FILE: LICENSE.md
================================================
The MIT License (MIT)

Copyright © 2019 Microlink <hello@microlink.io> (microlink.io)

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.


================================================
FILE: README.md
================================================
<div align="center">
  <a href="https://metascraper.js.org">
    <img style="width: 500px; margin:3rem 0 1.5rem;" src="https://metascraper.js.org/static/logo-banner.png" alt="metascraper">
  </a>
  <br><br>
  <a href="https://microlink.io"><img src="https://img.shields.io/badge/powered_by-microlink.io-blue?style=flat-square&color=%23EA407B" alt="Powered by microlink.io"></a>
  <img alt="Last version" src="https://img.shields.io/github/tag/microlinkhq/metascraper.svg?style=flat-square">
  <a href="https://coveralls.io/github/microlinkhq/metascraper"><img alt="Coverage Status" src="https://img.shields.io/coveralls/microlinkhq/metascraper.svg?style=flat-square"></a>
  <a href="https://www.npmjs.org/package/metascraper"><img alt="NPM Status" src="https://img.shields.io/npm/dm/metascraper.svg?style=flat-square"></a>
  <br><br>
</div>

> A library to easily extract unified metadata from websites using Open Graph, Microdata, RDFa, Twitter Cards, JSON-LD, HTML, and more.

- [What is it](#what-is-it)
- [Getting started](#getting-started)
- [What data it detects](#what-data-it-detects)
- [The cloud API solution](#the-cloud-api-solution)
- [How it works](#how-it-works)
- [Importing rules](#importing-rules)
- [Rules bundles](#rules-bundles)
  - [Official](#official)
  - [Community](#community)
- [API](#api)
  - [constructor(rules)](#constructorrules)
    - [rules](#rules)
  - [metascraper(options)](#metascraperoptions)
    - [options](#options)
    - [html](#html)
    - [htmlDom](#htmldom)
    - [omitPropNames](#omitpropnames)
    - [pickPropNames](#pickpropnames)
    - [rules](#rules-1)
    - [url](#url)
    - [validateUrl](#validateurl)
- [Environment Variables](#environment-variables)
    - [METASCRAPER\_RE2](#metascraper_re2)
- [Benchmark](#benchmark)
- [License](#license)

---

## What is it

The **metascraper** library allows you to easily scrape metadata from an article on the web using Open Graph metadata, regular HTML metadata, and a series of fallbacks.

It follows a few principles:

- Ensure a high accuracy for online articles by default.
- Make it simple to add new rules or override existing ones.
- Don't restrict rules to CSS selectors or text accessors.

## Getting started

Below is a real example of extracting metadata from a live website. The same logic shown here is running online and can be tested directly at [microlink.io/meta](https://microlink.io/meta):

<div align="center">
  <a href="https://microlink.io/meta" target="_blank" rel="noopener">
    <img align="center" src="/static/demo1.jpeg" style="margin-top: 1rem; margin-bottom: 1.5rem;">
  </a>
  <br><br>
</div>

**metascraper** requires two inputs: The target URL and the HTML markup behind that URL.

There are multiple ways to retrieve the HTML markup, but it needs to be as accurate as possible.

For that reason, we developed [html-get](https://github.com/microlinkhq/html-get), which uses a headless browser to retrieve HTML in a way that works seamlessly with metascraper.


```js
const getHTML = require('html-get')

/**
 * `browserless` will be passed to `html-get`
 * as driver for getting the rendered HTML.
 */
const browserless = require('browserless')()

const getContent = async url => {
  // create a browser context inside the main Chromium process
  const browserContext = browserless.createContext()
  const promise = getHTML(url, { getBrowserless: () => browserContext })
  // close browser resources before return the result
  promise.then(() => browserContext).then(browser => browser.destroyContext())
  return promise
}

/**
 * `metascraper` is a collection of tiny packages,
 * so you can just use what you actually need.
 */
const metascraper = require('metascraper')([
  require('metascraper-author')(),
  require('metascraper-date')(),
  require('metascraper-description')(),
  require('metascraper-image')(),
  require('metascraper-logo')(),
  require('metascraper-publisher')(),
  require('metascraper-title')(),
  require('metascraper-url')()
])

/**
 * The main logic
 */
getContent('https://microlink.io')
  .then(metascraper)
  .then(metadata => console.log(metadata))
  .then(browserless.close)
  .then(process.exit)
```

The output will be something like:

```json
{
  "author": "Microlink HQ",
  "date": "2022-07-10T22:53:04.856Z",
  "description": "Enter a URL, receive information. Normalize metadata. Get HTML markup. Take a screenshot. Identify tech stack. Generate a PDF. Automate web scraping. Run Lighthouse",
  "image": "https://cdn.microlink.io/logo/banner.jpeg",
  "logo": "https://cdn.microlink.io/logo/logo.png",
  "publisher": "Microlink",
  "title": "Turns websites into data — Microlink",
  "url": "https://microlink.io/"
}
```

## What data it detects

> **Note**: Custom metadata detection can be defined using a [rule bundle](#rules-bundles).

Here is an example of the metadata that **metascraper** can detect:

- `audio` — e.g. <small>*ht<span>tps://cf-media.sndcdn.com/U78RIfDPV6ok.128.mp3*</small><br/>
A audio URL that best represents the article.

- `author` — e.g. <small>*Noah Kulwin*</small><br/>
  A human-readable representation of the author's name.

- `date` — e.g. <small>*2016-05-27T00:00:00.000Z*</small><br/>
  An [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) representation of the date the article was published.

- `description` — e.g. <small>*Venture capitalists are raising money at the fastest rate...*</small><br/>
  The publisher's chosen description of the article.

- `video` — e.g. <small>*ht<span>tps://assets.entrepreneur.com/content/preview.mp4*</small><br/>
  A video URL that best represents the article.

- `image` — e.g. <small>*ht<span>tps://assets.entrepreneur.com/content/3x2/1300/20160504155601-GettyImages-174457162.jpeg*</small><br/>
  An image URL that best represents the article.

- `lang` — e.g. <small>*en*</small><br/>
  An [ISO 639-1](https://en.wikipedia.org/wiki/ISO_639-1) representation of the url content language.

- `logo` — e.g. <small>*ht<span>tps://entrepreneur.com/favicon180x180.png*</small><br/>
  An image URL that best represents the publisher brand.

- `publisher` — e.g. <small>*Fast Company*</small><br/>
  A human-readable representation of the publisher's name.

- `title` — e.g. <small>*Meet Wall Street's New A.I. Sheriffs*</small><br/>
  The publisher's chosen title of the article.

- `url` — e.g. <small>*ht<span>tp://motherboard.vice.com/read/google-wins-trial-against-oracle-saves-9-billion*</small><br/>
  The URL of the article.

## The cloud API solution

Running this at scale means operating headless browsers, proxies, and antibot workarounds.

If you don’t want to manage that infrastructure, you can use the fully managed
[Microlink API](https://microlink.io/docs/api/getting-started/overview).

It automatically handles proxy rotation, paywalls, bot detection, and restricted platforms such as major social networks, while scaling on demand.

Pricing is pay-as-you-go and [starts for free](https://microlink.io/#pricing).


## How it works

**metascraper** is built out of rules bundles.

It is designed to be extensible. You can compose your own transformation pipeline using existing rules or create your own.

Rule bundles are collections of HTML selectors targeting a specific property. When you load the library, it implicitly loads the [core rules](#core-rules).

Each set of rules loads a set of selectors to extract a specific value.

Rules are ordered by priority. The first rule to successfully resolve the value stops the process. The order goes from most specific to most generic.

Rules work as fallbacks for one another:

- If the first rule fails, then it falls back on the second rule.
- If the second rule fails, it is time for the third rule.
- Etc.

**metascraper** does this until it finishes all the rules or finds the first rule that resolves the value.

## Importing rules

**metascraper** exports a constructor that need to be initialized providing a collection of rules to load:

```js
const metascraper = require('metascraper')([
  require('metascraper-author')(),
  require('metascraper-date')(),
  require('metascraper-description')(),
  require('metascraper-image')(),
  require('metascraper-logo')(),
  require('metascraper-publisher')(),
  require('metascraper-title')(),
  require('metascraper-url')()
])
```

Again, the order of rules are loaded are important: Just the first rule that resolve the value will be applied.

Use the first parameter to pass custom options specific per each rules bundle:

```js
const metascraper = require('metascraper')([
  require('metascraper-logo')({
    filter: url => url.endsWith('.png')
  })
])
```

## Rules bundles

?> Can't find the rules bundle that you want? Let's [open an issue](https://github.com/microlinkhq/metascraper/issues/new) to create it.

### Official

> Rules bundles maintained by metascraper maintainers.

**Core essential**

- [metascraper-audio](https://github.com/microlinkhq/metascraper/tree/master/packages/metascraper-audio) – Get audio property from HTML markup.
- [metascraper-author](https://github.com/microlinkhq/metascraper/tree/master/packages/metascraper-author) – Get author property from HTML markup.
- [metascraper-date](https://github.com/microlinkhq/metascraper/tree/master/packages/metascraper-date) – Get date property from HTML markup.
- [metascraper-defuddle](https://github.com/microlinkhq/metascraper/tree/master/packages/metascraper-defuddle) – A Defuddle connector for metascraper.
- [metascraper-description](https://github.com/microlinkhq/metascraper/tree/master/packages/metascraper-description) – Get description property from HTML markup.
- [metascraper-feed](https://github.com/microlinkhq/metascraper/tree/master/packages/metascraper-feed) – Get RSS/Atom feed URL from HTML markup.
- [metascraper-feeds](https://github.com/microlinkhq/metascraper/tree/master/packages/metascraper-feeds) – Extract feed links (RSS/Atom/JSON) from HTML markup.
- [metascraper-helpers](https://github.com/microlinkhq/metascraper/tree/master/packages/metascraper-helpers) – Common utility helpers for rule creation.
- [metascraper-iframe](https://github.com/microlinkhq/metascraper/tree/master/packages/metascraper-iframe) – Get iframe for embedding content for the supported providers.
- [metascraper-image](https://github.com/microlinkhq/metascraper/tree/master/packages/metascraper-image) – Get image property from HTML markup.
- [metascraper-lang](https://github.com/microlinkhq/metascraper/tree/master/packages/metascraper-lang) – Get lang property from HTML markup.
- [metascraper-logo-favicon](https://github.com/microlinkhq/metascraper/tree/master/packages/metascraper-logo-favicon) – Metascraper logo favicon fallback.
- [metascraper-logo](https://github.com/microlinkhq/metascraper/tree/master/packages/metascraper-logo) – Get logo property from HTML markup.
- [metascraper-manifest](https://github.com/microlinkhq/metascraper/tree/master/packages/metascraper-manifest) –  Metascraper integration for detecting PWA Web app [manifests](https://developer.mozilla.org/en-US/docs/Web/Manifest).
- [metascraper-media-provider](https://github.com/microlinkhq/metascraper/tree/master/packages/metascraper-media-provider) – Get specific video provider url (Facebook/Twitter/Vimeo/etc).
- [metascraper-publisher](https://github.com/microlinkhq/metascraper/tree/master/packages/metascraper-publisher) – Get publisher property from HTML markup.
- [metascraper-readability](https://github.com/microlinkhq/metascraper/tree/master/packages/metascraper-readability) – A Mozilla readability connector for metascraper.
- [metascraper-title](https://github.com/microlinkhq/metascraper/tree/master/packages/metascraper-title) – Get title property from HTML markup.
- [metascraper-url](https://github.com/microlinkhq/metascraper/tree/master/packages/metascraper-url) – Get url property from HTML markup.
- [metascraper-video](https://github.com/microlinkhq/metascraper/tree/master/packages/metascraper-video) – Get video property from HTML markup.

**Vendor specific**

- [metascraper-amazon](https://github.com/microlinkhq/metascraper/tree/master/packages/metascraper-amazon) – Metascraper integration for Amazon.
- [metascraper-bluesky](https://github.com/microlinkhq/metascraper/tree/master/packages/metascraper-bluesky) – Metascraper integration for Bluesky.
- [metascraper-dribbble](https://github.com/microlinkhq/metascraper/tree/master/packages/metascraper-dribbble) – Metascraper integration for Dribble.
- [metascraper-instagram](https://github.com/microlinkhq/metascraper/tree/master/packages/metascraper-instagram) – Metascraper integration for Instagram.
- [metascraper-reddit](https://github.com/microlinkhq/metascraper/tree/master/packages/metascraper-reddit) – Metascraper integration for Reddit.
- [metascraper-soundcloud](https://github.com/microlinkhq/metascraper/tree/master/packages/metascraper-soundcloud) – Metascraper integration for SoundCloud.
- [metascraper-spotify](https://github.com/microlinkhq/metascraper/tree/master/packages/metascraper-spotify) – Metascraper integration for Spotify.
- [metascraper-telegram](https://github.com/microlinkhq/metascraper/tree/master/packages/metascraper-telegram) – Metascraper integration for Telegram.
- [metascraper-tiktok](https://github.com/microlinkhq/metascraper/tree/master/packages/metascraper-tiktok) – Metascraper integration for TikTok.
- [metascraper-uol](https://github.com/microlinkhq/metascraper/tree/master/packages/metascraper-uol) – Metascraper integration for UOL URLs.
- [metascraper-x](https://github.com/microlinkhq/metascraper/tree/master/packages/metascraper-x) – Metascraper integration for X (formerly Twitter)
- [metascraper-youtube](https://github.com/microlinkhq/metascraper/tree/master/packages/metascraper-youtube) – Metascraper integration for YouTube.


### Community

> Rules bundles maintained by individual users.

- [metascraper-address](https://github.com/goodhood-eu/metascraper-address) – Get schema.org formatted address.
- [metascraper-shopping](https://github.com/samirrayani/metascraper-shopping) – Get product information from HTML markup on merchant websites.

See [CONTRIBUTING](/CONTRIBUTING.md) to add your own module!

## API

### constructor(rules)

Create a new **metascraper** instance declaring the rules bundle to be used explicitly.

#### rules

Type: `Array`

The collection of rules bundle to be loaded.

### metascraper(options)

Call the instance for extracting content based on rules bundle provided at the constructor.

#### options

#### html

Type: `String`

The HTML markup for extracting the content.

#### htmlDom

Type: `object`

The DOM representation of the HTML markup. When it's not provided, it's get from the `html` parameter.

#### omitPropNames

Type: `Set`<br>
Default: `[]`

A set of property names that should be omitted. When specified, these properties will be missing in the returned metadata objects, and rules related to that will not be computed.

#### pickPropNames

Type: `Set`<br>
Default: `undefined`

A set of property names to pick for the metadata extraction process. When specified, only rules for these properties will be executed, and all other properties will be omitted. Takes precedence over `omitPropNames` when both are specified.

#### rules

Type: `Array`

You can pass additional rules to add on execution time.

These rules will be merged with your loaded [rules](#rules) at the beginning.

#### url

*Required*<br>
Type: `String`

The URL associated with the HTML markup.

It is used for resolve relative links that can be present in the HTML markup.

it can be used as fallback field for different rules as well.

#### validateUrl

Type: `boolean`<br>
Default: `true`

Ensure the URL provided is validated as a [WHATWG URL](https://nodejs.org/api/url.html#url_the_whatwg_url_api) API compliant.

```js
const metascraper = require('metascraper')([
  require('metascraper-title')(),
  require('metascraper-image')(),
  require('metascraper-description')()
])

const html = '<title>Example</title><meta property="og:image" content="image.jpg">'
const url = 'https://example.com'

// Omit the image property
const omitPropNames = new Set(['image'])
const metadata = await metascraper({ url, html, omitPropNames })

console.log(metadata)
// Output: { title: 'Example', image: null, description: null }
```

## Environment Variables

#### METASCRAPER_RE2

Type: `boolean`<br>
Default: `true`

It attemptt to load re2 to use instead of RegExp.

## Benchmark

To demonstrate **metascraper**'s exceptional accuracy, here is how it outperforms similar libraries:

| Library   | [metascraper](https://www.npmjs.com/package/metascraper) | [html-metadata](https://www.npmjs.com/package/html-metadata) | [node-metainspector](https://www.npmjs.com/package/node-metainspector) | [open-graph-scraper](https://www.npmjs.com/package/open-graph-scraper) | [unfluff](https://www.npmjs.com/package/unfluff) |
| :-------- | :------------------------------------------------------- | :----------------------------------------------------------- | :--------------------------------------------------------------------- | :--------------------------------------------------------------------- | :----------------------------------------------- |
| Correct   | **95.54%**                                               | **74.56%**                                                   | **61.16%**                                                             | **66.52%**                                                             | **70.90%**                                       |
| Incorrect | 1.79%                                                    | 1.79%                                                        | 0.89%                                                                  | 6.70%                                                                  | 10.27%                                           |
| Missed    | 2.68%                                                    | 23.67%                                                       | 37.95%                                                                 | 26.34%                                                                 | 8.95%                                            |

A big part of the reason for **metascraper**'s higher accuracy is that it relies on a series of fallbacks for each piece of metadata, instead of just looking for the most commonly-used, spec-compliant pieces of metadata, like Open Graph.

**metascraper**'s default settings are targetted specifically at parsing online articles, which is why it's able to be more highly-tuned than the other libraries for that purpose.

If you're interested in the breakdown by individual pieces of metadata, check out the [full comparison summary](/bench), or dive into the [raw result data for each library](/bench/results).

## License

**metascraper** © [Microlink](https://microlink.io), released under the [MIT](https://github.com/microlinkhq/metascraper/blob/master/LICENSE.md) License.<br>
Authored and maintained by [Microlink](https://microlink.io) with help from [contributors](https://github.com/microlinkhq/metascraper/contributors).

> [microlink.io](https://microlink.io) · GitHub [microlinkhq](https://github.com/microlinkhq) · X [@microlinkhq](https://x.com/microlinkhq)


================================================
FILE: benchmark/README.md
================================================

# Comparison

To give you an idea of how accurate **Metascraper** is, here is a comparison of similar libraries:

| Library   | `metascraper` | `html-metadata` | `node-metainspector` | `open-graph-scraper` | `unfluff`   |
| :-------- | :------------ | :-------------- | :------------------- | :------------------- | :---------- |
| Correct   | **95.54%**    | **74.56%**      | **61.16%**           | **66.52%**           | **70.90%**  |
| Incorrect | 1.79%         | 1.79%           | 0.89%                | 6.70%                | 10.27%      |
| Missed    | 2.68%         | 23.67%          | 37.95%               | 26.34%               | 8.95%       |

A big part of the reason for **Metascraper**'s higher accuracy is that it relies on a series of fallbacks for each piece of metadata, instead of just looking for the most commonly-used, spec-compliant pieces of metadata, like Open Graph. However, **Metascraper** is specifically targetted at parsing article information, which is why it's able to be more highly-tuned than the other libraries for that purpose.

_Note: this comparison was run against [32 sites](/support/comparison/urls.js) and last updated on June 1, 2016. If you're interested, you can check out the [full results for each library](/support/comparison/results)._

And here is the accuracy of each individual piece of metadata:

###### `author`

| Library   | `metascraper` | `html-metadata` | `node-metainspector` | `open-graph-scraper` | `unfluff`   |
| :-------- | :------------ | :-------------- | :------------------- | :------------------- | :---------- |
| Correct   | **87.50%**    | **31.25%**      | **31.25%**           | **0.00%**            | **34.38%**  |
| Incorrect | 9.38%         | 3.13%           | 3.13%                | 31.25%               | 50.00%      |
| Missed    | 3.13%         | 65.63%          | 65.63%               | 68.75%               | 15.63%      |

_An `author` is incorrect if it's not in the format of `First Last`, or has extra junk information in the string._

###### `date`

| Library   | `metascraper` | `html-metadata` | `node-metainspector` | `open-graph-scraper` | `unfluff`   |
| :-------- | :------------ | :-------------- | :------------------- | :------------------- | :---------- |
| Correct   | **87.50%**    | **21.86%**      | **0.00%**            | **0.00%**            | **59.38%**  |
| Incorrect | 0.00%         | 3.13%           | 0.00%                | 0.00%                | 18.75%      |
| Missed    | 12.50%        | 75.00%          | 100.00%              | 100.00%              | 15.63%      |

_A `date` is correct if it's the correct date, regardless of time. A `date` is incorrect if it's not in the [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format._

###### `description`

| Library   | `metascraper` | `html-metadata` | `node-metainspector` | `open-graph-scraper` | `unfluff`   |
| :-------- | :------------ | :-------------- | :------------------- | :------------------- | :---------- |
| Correct   | **96.88%**    | **90.63%**      | **96.88%**           | **93.75%**           | **90.63%**  |
| Incorrect | 3.13%         | 3.13%           | 3.13%                | 3.13%                | 3.13%       |
| Missed    | 0.00%         | 6.25%           | 0.00%                | 3.13%                | 6.25%       |

_A `description` is correct if it's either the description the publisher chose, or the first paragraph of the article._

###### `image`

| Library   | `metascraper` | `html-metadata` | `node-metainspector` | `open-graph-scraper` | `unfluff`   |
| :-------- | :------------ | :-------------- | :------------------- | :------------------- | :---------- |
| Correct   | **100.00%**   | **100.00%**     | **100.00%**          | **100.00%**          | **100.00%** |
| Incorrect | 0.00%         | 0.00%           | 0.00%                | 0.00%                | 0.00%       |
| Missed    | 0.00%         | 0.00%           | 0.00%                | 0.00%                | 0.00%       |

_An `image` is correct if it's either the image the publisher chose, or the first image on the page._

###### `publisher`

| Library   | `metascraper` | `html-metadata` | `node-metainspector` | `open-graph-scraper` | `unfluff`   |
| :-------- | :------------ | :-------------- | :------------------- | :------------------- | :---------- |
| Correct   | **96.88%**    | **81.25%**      | **0.00%**            | **78.13%**           | **81.25%**  |
| Incorrect | 0.00%         | 0.00%           | 0.00%                | 12.50%               | 0.00%       |
| Missed    | 3.13%         | 18.75%          | 100.00%              | 6.25%                | 18.75%      |

_A `publisher` is correct if it's the publisher's proper name, or the publisher's domain name._

###### `title`

| Library   | `metascraper` | `html-metadata` | `node-metainspector` | `open-graph-scraper` | `unfluff`   |
| :-------- | :------------ | :-------------- | :------------------- | :------------------- | :---------- |
| Correct   | **100.00%**   | **100.00%**     | **100.00%**          | **100.00%**          | **100.00%** |
| Incorrect | 0.00%         | 0.00%           | 0.00%                | 0.00%                | 0.00%       |
| Missed    | 0.00%         | 0.00%           | 0.00%                | 0.00%                | 0.00%       |

_A `title` is correct if it's the title of the article, or the title of the page._

###### `url`

| Library   | `metascraper` | `html-metadata` | `node-metainspector` | `open-graph-scraper` | `unfluff`   |
| :-------- | :------------ | :-------------- | :------------------- | :------------------- | :---------- |
| Correct   | **100.00%**   | **96.88%**      | **100.00%**          | **93.75%**           | **93.75%**  |
| Incorrect | 0.00%         | 3.13%           | 0.00%                | 0.00%                | 0.00%       |
| Missed    | 0.00%         | 0.00%           | 0.00%                | 6.25%                | 6.25%       |

_A `url` is correct if it resolves back to the original article._



================================================
FILE: benchmark/accuracy-readability-vs-defuddle.js
================================================
'use strict'

const fs = require('fs')
const path = require('path')

const metascraper = require('../packages/metascraper/src')

const INTEGRATION_DIR = path.resolve(
  __dirname,
  '../packages/metascraper/test/integration'
)

const BASE_FIELDS = [
  'author',
  'date',
  'description',
  'audio',
  'video',
  'image',
  'lang',
  'logo',
  'manifest',
  'publisher',
  'title',
  'url'
]

const ALL_FIELDS = [...BASE_FIELDS]

const isFilled = value => value !== null && value !== undefined && value !== ''

const normalizeValue = value => {
  if (value === undefined) return null
  if (Array.isArray(value)) return value
  if (value && typeof value === 'object') {
    return JSON.parse(JSON.stringify(value))
  }
  return value
}

const valueEquals = (a, b) => JSON.stringify(a) === JSON.stringify(b)

const formatDuration = milliseconds => {
  if (milliseconds < 1000) return `${milliseconds}ms`
  return `${(milliseconds / 1000).toFixed(2)}s`
}

const formatValue = value => {
  const normalized = normalizeValue(value)
  if (typeof normalized === 'string') {
    const truncated =
      normalized.length <= 180 ? normalized : `${normalized.slice(0, 177)}...`
    return JSON.stringify(truncated)
  }

  const serialized = JSON.stringify(normalized)
  if (serialized.length <= 180) return serialized
  return `${serialized.slice(0, 177)}...`
}

const getMetascraper = bundleName =>
  metascraper([
    require('metascraper-author')(),
    require('metascraper-date')(),
    require('metascraper-description')(),
    require('metascraper-audio')(),
    require('metascraper-video')(),
    require('metascraper-image')(),
    require('metascraper-lang')(),
    require('metascraper-logo')(),
    require('metascraper-logo-favicon')(),
    require('metascraper-manifest')(),
    require('metascraper-publisher')(),
    require('metascraper-title')(),
    require('metascraper-url')(),
    require(bundleName)()
  ])

const extractTopLevelUrl = source => {
  const match = source.match(/const\s+url\s*=\s*(['"])(.*?)\1/)
  return match ? match[2] : null
}

const extractCases = (source, integrationName) => {
  const cases = []
  const topLevelUrl = extractTopLevelUrl(source)

  const urls = []
  const urlRegex = /const\s+url\s*=\s*(['"])(.*?)\1/g
  let urlMatch
  while ((urlMatch = urlRegex.exec(source)) !== null) {
    urls.push({ index: urlMatch.index, value: urlMatch[2] })
  }

  const tests = []
  const testRegex = /test\((['"])(.*?)\1\s*,/g
  let testMatch
  while ((testMatch = testRegex.exec(source)) !== null) {
    tests.push({ index: testMatch.index, value: testMatch[2] })
  }

  const readFileRegex = /readFile\(resolve\(__dirname,\s*(['"])(.*?)\1\)\)/g
  let fileMatch
  while ((fileMatch = readFileRegex.exec(source)) !== null) {
    const inputPath = fileMatch[2]
    const readIndex = fileMatch.index

    const nearestUrl = [...urls]
      .reverse()
      .find(candidate => candidate.index < readIndex)
    const nearestTest = [...tests]
      .reverse()
      .find(candidate => candidate.index < readIndex)

    const url = nearestUrl ? nearestUrl.value : topLevelUrl
    if (!url) continue

    cases.push({
      suite: integrationName,
      testName: nearestTest ? nearestTest.value : integrationName,
      inputPath,
      url
    })
  }

  return cases
}

const discoverCases = () => {
  const dirs = fs
    .readdirSync(INTEGRATION_DIR, { withFileTypes: true })
    .filter(entry => entry.isDirectory())
    .map(entry => entry.name)
    .sort()

  const cases = []

  dirs.forEach(dir => {
    const indexPath = path.resolve(INTEGRATION_DIR, dir, 'index.js')
    if (!fs.existsSync(indexPath)) return

    const source = fs.readFileSync(indexPath, 'utf8')
    const extracted = extractCases(source, dir)
    extracted.forEach(testCase => {
      const htmlPath = path.resolve(INTEGRATION_DIR, dir, testCase.inputPath)
      if (!fs.existsSync(htmlPath)) return
      cases.push({ ...testCase, htmlPath })
    })
  })

  return cases
}

const getFieldDiff = ({ readability, defuddle }) => {
  const fields = {}
  const differentFields = []

  ALL_FIELDS.forEach(field => {
    const a = normalizeValue(readability[field])
    const b = normalizeValue(defuddle[field])

    const equal = valueEquals(a, b)
    const readabilityFilled = isFilled(a)
    const defuddleFilled = isFilled(b)

    fields[field] = {
      equal,
      readability: a,
      defuddle: b,
      readabilityFilled,
      defuddleFilled
    }

    if (!equal) differentFields.push(field)
  })

  return {
    differentFields,
    fields
  }
}

const computeSummary = rows => {
  const summary = {
    totalCases: rows.length,
    casesWithDifferences: 0,
    casesEqual: 0,
    perField: {},
    completeness: {
      readability: { totalFilled: 0 },
      defuddle: { totalFilled: 0 }
    }
  }

  ALL_FIELDS.forEach(field => {
    summary.perField[field] = {
      different: 0,
      readabilityOnlyFilled: 0,
      defuddleOnlyFilled: 0,
      bothFilled: 0,
      bothEmpty: 0,
      equal: 0
    }
  })

  rows.forEach(row => {
    if (row.differentFields.length > 0) {
      summary.casesWithDifferences++
    } else {
      summary.casesEqual++
    }

    ALL_FIELDS.forEach(field => {
      const stats = summary.perField[field]
      const diff = row.fields[field]

      if (!diff.equal) stats.different++
      else stats.equal++

      if (diff.readabilityFilled && diff.defuddleFilled) stats.bothFilled++
      else if (!diff.readabilityFilled && !diff.defuddleFilled) {
        stats.bothEmpty++
      } else if (diff.readabilityFilled) stats.readabilityOnlyFilled++
      else if (diff.defuddleFilled) stats.defuddleOnlyFilled++

      if (diff.readabilityFilled) summary.completeness.readability.totalFilled++
      if (diff.defuddleFilled) summary.completeness.defuddle.totalFilled++
    })
  })

  return summary
}

const printSummary = ({ summary, rows }) => {
  const topDiffs = [...rows]
    .sort((a, b) => b.differentFields.length - a.differentFields.length)
    .slice(0, 10)

  console.log(
    'Accuracy benchmark: metascraper-readability vs metascraper-defuddle'
  )
  console.log(`Cases: ${summary.totalCases}`)
  console.log(
    `Cases with differences: ${summary.casesWithDifferences} | Equal cases: ${summary.casesEqual}`
  )
  console.log(
    `Filled values (all fields): readability=${summary.completeness.readability.totalFilled} | defuddle=${summary.completeness.defuddle.totalFilled}`
  )
  console.log('')

  console.log('Top differing cases:')
  topDiffs.forEach(row => {
    if (row.differentFields.length === 0) return
    console.log(
      `- ${row.suite}/${row.testName}: ${
        row.differentFields.length
      } fields differ (${row.differentFields.join(', ')})`
    )
  })
}

const printCaseDifferences = ({ differentFields, fields }) => {
  if (differentFields.length === 0) {
    console.log('  -> no field differences')
    return
  }

  console.log(`  -> differences in ${differentFields.length} fields`)

  differentFields.forEach(field => {
    const diff = fields[field]
    console.log(`     ${field}`)
    console.log(`       readability: ${formatValue(diff.readability)}`)
    console.log(`       defuddle: ${formatValue(diff.defuddle)}`)
  })
}

const main = async () => {
  const start = Date.now()
  const readability = getMetascraper('metascraper-readability')
  const defuddle = getMetascraper('metascraper-defuddle')
  const cases = discoverCases()
  const totalCases = cases.length

  const rows = []

  console.log(
    `Running accuracy benchmark over ${totalCases} integration cases...`
  )

  if (totalCases === 0) {
    console.log('No integration cases were discovered. Exiting early.')
    return
  }

  for (const [index, testCase] of cases.entries()) {
    const position = index + 1
    const caseStart = Date.now()
    console.log(
      `[${position}/${totalCases}] ${testCase.suite}/${testCase.testName}`
    )

    const html = fs.readFileSync(testCase.htmlPath)

    const readabilityMetadata = await readability({ html, url: testCase.url })
    const defuddleMetadata = await defuddle({ html, url: testCase.url })

    const { differentFields, fields } = getFieldDiff({
      readability: readabilityMetadata,
      defuddle: defuddleMetadata
    })

    rows.push({
      suite: testCase.suite,
      testName: testCase.testName,
      inputPath: testCase.inputPath,
      url: testCase.url,
      differentFields,
      fields
    })

    printCaseDifferences({ differentFields, fields })

    console.log(
      `  -> done in ${formatDuration(Date.now() - caseStart)} (${
        differentFields.length
      } differing fields)`
    )
  }

  const summary = computeSummary(rows)
  printSummary({ summary, rows })
  console.log(`Elapsed: ${formatDuration(Date.now() - start)}`)
}

main().catch(error => {
  console.error(error)
  process.exitCode = 1
})


================================================
FILE: benchmark/index.js
================================================
'use strict'

const mkdirp = require('mkdirp')
const rimraf = require('rimraf')
const got = require('got')
const fs = require('fs')
const path = require('path')

const SCRAPERS = require('./scrapers')
const URLS = require('./urls')

/**
 * Run.
 */

console.log('Fetching the results for each scraper...')

getResults()
  .then(results => {
    console.log('Removing the old results...')
    const dir = path.resolve(__dirname, 'results')
    rimraf.sync(dir)

    resul
Download .txt
gitextract_gvsn9m4r/

├── .editorconfig
├── .gitattributes
├── .github/
│   ├── FUNDING.yml
│   ├── ISSUE_TEMPLATE.md
│   ├── dependabot.yml
│   └── workflows/
│       ├── get-matrix.mjs
│       ├── main.yml
│       └── pull_request.yml
├── .gitignore
├── .nojekyll
├── .npmrc
├── CHANGELOG.md
├── CNAME
├── CONTRIBUTING.md
├── LICENSE.md
├── README.md
├── benchmark/
│   ├── README.md
│   ├── accuracy-readability-vs-defuddle.js
│   ├── index.js
│   ├── package.json
│   ├── results/
│   │   ├── html-metadata.json
│   │   ├── metascraper.json
│   │   ├── node-metainspector.json
│   │   ├── open-graph-scraper.json
│   │   └── unfluff.json
│   ├── scrapers.js
│   └── urls.js
├── gulpfile.js
├── index.html
├── lerna.json
├── package.json
├── packages/
│   ├── cheerio-repl/
│   │   ├── bin/
│   │   │   └── index.mjs
│   │   └── package.json
│   ├── metascraper/
│   │   ├── CHANGELOG.md
│   │   ├── README.md
│   │   ├── benchmark/
│   │   │   └── merge-rules.js
│   │   ├── package.json
│   │   ├── src/
│   │   │   ├── get-data.js
│   │   │   ├── index.d.ts
│   │   │   ├── index.js
│   │   │   └── rules.js
│   │   └── test/
│   │       ├── integration/
│   │       │   ├── acast/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── anandtech/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── arstechnica/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── astier/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── atlasobscura/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       ├── index.js.md.3629819930
│   │       │   │       ├── index.js.snap
│   │       │   │       └── index.js.snap.2409065053
│   │       │   ├── audiense/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── bbc/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       ├── index.js.md.1566904539
│   │       │   │       ├── index.js.snap
│   │       │   │       └── index.js.snap.366348725
│   │       │   ├── belfusto/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── bfi/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── blogger/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── bloomberg/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── bukvy/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── business-today/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── cio/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── cnet/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── computerworld/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── crn/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── economic-times/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── engadget/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── entrepreneur/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── eweek/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── fast-company/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── financial-times/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── forbes/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── fortune/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── github/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── globenewswire/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── googleblog/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── hola/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── inc/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── indiehackers/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── information-week/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── instagram/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── itpro/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── jewish-business-news/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── lean-data/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── learnnode/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── linkedin-company/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── linkedin-pulse/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── los-angeles-times/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── mac-rumors/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── marketing-land/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── mashable/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── medium/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── milanocittastato/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── nbcnews/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── npr/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── nytimes/
│   │       │   │   ├── index.js
│   │       │   │   ├── input/
│   │       │   │   │   ├── article.html
│   │       │   │   │   └── opinion.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── pikabu/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── postplanner/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── pr-newswire/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── qz/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── reactpodcast/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── recode/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── reuters/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── san-francisco-chronicle/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── segment/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── segment-academy/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── sfstandard/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── silicon-angle/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── silicon-beat/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── silicon-valley-business-journal/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── smitten-kitchen/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── softwarefordays/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── startup-grind/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── stuff/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── substack/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── techcrunch/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── techmonitor/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── teslahunt/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── the-boston-globe/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── the-guardian/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── the-register/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── the-verge/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── theflip/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── therams/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── transistor/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── twitter-gif/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── twitter-image/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── usa-today/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── venture-beat/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── vice/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── vimeo/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── wikipedia/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── wired/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── wnycstudios/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── wsj/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── yahoo-news/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   ├── yandex/
│   │       │   │   ├── index.js
│   │       │   │   ├── input.html
│   │       │   │   └── snapshots/
│   │       │   │       ├── index.js.md
│   │       │   │       └── index.js.snap
│   │       │   └── zdnet/
│   │       │       ├── index.js
│   │       │       ├── input.html
│   │       │       └── snapshots/
│   │       │           ├── index.js.md
│   │       │           └── index.js.snap
│   │       ├── types/
│   │       │   └── index.test-d.ts
│   │       └── unit/
│   │           ├── decode/
│   │           │   ├── index.js
│   │           │   └── input.html
│   │           ├── index.js
│   │           ├── interface.js
│   │           └── merge-rules.js
│   ├── metascraper-amazon/
│   │   ├── CHANGELOG.md
│   │   ├── README.md
│   │   ├── package.json
│   │   ├── src/
│   │   │   ├── index.d.ts
│   │   │   └── index.js
│   │   └── test/
│   │       ├── fixtures/
│   │       │   ├── amazon-co-uk/
│   │       │   │   └── product-url.html
│   │       │   ├── amazon-com/
│   │       │   │   ├── ansi-url.html
│   │       │   │   └── product-url.html
│   │       │   └── amazon-es/
│   │       │       └── product-url.html
│   │       ├── index.js
│   │       ├── snapshots/
│   │       │   ├── index.js.md
│   │       │   └── index.js.snap
│   │       └── test.js
│   ├── metascraper-audio/
│   │   ├── CHANGELOG.md
│   │   ├── README.md
│   │   ├── package.json
│   │   ├── src/
│   │   │   ├── index.d.ts
│   │   │   └── index.js
│   │   └── test/
│   │       ├── fixtures/
│   │       │   └── providers/
│   │       │       ├── deezer.com.html
│   │       │       ├── ivoox.com.html
│   │       │       ├── music.apple.com.html
│   │       │       ├── open.spotify.com.html
│   │       │       ├── podcasts.apple.com.html
│   │       │       ├── podcasts.google.com.html
│   │       │       ├── tidal.com.html
│   │       │       └── transistor.fm.html
│   │       ├── helpers.js
│   │       ├── iframe.js
│   │       ├── index.js
│   │       ├── providers.js
│   │       └── snapshots/
│   │           ├── index.js.md
│   │           └── index.js.snap
│   ├── metascraper-author/
│   │   ├── CHANGELOG.md
│   │   ├── README.md
│   │   ├── package.json
│   │   └── src/
│   │       ├── index.d.ts
│   │       └── index.js
│   ├── metascraper-bluesky/
│   │   ├── CHANGELOG.md
│   │   ├── README.md
│   │   ├── package.json
│   │   ├── src/
│   │   │   ├── index.d.ts
│   │   │   └── index.js
│   │   └── test/
│   │       ├── fixtures/
│   │       │   ├── post-image.html
│   │       │   ├── post-link.html
│   │       │   ├── post.html
│   │       │   └── profile.html
│   │       ├── index.js
│   │       ├── snapshots/
│   │       │   ├── index.js.md
│   │       │   └── index.js.snap
│   │       └── test.js
│   ├── metascraper-date/
│   │   ├── CHANGELOG.md
│   │   ├── README.md
│   │   ├── package.json
│   │   └── src/
│   │       ├── index.d.ts
│   │       └── index.js
│   ├── metascraper-defuddle/
│   │   ├── CHANGELOG.md
│   │   ├── README.md
│   │   ├── package.json
│   │   ├── src/
│   │   │   ├── index.d.ts
│   │   │   └── index.js
│   │   └── test/
│   │       ├── fixtures/
│   │       │   └── article.html
│   │       └── index.js
│   ├── metascraper-description/
│   │   ├── CHANGELOG.md
│   │   ├── README.md
│   │   ├── package.json
│   │   ├── src/
│   │   │   ├── index.d.ts
│   │   │   └── index.js
│   │   └── test/
│   │       └── index.js
│   ├── metascraper-dribbble/
│   │   ├── CHANGELOG.md
│   │   ├── README.md
│   │   ├── package.json
│   │   ├── src/
│   │   │   ├── index.d.ts
│   │   │   └── index.js
│   │   └── test/
│   │       ├── fixtures/
│   │       │   ├── post.html
│   │       │   └── profile.html
│   │       ├── index.js
│   │       ├── snapshots/
│   │       │   ├── index.js.md
│   │       │   └── index.js.snap
│   │       └── test.js
│   ├── metascraper-feed/
│   │   ├── CHANGELOG.md
│   │   ├── README.md
│   │   ├── package.json
│   │   ├── src/
│   │   │   ├── index.d.ts
│   │   │   └── index.js
│   │   └── test/
│   │       └── index.js
│   ├── metascraper-helpers/
│   │   ├── CHANGELOG.md
│   │   ├── README.md
│   │   ├── package.json
│   │   ├── src/
│   │   │   ├── index.js
│   │   │   └── load-iframe/
│   │   │       ├── index.js
│   │   │       └── worker.js
│   │   └── test/
│   │       ├── has.js
│   │       ├── index.js
│   │       ├── is-url/
│   │       │   ├── absolute.js
│   │       │   └── relative.js
│   │       ├── jsonld.js
│   │       ├── load-iframe.js
│   │       ├── memoize-one.js
│   │       ├── snapshots/
│   │       │   ├── jsonld.js.md
│   │       │   ├── jsonld.js.snap
│   │       │   ├── load-iframe.js.md
│   │       │   └── load-iframe.js.snap
│   │       └── titleize.js
│   ├── metascraper-iframe/
│   │   ├── CHANGELOG.md
│   │   ├── README.md
│   │   ├── package.json
│   │   ├── src/
│   │   │   ├── from-html.js
│   │   │   ├── from-provider.js
│   │   │   ├── from-twitter.js
│   │   │   ├── index.d.ts
│   │   │   └── index.js
│   │   └── test/
│   │       ├── fixtures/
│   │       │   ├── genially.html
│   │       │   ├── indiehacker-with-dimensions.html
│   │       │   ├── indiehacker.html
│   │       │   └── youtube.html
│   │       ├── get-oembed-url.js
│   │       ├── helpers.js
│   │       ├── index.js
│   │       └── test.js
│   ├── metascraper-image/
│   │   ├── CHANGELOG.md
│   │   ├── README.md
│   │   ├── package.json
│   │   └── src/
│   │       ├── index.d.ts
│   │       └── index.js
│   ├── metascraper-instagram/
│   │   ├── CHANGELOG.md
│   │   ├── README.md
│   │   ├── package.json
│   │   ├── src/
│   │   │   ├── index.d.ts
│   │   │   └── index.js
│   │   └── test/
│   │       ├── fixtures/
│   │       │   ├── post-with-clip.html
│   │       │   ├── post-with-igtv.html
│   │       │   ├── post-with-multi-photo.html
│   │       │   ├── post-with-photo.html
│   │       │   ├── post-with-video.html
│   │       │   ├── profile.html
│   │       │   └── story.html
│   │       ├── index.js
│   │       ├── snapshots/
│   │       │   ├── index.js.md
│   │       │   └── index.js.snap
│   │       └── test.js
│   ├── metascraper-lang/
│   │   ├── CHANGELOG.md
│   │   ├── README.md
│   │   ├── package.json
│   │   ├── src/
│   │   │   ├── index.d.ts
│   │   │   └── index.js
│   │   └── test/
│   │       ├── fixtures/
│   │       │   └── html-lang.html
│   │       ├── index.js
│   │       └── snapshots/
│   │           ├── index.js.md
│   │           └── index.js.snap
│   ├── metascraper-logo/
│   │   ├── CHANGELOG.md
│   │   ├── README.md
│   │   ├── package.json
│   │   └── src/
│   │       ├── index.d.ts
│   │       └── index.js
│   ├── metascraper-logo-favicon/
│   │   ├── CHANGELOG.md
│   │   ├── README.md
│   │   ├── package.json
│   │   ├── src/
│   │   │   ├── index.d.ts
│   │   │   └── index.js
│   │   └── test/
│   │       ├── favicon.js
│   │       ├── fixtures/
│   │       │   ├── liuedu.html
│   │       │   └── theverge.html
│   │       ├── get-logo.js
│   │       ├── google.js
│   │       ├── helpers.js
│   │       ├── index.js
│   │       ├── pick-fn.js
│   │       ├── resolve-favicon-url.js
│   │       └── root-favicon.js
│   ├── metascraper-manifest/
│   │   ├── CHANGELOG.md
│   │   ├── README.md
│   │   ├── package.json
│   │   ├── src/
│   │   │   ├── index.d.ts
│   │   │   └── index.js
│   │   └── test/
│   │       ├── get-size.js
│   │       ├── index.js
│   │       └── snapshots/
│   │           ├── index.js.md
│   │           └── index.js.snap
│   ├── metascraper-media-provider/
│   │   ├── CHANGELOG.md
│   │   ├── README.md
│   │   ├── bench/
│   │   │   ├── constants.js
│   │   │   └── index.js
│   │   ├── package.json
│   │   ├── src/
│   │   │   ├── get-media.js
│   │   │   ├── index.d.ts
│   │   │   └── index.js
│   │   └── test/
│   │       ├── audio.js
│   │       ├── fixtures/
│   │       │   ├── generate.js
│   │       │   └── provider/
│   │       │       ├── acast.json
│   │       │       ├── castbox.json
│   │       │       ├── google.json
│   │       │       ├── podcastaddict.json
│   │       │       ├── stitcher.json
│   │       │       ├── substack.json
│   │       │       ├── twitter.json
│   │       │       ├── vimeo-m3u8.json
│   │       │       ├── vimeo.json
│   │       │       ├── youtube-video-audio.json
│   │       │       └── youtube.json
│   │       ├── get-audio.js
│   │       ├── get-format-urls.js
│   │       ├── get-image.js
│   │       ├── get-media.js
│   │       ├── get-video.js
│   │       ├── helpers.js
│   │       ├── snapshots/
│   │       │   ├── get-audio.js.md
│   │       │   ├── get-audio.js.snap
│   │       │   ├── get-video.js.md
│   │       │   └── get-video.js.snap
│   │       └── video/
│   │           ├── format.js
│   │           ├── index.js
│   │           └── unsupported.js
│   ├── metascraper-publisher/
│   │   ├── CHANGELOG.md
│   │   ├── README.md
│   │   ├── package.json
│   │   ├── src/
│   │   │   ├── index.d.ts
│   │   │   └── index.js
│   │   └── test/
│   │       └── get-from-title.js
│   ├── metascraper-readability/
│   │   ├── CHANGELOG.md
│   │   ├── README.md
│   │   ├── benchmark/
│   │   │   ├── document-write.js
│   │   │   ├── fixture.html
│   │   │   ├── index.js
│   │   │   └── package.json
│   │   ├── package.json
│   │   ├── src/
│   │   │   ├── index.d.ts
│   │   │   └── index.js
│   │   └── test/
│   │       ├── fixtures/
│   │       │   ├── chowhanandsons.com.html
│   │       │   ├── kikobeats.com.html
│   │       │   ├── learnnode.com.html
│   │       │   ├── malformed.html
│   │       │   └── microlink.io.html
│   │       ├── index.js
│   │       └── snapshots/
│   │           ├── index.js.md
│   │           └── index.js.snap
│   ├── metascraper-reddit/
│   │   ├── CHANGELOG.md
│   │   ├── README.md
│   │   ├── package.json
│   │   ├── src/
│   │   │   ├── index.d.ts
│   │   │   └── index.js
│   │   └── test/
│   │       ├── fixtures/
│   │       │   └── post.html
│   │       ├── index.js
│   │       ├── snapshots/
│   │       │   ├── index.js.md
│   │       │   └── index.js.snap
│   │       └── test.js
│   ├── metascraper-soundcloud/
│   │   ├── CHANGELOG.md
│   │   ├── README.md
│   │   ├── package.json
│   │   ├── src/
│   │   │   ├── index.d.ts
│   │   │   └── index.js
│   │   └── test/
│   │       ├── fixtures/
│   │       │   └── song.html
│   │       ├── index.js
│   │       ├── snapshots/
│   │       │   ├── index.js.md
│   │       │   └── index.js.snap
│   │       └── test.js
│   ├── metascraper-spotify/
│   │   ├── CHANGELOG.md
│   │   ├── README.md
│   │   ├── package.json
│   │   ├── src/
│   │   │   ├── index.d.ts
│   │   │   └── index.js
│   │   └── test/
│   │       ├── description.js
│   │       ├── fixtures/
│   │       │   ├── album.html
│   │       │   ├── artist.html
│   │       │   ├── episode.html
│   │       │   ├── show.html
│   │       │   └── track.html
│   │       ├── helpers.js
│   │       ├── index.js
│   │       ├── snapshots/
│   │       │   ├── index.js.md
│   │       │   └── index.js.snap
│   │       └── test.js
│   ├── metascraper-telegram/
│   │   ├── CHANGELOG.md
│   │   ├── README.md
│   │   ├── package.json
│   │   ├── src/
│   │   │   ├── index.d.ts
│   │   │   └── index.js
│   │   └── test/
│   │       ├── fixtures/
│   │       │   ├── channel.html
│   │       │   ├── no-iframe.html
│   │       │   ├── post-full-image.html
│   │       │   ├── post-link-image.html
│   │       │   └── post-right-preview.html
│   │       ├── index.js
│   │       ├── snapshots/
│   │       │   ├── index.js.md
│   │       │   └── index.js.snap
│   │       └── test.js
│   ├── metascraper-tiktok/
│   │   ├── CHANGELOG.md
│   │   ├── README.md
│   │   ├── package.json
│   │   ├── src/
│   │   │   ├── index.d.ts
│   │   │   └── index.js
│   │   └── test/
│   │       ├── Untitled
│   │       ├── fixtures/
│   │       │   ├── profile.html
│   │       │   └── video.html
│   │       ├── index.js
│   │       ├── snapshots/
│   │       │   ├── index.js.md
│   │       │   └── index.js.snap
│   │       └── test.js
│   ├── metascraper-title/
│   │   ├── CHANGELOG.md
│   │   ├── README.md
│   │   ├── package.json
│   │   └── src/
│   │       ├── index.d.ts
│   │       └── index.js
│   ├── metascraper-uol/
│   │   ├── CHANGELOG.md
│   │   ├── package.json
│   │   ├── src/
│   │   │   ├── index.d.ts
│   │   │   └── index.js
│   │   └── test/
│   │       ├── fixtures/
│   │       │   ├── entretenimento.html
│   │       │   ├── folha.html
│   │       │   └── torcedores.html
│   │       ├── index.js
│   │       ├── snapshots/
│   │       │   ├── index.js.md
│   │       │   └── index.js.snap
│   │       └── test.js
│   ├── metascraper-url/
│   │   ├── CHANGELOG.md
│   │   ├── README.md
│   │   ├── package.json
│   │   └── src/
│   │       ├── index.d.ts
│   │       └── index.js
│   ├── metascraper-video/
│   │   ├── CHANGELOG.md
│   │   ├── README.md
│   │   ├── package.json
│   │   ├── src/
│   │   │   ├── index.d.ts
│   │   │   └── index.js
│   │   └── test/
│   │       ├── fixtures/
│   │       │   ├── providers/
│   │       │   │   ├── 9gag.com.html
│   │       │   │   ├── bluecadet.com.html
│   │       │   │   ├── clip.twitch.tv.html
│   │       │   │   ├── giphy.com.html
│   │       │   │   └── medal.tv.html
│   │       │   ├── source-src.html
│   │       │   ├── tweet.html
│   │       │   └── video-src.html
│   │       ├── helpers.js
│   │       ├── iframe.js
│   │       ├── index.js
│   │       ├── providers.js
│   │       └── snapshots/
│   │           ├── index.js.md
│   │           ├── index.js.snap
│   │           ├── providers.js.md
│   │           └── providers.js.snap
│   ├── metascraper-x/
│   │   ├── CHANGELOG.md
│   │   ├── README.md
│   │   ├── package.json
│   │   ├── src/
│   │   │   ├── index.d.ts
│   │   │   └── index.js
│   │   └── test/
│   │       ├── fixtures/
│   │       │   ├── post-gif-og.html
│   │       │   ├── post-gif.html
│   │       │   ├── post-image-og.html
│   │       │   ├── post-image.html
│   │       │   ├── post-link.html
│   │       │   ├── post-og.html
│   │       │   ├── post-on-x.html
│   │       │   ├── post-video-og.html
│   │       │   ├── post-video.html
│   │       │   ├── post.html
│   │       │   ├── profile-og.html
│   │       │   ├── profile-video-og.html
│   │       │   ├── profile-video.html
│   │       │   └── profile.html
│   │       ├── index.js
│   │       ├── snapshots/
│   │       │   ├── index.js.md
│   │       │   └── index.js.snap
│   │       └── test.js
│   └── metascraper-youtube/
│       ├── CHANGELOG.md
│       ├── README.md
│       ├── package.json
│       ├── src/
│       │   ├── index.d.ts
│       │   └── index.js
│       └── test/
│           ├── fixtures/
│           │   ├── image-size.html
│           │   ├── youtube-channel.html
│           │   ├── youtube-list.html
│           │   ├── youtube-title.html
│           │   ├── youtube-video-old.html
│           │   └── youtube-video.html
│           ├── helpers.js
│           ├── index.js
│           ├── snapshots/
│           │   ├── index.js.md
│           │   └── index.js.snap
│           └── test.js
├── pnpm-workspace.yaml
└── src/
    ├── css/
    │   └── style.css
    ├── design/
    │   └── metascraper-logo.sketch
    └── js/
        └── main.js
Download .txt
SYMBOL INDEX (74 symbols across 35 files)

FILE: benchmark/accuracy-readability-vs-defuddle.js
  constant INTEGRATION_DIR (line 8) | const INTEGRATION_DIR = path.resolve(
  constant BASE_FIELDS (line 13) | const BASE_FIELDS = [
  constant ALL_FIELDS (line 28) | const ALL_FIELDS = [...BASE_FIELDS]

FILE: benchmark/index.js
  constant SCRAPERS (line 9) | const SCRAPERS = require('./scrapers')
  constant URLS (line 10) | const URLS = require('./urls')
  function getResults (line 47) | function getResults () {
  function getScrapersResults (line 62) | function getScrapersResults (SCRAPERS, urls, htmls) {
  function getScraperResults (line 84) | function getScraperResults (SCRAPER, urls, htmls) {
  function getHtmls (line 104) | function getHtmls (urls) {

FILE: benchmark/scrapers.js
  method scrape (line 13) | scrape (Module, url, html) {
  method normalize (line 17) | normalize (results) {
  method scrape (line 55) | scrape (Module, url, html) {
  method normalize (line 59) | normalize (results) {
  method scrape (line 71) | scrape (Module, url, html) {
  method normalize (line 84) | normalize (results) {
  method scrape (line 104) | scrape (Module, url, html) {
  method normalize (line 113) | normalize (results) {
  method scrape (line 149) | scrape (Module, url, html) {
  method normalize (line 154) | normalize (results) {

FILE: gulpfile.js
  function watch (line 44) | function watch () {

FILE: packages/metascraper-amazon/src/index.js
  constant REGEX_AMAZON_URL (line 14) | const REGEX_AMAZON_URL =
  constant SUFFIX_LANGUAGES (line 19) | const SUFFIX_LANGUAGES = {

FILE: packages/metascraper-audio/src/index.d.ts
  type IframeAttributes (line 1) | type IframeAttributes = {
  type Options (line 5) | type Options = {

FILE: packages/metascraper-author/src/index.js
  constant REGEX_STRICT (line 11) | const REGEX_STRICT = /^\S+\s+\S+/

FILE: packages/metascraper-date/src/index.d.ts
  type Options (line 1) | type Options = {

FILE: packages/metascraper-defuddle/src/index.js
  constant DOCUMENT_SETTINGS (line 9) | const DOCUMENT_SETTINGS = {

FILE: packages/metascraper-description/src/index.d.ts
  type Options (line 1) | type Options = {

FILE: packages/metascraper-helpers/src/index.js
  constant METASCRAPER_RE2 (line 23) | const METASCRAPER_RE2 = process.env.METASCRAPER_RE2
  constant VIDEO (line 83) | const VIDEO = 'video'
  constant AUDIO (line 84) | const AUDIO = 'audio'
  constant IMAGE (line 85) | const IMAGE = 'image'
  constant PDF (line 86) | const PDF = 'pdf'
  constant EXTENSIONS (line 112) | const EXTENSIONS = {
  constant REGEX_BY (line 119) | const REGEX_BY = /^[\s\n]*by[\s\n]+|@[\s\n]*/i
  constant REGEX_LOCATION (line 121) | const REGEX_LOCATION = /^[A-Z\s]+\s+[-—–]\s+/
  constant REGEX_TITLE_SEPARATOR (line 123) | const REGEX_TITLE_SEPARATOR = /^[^|\-/•—]+/
  constant AUTHOR_MAX_LENGTH (line 125) | const AUTHOR_MAX_LENGTH = 128
  function searchSchemaResults (line 396) | function searchSchemaResults (data, props, isExact) {

FILE: packages/metascraper-helpers/src/load-iframe/index.js
  constant SCRIPT_PATH (line 6) | const SCRIPT_PATH = (

FILE: packages/metascraper-helpers/src/load-iframe/worker.js
  function main (line 6) | async function main ({ url, html, timeout }) {

FILE: packages/metascraper-iframe/src/index.d.ts
  type Options (line 1) | type Options = {

FILE: packages/metascraper-logo-favicon/src/index.d.ts
  type DOMNOdeAtributes (line 1) | type DOMNOdeAtributes = Record<string, any>
  type Options (line 3) | type Options = {

FILE: packages/metascraper-logo-favicon/src/index.js
  constant ALLOWED_EXTENSION_CONTENT_TYPES (line 15) | const ALLOWED_EXTENSION_CONTENT_TYPES = [
  constant SIZE_REGEX_BY_X (line 20) | const SIZE_REGEX_BY_X = /\d+x\d+/

FILE: packages/metascraper-logo/src/index.d.ts
  type Options (line 1) | type Options = {

FILE: packages/metascraper-manifest/src/index.d.ts
  type Options (line 1) | type Options = {

FILE: packages/metascraper-media-provider/src/get-media.js
  constant RE_UNSUPPORTED_URL (line 11) | const RE_UNSUPPORTED_URL = /Unsupported URL/
  constant DEFAULT_FLAGS (line 13) | const DEFAULT_FLAGS = {

FILE: packages/metascraper-media-provider/src/index.d.ts
  type Options (line 1) | type Options = {

FILE: packages/metascraper-media-provider/test/helpers.js
  constant PROXY_DOMAINS (line 15) | const PROXY_DOMAINS = ['vimeo', 'facebook']
  constant PROXY_URLS (line 16) | const PROXY_URLS = ['https://api.twitter.com/1.1/guest/activate.json']

FILE: packages/metascraper-publisher/src/index.js
  constant REGEX_TITLE (line 5) | const REGEX_TITLE = /^.*?[-|]\s+(.*)$/

FILE: packages/metascraper-readability/src/index.d.ts
  type Options (line 1) | type Options = {

FILE: packages/metascraper-readability/src/index.js
  constant DOCUMENT_SETTINGS (line 16) | const DOCUMENT_SETTINGS = {

FILE: packages/metascraper-reddit/src/index.js
  constant REDDIT_DOMAINS (line 17) | const REDDIT_DOMAINS = ['reddit.com', 'redd.it']

FILE: packages/metascraper-spotify/src/index.d.ts
  type Options (line 1) | type Options = {

FILE: packages/metascraper-telegram/src/index.d.ts
  type Options (line 1) | type Options = {

FILE: packages/metascraper-telegram/src/index.js
  constant TELEGRAM_DOMAINS (line 24) | const TELEGRAM_DOMAINS = ['telegram.me', 't.me']

FILE: packages/metascraper-uol/src/index.js
  constant ROOT_DOMAINS (line 13) | const ROOT_DOMAINS = ['uol.com.br', 'torcedores.com']

FILE: packages/metascraper-video/src/index.d.ts
  type IframeAttributes (line 1) | type IframeAttributes = {
  type Options (line 5) | type Options = {

FILE: packages/metascraper-youtube/src/index.d.ts
  type Options (line 1) | type Options = {

FILE: packages/metascraper-youtube/src/index.js
  constant THUMBAILS_RESOLUTIONS (line 15) | const THUMBAILS_RESOLUTIONS = [

FILE: packages/metascraper/benchmark/merge-rules.js
  constant CONFIG (line 7) | const CONFIG = {

FILE: packages/metascraper/src/index.d.ts
  type MetascraperOptions (line 12) | interface MetascraperOptions {
  type Metadata (line 50) | interface Metadata {
  type NamedRules (line 109) | type NamedRules = {
  type Rules (line 113) | interface Rules extends NamedRules {
  type RulesOptions (line 135) | type RulesOptions = (
  type RulesTestOptions (line 139) | interface RulesTestOptions {
  type Metascraper (line 144) | type Metascraper = (options: MetascraperOptions) => Promise<Metadata>;

FILE: packages/metascraper/test/unit/interface.js
  function test (line 136) | function test ({ url: urlBase }) {
Copy disabled (too large) Download .json
Condensed preview — 794 files, each showing path, character count, and a content snippet. Download the .json file for the full structured content (80,072K chars).
[
  {
    "path": ".editorconfig",
    "chars": 364,
    "preview": "# http://editorconfig.org\n\nroot = true\n\n[*]\nindent_style = space\nindent_size = 2\nend_of_line = lf\ncharset = utf-8\ntrim_t"
  },
  {
    "path": ".gitattributes",
    "chars": 12,
    "preview": "* text=auto\n"
  },
  {
    "path": ".github/FUNDING.yml",
    "chars": 38,
    "preview": "custom: https://microlink.io/#pricing\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE.md",
    "chars": 458,
    "preview": "### Prerequisites\n\n- [ ] I'm using the last version.\n- [ ] My node version is the same as declared as `package.json`.\n\n#"
  },
  {
    "path": ".github/dependabot.yml",
    "chars": 257,
    "preview": "version: 2\nupdates:\n  - package-ecosystem: npm\n    directory: \"/\"\n    schedule:\n      interval: daily\n  - package-ecosys"
  },
  {
    "path": ".github/workflows/get-matrix.mjs",
    "chars": 638,
    "preview": "import { readdir, readFile } from 'fs/promises'\nimport { dirname, join } from 'path'\nimport { fileURLToPath } from 'url'"
  },
  {
    "path": ".github/workflows/main.yml",
    "chars": 2707,
    "preview": "name: main\n\non:\n  push:\n    branches:\n      - master\n\njobs:\n  contributors:\n    if: \"${{ github.event.head_commit.messag"
  },
  {
    "path": ".github/workflows/pull_request.yml",
    "chars": 1768,
    "preview": "name: pull_request\n\non:\n  push:\n    branches:\n      - master\n  pull_request:\n    branches:\n      - master\n\njobs:\n  matri"
  },
  {
    "path": ".gitignore",
    "chars": 446,
    "preview": "############################\n# npm\n############################\nnode_modules\nnpm-debug.log\nlerna-debug.log\n\n############"
  },
  {
    "path": ".nojekyll",
    "chars": 0,
    "preview": ""
  },
  {
    "path": ".npmrc",
    "chars": 243,
    "preview": "audit=false\nfund=false\nloglevel=error\npackage-lock=false\nprefer-dedupe=true\nprefer-offline=false\nresolution-mode=highest"
  },
  {
    "path": "CHANGELOG.md",
    "chars": 150470,
    "preview": "# Change Log\n\nAll notable changes to this project will be documented in this file.\nSee [Conventional Commits](https://co"
  },
  {
    "path": "CNAME",
    "chars": 19,
    "preview": "metascraper.js.org\n"
  },
  {
    "path": "CONTRIBUTING.md",
    "chars": 4446,
    "preview": "# Contributing\n\n## Rules Bundles\n\nA rule bundle is the simplest way for extending **metascraper** functionality.\n\nRules "
  },
  {
    "path": "LICENSE.md",
    "chars": 1110,
    "preview": "The MIT License (MIT)\n\nCopyright © 2019 Microlink <hello@microlink.io> (microlink.io)\n\nPermission is hereby granted, fre"
  },
  {
    "path": "README.md",
    "chars": 19308,
    "preview": "<div align=\"center\">\n  <a href=\"https://metascraper.js.org\">\n    <img style=\"width: 500px; margin:3rem 0 1.5rem;\" src=\"h"
  },
  {
    "path": "benchmark/README.md",
    "chars": 6017,
    "preview": "\n# Comparison\n\nTo give you an idea of how accurate **Metascraper** is, here is a comparison of similar libraries:\n\n| Lib"
  },
  {
    "path": "benchmark/accuracy-readability-vs-defuddle.js",
    "chars": 8855,
    "preview": "'use strict'\n\nconst fs = require('fs')\nconst path = require('path')\n\nconst metascraper = require('../packages/metascrape"
  },
  {
    "path": "benchmark/index.js",
    "chars": 2304,
    "preview": "'use strict'\n\nconst mkdirp = require('mkdirp')\nconst rimraf = require('rimraf')\nconst got = require('got')\nconst fs = re"
  },
  {
    "path": "benchmark/package.json",
    "chars": 650,
    "preview": "{\n  \"name\": \"@metascraper/bench\",\n  \"version\": \"4.10.2\",\n  \"description\": \"To give you an idea of how accurate metascrap"
  },
  {
    "path": "benchmark/results/html-metadata.json",
    "chars": 3712,
    "preview": "[\n  {\n    \"author\": null,\n    \"date\": \"2016-01-12T22:34:00.000Z\",\n    \"description\": \"HackerRank, a tech recruiting comp"
  },
  {
    "path": "benchmark/results/metascraper.json",
    "chars": 4468,
    "preview": "[\n  {\n    \"author\": \"J Vignesh\",\n    \"date\": \"2016-01-12T22:34:00.000Z\",\n    \"description\": \"HackerRank, a tech recruiti"
  },
  {
    "path": "benchmark/results/node-metainspector.json",
    "chars": 3601,
    "preview": "[\n  {\n    \"author\": null,\n    \"date\": null,\n    \"description\": \"HackerRank, a tech recruiting company, has launched Hack"
  },
  {
    "path": "benchmark/results/open-graph-scraper.json",
    "chars": 3647,
    "preview": "[\n  {\n    \"author\": null,\n    \"date\": null,\n    \"description\": \"HackerRank, a tech recruiting company, has launched Hack"
  },
  {
    "path": "benchmark/results/unfluff.json",
    "chars": 5535,
    "preview": "[\n  {\n    \"author\": \"By J Vignesh\",\n    \"date\": \"2016-01-12T22:34:00.000Z\",\n    \"description\": \"HackerRank, a tech recru"
  },
  {
    "path": "benchmark/scrapers.js",
    "chars": 4268,
    "preview": "/**\n * Scrapers.\n */\n\nmodule.exports = [\n  /**\n   * HTML Metadata.\n   */\n\n  {\n    name: 'html-metadata',\n\n    scrape (Mo"
  },
  {
    "path": "benchmark/urls.js",
    "chars": 4596,
    "preview": "/**\n * URLs.\n */\n\nmodule.exports = [\n  'http://economictimes.indiatimes.com/jobs/hackerrank-launches-job-search-platform"
  },
  {
    "path": "gulpfile.js",
    "chars": 990,
    "preview": "'use strict'\n\nconst postcss = require('gulp-postcss')\nconst concat = require('gulp-concat')\nconst uglify = require('gulp"
  },
  {
    "path": "index.html",
    "chars": 2871,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n  <!-- Basic -->\n  <meta charset=\"utf-8\">\n  <link rel=\"preconnect\" href=\"https:"
  },
  {
    "path": "lerna.json",
    "chars": 170,
    "preview": "{\n  \"packages\": [\n    \"packages/*\"\n  ],\n  \"version\": \"5.50.2\",\n  \"command\": {\n    \"bootstrap\": {\n      \"npmClientArgs\": "
  },
  {
    "path": "package.json",
    "chars": 5701,
    "preview": "{\n  \"name\": \"metascraper\",\n  \"homepage\": \"https://github.com/microlinkhq/metascraper#readme\",\n  \"version\": \"\",\n  \"author"
  },
  {
    "path": "packages/cheerio-repl/bin/index.mjs",
    "chars": 817,
    "preview": "import { toRule, date, $jsonld, $filter } from '@metascraper/helpers'\nimport { readFile } from 'fs/promises'\nimport { lo"
  },
  {
    "path": "packages/cheerio-repl/package.json",
    "chars": 220,
    "preview": "{\n  \"name\": \"@metascraper/cheerio-repl\",\n  \"version\": \"\",\n  \"bin\": {\n    \"cheerio\": \"bin/index.mjs\"\n  },\n  \"devDependenc"
  },
  {
    "path": "packages/metascraper/CHANGELOG.md",
    "chars": 50317,
    "preview": "# Change Log\n\nAll notable changes to this project will be documented in this file.\nSee [Conventional Commits](https://co"
  },
  {
    "path": "packages/metascraper/README.md",
    "chars": 1041,
    "preview": "<div align=\"center\">\n  <br>\n  <img style=\"width: 500px; margin:3rem 0 1.5rem;\" src=\"https://metascraper.js.org/static/lo"
  },
  {
    "path": "packages/metascraper/benchmark/merge-rules.js",
    "chars": 4194,
    "preview": "'use strict'\n\nconst { performance } = require('perf_hooks')\nconst { mergeRules } = require('../src/rules')\n\n// 🔧 Benchma"
  },
  {
    "path": "packages/metascraper/package.json",
    "chars": 1647,
    "preview": "{\n  \"name\": \"metascraper\",\n  \"description\": \"A library to easily scrape metadata from an article on the web using Open G"
  },
  {
    "path": "packages/metascraper/src/get-data.js",
    "chars": 932,
    "preview": "'use strict'\n\nconst debug = require('debug-logfmt')('metascraper:get-data')\nconst { findRule, has } = require('@metascra"
  },
  {
    "path": "packages/metascraper/src/index.d.ts",
    "chars": 4740,
    "preview": "/**\n * It creates a [metascraper](https://metascraper.js.org/) instance, declaring the rules bundle to be used explicitl"
  },
  {
    "path": "packages/metascraper/src/index.js",
    "chars": 890,
    "preview": "'use strict'\n\nconst { isUrl } = require('@metascraper/helpers')\nconst { load } = require('cheerio')\nconst whoops = requi"
  },
  {
    "path": "packages/metascraper/src/rules.js",
    "chars": 2029,
    "preview": "'use strict'\n\nconst castArray = value => (Array.isArray(value) ? value : [value])\n\nconst loadRules = rulesBundle => {\n  "
  },
  {
    "path": "packages/metascraper/test/integration/acast/index.js",
    "chars": 930,
    "preview": "'use strict'\n\nconst { readFile } = require('fs/promises')\nconst { resolve } = require('path')\nconst test = require('ava'"
  },
  {
    "path": "packages/metascraper/test/integration/acast/input.html",
    "chars": 68074,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\" data-lt-installed=\"true\" data-react-helmet=\"lang\">\n\n<head>\n  <title>Caffeine | Say Why T"
  },
  {
    "path": "packages/metascraper/test/integration/acast/snapshots/index.js.md",
    "chars": 881,
    "preview": "# Snapshot report for `test/integration/acast/index.js`\n\nThe actual snapshot is saved in `index.js.snap`.\n\nGenerated by "
  },
  {
    "path": "packages/metascraper/test/integration/anandtech/index.js",
    "chars": 969,
    "preview": "'use strict'\n\nconst { readFile } = require('fs/promises')\nconst { resolve } = require('path')\nconst test = require('ava'"
  },
  {
    "path": "packages/metascraper/test/integration/anandtech/input.html",
    "chars": 82621,
    "preview": "\n\n<!DOCTYPE html>\n<html>\n<!--[if IE 6]> <html class=\"ie6\"> <![endif]-->\n<!--[if IE 7]> <html class=\"ie7\"> <![endif]-->\n<"
  },
  {
    "path": "packages/metascraper/test/integration/anandtech/snapshots/index.js.md",
    "chars": 1218,
    "preview": "# Snapshot report for `test/integration/anandtech/index.js`\n\nThe actual snapshot is saved in `index.js.snap`.\n\nGenerated"
  },
  {
    "path": "packages/metascraper/test/integration/arstechnica/index.js",
    "chars": 980,
    "preview": "'use strict'\n\nconst { readFile } = require('fs/promises')\nconst test = require('ava')\nconst { resolve } = require('path'"
  },
  {
    "path": "packages/metascraper/test/integration/arstechnica/input.html",
    "chars": 322652,
    "preview": "<!DOCTYPE html>\n<html lang=\"en-US\" class=\"view-grid dark\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\""
  },
  {
    "path": "packages/metascraper/test/integration/arstechnica/snapshots/index.js.md",
    "chars": 905,
    "preview": "# Snapshot report for `test/integration/arstechnica/index.js`\n\nThe actual snapshot is saved in `index.js.snap`.\n\nGenerat"
  },
  {
    "path": "packages/metascraper/test/integration/astier/index.js",
    "chars": 896,
    "preview": "'use strict'\n\nconst { readFile } = require('fs/promises')\nconst test = require('ava')\nconst { resolve } = require('path'"
  },
  {
    "path": "packages/metascraper/test/integration/astier/input.html",
    "chars": 23690,
    "preview": "\n<!DOCTYPE html>\n<html lang=\"en\">\n\t<head>\n\t\t<title>Linux Engineer's random thoughts - awk driven IoT </title>\n\t\t<meta ch"
  },
  {
    "path": "packages/metascraper/test/integration/astier/snapshots/index.js.md",
    "chars": 800,
    "preview": "# Snapshot report for `test/integration/astier/index.js`\n\nThe actual snapshot is saved in `index.js.snap`.\n\nGenerated by"
  },
  {
    "path": "packages/metascraper/test/integration/atlasobscura/index.js",
    "chars": 923,
    "preview": "'use strict'\n\nconst { readFile } = require('fs/promises')\nconst test = require('ava')\nconst { resolve } = require('path'"
  },
  {
    "path": "packages/metascraper/test/integration/atlasobscura/input.html",
    "chars": 281230,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\" style=\"--vsc-domain: &quot;www.atlasobscura.com&quot;;\"><head>\n  <meta name=\"turbo-visit"
  },
  {
    "path": "packages/metascraper/test/integration/atlasobscura/snapshots/index.js.md",
    "chars": 952,
    "preview": "# Snapshot report for `test/integration/atlasobscura/index.js`\n\nThe actual snapshot is saved in `index.js.snap`.\n\nGenera"
  },
  {
    "path": "packages/metascraper/test/integration/atlasobscura/snapshots/index.js.md.3629819930",
    "chars": 1032,
    "preview": "# Snapshot report for `test/integration/atlasobscura/index.js`\n\nThe actual snapshot is saved in `index.js.snap`.\n\nGenera"
  },
  {
    "path": "packages/metascraper/test/integration/audiense/index.js",
    "chars": 1009,
    "preview": "'use strict'\n\nconst { readFile } = require('fs/promises')\nconst test = require('ava')\nconst { resolve } = require('path'"
  },
  {
    "path": "packages/metascraper/test/integration/audiense/input.html",
    "chars": 202198,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\"><head><meta http-equiv=\"origin-trial\" content=\"Az520Inasey3TAyqLyojQa8MnmCALSEU29yQFW8de"
  },
  {
    "path": "packages/metascraper/test/integration/audiense/snapshots/index.js.md",
    "chars": 966,
    "preview": "# Snapshot report for `test/integration/audiense/index.js`\n\nThe actual snapshot is saved in `index.js.snap`.\n\nGenerated "
  },
  {
    "path": "packages/metascraper/test/integration/bbc/index.js",
    "chars": 1235,
    "preview": "'use strict'\n\nconst { readFile } = require('fs/promises')\nconst test = require('ava')\nconst { resolve } = require('path'"
  },
  {
    "path": "packages/metascraper/test/integration/bbc/input.html",
    "chars": 417910,
    "preview": "<!DOCTYPE html>\n<html lang=\"en-GB\" class=\"\" style=\"top: 0px;\"><head><meta charset=\"utf-8\"><meta name=\"viewport\" content="
  },
  {
    "path": "packages/metascraper/test/integration/bbc/snapshots/index.js.md",
    "chars": 707,
    "preview": "# Snapshot report for `test/integration/bbc/index.js`\n\nThe actual snapshot is saved in `index.js.snap`.\n\nGenerated by [A"
  },
  {
    "path": "packages/metascraper/test/integration/bbc/snapshots/index.js.md.1566904539",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "packages/metascraper/test/integration/bbc/snapshots/index.js.snap.366348725",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "packages/metascraper/test/integration/belfusto/index.js",
    "chars": 898,
    "preview": "'use strict'\n\nconst { readFile } = require('fs/promises')\nconst test = require('ava')\nconst { resolve } = require('path'"
  },
  {
    "path": "packages/metascraper/test/integration/belfusto/input.html",
    "chars": 600310,
    "preview": "<!DOCTYPE html>\n<html lang=\"es\" class=\" td-md-is-os-x td-md-is-chrome\" data-lt-installed=\"true\">\n\n<head>\n  <style type=\""
  },
  {
    "path": "packages/metascraper/test/integration/belfusto/snapshots/index.js.md",
    "chars": 859,
    "preview": "# Snapshot report for `test/integration/belfusto/index.js`\n\nThe actual snapshot is saved in `index.js.snap`.\n\nGenerated "
  },
  {
    "path": "packages/metascraper/test/integration/bfi/index.js",
    "chars": 899,
    "preview": "'use strict'\n\nconst { readFile } = require('fs/promises')\nconst { resolve } = require('path')\nconst test = require('ava'"
  },
  {
    "path": "packages/metascraper/test/integration/bfi/input.html",
    "chars": 72042,
    "preview": "<!DOCTYPE html>\n<html lang=\"en-US\" data-whatinput=\"initial\" data-whatintent=\"mouse\"><head><meta charset=\"UTF-8\"><meta na"
  },
  {
    "path": "packages/metascraper/test/integration/bfi/snapshots/index.js.md",
    "chars": 892,
    "preview": "# Snapshot report for `test/integration/bfi/index.js`\n\nThe actual snapshot is saved in `index.js.snap`.\n\nGenerated by [A"
  },
  {
    "path": "packages/metascraper/test/integration/blogger/index.js",
    "chars": 912,
    "preview": "'use strict'\n\nconst { readFile } = require('fs/promises')\nconst { resolve } = require('path')\nconst test = require('ava'"
  },
  {
    "path": "packages/metascraper/test/integration/blogger/input.html",
    "chars": 301310,
    "preview": "<!DOCTYPE html>\n<html class=\"v2\" dir=\"ltr\" lang=\"en-GB\">\n   <head>\n      <link href=\"https://www.blogger.com/static/v1/w"
  },
  {
    "path": "packages/metascraper/test/integration/blogger/snapshots/index.js.md",
    "chars": 895,
    "preview": "# Snapshot report for `test/integration/blogger/index.js`\n\nThe actual snapshot is saved in `index.js.snap`.\n\nGenerated b"
  },
  {
    "path": "packages/metascraper/test/integration/bloomberg/index.js",
    "chars": 965,
    "preview": "'use strict'\n\nconst { readFile } = require('fs/promises')\nconst { resolve } = require('path')\nconst test = require('ava'"
  },
  {
    "path": "packages/metascraper/test/integration/bloomberg/input.html",
    "chars": 511590,
    "preview": "<!DOCTYPE html>\n<html prefix=\"og: http://ogp.me/ns#\" lang=\"en\">\n\n<head>\n  <style class=\"vjs-styles-defaults\">\n    .video"
  },
  {
    "path": "packages/metascraper/test/integration/bloomberg/snapshots/index.js.md",
    "chars": 773,
    "preview": "# Snapshot report for `test/integration/bloomberg/index.js`\n\nThe actual snapshot is saved in `index.js.snap`.\n\nGenerated"
  },
  {
    "path": "packages/metascraper/test/integration/bukvy/index.js",
    "chars": 987,
    "preview": "'use strict'\n\nconst { readFile } = require('fs/promises')\nconst test = require('ava')\nconst { resolve } = require('path'"
  },
  {
    "path": "packages/metascraper/test/integration/bukvy/input.html",
    "chars": 62843,
    "preview": "<html lang=\"en-US\"><head>\n  <meta charset=\"UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\""
  },
  {
    "path": "packages/metascraper/test/integration/bukvy/snapshots/index.js.md",
    "chars": 1497,
    "preview": "# Snapshot report for `test/integration/bukvy/index.js`\n\nThe actual snapshot is saved in `index.js.snap`.\n\nGenerated by "
  },
  {
    "path": "packages/metascraper/test/integration/business-today/index.js",
    "chars": 1030,
    "preview": "'use strict'\n\nconst { readFile } = require('fs/promises')\nconst { resolve } = require('path')\nconst test = require('ava'"
  },
  {
    "path": "packages/metascraper/test/integration/business-today/input.html",
    "chars": 76499,
    "preview": "\n<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
  },
  {
    "path": "packages/metascraper/test/integration/business-today/snapshots/index.js.md",
    "chars": 763,
    "preview": "# Snapshot report for `test/integration/business-today/index.js`\n\nThe actual snapshot is saved in `index.js.snap`.\n\nGene"
  },
  {
    "path": "packages/metascraper/test/integration/cio/index.js",
    "chars": 1332,
    "preview": "'use strict'\n\nconst { readFile } = require('fs/promises')\nconst { resolve } = require('path')\nconst test = require('ava'"
  },
  {
    "path": "packages/metascraper/test/integration/cio/input.html",
    "chars": 223579,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\" xml:lang=\"en\" dir=\"ltr\" xmlns=\"http://www.w3.org/1999/xhtml\" data-edition=\"us\" data-lang"
  },
  {
    "path": "packages/metascraper/test/integration/cio/snapshots/index.js.md",
    "chars": 978,
    "preview": "# Snapshot report for `test/integration/cio/index.js`\n\nThe actual snapshot is saved in `index.js.snap`.\n\nGenerated by [A"
  },
  {
    "path": "packages/metascraper/test/integration/cnet/index.js",
    "chars": 947,
    "preview": "'use strict'\n\nconst { readFile } = require('fs/promises')\nconst { resolve } = require('path')\nconst test = require('ava'"
  },
  {
    "path": "packages/metascraper/test/integration/cnet/input.html",
    "chars": 427905,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\" xmlns:og=\"http://opengraphprotocol.org/schema/\"\n  xmlns:fb=\"http://ogp.me/ns/fb#\" class="
  },
  {
    "path": "packages/metascraper/test/integration/cnet/snapshots/index.js.md",
    "chars": 959,
    "preview": "# Snapshot report for `test/integration/cnet/index.js`\n\nThe actual snapshot is saved in `index.js.snap`.\n\nGenerated by ["
  },
  {
    "path": "packages/metascraper/test/integration/computerworld/index.js",
    "chars": 970,
    "preview": "'use strict'\n\nconst { readFile } = require('fs/promises')\nconst { resolve } = require('path')\nconst test = require('ava'"
  },
  {
    "path": "packages/metascraper/test/integration/computerworld/input.html",
    "chars": 276915,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\" xml:lang=\"en\" dir=\"ltr\" xmlns=\"http://www.w3.org/1999/xhtml\" data-edition=\"us\" data-lang"
  },
  {
    "path": "packages/metascraper/test/integration/computerworld/snapshots/index.js.md",
    "chars": 1031,
    "preview": "# Snapshot report for `test/integration/computerworld/index.js`\n\nThe actual snapshot is saved in `index.js.snap`.\n\nGener"
  },
  {
    "path": "packages/metascraper/test/integration/crn/index.js",
    "chars": 989,
    "preview": "'use strict'\n\nconst { readFile } = require('fs/promises')\nconst { resolve } = require('path')\nconst test = require('ava'"
  },
  {
    "path": "packages/metascraper/test/integration/crn/input.html",
    "chars": 87764,
    "preview": "\n<!DOCTYPE html>\n<!--[if IEMobile 7]><html class=\"iem7\" lang=\"en\" dir=\"ltr\" itemscope itemtype=\"http://schema.org/Articl"
  },
  {
    "path": "packages/metascraper/test/integration/crn/snapshots/index.js.md",
    "chars": 871,
    "preview": "# Snapshot report for `test/integration/crn/index.js`\n\nThe actual snapshot is saved in `index.js.snap`.\n\nGenerated by [A"
  },
  {
    "path": "packages/metascraper/test/integration/economic-times/index.js",
    "chars": 949,
    "preview": "'use strict'\n\nconst { readFile } = require('fs/promises')\nconst { resolve } = require('path')\nconst test = require('ava'"
  },
  {
    "path": "packages/metascraper/test/integration/economic-times/input.html",
    "chars": 122162,
    "preview": "\n<!DOCTYPE html><html xmlns:xhtml=\"http://www.w3.org/1999/xhtml\" xmlns:g=\"http://base.google.com/ns/1.0\" itemtype=\"http:"
  },
  {
    "path": "packages/metascraper/test/integration/economic-times/snapshots/index.js.md",
    "chars": 946,
    "preview": "# Snapshot report for `test/integration/economic-times/index.js`\n\nThe actual snapshot is saved in `index.js.snap`.\n\nGene"
  },
  {
    "path": "packages/metascraper/test/integration/engadget/index.js",
    "chars": 924,
    "preview": "'use strict'\n\nconst { readFile } = require('fs/promises')\nconst { resolve } = require('path')\nconst test = require('ava'"
  },
  {
    "path": "packages/metascraper/test/integration/engadget/input.html",
    "chars": 189806,
    "preview": "<!DOCTYPE html>\n<html id=\"atomic\" class=\"desktop bkt ua-chrome ua-94.0 JsEnabled jsenabled\"\n  lang=\"en-US\">\n\n<head>\n  <s"
  },
  {
    "path": "packages/metascraper/test/integration/engadget/snapshots/index.js.md",
    "chars": 1094,
    "preview": "# Snapshot report for `test/integration/engadget/index.js`\n\nThe actual snapshot is saved in `index.js.snap`.\n\nGenerated "
  },
  {
    "path": "packages/metascraper/test/integration/entrepreneur/index.js",
    "chars": 901,
    "preview": "'use strict'\n\nconst { readFile } = require('fs/promises')\nconst { resolve } = require('path')\nconst test = require('ava'"
  },
  {
    "path": "packages/metascraper/test/integration/entrepreneur/input.html",
    "chars": 41630,
    "preview": "<!doctype html>\n<html lang=\"en\" itemscope itemtype=\"http://schema.org/Article\">\n\n<head>\n  <meta name=\"globalsign-domain-"
  },
  {
    "path": "packages/metascraper/test/integration/entrepreneur/snapshots/index.js.md",
    "chars": 859,
    "preview": "# Snapshot report for `test/integration/entrepreneur/index.js`\n\nThe actual snapshot is saved in `index.js.snap`.\n\nGenera"
  },
  {
    "path": "packages/metascraper/test/integration/eweek/index.js",
    "chars": 916,
    "preview": "'use strict'\n\nconst { readFile } = require('fs/promises')\nconst { resolve } = require('path')\nconst test = require('ava'"
  },
  {
    "path": "packages/metascraper/test/integration/eweek/input.html",
    "chars": 612574,
    "preview": "<!doctype html>\n<html lang=\"en-US\" class=\" td-md-is-os-x td-md-is-chrome\"><!--<![endif]--><head><style id=\"qc-cmp2\" data"
  },
  {
    "path": "packages/metascraper/test/integration/eweek/snapshots/index.js.md",
    "chars": 781,
    "preview": "# Snapshot report for `test/integration/eweek/index.js`\n\nThe actual snapshot is saved in `index.js.snap`.\n\nGenerated by "
  },
  {
    "path": "packages/metascraper/test/integration/fast-company/index.js",
    "chars": 971,
    "preview": "'use strict'\n\nconst { readFile } = require('fs/promises')\nconst { resolve } = require('path')\nconst test = require('ava'"
  },
  {
    "path": "packages/metascraper/test/integration/fast-company/input.html",
    "chars": 98379,
    "preview": "<!DOCTYPE html>\n<html class=\"no-js\" lang=\"en\" itemscope itemtype=\"http://schema.org/NewsArticle\" itemid=\"http://www.fast"
  },
  {
    "path": "packages/metascraper/test/integration/fast-company/snapshots/index.js.md",
    "chars": 957,
    "preview": "# Snapshot report for `test/integration/fast-company/index.js`\n\nThe actual snapshot is saved in `index.js.snap`.\n\nGenera"
  },
  {
    "path": "packages/metascraper/test/integration/financial-times/index.js",
    "chars": 930,
    "preview": "'use strict'\n\nconst { readFile } = require('fs/promises')\nconst { resolve } = require('path')\nconst test = require('ava'"
  },
  {
    "path": "packages/metascraper/test/integration/financial-times/input.html",
    "chars": 589358,
    "preview": "<!doctype html>\n<html lang=\"en-GB\" class=\"js enhanced js-focus-visible\" data-o-component=\"o-typography\"\n    style=\"overf"
  },
  {
    "path": "packages/metascraper/test/integration/financial-times/snapshots/index.js.md",
    "chars": 1157,
    "preview": "# Snapshot report for `test/integration/financial-times/index.js`\n\nThe actual snapshot is saved in `index.js.snap`.\n\nGen"
  },
  {
    "path": "packages/metascraper/test/integration/forbes/index.js",
    "chars": 960,
    "preview": "'use strict'\n\nconst { readFile } = require('fs/promises')\nconst { resolve } = require('path')\nconst test = require('ava'"
  },
  {
    "path": "packages/metascraper/test/integration/forbes/input.html",
    "chars": 1024743,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\">\n   <head>\n      <style type=\"text/css\">\n         .truste_cursor_pointer {\n         curs"
  },
  {
    "path": "packages/metascraper/test/integration/forbes/snapshots/index.js.md",
    "chars": 919,
    "preview": "# Snapshot report for `test/integration/forbes/index.js`\n\nThe actual snapshot is saved in `index.js.snap`.\n\nGenerated by"
  },
  {
    "path": "packages/metascraper/test/integration/fortune/index.js",
    "chars": 911,
    "preview": "'use strict'\n\nconst { readFile } = require('fs/promises')\nconst { resolve } = require('path')\nconst test = require('ava'"
  },
  {
    "path": "packages/metascraper/test/integration/fortune/input.html",
    "chars": 222500,
    "preview": "<!doctype html>\n<html lang=\"en\" class=\"\"><head><script async=\"\" src=\"https://sb.scorecardresearch.com/beacon.js\"></scrip"
  },
  {
    "path": "packages/metascraper/test/integration/fortune/snapshots/index.js.md",
    "chars": 793,
    "preview": "# Snapshot report for `test/integration/fortune/index.js`\n\nThe actual snapshot is saved in `index.js.snap`.\n\nGenerated b"
  },
  {
    "path": "packages/metascraper/test/integration/github/index.js",
    "chars": 940,
    "preview": "'use strict'\n\nconst { readFile } = require('fs/promises')\nconst { resolve } = require('path')\nconst test = require('ava'"
  },
  {
    "path": "packages/metascraper/test/integration/github/input.html",
    "chars": 424358,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\" data-color-mode=\"dark\" data-light-theme=\"light\"\n  data-dark-theme=\"dark\">\n\n<head>\n  <met"
  },
  {
    "path": "packages/metascraper/test/integration/github/snapshots/index.js.md",
    "chars": 892,
    "preview": "# Snapshot report for `test/integration/github/index.js`\n\nThe actual snapshot is saved in `index.js.snap`.\n\nGenerated by"
  },
  {
    "path": "packages/metascraper/test/integration/globenewswire/index.js",
    "chars": 1002,
    "preview": "'use strict'\n\nconst { readFile } = require('fs/promises')\nconst { resolve } = require('path')\nconst test = require('ava'"
  },
  {
    "path": "packages/metascraper/test/integration/globenewswire/input.html",
    "chars": 67100,
    "preview": "<!DOCTYPE html>\n<html xmlns=\"http://www.w3.org/1999/xhtml\" lang=\"en\">\n\n<head>\n  <meta charset=\"UTF-8\">\n  <meta name=\"vie"
  },
  {
    "path": "packages/metascraper/test/integration/globenewswire/snapshots/index.js.md",
    "chars": 962,
    "preview": "# Snapshot report for `test/integration/globenewswire/index.js`\n\nThe actual snapshot is saved in `index.js.snap`.\n\nGener"
  },
  {
    "path": "packages/metascraper/test/integration/googleblog/index.js",
    "chars": 1154,
    "preview": "'use strict'\n\nconst { readFile } = require('fs/promises')\nconst { resolve } = require('path')\nconst test = require('ava'"
  },
  {
    "path": "packages/metascraper/test/integration/googleblog/input.html",
    "chars": 103354,
    "preview": "\n<!DOCTYPE html>\n<html class='v2 detail-page' dir='ltr' itemscope='' itemtype='http://schema.org/Blog' lang='en' xmlns='"
  },
  {
    "path": "packages/metascraper/test/integration/googleblog/snapshots/index.js.md",
    "chars": 836,
    "preview": "# Snapshot report for `test/integration/googleblog/index.js`\n\nThe actual snapshot is saved in `index.js.snap`.\n\nGenerate"
  },
  {
    "path": "packages/metascraper/test/integration/hola/index.js",
    "chars": 956,
    "preview": "'use strict'\n\nconst { readFile } = require('fs/promises')\nconst { resolve } = require('path')\nconst test = require('ava'"
  },
  {
    "path": "packages/metascraper/test/integration/hola/input.html",
    "chars": 194444,
    "preview": "<!DOCTYPE html>\n<html lang=\"en-us\" data-previous-scroll-y=\"-0px\" class=\"sp-message-open\"><head><meta charset=\"utf-8\"><me"
  },
  {
    "path": "packages/metascraper/test/integration/hola/snapshots/index.js.md",
    "chars": 951,
    "preview": "# Snapshot report for `test/integration/hola/index.js`\n\nThe actual snapshot is saved in `index.js.snap`.\n\nGenerated by ["
  },
  {
    "path": "packages/metascraper/test/integration/inc/index.js",
    "chars": 915,
    "preview": "'use strict'\n\nconst { readFile } = require('fs/promises')\nconst { resolve } = require('path')\nconst test = require('ava'"
  },
  {
    "path": "packages/metascraper/test/integration/inc/input.html",
    "chars": 433814,
    "preview": "\n\n<!DOCTYPE html>\n<html xmlns=\"http://www.w3.org/1999/xhtml\" lang=\"en\" xml:lang=\"en\" xmlns:og=\"http://opengraphprotocol."
  },
  {
    "path": "packages/metascraper/test/integration/inc/snapshots/index.js.md",
    "chars": 764,
    "preview": "# Snapshot report for `test/integration/inc/index.js`\n\nThe actual snapshot is saved in `index.js.snap`.\n\nGenerated by [A"
  },
  {
    "path": "packages/metascraper/test/integration/indiehackers/index.js",
    "chars": 925,
    "preview": "'use strict'\n\nconst { readFile } = require('fs/promises')\nconst { resolve } = require('path')\nconst test = require('ava'"
  },
  {
    "path": "packages/metascraper/test/integration/indiehackers/input.html",
    "chars": 201696,
    "preview": "<!DOCTYPE html><html lang=\"en-US\" class=\" \"><head><meta charset=\"utf-8\"><meta content=\"IE=edge\" http-equiv=\"X-UA-Compati"
  },
  {
    "path": "packages/metascraper/test/integration/indiehackers/snapshots/index.js.md",
    "chars": 996,
    "preview": "# Snapshot report for `test/integration/indiehackers/index.js`\n\nThe actual snapshot is saved in `index.js.snap`.\n\nGenera"
  },
  {
    "path": "packages/metascraper/test/integration/information-week/index.js",
    "chars": 973,
    "preview": "'use strict'\n\nconst { readFile } = require('fs/promises')\nconst { resolve } = require('path')\nconst test = require('ava'"
  },
  {
    "path": "packages/metascraper/test/integration/information-week/input.html",
    "chars": 171781,
    "preview": "\n<!DOCTYPE HTML>\n<html lang=\"en\">\n<head>\n<link href='http://fonts.googleapis.com/css?family=Roboto+Slab:700' rel='styles"
  },
  {
    "path": "packages/metascraper/test/integration/information-week/snapshots/index.js.md",
    "chars": 862,
    "preview": "# Snapshot report for `test/integration/information-week/index.js`\n\nThe actual snapshot is saved in `index.js.snap`.\n\nGe"
  },
  {
    "path": "packages/metascraper/test/integration/instagram/index.js",
    "chars": 894,
    "preview": "'use strict'\n\nconst { readFile } = require('fs/promises')\nconst { resolve } = require('path')\nconst test = require('ava'"
  },
  {
    "path": "packages/metascraper/test/integration/instagram/input.html",
    "chars": 260579,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\" class=\"js not-logged-in client-root js-focus-visible sDN5V\">\n\n<head>\n  <meta charset=\"ut"
  },
  {
    "path": "packages/metascraper/test/integration/instagram/snapshots/index.js.md",
    "chars": 987,
    "preview": "# Snapshot report for `test/integration/instagram/index.js`\n\nThe actual snapshot is saved in `index.js.snap`.\n\nGenerated"
  },
  {
    "path": "packages/metascraper/test/integration/itpro/index.js",
    "chars": 960,
    "preview": "'use strict'\n\nconst { readFile } = require('fs/promises')\nconst { resolve } = require('path')\nconst test = require('ava'"
  },
  {
    "path": "packages/metascraper/test/integration/itpro/input.html",
    "chars": 986037,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\" dir=\"ltr\" data-locale=\"US\" class=\"itpro \"><head>\n<!-- [METATAGS - critical] -->\n<meta ch"
  },
  {
    "path": "packages/metascraper/test/integration/itpro/snapshots/index.js.md",
    "chars": 855,
    "preview": "# Snapshot report for `test/integration/itpro/index.js`\n\nThe actual snapshot is saved in `index.js.snap`.\n\nGenerated by "
  },
  {
    "path": "packages/metascraper/test/integration/jewish-business-news/index.js",
    "chars": 1222,
    "preview": "'use strict'\n\nconst { readFile } = require('fs/promises')\nconst { resolve } = require('path')\nconst test = require('ava'"
  },
  {
    "path": "packages/metascraper/test/integration/jewish-business-news/input.html",
    "chars": 135231,
    "preview": "<!DOCTYPE html>\n<html lang=\"en-US\"><head>\n<meta charset=\"UTF-8\">\n<meta name=\"viewport\" id=\"viewport\" content=\"width=devi"
  },
  {
    "path": "packages/metascraper/test/integration/jewish-business-news/snapshots/index.js.md",
    "chars": 897,
    "preview": "# Snapshot report for `test/integration/jewish-business-news/index.js`\n\nThe actual snapshot is saved in `index.js.snap`."
  },
  {
    "path": "packages/metascraper/test/integration/lean-data/index.js",
    "chars": 1050,
    "preview": "'use strict'\n\nconst { readFile } = require('fs/promises')\nconst { resolve } = require('path')\nconst test = require('ava'"
  },
  {
    "path": "packages/metascraper/test/integration/lean-data/input.html",
    "chars": 69433,
    "preview": "\n<!DOCTYPE html>\n<html  xmlns=\"http://www.w3.org/1999/xhtml\" prefix=\"\" lang=\"en-US\" class=\" html_stretched responsive av"
  },
  {
    "path": "packages/metascraper/test/integration/lean-data/snapshots/index.js.md",
    "chars": 888,
    "preview": "# Snapshot report for `test/integration/lean-data/index.js`\n\nThe actual snapshot is saved in `index.js.snap`.\n\nGenerated"
  },
  {
    "path": "packages/metascraper/test/integration/learnnode/index.js",
    "chars": 876,
    "preview": "'use strict'\n\nconst { readFile } = require('fs/promises')\nconst { resolve } = require('path')\nconst test = require('ava'"
  },
  {
    "path": "packages/metascraper/test/integration/learnnode/input.html",
    "chars": 76217,
    "preview": "<!DOCTYPE html>\n<html 💻=\"Hey! I'm Wes Bos 🇨🇦👦😎. Feel free to snoop 👀, tweet any questions about this site @WesBos\">\n  <h"
  },
  {
    "path": "packages/metascraper/test/integration/learnnode/snapshots/index.js.md",
    "chars": 731,
    "preview": "# Snapshot report for `test/integration/learnnode/index.js`\n\nThe actual snapshot is saved in `index.js.snap`.\n\nGenerated"
  },
  {
    "path": "packages/metascraper/test/integration/linkedin-company/index.js",
    "chars": 906,
    "preview": "'use strict'\n\nconst { readFile } = require('fs/promises')\nconst { resolve } = require('path')\nconst test = require('ava'"
  },
  {
    "path": "packages/metascraper/test/integration/linkedin-company/input.html",
    "chars": 357925,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\"><head>\n        <meta name=\"pageKey\" content=\"d_org_guest_company_overview\">\n          \n "
  },
  {
    "path": "packages/metascraper/test/integration/linkedin-company/snapshots/index.js.md",
    "chars": 1407,
    "preview": "# Snapshot report for `test/integration/linkedin-company/index.js`\n\nThe actual snapshot is saved in `index.js.snap`.\n\nGe"
  },
  {
    "path": "packages/metascraper/test/integration/linkedin-pulse/index.js",
    "chars": 964,
    "preview": "'use strict'\n\nconst { readFile } = require('fs/promises')\nconst { resolve } = require('path')\nconst test = require('ava'"
  },
  {
    "path": "packages/metascraper/test/integration/linkedin-pulse/input.html",
    "chars": 157587,
    "preview": "<!DOCTYPE html>\n<!--[if lt IE 7]> <html lang=\"en\" class=\"ie ie6 lte9 lte8 lte7 os-mac\"> <![endif]-->\n<!--[if IE 7]> <htm"
  },
  {
    "path": "packages/metascraper/test/integration/linkedin-pulse/snapshots/index.js.md",
    "chars": 993,
    "preview": "# Snapshot report for `test/integration/linkedin-pulse/index.js`\n\nThe actual snapshot is saved in `index.js.snap`.\n\nGene"
  },
  {
    "path": "packages/metascraper/test/integration/los-angeles-times/index.js",
    "chars": 950,
    "preview": "'use strict'\n\nconst { readFile } = require('fs/promises')\nconst { resolve } = require('path')\nconst test = require('ava'"
  },
  {
    "path": "packages/metascraper/test/integration/los-angeles-times/input.html",
    "chars": 353449,
    "preview": "<!DOCTYPE html>\n<html class=\"page article-page is-desktop\" lang=\"en-US\"><head><script src=\"//javascript:;\"></script><scr"
  },
  {
    "path": "packages/metascraper/test/integration/los-angeles-times/snapshots/index.js.md",
    "chars": 1069,
    "preview": "# Snapshot report for `test/integration/los-angeles-times/index.js`\n\nThe actual snapshot is saved in `index.js.snap`.\n\nG"
  },
  {
    "path": "packages/metascraper/test/integration/mac-rumors/index.js",
    "chars": 933,
    "preview": "'use strict'\n\nconst { readFile } = require('fs/promises')\nconst { resolve } = require('path')\nconst test = require('ava'"
  },
  {
    "path": "packages/metascraper/test/integration/mac-rumors/input.html",
    "chars": 152105,
    "preview": "<!doctype html>\n<html class=\"no-js\" id=\"html\" lang=\"en\"><head prefix=\"og: http://ogp.me/ns# fb: http://ogp.me/ns/fb# art"
  },
  {
    "path": "packages/metascraper/test/integration/mac-rumors/snapshots/index.js.md",
    "chars": 896,
    "preview": "# Snapshot report for `test/integration/mac-rumors/index.js`\n\nThe actual snapshot is saved in `index.js.snap`.\n\nGenerate"
  },
  {
    "path": "packages/metascraper/test/integration/marketing-land/index.js",
    "chars": 943,
    "preview": "'use strict'\n\nconst { readFile } = require('fs/promises')\nconst { resolve } = require('path')\nconst test = require('ava'"
  },
  {
    "path": "packages/metascraper/test/integration/marketing-land/input.html",
    "chars": 119369,
    "preview": "\n<!DOCTYPE html>\n<!--[if lt IE 7]><html class=\"no-js lt-ie9 lt-ie8 lt-ie7 is_msie\"><![endif]-->\n<!--[if IE 7]><html clas"
  },
  {
    "path": "packages/metascraper/test/integration/marketing-land/snapshots/index.js.md",
    "chars": 908,
    "preview": "# Snapshot report for `test/integration/marketing-land/index.js`\n\nThe actual snapshot is saved in `index.js.snap`.\n\nGene"
  },
  {
    "path": "packages/metascraper/test/integration/mashable/index.js",
    "chars": 904,
    "preview": "'use strict'\n\nconst { readFile } = require('fs/promises')\nconst { resolve } = require('path')\nconst test = require('ava'"
  },
  {
    "path": "packages/metascraper/test/integration/mashable/input.html",
    "chars": 290032,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\" data-lt-installed=\"true\">\n\n<head>\n  <script async=\"\" src=\"//connect.facebook.net/en_US/f"
  },
  {
    "path": "packages/metascraper/test/integration/mashable/snapshots/index.js.md",
    "chars": 830,
    "preview": "# Snapshot report for `test/integration/mashable/index.js`\n\nThe actual snapshot is saved in `index.js.snap`.\n\nGenerated "
  },
  {
    "path": "packages/metascraper/test/integration/medium/index.js",
    "chars": 918,
    "preview": "'use strict'\n\nconst { readFile } = require('fs/promises')\nconst { resolve } = require('path')\nconst test = require('ava'"
  },
  {
    "path": "packages/metascraper/test/integration/medium/input.html",
    "chars": 213422,
    "preview": "<!doctype html>\n<html lang=\"en\">\n\n<head>\n  <script defer src=\"https://cdn.optimizely.com/js/16180790160.js\"></script>\n  "
  },
  {
    "path": "packages/metascraper/test/integration/medium/snapshots/index.js.md",
    "chars": 719,
    "preview": "# Snapshot report for `test/integration/medium/index.js`\n\nThe actual snapshot is saved in `index.js.snap`.\n\nGenerated by"
  },
  {
    "path": "packages/metascraper/test/integration/milanocittastato/index.js",
    "chars": 894,
    "preview": "'use strict'\n\nconst { readFile } = require('fs/promises')\nconst test = require('ava')\nconst { resolve } = require('path'"
  },
  {
    "path": "packages/metascraper/test/integration/milanocittastato/input.html",
    "chars": 564455,
    "preview": "<!DOCTYPE html>\n<html lang=\"it-IT\"\n  class=\" td-md-is-os-x td-md-is-chrome js_active  vc_desktop  vc_transform  vc_trans"
  },
  {
    "path": "packages/metascraper/test/integration/milanocittastato/snapshots/index.js.md",
    "chars": 799,
    "preview": "# Snapshot report for `test/integration/milanocittastato/index.js`\n\nThe actual snapshot is saved in `index.js.snap`.\n\nGe"
  },
  {
    "path": "packages/metascraper/test/integration/nbcnews/index.js",
    "chars": 963,
    "preview": "'use strict'\n\nconst { readFile } = require('fs/promises')\nconst { resolve } = require('path')\nconst test = require('ava'"
  },
  {
    "path": "packages/metascraper/test/integration/nbcnews/input.html",
    "chars": 306039,
    "preview": "<!DOCTYPE html><html lang=\"en\"><head><link href=\"https://nodeassets.nbcnews.com/assets/fonts/shared/fontface.css\" rel=\"s"
  },
  {
    "path": "packages/metascraper/test/integration/nbcnews/snapshots/index.js.md",
    "chars": 993,
    "preview": "# Snapshot report for `packages/metascraper/test/integration/nbcnews/index.js`\n\nThe actual snapshot is saved in `index.j"
  },
  {
    "path": "packages/metascraper/test/integration/npr/index.js",
    "chars": 906,
    "preview": "'use strict'\n\nconst { readFile } = require('fs/promises')\nconst { resolve } = require('path')\nconst test = require('ava'"
  },
  {
    "path": "packages/metascraper/test/integration/npr/input.html",
    "chars": 101362,
    "preview": "<!DOCTYPE html>\n<html class=\"js no-touch csstransforms3d video audio audio-modules-mounted\" lang=\"en\" style=\"\" data-what"
  },
  {
    "path": "packages/metascraper/test/integration/npr/snapshots/index.js.md",
    "chars": 1134,
    "preview": "# Snapshot report for `test/integration/npr/index.js`\n\nThe actual snapshot is saved in `index.js.snap`.\n\nGenerated by [A"
  },
  {
    "path": "packages/metascraper/test/integration/nytimes/index.js",
    "chars": 1259,
    "preview": "'use strict'\n\nconst { readFile } = require('fs/promises')\nconst { resolve } = require('path')\nconst test = require('ava'"
  },
  {
    "path": "packages/metascraper/test/integration/nytimes/input/article.html",
    "chars": 530500,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\" class=\"story nytapp-vi-article\"\n  xmlns:og=\"http://opengraphprotocol.org/schema/\" data-r"
  },
  {
    "path": "packages/metascraper/test/integration/nytimes/input/opinion.html",
    "chars": 1407889,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\" class=\"story nytapp-vi-article\"\n  xmlns:og=\"http://opengraphprotocol.org/schema/\" data-r"
  },
  {
    "path": "packages/metascraper/test/integration/nytimes/snapshots/index.js.md",
    "chars": 2044,
    "preview": "# Snapshot report for `test/integration/nytimes/index.js`\n\nThe actual snapshot is saved in `index.js.snap`.\n\nGenerated b"
  },
  {
    "path": "packages/metascraper/test/integration/pikabu/index.js",
    "chars": 962,
    "preview": "'use strict'\n\nconst { readFile } = require('fs/promises')\nconst { resolve } = require('path')\nconst test = require('ava'"
  },
  {
    "path": "packages/metascraper/test/integration/pikabu/input.html",
    "chars": 861345,
    "preview": "<!doctype html>\n<html lang=\"ru\" class=\"dv\" dir=\"ltr\" data-theme-dark=\"true\" style=\"--animations-state: paused;\"><head><m"
  },
  {
    "path": "packages/metascraper/test/integration/pikabu/snapshots/index.js.md",
    "chars": 698,
    "preview": "# Snapshot report for `test/integration/pikabu/index.js`\n\nThe actual snapshot is saved in `index.js.snap`.\n\nGenerated by"
  },
  {
    "path": "packages/metascraper/test/integration/postplanner/index.js",
    "chars": 919,
    "preview": "'use strict'\n\nconst { readFile } = require('fs/promises')\nconst { resolve } = require('path')\nconst test = require('ava'"
  },
  {
    "path": "packages/metascraper/test/integration/postplanner/input.html",
    "chars": 250955,
    "preview": "<!DOCTYPE html>\n<html data-whatinput=\"keyboard\" data-whatintent=\"mouse\" class=\" whatinput-types-initial whatinput-types-"
  },
  {
    "path": "packages/metascraper/test/integration/postplanner/snapshots/index.js.md",
    "chars": 991,
    "preview": "# Snapshot report for `test/integration/postplanner/index.js`\n\nThe actual snapshot is saved in `index.js.snap`.\n\nGenerat"
  },
  {
    "path": "packages/metascraper/test/integration/pr-newswire/index.js",
    "chars": 1014,
    "preview": "'use strict'\n\nconst { readFile } = require('fs/promises')\nconst { resolve } = require('path')\nconst test = require('ava'"
  },
  {
    "path": "packages/metascraper/test/integration/pr-newswire/input.html",
    "chars": 337617,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\"><head>\n  <meta charset=\"utf-8\">\n  <meta content=\"IE=edge,chrome=1\" http-equiv=\"X-UA-Comp"
  },
  {
    "path": "packages/metascraper/test/integration/pr-newswire/snapshots/index.js.md",
    "chars": 1013,
    "preview": "# Snapshot report for `test/integration/pr-newswire/index.js`\n\nThe actual snapshot is saved in `index.js.snap`.\n\nGenerat"
  },
  {
    "path": "packages/metascraper/test/integration/qz/index.js",
    "chars": 1002,
    "preview": "'use strict'\n\nconst { readFile } = require('fs/promises')\nconst { resolve } = require('path')\nconst test = require('ava'"
  },
  {
    "path": "packages/metascraper/test/integration/qz/input.html",
    "chars": 303019,
    "preview": "<!DOCTYPE html>\n<html class=\"intent-mouse\" lang=\"en\" data-rh=\"lang\">\n<div id=\"d9c2decb-f5df-4202-b4b2-94dd0604574e\" styl"
  }
]

// ... and 594 more files (download for full content)

About this extraction

This page contains the full source code of the ianstormtaylor/metascraper GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 794 files (72.7 MB), approximately 19.1M tokens, and a symbol index with 74 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!