Compare commits

...

161 Commits

Author SHA1 Message Date
taskylizard
33d97e68b4
homepage announcement 2023-11-12 22:09:58 +05:30
taskylizard
f374b0729e
fastforward
Signed-off-by: taskylizard <75871323+taskylizard@users.noreply.github.com>
2023-11-12 21:58:50 +05:30
taskylizard
7eee9d5f60
hostnamr based on deployer 2023-11-12 21:58:27 +05:30
taskylizard
c9c24e91ba
fastforward
Signed-off-by: taskylizard <75871323+taskylizard@users.noreply.github.com>
2023-11-12 21:31:35 +05:30
taskylizard
f19b1f941d
exclude Beginners Guide 2023-11-12 21:31:24 +05:30
taskylizard
881c44627a
fastforward
Signed-off-by: taskylizard <75871323+taskylizard@users.noreply.github.com>
2023-11-12 20:32:49 +05:30
taskylizard
34ae378350
remove icon 2023-11-12 20:10:14 +05:30
taskylizard
69e6a937e9
set hostname to netlify for now 2023-11-12 20:02:25 +05:30
taskylizard
c4740cdcdf
PWA 2023-11-12 19:56:30 +05:30
taskylizard
8752f45b83
fix embed colors 2023-11-12 19:53:49 +05:30
taskylizard
8fb0807696
try to build images 2023-11-12 19:45:32 +05:30
taskylizard
d564905123
fastforward
Signed-off-by: taskylizard <75871323+taskylizard@users.noreply.github.com>
2023-11-12 17:57:27 +05:30
taskylizard
97815b3498
Add Switch 2023-11-12 17:57:13 +05:30
taskylizard
0c6d3d938c
fastforward
Signed-off-by: taskylizard <75871323+taskylizard@users.noreply.github.com>
2023-11-12 17:20:02 +05:30
taskylizard
70fba53292
fastforward
Signed-off-by: taskylizard <75871323+taskylizard@users.noreply.github.com>
2023-11-12 16:41:10 +05:30
taskylizard
fb4646500c
Better Feedback API 2023-11-12 16:40:43 +05:30
taskylizard
d58d95b768
Toggle Starred 2023-11-12 13:40:47 +05:30
zinklog2
054e91e6ff
Update Beginners-Guide.md (#1106)
- reformatted begginers guide, moved the info and warning text inside the answer.
- moved still unsure line to the end
2023-11-11 23:21:09 +05:30
taskylizard
d1ced09b6a
fastforward
Signed-off-by: taskylizard <75871323+taskylizard@users.noreply.github.com>
2023-11-11 17:14:48 +05:30
taskylizard
8716bbc98a
Revert "try building toolsguide now"
This reverts commit 3016e3e5d0.
2023-11-10 13:32:41 +05:30
taskylizard
3016e3e5d0
try building toolsguide now 2023-11-10 11:54:26 +05:30
taskylizard
ab1d2d3692
fastforward 2023-11-10 11:34:35 +05:30
taskylizard
1e17d03254
fix things 2023-11-10 11:33:39 +05:30
taskylizard
b31db5fd5e
try 2 2023-11-06 23:10:08 +05:30
taskylizard
5818ce655a
fix? 2023-11-06 22:05:51 +05:30
taskylizard
9f98f76e57
try to fix div soup 2023-11-06 21:53:07 +05:30
taskylizard
580deea601
fix 2023-11-06 21:46:23 +05:30
taskylizard
cc91903e2b
remove svg if that fixes it? 2023-11-06 21:33:53 +05:30
taskylizard
4bc7f038e1
Opengraph images 2023-11-06 21:22:33 +05:30
taskylizard
7213a1f4af
fix cors 2023-11-06 11:15:08 +05:30
taskylizard
3a71e8f164
Show Copied text on copy 2023-11-06 00:50:18 +05:30
taskylizard
8b2ae07c58
fix 2023-11-06 00:14:46 +05:30
taskylizard
57decd3520
better bass64 tip 2023-11-06 00:07:15 +05:30
taskylizard
8343e87c06
disable even though builds properly locally 2023-11-05 23:58:45 +05:30
taskylizard
76798ba24c
Revert "format?"
This reverts commit 2695dec33f.
2023-11-05 23:53:19 +05:30
taskylizard
2695dec33f
format? 2023-11-05 23:51:44 +05:30
taskylizard
b8602826dd
no fill on reddit svg 2023-11-05 23:23:19 +05:30
taskylizard
84610941a2
Revert "format files with prettier and try"
This reverts commit abf4da62d1dfb6fd198c9008a39ac8c1cf4956b5.
2023-11-05 23:23:19 +05:30
taskylizard
634a3ffc02
format files with prettier and try 2023-11-05 22:24:05 +05:30
taskylizard
e6aa2f2f27
format 2023-11-05 22:23:56 +05:30
taskylizard
4ab375107c
ads whitespace? 2023-11-05 22:17:42 +05:30
taskylizard
95c64ecc3b
test 2023-11-05 21:48:32 +05:30
taskylizard
25d7d0b5c8
test 2023-11-05 21:46:13 +05:30
taskylizard
1641d2a984
fastforward
Signed-off-by: taskylizard <75871323+taskylizard@users.noreply.github.com>
2023-11-05 21:42:17 +05:30
taskylizard
3d9e6015c7
fix? 2023-11-05 21:26:15 +05:30
taskylizard
10513e082d
fastforward
Signed-off-by: taskylizard <75871323+taskylizard@users.noreply.github.com>
2023-11-05 21:16:30 +05:30
taskylizard
b80e26444d
base64 decode, announcement pill 2023-11-05 21:16:17 +05:30
taskylizard
34c1f13d8b
less ugly appearance switch 2023-11-05 14:33:11 +05:30
taskylizard
23878e3f3e
ill just look tommorow 2023-11-04 23:53:34 +05:30
taskylizard
46ab0a1e98
c 2023-11-04 23:48:07 +05:30
taskylizard
bf41c9ab86
fastforward
Signed-off-by: taskylizard <75871323+taskylizard@users.noreply.github.com>
2023-11-04 23:46:04 +05:30
taskylizard
1ab65bb898
try again 2023-11-04 23:41:37 +05:30
taskylizard
f3351cabc4
cors trial 999 2023-11-04 23:32:30 +05:30
taskylizard
19aeb01801
try something 2023-11-04 23:22:17 +05:30
taskylizard
704f0bd729
add options api 2023-11-04 23:12:31 +05:30
taskylizard
693c363f73
cors trial 5 2023-11-04 23:05:37 +05:30
taskylizard
788dc1093a
format 2023-11-04 23:00:26 +05:30
taskylizard
2056c5978b
format 2023-11-04 22:56:06 +05:30
taskylizard
0cebed8923
fuck cors 2023-11-04 22:51:12 +05:30
taskylizard
d6cbec38e1
postinstall 2023-11-04 22:47:04 +05:30
taskylizard
934f6b1c32
exit 0 in prebuild script 2023-11-04 22:43:46 +05:30
taskylizard
f82ffaa68e
remove console.log 2023-11-04 22:31:29 +05:30
taskylizard
e47bfc85cc
fix 2023-11-04 22:29:51 +05:30
taskylizard
e6aecf98a1
fix 2023-11-04 22:17:04 +05:30
taskylizard
b21fae6c30
fix 2023-11-04 22:05:48 +05:30
taskylizard
d1c3a3ba15
specify webhook url 2023-11-04 22:00:25 +05:30
taskylizard
124cc5d69e
fastforward
Signed-off-by: taskylizard <75871323+taskylizard@users.noreply.github.com>
2023-11-04 21:55:05 +05:30
taskylizard
bc1204a832
thinner scrollbar 2023-11-04 21:54:50 +05:30
taskylizard
1a031039e1
specify account id 2023-11-04 21:43:02 +05:30
taskylizard
b1ecba2545
fastforward
Signed-off-by: taskylizard <75871323+taskylizard@users.noreply.github.com>
2023-11-04 21:41:20 +05:30
taskylizard
c46be327f5
I hate this already 2023-11-04 20:34:07 +05:30
taskylizard
ca9a5ed82e
specify packageManager 2023-11-04 20:30:19 +05:30
taskylizard
1dd15c32ed
I hate yaml 2023-11-04 20:28:58 +05:30
taskylizard
76224933d0
format 2023-11-04 20:27:52 +05:30
taskylizard
566edc1c36
fastforward
Signed-off-by: taskylizard <75871323+taskylizard@users.noreply.github.com>
2023-11-04 20:24:49 +05:30
taskylizard
b9bebb6c84
Add feedback API 2023-11-04 20:24:25 +05:30
taskylizard
bf504e0b26
add commit sha to footer 2023-11-04 12:26:40 +05:30
taskylizard
0c604f89ee
set metaChunk to true 2023-11-04 11:39:03 +05:30
taskylizard
3bcc0dde65
making this fair 2023-11-04 01:59:38 +05:30
taskylizard
5a7f9b1651
Fix meta tags 2023-11-04 01:42:27 +05:30
taskylizard
a9724b16d6
partially make questions groups in bg 2023-11-04 01:29:16 +05:30
taskylizard
d6d35ccf11
s 2023-11-04 01:26:16 +05:30
taskylizard
316ac24d5a
fix android-iosguide state 2023-11-03 22:30:51 +05:30
taskylizard
7c5b2ecbe8
make custom-group links more legible 2023-11-03 22:07:31 +05:30
taskylizard
b27fdf207e
inline svgs for now, fix replace hopefully 2023-11-03 21:04:12 +05:30
taskylizard
8a8b36d21e
nicer sidebar card 2023-11-03 16:28:40 +05:30
taskylizard
fee503e3e3
test 2023-11-03 15:52:52 +05:30
taskylizard
234e42e5b6
fastforward
Signed-off-by: taskylizard <75871323+taskylizard@users.noreply.github.com>
2023-11-03 15:50:05 +05:30
taskylizard
df59e78aa1
trial 2023-11-03 15:46:28 +05:30
taskylizard
345f3243ca
fastforward
Signed-off-by: taskylizard <75871323+taskylizard@users.noreply.github.com>
2023-11-03 15:12:21 +05:30
taskylizard
65ab74b2d2
why did I commit this 2023-11-03 15:12:09 +05:30
taskylizard
36423c2be1
shorter fields 2023-11-03 14:36:15 +05:30
taskylizard
d06f53879c
Fix emoji legend 2023-11-03 14:25:15 +05:30
taskylizard
4c9c65d56d
work around cors I think? 2023-11-03 13:10:31 +05:30
taskylizard
f5e6858fd3
fix pwa 2023-11-03 12:52:29 +05:30
taskylizard
6f10ec6e4f
fixes 2023-11-03 12:39:21 +05:30
taskylizard
fa47ec2e45
disable PWA 2023-11-03 12:29:16 +05:30
taskylizard
1da62476e4
formatting 2023-11-03 12:08:42 +05:30
taskylizard
eb40a4f049
fix(Feedback): do not stringify body
h
2023-11-03 11:59:26 +05:30
taskylizard
9429be0fab
Revert "maybe try to use tk"
This reverts commit de153d5fc4.
2023-11-03 11:28:24 +05:30
taskylizard
652fac8d92
remove glossary 2023-11-03 11:25:38 +05:30
taskylizard
de153d5fc4
maybe try to use tk 2023-11-03 11:25:19 +05:30
taskylizard
f88d54baa4
try to fix 2023-11-03 10:59:53 +05:30
taskylizard
c81932d383
fix feedback 2023-11-03 10:35:44 +05:30
taskylizard
55a15678c6
fastforward
Signed-off-by: taskylizard <75871323+taskylizard@users.noreply.github.com>
2023-11-03 10:03:20 +05:30
taskylizard
e55b7efaf2
fixes 2023-11-03 10:03:08 +05:30
taskylizard
c14f6be397
formatting 2023-11-02 00:50:26 +05:30
taskylizard
ad89f51fb2
WIP feedback modal 2023-11-02 00:35:41 +05:30
taskylizard
11844cde39
fastforward
Signed-off-by: taskylizard <75871323+taskylizard@users.noreply.github.com>
2023-11-02 00:26:23 +05:30
taskylizard
8a9bd257d1
somewhat fix sidebar card 2023-11-02 00:26:02 +05:30
taskylizard
d21122f18c
fastforward
Signed-off-by: taskylizard <75871323+taskylizard@users.noreply.github.com>
2023-11-01 13:02:43 +05:30
taskylizard
6782bfe66d
Merge branch 'main' into vitepress 2023-11-01 02:11:01 +05:30
taskylizard
a1ff4fd79f
Emoji Legend 2023-11-01 02:10:38 +05:30
taskylizard
7757817636
icons 2023-10-31 23:28:37 +05:30
taskylizard
d2b4769472
fastforward 2023-10-31 21:51:15 +05:30
taskylizard
ace1916bdf
search detailedView by default 2023-10-31 21:45:40 +05:30
taskylizard
2b65bc9332
somewhat fix meta
h
2023-10-31 20:51:07 +05:30
taskylizard
d3d5858b13
Merge branch 'main' into vitepress 2023-10-31 16:45:26 +05:30
taskylizard
a01715c77f
Merge branch 'main' into vitepress 2023-10-31 15:29:45 +05:30
taskylizard
6359e25272
lowercaseify sidebar links 2023-10-31 15:29:33 +05:30
taskylizard
13cc8bac18
Merge branch 'main' into vitepress 2023-10-31 15:02:01 +05:30
taskylizard
7fb1329c71
Merge branch 'main' into vitepress 2023-10-31 02:12:04 +05:30
taskylizard
925b6ad816
Action link to adblockvpnguide 2023-10-31 02:11:51 +05:30
taskylizard
b2cd44f7b1
cnange action text 2023-10-31 01:08:21 +05:30
taskylizard
64af6e3d25
meta 2023-10-31 01:03:37 +05:30
taskylizard
4b7b027536
Merge branch 'main' into vitepress 2023-10-31 00:40:56 +05:30
taskylizard
8a36a00798
fix
thanks @Zinklog2 !!!
2023-10-31 00:34:39 +05:30
taskylizard
d9cb8f7fee
add dep 2023-10-31 00:12:46 +05:30
taskylizard
ca6a6df87a
fix 2023-10-31 00:09:44 +05:30
taskylizard
7d186e1a45
fix config 2023-10-31 00:08:03 +05:30
taskylizard
329f07d30c
Merge branch 'main' into vitepress 2023-10-31 00:04:13 +05:30
taskylizard
3f1373eb7a
PWA 2023-10-31 00:02:25 +05:30
taskylizard
fe7f5bb663
Merge branch 'main' into vitepress 2023-10-29 15:52:18 +05:30
taskylizard
2da650dccb
fix replacements 2023-10-29 14:47:26 +05:30
taskylizard
f8fa8bb698
lowercasify files 2023-10-29 14:41:28 +05:30
taskylizard
f122b6d94c
Merge branch 'main' into vitepress 2023-10-29 13:57:46 +05:30
taskylizard
5d2ab8403a
prepare for release 2023-10-29 13:57:04 +05:30
taskylizard
e58f0f5cd7
Merge branch 'main' into vitepress 2023-10-29 13:32:11 +05:30
taskylizard
5e82944199
lets just save it 2023-10-28 17:52:08 +05:30
taskylizard
d045dc6462
get this to build 2023-10-28 17:39:09 +05:30
taskylizard
b51440fb49
add wip loader 2023-10-28 17:34:09 +05:30
taskylizard
36a157b647
add BG item in navbar 2023-10-28 14:20:59 +05:30
taskylizard
ed7ff7d307
Merge branch 'main' into vitepress 2023-10-28 14:19:24 +05:30
taskylizard
7eed3a7bcb
ignore until I fix 2023-10-28 13:36:54 +05:30
taskylizard
fd18f2fc24
sidebar icons, homepage features, cache 2023-10-28 13:32:49 +05:30
taskylizard
c2824bb620
Merge branch 'main' into vitepress 2023-10-28 12:51:26 +05:30
taskylizard
97b364a642
Merge branch 'main' into vitepress 2023-10-28 01:20:21 +05:30
taskylizard
8360e9efdc
sidebar, sryling 2023-10-28 01:20:04 +05:30
taskylizard
f9ec5d9946
description, icon 2023-10-27 16:50:22 +05:30
taskylizard
9fe203e1a8
Merge branch 'main' into vitepress 2023-10-27 15:42:03 +05:30
taskylizard
6ffafc06ae
add glossary 2023-10-27 15:41:48 +05:30
taskylizard
4be1a0faa2
outline, logo 2023-10-27 14:20:46 +05:30
taskylizard
ee9de5d22f
fix text 2023-10-27 14:04:55 +05:30
taskylizard
545aeaa006
attempting to build 2023-10-27 13:53:24 +05:30
taskylizard
9b91dfe270
Update homepage 2023-10-27 02:42:02 +05:30
taskylizard
5d93724b0a
Merge branch 'main' into vitepress 2023-10-27 02:34:56 +05:30
taskylizard
da0ac147eb
home image 2023-10-27 02:34:41 +05:30
taskylizard
a46e8c31d7
Icons, public dir 2023-10-27 01:45:13 +05:30
taskylizard
b0c3b1c852
fast-forward changes 2023-10-27 01:30:42 +05:30
taskylizard
c20d13074e
socials 2023-10-27 01:28:30 +05:30
taskylizard
cd7ee89bf9
Initialize vitepress 2023-10-27 00:42:13 +05:30
68 changed files with 8433 additions and 353 deletions

View File

@ -1,32 +1,32 @@
import os
headersData = {
"AdblockVPNGuide.md": [":name_badge:", "140", "# Adblocking / Privacy", "Adblocking, Privacy, VPN's, Proxies, Antivirus"],
"AI.md": [":robot_face:", "130", "# Artificial Intelligence", "Chat Bots, Text Generators, Image Generators, ChatGPT Tools"],
"Android-iOSGuide.md": [":iphone:", "45", "# Android / iOS", "Apps, Jailbreaking, Android Emulators"],
"AudioPiracyGuide.md": [":musical_note:", "110", "# Music / Podcasts / Radio", "Stream Audio, Download Audio, Torrent Audio"],
"Beginners-Guide.md": [":pirate_flag:", "150", "# Beginners Guide to Piracy", ""],
"DEVTools.md": [":male-technologist:", "50", "# Developer Tools", ""],
"DownloadPiracyGuide.md": [":floppy_disk:", "80", "# Downloading", "Download Sites, Software Sites, Open Directories"],
"EDUPiracyGuide.md": [":brain:", "60", "# Educational", "Courses, Documentaries, Learning Resources"],
"GamingPiracyGuide.md": [":video_game:", "100", "# Gaming / Emulation", "Download Games, ROMs, Gaming Tools"],
"LinuxGuide.md": [":penguin:", "40", "# Linux / MacOS", "Apps, Software Sites, Gaming"],
"MISCGuide.md": [":open_file_folder:", "30", "# Miscellaneous", "Extensions, Indexes, News, Health, Food, Fun"],
"NSFWPiracy.md": [":underage:", "25", "# NSFW", ""],
"Non-English.md": [":earth_asia:", "35", "# Non-English", "International Piracy Sites"],
"ReadingPiracyGuide.md": [":green_book:", "90", "# Books / Comics / Manga", "Books, Comics, Magazines, Newspapers"],
"STORAGE.md": [":card_file_box:", "1", "", ""],
"TOOLSGuide.md": [":wrench:", "58", "# Tools", "General Tools, Internet Tools, System Tools"],
"TorrentPiracyGuide.md": [":cyclone:", "70", "# Torrenting", "Torrent Clients, Torrent Sites, Trackers"],
"VideoPiracyGuide.md": [":tv:", "120", "# Movies / TV / Anime", "Stream Videos, Download Videos, Torrent Videos"],
"base64.md": [":key:", "20", "", ""],
"img-tools.md": [":camera:", "55", "# Image Tools", ""],
"UnsafeSites.md": [":warning:", "21", "# Unsafe Sites", ""]
"AdblockVPNGuide.md": ["Adblocking / Privacy", "Adblocking, Privacy, VPN's, Proxies, Antivirus"],
"AI.md": ["Artificial Intelligence", "Chat Bots, Text Generators, Image Generators, ChatGPT Tools"],
"Android-iOSGuide.md": ["Android / iOS", "Apps, Jailbreaking, Android Emulators"],
"AudioPiracyGuide.md": ["Music / Podcasts / Radio", "Stream Audio, Download Audio, Torrent Audio"],
"Beginners-Guide.md": ["Beginners Guide", "A Guide for Beginners to Piracy"],
"DEVTools.md": ["Developer Tools", "Git, Hosting, App Dev, Software Dev"],
"DownloadPiracyGuide.md": ["Downloading", "Download Sites, Software Sites, Open Directories"],
"EDUPiracyGuide.md": ["Educational", "Courses, Documentaries, Learning Resources"],
"GamingPiracyGuide.md": ["Gaming / Emulation", "Download Games, ROMs, Gaming Tools"],
"LinuxGuide.md": ["Linux / MacOS", "Apps, Software Sites, Gaming"],
"MISCGuide.md": ["Miscellaneous", "Extensions, Indexes, News, Health, Food, Fun"],
"NSFWPiracy.md": ["NSFW", "NSFW Indexes, Streaming, Downloading"],
"Non-English.md": ["Non-English", "International Piracy Sites"],
"ReadingPiracyGuide.md": ["Books / Comics / Manga", "Books, Comics, Magazines, Newspapers"],
"STORAGE.md": ["Storage", "Index for everything in the wiki."],
"TOOLSGuide.md": ["Tools", "General Tools, Internet Tools, System Tools"],
"TorrentPiracyGuide.md": ["Torrenting", "Torrent Clients, Torrent Sites, Trackers"],
"VideoPiracyGuide.md": ["Movies / TV / Anime", "Stream Videos, Download Videos, Torrent Videos"],
"base64.md": ["Base64", "Base64 storage"],
"img-tools.md": ["Image Tools", "Image Editors, Generators, Compress"],
"UnsafeSites.md": ["Unsafe Sites", "Unsafe/harmful sites to avoid."]
}
def getHeaderForPage(pageFilename):
data = headersData[pageFilename]
header = '---\n' + 'icon: ' + '"' + data[0] + '"' + '\n' + 'order: ' + data[1] + '\n' + '---\n' + data[2] + '\n' + data[3] + '\n\n'
header = '---\n' + 'title: ' + '"' + data[0] + '"' + '\n' + 'description: ' + data[1] + '\n' + '---\n' + '# ' + data[0] + '\n' + data[1] + '\n\n'
return header
def apply_to_all_md_files_in_current_dir():
@ -36,7 +36,6 @@ def apply_to_all_md_files_in_current_dir():
with open(file, 'r', encoding='utf-8') as f:
content = f.read()
if not content.startswith('---'):
print("adding header to " + file)
with open(file, 'w', encoding='utf-8') as f2:
header = getHeaderForPage(file)
f2.write(header+content)

View File

@ -1,23 +0,0 @@
---
image: /static/banner4.png
icon: ":wave:"
---
# Welcome
![](/static/banner4.png)
**The Largest Collection of Free Stuff On The Internet!**
* Anyone can suggest [changes or corrections](https://rentry.org/fmhyedit) to the wiki. Please read our [Contribution Guide](https://rentry.co/Contrib-Guide) before trying to add or remove anything.
* If you're adding a new site, please [search](https://raw.githubusercontent.com/nbats/FMHYedit/main/single-page) first to make sure we don't already have it.
* Approved edits will be applied to this site and all [🔒 backups](https://www.reddit.com/r/FREEMEDIAHECKYEAH/wiki/backups).
* You can send us stuff directly via [💬 Discord](https://redd.it/17f8msf).
* You can also checkout our subreddit, [r/FREEMEDIAHECKYEAH](https://www.reddit.com/r/FREEMEDIAHECKYEAH/) to know about any major updates to the wiki.
***
Emoji Legend:
* 🌐 - 3rd Party Indexes
* ↪️ - Storage Page Links
* ⭐ - Community Recommendations

View File

@ -1,33 +0,0 @@
input: .
output: .retype
url: fmhy.pages.dev
branding:
logo: /static/fmhy.ico
logoDark: /static/fmhy.ico
title: FMHY
favicon: /static/favicon.ico
links: # Top bar. Icons from FontAwesome 6.4.2.
- text: Discord
link: https://redd.it/17f8msf
icon: <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path d="m3,0C1.35,0,0,1.35,0,3v13.5c0,1.65,1.35,3,3,3h4.5v3.75c0,.29.16.54.41.67.25.13.56.1.79-.07l5.8-4.35h6.5c1.65,0,3-1.35,3-3V3c0-1.65-1.35-3-3-3H3Z"/></svg>
- text: Search
link: https://fmhy-search.streamlit.app/
icon: <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path d="m19.5,9.75c0,2.15-.7,4.14-1.88,5.75l5.93,5.94c.59.59.59,1.54,0,2.12-.59.59-1.54.59-2.12,0l-5.93-5.94c-1.61,1.18-3.6,1.87-5.75,1.87C4.36,19.5,0,15.13,0,9.75S4.36,0,9.75,0s9.75,4.36,9.75,9.75Zm-9.75,6.75c3.73,0,6.75-3.02,6.75-6.75s-3.02-6.75-6.75-6.75-6.75,3.02-6.75,6.75,3.02,6.75,6.75,6.75Z"/></svg>
- text: Reddit
link: https://www.reddit.com/r/FREEMEDIAHECKYEAH/
icon: <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path d="m9.36,14.4c-.67,0-1.2-.54-1.2-1.19s.54-1.2,1.2-1.2,1.19.54,1.19,1.2-.54,1.19-1.19,1.19Zm14.64-2.4c0,6.63-5.37,12-12,12S0,18.63,0,12,5.37,0,12,0s12,5.37,12,12Zm-6.4-1.99c-.45,0-.86.19-1.15.48-1.08-.75-2.55-1.23-4.17-1.29l.84-3.79,2.68.6c0,.66.54,1.19,1.19,1.19s1.2-.55,1.2-1.2-.54-1.2-1.2-1.2c-.47,0-.87.28-1.07.67l-2.96-.66c-.15-.04-.3.07-.33.21l-.92,4.18c-1.61.07-3.05.55-4.14,1.3-.3-.31-.71-.49-1.17-.49-1.69,0-2.24,2.27-.7,3.04-.05.24-.08.49-.08.75,0,2.55,2.86,4.61,6.39,4.61s6.4-2.06,6.4-4.61c0-.26-.03-.52-.09-.76,1.51-.77.96-3.02-.72-3.02Zm-3.33,5.62c-.88.88-3.68.87-4.53,0-.11-.11-.3-.11-.4,0-.12.12-.12.31,0,.42,1.1,1.1,4.22,1.1,5.33,0,.12-.11.12-.3,0-.42-.11-.11-.3-.11-.4,0Zm.37-3.63c-.66,0-1.19.54-1.19,1.2s.54,1.19,1.19,1.19,1.2-.54,1.2-1.19-.53-1.2-1.2-1.2Z"/></svg>
- text: Github
link: https://github.com/fmhy
icon: <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 496 512"><path d="m8.03,19.32c0,.1-.11.18-.25.18-.16.01-.27-.06-.27-.18,0-.1.11-.18.25-.18.15-.01.27.06.27.18Zm-1.5-.22c-.03.1.06.21.21.24.13.05.27,0,.3-.1s-.06-.21-.21-.26c-.13-.03-.27.01-.3.11Zm2.14-.08c-.14.03-.24.13-.22.24.01.1.14.16.29.13.14-.03.24-.13.22-.23-.01-.09-.15-.16-.29-.14ZM11.85,0C5.13,0,0,5.23,0,12.11c0,5.5,3.38,10.21,8.2,11.87.62.11.84-.28.84-.6s-.01-2-.01-3.05c0,0-3.39.74-4.1-1.48,0,0-.55-1.44-1.35-1.82,0,0-1.11-.78.08-.76,0,0,1.2.1,1.87,1.28,1.06,1.92,2.84,1.36,3.53,1.04.11-.79.43-1.34.77-1.67-2.7-.31-5.43-.71-5.43-5.48,0-1.36.37-2.05,1.14-2.92-.13-.32-.54-1.65.13-3.37,1.01-.32,3.34,1.34,3.34,1.34.97-.28,2.01-.42,3.04-.42s2.07.14,3.04.42c0,0,2.33-1.67,3.34-1.34.66,1.72.25,3.05.13,3.37.77.88,1.25,1.56,1.25,2.92,0,4.79-2.85,5.17-5.55,5.48.45.39.82,1.14.82,2.3,0,1.67-.01,3.74-.01,4.15,0,.32.22.71.84.6,4.84-1.65,8.12-6.36,8.12-11.86C24,5.23,18.56,0,11.85,0Zm-7.14,17.12c-.06.05-.05.16.03.26.08.08.19.11.25.05.06-.05.05-.16-.03-.26-.08-.08-.19-.11-.25-.05Zm-.52-.4c-.03.06.01.14.11.19.08.05.17.03.21-.03.03-.06-.01-.14-.11-.19-.1-.03-.17-.01-.21.03Zm1.57,1.77c-.08.06-.05.21.06.31.11.11.25.13.31.05.06-.06.03-.21-.06-.31-.11-.11-.25-.13-.31-.05Zm-.55-.73c-.08.05-.08.18,0,.29s.21.16.27.11c.08-.06.08-.19,0-.31-.07-.11-.19-.16-.27-.1Z"/></svg>
- text: Updates
link: https://www.reddit.com/r/FREEMEDIAHECKYEAH/wiki/updates/
icon: log
- text: Backups
link: https://www.reddit.com/r/FREEMEDIAHECKYEAH/wiki/backups
icon: shield-lock
footer:
copyright: ""
meta:
title: " | FreeMediaHeckYeah"

View File

@ -1,193 +0,0 @@
import re
import os
import sys
def replaces_for_beginners_guide(text):
text = re.sub('\[TOC\]\n', '', text, flags=re.MULTILINE)
text = re.sub('\*\*Table of Contents\*\*\n\[TOC2\]\n', '', text, flags=re.MULTILINE)
text = re.sub('# -> \*\*\*Beginners Guide to Piracy\*\*\* <-\n', '', text, flags=re.MULTILINE)
text = re.sub(r"!!!note\s(.+?)\n", r"!!!\n\1\n!!!\n", text, flags=re.MULTILINE)
text = re.sub(r"!!!info\s(.+?)\n", r"!!!\n\1\n!!!\n", text, flags=re.MULTILINE)
text = re.sub(r"!!!warning\s(.+?)\n", r"!!!warning\n\1\n!!!\n", text, flags=re.MULTILINE)
text = re.sub(r">\s(.+?)\n", r"> \1\n\n", text, flags=re.MULTILINE)
text = re.sub('\*\*\[\^ Back to Top\]\(#beginners-guide-to-piracy\)\*\*', '', text, flags=re.MULTILINE)
text = re.sub("!!!\n!!!\n", "!!!\n", text, flags=re.MULTILINE)
text = re.sub("\n\*\*\[", "\n* **[", text, flags=re.MULTILINE)
return text
def do_some_individual_replaces(text):
#special cases of link not replaced correctly
text = re.sub('.pages.dev/storage/#encode--decode_urls', '.pages.dev/storage/#encode--decode-urls', text)
text = re.sub('.pages.dev/base64/#do-k-ument', '.pages.dev/base64/#do_k_ument', text)
text = re.sub('.pages.dev/devtools/#machine-learning2', '.pages.dev/devtools/#machine-learning-1', text)
#Base64-decoder script link
text = re.sub('\*\* site or extension\.\n', '** site or extension\.\nAlternatively, install this [userscript](https://rentry.co/wc7s2/raw)\n', text, flags=re.MULTILINE)
return text
def change_some_general_formatting(text):
text = re.sub('\*\*\*\n\n', '', text, flags=re.MULTILINE)
text = re.sub('\*\*\*\n', '', text, flags=re.MULTILINE)
text = re.sub('# ►', '##', text)
text = re.sub('## ▷', '###', text)
text = re.sub('####', '###', text)
text = re.sub(r'^\*\*Note\*\* - (.+)$', r'!!!\n\1\n!!!', text, flags=re.MULTILINE)
text = re.sub(r'^\* \*\*Note\*\* - (.+)$', r'!!!\n\1\n!!!', text, flags=re.MULTILINE)
text = re.sub(r'^Note - (.+)$', r'!!!\n\1\n!!!', text, flags=re.MULTILINE)
text = re.sub(r'^\*\*Warning\*\* - (.+)$', r'!!!warning\n\1\n!!!', text, flags=re.MULTILINE)
return text
def remove_backtowiki_and_toc(text):
text = re.sub('\*\*\[◄◄ Back to Wiki Index\]\(https://www\.reddit\.com/r/FREEMEDIAHECKYEAH/wiki/index\)\*\*\n', '', text, flags=re.MULTILINE)
text = re.sub(r'\*\*\[Table of Contents\]\(https?:\/\/.*?ibb\.co.*\)\*\* - For mobile users\n', '', text, flags=re.MULTILINE)
text = re.sub("\*\*\*\n\*\*\*\n\*\*\*\n\*\*\*\n\n\n\*\*\*\n\*\*\*\n\n", '', text, flags=re.MULTILINE)
text = re.sub("\*\*\*\n\*\*\*\n\*\*\*\n\*\*\*\n\n\n\*\*\*\n\*\*\* \n\n", '', text, flags=re.MULTILINE)
text = re.sub("\*\*\*\n\*\*\*\n\*\*\*\n\n\n\*\*\*\n\*\*\*\n\n", '', text, flags=re.MULTILINE)
text = re.sub("\*\*\*\n\*\*\*\n\*\*\*\n\*\*\*\n\n\n\*\*\*\n\n", '', text, flags=re.MULTILINE)
text = re.sub("\*\*\*\n\*\*\*\n\n\n\*\*\*\n\n", '', text, flags=re.MULTILINE)
return text
def replace_domain_and_page(text):
text = re.sub('www.reddit.com/r/FREEMEDIAHECKYEAH/wiki/ai', 'fmhy.pages.dev/ai', text)
text = re.sub('www.reddit.com/r/FREEMEDIAHECKYEAH/wiki/adblock-vpn-privacy', 'fmhy.pages.dev/adblockvpnguide', text)
text = re.sub('www.reddit.com/r/FREEMEDIAHECKYEAH/wiki/android', 'fmhy.pages.dev/android-iosguide', text)
text = re.sub('www.reddit.com/r/FREEMEDIAHECKYEAH/wiki/video', 'fmhy.pages.dev/videopiracyguide', text)
text = re.sub('www.reddit.com/r/FREEMEDIAHECKYEAH/wiki/audio', 'fmhy.pages.dev/audiopiracyguide', text)
text = re.sub('www.reddit.com/r/FREEMEDIAHECKYEAH/wiki/games', 'fmhy.pages.dev/gamingpiracyguide', text)
text = re.sub('www.reddit.com/r/FREEMEDIAHECKYEAH/wiki/reading', 'fmhy.pages.dev/readingpiracyguide', text)
text = re.sub('www.reddit.com/r/FREEMEDIAHECKYEAH/wiki/download', 'fmhy.pages.dev/downloadpiracyguide', text)
text = re.sub('www.reddit.com/r/FREEMEDIAHECKYEAH/wiki/torrent', 'fmhy.pages.dev/torrentpiracyguide', text)
text = re.sub('www.reddit.com/r/FREEMEDIAHECKYEAH/wiki/edu', 'fmhy.pages.dev/edupiracyguide', text)
text = re.sub('www.reddit.com/r/FREEMEDIAHECKYEAH/wiki/tools-misc', 'fmhy.pages.dev/toolsguide', text)
text = re.sub('www.reddit.com/r/FREEMEDIAHECKYEAH/wiki/linux', 'fmhy.pages.dev/linuxguide', text)
text = re.sub('www.reddit.com/r/FREEMEDIAHECKYEAH/wiki/non-eng', 'fmhy.pages.dev/non-english', text)
text = re.sub('www.reddit.com/r/FREEMEDIAHECKYEAH/wiki/misc', 'fmhy.pages.dev/miscguide', text)
text = re.sub('www.reddit.com/r/FREEMEDIAHECKYEAH/wiki/storage', 'fmhy.pages.dev/storage', text)
text = re.sub('www.reddit.com/r/FREEMEDIAHECKYEAH/wiki/dev-tools', 'fmhy.pages.dev/devtools', text)
text = re.sub('www.reddit.com/r/FREEMEDIAHECKYEAH/wiki/img-tools', 'fmhy.pages.dev/img-tools', text)
text = re.sub('github.com/nbats/FMHYedit/blob/main/base64.md#', 'fmhy.pages.dev/base64/#', text)
return text
def replace_underscore_in_subsections(text):
pattern = r'(/#[\w\-]+(?:_[\w]+)*)'
matches = re.findall(pattern, text)
for match in matches:
replacement = match.replace('_', '-')
text = text.replace(match, replacement)
return text
def reformat_subsections(text):
text = re.sub('/#wiki_', '/#', text)
text = re.sub('#wiki_', '/#', text)
text = re.sub('.25BA_', '', text)
text = re.sub('.25B7_', '', text)
text = re.sub('_.2F_', '--', text)
text = replace_underscore_in_subsections(text)
return text
def replace_urls_in_links_to_FMHY_wiki(text):
text = remove_backtowiki_and_toc(text)
text = replace_domain_and_page(text)
text = reformat_subsections(text)
text = change_some_general_formatting(text)
text = do_some_individual_replaces(text)
return text
def apply_replace_to_all_md_files_in_current_dir():
files = os.listdir('.')
for file in files:
if file.endswith('.md'):
with open(file, 'r', encoding='utf-8') as f:
content = f.read()
content = replace_urls_in_links_to_FMHY_wiki(content)
if file == "Beginners-Guide.md":
content = replaces_for_beginners_guide(content)
with open(file, 'w', encoding='utf-8') as f2:
f2.write(content)
def print_info_for_confirmation():
print("This script is about to replace URLs in all .md files in the current directory: " + os.getcwd())
print("The affected files will be the following:")
files = os.listdir('.')
for file in files:
if file.endswith('.md'):
print(file)
# TESTER
testText = """
aaaaaaaa (https://www.reddit.com/r/FREEMEDIAHECKYEAH/wiki/storage#wiki_telegram_audio_download) aaaaaaa
**[ Back to Wiki Index](https://www.reddit.com/r/FREEMEDIAHECKYEAH/wiki/index)**
* **[YouTube Music Clients](https://www.reddit.com/r/FREEMEDIAHECKYEAH/wiki/storage#wiki_youtube_music_players)**
Soundtracks](https://github.com/nbats/FMHYedit/blob/main/base64.md#damons-game-soundtracks)**, [Squ
(https://www.reddit.com/r/FREEMEDIAHECKYEAH/wiki/storage#wiki_game_libraries_.2F_launcher)
(https://www.reddit.com/r/FREEMEDIAHECKYEAH/wiki/games#wiki_.25BA_tracking_.2F_discovery)
(https://www.reddit.com/r/FREEMEDIAHECKYEAH/wiki/linux#wiki_.25BA_linux_adblock_.2F_privacy)
(https://www.reddit.com/r/FREEMEDIAHECKYEAH/wiki/video#wiki_.25BA_download_sites)
[sdfasdf](https://www.reddit.com/r/FREEMEDIAHECKYEAH/wiki/android#wiki_.25B7_android_podcasts_.2F_radio)gwrgewrgew
(https://www.reddit.com/r/FREEMEDIAHECKYEAH/wiki/android#wiki_.25B7_android_relaxation)
adfads awerfaw (https://www.reddit.com/r/FREEMEDIAHECKYEAH/wiki/storage#wiki_music_libraries_.2F_players)
(https://www.reddit.com/r/FREEMEDIAHECKYEAH/wiki/edu/#wiki_.25BA_downloading) aaaaaaaaa
(https://www.reddit.com/r/FREEMEDIAHECKYEAH/wiki/adblock-vpn-privacy#wiki_.25B7_adblocking_extensions)
* [link](https://www.reddit.com/r/FREEMEDIAHECKYEAH/wiki/torrent) - ...sdvs
https://www.reddit.com/r/FREEMEDIAHECKYEAH/wiki/img-tools#wiki_.25B7_painting_.2F_drawing
* **[AI Indexes](https://www.reddit.com/r/FREEMEDIAHECKYEAH/wiki/ai#wiki_.25BA_ai_indexes)** - Artificial Intelligence Indexes
(https://www.reddit.com/r/FREEMEDIAHECKYEAH/wiki/adblock-vpn-privacy#wiki_.25BA_vpn)
https://www.reddit.com/r/FREEMEDIAHECKYEAH/wiki/storage/#wiki_open_directory_search_string_builder
https://www.reddit.com/r/FREEMEDIAHECKYEAH/wiki/tools-misc#wiki_.25B7_file_tools
~~~~~~
***
***
**[ Back to Wiki Index](https://www.reddit.com/r/FREEMEDIAHECKYEAH/wiki/index)**
***
***
**[Table of Contents](https://i.imgur.com/whYmImm.png)** - For mobile users
***
***
~~~~~~
argaseg ae this is legit test between stuff to remove1
***
# ► with ##
## ▷ with ###
#### with ###
* **Note** - Some aggregators still include TPB, so it's best to avoid using them for software and games.
**Warning** - Misuse of Chat Archivers, Deleters, Mods & 3rd Party Clients is against Discords TOS, so use them at your own risk.
**[movie-web](https://movie-web.app/) / [FMovies](https://fmovies.name/) / [Soap2Day](https://soapgate.org/)** - Fast streaming
**[Zoro](https://zoro.to/) / [9Anime](https://www.9anime.to/)** - Fast anime streaming
"""
def just_test_the_replacer_function():
print("---TEST---")
print("This is how the resulting edited links would look like:")
print( replace_urls_in_links_to_FMHY_wiki(testText) )
print("---END OF TEST---\n\n\n")
just_test_the_replacer_function()
# MAIN EXECUTION
print("---MAIN SCRIPT---")
print_info_for_confirmation()
apply_replace_to_all_md_files_in_current_dir()
print("---END OF MAIN SCRIPT---")

116
.github/replace.py vendored Normal file
View File

@ -0,0 +1,116 @@
import re
import os
import sys
def replaces_for_beginners_guide(text):
text = re.sub('\[TOC\]\n', '', text, flags=re.MULTILINE)
text = re.sub('\*\*Table of Contents\*\*\n\[TOC2\]\n', '', text, flags=re.MULTILINE)
text = re.sub('# -> \*\*\*Beginners Guide to Piracy\*\*\* <-\n', '', text, flags=re.MULTILINE)
text = re.sub(r"!!!note\s(.+?)\n", r":::info\n\1\n:::\n", text, flags=re.MULTILINE)
text = re.sub(r"!!!info\s(.+?)\n", r":::info\n\1\n:::\n", text, flags=re.MULTILINE)
text = re.sub(r"!!!warning\s(.+?)\n", r":::warning\n\1\n:::\n", text, flags=re.MULTILINE)
text = re.sub(r">\s(.+?)\n", r"> \1\n\n", text, flags=re.MULTILINE)
text = re.sub('\*\*\[\^ Back to Top\]\(#beginners-guide-to-piracy\)\*\*', '', text, flags=re.MULTILINE)
text = re.sub(r"!!!\s(.+?)\n", r":::info\n\1\n:::\n", text, flags=re.MULTILINE)
text = re.sub("\n\*\*\[", "\n* **[", text, flags=re.MULTILINE)
text = re.sub(r'>(.*)\n\n(.*)', r':::details \1\n\2\n:::', text, flags=re.MULTILINE)
return text
def do_some_individual_replaces(text):
#special cases of link not replaced correctly
text = re.sub('/storage/#encode--decode_urls', '/storage/#encode--decode-urls', text)
text = re.sub('/base64/#do-k-ument', '/base64/#do_k_ument', text)
text = re.sub('/devtools/#machine-learning2', '/devtools/#machine-learning-1', text)
#Base64-decoder script link
text = re.sub('(.+?) site or extension\.\n', 'Click on the texts to copy them decoded.\n', text, flags=re.MULTILINE)
return text
def change_some_general_formatting(text):
text = re.sub('\*\*\*\n\n', '', text, flags=re.MULTILINE)
text = re.sub('\*\*\*\n', '', text, flags=re.MULTILINE)
text = re.sub('# ►', '##', text)
text = re.sub('## ▷', '###', text)
text = re.sub('####', '###', text)
text = re.sub(r'^\*\*Note\*\* - (.+)$', r':::tip\n\1\n:::', text, flags=re.MULTILINE)
text = re.sub(r'^\* \*\*Note\*\* - (.+)$', r':::tip\n\1\n:::', text, flags=re.MULTILINE)
text = re.sub(r'^Note - (.+)$', r':::tip\n\1\n:::', text, flags=re.MULTILINE)
text = re.sub(r'^\*\*Warning\*\* - (.+)$', r':::warning\n\1\n:::', text, flags=re.MULTILINE)
text = re.sub(r'^\*\s([^*])', "- \\1", text, 0, re.MULTILINE)
return text
def remove_backtowiki_and_toc(text):
text = re.sub('\*\*\[◄◄ Back to Wiki Index\]\(https://www\.reddit\.com/r/FREEMEDIAHECKYEAH/wiki/index\)\*\*\n', '', text, flags=re.MULTILINE)
text = re.sub(r'\*\*\[Table of Contents\]\(https?:\/\/.*?ibb\.co.*\)\*\* - For mobile users\n', '', text, flags=re.MULTILINE)
text = re.sub("\*\*\*\n\*\*\*\n\*\*\*\n\*\*\*\n\n\n\*\*\*\n\*\*\*\n\n", '', text, flags=re.MULTILINE)
text = re.sub("\*\*\*\n\*\*\*\n\*\*\*\n\*\*\*\n\n\n\*\*\*\n\*\*\* \n\n", '', text, flags=re.MULTILINE)
text = re.sub("\*\*\*\n\*\*\*\n\*\*\*\n\n\n\*\*\*\n\*\*\*\n\n", '', text, flags=re.MULTILINE)
text = re.sub("\*\*\*\n\*\*\*\n\*\*\*\n\*\*\*\n\n\n\*\*\*\n\n", '', text, flags=re.MULTILINE)
text = re.sub("\*\*\*\n\*\*\*\n\n\n\*\*\*\n\n", '', text, flags=re.MULTILINE)
return text
def replace_domain_and_page(text):
text = re.sub('https://www.reddit.com/r/FREEMEDIAHECKYEAH/wiki/ai', '/ai', text)
text = re.sub('https://www.reddit.com/r/FREEMEDIAHECKYEAH/wiki/adblock-vpn-privacy', '/adblockvpnguide', text)
text = re.sub('https://www.reddit.com/r/FREEMEDIAHECKYEAH/wiki/android', '/android-iosguide', text)
text = re.sub('https://www.reddit.com/r/FREEMEDIAHECKYEAH/wiki/video', '/videopiracyguide', text)
text = re.sub('https://www.reddit.com/r/FREEMEDIAHECKYEAH/wiki/audio', '/audiopiracyguide', text)
text = re.sub('https://www.reddit.com/r/FREEMEDIAHECKYEAH/wiki/games', '/gamingpiracyguide', text)
text = re.sub('https://www.reddit.com/r/FREEMEDIAHECKYEAH/wiki/reading', '/readingpiracyguide', text)
text = re.sub('https://www.reddit.com/r/FREEMEDIAHECKYEAH/wiki/download', '/downloadpiracyguide', text)
text = re.sub('https://www.reddit.com/r/FREEMEDIAHECKYEAH/wiki/torrent', '/torrentpiracyguide', text)
text = re.sub('https://www.reddit.com/r/FREEMEDIAHECKYEAH/wiki/edu', '/edupiracyguide', text)
text = re.sub('https://www.reddit.com/r/FREEMEDIAHECKYEAH/wiki/tools-misc', '/toolsguide', text)
text = re.sub('https://www.reddit.com/r/FREEMEDIAHECKYEAH/wiki/linux', '/linuxguide', text)
text = re.sub('https://www.reddit.com/r/FREEMEDIAHECKYEAH/wiki/non-eng', '/non-english', text)
text = re.sub('https://www.reddit.com/r/FREEMEDIAHECKYEAH/wiki/misc', '/miscguide', text)
text = re.sub('https://www.reddit.com/r/FREEMEDIAHECKYEAH/wiki/storage', '/storage', text)
text = re.sub('https://www.reddit.com/r/FREEMEDIAHECKYEAH/wiki/dev-tools', '/devtools', text)
text = re.sub('https://www.reddit.com/r/FREEMEDIAHECKYEAH/wiki/img-tools', '/img-tools', text)
text = re.sub('https://github.com/nbats/FMHYedit/blob/main/base64.md#', '/base64/#', text)
return text
def replace_underscore_in_subsections(text):
pattern = r'(/#[\w\-]+(?:_[\w]+)*)'
matches = re.findall(pattern, text)
for match in matches:
replacement = match.replace('_', '-')
text = text.replace(match, replacement)
return text
def reformat_subsections(text):
text = re.sub('/#wiki_', '/#', text)
text = re.sub('#wiki_', '/#', text)
text = re.sub('.25BA_', '', text)
text = re.sub('.25B7_', '', text)
text = re.sub('_.2F_', '--', text)
text = replace_underscore_in_subsections(text)
return text
def replace_urls_in_links_to_FMHY_wiki(text):
text = remove_backtowiki_and_toc(text)
text = replace_domain_and_page(text)
text = reformat_subsections(text)
text = change_some_general_formatting(text)
text = do_some_individual_replaces(text)
return text
def apply_replace_to_all_md_files_in_current_dir():
files = os.listdir('.')
for file in files:
if file.endswith('.md'):
with open(file, 'r', encoding='utf-8') as f:
content = f.read()
content = replace_urls_in_links_to_FMHY_wiki(content)
if file == "Beginners-Guide.md":
content = replaces_for_beginners_guide(content)
with open(file, 'w', encoding='utf-8') as f2:
f2.write(content)
apply_replace_to_all_md_files_in_current_dir()

7
.github/script.sh vendored Normal file
View File

@ -0,0 +1,7 @@
python .github/add-headers.py
python .github/replace.py
for file in *; do
[[ -f "$file" ]] && mv "$file" "${file,,}" 2>/dev/null
done
exit 0

43
.github/workflows/deploy-api.yml vendored Normal file
View File

@ -0,0 +1,43 @@
name: Deploy API
on:
push:
branches:
- main
- vitepress
pull_request:
branches:
- main
concurrency: ${{ github.workflow }}-${{ github.ref }}
jobs:
ci:
name: Release
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 6
- uses: pnpm/action-setup@v2.4.0
- uses: actions/setup-node@v3
with:
node-version: 18
cache: "pnpm"
- run: pnpm install --no-frozen-lockfile
- name: Build
run: pnpm api:build
env:
WEBHOOK_URL: ${{ secrets.WEBHOOK_URL }}
NITRO_PRESET: cloudflare
- name: Publish to Cloudflare
uses: cloudflare/wrangler-action@v3
with:
apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }}
vars: WEBHOOK_URL
env:
WEBHOOK_URL: ${{ secrets.WEBHOOK_URL }}

View File

@ -1,40 +0,0 @@
name: Update FMHY Retype
on:
workflow_dispatch:
schedule:
- cron: '0 */2 * * *'
jobs:
update:
name: Update FMHY Retype
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- uses: actions/checkout@v2
- name: Move Files
run: |
cp -r .github/assets/* .
shell: bash
- name: Install Python
uses: actions/setup-python@v4
with:
python-version: '3.10'
- name: Prepare Files
shell: bash
run: |
python .github/replace-links-to-fmhy-in-files-in-current-dir.py
python .github/add-headers.py
- name: Build Retype
uses: retypeapp/action-build@latest
- uses: retypeapp/action-github-pages@latest
with:
branch: retype
update-branch: true

View File

@ -3,7 +3,7 @@ name: Update Single Page
on:
workflow_dispatch:
schedule:
- cron: '0 */2 * * *'
- cron: "0 */2 * * *"
jobs:
update:
@ -19,7 +19,7 @@ jobs:
- name: Setup Python
uses: actions/setup-python@v4
with:
python-version: '3.10'
python-version: "3.10"
- name: Configure Git
run: |

9
.gitignore vendored Normal file
View File

@ -0,0 +1,9 @@
**/.vitepress/dist
**/.vitepress/cache
node_modules
*.log*
.nitro
.cache
.output
.env
dist

2
.npmrc Normal file
View File

@ -0,0 +1,2 @@
shamefully-hoist=true
strict-peer-dependencies=false

2
.prettierignore Normal file
View File

@ -0,0 +1,2 @@
**/*.md
pnpm-lock.yaml

14
.prettierrc.json Normal file
View File

@ -0,0 +1,14 @@
{
"semi": true,
"printWidth": 100,
"tabWidth": 2,
"useTabs": false,
"singleQuote": false,
"quoteProps": "as-needed",
"jsxSingleQuote": false,
"trailingComma": "all",
"bracketSpacing": true,
"bracketSameLine": true,
"arrowParens": "always",
"proseWrap": "always"
}

135
.vitepress/config.mts Normal file
View File

@ -0,0 +1,135 @@
import { defineConfig } from "vitepress";
import { withPwa } from "@vite-pwa/vitepress";
import UnoCSS from "unocss/vite";
import { presetUno, presetAttributify, presetIcons } from "unocss";
import { commitRef, meta } from "./constants";
import { pwa } from "./pwa";
import { fileURLToPath } from "url";
import { generateImages, generateMeta } from "./hooks";
import { toggleStarredPlugin } from "./markdown/toggleStarred";
import { base64DecodePlugin } from "./markdown/base64";
export default withPwa(
defineConfig({
title: "FMHY",
description: meta.description,
titleTemplate: ":title • freemediaheckyeah",
lang: "en-US",
lastUpdated: true,
cleanUrls: true,
appearance: "dark",
srcExclude: ["readme.md", "single-page", "toolsguide.md"],
ignoreDeadLinks: true,
metaChunk: true,
sitemap: {
hostname: meta.hostname,
},
head: [
["meta", { name: "theme-color", content: "#7bc5e4" }],
["meta", { name: "og:type", content: "website" }],
["meta", { name: "og:locale", content: "en" }],
["link", { rel: "icon", href: "/test.png" }],
// PWA
["link", { rel: "icon", href: "/test.png", type: "image/svg+xml" }],
["link", { rel: "alternate icon", href: "/test.png" }],
["link", { rel: "mask-icon", href: "/test.png", color: "#7bc5e4" }],
// prettier-ignore
["meta", { name: "keywords", content: meta.keywords.join(" ") }],
["link", { rel: "apple-touch-icon", href: "/test.png", sizes: "192x192" }],
],
transformHead: async (context) => generateMeta(context, meta.hostname),
buildEnd: async (context) => {
generateImages(context);
},
vite: {
plugins: [
UnoCSS({
presets: [
presetUno(),
presetAttributify(),
presetIcons({
scale: 1.2,
extraProperties: {
display: "inline-block",
"vertical-align": "middle",
},
}),
],
}),
],
build: {
// Shut the fuck up
chunkSizeWarningLimit: Infinity,
},
resolve: {
alias: [
{
find: /^.*VPSwitchAppearance\.vue$/,
replacement: fileURLToPath(
new URL("./theme/components/ThemeSwitch.vue", import.meta.url),
),
},
],
},
},
markdown: {
config(md) {
md.use(toggleStarredPlugin);
md.use(base64DecodePlugin);
},
},
themeConfig: {
search: {
options: {
detailedView: true,
},
provider: "local",
},
footer: {
message: `Made with ❤️ (rev: ${commitRef})`,
},
outline: "deep",
logo: "/fmhy.ico",
nav: [
{ text: "Beginners Guide", link: "/beginners-guide" },
{ text: "Glossary", link: "https://rentry.org/The-Piracy-Glossary" },
{ text: "Guides", link: "https://rentry.co/fmhy-guides" },
{ text: "Backups", link: "https://www.reddit.com/r/FREEMEDIAHECKYEAH/wiki/backups" },
{ text: "Updates", link: "https://www.reddit.com/r/FREEMEDIAHECKYEAH/wiki/updates/" },
],
sidebar: [
{ text: "📛 Adblocking / Privacy", link: "/adblockvpnguide" },
{ text: "🤖 Artificial Intelligence", link: "/ai" },
{ text: "📺 Movies / TV / Anime", link: "/videopiracyguide" },
{ text: "🎵 Music / Podcasts / Radio", link: "/audiopiracyguide" },
{ text: "🎮 Gaming / Emulation", link: "/gamingpiracyguide" },
{ text: "📗 Books / Comics / Manga", link: "/readingpiracyguide" },
{ text: "💾 Downloading", link: "/downloadpiracyguide" },
{ text: "🌀 Torrenting", link: "/torrentpiracyguide" },
{ text: "🧠 Educational", link: "/edupiracyguide" },
{ text: "🔧 Tools", link: "/toolsguide" },
{ text: "📷 Image Tools", link: "/img-tools" },
{ text: "👨‍💻 Developer Tools", link: "/devtools" },
{ text: "📱 Android / iOS", link: "/android-iosguide" },
{ text: "🐧 Linux / MacOS", link: "/linuxguide" },
{ text: "🌍 Non-English", link: "/non-english" },
{ text: "📂 Miscellaneous", link: "/miscguide" },
{ text: "🔞 NSFW", link: "/nsfwpiracy" },
{ text: "⚠️ Unsafe Sites", link: "/unsafesites" },
{ text: "🔑 Base64", link: "/base64" },
{ text: "📦 Storage", link: "/storage" },
],
socialLinks: [
{ icon: "github", link: "https://github.com/fmhy/FMHYEdit" },
{ icon: "discord", link: "https://discord.gg/Stz6y6NgNg" },
{
icon: {
svg: '<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24"><path d="M12 0A12 12 0 0 0 0 12a12 12 0 0 0 12 12a12 12 0 0 0 12-12A12 12 0 0 0 12 0zm5.01 4.744c.688 0 1.25.561 1.25 1.249a1.25 1.25 0 0 1-2.498.056l-2.597-.547l-.8 3.747c1.824.07 3.48.632 4.674 1.488c.308-.309.73-.491 1.207-.491c.968 0 1.754.786 1.754 1.754c0 .716-.435 1.333-1.01 1.614a3.111 3.111 0 0 1 .042.52c0 2.694-3.13 4.87-7.004 4.87c-3.874 0-7.004-2.176-7.004-4.87c0-.183.015-.366.043-.534A1.748 1.748 0 0 1 4.028 12c0-.968.786-1.754 1.754-1.754c.463 0 .898.196 1.207.49c1.207-.883 2.878-1.43 4.744-1.487l.885-4.182a.342.342 0 0 1 .14-.197a.35.35 0 0 1 .238-.042l2.906.617a1.214 1.214 0 0 1 1.108-.701zM9.25 12C8.561 12 8 12.562 8 13.25c0 .687.561 1.248 1.25 1.248c.687 0 1.248-.561 1.248-1.249c0-.688-.561-1.249-1.249-1.249zm5.5 0c-.687 0-1.248.561-1.248 1.25c0 .687.561 1.248 1.249 1.248c.688 0 1.249-.561 1.249-1.249c0-.687-.562-1.249-1.25-1.249zm-5.466 3.99a.327.327 0 0 0-.231.094a.33.33 0 0 0 0 .463c.842.842 2.484.913 2.961.913c.477 0 2.105-.056 2.961-.913a.361.361 0 0 0 .029-.463a.33.33 0 0 0-.464 0c-.547.533-1.684.73-2.512.73c-.828 0-1.979-.196-2.512-.73a.326.326 0 0 0-.232-.095z"/></svg>',
},
link: "https://reddit.com/r/FREEMEDIAHECKYEAH",
},
],
...pwa,
},
}),
);

16
.vitepress/constants.ts Normal file
View File

@ -0,0 +1,16 @@
export const meta = {
name: "FreeMediaHeckYeah",
description:
"The Largest Collection Of Free Stuff On The Internet!The Largest Collection Of Free Stuff On The Internet!",
hostname: process.env.COMMIT_REF ? "https://fmhy.netlify.app" : "https://fmhy.pages.dev",
keywords: ["stream", "movies", "gaming", "reading", "anime"],
};
// Netlify to Cloudflare otherwise dev
export const commitRef = process.env.COMMIT_REF
? `<a href="https://github.com/fmhy/FMHYEdit/commit/${process.env.COMMIT_REF
}">${process.env.COMMIT_REF.slice(0, 8)}</a>`
: process.env.CF_PAGES_COMMIT_SHA
? `<a href="https://github.com/fmhy/FMHYEdit/commit/${process.env.CF_PAGES_COMMIT_SHA
}">${process.env.CF_PAGES_COMMIT_SHA.slice(0, 8)}</a>`
: "dev";

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,22 @@
<script setup lang="ts">
defineProps<{ title: string; description?: string }>();
</script>
<template>
<div
tw="w-full h-full bg-black flex flex-col"
style="background-image: url(https://files.catbox.moe/1f84dy.png)">
<div tw="p-10 w-full min-h-0 grow flex flex-col items-center justify-between">
<div tw="w-full flex justify-between items-center text-5xl font-medium">
<div tw="flex items-center">
<div tw="text-zinc-100 ml-2 mt-1 font-semibold">freemediaheckyeah</div>
</div>
</div>
<div tw="w-full pr-56 flex flex-col items-start justify-end">
<div style="color: #f3f4f6" tw="text-6xl font-bold" v-html="title" />
<div style="color: #c0caf5" tw="mt-2 text-4xl" v-html="description" />
</div>
</div>
<div tw="shrink-0 h-2 w-full flex" style="background-color: #c4b5fd" />
</div>
</template>

View File

@ -0,0 +1,6 @@
/**
* Barrel generated using @taskylizard/tasker.
*/
export * from "./meta";
export * from "./opengraph";

84
.vitepress/hooks/meta.ts Normal file
View File

@ -0,0 +1,84 @@
import type { HeadConfig, TransformContext } from "vitepress";
export function generateMeta(context: TransformContext, hostname: string) {
const head: HeadConfig[] = [];
const { pageData } = context;
const url = `${hostname}/${pageData.relativePath.replace(/((^|\/)index)?\.md$/, "$2")}`;
head.push(["link", { rel: "canonical", href: url }]);
head.push(["meta", { property: "og:url", content: url }]);
head.push(["meta", { name: "twitter:url", content: url }]);
head.push(["meta", { name: "twitter:card", content: "summary_large_image" }]);
head.push(["meta", { property: "og:title", content: pageData.frontmatter.title }]);
head.push(["meta", { name: "twitter:title", content: pageData.frontmatter.title }]);
head.push([
"meta",
{
property: "og:description",
content: pageData.frontmatter.description,
},
]);
head.push([
"meta",
{
name: "twitter:description",
content: pageData.frontmatter.description,
},
]);
if (pageData.frontmatter.image) {
head.push([
"meta",
{
property: "og:image",
content: `${hostname}/${pageData.frontmatter.image.replace(/^\//, "")}`,
},
]);
head.push([
"meta",
{
name: "twitter:image",
content: `${hostname}/${pageData.frontmatter.image.replace(/^\//, "")}`,
},
]);
} else {
const url = pageData.filePath.replace("index.md", "").replace(".md", "");
const imageUrl = `${url}/__og_image__/og.png`.replace(/\/\//g, "/").replace(/^\//, "");
head.push(["meta", { property: "og:image", content: `${hostname}/${imageUrl}` }]);
head.push(["meta", { property: "og:image:width", content: "1200" }]);
head.push(["meta", { property: "og:image:height", content: "628" }]);
head.push(["meta", { property: "og:image:type", content: "image/png" }]);
head.push(["meta", { property: "og:image:alt", content: pageData.frontmatter.title }]);
head.push(["meta", { name: "twitter:image", content: `${hostname}/${imageUrl}` }]);
head.push(["meta", { name: "twitter:image:width", content: "1200" }]);
head.push(["meta", { name: "twitter:image:height", content: "628" }]);
head.push(["meta", { name: "twitter:image:alt", content: pageData.frontmatter.title }]);
}
if (pageData.frontmatter.tag) {
head.push(["meta", { property: "article:tag", content: pageData.frontmatter.tag }]);
}
if (pageData.frontmatter.date) {
head.push([
"meta",
{
property: "article:published_time",
content: pageData.frontmatter.date,
},
]);
}
if (pageData.lastUpdated && pageData.frontmatter.lastUpdated !== false) {
head.push([
"meta",
{
property: "article:modified_time",
content: new Date(pageData.lastUpdated).toISOString(),
},
]);
}
return head;
}

View File

@ -0,0 +1,89 @@
import { mkdir, readFile, writeFile } from "node:fs/promises";
import { dirname, resolve } from "node:path";
import { fileURLToPath } from "node:url";
import { createContentLoader } from "vitepress";
import type { ContentData, SiteConfig } from "vitepress";
import { type SatoriOptions, satoriVue } from "x-satori/vue";
import { renderAsync } from "@resvg/resvg-js";
const __dirname = dirname(fileURLToPath(import.meta.url));
const __fonts = resolve(__dirname, "../fonts");
export async function generateImages(config: SiteConfig) {
const pages = await createContentLoader("**/*.md", { excerpt: true }).load();
const template = await readFile(resolve(__dirname, "./Template.vue"), "utf-8");
const fonts: SatoriOptions["fonts"] = [
{
name: "Inter",
data: await readFile(resolve(__fonts, "Inter-Regular.otf")),
weight: 400,
style: "normal",
},
{
name: "Inter",
data: await readFile(resolve(__fonts, "Inter-Medium.otf")),
weight: 500,
style: "normal",
},
{
name: "Inter",
data: await readFile(resolve(__fonts, "Inter-SemiBold.otf")),
weight: 600,
style: "normal",
},
{
name: "Inter",
data: await readFile(resolve(__fonts, "Inter-Bold.otf")),
weight: 700,
style: "normal",
},
];
for (const page of pages) {
await generateImage({
page,
template,
outDir: config.outDir,
fonts,
});
}
}
interface GenerateImagesOptions {
page: ContentData;
template: string;
outDir: string;
fonts: SatoriOptions["fonts"];
}
async function generateImage({ page, template, outDir, fonts }: GenerateImagesOptions) {
const { frontmatter, url } = page;
const options: SatoriOptions = {
width: 1200,
height: 628,
fonts,
props: {
title:
frontmatter.layout === "home"
? frontmatter.hero.name ?? frontmatter.title
: frontmatter.title,
description:
frontmatter.layout === "home"
? frontmatter.hero.tagline ?? frontmatter.description
: frontmatter.description,
},
};
const svg = await satoriVue(options, template);
const render = await renderAsync(svg);
const outputFolder = resolve(outDir, url.substring(1), "__og_image__");
const outputFile = resolve(outputFolder, "og.png");
await mkdir(outputFolder, { recursive: true });
return await writeFile(outputFile, render.asPng());
}

View File

@ -0,0 +1,45 @@
import { readFile } from "node:fs/promises";
import { dirname, resolve } from "node:path";
import { fileURLToPath } from "node:url";
import { SatoriOptions, defineSatoriConfig } from "x-satori/vue";
const __dirname = dirname(fileURLToPath(import.meta.url));
const __fonts = resolve(__dirname, "../fonts");
const fonts: SatoriOptions["fonts"] = [
{
name: "Inter",
data: await readFile(resolve(__fonts, "Inter-Regular.otf")),
weight: 400,
style: "normal",
},
{
name: "Inter",
data: await readFile(resolve(__fonts, "Inter-Medium.otf")),
weight: 500,
style: "normal",
},
{
name: "Inter",
data: await readFile(resolve(__fonts, "Inter-SemiBold.otf")),
weight: 600,
style: "normal",
},
{
name: "Inter",
data: await readFile(resolve(__fonts, "Inter-Bold.otf")),
weight: 700,
style: "normal",
},
];
export default defineSatoriConfig({
width: 1200,
height: 628,
fonts,
props: {
title: "Title",
description:
"Lorem ipsum dolor sit amet, qui minim labore adipisicing minim sint cillum sint consectetur cupidatat.",
dir: "/j",
},
});

View File

@ -0,0 +1,46 @@
import { defineLoader } from "vitepress";
import { writeFile, readFile } from "fs/promises";
interface Data {
title?: string;
content?: string;
url?: string;
}
declare const data: Data;
export { data };
const page = "https://rentry.co/fmhy-guides/raw";
const regex = /\* \[([^\]]+)\]\(([^)]+)\)/g;
const rentryRe = /(?<=rentry\.(co|org)).*/;
const guides = new Set<Data>();
const f = async (url: string) => {
const contents = await (await fetch(url))
.text()
.catch((error: Error) => console.error(`Failed at ${url}`, error));
return contents;
};
export default defineLoader({
async load(): Promise<Data> {
const contents = await f(page);
let match: any[] | null;
while ((match = regex.exec(contents)) !== null) {
const title = match[1];
const url = match[2];
// Fetch rentry guides
if (url.match(rentryRe)) {
const content = await f(url + "/raw");
guides.add({ title, content });
} else {
// Everything else can be here
guides.add({ title, url });
}
}
const obj = Object.fromEntries(
[...guides.entries()].map((entry, index) => [index.toString(), entry]),
);
await writeFile("./guides.json", JSON.stringify(obj, null, 4), "utf-8");
return JSON.parse(await readFile("./guides.json", { encoding: "utf-8" })) as Data;
},
});

View File

@ -0,0 +1,25 @@
import { type MarkdownRenderer } from "vitepress";
// FIXME: tasky: possibly write less horror jank?
export function base64DecodePlugin(md: MarkdownRenderer) {
const decode = (str: string): string => Buffer.from(str, "base64").toString("binary");
// Save the original rule for backticks
const defaultRender =
md.renderer.rules.code_inline ||
function (tokens, idx, options, env, self) {
return self.renderToken(tokens, idx, options);
};
md.renderer.rules.code_inline = function (tokens, idx, options, env, self) {
// @ts-expect-error shut the fuck up already I HATE THIS
if (!env.frontmatter.title || (env.frontmatter.title && !env.frontmatter.title === "base64")) {
return defaultRender(tokens, idx, options, env, self);
}
const token = tokens[idx];
const content = token.content;
return `<button class='base64' onclick="(function(btn){ const codeEl = btn.querySelector('code'); navigator.clipboard.writeText('${decode(
content,
)}').then(() => { const originalText = codeEl.textContent; codeEl.textContent = 'Copied'; setTimeout(() => codeEl.textContent = originalText, 3000); }).catch(console.error); })(this)"><code>${content}</code></button>`;
};
}

View File

@ -0,0 +1,17 @@
import type { MarkdownRenderer } from "vitepress";
const excluded = ["Beginners Guide"];
export function toggleStarredPlugin(md: MarkdownRenderer) {
md.renderer.rules.list_item_open = (tokens, index, options, env, self) => {
const contentToken = tokens[index + 2];
if (
!excluded.includes(env.frontmatter.title) &&
contentToken &&
contentToken.content.startsWith("⭐")
) {
return `<li class="starred">`;
}
return self.renderToken(tokens, index, options);
};
}

View File

@ -0,0 +1,6 @@
import { corsEventHandler } from "nitro-cors";
export default corsEventHandler((_event) => {}, {
origin: "*",
methods: "*",
});

102
.vitepress/pwa.ts Normal file
View File

@ -0,0 +1,102 @@
import type { PwaOptions } from "@vite-pwa/vitepress";
import { meta } from "./constants";
import { resolve } from "pathe";
import fg from "fast-glob";
export const pwa = {
outDir: ".vitepress/dist",
registerType: "autoUpdate",
includeManifestIcons: false,
includeAssets: fg.sync("**/*.{png,webp,svg,gif,ico,txt}", {
cwd: resolve(__dirname, "../public"),
}),
manifest: {
id: "/",
name: meta.name,
short_name: meta.name,
description: meta.description,
theme_color: "#ffffff",
start_url: "/",
lang: "en-US",
dir: "ltr",
orientation: "natural",
display: "standalone",
display_override: ["window-controls-overlay"],
categories: meta.keywords,
// TODO: replace with actual icons
icons: [
{
src: "test.png",
sizes: "64x64",
type: "image/png",
},
{
src: "test.png",
sizes: "192x192",
type: "image/png",
},
{
src: "test.png",
sizes: "512x512",
type: "image/png",
purpose: "any",
},
{
src: "maskable-icon.png",
sizes: "512x512",
type: "image/png",
purpose: "maskable",
},
],
handle_links: "preferred",
launch_handler: {
client_mode: ["navigate-existing", "auto"],
},
edge_side_panel: {
preferred_width: 480,
},
},
experimental: {
includeAllowlist: true,
},
workbox: {
globPatterns: ["**/*.{css,js,html,svg,png,ico,txt,woff2,json}"],
globIgnores: ["**/404.html"],
navigateFallback: null,
runtimeCaching: [
{
urlPattern: /^https:\/\/fonts\.googleapis\.com\/.*/i,
handler: "CacheFirst",
options: {
cacheName: "google-fonts-cache",
expiration: {
maxEntries: 10,
maxAgeSeconds: 60 * 60 * 24 * 365, // <== 365 days
},
cacheableResponse: {
statuses: [0, 200],
},
},
},
{
urlPattern: /^https:\/\/fonts\.gstatic\.com\/.*/i,
handler: "CacheFirst",
options: {
cacheName: "gstatic-fonts-cache",
expiration: {
maxEntries: 10,
maxAgeSeconds: 60 * 60 * 24 * 365, // <== 365 days
},
cacheableResponse: {
statuses: [0, 200],
},
},
},
],
},
devOptions: {
enabled: true,
suppressWarnings: false,
},
} satisfies PwaOptions;

View File

@ -0,0 +1,49 @@
import { fetcher } from "itty-fetcher";
import { FeedbackSchema } from "../types/Feedback";
const feedbackOptions = [
{ label: "🐞 Bug", value: "bug" },
{
label: "♻️ Suggestion",
value: "suggestion",
},
{ label: "📂 Other", value: "other" },
{
label: "❤️ Appreciation",
value: "appreciate",
},
];
function getFeedbackOption(value: string) {
return feedbackOptions.find((option) => option.value === value);
}
export default defineEventHandler(async (event) => {
const { message, page, contact, type } = await readValidatedBody(event, FeedbackSchema.parse);
const env = useRuntimeConfig(event);
if (!["bug", "suggestion", "other", "appreciate"].includes(type!) || !message)
throw new Error("Invalid input.");
let description = `${message}\n\n`;
if (contact) description += `**Contact:** ${contact}`;
if (page) description += `**Page:** \`${page}\``;
await fetcher()
.post(env.WEBHOOK_URL, {
username: "Feedback",
avatar_url: "https://i.kym-cdn.com/entries/icons/facebook/000/043/403/cover3.jpg",
embeds: [
{
color: 3447003,
title: getFeedbackOption(type).label,
description: description,
},
],
})
.catch((error) => {
throw new Error(error);
});
return { status: "ok" };
});

View File

@ -0,0 +1,3 @@
export default eventHandler(() => {
return { nitro: "works" };
});

View File

@ -0,0 +1,19 @@
<script setup lang="ts">
import DefaultTheme from "vitepress/theme";
import Sidebar from "./components/SidebarCard.vue";
import Announcement from "./components/Announcement.vue";
const { Layout } = DefaultTheme;
</script>
<template>
<Layout>
<template #sidebar-nav-after>
<Sidebar />
</template>
<template #home-hero-prelink>
<Announcement />
</template>
<Content />
</Layout>
</template>

View File

@ -0,0 +1,15 @@
<script setup lang="ts">
import { useData } from "vitepress";
const { frontmatter } = useData();
</script>
<template>
<a
v-if="frontmatter.hero.prelink"
:href="frontmatter.hero.prelink.link"
target="_blank"
class="inline-flex items-center rounded-lg bg-[var(--vp-c-default-soft)] px-4 py-1 text-sm font-semibold mb-3">
{{ frontmatter.hero.prelink.title }}
</a>
</template>

View File

@ -0,0 +1,16 @@
<script setup lang="ts">
defineProps<{
icon: string;
}>();
</script>
<template>
<div class="flex items-center mb-[8px] g-[12px]">
<span class="flex items-center">
<div class="text-2xl" :class="icon" />
<div class="ml-2 text-sm text-[var(--vp-c-text-2)]">
<slot />
</div>
</span>
</div>
</template>

View File

@ -0,0 +1,199 @@
<script setup lang="ts">
import { reactive, ref } from "vue";
import { useRoute } from "vitepress";
import type { FeedbackType } from "../../types/Feedback";
const loading = ref<boolean>(false);
const error = ref<unknown>(null);
const success = ref<boolean>(false);
const { path } = useRoute();
const feedback = reactive<FeedbackType>({ message: "", contact: "" });
const feedbackOptions = [
{ label: "🐞 Bug", value: "bug" },
{
label: "♻️ Suggestion",
value: "suggestion",
},
{ label: "📂 Other", value: "other" },
{
label: "❤️ Appreciation",
value: "appreciate",
},
];
function getFeedbackOption(value: string) {
return feedbackOptions.find((option) => option.value === value);
}
async function handleSubmit(type?: FeedbackType["type"]) {
if (type) feedback.type = type;
loading.value = true;
const body: FeedbackType = {
message: feedback.message,
type: feedback.type,
contact: feedback.contact,
page: path,
};
try {
const response = await fetch("https://feedback.tasky.workers.dev", {
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify(body),
});
const data = await response.json();
if (data.error) {
error.value = data.error;
return;
}
if (data.status === "success") {
success.value = true;
}
} catch (err) {
error.value = err;
} finally {
loading.value = false;
}
}
</script>
<template>
<div class="wrapper">
<Transition name="fade" mode="out-in">
<div v-if="!feedback.type" class="step">
<div>
<div>
<p class="heading">Feedback</p>
</div>
</div>
<div class="button-container">
<button v-for="item in feedbackOptions" :key="item.value" class="btn"
@click="handleSubmit(item.value as FeedbackType['type'])">
<span>{{ item.label }}</span>
</button>
</div>
</div>
<div v-else-if="feedback.type && !success" class="step">
<div>
<p class="desc">The wiki is... {{ path }}</p>
<div>
<span>{{ getFeedbackOption(feedback.type)?.label }}</span>
<button style="margin-left: 0.5rem" class="btn" @click="feedback.type = undefined">
<span class="i-carbon-close-large">close</span>
</button>
</div>
</div>
<textarea v-model="feedback.message" autofocus class="input" />
<p class="desc">Contacts, so we can get back to you. (Optional)</p>
<textarea v-model="feedback.contact" class="contact-input" />
<button type="submit" class="btn btn-primary" :disabled="feedback.message.length > 10" @click="handleSubmit()">
Submit
</button>
</div>
<div v-else class="step">
<p class="heading">Thanks for your feedback!</p>
</div>
</Transition>
</div>
</template>
<style scoped>
.step>*+* {
margin-top: 1rem;
}
.btn {
border: 1px solid var(--vp-c-divider);
background-color: var(--vp-c-bg);
border-radius: 8px;
transition:
border-color 0.25s,
background-color 0.25s;
display: inline-block;
font-size: 14px;
font-weight: 500;
line-height: 1.5;
margin: 0;
padding: 0.375rem 0.75rem;
text-align: center;
vertical-align: middle;
white-space: nowrap;
}
.btn:disabled {
opacity: 0.5;
}
.btn:hover {
border-color: var(--vp-c-brand);
}
.btn-primary {
color: #fff;
background-color: var(--vp-c-brand);
border-color: var(--vp-c-brand);
}
.btn-primary:hover {
background-color: var(--vp-c-brand-darker);
border-color: var(--vp-c-brand-darker);
}
.heading {
font-size: 1.2rem;
font-weight: 700;
}
.button-container {
display: grid;
grid-gap: 0.5rem;
}
.wrapper {
margin: 2rem 0;
padding: 1.5rem;
border: 1px solid var(--vp-c-divider);
border-radius: 8px;
background: var(--vp-c-bg-alt);
}
.input {
width: 100%;
height: 100px;
border: 1px solid #ccc;
border-radius: 4px;
padding: 0.375rem 0.75rem;
}
.contact-input {
height: 50px;
border: 1px solid #ccc;
border-radius: 4px;
padding: 0.375rem 0.75rem;
}
.desc {
display: block;
line-height: 20px;
font-size: 12px;
font-weight: 500;
color: var(--vp-c-text-2);
}
.fade-enter-active,
.fade-leave-active {
transition: opacity 0.25s ease;
}
.fade-enter-from,
.fade-leave-to {
opacity: 0;
}
</style>

View File

@ -0,0 +1,47 @@
<script setup lang="ts">
defineProps<{
label: string;
id: string;
}>();
</script>
<template>
<div class="input-field">
<div class="input-label" v-if="label">
<label :for="id" class="pane-label">
{{ label }}
</label>
<div class="display-value">
<slot name="display" />
</div>
</div>
<slot />
</div>
</template>
<style scoped>
.pane-label {
line-height: 20px;
font-size: 13px;
font-weight: 600;
color: var(--vt-c-text-1);
display: block;
}
.input-field:not(:last-child) {
margin-bottom: 16px;
}
.display-value {
font-size: 13px;
color: var(--vp-c-text-2);
}
.input-label {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 8px;
gap: 12px;
}
</style>

View File

@ -0,0 +1,78 @@
<script setup lang="ts">
import { ref } from "vue";
import Feedback from "./Feedback.vue";
const showModal = ref(false);
</script>
<template>
<button class="p-[4px 8px] text-xl i-carbon:user-favorite-alt-filled" @click="showModal = true" />
<Teleport to="body">
<Transition name="modal">
<div v-show="showModal" class="modal-mask">
<div class="modal-container">
<Feedback />
<div class="model-footer">
<button class="modal-button" @click="showModal = false">Close</button>
</div>
</div>
</div>
</Transition>
</Teleport>
</template>
<style scoped>
.modal-mask {
position: fixed;
z-index: 200;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-color: rgba(0, 0, 0, 0.5);
display: flex;
align-items: center;
justify-content: center;
transition: opacity 0.3s ease;
}
.modal-container {
width: 300px;
margin: auto;
padding: 20px 30px;
background-color: var(--vp-c-bg);
border-radius: 2px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.33);
transition: all 0.3s ease;
}
.model-footer {
margin-top: 8px;
text-align: right;
}
.modal-button {
padding: 4px 8px;
border-radius: 4px;
border-color: var(--vp-button-alt-border);
color: var(--vp-button-alt-text);
background-color: var(--vp-button-alt-bg);
}
.modal-button:hover {
border-color: var(--vp-button-alt-hover-border);
color: var(--vp-button-alt-hover-text);
background-color: var(--vp-button-alt-hover-bg);
}
.modal-enter-from,
.modal-leave-to {
opacity: 0;
}
.modal-enter-from .modal-container,
.modal-leave-to .modal-container {
transform: scale(1.1);
}
</style>

View File

@ -0,0 +1,60 @@
<script setup lang="ts">
import Field from "./CardField.vue";
import Modal from "./Modal.vue";
import InputField from "./InputField.vue";
import ToggleStarred from "./ToggleStarred.vue";
</script>
<template>
<div class="card">
<div class="card-header">
<div class="card-title">Emoji Legend</div>
</div>
<Field icon="i-twemoji-star">Recommendations</Field>
<Field icon="i-twemoji-globe-with-meridians">Indexes</Field>
<Field icon="i-twemoji-repeat-button">Storage Links</Field>
<div class="card-header">
<div class="card-title">Options</div>
</div>
<InputField id="feedback" label="Feedback">
<template #display>
<Modal />
</template>
</InputField>
<InputField id="toggle-starred" label="Toggle Starred">
<template #display>
<ToggleStarred />
</template>
</InputField>
</div>
</template>
<style scoped>
.card-header {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 12px;
}
.card-title {
font-weight: 700;
color: var(--vp-c-text-1);
line-height: 32px;
font-size: 16px;
}
.card {
background: var(--vp-c-bg);
padding: 12px 24px 24px;
border-radius: 12px;
position: relative;
z-index: 0;
border: 1px solid transparent;
transition: border-color 0.4s ease-in-out;
}
.card:hover {
border-color: var(--vp-c-brand-1);
}
</style>

View File

@ -0,0 +1,52 @@
<script setup>
import { ref } from "vue";
import { Switch } from "@headlessui/vue";
const enabled = ref(false);
</script>
<template>
<Switch v-model="enabled" class="switch" :class="{ enabled }">
<span class="thumb" />
</Switch>
</template>
<style>
.switch {
display: inline-flex;
position: relative;
width: 40px;
height: 22px;
flex-shrink: 0;
border: 1px solid var(--vp-input-border-color);
background-color: var(--vp-input-switch-bg-color);
transition:
border-color 0.25s,
background-color 0.4s ease;
border-radius: 11px;
}
.switch.enabled {
background-color: var(--vp-c-brand);
}
</style>
<style scoped>
.switch:hover {
border-color: var(--vp-input-hover-border-color);
}
.thumb {
display: inline-block;
background-color: #fff;
transition: transform 0.25s;
width: 20px;
height: 20px;
border-radius: 50%;
box-shadow: var(--vp-shadow-1);
}
.switch.enabled .thumb {
transform: translateX(18px);
}
</style>

View File

@ -0,0 +1,53 @@
<script setup lang="ts">
import { inject } from "vue";
import { useData } from "vitepress";
import VPIconMoon from "vitepress/dist/client/theme-default/components/icons/VPIconMoon.vue";
import VPIconSun from "vitepress/dist/client/theme-default/components/icons/VPIconSun.vue";
const { isDark } = useData();
const toggleAppearance = inject("toggle-appearance", () => {
isDark.value = !isDark.value;
});
</script>
<template>
<button
type="button"
role="switch"
title="Toggle dark mode"
class="VPSwitchAppearance"
:aria-checked="isDark"
@click="toggleAppearance">
<ClientOnly>
<Transition name="fade" mode="out-in">
<VPIconSun v-if="!isDark" class="sun" />
<VPIconMoon v-else class="moon" />
</Transition>
</ClientOnly>
</button>
</template>
<style scoped>
.VPSwitchAppearance {
display: flex;
justify-content: center;
align-items: center;
width: 36px;
height: 36px;
color: var(--vp-c-text-2);
transition: color 0.5s;
&:hover {
color: var(--vp-c-text-1);
transition: color 0.25s;
}
& > :deep(svg) {
width: 20px;
height: 20px;
fill: currentColor;
}
}
</style>

View File

@ -0,0 +1,15 @@
<script setup lang="ts">
import Switch from "./Switch.vue";
const toggleStarred = () => document.documentElement.classList.toggle("starred-only");
</script>
<template>
<Switch @click="toggleStarred()" />
</template>
<style>
.starred-only li:not(.starred) {
display: none;
}
</style>

13
.vitepress/theme/index.ts Normal file
View File

@ -0,0 +1,13 @@
import { type Theme, inBrowser } from "vitepress";
import DefaultTheme from "vitepress/theme";
import Layout from "./Layout.vue";
import "./style.css";
import "uno.css";
if (inBrowser) import("./pwa");
export default {
extends: DefaultTheme,
Layout: Layout,
enhanceApp({ app, router, siteData }) {},
} satisfies Theme;

3
.vitepress/theme/pwa.ts Normal file
View File

@ -0,0 +1,3 @@
import { registerSW } from "virtual:pwa-register";
registerSW({ immediate: true });

145
.vitepress/theme/style.css Normal file
View File

@ -0,0 +1,145 @@
:root {
/* Colors: Brand */
--vp-c-brand-1: #7bc5e4;
--vp-c-brand-2: #c4e2f2;
--vp-c-brand-3: #4882a7;
--vp-c-brand-soft: #a4d5ec;
/* Colors: Button */
--vp-button-brand-bg: var(--vp-c-brand-1);
--vp-button-brand-border: var(--vp-c-brand-soft);
--vp-button-brand-text: var(--vp-c-white);
--vp-button-brand-hover-border: var(--vp-c-brand-soft);
--vp-button-brand-hover-text: var(--vp-c-white);
--vp-button-brand-hover-bg: var(--vp-c-brand-soft);
--vp-button-brand-active-border: var(--vp-c-brand-soft);
--vp-button-brand-active-text: var(--vp-c-white);
--vp-button-brand-active-bg: var(--vp-button-brand-bg);
--vp-button-alt-bg: #484848;
--vp-button-alt-text: #f0eeee;
--vp-button-alt-hover-bg: #484848;
--vp-button-alt-hover-text: #f0eeee;
--vp-c-bg-elv: rgba(255, 255, 255, 0.7);
--vp-c-bg-mark: rgb(232, 232, 232);
/* Colors: Custom Block */
--vp-custom-block-info-bg: rgba(171, 210, 244, 0.05);
--vp-custom-block-info-border: #60c4fa;
--vp-custom-block-info-text: rgb(39, 115, 145);
--vp-custom-block-info-text-deep: rgb(18, 121, 162);
--vp-custom-block-tip-bg: rgba(137, 202, 176, 0.05);
--vp-custom-block-tip-border: rgba(34, 197, 94, 1);
--vp-custom-block-tip-text: rgb(10, 128, 90);
--vp-custom-block-tip-text-deep: rgb(11, 133, 94);
--vp-custom-block-warning-bg: rgba(250, 204, 21, 0.05);
--vp-custom-block-warning-border: rgba(245, 158, 11, 1);
--vp-custom-block-warning-text: rgb(166, 114, 35);
--vp-custom-block-warning-text-deep: rgb(199, 109, 6);
--vp-custom-block-danger-bg: rgba(220, 38, 38, 0.05);
--vp-custom-block-danger-border: rgba(248, 113, 113, 1);
--vp-custom-block-danger-text: rgb(196, 46, 46);
--vp-custom-block-danger-text-deep: rgba(220, 38, 38, 1);
}
.dark {
/* Colors: Background */
--vp-c-bg: rgb(26, 26, 26);
--vp-c-bg-alt: rgb(23, 23, 23);
--vp-c-bg-elv: rgba(23, 23, 23, 0.8);
/* Colors: Custom Block */
--vp-custom-block-info-bg: rgba(84, 110, 155, 0.1);
--vp-custom-block-info-border: #3686b1;
--vp-custom-block-info-text: #52b0e3;
--vp-custom-block-info-text-deep: #00b7ff;
--vp-custom-block-tip-bg: rgba(51, 130, 118, 0.1);
--vp-custom-block-tip-border: rgba(4, 120, 87, 1);
--vp-custom-block-tip-text: rgb(25, 190, 129);
--vp-custom-block-tip-text-deep: rgba(52, 211, 153, 1);
--vp-custom-block-warning-bg: rgba(253, 224, 71, 0.1);
--vp-custom-block-warning-border: rgba(202, 138, 4, 1);
--vp-custom-block-warning-text: rgba(234, 179, 8, 1);
--vp-custom-block-warning-text-deep: rgba(250, 204, 21, 1);
--vp-custom-block-danger-bg: rgba(239, 68, 68, 0.1);
--vp-custom-block-danger-border: rgba(127, 29, 29, 1);
--vp-custom-block-danger-text: rgba(248, 113, 113, 1);
--vp-custom-block-danger-text-deep: rgba(248, 113, 113, 1);
}
.vp-doc a {
color: var(--vp-c-brand-1);
text-decoration: underline;
text-underline-offset: 4px;
text-decoration-style: solid;
text-decoration-color: transparent;
-webkit-text-decoration-color: transparent;
transition: text-decoration-color 0.25s;
}
.vp-doc a:hover {
color: var(--vp-c-brand-1);
text-decoration-color: var(--vp-c-brand-1);
-webkit-text-decoration-color: var(--vp-c-brand-1);
}
.vp-doc .custom-block a {
text-decoration: underline;
text-underline-offset: 4px;
text-decoration-style: solid;
}
::selection {
background-color: var(--vp-button-brand-bg);
}
.VPFooter a {
text-decoration-line: underline;
text-decoration-style: dashed;
text-underline-offset: 5px;
transition: 0.3s;
}
.VPFooter a:hover {
color: var(--vp-c-text-1);
text-decoration-line: underline;
text-decoration-style: dashed;
text-underline-offset: 5px;
}
/* Custom scrollbar */
.VPSidebar::-webkit-scrollbar {
block-size: 4px;
border-end-end-radius: 14px;
border-start-end-radius: 14px;
inline-size: 4px;
}
/**
* Component: Home
*/
:root {
--vp-home-hero-name-color: transparent;
--vp-home-hero-name-background: -webkit-linear-gradient(120deg, #c4b5fd 30%, #7bc5e4);
--vp-home-hero-image-background-image: linear-gradient(-45deg, #c4b5fd 50%, #47caff 50%);
--vp-home-hero-image-filter: blur(44px);
}
@media (min-width: 640px) {
:root {
--vp-home-hero-image-filter: blur(56px);
}
}
@media (min-width: 960px) {
:root {
--vp-home-hero-image-filter: blur(68px);
}
}
.base64 {
min-width: 100%;
width: 0px;
white-space: pre-wrap;
}

View File

@ -0,0 +1,10 @@
import z from "zod";
export const FeedbackSchema = z.object({
message: z.string().min(5).max(1000),
type: z.enum(["bug", "suggestion", "appreciate", "other"]),
contact: z.string().min(5).max(20).optional(),
page: z.string().min(3).max(10),
});
export type FeedbackType = z.infer<typeof FeedbackSchema>;

4
.vitepress/vue-shim.d.ts vendored Normal file
View File

@ -0,0 +1,4 @@
declare module "*.vue" {
const component: import("vue").Component;
export default component;
}

View File

@ -9,40 +9,33 @@
> How do I tell if a site or download is safe? Any tips?
Check out [Booty Guard](https://rentry.org/bootyguard) our basic safety guide.
Still feel unsure? Reach out to us via [Discord](https://redd.it/17f8msf) & make sure you've looked at sites/software we've listed as unsafe: [here](https://www.reddit.com/r/FREEMEDIAHECKYEAH/comments/10bh0h9/unsafe_sites_software_thread)
> I don't know what seeding means or *insert other term*...
You will find almost all terms related to piracy & more on [The Piracy Glossary](https://rentry.org/the-piracy-glossary)
Didn't find it and still confused? Reach out to us via [Divolt](https://redd.it/uto5vw).
> How do I download Photoshop/Adobe Products for free?
You can download pre-cracked Adobe products from [M0nkrus](https://w14.monkrus.ws/) | [How to download from M0nkrus](https://rentry.co/adobesoftware) or Patch it yourself following these guides [here](https://www.reddit.com/r/GenP/wiki/index/) & for MacOS go [here](#macos)
!!!info M0nkrus is a well trusted and reputable source for adobe software in the piracy community.
You can download pre-cracked Adobe products from [M0nkrus](https://w14.monkrus.ws/) who is a well trusted and reputable source for adobe software in the piracy community | [How to download from M0nkrus](https://rentry.co/adobesoftware). Alternatively, you can patch it yourself following the guides [here](https://www.reddit.com/r/GenP/wiki/index/). For MacOS go [here](#macos)
> How do I download/activate Windows/Office for free?
For Windows check out this [section](#pirate-windows)
For Office check these [guides](https://fmhy.pages.dev/storage/#office-suites)
For Windows check out this [section](#pirate-windows). For Office check these [guides](https://fmhy.pages.dev/storage/#office-suites)
> Where do I find *insert game title / movie title*?
For movies check out [this](https://whereyouwatch.com) and for new movies it's a good idea to keep an eye on [r/movieleaks](https://reddit.com/r/movieleaks).
For sites to stream from check out this [section](#streaming).
!!!info Pirated releases generally happen after a movie is digitally released or released via Blu-Ray / DVD, which can take 3 months+ after initially playing in theaters.
For games use [Rezi](https://rezi.one) or any site listed [here](https://www.reddit.com/r/FREEMEDIAHECKYEAH/wiki/games/#wiki_.25BA_download_games) and for newly released games check [r/crackwatch](https://reddit.com/r/crackwatch).
!!!warning Please avoid downloading games from The Pirate Bay or any site listed: [here](https://www.reddit.com/r/FREEMEDIAHECKYEAH/comments/10bh0h9/unsafe_sites_software_thread)
For movies check out [this](https://whereyouwatch.com) and for new movies it's a good idea to keep an eye on [r/movieleaks](https://reddit.com/r/movieleaks). For sites to stream from check out this [section](#streaming). Keep in mind that pirated releases generally happen after a movie is digitally released or released via Blu-Ray / DVD, which can take 3 months+ after initially playing in theaters. For games use [Rezi](https://rezi.one) or any site listed [here](https://www.reddit.com/r/FREEMEDIAHECKYEAH/wiki/games/#wiki_.25BA_download_games) and for newly released games check [r/crackwatch](https://reddit.com/r/crackwatch). Please avoid downloading games from The Pirate Bay or any site listed: [here](https://www.reddit.com/r/FREEMEDIAHECKYEAH/comments/10bh0h9/unsafe_sites_software_thread)
> How do I unlock *insert random game title* DLCs?
Use the tools listed [here](https://fmhy.pages.dev/gamingpiracyguide/#steam--epic) to unlock DLCs.
> Should I install & use *insert random anti-virus software* instead of using Windows Defender?
No don't do that, windows defender is more than good enough, you don't need another anti-virus, but if you're set on installing a secondary AV the one worth installing is Malwarebytes. Please read the note [here](#anti-virus).
!!!warning Stay away from Avast, Norton and McAfee, these are "bloatware" and generally not safe software.
No don't do that, windows defender is more than good enough, you don't need another anti-virus, but if you're set on installing a secondary AV the one worth installing is Malwarebytes. Please read the note [here](#anti-virus). Stay away from Avast, Norton and McAfee, these are "bloatware" and generally not safe software.
> How do I bypass this paywalled article?
Use [this](https://bitbucket.org/magnolia1234/bypass-paywalls-firefox-clean/src/master/) / [2](https://gitlab.com/magnolia1234/bypass-paywalls-chrome-clean) to read the article easily.
> How do I download image from *insert stock site*?
You can use [this](https://downloader.la/) if this doesn't work you can find similar stock image downloaders [here](https://www.reddit.com/r/FREEMEDIAHECKYEAH/wiki/storage/#wiki_stock_photo_sites).
Still feel unsure? Reach out to us via [Discord](https://redd.it/17f8msf) & make sure you've looked at sites/software we've listed as unsafe: [here](https://www.reddit.com/r/FREEMEDIAHECKYEAH/comments/10bh0h9/unsafe_sites_software_thread)
***
### Windows Piracy

View File

@ -67,7 +67,7 @@
* [Curated Programming Resources](https://github.com/Michael0x2a/curated-programming-resources) - Programming Courses
* [Stack Exchange](https://stackexchange.com/) - Programming Q&A / [App](https://play.google.com/store/apps/details?id=me.tylerbwong.stack)
* [Learn X in Y minutes](https://learnxinyminutes.com/), [2](https://github.com/adambard/learnxinyminutes-docs) - Programming Language Rundowns
* [HEAD](https://htmlhead.dev/) - HTML `<head>` Element Guide
* [HEAD](https://htmlhead.dev/) - HTML head Element Guide
* [Typing.io](https://typing.io/) - Typing Practice for Programmers
* [Karel The Robot](https://github.com/fredoverflow/karel) - Basic Programming Teaching Environment
* [Project Based Learning](https://github.com/practical-tutorials/project-based-learning) - Collection of Project-Based Tutorials
@ -754,7 +754,7 @@
* [Codux](https://www.codux.com/) - Visual IDE for React
* [React95](https://react95.io/) - Windows 95 React Components
* [React SVG](https://react-svgr.com/playground/) - Convert SVG to React Components
* [Zorm](https://github.com/esamattis/react-zorm) - Type-safe `<form>` for React
* [Zorm](https://github.com/esamattis/react-zorm) - Type-safe form for React
* [Million](https://github.com/aidenybai/million) - React Replacement
* [novu](https://novu.co/) - Real-Time React Notifications / [GitHub](https://github.com/novuhq/novu)
* [React Use](https://github.com/streamich/react-use) - React Hooks
@ -934,7 +934,7 @@
* [Sourcegraph](https://about.sourcegraph.com/) - Git Repository Sourcegraph Editor
* [onefetch](https://github.com/o2sh/onefetch) - Git Information Terminal
* [Conventional Commits](https://www.conventionalcommits.org/) - Commit Message Specification
* [AICommits](https://github.com/Nutlope/aicommits) - Auto Commit Messages
* [AICommits](https://github.com/Nutlope/aicommits) - Auto Commit Messages
* [lastversion](https://github.com/dvershinin/lastversion) or [ghrel](https://github.com/jreisinger/ghrel) - Download / View Latest Stable Repos
* [Git Cliff](https://github.com/orhun/git-cliff) - Changelog Generator
* [readme.so](https://readme.so/) - Readme Markdown Editor

View File

@ -914,7 +914,7 @@
* [Justia](https://trademarks.justia.com/) - Trademark Search
* [TMHunt](http://www.tmhunt.com/) - Clothing Trademark Search
* [BrownBook](https://www.brownbook.net/) - Business Listing Search
* [txtai](https://neuml.github.io/txtai/) - Build Semantic Search Apps
* [txtai](https://neuml.github.io/txtai/) - Build Semantic Search Apps
* [useful-forks](https://useful-forks.github.io/) or [GitPop3](https://andremiras.github.io/gitpop3/) - GitHub Fork Search
* [grep.app](https://grep.app/) - Git Repository Search
* [MyCroftProject](https://mycroftproject.com/) - Search Engine Plugins

View File

@ -1 +0,0 @@
<link rel="stylesheet" href="static/styles.css">

13
guides.md Normal file
View File

@ -0,0 +1,13 @@
---
title: Guides
---
<!-- <script setup> -->
<!-- import { data } from "./.vitepress/loaders/guides.data"; -->
<!-- </script> -->
<!---->
<!-- <template> -->
<!-- <h2>Guides</h2> -->
<!-- <br /> -->
<!-- <ul> -->
<!-- </ul> -->
<!-- </template> -->

40
index.md Normal file
View File

@ -0,0 +1,40 @@
---
title: "Welcome"
layout: home
hero:
name: "FMHY"
text: "freemediaheckyeah"
tagline: The Largest Collection Of Free Stuff On The Internet!
prelink:
title: 🎉 New website!
link: https://www.reddit.com/r/FREEMEDIAHECKYEAH/comments/17tnzak/new_fmhy_website/
image:
src: /test.png
alt: FMHY Icon
actions:
- theme: brand
text: Browse Collection
link: /adblockvpnguide
- theme: alt
text: Discord
link: https://discord.gg/Stz6y6NgNg
features:
- title: Movies / TV / Anime
icon: <svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 36 36"><path fill="#31373D" d="M35 31s0 4-4 4H5c-4 0-4-4-4-4V12c0-4 4-4 4-4h26s4 0 4 4v19z"/><path fill="#31373D" d="M21.303 10.389a.999.999 0 1 1-1.414 1.414l-9.192-9.192a.999.999 0 1 1 1.414-1.414l9.192 9.192z"/><path fill="#31373D" d="M14.697 10.389a.999.999 0 1 0 1.414 1.414l9.192-9.192a.999.999 0 1 0-1.414-1.414l-9.192 9.192z"/><path fill="#55ACEE" d="M18 11c8 0 10 1 11 2s2 3 2 8s-1 7-2 8s-3 2-11 2s-10-1-11-2s-2-3-2-8s1-7 2-8s3-2 11-2z"/><circle cx="31.5" cy="31.5" r="1.5" fill="#66757F"/><circle cx="4.5" cy="31.5" r="1.5" fill="#66757F"/></svg>
link: /videopiracyguide
details: Download, stream, torrent and binge all your favourites movies or shows!
- title: Music / Podcasts / Radio
icon: <svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 36 36"><path fill="#5DADEC" d="M14.182.168L7.818 1.469A1.07 1.07 0 0 0 7 2.471v15.857A6.226 6.226 0 0 0 5 18c-2.762 0-5 1.741-5 3.889c0 2.147 2.238 3.889 5 3.889c2.713 0 4.908-1.683 4.985-3.777H10V6.477l4.182-.855A1.07 1.07 0 0 0 15 4.62V.835c0-.459-.368-.76-.818-.667zm21 4l-6.363 1.301c-.451.092-.819.543-.819 1.002v15.857A6.198 6.198 0 0 0 26 22c-2.762 0-5 1.741-5 3.889c0 2.147 2.238 3.889 5 3.889c2.713 0 4.908-1.683 4.985-3.777H31V10.477l4.182-.855A1.07 1.07 0 0 0 36 8.62V4.835c0-.459-.368-.76-.818-.667z"/><path fill="#5DADEC" d="m23.182 10.167l-6.363 1.301c-.451.093-.819.544-.819 1.003v15.857A6.198 6.198 0 0 0 14 28c-2.762 0-5 1.741-5 3.889s2.238 3.889 5 3.889c2.713 0 4.908-1.683 4.985-3.777H19V16.477l4.182-.855A1.07 1.07 0 0 0 24 14.62v-3.785c0-.459-.368-.76-.818-.668z"/></svg>
link: /audiopiracyguide
details: Stream, download and torrent songs, podcasts and more!
- title: Games / Emulation
icon: <svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 36 36"><path fill="#31373D" d="m2.13 14.856l-.004-.002S.075 27.271.075 29.061c0 1.824 1.343 3.302 3 3.302c.68 0 1.3-.258 1.803-.678l10.166-8.938L2.13 14.856zm31.69 0l.004-.002s2.051 12.417 2.051 14.207c0 1.824-1.343 3.302-3 3.302c-.68 0-1.3-.258-1.803-.678l-10.166-8.938l12.914-7.891z"/><g fill="#14171A"><circle cx="25.975" cy="15.551" r="8.5"/><circle cx="9.975" cy="15.551" r="8.5"/><path d="M9.975 7.051h16v16.87h-16z"/></g><circle cx="13.075" cy="23.301" r="5" fill="#14171A"/><circle cx="22.875" cy="23.301" r="5" fill="#14171A"/><circle cx="22.875" cy="23.301" r="3" fill="#67757F"/><circle cx="13.075" cy="23.301" r="3" fill="#67757F"/><circle cx="25.735" cy="11.133" r="1.603" fill="#FFCC4D"/><circle cx="25.735" cy="17.607" r="1.603" fill="#77B255"/><circle cx="22.498" cy="14.37" r="1.603" fill="#50A5E6"/><circle cx="28.972" cy="14.37" r="1.603" fill="#DD2E44"/><path fill="#8899A6" d="M11.148 12.514v-2.168a.505.505 0 0 0-.505-.505H9.085a.505.505 0 0 0-.505.505v2.168l1.284 1.285l1.284-1.285zm-2.569 3.63v2.168c0 .279.226.505.505.505h1.558a.505.505 0 0 0 .505-.505v-2.168l-1.284-1.285l-1.284 1.285zm5.269-3.1H11.68l-1.285 1.285l1.285 1.285h2.168a.506.506 0 0 0 .505-.505V13.55a.506.506 0 0 0-.505-.506zm-5.799 0H5.88a.506.506 0 0 0-.505.505v1.558c0 .279.226.505.505.505h2.168l1.285-1.285l-1.284-1.283z"/></svg>
link: /gamingpiracyguide
details: Download and play all your favourite games or emulate some old but gold ones!
- title: Book / Comics / Manga
icon: <svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 36 36"><path fill="#553788" d="M15 31c0 2.209-.791 4-3 4H5c-4 0-4-14 0-14h7c2.209 0 3 1.791 3 4v6z"/><path fill="#9266CC" d="M34 33h-1V23h1a1 1 0 1 0 0-2H10c-4 0-4 14 0 14h24a1 1 0 1 0 0-2z"/><path fill="#CCD6DD" d="M34.172 33H11c-2 0-2-10 0-10h23.172c1.104 0 1.104 10 0 10z"/><path fill="#99AAB5" d="M11.5 25h23.35c-.135-1.175-.36-2-.678-2H11c-1.651 0-1.938 6.808-.863 9.188C9.745 29.229 10.199 25 11.5 25z"/><path fill="#269" d="M12 8a4 4 0 0 1-4 4H4C0 12 0 1 4 1h4a4 4 0 0 1 4 4v3z"/><path fill="#55ACEE" d="M31 10h-1V3h1a1 1 0 1 0 0-2H7C3 1 3 12 7 12h24a1 1 0 1 0 0-2z"/><path fill="#CCD6DD" d="M31.172 10H8c-2 0-2-7 0-7h23.172c1.104 0 1.104 7 0 7z"/><path fill="#99AAB5" d="M8 5h23.925c-.114-1.125-.364-2-.753-2H8C6.807 3 6.331 5.489 6.562 7.5C6.718 6.142 7.193 5 8 5z"/><path fill="#F4900C" d="M20 17a4 4 0 0 1-4 4H6c-4 0-4-9 0-9h10a4 4 0 0 1 4 4v1z"/><path fill="#FFAC33" d="M35 19h-1v-5h1a1 1 0 1 0 0-2H15c-4 0-4 9 0 9h20a1 1 0 1 0 0-2z"/><path fill="#CCD6DD" d="M35.172 19H16c-2 0-2-5 0-5h19.172c1.104 0 1.104 5 0 5z"/><path fill="#99AAB5" d="M16 16h19.984c-.065-1.062-.334-2-.812-2H16c-1.274 0-1.733 2.027-1.383 3.5c.198-.839.657-1.5 1.383-1.5z"/></svg>
link: /readingpiracyguide
details: Whether you're a bookworm, otaku or comic book fan, you'll be able to find your favourite pieces of literature here for free!
---

12
nitro.config.ts Normal file
View File

@ -0,0 +1,12 @@
//https://nitro.unjs.io/config
export default defineNitroConfig({
runtimeConfig: {
WEBHOOK_URL: process.env.WEBHOOK_URL,
},
srcDir: ".vitepress",
routeRules: {
"/": {
cors: false,
},
},
});

44
package.json Normal file
View File

@ -0,0 +1,44 @@
{
"name": "fmhy",
"type": "module",
"packageManager": "pnpm@8.7.6",
"scripts": {
"docs:dev": "vitepress dev",
"docs:build": "vitepress build",
"docs:preview": "vitepress preview",
"api:prepare": "nitropack prepare",
"api:dev": "nitropack dev",
"api:build": "nitropack build",
"api:preview": "node .output/server/index.mjs",
"og:dev": "x-satori -t ./.vitepress/hooks/Template.vue -c ./.vitepress/hooks/satoriConfig.ts --dev",
"format": "prettier -w --cache .",
"postinstall": "nitropack prepare"
},
"dependencies": {
"@headlessui/vue": "^1.7.16",
"@resvg/resvg-js": "^2.6.0",
"fast-glob": "^3.3.1",
"itty-fetcher": "^0.9.4",
"nitro-cors": "^0.7.0",
"nitropack": "latest",
"pathe": "^1.1.1",
"unocss": "^0.57.1",
"vitepress": "1.0.0-rc.25",
"vue": "^3.3.7",
"workbox-window": "^7.0.0",
"x-satori": "^0.1.5",
"zod": "^3.22.4"
},
"devDependencies": {
"@iconify-json/carbon": "^1.1.21",
"@iconify-json/twemoji": "^1.1.12",
"@types/node": "^20.8.9",
"@vite-pwa/vitepress": "^0.2.3",
"prettier": "^3.0.3"
},
"pnpm": {
"patchedDependencies": {
"vitepress@1.0.0-rc.25": "patches/vitepress@1.0.0-rc.25.patch"
}
}
}

View File

@ -0,0 +1,60 @@
diff --git a/dist/client/theme-default/Layout.vue b/dist/client/theme-default/Layout.vue
index 0ecca7ecd6f7e5ab4d576ecaf0cbc8578291a94f..32c9d80e564c42b817950ee2a1c69d62e6b304a3 100644
--- a/dist/client/theme-default/Layout.vue
+++ b/dist/client/theme-default/Layout.vue
@@ -56,6 +56,7 @@ provide('hero-image-slot-exists', heroImageSlotExists)
<template #not-found><slot name="not-found" /></template>
<template #home-hero-before><slot name="home-hero-before" /></template>
+ <template #home-hero-prelink><slot name="home-hero-prelink" /></template>
<template #home-hero-info><slot name="home-hero-info" /></template>
<template #home-hero-image><slot name="home-hero-image" /></template>
<template #home-hero-after><slot name="home-hero-after" /></template>
diff --git a/dist/client/theme-default/components/VPContent.vue b/dist/client/theme-default/components/VPContent.vue
index a1479dc693a8261b30b88663ba1de523cceaf877..1f49bab3aed371b5e8cf12e11870c503da2a9872 100644
--- a/dist/client/theme-default/components/VPContent.vue
+++ b/dist/client/theme-default/components/VPContent.vue
@@ -28,6 +28,7 @@ const { hasSidebar } = useSidebar()
<VPHome v-else-if="frontmatter.layout === 'home'">
<template #home-hero-before><slot name="home-hero-before" /></template>
+ <template #home-hero-prelink><slot name="home-hero-prelink" /></template>
<template #home-hero-info><slot name="home-hero-info" /></template>
<template #home-hero-image><slot name="home-hero-image" /></template>
<template #home-hero-after><slot name="home-hero-after" /></template>
diff --git a/dist/client/theme-default/components/VPHero.vue b/dist/client/theme-default/components/VPHero.vue
index 659c3dbfd36e9fcaf08b659c84c2eb378e8b49f8..2650a2b97e6d0c96f6bf56b478ece2f0c5663101 100644
--- a/dist/client/theme-default/components/VPHero.vue
+++ b/dist/client/theme-default/components/VPHero.vue
@@ -25,6 +25,7 @@ const heroImageSlotExists = inject('hero-image-slot-exists') as Ref<boolean>
<div class="VPHero" :class="{ 'has-image': image || heroImageSlotExists }">
<div class="container">
<div class="main">
+ <slot name="home-hero-prelink"></slot>
<slot name="home-hero-info">
<h1 v-if="name" class="name">
<span v-html="name" class="clip"></span>
diff --git a/dist/client/theme-default/components/VPHome.vue b/dist/client/theme-default/components/VPHome.vue
index a4cda402bf7fde02c1e58b85c5d47daec458220e..d87e6fc69bd6d4b40f12b2fee90d385549583820 100644
--- a/dist/client/theme-default/components/VPHome.vue
+++ b/dist/client/theme-default/components/VPHome.vue
@@ -7,6 +7,7 @@ import VPHomeFeatures from './VPHomeFeatures.vue'
<div class="VPHome">
<slot name="home-hero-before" />
<VPHomeHero>
+ <template #home-hero-prelink><slot name="home-hero-prelink" /></template>
<template #home-hero-info><slot name="home-hero-info" /></template>
<template #home-hero-image><slot name="home-hero-image" /></template>
</VPHomeHero>
diff --git a/dist/client/theme-default/components/VPHomeHero.vue b/dist/client/theme-default/components/VPHomeHero.vue
index 5d482944ff62330939c963f43d71c788e88afa4e..a486fe63bfb4f7e41bcbf3e070ef57e8806cf9a9 100644
--- a/dist/client/theme-default/components/VPHomeHero.vue
+++ b/dist/client/theme-default/components/VPHomeHero.vue
@@ -15,6 +15,7 @@ const { frontmatter: fm } = useData()
:image="fm.hero.image"
:actions="fm.hero.actions"
>
+ <template #home-hero-prelink><slot name="home-hero-prelink" /></template>
<template #home-hero-info><slot name="home-hero-info" /></template>
<template #home-hero-image><slot name="home-hero-image" /></template>
</VPHero>

6640
pnpm-lock.yaml Normal file

File diff suppressed because it is too large Load Diff

9
public/_headers Normal file
View File

@ -0,0 +1,9 @@
/assets/*
cache-control: max-age=31536000
cache-control: immutable
/*
X-Robots-Tag: noarchive
/manifest.webmanifest
Content-Type: application/manifest+json

View File

Before

Width:  |  Height:  |  Size: 1.9 MiB

After

Width:  |  Height:  |  Size: 1.9 MiB

View File

Before

Width:  |  Height:  |  Size: 738 KiB

After

Width:  |  Height:  |  Size: 738 KiB

View File

Before

Width:  |  Height:  |  Size: 601 KiB

After

Width:  |  Height:  |  Size: 601 KiB

View File

Before

Width:  |  Height:  |  Size: 601 KiB

After

Width:  |  Height:  |  Size: 601 KiB

View File

Before

Width:  |  Height:  |  Size: 8.6 KiB

After

Width:  |  Height:  |  Size: 8.6 KiB

View File

Before

Width:  |  Height:  |  Size: 8.6 KiB

After

Width:  |  Height:  |  Size: 8.6 KiB

2
public/robots.txt Normal file
View File

@ -0,0 +1,2 @@
User-agent: *
Allow: /

BIN
public/test.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 329 KiB

View File

@ -1,20 +0,0 @@
h1 {
text-align: center;
}
/* Icons */
html.dark ul.flex-col > li > a > svg {
color: white !important;
}
:not(html.dark) ul.flex-col > li > a > svg {
color: rgb(47 51 72/var(--tw-text-opacity));
}
/* Hide filter from sidebar */
div.left-0:nth-child(2) {
display: none;
}
aside ul:nth-child(3) {
margin-top: 1em;
}

6
tsconfig.json Normal file
View File

@ -0,0 +1,6 @@
{
"extends": "./.nitro/types/tsconfig.json",
"compilerOptions": {
"verbatimModuleSyntax": true
}
}

5
wrangler.toml Normal file
View File

@ -0,0 +1,5 @@
name = "feedback"
main = ".output/server/index.mjs"
workers_dev = true
account_id = "fe5d9bd14160b07939282e45f63eb5ad"
compatibility_date = "2022-09-10"