diff --git a/website/package.json b/website/package.json index acb9f507..b8095342 100644 --- a/website/package.json +++ b/website/package.json @@ -50,6 +50,7 @@ "highlight.js": "11.9.0", "lucide-svelte": "^0.323.0", "mdsvex-relative-images": "^1.0.3", + "rehype-auto-ads": "^1.2.0", "rehype-autolink-headings": "^7.1.0", "rehype-slug": "^6.0.0", "remark-container": "^0.1.2", diff --git a/website/pnpm-lock.yaml b/website/pnpm-lock.yaml index d2e9f5fe..7fa6b46c 100644 --- a/website/pnpm-lock.yaml +++ b/website/pnpm-lock.yaml @@ -32,6 +32,9 @@ importers: mdsvex-relative-images: specifier: ^1.0.3 version: 1.0.3 + rehype-auto-ads: + specifier: ^1.2.0 + version: 1.2.0 rehype-autolink-headings: specifier: ^7.1.0 version: 7.1.0 @@ -783,6 +786,9 @@ packages: color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + comma-separated-tokens@2.0.3: + resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + commander@10.0.1: resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} engines: {node: '>=14'} @@ -873,6 +879,10 @@ packages: emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + es6-promise@3.3.1: resolution: {integrity: sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==} @@ -1069,15 +1079,27 @@ packages: resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==} engines: {node: '>= 0.4'} + hast-util-from-html@2.0.3: + resolution: {integrity: sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw==} + + hast-util-from-parse5@8.0.2: + resolution: {integrity: sha512-SfMzfdAi/zAoZ1KkFEyyeXBn7u/ShQrfd675ZEE9M3qj+PMFX05xubzRyF76CCSJu8au9jgVxDV1+okFvgZU4A==} + hast-util-heading-rank@3.0.0: resolution: {integrity: sha512-EJKb8oMUXVHcWZTDepnr+WNbfnXKFNf9duMesmr4S8SXTJBJ9M4Yok08pu9vxdJwdlGRhVumk9mEhkEvKGifwA==} hast-util-is-element@3.0.0: resolution: {integrity: sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==} + hast-util-parse-selector@4.0.0: + resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==} + hast-util-to-string@3.0.0: resolution: {integrity: sha512-OGkAxX1Ua3cbcW6EJ5pT/tslVb90uViVkcJ4ZZIMW/R33DX/AkcJcRrPebPwJkHYwlDHXz4aIwvAAaAdtrACFA==} + hastscript@9.0.0: + resolution: {integrity: sha512-jzaLBGavEDKHrc5EfFImKN7nZKKBdSLIdGvCwDZ9TfzbF2ffXiov8CKE445L2Z1Ek2t/m4SKQ2j6Ipv7NyUolw==} + highlight.js@11.9.0: resolution: {integrity: sha512-fJ7cW7fQGCYAkgv4CPfwFHrfd/cLS4Hau96JuJ+ZTOWhjnhoeN1ub1tFmALm/+lW5z4WCAuAV9bm05AP0mS6Gw==} engines: {node: '>=12.0.0'} @@ -1467,6 +1489,9 @@ packages: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} + parse5@7.2.1: + resolution: {integrity: sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==} + path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} @@ -1609,6 +1634,9 @@ packages: resolution: {integrity: sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==} engines: {node: '>=6'} + property-information@6.5.0: + resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==} + punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} @@ -1634,6 +1662,9 @@ packages: resolution: {integrity: sha512-RSYAtP31mvYLkAHrOlh25pCNQ5hWnT106VukGaaFfuJrZFkGRX5GhUAdPqpSDXxOhA2c4akmRuplv1mRqnBn6Q==} engines: {node: '>=8'} + rehype-auto-ads@1.2.0: + resolution: {integrity: sha512-w0ysjJQginhKai13wcUF/4t1fu3UvPsVt4Y3htGGGs6ojA+J5Nz01I1NOqwrOhgSoT5Bfv7Mihww6tmtV108+g==} + rehype-autolink-headings@7.1.0: resolution: {integrity: sha512-rItO/pSdvnvsP4QRB1pmPiNHUskikqtPojZKJPPPAVx9Hj8i8TwMBhofrrAYRhYOOBZH9tgmG5lPqDLuIWPWmw==} @@ -1960,6 +1991,9 @@ packages: util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + vfile-location@5.0.3: + resolution: {integrity: sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==} + vfile-message@2.0.4: resolution: {integrity: sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==} @@ -2016,6 +2050,9 @@ packages: vite: optional: true + web-namespaces@2.0.1: + resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} + which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} @@ -2660,6 +2697,8 @@ snapshots: color-name@1.1.4: {} + comma-separated-tokens@2.0.3: {} + commander@10.0.1: {} commander@4.1.1: {} @@ -2725,6 +2764,8 @@ snapshots: emoji-regex@9.2.2: {} + entities@4.5.0: {} + es6-promise@3.3.1: {} esbuild@0.19.12: @@ -2982,6 +3023,26 @@ snapshots: dependencies: function-bind: 1.1.2 + hast-util-from-html@2.0.3: + dependencies: + '@types/hast': 3.0.4 + devlop: 1.1.0 + hast-util-from-parse5: 8.0.2 + parse5: 7.2.1 + vfile: 6.0.1 + vfile-message: 4.0.2 + + hast-util-from-parse5@8.0.2: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.2 + devlop: 1.1.0 + hastscript: 9.0.0 + property-information: 6.5.0 + vfile: 6.0.1 + vfile-location: 5.0.3 + web-namespaces: 2.0.1 + hast-util-heading-rank@3.0.0: dependencies: '@types/hast': 3.0.4 @@ -2990,10 +3051,22 @@ snapshots: dependencies: '@types/hast': 3.0.4 + hast-util-parse-selector@4.0.0: + dependencies: + '@types/hast': 3.0.4 + hast-util-to-string@3.0.0: dependencies: '@types/hast': 3.0.4 + hastscript@9.0.0: + dependencies: + '@types/hast': 3.0.4 + comma-separated-tokens: 2.0.3 + hast-util-parse-selector: 4.0.0 + property-information: 6.5.0 + space-separated-tokens: 2.0.2 + highlight.js@11.9.0: {} ignore@5.3.1: {} @@ -3510,6 +3583,10 @@ snapshots: dependencies: callsites: 3.1.0 + parse5@7.2.1: + dependencies: + entities: 4.5.0 + path-exists@4.0.0: {} path-is-absolute@1.0.1: {} @@ -3617,6 +3694,8 @@ snapshots: prismjs@1.29.0: {} + property-information@6.5.0: {} + punycode@2.3.1: {} purgecss@6.0.0-alpha.0: @@ -3640,6 +3719,15 @@ snapshots: regexparam@3.0.0: {} + rehype-auto-ads@1.2.0: + dependencies: + '@types/hast': 3.0.4 + hast-util-from-html: 2.0.3 + hast-util-is-element: 3.0.0 + unified: 11.0.4 + unist-util-visit-parents: 6.0.1 + vfile: 6.0.1 + rehype-autolink-headings@7.1.0: dependencies: '@types/hast': 3.0.4 @@ -4072,6 +4160,11 @@ snapshots: util-deprecate@1.0.2: {} + vfile-location@5.0.3: + dependencies: + '@types/unist': 3.0.2 + vfile: 6.0.1 + vfile-message@2.0.4: dependencies: '@types/unist': 2.0.10 @@ -4119,6 +4212,8 @@ snapshots: optionalDependencies: vite: 5.1.0(@types/node@20.11.16) + web-namespaces@2.0.1: {} + which@2.0.2: dependencies: isexe: 2.0.0 diff --git a/website/posts/images/.gitkeep b/website/posts/images/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/website/posts/spotube-basics.md b/website/posts/spotube-basics.md index 841fbac9..43a33d67 100644 --- a/website/posts/spotube-basics.md +++ b/website/posts/spotube-basics.md @@ -3,6 +3,7 @@ title: Spotube Basics author: Kingkor Roy Tirtho date: 2024-02-10 published: true +cover_img: /images/spotube-basics/cover.jpg --- Spotube is an open-source Spotify client that allows users to stream music from Spotify. To use Spotube, you need to sign in with your Spotify account. Here's a step-by-step guide on how to sign in to Spotube. diff --git a/website/src/app.d.ts b/website/src/app.d.ts index c627dc68..c2f2a735 100644 --- a/website/src/app.d.ts +++ b/website/src/app.d.ts @@ -17,6 +17,10 @@ declare namespace App { } } -declare module '@fortawesome/pro-solid-svg-icons/index.es' { - export * from '@fortawesome/pro-solid-svg-icons'; +declare namespace globalThis { + declare var adsbygoogle: any[]; +} + +declare module "@fortawesome/pro-solid-svg-icons/index.es" { + export * from "@fortawesome/pro-solid-svg-icons"; } diff --git a/website/src/app.html b/website/src/app.html index 088ddd5d..470db728 100644 --- a/website/src/app.html +++ b/website/src/app.html @@ -13,6 +13,9 @@ + + %sveltekit.head% diff --git a/website/src/lib/components/ads/ads.svelte b/website/src/lib/components/ads/ads.svelte new file mode 100644 index 00000000..54cfc2c0 --- /dev/null +++ b/website/src/lib/components/ads/ads.svelte @@ -0,0 +1,32 @@ + + + diff --git a/website/src/lib/components/navbar/darkmode-toggle.svelte b/website/src/lib/components/navbar/darkmode-toggle.svelte index ec4f757c..d05622f9 100644 --- a/website/src/lib/components/navbar/darkmode-toggle.svelte +++ b/website/src/lib/components/navbar/darkmode-toggle.svelte @@ -17,10 +17,8 @@
- {#if label} - - {/if} = { - '/': ['Home', Home], - '/blog': ['Blog', Newspaper], - '/downloads': ['Downloads', Download], - '/about': ['About', null] + "/": ["Home", Home], + "/blog": ["Blog", Newspaper], + "/downloads": ["Downloads", Download], + "/about": ["About", null], }; -const releasesUrl = 'https://github.com/KRTirtho/Spotube/releases/latest/download'; +const releasesUrl = + "https://github.com/KRTirtho/Spotube/releases/latest/download"; export const downloadLinks: Record = { - 'Android Apk': [`${releasesUrl}/Spotube-android-all-arch.apk`, [faAndroid]], - 'Windows Executable': [`${releasesUrl}/Spotube-windows-x86_64-setup.exe`, [faWindows]], - 'macOS Dmg': [`${releasesUrl}/Spotube-macos-universal.dmg`, [faApple]], - 'Ubuntu, Debian': [`${releasesUrl}/Spotube-linux-x86_64.deb`, [faUbuntu, faDebian]], - 'Fedora, Redhat, Opensuse': [ - `${releasesUrl}/Spotube-linux-x86_64.rpm`, - [faFedora, faRedhat, faOpensuse] + "Android Apk": [`${releasesUrl}/Spotube-android-all-arch.apk`, [faAndroid]], + "Windows Executable": [ + `${releasesUrl}/Spotube-windows-x86_64-setup.exe`, + [faWindows], ], - 'iPhone Ipa': [`${releasesUrl}/Spotube-iOS.ipa`, [faApple]] -}; - -export const extendedDownloadLinks: Record = { - Android: [`${releasesUrl}/Spotube-android-all-arch.apk`, [faAndroid], 'apk'], - Windows: [`${releasesUrl}/Spotube-windows-x86_64-setup.exe`, [faWindows], 'exe'], - macOS: [`${releasesUrl}/Spotube-macos-universal.dmg`, [faApple], 'dmg'], - 'Ubuntu, Debian': [`${releasesUrl}/Spotube-linux-x86_64.deb`, [faUbuntu, faDebian], 'deb'], - 'Fedora, Redhat, Opensuse': [ + "macOS Dmg": [`${releasesUrl}/Spotube-macos-universal.dmg`, [faApple]], + "Ubuntu, Debian": [ + `${releasesUrl}/Spotube-linux-x86_64.deb`, + [faUbuntu, faDebian], + ], + "Fedora, Redhat, Opensuse": [ `${releasesUrl}/Spotube-linux-x86_64.rpm`, [faFedora, faRedhat, faOpensuse], - 'rpm' ], - iPhone: [`${releasesUrl}/Spotube-iOS.ipa`, [faApple], 'ipa'] + "iPhone Ipa": [`${releasesUrl}/Spotube-iOS.ipa`, [faApple]], }; -const nightlyReleaseUrl = 'https://github.com/KRTirtho/Spotube/releases/download/nightly'; +export const extendedDownloadLinks: Record< + string, + [string, IconDefinition[], string] +> = { + Android: [`${releasesUrl}/Spotube-android-all-arch.apk`, [faAndroid], "apk"], + Windows: [ + `${releasesUrl}/Spotube-windows-x86_64-setup.exe`, + [faWindows], + "exe", + ], + macOS: [`${releasesUrl}/Spotube-macos-universal.dmg`, [faApple], "dmg"], + "Ubuntu, Debian": [ + `${releasesUrl}/Spotube-linux-x86_64.deb`, + [faUbuntu, faDebian], + "deb", + ], + "Fedora, Redhat, Opensuse": [ + `${releasesUrl}/Spotube-linux-x86_64.rpm`, + [faFedora, faRedhat, faOpensuse], + "rpm", + ], + iPhone: [`${releasesUrl}/Spotube-iOS.ipa`, [faApple], "ipa"], +}; -export const extendedNightlyDownloadLinks: Record = { - Android: [`${nightlyReleaseUrl}/Spotube-android-all-arch.apk`, [faAndroid], 'apk'], - Windows: [`${nightlyReleaseUrl}/Spotube-windows-x86_64-setup.exe`, [faWindows], 'exe'], - macOS: [`${nightlyReleaseUrl}/Spotube-macos-universal.dmg`, [faApple], 'dmg'], - 'Ubuntu, Debian': [`${nightlyReleaseUrl}/Spotube-linux-x86_64.deb`, [faUbuntu, faDebian], 'deb'], - 'Fedora, Redhat, Opensuse': [ +const nightlyReleaseUrl = + "https://github.com/KRTirtho/Spotube/releases/download/nightly"; + +export const extendedNightlyDownloadLinks: Record< + string, + [string, IconDefinition[], string] +> = { + Android: [ + `${nightlyReleaseUrl}/Spotube-android-all-arch.apk`, + [faAndroid], + "apk", + ], + Windows: [ + `${nightlyReleaseUrl}/Spotube-windows-x86_64-setup.exe`, + [faWindows], + "exe", + ], + macOS: [`${nightlyReleaseUrl}/Spotube-macos-universal.dmg`, [faApple], "dmg"], + "Ubuntu, Debian": [ + `${nightlyReleaseUrl}/Spotube-linux-x86_64.deb`, + [faUbuntu, faDebian], + "deb", + ], + "Fedora, Redhat, Opensuse": [ `${nightlyReleaseUrl}/Spotube-linux-x86_64.rpm`, [faFedora, faRedhat, faOpensuse], - 'rpm' + "rpm", ], - iPhone: [`${nightlyReleaseUrl}/Spotube-iOS.ipa`, [faApple], 'ipa'] + iPhone: [`${nightlyReleaseUrl}/Spotube-iOS.ipa`, [faApple], "ipa"], }; + +export const ADS_SLOTS = Object.freeze({ + rootPageDisplay: 5979549631, + blogPageInFeed: 3386010031, + downloadPageDisplay: 9521642154, + packagePageArticle: 9119323068, + // This is being used for rehype-auto-ads in svelte.config.js + blogArticlePageArticle: 6788673194, +}); diff --git a/website/src/lib/posts.ts b/website/src/lib/posts.ts index 02fa3d07..b46c49eb 100644 --- a/website/src/lib/posts.ts +++ b/website/src/lib/posts.ts @@ -4,6 +4,7 @@ export interface Post { tags: string[]; published: boolean; author: string; + cover_img: string | null; readingTime: { text: string; minutes: number; @@ -21,21 +22,23 @@ export interface Post { export const getPosts = async () => { // Fetch posts from local Markdown files const posts: Post[] = await Promise.all( - Object.entries(import.meta.glob('../../posts/**/*.md')).map(async ([path, resolver]) => { - const resolved = (await resolver()) as { metadata: Post }; - const { metadata } = resolved; - const slug = path.split('/').pop()?.slice(0, -3) ?? ''; - return { ...metadata, slug }; - }) - ); + Object.entries(import.meta.glob("../../posts/**/*.md")).map( + async ([path, resolver]) => { + const resolved = (await resolver()) as { metadata: Post }; + const { metadata } = resolved; + const slug = path.split("/").pop()?.slice(0, -3) ?? ""; + return { ...metadata, slug }; + }, + ), + ).then((posts) => posts.filter((post) => post.published)); let sortedPosts = posts.sort((a, b) => +new Date(b.date) - +new Date(a.date)); sortedPosts = sortedPosts.map((post) => ({ - ...post + ...post, })); return { - posts: sortedPosts + posts: sortedPosts, }; }; diff --git a/website/src/routes/+page.svelte b/website/src/routes/+page.svelte index 7fe0a36f..7e26b4c2 100644 --- a/website/src/routes/+page.svelte +++ b/website/src/routes/+page.svelte @@ -10,6 +10,8 @@ import { Download, Heart } from 'lucide-svelte'; import type { PageData } from './$types'; import { Avatar } from '@skeletonlabs/skeleton'; + import Ads from '$lib/components/ads/ads.svelte'; + import { ADS_SLOTS } from '$lib'; export let data: PageData; @@ -75,6 +77,8 @@
+ +

@@ -111,4 +115,5 @@ {/each} + diff --git a/website/src/routes/blog/+page.svelte b/website/src/routes/blog/+page.svelte index 5ee98938..c800c63c 100644 --- a/website/src/routes/blog/+page.svelte +++ b/website/src/routes/blog/+page.svelte @@ -1,4 +1,7 @@

Blog Posts


-
diff --git a/website/src/routes/blog/+page.ts b/website/src/routes/blog/+page.ts index c48ac87f..fca1bb62 100644 --- a/website/src/routes/blog/+page.ts +++ b/website/src/routes/blog/+page.ts @@ -1,11 +1,10 @@ -import type { Post } from '$lib/posts.js'; +import type { Post } from "$lib/posts.js"; export const load = async ({ fetch }) => { - const res = await fetch(`api/posts`); + const res = await fetch("api/posts"); if (res.ok) { const posts: Post[] = await res.json(); return { posts }; - } else { - return { posts: [] }; } + return { posts: [] }; }; diff --git a/website/src/routes/blog/[slug]/+page.svelte b/website/src/routes/blog/[slug]/+page.svelte index 1931a991..444c3a4a 100644 --- a/website/src/routes/blog/[slug]/+page.svelte +++ b/website/src/routes/blog/[slug]/+page.svelte @@ -3,9 +3,9 @@ import type { PageData } from './$types'; export let data: PageData; - let { + const { Content, - meta: { date, title, readingTime } + meta: { date, title, readingTime, cover_img } } = data as Required; @@ -14,13 +14,19 @@
-

{title}

+
+

{title}

+
+

{new Date(date).toDateString()}

+

{readingTime?.text ?? ''}

+

-
-

{new Date(date).toDateString()}

-

{readingTime?.text ?? ''}

- - - -
+ + +
diff --git a/website/src/routes/downloads/+page.svelte b/website/src/routes/downloads/+page.svelte index 50d101ee..9ee994c8 100644 --- a/website/src/routes/downloads/+page.svelte +++ b/website/src/routes/downloads/+page.svelte @@ -1,8 +1,9 @@ -
+

Download @@ -22,7 +23,7 @@ -


+

Other Downloads



@@ -36,4 +37,5 @@ {/each} +

diff --git a/website/src/routes/downloads/packages/+page.svx b/website/src/routes/downloads/packages/+page.svx index 0ab570c2..f10c3989 100644 --- a/website/src/routes/downloads/packages/+page.svx +++ b/website/src/routes/downloads/packages/+page.svx @@ -6,6 +6,8 @@ author: Kingkor Roy Tirtho
@@ -40,6 +42,14 @@ $ pamac install spotube-bin $ paru -Sy spotube-bin ``` + + ## MacOS ### Homebrew🍻 @@ -51,6 +61,14 @@ $ brew tap krtirtho/apps $ brew install --cask spotube ``` + + ## Windows ### Chocolatey🍫 diff --git a/website/static/posts/images/spotube-basics/cover.jpg b/website/static/posts/images/spotube-basics/cover.jpg new file mode 100644 index 00000000..603b3dda Binary files /dev/null and b/website/static/posts/images/spotube-basics/cover.jpg differ diff --git a/website/svelte.config.js b/website/svelte.config.js index b5717e39..2fd859f4 100644 --- a/website/svelte.config.js +++ b/website/svelte.config.js @@ -7,6 +7,7 @@ import slugPlugin from 'rehype-slug'; import autolinkHeadings from 'rehype-autolink-headings'; import relativeImages from 'mdsvex-relative-images'; import remarkGfm from 'remark-gfm'; +import rehypeAutoAds from 'rehype-auto-ads'; /** @type {import('@sveltejs/kit').Config} */ const config = { @@ -38,6 +39,25 @@ const config = { { behavior: 'wrap' } + ], + [ + rehypeAutoAds, + { + adCode: ` + + + `, + paragraphInterval: 2, + maxAds: 5, + } ] ] })