diff --git a/packages/icons/src/icons-fetcher.ts b/packages/icons/src/icons-fetcher.ts index 32ba31af8..ba60296a7 100644 --- a/packages/icons/src/icons-fetcher.ts +++ b/packages/icons/src/icons-fetcher.ts @@ -11,6 +11,22 @@ const repositories = [ new URL("https://api.github.com/repos/walkxcode/dashboard-icons/git/trees/main?recursive=true"), "https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/{0}", ), + new GitHubIconRepository( + "selfh.st", + "selfhst/icons", + "CC0-1.0", + new URL("https://github.com/selfhst/icons"), + new URL("https://api.github.com/repos/selfhst/icons/git/trees/main?recursive=true"), + "https://cdn.jsdelivr.net/gh/selfhst/icons/{0}", + ), + new GitHubIconRepository( + "SimpleIcons", + "simple-icons/simple-icons", + "CC0-1.0", + new URL("https://github.com/simple-icons/simple-icons"), + new URL("https://api.github.com/repos/simple-icons/simple-icons/git/trees/master?recursive=true"), + "https://cdn.simpleicons.org/{1}", + ), new JsdelivrIconRepository( "Papirus", "PapirusDevelopmentTeam/papirus-icon-theme", diff --git a/packages/icons/src/repositories/github.icon-repository.ts b/packages/icons/src/repositories/github.icon-repository.ts index 695ade2a0..eb5e92b90 100644 --- a/packages/icons/src/repositories/github.icon-repository.ts +++ b/packages/icons/src/repositories/github.icon-repository.ts @@ -1,3 +1,5 @@ +import { parse } from "path"; + import { fetchWithTimeout } from "@homarr/common"; import type { IconRepositoryLicense } from "../types/icon-repository-license"; @@ -27,19 +29,23 @@ export class GitHubIconRepository extends IconRepository { return { success: true, icons: listOfFiles.tree - .filter((treeItem) => - this.allowedImageFileTypes.some((allowedExtension) => treeItem.path.includes(allowedExtension)), + .filter(({ path }) => + this.allowedImageFileTypes.some((allowedImageFileType) => parse(path).ext === allowedImageFileType), ) - .map((treeItem) => { - const fileNameWithExtension = this.getFileNameWithoutExtensionFromPath(treeItem.path); + .map(({ path, size: sizeInBytes, sha: checksum }) => { + const file = parse(path); + const fileNameWithExtension = file.base; + const imageUrl = new URL( + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + this.repositoryBlobUrlTemplate!.replace("{0}", path).replace("{1}", file.name), + ); return { - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - imageUrl: new URL(this.repositoryBlobUrlTemplate!.replace("{0}", treeItem.path)), - fileNameWithExtension: fileNameWithExtension, + imageUrl, + fileNameWithExtension, local: false, - sizeInBytes: treeItem.size, - checksum: treeItem.sha, + sizeInBytes, + checksum, }; }), slug: this.slug, diff --git a/packages/icons/src/repositories/icon-repository.ts b/packages/icons/src/repositories/icon-repository.ts index 358e48dfa..525ca1422 100644 --- a/packages/icons/src/repositories/icon-repository.ts +++ b/packages/icons/src/repositories/icon-repository.ts @@ -29,8 +29,4 @@ export abstract class IconRepository { } protected abstract getAllIconsInternalAsync(): Promise; - - protected getFileNameWithoutExtensionFromPath(path: string) { - return path.replace(/^.*[\\/]/, ""); - } } diff --git a/packages/icons/src/repositories/jsdelivr.icon-repository.ts b/packages/icons/src/repositories/jsdelivr.icon-repository.ts index 1c153d5b2..c611fcd7e 100644 --- a/packages/icons/src/repositories/jsdelivr.icon-repository.ts +++ b/packages/icons/src/repositories/jsdelivr.icon-repository.ts @@ -1,3 +1,5 @@ +import { parse } from "path"; + import { fetchWithTimeout } from "@homarr/common"; import type { IconRepositoryLicense } from "../types/icon-repository-license"; @@ -23,18 +25,19 @@ export class JsdelivrIconRepository extends IconRepository { return { success: true, icons: listOfFiles.files - .filter((file) => - this.allowedImageFileTypes.some((allowedImageFileType) => file.name.includes(allowedImageFileType)), + .filter(({ name: path }) => + this.allowedImageFileTypes.some((allowedImageFileType) => parse(path).ext === allowedImageFileType), ) - .map((file) => { - const fileNameWithExtension = this.getFileNameWithoutExtensionFromPath(file.name); + .map(({ name: path, size: sizeInBytes, hash: checksum }) => { + const file = parse(path); + const fileNameWithExtension = file.base; return { - imageUrl: new URL(this.repositoryBlobUrlTemplate.replace("{0}", file.name)), - fileNameWithExtension: fileNameWithExtension, + imageUrl: new URL(this.repositoryBlobUrlTemplate.replace("{0}", path).replace("{1}", file.name)), + fileNameWithExtension, local: false, - sizeInBytes: file.size, - checksum: file.hash, + sizeInBytes, + checksum, }; }), slug: this.slug, diff --git a/packages/icons/src/types/icon-repository-license.ts b/packages/icons/src/types/icon-repository-license.ts index a3ebe8728..1a01ca02d 100644 --- a/packages/icons/src/types/icon-repository-license.ts +++ b/packages/icons/src/types/icon-repository-license.ts @@ -1 +1 @@ -export type IconRepositoryLicense = "MIT" | "GPL-3.0" | undefined; +export type IconRepositoryLicense = "MIT" | "GPL-3.0" | "CC0-1.0" | undefined;