|
1 | | -import { Setting } from "obsidian"; |
| 1 | +import { Setting, requestUrl } from "obsidian"; |
2 | 2 | import { PluginSettings } from "settings"; |
3 | 3 | import { EmbedSource, EnableEmbedKey } from "./"; |
4 | | - |
5 | | -import got from "got"; |
6 | | -import metascraperModule from "metascraper"; |
7 | | -import metascraperTitleModule from "metascraper-title"; |
8 | | -import metascraperDescriptionModule from "metascraper-description"; |
9 | | -import metascraperImageModule from "metascraper-image"; |
10 | | - |
11 | | -const metascraper = metascraperModule([ |
12 | | - metascraperTitleModule(), |
13 | | - metascraperImageModule(), |
14 | | - metascraperDescriptionModule(), |
15 | | -]); |
| 4 | +import { getPreviewFromContent } from "link-preview-js"; |
16 | 5 |
|
17 | 6 | export class GenericPreviewEmbed implements EmbedSource { |
18 | 7 | name = "Generic Preview"; |
19 | 8 | enabledKey: EnableEmbedKey = "replaceGenericLinks"; |
20 | | - // unmatchable regex |
21 | | - // this embed will be created as a fallback on all others failing to match |
22 | | - regex = new RegExp("(?!)"); |
| 9 | + regex = new RegExp(""); |
23 | 10 |
|
24 | 11 | createEmbed( |
25 | 12 | link: string, |
26 | 13 | container: HTMLElement, |
27 | 14 | settings: Readonly<PluginSettings>, |
28 | 15 | currentTheme: "light" | "dark", |
29 | 16 | ) { |
30 | | - const preview = document.createElement("div"); |
31 | | - preview.textContent = "Loading..."; |
| 17 | + const preview = document.createElement("a"); |
| 18 | + preview.setAttr("href", link); |
| 19 | + preview.classList.add("preview"); |
| 20 | + preview.textContent = "Loading embed..."; |
32 | 21 |
|
33 | 22 | const loadPreview = async () => { |
34 | | - const { body: html, url } = await got(link); |
35 | | - const metadata = await metascraper({ html, url }); |
36 | | - preview.innerHTML = `<h2>${metadata.title}</h2> <br> <p>${metadata.description}</p>` |
| 23 | + const res = await requestUrl({ url: link }); |
| 24 | + const metadata = await getPreviewFromContent({ |
| 25 | + headers: res.headers, |
| 26 | + data: res.text, |
| 27 | + url: link |
| 28 | + }); |
| 29 | + |
| 30 | + if (!("title" in metadata)) return; |
| 31 | + |
| 32 | + preview.innerHTML = |
| 33 | + String.raw` |
| 34 | + <div class="image-container"> |
| 35 | + ${ metadata.images.length ? String.raw`<img src="${metadata.images[0]}" />` : "" } |
| 36 | + </div> |
| 37 | + <div class="content"> |
| 38 | + <div class="title">${metadata.title}</div> |
| 39 | + <div class="description">${metadata.description ? metadata.description : ""}</div> |
| 40 | + </div> |
| 41 | + `; |
37 | 42 | } |
38 | 43 | loadPreview(); |
39 | 44 |
|
|
0 commit comments