├── .editorconfig ├── .env.example ├── .gitignore ├── .vscode ├── launch.json └── settings.json ├── README.md ├── backups ├── 08nYrDMx-DU.json ├── 0BADmbVhjgM.json ├── 2_4xmeCebKk.json ├── 2uRqMf_13BA.json ├── 8-ZaQ0uj4vY.json ├── CBEUf7vqLRw.json ├── DUsZ-RNET74.json ├── EOIfaf2Pcuc.json ├── Ev58S-rplrs.json ├── ML6tpvHw_io.json ├── NSyPPd_lEQE.json ├── OhmY6Afh2Ec.json ├── Q9XTqQbuavI.json ├── _metadata.json ├── _rC6DA9EJuo.json ├── bPVohspy054.json ├── bnWktjTMZb0.json ├── cwLugJZMrb0.json ├── g8f253ss_NI.json ├── ggbn1s2oUUE.json ├── lkQ1POVJsk4.json ├── m0gsV5X6l1I.json ├── mDnr_-Gc-ZI.json ├── pDgflOcHNnM.json ├── r2DG5-sjqso.json ├── xkx2MX-a-D4.json ├── ytLzeQNiJDs.json ├── zK4TWXWEKAQ.json └── zPAKKROcclE.json ├── bun.lockb ├── cdk.context.json ├── firebase ├── .firebaserc └── firebase.json ├── package.json ├── packages ├── functions │ ├── drizzle.config.ts │ ├── drizzle │ │ ├── 0000_romantic_strong_guy.sql │ │ └── meta │ │ │ ├── 0000_snapshot.json │ │ │ └── _journal.json │ ├── package.json │ ├── scripts │ │ ├── loadBackups.ts │ │ └── seed.ts │ ├── src │ │ ├── authorizer.ts │ │ ├── checkpoints.ts │ │ ├── comments.ts │ │ ├── db │ │ │ ├── index.ts │ │ │ ├── migrate.ts │ │ │ └── schema.ts │ │ ├── restore.ts │ │ └── utils │ │ │ └── firebase.ts │ ├── sst-env.d.ts │ └── tsconfig.json └── website │ ├── .gitignore │ ├── app.vue │ ├── assets │ └── css │ │ ├── animations.css │ │ ├── main.css │ │ └── transitions.css │ ├── components │ ├── AppHeader.vue │ ├── CircleLoading.vue │ ├── Comment.vue │ ├── Comments.vue │ ├── Page.vue │ ├── Replies.vue │ ├── SideNav.vue │ └── restore │ │ ├── CheckpointsList.vue │ │ ├── ExplanationProcess.vue │ │ ├── GatheringCheckpointsLoading.vue │ │ ├── GoBackToComments.vue │ │ ├── NoCheckpointsFound.vue │ │ └── NotGranted.vue │ ├── composables │ ├── useStore.ts │ └── youtubeFormat.ts │ ├── content │ └── privacy.md │ ├── nuxt.config.ts │ ├── package.json │ ├── pages │ ├── [id].vue │ ├── index.vue │ ├── privacy.vue │ └── restore.vue │ ├── plugins │ ├── firebase.client.ts │ └── markdownit.ts │ ├── public │ ├── favicon.ico │ └── images │ │ ├── oauth-example.png │ │ ├── og.jpg │ │ ├── thorn.gif │ │ └── thumbnails │ │ ├── 08nYrDMx-DU.webp │ │ ├── 0BADmbVhjgM.webp │ │ ├── 1x4KfgQhvB4.webp │ │ ├── 2_4xmeCebKk.webp │ │ ├── 2uRqMf_13BA.webp │ │ ├── 8-ZaQ0uj4vY.webp │ │ ├── CBEUf7vqLRw.webp │ │ ├── DUsZ-RNET74.webp │ │ ├── EOIfaf2Pcuc.webp │ │ ├── Ev58S-rplrs.webp │ │ ├── ML6tpvHw_io.webp │ │ ├── NSyPPd_lEQE.webp │ │ ├── OhmY6Afh2Ec.webp │ │ ├── Q9XTqQbuavI.webp │ │ ├── VWR5u1evzUY.webp │ │ ├── _rC6DA9EJuo.webp │ │ ├── bPVohspy054.webp │ │ ├── bnWktjTMZb0.webp │ │ ├── cwLugJZMrb0.webp │ │ ├── g8f253ss_NI.webp │ │ ├── ggbn1s2oUUE.webp │ │ ├── lkQ1POVJsk4.webp │ │ ├── m0gsV5X6l1I.webp │ │ ├── mDnr_-Gc-ZI.webp │ │ ├── pDgflOcHNnM.webp │ │ ├── r2DG5-sjqso.webp │ │ ├── wMv4Rw_7Mes.webp │ │ ├── xkx2MX-a-D4.webp │ │ ├── ytLzeQNiJDs.webp │ │ ├── zK4TWXWEKAQ.webp │ │ └── zPAKKROcclE.webp │ ├── tailwind.config.js │ └── tsconfig.json ├── scripts ├── boot.iterm.sh └── hobune.ts ├── sst.config.ts ├── stacks ├── ApiStack.ts ├── ConfigStack.ts └── WebStack.ts └── tsconfig.json /.editorconfig: -------------------------------------------------------------------------------- 1 | [*] 2 | indent_size = 2 3 | indent_style = space 4 | trim_trailing_whitespace = true 5 | insert_final_newline = true -------------------------------------------------------------------------------- /.env.example: -------------------------------------------------------------------------------- 1 | DATABASE_URL= -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # dependencies 2 | node_modules 3 | 4 | # sst 5 | .sst 6 | .build 7 | 8 | # opennext 9 | .open-next 10 | 11 | # misc 12 | .DS_Store 13 | 14 | *.env 15 | 16 | videos 17 | 18 | # Infrastructure 19 | guiderail-service-account.json 20 | firebase/persistent-export 21 | 22 | *.log 23 | 24 | *.secrets 25 | -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.2.0", 3 | "configurations": [ 4 | { 5 | "name": "Debug SST Start", 6 | "type": "node", 7 | "request": "launch", 8 | "runtimeExecutable": "${workspaceRoot}/node_modules/.bin/sst", 9 | "runtimeArgs": ["start", "--increase-timeout"], 10 | "console": "integratedTerminal", 11 | "skipFiles": ["/**"], 12 | "env": {} 13 | } 14 | ] 15 | } 16 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "search.exclude": { 3 | "**/.sst": true 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Internet Checkpoint 2 | An hommage to the internet checkpoint comments section. 3 | 4 | ## Introduction 5 | 6 | [internetcheckpoint.page](https://internetcheckpoint.page/zK4TWXWEKAQ) is a modest attempt at recreating the comments sections under the video of taia777. 7 | All the comments backups were made by [Rebane](https://www.reddit.com/r/taia777/comments/o1rls6/taia777_videos_and_comments_archive/). 8 | 9 | ## Todos 10 | 11 | - [x] Let people find their old checkpoints using the Google/Youtube oauth login. 12 | - [ ] Let people post new checkpoints. 13 | - [ ] Automatically scrap comments from internet checkpoint reuploads. 14 | -------------------------------------------------------------------------------- /backups/2uRqMf_13BA.json: -------------------------------------------------------------------------------- 1 | {"heart": false, "votes": "0", "photo": "https://yt3.ggpht.com/ytc/AAUvwnj9pB7p9uzDLb6YuMhRDcGlKi0St6C4EIjV4jKc=s176-c-k-c0x00ffffff-no-rj", "author": "匿名", "cid": "UgxlJfFGjedFdNA2fVJ4AaABAg", "text": "小学生の時にプレイして、感動して泣きました。\nまた大人になって泣きたいと思います。", "time": "1 aasta eest", "channel": "UCba1EcQiDfhN6J4pUzTwJmQ"} 2 | {"heart": false, "votes": "1", "photo": "https://yt3.ggpht.com/ytc/AAUvwnh0tvDGWLK7w_2vg-DY_QerTQf643kqsvlpYg=s176-c-k-c0x00ffffff-no-rj", "author": "Crow S.", "cid": "Ugwpvyn1gQeWo2GFxpx4AaABAg", "text": "民族音楽っぽい感じ好こ", "time": "1 aasta eest", "channel": "UC-Gj10AhKIGZpyr1HBI-RhA"} 3 | {"heart": false, "votes": "0", "photo": "https://yt3.ggpht.com/ytc/AAUvwnigQ53_bCuP15kGSgxpL_Kzg5FP3ugP1CfEWSPc=s176-c-k-c0x00ffffff-no-rj", "author": "TheIzaiah", "cid": "Ugzcs82F2waEp7hz_Xh4AaABAg", "text": "https://discord.gg/D6d5nBK", "time": "1 aasta eest", "channel": "UCkXkmWxt3NCcSCuGypvJtOg"} 4 | {"heart": false, "votes": "2", "photo": "https://yt3.ggpht.com/ytc/AAUvwniBkjVZY7CVOtxW_F6RQ1Vt_Eq39ln2rq2H9w=s176-c-k-c0x00ffffff-no-rj", "author": "フェリペあれこれ", "cid": "UgyH3N3_UHN7Reg1XqN4AaABAg", "text": "伝説の神曲", "time": "1 aasta eest", "channel": "UCGSliJ95txBZ18X0mrsrmng"} 5 | {"heart": false, "votes": "0", "photo": "https://yt3.ggpht.com/ytc/AAUvwnjdF6kXLwIsTevvY8jr8LcKE7jWq5rxf3ubhsPS0w=s176-c-k-c0x00ffffff-no-rj", "author": "Summoner Arthur", "cid": "Ugz4Uu_voRn67VTBMPR4AaABAg", "text": "If you ever come back sir, can you please do craggy coast?\nSorry.", "time": "1 aasta eest", "channel": "UC_aaCYTXLPcEdCCUc2CWjIA"} 6 | {"heart": false, "votes": "1", "photo": "https://yt3.ggpht.com/ytc/AAUvwnhfNt62XKGjR0Qbb1iAJGCOb-b4nucJkAVi0M7gGw=s176-c-k-c0x00ffffff-no-rj", "author": "婚后派閥応援隊", "cid": "UgyuGgTPdQCiSpRcTEl4AaABAg", "text": "ポケダンシリーズで二回もリメイクされた数少ないBGM 超とDX", "time": "1 aasta eest", "channel": "UCHmRyFwaEOmDB9MTk8gsh9g"} 7 | {"heart": false, "votes": "2", "photo": "https://yt3.ggpht.com/ytc/AAUvwnjsocnk5My7CLXiUAF9oYyEbgyPjd32bwScZDJ1=s176-c-k-c0x00ffffff-no-rj", "author": "phrog _", "cid": "UgxIq8DBTfuf-dPbZOF4AaABAg", "text": "I’m glad that I, am American, can enjoy the same thing as all of these people across the world can. :)", "time": "11 kuu eest", "channel": "UCmF3OtwuHOv9_MMcGbhUvog"} 8 | {"heart": false, "votes": "0", "photo": "https://yt3.ggpht.com/ytc/AAUvwni6Hurqs6fFqDKi19CFoIXGyatULJHeX9-Pqw=s176-c-k-c0x00ffffff-no-rj", "author": "ko nogi", "cid": "UgzA-ORIDOx4J931Ugt4AaABAg", "text": "ジョイマ聴いてから来たから凄く、、、綺麗です、、、", "time": "10 kuu eest", "channel": "UCi6AEIykiwJiOnRwPcLasjg"} 9 | {"heart": false, "votes": "0", "photo": "https://yt3.ggpht.com/ytc/AAUvwnitMRrI8Ik4mMWf881lH_glCfiyPYr9mkEDjyb3=s176-c-k-c0x00ffffff-no-rj", "author": "Noel Radoš", "cid": "UgwVq-suQtO8rzIzQKB4AaABAg", "text": "hast recht ich gebs zu", "time": "10 kuu eest", "channel": "UCiZZiP8VFAeXUywS4hhZbZQ"} 10 | {"heart": false, "votes": "3", "photo": "https://yt3.ggpht.com/ytc/AAUvwniTig2hN1Q0mjR8M7Zw7CgPzjQJA-3wXiqbuRSwiQ=s176-c-k-c0x00ffffff-no-rj", "author": "Scooby-", "cid": "UgzCxGSB8H14j1h3-2p4AaABAg", "text": "Title Translate: Large Kyokuku \"Pokemon Mysterious Dungeon Blue Rescue Team\"", "time": "10 kuu eest", "channel": "UC7ftmbQFm55vXjMRL9TjlHA"} 11 | {"heart": false, "votes": "21", "photo": "https://yt3.ggpht.com/ytc/AAUvwniQnUilYfxqWhBnAThcoVMtt4W82fvl0QzOe7RmEg=s176-c-k-c0x00ffffff-no-rj", "author": "Slinkoh", "cid": "UgyzUWk7JeuahYwS3Hp4AaABAg", "text": "Welcome, Traveler. \nSit back, relax, and enjoy this beautiful tune.\nSaving Game ............... Saved", "time": "8 kuu eest", "channel": "UCTrCRNHYZr7rO2cf7cWh3hg"} 12 | {"heart": false, "votes": "0", "photo": "https://yt3.ggpht.com/ytc/AAUvwngafJ-jHCpGI-jMrPQtSG-_YUrZbiGfnolm4g=s176-c-k-c0x00ffffff-no-rj", "author": "ああ", "cid": "Ugye_dcJs3vSmyXWwLB4AaABAg", "text": "こっから一気にポケの値が大きくなるんだよな", "time": "8 kuu eest", "channel": "UCjLt16DPZ2ilvSFIgqKH4jQ"} 13 | {"heart": false, "votes": "0", "photo": "https://yt3.ggpht.com/ytc/AAUvwnjy8tZNRh0ejd6eZxr_yS86CB-sKQgr4iTwHmiKBA=s176-c-k-c0x00ffffff-no-rj", "author": "j / k gill", "cid": "UgwLoBcvp3GdBZe3hS54AaABAg", "text": "this is awesome", "time": "8 kuu eest", "channel": "UC23r3ujOjNPvrJeu5Gvt67Q"} 14 | {"heart": false, "votes": "1", "photo": "https://yt3.ggpht.com/ytc/AAUvwngJHse_IbbuF_68why0P1bN_2S1Lnhto7Th9tq4lg=s176-c-k-c0x00ffffff-no-rj", "author": "プリズンマジメ君ch", "cid": "UgwtAn8zbMMUHbxMUAV4AaABAg", "text": "キノガッサを初めて知ったステージ\n当時はあんなやばいポケモンだとは思いもせずに普通に倒してた", "time": "6 kuu eest", "channel": "UCfmBWEns5qmb76i-ilzMEIA"} 15 | {"heart": false, "votes": "0", "photo": "https://yt3.ggpht.com/ytc/AAUvwni1vnPZICIcJwBaig84tx-trTD_vT2ISuIfeyqf=s176-c-k-c0x00ffffff-no-rj", "author": "TheKing4562", "cid": "Ugyjnr302yzy5wFRNNx4AaABAg", "text": "Unironically getting an Okami vibe but with a few missing instruments compare to the ingame version of the song.", "time": "5 kuu eest", "channel": "UC9QTANHsNcXjoff3EEKW7VQ"} 16 | {"heart": false, "votes": "3", "photo": "https://yt3.ggpht.com/ytc/AAUvwni7c5zsPz22VOYiHOLe9w4hbXEVLRWprCz-nFuf4w=s176-c-k-c0x00ffffff-no-rj", "author": "Trevor B", "cid": "UgwPpmE7As41WJkGc0J4AaABAg", "text": "So few comments... guess ill save here too.\n\nCheckpoint.\n\nI am currently procrastinating the most difficult homework for the most difficult class I am taking. I am a freshman in college, and I love it here. \n\nIf you are reading this, I call out to you to do something you have yet to. My girlfriend got me to play Ghost Trick. It is an amazing game, and if you found this comment then you definately deserve to play it.\n\nSaved October 26, 12:05 AM, 2020", "time": "5 kuu eest", "channel": "UCY-nDCOjEPwDetjOXNEyYgA"} 17 | {"heart": false, "votes": "0", "photo": "https://yt3.ggpht.com/ytc/AAUvwnjnE_HS9Cu8yyK5i6-8egbyzt4VfgIa_Nnlgc02Cw=s176-c-k-c0x00ffffff-no-rj", "author": "MoonDust *", "cid": "UgyreRFXe7yN8LWhSVt4AaABAg", "text": "Saved", "time": "3 kuu eest", "channel": "UCxqXxHv_hNYDhAJXeMOJtvQ"} 18 | {"heart": false, "votes": "0", "photo": "https://yt3.ggpht.com/ytc/AAUvwni15rIQYtqwcBS2Ky-Up3s7ROMIDN6zdK3eFEEU=s176-c-k-c0x00ffffff-no-rj", "author": "321 123", "cid": "Ugxu_2yrIoYM5PuQYhZ4AaABAg", "text": "the fifth checkpoint", "time": "3 kuu eest", "channel": "UC_yXrG-YaGT738vLfutMwgw"} 19 | {"heart": false, "votes": "0", "photo": "https://yt3.ggpht.com/ytc/AAUvwnjfN_TJ9wjTim5emkfopbFAfxlVWZD6ggpHgFbI=s176-c-k-c0x00ffffff-no-rj", "author": "すぷっちとてぽ", "cid": "UgyLBVjNCHNWf-mM17Z4AaABAg", "text": "おおいなる感じが凄い出てる", "time": "2 kuu eest", "channel": "UCXgQ84vTJZa6VQtWndxsdWg"} 20 | {"heart": false, "votes": "0", "photo": "https://yt3.ggpht.com/ytc/AAUvwnhc3XxGQbOw-lrDW47b111s36IfTyJia5uEKOMn=s176-c-k-c0x00ffffff-no-rj", "author": "シロ白", "cid": "UgxD5NMAeJ402ShFvN54AaABAg", "text": "昔はポケダンの序盤が本当に難しかったなぁ……だからこそ、エンディングであんなボロボロに泣いたんだろうなぁ……だって最後難しすぎるますし……プテラ、こうそくいどう、モルフォン、ぎんいろのかぜ……ボーマンダ、メタグロス……魔の8フロア?構成に食料の少なさ……\nこれをクリアした時の主人公が去っていく姿、すごい感情移入してしまう。\nそりゃ泣くでしょ、辛かったと思うでしょ、道中めっちゃつらいんだもの。", "time": "1 kuu eest", "channel": "UChw-kYorH77T7S2ugcclg-w"} 21 | {"heart": false, "votes": "0", "photo": "https://yt3.ggpht.com/ytc/AAUvwnjfp9q8yhChMJESDsVJhYRz3gSadLQiGt3Nwg=s176-c-k-c0x00ffffff-no-rj", "author": "Vuneld", "cid": "UgwPpmE7As41WJkGc0J4AaABAg.9FGEnxSDkdC9KL0N08wtnb", "text": " @Trevor B  congrats dude :)", "time": "1 kuu eest", "channel": "UCcEKd2zjdbmK_g3YNrkR-_g"} 22 | {"heart": false, "votes": "1", "photo": "https://yt3.ggpht.com/ytc/AAUvwni7c5zsPz22VOYiHOLe9w4hbXEVLRWprCz-nFuf4w=s176-c-k-c0x00ffffff-no-rj", "author": "Trevor B", "cid": "UgwPpmE7As41WJkGc0J4AaABAg.9FGEnxSDkdC9IagWjUhUk6", "text": " @Idraksson  I did really well in that course and got an A! Thanks for asking", "time": "2 kuu eest", "channel": "UCY-nDCOjEPwDetjOXNEyYgA"} 23 | {"heart": false, "votes": "0", "photo": "https://yt3.ggpht.com/ytc/AAUvwniV9f14NI0vPw7VajLD8OoZwAL1Axu8Dx_kZhtUpA=s176-c-k-c0x00ffffff-no-rj", "author": "Idraksson", "cid": "UgwPpmE7As41WJkGc0J4AaABAg.9FGEnxSDkdC9IaaQZ_kvim", "text": "How did it go?", "time": "2 kuu eest", "channel": "UC8cL82S27lTqQ4tVPGwBHcw"} 24 | {"heart": false, "votes": "5", "photo": "https://yt3.ggpht.com/ytc/AAUvwngIDPp_Sourx7q5OxqTHx-esu4eXspezo2fqg=s176-c-k-c0x00ffffff-no-rj", "author": "ウノピュウノウグァーレトレ", "cid": "UgwTgL-cp0J2HNw2DpB4AaABAg", "text": "ヘラクロスを仲間にするために\n足繁く通ってた記憶があります。", "time": "2 aasta eest", "channel": "UCQKE9ZYsupq4nOfQY-IDC3A"} 25 | {"heart": false, "votes": "3", "photo": "https://yt3.ggpht.com/ytc/AAUvwnhhpf9wVFJXBbGS2lwbHPuzhMxVdCxEV9D0eg=s176-c-k-c0x00ffffff-no-rj", "author": "高燃費ドライバー", "cid": "Ugyy3egq1TACNlAZWFd4AaABAg", "text": "赤の救助隊版↓\nhttps://www.youtube.com/watch?v=IrJkX1LBTp8(英語)", "time": "2 aasta eest (muudetud)", "channel": "UCKErikTO--DHhvFcRDsAodQ"} 26 | {"heart": false, "votes": "9", "photo": "https://yt3.ggpht.com/ytc/AAUvwniA8ZjSBEqTWSv-gZzTNKzAddEdgHG6f3z6wgkaUg=s176-c-k-c0x00ffffff-no-rj", "author": "ほし竹内", "cid": "UgzJxQ7vmw_r9KnadzJ4AaABAg", "text": "おおいなるきょうこくのbgm大好き", "time": "2 aasta eest", "channel": "UCwvV9xZnTd-Cx_1d78Oi5dw"} 27 | {"heart": false, "votes": "3", "photo": "https://yt3.ggpht.com/ytc/AAUvwngvIXh2G4scKbi_fkhmXsowo96WpRRdI8DsufzXhw=s176-c-k-c0x00ffffff-no-rj", "author": "べす", "cid": "UgxFREx8_bwVJ0iIvbF4AaABAg", "text": "ポポッコのはねる!\n当時小学3年くらいか‥", "time": "2 aasta eest", "channel": "UCO90dndfXL9VIhOyDL9BzLQ"} 28 | {"heart": false, "votes": "1", "photo": "https://yt3.ggpht.com/ytc/AAUvwnhJVtdUQOYrg78NDlr4pMiGtcbH9WKLwdZF-lthUw=s176-c-k-c0x00ffffff-no-rj", "author": "Blue Dragon", "cid": "Ugwhd5bwR514gbGYjqR4AaABAg", "text": "懐かしすぎる...主人公はフシギダネでした(´°̥̥̥̥̥̥̥̥ω°̥̥̥̥̥̥̥̥`)", "time": "2 aasta eest", "channel": "UCM_ieG9aoDuMABXrceftdrg"} 29 | {"heart": false, "votes": "42", "photo": "https://yt3.ggpht.com/ytc/AAUvwngn5qOa2g-3EebSNQ_IoLA7_kn4pSmvIea0Y8sc=s176-c-k-c0x00ffffff-no-rj", "author": "らむむ", "cid": "UgxvN10S5fjHbJB9MAt4AaABAg", "text": "ジョイマさんのところから来ました笑", "time": "2 aasta eest", "channel": "UCoTLl9KEclFDXCiRXXsMRUg"} 30 | {"heart": false, "votes": "11", "photo": "https://yt3.ggpht.com/ytc/AAUvwniRiQW0ToKYEFJRuDqnlrP2c8T604-T4Vr4PihY=s176-c-k-c0x00ffffff-no-rj", "author": "Makito", "cid": "UgwQpjghyreCyo6bYiF4AaABAg", "text": "joyjoy MAX氏による「おおいなるきょうこく」を声で再現してみたはこちら↓\nhttps://youtu.be/B3KZtB4QfY8", "time": "2 aasta eest (muudetud)", "channel": "UC424kW_13Zu1xeTOTpv5tvQ"} 31 | {"heart": false, "votes": "10", "photo": "https://yt3.ggpht.com/ytc/AAUvwngPQTZ0NomObRK3A8Rj4U0Jrqp1xAiG8qqOlNbsSw=s176-c-k-c0x00ffffff-no-rj", "author": "みき", "cid": "UgwCH2JpJOIQgWkwm7t4AaABAg", "text": "小学生の頃好きでプレイしてました。\n一番心に残ってる曲です| ᐕ)⁾⁾なぜか同時にキノココを思い出します笑笑\n最近入試も終わったので、空の探検隊と超 不思議のダンジョン買おうと思ってます。\nこのイラストも好きです。改めて本当に良いゲーム。", "time": "2 aasta eest", "channel": "UC9ygwbNKyLs8jO07WcpIq1Q"} 32 | {"heart": false, "votes": "2", "photo": "https://yt3.ggpht.com/ytc/AAUvwniqEEn0blthql_Sy3sHc5JNMlStHoYZX1TXAGIQ=s176-c-k-c0x00ffffff-no-rj", "author": "ne ko", "cid": "UgxUSwPpmt1ZEgfR5Ol4AaABAg", "text": "なんでサントラないんだ…", "time": "2 aasta eest", "channel": "UCAQ4cDLR5PbOvSM3L_MK7_g"} 33 | {"heart": false, "votes": "6", "photo": "https://yt3.ggpht.com/ytc/AAUvwnjx5UHZTcVqnx_DRl879qIPq9va3y-HNTbooDll=s176-c-k-c0x00ffffff-no-rj", "author": "chamois s", "cid": "UgyQ-t_wMygM2QqsJRJ4AaABAg", "text": "懐かしくて泣けてくる", "time": "1 aasta eest", "channel": "UC5jjt3EZBed_rNShTtItxPA"} 34 | {"heart": false, "votes": "0", "photo": "https://yt3.ggpht.com/ytc/AAUvwng4ACbcKfMw3J5-k4i3H0zgwOwUKOSWspzmL9yhtQ=s176-c-k-c0x00ffffff-no-rj", "author": "gomeyui", "cid": "UgzwvO3tMmQqP08qWVZ4AaABAg", "text": "JJMから", "time": "1 aasta eest", "channel": "UCWkJrEs6z0-tCqZq1sqFfQQ"} 35 | {"heart": false, "votes": "0", "photo": "https://yt3.ggpht.com/ytc/AAUvwngMJho8RwzpvyuQJavFBMiiUMtlbOgaKwON2NJtGA=s176-c-k-c0x00ffffff-no-rj", "author": "蒼羽古坂", "cid": "Ugz7GHtAb7F6YJoxlzd4AaABAg", "text": "クワーーーーーーーーーッ", "time": "1 aasta eest", "channel": "UC-OryA40YLHpFDmMwf4Xz-Q"} 36 | {"heart": false, "votes": "13", "photo": "https://yt3.ggpht.com/ytc/AAUvwnjUKDA3oM1Ah1KwVNyOU0HAO1nEBrDifrpBFg=s176-c-k-c0x00ffffff-no-rj", "author": "Marcel Schneider", "cid": "UgzY65vqyM6ekg9htLx4AaABAg", "text": "PMD so Great Game, it has a Place in My Heart", "time": "1 aasta eest", "channel": "UCr-mk49pIyhz-mQEjNV5b2A"} 37 | {"heart": false, "votes": "0", "photo": "https://yt3.ggpht.com/ytc/AAUvwng287Dnaq7tg4cJLwPrgywxpRwkMmtGfdfTBP3h=s176-c-k-c0x00ffffff-no-rj", "author": "水着verハク", "cid": "UgxGfRHbBwY19VP9Ccx4AaABAg", "text": "レックウザのステージのプテラまじ強かった", "time": "1 aasta eest", "channel": "UCxUOeopYFDzB_4fYwH9UBvg"} 38 | {"heart": false, "votes": "1", "photo": "https://yt3.ggpht.com/ytc/AAUvwniW8e4q6mDw3IJM8sS3bTQAJ41UqHJs2KAtf08Q=s176-c-k-c0x00ffffff-no-rj", "author": "S S.", "cid": "Ugx-656bRYlT_22jtWp4AaABAg", "text": "ジョイマさんから来ました", "time": "1 aasta eest", "channel": "UC5L0lnYDrgksY_G2BpXpV4w"} 39 | {"heart": false, "votes": "0", "photo": "https://yt3.ggpht.com/ytc/AAUvwni_drgsKpMjqHuuqvE7Y8CP-nuYeB0nozj1kGILQQ=s176-c-k-c0x00ffffff-no-rj", "author": "藤岡さん", "cid": "Ugw9jD_Cc7vIpX-_6vZ4AaABAg", "text": "ありがとう!15年の時を超えてまた聴けるんですね 大好きです", "time": "1 aasta eest", "channel": "UCI_R0A6iVYewLV0NjkAudAg"} 40 | {"heart": false, "votes": "2", "photo": "https://yt3.ggpht.com/ytc/AAUvwnh-Wm76LIoA6MmHvVmRgdGsmu3-PUQWCn3WLy6D=s176-c-k-c0x00ffffff-no-rj", "author": "ポッポ", "cid": "UgwOW_8jBmBZzdqZsEh4AaABAg", "text": "DXでまた聴けるといいな\nこことてんくうのとうと逃避行のBGM大好き", "time": "1 aasta eest", "channel": "UCq3fkAPqXCoUUGa6UIv5JDQ"} 41 | {"heart": false, "votes": "8", "photo": "https://yt3.ggpht.com/ytc/AAUvwnggdeAx6ZjgdqFVTdrSN_1xk9wzuYZtjBz8iFvh=s176-c-k-c0x00ffffff-no-rj", "author": "ポンポンたぬき", "cid": "UgxroQOacCW7NswgQTZ4AaABAg", "text": "おおいなる峡谷のbgmはおおいなる峡谷でしか聴けないんだよねぇ", "time": "1 aasta eest", "channel": "UCYB_JNDXI_E6hzJ334NU2qA"} 42 | {"heart": false, "votes": "8", "photo": "https://yt3.ggpht.com/ytc/AAUvwngYahSfM0I-3Vp7eriwYNPatia-QhJ_6tG6LlMsMQ=s176-c-k-c0x00ffffff-no-rj", "author": "ことら", "cid": "Ugx3EEmkLgvRvUhqueV4AaABAg", "text": "ここと炎の山と天空の塔がDXでどうアレンジされるのかが楽しみで待ち遠しいです…!", "time": "1 aasta eest", "channel": "UCrUOszIzAy3HQCD5ojjNejw"} 43 | {"heart": false, "votes": "5", "photo": "https://yt3.ggpht.com/ytc/AAUvwnigvYRmgDQqWhq8v3lZr2edsz4KE1CHMcUTfM_lRQ=s176-c-k-c0x00ffffff-no-rj", "author": "世界の変態者 アナるマデドン", "cid": "UgyppoBQtmHUkRh2f3t4AaABAg", "text": "神BGM、神ストーリー、神ゲームシステム、ゴミクソウンコタレドアホパラセクト…\nこれ子供向けのゲームのレベルを超えてるゾ", "time": "1 aasta eest", "channel": "UC-rqhfWNmvmKRHEG2qyUmsg"} 44 | {"heart": false, "votes": "0", "photo": "https://yt3.ggpht.com/ytc/AAUvwniA8ZjSBEqTWSv-gZzTNKzAddEdgHG6f3z6wgkaUg=s176-c-k-c0x00ffffff-no-rj", "author": "ほし竹内", "cid": "UgxFREx8_bwVJ0iIvbF4AaABAg.8nRg06Rs4Hi8w_PlWre1-Z", "text": " @べす  \n返事遅なってしまいすみません!\nあーあやしい森は草タイプが出てきますからねー私はマグマのちていで苦戦しましたね(゜Д゜)", "time": "1 aasta eest", "channel": "UCwvV9xZnTd-Cx_1d78Oi5dw"} 45 | {"heart": false, "votes": "1", "photo": "https://yt3.ggpht.com/ytc/AAUvwngvIXh2G4scKbi_fkhmXsowo96WpRRdI8DsufzXhw=s176-c-k-c0x00ffffff-no-rj", "author": "べす", "cid": "UgxFREx8_bwVJ0iIvbF4AaABAg.8nRg06Rs4Hi8rZ2bnDLFPJ", "text": " @ほし竹内  わたしは青の救助隊で、確かゼニガメでした‥草タイプの子にやられまくりましたね〜笑", "time": "2 aasta eest", "channel": "UCO90dndfXL9VIhOyDL9BzLQ"} 46 | {"heart": false, "votes": "0", "photo": "https://yt3.ggpht.com/ytc/AAUvwniA8ZjSBEqTWSv-gZzTNKzAddEdgHG6f3z6wgkaUg=s176-c-k-c0x00ffffff-no-rj", "author": "ほし竹内", "cid": "UgxFREx8_bwVJ0iIvbF4AaABAg.8nRg06Rs4Hi8rYfyqI62zX", "text": " @べす  \n凄い!未だに残ってたりしますよねー私はヒトカゲでしたよ!赤の救助隊でした", "time": "2 aasta eest", "channel": "UCwvV9xZnTd-Cx_1d78Oi5dw"} 47 | {"heart": false, "votes": "1", "photo": "https://yt3.ggpht.com/ytc/AAUvwngvIXh2G4scKbi_fkhmXsowo96WpRRdI8DsufzXhw=s176-c-k-c0x00ffffff-no-rj", "author": "べす", "cid": "UgxFREx8_bwVJ0iIvbF4AaABAg.8nRg06Rs4Hi8rWUYXPmjeW", "text": " @ほし竹内  懐かしいですよね〜。効果音頭の中で再生できるんだけど‥笑", "time": "2 aasta eest", "channel": "UCO90dndfXL9VIhOyDL9BzLQ"} 48 | {"heart": false, "votes": "0", "photo": "https://yt3.ggpht.com/ytc/AAUvwniA8ZjSBEqTWSv-gZzTNKzAddEdgHG6f3z6wgkaUg=s176-c-k-c0x00ffffff-no-rj", "author": "ほし竹内", "cid": "UgxFREx8_bwVJ0iIvbF4AaABAg.8nRg06Rs4Hi8rVhW8Gq9TR", "text": "懐かしいね!ヤミカラスのおいうちは嫌いだった", "time": "2 aasta eest", "channel": "UCwvV9xZnTd-Cx_1d78Oi5dw"} 49 | {"heart": false, "votes": "0", "photo": "https://yt3.ggpht.com/ytc/AAUvwngvIXh2G4scKbi_fkhmXsowo96WpRRdI8DsufzXhw=s176-c-k-c0x00ffffff-no-rj", "author": "べす", "cid": "UgxFREx8_bwVJ0iIvbF4AaABAg.8nRg06Rs4Hi8qj70EeEe_K", "text": "ねむりごな?どくのこな?もされてウワッてなったなぁ\nあとはねられてぶつかって-5ダメージも嫌だったなぁ", "time": "2 aasta eest", "channel": "UCO90dndfXL9VIhOyDL9BzLQ"} 50 | {"heart": false, "votes": "4", "photo": "https://yt3.ggpht.com/ytc/AAUvwngn5qOa2g-3EebSNQ_IoLA7_kn4pSmvIea0Y8sc=s176-c-k-c0x00ffffff-no-rj", "author": "らむむ", "cid": "UgxvN10S5fjHbJB9MAt4AaABAg.8pmYbJoYz2u8po1u07KDpR", "text": "Makito ほんとどっちも良い曲ですよね。ジョイマさんの笑いのセンスもピカイチでポケダンファンには堪らないです、、、", "time": "2 aasta eest", "channel": "UCoTLl9KEclFDXCiRXXsMRUg"} 51 | {"heart": false, "votes": "4", "photo": "https://yt3.ggpht.com/ytc/AAUvwniRiQW0ToKYEFJRuDqnlrP2c8T604-T4Vr4PihY=s176-c-k-c0x00ffffff-no-rj", "author": "Makito", "cid": "UgxvN10S5fjHbJB9MAt4AaABAg.8pmYbJoYz2u8po-p6QNfgq", "text": "同じく。原曲の安心感とジョイマさんの遊び心…\nうーん、どっちも良くて選べないよ←", "time": "2 aasta eest", "channel": "UC424kW_13Zu1xeTOTpv5tvQ"} 52 | {"heart": false, "votes": "0", "photo": "https://yt3.ggpht.com/ytc/AAUvwniJuDgcJSeaMpJia0lIQORf3aLCKZNIUtXH6qLt=s176-c-k-c0x00ffffff-no-rj", "author": "カ・リ・フラワー", "cid": "UgwQpjghyreCyo6bYiF4AaABAg.8po0P3e0_kB9GOayCjBjxp", "text": "地獄の布教", "time": "4 kuu eest", "channel": "UCzWt4uFFwMeOfMp0xb9ILfQ"} 53 | {"heart": false, "votes": "0", "photo": "https://yt3.ggpht.com/ytc/AAUvwngWUuU5e92AVh3tyhAdJDQKqhKX_aMD73DYf1Q=s176-c-k-c0x00ffffff-no-rj", "author": "Dabsol", "cid": "UgzY65vqyM6ekg9htLx4AaABAg.8yHIhYgPVmA960w37pG1NR", "text": "Marcel Schneider same", "time": "1 aasta eest", "channel": "UCn_v1ZI7NWDI0-zbEPomvyw"} 54 | {"heart": false, "votes": "0", "photo": "https://yt3.ggpht.com/ytc/AAUvwng0iE4IDKaei0F6_F7TmEDOWcAk6wcOe2xjznI4=s176-c-k-c0x00ffffff-no-rj", "author": "玉田巻", "cid": "UgxroQOacCW7NswgQTZ4AaABAg.93jS2dPrxWx9LHwKncsX6x", "text": "間違ったこと言ってないのに小泉進次郎を思い出す", "time": "1 nädala eest", "channel": "UCGyfgXuh4ouK4ODQVWe4LFQ"} 55 | {"heart": false, "votes": "19", "photo": "https://yt3.ggpht.com/ytc/AAUvwnj_PfQggdfy_tJZU2FI6P9OLd1rTPVSy_QXCvUkWw=s176-c-k-c0x00ffffff-no-rj", "author": "らんぢぶのさぶあか", "cid": "UghYJaikgfMJD3gCoAEC", "text": "ポケダン超でアレンジされて流れたのは驚いたな", "time": "5 aasta eest", "channel": "UC2Hi2QtnEuphB9G2G92Li7Q"} 56 | {"heart": false, "votes": "16", "photo": "https://yt3.ggpht.com/ytc/AAUvwngfPC3EO_zoNPmsWJixWWeCkQu5X7JArNs-6ZDuWQ=s176-c-k-c0x00ffffff-no-rj", "author": "えすてぃー", "cid": "UggCSkYNjsYXHngCoAEC", "text": "こんなに良曲だったのかw", "time": "5 aasta eest", "channel": "UCGlb5G1IB74kukPMEYDMUMg"} 57 | {"heart": false, "votes": "37", "photo": "https://yt3.ggpht.com/ytc/AAUvwnjBG84WIINhFS7JDTL5HwhnOGDUZZLvzOdtZ48vRQ=s176-c-k-c0x00ffffff-no-rj", "author": "レイア", "cid": "UgjzpK1djd1K93gCoAEC", "text": "確か主人公がポケモンになった理由を知るためにネイティオに会う時のダンジョンですよね。キュウコンの祟りとかなんちゃら…発売当時、私は中学生かぁ。時間の流れって早いものですね。", "time": "5 aasta eest", "channel": "UC9j7AzMdKFhRhka9CTQH4nw"} 58 | {"heart": false, "votes": "18", "photo": "https://yt3.ggpht.com/ytc/AAUvwniYTXqbLzRnlMdDLoAGX86l_j1FoJ71OYTIunho1Q=s176-c-k-c0x00ffffff-no-rj", "author": "雨ば", "cid": "Ugg1tYadbNK3dngCoAEC", "text": "とっても面白かったなぁ\nまだ小さい頃だったから難しかったけど楽しめた作品だった。bgmもとてもいいのばかりだったしストーリーもしっかりしてた。必死になってプレイしてたのを覚えてる", "time": "4 aasta eest", "channel": "UCt1MVhiwcRkqybEyohdsYdw"} 59 | {"heart": false, "votes": "7", "photo": "https://yt3.ggpht.com/ytc/AAUvwniTihe6-vroU5QwqXJuU6kCR49t4MYUrisMoUS0=s176-c-k-c0x00ffffff-no-rj", "author": "アヌビス金澤", "cid": "UgiejGeNNbJ0e3gCoAEC", "text": "確かにいい曲です!\nそれに、ポケ超ダンにも流れていたなんて、驚きです!", "time": "4 aasta eest", "channel": "UCRXxTTpNeYaKfVO__8x75ZQ"} 60 | {"heart": false, "votes": "10", "photo": "https://yt3.ggpht.com/ytc/AAUvwngfXxZ7YS27oVCw-dyqHPYRsgwk8d7YUscH8YM=s176-c-k-c0x00ffffff-no-rj", "author": "Opportunityオパチュニティー", "cid": "Ughn_hcjrM7JgngCoAEC", "text": "今聴くとナバルデウスのbgmにも似てるw\nここ好きだったな〜", "time": "4 aasta eest", "channel": "UClqCKYLtv_v5H5cKq92z7Hw"} 61 | {"heart": false, "votes": "3", "photo": "https://yt3.ggpht.com/ytc/AAUvwnjRFo-hK_HBQo071nZopiL89KZ6-twdL2H-zdAN=s176-c-k-c0x00ffffff-no-rj", "author": "ntmusic", "cid": "UghuGn6ARg4Il3gCoAEC", "text": "upに感謝です(^^)", "time": "3 aasta eest", "channel": "UCiJ2WGRofluSnEm_WZ533-w"} 62 | {"heart": false, "votes": "0", "photo": "https://yt3.ggpht.com/ytc/AAUvwnhl0z6bE42CdExuidAyqv1Af_fA0JpWZcD7GYOM=s176-c-k-c0x00ffffff-no-rj", "author": "Yohry", "cid": "UghNE2n-wub4iHgCoAEC", "text": "なっっっつぅーー!!!", "time": "3 aasta eest", "channel": "UC4CBiktJgtSoMXgxvcqCjFw"} 63 | {"heart": false, "votes": "51", "photo": "https://yt3.ggpht.com/ytc/AAUvwnj2ujmoVmLSA95IJ6j7ROQYNG9P5necCq8O9WQ=s176-c-k-c0x00ffffff-no-rj", "author": "poke tage", "cid": "UghhadLk5QUFTHgCoAEC", "text": "苦労して頂上まで登ったあとのネイティオと夕焼けが本当に良い味だしてるんだよな", "time": "3 aasta eest", "channel": "UCP_p1H1GXpsQuHf4VtYDrvg"} 64 | {"heart": false, "votes": "1", "photo": "https://yt3.ggpht.com/ytc/AAUvwnjIzgB8lg_HSiK-YGe3_4iji1SzBJ8r0zXNTbJc=s176-c-k-c0x00ffffff-no-rj", "author": "カレるん", "cid": "UgzfWsYemshq64huMfB4AaABAg", "text": "初見でやった時、なんかノリでサンダー倒せて、ここもクリアできたけどファイアーで詰んだ", "time": "3 aasta eest", "channel": "UCxClFRzorYmEBLC4out4PMw"} 65 | {"heart": false, "votes": "4", "photo": "https://yt3.ggpht.com/ytc/AAUvwnhH3_miekekhATKx8Q1KgmqrnSLFby-rodgSCVe=s176-c-k-c0x00ffffff-no-rj", "author": "ラキチヨの色ラティオス", "cid": "UgyTdi-VZ4jXEbyc8ax4AaABAg", "text": "これほんとすこ", "time": "3 aasta eest", "channel": "UCM-Ox25pG_qxetJi_eN4Ktw"} 66 | {"heart": false, "votes": "2", "photo": "https://yt3.ggpht.com/ytc/AAUvwniX7_Gd5QwuW9327qIADqIy5nE3_B22VOp_8A=s176-c-k-c0x00ffffff-no-rj", "author": "Y T", "cid": "Ugy7pCInM55qEk7uObZ4AaABAg", "text": "曲に併せて歌作れそう", "time": "3 aasta eest", "channel": "UCGvMPLKz3eC0z2v1CjXFdSg"} 67 | {"heart": false, "votes": "10", "photo": "https://yt3.ggpht.com/ytc/AAUvwnguDUDiVbH_Oz9JfIDZli6zvd691R7DOAuUmB2c=s176-c-k-c0x00ffffff-no-rj", "author": "、、", "cid": "UgymSPxQv0zxYuG2mlt4AaABAg", "text": "未だに割と脳内再生される", "time": "3 aasta eest", "channel": "UCvfEFYsCAi_r27WcYe7j6Jw"} 68 | {"heart": false, "votes": "3", "photo": "https://yt3.ggpht.com/ytc/AAUvwngftfL77HZHovGMcc9BkbaZDaORB2FuEYTcYszhsw=s176-c-k-c0x00ffffff-no-rj", "author": "Ange _la", "cid": "Ugy0jgmtIgNfQp5uZgN4AaABAg", "text": "ありがとう、俺たちのポケモンダンジョン...", "time": "3 aasta eest", "channel": "UC4K1XYbpwIk_NNpLmw6qf_A"} 69 | {"heart": false, "votes": "3", "photo": "https://yt3.ggpht.com/ytc/AAUvwniYhz9GLSJaWcb5V1CVr8XG7wuwovsi6MC8t02X4Q=s176-c-k-c0x00ffffff-no-rj", "author": "ゆあなあらん", "cid": "Ugxg--qLrqCDCjZ93X14AaABAg", "text": "神秘的でファンタジーちっくな雰囲気に惹かれます!", "time": "2 aasta eest", "channel": "UCCAIgURzxxqUXoE7vG0pp-w"} 70 | {"heart": false, "votes": "10", "photo": "https://yt3.ggpht.com/ytc/AAUvwngLkvP9GBlsnxxL9yIGBSUEgBLVTATYATt6qabL=s176-c-k-c0x00ffffff-no-rj", "author": "櫻木澪", "cid": "UgxQ2nVm-ZjW4xXyD8F4AaABAg", "text": "ネイティオ思い出す。。。", "time": "2 aasta eest", "channel": "UC37zxS4mqcaoaV1LlqaSbfA"} 71 | {"heart": false, "votes": "0", "photo": "https://yt3.ggpht.com/ytc/AAUvwnjO3eebKxuYBV34i5i0J-Ar8yx6Td2-Id41vpCAZA=s176-c-k-c0x00ffffff-no-rj", "author": "Jellyfisch. gif", "cid": "UgxUKGVgefi7lUjaTUx4AaABAg", "text": "I don't understand the tittle, can someone tell me? please :)", "time": "2 aasta eest", "channel": "UC2HoPo3W4RX0IOkdPRam8Mw"} 72 | {"heart": false, "votes": "9", "photo": "https://yt3.ggpht.com/ytc/AAUvwnjVm5oTzF-ZAN9fFVLvW59tXbvCmYZoWNHLC625Eg=s176-c-k-c0x00ffffff-no-rj", "author": "CYCLOPS", "cid": "UgzdZ3QPGAZ2BfC3Gst4AaABAg", "text": "この曲すごくね?こんな良曲だったんか", "time": "2 aasta eest", "channel": "UCKdyxdXMRZtKzcbWByz6Sgw"} 73 | {"heart": false, "votes": "2", "photo": "https://yt3.ggpht.com/ytc/AAUvwnhhpf9wVFJXBbGS2lwbHPuzhMxVdCxEV9D0eg=s176-c-k-c0x00ffffff-no-rj", "author": "高燃費ドライバー", "cid": "UgzBNXZzuPMPBhj4evh4AaABAg", "text": "懐かしい。(やったのは赤)\n当時中学生の頃やったけど相当やりこんだうえに名曲多かった。(赤の救助隊もBGMは同じだが音使いが微妙に違う)\nここもその1曲。\nポケダンは初代しかやらんかったけど^^;", "time": "2 aasta eest (muudetud)", "channel": "UCKErikTO--DHhvFcRDsAodQ"} 74 | {"heart": false, "votes": "0", "photo": "https://yt3.ggpht.com/ytc/AAUvwngncRu7SBwqa3GFHc3h7REWYMula8xL_ZaoMQU7XA=s176-c-k-c0x00ffffff-no-rj", "author": "檎林", "cid": "UgzMVAakKRX7bdqA5w54AaABAg", "text": "ネイティオ思い出す", "time": "2 aasta eest", "channel": "UC44jRoQMYgJXJ6uWdbHinjQ"} 75 | {"heart": false, "votes": "1", "photo": "https://yt3.ggpht.com/ytc/AAUvwnizmNk-BoAWICTJlIdDYx2Cm2b7DVXnGFDBmv65tA=s176-c-k-c0x00ffffff-no-rj", "author": "燼瀬くん。", "cid": "UghYJaikgfMJD3gCoAEC.84O_wJAcbLd8gTqUl20dIb", "text": "かなり遅めにコメするけど、確かに!", "time": "2 aasta eest", "channel": "UCO212Rk2cCom3HjbJFrtgng"} 76 | {"heart": false, "votes": "1", "photo": "https://yt3.ggpht.com/ytc/AAUvwnjLj7SDhjwEY4ZAxvBAnXkVwwBZtQIJRw4ys9Nj=s176-c-k-c0x00ffffff-no-rj", "author": "ethine2111", "cid": "UghYJaikgfMJD3gCoAEC.84O_wJAcbLd7-yLK0e0ZZE", "text": "マジか!今やってるけどまだ聞いてないから楽しみだ!", "time": "5 aasta eest", "channel": "UCD7VnL79tGvP3W2uzlXxdAA"} 77 | {"heart": false, "votes": "2", "photo": "https://yt3.ggpht.com/ytc/AAUvwng5TWicj7wv5lFk_1V9vXIESOYIBijkjNk0yQ=s176-c-k-c0x00ffffff-no-rj", "author": "神李凪", "cid": "UghYJaikgfMJD3gCoAEC.84O_wJAcbLd7-R2vPeE3VW", "text": "それなw\n久々に聞いて鳥肌たったw", "time": "5 aasta eest", "channel": "UCkzmOgPkzY4l9-4Zu1LtYYg"} 78 | {"heart": false, "votes": "2", "photo": "https://yt3.ggpht.com/ytc/AAUvwni_drgsKpMjqHuuqvE7Y8CP-nuYeB0nozj1kGILQQ=s176-c-k-c0x00ffffff-no-rj", "author": "藤岡さん", "cid": "UgjzpK1djd1K93gCoAEC.87290RqP2Gl8z5RNrtMSOa", "text": "チネとか言っちゃダメですよ、おおいなるきょうこくのBGMを聞いてゆっくりしましょう", "time": "1 aasta eest", "channel": "UCI_R0A6iVYewLV0NjkAudAg"} 79 | {"heart": false, "votes": "2", "photo": "https://yt3.ggpht.com/ytc/AAUvwnhhpf9wVFJXBbGS2lwbHPuzhMxVdCxEV9D0eg=s176-c-k-c0x00ffffff-no-rj", "author": "高燃費ドライバー", "cid": "UgjzpK1djd1K93gCoAEC.87290RqP2Gl8jjL_hbD_Lq", "text": "自分も中学生やったよ。\n救助隊シリーズは初代の赤だけやったけど。\n妹は青でした。", "time": "2 aasta eest", "channel": "UCKErikTO--DHhvFcRDsAodQ"} 80 | {"heart": false, "votes": "1", "photo": "https://yt3.ggpht.com/ytc/AAUvwnhPL7XwUBxc-WNwH-dVxTLHg9lM9nDYgyE9XDeo=s176-c-k-c0x00ffffff-no-rj", "author": "トッホーー", "cid": "UgjzpK1djd1K93gCoAEC.87290RqP2Gl8ew75YJ7Y8n", "text": "ぼくは、小学一年生", "time": "2 aasta eest", "channel": "UC4mOtrh1Yu1r9BBI6XngcwA"} 81 | {"heart": false, "votes": "1", "photo": "https://yt3.ggpht.com/ytc/AAUvwngtTPvZpvfXlGnRM0qfPsfkBUJifAEK5UJWiw=s176-c-k-c0x00ffffff-no-rj", "author": "齋藤侑", "cid": "UgjzpK1djd1K93gCoAEC.87290RqP2Gl8SQOqjfQxB6", "text": "俺は小2だった", "time": "3 aasta eest", "channel": "UCPV6N-J4bPhVk0Dz_sgTD3g"} 82 | {"heart": false, "votes": "19", "photo": "https://yt3.ggpht.com/ytc/AAUvwngm1N_sq3OFSsTDHxi6XaHp2oIsyU3K0IBXvQ=s176-c-k-c0x00ffffff-no-rj", "author": "Block", "cid": "UgjzpK1djd1K93gCoAEC.87290RqP2Gl8DRrwHYLK4U", "text": "僕は幼稚園児でした。父がやってるのを見てるだけでしたが何故かすごく心に残っています。父もきっと今は天空の塔から僕がこのゲームをしているところを見ているでしょう。", "time": "4 aasta eest", "channel": "UClf9HQ4CjcPpN2D3I5Cdaiw"} 83 | {"heart": false, "votes": "0", "photo": "https://yt3.ggpht.com/ytc/AAUvwng0iE4IDKaei0F6_F7TmEDOWcAk6wcOe2xjznI4=s176-c-k-c0x00ffffff-no-rj", "author": "玉田巻", "cid": "UghhadLk5QUFTHgCoAEC.8USBCdCtI7X9LHwDlGOTPq", "text": "ネイティオと夕焼けみたいなアイコン", "time": "1 nädala eest", "channel": "UCGyfgXuh4ouK4ODQVWe4LFQ"} 84 | {"heart": false, "votes": "0", "photo": "https://yt3.ggpht.com/ytc/AAUvwniGTs0ivekVc944k8FFl5NufV3uIXUOzqUdRVqn=s176-c-k-c0x00ffffff-no-rj", "author": "ひじき王子", "cid": "UgxUKGVgefi7lUjaTUx4AaABAg.8iTInQOnjIz8oZ8cXOjgEz", "text": "Godie. Gif \nit means \"The Great Canyon\"", "time": "2 aasta eest", "channel": "UCmAwxJoCe_BZhCZgQ9Aj81Q"} 85 | {"heart": false, "votes": "6", "photo": "https://yt3.ggpht.com/ytc/AAUvwngE_Mv8GzzCr8w0y6rFG6xPB0Iqp7Rykvi9re_84w=s176-c-k-c0x00ffffff-no-rj", "author": "Bespinben", "cid": "UgwPnTj7zUJGsDkSrF94AaABAg", "text": "The slight reverb enhances the beauty of this amazing track even more.", "time": "8 aasta eest", "channel": "UCwZ6uWSeMe3eW44h2DpRlfA"} 86 | {"heart": false, "votes": "119", "photo": "https://yt3.ggpht.com/ytc/AAUvwniNi2HA2BxBvGW8kDF9U3yuwbsoN4XCvFzfgQ=s176-c-k-c0x00ffffff-no-rj", "author": "taia777", "cid": "UgxX-A7oj1BGHXnipgx4AaABAg", "text": "Thank you for a comment.\nI'm using two reverbs and noise reduction.The medium reverb processing strings,chorus,timpani,flute and marimba parts.The slight reverb processing Percussions and synth lead parts.The noise reduction processing flute and triangle parts.And treble in synth bass part filtering because it's noise on treble in this track.\nAnd I processed and controlled many others.", "time": "8 aasta eest", "channel": "UCkVo7eqym1ZX2A9-GabEXrw"} 87 | {"heart": false, "votes": "6", "photo": "https://yt3.ggpht.com/ytc/AAUvwngE_Mv8GzzCr8w0y6rFG6xPB0Iqp7Rykvi9re_84w=s176-c-k-c0x00ffffff-no-rj", "author": "Bespinben", "cid": "Ugzv6fwer_eOHTb27WB4AaABAg", "text": "I should try learning about that audio manipulation stuff sometime :) Seems like one could do some very cool things with the right knowledge (as shown by your video here).", "time": "8 aasta eest", "channel": "UCwZ6uWSeMe3eW44h2DpRlfA"} 88 | {"heart": false, "votes": "25", "photo": "https://yt3.ggpht.com/ytc/AAUvwng0Z1h4GvaBF8OrJl4WKNRF3gI81B-SIMoWUV-B=s176-c-k-c0x00ffffff-no-rj", "author": "Another good", "cid": "UgiFSCG5xIWHoHgCoAEC", "text": "なんか何かを探して旅してるみたい", "time": "7 aasta eest", "channel": "UCaBwaFVdnXyFTArYgScIdyA"} 89 | {"heart": false, "votes": "16", "photo": "https://yt3.ggpht.com/ytc/AAUvwngnBweQbtBxtv7FK5i74PJUy2aTLbQYiB6zNyQT0g=s176-c-k-c0x00ffffff-no-rj", "author": "川越海里", "cid": "Uggaf5dFmzN5MngCoAEC", "text": "最後の雲のステージで積んで止めたのを思い出すなあ・・・", "time": "5 aasta eest", "channel": "UCNWGhLDg4dRfIu-Zf-2WWXQ"} 90 | {"heart": false, "votes": "1", "photo": "https://yt3.ggpht.com/ytc/AAUvwngczN8tPFk9bcokGA0yV_eDqqE487hLEEfkwQ=s176-c-k-c0x00ffffff-no-rj", "author": "Maxfield Poizat-Newcomb", "cid": "UgwPnTj7zUJGsDkSrF94AaABAg.8Gc-rkK13n89CEM43_PO7e", "text": " @Darvínos the Great  Thanks for letting me know!", "time": "7 kuu eest", "channel": "UC4r51oDzjJw1nqFYcpQtLww"} 91 | {"heart": false, "votes": "2", "photo": "https://yt3.ggpht.com/ytc/AAUvwnjJrjWGd93UZ4Jqu1EINVUT3TNRwYAYCG_awBFu=s176-c-k-c0x00ffffff-no-rj", "author": "Darvínos the Great", "cid": "UgwPnTj7zUJGsDkSrF94AaABAg.8Gc-rkK13n89CCn5Vn-i2t", "text": " @Maxfield Poizat-Newcomb  Yeah, a while back he posted some Rescue Team DX videos, he's still active", "time": "7 kuu eest", "channel": "UCayifa1aTfF6ACi6WRsSJvQ"} 92 | {"heart": false, "votes": "2", "photo": "https://yt3.ggpht.com/ytc/AAUvwngczN8tPFk9bcokGA0yV_eDqqE487hLEEfkwQ=s176-c-k-c0x00ffffff-no-rj", "author": "Maxfield Poizat-Newcomb", "cid": "UgwPnTj7zUJGsDkSrF94AaABAg.8Gc-rkK13n894nYyPDIUQY", "text": "Hey, there's a good chance that you won't read this but are you still around? I just wanted to thank you for the PMD piano transcriptions that you made a while back. Not that I can play them yet, but it didn't make them any less beautiful.", "time": "1 aasta eest", "channel": "UC4r51oDzjJw1nqFYcpQtLww"} 93 | {"heart": false, "votes": "0", "photo": "https://yt3.ggpht.com/ytc/AAUvwnieRuOPrNYHLLN0z7TCKFCmSi7iJJsLjZvv8XBqhQ=s176-c-k-c0x00ffffff-no-rj", "author": "Gefson Junior", "cid": "UgxX-A7oj1BGHXnipgx4AaABAg.8Gc4g5pGE_O9LgCWyLBWDP", "text": "legend", "time": "3 päeva eest", "channel": "UCtgNXmtXqqfn_h025VqykvQ"} 94 | {"heart": false, "votes": "1", "photo": "https://yt3.ggpht.com/ytc/AAUvwnjydqg4UhWIKlEefFn2j7RgUqVhjSMFmTTP0N6fJrI=s176-c-k-c0x00ffffff-no-rj", "author": "Caballero Caballero Cesar Alejandro", "cid": "UgxX-A7oj1BGHXnipgx4AaABAg.8Gc4g5pGE_O9KjOpkjXzM_", "text": "A legend indeed", "time": "3 nädala eest", "channel": "UCRubpHGnWb6tYWIRnxg7VkQ"} 95 | {"heart": false, "votes": "1", "photo": "https://yt3.ggpht.com/ytc/AAUvwnj3gtW2VvgQG-Jb3m6hlaEsAGhujOuVIRO67aoCmQ=s176-c-k-c0x00ffffff-no-rj", "author": "Dr. Bruh", "cid": "UgxX-A7oj1BGHXnipgx4AaABAg.8Gc4g5pGE_O9FFzU5qMRP4", "text": "Thank you", "time": "5 kuu eest", "channel": "UCyGiP5p6ucU9Evaablg8fyA"} 96 | {"heart": false, "votes": "3", "photo": "https://yt3.ggpht.com/ytc/AAUvwnj9MoF5dtcMBuz1ckh1n5i5lXaXFQqgLMUzqFb1oA=s176-c-k-c0x00ffffff-no-rj", "author": "Heitor De Marchi", "cid": "UgxX-A7oj1BGHXnipgx4AaABAg.8Gc4g5pGE_O9BXVtyquwZc", "text": "i don't know you, but i love you", "time": "8 kuu eest", "channel": "UC3UDrEXFqqe7KQ78_XJE9hg"} 97 | {"heart": false, "votes": "4", "photo": "https://yt3.ggpht.com/ytc/AAUvwnhSWVYduQZVH7gsKMrB_vgwGXNoJQhx67ShL29tQw=s176-c-k-c0x00ffffff-no-rj", "author": "AwesomePow", "cid": "UgxX-A7oj1BGHXnipgx4AaABAg.8Gc4g5pGE_O99nGAQ8zIx3", "text": "Thank you mystery man. Aka God", "time": "9 kuu eest", "channel": "UCpAH4v-UDnKajXpxqdXh5vw"} 98 | {"heart": false, "votes": "15", "photo": "https://yt3.ggpht.com/ytc/AAUvwnihi_a8RVUp_9uNIDb9kzP65dkJQqtFCM3sESkH=s176-c-k-c0x00ffffff-no-rj", "author": "RubyWinter", "cid": "UgxX-A7oj1BGHXnipgx4AaABAg.8Gc4g5pGE_O955DTe_vQLi", "text": "The infamous poster has a comment!", "time": "1 aasta eest", "channel": "UCN8JoAd_3VKIVd8PR4J4UXg"} 99 | {"heart": false, "votes": "0", "photo": "https://yt3.ggpht.com/ytc/AAUvwni3XjVUHV4WDcXNQcY89BhGP9v7IkBryKJOPKZp=s176-c-k-c0x00ffffff-no-rj", "author": "Katakana!", "cid": "UgxX-A7oj1BGHXnipgx4AaABAg.8Gc4g5pGE_O94x3vKlesZt", "text": "Cool!", "time": "1 aasta eest", "channel": "UCrItb19N-ZJllLzJPEOdP4g"} 100 | {"heart": false, "votes": "1", "photo": "https://yt3.ggpht.com/ytc/AAUvwngKLt_5gqS9DRssvweAo3ys5m6LPHUXc07d7FOkpg=s176-c-k-c0x00ffffff-no-rj", "author": "GreenDbz", "cid": "UgxX-A7oj1BGHXnipgx4AaABAg.8Gc4g5pGE_O94f4CaOST72", "text": "😁", "time": "1 aasta eest", "channel": "UC2ytZj-S1Mx4yq3lK_03GhA"} 101 | {"heart": false, "votes": "0", "photo": "https://yt3.ggpht.com/ytc/AAUvwng0iE4IDKaei0F6_F7TmEDOWcAk6wcOe2xjznI4=s176-c-k-c0x00ffffff-no-rj", "author": "玉田巻", "cid": "UgiFSCG5xIWHoHgCoAEC.7-H0Z7-04OZ9LHwHNkLAzt", "text": "中田英寿", "time": "1 nädala eest", "channel": "UCGyfgXuh4ouK4ODQVWe4LFQ"} 102 | -------------------------------------------------------------------------------- /backups/DUsZ-RNET74.json: -------------------------------------------------------------------------------- 1 | {"heart": false, "votes": "12", "photo": "https://yt3.ggpht.com/ytc/AAUvwnjO1qE-WggwsQe_Bf-OAJS5TBlG-39dFgfkuGfD=s176-c-k-c0x00ffffff-no-rj", "author": "The Lemon Master", "cid": "Ugxi4Yo8MqCiDBbdJ9V4AaABAg", "text": "The credits mean you have just accomplished something. You may not know what deed you completed now, but time will tell", "time": "8 kuu eest", "channel": "UCrGS1Jw2jQXDJjpMgGirNAQ"} 2 | {"heart": false, "votes": "4", "photo": "https://yt3.ggpht.com/ytc/AAUvwnhi7AXhqbRRx9GsCOu2DkC8UTw8QU7Ey8Z--M2tLg=s176-c-k-c0x00ffffff-no-rj", "author": "Tinyunknown156 Gaming", "cid": "UgxxG9XWXlvJaRcudL14AaABAg", "text": "Welcome to: the end of the internet", "time": "8 kuu eest", "channel": "UCHS7mG7G8FejYEOkKP-OVFw"} 3 | {"heart": false, "votes": "0", "photo": "https://yt3.ggpht.com/ytc/AAUvwnjraxWjZfnWOeNDGFHtu7u9Wpd3Hmkcm6t1oKaC=s176-c-k-c0x00ffffff-no-rj", "author": "TacoBella", "cid": "UgzYsxfIdGTZWNuFu614AaABAg", "text": "Ahh, the song that plays at the end of your life. The credits!", "time": "8 kuu eest", "channel": "UCmtdBwLBmloSANWQvMP2CuA"} 4 | {"heart": false, "votes": "0", "photo": "https://yt3.ggpht.com/ytc/AAUvwnhwkG7qrtR6qe_N2tW6sMeChkXUU2CGQ6tSASYn3A=s176-c-k-c0x00ffffff-no-rj", "author": "Lavos", "cid": "Ugw9UhbnS0q7b2cJRF14AaABAg", "text": "https://discord.gg/rhdWyeU\nA discord server I discovered which is centered around this “Edge of the Internet” and the taia777 phenomenon\nLike here, everyone has shown themselves to be nice people, all with different experiences in life and problems to work past.\nIf you know these games and songs, or if you don’t, regardless, it’s a nice place to be and the events and other goodies are fun.\nGive it a look!", "time": "8 kuu eest", "channel": "UCBiIZ8RV-V9jWtI670jg0dA"} 5 | {"heart": false, "votes": "2", "photo": "https://yt3.ggpht.com/ytc/AAUvwnjv4KRfs0eYiZUGC7b3VFhKBbfgEMByp3FvXWMJDg=s176-c-k-c0x00ffffff-no-rj", "author": "wii nor", "cid": "UgwnoYOnjTYH5mi3AHd4AaABAg", "text": "End credits of humanity. You won", "time": "7 kuu eest", "channel": "UCuMC03B2yANEMtD4ZG3mYFQ"} 6 | {"heart": false, "votes": "6", "photo": "https://yt3.ggpht.com/ytc/AAUvwnhVepmAWO6JdNe5rK8I8l0ClsS1lhINWI9hlK0z=s176-c-k-c0x00ffffff-no-rj", "author": "Heeby Jeeby", "cid": "UgxDLXt8XsD2if2lq7N4AaABAg", "text": "This is as far as we can go which means only one thing, we made it. The very end of the internet, at last. It's been a long journey but we finally stand at the very edge of eternity. Thank for going on this journey with me, all of you are true stars \n\nNow lets watch the credits roll together...\n\n\n\nO W A R I", "time": "7 kuu eest", "channel": "UCGRhS2eA-eLRUWEgDKzUynA"} 7 | {"heart": false, "votes": "3", "photo": "https://yt3.ggpht.com/ytc/AAUvwnh7j0Zxa_cfmklab521LBlBC-zDdJLHpqj-n-Ea=s176-c-k-c0x00ffffff-no-rj", "author": "K.P", "cid": "UgyRDM8HjP1ZdN-BSdt4AaABAg", "text": "finally... my journey is over, it's time to move on\n\npeace at last :-)", "time": "6 kuu eest", "channel": "UC7VF-2Dor-eGSGbsvdqCdLA"} 8 | {"heart": false, "votes": "0", "photo": "https://yt3.ggpht.com/ytc/AAUvwni9rI4SR8jiJFHO1i_vLrRagnpMCUj5GFtFwF_0=s176-c-k-c0x00ffffff-no-rj", "author": "PauloSSBM", "cid": "Ugw2VmzzaZedpzeU-KF4AaABAg", "text": "what game is this", "time": "6 kuu eest", "channel": "UCMzWXA_tn-J4k3rwiw9_9dQ"} 9 | {"heart": false, "votes": "0", "photo": "https://yt3.ggpht.com/ytc/AAUvwnhtwUgHIAsI5KHIwHVKELTrnrXlpF7GBO_6vMc-XQ=s176-c-k-c0x00ffffff-no-rj", "author": "BBQ BBQ", "cid": "Ugx5ZwUROPYc34Dm4Ax4AaABAg", "text": "How do you like Wednesday?", "time": "6 kuu eest", "channel": "UCIlgi7uk5GrZlOjN3lZYl6A"} 10 | {"heart": false, "votes": "5", "photo": "https://yt3.ggpht.com/ytc/AAUvwnggNFEB8ZXhQYf-W1QfWczBW0iT6EpdJDWUzoK0Ag=s176-c-k-c0x00ffffff-no-rj", "author": "David’s Main Account • Top Secret!", "cid": "Ugyrh4ubMSPrMPQV5PN4AaABAg", "text": "You’re in the heart of the void. You feel a pull back to the horrid reality that placed you there, but for the moment you are safe. My journey still lies here, but yours is back out there. Good luck to you.", "time": "6 kuu eest", "channel": "UC4BhDLqff08UuRboAYB0n9g"} 11 | {"heart": false, "votes": "1", "photo": "https://yt3.ggpht.com/ytc/AAUvwniXooDrDGw9zokZtYbaQaL_7cqixIZfUwqDXlv0Kg=s176-c-k-c0x00ffffff-no-rj", "author": "Luna Dawson", "cid": "UgwaLU1qcheeQ3TOGFB4AaABAg", "text": "This is the ending", "time": "6 kuu eest", "channel": "UCanX-PThSnr8Mp8ihGRAazw"} 12 | {"heart": false, "votes": "0", "photo": "https://yt3.ggpht.com/ytc/AAUvwngHJqrrvZ4keslvCpGxtJBLJwpJi_BmaGX5eFfXgg=s176-c-k-c0x00ffffff-no-rj", "author": "The Commenter abc", "cid": "Ugyohxg8kV3xHl-UkFV4AaABAg", "text": "Aw. The end.", "time": "5 kuu eest (muudetud)", "channel": "UC4s5_lN5Y-NoMUeHd7rNkiA"} 13 | {"heart": false, "votes": "0", "photo": "https://yt3.ggpht.com/ytc/AAUvwnj2C2Ol64xjHLXU0ruB8va4GYlVpwNJE5ez_8pcig=s176-c-k-c0x00ffffff-no-rj", "author": "EPIXX", "cid": "UgxhYXOW36E4-1y6uFZ4AaABAg", "text": "The 54/54 comment. I hope to discover something like this again, and I hope you do too", "time": "5 kuu eest", "channel": "UC8_D-Et40An9Eo3kZCUomuw"} 14 | {"heart": false, "votes": "0", "photo": "https://yt3.ggpht.com/ytc/AAUvwngYbJcNFU7XtjshjcMCMcW6L1qY8VrsxpxJehKcQg=s176-c-k-c0x00ffffff-no-rj", "author": "George McDonald", "cid": "UgxF_5kTPWIwTY00c1V4AaABAg", "text": "I did it.", "time": "4 kuu eest", "channel": "UC2V7KldYDGZeQp0dj0KGhKg"} 15 | {"heart": false, "votes": "1", "photo": "https://yt3.ggpht.com/ytc/AAUvwngYbJcNFU7XtjshjcMCMcW6L1qY8VrsxpxJehKcQg=s176-c-k-c0x00ffffff-no-rj", "author": "George McDonald", "cid": "UgwJS5tAKZTVyUiV3oh4AaABAg", "text": "57th comment if that means much", "time": "4 kuu eest", "channel": "UC2V7KldYDGZeQp0dj0KGhKg"} 16 | {"heart": false, "votes": "0", "photo": "https://yt3.ggpht.com/ytc/AAUvwniuK7OBrXb0xM2AI_Mrb53Dq0Xq20vAIcUYmw=s176-c-k-c0x00ffffff-no-rj", "author": "m m", "cid": "Ugwnso6t3fhehdYpuAx4AaABAg", "text": "You found it, the deepest nook of youtube, congratulations. No check point is needed, this is the end.", "time": "1 kuu eest", "channel": "UC8Se04tT8QrezCZ9dm6ykIQ"} 17 | {"heart": false, "votes": "0", "photo": "https://yt3.ggpht.com/ytc/AAUvwnjr6cB6LokuAElm_RKozsmolrCNcB8adHkbr2qPFA=s176-c-k-c0x00ffffff-no-rj", "author": "Ethereal", "cid": "UgzaSFsa4CgHAgSoEFd4AaABAg", "text": "Sp is this the ending theme to your channel", "time": "1 kuu eest", "channel": "UC6yuaeidnhRkXO_4FEv5Xog"} 18 | {"heart": false, "votes": "1", "photo": "https://yt3.ggpht.com/ytc/AAUvwni-smiS9YVVhY8BIIyG1JO0sfhpngaW-n2WxNJoiQ=s176-c-k-c0x00ffffff-no-rj", "author": "Me", "cid": "UgyYz9oobgDyeOZS84x4AaABAg", "text": "I've made to the end, \nand now it's time to rest", "time": "1 kuu eest", "channel": "UCfBeDFy2fNZiewyJ50s12Rw"} 19 | {"heart": false, "votes": "0", "photo": "https://yt3.ggpht.com/ytc/AAUvwnjdtej2LbgkJE-jXZBbLnw4vZcTvaoreLnY7348jw=s176-c-k-c0x00ffffff-no-rj", "author": "cactuscarrot", "cid": "UgwNZK5xb2qWaYFlIfx4AaABAg", "text": "oh nice. the credits.", "time": "1 kuu eest", "channel": "UClKdsaaQxmvuvbBjoTaV8Iw"} 20 | {"heart": false, "votes": "0", "photo": "https://yt3.ggpht.com/ytc/AAUvwniGY32Wf5-1MZ3k_WOIZHAtuB1tgOyjG25sqt1vKA=s176-c-k-c0x00ffffff-no-rj", "author": "Something Sort Of Original", "cid": "UgyJRhDPZxT4ZaNyq_x4AaABAg", "text": "Everybody in the comments of a random video commenting either wholesome stuff or something to do with checkpoints because they were here for the internet checkpoint, although this video has nothing to do with it otherwise.", "time": "1 nädala eest", "channel": "UC7aEenJENYTqeQ9l-a-wfng"} 21 | {"heart": false, "votes": "1", "photo": "https://yt3.ggpht.com/ytc/AAUvwnitX7x95d-IQW3iemGDUqt6pO0zuRaFr7_u_b5-=s176-c-k-c0x00ffffff-no-rj", "author": "Yan", "cid": "UgwnoYOnjTYH5mi3AHd4AaABAg.9ChuWklRvWK9HC65yvhBYf", "text": "OH MY GOD!", "time": "3 kuu eest", "channel": "UCH2GySJiVpeYi33h0sAJSgw"} 22 | {"heart": false, "votes": "0", "photo": "https://yt3.ggpht.com/ytc/AAUvwniXooDrDGw9zokZtYbaQaL_7cqixIZfUwqDXlv0Kg=s176-c-k-c0x00ffffff-no-rj", "author": "Luna Dawson", "cid": "UgwaLU1qcheeQ3TOGFB4AaABAg.9EO9nI2kn4e9FCtZsS3c90", "text": " @JuaffreBlumpkins  i honestly dont know why thats my background lmao", "time": "5 kuu eest", "channel": "UCanX-PThSnr8Mp8ihGRAazw"} 23 | {"heart": false, "votes": "0", "photo": "https://yt3.ggpht.com/ytc/AAUvwniXooDrDGw9zokZtYbaQaL_7cqixIZfUwqDXlv0Kg=s176-c-k-c0x00ffffff-no-rj", "author": "Luna Dawson", "cid": "UgwaLU1qcheeQ3TOGFB4AaABAg.9EO9nI2kn4e9FCs58O9Xsq", "text": " @JuaffreBlumpkins  ayyeee thanks🥰", "time": "5 kuu eest", "channel": "UCanX-PThSnr8Mp8ihGRAazw"} 24 | {"heart": false, "votes": "1", "photo": "https://yt3.ggpht.com/ytc/AAUvwngWWKR_QkvxrjCWESUXkxknW_ZXB1uhh1Zg1apG=s176-c-k-c0x00ffffff-no-rj", "author": "NOK Conviction", "cid": "UgybITiXpDx13UxV-IN4AaABAg", "text": "とてもいい曲ですね。", "time": "7 aasta eest", "channel": "UCp4tW7oZm8zczPLAxu0JECw"} 25 | {"heart": false, "votes": "8", "photo": "https://yt3.ggpht.com/ytc/AAUvwngM-AIyjsPBmHHfqeKaXf5eVROyd42kW8bE7TaQVA=s176-c-k-c0x00ffffff-no-rj", "author": "福田雄太", "cid": "UghxOTyTVOJUK3gCoAEC", "text": "2002よりこっちの方が好き", "time": "6 aasta eest", "channel": "UCglSC2bSw0S0nEFqCHyx5sA"} 26 | {"heart": false, "votes": "6", "photo": "https://yt3.ggpht.com/ytc/AAUvwngfKpeUDGwPIpOrVVDf5dmpgjX0VL4Z3oOagrKSYg=s176-c-k-c0x00ffffff-no-rj", "author": "ムービースタジオ北の鉄道", "cid": "Ugw8_21UixvKpjf4JtJ4AaABAg", "text": "海だあーーーー!\nやったぁーーーー!", "time": "3 aasta eest", "channel": "UCovc-A3hkvTWmBtpkGv9JqA"} 27 | {"heart": false, "votes": "8", "photo": "https://yt3.ggpht.com/ytc/AAUvwniWoepFv--DXjNaTqffyjIpeECwkY9Xrk1slNm1sg=s176-c-k-c0x00ffffff-no-rj", "author": "Shnoz Media", "cid": "UgwsB2OcgcnIxhpPYeh4AaABAg", "text": "Where am u", "time": "1 aasta eest", "channel": "UC2l2VsxqBbEnnXXUG03UEuQ"} 28 | {"heart": false, "votes": "16", "photo": "https://yt3.ggpht.com/ytc/AAUvwnj94efXG-VyCpBhKYsMFj2wQZ1d8iigM5nmZjox=s176-c-k-c0x00ffffff-no-rj", "author": "liuwu", "cid": "Ugx5n7KoBopfNmcUUaB4AaABAg", "text": "boop. now this isn’t what u expected when u clicked on the infamous ~calm~ channel, huh?", "time": "1 aasta eest", "channel": "UCdJ2Ifn8pXKean2n9CDnoLQ"} 29 | {"heart": false, "votes": "3", "photo": "https://yt3.ggpht.com/ytc/AAUvwngOinTK9K4wzpMLMna3uRpLlrTfjHk1V90n0Blghw=s176-c-k-c0x00ffffff-no-rj", "author": "Diablo Da Slaya", "cid": "UgycsHzUrocTCvJyFJR4AaABAg", "text": "I love this", "time": "1 aasta eest", "channel": "UCWePevrdkxF5HTHbhTx4I_A"} 30 | {"heart": false, "votes": "2", "photo": "https://yt3.ggpht.com/ytc/AAUvwnitKh86lVxMKOuUr3mwB0iqoZfGSZVSGGL_MEB05A=s176-c-k-c0x00ffffff-no-rj", "author": "EL STINKO", "cid": "UgwMOGKMMIsPTCFXJPR4AaABAg", "text": "Where are I?", "time": "1 aasta eest", "channel": "UCrUewpEZoqRzP4-05_qIdiA"} 31 | {"heart": false, "votes": "6", "photo": "https://yt3.ggpht.com/ytc/AAUvwnimOtCFsdkY71VScSxPwatIJugdKGlswlL0L_1J=s176-c-k-c0x00ffffff-no-rj", "author": "MILK", "cid": "UgwZ6596gyGahyMNRh54AaABAg", "text": "I don't understand\nbut i like!", "time": "1 aasta eest", "channel": "UCJ_bqgMx5K8-3wT3SKGda0Q"} 32 | {"heart": false, "votes": "14", "photo": "https://yt3.ggpht.com/ytc/AAUvwngVR9IWQ2W_hsmJ-N4_ybFB3dDqjM5g_2ndrDPwUA=s176-c-k-c0x00ffffff-no-rj", "author": "AWanderingTraveler", "cid": "UgwQt3JrI_bOybM4-sV4AaABAg", "text": "So hi, if you are here, congrats, not many made it here and even fewer these days, take a breather before tackling life whether we want to or not...", "time": "10 kuu eest", "channel": "UC-qnIcwhugVIfusQrH5N3Dw"} 33 | {"heart": false, "votes": "8", "photo": "https://yt3.ggpht.com/ytc/AAUvwniv-5UwlOvRA8H3h2flu6oNm_GPcHRdFr8hjAyL=s176-c-k-c0x00ffffff-no-rj", "author": "Romain Roche", "cid": "UgwhrD0mxPzu_Cu9Zc54AaABAg", "text": "The least viewed video of the corner of internet...", "time": "10 kuu eest", "channel": "UCzYpKDsTJ1Wzt717dOleN8A"} 34 | {"heart": false, "votes": "34", "photo": "https://yt3.ggpht.com/ytc/AAUvwnh5rNlxz73YANOdafBYKeTq2lXDcuX9JczwKkbtAw=s176-c-k-c0x00ffffff-no-rj", "author": "Zach Maynes", "cid": "Ugw_J_MrPLZFpF2abvp4AaABAg", "text": "You’ve reached it. The farthest you can go. Your Journey is over.", "time": "10 kuu eest", "channel": "UC-TQU41HqwHoIFqclWGXVSA"} 35 | {"heart": false, "votes": "12", "photo": "https://yt3.ggpht.com/ytc/AAUvwniTig2hN1Q0mjR8M7Zw7CgPzjQJA-3wXiqbuRSwiQ=s176-c-k-c0x00ffffff-no-rj", "author": "Scooby-", "cid": "UgwrXtirr4NAr4Vmf2N4AaABAg", "text": "Title Translate: 1/6 The dream travler (TV ver.)", "time": "10 kuu eest", "channel": "UC7ftmbQFm55vXjMRL9TjlHA"} 36 | {"heart": false, "votes": "2", "photo": "https://yt3.ggpht.com/ytc/AAUvwngysLS4fd3t-cKRywKZ-y_vdIbHBaT_VDd1kI1NpA=s176-c-k-c0x00ffffff-no-rj", "author": "BlimpBoi", "cid": "UgwbTOuvo10JtKQBI_l4AaABAg", "text": "hey guys. just relax.", "time": "10 kuu eest", "channel": "UCvGsu81FL0NWEU_ajADAI1A"} 37 | {"heart": false, "votes": "26", "photo": "https://yt3.ggpht.com/ytc/AAUvwnjS15-aNw9ih-h_uV06PasFUjVKLhcoevHdxvci=s176-c-k-c0x00ffffff-no-rj", "author": "vanzyl 0x45", "cid": "UgxnlwGx4wK6HQ3Xx-p4AaABAg", "text": "Well I made it to Taia777’s least viewed video,\nhow’s it going?", "time": "10 kuu eest", "channel": "UCwpboumLPnkgHWCwg4bbWag"} 38 | {"heart": false, "votes": "5", "photo": "https://yt3.ggpht.com/ytc/AAUvwngqO2Wk6PPlUOcPwNHEPVqrP2hdvD4JoOyfQ2cZlA=s176-c-k-c0x00ffffff-no-rj", "author": "Tw!sty", "cid": "UgyShwZR7gv_JAVjlwZ4AaABAg", "text": "Hey its nice to be 1 of 21 comments... I'm saving here.", "time": "9 kuu eest", "channel": "UCq8Crwf6DBo-qhexAItRVTQ"} 39 | {"heart": false, "votes": "4", "photo": "https://yt3.ggpht.com/ytc/AAUvwnhSWVYduQZVH7gsKMrB_vgwGXNoJQhx67ShL29tQw=s176-c-k-c0x00ffffff-no-rj", "author": "AwesomePow", "cid": "Ugwc8Plcxs_Y3Im46ON4AaABAg", "text": "Is this the secret level's checkpoint? Either way, I've made it!", "time": "9 kuu eest", "channel": "UCpAH4v-UDnKajXpxqdXh5vw"} 40 | {"heart": false, "votes": "15", "photo": "https://yt3.ggpht.com/ytc/AAUvwngAC6brt-6RulwSv3PzWjvXUnurJl-AoqZLlTqJfQ=s176-c-k-c0x00ffffff-no-rj", "author": "pankek senpai", "cid": "UgzvSCrOYl9VORwVDRt4AaABAg", "text": "We have made it to the credits! This is the end of our long journey, would you like to begin a new adventure\nStart new game plus?\n>yes< no", "time": "9 kuu eest (muudetud)", "channel": "UCjxfKtCZHscEAtwlq2gbjSg"} 41 | {"heart": false, "votes": "4", "photo": "https://yt3.ggpht.com/ytc/AAUvwnhhgZMF7QT9pfMfpTaTEOZq0_TaF-9Om5iId1vZ=s176-c-k-c0x00ffffff-no-rj", "author": "Carson The Lad", "cid": "Ugw03AcWKeAlbs3Ohid4AaABAg", "text": "Song highkey slaps. I don't understand why people are spreading hate on this corner of the internet, but just remember that there is more love here than hate. Just sit back, vent if you need to, and listen to these jams, we are here for you.", "time": "9 kuu eest", "channel": "UCKh42a78MbnBL2mOow99jUw"} 42 | {"heart": false, "votes": "6", "photo": "https://yt3.ggpht.com/ytc/AAUvwnin_GoU70PvMij6EcKn9BGivpmhRQW7idyxa_ob=s176-c-k-c0x00ffffff-no-rj", "author": "JobyBabby", "cid": "UgxkSPZ3ob0znw5etEB4AaABAg", "text": "anyone wanna play on hypixel?", "time": "9 kuu eest", "channel": "UCj8izidK4NUPv95BWPnYUXA"} 43 | {"heart": false, "votes": "5", "photo": "https://yt3.ggpht.com/ytc/AAUvwnjHrgsAZRzraPAwzRTBpVbvct6IKHPLTA_qEt9tbA=s176-c-k-c0x00ffffff-no-rj", "author": "yeahyeah", "cid": "UgzVMAW15q5B7khdq-54AaABAg", "text": "These are so mind boggling, why am I always recommended weird shit like this?", "time": "9 kuu eest", "channel": "UCIdEhHssgRQcJqcb1lFgwew"} 44 | {"heart": false, "votes": "2", "photo": "https://yt3.ggpht.com/ytc/AAUvwni2Rzo6ZF00DTDBwJdf5QBp5Fymea_NNCq95fHsaQ=s176-c-k-c0x00ffffff-no-rj", "author": "真一内山", "cid": "Ugw8_21UixvKpjf4JtJ4AaABAg.8WUY6yrURT88uuhw7op0hN", "text": "ジャカジャン!", "time": "1 aasta eest", "channel": "UCuUqVnqphpV0BrGBa8gqxIw"} 45 | {"heart": false, "votes": "0", "photo": "https://yt3.ggpht.com/ytc/AAUvwniuK7OBrXb0xM2AI_Mrb53Dq0Xq20vAIcUYmw=s176-c-k-c0x00ffffff-no-rj", "author": "m m", "cid": "UgwsB2OcgcnIxhpPYeh4AaABAg.9-EeLVoIgPr9JjGx_gTnS_", "text": "Exactly where I need to be.", "time": "1 kuu eest", "channel": "UC8Se04tT8QrezCZ9dm6ykIQ"} 46 | {"heart": false, "votes": "1", "photo": "https://yt3.ggpht.com/ytc/AAUvwniWoepFv--DXjNaTqffyjIpeECwkY9Xrk1slNm1sg=s176-c-k-c0x00ffffff-no-rj", "author": "Shnoz Media", "cid": "UgwsB2OcgcnIxhpPYeh4AaABAg.9-EeLVoIgPr9FmLdI8_YIm", "text": "How", "time": "4 kuu eest", "channel": "UC2l2VsxqBbEnnXXUG03UEuQ"} 47 | {"heart": false, "votes": "1", "photo": "https://yt3.ggpht.com/ytc/AAUvwnhd0maE8D5QmaiqEpIxS6sAi1uErwNFTsj3pj_uyA=s176-c-k-c0x00ffffff-no-rj", "author": "coronaleader", "cid": "UgwsB2OcgcnIxhpPYeh4AaABAg.9-EeLVoIgPr9FmJ9xzy26R", "text": "I’m am hear.", "time": "4 kuu eest", "channel": "UC9sVfGl2-CF43ejbcMB6_Xw"} 48 | {"heart": false, "votes": "3", "photo": "https://yt3.ggpht.com/ytc/AAUvwnh1Y_JhlLQdkFxgHOjjirkmp4Q7yff2Cf7-Aw=s176-c-k-c0x00ffffff-no-rj", "author": "YTIsTakingOverMyLife", "cid": "UgwsB2OcgcnIxhpPYeh4AaABAg.9-EeLVoIgPr95E0b7J1_5L", "text": "where the fuck I am", "time": "1 aasta eest", "channel": "UCnTQGTmrKWXodDJDwywZjfw"} 49 | {"heart": false, "votes": "2", "photo": "https://yt3.ggpht.com/ytc/AAUvwniNG2rbdv6L877cOTPdS8LC6GQ3jitftn9Q7edrww=s176-c-k-c0x00ffffff-no-rj", "author": "em", "cid": "UgwsB2OcgcnIxhpPYeh4AaABAg.9-EeLVoIgPr958eoj6ODfm", "text": "where am u", "time": "1 aasta eest", "channel": "UC7UsPDgRy8cFES_KGQKv0Mw"} 50 | {"heart": false, "votes": "0", "photo": "https://yt3.ggpht.com/ytc/AAUvwngpclZtmD1SJy8Z7yfhvtEcECknzYos_JJeMJ9jDlA=s176-c-k-c0x00ffffff-no-rj", "author": "mewmewlove666", "cid": "Ugx5n7KoBopfNmcUUaB4AaABAg.948wJoc5bSE9BPv_c7unYI", "text": "Holczy jeez why can’t people enjoy themselves? it’s a nice little community of people who just enjoy sharing their stories", "time": "8 kuu eest", "channel": "UCMQw6Gx2gl2q4uYl2AJQGBw"} 51 | {"heart": false, "votes": "0", "photo": "https://yt3.ggpht.com/ytc/AAUvwniv2IQl_FnF_yXz4LXXwn9sbFyDETcCBM7bXlEz=s176-c-k-c0x00ffffff-no-rj", "author": "Holczy", "cid": "Ugx5n7KoBopfNmcUUaB4AaABAg.948wJoc5bSE99lFgBXMq0N", "text": "Well no but at least this comment section isnt polluted by CHECKPOINTS and people thinking they are main characters.", "time": "9 kuu eest", "channel": "UCfqjZ38IXaJWpyPjCbVOmfg"} 52 | {"heart": false, "votes": "0", "photo": "https://yt3.ggpht.com/ytc/AAUvwnimhbcSJCdBuLqBtJ3IJueJZftAVJBjn3bMUd_dEg=s176-c-k-c0x00ffffff-no-rj", "author": "juju", "cid": "Ugx5n7KoBopfNmcUUaB4AaABAg.948wJoc5bSE98qFrfHLkE9", "text": " @Hiro Takkan  Delete your obnoxious comment, cretin. Stop polluting the internet with vapid opinions. Delete your entire fucking account while you're at it.", "time": "10 kuu eest", "channel": "UCfPREGq20t1bvHBOjdxtqCA"} 53 | {"heart": false, "votes": "2", "photo": "https://yt3.ggpht.com/ytc/AAUvwnh71euPUdx4DstniEKOTZdobfidd1ZNoI336Uz5zg=s176-c-k-c0x00ffffff-no-rj", "author": "Sabin Wright", "cid": "Ugx5n7KoBopfNmcUUaB4AaABAg.948wJoc5bSE95bC0D-upxc", "text": " @Hiro Takkan  big yikes", "time": "1 aasta eest", "channel": "UCDU0Tl6vXyIqIOyuU7HYp4g"} 54 | {"heart": false, "votes": "0", "photo": "https://yt3.ggpht.com/ytc/AAUvwngHJqrrvZ4keslvCpGxtJBLJwpJi_BmaGX5eFfXgg=s176-c-k-c0x00ffffff-no-rj", "author": "The Commenter abc", "cid": "Ugw_J_MrPLZFpF2abvp4AaABAg.990l4lziO1S9EwVhLDoM3W", "text": "Sad.", "time": "5 kuu eest", "channel": "UC4s5_lN5Y-NoMUeHd7rNkiA"} 55 | {"heart": false, "votes": "0", "photo": "https://yt3.ggpht.com/ytc/AAUvwnh7j0Zxa_cfmklab521LBlBC-zDdJLHpqj-n-Ea=s176-c-k-c0x00ffffff-no-rj", "author": "K.P", "cid": "Ugw_J_MrPLZFpF2abvp4AaABAg.990l4lziO1S9DR1C4SsqsD", "text": " @Kodama  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "time": "6 kuu eest", "channel": "UC7VF-2Dor-eGSGbsvdqCdLA"} 56 | {"heart": false, "votes": "2", "photo": "https://yt3.ggpht.com/ytc/AAUvwngmb_5OKiYqaskLyU8Dh2T3L8Wr5JH7G38QcIpFpw=s176-c-k-c0x00ffffff-no-rj", "author": "Kodama", "cid": "Ugw_J_MrPLZFpF2abvp4AaABAg.990l4lziO1S9DITFJGGOwh", "text": "And this is to go even further beyond", "time": "6 kuu eest", "channel": "UCGOAXWVWtKyMMVRcooS4mKw"} 57 | {"heart": false, "votes": "2", "photo": "https://yt3.ggpht.com/ytc/AAUvwnjHrgsAZRzraPAwzRTBpVbvct6IKHPLTA_qEt9tbA=s176-c-k-c0x00ffffff-no-rj", "author": "yeahyeah", "cid": "Ugw_J_MrPLZFpF2abvp4AaABAg.990l4lziO1S9AIw_isaxqR", "text": "You underestimate me.", "time": "9 kuu eest", "channel": "UCIdEhHssgRQcJqcb1lFgwew"} 58 | {"heart": false, "votes": "1", "photo": "https://yt3.ggpht.com/ytc/AAUvwniv2IQl_FnF_yXz4LXXwn9sbFyDETcCBM7bXlEz=s176-c-k-c0x00ffffff-no-rj", "author": "Holczy", "cid": "UgzvSCrOYl9VORwVDRt4AaABAg.99qrl3Pj85M9BQNN2JuMFq", "text": "LET THERE BE SOMEONE ELSE THAT SHARES TRUTH AND LOVE", "time": "8 kuu eest", "channel": "UCfqjZ38IXaJWpyPjCbVOmfg"} 59 | {"heart": false, "votes": "0", "photo": "https://yt3.ggpht.com/ytc/AAUvwnhd0maE8D5QmaiqEpIxS6sAi1uErwNFTsj3pj_uyA=s176-c-k-c0x00ffffff-no-rj", "author": "coronaleader", "cid": "Ugw03AcWKeAlbs3Ohid4AaABAg.9AAKMDGNPVG9FmJDFrlWE_", "text": "Yeah, I can’t understand this but I love it", "time": "4 kuu eest", "channel": "UC9sVfGl2-CF43ejbcMB6_Xw"} 60 | {"heart": false, "votes": "4", "photo": "https://yt3.ggpht.com/ytc/AAUvwnggNFEB8ZXhQYf-W1QfWczBW0iT6EpdJDWUzoK0Ag=s176-c-k-c0x00ffffff-no-rj", "author": "David’s Main Account • Top Secret!", "cid": "UgzVMAW15q5B7khdq-54AaABAg.9AIwfil7dAF9EL8BFJrgOf", "text": "this is a checkpoint, a place that you can rest. appreciate it, because it is very, very temporary.", "time": "6 kuu eest", "channel": "UC4BhDLqff08UuRboAYB0n9g"} 61 | -------------------------------------------------------------------------------- /backups/OhmY6Afh2Ec.json: -------------------------------------------------------------------------------- 1 | {"heart": false, "votes": "0", "photo": "https://yt3.ggpht.com/ytc/AAUvwngYahSfM0I-3Vp7eriwYNPatia-QhJ_6tG6LlMsMQ=s176-c-k-c0x00ffffff-no-rj", "author": "ことら", "cid": "Ugz5gUVJ5oDjkTzyNNF4AaABAg", "text": "始めてやった時にファイヤーでつまづいたからここ及び山頂のBGMは非常に印象深い…。\n\n来週発売されるリメイクではどうアレンジされてるか楽しみで待ち遠しいですね!", "time": "1 aasta eest", "channel": "UCrUOszIzAy3HQCD5ojjNejw"} 2 | {"heart": false, "votes": "0", "photo": "https://yt3.ggpht.com/ytc/AAUvwnjo1Reo3zia1IcP8cNU7LaMR4EwjpHe0lwSC2_fTg=s176-c-k-c0x00ffffff-no-rj", "author": "たけ", "cid": "UgywVfl1YmNwuquujSl4AaABAg", "text": "この公式イラスト温もりがあっていいよね。", "time": "11 kuu eest", "channel": "UCRk1FcTNTxlY0TKADSy2Rhg"} 3 | {"heart": false, "votes": "1", "photo": "https://yt3.ggpht.com/ytc/AAUvwnh1WdGQzOzLOeFpBU6OmZ8iudAHb3ZGmrf4rA=s176-c-k-c0x00ffffff-no-rj", "author": "佐渡守NAOTO", "cid": "UgwBESj4IFQQG58CEB94AaABAg", "text": "傾斜のある坂を登る時の脳内bgm", "time": "11 kuu eest", "channel": "UC0Hn5SWZI0tqLLFUz0VE92g"} 4 | {"heart": false, "votes": "13", "photo": "https://yt3.ggpht.com/ytc/AAUvwniTig2hN1Q0mjR8M7Zw7CgPzjQJA-3wXiqbuRSwiQ=s176-c-k-c0x00ffffff-no-rj", "author": "Scooby-", "cid": "Ugy5AlKAZ-1OwrylDIN4AaABAg", "text": "Title Translate: Honoyama \"Pokemon Mysterious Dungeon\"", "time": "10 kuu eest", "channel": "UC7ftmbQFm55vXjMRL9TjlHA"} 5 | {"heart": false, "votes": "2", "photo": "https://yt3.ggpht.com/ytc/AAUvwnhH4mnoWFvuPHoslFe9cOOQYq_m36nubQ-helHh=s176-c-k-c0x00ffffff-no-rj", "author": "TheAmazingTobi", "cid": "UgzDkps1BUrt7tmX5TN4AaABAg", "text": "Chekcpiont(¿): oH D3ar, i\"ve 5tumBLEd 0N a $tRAnge IaND. VVhy Am ¡ ā P0Kem⁰N? oH m¥...", "time": "9 kuu eest", "channel": "UCYEIRAFFY7UuBMG0oV_C_nQ"} 6 | {"heart": false, "votes": "0", "photo": "https://yt3.ggpht.com/ytc/AAUvwniacGykNw9oZEy1Ote0W175tvTN5E7wzl4k0afclg=s176-c-k-c0x00ffffff-no-rj", "author": "kRiNgE", "cid": "Ugyw6lGReOC6fkui26t4AaABAg", "text": "hi guys whats up?", "time": "8 kuu eest", "channel": "UCfcSd3dcW4XyVAmVaCdU88g"} 7 | {"heart": false, "votes": "1", "photo": "https://yt3.ggpht.com/ytc/AAUvwnhT5ANxGbojeOEqDq4YJRHsgrWPhLiWTOJW90Pusg=s176-c-k-c0x00ffffff-no-rj", "author": "Spad", "cid": "UgwqBeADdIzWy7NXNCB4AaABAg", "text": "Woah. Nice.", "time": "8 kuu eest", "channel": "UC5c58KvHZktwv1kVfXWgkLw"} 8 | {"heart": false, "votes": "0", "photo": "https://yt3.ggpht.com/ytc/AAUvwniJUW4Tn6JN0cjs0TvrPn9k2XfDJl_qd7ROr1TLmQ=s176-c-k-c0x00ffffff-no-rj", "author": "調理されたとり", "cid": "UgxyviFubu0-ah8wXht4AaABAg", "text": "懐かしくて泣きそう\n皆三鳥エピソード書いてるから俺も書いとこ\n三鳥はヒノアラシの煙幕と全技連結でごり押ししました\n\n連結ボックスは重宝したなぁ", "time": "7 kuu eest", "channel": "UCqyPJVfJ8SEFfJ2erAHeoOA"} 9 | {"heart": false, "votes": "0", "photo": "https://yt3.ggpht.com/ytc/AAUvwngYD-SnG6NmWxNkPNQ6SeRmRZpIua5xksj7DW8H2w=s176-c-k-c0x00ffffff-no-rj", "author": "VioLynn **", "cid": "UgzJTDjLf33hFbW9h7l4AaABAg", "text": "Is this a checkpoint or have I officially lost all of my sense? Also, this sounds so good???", "time": "7 kuu eest", "channel": "UC1sYX-py4rFQ7YreTnq81IA"} 10 | {"heart": false, "votes": "15", "photo": "https://yt3.ggpht.com/ytc/AAUvwnhhlFNmWyZWFK-IrZgD9h-YLXosygV55AbWrMQFgw=s176-c-k-c0x00ffffff-no-rj", "author": "Joe Mama", "cid": "UgzABpV7VnkRqUqPOdh4AaABAg", "text": "Checkpoint ???+3\n\nA new checkpoint, with not a large difference in time between this one and last one, any main characters who finds this, I wish you all good luck on your quest, and godspeed.\n\nSave File 2", "time": "6 kuu eest", "channel": "UC3-Fiq7lsqlxV9TMH19gOAQ"} 11 | {"heart": false, "votes": "0", "photo": "https://yt3.ggpht.com/ytc/AAUvwnhreGlOj56_rVQ-lSQvLjqrVrC8jAdA3a5O4bv6Zg=s176-c-k-c0x00ffffff-no-rj", "author": "Double Superior", "cid": "UgxLBkfZqkwaZLvnOOx4AaABAg", "text": "The video was uploaded July 6, 2014. That was 10 days off from my 10th birthday.", "time": "5 kuu eest", "channel": "UCZzpyIV6BAHtk_SGWgpxmUg"} 12 | {"heart": false, "votes": "0", "photo": "https://yt3.ggpht.com/ytc/AAUvwnib0kqpAResOitSv9UgEkp1YKWs5P6VXBJOPw=s176-c-k-c0x00ffffff-no-rj", "author": "Logicattic P", "cid": "UgyYsEQ3Cc0mr1M8hPF4AaABAg", "text": "Check point 3 you still have a story tell", "time": "5 kuu eest", "channel": "UC8-x9O-KeLMEq6MTtBP46qw"} 13 | {"heart": false, "votes": "0", "photo": "https://yt3.ggpht.com/ytc/AAUvwngSWQeUJk7vCVtgMsRGWGFP7GCfCCcZsHTW4PudXA=s176-c-k-c0x00ffffff-no-rj", "author": "UFO VIDEO", "cid": "UgxPIU_uXiuaUW3np5R4AaABAg", "text": "Checkpoint 3\n\nBasically a resave. I realized some things where I was wrong. I realized some things where I was right and others were wrong. I realized only what happens next is what really matters.\n\nI didn't level up yet but want to retain whatever xp i gained so it's time to save", "time": "4 kuu eest", "channel": "UCgHeimASSgC0gltLvm9IO7g"} 14 | {"heart": false, "votes": "0", "photo": "https://yt3.ggpht.com/ytc/AAUvwngJAFHV-qSNoy9HUwGpPEx4_5RQq4iIRnecp2yB_w=s176-c-k-c0x00ffffff-no-rj", "author": "Basically Frost", "cid": "Ugw5hwlaQEM_KqcvJfF4AaABAg", "text": "Ah mt blaze", "time": "3 kuu eest", "channel": "UCVq80DUUzf3l2aX76laF8nQ"} 15 | {"heart": false, "votes": "2", "photo": "https://yt3.ggpht.com/ytc/AAUvwnjGQ-mDoUtdFMsJRFnOJEcvBs1XUQ3Kft-0iTKvPA=s176-c-k-c0x00ffffff-no-rj", "author": "Solitário Errante", "cid": "Ugyi0ynuTafaZEmIYGd4AaABAg", "text": "Pokémon Mistery Dungeon Blue Rescue Team was a great title, i liked the sequels but this one is my favorite, so nostalgic.", "time": "3 kuu eest (muudetud)", "channel": "UCmmJpjAkN2VY1J1UOQ493nQ"} 16 | {"heart": false, "votes": "0", "photo": "https://yt3.ggpht.com/ytc/AAUvwnj0wrQJS2rYbBeSQdjuhvd-wfbII3pDArxsQlE7pg=s176-c-k-c0x00ffffff-no-rj", "author": "ゆひゆひ", "cid": "UgzCz2jLLMzjufXiBHl4AaABAg", "text": "たまに突然脳内で鳴り始めてすごく聴きたくなる", "time": "3 kuu eest", "channel": "UCO5txD9Lb8TZw2pQlcHvJhQ"} 17 | {"heart": false, "votes": "0", "photo": "https://yt3.ggpht.com/ytc/AAUvwngpiQm-ER7qthi0egifpLjIgRbMmnYYbl3vYI0x5g=s176-c-k-c0x00ffffff-no-rj", "author": "G 2", "cid": "UgyxoYuN7IN91KXgCcp4AaABAg", "text": "Dude i fuckin' remember playing this when I was a kid. Godsend to this man.", "time": "2 kuu eest", "channel": "UCH1u_1XlRrAHSkkNcdgdrwg"} 18 | {"heart": false, "votes": "1", "photo": "https://yt3.ggpht.com/ytc/AAUvwnhgFuNBzsMEtvMhf67BuRqZvziPLr6v1KWiQKcWxg=s176-c-k-c0x00ffffff-no-rj", "author": "Quickchuckle", "cid": "UgxEd8xpq968SWv6WI14AaABAg", "text": "Checkpoint\nI assume this is the last town i will be at , i'll buy some of their high level armour.", "time": "2 kuu eest", "channel": "UC-IMd7yMD5fuKEBmdLjCPUQ"} 19 | {"heart": false, "votes": "0", "photo": "https://yt3.ggpht.com/ytc/AAUvwniM7bE3DKN8y0Y0CGphdg28dsrxRqd5KRhTveN8=s176-c-k-c0x00ffffff-no-rj", "author": "Agent Smith", "cid": "UgxUl6SbjK3yE8tpsU94AaABAg", "text": "e", "time": "2 kuu eest", "channel": "UCrnQPjnHc3VUuulayg0Dppg"} 20 | {"heart": false, "votes": "1", "photo": "https://yt3.ggpht.com/ytc/AAUvwnjShszzjxZgtiGBNHesvXRRz8mjWdQnkUHH81I-=s176-c-k-c0x00ffffff-no-rj", "author": "LosersBecomeWinners", "cid": "UgwWOlF8jYOR31Wk6OV4AaABAg", "text": "Music like this makes me so sad i haven’t played the OG red/blue rescue team games yet\n\nEdit: grammar", "time": "4 päeva eest (muudetud)", "channel": "UCUnnehRjtMxmkzIVbF8p8lw"} 21 | {"heart": false, "votes": "0", "photo": "https://yt3.ggpht.com/ytc/AAUvwnhMarFUZ74ZJS6NYvmzACfUR-clVJHWzdJpp5ye=s176-c-k-c0x00ffffff-no-rj", "author": "Serjo777", "cid": "Ugy5AlKAZ-1OwrylDIN4AaABAg.99Edc3QlUdF9IIOliwlX-H", "text": "It's Honoo no Yama you liar.", "time": "2 kuu eest", "channel": "UCMxCrYGOwtex_wZvVWWBK1g"} 22 | {"heart": false, "votes": "1", "photo": "https://yt3.ggpht.com/ytc/AAUvwnibEDloCjmLQ3B3WWJ8GoT-fCEcfCaFYvua084i=s176-c-k-c0x00ffffff-no-rj", "author": "Joonjon J3w", "cid": "Ugy5AlKAZ-1OwrylDIN4AaABAg.99Edc3QlUdF9BXKy9Mn5l6", "text": "Dude fuck I knew this was familiar", "time": "8 kuu eest", "channel": "UCqDAfxLkhXvVJjYXID3PrQQ"} 23 | {"heart": false, "votes": "0", "photo": "https://yt3.ggpht.com/ytc/AAUvwnhhlFNmWyZWFK-IrZgD9h-YLXosygV55AbWrMQFgw=s176-c-k-c0x00ffffff-no-rj", "author": "Joe Mama", "cid": "UgzABpV7VnkRqUqPOdh4AaABAg.9DSRNfojIbF9DSRQqzp1TE", "text": "Sept 11, 2020, 12:44 am EST", "time": "6 kuu eest", "channel": "UC3-Fiq7lsqlxV9TMH19gOAQ"} 24 | {"heart": false, "votes": "4", "photo": "https://yt3.ggpht.com/ytc/AAUvwniGIMS6v5V5l8RA-5C1n97S8oMJGie_741w5Cl7Ow=s176-c-k-c0x00ffffff-no-rj", "author": "ごちうさ難民りふぇ", "cid": "UgjsmVsY0Dm_lHgCoAEC", "text": "この曲なんか好きだったw", "time": "3 aasta eest", "channel": "UCex8LqSvjpg1wa1Bl9i2dxQ"} 25 | {"heart": false, "votes": "2", "photo": "https://yt3.ggpht.com/ytc/AAUvwngeOGvzZxzO8gfCg9fFhwb65MpmRCFp4-xY98wHsg=s176-c-k-c0x00ffffff-no-rj", "author": "ジェイソン77レベルの仮面モロ感の", "cid": "UggXpXvSoby4AHgCoAEC", "text": "ポケダンで一番すき", "time": "3 aasta eest", "channel": "UC5UlFByoMhQGmCPncBGMABQ"} 26 | {"heart": false, "votes": "1", "photo": "https://yt3.ggpht.com/ytc/AAUvwng3UY9HWmUl9ySeROiNG_XbONqBvBCcrJMZd4Rj=s176-c-k-c0x00ffffff-no-rj", "author": "Revolver Ocelot", "cid": "UgicFP-uKo_KangCoAEC", "text": "カービィの曲みたいだな😃", "time": "3 aasta eest", "channel": "UCTtKg3OelyTOH1dTEsqdyuw"} 27 | {"heart": false, "votes": "18", "photo": "https://yt3.ggpht.com/ytc/AAUvwnjIzgB8lg_HSiK-YGe3_4iji1SzBJ8r0zXNTbJc=s176-c-k-c0x00ffffff-no-rj", "author": "カレるん", "cid": "Ugz_2bHgsmV_1aSS7Q54AaABAg", "text": "救助隊の山場ってここだよな\n\nファイアー強すぎる\n\n2回目以降は復活のタネ集めとこうとか対策できるけど、初見はきつい", "time": "3 aasta eest", "channel": "UCxClFRzorYmEBLC4out4PMw"} 28 | {"heart": false, "votes": "3", "photo": "https://yt3.ggpht.com/ytc/AAUvwngERZZ84xOzKvVs5YnpSQly_9xwtuzexZZh7UON=s176-c-k-c0x00ffffff-no-rj", "author": "あむK", "cid": "UgyT6h94zf_sPe9B0zZ4AaABAg", "text": "ファイアー強いって意見多いけどピカチュウとゼニガメだったから楽勝だった\n\nサンダーがキツかった", "time": "3 aasta eest (muudetud)", "channel": "UCQh-ekv55qaEp7pWkSt7dww"} 29 | {"heart": false, "votes": "23", "photo": "https://yt3.ggpht.com/ytc/AAUvwniu5zKMPlimFGc4J0o5T8uPrNGURa_Nt3bUV1nk=s176-c-k-c0x00ffffff-no-rj", "author": "イチノセリョウタ", "cid": "Ugw5ICcGIjAkum6ekTB4AaABAg", "text": "オニドリルの「みだれづき」が本当に恐怖だったなーww", "time": "2 aasta eest", "channel": "UCHVO7EdOkEdqdf3Qt8wXjoQ"} 30 | {"heart": false, "votes": "4", "photo": "https://yt3.ggpht.com/ytc/AAUvwngLkvP9GBlsnxxL9yIGBSUEgBLVTATYATt6qabL=s176-c-k-c0x00ffffff-no-rj", "author": "櫻木澪", "cid": "UgwJmIBfdG5kSU36IcF4AaABAg", "text": "緊迫感と壮大さが混ざり合った、そんな思いに浸れる曲。\nまさか、あとで追われる身になってまたココにくるとはね。。。", "time": "2 aasta eest", "channel": "UC37zxS4mqcaoaV1LlqaSbfA"} 31 | {"heart": false, "votes": "3", "photo": "https://yt3.ggpht.com/ytc/AAUvwngncRu7SBwqa3GFHc3h7REWYMula8xL_ZaoMQU7XA=s176-c-k-c0x00ffffff-no-rj", "author": "檎林", "cid": "UgwNsV5NIpqqf4fnkBF4AaABAg", "text": "重厚感ある", "time": "2 aasta eest", "channel": "UC44jRoQMYgJXJ6uWdbHinjQ"} 32 | {"heart": false, "votes": "49", "photo": "https://yt3.ggpht.com/ytc/AAUvwnjkVwYwD8comAmiKnDEWGJOHB8tqOFIlnvE9xf6Iw=s176-c-k-c0x00ffffff-no-rj", "author": "怒り喰らうたぬきち", "cid": "UgziK1x1N_AB381I6nZ4AaABAg", "text": "ただの壮大な曲じゃなくて\n追われてる中、必死で逃げる主人公達の思いと\nいよいよ真実へと近づいて行く物語の緊張感\n全てがこの曲に詰まってる\n\n実機で聴くと泣けるくらい神曲", "time": "2 aasta eest", "channel": "UCrL-WM9zL2Qon2VKweypMWg"} 33 | {"heart": false, "votes": "2", "photo": "https://yt3.ggpht.com/ytc/AAUvwnh8W1ddxWRyTEw9sbepjJ6WZ95qy0B1uYQxkTp0xQ=s176-c-k-c0x00ffffff-no-rj", "author": "チャンネルA", "cid": "UgwKx2F4SCQiTb37f_p4AaABAg", "text": "このゲームで始めて泣いた!", "time": "2 aasta eest", "channel": "UCki97khlOP7GXil4NYHN4_w"} 34 | {"heart": false, "votes": "0", "photo": "https://yt3.ggpht.com/ytc/AAUvwnjRFo-hK_HBQo071nZopiL89KZ6-twdL2H-zdAN=s176-c-k-c0x00ffffff-no-rj", "author": "ntmusic", "cid": "UgxhD_In709J77b6rqh4AaABAg", "text": "チコリータとアチャモだったから、多分詰んでやめた記憶が…w", "time": "2 aasta eest", "channel": "UCiJ2WGRofluSnEm_WZ533-w"} 35 | {"heart": false, "votes": "7", "photo": "https://yt3.ggpht.com/ytc/AAUvwngvoZ0oySyVVH0DEqqnsJjD1FBE0_nFeCQ5FBLO=s176-c-k-c0x00ffffff-no-rj", "author": "deadman", "cid": "UgwKlNb5FDCdl4Dl6_l4AaABAg", "text": "ファイアーの印象しかない\nほんとあれ強い", "time": "1 aasta eest", "channel": "UCNhXoZeTEiCohs3Bdk4pwJw"} 36 | {"heart": false, "votes": "6", "photo": "https://yt3.ggpht.com/ytc/AAUvwnhziDbmm0ToLWnkaht_lB7f5hrW4d9poNJVhTCjdg=s176-c-k-c0x00ffffff-no-rj", "author": "天才土方", "cid": "UgxChc1SqL_ib46wBE94AaABAg", "text": "ここの曲だけ頭から離れないんだよなぁ", "time": "1 aasta eest", "channel": "UCNHVzLtSsRivjJsziBp5pig"} 37 | {"heart": false, "votes": "5", "photo": "https://yt3.ggpht.com/ytc/AAUvwniAjOjK6FIahnkyNkj50LPqm0THoYUh6d4s80_z=s176-c-k-c0x00ffffff-no-rj", "author": "EcoZones2D6", "cid": "UgwHX9juWI8ZruL_MiN4AaABAg", "text": "YouTube gimme the most amount possible of pokemon remixes in suggestions. I hope personalized ias on YouTube to give them instructions like this one", "time": "1 aasta eest (muudetud)", "channel": "UCyGLydTVjTbPnjP7P1iEJPA"} 38 | {"heart": false, "votes": "3", "photo": "https://yt3.ggpht.com/ytc/AAUvwnhtsTcyYNJNfpQvbe3jHX60YwYADE2walpXbh2V=s176-c-k-c0x00ffffff-no-rj", "author": "れるなむ", "cid": "UgxmavCNyPkkOhRSKxF4AaABAg", "text": "メロメロと連結技で必死にファイアーを倒した思い出…", "time": "1 aasta eest", "channel": "UCNXSw2dE8TWcKg74Sbs6BRQ"} 39 | {"heart": false, "votes": "4", "photo": "https://yt3.ggpht.com/ytc/AAUvwngJHse_IbbuF_68why0P1bN_2S1Lnhto7Th9tq4lg=s176-c-k-c0x00ffffff-no-rj", "author": "プリズンマジメ君ch", "cid": "UgxoYdzFQVzrd0X6Bgh4AaABAg", "text": "ツボツボが仲間にならなくてイライラ", "time": "1 aasta eest", "channel": "UCfmBWEns5qmb76i-ilzMEIA"} 40 | {"heart": false, "votes": "0", "photo": "https://yt3.ggpht.com/ytc/AAUvwniJu6swdhp0Hup7n_xNusHL84MsHUhQ3E4y4g=s176-c-k-c0x00ffffff-no-rj", "author": "Elijah Dage", "cid": "UgyEBsWhcLLMw7xTsGB4AaABAg", "text": "日本語の何か", "time": "1 aasta eest", "channel": "UCsO8nuNyta0H89TcJ_itYAw"} 41 | {"heart": false, "votes": "3", "photo": "https://yt3.ggpht.com/ytc/AAUvwnifF4ZTmIizUFsD6Uc2RYvs77sH_U3ueP30LP31=s176-c-k-c0x00ffffff-no-rj", "author": "岩渕良太", "cid": "Ugx8_10SXCw3l_RO-8t4AaABAg", "text": "スイッチで復活15年歳月が今再び", "time": "1 aasta eest", "channel": "UCuBG_MhcogG3JfgMAIIl88Q"} 42 | {"heart": false, "votes": "2", "photo": "https://yt3.ggpht.com/ytc/AAUvwnjKhY6gHvBD9IJMaeSTRh_esbY1jbHwxB7zLdUC=s176-c-k-c0x00ffffff-no-rj", "author": "Maxisdag", "cid": "UgyfH16HR39iy31lqYx4AaABAg", "text": "this is it", "time": "1 aasta eest", "channel": "UCps3B6GjbxBkfKAQ9T5jtQA"} 43 | {"heart": false, "votes": "2", "photo": "https://yt3.ggpht.com/ytc/AAUvwnho7YJY5-xmJoW9nDeRwe72cT0TyTggO-fVkPko=s176-c-k-c0x00ffffff-no-rj", "author": "ぶわ", "cid": "UgzQjZQPpRvzHuSdL5R4AaABAg", "text": "救助隊リメイクおめでたい!ほのおのやまとおおいなるきょうこくがどうアレンジされるか楽しみだ…!", "time": "1 aasta eest", "channel": "UCbGbpNmdztgJ6b8dyQUhD2w"} 44 | {"heart": false, "votes": "0", "photo": "https://yt3.ggpht.com/ytc/AAUvwnhE8avJKik8JmBnRZZQ0Kt4sq-YMRYKjKXuzwLn=s176-c-k-c0x00ffffff-no-rj", "author": "神曲探し", "cid": "UggXpXvSoby4AHgCoAEC.8U3JU5s5SAf8csSDViAI42", "text": "77レベルの仮面モロ感の ジェイソン わかる", "time": "3 aasta eest", "channel": "UCz-TJ8pbypg5KvLRjPO8y9w"} 45 | {"heart": false, "votes": "1", "photo": "https://yt3.ggpht.com/ytc/AAUvwnhY-GLNuAL1AOCtrbmpLlvHWhInP5DwkxCfs9P7=s176-c-k-c0x00ffffff-no-rj", "author": "Japanese Dream S", "cid": "UgyT6h94zf_sPe9B0zZ4AaABAg.8dGt6iuzPTM8n6l5nOdv1g", "text": "ファイアーはなんか余裕で一回でいけたけどフリーザーは何回挑んでも勝てなかった😓", "time": "2 aasta eest", "channel": "UCBsjruOLV0cVlCQJ516agFg"} 46 | {"heart": false, "votes": "0", "photo": "https://yt3.ggpht.com/ytc/AAUvwngc4EIdwG1A4lOf-gm9mfXLTe2B2feZzcni9A=s176-c-k-c0x00ffffff-no-rj", "author": "ゲーム好き", "cid": "UgyT6h94zf_sPe9B0zZ4AaABAg.8dGt6iuzPTM8hxoRRpTetx", "text": "魔人少年野比のび太 \n相手がよく全体攻撃の「こなゆき」をよく使ってきたのでふっかつのたねがどんどん減って行きました…チコリータは氷に弱いので。", "time": "2 aasta eest", "channel": "UCDdfRIkniBRJ3qoDhoiCv3w"} 47 | {"heart": false, "votes": "0", "photo": "https://yt3.ggpht.com/ytc/AAUvwniiFwddZQipP72KJJeBoB_twDtPxQsv8xnkLw=s176-c-k-c0x00ffffff-no-rj", "author": "nobinobita majinsyonen", "cid": "UgyT6h94zf_sPe9B0zZ4AaABAg.8dGt6iuzPTM8hxnaruLIqs", "text": "ゲーム好き アチャモならフリーザーは余裕じゃあ…", "time": "2 aasta eest", "channel": "UCzKyrCg2F5wYt-jNuwnmKbQ"} 48 | {"heart": false, "votes": "1", "photo": "https://yt3.ggpht.com/ytc/AAUvwngc4EIdwG1A4lOf-gm9mfXLTe2B2feZzcni9A=s176-c-k-c0x00ffffff-no-rj", "author": "ゲーム好き", "cid": "UgyT6h94zf_sPe9B0zZ4AaABAg.8dGt6iuzPTM8eL9cVkJWBN", "text": "USAピョン \n自分はアチャモとチコリータだったので三鳥全部キツかったです…(泣)", "time": "3 aasta eest", "channel": "UCDdfRIkniBRJ3qoDhoiCv3w"} 49 | {"heart": false, "votes": "1", "photo": "https://yt3.ggpht.com/ytc/AAUvwnjkVwYwD8comAmiKnDEWGJOHB8tqOFIlnvE9xf6Iw=s176-c-k-c0x00ffffff-no-rj", "author": "怒り喰らうたぬきち", "cid": "UgziK1x1N_AB381I6nZ4AaABAg.8rPMG0x9tKW9AswyL92Xn6", "text": " @EXE  そうですね〜\nリメイクやってみたんですけど、やっぱこれに関しては原曲の方が好きでした", "time": "8 kuu eest", "channel": "UCrL-WM9zL2Qon2VKweypMWg"} 50 | {"heart": false, "votes": "1", "photo": "https://yt3.ggpht.com/ytc/AAUvwnjWqW516ODIMGrLuFmSbWJVEm51k0LK1n1EMg=s176-c-k-c0x00ffffff-no-rj", "author": "EXE", "cid": "UgziK1x1N_AB381I6nZ4AaABAg.8rPMG0x9tKW9ArHsCyh955", "text": "めっちゃわかります!\n話もいいけどいちいちbgmも神でしたね!", "time": "8 kuu eest", "channel": "UCEeT9iwiTa-94OPEsI-CuSA"} 51 | {"heart": false, "votes": "0", "photo": "https://yt3.ggpht.com/ytc/AAUvwnhziDbmm0ToLWnkaht_lB7f5hrW4d9poNJVhTCjdg=s176-c-k-c0x00ffffff-no-rj", "author": "天才土方", "cid": "UgxhD_In709J77b6rqh4AaABAg.8rap1HPdsNa8yWcdjiG3VP", "text": "俺、アチャモだったがクリアできました", "time": "1 aasta eest", "channel": "UCNHVzLtSsRivjJsziBp5pig"} 52 | {"heart": false, "votes": "0", "photo": "https://yt3.ggpht.com/ytc/AAUvwnhZj8PJrveSjqJkTNhVbDw_03LjPNW2MI0hqReYzg=s176-c-k-c0x00ffffff-no-rj", "author": "Gensai DnD", "cid": "UgyfH16HR39iy31lqYx4AaABAg.94nnC8pTXoP99rfb4Mmtvw", "text": "Yeah it is, it's a nice internet checkpoint too isn't it?", "time": "9 kuu eest", "channel": "UCto0lScSaC9vvaKFkmr1u2g"} 53 | {"heart": false, "votes": "4", "photo": "https://yt3.ggpht.com/ytc/AAUvwnhJPSykY14Ny54ST5RtCKB6gCDUcjN8Hybv8Z7h=s176-c-k-c0x00ffffff-no-rj", "author": "亀ちゃん", "cid": "UgiSZUbGw9qQqHgCoAEC", "text": "小学校の頃初めて行ったんだよなあ。炎の山。\n懐かしいわ", "time": "6 aasta eest", "channel": "UC7MlNfzlbP4JClWRnE9Qi3w"} 54 | {"heart": false, "votes": "4", "photo": "https://yt3.ggpht.com/ytc/AAUvwng-LDYSVSGKMZdUqhsppqvgDaBp_vYFk2fGYe5J=s176-c-k-c0x00ffffff-no-rj", "author": "higurashi umineko", "cid": "Ugj-Q3-hJvMtongCoAEC", "text": "ファイヤー強かったなあ", "time": "6 aasta eest", "channel": "UCWRaIBAcOpXUff74R3v__7g"} 55 | {"heart": false, "votes": "87", "photo": "https://yt3.ggpht.com/ytc/AAUvwngE_Mv8GzzCr8w0y6rFG6xPB0Iqp7Rykvi9re_84w=s176-c-k-c0x00ffffff-no-rj", "author": "Bespinben", "cid": "Ugi33tBQ8lIsk3gCoAEC", "text": "Would you do this for the whole OST please? Your audio editing makes these already phenomenal pieces of music sound even better.", "time": "5 aasta eest", "channel": "UCwZ6uWSeMe3eW44h2DpRlfA"} 56 | {"heart": false, "votes": "31", "photo": "https://yt3.ggpht.com/ytc/AAUvwni6sKtY-2mioFALNRLei-Mh3NyejsbNnyrUm5jB=s176-c-k-c0x00ffffff-no-rj", "author": "NISUI DAI", "cid": "UgiVCaacnK2nXXgCoAEC", "text": "子供の頃は大いなる峡谷や天空の塔よりも印象深かった曲。ゲームで初めて泣いた場所が、この炎の山の後のイベントだった。当時本当に逃避行している緊張感とかが直に受けることができて楽しかった。壮大さがある故、今聞いても本当にすごい曲だと思う。", "time": "5 aasta eest", "channel": "UCFJNYI4WkP_GxVVnoojXXTQ"} 57 | {"heart": false, "votes": "7", "photo": "https://yt3.ggpht.com/ytc/AAUvwnhUNAY1cMwB0GGNsdKREB5yiNWfsR00mT5NClGf9Q=s176-c-k-c0x00ffffff-no-rj", "author": "Incendiary Pyro", "cid": "Ugj4inbMZAb90HgCoAEC", "text": "Holy shit, this sounds amazing.", "time": "4 aasta eest", "channel": "UCa_1rYKwaOosuMrl7GsaO-Q"} 58 | {"heart": false, "votes": "0", "photo": "https://yt3.ggpht.com/ytc/AAUvwngfXxZ7YS27oVCw-dyqHPYRsgwk8d7YUscH8YM=s176-c-k-c0x00ffffff-no-rj", "author": "Opportunityオパチュニティー", "cid": "UghTitS0sDYZ3ngCoAEC", "text": "赤いグミ拾いまくってたなw\nあとドロボウもw", "time": "4 aasta eest", "channel": "UClqCKYLtv_v5H5cKq92z7Hw"} 59 | {"heart": false, "votes": "1", "photo": "https://yt3.ggpht.com/ytc/AAUvwngzhOvSMS1fBqI3hrfrPp_e-BIZmC0B7v43ZA=s176-c-k-c0x00ffffff-no-rj", "author": "K K", "cid": "UgzkS-FV8W8RvLk3Uvh4AaABAg", "text": "この曲、ファイヤーのほのおのやまより、エンテイのほのおのだいちの方がイメージある", "time": "4 aasta eest", "channel": "UC_u0hfCSMYdXSGo6P98xDZA"} 60 | {"heart": false, "votes": "3", "photo": "https://yt3.ggpht.com/ytc/AAUvwng-FIjHq1lHKonejXt3d51BgJ81uvCAlpZ6Hy5q=s176-c-k-c0x00ffffff-no-rj", "author": "connyhunting", "cid": "Ugi33tBQ8lIsk3gCoAEC.81jWrf9_QJu954urDtqMvd", "text": "Bespinben you… fancy to see you here.", "time": "1 aasta eest", "channel": "UCTxSMSoW--HcdjkH1uE_Hbg"} 61 | {"heart": false, "votes": "4", "photo": "https://yt3.ggpht.com/ytc/AAUvwnj94efXG-VyCpBhKYsMFj2wQZ1d8iigM5nmZjox=s176-c-k-c0x00ffffff-no-rj", "author": "liuwu", "cid": "Ugi33tBQ8lIsk3gCoAEC.81jWrf9_QJu948wRwcl1Yb", "text": "Bespinben yo. there’s a 1 hr version of it up after 3 years. so if ur still interested...", "time": "1 aasta eest", "channel": "UCdJ2Ifn8pXKean2n9CDnoLQ"} 62 | {"heart": false, "votes": "10", "photo": "https://yt3.ggpht.com/ytc/AAUvwngE_Mv8GzzCr8w0y6rFG6xPB0Iqp7Rykvi9re_84w=s176-c-k-c0x00ffffff-no-rj", "author": "Bespinben", "cid": "Ugi33tBQ8lIsk3gCoAEC.81jWrf9_QJu8LWbacfIBnH", "text": "I like to think of myself as a connoisseur of obscure Youtube content creators ;) (especially japanese PMD fans)", "time": "4 aasta eest", "channel": "UCwZ6uWSeMe3eW44h2DpRlfA"} 63 | {"heart": false, "votes": "7", "photo": "https://yt3.ggpht.com/ytc/AAUvwniUA4gZQw4pVKo46hTKytcSWL6FJvYMZ6QTvE8Ymw=s176-c-k-c0x00ffffff-no-rj", "author": "Mugiwara", "cid": "Ugi33tBQ8lIsk3gCoAEC.81jWrf9_QJu8LVyEP3jbl4", "text": "Bespinben Holy crap I know right? \n\nFunny seeing you here loll", "time": "4 aasta eest", "channel": "UCG0iJbSCcXHWtujHkyJaN_g"} 64 | {"heart": false, "votes": "2", "photo": "https://yt3.ggpht.com/ytc/AAUvwnjb__1iDtb3iR7J69y0aTkYZC7IQneNTMh5SfSt=s176-c-k-c0x00ffffff-no-rj", "author": "でぃ", "cid": "UgiVCaacnK2nXXgCoAEC.87S93sUkk5j8y6bshVX0zx", "text": "GoldenDai ゲンガーが、ネイティオと主人公達の会話とキュウコン伝説の話を上手いこと絡ませて主人公を犯人ってでっちあげしたんですよね", "time": "1 aasta eest", "channel": "UCihlVY9Ig6VopU62AbhjMwA"} 65 | {"heart": false, "votes": "3", "photo": "https://yt3.ggpht.com/ytc/AAUvwnhhpf9wVFJXBbGS2lwbHPuzhMxVdCxEV9D0eg=s176-c-k-c0x00ffffff-no-rj", "author": "高燃費ドライバー", "cid": "UgiVCaacnK2nXXgCoAEC.87S93sUkk5j8jjIxf7Sano", "text": "分かるわ~。\n溶岩の熱さと緊張感がBGMに出てる。\n確か逃避行って本来は何の関係もない冤罪を擦り付けられて逃げてたんやっけ?", "time": "2 aasta eest", "channel": "UCKErikTO--DHhvFcRDsAodQ"} 66 | {"heart": false, "votes": "1", "photo": "https://yt3.ggpht.com/ytc/AAUvwnhQPr9IEhCB9SQlwLGE8GQg5qvrz4vYutW9-j_v=s176-c-k-c0x00ffffff-no-rj", "author": "一方通行だァ!", "cid": "UgiVCaacnK2nXXgCoAEC.87S93sUkk5j8Vcgr4E6gS4", "text": "めっちゃ分かる", "time": "3 aasta eest", "channel": "UCBpf6YAInZQoP4V95ws7WmQ"} 67 | -------------------------------------------------------------------------------- /backups/_metadata.json: -------------------------------------------------------------------------------- 1 | { 2 | "wMv4Rw_7Mes": { 3 | "title": "風の憧憬一時間\"クロノ・トリガー\"", 4 | "viewCount": 127378, 5 | "likeCount": 5600, 6 | "dislikeCount": 33, 7 | "publishedAt": "2021-06-13", 8 | "commentsCount": 0 9 | }, 10 | "VWR5u1evzUY": { 11 | "title": "塔エリア一時間 \"スーパードンキーコング2\"", 12 | "viewCount": 2355, 13 | "likeCount": 0, 14 | "dislikeCount": 0, 15 | "publishedAt": "2021-06-12", 16 | "commentsCount": 0 17 | }, 18 | "1x4KfgQhvB4": { 19 | "title": "鉱山レベル \"スーパードンキーコング2\"", 20 | "viewCount": 16380, 21 | "likeCount": 1700, 22 | "dislikeCount": 2, 23 | "publishedAt": "2021-05-29" 24 | }, 25 | "ytLzeQNiJDs": { 26 | "title": "けっせん!ディアルガ\"ポケモン不思議のダンジョン 空の探検隊\"", 27 | "viewCount": 413060, 28 | "likeCount": 10000, 29 | "dislikeCount": 101, 30 | "publishedAt": "2017-09-01", 31 | "commentsCount": 989 32 | }, 33 | "lkQ1POVJsk4": { 34 | "title": "Great Canyon - Pokemon Mystery Dungeon Blue Rescue Team", 35 | "viewCount": 37663, 36 | "likeCount": 859, 37 | "dislikeCount": 19, 38 | "publishedAt": "2014-08-17", 39 | "commentsCount": 100 40 | }, 41 | "Q9XTqQbuavI": { 42 | "title": "時の回廊一時間\"クロノ・トリガー\"", 43 | "viewCount": 4931152, 44 | "likeCount": 156000, 45 | "dislikeCount": 0, 46 | "publishedAt": "2014-07-31", 47 | "commentsCount": 10638 48 | }, 49 | "OhmY6Afh2Ec": { 50 | "title": "ほのおのやま\"ポケモン不思議のダンジョン\"", 51 | "viewCount": 75796, 52 | "likeCount": 762, 53 | "dislikeCount": 0, 54 | "publishedAt": "2014-07-06", 55 | "commentsCount": 66 56 | }, 57 | "xkx2MX-a-D4": { 58 | "title": "POSSESSION -original extended mix-", 59 | "viewCount": 100000, 60 | "likeCount": 1200, 61 | "dislikeCount": 75, 62 | "publishedAt": "2014-06-25", 63 | "commentsCount": 51 64 | }, 65 | "zPAKKROcclE": { 66 | "title": "森エリア一時間\"スーパードンキーコング2\"", 67 | "viewCount": 549924, 68 | "likeCount": 16000, 69 | "dislikeCount": 79, 70 | "publishedAt": "2014-06-23", 71 | "commentsCount": 1549 72 | }, 73 | "bPVohspy054": { 74 | "title": "とげとげタルめいろ一時間\"スーパードンキーコング2\"", 75 | "viewCount": 1027761, 76 | "likeCount": 38000, 77 | "dislikeCount": 0, 78 | "publishedAt": "2014-04-10", 79 | "commentsCount": 9683 80 | }, 81 | "NSyPPd_lEQE": { 82 | "title": "ラトリーに大へんしん\"スーパードンキーコング2\"", 83 | "viewCount": 517407, 84 | "likeCount": 7200, 85 | "dislikeCount": 66, 86 | "publishedAt": "2014-04-05", 87 | "commentsCount": 726 88 | }, 89 | "m0gsV5X6l1I": { 90 | "title": "ようがんクロコジャンプ\"スーパードンキーコング2\"", 91 | "viewCount": 795024, 92 | "likeCount": 11000, 93 | "dislikeCount": 90, 94 | "publishedAt": "2014-02-26", 95 | "commentsCount": 983 96 | }, 97 | "CBEUf7vqLRw": { 98 | "title": "仲間を求めて\"ファイナルファンタジーVI\"", 99 | "viewCount": 251196, 100 | "likeCount": 3100, 101 | "dislikeCount": 0, 102 | "publishedAt": "2014-01-21", 103 | "commentsCount": 199 104 | }, 105 | "8-ZaQ0uj4vY": { 106 | "title": "ウインキーのどうくつ\"スーパードンキーコング\"", 107 | "viewCount": 227719, 108 | "likeCount": 2800, 109 | "dislikeCount": 15, 110 | "publishedAt": "2013-09-03", 111 | "commentsCount": 262 112 | }, 113 | "ggbn1s2oUUE": { 114 | "title": "クリスタルトンネル\"スーパードンキーコング\"", 115 | "viewCount": 295273, 116 | "likeCount": 4100, 117 | "dislikeCount": 22, 118 | "publishedAt": "2013-08-31", 119 | "commentsCount": 341 120 | }, 121 | "bnWktjTMZb0": { 122 | "title": "ハニー・アドベンチャー\"スーパードンキーコング2\"", 123 | "viewCount": 596717, 124 | "likeCount": 11000, 125 | "dislikeCount": 87, 126 | "publishedAt": "2013-07-27", 127 | "commentsCount": 1081 128 | }, 129 | "_rC6DA9EJuo": { 130 | "title": "かいてんタルさんばし\"スーパードンキーコング2\"", 131 | "viewCount": 629026, 132 | "likeCount": 8700, 133 | "dislikeCount": 53, 134 | "publishedAt": "2013-06-02", 135 | "commentsCount": 796 136 | }, 137 | "ML6tpvHw_io": { 138 | "title": "オイルこうじょう\"スーパードンキーコング\"", 139 | "viewCount": 1100555, 140 | "likeCount": 10000, 141 | "dislikeCount": 88, 142 | "publishedAt": "2013-05-26", 143 | "commentsCount": 916 144 | }, 145 | "08nYrDMx-DU": { 146 | "title": "てんくうのとう\"ポケモン不思議のダンジョン青の救助隊\"", 147 | "viewCount": 129369, 148 | "likeCount": 1100, 149 | "dislikeCount": 5, 150 | "publishedAt": "2013-05-25", 151 | "commentsCount": 128 152 | }, 153 | "cwLugJZMrb0": { 154 | "title": "キングクルールのふね\"スーパードンキーコング\"", 155 | "viewCount": 1588109, 156 | "likeCount": 14000, 157 | "dislikeCount": 139, 158 | "publishedAt": "2013-05-23", 159 | "commentsCount": 1340 160 | }, 161 | "EOIfaf2Pcuc": { 162 | "title": "やすらぎの日々\"クロノ・トリガー\"", 163 | "viewCount": 568194, 164 | "likeCount": 4800, 165 | "dislikeCount": 0, 166 | "publishedAt": "2013-04-06", 167 | "commentsCount": 341 168 | }, 169 | "pDgflOcHNnM": { 170 | "title": "風の憧憬\"クロノ・トリガー\"", 171 | "viewCount": 3754040, 172 | "likeCount": 49000, 173 | "dislikeCount": 0, 174 | "publishedAt": "2013-04-03", 175 | "commentsCount": 3451 176 | }, 177 | "DUsZ-RNET74": { 178 | "title": "1/6の夢旅人(TV ver.)", 179 | "viewCount": 32185, 180 | "likeCount": 321, 181 | "dislikeCount": 4, 182 | "publishedAt": "2013-03-04", 183 | "commentsCount": 60 184 | }, 185 | "2_4xmeCebKk": { 186 | "title": "水中レベル\"スーパードンキーコング\"", 187 | "viewCount": 539597, 188 | "likeCount": 12000, 189 | "dislikeCount": 50, 190 | "publishedAt": "2013-02-04", 191 | "commentsCount": 1277 192 | }, 193 | "g8f253ss_NI": { 194 | "title": "ロックフェイス・ランブル\"スーパードンキーコング3\"", 195 | "viewCount": 627934, 196 | "likeCount": 5600, 197 | "dislikeCount": 47, 198 | "publishedAt": "2013-02-03", 199 | "commentsCount": 642 200 | }, 201 | "Ev58S-rplrs": { 202 | "title": "グラビティ・ビートブード・ステージ\"ロックマンX3(SFC)\"", 203 | "viewCount": 82801, 204 | "likeCount": 809, 205 | "dislikeCount": 7, 206 | "publishedAt": "2013-01-18", 207 | "commentsCount": 102 208 | }, 209 | "2uRqMf_13BA": { 210 | "title": "おおいなるきょうこく\"ポケモン不思議のダンジョン青の救助隊\"", 211 | "viewCount": 128651, 212 | "likeCount": 839, 213 | "dislikeCount": 12, 214 | "publishedAt": "2012-09-09", 215 | "commentsCount": 101 216 | }, 217 | "0BADmbVhjgM": { 218 | "title": "タルタルこうざん\"スーパードンキーコング2\"", 219 | "viewCount": 1432396, 220 | "likeCount": 18000, 221 | "dislikeCount": 115, 222 | "publishedAt": "2012-09-03", 223 | "commentsCount": 1476 224 | }, 225 | "mDnr_-Gc-ZI": { 226 | "title": "時の回廊\"クロノ・トリガー\"", 227 | "viewCount": 946117, 228 | "likeCount": 6800, 229 | "dislikeCount": 99, 230 | "publishedAt": "2012-08-15", 231 | "commentsCount": 501 232 | }, 233 | "r2DG5-sjqso": { 234 | "title": "きりのもり\"スーパードンキーコング2\"", 235 | "viewCount": 1414076, 236 | "likeCount": 27000, 237 | "dislikeCount": 130, 238 | "publishedAt": "2012-07-23", 239 | "commentsCount": 3153 240 | }, 241 | "zK4TWXWEKAQ": { 242 | "title": "とげとげタルめいろ\"スーパードンキーコング2\"", 243 | "viewCount": 6054073, 244 | "likeCount": 211000, 245 | "dislikeCount": 1400, 246 | "publishedAt": "2012-04-26", 247 | "commentsCount": 70334 248 | } 249 | } 250 | -------------------------------------------------------------------------------- /backups/xkx2MX-a-D4.json: -------------------------------------------------------------------------------- 1 | {"heart": false, "votes": "19", "photo": "https://yt3.ggpht.com/ytc/AAUvwng8tqiLeGwDq-cZH7p5QzpFmjGOMChy9y7kNcGC0A=s176-c-k-c0x00ffffff-no-rj", "author": "Inujosha", "cid": "Ugy85EBB8ypiSKcK9pZ4AaABAg", "text": "This would be great club music, especially on the party supplies of your choice", "time": "2 aasta eest", "channel": "UCEb6_8feJ3nSuFnHFJUWJBQ"} 2 | {"heart": false, "votes": "10", "photo": "https://yt3.ggpht.com/ytc/AAUvwnisH4KLHshMTtZPLLjyR_lVFbvIVZh6DGzzADUU=s176-c-k-c0x00ffffff-no-rj", "author": "Danilo Crispim", "cid": "UgxLKAqDi4w1VixWK5p4AaABAg", "text": "誰かが男のビデオが水差しを開いたために来ましたか?", "time": "2 aasta eest", "channel": "UCeP9ZispKc58MpoSbmmCVNA"} 3 | {"heart": false, "votes": "15", "photo": "https://yt3.ggpht.com/ytc/AAUvwni60Lbaf1D4Jo9N6oZh3B3hmJinVSPhIVea_kyIFQ=s176-c-k-c0x00ffffff-no-rj", "author": "むみふ", "cid": "Ugysiq2tTWGn3w3795B4AaABAg", "text": "迫真デュエマ部から来たやつ多すぎない?w", "time": "1 aasta eest", "channel": "UCJ1jagseDkN2Uabdpc_DgQQ"} 4 | {"heart": false, "votes": "20", "photo": "https://yt3.ggpht.com/ytc/AAUvwngBfJZC9YxK0iKBXVNEnqKY0ViAnC_dc8LzuULUhQ=s176-c-k-c0x00ffffff-no-rj", "author": "通りすがりの雑魚", "cid": "UgzrhO9pAuAUWLvVgNJ4AaABAg", "text": "す る と き に", "time": "1 aasta eest", "channel": "UCvNoG6-dIvf-Ynhi11ag11g"} 5 | {"heart": false, "votes": "7", "photo": "https://yt3.ggpht.com/ytc/AAUvwnj29aY7jCgI0saENfR22J5PbAUGFiNl89ot8g=s176-c-k-c0x00ffffff-no-rj", "author": "takasaki yuuka", "cid": "UgzaDD5XZQSjfTxaB-54AaABAg", "text": "この曲difficult譜面ですらキツすぎ。", "time": "1 aasta eest", "channel": "UCvdb8L0wzHxy0Owbd8Cqlpw"} 6 | {"heart": false, "votes": "5", "photo": "https://yt3.ggpht.com/ytc/AAUvwngivBCpjyAL4-AaWUPqeceQzAHzYT6Dmwq_GSsegA=s176-c-k-c0x00ffffff-no-rj", "author": "あるふぁ", "cid": "UgwPHdXLIuGJCWz8Uf14AaABAg", "text": "I often hear this song in the bathroom (☝︎ ՞ਊ ՞)☝︎", "time": "1 aasta eest", "channel": "UCgM9wvCL02ebuCYQIFxVojQ"} 7 | {"heart": false, "votes": "3", "photo": "https://yt3.ggpht.com/ytc/AAUvwng7PoN9pjPoauulOSh6hj3EuW8-gjyWc_G0TprIGA=s176-c-k-c0x00ffffff-no-rj", "author": "Mariomixer", "cid": "Ugwg55HC1T3Jn-GEXDx4AaABAg", "text": "LOOP LOOP LOOP LOOP LOOP LOOP MIX", "time": "1 aasta eest", "channel": "UC0da7CCtQ3LfYMYY5e9QtwQ"} 8 | {"heart": false, "votes": "0", "photo": "https://yt3.ggpht.com/ytc/AAUvwng2p7X1VTsSz24E6rMBbEUGP_5ykzE4xbW2PPP8Mw=s176-c-k-c0x00ffffff-no-rj", "author": "blue", "cid": "UgwXtdRJHgNl6pkwHm54AaABAg", "text": "I made an amino community amino for taia777 fans, here's link http://aminoapps.com/invite/X5P5A5PMA8 please join coz i dont wanna end deleting it", "time": "1 aasta eest", "channel": "UCy6nbyzVfQhx3AE4islJrEQ"} 9 | {"heart": false, "votes": "7", "photo": "https://yt3.ggpht.com/ytc/AAUvwng9kNO9m5YLW45B4YUoicqnskvzAZaxDuf-jG8JLA=s176-c-k-c0x00ffffff-no-rj", "author": "Jose Martinez", "cid": "UgyLBZzcBJIYHCNpyO54AaABAg", "text": "At first I thought it was going to be easy. Then I noticed halfway it was killing me slowly -.-", "time": "10 kuu eest", "channel": "UCjYj7l1QUaMhN0f1oJHYm_w"} 10 | {"heart": false, "votes": "4", "photo": "https://yt3.ggpht.com/ytc/AAUvwngxg2sSJXu4CIOuVeIbqBQBp7F5G_4qBRhfvYYS=s176-c-k-c0x00ffffff-no-rj", "author": "Antistius", "cid": "UgyLtbQ9sj4Bpca4DE54AaABAg", "text": "Ok. I'm sorry. My bad...😰. I just thought it was dumb ok?😥 I guess it's not that bad. If it brings people together, then it must be a good thing. Sorry I didn't realize that sooner...😞", "time": "8 kuu eest (muudetud)", "channel": "UCgfwDWvqoVmna6oLCs8Dt_Q"} 11 | {"heart": false, "votes": "7", "photo": "https://yt3.ggpht.com/ytc/AAUvwngGoKJdOr68lMfdL2X5cOfi0crUh04bqMzxH4Ll8g=s176-c-k-c0x00ffffff-no-rj", "author": "Tristan Lackey", "cid": "Ugw_E44kyqzfjdzsCrx4AaABAg", "text": "This is a boss battle of the internet!", "time": "7 kuu eest", "channel": "UCdhhVKc5yy9FSoRx2tetf4Q"} 12 | {"heart": false, "votes": "3", "photo": "https://yt3.ggpht.com/ytc/AAUvwngU08u6aOUoM1dZFw4ZsIJVt21vvM7sG8qws-ow=s176-c-k-c0x00ffffff-no-rj", "author": "Panda Hiro", "cid": "UgxmIJhxeS0kbr160mh4AaABAg", "text": "➡️⬆️⬇️⬆️⬇️⬆️⬇️↙️⬇️⬆️⬇️⬆️⬇️⬇️⬆️⬇️⬆️⬇️⬆️➡️⬆️⬇️⬆️⬇️⬆️⬇️⬆️⬇️⬆️⬇️⬆️⬇️⬆️➡️⬆️⬇️⬇️⬆️⬇️⬆️⬇️⬆️⬇️⬆️⬇️", "time": "7 kuu eest", "channel": "UCUcWXorrPiE8ATNfRHR1VgQ"} 13 | {"heart": false, "votes": "1", "photo": "https://yt3.ggpht.com/ytc/AAUvwnjz7vpHS1EHAmNxiXHwcrYfFUM2y-Gie_2wnA=s176-c-k-c0x00ffffff-no-rj", "author": "oskaretc", "cid": "UgxGXzB05ED1f0UWY0B4AaABAg", "text": "what game is this from?", "time": "5 kuu eest", "channel": "UC6h80SDzPbITUtkaf0CnOYQ"} 14 | {"heart": false, "votes": "0", "photo": "https://yt3.ggpht.com/ytc/AAUvwnib0kqpAResOitSv9UgEkp1YKWs5P6VXBJOPw=s176-c-k-c0x00ffffff-no-rj", "author": "Logicattic P", "cid": "UgzXwX4gvuqmAWOBG154AaABAg", "text": "Boss battle", "time": "5 kuu eest", "channel": "UC8-x9O-KeLMEq6MTtBP46qw"} 15 | {"heart": false, "votes": "2", "photo": "https://yt3.ggpht.com/ytc/AAUvwnhgFuNBzsMEtvMhf67BuRqZvziPLr6v1KWiQKcWxg=s176-c-k-c0x00ffffff-no-rj", "author": "Quickchuckle", "cid": "UgyPhnTJ2I6hb4kORPJ4AaABAg", "text": "Checkpoint?\nI see some giant thing that's doing nothing , not so remarkable , i do see an entrance to what i assume is the next area..", "time": "2 kuu eest", "channel": "UC-IMd7yMD5fuKEBmdLjCPUQ"} 16 | {"heart": false, "votes": "2", "photo": "https://yt3.ggpht.com/ytc/AAUvwnjMdODZ63SCxBteE9-hEInYaWnGTRi7z3HmEUMlOw=s176-c-k-c0x00ffffff-no-rj", "author": "-ディーン藤が丘", "cid": "UgxStfO6xqoX0kaDve94AaABAg", "text": "この曲のRemixって公式?そうでないと信じたいけど。\n正にバカの一つ覚え、やり過ぎ、ヒドすぎる。\n元が好きなだけに残念です。", "time": "2 kuu eest", "channel": "UC31xDgEjJf3z0yPFehHINxA"} 17 | {"heart": false, "votes": "0", "photo": "https://yt3.ggpht.com/ytc/AAUvwniup9sZ7uDAa_CPU1CpF3TlCCbLLi1QcoLlqJGstA=s176-c-k-c0x00ffffff-no-rj", "author": "NT", "cid": "UgyJnUxuYsOMzqyjKzF4AaABAg", "text": "Okay Holy shit, I did not expect this epic of a song on this channel!", "time": "4 nädala eest", "channel": "UCmgKRrgmfL8xysl9Dkp_Ovg"} 18 | {"heart": false, "votes": "0", "photo": "https://yt3.ggpht.com/ytc/AAUvwnisg-d5IvyEoycc7h702QodsWBAiG8JDq44IApl=s176-c-k-c0x00ffffff-no-rj", "author": "ʙʀᴇᴀᴅ in Moss", "cid": "UgzB02BO_Cv7QiRCvjV4AaABAg", "text": "wtf why are there English words!?", "time": "4 nädala eest", "channel": "UCOGkUFpAS5y0Ych1GZOuwjg"} 19 | {"heart": false, "votes": "1", "photo": "https://yt3.ggpht.com/ytc/AAUvwnjydqg4UhWIKlEefFn2j7RgUqVhjSMFmTTP0N6fJrI=s176-c-k-c0x00ffffff-no-rj", "author": "Caballero Caballero Cesar Alejandro", "cid": "Ugy4OhPxABVI7bYZAFh4AaABAg", "text": "this isn't a checkpoint...\nthis a boss battle!", "time": "3 nädala eest", "channel": "UCRubpHGnWb6tYWIRnxg7VkQ"} 20 | {"heart": false, "votes": "0", "photo": "https://yt3.ggpht.com/ytc/AAUvwnjYIXxlQ69cOiEWvQ4pfVnupz75FePUYSuzCS3O=s176-c-k-c0x00ffffff-no-rj", "author": "uberlaughingman", "cid": "Ugynui9daqEtUShTX4h4AaABAg", "text": "this is good", "time": "6 päeva eest", "channel": "UCxnJP8yFKHd4IJR404AIvbw"} 21 | {"heart": false, "votes": "4", "photo": "https://yt3.ggpht.com/ytc/AAUvwniJ4_mleiaRMivIfyPoA-t-X6l1037Ifw-oL4G1=s176-c-k-c0x00ffffff-no-rj", "author": "鷹城鋼田", "cid": "UgxLKAqDi4w1VixWK5p4AaABAg.8rLwZrEnRLE8wDu2SOfhwU", "text": "海外兄貴にも知られる淫夢デュエマすき", "time": "1 aasta eest", "channel": "UC8HB2agNofekpjZvsWvB2qw"} 22 | {"heart": false, "votes": "5", "photo": "https://yt3.ggpht.com/ytc/AAUvwnjEVfApq-5MCcvN83sYo7rjARhF9mwwnQJv81xs_w=s176-c-k-c0x00ffffff-no-rj", "author": "イニエスト", "cid": "UgxLKAqDi4w1VixWK5p4AaABAg.8rLwZrEnRLE8uGhghUHM56", "text": "世界進出した淫夢デュエマ", "time": "1 aasta eest", "channel": "UCZArsneuKsDhZ1_PHyRKC6w"} 23 | {"heart": false, "votes": "3", "photo": "https://yt3.ggpht.com/ytc/AAUvwnhfC6Ed0WPzYTbXPaQ17i4gsCIiIbKf4F0YAEMCig=s176-c-k-c0x00ffffff-no-rj", "author": "ツバサ。", "cid": "UgxLKAqDi4w1VixWK5p4AaABAg.8rLwZrEnRLE8tymxEyU5nJ", "text": "そうだよ", "time": "1 aasta eest", "channel": "UC5ZJ7AGHVbK0a7kUMnmzVrg"} 24 | {"heart": false, "votes": "0", "photo": "https://yt3.ggpht.com/ytc/AAUvwnjZtq2YPnhTBOGMPeCNZfxxVvpZiHGUx-U1Lusl=s176-c-k-c0x00ffffff-no-rj", "author": "『Cool guys don't quote movies』", "cid": "UgyLtbQ9sj4Bpca4DE54AaABAg.9C0zMZ89-l49Kd4rJOrp8V", "text": " @ʙʀᴇᴀᴅ in Moss  It's a Roast. Welcome aboard.", "time": "4 nädala eest", "channel": "UC2YoIqW7dZViMV6FuhyWLZg"} 25 | {"heart": false, "votes": "0", "photo": "https://yt3.ggpht.com/ytc/AAUvwngxg2sSJXu4CIOuVeIbqBQBp7F5G_4qBRhfvYYS=s176-c-k-c0x00ffffff-no-rj", "author": "Antistius", "cid": "UgyLtbQ9sj4Bpca4DE54AaABAg.9C0zMZ89-l49Kcyr28cUP-", "text": " @ʙʀᴇᴀᴅ in Moss  cuz i said some bad stuff about the checkpoint meme being cringy but then i changedmymindsorry.exe", "time": "4 nädala eest", "channel": "UCgfwDWvqoVmna6oLCs8Dt_Q"} 26 | {"heart": false, "votes": "0", "photo": "https://yt3.ggpht.com/ytc/AAUvwnisg-d5IvyEoycc7h702QodsWBAiG8JDq44IApl=s176-c-k-c0x00ffffff-no-rj", "author": "ʙʀᴇᴀᴅ in Moss", "cid": "UgyLtbQ9sj4Bpca4DE54AaABAg.9C0zMZ89-l49KcySEstU_L", "text": "wh- what? What’s going on?", "time": "4 nädala eest", "channel": "UCOGkUFpAS5y0Ych1GZOuwjg"} 27 | {"heart": false, "votes": "0", "photo": "https://yt3.ggpht.com/ytc/AAUvwnhG82TnRzCpU4eh0mSqowsEDVzd36VYcfrigoOQ7w=s176-c-k-c0x00ffffff-no-rj", "author": "frankdrawsnear", "cid": "UgyLtbQ9sj4Bpca4DE54AaABAg.9C0zMZ89-l49Jip1oQkoJd", "text": "Just let people enjoy things, is it so difficult?", "time": "1 kuu eest", "channel": "UCgPTxHOXhayMU1wvFETKwYQ"} 28 | {"heart": false, "votes": "0", "photo": "https://yt3.ggpht.com/ytc/AAUvwnjZtq2YPnhTBOGMPeCNZfxxVvpZiHGUx-U1Lusl=s176-c-k-c0x00ffffff-no-rj", "author": "『Cool guys don't quote movies』", "cid": "UgyLtbQ9sj4Bpca4DE54AaABAg.9C0zMZ89-l49INh-JEJn58", "text": "agreed", "time": "2 kuu eest", "channel": "UC2YoIqW7dZViMV6FuhyWLZg"} 29 | {"heart": false, "votes": "0", "photo": "https://yt3.ggpht.com/ytc/AAUvwngxg2sSJXu4CIOuVeIbqBQBp7F5G_4qBRhfvYYS=s176-c-k-c0x00ffffff-no-rj", "author": "Antistius", "cid": "UgyLtbQ9sj4Bpca4DE54AaABAg.9C0zMZ89-l49Hc28IRY1E5", "text": " @splendid_sophie  \"People like you... are just downright bastards\"\n\n\"I respect your opinion...\"", "time": "3 kuu eest", "channel": "UCgfwDWvqoVmna6oLCs8Dt_Q"} 30 | {"heart": false, "votes": "0", "photo": "https://yt3.ggpht.com/ytc/AAUvwng_9edKVntP6SJmRameEQwpnBXG_xSQXCbY8JZR=s176-c-k-c0x00ffffff-no-rj", "author": "Crinale 13th", "cid": "UgxGXzB05ED1f0UWY0B4AaABAg.9F4aUM-RGYs9F9psCa7Bub", "text": "DDR", "time": "5 kuu eest", "channel": "UCRGpc3TAg57HmvynJiZDwuA"} 31 | {"heart": false, "votes": "7", "photo": "https://yt3.ggpht.com/ytc/AAUvwnhIHtqWzfy_-Xwn8dcYnsUlwSxw4EOHQB_e4Q=s176-c-k-c0x00ffffff-no-rj", "author": "XMarxanX", "cid": "UgjNt-OCL5KKbXgCoAEC", "text": "PERFECT", "time": "5 aasta eest", "channel": "UCkyFjuorN0hUifTdci6ioWA"} 32 | {"heart": false, "votes": "11", "photo": "https://yt3.ggpht.com/ytc/AAUvwnitbmXUrbnw3etigg5KV4CsyG9U0kb1jJ2RIMvv=s176-c-k-c0x00ffffff-no-rj", "author": "James Vega", "cid": "UghkCCuz2u2z63gCoAEC", "text": "was this official??", "time": "5 aasta eest", "channel": "UCQESNsMnBL8N4VrtnmB4L_w"} 33 | {"heart": false, "votes": "27", "photo": "https://yt3.ggpht.com/ytc/AAUvwngovbhrd_FCsJZDTkxtfgH2ncty0iJqeLdF-pHy=s176-c-k-c0x00ffffff-no-rj", "author": "Geon", "cid": "UghkjJ7G02aFSHgCoAEC", "text": "Was addicted to this song.", "time": "4 aasta eest", "channel": "UC8BGEBtG7r9iaBSYxCwcp2w"} 34 | {"heart": false, "votes": "13", "photo": "https://yt3.ggpht.com/ytc/AAUvwng_uKDXx3xxJDjT4MZKxbgmPGdkqUMZwpyKsmhW=s176-c-k-c0x00ffffff-no-rj", "author": "Gray Valence", "cid": "UghC55LYH1NyNXgCoAEC", "text": "woody", "time": "3 aasta eest", "channel": "UCAMIQ4fodT0SXdlvKafTn8w"} 35 | {"heart": false, "votes": "101", "photo": "https://yt3.ggpht.com/ytc/AAUvwniu_jz1H7YzcbUCo6IIi3riT4P1SjJ2ZmfKYArt1w=s176-c-k-c0x00ffffff-no-rj", "author": "Zarahi Sunstrider", "cid": "Ugz37rlrXySk60CVAxV4AaABAg", "text": "If the song was this long on the game you would be dead.", "time": "3 aasta eest", "channel": "UCoUW-Il0q86w__D4D8VvDMg"} 36 | {"heart": false, "votes": "0", "photo": "https://yt3.ggpht.com/ytc/AAUvwng8t8nRlinOVOdEts90-MJ3Aib1cURgoRIOZAkdQA=s176-c-k-c0x00ffffff-no-rj", "author": "uhh yeah sure i’ll have some", "cid": "UgySvE34p5XbWIzqp_N4AaABAg", "text": "CRANK THAT SHIT", "time": "3 aasta eest", "channel": "UCsxVY7rg9vKZVHxcaX9Htag"} 37 | {"heart": false, "votes": "8", "photo": "https://yt3.ggpht.com/ytc/AAUvwniT56RyWtdokrtX8ajbNzMYi4CW3OSTwXi8Qg=s176-c-k-c0x00ffffff-no-rj", "author": "NobleRoar", "cid": "UgySItyMp18JshzXE9B4AaABAg", "text": "This is not original song. It's Fake, just looping.", "time": "3 aasta eest (muudetud)", "channel": "UC2I0y6tYGQROlQ0PTL2MX5g"} 38 | {"heart": false, "votes": "8", "photo": "https://yt3.ggpht.com/ytc/AAUvwnjG2RVL0q60Sa4eTRUn7lqTIoLNSmvL1CFFFrto7w=s176-c-k-c0x00ffffff-no-rj", "author": "lampshades120", "cid": "Ugyd67hhukMxTAHIk4Z4AaABAg", "text": "Love the song but disliking because misleading title", "time": "2 aasta eest", "channel": "UCm1j_0HKk1rTUh39S-GnI6Q"} 39 | {"heart": false, "votes": "8", "photo": "https://yt3.ggpht.com/ytc/AAUvwniNqjJ8C6_rU3itw1Sz2KhOfCrWNk1lFg9nM4nc=s176-c-k-c0x00ffffff-no-rj", "author": "lion", "cid": "Ugxg-nD9cZpfSsVc29V4AaABAg", "text": "◎◎◎◎◎◎\n◎◎◎◎◎◎ \n◎◎◎◎◎◎", "time": "2 aasta eest (muudetud)", "channel": "UCheKvkni_XfIRotI_zxUEJA"} 40 | {"heart": false, "votes": "13", "photo": "https://yt3.ggpht.com/ytc/AAUvwniDHN2q_bucdhqvF0fBB7H3p2Z8BV5uFZ3HOu3O2g=s176-c-k-c0x00ffffff-no-rj", "author": "天使ラミエル", "cid": "Ugz99bI-TI_yLb_LN_Z4AaABAg", "text": "迫真デュエマから", "time": "2 aasta eest", "channel": "UCWN9-XJh28QounbufEVfyqg"} 41 | {"heart": false, "votes": "2", "photo": "https://yt3.ggpht.com/ytc/AAUvwngvnCx61gJ67WKZ2EOBFzxDWRQRfkI8i_dn1V_CSA=s176-c-k-c0x00ffffff-no-rj", "author": "Electric Zap9", "cid": "UghkCCuz2u2z63gCoAEC.86CQ9m9HJ-L973hVqTHfsZ", "text": "It was unofficial", "time": "1 aasta eest", "channel": "UCyIQhihJBpcrFX3DKUolaKA"} 42 | {"heart": false, "votes": "7", "photo": "https://yt3.ggpht.com/ytc/AAUvwniHxdw45VrC5EJWrtqCCzuR19mxm8wATdaVqV7Q=s176-c-k-c0x00ffffff-no-rj", "author": "林成勳", "cid": "UghkCCuz2u2z63gCoAEC.86CQ9m9HJ-L87jwsnjRn7j", "text": "+James Vega no", "time": "5 aasta eest", "channel": "UC5uapgklkRAbGNXbL3Oehyw"} 43 | {"heart": false, "votes": "4", "photo": "https://yt3.ggpht.com/ytc/AAUvwnhhgZMF7QT9pfMfpTaTEOZq0_TaF-9Om5iId1vZ=s176-c-k-c0x00ffffff-no-rj", "author": "Carson The Lad", "cid": "UgySItyMp18JshzXE9B4AaABAg.8d5UscgWoLV9AAKeSb_uZ-", "text": "That's what extended mixes are pal", "time": "9 kuu eest", "channel": "UCKh42a78MbnBL2mOow99jUw"} 44 | {"heart": false, "votes": "3", "photo": "https://yt3.ggpht.com/ytc/AAUvwniquyzcO9TX7M-7WTsl2A0QqvjN0UQ4Umd5FZjU=s176-c-k-c0x00ffffff-no-rj", "author": "RAC", "cid": "UgySItyMp18JshzXE9B4AaABAg.8d5UscgWoLV8dxMPJO6_x3", "text": "NobleRoar no wonder it gets booooring", "time": "3 aasta eest", "channel": "UC2e4XzGtosIfx_ZyTR0z8Og"} 45 | {"heart": false, "votes": "0", "photo": "https://yt3.ggpht.com/ytc/AAUvwnhhMrAIaSLuXrilktczwUq2SlhV8eaW2ikVcUs5Jw=s176-c-k-c0x00ffffff-no-rj", "author": "Dirty Deeds Done Dirt Cheap", "cid": "Ugz99bI-TI_yLb_LN_Z4AaABAg.8lwjXWY91lx96rqVAHzRfc", "text": " @雑草魂・ラッシュライト  本家だけ知らなかったんか…", "time": "1 aasta eest", "channel": "UCYJiLm8e_-aTQhVZTkauFqw"} 46 | {"heart": false, "votes": "0", "photo": "https://yt3.ggpht.com/ytc/AAUvwnizSZYCBCOrJjsvx4rJRgkxxYzwqKQJq28vt2hd7Q=s176-c-k-c0x00ffffff-no-rj", "author": "雑草魂・ラッシュライト", "cid": "Ugz99bI-TI_yLb_LN_Z4AaABAg.8lwjXWY91lx92HOHJCmRd8", "text": "jubeatで知ったゾ\nその後デュエマゾ", "time": "1 aasta eest", "channel": "UCt9VatpZNsCtquh8GJJohDw"} 47 | {"heart": false, "votes": "1", "photo": "https://yt3.ggpht.com/ytc/AAUvwnj5FNvNpFvwb-CX4bd7aPy9ZWIs5sLaFLTda9AUvw=s176-c-k-c0x00ffffff-no-rj", "author": "おねにいちゃん", "cid": "Ugz99bI-TI_yLb_LN_Z4AaABAg.8lwjXWY91lx8vvVbr7Cbv1", "text": "これの元の収録機種のDDRもやろうぜ!(宣伝)", "time": "1 aasta eest", "channel": "UCRrWvee5vQBN3yi5Y8AxGJg"} 48 | {"heart": false, "votes": "4", "photo": "https://yt3.ggpht.com/ytc/AAUvwnhfC6Ed0WPzYTbXPaQ17i4gsCIiIbKf4F0YAEMCig=s176-c-k-c0x00ffffff-no-rj", "author": "ツバサ。", "cid": "Ugz99bI-TI_yLb_LN_Z4AaABAg.8lwjXWY91lx8tzU0vB8Wvd", "text": "3ターンだよ3ターン", "time": "1 aasta eest", "channel": "UC5ZJ7AGHVbK0a7kUMnmzVrg"} 49 | {"heart": false, "votes": "3", "photo": "https://yt3.ggpht.com/ytc/AAUvwniBOrs5El6loiRhnn1A0GfDg2NhMzn6ZaCgih8I=s176-c-k-c0x00ffffff-no-rj", "author": "Scraped Tomato", "cid": "Ugz99bI-TI_yLb_LN_Z4AaABAg.8lwjXWY91lx8tiB-pFhLYX", "text": "例によって", "time": "1 aasta eest", "channel": "UC9ArXq0pRocWTzLXnzhiEMA"} 50 | {"heart": false, "votes": "4", "photo": "https://yt3.ggpht.com/ytc/AAUvwngweiJHnymZNPApAWM51eyFavHWd0TTXXOJr0LeRw=s176-c-k-c0x00ffffff-no-rj", "author": "NO NAME", "cid": "Ugz99bI-TI_yLb_LN_Z4AaABAg.8lwjXWY91lx8r0p7hmf5SQ", "text": "す る と き に", "time": "2 aasta eest", "channel": "UCwxEK0iHxkjXKp9pQmf1JOA"} 51 | {"heart": false, "votes": "3", "photo": "https://yt3.ggpht.com/ytc/AAUvwng62EtmNsvAJ1L9pvNXIV1Q3IFdblK9euidaWmj=s176-c-k-c0x00ffffff-no-rj", "author": "黒い手袋", "cid": "Ugz99bI-TI_yLb_LN_Z4AaABAg.8lwjXWY91lx8mB8FnF70k6", "text": "同じく", "time": "2 aasta eest", "channel": "UCrsrqL11ciQ3Hdv2nFffAsA"} 52 | -------------------------------------------------------------------------------- /bun.lockb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geauser/internetcheckpoint/f9b80c9e6c889a825287a407058905fd68c44c9a/bun.lockb -------------------------------------------------------------------------------- /cdk.context.json: -------------------------------------------------------------------------------- 1 | { 2 | "hosted-zone:account=721495094797:domainName=internetcheckpoint.page:region=us-east-1": { 3 | "Id": "/hostedzone/Z03613576W0NBBXZBEMW", 4 | "Name": "internetcheckpoint.page." 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /firebase/.firebaserc: -------------------------------------------------------------------------------- 1 | { 2 | "projects": { 3 | "default": "internetcheckpoint-de64f" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /firebase/firebase.json: -------------------------------------------------------------------------------- 1 | { 2 | "emulators": { 3 | "auth": { 4 | "port": 9099 5 | }, 6 | "ui": { 7 | "enabled": true 8 | } 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "internetcheckpoint", 3 | "version": "0.0.0", 4 | "devDependencies": { 5 | "@tsconfig/node20": "^20.1.4", 6 | "@types/download": "^8.0.2", 7 | "@types/jsdom": "^21.1.1", 8 | "aws-cdk-lib": "2.91.0", 9 | "constructs": "10.2.69", 10 | "download": "^8.0.0", 11 | "jsdom": "^22.1.0", 12 | "sst": "2.24.7", 13 | "tsx": "^3.12.7", 14 | "ttab": "^0.8.0", 15 | "typescript": "^5.0.4" 16 | }, 17 | "private": true, 18 | "scripts": { 19 | "firebase": "cd firebase && mkdir -p persistent-export && firebase emulators:start --import ./persistent-export --export-on-exit ./persistent-export", 20 | "loadSecrets": "sh -c 'sst secrets load ${0}.env --stage ${0}'", 21 | "dev": "sst dev", 22 | "build": "sst build", 23 | "deploy": "sst deploy", 24 | "remove": "sst remove", 25 | "console": "sst console", 26 | "typecheck": "tsc --noEmit", 27 | "secrets:load": "sst secrets load ./local.secrets --stage local", 28 | "secrets:load:dev": "sst secrets load ./dev.secrets --stage dev", 29 | "secrets:load:prod": "sst secrets load ./prod.secrets --stage prod" 30 | }, 31 | "type": "module", 32 | "workspaces": [ 33 | "packages/*" 34 | ] 35 | } 36 | -------------------------------------------------------------------------------- /packages/functions/drizzle.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from "drizzle-kit"; 2 | 3 | export default defineConfig({ 4 | dialect: "postgresql", 5 | schema: "./src/db/schema.ts", 6 | out: "./drizzle" 7 | }); 8 | -------------------------------------------------------------------------------- /packages/functions/drizzle/0000_romantic_strong_guy.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE IF NOT EXISTS "comments" ( 2 | "id" varchar(100) NOT NULL, 3 | "authorChannelId" varchar(150), 4 | "text" varchar(10000), 5 | "importedAuthorName" varchar(200), 6 | "importedAuthorPhoto" varchar(300), 7 | "votes" integer DEFAULT 0, 8 | "repliesCount" integer DEFAULT 0, 9 | "createdAt" timestamp DEFAULT now(), 10 | "score" double precision, 11 | "videoId" varchar(255), 12 | CONSTRAINT "comments_id_pk" PRIMARY KEY("id") 13 | ); 14 | --> statement-breakpoint 15 | CREATE TABLE IF NOT EXISTS "videos" ( 16 | "id" varchar(255) NOT NULL, 17 | "title" varchar(1000), 18 | "viewCount" integer, 19 | "likeCount" integer, 20 | "dislikeCount" integer, 21 | "publishedAt" timestamp, 22 | CONSTRAINT "videos_id_pk" PRIMARY KEY("id") 23 | ); 24 | --> statement-breakpoint 25 | CREATE TABLE IF NOT EXISTS "owners" ( 26 | "uid" varchar(255) PRIMARY KEY NOT NULL, 27 | "channelId" varchar(255) 28 | ); 29 | --> statement-breakpoint 30 | CREATE INDEX IF NOT EXISTS "comment_repliesCount_idx" ON "comments" USING btree ("repliesCount");--> statement-breakpoint 31 | CREATE INDEX IF NOT EXISTS "comment_score_idx" ON "comments" USING btree ("score");--> statement-breakpoint 32 | CREATE INDEX IF NOT EXISTS "comment_videoId_idx" ON "comments" USING btree ("videoId");--> statement-breakpoint 33 | CREATE INDEX IF NOT EXISTS "comment_votes_idx" ON "comments" USING btree ("votes");--> statement-breakpoint 34 | CREATE INDEX IF NOT EXISTS "comment_authorChannelId_idx" ON "comments" USING btree ("authorChannelId");--> statement-breakpoint 35 | CREATE UNIQUE INDEX IF NOT EXISTS "uid_channelId_unique_idx" ON "owners" USING btree ("uid","channelId"); -------------------------------------------------------------------------------- /packages/functions/drizzle/meta/0000_snapshot.json: -------------------------------------------------------------------------------- 1 | { 2 | "id": "f65cd41e-2859-41d0-bd8d-df39ed2dc550", 3 | "prevId": "00000000-0000-0000-0000-000000000000", 4 | "version": "7", 5 | "dialect": "postgresql", 6 | "tables": { 7 | "public.comments": { 8 | "name": "comments", 9 | "schema": "", 10 | "columns": { 11 | "id": { 12 | "name": "id", 13 | "type": "varchar(100)", 14 | "primaryKey": false, 15 | "notNull": true 16 | }, 17 | "authorChannelId": { 18 | "name": "authorChannelId", 19 | "type": "varchar(150)", 20 | "primaryKey": false, 21 | "notNull": false 22 | }, 23 | "text": { 24 | "name": "text", 25 | "type": "varchar(10000)", 26 | "primaryKey": false, 27 | "notNull": false 28 | }, 29 | "importedAuthorName": { 30 | "name": "importedAuthorName", 31 | "type": "varchar(200)", 32 | "primaryKey": false, 33 | "notNull": false 34 | }, 35 | "importedAuthorPhoto": { 36 | "name": "importedAuthorPhoto", 37 | "type": "varchar(300)", 38 | "primaryKey": false, 39 | "notNull": false 40 | }, 41 | "votes": { 42 | "name": "votes", 43 | "type": "integer", 44 | "primaryKey": false, 45 | "notNull": false, 46 | "default": 0 47 | }, 48 | "repliesCount": { 49 | "name": "repliesCount", 50 | "type": "integer", 51 | "primaryKey": false, 52 | "notNull": false, 53 | "default": 0 54 | }, 55 | "createdAt": { 56 | "name": "createdAt", 57 | "type": "timestamp", 58 | "primaryKey": false, 59 | "notNull": false, 60 | "default": "now()" 61 | }, 62 | "score": { 63 | "name": "score", 64 | "type": "double precision", 65 | "primaryKey": false, 66 | "notNull": false 67 | }, 68 | "videoId": { 69 | "name": "videoId", 70 | "type": "varchar(255)", 71 | "primaryKey": false, 72 | "notNull": false 73 | } 74 | }, 75 | "indexes": { 76 | "comment_repliesCount_idx": { 77 | "name": "comment_repliesCount_idx", 78 | "columns": [ 79 | { 80 | "expression": "repliesCount", 81 | "isExpression": false, 82 | "asc": true, 83 | "nulls": "last" 84 | } 85 | ], 86 | "isUnique": false, 87 | "concurrently": false, 88 | "method": "btree", 89 | "with": {} 90 | }, 91 | "comment_score_idx": { 92 | "name": "comment_score_idx", 93 | "columns": [ 94 | { 95 | "expression": "score", 96 | "isExpression": false, 97 | "asc": true, 98 | "nulls": "last" 99 | } 100 | ], 101 | "isUnique": false, 102 | "concurrently": false, 103 | "method": "btree", 104 | "with": {} 105 | }, 106 | "comment_videoId_idx": { 107 | "name": "comment_videoId_idx", 108 | "columns": [ 109 | { 110 | "expression": "videoId", 111 | "isExpression": false, 112 | "asc": true, 113 | "nulls": "last" 114 | } 115 | ], 116 | "isUnique": false, 117 | "concurrently": false, 118 | "method": "btree", 119 | "with": {} 120 | }, 121 | "comment_votes_idx": { 122 | "name": "comment_votes_idx", 123 | "columns": [ 124 | { 125 | "expression": "votes", 126 | "isExpression": false, 127 | "asc": true, 128 | "nulls": "last" 129 | } 130 | ], 131 | "isUnique": false, 132 | "concurrently": false, 133 | "method": "btree", 134 | "with": {} 135 | }, 136 | "comment_authorChannelId_idx": { 137 | "name": "comment_authorChannelId_idx", 138 | "columns": [ 139 | { 140 | "expression": "authorChannelId", 141 | "isExpression": false, 142 | "asc": true, 143 | "nulls": "last" 144 | } 145 | ], 146 | "isUnique": false, 147 | "concurrently": false, 148 | "method": "btree", 149 | "with": {} 150 | } 151 | }, 152 | "foreignKeys": {}, 153 | "compositePrimaryKeys": { 154 | "comments_id_pk": { 155 | "name": "comments_id_pk", 156 | "columns": [ 157 | "id" 158 | ] 159 | } 160 | }, 161 | "uniqueConstraints": {}, 162 | "policies": {}, 163 | "checkConstraints": {}, 164 | "isRLSEnabled": false 165 | }, 166 | "public.videos": { 167 | "name": "videos", 168 | "schema": "", 169 | "columns": { 170 | "id": { 171 | "name": "id", 172 | "type": "varchar(255)", 173 | "primaryKey": false, 174 | "notNull": true 175 | }, 176 | "title": { 177 | "name": "title", 178 | "type": "varchar(1000)", 179 | "primaryKey": false, 180 | "notNull": false 181 | }, 182 | "viewCount": { 183 | "name": "viewCount", 184 | "type": "integer", 185 | "primaryKey": false, 186 | "notNull": false 187 | }, 188 | "likeCount": { 189 | "name": "likeCount", 190 | "type": "integer", 191 | "primaryKey": false, 192 | "notNull": false 193 | }, 194 | "dislikeCount": { 195 | "name": "dislikeCount", 196 | "type": "integer", 197 | "primaryKey": false, 198 | "notNull": false 199 | }, 200 | "publishedAt": { 201 | "name": "publishedAt", 202 | "type": "timestamp", 203 | "primaryKey": false, 204 | "notNull": false 205 | } 206 | }, 207 | "indexes": {}, 208 | "foreignKeys": {}, 209 | "compositePrimaryKeys": { 210 | "videos_id_pk": { 211 | "name": "videos_id_pk", 212 | "columns": [ 213 | "id" 214 | ] 215 | } 216 | }, 217 | "uniqueConstraints": {}, 218 | "policies": {}, 219 | "checkConstraints": {}, 220 | "isRLSEnabled": false 221 | }, 222 | "public.owners": { 223 | "name": "owners", 224 | "schema": "", 225 | "columns": { 226 | "uid": { 227 | "name": "uid", 228 | "type": "varchar(255)", 229 | "primaryKey": true, 230 | "notNull": true 231 | }, 232 | "channelId": { 233 | "name": "channelId", 234 | "type": "varchar(255)", 235 | "primaryKey": false, 236 | "notNull": false 237 | } 238 | }, 239 | "indexes": { 240 | "uid_channelId_unique_idx": { 241 | "name": "uid_channelId_unique_idx", 242 | "columns": [ 243 | { 244 | "expression": "uid", 245 | "isExpression": false, 246 | "asc": true, 247 | "nulls": "last" 248 | }, 249 | { 250 | "expression": "channelId", 251 | "isExpression": false, 252 | "asc": true, 253 | "nulls": "last" 254 | } 255 | ], 256 | "isUnique": true, 257 | "concurrently": false, 258 | "method": "btree", 259 | "with": {} 260 | } 261 | }, 262 | "foreignKeys": {}, 263 | "compositePrimaryKeys": {}, 264 | "uniqueConstraints": {}, 265 | "policies": {}, 266 | "checkConstraints": {}, 267 | "isRLSEnabled": false 268 | } 269 | }, 270 | "enums": {}, 271 | "schemas": {}, 272 | "sequences": {}, 273 | "roles": {}, 274 | "policies": {}, 275 | "views": {}, 276 | "_meta": { 277 | "columns": {}, 278 | "schemas": {}, 279 | "tables": {} 280 | } 281 | } -------------------------------------------------------------------------------- /packages/functions/drizzle/meta/_journal.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "7", 3 | "dialect": "postgresql", 4 | "entries": [ 5 | { 6 | "idx": 0, 7 | "version": "7", 8 | "when": 1730969830709, 9 | "tag": "0000_romantic_strong_guy", 10 | "breakpoints": true 11 | } 12 | ] 13 | } -------------------------------------------------------------------------------- /packages/functions/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@internetcheckpoint/functions", 3 | "version": "0.0.0", 4 | "type": "module", 5 | "scripts": { 6 | "test": "sst bind vitest", 7 | "typecheck": "tsc -noEmit", 8 | "seed": "sst bind bun ./scripts/seed.ts", 9 | "generate": "drizzle-kit generate", 10 | "migrate": "sst bind bun ./src/db/migrate.ts" 11 | }, 12 | "devDependencies": { 13 | "@types/aws-lambda": "^8.10.115", 14 | "@types/node": "^20.2.5", 15 | "sst": "2.24.7", 16 | "vitest": "^0.31.4" 17 | }, 18 | "dependencies": { 19 | "@planetscale/database": "^1.10.0", 20 | "dayjs": "^1.11.8", 21 | "drizzle-kit": "^0.28.0", 22 | "drizzle-orm": "^0.36.1", 23 | "firebase-admin": "^11.10.1", 24 | "node-fetch": "^3.3.2", 25 | "postgres": "^3.4.5" 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /packages/functions/scripts/loadBackups.ts: -------------------------------------------------------------------------------- 1 | import fs from 'node:fs'; 2 | import path from 'node:path'; 3 | import dayjs from 'dayjs'; 4 | import { CommentTable, db } from 'planetscale/db'; 5 | 6 | 7 | 8 | (async () => { 9 | 10 | 11 | const backupsFolderPath = path.join(process.cwd(), '../../backups'); 12 | const files = fs.readdirSync(backupsFolderPath); 13 | const repliesCounts:Record = {}; 14 | const comments: (Omit & { id: string })[] = []; 15 | 16 | 17 | for (const file of files) { 18 | 19 | // read content of the file 20 | const content = fs.readFileSync(`${backupsFolderPath}/${file}`, 'utf-8'); 21 | const lines = content.split('\n'); 22 | 23 | // Count the number of replies 24 | for (const line of lines) { 25 | 26 | try { 27 | 28 | const comment = JSON.parse(line.trim()); 29 | const isReply = comment.cid.includes('.'); 30 | 31 | if (isReply) { 32 | const targetCommentId = comment.cid.split('.')[0]; 33 | repliesCounts[targetCommentId] = (repliesCounts[targetCommentId] ?? 0) + 1; 34 | } 35 | 36 | } catch (err) {} 37 | 38 | } 39 | 40 | for (const line of lines) { 41 | 42 | try { 43 | 44 | const comment = JSON.parse(line.trim()); 45 | 46 | if (isNaN(parseInt(comment.votes, 10))) { 47 | throw new Error('Votes is not a number'); 48 | } 49 | 50 | const time = comment.time.replace('eest', '').replace('(muudetud)', ''); 51 | const value = parseInt(time.split(' ')[0]); 52 | 53 | const unit = (() => { 54 | switch (time.split(' ')[1]) { 55 | case 'sekundi': return 'second'; 56 | case 'minuti': return 'minute'; 57 | case 'tunni': return 'hour'; 58 | case 'päeva': return 'day'; 59 | case 'kuu': return 'month'; 60 | case 'aasta': return 'year'; 61 | case 'nädala': return 'week'; 62 | default: throw new Error('Unknown unit'); 63 | } 64 | })(); 65 | 66 | const isReply = comment.cid.includes('.'); 67 | 68 | const createdAt = dayjs('2021-04-07').subtract(value, unit).toDate(); 69 | const votes = parseInt(comment.votes, 10); 70 | const repliesCount = repliesCounts[comment.cid] ?? 0; 71 | 72 | const standardDeviation = 1000, peak = 1500, height = 1; 73 | 74 | const score = 75 | Math.max(repliesCount, 1) * 76 | (Math.max(votes, 1) / 3) * 77 | height * Math.exp( 78 | -Math.pow(comment.text.length - peak, 2) / 79 | (2 * Math.pow(standardDeviation, 2)) 80 | ); 81 | 82 | comments.push({ 83 | id: comment.cid, 84 | authorUid: null, 85 | authorChannelId: comment.channel, 86 | text: comment.text, 87 | importedAuthorName: comment.author, 88 | importedAuthorPhoto: comment.photo, 89 | votes, 90 | repliesCount, 91 | score: isReply ? null : score, 92 | createdAt, 93 | }); 94 | 95 | } catch (err) {} 96 | 97 | } 98 | 99 | }; 100 | 101 | 102 | if (process.argv[2] === 'update') { 103 | 104 | let promises = []; 105 | 106 | for (let i = 0; i < comments.length; i++) { 107 | 108 | promises.push(db 109 | .updateTable('comment') 110 | .where('id', '=', comments[i].id) 111 | .set({ 112 | createdAt: comments[i].createdAt, 113 | score: comments[i].score, 114 | }) 115 | .execute()); 116 | 117 | if (promises.length % 100 === 0 || promises.length === comments.length) { 118 | await Promise.all(promises); 119 | console.log('Updated', `${promises.length}/${comments.length}`, '...'); 120 | } 121 | 122 | } 123 | 124 | process.exit(0); 125 | } 126 | 127 | let inserted = 0; 128 | // Use chunk to avoid issues with planetscale 129 | const CHUNK_SIZE = 1000; 130 | 131 | for (let i = 0; i < comments.length; i += CHUNK_SIZE) { 132 | const chunk = comments.slice(i, i + CHUNK_SIZE); 133 | 134 | await db 135 | .insertInto('comment') 136 | .values(chunk) 137 | .execute() 138 | .catch(err => { 139 | console.log(err); 140 | process.exit(1); 141 | }); 142 | 143 | inserted += chunk.length; 144 | 145 | console.log(`Inserted ${inserted}/${comments.length} ...`); 146 | } 147 | 148 | process.exit(0); 149 | 150 | 151 | })(); -------------------------------------------------------------------------------- /packages/functions/scripts/seed.ts: -------------------------------------------------------------------------------- 1 | import iconv from "iconv-lite"; 2 | import fs from 'node:fs'; 3 | import path from 'node:path'; 4 | import { db } from '@db'; 5 | import { Comments, Videos, type Comment } from '@db/schema'; 6 | import dayjs from 'dayjs'; 7 | import { eq } from "drizzle-orm"; 8 | 9 | 10 | function sanitizeAndEncodeString(str: string): string { 11 | // First, remove null bytes 12 | const sanitized = str.replace(/\0/g, ''); 13 | // Then, ensure it's properly encoded as UTF-8 14 | return iconv.decode(iconv.encode(sanitized, 'utf8'), 'utf8'); 15 | } 16 | 17 | function estimateCommentCreationDate(time: string) { 18 | 19 | const parsedTime = time.replace('eest', '').replace('(muudetud)', ''); 20 | const value = parseInt(parsedTime.split(' ')[0]); 21 | 22 | const unit = (() => { 23 | switch (parsedTime.split(' ')[1]) { 24 | case 'sekundi': return 'second'; 25 | case 'minuti': return 'minute'; 26 | case 'tunni': return 'hour'; 27 | case 'päeva': return 'day'; 28 | case 'kuu': return 'month'; 29 | case 'aasta': return 'year'; 30 | case 'nädala': return 'week'; 31 | default: throw new Error('Unknown unit'); 32 | } 33 | })(); 34 | 35 | // 2021-04-07 is the date when Rebane did the backup 36 | return dayjs('2021-04-07').subtract(value, unit).toDate(); 37 | 38 | } 39 | 40 | function computeCommentScore(repliesCount: number, votesCount: number, textLength: number) { 41 | 42 | const sd = 1000, optimalTarget = 1500; 43 | 44 | // Gaussian distribution of the score along with an optimal score 45 | // for text that are 1500 characters long. 46 | const textLengthScore = Math.exp(-Math.pow(textLength - optimalTarget, 2) / (2 * Math.pow(sd, 2))); 47 | 48 | // Replies count 3 times more than votes in the scoring system. 49 | const repliesCountScore = Math.max(repliesCount, 1); 50 | const votesCountScore = Math.max(votesCount, 1) / 3; 51 | 52 | return repliesCountScore * votesCountScore * textLengthScore; 53 | } 54 | 55 | 56 | const cwd = process.cwd(); 57 | 58 | if (cwd.split('/').pop() !== 'functions') { 59 | console.log(cwd); 60 | console.log('[ERROR] Please run this script from the root of "packages/functions"'); 61 | process.exit(1); 62 | } 63 | 64 | const replies = new Map(); 65 | const comments: Comment[] = []; 66 | const backupFolderPath = path.join(path.join(cwd, '../../backups')); 67 | const metadata = await import(path.join(backupFolderPath, '_metadata.json')).catch(err => {}) ?? {}; 68 | const files = fs.readdirSync(backupFolderPath).filter(f => f !== '_metadata.json'); 69 | 70 | 71 | console.log('\nCounting replies ...\n'); 72 | 73 | // Count the number of replies for each comment (that is not a reply itself) 74 | for (const file of files) { 75 | 76 | const lines = fs.readFileSync(path.join(backupFolderPath, file), 'utf-8').split('\n'); 77 | 78 | for (const line of lines) { 79 | 80 | if (!line.trim()) continue; 81 | 82 | const comment = JSON.parse(line.trim()); 83 | const commentIdBeingRepliedTo = comment.cid.split('.')[0]; 84 | replies.set(commentIdBeingRepliedTo, (replies.get(commentIdBeingRepliedTo) ?? 0) + 1); 85 | 86 | } 87 | 88 | } 89 | 90 | console.log('\nProcessing backups ...\n'); 91 | 92 | // Create a database ready object for each comment based on 93 | // the data from the backup files. 94 | for (const file of files) { 95 | 96 | const lines = fs.readFileSync(path.join(backupFolderPath, file), 'utf-8').split('\n'); 97 | 98 | for (const line of lines) { 99 | 100 | if (!line.trim()) continue; 101 | 102 | const comment = JSON.parse(line.trim()); 103 | 104 | // 'tuh' means 'thousand' in Estonian 105 | // it's the equivalent of 'k' in English 106 | if (comment.votes.includes('tuh')) { 107 | comment.votes = parseFloat(comment.votes.replace(' tuh', '').replace(',', '.')) * 1000; 108 | } 109 | 110 | const isReply = comment.cid.includes('.'); 111 | const votes = parseInt(comment.votes, 10); 112 | const repliesCount = replies.get(comment.cid) ?? 0; 113 | 114 | comments.push({ 115 | id: comment.cid, 116 | // The filename in Rebane's backup are the videoId where the 117 | // comment was posted, so we use them here. 118 | videoId: file.replace('.json', ''), 119 | authorChannelId: comment.channel, 120 | text: sanitizeAndEncodeString(comment.text), 121 | importedAuthorName: sanitizeAndEncodeString(comment.author), 122 | importedAuthorPhoto: comment.photo, 123 | votes, 124 | repliesCount, 125 | score: isReply ? null : computeCommentScore(repliesCount, votes, comment.text.length), 126 | createdAt: estimateCommentCreationDate(comment.time).toISOString(), 127 | }); 128 | 129 | } 130 | } 131 | 132 | console.log('\nInserting videos ...\n'); 133 | 134 | // Insert the videos into the database 135 | for (const videoId in metadata.default) { 136 | const videoData = metadata[videoId]; 137 | 138 | const videoAlreadyExists = await db 139 | .select() 140 | .from(Videos) 141 | .where(eq(Videos.id, videoId)) 142 | .limit(1) 143 | .execute(); 144 | 145 | if (videoAlreadyExists.length > 0) continue; 146 | 147 | const { 148 | title, 149 | viewCount, 150 | likeCount, 151 | dislikeCount, 152 | publishedAt, 153 | } = videoData; 154 | 155 | console.log('Inserting video', videoId, '...'); 156 | 157 | await db 158 | .insert(Videos) 159 | .values({ 160 | id: videoId, 161 | title, 162 | viewCount, 163 | likeCount, 164 | dislikeCount, 165 | publishedAt: dayjs(publishedAt).toISOString(), 166 | }) 167 | .execute(); 168 | } 169 | 170 | console.log('\nInserting comments ...\n'); 171 | 172 | // Insert the comments into the database 173 | let inserted = 0; 174 | const CHUNK_SIZE = 1000; 175 | 176 | for (let i = 0; i < comments.length; i += CHUNK_SIZE) { 177 | const chunk = comments.slice(i, i + CHUNK_SIZE); 178 | 179 | 180 | await db 181 | .insert(Comments) 182 | .values(chunk) 183 | .execute() 184 | .catch(err => { 185 | console.log(chunk); 186 | console.log(err); 187 | process.exit(1); 188 | }); 189 | 190 | 191 | inserted += chunk.length; 192 | 193 | console.log(`Inserted ${inserted}/${comments.length} comments ...`); 194 | } 195 | 196 | process.exit(0); 197 | -------------------------------------------------------------------------------- /packages/functions/src/authorizer.ts: -------------------------------------------------------------------------------- 1 | import { APIGatewayEvent } from "aws-lambda"; 2 | import { getAuth } from "./utils/firebase"; 3 | 4 | 5 | export const handler = async (event: APIGatewayEvent) => { 6 | 7 | try { 8 | const token = event.headers.authorization?.replace('Bearer ', ''); 9 | const user = await getAuth().verifyIdToken(token ?? ''); 10 | return { 11 | isAuthorized: true, 12 | context: { 13 | user, 14 | } 15 | }; 16 | } catch (err) { 17 | console.error(err); 18 | return { 19 | isAuthorized: false, 20 | context: {}, 21 | }; 22 | } 23 | 24 | }; 25 | -------------------------------------------------------------------------------- /packages/functions/src/checkpoints.ts: -------------------------------------------------------------------------------- 1 | import { ApiHandler } from "sst/node/api"; 2 | import { Comments, Owners } from "@db/schema"; 3 | import { db } from "@db"; 4 | import { and, eq, inArray, notLike, sql } from "drizzle-orm"; 5 | import { getUser } from "./utils/firebase"; 6 | 7 | 8 | export const handler = ApiHandler(async (event) => { 9 | 10 | const user = getUser(event); 11 | let checkpoints: unknown[] = []; 12 | 13 | console.log(user.uid); 14 | 15 | const channelIds = await db 16 | .select({ 17 | channelId: Owners.channelId, 18 | }) 19 | .from(Owners) 20 | .where(eq(Owners.uid, user.uid)) 21 | .execute() 22 | .then((rows) => rows.map((row) => row.channelId).filter((id) => !!id)) as string[]; 23 | 24 | 25 | if (channelIds.length) { 26 | 27 | checkpoints = await db 28 | .select() 29 | .from(Comments) 30 | .where( 31 | and( 32 | inArray(Comments.authorChannelId, channelIds), 33 | notLike(Comments.id, '%.%'), 34 | ) 35 | ) 36 | .orderBy(sql`${Comments.id} DESC`) 37 | .execute(); 38 | 39 | } 40 | 41 | return { 42 | statusCode: 200, 43 | headers: { 'Content-Type': 'application/json' }, 44 | body: JSON.stringify(checkpoints), 45 | }; 46 | 47 | }); 48 | -------------------------------------------------------------------------------- /packages/functions/src/comments.ts: -------------------------------------------------------------------------------- 1 | import { db } from "@db"; 2 | import { Comments } from "@db/schema"; 3 | import { APIGatewayProxyHandlerV2 } from "aws-lambda"; 4 | import { and, eq, like, notLike, sql } from "drizzle-orm"; 5 | 6 | 7 | export const handler: APIGatewayProxyHandlerV2 = async (event) => { 8 | 9 | const videoId = event.queryStringParameters?.videoId ?? null; 10 | const repliesOf = event.queryStringParameters?.repliesOf ?? null; 11 | const batchIndex = parseInt(event.queryStringParameters?.batch ?? '0', 10); 12 | const isLoadingReplies = !!repliesOf; 13 | const isNotLoadingReplies = !isLoadingReplies; 14 | const batchSize = isLoadingReplies ? 10 : 100; 15 | 16 | 17 | let query = db.select().from(Comments); 18 | 19 | if (isLoadingReplies) { 20 | query 21 | .where(like(Comments.id, `${repliesOf}.%`)) 22 | .orderBy(sql`${Comments.id} ASC`); 23 | } 24 | 25 | if (isNotLoadingReplies) { 26 | query 27 | .where( 28 | and( 29 | eq(Comments.videoId, videoId ?? ''), 30 | notLike(Comments.id, '%.%'), 31 | ) 32 | ) 33 | .orderBy(sql`${Comments.score} DESC`); 34 | } 35 | 36 | 37 | const comments = await query.offset(batchIndex * batchSize).limit(batchSize).execute(); 38 | 39 | return { 40 | statusCode: 200, 41 | headers: { 'Content-Type': 'application/json' }, 42 | body: JSON.stringify({ comments }), 43 | }; 44 | }; 45 | -------------------------------------------------------------------------------- /packages/functions/src/db/index.ts: -------------------------------------------------------------------------------- 1 | import { drizzle } from "drizzle-orm/postgres-js"; 2 | import { Config } from "sst/node/config"; 3 | import * as schema from "./schema"; 4 | import postgres from "postgres"; 5 | 6 | 7 | const connection = postgres(Config.DATABASE_URL, { prepare: true }); 8 | 9 | // Create the Drizzle ORM instance 10 | export const db = drizzle(connection, { schema }); 11 | -------------------------------------------------------------------------------- /packages/functions/src/db/migrate.ts: -------------------------------------------------------------------------------- 1 | import { migrate } from "drizzle-orm/postgres-js/migrator"; 2 | import { Config } from "sst/node/config"; 3 | import chalk from "chalk"; 4 | import { db } from "@db"; 5 | 6 | try { 7 | console.log( 8 | chalk.gray('Connecting to'), 9 | `${chalk.white(Config.DATABASE_URL)}`, 10 | chalk.gray('...'), 11 | ); 12 | 13 | console.log(chalk.gray('Migrating on stage'), chalk.bold.yellow(Config.STAGE), chalk.gray('...')); 14 | 15 | const options = { migrationsFolder: "./drizzle" }; 16 | 17 | await migrate(db, options); 18 | 19 | console.log(chalk.green('Migration complete!')); 20 | console.log('\n'); 21 | process.exit(0); 22 | } catch (err) { 23 | console.error(`[DRIZZLE] An error occurred: ${err}`); 24 | } 25 | -------------------------------------------------------------------------------- /packages/functions/src/db/schema.ts: -------------------------------------------------------------------------------- 1 | import { 2 | doublePrecision, 3 | index, 4 | integer, 5 | pgTable, 6 | primaryKey, 7 | timestamp, 8 | uniqueIndex, 9 | varchar 10 | } from "drizzle-orm/pg-core"; 11 | 12 | const len = (length: number) => ({ length }); 13 | 14 | 15 | export type Comment = typeof Comments.$inferSelect; 16 | export const Comments = pgTable("comments", { 17 | 18 | id: varchar("id", len(100)).notNull(), 19 | authorChannelId: varchar("authorChannelId", len(150)), 20 | text: varchar("text", len(10000)), 21 | importedAuthorName: varchar("importedAuthorName", len(200)), 22 | importedAuthorPhoto: varchar("importedAuthorPhoto", len(300)), 23 | votes: integer("votes").default(0), 24 | repliesCount: integer("repliesCount").default(0), 25 | createdAt: timestamp("createdAt", { mode: 'string' }).defaultNow(), 26 | score: doublePrecision("score"), 27 | videoId: varchar("videoId", len(255)), 28 | 29 | }, 30 | (table) => [ 31 | index("comment_repliesCount_idx").on(table.repliesCount), 32 | index("comment_score_idx").on(table.score), 33 | index("comment_videoId_idx").on(table.videoId), 34 | index("comment_votes_idx").on(table.votes), 35 | index("comment_authorChannelId_idx").on(table.authorChannelId), 36 | primaryKey({ columns: [table.id] }) 37 | ]); 38 | 39 | export type Video = typeof Videos.$inferSelect; 40 | export const Videos = pgTable("videos", { 41 | 42 | id: varchar("id", len(255)).notNull(), 43 | title: varchar("title", len(1000)), 44 | viewCount: integer("viewCount"), 45 | likeCount: integer("likeCount"), 46 | dislikeCount: integer("dislikeCount"), 47 | publishedAt: timestamp("publishedAt", { mode: 'string' }), 48 | 49 | }, 50 | (table) => [primaryKey({ columns: [table.id] })] 51 | ); 52 | 53 | export type Owner = typeof Owners.$inferSelect; 54 | export const Owners = pgTable("owners", { 55 | uid: varchar("uid", len(255)).primaryKey(), 56 | channelId: varchar("channelId", len(255)), 57 | }, (table) => ([ 58 | uniqueIndex("uid_channelId_unique_idx").on(table.uid, table.channelId), 59 | ])); 60 | 61 | 62 | // export const comment = mysqlTable("comment", { 63 | 64 | // id: varchar("id", len(100)).primaryKey(), 65 | // videoId: varchar("videoId", len(150)), 66 | // authorUid: varchar("authorUid", len(30)), 67 | // authorChannelId: varchar("authorChannelId", len(150)), 68 | // text: varchar("text", len(10000)), 69 | // importedAuthorName: varchar("importedAuthorName", len(200)), 70 | // importedAuthorPhoto: varchar("importedAuthorPhoto", len(300)), 71 | // votes: int("votes"), 72 | // repliesCount: int("repliesCount"), 73 | // score: float("score"), 74 | // createdAt: timestamp("createdAt"), 75 | // extra: json("extra"), 76 | 77 | // }, (table) => ({ 78 | // videoIdIdx: index('video_id_idx').on(table.videoId), 79 | // repliesCountIdx: index('replies_count_idx').on(table.repliesCount), 80 | // votesIdx: index('votes_idx').on(table.votes), 81 | // })); 82 | 83 | // export const video = mysqlTable("video", { 84 | 85 | // id: varchar("id", len(100)).primaryKey(), 86 | // title: varchar("title", len(1000)), 87 | // viewCount: int("viewCount"), 88 | // likeCount: int("likeCount"), 89 | // dislikeCount: int("dislikeCount"), 90 | // publishedAt: timestamp("publishedAt"), 91 | 92 | // }); 93 | -------------------------------------------------------------------------------- /packages/functions/src/restore.ts: -------------------------------------------------------------------------------- 1 | import { db } from "@db"; 2 | import { Owners } from "@db/schema"; 3 | import fetch from 'node-fetch'; 4 | import { getUser } from "./utils/firebase"; 5 | import { ApiHandler } from "sst/node/api"; 6 | 7 | 8 | export const handler = ApiHandler(async (event) => { 9 | 10 | const user = getUser(event); 11 | const accessToken = event.queryStringParameters?.token ?? null; 12 | 13 | if (!accessToken) { 14 | return { 15 | statusCode: 400, 16 | headers: { 'Content-Type': 'application/json' }, 17 | body: JSON.stringify({ error: 'Missing google access token' }), 18 | }; 19 | } 20 | 21 | const res = await fetch(`https://www.googleapis.com/youtube/v3/channels?part=id&mine=true&access_token=${accessToken}`); 22 | const data = await res.json() as unknown as { items: any[], error: any }; 23 | const channels = data.items ?? []; 24 | 25 | if (data?.error?.status === 'PERMISSION_DENIED') { 26 | return { 27 | statusCode: 200, 28 | headers: { 'Content-Type': 'application/json' }, 29 | body: JSON.stringify({ error: 'PERMISSION_DENIED' }), 30 | }; 31 | } 32 | 33 | await Promise.all(channels.map(async (channel) => { 34 | 35 | try { 36 | 37 | await db.insert(Owners).values({ 38 | uid: user.uid, 39 | channelId: channel.id, 40 | }); 41 | 42 | } catch (err) { 43 | // DO NOTHING 44 | } 45 | 46 | })); 47 | 48 | return { 49 | statusCode: 200, 50 | headers: { 'Content-Type': 'application/json' }, 51 | body: JSON.stringify({}), 52 | }; 53 | 54 | }); 55 | -------------------------------------------------------------------------------- /packages/functions/src/utils/firebase.ts: -------------------------------------------------------------------------------- 1 | import { APIGatewayProxyEvent, APIGatewayProxyEventV2, APIGatewayProxyWebsocketEventV2 } from "aws-lambda"; 2 | import { apps } from "firebase-admin"; 3 | import { cert, initializeApp } from "firebase-admin/app"; 4 | import { DecodedIdToken } from "firebase-admin/auth"; 5 | import { Config } from "sst/node/config"; 6 | export { getAuth } from "firebase-admin/auth"; 7 | 8 | if (!apps.length) { 9 | initializeApp({ 10 | credential: cert(JSON.parse(Buffer.from(Config.GOOGLE_APPLICATION_CREDENTIALS, 'base64').toString('utf-8'))), 11 | }); 12 | } 13 | 14 | export type User = DecodedIdToken; 15 | 16 | export const getUser = (event: APIGatewayProxyEventV2 | APIGatewayProxyWebsocketEventV2): User => { 17 | 18 | // @ts-expect-error 19 | return event.requestContext?.authorizer?.lambda?.user ?? 20 | /** 21 | * @note We are using JSON.parse here because the authorizer 22 | * context for the websocket only accepts strings. So we have 23 | * to stringify the user object in the authorizer and parse it 24 | * here. 25 | */ 26 | // @ts-expect-error 27 | JSON.parse(event.requestContext?.authorizer?.user ?? '{}'); 28 | }; 29 | -------------------------------------------------------------------------------- /packages/functions/sst-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | -------------------------------------------------------------------------------- /packages/functions/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../tsconfig.json", 3 | "compilerOptions": { 4 | "module": "esnext", 5 | "moduleResolution": "node", 6 | } 7 | } 8 | 9 | -------------------------------------------------------------------------------- /packages/website/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | *.log* 3 | .nuxt 4 | .nitro 5 | .cache 6 | .output 7 | .env 8 | dist 9 | .DS_Store 10 | -------------------------------------------------------------------------------- /packages/website/app.vue: -------------------------------------------------------------------------------- 1 | 31 | 32 | 46 | 55 | -------------------------------------------------------------------------------- /packages/website/assets/css/animations.css: -------------------------------------------------------------------------------- 1 | @keyframes fade-in { 2 | 0% { opacity: 0; } 3 | 100% { opacity: 1; } 4 | } 5 | 6 | @keyframes fade-in-up { 7 | 0% { 8 | opacity: 0; 9 | transform: translateY(10px); 10 | } 11 | 100% { 12 | opacity: 1; 13 | transform: translateY(0); 14 | } 15 | } 16 | 17 | @keyframes fade-out { 18 | from { 19 | opacity: 1; 20 | transform: translateY(0px); 21 | } 22 | to { 23 | opacity: 0; 24 | transform: translateY(-10px); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /packages/website/assets/css/main.css: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | 5 | *:not(.no-antialiased) { 6 | @apply antialiased; 7 | } 8 | 9 | .button { 10 | @apply 11 | inline-flex items-center 12 | px-2 py-1.5 13 | shadow-sm 14 | border border-stone-300 rounded-[4px] 15 | text-sm text-stone-950 16 | font-medium 17 | transition-colors 18 | hover:bg-stone-50 19 | disabled:shadow-none disabled:bg-stone-100 disabled:!text-stone-400 20 | active:shadow-none active:shadow-inner active:bg-stone-100/80; 21 | } 22 | 23 | .button-dark { 24 | @apply 25 | inline-flex items-center 26 | px-2 py-1.5 27 | shadow-sm 28 | rounded-[4px] 29 | bg-stone-950 30 | text-sm text-white 31 | font-medium 32 | transition-colors 33 | hover:bg-stone-800 34 | disabled:opacity-70; 35 | } 36 | 37 | .button-ghost { 38 | @apply 39 | inline-flex items-center 40 | px-2 py-1.5 41 | text-sm text-stone-950 42 | font-medium 43 | rounded-[4px] 44 | transition-colors 45 | hover:bg-stone-100; 46 | } 47 | 48 | a { 49 | @apply font-medium text-blue-700 hover:underline; 50 | } 51 | 52 | a[target="_blank"]:not(.no-after)::after { 53 | 54 | @apply ml-1 mr-0.5 h-3 w-3 bg-stone-500 inline-flex items-center; 55 | mask: url('data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20x%3D%220px%22%20y%3D%220px%22%20viewBox%3D%220%200%2024%2024%22%3E%20%3Cpath%20d%3D%22M%205%203%20C%203.9069372%203%203%203.9069372%203%205%20L%203%2019%20C%203%2020.093063%203.9069372%2021%205%2021%20L%2019%2021%20C%2020.093063%2021%2021%2020.093063%2021%2019%20L%2021%2012%20L%2019%2012%20L%2019%2019%20L%205%2019%20L%205%205%20L%2012%205%20L%2012%203%20L%205%203%20z%20M%2014%203%20L%2014%205%20L%2017.585938%205%20L%208.2929688%2014.292969%20L%209.7070312%2015.707031%20L%2019%206.4140625%20L%2019%2010%20L%2021%2010%20L%2021%203%20L%2014%203%20z%22%3E%20%3C%2Fpath%3E%20%3C%2Fsvg%3E'); 56 | content: url('data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20x%3D%220px%22%20y%3D%220px%22%20viewBox%3D%220%200%2024%2024%22%3E%20%3Cpath%20d%3D%22M%205%203%20C%203.9069372%203%203%203.9069372%203%205%20L%203%2019%20C%203%2020.093063%203.9069372%2021%205%2021%20L%2019%2021%20C%2020.093063%2021%2021%2020.093063%2021%2019%20L%2021%2012%20L%2019%2012%20L%2019%2019%20L%205%2019%20L%205%205%20L%2012%205%20L%2012%203%20L%205%203%20z%20M%2014%203%20L%2014%205%20L%2017.585938%205%20L%208.2929688%2014.292969%20L%209.7070312%2015.707031%20L%2019%206.4140625%20L%2019%2010%20L%2021%2010%20L%2021%203%20L%2014%203%20z%22%3E%20%3C%2Fpath%3E%20%3C%2Fsvg%3E'); 57 | 58 | } 59 | 60 | .fade-enter-active, 61 | .fade-leave-active { 62 | transition: opacity 0.1s; 63 | } 64 | 65 | .fade-enter, 66 | .fade-leave-to { 67 | opacity: 0; 68 | } 69 | 70 | /* html, 71 | body, 72 | #__nuxt { 73 | @apply w-full h-full; 74 | } */ 75 | 76 | 77 | .prose a { 78 | @apply no-underline hover:underline; 79 | } 80 | 81 | .prose p > a { 82 | @apply underline; 83 | } 84 | -------------------------------------------------------------------------------- /packages/website/assets/css/transitions.css: -------------------------------------------------------------------------------- 1 | /* fade */ 2 | .fade-enter-active, 3 | .fade-leave-active { 4 | transition: opacity 0.1s ease; 5 | } 6 | 7 | .fade-enter-from, 8 | .fade-leave-to { 9 | opacity: 0; 10 | } 11 | 12 | /* fade-in-up */ 13 | .fade-in-up-enter-active, 14 | .fade-in-up-leave-active { 15 | transition: opacity 0.5s, transform 0.5s; 16 | } 17 | 18 | .fade-in-up-enter-from, 19 | .fade-in-up-leave-to { 20 | opacity: 0; 21 | transform: translateY(10px); 22 | } 23 | 24 | .fade-in-up-enter-to, 25 | .fade-in-up-leave-from { 26 | opacity: 1; 27 | transform: translateY(0); 28 | } 29 | 30 | /* fade-out */ 31 | .fade-out-enter-active, 32 | .fade-out-leave-active { 33 | transition: opacity 0.5s, transform 0.5s; 34 | } 35 | 36 | .fade-out-enter-from, 37 | .fade-out-leave-to { 38 | opacity: 1; 39 | transform: translateY(0); 40 | } 41 | 42 | .fade-out-enter-to, 43 | .fade-out-leave-from { 44 | opacity: 0; 45 | transform: translateY(-10px); 46 | } 47 | -------------------------------------------------------------------------------- /packages/website/components/AppHeader.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 110 | 111 | 112 | -------------------------------------------------------------------------------- /packages/website/components/CircleLoading.vue: -------------------------------------------------------------------------------- 1 | 3 | 4 | 9 | 10 | 32 | -------------------------------------------------------------------------------- /packages/website/components/Comment.vue: -------------------------------------------------------------------------------- 1 | 61 | 62 | 145 | 146 | 159 | -------------------------------------------------------------------------------- /packages/website/components/Comments.vue: -------------------------------------------------------------------------------- 1 | 24 | 25 | 61 | -------------------------------------------------------------------------------- /packages/website/components/Page.vue: -------------------------------------------------------------------------------- 1 | 91 | 92 | 251 | 252 | 260 | -------------------------------------------------------------------------------- /packages/website/components/Replies.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 44 | 45 | 47 | -------------------------------------------------------------------------------- /packages/website/components/SideNav.vue: -------------------------------------------------------------------------------- 1 | 21 | 22 | 70 | 71 | 73 | -------------------------------------------------------------------------------- /packages/website/components/restore/CheckpointsList.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 59 | 60 | 62 | -------------------------------------------------------------------------------- /packages/website/components/restore/ExplanationProcess.vue: -------------------------------------------------------------------------------- 1 | 28 | 29 | 104 | 105 | 107 | -------------------------------------------------------------------------------- /packages/website/components/restore/GatheringCheckpointsLoading.vue: -------------------------------------------------------------------------------- 1 | 3 | 4 | 13 | 14 | 16 | -------------------------------------------------------------------------------- /packages/website/components/restore/GoBackToComments.vue: -------------------------------------------------------------------------------- 1 | 3 | 4 | 26 | 27 | 29 | -------------------------------------------------------------------------------- /packages/website/components/restore/NoCheckpointsFound.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 42 | 43 | 45 | -------------------------------------------------------------------------------- /packages/website/components/restore/NotGranted.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 33 | 34 | 36 | -------------------------------------------------------------------------------- /packages/website/composables/useStore.ts: -------------------------------------------------------------------------------- 1 | import { getAuth, User } from 'firebase/auth'; 2 | import { defineStore, acceptHMRUpdate } from 'pinia'; 3 | 4 | 5 | export const useStore = defineStore('main', { 6 | 7 | state: () => ({ 8 | 9 | currentUser: null as User | null, 10 | idToken: '', 11 | loggingOutFlag: false, 12 | 13 | waitingForFirebase: true, 14 | 15 | previousRoutePath: '', 16 | 17 | }), 18 | 19 | getters: { 20 | 21 | isLoggedIn: (state) => !!state.currentUser && !state.loggingOutFlag, 22 | 23 | }, 24 | 25 | actions: { 26 | 27 | async logout() { 28 | this.loggingOutFlag = true; 29 | await getAuth().signOut(); 30 | this.currentUser = null; 31 | this.loggingOutFlag = false; 32 | 33 | // Reset all data 34 | this.previousRoutePath = ''; 35 | this.waitingForFirebase = false; 36 | }, 37 | 38 | async refreshIdToken() { 39 | this.idToken = await this.currentUser?.getIdToken(true) ?? ''; 40 | return this.idToken; 41 | }, 42 | 43 | }, 44 | 45 | }); 46 | 47 | 48 | if (import.meta.hot) { 49 | import.meta.hot.accept(acceptHMRUpdate(useStore, import.meta.hot)) 50 | } 51 | -------------------------------------------------------------------------------- /packages/website/composables/youtubeFormat.ts: -------------------------------------------------------------------------------- 1 | export const useYoutubeFormat = (number: number) => { 2 | if (number >= 1e6) { 3 | return `${(number / 1e6).toFixed(0)}M`; 4 | } else if (number >= 1e3) { 5 | const value = (number / 1e3).toFixed(1); 6 | return `${Math.round(parseInt(value.endsWith('.0') ? value.slice(0, -2) : value))}K`; 7 | } else { 8 | return number.toString(); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /packages/website/content/privacy.md: -------------------------------------------------------------------------------- 1 | # Privacy Policy 2 | 3 | ## Introduction 4 | 5 | The website [https://internetcheckpoint.page](https://internetcheckpoint.page) recreates the comments section of the terminated Youtube channel taia777, using an archive by Reddit user [rebane2001](https://www.reddit.com/r/taia777/comments/o1rls6/taia777_videos_and_comments_archive/). 6 | 7 | ## Information Collected 8 | 9 | ### Find Checkpoints Feature 10 | 11 | The ["Find checkpoints"](https://internetcheckpoint.page/restore) feature allows you to find your old comments by logging into your Google account. When you log in, and grant 12 | permission to this website to access your Youtube data, the website will get your Youtube Channel ID and will use it to find your old comments in the archive. Nothing 13 | else is collected nor stored. 14 | 15 | ### Google Analytics 16 | 17 | This website uses Google Analytics, a web analytics service provided by Google, Inc. ("Google"). Google Analytics uses "cookies", which are text files placed on your computer, to help the website analyze how users use the site. The information generated by the cookie about your use of the website (including your IP address) will be transmitted to and stored by Google on servers in the United States. 18 | 19 | Google will use this information for the purpose of evaluating your use of the website, compiling reports on website activity for website operators and providing other services relating to website activity and internet usage. 20 | 21 | ## Limited Use Disclosure 22 | 23 | Our use and transfer to any other app of information received from Google APIs will adhere to [Google API Services User Data Policy](https://developers.google.com/terms/api-services-user-data-policy), including the Limited Use requirements. 24 | 25 | ## User Consent 26 | 27 | By using this service, you consent to the collection and use of your information as outlined in this Privacy Policy. 28 | 29 | ## Contact 30 | 31 | For questions or concerns about this Privacy Policy, contact me at [geauser@protonmail.com](geauser@protonmail.com) or on Twitter at [@geauser](https://twitter.com/geauser). 32 | 33 | Last updated: 31/10/2023 34 | -------------------------------------------------------------------------------- /packages/website/nuxt.config.ts: -------------------------------------------------------------------------------- 1 | // https://nuxt.com/docs/api/configuration/nuxt-config 2 | import path from "node:path"; 3 | 4 | 5 | export default defineNuxtConfig({ 6 | 7 | vue: { 8 | compilerOptions: { 9 | isCustomElement: tag => tag.includes('media-'), 10 | } 11 | }, 12 | 13 | alias: { 14 | '@internetcheckpoint/functions': path.resolve(__dirname, '../functions/src'), 15 | }, 16 | 17 | css: [ 18 | '~/assets/css/transitions.css', 19 | '~/assets/css/animations.css', 20 | '~/assets/css/main.css' 21 | ], 22 | modules: [ 23 | '@pinia/nuxt', 24 | '@nuxt/image', 25 | 'nuxt-gtag', 26 | [ 27 | '@nuxtjs/google-fonts', { 28 | families: { 29 | Roboto: [400, 500, 600, 700], 30 | }, 31 | display: 'swap', 32 | prefetch: true, 33 | } 34 | ] 35 | ], 36 | postcss: { 37 | plugins: { 38 | tailwindcss: {}, 39 | autoprefixer: {}, 40 | }, 41 | }, 42 | gtag: { 43 | id: process.env.NUXT_GA_ID, 44 | }, 45 | runtimeConfig: { 46 | public: { 47 | stage: process.env.NUXT_STAGE, 48 | appDomain: process.env.NUXT_APP_DOMAIN ?? 'internetcheckpoint.page', 49 | apiUrl: process.env.NUXT_API_URL ?? 'https://odiw5mq8be.execute-api.us-east-1.amazonaws.com', 50 | firebaseConfig: process.env.NUXT_FIREBASE_CONFIG, 51 | } 52 | } 53 | }); 54 | -------------------------------------------------------------------------------- /packages/website/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@internetcheckpoint/website", 3 | "private": true, 4 | "version": "1.0.0", 5 | "scripts": { 6 | "build": "sst bind nuxt build", 7 | "dev": "sst bind nuxt dev", 8 | "generate": "nuxt generate", 9 | "preview": "nuxt preview", 10 | "postinstall": "nuxt prepare" 11 | }, 12 | "devDependencies": { 13 | "@nuxt/image": "^1.1.0", 14 | "@nuxtjs/google-fonts": "^3.0.1", 15 | "@tailwindcss/typography": "^0.5.10", 16 | "@types/markdown-it": "^13.0.7", 17 | "@types/node": "^18", 18 | "autoprefixer": "^10.4.14", 19 | "markdown-it": "^13.0.2", 20 | "nuxt": "^3.5.1", 21 | "nuxt-gtag": "^0.5.7", 22 | "postcss": "^8.4.23", 23 | "postcss-nesting": "^11.2.2", 24 | "tailwindcss": "^3.3.2", 25 | "typescript": "^5.0.4" 26 | }, 27 | "dependencies": { 28 | "@headlessui/vue": "^1.7.16", 29 | "@heroicons/vue": "^2.0.18", 30 | "@nuxt/devtools": "^0.8.0", 31 | "@pinia/nuxt": "^0.4.11", 32 | "@vueuse/core": "^10.1.2", 33 | "dayjs": "^1.11.8", 34 | "firebase": "^10.1.0", 35 | "media-chrome": "^1.0.0", 36 | "pinia": "^2.1.6" 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /packages/website/pages/[id].vue: -------------------------------------------------------------------------------- 1 | 3 | 11 | -------------------------------------------------------------------------------- /packages/website/pages/index.vue: -------------------------------------------------------------------------------- 1 | 8 | 11 | -------------------------------------------------------------------------------- /packages/website/pages/privacy.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 40 | -------------------------------------------------------------------------------- /packages/website/pages/restore.vue: -------------------------------------------------------------------------------- 1 | 116 | 117 | 201 | 202 | 209 | -------------------------------------------------------------------------------- /packages/website/plugins/firebase.client.ts: -------------------------------------------------------------------------------- 1 | import { initializeApp } from 'firebase/app'; 2 | import { connectAuthEmulator, getAuth, onAuthStateChanged } from "firebase/auth"; 3 | 4 | 5 | export default defineNuxtPlugin(nuxtApp => { 6 | 7 | const config = useRuntimeConfig(); 8 | 9 | 10 | if (!config.public.firebaseConfig) return; 11 | 12 | const firebaseConfig = JSON.parse(config.public.firebaseConfig); 13 | 14 | const app = initializeApp(firebaseConfig); 15 | const auth = getAuth(app); 16 | 17 | if (config.public.stage.startsWith('local')) { 18 | console.info('Using auth emulator...'); 19 | connectAuthEmulator(auth, 'http://127.0.0.1:9099'); 20 | } 21 | 22 | 23 | onAuthStateChanged(auth, async (user) => { 24 | 25 | const store = useStore(); 26 | 27 | try { 28 | 29 | store.currentUser = user; 30 | store.idToken = await user?.getIdToken() ?? ''; 31 | 32 | store.waitingForFirebase = false; 33 | 34 | if (process.dev) console.log('[TOKEN]', store.idToken); 35 | 36 | } catch (error) { 37 | console.error('[ERROR]', error); 38 | } 39 | 40 | }); 41 | 42 | nuxtApp.vueApp.provide('auth', auth); 43 | nuxtApp.provide('auth', auth); 44 | 45 | }); 46 | -------------------------------------------------------------------------------- /packages/website/plugins/markdownit.ts: -------------------------------------------------------------------------------- 1 | import md from "markdown-it"; 2 | 3 | export default defineNuxtPlugin(() => { 4 | const renderer = md(); 5 | return { 6 | provide: { 7 | mdRenderer: renderer, 8 | }, 9 | }; 10 | }); 11 | -------------------------------------------------------------------------------- /packages/website/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geauser/internetcheckpoint/f9b80c9e6c889a825287a407058905fd68c44c9a/packages/website/public/favicon.ico -------------------------------------------------------------------------------- /packages/website/public/images/oauth-example.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geauser/internetcheckpoint/f9b80c9e6c889a825287a407058905fd68c44c9a/packages/website/public/images/oauth-example.png -------------------------------------------------------------------------------- /packages/website/public/images/og.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geauser/internetcheckpoint/f9b80c9e6c889a825287a407058905fd68c44c9a/packages/website/public/images/og.jpg -------------------------------------------------------------------------------- /packages/website/public/images/thorn.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geauser/internetcheckpoint/f9b80c9e6c889a825287a407058905fd68c44c9a/packages/website/public/images/thorn.gif -------------------------------------------------------------------------------- /packages/website/public/images/thumbnails/08nYrDMx-DU.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geauser/internetcheckpoint/f9b80c9e6c889a825287a407058905fd68c44c9a/packages/website/public/images/thumbnails/08nYrDMx-DU.webp -------------------------------------------------------------------------------- /packages/website/public/images/thumbnails/0BADmbVhjgM.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geauser/internetcheckpoint/f9b80c9e6c889a825287a407058905fd68c44c9a/packages/website/public/images/thumbnails/0BADmbVhjgM.webp -------------------------------------------------------------------------------- /packages/website/public/images/thumbnails/1x4KfgQhvB4.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geauser/internetcheckpoint/f9b80c9e6c889a825287a407058905fd68c44c9a/packages/website/public/images/thumbnails/1x4KfgQhvB4.webp -------------------------------------------------------------------------------- /packages/website/public/images/thumbnails/2_4xmeCebKk.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geauser/internetcheckpoint/f9b80c9e6c889a825287a407058905fd68c44c9a/packages/website/public/images/thumbnails/2_4xmeCebKk.webp -------------------------------------------------------------------------------- /packages/website/public/images/thumbnails/2uRqMf_13BA.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geauser/internetcheckpoint/f9b80c9e6c889a825287a407058905fd68c44c9a/packages/website/public/images/thumbnails/2uRqMf_13BA.webp -------------------------------------------------------------------------------- /packages/website/public/images/thumbnails/8-ZaQ0uj4vY.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geauser/internetcheckpoint/f9b80c9e6c889a825287a407058905fd68c44c9a/packages/website/public/images/thumbnails/8-ZaQ0uj4vY.webp -------------------------------------------------------------------------------- /packages/website/public/images/thumbnails/CBEUf7vqLRw.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geauser/internetcheckpoint/f9b80c9e6c889a825287a407058905fd68c44c9a/packages/website/public/images/thumbnails/CBEUf7vqLRw.webp -------------------------------------------------------------------------------- /packages/website/public/images/thumbnails/DUsZ-RNET74.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geauser/internetcheckpoint/f9b80c9e6c889a825287a407058905fd68c44c9a/packages/website/public/images/thumbnails/DUsZ-RNET74.webp -------------------------------------------------------------------------------- /packages/website/public/images/thumbnails/EOIfaf2Pcuc.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geauser/internetcheckpoint/f9b80c9e6c889a825287a407058905fd68c44c9a/packages/website/public/images/thumbnails/EOIfaf2Pcuc.webp -------------------------------------------------------------------------------- /packages/website/public/images/thumbnails/Ev58S-rplrs.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geauser/internetcheckpoint/f9b80c9e6c889a825287a407058905fd68c44c9a/packages/website/public/images/thumbnails/Ev58S-rplrs.webp -------------------------------------------------------------------------------- /packages/website/public/images/thumbnails/ML6tpvHw_io.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geauser/internetcheckpoint/f9b80c9e6c889a825287a407058905fd68c44c9a/packages/website/public/images/thumbnails/ML6tpvHw_io.webp -------------------------------------------------------------------------------- /packages/website/public/images/thumbnails/NSyPPd_lEQE.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geauser/internetcheckpoint/f9b80c9e6c889a825287a407058905fd68c44c9a/packages/website/public/images/thumbnails/NSyPPd_lEQE.webp -------------------------------------------------------------------------------- /packages/website/public/images/thumbnails/OhmY6Afh2Ec.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geauser/internetcheckpoint/f9b80c9e6c889a825287a407058905fd68c44c9a/packages/website/public/images/thumbnails/OhmY6Afh2Ec.webp -------------------------------------------------------------------------------- /packages/website/public/images/thumbnails/Q9XTqQbuavI.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geauser/internetcheckpoint/f9b80c9e6c889a825287a407058905fd68c44c9a/packages/website/public/images/thumbnails/Q9XTqQbuavI.webp -------------------------------------------------------------------------------- /packages/website/public/images/thumbnails/VWR5u1evzUY.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geauser/internetcheckpoint/f9b80c9e6c889a825287a407058905fd68c44c9a/packages/website/public/images/thumbnails/VWR5u1evzUY.webp -------------------------------------------------------------------------------- /packages/website/public/images/thumbnails/_rC6DA9EJuo.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geauser/internetcheckpoint/f9b80c9e6c889a825287a407058905fd68c44c9a/packages/website/public/images/thumbnails/_rC6DA9EJuo.webp -------------------------------------------------------------------------------- /packages/website/public/images/thumbnails/bPVohspy054.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geauser/internetcheckpoint/f9b80c9e6c889a825287a407058905fd68c44c9a/packages/website/public/images/thumbnails/bPVohspy054.webp -------------------------------------------------------------------------------- /packages/website/public/images/thumbnails/bnWktjTMZb0.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geauser/internetcheckpoint/f9b80c9e6c889a825287a407058905fd68c44c9a/packages/website/public/images/thumbnails/bnWktjTMZb0.webp -------------------------------------------------------------------------------- /packages/website/public/images/thumbnails/cwLugJZMrb0.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geauser/internetcheckpoint/f9b80c9e6c889a825287a407058905fd68c44c9a/packages/website/public/images/thumbnails/cwLugJZMrb0.webp -------------------------------------------------------------------------------- /packages/website/public/images/thumbnails/g8f253ss_NI.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geauser/internetcheckpoint/f9b80c9e6c889a825287a407058905fd68c44c9a/packages/website/public/images/thumbnails/g8f253ss_NI.webp -------------------------------------------------------------------------------- /packages/website/public/images/thumbnails/ggbn1s2oUUE.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geauser/internetcheckpoint/f9b80c9e6c889a825287a407058905fd68c44c9a/packages/website/public/images/thumbnails/ggbn1s2oUUE.webp -------------------------------------------------------------------------------- /packages/website/public/images/thumbnails/lkQ1POVJsk4.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geauser/internetcheckpoint/f9b80c9e6c889a825287a407058905fd68c44c9a/packages/website/public/images/thumbnails/lkQ1POVJsk4.webp -------------------------------------------------------------------------------- /packages/website/public/images/thumbnails/m0gsV5X6l1I.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geauser/internetcheckpoint/f9b80c9e6c889a825287a407058905fd68c44c9a/packages/website/public/images/thumbnails/m0gsV5X6l1I.webp -------------------------------------------------------------------------------- /packages/website/public/images/thumbnails/mDnr_-Gc-ZI.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geauser/internetcheckpoint/f9b80c9e6c889a825287a407058905fd68c44c9a/packages/website/public/images/thumbnails/mDnr_-Gc-ZI.webp -------------------------------------------------------------------------------- /packages/website/public/images/thumbnails/pDgflOcHNnM.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geauser/internetcheckpoint/f9b80c9e6c889a825287a407058905fd68c44c9a/packages/website/public/images/thumbnails/pDgflOcHNnM.webp -------------------------------------------------------------------------------- /packages/website/public/images/thumbnails/r2DG5-sjqso.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geauser/internetcheckpoint/f9b80c9e6c889a825287a407058905fd68c44c9a/packages/website/public/images/thumbnails/r2DG5-sjqso.webp -------------------------------------------------------------------------------- /packages/website/public/images/thumbnails/wMv4Rw_7Mes.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geauser/internetcheckpoint/f9b80c9e6c889a825287a407058905fd68c44c9a/packages/website/public/images/thumbnails/wMv4Rw_7Mes.webp -------------------------------------------------------------------------------- /packages/website/public/images/thumbnails/xkx2MX-a-D4.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geauser/internetcheckpoint/f9b80c9e6c889a825287a407058905fd68c44c9a/packages/website/public/images/thumbnails/xkx2MX-a-D4.webp -------------------------------------------------------------------------------- /packages/website/public/images/thumbnails/ytLzeQNiJDs.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geauser/internetcheckpoint/f9b80c9e6c889a825287a407058905fd68c44c9a/packages/website/public/images/thumbnails/ytLzeQNiJDs.webp -------------------------------------------------------------------------------- /packages/website/public/images/thumbnails/zK4TWXWEKAQ.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geauser/internetcheckpoint/f9b80c9e6c889a825287a407058905fd68c44c9a/packages/website/public/images/thumbnails/zK4TWXWEKAQ.webp -------------------------------------------------------------------------------- /packages/website/public/images/thumbnails/zPAKKROcclE.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geauser/internetcheckpoint/f9b80c9e6c889a825287a407058905fd68c44c9a/packages/website/public/images/thumbnails/zPAKKROcclE.webp -------------------------------------------------------------------------------- /packages/website/tailwind.config.js: -------------------------------------------------------------------------------- 1 | /** @type {import('tailwindcss').Config} */ 2 | module.exports = { 3 | content: [ 4 | "./components/**/*.{js,vue,ts}", 5 | "./layouts/**/*.vue", 6 | "./pages/**/*.vue", 7 | "./plugins/**/*.{js,ts}", 8 | "./nuxt.config.{js,ts}", 9 | "./app.vue", 10 | ], 11 | theme: { 12 | extend: { 13 | animation: { 14 | 'fade-in': 'fade-in 0.5s ease-in-out forwards', 15 | 'fade-out': 'fade-out 0.5s ease-in-out forwards', 16 | 'fade-in-up': 'fade-in-up 0.5s ease-in-out forwards', 17 | }, 18 | fontFamily: { 19 | 'sans': ['Roboto', 'sans-serif'], 20 | }, 21 | }, 22 | }, 23 | plugins: [ 24 | require('@tailwindcss/typography'), 25 | ], 26 | } 27 | 28 | -------------------------------------------------------------------------------- /packages/website/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | // https://nuxt.com/docs/guide/concepts/typescript 3 | "extends": "./.nuxt/tsconfig.json", 4 | "resolveJsonModule": true, 5 | "compilerOptions": { 6 | "resolveJsonModule": true, 7 | "paths": { 8 | "@internetcheckpoint/functions/*": ["../functions/src/*"] 9 | } 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /scripts/boot.iterm.sh: -------------------------------------------------------------------------------- 1 | # Open a new terminal window with a tab for the SST dev process and one 2 | # for nuxt dev process. 3 | yarn ttab -w 'clear; yarn dev' 4 | yarn ttab 'clear; yarn firebase' 5 | yarn ttab 'clear; yarn workspace @internetcheckpoint/website dev' 6 | -------------------------------------------------------------------------------- /scripts/hobune.ts: -------------------------------------------------------------------------------- 1 | import fs from 'node:fs'; 2 | import download from 'download'; 3 | import { execSync } from 'node:child_process'; 4 | import { JSDOM } from 'jsdom'; 5 | 6 | const cwd = process.cwd(); 7 | 8 | if (cwd.split('/').pop() !== 'internetcheckpoint') { 9 | console.log('[ERROR] Please run this script from the root of the project'); 10 | process.exit(1); 11 | } 12 | 13 | const metadataFilePath = `${cwd}/backups/_metadata.json`; 14 | 15 | 16 | /** 17 | * Download all the thumbnails from hobune.stream into 18 | * packages/website/public/images/thumbnails. 19 | */ 20 | async function downloadThumbnails() { 21 | const thumbnailsFolderPath = `${cwd}/packages/website/public/images/thumbnails`; 22 | 23 | if (fs.existsSync(thumbnailsFolderPath)) fs.rmdirSync(thumbnailsFolderPath); 24 | fs.mkdirSync(thumbnailsFolderPath); 25 | 26 | const metadata = await import(metadataFilePath).catch(err => {}) ?? {}; 27 | 28 | for (const id in metadata.default) { 29 | 30 | const res = await fetch(`https://hobune.stream/videos/${id}`); 31 | const html = await res.text(); 32 | const { window: { document } } = new JSDOM(html); 33 | const button = document.querySelectorAll('.button.download')[2]; 34 | 35 | const url = encodeURI(`https://hobune.stream${button.parentElement?.getAttribute('href')}`); 36 | const extension = url.substring(url.lastIndexOf('.') + 1); 37 | 38 | execSync(`curl "${url}" --output ${thumbnailsFolderPath}/${id}.${extension}`); 39 | } 40 | 41 | } 42 | 43 | /** 44 | * Download all the videos from hobune.stream. 45 | * NOTE: This script is not meant to be run again. 46 | */ 47 | async function downloadVideos() { 48 | const videosFolderPath = `${cwd}/packages/website/public/videos`; 49 | if (!fs.existsSync(videosFolderPath)) fs.mkdirSync(videosFolderPath); 50 | const metadata = await import(metadataFilePath).catch(err => {}) ?? {}; 51 | 52 | 53 | for (const videoId in metadata.default) { 54 | 55 | const res = await fetch(`https://hobune.stream/videos/${videoId}`); 56 | const html = await res.text(); 57 | const { window: { document } } = new JSDOM(html); 58 | const button = document.querySelectorAll('.button.download')[0]; 59 | const url = encodeURI(`https://hobune.stream${button.parentElement?.getAttribute('href')}`); 60 | 61 | console.log(`Downloading video "${videoId}.mp4"...`); 62 | await download(url, videosFolderPath, { filename: `${videoId}.mp4` }); 63 | 64 | } 65 | 66 | } 67 | 68 | /** 69 | * Used to fill _metadata.json with all the videos from hobune.stream. 70 | * Data missing from hobune website were filled manually using the Wayback machine. 71 | * NOTE: This script is not meant to be run again. 72 | */ 73 | async function listAllVideos() { 74 | 75 | const res = await fetch('https://hobune.stream/channels/UCkVo7eqym1ZX2A9-GabEXrw'); 76 | const html = await res.text(); 77 | const { window: { document } } = new JSDOM(html); 78 | const ids = Array.from(document.querySelectorAll('.card > a')).map(a => a?.getAttribute('href')?.split('/').pop()); 79 | 80 | const metadata = await import(metadataFilePath).catch(err => {}) ?? {}; 81 | 82 | ids.forEach(id => { 83 | 84 | const title = document.querySelector(`a[href='/videos/${id}'] .title`)?.textContent?.trim(); 85 | const publishedAt = document.querySelector(`a[href='/videos/${id}'] .content > p`)?.textContent?.split(',').pop()?.trim(); 86 | 87 | if (metadata[id!]) { 88 | console.warn(`\n[WARNING] Video "${id}" already exists in metadata file\noverwriting it will force you to get the like/dislike/view count again from the wayback machine!`); 89 | return; 90 | } 91 | 92 | metadata[id!] = { 93 | title, 94 | viewCount: null, 95 | likeCount: null, 96 | dislikeCount: null, 97 | publishedAt, 98 | }; 99 | 100 | }); 101 | 102 | fs.writeFileSync(metadataFilePath, JSON.stringify(metadata, null, 2)); 103 | 104 | } 105 | 106 | /** 107 | * Used to open all the videos from hobune.stream in the Wayback machine. 108 | * NOTE: This script is not meant to be run again. 109 | */ 110 | async function openVideoLinksInWaybackMachine() { 111 | 112 | const metadata = await import(metadataFilePath).catch(err => {}) ?? {}; 113 | 114 | for (const id in metadata) { 115 | execSync(`open https://web.archive.org/web/*/https://youtube.com/watch?v=${id}`); 116 | } 117 | 118 | } 119 | -------------------------------------------------------------------------------- /sst.config.ts: -------------------------------------------------------------------------------- 1 | import { SSTConfig } from "sst"; 2 | import { ApiStack } from "./stacks/ApiStack"; 3 | import { WebStack } from "./stacks/WebStack"; 4 | import { ConfigStack } from "./stacks/ConfigStack"; 5 | 6 | export default { 7 | config(_input) { 8 | return { 9 | name: "internetcheckpoint", 10 | region: "us-east-1", 11 | }; 12 | }, 13 | stacks(app) { 14 | 15 | app.setDefaultFunctionProps({ 16 | runtime: "nodejs18.x", 17 | timeout: 10 * 60, 18 | environment: { 19 | ...(app.local && { FIREBASE_AUTH_EMULATOR_HOST: "127.0.0.1:9099" }), 20 | }, 21 | }); 22 | 23 | app 24 | .stack(ConfigStack) 25 | .stack(ApiStack) 26 | .stack(WebStack); 27 | } 28 | } satisfies SSTConfig; 29 | -------------------------------------------------------------------------------- /stacks/ApiStack.ts: -------------------------------------------------------------------------------- 1 | import { Api, Function, StackContext, use } from "sst/constructs"; 2 | import { ConfigStack } from "./ConfigStack"; 3 | 4 | 5 | export function ApiStack({ stack, app }: StackContext) { 6 | 7 | const config = use(ConfigStack); 8 | 9 | const api = new Api(stack, "api", { 10 | 11 | authorizers: { 12 | firebase: { 13 | type: "lambda", 14 | responseTypes: ["simple"], 15 | function: new Function(stack, "FirebaseAuthorizer", { 16 | handler: "packages/functions/src/authorizer.handler", 17 | bind: [config.secrets.GOOGLE_APPLICATION_CREDENTIALS], 18 | }), 19 | resultsCacheTtl: "30 seconds", 20 | 21 | // TODO: Could be faster in production, will need to test 22 | // against the lambda authorizer. 23 | // jwt: { 24 | // // issuer: 'https://securetoken.google.com/simpuppet-b1a2d', 25 | // audience: ['simpuppet-b1a2d'], 26 | // }, 27 | }, 28 | }, 29 | 30 | defaults: { 31 | function: { 32 | runtime: 'nodejs18.x', 33 | timeout: 30, 34 | }, 35 | authorizer: 'firebase', 36 | }, 37 | ...(['prod', 'dev'].includes(app.stage) && { 38 | customDomain: { 39 | domainName: app.stage === 'prod' ? 'api.internetcheckpoint.page': 'api.dev.internetcheckpoint.page', 40 | hostedZone: 'internetcheckpoint.page', 41 | }, 42 | }), 43 | 44 | routes: { 45 | "POST /restore": "packages/functions/src/restore.handler", 46 | "GET /checkpoints": "packages/functions/src/checkpoints.handler", 47 | "GET /comments": { 48 | function: "packages/functions/src/comments.handler", 49 | authorizer: 'none' 50 | }, 51 | }, 52 | }); 53 | 54 | api.bind([ 55 | ...config.secretList, 56 | ]); 57 | 58 | stack.addOutputs({ 59 | ApiEndpoint: api.customDomainUrl ?? api.url, 60 | }); 61 | 62 | return { 63 | url: api.customDomainUrl ?? api.url, 64 | }; 65 | } 66 | -------------------------------------------------------------------------------- /stacks/ConfigStack.ts: -------------------------------------------------------------------------------- 1 | import { Config, StackContext } from "sst/constructs"; 2 | 3 | 4 | export function ConfigStack({ stack, app }: StackContext) { 5 | 6 | const secretKeys = [ 7 | "GOOGLE_APPLICATION_CREDENTIALS", 8 | "DATABASE_URL", 9 | "YOUTUBE_API_KEY", 10 | ] as const; 11 | 12 | const secretList = secretKeys.map((key) => new Config.Secret(stack, key)); 13 | const secrets = Object.fromEntries( 14 | secretKeys.map((key, i) => [key, secretList[i]]) 15 | ) as { [K in (typeof secretKeys)[number]]: Config.Secret }; 16 | 17 | 18 | return { 19 | secretList, 20 | secrets, 21 | }; 22 | } 23 | -------------------------------------------------------------------------------- /stacks/WebStack.ts: -------------------------------------------------------------------------------- 1 | import fs from "fs"; 2 | import { StackContext, StaticSite, use } from 'sst/constructs'; 3 | import { ApiStack } from './ApiStack'; 4 | 5 | 6 | export function WebStack({ stack, app }: StackContext) { 7 | 8 | const api = use(ApiStack); 9 | 10 | const prodFirebaseConfig = JSON.stringify({ 11 | apiKey: "AIzaSyAOblwd_m7Y3Vr3-uaYDH4S_0DYM93e9hw", 12 | authDomain: "internetcheckpoint-de64f.firebaseapp.com", 13 | projectId: "internetcheckpoint-de64f", 14 | storageBucket: "internetcheckpoint-de64f.appspot.com", 15 | messagingSenderId: "242769860962", 16 | appId: "1:242769860962:web:4083c5b9bb58ea291ef43b", 17 | measurementId: "G-43W5RSPT9Y" 18 | }); 19 | 20 | 21 | const landing = new StaticSite(stack, 'landing', { 22 | path: 'packages/website', 23 | buildOutput: '.output/public', 24 | buildCommand: 'yarn generate', 25 | errorPage: '404.html', 26 | 27 | ...(['prod', 'dev'].includes(app.stage) && { 28 | customDomain: { 29 | domainName: app.stage === 'prod' ? 'internetcheckpoint.page': 'dev.internetcheckpoint.page', 30 | hostedZone: 'internetcheckpoint.page', 31 | }, 32 | }), 33 | 34 | environment: { 35 | NUXT_STAGE: stack.stage, 36 | NUXT_APP_DOMAIN: app.stage === 'prod' ? 'internetcheckpoint.page': 'dev.internetcheckpoint.page', 37 | NUXT_API_URL: api.url, 38 | NUXT_GA_ID: 'G-43W5RSPT9Y', 39 | NUXT_FIREBASE_CONFIG: prodFirebaseConfig, 40 | }, 41 | }); 42 | 43 | if (app.local) { 44 | 45 | fs.writeFileSync( 46 | './packages/website/.env', 47 | Object.entries(landing.getConstructMetadata().data.environment) 48 | .filter(([key, value]) => key !== 'NUXT_API_URL') 49 | .map(([key, value]) => `${key}=${value}`) 50 | .join('\n'), 51 | { flag: 'w' } 52 | ); 53 | 54 | } 55 | 56 | stack.addOutputs({ 57 | LandingUrl: landing.customDomainUrl ?? landing.url, 58 | }); 59 | 60 | } 61 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "@tsconfig/node20/tsconfig.json", 3 | "compilerOptions": { 4 | "baseUrl": ".", 5 | "module": "esnext", 6 | "moduleResolution": "node", 7 | "allowSyntheticDefaultImports": true, 8 | "paths": { 9 | "@db": ["./packages/functions/src/db/index.ts"], 10 | "@db/*": ["./packages/functions/src/db/*"], 11 | "backups/*": ["./backups/*"] 12 | } 13 | }, 14 | } 15 | --------------------------------------------------------------------------------