Better favicon detection
This commit is contained in:
parent
615fedd64d
commit
eb350e8d6c
|
@ -9,15 +9,17 @@ import { URL } from 'url';
|
|||
|
||||
const logger = new Logger('metadata', 'cyan');
|
||||
|
||||
export async function fetchInstanceMetadata(instance: Instance): Promise<void> {
|
||||
export async function fetchInstanceMetadata(instance: Instance, force = false): Promise<void> {
|
||||
const unlock = await getFetchInstanceMetadataLock(instance.host);
|
||||
|
||||
if (!force) {
|
||||
const _instance = await Instances.findOne({ host: instance.host });
|
||||
const now = Date.now();
|
||||
if (_instance && _instance.infoUpdatedAt && (now - _instance.infoUpdatedAt.getTime() < 1000 * 60 * 60 * 24)) {
|
||||
unlock();
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
logger.info(`Fetching metadata of ${instance.host} ...`);
|
||||
|
||||
|
@ -29,7 +31,7 @@ export async function fetchInstanceMetadata(instance: Instance): Promise<void> {
|
|||
]);
|
||||
|
||||
const [favicon, icon, themeColor, name, description] = await Promise.all([
|
||||
fetchFaviconUrl(instance).catch(() => null),
|
||||
fetchFaviconUrl(instance, dom).catch(() => null),
|
||||
fetchIconUrl(instance, dom, manifest).catch(() => null),
|
||||
getThemeColor(dom, manifest).catch(() => null),
|
||||
getSiteName(info, dom, manifest).catch(() => null),
|
||||
|
@ -150,10 +152,17 @@ async function fetchManifest(instance: Instance): Promise<Record<string, any> |
|
|||
return manifest;
|
||||
}
|
||||
|
||||
async function fetchFaviconUrl(instance: Instance): Promise<string | null> {
|
||||
logger.info(`Fetching favicon URL of ${instance.host} ...`);
|
||||
|
||||
async function fetchFaviconUrl(instance: Instance, doc: DOMWindow['document'] | null): Promise<string | null> {
|
||||
const url = 'https://' + instance.host;
|
||||
|
||||
if (doc) {
|
||||
const href = doc.querySelector('link[rel="icon"]')?.getAttribute('href');
|
||||
|
||||
if (href) {
|
||||
return (new URL(href, url)).href;
|
||||
}
|
||||
}
|
||||
|
||||
const faviconUrl = url + '/favicon.ico';
|
||||
|
||||
const favicon = await fetch(faviconUrl, {
|
||||
|
@ -169,6 +178,11 @@ async function fetchFaviconUrl(instance: Instance): Promise<string | null> {
|
|||
}
|
||||
|
||||
async function fetchIconUrl(instance: Instance, doc: DOMWindow['document'] | null, manifest: Record<string, any> | null): Promise<string | null> {
|
||||
if (manifest && manifest.icons && manifest.icons.length > 0 && manifest.icons[0].src) {
|
||||
const url = 'https://' + instance.host;
|
||||
return (new URL(manifest.icons[0].src, url)).href;
|
||||
}
|
||||
|
||||
if (doc) {
|
||||
const url = 'https://' + instance.host;
|
||||
|
||||
|
@ -183,11 +197,6 @@ async function fetchIconUrl(instance: Instance, doc: DOMWindow['document'] | nul
|
|||
}
|
||||
}
|
||||
|
||||
if (manifest && manifest.icons && manifest.icons.length > 0 && manifest.icons[0].src) {
|
||||
const url = 'https://' + instance.host;
|
||||
return (new URL(manifest.icons[0].src, url)).href;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue