mirror of
https://github.com/fmhy/edit.git
synced 2026-03-11 08:55:38 +00:00
Merge branch 'main' into main
This commit is contained in:
commit
53a0f54100
203 changed files with 127078 additions and 4673 deletions
3
.github/CONTRIBUTING.md
vendored
3
.github/CONTRIBUTING.md
vendored
|
|
@ -19,7 +19,7 @@ ## Submissions
|
|||
|
||||
- **💰️ Paid / Trial Sites** - We don't accept any paid or free trial only entries, with the exception of select paid [VPNs](/privacy#vpn) and [Debrid](/downloading#debrid-leeches).
|
||||
- **🕹️ Emulators** - Already listed on [Index Sites](/gaming#emulators).
|
||||
- **🌐 Web Browsers** - Good open-source browsers are already listed, so we just accept [indexes](/internet-tools#browser-tools), privacy-focused, and good mobile ones.
|
||||
- **🌐 Web Browsers** - Good open-source browsers are already listed, so we just accept indexes, privacy-focused, and good mobile ones.
|
||||
- **🔻 Leeches** - Unless it's not already listed on existing [Leech Lists](/downloading#debrid-leeches), don't submit these.
|
||||
- **🐧 Linux Distros** - Already listed on [Index Sites](/linux-macos#linux-distros).
|
||||
- **🌍 Non-english Software** - We don't add non-english software sites (APKs, games, torrents, etc.) unless they have a very good reputation.
|
||||
|
|
@ -33,6 +33,7 @@ ### Adding a Site
|
|||
For submitting new links, follow these steps:
|
||||
|
||||
- Make sure it's not already in the wiki. The easiest way to do this is to check our [Single Page](https://api.fmhy.net/single-page) using `ctrl+f`.
|
||||
- Don't spam a bunch of un-tested links at once. Try to only send things you genuinely feel might be worth adding.
|
||||
- Reach out via the feedback system, [GitHub](https://github.com/fmhy/edit), or join our [Discord](https://github.com/fmhy/FMHY/wiki/FMHY-Discord). Note that we have to check sites ourselves, so using a issue, rather than pull request is easier.
|
||||
- You can optionally include socials, tools, or any other additional info alongside the entry.
|
||||
|
||||
|
|
|
|||
4
.github/README.md
vendored
4
.github/README.md
vendored
|
|
@ -8,7 +8,7 @@ ## 📖 Wiki
|
|||
|
||||
- Website: [fmhy.net](https://fmhy.net)
|
||||
- News & Monthly Updates: [fmhy.net/posts](https://fmhy.net/posts)
|
||||
- Backups: [github.com/fmhy/FMHY/wiki/Backups](https://github.com/fmhy/FMHY/wiki/Backups)
|
||||
- Backups, Markdown, JSON API: [github.com/fmhy/FMHY/wiki/Backups](https://github.com/fmhy/FMHY/wiki/Backups)
|
||||
- Neither the site nor GitHub host any files
|
||||
|
||||
## 🗺️ Emoji Legend
|
||||
|
|
@ -33,4 +33,4 @@ ## 🔔 Follow
|
|||
|
||||
<p>
|
||||
<a href="https://github.com/fmhy/FMHY/wiki/FMHY-Discord"><img width="30px" src="./assets/discord.svg" alt="Discord"></a> <a href="https://github.com/fmhy"><img width="30px" src="./assets/github.svg" alt="GitHub"></a>
|
||||
</p>
|
||||
</p>
|
||||
5
.github/assets/nginx.conf
vendored
5
.github/assets/nginx.conf
vendored
|
|
@ -6,7 +6,8 @@ server {
|
|||
index index.html;
|
||||
|
||||
location / {
|
||||
try_files $uri $uri/ /index.html;
|
||||
try_files $uri $uri.html $uri/ =404;
|
||||
|
||||
add_header X-Frame-Options "DENY";
|
||||
add_header X-Content-Type-Options "nosniff";
|
||||
add_header X-XSS-Protection "1; mode=block";
|
||||
|
|
@ -26,4 +27,4 @@ gzip on;
|
|||
gzip_types text/plain text/css application/javascript application/json image/svg+xml;
|
||||
gzip_min_length 1000;
|
||||
gzip_proxied any;
|
||||
gzip_vary on;
|
||||
gzip_vary on;
|
||||
|
|
|
|||
24
Dockerfile
24
Dockerfile
|
|
@ -1,21 +1,17 @@
|
|||
FROM node:21-slim AS base
|
||||
FROM node:25.7-alpine AS base
|
||||
ENV PNPM_HOME="/pnpm"
|
||||
ENV PATH="$PNPM_HOME:$PATH"
|
||||
RUN corepack enable
|
||||
COPY . /app
|
||||
RUN npm install -g pnpm@10.30.3
|
||||
WORKDIR /app
|
||||
|
||||
FROM base AS prod-deps
|
||||
RUN --mount=type=cache,id=pnpm,target=/pnpm/store pnpm install --frozen-lockfile
|
||||
COPY package.json pnpm-lock.yaml ./
|
||||
|
||||
FROM base AS build
|
||||
RUN --mount=type=cache,id=pnpm,target=/pnpm/store pnpm install --frozen-lockfile
|
||||
RUN --mount=type=cache,id=pnpm,target=/pnpm/store pnpm install --frozen-lockfile --config.autoInstallPeers=false
|
||||
COPY . .
|
||||
RUN pnpm run docs:build
|
||||
|
||||
FROM base
|
||||
COPY --from=prod-deps /app/node_modules /app/node_modules
|
||||
COPY --from=build /app/docs/.vitepress/dist /app/docs/.vitepress/dist
|
||||
|
||||
EXPOSE 4173
|
||||
|
||||
CMD ["pnpm", "docs:preview"]
|
||||
FROM nginx:alpine-slim
|
||||
COPY --from=build /app/docs/.vitepress/dist /usr/share/nginx/html
|
||||
COPY .github/assets/nginx.conf /etc/nginx/conf.d/default.conf
|
||||
EXPOSE 80
|
||||
CMD ["nginx", "-g", "daemon off;"]
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@ services:
|
|||
container_name: docs
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
- '4173:4173'
|
||||
- '4173:80'
|
||||
|
||||
networks:
|
||||
fmhy:
|
||||
|
|
|
|||
|
|
@ -20,6 +20,7 @@ import { defs, emojiRender, movePlugin } from './markdown/emoji'
|
|||
import { headersPlugin } from './markdown/headers'
|
||||
import { toggleStarredPlugin } from './markdown/toggleStarred'
|
||||
import { transformsPlugin } from './transformer'
|
||||
import { replaceNoteLink } from './utils/markdown'
|
||||
|
||||
// @unocss-include
|
||||
|
||||
|
|
@ -88,6 +89,13 @@ export default defineConfig({
|
|||
.finally(() => consola.success('Success!'))
|
||||
},
|
||||
vite: {
|
||||
css: {
|
||||
preprocessorOptions: {
|
||||
scss: {
|
||||
api: 'modern-compiler'
|
||||
}
|
||||
}
|
||||
},
|
||||
ssr: {
|
||||
noExternal: ['@fmhy/components']
|
||||
},
|
||||
|
|
@ -98,6 +106,18 @@ export default defineConfig({
|
|||
replacement: fileURLToPath(
|
||||
new URL('./theme/components/ThemeDropdown.vue', import.meta.url)
|
||||
)
|
||||
},
|
||||
{
|
||||
find: /^.*VPLocalSearchBox\.vue$/,
|
||||
replacement: fileURLToPath(
|
||||
new URL('./theme/components/VPLocalSearchBox.vue', import.meta.url)
|
||||
)
|
||||
},
|
||||
{
|
||||
find: /^.*VPNav\.vue$/,
|
||||
replacement: fileURLToPath(
|
||||
new URL('./theme/components/VPNav.vue', import.meta.url)
|
||||
)
|
||||
}
|
||||
]
|
||||
},
|
||||
|
|
@ -109,7 +129,9 @@ export default defineConfig({
|
|||
output: ['console', 'terminal']
|
||||
}),
|
||||
UnoCSS({
|
||||
configFile: '../unocss.config.ts'
|
||||
configFile: fileURLToPath(
|
||||
new URL('../../unocss.config.ts', import.meta.url)
|
||||
)
|
||||
}),
|
||||
AutoImport({
|
||||
dts: '../.cache/imports.d.ts',
|
||||
|
|
@ -202,6 +224,7 @@ export default defineConfig({
|
|||
md.use(emojiRender)
|
||||
md.use(toggleStarredPlugin)
|
||||
meta.build.api && md.use(headersPlugin)
|
||||
replaceNoteLink(md)
|
||||
}
|
||||
},
|
||||
themeConfig: {
|
||||
|
|
|
|||
|
|
@ -15,62 +15,23 @@
|
|||
*/
|
||||
|
||||
import type { DefaultTheme } from 'vitepress'
|
||||
import consola from 'consola'
|
||||
import { excluded } from './shared'
|
||||
import { transform, transformGuide } from './transformer'
|
||||
|
||||
// @unocss-include
|
||||
|
||||
export const meta = {
|
||||
name: 'freemediaheckyeah',
|
||||
description: 'The largest collection of free stuff on the internet!',
|
||||
hostname: 'https://fmhy.net',
|
||||
keywords: ['stream', 'movies', 'gaming', 'reading', 'anime'],
|
||||
build: {
|
||||
api: true,
|
||||
nsfw: true
|
||||
}
|
||||
}
|
||||
|
||||
export const excluded = [
|
||||
'readme.md',
|
||||
'single-page',
|
||||
'feedback.md',
|
||||
'index.md',
|
||||
'sandbox.md',
|
||||
'startpage.md'
|
||||
]
|
||||
|
||||
if (process.env.FMHY_BUILD_NSFW === 'false') {
|
||||
consola.info('FMHY_BUILD_NSFW is set to false, disabling NSFW content')
|
||||
meta.build.nsfw = false
|
||||
}
|
||||
if (process.env.FMHY_BUILD_API === 'false') {
|
||||
consola.info('FMHY_BUILD_API is set to false, disabling API component')
|
||||
meta.build.api = false
|
||||
}
|
||||
|
||||
const formatCommitRef = (commitRef: string) =>
|
||||
`<a href="https://github.com/fmhy/edit/commit/${commitRef}">${commitRef.slice(0, 8)}</a>`
|
||||
|
||||
export const commitRef =
|
||||
process.env.CF_PAGES && process.env.CF_PAGES_COMMIT_SHA
|
||||
? formatCommitRef(process.env.CF_PAGES_COMMIT_SHA)
|
||||
: process.env.COMMIT_REF
|
||||
? formatCommitRef(process.env.COMMIT_REF)
|
||||
: 'dev'
|
||||
|
||||
export const feedback = `<a href="/feedback" class="feedback-footer">Made with ❤</a>`
|
||||
export * from './shared'
|
||||
|
||||
export const search: DefaultTheme.Config['search'] = {
|
||||
options: {
|
||||
_render(src, env, md) {
|
||||
// Check if current file should be excluded from search
|
||||
const relativePath = env.relativePath || env.path || ''
|
||||
const shouldExclude = excluded.some(excludedFile =>
|
||||
relativePath.includes(excludedFile) ||
|
||||
const shouldExclude = excluded.some(excludedFile =>
|
||||
relativePath.includes(excludedFile) ||
|
||||
relativePath.endsWith(excludedFile)
|
||||
)
|
||||
|
||||
|
||||
// Return empty content for excluded files so they don't appear in search
|
||||
if (shouldExclude) {
|
||||
return ''
|
||||
|
|
@ -86,7 +47,7 @@ export const search: DefaultTheme.Config['search'] = {
|
|||
},
|
||||
miniSearch: {
|
||||
options: {
|
||||
tokenize: (text) => text.split(/[\n\r #%*,=/:;?[\]{}()&]+/u), // simplified charset: removed [-_.@] and non-english chars (diacritics etc.)
|
||||
tokenize: (text) => text.replace(/[\u2060\u200B]/g, '').split(/[\n\r #%*,=/:;?[\]{}()&]+/u), // simplified charset: removed [-_.@] and non-english chars (diacritics etc.)
|
||||
processTerm: (term, fieldName) => {
|
||||
// biome-ignore lint/style/noParameterAssign: h
|
||||
term = term
|
||||
|
|
@ -121,7 +82,7 @@ export const search: DefaultTheme.Config['search'] = {
|
|||
},
|
||||
searchOptions: {
|
||||
combineWith: 'AND',
|
||||
fuzzy: true,
|
||||
fuzzy: false,
|
||||
// @ts-ignore
|
||||
boostDocument: (documentId, term, storedFields: Record) => {
|
||||
const titles = (storedFields?.titles as string[])
|
||||
|
|
@ -147,189 +108,3 @@ export const search: DefaultTheme.Config['search'] = {
|
|||
},
|
||||
provider: 'local'
|
||||
}
|
||||
|
||||
export const socialLinks: DefaultTheme.SocialLink[] = [
|
||||
{ icon: 'github', link: 'https://github.com/fmhy/edit' },
|
||||
{ icon: 'discord', link: 'https://github.com/fmhy/FMHY/wiki/FMHY-Discord' },
|
||||
{
|
||||
icon: 'reddit',
|
||||
link: 'https://reddit.com/r/FREEMEDIAHECKYEAH'
|
||||
}
|
||||
]
|
||||
|
||||
export const nav: DefaultTheme.NavItem[] = [
|
||||
{ text: '📖 Glossary', link: 'https://rentry.org/The-Piracy-Glossary' },
|
||||
{
|
||||
text: '💾 Backups',
|
||||
link: '/other/backups'
|
||||
},
|
||||
{
|
||||
text: '🌱 Ecosystem',
|
||||
items: [
|
||||
{ text: '🌐 Search', link: '/posts/search' },
|
||||
{ text: '❓ FAQs', link: '/other/FAQ' },
|
||||
{ text: '🔖 Bookmarks', link: 'https://github.com/fmhy/bookmarks' },
|
||||
{ text: '✅ SafeGuard', link: 'https://github.com/fmhy/FMHY-SafeGuard' },
|
||||
{ text: '🚀 Startpage', link: 'https://fmhy.net/startpage' },
|
||||
{ text: '📋 snowbin', link: 'https://pastes.fmhy.net' },
|
||||
{ text: '🔎 SearXNG', link: 'https://searx.fmhy.net/' },
|
||||
{
|
||||
text: '💡 Site Hunting',
|
||||
link: 'https://www.reddit.com/r/FREEMEDIAHECKYEAH/wiki/find-new-sites/'
|
||||
},
|
||||
{
|
||||
text: '😇 SFW FMHY',
|
||||
link: 'https://rentry.org/piracy'
|
||||
},
|
||||
{
|
||||
text: '🏠 Selfhosting',
|
||||
link: '/other/selfhosting'
|
||||
},
|
||||
{ text: '🏞 Wallpapers', link: '/other/wallpapers' },
|
||||
{ text: '💙 Feedback', link: '/feedback' }
|
||||
]
|
||||
}
|
||||
]
|
||||
|
||||
export const sidebar: DefaultTheme.Sidebar | DefaultTheme.NavItemWithLink[] = [
|
||||
{
|
||||
text: '<span class="i-twemoji:books"></span> Beginners Guide',
|
||||
link: '/beginners-guide'
|
||||
},
|
||||
{
|
||||
text: '<span class="i-twemoji:newspaper"></span> Posts',
|
||||
link: '/posts'
|
||||
},
|
||||
{
|
||||
text: '<span class="i-twemoji:light-bulb"></span> Contribute',
|
||||
link: '/other/contributing'
|
||||
},
|
||||
{
|
||||
text: 'Wiki',
|
||||
collapsed: false,
|
||||
items: [
|
||||
{
|
||||
text: '<span class="i-twemoji:name-badge"></span> Adblocking / Privacy',
|
||||
link: '/privacy'
|
||||
},
|
||||
{
|
||||
text: '<span class="i-twemoji:robot"></span> Artificial Intelligence',
|
||||
link: '/ai'
|
||||
},
|
||||
{
|
||||
text: '<span class="i-twemoji:television"></span> Movies / TV / Anime',
|
||||
link: '/video'
|
||||
},
|
||||
{
|
||||
text: '<span class="i-twemoji:musical-note"></span> Music / Podcasts / Radio',
|
||||
link: '/audio'
|
||||
},
|
||||
{
|
||||
text: '<span class="i-twemoji:video-game"></span> Gaming / Emulation',
|
||||
link: '/gaming'
|
||||
},
|
||||
{
|
||||
text: '<span class="i-twemoji:green-book"></span> Books / Comics / Manga',
|
||||
link: '/reading'
|
||||
},
|
||||
{
|
||||
text: '<span class="i-twemoji:floppy-disk"></span> Downloading',
|
||||
link: '/downloading'
|
||||
},
|
||||
{
|
||||
text: '<span class="i-twemoji:cyclone"></span> Torrenting',
|
||||
link: '/torrenting'
|
||||
},
|
||||
{
|
||||
text: '<span class="i-twemoji:brain"></span> Educational',
|
||||
link: '/educational'
|
||||
},
|
||||
{
|
||||
text: '<span class="i-twemoji:mobile-phone"></span> Android / iOS',
|
||||
link: '/mobile'
|
||||
},
|
||||
{
|
||||
text: '<span class="i-twemoji:penguin"></span> Linux / macOS',
|
||||
link: '/linux-macos'
|
||||
},
|
||||
{
|
||||
text: '<span class="i-twemoji:globe-showing-asia-australia"></span> Non-English',
|
||||
link: '/non-english'
|
||||
},
|
||||
{
|
||||
text: '<span class="i-twemoji:file-folder"></span> Miscellaneous',
|
||||
link: '/misc'
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
text: 'Tools',
|
||||
collapsed: false,
|
||||
items: [
|
||||
{
|
||||
text: '<span class="i-twemoji:laptop"></span> System Tools',
|
||||
link: '/system-tools'
|
||||
},
|
||||
{
|
||||
text: '<span class="i-twemoji:card-file-box"></span> File Tools',
|
||||
link: '/file-tools'
|
||||
},
|
||||
{
|
||||
text: '<span class="i-twemoji:paperclip"></span> Internet Tools',
|
||||
link: '/internet-tools'
|
||||
},
|
||||
{
|
||||
text: '<span class="i-twemoji:left-speech-bubble"></span> Social Media Tools',
|
||||
link: '/social-media-tools'
|
||||
},
|
||||
{
|
||||
text: '<span class="i-twemoji:memo"></span> Text Tools',
|
||||
link: '/text-tools'
|
||||
},
|
||||
{
|
||||
text: '<span class="i-twemoji:alien-monster"></span> Gaming Tools',
|
||||
link: '/gaming-tools'
|
||||
},
|
||||
{
|
||||
text: '<span class="i-twemoji:camera"></span> Image Tools',
|
||||
link: '/image-tools'
|
||||
},
|
||||
{
|
||||
text: '<span class="i-twemoji:videocassette"></span> Video Tools',
|
||||
link: '/video-tools'
|
||||
},
|
||||
{
|
||||
text: '<span class="i-twemoji:speaker-high-volume"></span> Audio Tools',
|
||||
link: '/audio#audio-tools'
|
||||
},
|
||||
{
|
||||
text: '<span class="i-twemoji:red-apple"></span> Educational Tools',
|
||||
link: '/educational#educational-tools'
|
||||
},
|
||||
{
|
||||
text: '<span class="i-twemoji:man-technologist"></span> Developer Tools',
|
||||
link: '/developer-tools'
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
text: 'More',
|
||||
collapsed: true,
|
||||
items: [
|
||||
meta.build.nsfw
|
||||
? {
|
||||
text: '<span class="i-twemoji:no-one-under-eighteen"></span> NSFW',
|
||||
link: 'https://rentry.org/NSFW-Checkpoint'
|
||||
}
|
||||
: {},
|
||||
{
|
||||
text: '<span class="i-twemoji:warning"></span> Unsafe Sites',
|
||||
link: '/unsafe'
|
||||
},
|
||||
{
|
||||
text: '<span class="i-twemoji:package"></span> Storage',
|
||||
link: '/storage'
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
|
|
@ -70,14 +70,14 @@ export function generateMeta(context: TransformContext, hostname: string) {
|
|||
])
|
||||
} else {
|
||||
const url = pageData.filePath.replace('index.md', '').replace('.md', '')
|
||||
const imageUrl = `${url}/__og_image__/og.png`
|
||||
const imageUrl = `${url}/__og_image__/og.webp`
|
||||
.replaceAll('//', '/')
|
||||
.replace(/^\//, '')
|
||||
|
||||
head.push(
|
||||
['meta', { property: 'og:image', content: `${hostname}/${imageUrl}` }],
|
||||
['meta', { property: 'og:image:width', content: '1200' }],
|
||||
['meta', { property: 'og:image:height', content: '628' }],
|
||||
['meta', { property: 'og:image:height', content: '630' }],
|
||||
['meta', { property: 'og:image:type', content: 'image/png' }],
|
||||
[
|
||||
'meta',
|
||||
|
|
@ -85,7 +85,7 @@ export function generateMeta(context: TransformContext, hostname: string) {
|
|||
],
|
||||
['meta', { name: 'twitter:image', content: `${hostname}/${imageUrl}` }],
|
||||
['meta', { name: 'twitter:image:width', content: '1200' }],
|
||||
['meta', { name: 'twitter:image:height', content: '628' }],
|
||||
['meta', { name: 'twitter:image:height', content: '630' }],
|
||||
[
|
||||
'meta',
|
||||
{ name: 'twitter:image:alt', content: pageData.frontmatter.title }
|
||||
|
|
|
|||
|
|
@ -20,6 +20,7 @@ import { mkdir, readFile, writeFile } from 'node:fs/promises'
|
|||
import { dirname, resolve } from 'node:path'
|
||||
import { fileURLToPath } from 'node:url'
|
||||
import { renderAsync } from '@resvg/resvg-js'
|
||||
import sharp from 'sharp'
|
||||
import consola from 'consola'
|
||||
import { createContentLoader } from 'vitepress'
|
||||
import { satoriVue } from 'x-satori/vue'
|
||||
|
|
@ -102,8 +103,8 @@ async function generateImage({
|
|||
|
||||
// consola.info(url, title, description)
|
||||
const options: SatoriOptions = {
|
||||
width: 1800,
|
||||
height: 900,
|
||||
width: 1200,
|
||||
height: 630,
|
||||
fonts,
|
||||
props: {
|
||||
title,
|
||||
|
|
@ -116,12 +117,16 @@ async function generateImage({
|
|||
|
||||
const render = await renderAsync(svg)
|
||||
|
||||
const compressed = await sharp(render.asPng())
|
||||
.webp({ quality: 75 })
|
||||
.toBuffer()
|
||||
|
||||
const outputFolder = resolve(outDir, url.slice(1), '__og_image__')
|
||||
const outputFile = resolve(outputFolder, 'og.png')
|
||||
const outputFile = resolve(outputFolder, 'og.webp')
|
||||
|
||||
await mkdir(outputFolder, { recursive: true })
|
||||
|
||||
await writeFile(outputFile, render.asPng())
|
||||
await writeFile(outputFile, compressed)
|
||||
}
|
||||
|
||||
function getPage(page: string) {
|
||||
|
|
|
|||
|
|
@ -17,23 +17,27 @@
|
|||
import type { MarkdownRenderer } from 'vitepress'
|
||||
|
||||
const excluded = ['Beginners Guide']
|
||||
const starredMarkers = [':star:', ':glowing-star:', '⭐', '🌟']
|
||||
const indexMarkers = ['🌐', ':globe_with_meridians:', ':globe-with-meridians:']
|
||||
|
||||
export function toggleStarredPlugin(md: MarkdownRenderer) {
|
||||
md.renderer.rules.list_item_open = (tokens, index, options, env, self) => {
|
||||
const contentToken = tokens[index + 2]
|
||||
|
||||
// Ensure the token exists
|
||||
if (contentToken) {
|
||||
const content = contentToken.content
|
||||
if (!contentToken) return self.renderToken(tokens, index, options)
|
||||
|
||||
if (
|
||||
!excluded.includes(env.frontmatter.title) &&
|
||||
(content.includes(':star:') || content.includes(':glowing-star:'))
|
||||
) {
|
||||
return `<li class="starred">`
|
||||
}
|
||||
}
|
||||
const content = contentToken.content
|
||||
const isStarred =
|
||||
!excluded.includes(env.frontmatter.title) &&
|
||||
starredMarkers.some((marker) => content.includes(marker))
|
||||
const isIndex = indexMarkers.some((marker) => content.includes(marker))
|
||||
|
||||
return self.renderToken(tokens, index, options)
|
||||
if (!isStarred && !isIndex) return self.renderToken(tokens, index, options)
|
||||
|
||||
const classes = []
|
||||
if (isStarred) classes.push('starred')
|
||||
if (isIndex) classes.push('index')
|
||||
|
||||
return `<li class="${classes.join(' ')}">`
|
||||
}
|
||||
}
|
||||
|
|
|
|||
8
docs/.vitepress/notes/1337x-ranks.md
Normal file
8
docs/.vitepress/notes/1337x-ranks.md
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
#### 1337x Ranks
|
||||
|
||||
* ⬛ Black - Administrators
|
||||
* 🟩 Green - Moderators
|
||||
* 🟦 Blue - VIP Uploaders (Very Trusted)
|
||||
* 🟨 Yellow - Uploaders (Trusted)
|
||||
* 🟥 Red - Trial Uploaders
|
||||
* ⬜ Grey - Users
|
||||
7
docs/.vitepress/notes/advanced-logic-calculators.md
Normal file
7
docs/.vitepress/notes/advanced-logic-calculators.md
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
#### Advanced Logic Calculators
|
||||
|
||||
* Analytic tableaux generator: https://www.umsu.de/trees/
|
||||
* Natural deduction proof checker: https://proofs.openlogicproject.org/
|
||||
* Propositional logic calculator (finds models): https://www.inf.unibz.it/~franconi/teaching/propcalc/
|
||||
* A tutorial on sequent calculus: http://logitext.mit.edu/tutorial
|
||||
* Modal logic playground (for constructing models): https://rkirsling.github.io/modallogic/
|
||||
4
docs/.vitepress/notes/alt-twitch-player-extensions.md
Normal file
4
docs/.vitepress/notes/alt-twitch-player-extensions.md
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
#### Alternative Twitch Player Extensions
|
||||
|
||||
* https://addons.mozilla.org/en-US/firefox/addon/twitch_5/
|
||||
* https://chrome.google.com/webstore/detail/alternate-player-for-twit/bhplkbgoehhhddaoolmakpocnenplmhf
|
||||
6
docs/.vitepress/notes/alt-warp-clients.md
Normal file
6
docs/.vitepress/notes/alt-warp-clients.md
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
#### Alternative Warp Clients
|
||||
|
||||
If you can't connect, try `Scanner Settings` -> `Endpoint` -> `Suggested` -> then try different IP's to find one that works
|
||||
|
||||
* https://github.com/bepass-org/oblivion-desktop
|
||||
* https://github.com/bepass-org/oblivion
|
||||
3
docs/.vitepress/notes/android-spotify-note.md
Normal file
3
docs/.vitepress/notes/android-spotify-note.md
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
#### Android Spotify Note
|
||||
|
||||
None of Spotify apks (for rooted and non-rooted users) works for now due to server side restriction.
|
||||
5
docs/.vitepress/notes/apkmirror-extensions.md
Normal file
5
docs/.vitepress/notes/apkmirror-extensions.md
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
#### APKMirror Extensions
|
||||
|
||||
* https://addons.mozilla.org/en-US/firefox/addon/toolbox-google-play-store/
|
||||
* https://chrome.google.com/webstore/detail/toolbox-for-google-play-s/fepaalfjfchbdianlgginbmpeeacahoo
|
||||
* https://addons.opera.com/en/extensions/details/toolbox-for-google-play-storetm/
|
||||
3
docs/.vitepress/notes/audiobookbay-warning.md
Normal file
3
docs/.vitepress/notes/audiobookbay-warning.md
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
#### AudiobookBay Warning
|
||||
|
||||
Avoid fake download links, use [Torrents / Magnets](https://i.ibb.co/8sV2061/0fa8159b11bb.png), or paste info hash into torrent client.
|
||||
3
docs/.vitepress/notes/aurora-note.md
Normal file
3
docs/.vitepress/notes/aurora-note.md
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
#### Aurora Note
|
||||
|
||||
Keep in mind that some apps will not work unless you installed them from the Google Play Store. This is usually true for things like banking, and other institutional apps.
|
||||
3
docs/.vitepress/notes/better-reasoning.md
Normal file
3
docs/.vitepress/notes/better-reasoning.md
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
#### Better Reasoning
|
||||
|
||||
To get better reasoning, switch to "Think Deeper" mode.
|
||||
3
docs/.vitepress/notes/bookmarkeddit.md
Normal file
3
docs/.vitepress/notes/bookmarkeddit.md
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
#### Bookmarkeddit
|
||||
|
||||
This also extends the amount of saved posts you can view (Reddit caps at 1000 by default).
|
||||
7
docs/.vitepress/notes/buster-note.md
Normal file
7
docs/.vitepress/notes/buster-note.md
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
#### Buster Note
|
||||
|
||||
The client app simulates user interactions which greatly improves the success rate of buster. You can download the app through the extensions option page, or from the link below:
|
||||
|
||||
https://github.com/dessant/buster-client
|
||||
|
||||
The app is available for Windows, Linux, and macOS.
|
||||
3
docs/.vitepress/notes/buzzheavier-warning.md
Normal file
3
docs/.vitepress/notes/buzzheavier-warning.md
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
#### Buzzheavier Warning
|
||||
|
||||
Make sure you have an [adblocker](https://fmhy.net/adblockvpnguide#adblocking) when using Buzzheavier as there are hidden ads on download pages with malicious content. Both the download button and torrent buttons should automatically start a download in your browser, NOT redirect you to another page.
|
||||
3
docs/.vitepress/notes/bypass-freedlink.md
Normal file
3
docs/.vitepress/notes/bypass-freedlink.md
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
#### Bypass FREEdlink
|
||||
|
||||
You still need to bypass Cloudflare captcha by yourself. This only bypasses timer on single downloads. You may still need to wait normal time to download another file which is enforced from server-side.
|
||||
3
docs/.vitepress/notes/captcha-4pda.md
Normal file
3
docs/.vitepress/notes/captcha-4pda.md
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
#### Captcha 4PDA
|
||||
|
||||
Use Google Gemini to translate the captcha.
|
||||
3
docs/.vitepress/notes/chatgpt-limits.md
Normal file
3
docs/.vitepress/notes/chatgpt-limits.md
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
#### ChatGPT Limits
|
||||
|
||||
GPT-5.2 Instant (no reasoning; 16K context) / 10 messages every 5 hours, then GPT-5-mini.
|
||||
4
docs/.vitepress/notes/clipboard2file-addons.md
Normal file
4
docs/.vitepress/notes/clipboard2file-addons.md
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
#### Clipboard2File Addons
|
||||
|
||||
* https://github.com/vord1080/clipboard2file/
|
||||
* https://github.com/daijro/Clipboard2File-Chrome
|
||||
3
docs/.vitepress/notes/cofi-note.md
Normal file
3
docs/.vitepress/notes/cofi-note.md
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
#### Cofi Note
|
||||
|
||||
Useful if you're a coffee enthusiast. The methods are created by James Hoffmann, he's a world champion barista and popular YouTuber.
|
||||
3
docs/.vitepress/notes/crystaldiskinfo.md
Normal file
3
docs/.vitepress/notes/crystaldiskinfo.md
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
#### CrystalDiskInfo
|
||||
|
||||
Avoid versions labeled "Ads".
|
||||
5
docs/.vitepress/notes/csrin-search.md
Normal file
5
docs/.vitepress/notes/csrin-search.md
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
#### CS.RIN Search
|
||||
|
||||
If your initial search doesn't work, trying searching the same term again within the "search these results" engine on the results screen.
|
||||
|
||||
<img width="1307" height="97" alt="image" src="https://github.com/user-attachments/assets/b2f149b9-8a9a-4250-8754-e63f50b82c59" />
|
||||
3
docs/.vitepress/notes/cute-save-button-icon.md
Normal file
3
docs/.vitepress/notes/cute-save-button-icon.md
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
#### Changing the Cute Save Button Icon
|
||||
|
||||
You can change the icon of the save button in the extension's settings. The setting is labeled "Your custom cute icon:" You can find standard image download icons to use instead here: https://rentry.co/image-download-icons.
|
||||
3
docs/.vitepress/notes/dodi-warning.md
Normal file
3
docs/.vitepress/notes/dodi-warning.md
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
#### DODI Warning
|
||||
|
||||
It is highly recommended to stick to DODI's 1337x page or main website, as sites they linked to have malicious fake download buttons, and shouldn't be used without an [adblocker](https://fmhy.net/privacy#adblocking).
|
||||
3
docs/.vitepress/notes/dolby-access-atmos-note.md
Normal file
3
docs/.vitepress/notes/dolby-access-atmos-note.md
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
#### Dolby Access / Atmos Note
|
||||
|
||||
Many headsets come with Dolby Access for free without letting users know. You can check if you're licensed by opening Dolby Access, going to settings, and looking in the [bottom right corner](https://i.imgur.com/9vJA6CL.png). It's much better than things like iCue or similar apps.
|
||||
3
docs/.vitepress/notes/driver-note.md
Normal file
3
docs/.vitepress/notes/driver-note.md
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
#### Driver Note
|
||||
|
||||
Only install the drivers you actually need. Don't install new drivers all at once, as this could lead to things breaking, especially system audio.
|
||||
3
docs/.vitepress/notes/eaglercraft-note.md
Normal file
3
docs/.vitepress/notes/eaglercraft-note.md
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
#### Eaglercraft Note
|
||||
|
||||
Play on Chromium-based browsers for the best performance.
|
||||
6
docs/.vitepress/notes/eruda.md
Normal file
6
docs/.vitepress/notes/eruda.md
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
#### Eruda
|
||||
|
||||
Eruda Console for mobile browsers [bookmarklet](https://wikipedia.org/wiki/Bookmarklet):
|
||||
```
|
||||
javascript:(function () { var script = document.createElement('script'); script.src="//cdn.jsdelivr.net/npm/eruda"; document.body.appendChild(script); script.onload = function () { eruda.init() } })();
|
||||
```
|
||||
3
docs/.vitepress/notes/filebin-warning.md
Normal file
3
docs/.vitepress/notes/filebin-warning.md
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
#### Filebin Warning
|
||||
|
||||
Anyone with a link to a "bin" has full access to it. They can add new files, delete existing files, etc.
|
||||
3
docs/.vitepress/notes/filelu-warning.md
Normal file
3
docs/.vitepress/notes/filelu-warning.md
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
#### Filelu Warning
|
||||
|
||||
According to their FAQ, you must login to your account at least once every 180 days to prevent your account and it's files being deleted.
|
||||
3
docs/.vitepress/notes/filezilla-warning.md
Normal file
3
docs/.vitepress/notes/filezilla-warning.md
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
#### FileZilla Warning
|
||||
|
||||
The version of FileZilla on FileZilla's front page has adware, but the non-adware version is the only link on FMHY. You can also find the non-adware version by pressing download on the FileZilla front page, then clicking "Show additional download options" under "More download options" at the download page.
|
||||
3
docs/.vitepress/notes/flicker-proxy.md
Normal file
3
docs/.vitepress/notes/flicker-proxy.md
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
#### Flicker Proxy
|
||||
|
||||
Note that the proxy may be slower, but it can be used in cases where the site or TMDb is blocked.
|
||||
3
docs/.vitepress/notes/fluxy-repacks.md
Normal file
3
docs/.vitepress/notes/fluxy-repacks.md
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
#### Fluxy Repacks
|
||||
|
||||
Note that although it has repacks in the name, its not actually a repack site.
|
||||
4
docs/.vitepress/notes/forest-extensions.md
Normal file
4
docs/.vitepress/notes/forest-extensions.md
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
#### Forest Extensions
|
||||
|
||||
* https://addons.mozilla.org/en-US/firefox/addon/forest-stay-focused-be-present/
|
||||
* https://chrome.google.com/webstore/detail/forest-stay-focused-be-pr/kjacjjdnoddnpbbcjilcajfhhbdhkpgk
|
||||
3
docs/.vitepress/notes/foxit-warning.md
Normal file
3
docs/.vitepress/notes/foxit-warning.md
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
#### Foxit Warning
|
||||
|
||||
The installer tries to install McAfee WebAdvisor + PhantomPDF Business. They can be skipped by clicking "decline" both times.
|
||||
5
docs/.vitepress/notes/freegogpcgames-note.md
Normal file
5
docs/.vitepress/notes/freegogpcgames-note.md
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
#### FreeGOGPCGames Note
|
||||
|
||||
The file checksum may not match with the original GOG installer. This is because many titles on the site are the older versions of the installers, the digital signature on the old installers are signed by *GOG Limited*, which is the old company's name before it was merged with *GOG Sp. z o.o* and all digital file signatures were updated to reflect this name change. The hash does not match the gog-games database because the digital file signatures differ on the installer. Installing either version will produce identical sets of files since the game version remains unchanged.
|
||||
|
||||
- [/u/AtariRiot66](https://www.reddit.com/r/PiratedGames/comments/1br4m7o/comment/kx8hzz3/)
|
||||
3
docs/.vitepress/notes/gemai.md
Normal file
3
docs/.vitepress/notes/gemai.md
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
#### Nano Banana Pro Note
|
||||
|
||||
Nano Banana Pro is a bit glitchy as of now, but it is being worked on according to their Discord staff.
|
||||
3
docs/.vitepress/notes/general-tweak-warning.md
Normal file
3
docs/.vitepress/notes/general-tweak-warning.md
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
#### General Tweak Warning
|
||||
|
||||
Make sure you know what you're doing before you apply these tweaks. Always research first, never just "Apply All" without knowing what what will happen.
|
||||
9
docs/.vitepress/notes/glitchwave-note.md
Normal file
9
docs/.vitepress/notes/glitchwave-note.md
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
#### Glitchwave Note
|
||||
|
||||
For charts you can specify months and days using URLs like the following examples:
|
||||
|
||||
January 2006:
|
||||
`https://glitchwave.com/charts/popular/game/2006.01/excl:ratings/`
|
||||
|
||||
Jan - Feb 2018:
|
||||
`https://glitchwave.com/charts/popular/game/2018.01-2018.02/excl:ratings/`
|
||||
3
docs/.vitepress/notes/google-song-identification.md
Normal file
3
docs/.vitepress/notes/google-song-identification.md
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
#### Google Song Identification
|
||||
|
||||
Google and YouTube Music mobile apps have song identification button next to the search box.
|
||||
3
docs/.vitepress/notes/google-translate-note.md
Normal file
3
docs/.vitepress/notes/google-translate-note.md
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
#### Google Translate Note
|
||||
|
||||
Google Translate can be used as a web proxy. Simply paste your URL into the translate field and then click on the result and view the page in the original language. This way you can navigate any web-page via google.com. Google is almost never blocked so this trick works on most occasions.
|
||||
3
docs/.vitepress/notes/hdo-box-note.md
Normal file
3
docs/.vitepress/notes/hdo-box-note.md
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
#### HDO Box Note
|
||||
|
||||
To use the app, HDO Box may ask you to install a third-party video player which contains ads. To block the ads, use the tools linked in [DNS Adblocking](https://fmhy.net/privacy#dns-adblocking).
|
||||
5
docs/.vitepress/notes/hugging-face-warning.md
Normal file
5
docs/.vitepress/notes/hugging-face-warning.md
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
#### Hugging Face Warning
|
||||
|
||||
HuggingFace uses a system called ZeroGPU to manage access to their high-end GPUs. To make sure that their GPUs don't get fully used up, there are limits on how long you can use the GPU on Spaces like this one.
|
||||
|
||||
The rate limit is 120 seconds per day for non-logged in users. You can get around the limit by changing your IP address using a [proxy](https://fmhy.net/privacy#proxy) or [VPN](https://fmhy.net/privacy#vpn) while logged out. If you sign up for a free account, you get a much higher 300 second daily limit, but changing your IP address won't reset it.
|
||||
3
docs/.vitepress/notes/instaeclipse-note.md
Normal file
3
docs/.vitepress/notes/instaeclipse-note.md
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
#### InstaEclipse Note
|
||||
|
||||
Use [this guide](https://wispydocs.pages.dev/revanced-morphe-obtainium/#advanced) to build clean APKs, or use AntiSplit M with ReVanced manager.
|
||||
5
docs/.vitepress/notes/irc-highway-note.md
Normal file
5
docs/.vitepress/notes/irc-highway-note.md
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
#### IRC Highway Note
|
||||
|
||||
To request a book run: @request [author] [title] - Requests without both [author] and [title] are deleted.
|
||||
|
||||
To view request status and rules run: @request-list
|
||||
3
docs/.vitepress/notes/jdownloader-warning.md
Normal file
3
docs/.vitepress/notes/jdownloader-warning.md
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
#### JDownloader Warning
|
||||
|
||||
The version of JDownloader linked on JDownloader's front page has adware. The version linked on FMHY, however, does not contain any adware.
|
||||
4
docs/.vitepress/notes/limit-bypass-note.md
Normal file
4
docs/.vitepress/notes/limit-bypass-note.md
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
#### Limit Bypass Note
|
||||
|
||||
- SparseBox: iOS 17.0 - 18.1 Beta 4 (not including 17.7.1, 17.7.2)
|
||||
- Live container: iOS 16+
|
||||
3
docs/.vitepress/notes/liteapk-modyolo-note.md
Normal file
3
docs/.vitepress/notes/liteapk-modyolo-note.md
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
#### LiteAPK + Modyolo Note
|
||||
|
||||
The site is safe, but they are known for mislabeling things like RockMods releases as their own, and mislabeling versions to make it look like they have newer things than they really do.
|
||||
3
docs/.vitepress/notes/malware-removal-forums.md
Normal file
3
docs/.vitepress/notes/malware-removal-forums.md
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
#### Malware Removal Forums
|
||||
|
||||
Note that many of these will suggest removing pirated software, but if you got everything from trusted sources, there is no real need to do that.
|
||||
3
docs/.vitepress/notes/megabasterd-note.md
Normal file
3
docs/.vitepress/notes/megabasterd-note.md
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
#### Megabasterd Note
|
||||
|
||||
Free proxies work but they are very hit and miss.
|
||||
3
docs/.vitepress/notes/mobilism-ranks.md
Normal file
3
docs/.vitepress/notes/mobilism-ranks.md
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
#### Mobilism Ranks
|
||||
|
||||
See what the different Mobilism Ranks mean [here](https://i.imgur.com/WpShSFp.png).
|
||||
3
docs/.vitepress/notes/modelscope.md
Normal file
3
docs/.vitepress/notes/modelscope.md
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
### ModelScope Note
|
||||
|
||||
This site uses credits (called *magicubes*) to generate images and videos, you get 100 daily. It costs 2 magicubes per image for Qwen, 1 for Z-Image, and 28 for Wan 2.2 14b I2V. You can link an Alibaba Cloud account for free if you ignore the final part of account setup where it asks for payment info and link the account anyways, which gets you 50 extra magicubes daily.
|
||||
3
docs/.vitepress/notes/mori-note.md
Normal file
3
docs/.vitepress/notes/mori-note.md
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
#### Māori Note
|
||||
|
||||
Māori is the indigenous language of mainland New Zealand. Due to the [Native Schools Act](https://en.wikipedia.org/wiki/M%C4%81ori_language#Suppression_and_decline) in 1867, children were forbidden to speak it in the classroom, under penalty of corporal punishment, which led to a rapid decline of speakers. There are now [revitalization efforts](https://en.wikipedia.org/wiki/M%C4%81ori_language_revival) (such as Tōku Reo) attempting to promote and reinforce its use.
|
||||
7
docs/.vitepress/notes/movie-web-sources.md
Normal file
7
docs/.vitepress/notes/movie-web-sources.md
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
#### Adding sources to P-Stream (and all movie-web forks)
|
||||
|
||||
You can [enable an extension](https://docs.pstream.mov/extension) / [script](https://github.com/p-stream/userscript) that will add more sources, but it needs to connect to all sites to function. The extension is safe, and many people use it, the permissions are just needed in order for the extension to work correctly. For more info: https://rentry.co/htagcrv4
|
||||
|
||||
Note that you can run it in a new browser or fresh browser profile if you don't want to use your main browser.
|
||||
|
||||
Documentation and self-hosting guides can be found here: https://docs.pstream.mov/
|
||||
5
docs/.vitepress/notes/movieparadise-code.md
Normal file
5
docs/.vitepress/notes/movieparadise-code.md
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
#### MovieParadise Code
|
||||
|
||||
In order to unlock the better host (1fichier) you need a signup code. This is important as without it the site will be only Rapidgator links, which are very slow. You can get a code from the link below, or from the pinned messages in our `#free-stuff` [Discord channel](https://github.com/fmhy/FMHY/wiki/FMHY-Discord).
|
||||
|
||||
**[Click Here To Get Code](https://rentry.org/he8fhzku)**
|
||||
5
docs/.vitepress/notes/mp-opensubs.md
Normal file
5
docs/.vitepress/notes/mp-opensubs.md
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
### OpenSubtitles with MPC-HC
|
||||
|
||||
You can create an OpenSubtitles account and link it in MPC-HC to bypass quota limits.
|
||||
|
||||
You can do this via a panel in MPC-HC located at: `Options` -> `Subtitles` -> `Misc.` > Right-click on `OpenSubtitles.com` -> `Setup` -> Fill in username and password.
|
||||
3
docs/.vitepress/notes/mvsep-note.md
Normal file
3
docs/.vitepress/notes/mvsep-note.md
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
#### MVSEP Note
|
||||
|
||||
Register to get .wav and .flac output, and lower queue times.
|
||||
10
docs/.vitepress/notes/oneclick-note.md
Normal file
10
docs/.vitepress/notes/oneclick-note.md
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
#### OneClick Note
|
||||
|
||||
Main features include:
|
||||
- Download links straight to Google Drive.
|
||||
- Torrent to Google Drive.
|
||||
- Google Drive Download Manager (similar to pyLoad).
|
||||
- Spotify Downloader.
|
||||
- Jellyfin Support.
|
||||
- RClone + WebUI.
|
||||
- And much more.
|
||||
3
docs/.vitepress/notes/openasar.md
Normal file
3
docs/.vitepress/notes/openasar.md
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
#### OpenAsar Note
|
||||
|
||||
The Vencord installer has an option to install OpenAsar, but you may need to click the install button twice (only once more after clicking "Accept").
|
||||
8
docs/.vitepress/notes/openrgb-beta.md
Normal file
8
docs/.vitepress/notes/openrgb-beta.md
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
#### OpenRGB Beta
|
||||
|
||||
The latest stable release (0.9) is from July, 2023. It is lacking support for many devices, so you may want to use a newer experimental release instead.
|
||||
|
||||
* Supported devices for the latest stable release (0.9): https://openrgb.org/devices_0.9.html
|
||||
* Supported devices for the latest experimental release: https://openrgb.org/devices.html
|
||||
|
||||
To use an experimental release go to https://gitlab.com/CalcProgrammer1/OpenRGB and in the left sidebar go to `Build` -> `Pipelines`, then click the download icon for a pipeline that has three green checkmarks, and pick the appropriate version for your computer.
|
||||
17
docs/.vitepress/notes/pollinations-limits.md
Normal file
17
docs/.vitepress/notes/pollinations-limits.md
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
#### Pollinations Limits
|
||||
|
||||
For chat.pollinations.ai (and the underlying API), the rate limits depend on how you're using it:
|
||||
|
||||
**Anonymous / Free Tier (No Login)**
|
||||
- **Text/Chat**: ~1 request every **3 seconds** (per IP).
|
||||
- **Images**: ~1 request every **5 seconds** (per IP).
|
||||
|
||||
**Logged In (Pollen System)**
|
||||
- Users get a **daily free Pollen allowance** based on their tier.
|
||||
- **Publishable Keys (`pk_`)**: Rate limited to prevent abuse (e.g., ~1 pollen/hour per IP).
|
||||
- **Secret Keys (`sk_`)**: **No rate limits** (requests run as fast as you can pay for them with Pollen).
|
||||
|
||||
If you're hitting limits on the chat site:
|
||||
1. Slow down slightly (wait 3-5s between messages).
|
||||
2. **Log in** at [enter.pollinations.ai](https://enter.pollinations.ai) to use your daily free credits.
|
||||
3. If you need massive throughput, use an API key (`sk_`) with purchased credits.
|
||||
4
docs/.vitepress/notes/printeditwe-addons.md
Normal file
4
docs/.vitepress/notes/printeditwe-addons.md
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
#### PrintEditWe Addons
|
||||
|
||||
* https://addons.mozilla.org/en-US/firefox/addon/print-edit-we/
|
||||
* https://chrome.google.com/webstore/detail/print-edit-we/olnblpmehglpcallpnbgmikjblmkopia
|
||||
5
docs/.vitepress/notes/proton-torrenting.md
Normal file
5
docs/.vitepress/notes/proton-torrenting.md
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
#### Proton Torrenting
|
||||
|
||||
Torrenting on Proton VPN's free plan is only possible when using an OpenVPN configuration / [Guide](https://protonvpn.com/support/vpn-config-download). Note that they do expire, so you'll have to make new ones occasionally.
|
||||
|
||||
OpenVPN login credentials are located [here](https://account.protonvpn.com/account-password).
|
||||
3
docs/.vitepress/notes/reaper-note.md
Normal file
3
docs/.vitepress/notes/reaper-note.md
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
#### Reaper Note
|
||||
|
||||
Reaper asks you to buy it after 60 days, but you can just close the popup and keep using it for free.
|
||||
3
docs/.vitepress/notes/redditfilter-note.md
Normal file
3
docs/.vitepress/notes/redditfilter-note.md
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
#### RedditFilter Note
|
||||
|
||||
Go to `Settings` -> `Feed Filter` and untoggle `Promoted` to not see ads. You can also untoggle `Recommended` to hide AI suggestions.
|
||||
8
docs/.vitepress/notes/rgshows-autoplay.md
Normal file
8
docs/.vitepress/notes/rgshows-autoplay.md
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
#### RGShows Autoplay
|
||||
|
||||
To enable autoplay on Firefox:
|
||||
* Click the permissions button located to the left of your search bar and click `Allow Audio and Video` next to `Autoplay`.
|
||||
|
||||
or
|
||||
|
||||
* Do `Ctrl-I` -> `Permissions` -> set `Autoplay` to `Allow Audio and Video`.
|
||||
13
docs/.vitepress/notes/sanet-warning.md
Normal file
13
docs/.vitepress/notes/sanet-warning.md
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
#### Sanet Warning
|
||||
|
||||
Note that Sanet has been known to host unsafe things like KMS Matrix, so it's best to avoid it for software and games.
|
||||
|
||||
SoftArchive Mirrors
|
||||
|
||||
- https://sanet.download/
|
||||
- https://softarchive.is/
|
||||
- https://sanet.lc/
|
||||
- https://sanet.ws/
|
||||
- https://sanet.st/
|
||||
- https://sanet.sb/
|
||||
- https://soft.ac/
|
||||
4
docs/.vitepress/notes/savepagewe.md
Normal file
4
docs/.vitepress/notes/savepagewe.md
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
#### SavePageWe
|
||||
|
||||
* https://addons.mozilla.org/en-US/firefox/addon/save-page-we/
|
||||
* https://chrome.google.com/webstore/detail/save-page-we/dhhpefjklgkmgeafimnjhojgjamoafof
|
||||
5
docs/.vitepress/notes/scrollanywhere-addons.md
Normal file
5
docs/.vitepress/notes/scrollanywhere-addons.md
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
#### ScrollAnywhere Addons
|
||||
|
||||
* https://addons.mozilla.org/en-US/firefox/addon/scroll_anywhere/
|
||||
* https://chrome.google.com/webstore/detail/scrollanywhere/jehmdpemhgfgjblpkilmeoafmkhbckhi
|
||||
* https://addons.opera.com/en/extensions/details/scrollanywhere/?display=en
|
||||
3
docs/.vitepress/notes/sd-maid.md
Normal file
3
docs/.vitepress/notes/sd-maid.md
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
#### SD Maid Note
|
||||
|
||||
The Google Play Store version is paid only. On the F-Droid and GitHub versions, however, you can use paid features for free by pressing `Support the development` and not donating.
|
||||
3
docs/.vitepress/notes/sh-note.md
Normal file
3
docs/.vitepress/notes/sh-note.md
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
#### SH Note
|
||||
|
||||
Based on [this](https://wikipedia.org/wiki/Secret_Hitler) popular card game which was created by a co-founder of [Cards Against Humanity](https://wikipedia.org/wiki/Cards_Against_Humanity).
|
||||
3
docs/.vitepress/notes/site-favicon-dl.md
Normal file
3
docs/.vitepress/notes/site-favicon-dl.md
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
#### Site Favicon Downloading
|
||||
|
||||
You can also go to `https://www.google.com/s2/favicons?domain=URL&sz=64` where `URL` is the URL of the site you want the favicon of and `sz` is the size in pixels.
|
||||
3
docs/.vitepress/notes/soft98-note.md
Normal file
3
docs/.vitepress/notes/soft98-note.md
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
#### Soft98 Note
|
||||
|
||||
Enable the `AdGuard - Ads` filter list in uBlock to allow downloads to work. To remove all ads, you can also get the [AdGuard Extra Userscript](https://github.com/AdguardTeam/AdGuardExtra?tab=readme-ov-file#userscript) (not the extension) and enable it in your [userscript manager](https://fmhy.net/internet-tools#userscripts). Note that you may need to disable filter `ir: PersianBlocker`.
|
||||
3
docs/.vitepress/notes/sora.md
Normal file
3
docs/.vitepress/notes/sora.md
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
#### Sora
|
||||
|
||||
Bypass the need for a invite code by installing Sora Mobile, and logging into OpenAI.
|
||||
1
docs/.vitepress/notes/spacewar.md
Normal file
1
docs/.vitepress/notes/spacewar.md
Normal file
|
|
@ -0,0 +1 @@
|
|||
Spacewar! is a [1962 multiplayer game](https://wikipedia.org/wiki/Spacewar!) made for the DEC PDP-1 minicomputer. It was later ported to other systems, making it the first ever multi-computer game.
|
||||
5
docs/.vitepress/notes/spicetify-note.md
Normal file
5
docs/.vitepress/notes/spicetify-note.md
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
#### Spicetify Note
|
||||
|
||||
Join their [Discord](https://discord.gg/VnevqPp2Rr) for version compatibility.
|
||||
|
||||
Note that you can use the store built in to get a full list of addons and themes.
|
||||
3
docs/.vitepress/notes/sport7.md
Normal file
3
docs/.vitepress/notes/sport7.md
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
#### Sport7
|
||||
|
||||
Many sites use this player but this was the original.
|
||||
3
docs/.vitepress/notes/steam-controller-support.md
Normal file
3
docs/.vitepress/notes/steam-controller-support.md
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
#### Steam Controller Support
|
||||
|
||||
Steam has built in support for most controller types, just add your games to Steam, right click the game, and turn on your controller.
|
||||
5
docs/.vitepress/notes/steam-currency-converter-note.md
Normal file
5
docs/.vitepress/notes/steam-currency-converter-note.md
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
#### Steam Currency Converter Note
|
||||
|
||||
For instant currency conversion:
|
||||
|
||||
Go to Firefox's add-on settings (or the link `about:addons`) -> click on the add-on -> go to the `Permissions and data` section -> enable the optional sites.
|
||||
4
docs/.vitepress/notes/tabiverse-extensions.md
Normal file
4
docs/.vitepress/notes/tabiverse-extensions.md
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
#### Tabiverse Extensions
|
||||
|
||||
* https://addons.mozilla.org/firefox/addon/tabiverse/
|
||||
* https://chromewebstore.google.com/detail/hpplgjkooibhfkmmepoikcjpadcojcik
|
||||
3
docs/.vitepress/notes/tautulli-note.md
Normal file
3
docs/.vitepress/notes/tautulli-note.md
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
#### Tautulli Note
|
||||
|
||||
This will sometimes get falsely flagged by Windows Defender and removed automatically, so it may need to be allowed manually.
|
||||
3
docs/.vitepress/notes/teamspeak-warning.md
Normal file
3
docs/.vitepress/notes/teamspeak-warning.md
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
#### TeamSpeak Warning
|
||||
|
||||
Note that TeamSpeak server admins can view user IP addresses, so only join servers you trust.
|
||||
5
docs/.vitepress/notes/thunderbird.md
Normal file
5
docs/.vitepress/notes/thunderbird.md
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
#### Thunderbird Notifications
|
||||
|
||||
To get real-time notifications:
|
||||
|
||||
Press the three lines in the top left corner -> select the account you want to configure -> select `Manage Folders` -> select the folder you want from below. You can then select inbox and enable push. (Notifications must be enabled).
|
||||
5
docs/.vitepress/notes/tinyurl-note.md
Normal file
5
docs/.vitepress/notes/tinyurl-note.md
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
#### TinyURL Note
|
||||
|
||||
To reveal the destination URL, replace "www" with "preview" in the URL like so:
|
||||
|
||||
https://preview.tinyurl.com/5erwtst5
|
||||
3
docs/.vitepress/notes/video-downloadhelper.md
Normal file
3
docs/.vitepress/notes/video-downloadhelper.md
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
#### Video DownloadHelper
|
||||
|
||||
Note that some versions of this extension give a watermark on sites that need conversion. It seems to happen on the Windows + Firefox version.
|
||||
3
docs/.vitepress/notes/welib-note.md
Normal file
3
docs/.vitepress/notes/welib-note.md
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
#### WeLib Note
|
||||
|
||||
WeLib is *not* connected to Anna's Archive, they simply mirror Anna's content onto their own site that has a different UI. It is not updated as often, and they don't share their codebase improvements publicly, so they aren't endorsed by Anna's themselves.
|
||||
3
docs/.vitepress/notes/winrar.md
Normal file
3
docs/.vitepress/notes/winrar.md
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
#### WinRAR Note
|
||||
|
||||
WinRAR does not auto-update, and because it had a remote code execution vulnerability in the past, you should make sure you've manually updated **to 7.13 or later** to be safe.
|
||||
3
docs/.vitepress/notes/yet-another-call-blocker-note.md
Normal file
3
docs/.vitepress/notes/yet-another-call-blocker-note.md
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
#### Yet Another Call Blocker Note
|
||||
|
||||
The app itself isn't updated, but the blocklists are. It has a main local blocklist by default, and if you have "Auto-update database" enabled the app receives daily blocklist updates directly from third-party services. More info in their [GitLab repository](https://gitlab.com/xynngh/YetAnotherCallBlocker#yet-another-call-blocker).
|
||||
4
docs/.vitepress/notes/youtube-tweaks.md
Normal file
4
docs/.vitepress/notes/youtube-tweaks.md
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
#### YouTube Tweaks
|
||||
|
||||
* https://addons.mozilla.org/firefox/addon/youtube-tweaks/
|
||||
* https://chrome.google.com/webstore/detail/youtube-tweaks/oeakphpfoaeggagmgphfejmfjbhjfhhh
|
||||
3
docs/.vitepress/notes/yts-yify-note.md
Normal file
3
docs/.vitepress/notes/yts-yify-note.md
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
#### YTS / Yify Note
|
||||
|
||||
YTS / Yify has many fake copycat sites out there, make sure you're on one of the official domains before downloading anything. To be extra protected from fake sites, check out [FMHY SafeGuard](https://github.com/fmhy/FMHY-SafeGuard) and the [FMHY Filterlist](https://github.com/fmhy/FMHYFilterlist).
|
||||
250
docs/.vitepress/shared.ts
Normal file
250
docs/.vitepress/shared.ts
Normal file
|
|
@ -0,0 +1,250 @@
|
|||
/**
|
||||
* Copyright (c) 2025 taskylizard. Apache License 2.0.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
import type { DefaultTheme } from 'vitepress'
|
||||
|
||||
// @unocss-include
|
||||
|
||||
export const meta = {
|
||||
name: 'freemediaheckyeah',
|
||||
description: 'The largest collection of free stuff on the internet!',
|
||||
hostname: 'https://fmhy.net',
|
||||
keywords: ['stream', 'movies', 'gaming', 'reading', 'anime'],
|
||||
build: {
|
||||
api: true,
|
||||
nsfw: true
|
||||
}
|
||||
}
|
||||
|
||||
export const excluded = [
|
||||
'readme.md',
|
||||
'single-page',
|
||||
'feedback.md',
|
||||
'index.md',
|
||||
'sandbox.md',
|
||||
'startpage.md'
|
||||
]
|
||||
|
||||
const safeEnv = (key: string) => typeof process !== 'undefined' ? process.env?.[key] : undefined
|
||||
|
||||
if (safeEnv('FMHY_BUILD_NSFW') === 'false') {
|
||||
meta.build.nsfw = false
|
||||
}
|
||||
if (safeEnv('FMHY_BUILD_API') === 'false') {
|
||||
meta.build.api = false
|
||||
}
|
||||
|
||||
const formatCommitRef = (commitRef: string) =>
|
||||
`<a href="https://github.com/fmhy/edit/commit/${commitRef}">${commitRef.slice(0, 8)}</a>`
|
||||
|
||||
const cfStart = safeEnv('CF_PAGES_COMMIT_SHA')
|
||||
const commitStart = safeEnv('COMMIT_REF')
|
||||
|
||||
export const commitRef =
|
||||
safeEnv('CF_PAGES') && cfStart
|
||||
? formatCommitRef(cfStart)
|
||||
: commitStart
|
||||
? formatCommitRef(commitStart)
|
||||
: 'dev'
|
||||
|
||||
export const feedback = `<a href="/feedback" class="feedback-footer">Made with ❤</a>`
|
||||
|
||||
export const socialLinks: DefaultTheme.SocialLink[] = [
|
||||
{ icon: 'github', link: 'https://github.com/fmhy/edit' },
|
||||
{ icon: 'discord', link: 'https://github.com/fmhy/FMHY/wiki/FMHY-Discord' },
|
||||
{
|
||||
icon: 'reddit',
|
||||
link: 'https://reddit.com/r/FREEMEDIAHECKYEAH'
|
||||
}
|
||||
]
|
||||
|
||||
export const nav: DefaultTheme.NavItem[] = [
|
||||
{ text: '📑 Changelog', link: '/posts/changelog-sites' },
|
||||
{ text: '📖 Glossary', link: 'https://rentry.org/The-Piracy-Glossary' },
|
||||
{
|
||||
text: '💾 Backups',
|
||||
link: '/other/backups'
|
||||
},
|
||||
{
|
||||
text: '🌱 Ecosystem',
|
||||
items: [
|
||||
{ text: '🌐 Search', link: '/posts/search' },
|
||||
{ text: '❓ FAQs', link: '/other/FAQ' },
|
||||
{ text: '🔖 Bookmarks', link: 'https://github.com/fmhy/bookmarks' },
|
||||
{ text: '✅ SafeGuard', link: 'https://github.com/fmhy/FMHY-SafeGuard' },
|
||||
{ text: '🚀 Startpage', link: 'https://fmhy.net/startpage' },
|
||||
{ text: '✴️ rss.fmhy', link: 'https://rss.fmhy.bid/' },
|
||||
{ text: '🔎 SearXNG', link: 'https://searx.fmhy.net/' },
|
||||
{
|
||||
text: '💡 Site Hunting',
|
||||
link: 'https://www.reddit.com/r/FREEMEDIAHECKYEAH/wiki/find-new-sites/'
|
||||
},
|
||||
{
|
||||
text: '😇 SFW FMHY',
|
||||
link: 'https://fmhy.xyz/'
|
||||
},
|
||||
{
|
||||
text: '🏠 Selfhosting',
|
||||
link: '/other/selfhosting'
|
||||
},
|
||||
{ text: '🏞 Wallpapers', link: '/other/wallpapers' },
|
||||
{ text: '💙 Feedback', link: '/feedback' }
|
||||
]
|
||||
}
|
||||
]
|
||||
|
||||
export const sidebar: DefaultTheme.Sidebar | DefaultTheme.NavItemWithLink[] = [
|
||||
{
|
||||
text: '<span class="i-twemoji:books"></span> Beginners Guide',
|
||||
link: '/beginners-guide'
|
||||
},
|
||||
{
|
||||
text: '<span class="i-twemoji:newspaper"></span> Posts',
|
||||
link: '/posts'
|
||||
},
|
||||
{
|
||||
text: '<span class="i-twemoji:light-bulb"></span> Contribute',
|
||||
link: '/other/contributing'
|
||||
},
|
||||
{
|
||||
text: 'Wiki',
|
||||
collapsed: false,
|
||||
items: [
|
||||
{
|
||||
text: '<span class="i-twemoji:name-badge"></span> Adblocking / Privacy',
|
||||
link: '/privacy'
|
||||
},
|
||||
{
|
||||
text: '<span class="i-twemoji:robot"></span> Artificial Intelligence',
|
||||
link: '/ai'
|
||||
},
|
||||
{
|
||||
text: '<span class="i-twemoji:television"></span> Movies / TV / Anime',
|
||||
link: '/video'
|
||||
},
|
||||
{
|
||||
text: '<span class="i-twemoji:musical-note"></span> Music / Podcasts / Radio',
|
||||
link: '/audio'
|
||||
},
|
||||
{
|
||||
text: '<span class="i-twemoji:video-game"></span> Gaming / Emulation',
|
||||
link: '/gaming'
|
||||
},
|
||||
{
|
||||
text: '<span class="i-twemoji:green-book"></span> Books / Comics / Manga',
|
||||
link: '/reading'
|
||||
},
|
||||
{
|
||||
text: '<span class="i-twemoji:floppy-disk"></span> Downloading',
|
||||
link: '/downloading'
|
||||
},
|
||||
{
|
||||
text: '<span class="i-twemoji:cyclone"></span> Torrenting',
|
||||
link: '/torrenting'
|
||||
},
|
||||
{
|
||||
text: '<span class="i-twemoji:brain"></span> Educational',
|
||||
link: '/educational'
|
||||
},
|
||||
{
|
||||
text: '<span class="i-twemoji:mobile-phone"></span> Android / iOS',
|
||||
link: '/mobile'
|
||||
},
|
||||
{
|
||||
text: '<span class="i-twemoji:penguin"></span> Linux / macOS',
|
||||
link: '/linux-macos'
|
||||
},
|
||||
{
|
||||
text: '<span class="i-twemoji:globe-showing-asia-australia"></span> Non-English',
|
||||
link: '/non-english'
|
||||
},
|
||||
{
|
||||
text: '<span class="i-twemoji:file-folder"></span> Miscellaneous',
|
||||
link: '/misc'
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
text: 'Tools',
|
||||
collapsed: false,
|
||||
items: [
|
||||
{
|
||||
text: '<span class="i-twemoji:laptop"></span> System Tools',
|
||||
link: '/system-tools'
|
||||
},
|
||||
{
|
||||
text: '<span class="i-twemoji:card-file-box"></span> File Tools',
|
||||
link: '/file-tools'
|
||||
},
|
||||
{
|
||||
text: '<span class="i-twemoji:paperclip"></span> Internet Tools',
|
||||
link: '/internet-tools'
|
||||
},
|
||||
{
|
||||
text: '<span class="i-twemoji:left-speech-bubble"></span> Social Media Tools',
|
||||
link: '/social-media-tools'
|
||||
},
|
||||
{
|
||||
text: '<span class="i-twemoji:memo"></span> Text Tools',
|
||||
link: '/text-tools'
|
||||
},
|
||||
{
|
||||
text: '<span class="i-twemoji:alien-monster"></span> Gaming Tools',
|
||||
link: '/gaming-tools'
|
||||
},
|
||||
{
|
||||
text: '<span class="i-twemoji:camera"></span> Image Tools',
|
||||
link: '/image-tools'
|
||||
},
|
||||
{
|
||||
text: '<span class="i-twemoji:videocassette"></span> Video Tools',
|
||||
link: '/video-tools'
|
||||
},
|
||||
{
|
||||
text: '<span class="i-twemoji:speaker-high-volume"></span> Audio Tools',
|
||||
link: '/audio#audio-tools'
|
||||
},
|
||||
{
|
||||
text: '<span class="i-twemoji:red-apple"></span> Educational Tools',
|
||||
link: '/educational#educational-tools'
|
||||
},
|
||||
{
|
||||
text: '<span class="i-twemoji:man-technologist"></span> Developer Tools',
|
||||
link: '/developer-tools'
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
text: 'More',
|
||||
collapsed: true,
|
||||
items: [
|
||||
meta.build.nsfw
|
||||
? {
|
||||
text: '<span class="i-twemoji:no-one-under-eighteen"></span> NSFW',
|
||||
link: 'https://rentry.org/NSFW-Checkpoint'
|
||||
}
|
||||
: {},
|
||||
{
|
||||
text: '<span class="i-twemoji:warning"></span> Unsafe Sites',
|
||||
link: '/unsafe'
|
||||
},
|
||||
{
|
||||
text: '<span class="i-twemoji:package"></span> Storage',
|
||||
link: '/storage'
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
|
|
@ -1,8 +1,10 @@
|
|||
<script setup lang="ts">
|
||||
import { useData } from 'vitepress'
|
||||
import { ref, onMounted, onUnmounted, provide, nextTick } from 'vue'
|
||||
import DefaultTheme from 'vitepress/theme'
|
||||
import Announcement from './components/Announcement.vue'
|
||||
import Sidebar from './components/SidebarCard.vue'
|
||||
import Base64Dialog from './components/Base64Dialog.vue'
|
||||
import { useTheme } from './themes/themeHandler'
|
||||
|
||||
const { isDark } = useData()
|
||||
|
|
@ -28,7 +30,6 @@ provide('toggle-appearance', async ({ clientX: x, clientY: y }: MouseEvent) => {
|
|||
)}px at ${x}px ${y}px)`
|
||||
]
|
||||
|
||||
// @ts-expect-error
|
||||
await document.startViewTransition(async () => {
|
||||
isDark.value = !isDark.value
|
||||
// Sync with theme handler
|
||||
|
|
@ -47,6 +48,40 @@ provide('toggle-appearance', async ({ clientX: x, clientY: y }: MouseEvent) => {
|
|||
})
|
||||
|
||||
const { Layout } = DefaultTheme
|
||||
const showBase64Dialog = ref(false)
|
||||
const formattedUrl = ref('')
|
||||
|
||||
const handleClick = (e: MouseEvent) => {
|
||||
// Check if the clicked element is a link or within a link
|
||||
const target = e.target as HTMLElement
|
||||
const link = target.closest ? target.closest('a') : null
|
||||
|
||||
if (link) {
|
||||
const href = (link as HTMLAnchorElement).href
|
||||
|
||||
if (typeof href === 'string') {
|
||||
if (href.includes('https://rentry.co/FMHYB64') || href.startsWith('https://rentry.co/FMHYB64')) {
|
||||
const dontShow = localStorage.getItem('fmhy-base64-dialog-preference')
|
||||
if (dontShow === 'true') {
|
||||
return // Let the link click proceed normally
|
||||
}
|
||||
|
||||
e.preventDefault()
|
||||
e.stopPropagation()
|
||||
formattedUrl.value = href
|
||||
showBase64Dialog.value = true
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
onMounted(() => {
|
||||
window.addEventListener('click', handleClick, { capture: true })
|
||||
})
|
||||
|
||||
onUnmounted(() => {
|
||||
window.removeEventListener('click', handleClick, { capture: true })
|
||||
})
|
||||
</script>
|
||||
|
||||
<template>
|
||||
|
|
@ -65,6 +100,7 @@ const { Layout } = DefaultTheme
|
|||
</template>
|
||||
<Content />
|
||||
</Layout>
|
||||
<Base64Dialog :show="showBase64Dialog" :url="formattedUrl" @close="showBase64Dialog = false" />
|
||||
</template>
|
||||
|
||||
<style>
|
||||
|
|
|
|||
83
docs/.vitepress/theme/components/Base64Dialog.vue
Normal file
83
docs/.vitepress/theme/components/Base64Dialog.vue
Normal file
|
|
@ -0,0 +1,83 @@
|
|||
<script setup lang="ts">
|
||||
import { ref } from 'vue'
|
||||
|
||||
const props = defineProps<{
|
||||
show: boolean
|
||||
url: string
|
||||
}>()
|
||||
|
||||
const emit = defineEmits(['close'])
|
||||
const dontShowAgain = ref(false)
|
||||
|
||||
const close = () => {
|
||||
emit('close')
|
||||
}
|
||||
|
||||
const openLink = () => {
|
||||
if (dontShowAgain.value) {
|
||||
localStorage.setItem('fmhy-base64-dialog-preference', 'true')
|
||||
}
|
||||
window.open(props.url, '_blank')
|
||||
close()
|
||||
}
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<Teleport to="body">
|
||||
<div v-show="show" class="fixed inset-0 z-[99999] flex items-center justify-center p-4 bg-black/50 backdrop-blur-sm" @click="close">
|
||||
<div
|
||||
class="p-6 rounded-xl shadow-2xl max-w-md w-full"
|
||||
style="background-color: var(--vp-c-bg); border: 1px solid var(--vp-c-divider);"
|
||||
@click.stop
|
||||
>
|
||||
<h2 class="text-xl font-bold mb-4 flex items-center gap-2">
|
||||
<div class="i-carbon:information-filled text-primary" />
|
||||
Base64 Encoded Link
|
||||
</h2>
|
||||
<p class="mb-4 text-text-1">
|
||||
The link you clicked leads to a Base64 encoded string.
|
||||
</p>
|
||||
<p class="mb-2 text-text-1">
|
||||
To decode it, you can use:
|
||||
</p>
|
||||
<ul class="list-disc list-inside mb-4 space-y-2 text-text-1">
|
||||
<li>
|
||||
An online tool: <a href="https://www.base64decode.org/" target="_blank" rel="noreferrer" class="text-primary hover:underline font-medium">Base64 Decode</a>
|
||||
</li>
|
||||
<li>
|
||||
A userscript: <a href="https://greasyfork.org/en/scripts/485772-fmhy-base64-auto-decoder" target="_blank" rel="noreferrer" class="text-primary hover:underline font-medium">FMHY Base64 Auto Decoder</a> (using a <a href="/internet-tools#userscripts" target="_blank" class="text-primary hover:underline font-medium">userscript manager</a>)
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<p class="mb-6 text-sm text-text-2">
|
||||
For more options: <a href="/text-tools#encode-decode" target="_blank" class="text-primary hover:underline font-medium">Base64 Decoders</a>
|
||||
</p>
|
||||
|
||||
<div class="flex items-center gap-2 mb-4">
|
||||
<input
|
||||
type="checkbox"
|
||||
id="dont-show"
|
||||
v-model="dontShowAgain"
|
||||
class="rounded border-border bg-bg-input text-brand focus:ring-brand"
|
||||
>
|
||||
<label for="dont-show" class="text-sm text-text-1 select-none">Don't show again</label>
|
||||
</div>
|
||||
|
||||
<div class="flex justify-end gap-3">
|
||||
<button
|
||||
@click="close"
|
||||
class="px-4 py-2 border border-border rounded-lg hover:bg-bg-input transition-colors font-medium text-text-2"
|
||||
>
|
||||
Cancel
|
||||
</button>
|
||||
<button
|
||||
@click="openLink"
|
||||
class="px-4 py-2 border-2 border-brand text-brand bg-[var(--vp-c-bg-alt)] hover:bg-brand hover:text-white rounded-lg transition-colors font-medium"
|
||||
>
|
||||
Open Link
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</Teleport>
|
||||
</template>
|
||||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue