From f2efe33dba078f3dc4bfb68fb762c06aa0b5c606 Mon Sep 17 00:00:00 2001 From: lamacchinadesiderante Date: Sun, 28 Apr 2024 12:13:24 +0200 Subject: [PATCH 01/10] add /api routes and health check in docker-compose --- docker-compose.yaml | 7 +++++++ next.config.js | 18 ++++++++++++++++-- src/app/api/info/route.ts | 7 +++++++ src/app/api/status/route.ts | 5 +++++ src/utils/info/version.ts | 23 +++++++++++++++++++++++ 5 files changed, 58 insertions(+), 2 deletions(-) create mode 100644 src/app/api/info/route.ts create mode 100644 src/app/api/status/route.ts create mode 100644 src/utils/info/version.ts diff --git a/docker-compose.yaml b/docker-compose.yaml index bcc6b79..c60fbcc 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -8,6 +8,13 @@ services: restart: always + healthcheck: + test: wget --no-verbose --tries=1 --spider http://localhost:3000/api/status || exit 1 + interval: 60s + retries: 5 + start_period: 20s + timeout: 10s + build: . ports: diff --git a/next.config.js b/next.config.js index bb0375e..6d722af 100644 --- a/next.config.js +++ b/next.config.js @@ -1,11 +1,25 @@ const createNextIntlPlugin = require('next-intl/plugin'); - + const withNextIntl = createNextIntlPlugin(); const path = require('path') - + module.exports = withNextIntl({ sassOptions: { includePaths: [path.join(__dirname, 'src/styles')], }, + async headers() { + return [ + { + // matching all API routes + source: "/api/:path*", + headers: [ + { key: "Access-Control-Allow-Credentials", value: "true" }, + { key: "Access-Control-Allow-Origin", value: "*" }, + { key: "Access-Control-Allow-Methods", value: "GET,DELETE,PATCH,POST,PUT" }, + { key: "Access-Control-Allow-Headers", value: "X-CSRF-Token, X-Requested-With, Accept, Accept-Version, Content-Length, Content-MD5, Content-Type, Date, X-Api-Version" }, + ] + } + ] + } }) \ No newline at end of file diff --git a/src/app/api/info/route.ts b/src/app/api/info/route.ts new file mode 100644 index 0000000..e5e92d3 --- /dev/null +++ b/src/app/api/info/route.ts @@ -0,0 +1,7 @@ +import { getAppVersion } from '@/utils/info/version' +import { NextResponse } from 'next/server' + +export async function GET() { + const version = await getAppVersion() + return NextResponse.json({ version }) +} \ No newline at end of file diff --git a/src/app/api/status/route.ts b/src/app/api/status/route.ts new file mode 100644 index 0000000..25695fe --- /dev/null +++ b/src/app/api/status/route.ts @@ -0,0 +1,5 @@ +import { NextResponse } from 'next/server' + +export async function GET(request: Request) { + return NextResponse.json({ msg: 'OK' }) +} \ No newline at end of file diff --git a/src/utils/info/version.ts b/src/utils/info/version.ts new file mode 100644 index 0000000..4f76523 --- /dev/null +++ b/src/utils/info/version.ts @@ -0,0 +1,23 @@ +import fs from 'fs/promises'; +import path from 'path'; + +export const getAppVersion = async (): Promise => { + + let version = '' + + try { + + const packageJsonPath = path.resolve(process.cwd(), 'package.json'); + + const data = await fs.readFile(packageJsonPath, 'utf8'); + + const packageJson = JSON.parse(data); + + version = packageJson.version + + } catch (error) { + // handle error + } + + return version +} -- 2.40.1 From c98ad299cc00c3c49ba3f90c6ce815594101e5e3 Mon Sep 17 00:00:00 2001 From: lamacchinadesiderante Date: Sun, 28 Apr 2024 13:17:14 +0200 Subject: [PATCH 02/10] add random user-agent and more request headers --- src/utils/scrape/gallery.ts | 9 +++------ src/utils/scrape/headers.ts | 38 +++++++++++++++++++++++++++++++++++++ src/utils/scrape/video.ts | 7 ++----- src/utils/string.ts | 11 ++++++++++- 4 files changed, 53 insertions(+), 12 deletions(-) create mode 100644 src/utils/scrape/headers.ts diff --git a/src/utils/scrape/gallery.ts b/src/utils/scrape/gallery.ts index a53aec7..06038b5 100644 --- a/src/utils/scrape/gallery.ts +++ b/src/utils/scrape/gallery.ts @@ -1,8 +1,9 @@ import { XVIDEOS_BASE_URL } from '@/constants/urls'; -import { GalleryData, VideoData } from '@/meta/data'; +import { GalleryData } from '@/meta/data'; import axios, { AxiosError } from 'axios'; import * as cheerio from "cheerio"; +import { getHeaders } from './headers'; interface FetchParams { baseUrl?: string @@ -13,11 +14,7 @@ export const fetchGalleryData = async (params?: FetchParams): Promise { + + const userAgents: string[] = [ + 'Mozilla/5.0 (Macintosh; Intel Mac OS X 11_14) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.5397.215 Safari/537.36', + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36', + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:124.0) Gecko/20100101 Firefox/124.0', + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36 Edg/123.0.2420.81', + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36 OPR/109.0.0.0', + 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36', + 'Mozilla/5.0 (Macintosh; Intel Mac OS X 14.4; rv:124.0) Gecko/20100101 Firefox/124.0', + 'Mozilla/5.0 (Macintosh; Intel Mac OS X 14_4_1) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.4.1 Safari/605.1.15', + 'Mozilla/5.0 (Macintosh; Intel Mac OS X 14_4_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36 OPR/109.0.0.0', + 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36', + 'Mozilla/5.0 (X11; Linux i686; rv:124.0) Gecko/20100101 Firefox/124.0' + ]; + + const rand = Math.floor(Math.random() * userAgents.length); + + return userAgents[rand] +} + +export const getHeaders = (host:string = XVIDEOS_BASE_URL) => { + return { + headers: { + "User-Agent": getRandomUserAgent(), + "Accept-Language": "en-gb, en, en-US, it", + "Accept-Encoding": "gzip, deflate, br", + "Connection": "keep-alive", + "Sec-Fetch-Dest": "document", + "Sec-Fetch-Mode": "navigate", + "Sec-Fetch-Site": "none", + "Host": removeHttpS(host) + }, + } +}; \ No newline at end of file diff --git a/src/utils/scrape/video.ts b/src/utils/scrape/video.ts index e06383d..8313ce1 100644 --- a/src/utils/scrape/video.ts +++ b/src/utils/scrape/video.ts @@ -5,6 +5,7 @@ import axios, { AxiosError } from 'axios'; import * as cheerio from "cheerio"; import { findRelatedVideos, findVideoUrlInsideTagStringByFunctionNameAndExtension } from '../string'; +import { getHeaders } from './headers'; interface FetchParams { baseUrl?: string @@ -19,11 +20,7 @@ export const fetchVideoData = async (videoId: string, params?: FetchParams): Pro let related: GalleryData[] = []; - const reqHeaders = { - headers: { - "User-Agent": 'Mozilla/5.0 (Macintosh; Intel Mac OS X 11_14) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.5397.215 Safari/537.36' - }, - }; + const reqHeaders = getHeaders() const queryUrl = `${(params && params.baseUrl) ?? XVIDEOS_BASE_URL}${videoId}` diff --git a/src/utils/string.ts b/src/utils/string.ts index 5217a5b..4b7bac2 100644 --- a/src/utils/string.ts +++ b/src/utils/string.ts @@ -39,4 +39,13 @@ export const findRelatedVideos = (tagBlock: string): GalleryData[]|null => { })); return parsedArray; -} \ No newline at end of file +} + +export const removeHttpS = (url: string): string => { + if (url.startsWith("http://")) { + return url.slice(7); + } else if (url.startsWith("https://")) { + return url.slice(8); + } + return url; + }; \ No newline at end of file -- 2.40.1 From 7f0fc385a1e5aa856906afa8ee22937c6d05d0b6 Mon Sep 17 00:00:00 2001 From: lamacchinadesiderante Date: Sun, 28 Apr 2024 14:12:17 +0200 Subject: [PATCH 03/10] add better video path string encoding/decoding --- src/app/[locale]/video/[id]/page.tsx | 4 +- .../Wrapper/Gallery/Thumbnail/index.tsx | 3 +- src/utils/string.ts | 40 +++++++++++-------- 3 files changed, 29 insertions(+), 18 deletions(-) diff --git a/src/app/[locale]/video/[id]/page.tsx b/src/app/[locale]/video/[id]/page.tsx index 0aba08d..ad7a23a 100644 --- a/src/app/[locale]/video/[id]/page.tsx +++ b/src/app/[locale]/video/[id]/page.tsx @@ -6,13 +6,15 @@ import Video from "@/components/Pages/Video"; import { fetchVideoData } from "@/utils/scrape/video"; +import { decodeVideoUrlPath } from '@/utils/string'; + import { useLocale } from 'next-intl'; export default async function VideoPage({ params }: { params: { id: string } }) { const locale = useLocale() - const decodedId = decodeURIComponent(params.id) + const decodedId = decodeVideoUrlPath(params.id) const [data, related] = await fetchVideoData(decodedId) diff --git a/src/components/Layout/Results/Wrapper/Gallery/Thumbnail/index.tsx b/src/components/Layout/Results/Wrapper/Gallery/Thumbnail/index.tsx index 12ea2ea..0dfa939 100644 --- a/src/components/Layout/Results/Wrapper/Gallery/Thumbnail/index.tsx +++ b/src/components/Layout/Results/Wrapper/Gallery/Thumbnail/index.tsx @@ -9,6 +9,7 @@ import classNames from 'classnames'; import Link from 'next/link' import style from './Thumbnail.module.scss' +import { encodeVideoUrlPath } from '@/utils/string'; interface Props { locale: string @@ -22,7 +23,7 @@ const Thumbnail: React.FC = (props) => { const { locale, videoUrl, imgUrl, text, show } = props - const encodedUri = encodeURIComponent(videoUrl) + const encodedUri = encodeVideoUrlPath(videoUrl) return (
diff --git a/src/utils/string.ts b/src/utils/string.ts index 4b7bac2..ca19bef 100644 --- a/src/utils/string.ts +++ b/src/utils/string.ts @@ -1,20 +1,20 @@ import { GalleryData } from "@/meta/data"; export const findVideoUrlInsideTagStringByFunctionNameAndExtension = ( - tagBlock: string, functionName: string, extension: string): string|null => { - const start = tagBlock.indexOf(`html5player.${functionName}('`) + `html5player.${functionName}('`.length; - const end = tagBlock.toString().indexOf("'", start); + tagBlock: string, functionName: string, extension: string): string | null => { + const start = tagBlock.indexOf(`html5player.${functionName}('`) + `html5player.${functionName}('`.length; + const end = tagBlock.toString().indexOf("'", start); - const substr = tagBlock.substring(start, end); + const substr = tagBlock.substring(start, end); - if (substr.includes(extension)) { - return substr - } + if (substr.includes(extension)) { + return substr + } - return null + return null } -export const findRelatedVideos = (tagBlock: string): GalleryData[]|null => { +export const findRelatedVideos = (tagBlock: string): GalleryData[] | null => { if (!(tagBlock.includes('video_related=['))) { return null } @@ -22,13 +22,13 @@ export const findRelatedVideos = (tagBlock: string): GalleryData[]|null => { // Trova l'inizio e la fine dell'array di oggetti nell'input const start = tagBlock.indexOf('[{'); const end = tagBlock.lastIndexOf('}]') + 2; - + // Estrai la sottostringa contenente l'array di oggetti const jsonString = tagBlock.substring(start, end); - + // Parsea la stringa JSON in un array di oggetti const videoRelatedArray = JSON.parse(jsonString); - + // Mappa ogni oggetto nell'array per rinominare le chiavi //@ts-ignore const parsedArray = videoRelatedArray.map(obj => ({ @@ -37,15 +37,23 @@ export const findRelatedVideos = (tagBlock: string): GalleryData[]|null => { imgUrl: obj.i, text: obj.tf })); - + return parsedArray; } export const removeHttpS = (url: string): string => { if (url.startsWith("http://")) { - return url.slice(7); + return url.slice(7); } else if (url.startsWith("https://")) { - return url.slice(8); + return url.slice(8); } return url; - }; \ No newline at end of file +}; + +export const encodeVideoUrlPath = (input: string): string => { + return input.replace(/^\/+/, '').replace(/\/+$/, '').replace(/\//g, "-"); +}; + +export const decodeVideoUrlPath = (input: string): string => { + return `/${input.replace(/^\-+/, '').replace(/\-+$/, '').replace(/\-/g, "/")}`; +}; \ No newline at end of file -- 2.40.1 From 929b33f04ca87fba2a006167a416ee4a342e536c Mon Sep 17 00:00:00 2001 From: lamacchinadesiderante Date: Sun, 28 Apr 2024 14:55:37 +0200 Subject: [PATCH 04/10] remove title tag --- src/components/Layout/index.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/src/components/Layout/index.tsx b/src/components/Layout/index.tsx index ae6c3bd..9e4842e 100644 --- a/src/components/Layout/index.tsx +++ b/src/components/Layout/index.tsx @@ -21,7 +21,6 @@ const Layout: React.FC = (props) => { - Proxy Raye: un proxy per XVideos basato su PornInvidious
{children}
-- 2.40.1 From ab9f048f875850868e1f0a785ea0d80dcc4bd6f8 Mon Sep 17 00:00:00 2001 From: lamacchinadesiderante Date: Sun, 28 Apr 2024 15:06:24 +0200 Subject: [PATCH 05/10] move scraping functions to xvideos folder --- src/app/[locale]/page.tsx | 6 +----- src/app/[locale]/search/[query]/page.tsx | 2 +- src/app/[locale]/video/[id]/page.tsx | 4 ++-- src/utils/scrape/{ => xvideos}/gallery.ts | 2 +- src/utils/scrape/{ => xvideos}/video.ts | 4 ++-- 5 files changed, 7 insertions(+), 11 deletions(-) rename src/utils/scrape/{ => xvideos}/gallery.ts (96%) rename src/utils/scrape/{ => xvideos}/video.ts (96%) diff --git a/src/app/[locale]/page.tsx b/src/app/[locale]/page.tsx index 3ea0f04..53adf1e 100644 --- a/src/app/[locale]/page.tsx +++ b/src/app/[locale]/page.tsx @@ -1,12 +1,8 @@ -import axios from 'axios'; - -import * as cheerio from "cheerio"; - import Layout from "@/components/Layout"; import Home from "@/components/Pages/Home"; -import { fetchGalleryData } from '@/utils/scrape/gallery'; +import { fetchGalleryData } from '@/utils/scrape/xvideos/gallery'; export default async function HomePage() { diff --git a/src/app/[locale]/search/[query]/page.tsx b/src/app/[locale]/search/[query]/page.tsx index 50a69a9..520d0bc 100644 --- a/src/app/[locale]/search/[query]/page.tsx +++ b/src/app/[locale]/search/[query]/page.tsx @@ -2,7 +2,7 @@ import Layout from "@/components/Layout"; import Search from "@/components/Pages/Search"; -import { fetchGalleryData } from "@/utils/scrape/gallery"; +import { fetchGalleryData } from "@/utils/scrape/xvideos/gallery"; export default async function SearchPage({ params }: { params: { query: string } }) { diff --git a/src/app/[locale]/video/[id]/page.tsx b/src/app/[locale]/video/[id]/page.tsx index ad7a23a..26d9593 100644 --- a/src/app/[locale]/video/[id]/page.tsx +++ b/src/app/[locale]/video/[id]/page.tsx @@ -4,10 +4,10 @@ import Layout from "@/components/Layout"; import Video from "@/components/Pages/Video"; -import { fetchVideoData } from "@/utils/scrape/video"; - import { decodeVideoUrlPath } from '@/utils/string'; +import { fetchVideoData } from '@/utils/scrape/xvideos/video'; + import { useLocale } from 'next-intl'; export default async function VideoPage({ params }: { params: { id: string } }) { diff --git a/src/utils/scrape/gallery.ts b/src/utils/scrape/xvideos/gallery.ts similarity index 96% rename from src/utils/scrape/gallery.ts rename to src/utils/scrape/xvideos/gallery.ts index 06038b5..51d617b 100644 --- a/src/utils/scrape/gallery.ts +++ b/src/utils/scrape/xvideos/gallery.ts @@ -3,7 +3,7 @@ import { GalleryData } from '@/meta/data'; import axios, { AxiosError } from 'axios'; import * as cheerio from "cheerio"; -import { getHeaders } from './headers'; +import { getHeaders } from '../headers'; interface FetchParams { baseUrl?: string diff --git a/src/utils/scrape/video.ts b/src/utils/scrape/xvideos/video.ts similarity index 96% rename from src/utils/scrape/video.ts rename to src/utils/scrape/xvideos/video.ts index 8313ce1..5c4d04b 100644 --- a/src/utils/scrape/video.ts +++ b/src/utils/scrape/xvideos/video.ts @@ -4,8 +4,8 @@ import { GalleryData, VideoData } from '@/meta/data'; import axios, { AxiosError } from 'axios'; import * as cheerio from "cheerio"; -import { findRelatedVideos, findVideoUrlInsideTagStringByFunctionNameAndExtension } from '../string'; -import { getHeaders } from './headers'; +import { findRelatedVideos, findVideoUrlInsideTagStringByFunctionNameAndExtension } from '../../string'; +import { getHeaders } from '../headers'; interface FetchParams { baseUrl?: string -- 2.40.1 From 4102fd1ef9c9970d71138bb9b46d6a2eb663a0e4 Mon Sep 17 00:00:00 2001 From: lamacchinadesiderante Date: Sun, 28 Apr 2024 15:24:21 +0200 Subject: [PATCH 06/10] fix issue with encode/decode path string --- src/utils/string.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/utils/string.ts b/src/utils/string.ts index ca19bef..a1c0225 100644 --- a/src/utils/string.ts +++ b/src/utils/string.ts @@ -51,9 +51,9 @@ export const removeHttpS = (url: string): string => { }; export const encodeVideoUrlPath = (input: string): string => { - return input.replace(/^\/+/, '').replace(/\/+$/, '').replace(/\//g, "-"); + return encodeURIComponent(input.replace(/^\/+/, '')) }; export const decodeVideoUrlPath = (input: string): string => { - return `/${input.replace(/^\-+/, '').replace(/\-+$/, '').replace(/\-/g, "/")}`; + return `/${decodeURIComponent(input)}`; }; \ No newline at end of file -- 2.40.1 From 66615185d7ce19f1a0e0d774104de1dbbdfbb6a3 Mon Sep 17 00:00:00 2001 From: lamacchinadesiderante Date: Sun, 28 Apr 2024 17:58:33 +0200 Subject: [PATCH 07/10] add head title --- src/components/Layout/index.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components/Layout/index.tsx b/src/components/Layout/index.tsx index 9e4842e..8ce895a 100644 --- a/src/components/Layout/index.tsx +++ b/src/components/Layout/index.tsx @@ -21,6 +21,7 @@ const Layout: React.FC = (props) => { + Proxy Raye: watch porn videos without tracking or annoying ads!
{children}
-- 2.40.1 From 6bda6fd111401d7ba6fe7fe641ca6b1f36b07271 Mon Sep 17 00:00:00 2001 From: lamacchinadesiderante Date: Sun, 28 Apr 2024 18:07:10 +0200 Subject: [PATCH 08/10] fix theme transition issue with searchbar --- .../Layout/SearchBar/SearchBarForm/SearchBarForm.module.scss | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/components/Layout/SearchBar/SearchBarForm/SearchBarForm.module.scss b/src/components/Layout/SearchBar/SearchBarForm/SearchBarForm.module.scss index b868e96..f5c440c 100644 --- a/src/components/Layout/SearchBar/SearchBarForm/SearchBarForm.module.scss +++ b/src/components/Layout/SearchBar/SearchBarForm/SearchBarForm.module.scss @@ -9,6 +9,7 @@ .query{ flex: 6; margin-right: $spacing_16; + transition: none !important; } .query:hover { @@ -24,6 +25,7 @@ background-color: var(--primary); border-color: var(--primary); color: var(--primary-inverse); + transition: none !important; } .submitBtn:hover { -- 2.40.1 From b272c39acaa669cff9f1ee21be7ff040d3d7fe55 Mon Sep 17 00:00:00 2001 From: lamacchinadesiderante Date: Sun, 28 Apr 2024 19:40:11 +0200 Subject: [PATCH 09/10] add not found page and components --- locale/en.json | 5 +++++ locale/it.json | 5 +++++ src/app/[locale]/404/page.tsx | 11 ++++++++++ .../Pages/NotFound/Msg/Msg.module.scss | 13 +++++++++++ src/components/Pages/NotFound/Msg/index.tsx | 22 +++++++++++++++++++ src/components/Pages/NotFound/index.tsx | 18 +++++++++++++++ 6 files changed, 74 insertions(+) create mode 100644 src/app/[locale]/404/page.tsx create mode 100644 src/components/Pages/NotFound/Msg/Msg.module.scss create mode 100644 src/components/Pages/NotFound/Msg/index.tsx create mode 100644 src/components/Pages/NotFound/index.tsx diff --git a/locale/en.json b/locale/en.json index c6b4f4a..96989e4 100644 --- a/locale/en.json +++ b/locale/en.json @@ -10,6 +10,11 @@ "disclaimer_5": "No banners or annoying popups. You can jerk off with no hassle!", "disclaimer_6": "You're choosing image over imagination. What if they're not in antithesis?" }, + "NotFound": { + "uh_oh": "Uh Oh...", + "something_wrong": "Something went wrong :|", + "back_to_home": "Back to homepage" + }, "Search": { "placeholder": "categories, pornostars, etc...", "submit": "Search" diff --git a/locale/it.json b/locale/it.json index 96dcac4..129662a 100644 --- a/locale/it.json +++ b/locale/it.json @@ -10,6 +10,11 @@ "disclaimer_5": "Niente banner o popup fastidiosi. Puoi masturbarti in santa pace.", "disclaimer_6": "Stai preferendo l'immagine all'immaginazione. E se immagine e immaginazione non fossero in antitesi?" }, + "NotFound": { + "uh_oh": "Uh Oh...", + "something_wrong": "Qualcosa รจ andato storto :|", + "back_to_home": "Torna alla home" + }, "Search": { "placeholder": "categorie, pornostar, ecc...", "submit": "Cerca" diff --git a/src/app/[locale]/404/page.tsx b/src/app/[locale]/404/page.tsx new file mode 100644 index 0000000..8a1050a --- /dev/null +++ b/src/app/[locale]/404/page.tsx @@ -0,0 +1,11 @@ +import Layout from "@/components/Layout"; +import NotFound from "@/components/Pages/NotFound"; + +export default function NotFoundPage() { + + return ( + + + + ); +} diff --git a/src/components/Pages/NotFound/Msg/Msg.module.scss b/src/components/Pages/NotFound/Msg/Msg.module.scss new file mode 100644 index 0000000..dca88b8 --- /dev/null +++ b/src/components/Pages/NotFound/Msg/Msg.module.scss @@ -0,0 +1,13 @@ +@import 'fontsize'; + +.header { + font-size: $font-size-xlarge; +} + +.msg { + font-size: $font-size-large; +} + +.link { + color: var(--primary); +} \ No newline at end of file diff --git a/src/components/Pages/NotFound/Msg/index.tsx b/src/components/Pages/NotFound/Msg/index.tsx new file mode 100644 index 0000000..fa1cf09 --- /dev/null +++ b/src/components/Pages/NotFound/Msg/index.tsx @@ -0,0 +1,22 @@ +import React, { } from 'react'; + +import style from './Msg.module.scss'; + +import { useTranslations } from 'next-intl'; +import Link from 'next/link'; + +const Msg: React.FC = () => { + + const t = useTranslations('NotFound'); + + return ( +
+
{t('uh_oh')}
+

{t('something_wrong')}

+ {t('back_to_home')} +
+ ); + +}; + +export default Msg; \ No newline at end of file diff --git a/src/components/Pages/NotFound/index.tsx b/src/components/Pages/NotFound/index.tsx new file mode 100644 index 0000000..ab79a9d --- /dev/null +++ b/src/components/Pages/NotFound/index.tsx @@ -0,0 +1,18 @@ +import React from 'react'; + +import Header from '@/components/Layout/Header'; +import SearchBar from '@/components/Layout/SearchBar'; +import Msg from './Msg'; + +const NotFound: React.FC = (props) => { + + return ( + <> +
+ + + + ); +}; + +export default NotFound; \ No newline at end of file -- 2.40.1 From 5313002efb37b15dc70d27d4e676a8dbaf9a18b7 Mon Sep 17 00:00:00 2001 From: lamacchinadesiderante Date: Sun, 28 Apr 2024 21:51:33 +0200 Subject: [PATCH 10/10] add favicon --- public/android-chrome-192x192.png | Bin 0 -> 9078 bytes public/android-chrome-512x512.png | Bin 0 -> 25871 bytes public/apple-touch-icon.png | Bin 0 -> 8189 bytes public/favicon-16x16.png | Bin 0 -> 578 bytes public/favicon-32x32.png | Bin 0 -> 1207 bytes public/favicon.ico | Bin 0 -> 15406 bytes public/site.webmanifest | 1 + 7 files changed, 1 insertion(+) create mode 100644 public/android-chrome-192x192.png create mode 100644 public/android-chrome-512x512.png create mode 100644 public/apple-touch-icon.png create mode 100644 public/favicon-16x16.png create mode 100644 public/favicon-32x32.png create mode 100644 public/favicon.ico create mode 100644 public/site.webmanifest diff --git a/public/android-chrome-192x192.png b/public/android-chrome-192x192.png new file mode 100644 index 0000000000000000000000000000000000000000..93ec75e0641953b050c7cffd6bf8acc5fe725b4a GIT binary patch literal 9078 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

F2qY|lZ(MjU| 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 I(|3>kA2PR@f&c&j literal 0 HcmV?d00001 diff --git a/public/apple-touch-icon.png b/public/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..44380a05ef68baf1cdb9150ecc7ff8d8bc19d720 GIT binary patch literal 8189 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 literal 0 HcmV?d00001 diff --git a/public/favicon-16x16.png b/public/favicon-16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..e58304f649c748d011e7400c2ecb90e3e29c6ee7 GIT binary patch literal 578 zcmV-I0=@l-P)Hvt96%TyAXPkWRACu)6c%KxdWXGKVRei<9cg^6TuH)zK zE`A*y!7oYZ?(MZ}3TQSH6pzsnFbrJscrd6a2u7ne zXqII8u@j(aFIh+%$H&NKGWevb_*SV{UA;aZZbc#pr&0*A=kt{TH`@V476$a49lU42 zM+USWDICU~@p0UU$4y!A8drFYgVq(wyh1=PmGE|90bdFQ2jF@rgyh5oLdoQb-r0GT zqS5_RfTq1+IkjIbLS0^lwzh^wqhaN`+-}GtBS=n7!Q0=@{ly-?L|^*~4_SC(ihJAJ z_^`BuYPk$U2wd~~Ate%!#>P&%6FsF^Y{m)L*yu*Ro@4R08K`bg-a80i3^SHOpGqj zC@V=^5M+VG5Eg=cXxk}wTFdky?NF@6KBlG5>C7CzbLo_O@7%f5al?i`IhoA4|9}4P zeCPZBa}+#hQ=W5vya1390|I1BRa>DbZ$XGA9$z_!i({T6$hlwn`?J#2w6fEq-4OtB z@uCAKPQ1%SKjNrMv-lH!{{~rEpDOkBbLoJj1t5lost}F-z+E3qx0vC(5VMRqr+B?T z*~Qrc5PrW8PUlT7P?k~hXU=gr93LnR4PT^+PYHm@-3;#GE=ui^Ms~mzNP57(jS>8oP>$uo?~{7LB52|9+I#*23wMnoP2F zGPzIjc>Xkhu?C>3@6qv+*?Dt)9e-TCipYw!$g}hEPDP$>Jg_ParQpANd6ZJT2~rz~d&v)2itOFxms zfEXM+%rm=fMmpBjg{i?o#9}c_jE`gX@neHaL17_k>*|o3o2$*|5LD~QlV$*y2;jUu z09E~r4j1%J8>_46zH$X|CLb9dMtENKon*_-$w8yf2Uk`WcGuLvbL5E8Nr*`{DYrd< zK;R~MJ*syKsVe^J=|Om50l}dm%jAj4@`?&nx!rIP%)!&A%?z-aqJ%6gB>a<)KxHJ9P><{BN*$yn!XTy$dSECzYfaW7LkV|nIEEa24nwtmg80eJX^+A*U{dmyVhtR|Xrl+QC0Z1`= znwqr6^hQSqdzr)NAC0<|mX=970GIjkj6SNDwZA+!hgH^p!0)#O;AZ)im6xNWstS!q z4N?NNwTfV{NNI16r3MfPoTcNp`Yiv9j9|306S2)rJPL&{#bISd#l_g`@o2*H9Xp0% z0x{Vw3h+(+T(SoG`**|Tl00YY9oLqY;Jhso zZu4Ws8i0HQ#A32kOcDlW#>OD4LV_?`Np&?E*nART4Bv%#pUJ;A$E3cF@7+7gZ5XtW z2$sk2ptlz@qoZ1POqdj%6rY9tg2u+TsSVkP3}*izQPt1s{h_7eI4Liv@$PP|M@VZv zeq6hVOgkUo-Ex?0XfU*&7n-I4c*RF59 z88MJ>7OE;6(^qnnsn{^hFA(&{@Or-_?Qy%9v!+6mYl1JEzV5>(*#SFr(nz}0+7M_X%k5n>||q=j0LM?v1?tbX6Q?8C{qXWw(~wJ;s#-kCl7 zoPG9M>)UI;)?RDhK%iaV*1(;229S3MjQ&O-&?OKEbm$OzzwfRFyGE8Q`Ao?-_Uw^6?DUYof%G*st&*BrF8%r~v3T_9 zvjA<{D!I9b6@81Hmd~IaM0%#;;!`qye3^_IwONvq3e0E9-nHw3!av1H&v&#TPw^-# zJ0q)CACcwDKeyAd9~*)Fdv5flrE(kkaiii9o*UJmk2nTHIAj25*P`xz@H>c9g!e?u z1I*N$>&JDb1Jdu1xIV>yH;)FmZdX?uzrgtI*3ck5f*V!pA!TB&^oPukFn^9a z=OD^2A??IEJ`PxJ|6gK(tnOIHf=-#bci=k#EaQRsmamHgye1=E(aGAq`;rtEo|Hw4 z_Dgm3Wwj2PIdoABI#>d+{XjcQCzs{H;1!ua|L^8r$o-J(v$H<1*VNPqO^&F3z@Fsf zrQRzmFUq`mpU8v>+br3X&plGrvFGTEB90%w0QT;cp9A+9I}i2D{eR-b?QP^zHd97M zy}*{xU@%hr%Ewq+s^r=8?c2{+EB3)c*boKg9;z^8X706Y5<4y0a}3zN?}dT3 z8R}lN)AD)e&U5nSn<2aBnP+lghh$p&c&AS3raeRZgg7`Bo%C1VlfC3)JqhdgHEaH5 zwR_;e6_#9O!>GJ>@A*Q#5JOQ>$R={&DE5+%`Z*37dH3BalV@ULzE-xvFnI7Pvu=8N zeV7iQ*R#2~a%&_Es8jBgpObUYdvUr}M%g%%FT|FvE^ z?MZJ-+_+MC@4cX`TJ_H``QX{zOFq9tPotdj`OdvI zH8r#bs&?9Qo(uEy-S;5Sf9yv#>x6V*>~h1vImP)nWlE)Rjd|;>3iCY5GYxg*MgzT{ z$Da0pU-_(udC~!N|90bNFWa-{vU#?%m)W1e!@ypi7>#UImum&+zp(R*<{ACiit#)_ z@rxx7*#fdN8o8_s+{Yk)U@S77G*hR_E#Ng0YttuQI3V{l(x05?cqh-;-c1`Ewy;cv zjCH`X3waf=6(P+=8tli$h)s5!Dz1T>PXqLm&>$L#6!()r3GrWC191&_YJlfR`rWV> zKZSjF6!zg1*gC^Q_PcS9CxaVYp}gGqF0djFBg0@LY(RcWZ_5~0(4I!54A_A1FB z1KnWAmN?jeU4S(U_D-`Nb0|jP{Ejx9M_Y@~FJssai|Gw`XlaoF%(Fh9dA4%a<2(3XV82#YwvE-rs%twPu=fQ2Pu=9Y zm7%UwR9rOUY4)@5`|sD7*JN^qbF| ziGablGRv=^+Q5FW#TB*vfb|JJP5-`SU0b-m;hdZWY!T-v#;xh^pEIY)@`)a4eSuW>i@Q02}$)E+g?>2Fc^=yRgad(4;;q+;_~`Jq&uY167rKPc(-{Ec(iACh8S zSE2V|;H}+HDSP|&uOuz4&caSV-mqb7O~3tPk1Z1VcIjWG|C+IN)eid8=FV+0*H#^V z@Hc>AV=U{@fdld#@Xa9)9e?`W?AQ|%HwpcX2?=Roe#nO&nk8MkW}1FM6_23rG(t?m z>=(#qyeGjqHoV?3AAgAC>X)HEuCVZg>7!HQf$^FiJ!XgDcKUSLHui<;2h#HnhfYT< z$NDkV3$OD#_F4Ma!s0#Tw{hc9E9OJ_95aluII-&9J9SFKos;#}nB$tN+tWh$ja^QB zUhlx3qSFcEk?O7v@$;^W4y&%5@dUP;^o;vO>I3SLcCHs@`*-x&JRN?n_4H*^Hpeo@ zybhvU~Sycb9Z{ zo#mX*^z%~(ObZq?NAx!XOMfrS_V1|A7`dxH7$5B}t2>OU*$@sp4+ONI`;rhnQU>{p#klt1N#+5R1N>{1;s z+Fy)wgvS5YsMa3UAG{;SduwX^EMC0dH7;ty;44O?+5r7ew$ZlH3+Jzjol^dD&#jGG z{|`Sr&z$?D=RTI3dqg{bfyJOLqp3LHXQ^`t-^6-G2EoUo1NV(ykF)MH|DXlV%+3F_uul1F;YGH zAb|A`NZPZcvn}eKbCUOsn5(i#IqKoeXyoHQQrMmONEp4oh3-yBDs&Td8zSMgepp`Y&U(h0>xEsl_o_duBk)FjcS6@jU_Xa6$@w1x zCG&dZT$3U5H6+}NGtTL->B>X4m2nh#5p4Ue*8`(BPie>X8DlmD>qRcwasWwtrx@Qj zH&3HY6{t_2WWPg)qC3}mV~VW?|D%C^xChu0kdlEj1NfFgbaAS<2I3lsYap(HxCZ{eH1J