metascraper-instagram 5.45.25 → 5.45.29

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "metascraper-instagram",
3
3
  "description": "Metascraper integration for Instagram",
4
4
  "homepage": "https://github.com/microlinkhq/metascraper/packages/metascraper-instagram",
5
- "version": "5.45.25",
5
+ "version": "5.45.29",
6
6
  "types": "src/index.d.ts",
7
7
  "main": "src/index.js",
8
8
  "author": {
@@ -23,9 +23,8 @@
23
23
  "metascraper"
24
24
  ],
25
25
  "dependencies": {
26
- "@metascraper/helpers": "^5.45.25",
27
- "jsdom": "~24.1.0",
28
- "lodash": "~4.17.21"
26
+ "@metascraper/helpers": "5.45.28",
27
+ "franc": "~5.0.0"
29
28
  },
30
29
  "devDependencies": {
31
30
  "ava": "5"
@@ -40,5 +39,5 @@
40
39
  "test": "NODE_PATH=.. TZ=UTC ava --timeout 15s"
41
40
  },
42
41
  "license": "MIT",
43
- "gitHead": "50363a681cb279e659c1b4ee6d30319d9d9c297f"
42
+ "gitHead": "9043b797e66766d553e40b62828d08a0374fa819"
44
43
  }
package/src/index.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- declare function rules(): import('metascraper').Rules;
2
- export = rules;
1
+ declare function rules (): import('metascraper').Rules
2
+ export = rules
package/src/index.js CHANGED
@@ -1,82 +1,49 @@
1
1
  'use strict'
2
2
 
3
- const { composeRule, memoizeOne, parseUrl } = require('@metascraper/helpers')
4
- const { JSDOM, VirtualConsole } = require('jsdom')
5
- const { keys, first, get } = require('lodash')
3
+ const franc = require('franc')
4
+
5
+ const {
6
+ author,
7
+ date,
8
+ iso6393,
9
+ lang,
10
+ memoizeOne,
11
+ parseUrl,
12
+ title
13
+ } = require('@metascraper/helpers')
14
+
15
+ const detectLang = input => lang(iso6393[franc(input)])
6
16
 
7
17
  const test = memoizeOne(
8
18
  url => parseUrl(url).domainWithoutSuffix === 'instagram'
9
19
  )
10
20
 
11
- const getPage = sharedData => first(keys(get(sharedData, 'entry_data')))
12
-
13
- const extractData = memoizeOne((url, $) => {
14
- const dom = new JSDOM($.html(), {
15
- url,
16
- virtualConsole: new VirtualConsole(),
17
- runScripts: 'dangerously'
18
- })
19
- const sharedData = get(dom, 'window._sharedData')
20
-
21
- const page = getPage(sharedData)
22
-
23
- const getTitle = ({ author, username }) =>
24
- author
25
- ? `${author} (@${username}) on Instagram`
26
- : `@${username} on Instagram`
27
-
28
- switch (page) {
29
- case 'PostPage': {
30
- const media = get(
31
- sharedData,
32
- `entry_data.${page}[0].graphql.shortcode_media`
33
- )
34
-
35
- const author = get(media, 'owner.full_name')
36
- const username = get(media, 'owner.username')
37
-
38
- return {
39
- author,
40
- video: get(media, 'video_url'),
41
- image: get(media, 'display_url'),
42
- date: get(media, 'taken_at_timestamp'),
43
- title: getTitle({ author, username }),
44
- description: get(media, 'edge_media_to_caption.edges[0].node.text')
45
- }
46
- }
47
- case 'ProfilePage': {
48
- const user = get(sharedData, `entry_data.${page}[0].graphql.user`)
49
- const author = get(user, 'full_name')
50
- const username = get(user, 'username')
51
-
52
- return {
53
- author,
54
- title: getTitle({ author, username }),
55
- description: get(user, 'biography')
56
- }
57
- }
58
- case 'StoriesPage': {
59
- const user = get(sharedData, `entry_data.${page}[0].user`)
60
- const username = get(user, 'username')
61
-
62
- return {
63
- title: getTitle({ username })
64
- }
65
- }
66
- }
67
- })
68
-
69
- const getData = composeRule(($, url) => extractData(url, $))
21
+ const getDescription = memoizeOne(
22
+ (_, $) => $('meta[property="og:description"]').attr('content'),
23
+ memoizeOne.EqualityFirstArgument
24
+ )
70
25
 
71
26
  module.exports = () => {
72
27
  const rules = {
73
- author: getData({ from: 'author' }),
74
- video: getData({ from: 'video' }),
75
- title: getData({ from: 'title' }),
76
- date: getData({ from: 'date' }),
77
- image: getData({ from: 'image' }),
78
- description: getData({ from: 'description' }),
79
- publisher: () => 'Instagram'
28
+ author: ({ htmlDom: $ }) => {
29
+ const title = $('meta[property="og:title"]').attr('content')
30
+ const value = title.split(' on Instagram')[0]
31
+ return author(value)
32
+ },
33
+ date: ({ htmlDom: $, url }) => {
34
+ const description = getDescription(url, $)
35
+ const dateMatch = description.match(/on ([^,]+, \d{4})/)
36
+ if (dateMatch === null) return
37
+ const dateString = `${dateMatch[1]} GMT`
38
+ return date(new Date(dateString))
39
+ },
40
+ lang: ({ htmlDom: $, url }) => {
41
+ const description = getDescription(url, $)
42
+ const input = description.split(': ').pop().split(' - ').pop()
43
+ return detectLang(input)
44
+ },
45
+ title: ({ htmlDom: $ }) =>
46
+ title($('meta[name="twitter:title"]').attr('content'))
80
47
  }
81
48
 
82
49
  rules.test = ({ url }) => test(url)