From fe1f31842457d7b6dcb2aa42704801ccf67bfc4f Mon Sep 17 00:00:00 2001 From: CJ_Clippy Date: Wed, 5 Nov 2025 20:49:00 -0900 Subject: [PATCH] add /account settings --- .vscode/extensions.json | 3 +- MANTRAS.md | 5 +- services/our/prisma/schema.prisma | 3 + services/pocketbase/.gitignore | 5 + services/pocketbase/CHANGELOG.md | 1 + services/pocketbase/README.md | 94 + services/pocketbase/package-lock.json | 2868 +++++++++++ services/pocketbase/package.json | 25 + services/pocketbase/pb_hooks/import.pb.js | 37 + .../pb_hooks/pages/(site)/+layout.ejs | 80 + .../pb_hooks/pages/(site)/+middleware.js | 31 + .../pages/(site)/account/+middleware.js | 9 + .../pb_hooks/pages/(site)/account/index.ejs | 36 + .../pages/(site)/auth/_private/oauth2.ejs | 30 + .../pages/(site)/auth/login/index.ejs | 8 + .../pages/(site)/auth/logout/index.ejs | 4 + .../pages/(site)/auth/oauth/confirm.ejs | 67 + .../pages/(site)/auth/oauth/login.ejs | 23 + .../pb_hooks/pages/(site)/humans.txt | 10 + .../pb_hooks/pages/(site)/index.ejs | 23 + .../pb_hooks/pages/(site)/patrons/index.ejs | 64 + .../pb_hooks/pages/(site)/robots.txt | 10 + .../pb_hooks/pages/(site)/vods/+load.js | 48 + .../pb_hooks/pages/(site)/vods/[id]/+load.js | 26 + .../pb_hooks/pages/(site)/vods/[id]/index.ejs | 72 + .../pages/(site)/vods/feed.xml/+load.js | 26 + .../pages/(site)/vods/feed.xml/index.ejs | 50 + .../pb_hooks/pages/(site)/vods/index.ejs | 72 + .../pb_hooks/pages/(site)/vt/[slug]/+load.js | 25 + .../pb_hooks/pages/(site)/vt/[slug]/index.ejs | 3 + .../pb_hooks/pages/(site)/vt/index.ejs | 8 + services/pocketbase/pb_hooks/pages/+config.js | 14 + .../pb_hooks/pages/_private/vtuber-list.ejs | 11 + .../pb_hooks/pages/_private/vtuber.ejs | 62 + .../pb_hooks/pages/api/service.json/index.ejs | 6 + .../pages/api/user/settings/index.ejs | 41 + .../pb_hooks/pages/api/v1.json/index.ejs | 6 + .../pb_hooks/pages/feed/feed.json/index.ejs | 1 + .../pb_hooks/pages/feed/feed.xml/index.ejs | 1 + .../pb_hooks/pages/feed/rss.xml/index.ejs | 1 + .../pb_hooks/pages/vods/feed.json/+load.js | 26 + .../pb_hooks/pages/vods/feed.json/index.ejs | 29 + .../pb_hooks/pages/vods/feed.xml/+load.js | 28 + .../pb_hooks/pages/vods/feed.xml/index.ejs | 58 + .../pb_hooks/pages/vods/rss.xml/+load.js | 28 + .../pb_hooks/pages/vods/rss.xml/index.ejs | 56 + .../pocketbase/pb_hooks/pocketpages.pb.js | 1 + .../pb_migrations/1761803155_created_vod.js | 79 + .../1761803182_created_vtuber.js | 57 + .../1761803237_updated_vtuber.js | 48 + .../1761818023_updated_vtuber.js | 352 ++ .../pb_migrations/1761818044_updated_vod.js | 20 + .../1761818052_updated_vtuber.js | 20 + .../pb_migrations/1761818487_updated_vods.js | 139 + .../pb_migrations/1761818515_updated_vods.js | 28 + .../1761911220_updated_vtubers.js | 46 + .../pb_migrations/1761915053_updated_vods.js | 124 + .../pb_migrations/1761915570_updated_vods.js | 67 + .../pb_migrations/1761925981_updated_vods.js | 29 + .../pb_migrations/1762063470_updated_vods.js | 29 + .../pb_migrations/1762098375_updated_users.js | 24 + .../pb_migrations/1762157776_updated_users.js | 34 + .../pb_migrations/1762157822_updated_users.js | 48 + .../pb_migrations/1762157870_updated_users.js | 38 + .../pb_migrations/1762159429_updated_users.js | 29 + .../1762174563_deleted_queue_stats.js | 58 + .../1762174576_deleted_queue_locks.js | 87 + .../1762174580_deleted_queue_tasks.js | 109 + .../pb_migrations/1762230465_updated_users.js | 30 + .../pb_migrations/1762238135_updated_users.js | 29 + services/pocketbase/pb_public/favicon.ico | Bin 0 -> 323 bytes .../pocketbase/pb_public/service-worker.js | 1 + .../src/plugins/patreon/package-lock.json | 957 ++++ .../src/plugins/patreon/package.json | 19 + .../src/plugins/patreon/src/index.ts | 40 + .../src/plugins/patreon/tsconfig.json | 19 + .../src/plugins/patreon/tsdown.config.ts | 10 + .../pocketbase/systemd/pocketbase.service | 14 + .../2025-10-30-v1-export-exec.sh | 8 + .../data_migrations/2025-10-30-v1-export.js | 172 + .../utils/data_migrations/vods.json | 4172 +++++++++++++++++ .../utils/data_migrations/vtubers.json | 94 + services/pocketbase/utils/deploy.js | 43 + 83 files changed, 11206 insertions(+), 2 deletions(-) create mode 100644 services/pocketbase/.gitignore create mode 100644 services/pocketbase/CHANGELOG.md create mode 100644 services/pocketbase/README.md create mode 100644 services/pocketbase/package-lock.json create mode 100644 services/pocketbase/package.json create mode 100644 services/pocketbase/pb_hooks/import.pb.js create mode 100644 services/pocketbase/pb_hooks/pages/(site)/+layout.ejs create mode 100644 services/pocketbase/pb_hooks/pages/(site)/+middleware.js create mode 100644 services/pocketbase/pb_hooks/pages/(site)/account/+middleware.js create mode 100644 services/pocketbase/pb_hooks/pages/(site)/account/index.ejs create mode 100644 services/pocketbase/pb_hooks/pages/(site)/auth/_private/oauth2.ejs create mode 100644 services/pocketbase/pb_hooks/pages/(site)/auth/login/index.ejs create mode 100644 services/pocketbase/pb_hooks/pages/(site)/auth/logout/index.ejs create mode 100644 services/pocketbase/pb_hooks/pages/(site)/auth/oauth/confirm.ejs create mode 100644 services/pocketbase/pb_hooks/pages/(site)/auth/oauth/login.ejs create mode 100644 services/pocketbase/pb_hooks/pages/(site)/humans.txt create mode 100644 services/pocketbase/pb_hooks/pages/(site)/index.ejs create mode 100644 services/pocketbase/pb_hooks/pages/(site)/patrons/index.ejs create mode 100644 services/pocketbase/pb_hooks/pages/(site)/robots.txt create mode 100644 services/pocketbase/pb_hooks/pages/(site)/vods/+load.js create mode 100644 services/pocketbase/pb_hooks/pages/(site)/vods/[id]/+load.js create mode 100644 services/pocketbase/pb_hooks/pages/(site)/vods/[id]/index.ejs create mode 100644 services/pocketbase/pb_hooks/pages/(site)/vods/feed.xml/+load.js create mode 100644 services/pocketbase/pb_hooks/pages/(site)/vods/feed.xml/index.ejs create mode 100644 services/pocketbase/pb_hooks/pages/(site)/vods/index.ejs create mode 100644 services/pocketbase/pb_hooks/pages/(site)/vt/[slug]/+load.js create mode 100644 services/pocketbase/pb_hooks/pages/(site)/vt/[slug]/index.ejs create mode 100644 services/pocketbase/pb_hooks/pages/(site)/vt/index.ejs create mode 100644 services/pocketbase/pb_hooks/pages/+config.js create mode 100644 services/pocketbase/pb_hooks/pages/_private/vtuber-list.ejs create mode 100644 services/pocketbase/pb_hooks/pages/_private/vtuber.ejs create mode 100644 services/pocketbase/pb_hooks/pages/api/service.json/index.ejs create mode 100644 services/pocketbase/pb_hooks/pages/api/user/settings/index.ejs create mode 100644 services/pocketbase/pb_hooks/pages/api/v1.json/index.ejs create mode 100644 services/pocketbase/pb_hooks/pages/feed/feed.json/index.ejs create mode 100644 services/pocketbase/pb_hooks/pages/feed/feed.xml/index.ejs create mode 100644 services/pocketbase/pb_hooks/pages/feed/rss.xml/index.ejs create mode 100644 services/pocketbase/pb_hooks/pages/vods/feed.json/+load.js create mode 100644 services/pocketbase/pb_hooks/pages/vods/feed.json/index.ejs create mode 100644 services/pocketbase/pb_hooks/pages/vods/feed.xml/+load.js create mode 100644 services/pocketbase/pb_hooks/pages/vods/feed.xml/index.ejs create mode 100644 services/pocketbase/pb_hooks/pages/vods/rss.xml/+load.js create mode 100644 services/pocketbase/pb_hooks/pages/vods/rss.xml/index.ejs create mode 100644 services/pocketbase/pb_hooks/pocketpages.pb.js create mode 100644 services/pocketbase/pb_migrations/1761803155_created_vod.js create mode 100644 services/pocketbase/pb_migrations/1761803182_created_vtuber.js create mode 100644 services/pocketbase/pb_migrations/1761803237_updated_vtuber.js create mode 100644 services/pocketbase/pb_migrations/1761818023_updated_vtuber.js create mode 100644 services/pocketbase/pb_migrations/1761818044_updated_vod.js create mode 100644 services/pocketbase/pb_migrations/1761818052_updated_vtuber.js create mode 100644 services/pocketbase/pb_migrations/1761818487_updated_vods.js create mode 100644 services/pocketbase/pb_migrations/1761818515_updated_vods.js create mode 100644 services/pocketbase/pb_migrations/1761911220_updated_vtubers.js create mode 100644 services/pocketbase/pb_migrations/1761915053_updated_vods.js create mode 100644 services/pocketbase/pb_migrations/1761915570_updated_vods.js create mode 100644 services/pocketbase/pb_migrations/1761925981_updated_vods.js create mode 100644 services/pocketbase/pb_migrations/1762063470_updated_vods.js create mode 100644 services/pocketbase/pb_migrations/1762098375_updated_users.js create mode 100644 services/pocketbase/pb_migrations/1762157776_updated_users.js create mode 100644 services/pocketbase/pb_migrations/1762157822_updated_users.js create mode 100644 services/pocketbase/pb_migrations/1762157870_updated_users.js create mode 100644 services/pocketbase/pb_migrations/1762159429_updated_users.js create mode 100644 services/pocketbase/pb_migrations/1762174563_deleted_queue_stats.js create mode 100644 services/pocketbase/pb_migrations/1762174576_deleted_queue_locks.js create mode 100644 services/pocketbase/pb_migrations/1762174580_deleted_queue_tasks.js create mode 100644 services/pocketbase/pb_migrations/1762230465_updated_users.js create mode 100644 services/pocketbase/pb_migrations/1762238135_updated_users.js create mode 100644 services/pocketbase/pb_public/favicon.ico create mode 100644 services/pocketbase/pb_public/service-worker.js create mode 100644 services/pocketbase/src/plugins/patreon/package-lock.json create mode 100644 services/pocketbase/src/plugins/patreon/package.json create mode 100644 services/pocketbase/src/plugins/patreon/src/index.ts create mode 100644 services/pocketbase/src/plugins/patreon/tsconfig.json create mode 100644 services/pocketbase/src/plugins/patreon/tsdown.config.ts create mode 100644 services/pocketbase/systemd/pocketbase.service create mode 100644 services/pocketbase/utils/data_migrations/2025-10-30-v1-export-exec.sh create mode 100644 services/pocketbase/utils/data_migrations/2025-10-30-v1-export.js create mode 100644 services/pocketbase/utils/data_migrations/vods.json create mode 100644 services/pocketbase/utils/data_migrations/vtubers.json create mode 100644 services/pocketbase/utils/deploy.js diff --git a/.vscode/extensions.json b/.vscode/extensions.json index 074eb644..d3f05a59 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -3,6 +3,7 @@ "redhat.vscode-yaml", "jetify.devbox", "redhat.ansible", - "dotjoshjohnson.xml" + "dotjoshjohnson.xml", + "j69.ejs-beautify" ] } \ No newline at end of file diff --git a/MANTRAS.md b/MANTRAS.md index dca685fe..c2fb5f7d 100644 --- a/MANTRAS.md +++ b/MANTRAS.md @@ -59,4 +59,7 @@ In other words, pick something for a name and roll with the punches. ### Do what you can, with what you have, where you are at -### Use it up, wear it out, make it do, or do without \ No newline at end of file +### Use it up, wear it out, make it do, or do without + +### [Just Culture](https://pilotswhoaskwhy.com/2023/05/15/the-power-of-just-culture-killing-the-blame-game/) + diff --git a/services/our/prisma/schema.prisma b/services/our/prisma/schema.prisma index d15a4b9b..89292007 100644 --- a/services/our/prisma/schema.prisma +++ b/services/our/prisma/schema.prisma @@ -80,6 +80,9 @@ model Vod { sourceAudioCodec String? sourceVideoFps Float? + muxAssetId String? + muxPlaybackId String? + // audio analysis audioIntegratedLufs Float? // Integrated loudness (LUFS-I) audioLoudnessRange Float? // Loudness Range (LRA) diff --git a/services/pocketbase/.gitignore b/services/pocketbase/.gitignore new file mode 100644 index 00000000..e122e2de --- /dev/null +++ b/services/pocketbase/.gitignore @@ -0,0 +1,5 @@ +.ftp-deploy-sync-state.json +node_modules +pb_data +.DS_Store +.secrets \ No newline at end of file diff --git a/services/pocketbase/CHANGELOG.md b/services/pocketbase/CHANGELOG.md new file mode 100644 index 00000000..9855bca3 --- /dev/null +++ b/services/pocketbase/CHANGELOG.md @@ -0,0 +1 @@ +# pocketpages-starter-datastar diff --git a/services/pocketbase/README.md b/services/pocketbase/README.md new file mode 100644 index 00000000..248a83a5 --- /dev/null +++ b/services/pocketbase/README.md @@ -0,0 +1,94 @@ +# Datastar Starter Kit + +This starter kit demonstrates how to build realtime web applications using [Datastar](https://github.com/starfederation/datastar) with PocketPages. It includes a live chat demo and counter example. + +## Features + +- Realtime chat with emoji avatars +- Live counter with instant updates +- Datastar signal management +- Server-sent events (SSE) integration +- Modern UI with Tailwind CSS + +## Installation + +```bash +npx tiged benallfree/pocketpages/packages/starters/datastar . +cd datastar +npm i +pocketbase serve --dir=pb_data --dev +``` + +## Setup + +The starter kit is pre-configured with the required Datastar setup: + +1. **Plugin Configuration** (`+config.js`): Includes the datastar plugin +2. **Script Injection** (`+layout.ejs`): Includes `<%- datastar.scripts() %>` in the `` section +3. **Realtime Integration**: Configured for realtime updates + +## Usage + +1. Start the server and visit `http://127.0.0.1:8090` +2. Open multiple browser tabs to see realtime updates +3. Send messages in the chat to see them appear instantly across all tabs +4. Click the counter button to see live updates + +## Key Components + +- **Chat System**: Real-time messaging with random emoji avatars +- **Counter**: Simple state management with live updates +- **Datastar Integration**: Server-side signal reading and client-side binding +- **Realtime Broadcasting**: Updates sent to all connected clients + +## Datastar Features Demonstrated + +- `datastar.patchElements()` - DOM updates +- `datastar.patchSignals()` - Signal management +- `datastar.readSignals()` - Form data reading +- `datastar.realtime.*` - Broadcasting to all clients +- Client-side data binding with `data-bind-*` attributes +- Event handling with `data-on-click` attributes + + + +## dev notes + +### S3 has some jenk + +cache s3 requests at the proxy level +https://github.com/pocketbase/pocketbase/issues/28#issuecomment-1492516269 +https://github.com/pocketbase/pocketbase/discussions/4332#discussioncomment-8450890 + + +### search + +https://www.meilisearch.com/ + + +### horizontal scaling + +https://github.com/fondoger/pocketbase (pg fork) +https://github.com/litesql/pocketbase-ha + + +### Data migrations + +https://github.com/pocketbase/pocketbase/discussions/2836#discussioncomment-6340103 + + +### FTS + +https://github.com/pocketbuilds/fts?tab=readme-ov-file#readme + + +### plugins + +https://pocketbuilds.com/ + + +## Deployments + +how the pros do it + +https://github.com/benallfree/pocketpages/blob/5bc48d4f8df75b2f78ca61fa18c792d814b926e8/packages/starters/deploy-pockethost-manual/deploy-pockethost.ts#L5 diff --git a/services/pocketbase/package-lock.json b/services/pocketbase/package-lock.json new file mode 100644 index 00000000..fbe56f47 --- /dev/null +++ b/services/pocketbase/package-lock.json @@ -0,0 +1,2868 @@ +{ + "name": "futureporn", + "version": "0.0.3", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "futureporn", + "version": "0.0.3", + "license": "Unlicense", + "dependencies": { + "jsonwebtoken": "^9.0.2", + "pg": "^8.16.3", + "pocketpages": ">=0.22.3", + "pocketpages-plugin-auth": "^0.2.2", + "pocketpages-plugin-datastar": ">=0.2.0", + "pocketpages-plugin-micro-dash": "^0.1.0" + }, + "devDependencies": { + "phio": "^0.3.5" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.11.tgz", + "integrity": "sha512-Xt1dOL13m8u0WE8iplx9Ibbm+hFAO0GsU2P34UNoDGvZYkY8ifSiy6Zuc1lYxfG7svWE2fzqCUmFp5HCn51gJg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.11.tgz", + "integrity": "sha512-uoa7dU+Dt3HYsethkJ1k6Z9YdcHjTrSb5NUy66ZfZaSV8hEYGD5ZHbEMXnqLFlbBflLsl89Zke7CAdDJ4JI+Gg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.11.tgz", + "integrity": "sha512-9slpyFBc4FPPz48+f6jyiXOx/Y4v34TUeDDXJpZqAWQn/08lKGeD8aDp9TMn9jDz2CiEuHwfhRmGBvpnd/PWIQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.11.tgz", + "integrity": "sha512-Sgiab4xBjPU1QoPEIqS3Xx+R2lezu0LKIEcYe6pftr56PqPygbB7+szVnzoShbx64MUupqoE0KyRlN7gezbl8g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.11.tgz", + "integrity": "sha512-VekY0PBCukppoQrycFxUqkCojnTQhdec0vevUL/EDOCnXd9LKWqD/bHwMPzigIJXPhC59Vd1WFIL57SKs2mg4w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.11.tgz", + "integrity": "sha512-+hfp3yfBalNEpTGp9loYgbknjR695HkqtY3d3/JjSRUyPg/xd6q+mQqIb5qdywnDxRZykIHs3axEqU6l1+oWEQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.11.tgz", + "integrity": "sha512-CmKjrnayyTJF2eVuO//uSjl/K3KsMIeYeyN7FyDBjsR3lnSJHaXlVoAK8DZa7lXWChbuOk7NjAc7ygAwrnPBhA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.11.tgz", + "integrity": "sha512-Dyq+5oscTJvMaYPvW3x3FLpi2+gSZTCE/1ffdwuM6G1ARang/mb3jvjxs0mw6n3Lsw84ocfo9CrNMqc5lTfGOw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.11.tgz", + "integrity": "sha512-TBMv6B4kCfrGJ8cUPo7vd6NECZH/8hPpBHHlYI3qzoYFvWu2AdTvZNuU/7hsbKWqu/COU7NIK12dHAAqBLLXgw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.11.tgz", + "integrity": "sha512-Qr8AzcplUhGvdyUF08A1kHU3Vr2O88xxP0Tm8GcdVOUm25XYcMPp2YqSVHbLuXzYQMf9Bh/iKx7YPqECs6ffLA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.11.tgz", + "integrity": "sha512-TmnJg8BMGPehs5JKrCLqyWTVAvielc615jbkOirATQvWWB1NMXY77oLMzsUjRLa0+ngecEmDGqt5jiDC6bfvOw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.11.tgz", + "integrity": "sha512-DIGXL2+gvDaXlaq8xruNXUJdT5tF+SBbJQKbWy/0J7OhU8gOHOzKmGIlfTTl6nHaCOoipxQbuJi7O++ldrxgMw==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.11.tgz", + "integrity": "sha512-Osx1nALUJu4pU43o9OyjSCXokFkFbyzjXb6VhGIJZQ5JZi8ylCQ9/LFagolPsHtgw6himDSyb5ETSfmp4rpiKQ==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.11.tgz", + "integrity": "sha512-nbLFgsQQEsBa8XSgSTSlrnBSrpoWh7ioFDUmwo158gIm5NNP+17IYmNWzaIzWmgCxq56vfr34xGkOcZ7jX6CPw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.11.tgz", + "integrity": "sha512-HfyAmqZi9uBAbgKYP1yGuI7tSREXwIb438q0nqvlpxAOs3XnZ8RsisRfmVsgV486NdjD7Mw2UrFSw51lzUk1ww==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.11.tgz", + "integrity": "sha512-HjLqVgSSYnVXRisyfmzsH6mXqyvj0SA7pG5g+9W7ESgwA70AXYNpfKBqh1KbTxmQVaYxpzA/SvlB9oclGPbApw==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.11.tgz", + "integrity": "sha512-HSFAT4+WYjIhrHxKBwGmOOSpphjYkcswF449j6EjsjbinTZbp8PJtjsVK1XFJStdzXdy/jaddAep2FGY+wyFAQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.11.tgz", + "integrity": "sha512-hr9Oxj1Fa4r04dNpWr3P8QKVVsjQhqrMSUzZzf+LZcYjZNqhA3IAfPQdEh1FLVUJSiu6sgAwp3OmwBfbFgG2Xg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.11.tgz", + "integrity": "sha512-u7tKA+qbzBydyj0vgpu+5h5AeudxOAGncb8N6C9Kh1N4n7wU1Xw1JDApsRjpShRpXRQlJLb9wY28ELpwdPcZ7A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.11.tgz", + "integrity": "sha512-Qq6YHhayieor3DxFOoYM1q0q1uMFYb7cSpLD2qzDSvK1NAvqFi8Xgivv0cFC6J+hWVw2teCYltyy9/m/14ryHg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.11.tgz", + "integrity": "sha512-CN+7c++kkbrckTOz5hrehxWN7uIhFFlmS/hqziSFVWpAzpWrQoAG4chH+nN3Be+Kzv/uuo7zhX716x3Sn2Jduw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.11.tgz", + "integrity": "sha512-rOREuNIQgaiR+9QuNkbkxubbp8MSO9rONmwP5nKncnWJ9v5jQ4JxFnLu4zDSRPf3x4u+2VN4pM4RdyIzDty/wQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.11.tgz", + "integrity": "sha512-nq2xdYaWxyg9DcIyXkZhcYulC6pQ2FuCgem3LI92IwMgIZ69KHeY8T4Y88pcwoLIjbed8n36CyKoYRDygNSGhA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.11.tgz", + "integrity": "sha512-3XxECOWJq1qMZ3MN8srCJ/QfoLpL+VaxD/WfNRm1O3B4+AZ/BnLVgFbUV3eiRYDMXetciH16dwPbbHqwe1uU0Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.11.tgz", + "integrity": "sha512-3ukss6gb9XZ8TlRyJlgLn17ecsK4NSQTmdIXRASVsiS2sQ6zPPZklNJT5GR5tE/MUarymmy8kCEf5xPCNCqVOA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.11.tgz", + "integrity": "sha512-D7Hpz6A2L4hzsRpPaCYkQnGOotdUpDzSGRIv9I+1ITdHROSFUWW95ZPZWQmGka1Fg7W3zFJowyn9WGwMJ0+KPA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/ansi": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@inquirer/ansi/-/ansi-1.0.1.tgz", + "integrity": "sha512-yqq0aJW/5XPhi5xOAL1xRCpe1eh8UFVgYFpFsjEqmIR8rKLyP+HINvFXwUaxYICflJrVlxnp7lLN6As735kVpw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/checkbox": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.3.0.tgz", + "integrity": "sha512-5+Q3PKH35YsnoPTh75LucALdAxom6xh5D1oeY561x4cqBuH24ZFVyFREPe14xgnrtmGu3EEt1dIi60wRVSnGCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^1.0.1", + "@inquirer/core": "^10.3.0", + "@inquirer/figures": "^1.0.14", + "@inquirer/type": "^3.0.9", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/confirm": { + "version": "5.1.19", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.19.tgz", + "integrity": "sha512-wQNz9cfcxrtEnUyG5PndC8g3gZ7lGDBzmWiXZkX8ot3vfZ+/BLjR8EvyGX4YzQLeVqtAlY/YScZpW7CW8qMoDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.0", + "@inquirer/type": "^3.0.9" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/core": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.3.0.tgz", + "integrity": "sha512-Uv2aPPPSK5jeCplQmQ9xadnFx2Zhj9b5Dj7bU6ZeCdDNNY11nhYy4btcSdtDguHqCT2h5oNeQTcUNSGGLA7NTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^1.0.1", + "@inquirer/figures": "^1.0.14", + "@inquirer/type": "^3.0.9", + "cli-width": "^4.1.0", + "mute-stream": "^2.0.0", + "signal-exit": "^4.1.0", + "wrap-ansi": "^6.2.0", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/editor": { + "version": "4.2.21", + "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.21.tgz", + "integrity": "sha512-MjtjOGjr0Kh4BciaFShYpZ1s9400idOdvQ5D7u7lE6VztPFoyLcVNE5dXBmEEIQq5zi4B9h2kU+q7AVBxJMAkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.0", + "@inquirer/external-editor": "^1.0.2", + "@inquirer/type": "^3.0.9" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/expand": { + "version": "4.0.21", + "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.21.tgz", + "integrity": "sha512-+mScLhIcbPFmuvU3tAGBed78XvYHSvCl6dBiYMlzCLhpr0bzGzd8tfivMMeqND6XZiaZ1tgusbUHJEfc6YzOdA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.0", + "@inquirer/type": "^3.0.9", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/external-editor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-1.0.2.tgz", + "integrity": "sha512-yy9cOoBnx58TlsPrIxauKIFQTiyH+0MK4e97y4sV9ERbI+zDxw7i2hxHLCIEGIE/8PPvDxGhgzIOTSOWcs6/MQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "chardet": "^2.1.0", + "iconv-lite": "^0.7.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/figures": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.14.tgz", + "integrity": "sha512-DbFgdt+9/OZYFM+19dbpXOSeAstPy884FPy1KjDu4anWwymZeOYhMY1mdFri172htv6mvc/uvIAAi7b7tvjJBQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/input": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.2.5.tgz", + "integrity": "sha512-7GoWev7P6s7t0oJbenH0eQ0ThNdDJbEAEtVt9vsrYZ9FulIokvd823yLyhQlWHJPGce1wzP53ttfdCZmonMHyA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.0", + "@inquirer/type": "^3.0.9" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/number": { + "version": "3.0.21", + "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.21.tgz", + "integrity": "sha512-5QWs0KGaNMlhbdhOSCFfKsW+/dcAVC2g4wT/z2MCiZM47uLgatC5N20kpkDQf7dHx+XFct/MJvvNGy6aYJn4Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.0", + "@inquirer/type": "^3.0.9" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/password": { + "version": "4.0.21", + "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.21.tgz", + "integrity": "sha512-xxeW1V5SbNFNig2pLfetsDb0svWlKuhmr7MPJZMYuDnCTkpVBI+X/doudg4pznc1/U+yYmWFFOi4hNvGgUo7EA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^1.0.1", + "@inquirer/core": "^10.3.0", + "@inquirer/type": "^3.0.9" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/prompts": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.9.0.tgz", + "integrity": "sha512-X7/+dG9SLpSzRkwgG5/xiIzW0oMrV3C0HOa7YHG1WnrLK+vCQHfte4k/T80059YBdei29RBC3s+pSMvPJDU9/A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/checkbox": "^4.3.0", + "@inquirer/confirm": "^5.1.19", + "@inquirer/editor": "^4.2.21", + "@inquirer/expand": "^4.0.21", + "@inquirer/input": "^4.2.5", + "@inquirer/number": "^3.0.21", + "@inquirer/password": "^4.0.21", + "@inquirer/rawlist": "^4.1.9", + "@inquirer/search": "^3.2.0", + "@inquirer/select": "^4.4.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/rawlist": { + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.1.9.tgz", + "integrity": "sha512-AWpxB7MuJrRiSfTKGJ7Y68imYt8P9N3Gaa7ySdkFj1iWjr6WfbGAhdZvw/UnhFXTHITJzxGUI9k8IX7akAEBCg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.0", + "@inquirer/type": "^3.0.9", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/search": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.2.0.tgz", + "integrity": "sha512-a5SzB/qrXafDX1Z4AZW3CsVoiNxcIYCzYP7r9RzrfMpaLpB+yWi5U8BWagZyLmwR0pKbbL5umnGRd0RzGVI8bQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.0", + "@inquirer/figures": "^1.0.14", + "@inquirer/type": "^3.0.9", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/select": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.4.0.tgz", + "integrity": "sha512-kaC3FHsJZvVyIjYBs5Ih8y8Bj4P/QItQWrZW22WJax7zTN+ZPXVGuOM55vzbdCP9zKUiBd9iEJVdesujfF+cAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^1.0.1", + "@inquirer/core": "^10.3.0", + "@inquirer/figures": "^1.0.14", + "@inquirer/type": "^3.0.9", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/type": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.9.tgz", + "integrity": "sha512-QPaNt/nmE2bLGQa9b7wwyRJoLZ7pN6rcyXvzU0YCmivmJyq1BVo94G98tStRWkoD1RgDX5C+dPlhhHzNdu/W/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@isaacs/balanced-match": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz", + "integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@isaacs/brace-expansion": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@isaacs/brace-expansion/-/brace-expansion-5.0.0.tgz", + "integrity": "sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@isaacs/balanced-match": "^4.0.1" + }, + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@s-libs/micro-dash": { + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/@s-libs/micro-dash/-/micro-dash-18.0.0.tgz", + "integrity": "sha512-/EiBrhJIDVBI3DpWPaezO065VOQ/UUiLx3BLtkNx59S7T5AuYUxLp64fw3uR8Uk5qkIwQimhFMlvn/S1NkZanA==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.3.0" + } + }, + "node_modules/@samkirkland/ftp-deploy": { + "version": "1.2.4", + "resolved": "git+ssh://git@github.com/benallfree/ftp-deploy.git#132389eef18b00f842a0a94b06d62821e77de73e", + "dev": true, + "license": "MIT", + "dependencies": { + "basic-ftp": "^5.0.5", + "glob": "^11.0.0", + "lodash": "^4.17.21", + "multimatch": "^5.0.0", + "pretty-bytes": "^5.6.0", + "pretty-ms": "^7.0.1", + "tsx": "^4.19.1", + "typescript": "^5.6.2", + "yargs": "^17.7.1" + }, + "bin": { + "ftp-deploy": "dist/cli.js" + } + }, + "node_modules/@samkirkland/ftp-deploy/node_modules/array-differ": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-3.0.0.tgz", + "integrity": "sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@samkirkland/ftp-deploy/node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@samkirkland/ftp-deploy/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@samkirkland/ftp-deploy/node_modules/multimatch": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-5.0.0.tgz", + "integrity": "sha512-ypMKuglUrZUD99Tk2bUQ+xNQj43lPEfAeX2o9cTteAmShXy2VHDJpuwu1o0xqoKCt9jLVAvwyFKdLTPXKAfJyA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/minimatch": "^3.0.3", + "array-differ": "^3.0.0", + "array-union": "^2.1.0", + "arrify": "^2.0.1", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@sentool/fetch-event-source": { + "version": "0.6.0", + "resolved": "git+ssh://git@github.com/pockethost/sentool-fetch-event-source.git#c975adc3cdf9c645bf094b0b8a28454699075e22", + "integrity": "sha512-/nXqCcu0+uWMbYNqRjdBjlc+AqpIHDfjRhxHpgkKM0mfqoaWIuzaToYn6N1UTUim+r6YethS6lDfG0bIo7WagQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/array-differ": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-4.0.0.tgz", + "integrity": "sha512-Q6VPTLMsmXZ47ENG3V+wQyZS1ZxXMxFyYzA+Z/GMrJ6yIutAIEf9wTyroTzmGjNfox9/h3GdGBCVh43GVFx4Uw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/array-union": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-3.0.1.tgz", + "integrity": "sha512-1OvF9IbWwaeiM9VhzYXVQacMibxpXOMYVNIvMtKRyX9SImBXpKcFr8XvFDeEslCyuH/t6KRt7HEO94AlP8Iatw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/arrify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", + "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/basic-ftp": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.5.tgz", + "integrity": "sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/bottleneck": { + "version": "2.19.5", + "resolved": "https://registry.npmjs.org/bottleneck/-/bottleneck-2.19.5.tgz", + "integrity": "sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==", + "dev": true, + "license": "MIT" + }, + "node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", + "license": "BSD-3-Clause" + }, + "node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chardet": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.1.1.tgz", + "integrity": "sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/cli-cursor": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", + "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", + "dev": true, + "license": "MIT", + "dependencies": { + "restore-cursor": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-width": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", + "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 12" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/commander": { + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-13.1.0.tgz", + "integrity": "sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", + "dev": true, + "license": "MIT" + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true, + "license": "MIT" + }, + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/email-validator": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/email-validator/-/email-validator-2.0.4.tgz", + "integrity": "sha512-gYCwo7kh5S3IDyZPLZf6hSS0MnZT8QmJFqYvbqlDZSbwdZlY6QZWxJ4i/6UhITOJ4XzyI647Bm2MXKCLqnJ4nQ==", + "dev": true, + "engines": { + "node": ">4.0" + } + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/env-paths": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-3.0.0.tgz", + "integrity": "sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/env-var": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/env-var/-/env-var-7.5.0.tgz", + "integrity": "sha512-mKZOzLRN0ETzau2W2QXefbFjo5EF4yWq28OyKb9ICdeNhHJlOE/pHHnz4hdYJ9cNZXcJHo5xN4OT4pzuSHSNvA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/esbuild": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.11.tgz", + "integrity": "sha512-KohQwyzrKTQmhXDW1PjCv3Tyspn9n5GcY2RTDqeORIdIJY8yKIF7sTSopFmn/wpMPW4rdPXI0UE5LJLuq3bx0Q==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.11", + "@esbuild/android-arm": "0.25.11", + "@esbuild/android-arm64": "0.25.11", + "@esbuild/android-x64": "0.25.11", + "@esbuild/darwin-arm64": "0.25.11", + "@esbuild/darwin-x64": "0.25.11", + "@esbuild/freebsd-arm64": "0.25.11", + "@esbuild/freebsd-x64": "0.25.11", + "@esbuild/linux-arm": "0.25.11", + "@esbuild/linux-arm64": "0.25.11", + "@esbuild/linux-ia32": "0.25.11", + "@esbuild/linux-loong64": "0.25.11", + "@esbuild/linux-mips64el": "0.25.11", + "@esbuild/linux-ppc64": "0.25.11", + "@esbuild/linux-riscv64": "0.25.11", + "@esbuild/linux-s390x": "0.25.11", + "@esbuild/linux-x64": "0.25.11", + "@esbuild/netbsd-arm64": "0.25.11", + "@esbuild/netbsd-x64": "0.25.11", + "@esbuild/openbsd-arm64": "0.25.11", + "@esbuild/openbsd-x64": "0.25.11", + "@esbuild/openharmony-arm64": "0.25.11", + "@esbuild/sunos-x64": "0.25.11", + "@esbuild/win32-arm64": "0.25.11", + "@esbuild/win32-ia32": "0.25.11", + "@esbuild/win32-x64": "0.25.11" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/event-stream": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-4.0.1.tgz", + "integrity": "sha512-qACXdu/9VHPBzcyhdOWR5/IahhGMf0roTeZJfzz077GwylcDd90yOHLouhmv7GJ5XzPi6ekaQWd8AvPP2nOvpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "duplexer": "^0.1.1", + "from": "^0.1.7", + "map-stream": "0.0.7", + "pause-stream": "^0.0.11", + "split": "^1.0.1", + "stream-combiner": "^0.2.2", + "through": "^2.3.8" + } + }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dev": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/from": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", + "integrity": "sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g==", + "dev": true, + "license": "MIT" + }, + "node_modules/fs-extra": { + "version": "11.3.2", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.2.tgz", + "integrity": "sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-east-asian-width": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.4.0.tgz", + "integrity": "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-tsconfig": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.0.tgz", + "integrity": "sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/glob": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.3.tgz", + "integrity": "sha512-2Nim7dha1KVkaiF4q6Dj+ngPPMdfvLJEOpZk/jKiUAkqKebpGAWQXAq9z1xu9HKu5lWfqw/FASuccEjyznjPaA==", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.3.1", + "jackspeak": "^4.1.1", + "minimatch": "^10.0.3", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^2.0.0" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/iconv-lite": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.0.tgz", + "integrity": "sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-interactive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", + "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-unicode-supported": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", + "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/jackspeak": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.1.1.tgz", + "integrity": "sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonwebtoken": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", + "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", + "license": "MIT", + "dependencies": { + "jws": "^3.2.2", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=12", + "npm": ">=6" + } + }, + "node_modules/jwa": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.2.tgz", + "integrity": "sha512-eeH5JO+21J78qMvTIDdBXidBd6nG2kZjg5Ohz/1fpa28Z4CcsWUzJ1ZZyFq/3z3N17aZy+ZuBoHljASbL1WfOw==", + "license": "MIT", + "dependencies": { + "buffer-equal-constant-time": "^1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jws": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "license": "MIT", + "dependencies": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==", + "license": "MIT" + }, + "node_modules/lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==", + "license": "MIT" + }, + "node_modules/lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==", + "license": "MIT" + }, + "node_modules/lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==", + "license": "MIT" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "license": "MIT" + }, + "node_modules/lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", + "license": "MIT" + }, + "node_modules/lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", + "license": "MIT" + }, + "node_modules/log-symbols": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-6.0.0.tgz", + "integrity": "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^5.3.0", + "is-unicode-supported": "^1.3.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-symbols/node_modules/is-unicode-supported": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", + "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lru-cache": { + "version": "11.2.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.2.tgz", + "integrity": "sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/map-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.0.7.tgz", + "integrity": "sha512-C0X0KQmGm3N2ftbTGBhSyuydQ+vV1LC3f3zPvT3RXHXNZrvfPZcoXp/N5DOa8vedX/rTMm2CjTtivFg2STJMRQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/mimic-function": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", + "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/minimatch": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", + "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/brace-expansion": "^5.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/multimatch": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-7.0.0.tgz", + "integrity": "sha512-SYU3HBAdF4psHEL/+jXDKHO95/m5P2RvboHT2Y0WtTttvJLP4H/2WS9WlQPFvF6C8d6SpLw8vjCnQOnVIVOSJQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-differ": "^4.0.0", + "array-union": "^3.0.1", + "minimatch": "^9.0.3" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/multimatch/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/multimatch/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/mute-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz", + "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/onetime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", + "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-function": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-8.2.0.tgz", + "integrity": "sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^5.3.0", + "cli-cursor": "^5.0.0", + "cli-spinners": "^2.9.2", + "is-interactive": "^2.0.0", + "is-unicode-supported": "^2.0.0", + "log-symbols": "^6.0.0", + "stdin-discarder": "^0.2.2", + "string-width": "^7.2.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/emoji-regex": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "dev": true, + "license": "MIT" + }, + "node_modules/ora/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "dev": true, + "license": "BlueOak-1.0.0" + }, + "node_modules/parse-ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-2.1.0.tgz", + "integrity": "sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-scurry": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.0.tgz", + "integrity": "sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/pause-stream": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", + "integrity": "sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A==", + "dev": true, + "license": [ + "MIT", + "Apache2" + ], + "dependencies": { + "through": "~2.3" + } + }, + "node_modules/pg": { + "version": "8.16.3", + "resolved": "https://registry.npmjs.org/pg/-/pg-8.16.3.tgz", + "integrity": "sha512-enxc1h0jA/aq5oSDMvqyW3q89ra6XIIDZgCX9vkMrnz5DFTw/Ny3Li2lFQ+pt3L6MCgm/5o2o8HW9hiJji+xvw==", + "license": "MIT", + "dependencies": { + "pg-connection-string": "^2.9.1", + "pg-pool": "^3.10.1", + "pg-protocol": "^1.10.3", + "pg-types": "2.2.0", + "pgpass": "1.0.5" + }, + "engines": { + "node": ">= 16.0.0" + }, + "optionalDependencies": { + "pg-cloudflare": "^1.2.7" + }, + "peerDependencies": { + "pg-native": ">=3.0.1" + }, + "peerDependenciesMeta": { + "pg-native": { + "optional": true + } + } + }, + "node_modules/pg-cloudflare": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.2.7.tgz", + "integrity": "sha512-YgCtzMH0ptvZJslLM1ffsY4EuGaU0cx4XSdXLRFae8bPP4dS5xL1tNB3k2o/N64cHJpwU7dxKli/nZ2lUa5fLg==", + "license": "MIT", + "optional": true + }, + "node_modules/pg-connection-string": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.9.1.tgz", + "integrity": "sha512-nkc6NpDcvPVpZXxrreI/FOtX3XemeLl8E0qFr6F2Lrm/I8WOnaWNhIPK2Z7OHpw7gh5XJThi6j6ppgNoaT1w4w==", + "license": "MIT" + }, + "node_modules/pg-int8": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", + "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==", + "license": "ISC", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/pg-pool": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.10.1.tgz", + "integrity": "sha512-Tu8jMlcX+9d8+QVzKIvM/uJtp07PKr82IUOYEphaWcoBhIYkoHpLXN3qO59nAI11ripznDsEzEv8nUxBVWajGg==", + "license": "MIT", + "peerDependencies": { + "pg": ">=8.0" + } + }, + "node_modules/pg-protocol": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.10.3.tgz", + "integrity": "sha512-6DIBgBQaTKDJyxnXaLiLR8wBpQQcGWuAESkRBX/t6OwA8YsqP+iVSiond2EDy6Y/dsGk8rh/jtax3js5NeV7JQ==", + "license": "MIT" + }, + "node_modules/pg-types": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", + "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", + "license": "MIT", + "dependencies": { + "pg-int8": "1.0.1", + "postgres-array": "~2.0.0", + "postgres-bytea": "~1.0.0", + "postgres-date": "~1.0.4", + "postgres-interval": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pgpass": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz", + "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==", + "license": "MIT", + "dependencies": { + "split2": "^4.1.0" + } + }, + "node_modules/phio": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/phio/-/phio-0.3.5.tgz", + "integrity": "sha512-r+BcjHl6PY6D0DHtpNsar3tp+RctJ799MaUT48wcYwXD042OTKHainfpvZbCDzcYl1eR3U4Uums+I6ZgvgER5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/prompts": "^7.3.2", + "@s-libs/micro-dash": "^18.0.0", + "@samkirkland/ftp-deploy": "github:benallfree/ftp-deploy#132389e", + "@sentool/fetch-event-source": "github:pockethost/sentool-fetch-event-source#c975adc3cdf9c645bf094b0b8a28454699075e22", + "bottleneck": "^2.19.5", + "chokidar": "^4.0.3", + "commander": "^13.1.0", + "email-validator": "^2.0.4", + "env-paths": "^3.0.0", + "env-var": "^7.5.0", + "event-stream": "^4.0.1", + "fs-extra": "^11.3.0", + "multimatch": "^7.0.0", + "ora": "^8.2.0", + "pocketbase": "^0.25.1", + "tsx": "^4.19.3", + "typescript": "^5.7.3" + }, + "bin": { + "phio": "src/cli.ts" + } + }, + "node_modules/pocketbase": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/pocketbase/-/pocketbase-0.25.2.tgz", + "integrity": "sha512-ONZl1+qHJMnhR2uacBlBJ90lm7njtL/zy0606+1ROfK9hSL4LRBRc8r89rMcNRzPzRqCNyoFTh2Qg/lYXdEC1w==", + "dev": true, + "license": "MIT" + }, + "node_modules/pocketbase-ejs": { + "version": "3.1.10006", + "resolved": "https://registry.npmjs.org/pocketbase-ejs/-/pocketbase-ejs-3.1.10006.tgz", + "integrity": "sha512-OBt+qsE7APD2baer4sTddwC1UfhT1HwIt4I208v5IZ2RXncgd5d0Z/DwAZy5PEJrWscHn2qCob4GLiEiv6lvEQ==", + "license": "Apache-2.0", + "dependencies": { + "pocketbase-node": "^0.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pocketbase-ejs/node_modules/pocketbase-node": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/pocketbase-node/-/pocketbase-node-0.0.2.tgz", + "integrity": "sha512-DuTxkJbA+d6XVfm2QVCoJLyJWDJplzeSp+BU2eIA2H7902yAvVTx7bTSnjp1g/Y/QBtRrrGyXStvrMu3tKPXXw==", + "license": "MIT" + }, + "node_modules/pocketbase-js-sdk-jsvm": { + "version": "0.25.10004", + "resolved": "https://registry.npmjs.org/pocketbase-js-sdk-jsvm/-/pocketbase-js-sdk-jsvm-0.25.10004.tgz", + "integrity": "sha512-/0RkFa6X4LeKMdv4KCXhC5i2cvpG0elvXInRyk8bApjG8jyyPiNDL6o9VBvgxjl6j8/HcQYf3oKYXmZteqAFvQ==", + "license": "MIT" + }, + "node_modules/pocketbase-log": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/pocketbase-log/-/pocketbase-log-0.0.2.tgz", + "integrity": "sha512-d0thSPYopTZzC4I85hlN6hrZaQEX7BzHieovV45zqFfE3kl4rb65xITe3UDZ+/42IfCTEchaPbTUDP2yd1/E8g==", + "license": "MIT", + "dependencies": { + "pocketbase-stringify": "^0.0.2" + } + }, + "node_modules/pocketbase-node": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/pocketbase-node/-/pocketbase-node-0.0.3.tgz", + "integrity": "sha512-ZGrRFRlJqSXDl63913ZoHdtmpXJcaKO1km8STlGDbUJY6A+4xRC84e31gM4frRwSNhW6HsgsqkmzAj+UkZkDLg==", + "license": "MIT" + }, + "node_modules/pocketbase-stringify": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/pocketbase-stringify/-/pocketbase-stringify-0.0.2.tgz", + "integrity": "sha512-KqN6K1fmRpw62PJ7Ue4zwnTuGaYkZ2XPwY+3yrHrwbmXvutLalbDd8ipOORPZI8myLrN6xkMIWXvqoDjfgBo5A==", + "license": "MIT" + }, + "node_modules/pocketpages": { + "version": "0.22.3", + "resolved": "https://registry.npmjs.org/pocketpages/-/pocketpages-0.22.3.tgz", + "integrity": "sha512-Tsd7o+StgPJNLvJT/idaXInRxmQ5YwtI9GGumUu8tEEb6M8A9QKgy6cdjUyj3EO1DGwye8Wk7BxaVd3DzvF3lA==", + "license": "MIT", + "dependencies": { + "pocketbase-log": "^0.0.2", + "pocketpages-plugin-ejs": ">=0.1.2" + } + }, + "node_modules/pocketpages-plugin-auth": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/pocketpages-plugin-auth/-/pocketpages-plugin-auth-0.2.2.tgz", + "integrity": "sha512-CQ/3DFJNzf4tV3W7CxeV7n2scbbeTBVLltaQ1MsxtcfeF862Ad5PyAfUUkFdmnUjpPDpQVDAIKL/RVHg9/C3dQ==", + "dependencies": { + "pocketpages-plugin-js-sdk": ">=0.1.0" + } + }, + "node_modules/pocketpages-plugin-datastar": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/pocketpages-plugin-datastar/-/pocketpages-plugin-datastar-0.2.0.tgz", + "integrity": "sha512-dKy9FAuCoyH+k7ca+g0R7JOXraqp1S9mVpjUc4WO9uiEdsNXOy1dIapw/N3QV2xcvXAbh2ZurKISH2WOFXU4og==", + "dependencies": { + "pocketpages-plugin-realtime": ">=0.2.0" + } + }, + "node_modules/pocketpages-plugin-ejs": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/pocketpages-plugin-ejs/-/pocketpages-plugin-ejs-0.1.2.tgz", + "integrity": "sha512-kdNgIdTKvq1nFcpmnCZbX65cLNgw3Dle15RHihwe58Bo9M25KTSIafHWPcCRSfoCRfCVPw5lQMB+606/upOV+w==", + "dependencies": { + "pocketbase-ejs": "^3.1.10006", + "pocketbase-node": "^0.0.3", + "pocketbase-stringify": "^0.0.2" + } + }, + "node_modules/pocketpages-plugin-js-sdk": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/pocketpages-plugin-js-sdk/-/pocketpages-plugin-js-sdk-0.2.0.tgz", + "integrity": "sha512-/uY1nCz7Zt19C/kyoOraH5ekTZa4PLPpHd0qIEoyf1XBPtEpHL4k7jZE0IPEMu1dH/8RfsKb/YzN52GR+9DdzQ==", + "dependencies": { + "pocketbase-js-sdk-jsvm": "^0.25.10004" + } + }, + "node_modules/pocketpages-plugin-micro-dash": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/pocketpages-plugin-micro-dash/-/pocketpages-plugin-micro-dash-0.1.0.tgz", + "integrity": "sha512-YGnDOLC69JEguzZORa9T/1Ah/f6ZJC+Q7i6/PGTJBUrKjG0silgUowoQsCLQfLsoq39xBwv+D9cH+dgguY1B+g==" + }, + "node_modules/pocketpages-plugin-realtime": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/pocketpages-plugin-realtime/-/pocketpages-plugin-realtime-0.2.0.tgz", + "integrity": "sha512-NBFrHkmymZKXc1pgwJdimXSjMXLtYfv1dZp2OROYUmaZXX8fHiQpFrwEf8fQIDedokYpDNgC4KttXCR3M6luxg==" + }, + "node_modules/postgres-array": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", + "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/postgres-bytea": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz", + "integrity": "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postgres-date": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", + "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postgres-interval": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", + "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", + "license": "MIT", + "dependencies": { + "xtend": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pretty-bytes": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pretty-ms": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-7.0.1.tgz", + "integrity": "sha512-973driJZvxiGOQ5ONsFhOF/DtzPMOMtgC11kCpUrPGMTgqp2q/1gwzCquocrN33is0VZ5GFHXZYMM9l6h67v2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "parse-ms": "^2.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/restore-cursor": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", + "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", + "dev": true, + "license": "MIT", + "dependencies": { + "onetime": "^7.0.0", + "signal-exit": "^4.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, + "license": "MIT" + }, + "node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/split": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", + "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", + "dev": true, + "license": "MIT", + "dependencies": { + "through": "2" + }, + "engines": { + "node": "*" + } + }, + "node_modules/split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "license": "ISC", + "engines": { + "node": ">= 10.x" + } + }, + "node_modules/stdin-discarder": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.2.2.tgz", + "integrity": "sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/stream-combiner": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.2.2.tgz", + "integrity": "sha512-6yHMqgLYDzQDcAkL+tjJDC5nSNuNIx0vZtRZeiPh7Saef7VHX9H5Ijn9l2VIol2zaNYlYEX6KyuT/237A58qEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "duplexer": "~0.1.1", + "through": "~2.3.4" + } + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true, + "license": "MIT" + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD" + }, + "node_modules/tsx": { + "version": "4.20.6", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.20.6.tgz", + "integrity": "sha512-ytQKuwgmrrkDTFP4LjR0ToE2nqgy886GpvRSpU0JAnrdBYppuY5rLkRUYPU1yCryb24SsKBTL/hlDQAEFVwtZg==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "~0.25.0", + "get-tsconfig": "^4.7.5" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "license": "MIT", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yoctocolors-cjs": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.3.tgz", + "integrity": "sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/services/pocketbase/package.json b/services/pocketbase/package.json new file mode 100644 index 00000000..4a467d06 --- /dev/null +++ b/services/pocketbase/package.json @@ -0,0 +1,25 @@ +{ + "name": "futureporn", + "version": "3.0.3", + "private": true, + "description": "Dedication to the preservation of lewdtuber history", + "license": "Unlicense", + "scripts": { + "deploy": "phio deploy" + }, + "dependencies": { + "jsonwebtoken": "^9.0.2", + "pg": "^8.16.3", + "pocketpages": ">=0.22.3", + "pocketpages-plugin-auth": "^0.2.2", + "pocketpages-plugin-datastar": ">=0.2.0", + "pocketpages-plugin-micro-dash": "^0.1.0" + }, + "files": [ + "pb_hooks", + "*.md" + ], + "devDependencies": { + "phio": "^0.3.5" + } +} \ No newline at end of file diff --git a/services/pocketbase/pb_hooks/import.pb.js b/services/pocketbase/pb_hooks/import.pb.js new file mode 100644 index 00000000..f82f328b --- /dev/null +++ b/services/pocketbase/pb_hooks/import.pb.js @@ -0,0 +1,37 @@ +/// + +// @see https://github.com/pocketbase/pocketbase/discussions/6287 + +// NOTE: this script must be run from the project root +// ./pocketbase import /path/to/your/data.json YOUR_COLLECTION +$app.rootCmd.addCommand(new Command({ + use: "import", + run: (cmd, args) => { + const data = require(args[0]) + + const collection = $app.findCollectionByNameOrId(args[1]); + // console.log(`data`, data, 'collection', collection); + + $app.runInTransaction((txApp) => { + let record; + for (let item of data) { + // check https://pocketbase.io/docs/js-records/ + record = new Record(collection) + + // bulk set the item field values + // + // note: if you want to set predefined values for "autodate" type fields + // you'll need to manually load them with record.setRaw("created", val) + record.load(item) + + // call txApp.saveNoValidate for better performance + // but be aware that the fields validators will be skipped and could result in data integrity issues + // if you haven't checked and verified the imported data beforehand + txApp.save(record) + } + }) + }, +})) + + + diff --git a/services/pocketbase/pb_hooks/pages/(site)/+layout.ejs b/services/pocketbase/pb_hooks/pages/(site)/+layout.ejs new file mode 100644 index 00000000..83cdbe64 --- /dev/null +++ b/services/pocketbase/pb_hooks/pages/(site)/+layout.ejs @@ -0,0 +1,80 @@ + + + + + + + + <%=meta('title') || '~~~~~' %> + + + + + + + + + + + + + + + <%- slots.head %> <%- datastar.scripts({realtime: true}) %> + + + +
+
+
+
+ + + +
+ + +
+ + + <%- slots.body || slot%> +
+
+
+ + + +
+
+

+ Futureporn <%= data.version %> made with love by @CJ_Clippy. +

+
+
+ +
+ + + \ No newline at end of file diff --git a/services/pocketbase/pb_hooks/pages/(site)/+middleware.js b/services/pocketbase/pb_hooks/pages/(site)/+middleware.js new file mode 100644 index 00000000..a47fc53d --- /dev/null +++ b/services/pocketbase/pb_hooks/pages/(site)/+middleware.js @@ -0,0 +1,31 @@ +/** @type {import('pocketpages').PageDataLoaderFunc} */ +module.exports = function ({ meta, redirect, request, auth }) { + meta('title', 'Futureporn.net') + meta('description', 'Dedication to the preservation of Lewdtuber history') + meta('image', 'https://example.com/about-preview.jpg') + + const cookies = request.cookies() + // console.log('cookies as follows') + // console.log(JSON.stringify(cookies)) + // console.log('auth as follows') + // console.log(auth) + + let user; + + if (auth) { + console.log('request.auth is present id:', auth.get('id')) + user = $app.findFirstRecordByData('users', 'id', auth.id); + } + + return { user, version: require(`../../../package.json`).version } +} + +// module.exports = (api, next) => { +// const { auth, redirect } = api +// if (!auth) { +// return redirect('/auth/login', { +// message: 'You must be logged in to access this page', +// }) +// } +// next() +// } diff --git a/services/pocketbase/pb_hooks/pages/(site)/account/+middleware.js b/services/pocketbase/pb_hooks/pages/(site)/account/+middleware.js new file mode 100644 index 00000000..b2c64296 --- /dev/null +++ b/services/pocketbase/pb_hooks/pages/(site)/account/+middleware.js @@ -0,0 +1,9 @@ +module.exports = (api, next) => { + const { auth, redirect } = api + if (!auth) { + return redirect('/auth/login', { + message: 'You must be logged in to access this page', + }) + } + next() +} diff --git a/services/pocketbase/pb_hooks/pages/(site)/account/index.ejs b/services/pocketbase/pb_hooks/pages/(site)/account/index.ejs new file mode 100644 index 00000000..76581c37 --- /dev/null +++ b/services/pocketbase/pb_hooks/pages/(site)/account/index.ejs @@ -0,0 +1,36 @@ +

Account Overview

+

Welcome back, <%= auth.get('name') %>.

+ +

Patreon Information

+ +
+ Please note: Patron status updates may take up to one minute to synchronize. +
+ +

+ Role: + <% if (auth.get('patron')) { %> + Patron + <% } else { %> + Not a Patron + Become a Patron + <% } %> +

+ +

Patreon ID: <%= auth.get('patreonId') %>

+ + +
+

Account Settings

+ + + +
+ + + +
\ No newline at end of file diff --git a/services/pocketbase/pb_hooks/pages/(site)/auth/_private/oauth2.ejs b/services/pocketbase/pb_hooks/pages/(site)/auth/_private/oauth2.ejs new file mode 100644 index 00000000..45fa4e5d --- /dev/null +++ b/services/pocketbase/pb_hooks/pages/(site)/auth/_private/oauth2.ejs @@ -0,0 +1,30 @@ + + + +<% if (error) { %> +<%= error %> +<% } %> + +<% if (!methods.oauth2.enabled) { %> +OAuth2 login is disabled. See README.md for details. +<% } else {%> +<% providers.forEach(provider => { %> +
+ + +
+<% }) %> +<% if (providers.length === 0) { %> +No OAuth2 providers enabled. See README.md for details. +<% } %> +<% } %> \ No newline at end of file diff --git a/services/pocketbase/pb_hooks/pages/(site)/auth/login/index.ejs b/services/pocketbase/pb_hooks/pages/(site)/auth/login/index.ejs new file mode 100644 index 00000000..fae378c0 --- /dev/null +++ b/services/pocketbase/pb_hooks/pages/(site)/auth/login/index.ejs @@ -0,0 +1,8 @@ +

Login

+ +

Log in to Futureporn using a Patreon account.

+

Logging in provides access to your patron perks.

+

To become a patron, visit CJ_Clippy on Patreon.

+ +
+<%- include('oauth2.ejs') %> \ No newline at end of file diff --git a/services/pocketbase/pb_hooks/pages/(site)/auth/logout/index.ejs b/services/pocketbase/pb_hooks/pages/(site)/auth/logout/index.ejs new file mode 100644 index 00000000..382563ed --- /dev/null +++ b/services/pocketbase/pb_hooks/pages/(site)/auth/logout/index.ejs @@ -0,0 +1,4 @@ + \ No newline at end of file diff --git a/services/pocketbase/pb_hooks/pages/(site)/auth/oauth/confirm.ejs b/services/pocketbase/pb_hooks/pages/(site)/auth/oauth/confirm.ejs new file mode 100644 index 00000000..8fd06eef --- /dev/null +++ b/services/pocketbase/pb_hooks/pages/(site)/auth/oauth/confirm.ejs @@ -0,0 +1,67 @@ + +<% if (error) { %> + + <%=error%> + +<% } %> \ No newline at end of file diff --git a/services/pocketbase/pb_hooks/pages/(site)/auth/oauth/login.ejs b/services/pocketbase/pb_hooks/pages/(site)/auth/oauth/login.ejs new file mode 100644 index 00000000..510756b3 --- /dev/null +++ b/services/pocketbase/pb_hooks/pages/(site)/auth/oauth/login.ejs @@ -0,0 +1,23 @@ + +<% if (error) { %> +

we got an err

+ + <%=error%> + +<% } %> \ No newline at end of file diff --git a/services/pocketbase/pb_hooks/pages/(site)/humans.txt b/services/pocketbase/pb_hooks/pages/(site)/humans.txt new file mode 100644 index 00000000..8e3ad469 --- /dev/null +++ b/services/pocketbase/pb_hooks/pages/(site)/humans.txt @@ -0,0 +1,10 @@ +Hello humans + +futureporn.net +future.porn + +R18. For adults only. + +Dedication to the preservation of VTuber history + +made with love by CJ_Clippy cj@futureporn.net \ No newline at end of file diff --git a/services/pocketbase/pb_hooks/pages/(site)/index.ejs b/services/pocketbase/pb_hooks/pages/(site)/index.ejs new file mode 100644 index 00000000..ab019830 --- /dev/null +++ b/services/pocketbase/pb_hooks/pages/(site)/index.ejs @@ -0,0 +1,23 @@ +<% if (!data?.user?.get('patron')) { %> +
+ Thank you for your support on Patreon! +
+<% } %> + + \ No newline at end of file diff --git a/services/pocketbase/pb_hooks/pages/(site)/patrons/index.ejs b/services/pocketbase/pb_hooks/pages/(site)/patrons/index.ejs new file mode 100644 index 00000000..f289944d --- /dev/null +++ b/services/pocketbase/pb_hooks/pages/(site)/patrons/index.ejs @@ -0,0 +1,64 @@ +

+ + \ No newline at end of file diff --git a/services/pocketbase/pb_hooks/pages/(site)/robots.txt b/services/pocketbase/pb_hooks/pages/(site)/robots.txt new file mode 100644 index 00000000..a6412db4 --- /dev/null +++ b/services/pocketbase/pb_hooks/pages/(site)/robots.txt @@ -0,0 +1,10 @@ +# robots.txt for futureporn.net + +# Block all web crawlers from accessing admin and private areas +User-agent: * +Disallow: /_/ +Disallow: /auth/ +Disallow: /api/ + +# Allow crawlers to access public content +Allow: / \ No newline at end of file diff --git a/services/pocketbase/pb_hooks/pages/(site)/vods/+load.js b/services/pocketbase/pb_hooks/pages/(site)/vods/+load.js new file mode 100644 index 00000000..61079c93 --- /dev/null +++ b/services/pocketbase/pb_hooks/pages/(site)/vods/+load.js @@ -0,0 +1,48 @@ +// +load.js + +/** @type {import('pocketpages').PageDataLoaderFunc} */ +module.exports = function (api) { + const { request, response } = api; + + try { + // Read query params with PocketPages + const query = request.url.query || {}; + const page = parseInt(query.page) || 1; + const limit = parseInt(query.limit) || 200; + const offset = (page - 1) * limit; + + // Fetch all VODs, sorted by -streamDate + const allVods = $app.findRecordsByFilter('vods', null, '-streamDate'); + + // Slice according to pagination + const vods = allVods.slice(offset, offset + limit); + + // Expand related vtubers + $app.expandRecords(vods, ['vtubers'], null); + + // Pagination metadata + const total = allVods.length; + const totalPages = Math.ceil(total / limit); + + return { + vods, + pagination: { + page, + limit, + total, + totalPages, + hasNext: page < totalPages, + hasPrev: page > 1, + }, + }; + + } catch (e) { + console.error('Error fetching VODs:', e.message); + + if (e.message.match(/no rows/)) { + return response.html(404, 'VODs not found'); + } else { + return response.html(500, 'Unknown internal error while fetching VODs'); + } + } +}; diff --git a/services/pocketbase/pb_hooks/pages/(site)/vods/[id]/+load.js b/services/pocketbase/pb_hooks/pages/(site)/vods/[id]/+load.js new file mode 100644 index 00000000..6393c653 --- /dev/null +++ b/services/pocketbase/pb_hooks/pages/(site)/vods/[id]/+load.js @@ -0,0 +1,26 @@ +// +load.js + +/** @type {import('pocketpages').PageDataLoaderFunc} */ +module.exports = function (api) { + const { params, response } = api; + try { + const vod = $app.findFirstRecordByData('vods', 'id', params.id); + $app.expandRecord(vod, ["vtubers"], null); + + + return { vod }; + } catch (e) { + console.error('error!', e.message); + + if (e.message.match(/no rows/)) { + console.log('we are sending 404') + return response.html(404, 'VOD not found') + + } else { + console.log('we are sending error 500') + return response.html(500, 'Unknown internal error while fetching vod') + + } + } +}; + diff --git a/services/pocketbase/pb_hooks/pages/(site)/vods/[id]/index.ejs b/services/pocketbase/pb_hooks/pages/(site)/vods/[id]/index.ejs new file mode 100644 index 00000000..0036fdc1 --- /dev/null +++ b/services/pocketbase/pb_hooks/pages/(site)/vods/[id]/index.ejs @@ -0,0 +1,72 @@ +
data-signals="{'selected':'cdn1'}" <% } else { %> data-signals="{'selected':'cdn2'}" <% } %>> + + +
+ +
+ + + <% if (data?.user?.get('patron')) { %> +
+ + +
+ <% } %> + +
+ + + + + +
+

VOD ID: <%= data.vod?.id ?? 'N/A' %>

+ +

+ VTubers: + <% const vtubers = data.vod?.get('expand')?.vtubers ?? []; %> + <% vtubers.forEach((vtuber, index) => { %> + <% if (vtuber) { %> + + <%= vtuber.get('displayName') ?? 'Unknown VTuber' %> + <%= index < vtubers.length - 1 ? ', ' : '' %> + <% } %> + <% }) %> + <% if (vtubers.length === 0) { %>None<% } %> +

+ +

Stream Date: <%= data.vod?.get('streamDate') ?? 'Unknown date' %>

+ + <% if (data.vod?.get('announceUrl')) { %> +

+ Announce URL: + <%= data.vod?.get('announceUrl') %> +

+ <% } %> + + <% if (data.vod?.get('ipfsCid')) { %> +

IPFS CID: <%= data.vod?.get('ipfsCid') %>

+ <% } %> + + <% if (data.vod?.get('notes')) { %> +

Notes:

+
<%= data.vod?.get('notes') %>
+ <% } %> +
+ +
\ No newline at end of file diff --git a/services/pocketbase/pb_hooks/pages/(site)/vods/feed.xml/+load.js b/services/pocketbase/pb_hooks/pages/(site)/vods/feed.xml/+load.js new file mode 100644 index 00000000..df7ab191 --- /dev/null +++ b/services/pocketbase/pb_hooks/pages/(site)/vods/feed.xml/+load.js @@ -0,0 +1,26 @@ +// +load.js + +/** @type {import('pocketpages').PageDataLoaderFunc} */ +module.exports = function (api) { + const { params, response } = api; + try { + const vods = $app.findRecordsByFilter('vods', null, '-streamDate'); + $app.expandRecords(vods, ["vtubers"], null); + // vods.expandedAll("vtubers"); + return { vods }; + + } catch (e) { + console.error('error!', e.message); + + if (e.message.match(/no rows/)) { + console.log('we are sending 404') + return response.html(404, 'VODs not found') + + } else { + console.log('we are sending error 500') + return response.html(500, 'Unknown internal error while fetching vods') + + } + } +}; + diff --git a/services/pocketbase/pb_hooks/pages/(site)/vods/feed.xml/index.ejs b/services/pocketbase/pb_hooks/pages/(site)/vods/feed.xml/index.ejs new file mode 100644 index 00000000..e8f62531 --- /dev/null +++ b/services/pocketbase/pb_hooks/pages/(site)/vods/feed.xml/index.ejs @@ -0,0 +1,50 @@ +<%# +index.ejs — Atom Feed Generator (Atom 1.0) +Expects: data.vods = [{ id, title, summary, streamDate }] +%> + +<% +const siteBase = "https://futureporn.net"; +const feedSelf = `${siteBase}/vods/feed.xml`; +const updated = new Date().toISOString(); +response.header('Content-Type', 'application/atom+xml') +%> + + + <%= siteBase %> + Futureporn.net + <%= updated %> + + + + CJ_Clippy + cj@futureporn.net + <%= siteBase %> + + + + + + <%= meta('description') %> + <%= siteBase %>/images/futureporn-icon.png + <%= siteBase %>/favicon.ico + + <% for (const vod of data.vods) { %> + <% + const url = `${siteBase}/vods/${vod.id}`; + %> + + + <![CDATA[ <%= vod.title %> ]]> + + <%= url %> + + <%= new Date(vod.updated) %> + <% if (vod.notes) { %> + + ]]> + + <% } %> + + <% } %> + \ No newline at end of file diff --git a/services/pocketbase/pb_hooks/pages/(site)/vods/index.ejs b/services/pocketbase/pb_hooks/pages/(site)/vods/index.ejs new file mode 100644 index 00000000..69d926b9 --- /dev/null +++ b/services/pocketbase/pb_hooks/pages/(site)/vods/index.ejs @@ -0,0 +1,72 @@ +

VODs

+ +<% if (Array.isArray(data.vods) && data.vods.length > 0) { %> +
+ + + + + + + + + <% for (const vod of data.vods) { %> + + + + + <% } %> + +
Stream DateVTubers
+ + <%= vod?.get ? vod.get('streamDate') : vod?.streamDate ?? 'Unknown date' %> + + + <% const vtubers = vod?.get ? vod.get('expand')?.vtubers ?? [] : vod?.vtubers ?? []; %> + <% if (vtubers.length > 0) { %> + <% for (let i = 0; i < vtubers.length; i++) { %> + <%= vtubers[i]?.get ? vtubers[i].get('displayName') : vtubers[i]?.displayName ?? 'Unknown' %> + <%= i < vtubers.length - 1 ? ', ' : '' %> + <% } %> + <% } else { %> + None + <% } %> +
+
+ + +<% if (data.pagination && data.pagination.totalPages > 1) { %> + +<% } %> + +<% } else { %> +

No VODs available.

+<% } %> \ No newline at end of file diff --git a/services/pocketbase/pb_hooks/pages/(site)/vt/[slug]/+load.js b/services/pocketbase/pb_hooks/pages/(site)/vt/[slug]/+load.js new file mode 100644 index 00000000..3194a602 --- /dev/null +++ b/services/pocketbase/pb_hooks/pages/(site)/vt/[slug]/+load.js @@ -0,0 +1,25 @@ +// +load.js + +/** @type {import('pocketpages').PageDataLoaderFunc} */ +module.exports = function (api) { + const { params, response } = api; + try { + const vtuber = $app.findFirstRecordByData('vtubers', 'slug', params.slug); + $app.expandRecord(vtuber, ["vods"], null); + // console.log(JSON.stringify(vtuber)) + return { vtuber }; + } catch (e) { + console.error('error!', e.message); + + if (e.message.match(/no rows/)) { + console.log('we are sending 404') + return response.html(404, 'VTuber not found') + + } else { + console.log('we are sending error 500') + return response.html(500, 'Unknown internal error while fetching vtuber') + + } + } +}; + diff --git a/services/pocketbase/pb_hooks/pages/(site)/vt/[slug]/index.ejs b/services/pocketbase/pb_hooks/pages/(site)/vt/[slug]/index.ejs new file mode 100644 index 00000000..528f17d0 --- /dev/null +++ b/services/pocketbase/pb_hooks/pages/(site)/vt/[slug]/index.ejs @@ -0,0 +1,3 @@ +<% if (data.vtuber) { %> +<%- include('vtuber.ejs', { vtuber: data.vtuber }) %> +<% } %> \ No newline at end of file diff --git a/services/pocketbase/pb_hooks/pages/(site)/vt/index.ejs b/services/pocketbase/pb_hooks/pages/(site)/vt/index.ejs new file mode 100644 index 00000000..47ab9cc3 --- /dev/null +++ b/services/pocketbase/pb_hooks/pages/(site)/vt/index.ejs @@ -0,0 +1,8 @@ + + + +

Vtubers

+<%- include('vtuber-list.ejs', { vtubers }) %> \ No newline at end of file diff --git a/services/pocketbase/pb_hooks/pages/+config.js b/services/pocketbase/pb_hooks/pages/+config.js new file mode 100644 index 00000000..31e23060 --- /dev/null +++ b/services/pocketbase/pb_hooks/pages/+config.js @@ -0,0 +1,14 @@ + + +module.exports = { + debug: false, + plugins: [ + 'pocketpages-plugin-ejs', + 'pocketpages-plugin-datastar', + 'pocketpages-plugin-realtime', + 'pocketpages-plugin-auth', + 'pocketpages-plugin-js-sdk', + 'pocketpages-plugin-micro-dash', + '../../../src/plugins/patreon' + ], +} diff --git a/services/pocketbase/pb_hooks/pages/_private/vtuber-list.ejs b/services/pocketbase/pb_hooks/pages/_private/vtuber-list.ejs new file mode 100644 index 00000000..4c078495 --- /dev/null +++ b/services/pocketbase/pb_hooks/pages/_private/vtuber-list.ejs @@ -0,0 +1,11 @@ +
+ <% for (const vtuber of vtubers) { %> +
+ + + <%= vtuber.get('displayName') %> + + +
+ <% } %> +
\ No newline at end of file diff --git a/services/pocketbase/pb_hooks/pages/_private/vtuber.ejs b/services/pocketbase/pb_hooks/pages/_private/vtuber.ejs new file mode 100644 index 00000000..76a9ec50 --- /dev/null +++ b/services/pocketbase/pb_hooks/pages/_private/vtuber.ejs @@ -0,0 +1,62 @@ +
+
+ + +
+ <%= data.vtuber?.get?.('displayName') || 'VTuber' %> +
+ + + + <%= data.vtuber?.displayName || data.vtuber?.get?.('displayName') || 'Unknown VTuber' %> + + + + + +
+

VODs

+ + <% + const vods = data.vtuber.get('expand')?.vods || []; + if (vods.length > 0) { + %> + + <% } else { %> +

No VODs available for this VTuber.

+ <% } %> +
+ + +
+
\ No newline at end of file diff --git a/services/pocketbase/pb_hooks/pages/api/service.json/index.ejs b/services/pocketbase/pb_hooks/pages/api/service.json/index.ejs new file mode 100644 index 00000000..53965d33 --- /dev/null +++ b/services/pocketbase/pb_hooks/pages/api/service.json/index.ejs @@ -0,0 +1,6 @@ +<% +response.header("Content-Type", +"application/json"); +response.html(410, +""); +%> \ No newline at end of file diff --git a/services/pocketbase/pb_hooks/pages/api/user/settings/index.ejs b/services/pocketbase/pb_hooks/pages/api/user/settings/index.ejs new file mode 100644 index 00000000..54a4aa05 --- /dev/null +++ b/services/pocketbase/pb_hooks/pages/api/user/settings/index.ejs @@ -0,0 +1,41 @@ + \ No newline at end of file diff --git a/services/pocketbase/pb_hooks/pages/api/v1.json/index.ejs b/services/pocketbase/pb_hooks/pages/api/v1.json/index.ejs new file mode 100644 index 00000000..53965d33 --- /dev/null +++ b/services/pocketbase/pb_hooks/pages/api/v1.json/index.ejs @@ -0,0 +1,6 @@ +<% +response.header("Content-Type", +"application/json"); +response.html(410, +""); +%> \ No newline at end of file diff --git a/services/pocketbase/pb_hooks/pages/feed/feed.json/index.ejs b/services/pocketbase/pb_hooks/pages/feed/feed.json/index.ejs new file mode 100644 index 00000000..bf8aaf49 --- /dev/null +++ b/services/pocketbase/pb_hooks/pages/feed/feed.json/index.ejs @@ -0,0 +1 @@ +<% response.redirect('/vods/feed.json', 301) %> \ No newline at end of file diff --git a/services/pocketbase/pb_hooks/pages/feed/feed.xml/index.ejs b/services/pocketbase/pb_hooks/pages/feed/feed.xml/index.ejs new file mode 100644 index 00000000..a5848bba --- /dev/null +++ b/services/pocketbase/pb_hooks/pages/feed/feed.xml/index.ejs @@ -0,0 +1 @@ +<% response.redirect('/vods/feed.xml', 301) %> \ No newline at end of file diff --git a/services/pocketbase/pb_hooks/pages/feed/rss.xml/index.ejs b/services/pocketbase/pb_hooks/pages/feed/rss.xml/index.ejs new file mode 100644 index 00000000..b485d254 --- /dev/null +++ b/services/pocketbase/pb_hooks/pages/feed/rss.xml/index.ejs @@ -0,0 +1 @@ +<% response.redirect('/vods/rss.xml', 301) %> \ No newline at end of file diff --git a/services/pocketbase/pb_hooks/pages/vods/feed.json/+load.js b/services/pocketbase/pb_hooks/pages/vods/feed.json/+load.js new file mode 100644 index 00000000..df7ab191 --- /dev/null +++ b/services/pocketbase/pb_hooks/pages/vods/feed.json/+load.js @@ -0,0 +1,26 @@ +// +load.js + +/** @type {import('pocketpages').PageDataLoaderFunc} */ +module.exports = function (api) { + const { params, response } = api; + try { + const vods = $app.findRecordsByFilter('vods', null, '-streamDate'); + $app.expandRecords(vods, ["vtubers"], null); + // vods.expandedAll("vtubers"); + return { vods }; + + } catch (e) { + console.error('error!', e.message); + + if (e.message.match(/no rows/)) { + console.log('we are sending 404') + return response.html(404, 'VODs not found') + + } else { + console.log('we are sending error 500') + return response.html(500, 'Unknown internal error while fetching vods') + + } + } +}; + diff --git a/services/pocketbase/pb_hooks/pages/vods/feed.json/index.ejs b/services/pocketbase/pb_hooks/pages/vods/feed.json/index.ejs new file mode 100644 index 00000000..c0d7efaf --- /dev/null +++ b/services/pocketbase/pb_hooks/pages/vods/feed.json/index.ejs @@ -0,0 +1,29 @@ +<%# +/** + * index.ejs - Generates a JSON feed + * Expects: data.vods = [{ id, title, url, description, publishedAt, ... }] + */ +%> + +<% +const feed = { + version: "https://jsonfeed.org/version/1", + title: `${meta('title')} VODs`, + home_page_url: "https://futureporn.net", + feed_url: "https://futureporn.net/vods/feed.json", + description: meta('description'), + icon: "https://futureporn.net/images/futureporn-icon.png", + author: { + name: "CJ_Clippy", + url: "https://futureporn.net" + }, + items: data.vods.map(vod => ({ + content_html: "", + url: `https://futureporn.net/vods/${vod.id}`, + title: vod.title, + summary: vod.notes || vod.title, + image: vod.thumbnail, + date_modified: vod.updated + })) +}; +%><%- JSON.stringify(feed, null, 2) %> \ No newline at end of file diff --git a/services/pocketbase/pb_hooks/pages/vods/feed.xml/+load.js b/services/pocketbase/pb_hooks/pages/vods/feed.xml/+load.js new file mode 100644 index 00000000..bb00f2d2 --- /dev/null +++ b/services/pocketbase/pb_hooks/pages/vods/feed.xml/+load.js @@ -0,0 +1,28 @@ +// +load.js + +/** @type {import('pocketpages').PageDataLoaderFunc} */ +module.exports = function (api) { + const { params, response } = api; + try { + const vods = $app.findRecordsByFilter('vods', null, '-streamDate', 99); + $app.expandRecords(vods, ["vtubers"], null); + + + console.log(JSON.stringify(vods, null, 2)) + return { vods }; + + } catch (e) { + console.error('error!', e.message); + + if (e.message.match(/no rows/)) { + console.log('we are sending 404') + return response.html(404, 'VODs not found') + + } else { + console.log('we are sending error 500') + return response.html(500, 'Unknown internal error while fetching vods') + + } + } +}; + diff --git a/services/pocketbase/pb_hooks/pages/vods/feed.xml/index.ejs b/services/pocketbase/pb_hooks/pages/vods/feed.xml/index.ejs new file mode 100644 index 00000000..cad16f2e --- /dev/null +++ b/services/pocketbase/pb_hooks/pages/vods/feed.xml/index.ejs @@ -0,0 +1,58 @@ +<%# +index.ejs — ATOM Feed Generator +Expects: data.vods = [{ id, title, notes, thumbnail, streamDate }] +%> + +<%= +response.header("Content-Type", "application/atom+xml"); + +// Build Atom XML as a string +let atom = ` + + Futureporn.net + +${new Date().toISOString()} +<%= env('ORIGIN') %> + + CJ_Clippy + cj@futureporn.net +`; + +for (const vod of data.vods) { +const url = `${env('ORIGIN')}/vods/${vod.id}`; +const entryTitle = ((vod?.get('expand')?.vtubers?.map(vt => vt.get('displayName')) || []) +.join(', ') || vod.get('streamDate')); + +atom += ` + + + <![CDATA[${entryTitle}]]> + + + ${url} + ${vod.get('streamDate')}`; + + if (vod.get('notes')) { + atom += ` + + + `; + } + + if (vod.get('thumbnail')) { + atom += ` + + ]]> + `; + } + + atom += ` +`; +} + +atom += ` +`; + +// Send the Atom feed +response.html(200, '

HELLO

'); +%> \ No newline at end of file diff --git a/services/pocketbase/pb_hooks/pages/vods/rss.xml/+load.js b/services/pocketbase/pb_hooks/pages/vods/rss.xml/+load.js new file mode 100644 index 00000000..bb00f2d2 --- /dev/null +++ b/services/pocketbase/pb_hooks/pages/vods/rss.xml/+load.js @@ -0,0 +1,28 @@ +// +load.js + +/** @type {import('pocketpages').PageDataLoaderFunc} */ +module.exports = function (api) { + const { params, response } = api; + try { + const vods = $app.findRecordsByFilter('vods', null, '-streamDate', 99); + $app.expandRecords(vods, ["vtubers"], null); + + + console.log(JSON.stringify(vods, null, 2)) + return { vods }; + + } catch (e) { + console.error('error!', e.message); + + if (e.message.match(/no rows/)) { + console.log('we are sending 404') + return response.html(404, 'VODs not found') + + } else { + console.log('we are sending error 500') + return response.html(500, 'Unknown internal error while fetching vods') + + } + } +}; + diff --git a/services/pocketbase/pb_hooks/pages/vods/rss.xml/index.ejs b/services/pocketbase/pb_hooks/pages/vods/rss.xml/index.ejs new file mode 100644 index 00000000..6481c0a1 --- /dev/null +++ b/services/pocketbase/pb_hooks/pages/vods/rss.xml/index.ejs @@ -0,0 +1,56 @@ +<%# +index.ejs — RSS Feed Generator (RSS 2.0) +Expects: data.vods = [{ id, title, notes, thumbnail, streamDate }] +%> + +<% +response.header("Content-Type", "application/rss+xml") + +// Build RSS XML as a string +let rss = ` + + + Futureporn.net + https://futureporn.net + Dedication to the preservaton of lewdtuber history + ${new Date().toUTCString()} + https://validator.w3.org/feed/docs/rss2.html + + en + + Futureporn.net + https://futureporn.net/images/futureporn-icon.png + https://futureporn.net + `; + +for (const vod of data.vods) { + const url = `${env('ORIGIN')}/vods/${vod.id}`; + rss += ` + + + <![CDATA[${ + ((vod?.get('expand')?.vtubers?.map(vt => vt.get('displayName')) || []).join(', ') + || vod.get('streamDate')) + }]]> + ${url} + ${url} + ${vod.get('streamDate')}`; + if (vod.notes) { + rss += ` + `; + } + if (vod.thumbnail) { + rss += ` + `; + } + rss += ` + `; +} + +rss += ` + +`; + +// Send the RSS +response.html(200, rss); +%> \ No newline at end of file diff --git a/services/pocketbase/pb_hooks/pocketpages.pb.js b/services/pocketbase/pb_hooks/pocketpages.pb.js new file mode 100644 index 00000000..3940e737 --- /dev/null +++ b/services/pocketbase/pb_hooks/pocketpages.pb.js @@ -0,0 +1 @@ +require('pocketpages') diff --git a/services/pocketbase/pb_migrations/1761803155_created_vod.js b/services/pocketbase/pb_migrations/1761803155_created_vod.js new file mode 100644 index 00000000..73a41a44 --- /dev/null +++ b/services/pocketbase/pb_migrations/1761803155_created_vod.js @@ -0,0 +1,79 @@ +/// +migrate((app) => { + const collection = new Collection({ + "createRule": null, + "deleteRule": null, + "fields": [ + { + "autogeneratePattern": "[a-z0-9]{15}", + "hidden": false, + "id": "text3208210256", + "max": 15, + "min": 15, + "name": "id", + "pattern": "^[a-z0-9]+$", + "presentable": false, + "primaryKey": true, + "required": true, + "system": true, + "type": "text" + }, + { + "hidden": false, + "id": "date3986823616", + "max": "", + "min": "", + "name": "streamDate", + "presentable": false, + "required": false, + "system": false, + "type": "date" + }, + { + "exceptDomains": null, + "hidden": false, + "id": "url3307693472", + "name": "announceUrl", + "onlyDomains": null, + "presentable": false, + "required": false, + "system": false, + "type": "url" + }, + { + "hidden": false, + "id": "autodate2990389176", + "name": "created", + "onCreate": true, + "onUpdate": false, + "presentable": false, + "system": false, + "type": "autodate" + }, + { + "hidden": false, + "id": "autodate3332085495", + "name": "updated", + "onCreate": true, + "onUpdate": true, + "presentable": false, + "system": false, + "type": "autodate" + } + ], + "id": "pbc_144770472", + "indexes": [], + "listRule": null, + "name": "vod", + "system": false, + "type": "base", + "updateRule": null, + "viewRule": null + }); + + return app.save(collection); +}, (app) => { + const collection = app.findCollectionByNameOrId("pbc_144770472"); + + return app.delete(collection); +}) diff --git a/services/pocketbase/pb_migrations/1761803182_created_vtuber.js b/services/pocketbase/pb_migrations/1761803182_created_vtuber.js new file mode 100644 index 00000000..7fc957f0 --- /dev/null +++ b/services/pocketbase/pb_migrations/1761803182_created_vtuber.js @@ -0,0 +1,57 @@ +/// +migrate((app) => { + const collection = new Collection({ + "createRule": null, + "deleteRule": null, + "fields": [ + { + "autogeneratePattern": "[a-z0-9]{15}", + "hidden": false, + "id": "text3208210256", + "max": 15, + "min": 15, + "name": "id", + "pattern": "^[a-z0-9]+$", + "presentable": false, + "primaryKey": true, + "required": true, + "system": true, + "type": "text" + }, + { + "hidden": false, + "id": "autodate2990389176", + "name": "created", + "onCreate": true, + "onUpdate": false, + "presentable": false, + "system": false, + "type": "autodate" + }, + { + "hidden": false, + "id": "autodate3332085495", + "name": "updated", + "onCreate": true, + "onUpdate": true, + "presentable": false, + "system": false, + "type": "autodate" + } + ], + "id": "pbc_3872109612", + "indexes": [], + "listRule": null, + "name": "vtuber", + "system": false, + "type": "base", + "updateRule": null, + "viewRule": null + }); + + return app.save(collection); +}, (app) => { + const collection = app.findCollectionByNameOrId("pbc_3872109612"); + + return app.delete(collection); +}) diff --git a/services/pocketbase/pb_migrations/1761803237_updated_vtuber.js b/services/pocketbase/pb_migrations/1761803237_updated_vtuber.js new file mode 100644 index 00000000..27c6d7af --- /dev/null +++ b/services/pocketbase/pb_migrations/1761803237_updated_vtuber.js @@ -0,0 +1,48 @@ +/// +migrate((app) => { + const collection = app.findCollectionByNameOrId("pbc_3872109612") + + // add field + collection.fields.addAt(1, new Field({ + "autogeneratePattern": "", + "hidden": false, + "id": "text1731158936", + "max": 0, + "min": 0, + "name": "displayName", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + })) + + // add field + collection.fields.addAt(2, new Field({ + "autogeneratePattern": "", + "hidden": false, + "id": "text2560465762", + "max": 0, + "min": 0, + "name": "slug", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + })) + + return app.save(collection) +}, (app) => { + const collection = app.findCollectionByNameOrId("pbc_3872109612") + + // remove field + collection.fields.removeById("text1731158936") + + // remove field + collection.fields.removeById("text2560465762") + + return app.save(collection) +}) diff --git a/services/pocketbase/pb_migrations/1761818023_updated_vtuber.js b/services/pocketbase/pb_migrations/1761818023_updated_vtuber.js new file mode 100644 index 00000000..5c46b205 --- /dev/null +++ b/services/pocketbase/pb_migrations/1761818023_updated_vtuber.js @@ -0,0 +1,352 @@ +/// +migrate((app) => { + const collection = app.findCollectionByNameOrId("pbc_3872109612") + + // add field + collection.fields.addAt(3, new Field({ + "cascadeDelete": false, + "collectionId": "pbc_144770472", + "hidden": false, + "id": "relation3825607268", + "maxSelect": 999, + "minSelect": 0, + "name": "vods", + "presentable": false, + "required": false, + "system": false, + "type": "relation" + })) + + // add field + collection.fields.addAt(4, new Field({ + "hidden": false, + "id": "file3309110367", + "maxSelect": 1, + "maxSize": 0, + "mimeTypes": [], + "name": "image", + "presentable": false, + "protected": false, + "required": false, + "system": false, + "thumbs": [], + "type": "file" + })) + + // add field + collection.fields.addAt(5, new Field({ + "exceptDomains": null, + "hidden": false, + "id": "url1288386755", + "name": "chaturbate", + "onlyDomains": null, + "presentable": false, + "required": false, + "system": false, + "type": "url" + })) + + // add field + collection.fields.addAt(6, new Field({ + "exceptDomains": null, + "hidden": false, + "id": "url376077238", + "name": "twitter", + "onlyDomains": null, + "presentable": false, + "required": false, + "system": false, + "type": "url" + })) + + // add field + collection.fields.addAt(7, new Field({ + "exceptDomains": null, + "hidden": false, + "id": "url2042351438", + "name": "patreon", + "onlyDomains": null, + "presentable": false, + "required": false, + "system": false, + "type": "url" + })) + + // add field + collection.fields.addAt(8, new Field({ + "exceptDomains": null, + "hidden": false, + "id": "url1928100768", + "name": "twitch", + "onlyDomains": null, + "presentable": false, + "required": false, + "system": false, + "type": "url" + })) + + // add field + collection.fields.addAt(9, new Field({ + "exceptDomains": null, + "hidden": false, + "id": "url847873150", + "name": "tiktok", + "onlyDomains": null, + "presentable": false, + "required": false, + "system": false, + "type": "url" + })) + + // add field + collection.fields.addAt(10, new Field({ + "exceptDomains": null, + "hidden": false, + "id": "url1505654846", + "name": "onlyfans", + "onlyDomains": null, + "presentable": false, + "required": false, + "system": false, + "type": "url" + })) + + // add field + collection.fields.addAt(11, new Field({ + "exceptDomains": null, + "hidden": false, + "id": "url4034435380", + "name": "youtube", + "onlyDomains": null, + "presentable": false, + "required": false, + "system": false, + "type": "url" + })) + + // add field + collection.fields.addAt(12, new Field({ + "exceptDomains": null, + "hidden": false, + "id": "url3056519709", + "name": "linktree", + "onlyDomains": null, + "presentable": false, + "required": false, + "system": false, + "type": "url" + })) + + // add field + collection.fields.addAt(13, new Field({ + "exceptDomains": null, + "hidden": false, + "id": "url2609473773", + "name": "carrd", + "onlyDomains": null, + "presentable": false, + "required": false, + "system": false, + "type": "url" + })) + + // add field + collection.fields.addAt(14, new Field({ + "exceptDomains": null, + "hidden": false, + "id": "url2799872019", + "name": "fansly", + "onlyDomains": null, + "presentable": false, + "required": false, + "system": false, + "type": "url" + })) + + // add field + collection.fields.addAt(15, new Field({ + "exceptDomains": null, + "hidden": false, + "id": "url1736283674", + "name": "pornhub", + "onlyDomains": null, + "presentable": false, + "required": false, + "system": false, + "type": "url" + })) + + // add field + collection.fields.addAt(16, new Field({ + "exceptDomains": null, + "hidden": false, + "id": "url1322392000", + "name": "discord", + "onlyDomains": null, + "presentable": false, + "required": false, + "system": false, + "type": "url" + })) + + // add field + collection.fields.addAt(17, new Field({ + "exceptDomains": null, + "hidden": false, + "id": "url3191313207", + "name": "reddit", + "onlyDomains": null, + "presentable": false, + "required": false, + "system": false, + "type": "url" + })) + + // add field + collection.fields.addAt(18, new Field({ + "exceptDomains": null, + "hidden": false, + "id": "url3425232140", + "name": "throne", + "onlyDomains": null, + "presentable": false, + "required": false, + "system": false, + "type": "url" + })) + + // add field + collection.fields.addAt(19, new Field({ + "exceptDomains": null, + "hidden": false, + "id": "url2225635011", + "name": "instagram", + "onlyDomains": null, + "presentable": false, + "required": false, + "system": false, + "type": "url" + })) + + // add field + collection.fields.addAt(20, new Field({ + "exceptDomains": null, + "hidden": false, + "id": "url1802815712", + "name": "facebook", + "onlyDomains": null, + "presentable": false, + "required": false, + "system": false, + "type": "url" + })) + + // add field + collection.fields.addAt(21, new Field({ + "exceptDomains": null, + "hidden": false, + "id": "url4055117536", + "name": "merch", + "onlyDomains": null, + "presentable": false, + "required": false, + "system": false, + "type": "url" + })) + + // add field + collection.fields.addAt(22, new Field({ + "convertURLs": false, + "hidden": false, + "id": "editor1843675174", + "maxSize": 0, + "name": "description", + "presentable": false, + "required": false, + "system": false, + "type": "editor" + })) + + // add field + collection.fields.addAt(23, new Field({ + "hidden": false, + "id": "number2960516043", + "max": null, + "min": null, + "name": "themeColor", + "onlyInt": false, + "presentable": false, + "required": false, + "system": false, + "type": "number" + })) + + return app.save(collection) +}, (app) => { + const collection = app.findCollectionByNameOrId("pbc_3872109612") + + // remove field + collection.fields.removeById("relation3825607268") + + // remove field + collection.fields.removeById("file3309110367") + + // remove field + collection.fields.removeById("url1288386755") + + // remove field + collection.fields.removeById("url376077238") + + // remove field + collection.fields.removeById("url2042351438") + + // remove field + collection.fields.removeById("url1928100768") + + // remove field + collection.fields.removeById("url847873150") + + // remove field + collection.fields.removeById("url1505654846") + + // remove field + collection.fields.removeById("url4034435380") + + // remove field + collection.fields.removeById("url3056519709") + + // remove field + collection.fields.removeById("url2609473773") + + // remove field + collection.fields.removeById("url2799872019") + + // remove field + collection.fields.removeById("url1736283674") + + // remove field + collection.fields.removeById("url1322392000") + + // remove field + collection.fields.removeById("url3191313207") + + // remove field + collection.fields.removeById("url3425232140") + + // remove field + collection.fields.removeById("url2225635011") + + // remove field + collection.fields.removeById("url1802815712") + + // remove field + collection.fields.removeById("url4055117536") + + // remove field + collection.fields.removeById("editor1843675174") + + // remove field + collection.fields.removeById("number2960516043") + + return app.save(collection) +}) diff --git a/services/pocketbase/pb_migrations/1761818044_updated_vod.js b/services/pocketbase/pb_migrations/1761818044_updated_vod.js new file mode 100644 index 00000000..145cc9bf --- /dev/null +++ b/services/pocketbase/pb_migrations/1761818044_updated_vod.js @@ -0,0 +1,20 @@ +/// +migrate((app) => { + const collection = app.findCollectionByNameOrId("pbc_144770472") + + // update collection data + unmarshal({ + "name": "vods" + }, collection) + + return app.save(collection) +}, (app) => { + const collection = app.findCollectionByNameOrId("pbc_144770472") + + // update collection data + unmarshal({ + "name": "vod" + }, collection) + + return app.save(collection) +}) diff --git a/services/pocketbase/pb_migrations/1761818052_updated_vtuber.js b/services/pocketbase/pb_migrations/1761818052_updated_vtuber.js new file mode 100644 index 00000000..8cecbc6d --- /dev/null +++ b/services/pocketbase/pb_migrations/1761818052_updated_vtuber.js @@ -0,0 +1,20 @@ +/// +migrate((app) => { + const collection = app.findCollectionByNameOrId("pbc_3872109612") + + // update collection data + unmarshal({ + "name": "vtubers" + }, collection) + + return app.save(collection) +}, (app) => { + const collection = app.findCollectionByNameOrId("pbc_3872109612") + + // update collection data + unmarshal({ + "name": "vtuber" + }, collection) + + return app.save(collection) +}) diff --git a/services/pocketbase/pb_migrations/1761818487_updated_vods.js b/services/pocketbase/pb_migrations/1761818487_updated_vods.js new file mode 100644 index 00000000..ed2d81f5 --- /dev/null +++ b/services/pocketbase/pb_migrations/1761818487_updated_vods.js @@ -0,0 +1,139 @@ +/// +migrate((app) => { + const collection = app.findCollectionByNameOrId("pbc_144770472") + + // add field + collection.fields.addAt(3, new Field({ + "cascadeDelete": false, + "collectionId": "_pb_users_auth_", + "hidden": false, + "id": "relation1668006755", + "maxSelect": 1, + "minSelect": 0, + "name": "uploader", + "presentable": false, + "required": false, + "system": false, + "type": "relation" + })) + + // add field + collection.fields.addAt(4, new Field({ + "convertURLs": false, + "hidden": false, + "id": "editor18589324", + "maxSize": 0, + "name": "notes", + "presentable": false, + "required": false, + "system": false, + "type": "editor" + })) + + // add field + collection.fields.addAt(5, new Field({ + "hidden": false, + "id": "json2596236420", + "maxSize": 0, + "name": "segmentKeys", + "presentable": false, + "required": false, + "system": false, + "type": "json" + })) + + // add field + collection.fields.addAt(6, new Field({ + "hidden": false, + "id": "file3785949232", + "maxSelect": 1, + "maxSize": 0, + "mimeTypes": [], + "name": "sourceVideo", + "presentable": false, + "protected": false, + "required": false, + "system": false, + "thumbs": [], + "type": "file" + })) + + // add field + collection.fields.addAt(7, new Field({ + "hidden": false, + "id": "file651090729", + "maxSelect": 99, + "maxSize": 0, + "mimeTypes": [], + "name": "segments", + "presentable": false, + "protected": false, + "required": false, + "system": false, + "thumbs": [], + "type": "file" + })) + + // add field + collection.fields.addAt(8, new Field({ + "hidden": false, + "id": "file3277268710", + "maxSelect": 1, + "maxSize": 0, + "mimeTypes": [], + "name": "thumbnail", + "presentable": false, + "protected": false, + "required": false, + "system": false, + "thumbs": [], + "type": "file" + })) + + // add field + collection.fields.addAt(9, new Field({ + "hidden": false, + "id": "select2063623452", + "maxSelect": 1, + "name": "status", + "presentable": false, + "required": false, + "system": false, + "type": "select", + "values": [ + "ordering", + "pending", + "approved", + "rejected", + "processing", + "processed" + ] + })) + + return app.save(collection) +}, (app) => { + const collection = app.findCollectionByNameOrId("pbc_144770472") + + // remove field + collection.fields.removeById("relation1668006755") + + // remove field + collection.fields.removeById("editor18589324") + + // remove field + collection.fields.removeById("json2596236420") + + // remove field + collection.fields.removeById("file3785949232") + + // remove field + collection.fields.removeById("file651090729") + + // remove field + collection.fields.removeById("file3277268710") + + // remove field + collection.fields.removeById("select2063623452") + + return app.save(collection) +}) diff --git a/services/pocketbase/pb_migrations/1761818515_updated_vods.js b/services/pocketbase/pb_migrations/1761818515_updated_vods.js new file mode 100644 index 00000000..461bc39a --- /dev/null +++ b/services/pocketbase/pb_migrations/1761818515_updated_vods.js @@ -0,0 +1,28 @@ +/// +migrate((app) => { + const collection = app.findCollectionByNameOrId("pbc_144770472") + + // add field + collection.fields.addAt(10, new Field({ + "cascadeDelete": false, + "collectionId": "pbc_3872109612", + "hidden": false, + "id": "relation3093501878", + "maxSelect": 999, + "minSelect": 0, + "name": "vtubers", + "presentable": false, + "required": false, + "system": false, + "type": "relation" + })) + + return app.save(collection) +}, (app) => { + const collection = app.findCollectionByNameOrId("pbc_144770472") + + // remove field + collection.fields.removeById("relation3093501878") + + return app.save(collection) +}) diff --git a/services/pocketbase/pb_migrations/1761911220_updated_vtubers.js b/services/pocketbase/pb_migrations/1761911220_updated_vtubers.js new file mode 100644 index 00000000..ea42545f --- /dev/null +++ b/services/pocketbase/pb_migrations/1761911220_updated_vtubers.js @@ -0,0 +1,46 @@ +/// +migrate((app) => { + const collection = app.findCollectionByNameOrId("pbc_3872109612") + + // remove field + collection.fields.removeById("number2960516043") + + // add field + collection.fields.addAt(23, new Field({ + "autogeneratePattern": "", + "hidden": false, + "id": "text2960516043", + "max": 0, + "min": 0, + "name": "themeColor", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + })) + + return app.save(collection) +}, (app) => { + const collection = app.findCollectionByNameOrId("pbc_3872109612") + + // add field + collection.fields.addAt(23, new Field({ + "hidden": false, + "id": "number2960516043", + "max": null, + "min": null, + "name": "themeColor", + "onlyInt": false, + "presentable": false, + "required": false, + "system": false, + "type": "number" + })) + + // remove field + collection.fields.removeById("text2960516043") + + return app.save(collection) +}) diff --git a/services/pocketbase/pb_migrations/1761915053_updated_vods.js b/services/pocketbase/pb_migrations/1761915053_updated_vods.js new file mode 100644 index 00000000..127dcb66 --- /dev/null +++ b/services/pocketbase/pb_migrations/1761915053_updated_vods.js @@ -0,0 +1,124 @@ +/// +migrate((app) => { + const collection = app.findCollectionByNameOrId("pbc_144770472") + + // remove field + collection.fields.removeById("file3785949232") + + // remove field + collection.fields.removeById("file651090729") + + // remove field + collection.fields.removeById("file3277268710") + + // add field + collection.fields.addAt(8, new Field({ + "autogeneratePattern": "", + "hidden": false, + "id": "text3785949232", + "max": 0, + "min": 0, + "name": "sourceVideo", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + })) + + // add field + collection.fields.addAt(9, new Field({ + "autogeneratePattern": "", + "hidden": false, + "id": "text651090729", + "max": 0, + "min": 0, + "name": "segments", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + })) + + // add field + collection.fields.addAt(10, new Field({ + "autogeneratePattern": "", + "hidden": false, + "id": "text3277268710", + "max": 0, + "min": 0, + "name": "thumbnail", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + })) + + return app.save(collection) +}, (app) => { + const collection = app.findCollectionByNameOrId("pbc_144770472") + + // add field + collection.fields.addAt(6, new Field({ + "hidden": false, + "id": "file3785949232", + "maxSelect": 1, + "maxSize": 0, + "mimeTypes": [], + "name": "sourceVideo", + "presentable": false, + "protected": false, + "required": false, + "system": false, + "thumbs": [], + "type": "file" + })) + + // add field + collection.fields.addAt(7, new Field({ + "hidden": false, + "id": "file651090729", + "maxSelect": 99, + "maxSize": 0, + "mimeTypes": [], + "name": "segments", + "presentable": false, + "protected": false, + "required": false, + "system": false, + "thumbs": [], + "type": "file" + })) + + // add field + collection.fields.addAt(8, new Field({ + "hidden": false, + "id": "file3277268710", + "maxSelect": 1, + "maxSize": 0, + "mimeTypes": [], + "name": "thumbnail", + "presentable": false, + "protected": false, + "required": false, + "system": false, + "thumbs": [], + "type": "file" + })) + + // remove field + collection.fields.removeById("text3785949232") + + // remove field + collection.fields.removeById("text651090729") + + // remove field + collection.fields.removeById("text3277268710") + + return app.save(collection) +}) diff --git a/services/pocketbase/pb_migrations/1761915570_updated_vods.js b/services/pocketbase/pb_migrations/1761915570_updated_vods.js new file mode 100644 index 00000000..a0856f22 --- /dev/null +++ b/services/pocketbase/pb_migrations/1761915570_updated_vods.js @@ -0,0 +1,67 @@ +/// +migrate((app) => { + const collection = app.findCollectionByNameOrId("pbc_144770472") + + // add field + collection.fields.addAt(11, new Field({ + "autogeneratePattern": "", + "hidden": false, + "id": "text3889096196", + "max": 0, + "min": 0, + "name": "muxAssetId", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + })) + + // add field + collection.fields.addAt(12, new Field({ + "autogeneratePattern": "", + "hidden": false, + "id": "text1061856600", + "max": 0, + "min": 0, + "name": "muxPlaybackId", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + })) + + // add field + collection.fields.addAt(13, new Field({ + "autogeneratePattern": "", + "hidden": false, + "id": "text1805914144", + "max": 0, + "min": 0, + "name": "ipfsCid", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + })) + + return app.save(collection) +}, (app) => { + const collection = app.findCollectionByNameOrId("pbc_144770472") + + // remove field + collection.fields.removeById("text3889096196") + + // remove field + collection.fields.removeById("text1061856600") + + // remove field + collection.fields.removeById("text1805914144") + + return app.save(collection) +}) diff --git a/services/pocketbase/pb_migrations/1761925981_updated_vods.js b/services/pocketbase/pb_migrations/1761925981_updated_vods.js new file mode 100644 index 00000000..4e975fa6 --- /dev/null +++ b/services/pocketbase/pb_migrations/1761925981_updated_vods.js @@ -0,0 +1,29 @@ +/// +migrate((app) => { + const collection = app.findCollectionByNameOrId("pbc_144770472") + + // add field + collection.fields.addAt(14, new Field({ + "autogeneratePattern": "", + "hidden": false, + "id": "text1646005928", + "max": 0, + "min": 0, + "name": "videoSrcB2", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + })) + + return app.save(collection) +}, (app) => { + const collection = app.findCollectionByNameOrId("pbc_144770472") + + // remove field + collection.fields.removeById("text1646005928") + + return app.save(collection) +}) diff --git a/services/pocketbase/pb_migrations/1762063470_updated_vods.js b/services/pocketbase/pb_migrations/1762063470_updated_vods.js new file mode 100644 index 00000000..e4b87737 --- /dev/null +++ b/services/pocketbase/pb_migrations/1762063470_updated_vods.js @@ -0,0 +1,29 @@ +/// +migrate((app) => { + const collection = app.findCollectionByNameOrId("pbc_144770472") + + // add field + collection.fields.addAt(15, new Field({ + "autogeneratePattern": "", + "hidden": false, + "id": "text1642358089", + "max": 0, + "min": 0, + "name": "muxPlaybackToken", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + })) + + return app.save(collection) +}, (app) => { + const collection = app.findCollectionByNameOrId("pbc_144770472") + + // remove field + collection.fields.removeById("text1642358089") + + return app.save(collection) +}) diff --git a/services/pocketbase/pb_migrations/1762098375_updated_users.js b/services/pocketbase/pb_migrations/1762098375_updated_users.js new file mode 100644 index 00000000..617205a3 --- /dev/null +++ b/services/pocketbase/pb_migrations/1762098375_updated_users.js @@ -0,0 +1,24 @@ +/// +migrate((app) => { + const collection = app.findCollectionByNameOrId("_pb_users_auth_") + + // update collection data + unmarshal({ + "oauth2": { + "enabled": true + } + }, collection) + + return app.save(collection) +}, (app) => { + const collection = app.findCollectionByNameOrId("_pb_users_auth_") + + // update collection data + unmarshal({ + "oauth2": { + "enabled": false + } + }, collection) + + return app.save(collection) +}) diff --git a/services/pocketbase/pb_migrations/1762157776_updated_users.js b/services/pocketbase/pb_migrations/1762157776_updated_users.js new file mode 100644 index 00000000..fa43b91c --- /dev/null +++ b/services/pocketbase/pb_migrations/1762157776_updated_users.js @@ -0,0 +1,34 @@ +/// +migrate((app) => { + const collection = app.findCollectionByNameOrId("_pb_users_auth_") + + // add field + collection.fields.addAt(8, new Field({ + "hidden": false, + "id": "select66088533", + "maxSelect": 1, + "name": "supporter", + "presentable": false, + "required": false, + "system": false, + "type": "select", + "values": [ + "free", + "tier1", + "tier2", + "tier3", + "tier4", + "tier5", + "tier6" + ] + })) + + return app.save(collection) +}, (app) => { + const collection = app.findCollectionByNameOrId("_pb_users_auth_") + + // remove field + collection.fields.removeById("select66088533") + + return app.save(collection) +}) diff --git a/services/pocketbase/pb_migrations/1762157822_updated_users.js b/services/pocketbase/pb_migrations/1762157822_updated_users.js new file mode 100644 index 00000000..0ddfa664 --- /dev/null +++ b/services/pocketbase/pb_migrations/1762157822_updated_users.js @@ -0,0 +1,48 @@ +/// +migrate((app) => { + const collection = app.findCollectionByNameOrId("_pb_users_auth_") + + // remove field + collection.fields.removeById("select66088533") + + // add field + collection.fields.addAt(8, new Field({ + "hidden": false, + "id": "bool66088533", + "name": "supporter", + "presentable": false, + "required": false, + "system": false, + "type": "bool" + })) + + return app.save(collection) +}, (app) => { + const collection = app.findCollectionByNameOrId("_pb_users_auth_") + + // add field + collection.fields.addAt(8, new Field({ + "hidden": false, + "id": "select66088533", + "maxSelect": 1, + "name": "supporter", + "presentable": false, + "required": false, + "system": false, + "type": "select", + "values": [ + "free", + "tier1", + "tier2", + "tier3", + "tier4", + "tier5", + "tier6" + ] + })) + + // remove field + collection.fields.removeById("bool66088533") + + return app.save(collection) +}) diff --git a/services/pocketbase/pb_migrations/1762157870_updated_users.js b/services/pocketbase/pb_migrations/1762157870_updated_users.js new file mode 100644 index 00000000..c87ac1c1 --- /dev/null +++ b/services/pocketbase/pb_migrations/1762157870_updated_users.js @@ -0,0 +1,38 @@ +/// +migrate((app) => { + const collection = app.findCollectionByNameOrId("_pb_users_auth_") + + // remove field + collection.fields.removeById("bool66088533") + + // add field + collection.fields.addAt(8, new Field({ + "hidden": false, + "id": "bool3858055773", + "name": "patron", + "presentable": false, + "required": false, + "system": false, + "type": "bool" + })) + + return app.save(collection) +}, (app) => { + const collection = app.findCollectionByNameOrId("_pb_users_auth_") + + // add field + collection.fields.addAt(8, new Field({ + "hidden": false, + "id": "bool66088533", + "name": "supporter", + "presentable": false, + "required": false, + "system": false, + "type": "bool" + })) + + // remove field + collection.fields.removeById("bool3858055773") + + return app.save(collection) +}) diff --git a/services/pocketbase/pb_migrations/1762159429_updated_users.js b/services/pocketbase/pb_migrations/1762159429_updated_users.js new file mode 100644 index 00000000..40c55974 --- /dev/null +++ b/services/pocketbase/pb_migrations/1762159429_updated_users.js @@ -0,0 +1,29 @@ +/// +migrate((app) => { + const collection = app.findCollectionByNameOrId("_pb_users_auth_") + + // add field + collection.fields.addAt(9, new Field({ + "autogeneratePattern": "", + "hidden": false, + "id": "text1335658467", + "max": 0, + "min": 0, + "name": "patreonId", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + })) + + return app.save(collection) +}, (app) => { + const collection = app.findCollectionByNameOrId("_pb_users_auth_") + + // remove field + collection.fields.removeById("text1335658467") + + return app.save(collection) +}) diff --git a/services/pocketbase/pb_migrations/1762174563_deleted_queue_stats.js b/services/pocketbase/pb_migrations/1762174563_deleted_queue_stats.js new file mode 100644 index 00000000..5ebed39e --- /dev/null +++ b/services/pocketbase/pb_migrations/1762174563_deleted_queue_stats.js @@ -0,0 +1,58 @@ +/// +migrate((app) => { + const collection = app.findCollectionByNameOrId("pbc_4199263681"); + + return app.delete(collection); +}, (app) => { + const collection = new Collection({ + "createRule": null, + "deleteRule": null, + "fields": [ + { + "autogeneratePattern": "", + "hidden": false, + "id": "text3208210256", + "max": 0, + "min": 0, + "name": "id", + "pattern": "^[a-z0-9]+$", + "presentable": false, + "primaryKey": true, + "required": true, + "system": true, + "type": "text" + }, + { + "hidden": false, + "id": "json3486377887", + "maxSize": 1, + "name": "pending_tasks", + "presentable": false, + "required": false, + "system": false, + "type": "json" + }, + { + "hidden": false, + "id": "json907408884", + "maxSize": 1, + "name": "failed_tasks", + "presentable": false, + "required": false, + "system": false, + "type": "json" + } + ], + "id": "pbc_4199263681", + "indexes": [], + "listRule": null, + "name": "queue_stats", + "system": false, + "type": "view", + "updateRule": null, + "viewQuery": "SELECT queue as id,\n SUM(CASE WHEN failed IS '' THEN 1 ELSE 0 END) as pending_tasks,\n SUM(CASE WHEN failed IS NOT '' THEN 1 ELSE 0 END) as failed_tasks\n FROM queue_tasks\n GROUP BY queue;", + "viewRule": null + }); + + return app.save(collection); +}) diff --git a/services/pocketbase/pb_migrations/1762174576_deleted_queue_locks.js b/services/pocketbase/pb_migrations/1762174576_deleted_queue_locks.js new file mode 100644 index 00000000..8536afe7 --- /dev/null +++ b/services/pocketbase/pb_migrations/1762174576_deleted_queue_locks.js @@ -0,0 +1,87 @@ +/// +migrate((app) => { + const collection = app.findCollectionByNameOrId("pbc_1488669058"); + + return app.delete(collection); +}, (app) => { + const collection = new Collection({ + "createRule": null, + "deleteRule": null, + "fields": [ + { + "autogeneratePattern": "[a-z0-9]{15}", + "hidden": false, + "id": "text3208210256", + "max": 15, + "min": 15, + "name": "id", + "pattern": "^[a-z0-9]+$", + "presentable": false, + "primaryKey": true, + "required": true, + "system": true, + "type": "text" + }, + { + "autogeneratePattern": "", + "hidden": false, + "id": "text1797306934", + "max": 0, + "min": 0, + "name": "worker_id", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": true, + "system": false, + "type": "text" + }, + { + "cascadeDelete": false, + "collectionId": "pbc_4107420034", + "hidden": false, + "id": "relation1384045349", + "maxSelect": 1, + "minSelect": 0, + "name": "task", + "presentable": false, + "required": true, + "system": false, + "type": "relation" + }, + { + "hidden": false, + "id": "autodate2990389176", + "name": "created", + "onCreate": true, + "onUpdate": false, + "presentable": false, + "system": false, + "type": "autodate" + }, + { + "hidden": false, + "id": "autodate3332085495", + "name": "updated", + "onCreate": true, + "onUpdate": true, + "presentable": false, + "system": false, + "type": "autodate" + } + ], + "id": "pbc_1488669058", + "indexes": [ + "CREATE UNIQUE INDEX idx_HSFtKfUArr ON queue_locks (task)", + "CREATE INDEX idx_bn5iw0BzOm ON queue_locks (created)" + ], + "listRule": null, + "name": "queue_locks", + "system": false, + "type": "base", + "updateRule": null, + "viewRule": null + }); + + return app.save(collection); +}) diff --git a/services/pocketbase/pb_migrations/1762174580_deleted_queue_tasks.js b/services/pocketbase/pb_migrations/1762174580_deleted_queue_tasks.js new file mode 100644 index 00000000..db45e3d0 --- /dev/null +++ b/services/pocketbase/pb_migrations/1762174580_deleted_queue_tasks.js @@ -0,0 +1,109 @@ +/// +migrate((app) => { + const collection = app.findCollectionByNameOrId("pbc_4107420034"); + + return app.delete(collection); +}, (app) => { + const collection = new Collection({ + "createRule": null, + "deleteRule": null, + "fields": [ + { + "autogeneratePattern": "[a-z0-9]{15}", + "hidden": false, + "id": "text3208210256", + "max": 15, + "min": 15, + "name": "id", + "pattern": "^[a-z0-9]+$", + "presentable": false, + "primaryKey": true, + "required": true, + "system": true, + "type": "text" + }, + { + "autogeneratePattern": "", + "hidden": false, + "id": "text2147319651", + "max": 0, + "min": 0, + "name": "queue", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": true, + "system": false, + "type": "text" + }, + { + "hidden": false, + "id": "json1384045349", + "maxSize": 2000000, + "name": "task", + "presentable": false, + "required": false, + "system": false, + "type": "json" + }, + { + "hidden": false, + "id": "date2659951479", + "max": "", + "min": "", + "name": "failed", + "presentable": false, + "required": false, + "system": false, + "type": "date" + }, + { + "autogeneratePattern": "", + "hidden": false, + "id": "text4016436606", + "max": 0, + "min": 0, + "name": "failed_reason", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + }, + { + "hidden": false, + "id": "autodate2990389176", + "name": "created", + "onCreate": true, + "onUpdate": false, + "presentable": false, + "system": false, + "type": "autodate" + }, + { + "hidden": false, + "id": "autodate3332085495", + "name": "updated", + "onCreate": true, + "onUpdate": true, + "presentable": false, + "system": false, + "type": "autodate" + } + ], + "id": "pbc_4107420034", + "indexes": [ + "CREATE INDEX idx_DjQFazUd5h ON queue_tasks (\n queue,\n failed,\n created\n)", + "CREATE INDEX idx_pUcaFfpCFF ON queue_tasks (\n failed,\n updated\n)" + ], + "listRule": null, + "name": "queue_tasks", + "system": false, + "type": "base", + "updateRule": null, + "viewRule": null + }); + + return app.save(collection); +}) diff --git a/services/pocketbase/pb_migrations/1762230465_updated_users.js b/services/pocketbase/pb_migrations/1762230465_updated_users.js new file mode 100644 index 00000000..99217f0b --- /dev/null +++ b/services/pocketbase/pb_migrations/1762230465_updated_users.js @@ -0,0 +1,30 @@ +/// +migrate((app) => { + const collection = app.findCollectionByNameOrId("_pb_users_auth_") + + // update collection data + unmarshal({ + "oauth2": { + "mappedFields": { + "avatarURL": "", + "id": "patreonId" + } + } + }, collection) + + return app.save(collection) +}, (app) => { + const collection = app.findCollectionByNameOrId("_pb_users_auth_") + + // update collection data + unmarshal({ + "oauth2": { + "mappedFields": { + "avatarURL": "avatar", + "id": "" + } + } + }, collection) + + return app.save(collection) +}) diff --git a/services/pocketbase/pb_migrations/1762238135_updated_users.js b/services/pocketbase/pb_migrations/1762238135_updated_users.js new file mode 100644 index 00000000..6073e1d3 --- /dev/null +++ b/services/pocketbase/pb_migrations/1762238135_updated_users.js @@ -0,0 +1,29 @@ +/// +migrate((app) => { + const collection = app.findCollectionByNameOrId("_pb_users_auth_") + + // add field + collection.fields.addAt(10, new Field({ + "autogeneratePattern": "", + "hidden": false, + "id": "text3341984971", + "max": 0, + "min": 0, + "name": "patreonAccessToken", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + })) + + return app.save(collection) +}, (app) => { + const collection = app.findCollectionByNameOrId("_pb_users_auth_") + + // remove field + collection.fields.removeById("text3341984971") + + return app.save(collection) +}) diff --git a/services/pocketbase/pb_public/favicon.ico b/services/pocketbase/pb_public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..04e664e9f3c928727b2cc223f14dea8fa0e4aa28 GIT binary patch literal 323 zcmZQzU<5)32LT|-!l28@z#zuJz|a}s=g!L|#RX*YdV0770ci&i=3oPot1=7k0jV#Z zE{-7;bKc(G%X`Q`f-SL0L-XY(j>QLf&K&015Mfo;Af+rAsc19lZ=870lagOg{zUNn z{`lig$(bZjIyWv{V#XDV&#AQ^z9F`yWxB9Roc|r-v7&@(ja!BW)0)oz;%XC zXI+5sL)J4st^ITV%-!qR^R;))Z(zB=Gz%TSDsNnRpJ)0$??1n!lfDa2V2E;<48@oK z>~r|WmhQozyC5?!e!;YN>I#fo8q|oyX(#I2t<`~wpRt~pFYfMlQPdmge+ExiKbLh* G2~7ZH&wIE4 literal 0 HcmV?d00001 diff --git a/services/pocketbase/pb_public/service-worker.js b/services/pocketbase/pb_public/service-worker.js new file mode 100644 index 00000000..7027fce6 --- /dev/null +++ b/services/pocketbase/pb_public/service-worker.js @@ -0,0 +1 @@ +// hello \ No newline at end of file diff --git a/services/pocketbase/src/plugins/patreon/package-lock.json b/services/pocketbase/src/plugins/patreon/package-lock.json new file mode 100644 index 00000000..6df976b9 --- /dev/null +++ b/services/pocketbase/src/plugins/patreon/package-lock.json @@ -0,0 +1,957 @@ +{ + "name": "pocketpages-plugin-patreon", + "version": "0.0.1", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "pocketpages-plugin-patreon", + "version": "0.0.1", + "license": "Unlicense", + "dependencies": { + "pocketpages-plugin-js-sdk": "0.2.0" + }, + "devDependencies": { + "tsdown": "^0.15.12", + "typescript": "^5.7.3" + } + }, + "node_modules/@babel/generator": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.5.tgz", + "integrity": "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.5", + "@babel/types": "^7.28.5", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz", + "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.5" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/types": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz", + "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@emnapi/core": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.7.0.tgz", + "integrity": "sha512-pJdKGq/1iquWYtv1RRSljZklxHCOCAJFJrImO5ZLKPJVJlVUcs8yFwNQlqS0Lo8xT1VAXXTCZocF9n26FWEKsw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.1.0", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.7.0.tgz", + "integrity": "sha512-oAYoQnCYaQZKVS53Fq23ceWMRxq5EhQsE0x0RdQ55jT7wagMu5k+fS39v1fiSLrtrLQlXwVINenqhLMtTrV/1Q==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.1.0.tgz", + "integrity": "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.0.7.tgz", + "integrity": "sha512-SeDnOO0Tk7Okiq6DbXmmBODgOAb9dp9gjlphokTUxmt8U3liIP1ZsozBahH69j/RJv+Rfs6IwUKHTgQYJ/HBAw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.5.0", + "@emnapi/runtime": "^1.5.0", + "@tybys/wasm-util": "^0.10.1" + } + }, + "node_modules/@oxc-project/types": { + "version": "0.95.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.95.0.tgz", + "integrity": "sha512-vACy7vhpMPhjEJhULNxrdR0D943TkA/MigMpJCHmBHvMXxRStRi/dPtTlfQ3uDwWSzRpT8z+7ImjZVf8JWBocQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Boshen" + } + }, + "node_modules/@quansync/fs": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@quansync/fs/-/fs-0.1.5.tgz", + "integrity": "sha512-lNS9hL2aS2NZgNW7BBj+6EBl4rOf8l+tQ0eRY6JWCI8jI2kc53gSoqbjojU0OnAWhzoXiOjFyGsHcDGePB3lhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "quansync": "^0.2.11" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + } + }, + "node_modules/@rolldown/binding-android-arm64": { + "version": "1.0.0-beta.45", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.0-beta.45.tgz", + "integrity": "sha512-bfgKYhFiXJALeA/riil908+2vlyWGdwa7Ju5S+JgWZYdR4jtiPOGdM6WLfso1dojCh+4ZWeiTwPeV9IKQEX+4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-arm64": { + "version": "1.0.0-beta.45", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.0-beta.45.tgz", + "integrity": "sha512-xjCv4CRVsSnnIxTuyH1RDJl5OEQ1c9JYOwfDAHddjJDxCw46ZX9q80+xq7Eok7KC4bRSZudMJllkvOKv0T9SeA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-x64": { + "version": "1.0.0-beta.45", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.0-beta.45.tgz", + "integrity": "sha512-ddcO9TD3D/CLUa/l8GO8LHzBOaZqWg5ClMy3jICoxwCuoz47h9dtqPsIeTiB6yR501LQTeDsjA4lIFd7u3Ljfw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-freebsd-x64": { + "version": "1.0.0-beta.45", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.0-beta.45.tgz", + "integrity": "sha512-MBTWdrzW9w+UMYDUvnEuh0pQvLENkl2Sis15fHTfHVW7ClbGuez+RWopZudIDEGkpZXdeI4CkRXk+vdIIebrmg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.0.0-beta.45", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.0-beta.45.tgz", + "integrity": "sha512-4YgoCFiki1HR6oSg+GxxfzfnVCesQxLF1LEnw9uXS/MpBmuog0EOO2rYfy69rWP4tFZL9IWp6KEfGZLrZ7aUog==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-gnu": { + "version": "1.0.0-beta.45", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.0-beta.45.tgz", + "integrity": "sha512-LE1gjAwQRrbCOorJJ7LFr10s5vqYf5a00V5Ea9wXcT2+56n5YosJkcp8eQ12FxRBv2YX8dsdQJb+ZTtYJwb6XQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-musl": { + "version": "1.0.0-beta.45", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.0-beta.45.tgz", + "integrity": "sha512-tdy8ThO/fPp40B81v0YK3QC+KODOmzJzSUOO37DinQxzlTJ026gqUSOM8tzlVixRbQJltgVDCTYF8HNPRErQTA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-gnu": { + "version": "1.0.0-beta.45", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.0-beta.45.tgz", + "integrity": "sha512-lS082ROBWdmOyVY/0YB3JmsiClaWoxvC+dA8/rbhyB9VLkvVEaihLEOr4CYmrMse151C4+S6hCw6oa1iewox7g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-musl": { + "version": "1.0.0-beta.45", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.0-beta.45.tgz", + "integrity": "sha512-Hi73aYY0cBkr1/SvNQqH8Cd+rSV6S9RB5izCv0ySBcRnd/Wfn5plguUoGYwBnhHgFbh6cPw9m2dUVBR6BG1gxA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-openharmony-arm64": { + "version": "1.0.0-beta.45", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.0-beta.45.tgz", + "integrity": "sha512-fljEqbO7RHHogNDxYtTzr+GNjlfOx21RUyGmF+NrkebZ8emYYiIqzPxsaMZuRx0rgZmVmliOzEp86/CQFDKhJQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-wasm32-wasi": { + "version": "1.0.0-beta.45", + "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.0-beta.45.tgz", + "integrity": "sha512-ZJDB7lkuZE9XUnWQSYrBObZxczut+8FZ5pdanm8nNS1DAo8zsrPuvGwn+U3fwU98WaiFsNrA4XHngesCGr8tEQ==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@napi-rs/wasm-runtime": "^1.0.7" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.0.0-beta.45", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.0-beta.45.tgz", + "integrity": "sha512-zyzAjItHPUmxg6Z8SyRhLdXlJn3/D9KL5b9mObUrBHhWS/GwRH4665xCiFqeuktAhhWutqfc+rOV2LjK4VYQGQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-ia32-msvc": { + "version": "1.0.0-beta.45", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.0.0-beta.45.tgz", + "integrity": "sha512-wODcGzlfxqS6D7BR0srkJk3drPwXYLu7jPHN27ce2c4PUnVVmJnp9mJzUQGT4LpmHmmVdMZ+P6hKvyTGBzc1CA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.0.0-beta.45", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.0-beta.45.tgz", + "integrity": "sha512-wiU40G1nQo9rtfvF9jLbl79lUgjfaD/LTyUEw2Wg/gdF5OhjzpKMVugZQngO+RNdwYaNj+Fs+kWBWfp4VXPMHA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-beta.45", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.45.tgz", + "integrity": "sha512-Le9ulGCrD8ggInzWw/k2J8QcbPz7eGIOWqfJ2L+1R0Opm7n6J37s2hiDWlh6LJN0Lk9L5sUzMvRHKW7UxBZsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", + "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/ansis": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/ansis/-/ansis-4.2.0.tgz", + "integrity": "sha512-HqZ5rWlFjGiV0tDm3UxxgNRqsOTniqoKZu0pIAfh7TZQMGuZK+hH0drySty0si0QXj1ieop4+SkSfPZBPPkHig==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + } + }, + "node_modules/ast-kit": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ast-kit/-/ast-kit-2.1.3.tgz", + "integrity": "sha512-TH+b3Lv6pUjy/Nu0m6A2JULtdzLpmqF9x1Dhj00ZoEiML8qvVA9j1flkzTKNYgdEhWrjDwtWNpyyCUbfQe514g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.4", + "pathe": "^2.0.3" + }, + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + } + }, + "node_modules/birpc": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/birpc/-/birpc-2.6.1.tgz", + "integrity": "sha512-LPnFhlDpdSH6FJhJyn4M0kFO7vtQ5iPw24FnG0y21q09xC7e8+1LeR31S1MAIrDAHp4m7aas4bEkTDTvMAtebQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/defu": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.4.tgz", + "integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==", + "dev": true, + "license": "MIT" + }, + "node_modules/diff": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-8.0.2.tgz", + "integrity": "sha512-sSuxWU5j5SR9QQji/o2qMvqRNYRDOcBTgsJ/DeCf4iSN4gW+gNMXM7wFIP+fdXZxoNiAnHUTGjCr+TSWXdRDKg==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/dts-resolver": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/dts-resolver/-/dts-resolver-2.1.2.tgz", + "integrity": "sha512-xeXHBQkn2ISSXxbJWD828PFjtyg+/UrMDo7W4Ffcs7+YWCquxU8YjV1KoxuiL+eJ5pg3ll+bC6flVv61L3LKZg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20.18.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + }, + "peerDependencies": { + "oxc-resolver": ">=11.0.0" + }, + "peerDependenciesMeta": { + "oxc-resolver": { + "optional": true + } + } + }, + "node_modules/empathic": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/empathic/-/empathic-2.0.0.tgz", + "integrity": "sha512-i6UzDscO/XfAcNYD75CfICkmfLedpyPDdozrLMmQc5ORaQcdMoc21OnlEylMIqI7U8eniKrPMxxtj8k0vhmJhA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/get-tsconfig": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.0.tgz", + "integrity": "sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/hookable": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/hookable/-/hookable-5.5.3.tgz", + "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/jiti": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", + "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" + }, + "node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pocketbase-js-sdk-jsvm": { + "version": "0.25.10004", + "resolved": "https://registry.npmjs.org/pocketbase-js-sdk-jsvm/-/pocketbase-js-sdk-jsvm-0.25.10004.tgz", + "integrity": "sha512-/0RkFa6X4LeKMdv4KCXhC5i2cvpG0elvXInRyk8bApjG8jyyPiNDL6o9VBvgxjl6j8/HcQYf3oKYXmZteqAFvQ==", + "license": "MIT" + }, + "node_modules/pocketpages-plugin-js-sdk": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/pocketpages-plugin-js-sdk/-/pocketpages-plugin-js-sdk-0.2.0.tgz", + "integrity": "sha512-/uY1nCz7Zt19C/kyoOraH5ekTZa4PLPpHd0qIEoyf1XBPtEpHL4k7jZE0IPEMu1dH/8RfsKb/YzN52GR+9DdzQ==", + "dependencies": { + "pocketbase-js-sdk-jsvm": "^0.25.10004" + } + }, + "node_modules/quansync": { + "version": "0.2.11", + "resolved": "https://registry.npmjs.org/quansync/-/quansync-0.2.11.tgz", + "integrity": "sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/antfu" + }, + { + "type": "individual", + "url": "https://github.com/sponsors/sxzz" + } + ], + "license": "MIT" + }, + "node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/rolldown": { + "version": "1.0.0-beta.45", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.0-beta.45.tgz", + "integrity": "sha512-iMmuD72XXLf26Tqrv1cryNYLX6NNPLhZ3AmNkSf8+xda0H+yijjGJ+wVT9UdBUHOpKzq9RjKtQKRCWoEKQQBZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@oxc-project/types": "=0.95.0", + "@rolldown/pluginutils": "1.0.0-beta.45" + }, + "bin": { + "rolldown": "bin/cli.mjs" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "optionalDependencies": { + "@rolldown/binding-android-arm64": "1.0.0-beta.45", + "@rolldown/binding-darwin-arm64": "1.0.0-beta.45", + "@rolldown/binding-darwin-x64": "1.0.0-beta.45", + "@rolldown/binding-freebsd-x64": "1.0.0-beta.45", + "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-beta.45", + "@rolldown/binding-linux-arm64-gnu": "1.0.0-beta.45", + "@rolldown/binding-linux-arm64-musl": "1.0.0-beta.45", + "@rolldown/binding-linux-x64-gnu": "1.0.0-beta.45", + "@rolldown/binding-linux-x64-musl": "1.0.0-beta.45", + "@rolldown/binding-openharmony-arm64": "1.0.0-beta.45", + "@rolldown/binding-wasm32-wasi": "1.0.0-beta.45", + "@rolldown/binding-win32-arm64-msvc": "1.0.0-beta.45", + "@rolldown/binding-win32-ia32-msvc": "1.0.0-beta.45", + "@rolldown/binding-win32-x64-msvc": "1.0.0-beta.45" + } + }, + "node_modules/rolldown-plugin-dts": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/rolldown-plugin-dts/-/rolldown-plugin-dts-0.17.3.tgz", + "integrity": "sha512-8mGnNUVNrqEdTnrlcaDxs4sAZg0No6njO+FuhQd4L56nUbJO1tHxOoKDH3mmMJg7f/BhEj/1KjU5W9kZ9zM/kQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/generator": "^7.28.5", + "@babel/parser": "^7.28.5", + "@babel/types": "^7.28.5", + "ast-kit": "^2.1.3", + "birpc": "^2.6.1", + "debug": "^4.4.3", + "dts-resolver": "^2.1.2", + "get-tsconfig": "^4.13.0", + "magic-string": "^0.30.21" + }, + "engines": { + "node": ">=20.18.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + }, + "peerDependencies": { + "@ts-macro/tsc": "^0.3.6", + "@typescript/native-preview": ">=7.0.0-dev.20250601.1", + "rolldown": "^1.0.0-beta.44", + "typescript": "^5.0.0", + "vue-tsc": "~3.1.0" + }, + "peerDependenciesMeta": { + "@ts-macro/tsc": { + "optional": true + }, + "@typescript/native-preview": { + "optional": true + }, + "typescript": { + "optional": true + }, + "vue-tsc": { + "optional": true + } + } + }, + "node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tinyexec": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.1.tgz", + "integrity": "sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true, + "license": "MIT", + "bin": { + "tree-kill": "cli.js" + } + }, + "node_modules/tsdown": { + "version": "0.15.12", + "resolved": "https://registry.npmjs.org/tsdown/-/tsdown-0.15.12.tgz", + "integrity": "sha512-c8VLlQm8/lFrOAg5VMVeN4NAbejZyVQkzd+ErjuaQgJFI/9MhR9ivr0H/CM7UlOF1+ELlF6YaI7sU/4itgGQ8w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansis": "^4.2.0", + "cac": "^6.7.14", + "chokidar": "^4.0.3", + "debug": "^4.4.3", + "diff": "^8.0.2", + "empathic": "^2.0.0", + "hookable": "^5.5.3", + "rolldown": "1.0.0-beta.45", + "rolldown-plugin-dts": "^0.17.2", + "semver": "^7.7.3", + "tinyexec": "^1.0.1", + "tinyglobby": "^0.2.15", + "tree-kill": "^1.2.2", + "unconfig": "^7.3.3" + }, + "bin": { + "tsdown": "dist/run.mjs" + }, + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + }, + "peerDependencies": { + "@arethetypeswrong/core": "^0.18.1", + "publint": "^0.3.0", + "typescript": "^5.0.0", + "unplugin-lightningcss": "^0.4.0", + "unplugin-unused": "^0.5.0", + "unrun": "^0.2.1" + }, + "peerDependenciesMeta": { + "@arethetypeswrong/core": { + "optional": true + }, + "publint": { + "optional": true + }, + "typescript": { + "optional": true + }, + "unplugin-lightningcss": { + "optional": true + }, + "unplugin-unused": { + "optional": true + }, + "unrun": { + "optional": true + } + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD", + "optional": true + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/unconfig": { + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/unconfig/-/unconfig-7.3.3.tgz", + "integrity": "sha512-QCkQoOnJF8L107gxfHL0uavn7WD9b3dpBcFX6HtfQYmjw2YzWxGuFQ0N0J6tE9oguCBJn9KOvfqYDCMPHIZrBA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@quansync/fs": "^0.1.5", + "defu": "^6.1.4", + "jiti": "^2.5.1", + "quansync": "^0.2.11" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + } + } +} diff --git a/services/pocketbase/src/plugins/patreon/package.json b/services/pocketbase/src/plugins/patreon/package.json new file mode 100644 index 00000000..1c8d446c --- /dev/null +++ b/services/pocketbase/src/plugins/patreon/package.json @@ -0,0 +1,19 @@ +{ + "name": "pocketpages-plugin-patreon", + "version": "0.0.1", + "description": "", + "main": "dist/index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1", + "build": "tsdown", + "dev": "tsdown --watch" + }, + "dependencies": { + "pocketpages-plugin-js-sdk": "0.2.0" + }, + "devDependencies": { + "tsdown": "^0.15.12", + "typescript": "^5.7.3" + }, + "license": "Unlicense" +} \ No newline at end of file diff --git a/services/pocketbase/src/plugins/patreon/src/index.ts b/services/pocketbase/src/plugins/patreon/src/index.ts new file mode 100644 index 00000000..8b6eee53 --- /dev/null +++ b/services/pocketbase/src/plugins/patreon/src/index.ts @@ -0,0 +1,40 @@ +import { type ExtendContextApiContext } from 'pocketpages' +import PocketBase, { + AuthModel, + RecordAuthResponse, +} from 'pocketbase-js-sdk-jsvm' +import { type OAuth2SignInOptions } from 'pocketpages-plugin-auth' +import { PluginFactory } from 'pocketpages' +import { OAuth2ProviderInfo } from 'pocketpages-plugin-auth' + +const authPluginFactory: PluginFactory = (config) => { + return { + name: 'patreon', + onExtendContextApi(context: ExtendContextApiContext) { + const { api } = context; + const pb = () => api.pb() as PocketBase + + + api.savePatreonData = ( + authData: AuthModel + ) => { + pb.collection('users') + }, + + api.getPatreonUser = ( + authData: AuthModel, + ) => { + + + console.log("AYO we got authData as follo"); + console.log(JSON.stringify(authData, null, 2)); + + // make a request to Patreon + + + } + }, + } +} + +export default authPluginFactory; \ No newline at end of file diff --git a/services/pocketbase/src/plugins/patreon/tsconfig.json b/services/pocketbase/src/plugins/patreon/tsconfig.json new file mode 100644 index 00000000..a16e3652 --- /dev/null +++ b/services/pocketbase/src/plugins/patreon/tsconfig.json @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + "types": [ + "pocketbase-jsvm" + ], + "strict": true, + "strictNullChecks": true, + "noUncheckedIndexedAccess": true, + "noImplicitAny": true, + "target": "ES6", + "module": "CommonJS", + "moduleResolution": "node", + "esModuleInterop": true, + "resolveJsonModule": true + }, + "include": [ + "src/**/*.ts" + ] +} \ No newline at end of file diff --git a/services/pocketbase/src/plugins/patreon/tsdown.config.ts b/services/pocketbase/src/plugins/patreon/tsdown.config.ts new file mode 100644 index 00000000..111f04cb --- /dev/null +++ b/services/pocketbase/src/plugins/patreon/tsdown.config.ts @@ -0,0 +1,10 @@ +import { defineConfig } from 'tsdown' + +export default defineConfig({ + entry: { + index: 'src/index.ts', + }, + format: ['cjs'], + clean: true, + outDir: 'dist', +}) \ No newline at end of file diff --git a/services/pocketbase/systemd/pocketbase.service b/services/pocketbase/systemd/pocketbase.service new file mode 100644 index 00000000..2227a1b2 --- /dev/null +++ b/services/pocketbase/systemd/pocketbase.service @@ -0,0 +1,14 @@ +[Service] +Type = simple +User = pb +Group = pb +LimitNOFILE = 4096 +Restart = always +RestartSec = 5s +StandardOutput = append:/home/pb/pb/std.log +StandardError = append:/home/pb/pb/std.log +WorkingDirectory = /home/pb/pb +ExecStart = /home/pb/pb/pocketbase serve + +[Install] +WantedBy = multi-user.target \ No newline at end of file diff --git a/services/pocketbase/utils/data_migrations/2025-10-30-v1-export-exec.sh b/services/pocketbase/utils/data_migrations/2025-10-30-v1-export-exec.sh new file mode 100644 index 00000000..9c61fa42 --- /dev/null +++ b/services/pocketbase/utils/data_migrations/2025-10-30-v1-export-exec.sh @@ -0,0 +1,8 @@ +#!/bin/bash + +# This script must run from project root + + +npx @dotenvx/dotenvx run -f ./.env.development.local -- node ./utils/data_migrations/2025-10-30-v1-export.js ./utils/data_migrations +pocketbase import ./utils/data_migrations/vtubers.json vtubers +pocketbase import ./utils/data_migrations/vods.json vods \ No newline at end of file diff --git a/services/pocketbase/utils/data_migrations/2025-10-30-v1-export.js b/services/pocketbase/utils/data_migrations/2025-10-30-v1-export.js new file mode 100644 index 00000000..4ef2b957 --- /dev/null +++ b/services/pocketbase/utils/data_migrations/2025-10-30-v1-export.js @@ -0,0 +1,172 @@ + + +/** + * Migration Script: V1 → json + * ----------------------------------- + * This script migrates VTuber and VOD data from an old Postgres database (V1) into JSON files + * One JSON file per collection, suitable for importing using pocketbase import script + * + * Usage: + * - Ensure environment variables are configured for both databases: + * V1_DB_HOST Hostname of the V1 database (default: "localhost") + * V1_DB_PORT Port of the V1 database (default: "5444") + * V1_DB_USER Username for the V1 database (default: "postgres") + * V1_DB_PASS Password for the V1 database (default: "password") + * V1_DB_NAME Database name for V1 (default: "restoredb") + * DEFAULT_UPLOADER_ID + * An existing user ID in the V2 database that will be set as the uploader for all migrated records. + * + * Usage: + * Run with Node.js: + * $ npx @dotenvx/dotenvx run -f ./.env.local -- node ./2025-10-30-v1-export.js ../pb_data/ + * + */ + + +import pg from 'pg'; +import fs from 'fs'; +import path from 'path'; + +const dataDir = process.argv[2]; // e.g., "../../pb_data/" +if (!dataDir) { + console.error("Please provide the output data directory as the first argument."); + process.exit(1); +} + + +const v1 = new pg.Pool({ + host: process.env.V1_DB_HOST || 'localhost', + port: +(process.env.V1_DB_PORT || '5444'), + user: process.env.V1_DB_USER || 'postgres', + password: process.env.V1_DB_PASS || 'password', + database: process.env.V1_DB_NAME || 'restoredb' +}); + +async function migrateVtubers() { + console.log('Migrating vtubers...'); + const res = await v1.query(`SELECT * FROM vtubers`); + const vtubers = res.rows.map(vt => ({ + slug: vt.slug, + displayName: vt.display_name, + chaturbate: vt.chaturbate, + twitter: vt.twitter, + patreon: vt.patreon, + twitch: vt.twitch, + tiktok: vt.tiktok, + onlyfans: vt.onlyfans, + youtube: vt.youtube, + linktree: vt.linktree, + carrd: vt.carrd, + fansly: vt.fansly, + pornhub: vt.pornhub, + discord: vt.discord, + reddit: vt.reddit, + throne: vt.throne, + instagram: vt.instagram, + facebook: vt.facebook, + merch: vt.merch, + description: `${vt.description_1 ?? ''}\n${vt.description_2 ?? ''}`.trim() || null, + themeColor: vt.theme_color, + })); + + console.log('vtubers sample', vtubers.at(0)) + + const outPath = path.join(dataDir, 'vtubers.json'); + fs.writeFileSync(outPath, JSON.stringify(vtubers, null, 2), 'utf-8'); + console.log(`Migrated ${res.rows.length} vtubers → ${outPath}`); +} + +async function migrateVods() { + console.log('Migrating vods...'); + const res = await v1.query(`SELECT * FROM vods`); + const vods = []; + + for (const vod of res.rows) { + // Get linked vtubers + const vtuberLinks = await v1.query( + `SELECT vtuber_id FROM vods_vtuber_links WHERE vod_id = $1`, + [vod.id] + ); + + let vtuberIds = []; + if (vtuberLinks.rows.length > 0) { + const vtuberRes = await v1.query( + `SELECT id FROM vtubers WHERE id = ANY($1)`, + [vtuberLinks.rows.map(r => r.vtuber_id)] + ); + vtuberIds = vtuberRes.rows.map(v => v.id).filter(Boolean); + } + + // Get thumbnail + const thumbLink = await v1.query( + `SELECT b2.cdn_url, b2.url FROM vods_thumbnail_links vtl + JOIN b2_files b2 ON vtl.b_2_file_id = b2.id + WHERE vtl.vod_id = $1 LIMIT 1`, + [vod.id] + ); + + // Get source video + const videoSrcLink = await v1.query( + `SELECT b2.cdn_url, b2.url FROM vods_video_src_b_2_links vsl + JOIN b2_files b2 ON vsl.b_2_file_id = b2.id + WHERE vsl.vod_id = $1 LIMIT 1`, + [vod.id] + ); + + // Get Mux asset and playback ID + const muxLink = await v1.query( + `SELECT m.asset_id, m.playback_id + FROM vods_mux_asset_links vmal + JOIN mux_assets m ON vmal.mux_asset_id = m.id + WHERE vmal.vod_id = $1 LIMIT 1`, + [vod.id] + ); + + + const muxAssetId = muxLink.rows[0]?.asset_id || null; + const muxPlaybackId = muxLink.rows[0]?.playback_id || null; + + + // @chatgpt we need one more + // we need to populate videoSrcB2 + // we want the cdn_url from b2_files + // we have to get the link from the vods_video_src_b_2_links table + + + vods.push({ + streamDate: vod.date ?? new Date(), + notes: vod.note, + sourceVideo: (() => { + const u = videoSrcLink.rows[0]?.cdn_url || videoSrcLink.rows[0]?.url || null; + return u ? 'content' + new URL(u).pathname : null; + })(), + thumbnail: (() => { + const u = thumbLink.rows[0]?.cdn_url || thumbLink.rows[0]?.url || null; + return u ? 'content' + new URL(u).pathname : null; + })(), + ipfsCid: vod.video_src_hash, + videoSrcB2: videoSrcLink.rows[0]?.cdn_url || null, + muxAssetId, + muxPlaybackId, + }); + } + + console.log(vods.at(0)) + const outPath = path.join(dataDir, 'vods.json'); + fs.writeFileSync(outPath, JSON.stringify(vods, null, 2), 'utf-8'); + console.log(`Migrated ${res.rows.length} vods → ${outPath}`); +} + +async function main() { + try { + await migrateVtubers(); + await migrateVods(); + } catch (err) { + console.error(err); + } finally { + await v1.end(); + } +} + +main(); + diff --git a/services/pocketbase/utils/data_migrations/vods.json b/services/pocketbase/utils/data_migrations/vods.json new file mode 100644 index 00000000..87fcdb83 --- /dev/null +++ b/services/pocketbase/utils/data_migrations/vods.json @@ -0,0 +1,4172 @@ +[ + { + "streamDate": "2024-10-04T06:27:00.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2024-10-03.mp4", + "thumbnail": "content/dwjecaut5s3k5lb6dl3q79gg_projektmelody-chaturbate-2024-10-03.png", + "ipfsCid": "bafybeicufhrgtfge42cy2c7nkm5agp26epzmgwplbdluij2yml53a6alqu", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2024-10-03.mp4", + "muxAssetId": "K7DwpXmKoQ5dAE02O4eEl255vQ67700zqzobv01XuCgNd00", + "muxPlaybackId": "tgJEZiCiJpo73uD02ypZbcysCVMLKrJ9ta8GZSdFTQdo" + }, + { + "streamDate": "2024-10-11T08:59:00.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2024-10-10.mp4", + "thumbnail": "content/t6kpjzd4ua824ble8v60x0em_projektmelody-chaturbate-2024-10-10.png", + "ipfsCid": "bafybeiddh36ytgh5snhkm3edzmre4vxl53cd6dyefwcmpalww2jiozra5u", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2024-10-10.mp4", + "muxAssetId": "TNAGhzx1pGC6bRZLIqE6PlHu2RdxLAxw7tHOTYCTWEc", + "muxPlaybackId": "01QPAk1e6fKLraJyhwixOPY4LzUPX3WMUKYAHUvnjUb8" + }, + { + "streamDate": "2024-11-22T10:20:00.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2024-11-21.mp4", + "thumbnail": "content/m0oxqysuy4c59kl3fi699t4j_projektmelody-chaturbate-2024-11-21.png", + "ipfsCid": "bafybeicsvtrmyfbedh5qvwueewv7mafhgjq5dsndscdptcytyhuirzcssi", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2024-11-21.mp4", + "muxAssetId": "MD01iiJmvZcQ7aSR4K61PGd8ENZ5DYK02mTMY88T9TiZ00", + "muxPlaybackId": "HYdNguTiH0201kyyWetlmA02l9FNfYAXiDfAPHW5p7dBbY" + }, + { + "streamDate": "2025-02-15T10:05:00.000Z", + "notes": "IPFS CID bafybeieckdxedg73rwpg3u37ymoynmzbunhzjoijfzywksdgsg3stf7pie", + "sourceVideo": "content/projektmelody-chaturbate-2025-02-15.mp4", + "thumbnail": "content/projektmelody-chaturbate-2025-02-15-thumb.png", + "ipfsCid": null, + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2025-02-15.mp4", + "muxAssetId": "aSZwqvxIN7LMRbGcB02XIpdcrLMHPAFNZCUUo02RYzfK8", + "muxPlaybackId": "xZqlr00XSXfC00Jg2Pkrb8T02MkOITcqtR5k79AN35j1IE" + }, + { + "streamDate": "2024-04-13T12:09:00.000Z", + "notes": "1080p from chaturbate. video is not original quality-- it has been transcoded to deal with a bad recorder setting", + "sourceVideo": "content/projektmelody-chaturbate-2024-04-12.mp4", + "thumbnail": "content/1712986306972-8395-vod-339-thumb.png", + "ipfsCid": "bafybeihr3cbwboluhqld4yjifanszndlzrdxrosxvlxp4kql4erddzvtei", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2024-04-12.mp4", + "muxAssetId": "fr7FJXR2YBSq1rIJ5N9TJ9MpZQS01G2prtthMBUxgaKs", + "muxPlaybackId": "YCTLWTeucPKEfsFkyI8Sd2jN1s00ESldd00eyIiAdB027Q" + }, + { + "streamDate": "2025-06-01T08:42:00.000Z", + "notes": "Mel had tech issues during this stream which caused 5 outages ranging from a few seconds to several minutes. She then abruptly ended stream.\n\nIPFS CID bafybeig3k4cqorzvsrktg6eezzcz4xve5gkjykmc2rrqyzad7cedlpnb2e\n", + "sourceVideo": "content/projektmelody-chaturbate-2025-06-01.mp4", + "thumbnail": "content/projektmelody-chaturbate-2025-06-01-thumb.png", + "ipfsCid": null, + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2025-06-01.mp4", + "muxAssetId": "3BwPdtql6HT8ZUz8rTI4ksaB1nWXR8LK02OL01rc02i2LE", + "muxPlaybackId": "LNbPP9ivTKctgtf41pnOWVo5GiR9Hqw3bWlHG4019aS00" + }, + { + "streamDate": "2025-10-23T09:12:00.000Z", + "notes": "Recorded using ffmpeg. Recorded via Chaturbate. \n\nIPFS CID bafybeib5ohrs4l5jvdrbjhenwud7edgx67s2vwrr27gglnjvc3stqyj3me\n\nMagnet link magnet:?xt=urn:btih:c158f37aca0a54f0f21a0b77d559c0b05594daaa&dn=projektmelody-chaturbate-2025-10-23.mp4", + "sourceVideo": "content/projektmelody-chaturbate-2025-10-23.mp4", + "thumbnail": "content/projektmelody-chaturbate-2025-10-23-thumb.png", + "ipfsCid": null, + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2025-10-23.mp4", + "muxAssetId": "HG01J4Zc00mg5fX402XiW8qPVHmwe95PpVCDysTtn324hg", + "muxPlaybackId": "rO00q98kxhj5C9naH9kJ6khaJ5ICDLNHIPNw02p11r4Tc" + }, + { + "streamDate": "2021-09-17T04:00:39.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2021-09-16.mp4", + "thumbnail": "content/nvvymyjllok8ywlf44fcd56w-vod-235-thumb.png", + "ipfsCid": "bafybeiadu3pbfvwbioulutd37jpuft5ypnm5qovcswgffkkzkiw3qfpyoe", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2021-09-16.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2024-11-24T11:12:00.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2024-11-23.mp4", + "thumbnail": "content/sya6c33roldwc6quodfa3y8q_projektmelody-chaturbate-2024-11-23.png", + "ipfsCid": "bafybeiak2iwairjgwkqpcgq4iw54jv2suxrj77tuodrb7zjrocvr6cprve", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2024-11-23.mp4", + "muxAssetId": "02l9kTCFdXOLmqPWF7pVmZXi7HM9WCv7Cmaba19QWsHo", + "muxPlaybackId": "MwcrOdc2pYww5jeIJguO82DuSEJE6T1D51BUVlIYkCU" + }, + { + "streamDate": "2024-12-23T12:55:00.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2024-12-23_b.mp4", + "thumbnail": "content/agi6i4q47benq749kbvy0p38_projektmelody-chaturbate-2024-12-23_b.png", + "ipfsCid": "bafybeifjmw3gxsjrctqnatyq5bhfm2l6gzfpaqkterx2a4x7rhi4rfykua", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2024-12-23_b.mp4", + "muxAssetId": "gWgmcHyEujTYn2ATZPbwoi91IvKw01hfADz1m61ctjXc", + "muxPlaybackId": "7qd8rA478ZlbLXbZIYkucJvNDbair1NfWHqwlBh9uiU" + }, + { + "streamDate": "2024-04-25T05:56:00.000Z", + "notes": "vod provided by Fontana Tessitura", + "sourceVideo": "content/projektmelody-chaturbate-2024-04-25.mp4", + "thumbnail": "content/1714051307833-5484-vod-340-thumb.png", + "ipfsCid": "bafybeihg2vff4iqjadgdjbdfkv2vfh6oait7bnhlur7s7c33u2fi5yln5q", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2024-04-25.mp4", + "muxAssetId": "kbEhSN6U91Sx02Z2sQCqK61jAi6muEsO3eSOlQYuDHHI", + "muxPlaybackId": "xFfjG5eBvOEhbdEuFFCkTc8mjg5zbiiY5qqRUvO100x4" + }, + { + "streamDate": "2025-06-05T02:13:00.000Z", + "notes": "\nStream died for all viewers (F in the chat) at around 01:30:00 mark. Stream resumed after about a minute. It took me about another minute to restart the recording.\n\nIPFS CID bafybeigwsgwjd6pfl6wchtbugo2dkfnzyqxfljnuvmz5437n6cceqtclti", + "sourceVideo": "content/projektmelody-fansly-2025-06-04.mp4", + "thumbnail": "content/projektmelody-fansly-2025-06-04-thumb.png", + "ipfsCid": null, + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-fansly-2025-06-04.mp4", + "muxAssetId": "uRYxyWWWrfuqV7JGytbUhhukq02GdgYHXnu2hjax4LKE", + "muxPlaybackId": "zSSFIIKnAj8QNSHcZ8nV02LzT4oqGmtVwnTwn1unL2Bg" + }, + { + "streamDate": "2024-10-13T03:48:00.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2024-10-12.mp4", + "thumbnail": "content/scu9ftagrg7pjserc39sxrwo_projektmelody-chaturbate-2024-10-12.png", + "ipfsCid": "bafybeih2fb57kp22dro7szzzcnzukhiy56pm7aqwpopq7oqnlnvva6pfse", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2024-10-12.mp4", + "muxAssetId": "eKuBAAL016S00pvu643LXtukIvKV701mdJwhKsJ3QjaEaE", + "muxPlaybackId": "BZuTsq02ubBI01Yxrl7qSkRd6en8UwlLZ023esV21dgYkA" + }, + { + "streamDate": "2022-08-02T03:28:31.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2022-08-01.mp4", + "thumbnail": "content/zqq7rte3q5awitlsbtk998g3-vod-226-thumb.png", + "ipfsCid": "bafybeihauqdflvwynsijtk4evzpaudokxgviabrd3l2fycelltd3u434hm", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2022-08-01.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2025-10-29T08:16:00.000Z", + "notes": "Recorded using ffmpeg. Recorded via Chaturbate. \n\nIPFS CID bafybeicc3vkvyptu522gt4lgr65xadk2l6y7irwkqepsggzmuci64xxlvu\n\nMagnet link magnet:?xt=urn:btih:b4ce3c94cd90e620025e1710ad7f4e47cbba1e4e&dn=projektmelody-chaturbate-2025-10-29.mp4", + "sourceVideo": "content/projektmelody-chaturbate-2025-10-29.mp4", + "thumbnail": "content/projektmelody-chaturbate-2025-10-29.mp4", + "ipfsCid": null, + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2025-10-29.mp4", + "muxAssetId": "ET8FXN00guyrpugug00dSMU00m4odQayzhVT3zAHpAMWo00", + "muxPlaybackId": "raj8oC9iivEqpdJe4Ih1kIawUZswcq7ZnKWMy144KhQ" + }, + { + "streamDate": "2023-05-12T07:18:00.000Z", + "notes": null, + "sourceVideo": "content/pmel-2023-05-11_transcoded.mp4", + "thumbnail": "content/clhmaju1d00007wta75z51afw-vod-264-thumb.png", + "ipfsCid": "bafybeiaqhiikqwifz7ptpazt53bshpn3nbna44keo3ksiomf35s5el6jze", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/pmel-2023-05-11_transcoded.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2023-05-18T08:10:00.000Z", + "notes": null, + "sourceVideo": "content/pmel-2023-05-17.mp4", + "thumbnail": "content/clhtrzx4u000080qg6993321b-vod-267-thumb.png", + "ipfsCid": "bafybeie6brwf733eruyri6fjvmsgkxa7jmlh7b4to5vpzgjxtrjwfgkjje", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/pmel-2023-05-17.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2025-06-08T08:55:00.000Z", + "notes": "\nRecorded using ffmpeg. \nMany stream interruptions due to Mel's internet issues\n\nIPFS CID bafybeig43ytwseqx3fhofehqroyw47drlwrepgaejsuk7ytjvlnwujvrrq\n", + "sourceVideo": "content/projektmelody-chaturbate-2025-06-08.mp4", + "thumbnail": "content/projektmelody-chaturbate-2025-06-08-thumb.png", + "ipfsCid": null, + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2025-06-08.mp4", + "muxAssetId": "O2wohccFTLcyjxxeVflpME1GcCgUvEERaTpbneKTkvA", + "muxPlaybackId": "nHxjNGg5T016WyqZxMI01oeNvA4DGnIMHJ6kvSaHrYclU" + }, + { + "streamDate": "2023-01-02T07:03:49.000Z", + "notes": "This VOD is not original HD quality. We are searching for a better version.", + "sourceVideo": "content/projektmelody-chaturbate-2023-01-01.mp4", + "thumbnail": "content/projektmelody-chaturbate-2023-01-01.mp4", + "ipfsCid": "bafybeie3oynhomwdwvkdwgef2viii7kccpegnk6zvfprl4fyz6p52qwh6u", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2023-01-01.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2024-10-15T20:23:00.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2024-10-15.mp4", + "thumbnail": "content/ebnwr66gxj0w2uw838nckl3f_projektmelody-chaturbate-2024-10-15.png", + "ipfsCid": "bafybeifzk3xgrimjiinlomw5t3kijic6suscdxpmz4t2yynyx6r5rfhafq", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2024-10-15.mp4", + "muxAssetId": "S5aHwMWVUGu00l9Lujw4jGzvRBhhcbKluBswxQ5OICoQ", + "muxPlaybackId": "TX3UDPYjngz4ae8kBGs7VLMVMdt9HrLKylpF9bopWXA" + }, + { + "streamDate": "2020-02-10T11:15:55.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2020-02-10.mp4", + "thumbnail": "content/hdtbiuk9qfmt2r6a2td0t1j2-vod-3-thumb.png", + "ipfsCid": "bafybeidcbunf3spndcnuyzv6z3pbuaziq57asgo7rad6qi6ghlpcekpvxm", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2020-02-10.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2024-12-26T10:32:00.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2024-12-26.mp4", + "thumbnail": "content/uhej70gbvlf683lr4dtpvjpy_projektmelody-chaturbate-2024-12-26.png", + "ipfsCid": "bafybeidyxoeoeaeabadsmd4u77b57wjxv4dbetycyoopkasltb457t6jh4", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2024-12-26.mp4", + "muxAssetId": "QjlvK9HmvNuJNZ5dbzCBGp2BYicGxHtDM3uWAQXl1v8", + "muxPlaybackId": "KR1168oeKTRM7ObejwocjM3mRelAeRp02cFut4nS5rC00" + }, + { + "streamDate": "2021-01-06T08:07:36.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2021-01-05.mp4", + "thumbnail": "content/ofhgro4a5tfbgqn6tpih5lvq-vod-74-thumb.png", + "ipfsCid": "bafybeigcaxflf6ckpp5ibhp3nxeee4wcaxxypzfhngry5jpw67jgmw32nu", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2021-01-05.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2020-02-20T10:06:47.000Z", + "notes": null, + "sourceVideo": "content/pmel-2020-02-19.mp4", + "thumbnail": "content/h9bx7iyacw0mc2mpbdbi97di-vod-9-thumb.png", + "ipfsCid": "bafybeiccnk7kg3a4nhe7c43v3c2xvob2qndfojghsopefl76clhmaojeua", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/pmel-2020-02-19.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2024-06-15T08:11:00.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2024-06-15.mp4", + "thumbnail": "content/vod-341-thumb.png", + "ipfsCid": "bafybeib772vov3wtrqz24p2egs6lscqmhg4gdpnythhlpq5mtfaeaih3oq", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2024-06-15.mp4", + "muxAssetId": "JQbvSiYLwvqTNsH5kxgUdoOJ2Edsq2szyiQ301dRkwlg", + "muxPlaybackId": "QsYohqfrAiyJbH1T02ex6NvsEMndgwRYdEjxiVu7pU3Y" + }, + { + "streamDate": "2024-10-31T22:31:00.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2024-10-31.mp4", + "thumbnail": "content/ttg45kdbpo5krltb6kgqcclt_projektmelody-chaturbate-2024-10-31.png", + "ipfsCid": "bafybeicfr2pcb2umxu4a42tlzwgfrsyabjevxyoylft3w42ptufhlizbzu", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2024-10-31.mp4", + "muxAssetId": "PjYOSnS6wD3b8F2I2IyKABjxIB0019OIzYOPPIHGxKco", + "muxPlaybackId": "g4QH86Kt12NTRklzcqIEB7sTLGfVEfesIitHtMLkEF4" + }, + { + "streamDate": "2020-02-09T10:40:10.000Z", + "notes": "This VOD is a pornhub rip. A higher quality original recording is desired.", + "sourceVideo": "content/projektmelody-chaturbate-20200209T014010Z-peervideo-rip.mp4", + "thumbnail": "content/ei6nnsb5eq0akhzt5ax97ytj_projektmelody-chaturbate-20200209T014010Z-peervideo-rip.png", + "ipfsCid": "bafybeidrs557pd3q4fz6tz3cmgdt7a5yhflgfhhf7ao2cgmsolkr4p6eem", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-20200209T014010Z-peervideo-rip.mp4", + "muxAssetId": "00Sm7jAaZjQ5YvrJ2WIG700P028LS2wc7ORmumw27bVKqI", + "muxPlaybackId": "FPiBLCtnzb9m00UWNNvs3q02EhPsqykb8GzwQcCMte4T00" + }, + { + "streamDate": "2024-12-24T12:38:00.000Z", + "notes": "VOD provided by lilprincess. Missing starting segment", + "sourceVideo": "content/projektmelody-original-try_0-2024-12-23-21-16-04.mp4", + "thumbnail": "content/zdjrjbvx35nt6p6k6b0heeiy_projektmelody-original-try_0-2024-12-23-21-16-04.png", + "ipfsCid": "bafybeiajbm5y5gsb4jifp6lufd42o3ovcz4i2ttlbpj5hiauhahonp5yiu", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-original-try_0-2024-12-23-21-16-04.mp4", + "muxAssetId": "Z8RoOmJkVYMtxQmU3fM6mNcqVqVwui02VZzYUfjYY51U", + "muxPlaybackId": "z8vuk62oKU6tHdNIUyy67DpwQQeFe2v72EXpXRTvcA00" + }, + { + "streamDate": "2025-06-14T08:19:00.000Z", + "notes": "IPFS CID bafybeicwjfl5652meebpctzm4ojkwkzpkoylsje2g4jil45532bnp4mxoa", + "sourceVideo": "content/projektmelody-chaturbate-2025-06-13.mp4", + "thumbnail": "content/projektmelody-chaturbate-2025-06-13-thumb.png", + "ipfsCid": null, + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2025-06-13.mp4", + "muxAssetId": "BTRGTuFnkeo64iiFbLkSUllqHeo2Qy9EuYb00Y9LiF5A", + "muxPlaybackId": "Hlsqi2NOE01dKe9nZtpFvUv4A2lT61FHQSXUqqm02H01Cs" + }, + { + "streamDate": "2021-09-04T05:59:09.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2021-09-03.mp4", + "thumbnail": "content/qswrgmk1qxyy2bbjsahlapru-vod-215-thumb.png", + "ipfsCid": "bafybeidtrnshqfj7i3xxmxwvf4srp7xvwgchd2djctptgk3pbfwexq2o4y", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2021-09-03.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2020-04-04T08:00:00.000Z", + "notes": "sssssss", + "sourceVideo": "content/049713b3-fcd3-406e-a9ca-fb5cf4c38132-Screencast_20230620_085543.webm", + "thumbnail": "content/clj4j25ku00037zpfgf6j4j0v-vod-273-thumb.png", + "ipfsCid": "", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/049713b3-fcd3-406e-a9ca-fb5cf4c38132-Screencast_20230620_085543.webm", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2000-01-01T09:00:00.000Z", + "notes": "45345345", + "sourceVideo": "content/c9286f5d-47cd-467f-90e2-90fd7853bb0c-strapi-user-nosave.mp4", + "thumbnail": "content/1707245390971-4934-vod-276-thumb.png", + "ipfsCid": "", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/c9286f5d-47cd-467f-90e2-90fd7853bb0c-strapi-user-nosave.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2025-06-17T08:31:00.000Z", + "notes": "Missing the first 25 minutes of stream\nIPFS CID bafybeidw3t5sno2czem6ljtu4qgtkixqllwnicyltic3aqx4uov5pi42du", + "sourceVideo": "content/2025-06-16-projektmelody-fansly_.mp4", + "thumbnail": "content/2025-06-16-projektmelody-fansly-thumb.png", + "ipfsCid": null, + "videoSrcB2": "https://futureporn-b2.b-cdn.net/2025-06-16-projektmelody-fansly_.mp4", + "muxAssetId": "u00F835qOV01PY01HqGbpvVFXmHjcvgQ302qAU02v73erPAQ", + "muxPlaybackId": "ZkwlSPZxIP3t00gcaTOO00VW3XEgyPVU5qH01b8QlwDFyM" + }, + { + "streamDate": "2024-06-25T16:29:00.000Z", + "notes": "This recording has one stream interruption at ~13 minute mark", + "sourceVideo": "content/projektmelody-chaturbate-2024-06-25.mp4", + "thumbnail": "content/projektmelody-chaturbate-2024-06-25.jpg", + "ipfsCid": "bafybeicgldij246i2nqwlnfdjkqsd4z2x7oxkhutzaoaqbiotfzlmff72i", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2024-06-25.mp4", + "muxAssetId": "2EaPnfU8902scM8S4GMROf9t018gVreSyNvbQXKDfsuSM", + "muxPlaybackId": "SQ00qfOnv8ucJiI9PDzcfYzDmcrbIYqcYK7nXof701gJk" + }, + { + "streamDate": "2024-12-10T13:18:00.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2024-12-10.mp4", + "thumbnail": "content/d4crbp20gh7x5pt3emd82x5d_projektmelody-chaturbate-2024-12-10.png", + "ipfsCid": "bafybeih5zpvisruyks26tyep4tx2lleoioe7s3ksgmanq6tjzyjakxl4fq", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2024-12-10.mp4", + "muxAssetId": "AEminnx01gOYUFeS9jYGsyLqk9p9GisqNE9vifhJPrGM", + "muxPlaybackId": "icNhmtpiS902xIR8YcHKZ2402Gx01i8y3emaLGYHiqVavw" + }, + { + "streamDate": "2024-12-29T12:13:00.000Z", + "notes": "IPFS CID bafybeigaumrd46cxb6wexyxmxejpyrliycc7lujtmett7pkmcnooe7viya", + "sourceVideo": "content/projektmelody-chaturbate-2024-12-28_2.mp4", + "thumbnail": "content/tn15pfcr8bij8rtmwkgsd2gi_projektmelody-chaturbate-2024-12-28_2.png", + "ipfsCid": null, + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2024-12-28_2.mp4", + "muxAssetId": "LffbYvTtTVdSkFV0002MfRygK01VGzv00STkeUjzw01Rb5NI", + "muxPlaybackId": "6fYUhDA3p9X5McpPz015ar2PNYogc9YZReumSnKL015Qw" + }, + { + "streamDate": "2025-02-24T09:07:00.000Z", + "notes": "IPFS CID bafybeig4yzrzcuv53ksj3fshkbxh4ps2md5yexscdpm43lqqps2q6ziefq", + "sourceVideo": "content/projektmelody-chaturbate-2025-02-23.mp4", + "thumbnail": "content/projektmelody-chaturbate-2025-02-23-thumb.png", + "ipfsCid": null, + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2025-02-23.mp4", + "muxAssetId": "u01dvjNBKtEhp001P974NlwEjJyqjj017USXvep02HnQ4tk", + "muxPlaybackId": "4029jfdI87DAs7oS4XLbG6kuPiiKUykPcVq8OBO1Y6mg" + }, + { + "streamDate": "2020-10-10T02:01:05.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2020-10-09.mp4", + "thumbnail": "content/hejh6ucarclwf386ros30iks-vod-61-thumb.png", + "ipfsCid": "bafybeiaeimkku5e7ivca34ijgc5d2h5hftndcax4e7cwoczb23ioum4qtq", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2020-10-09.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2021-09-13T06:03:47.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2021-09-12.mp4", + "thumbnail": "content/vq4tlbpkedy9f1ztef2k78fp-vod-117-thumb.png", + "ipfsCid": "bafybeiabfjdg3llpjqpzqvtehsbbhhehwq7n6dwu54x2flfpylhv5iv6nm", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2021-09-12.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2020-07-25T08:00:05.000Z", + "notes": null, + "sourceVideo": "content/projektmelody_2020-07-24_23-57-38.mkv", + "thumbnail": "content/q9vnwo6jxvjuxit1rvtnjpur-vod-47-thumb.png", + "ipfsCid": "bafybeia3utcqtuzu6sgcj5wuhpf7gtp5gwgcuvuj7bojeur2zu3um2tg6y", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody_2020-07-24_23-57-38.mkv", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2025-06-28T11:23:00.000Z", + "notes": "Recorded using ffmpeg. Recorded via Chaturbate\nMissing the first 26 minutes of stream.\n\nIPFS CID bafybeicuswqdgyuwxncbfb67ctfoq7p3ipelz5u6ptjgp66kfbbnxgqcpu", + "sourceVideo": "content/2025-06-28-projektmelody-chaturbate.mp4", + "thumbnail": "content/2025-06-28-projektmelody-chaturbate-thumb.png", + "ipfsCid": null, + "videoSrcB2": "https://futureporn-b2.b-cdn.net/2025-06-28-projektmelody-chaturbate.mp4", + "muxAssetId": "neAiOdCZqwWhGdvHbUlsCJ1usoTs3bXV7iGrLb2r01WY", + "muxPlaybackId": "VOBPSEB00LcKA4FMRWHmTvGxeJ202QO01Zpr01dzyN01qI68" + }, + { + "streamDate": "2024-12-31T12:41:00.000Z", + "notes": "IPFS CID bafybeihan6yj3z7ij3codvdmtzubbiwkjruomwic76mslxjdpj3iooj6bi", + "sourceVideo": "content/projektmelody-chaturbate-2024-12-31.mp4", + "thumbnail": "content/lu6h16lb584enrkfrx339p50_projektmelody-chaturbate-2024-12-31.png", + "ipfsCid": null, + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2024-12-31.mp4", + "muxAssetId": "XN58nbUlVPJ501YqpNCE3g3d5fE00lABoDUG8Ikgb3ih00", + "muxPlaybackId": "P9GsZ8M6wDk00KiV7R8J00zc64QG00pVTxlm7yjdKGsrXE" + }, + { + "streamDate": "2025-02-26T09:14:00.000Z", + "notes": "IPFS CID bafybeihbd3equ5qe7537qoyzn7gnysmlakvnn542kv6mapboehddtz2t7u", + "sourceVideo": "content/projektmelody-chaturbate-2025-02-26.mp4", + "thumbnail": "content/projektmelody-chaturbate-2025-02-26-thumb.png", + "ipfsCid": null, + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2025-02-26.mp4", + "muxAssetId": "N8r7EmcgfIrbtrKOeE201JN4NLY01kcMngT9nqx8ZjrOU", + "muxPlaybackId": "rhLj00z2ux8AWCZvjcUX8ok02aI0202IPFlGk400tR700LGd00" + }, + { + "streamDate": "2023-01-30T07:06:21.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2023-01-29.mp4", + "thumbnail": "content/svkvkwfxrmxej8p75s568xj0-vod-247-thumb.png", + "ipfsCid": "bafybeifgpfviyxjegacv5nwifojuis6molzvcnlulh6g3vx7l6f6kmx4ae", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2023-01-29.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2024-07-18T07:00:00.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2024-07-16-clyugvi9o00002067aezxb6wp.mp4", + "thumbnail": "content/projektmelody-chaturbate-2024-07-16-clyrhavkf000008l20j3v46hn.png", + "ipfsCid": "bafybeiabffnmvz7ui7p4h3l4gifkbdzxbbheuxu7j76gdsnsssxjgjbe5e", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2024-07-16-clyugvi9o00002067aezxb6wp.mp4", + "muxAssetId": "EfHDc00twMZwOYeNSodnh02FryCdvbfmRGL71goVASi7E", + "muxPlaybackId": "VZWUPgAOkQSMLflPYfNJPo5ZEoWIajDV01dnjW014zM4U" + }, + { + "streamDate": "2025-06-19T09:14:00.000Z", + "notes": "Missing first 30 minutes of stream. IPFS CID bafybeiga7gmyiy5bjczebeuj75wdfqix4qzprzfeggyqrtdvkskdectpzu", + "sourceVideo": "content/2025-06-19-projektmelody-chaturbate.mp4", + "thumbnail": "content/2025-06-19-projektmelody-chaturbate-thumb.png", + "ipfsCid": null, + "videoSrcB2": "https://futureporn-b2.b-cdn.net/2025-06-19-projektmelody-chaturbate.mp4", + "muxAssetId": "01wjtzxHi7CN6oQkHqKmiiAUAYZKRsf9y89w02wGyeSAg", + "muxPlaybackId": "k9Z5mSMTbMET3tNKekDWI4N78o2W4XJPZQfz1cVe02gM" + }, + { + "streamDate": "2025-09-17T08:45:00.000Z", + "notes": "bafybeihmsnbnqncsw57kohyfngrnhcxtn63gigolopxyedv2ogsaneorpu\n\nMagnet link magnet:?xt=urn:btih:45e62c667d5c3d873cf957f735e3030f1897abe9&xt=urn:btmh:12201039b0aca45c725772e00b4732c739853a5b1cf376b2bad63e0fda96912fa12f&dn=projektmelody-chaturbate-2025-09-04.mp4&xl=4705880110", + "sourceVideo": "content/projektmelody-chaturbate-2025-09-17.mp4", + "thumbnail": "content/projektmelody-chaturbate-2025-09-17-thumb.png", + "ipfsCid": null, + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2025-09-17.mp4", + "muxAssetId": "02lNmyhK3rJnPKDs253AnlPcaEgVDPZzWDxkJR02HLg9A", + "muxPlaybackId": "PzBFS7iBhX31GTbNnApuPQ3wn1AvvtuFHmBfIl13PC8" + }, + { + "streamDate": "2020-03-12T08:01:06.000Z", + "notes": null, + "sourceVideo": "content/pmel20200311.mp4", + "thumbnail": "content/uwyixm06a3x4fmvrdc87g628-vod-17-thumb.png", + "ipfsCid": "bafybeicsagfv5wicwpo3ity2phcu55osocogejgz52fk5xleak2fsptkse", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/pmel20200311.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2024-07-18T07:00:00.000Z", + "notes": null, + "sourceVideo": null, + "thumbnail": null, + "ipfsCid": null, + "videoSrcB2": null, + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2024-12-17T10:42:00.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2024-12-17.mp4", + "thumbnail": "content/hhvy3gtij4ichj0slkhw5w3g_original-20241216T010419Z.png", + "ipfsCid": "bafybeifv5ernx4riamb4rzs2x2tebyjywl22eehodm4rddrvvdvxqok3ce", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2024-12-17.mp4", + "muxAssetId": "ppLfR9nmuTPimKqInllW00BztED700ticX9PVBWKvzMbA", + "muxPlaybackId": "fnAV4zUuVagoXOHqK00qJXiRnAz17px3UD01lej46y7EE" + }, + { + "streamDate": "2025-07-03T09:05:00.000Z", + "notes": "\nRecorded using ffmpeg. Recorded via Chaturbate\n\n\nIPFS CID bafybeie6m3ygmovb6f4a34mw3cjt3wy3mlkggv5wfo4ihqcramqws2pgc4", + "sourceVideo": "content/2025-07-03-projektmelody-chaturbate.mp4", + "thumbnail": "content/2025-07-03-projektmelody-chaturbate-thumb.png", + "ipfsCid": null, + "videoSrcB2": "https://futureporn-b2.b-cdn.net/2025-07-03-projektmelody-chaturbate.mp4", + "muxAssetId": "qYRK02JxMU95KETmWdx32orlrUrli2hy2VobRg413aZQ", + "muxPlaybackId": "tywDe00BQX8AVkiPjZZj5026c5015Ol0202bLMgItm28HlSA" + }, + { + "streamDate": "2025-01-01T12:11:00.000Z", + "notes": "IPFS CID bafybeibsxxls5r47k2ptfnm3yvo7whnrb2zrcz5uiisoef2erg3d2shk5m", + "sourceVideo": "content/projektmelody-chaturbate-2025-01-01.mp4", + "thumbnail": "content/w6ygid2hcpml2bps1ffbn968_projektmelody-chaturbate-2025-01-01.png", + "ipfsCid": null, + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2025-01-01.mp4", + "muxAssetId": "W02hR02Ub2ckmAQq3xNJ6rVniYoz4rRlDdFp4N8Um9vMo", + "muxPlaybackId": "400402oP7S6yPfJ02lTZnOM1MUquDIUMljeLGCW2X5SbHk" + }, + { + "streamDate": "2025-03-01T10:05:00.000Z", + "notes": "IPFS CID bafybeibibupzzsmqawn6k73i2j5u6ibojkjociawkwem3jzqq3loziyjpa", + "sourceVideo": "content/projektmelody-chaturbate-2025-02-28.mp4", + "thumbnail": "content/projektmelody-chaturbate-2025-02-28-thumb.png", + "ipfsCid": null, + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2025-02-28.mp4", + "muxAssetId": "ZaKZ7DyvDnZFSW3W1ZgUtzMwyNI8KomTijTH3QkE61s", + "muxPlaybackId": "CqLc63FJiNxhLQokuherJKLEcQ5mr6L00zWO5Q9Hz9G8" + }, + { + "streamDate": "2025-03-06T05:33:00.000Z", + "notes": "IPFS CID bafybeie5e7ufmcymmmmy67zaetkcbgmvq2xoytgzr7pro4brmtdidqcmsi", + "sourceVideo": "content/projektmelody-chaturbate-2025-03-05.mp4", + "thumbnail": "content/projektmelody-chaturbate-2025-03-05-thumb.png", + "ipfsCid": null, + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2025-03-05.mp4", + "muxAssetId": "mHuggYNyVc2QoMcPXD8kpg02dBgBTMRyNBVq9ZMADZzQ", + "muxPlaybackId": "f1EqApPBNkjilP61IXCAw700Z99spCMdzJQs5565wsec" + }, + { + "streamDate": "2020-06-21T08:09:09.000Z", + "notes": null, + "sourceVideo": "content/projektmelody_2020-06-20_23-58-43.mkv", + "thumbnail": "content/vxynbg8g1rniuk62li4gfxo6-vod-41-thumb.png", + "ipfsCid": "bafybeihtspswyyjcz7zcnvfmldzpp6eioarry7apmmplv7wg3xrx5bh4wa", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody_2020-06-20_23-58-43.mkv", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2025-01-05T12:01:00.000Z", + "notes": "IPFS CID bafybeifmraz7fwtluagdie7q22qskszls35onwuualk2bee3f6xxu7m5nq", + "sourceVideo": "content/projektmelody-chaturbate-2025-01-05.mp4", + "thumbnail": "content/l9nai4j8zp9ci45vra2772ab_projektmelody-chaturbate-2025-01-05.png", + "ipfsCid": null, + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2025-01-05.mp4", + "muxAssetId": "QoMpWeNVtKdOEPYnomRWPhdGhs5sdmTJDgGkCXRNG1E", + "muxPlaybackId": "UsiU9SvxF9cYXI1KJJ01P7ko6GWYfAvIwgEMLjcZHaqQ" + }, + { + "streamDate": "2025-07-15T07:47:00.000Z", + "notes": "Recorded using ffmpeg. Recorded via Chaturbate. Mel went offline several times.\n\nIPFS CID bafybeibj73z7ymapho4bncxefwaklzubnmieppxvoxmpkfsffglz2sokii", + "sourceVideo": "content/projektmelody-chaturbate-2025-07-15.mp4", + "thumbnail": "content/projektmelody-chaturbate-2025-07-15-thumb.png", + "ipfsCid": null, + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2025-07-15.mp4", + "muxAssetId": "BfmbmpQRFtw02lQ5vsYXcmUYp3rV01QrYkAUy76mStYLE", + "muxPlaybackId": "iLuBN7MbaPEN9XVXvAlVXaMkBuUjx4MSTyuHAdcdcd00" + }, + { + "streamDate": "2024-07-20T10:31:00.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2024-07-18.mp4", + "thumbnail": "content/ti8ht9bgwj6k783j7hglfg8j_projektmelody-chaturbate-2024-07-18.png", + "ipfsCid": "bafybeiexzugcuky6lbfcxycusrharpc4c6x7rcex2sowuj3kmhk3d4xwli", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2024-07-18.mp4", + "muxAssetId": "jGmQ5uw8apQlVyBp8MoY2XKxolL8w9byXprZodROmpM", + "muxPlaybackId": "5yNvLlVkSc891HqkGWFBaOXJ1oTAHulpre8dNZXn2WM" + }, + { + "streamDate": "2024-12-19T12:30:00.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2024-12-19.mp4", + "thumbnail": "content/mo2psuxi98lrfco0nvkwlra1_projektmelody-chaturbate-2024-12-19.png", + "ipfsCid": "bafybeidvcexrymydon5tskezpuryb7tnpljc7o6lu6ejrffvhrg4rasm6i", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2024-12-19.mp4", + "muxAssetId": "SPb02z2ggMEOenBYcT02D2n7OAFAE8VPZ8ogL1pikQYcY", + "muxPlaybackId": "NDcCWK3NjSD00wet5EFxeNSm01AA7s004Cc9wPGjmM2dHQ" + }, + { + "streamDate": "2020-09-29T04:14:36.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-20200928T201436Z.mp4", + "thumbnail": "content/av2tq9ogkvmepop3ei6qk95n-vod-58-thumb.png", + "ipfsCid": "bafybeiem46df6x6fv3fuplwz7jxk7qiwfpoowwt2nov4wsomfy27yuh66i", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-20200928T201436Z.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2021-12-26T07:34:35.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2021-12-25.mp4", + "thumbnail": "content/qz1egqc4ivd1hvqi740v3hxr-vod-133-thumb.png", + "ipfsCid": "bafybeihpvf4mtxcz4usufix7slgd7cpsd4kxxu6uwlbddpndub6n3iywyq", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2021-12-25.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2025-03-17T08:17:00.000Z", + "notes": "IPFS CID bafybeihkq67fvn72kuthd2f65fzn7be3a6binle3a2oszxn43qvy4iy5hi 2025-03-16-projektmelody-fansly.mp4\n", + "sourceVideo": "content/2025-03-16-projektmelody-fansly.mp4", + "thumbnail": "content/2025-03-16-projektmelody-fansly-thumb.png", + "ipfsCid": null, + "videoSrcB2": "https://futureporn-b2.b-cdn.net/2025-03-16-projektmelody-fansly.mp4", + "muxAssetId": "rO3mw7qndnwnRvHx3ozBaOFDq6L02svPYVxwQR027FsgU", + "muxPlaybackId": "o2evaWfZia00dLEGdKNgHl3tyw01o3RqHiYAktf00HEdJI" + }, + { + "streamDate": "2025-07-17T09:02:00.000Z", + "notes": "Recorded using ffmpeg. Recorded via Chaturbate. \n\n\nIPFS CID bafybeie6fvorh3ydohd33wwfhsloytszja5kru6cpf54rlnasvqexm3k3a", + "sourceVideo": "content/projektmelody-chaturbate-2025-07-17.mp4", + "thumbnail": "content/projektmelody-chaturbate-2025-07-17-thumb.png", + "ipfsCid": null, + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2025-07-17.mp4", + "muxAssetId": "gwOyMwXsYaViwugaWXJqeZguoJeVv3leSNdxqdlsLT00", + "muxPlaybackId": "IxGOD1ypLhvjhoxrSnL301rSsiDY00JkF2N01yLg9S9GWU" + }, + { + "streamDate": "2024-08-11T08:33:00.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2024-08-10.mp4", + "thumbnail": "content/nvgxqw38kf2nlzayj05mscl6_projektmelody-chaturbate-2024-08-10.png", + "ipfsCid": "bafybeifz7mc2nq2koff66tqpeqyqdufi7dymdlxw26asoouwhqtzhp2xpe", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2024-08-10.mp4", + "muxAssetId": "j9FRuyAqEE1Uc01p00ITKyLzJsabWxuNQpFDfwVO45buQ", + "muxPlaybackId": "fd1bj00U8tfVU9Z1T3HXuG4VXhihMDhUy4WCje9rfg0200" + }, + { + "streamDate": "2020-07-18T09:14:51.000Z", + "notes": null, + "sourceVideo": "content/projektmelody_2020-07-18_01-11-56.mkv", + "thumbnail": "content/of7q1d3kyou3zue9gvb8xg9b-vod-46-thumb.png", + "ipfsCid": "bafybeigb73lspj5w74uqiokew3fxi3y2su7xrfkmdwjpfnolzfewxirpwu", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody_2020-07-18_01-11-56.mkv", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2020-06-24T04:00:12.000Z", + "notes": null, + "sourceVideo": "content/projektmelody_2020-06-23_19-56-33.mkv", + "thumbnail": "content/oide9dkr9dmmidkknv4tv47q-vod-42-thumb.png", + "ipfsCid": "bafybeihrixodbrz2iniq67tlvm5woau6tfm77ryeskmis5id7gobv4dxhy", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody_2020-06-23_19-56-33.mkv", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2025-09-21T08:18:00.000Z", + "notes": "Recorded using ffmpeg. Recorded via Chaturbate. \n\nIPFS CID bafybeihke4gbtininv4qqps5v7lng76zdeuklrs7krvcvvvbdx6azj6jcu\n\nMagnet link magnet:?xt=urn:btih:93ebae5d7c8e8e2abc045dd526c78e16db83b16f&xt=urn:btmh:12202cb37ae52cdbce5f04c89891a8edf6d3acbba7bf8b3aff5e91a347e3e7f06685&dn=projektmelody-chaturbate-2025-09-21.mp4&xl=16032506790", + "sourceVideo": "content/projektmelody-chaturbate-2025-09-21.mp4", + "thumbnail": "content/projektmelody-chaturbate-2025-09-21-thumb.png", + "ipfsCid": null, + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2025-09-21.mp4", + "muxAssetId": "e2IUaAxyr012026Oidrwxf0224d00KyhwCIVID9yqjczlpg", + "muxPlaybackId": "v6nfg4PcStObBHi2caApgS01EtfUtSfWGo3TwQx00sW00k" + }, + { + "streamDate": "2020-03-02T06:06:17.000Z", + "notes": "this is a PH rip", + "sourceVideo": "content/Projekt_Melody_3-01-20_Stream-ph5e68977d3dd49.mp4", + "thumbnail": "content/a7mnljlwqk7nnkq82qbfgy6f-vod-22-thumb.png", + "ipfsCid": "bafybeibssurtysmyyrjsf6hyt2wzlu5bzpxk5guaov7dx6d5r7tizavhyu", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/Projekt_Melody_3-01-20_Stream-ph5e68977d3dd49.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2023-09-25T09:45:00.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2023-09-25.mp4", + "thumbnail": "content/mp9mgcrahb4jxkd0ubustqrs-vod-302-thumb.png", + "ipfsCid": "bafybeidkksxhrsisb4sijwowxxipr6omvmtylzumyc5zpyzh2tghbma5gm", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2023-09-25.mp4", + "muxAssetId": "wly5c2Fzn23lN8PimI01glukVI9iJHzEXy23NqBg01bfQ", + "muxPlaybackId": "SsvuA5AgHU51PpEuI01kKYNdRwgbL2lzXSzcwQ2qrl2c" + }, + { + "streamDate": "2025-03-18T11:21:00.000Z", + "notes": "IPFS CID bafybeiboah2jnzbhdp6jovahzru34j464tt6z2rj2clle66looznngaksi\n", + "sourceVideo": "content/2025-03-17-projektmelody-fansly.mp4", + "thumbnail": "content/2025-03-17-projektmelody-fansly-thumb.png", + "ipfsCid": null, + "videoSrcB2": "https://futureporn-b2.b-cdn.net/2025-03-17-projektmelody-fansly.mp4", + "muxAssetId": "c00WN1n12BtMCrwXxekhpS02UACt8aMPwWETqsLenwmqI", + "muxPlaybackId": "dHhw5g3y1dApKwWnBp3zfIuhjA6nVlZQ48p00mcFt1Tc" + }, + { + "streamDate": "2025-07-19T08:25:00.000Z", + "notes": "Recorded using ffmpeg. Recorded via Chaturbate. \n\nIPFS CID bafybeieltvgop6lf5novl77bzjbk5tepzu5zx7orgmggokzzyvza4vh6c4", + "sourceVideo": "content/projektmelody-chaturbate-2025-07-19.mp4", + "thumbnail": "content/projektmelody-chaturbate-2025-07-19-thumb.png", + "ipfsCid": null, + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2025-07-19.mp4", + "muxAssetId": "EJryv01phl2ixR3uCdonu4aEkfuoR5SnmyQDHBomPBtQ", + "muxPlaybackId": "3Ma1WSy3XxRmwGXx004PwEvGHmKahMJzSP5FjyziCX8Q" + }, + { + "streamDate": "2024-09-01T09:16:00.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2024-08-31.mp4", + "thumbnail": "content/nfcrp73apyho5c7lc58memwm_projektmelody-chaturbate-2024-08-31.png", + "ipfsCid": "bafybeidlv6yeta4v7wop22wylq23wqmplryk66bsa7sb3snzwt7d7zsmqm", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2024-08-31.mp4", + "muxAssetId": "m8S4iKGH02Zmp1bnUO02whPSr4oh900nezbAhERCN6RIuY", + "muxPlaybackId": "6hjRMomIMraPAzYARMXvxmMQfmyV7Zldukd02VAH9quY" + }, + { + "streamDate": "2025-01-11T11:18:00.000Z", + "notes": "IPFS CID bafybeid6sckjqgnss4vlfsetes2nwuoedew7cx37ez3l2vmglp65mphlqa", + "sourceVideo": "content/projektmelody-chaturbate-2025-01-11.mp4", + "thumbnail": "content/kk4hso3pttoaxxcd8ou8sz9p_projektmelody-chaturbate-2025-01-11.png", + "ipfsCid": null, + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2025-01-11.mp4", + "muxAssetId": "U6jxhlWa4UHuXgS5WNombeBHxo0295Orf700iO9WB2mmg", + "muxPlaybackId": "Wu2P3okDCGRUTpCmVWuNxXrM1oV02ZWA78RKuR5o6apU" + }, + { + "streamDate": "2021-07-04T06:04:50.000Z", + "notes": null, + "sourceVideo": "content/projektmelody+2021-07-03+18_54.mp4", + "thumbnail": null, + "ipfsCid": "bafybeiecggca5yoz6vdh2icdbp5i5ypcmoxh7ayrbyj4cpimnzx3p4cghu", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody+2021-07-03+18_54.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2021-11-05T06:03:43.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2021-11-04.mp4", + "thumbnail": "content/yg7e9vdmft1iqx2dyxj3pemq-vod-124-thumb.png", + "ipfsCid": "bafybeihrkmpibgetxr2w4ee26wzscwi4qrkpwmrdclthlxnnvuaudk3yki", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2021-11-04.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2025-07-21T08:11:00.000Z", + "notes": "Recorded using ffmpeg. Recorded via Chaturbate. \n\nIPFS CID bafybeigmhx3kkzij5vxq3jhvyyvshrtxwaecqdnkg5w7fefxlwayzksfsq\n\nseveral raw clips, assumedly from mel's internet issues", + "sourceVideo": "content/projektmelody-chaturbate-2025-07-21.mp4", + "thumbnail": "content/projektmelody-chaturbate-2025-07-21-thumb.png", + "ipfsCid": null, + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2025-07-21.mp4", + "muxAssetId": "EBj011ChZnpzMg1FjM7IhvtWeR9c43B42Ffl86FpyzMQ", + "muxPlaybackId": "01nsBcykmNfps4K1sfJYO94SFHJ02lrzvBuMzuwxCCn2o" + }, + { + "streamDate": "2025-09-18T02:25:00.000Z", + "notes": "Recorded using ffmpeg. Recorded via Fansly. Missing the first 15 minutes\n\nIPFS CID bafybeif37n3hxnmunfalof63w63lnhtwrnsi2tenwhkwqnpsxswn2d5vpu\n\nMagnet link magnet:?xt=urn:btih:fc2256c956813e5ab145d67824c026035d8e02fb&xt=urn:btmh:12204003937e2af78851041603d5b0efac349ae1556d44e54481c6394923c69b131d&dn=projektmelody-fansly-2025-09-17.mp4", + "sourceVideo": "content/projektmelody-fansly-2025-09-17.mp4", + "thumbnail": "content/projektmelody-fansly-2025-09-17-thumb.png", + "ipfsCid": null, + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-fansly-2025-09-17.mp4", + "muxAssetId": "H4OoRCQw1zuM75mBJsOk00NQT5f01yNML4rgo2ggq2W38", + "muxPlaybackId": "XT00ueHsAKGcb78M17zXYBTHAUYuSjHBpXq01h3uP01aH4" + }, + { + "streamDate": "2024-09-13T08:14:00.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2024-09-12.mp4", + "thumbnail": "content/gpc5ebcjbcwl1awr4wkasc2r_projektmelody-chaturbate-2024-09-12.png", + "ipfsCid": "bafybeibkpjmtvqwzfqfrufdgwojqycspxxi4wnjr2ur6lr54gjjd4b3zka", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2024-09-12.mp4", + "muxAssetId": "bL8WYRJTF4ZUblSICdYzfhhMd2BCRouILSeSlE02a8Rs", + "muxPlaybackId": "00DD7IxhLcrY7mEndhMCsVVClgQxrd5fqwAOflkwjkOM" + }, + { + "streamDate": "2025-01-10T11:48:00.000Z", + "notes": "VOD provided by lilprincess\nIPFS CID bafybeib2o5bqdxyvqdeq37jrgdp2ooozptcl5jiuwczvectte46ipu3dyq", + "sourceVideo": "content/original-20250109T020401Z.mp4", + "thumbnail": "content/fftpgjjvwpvsbg4rsz4uo64f_original-20250109T020401Z.png", + "ipfsCid": null, + "videoSrcB2": "https://futureporn-b2.b-cdn.net/original-20250109T020401Z.mp4", + "muxAssetId": "5kDIC79gTKlTk5XA6dyvkvG014utrEi5KCuA01WsTCnyU", + "muxPlaybackId": "Sv4BcxVPjoeIeUoTYajiYtp02aYdCYezz6bSSVj02LnBc" + }, + { + "streamDate": "2025-03-20T10:04:00.000Z", + "notes": "IPFS CID bafybeib6cyw45cswtwyxml672byqbatjrrkcmjedpkqwbh32i5rtwjhxwm", + "sourceVideo": "content/2025-03-19-projektmelody-fansly.mp4", + "thumbnail": "content/2025-03-19-projektmelody-fansly-thumb.png", + "ipfsCid": null, + "videoSrcB2": "https://futureporn-b2.b-cdn.net/2025-03-19-projektmelody-fansly.mp4", + "muxAssetId": "wO52LKEvcC1kXwUnCZBoLXCpnxCKPZ7ypLThyFCUsIU", + "muxPlaybackId": "wHp014zgW23mAFFsV4DSNHhpB35qMU1eIjvSzmyhxaew" + }, + { + "streamDate": "2022-05-09T06:51:40.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2022-05-08.mp4", + "thumbnail": "content/panxsmzzz4b3vkyh24azxc9b-vod-149-thumb.png", + "ipfsCid": "bafybeibpvqix7oyy77btrxrg7exacmwcxciigwpc3kolu7jiemlnx6rf2m", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2022-05-08.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2022-04-06T08:02:17.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2022-04-06.mp4", + "thumbnail": "content/vja9lp70jq07y047iennpjtm-vod-144-thumb.png", + "ipfsCid": "bafybeicnsljyulw66qqrff6omzac7wha425i2okolymqelkpq7tbipy23y", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2022-04-06.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2025-08-24T08:00:00.000Z", + "notes": "Recorded using ffmpeg. Recorded via Chaturbate. One stream interruption due to CB asking Mel to verify her ID\n\nIPFS CID QmY8aSB3hrz8C8JQQJe3tyhdwEVb4SLPmLWMGJRFmrhcjq\n\nMagnet link magnet:?xt=urn:btih:E7VYYASCKAKV6ZPVVK7W26OXLQCDWR2Q&dn=projektmelody-chaturbate-2025-08-24.mp4&xl=15381208938", + "sourceVideo": "content/projektmelody-chaturbate-2025-08-24.mp4", + "thumbnail": "content/projektmelody-chaturbate-2025-08-24-thumb.png", + "ipfsCid": null, + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2025-08-24.mp4", + "muxAssetId": "plF9SOCNSjShB01WDXPRV5hBwvb5WklG8VrerXkqmFuI", + "muxPlaybackId": "Y6v01ddJ3gHa3MEZVJnn6Oab6zIWNrRxHxM5XvR01wcbk" + }, + { + "streamDate": "2025-03-26T16:00:00.000Z", + "notes": "IPFS CID bafybeibbjezpu2oss5th6zrendinmbwlmwysjz73fw4ilor73fwqjbawsq", + "sourceVideo": "content/projektmelody-fansly-2025-03-26.mp4", + "thumbnail": "content/projektmelody-fansly-2025-03-26-thumb.png", + "ipfsCid": null, + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-fansly-2025-03-26.mp4", + "muxAssetId": "7fv1z9KhHuJ01wc3gpvrUW8lr00mq02HjHHEGsuahol32U", + "muxPlaybackId": "00weOtSGChgk8CCKseQruB1Jm5MGATiXLxVf9s8VpHQA" + }, + { + "streamDate": "2024-09-15T07:20:00.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2024-09-15.mp4", + "thumbnail": "content/udlcyb7h4fsejdy0i3dl8muz_projektmelody-chaturbate-2024-09-15.png", + "ipfsCid": "bafybeidumpjfylpgl2mgdlbjfrumotill7sxahgeo5zvk7fnqykeipi4w4", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2024-09-15.mp4", + "muxAssetId": "duigNfvnep02hULgp02P6P7jDzajuHDscFDRUK4z1jBLo", + "muxPlaybackId": "sF01ZajOMKbII4hB19DhY2AzrNII1wVBaTAoVyYmNtks" + }, + { + "streamDate": "2025-01-17T13:45:00.000Z", + "notes": "vod provided by lilprincess\nIPFS CID bafybeiflplj3d5owuharfcjrjzdrp7r767zancv3fbo3iyc6idcf3nxkaa\n", + "sourceVideo": "content/original-20250117T044206Z.mp4", + "thumbnail": "content/original-20250117T044206Z-thumb.png", + "ipfsCid": null, + "videoSrcB2": "https://futureporn-b2.b-cdn.net/original-20250117T044206Z.mp4", + "muxAssetId": "Kkc4QpiJIixS01SfAak9EXdth02y4iY01rTybXhRT101bD00", + "muxPlaybackId": "dR00meXYXPngujZOwENs3h61ZKf7YVwOvVjQCf88FRmc" + }, + { + "streamDate": "2020-05-17T08:07:30.000Z", + "notes": null, + "sourceVideo": "content/pmel-chaturbate-2020-05-016.mp4", + "thumbnail": "content/u28z62ndwr3xvxkdej2f07w0-vod-172-thumb.png", + "ipfsCid": "bafybeiejsr5qtrorw2gqjzfun6ryptqlf3ykwozklnyyxflilcn24mz6iu", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/pmel-chaturbate-2020-05-016.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2020-08-22T08:03:48.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-20200822T000348Z.mp4", + "thumbnail": "content/ufcddqgkgkkhh9wjrowjp8dm-vod-180-thumb.png", + "ipfsCid": "bafybeife7faqnxwrrpdqqphbyl4ldh4ah7sw4ng7ee6vzyhxlxeajanelm", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-20200822T000348Z.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2025-04-12T11:25:00.000Z", + "notes": "IPFS CID bafybeiek4p3yxdfmd4it4kmvvshumz4ptxvuugsgdsxr2ix4eavaki232y", + "sourceVideo": "content/projektmelody-chaturbate-2025-04-11.mp4", + "thumbnail": "content/projektmelody-chaturbate-2025-04-11-thumb.png", + "ipfsCid": null, + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2025-04-11.mp4", + "muxAssetId": "LPmwYy3DJ891wVCELCKkF6vLOK6TuS4kvAmb01q7fnRo", + "muxPlaybackId": "KZaJeGscJK9crNXXz6esCTp00hCzmaEphf3fDPBD4pAM" + }, + { + "streamDate": "2024-09-19T09:08:00.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2024-09-19.mp4", + "thumbnail": "content/f0w2om8ec0a2de4f7x84aec9_projektmelody-chaturbate-2024-09-19.png", + "ipfsCid": "bafybeienrm7weoec7yxzb5neafypquqb7y2euk6x2nxcfoea5bdoxzcur4", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2024-09-19.mp4", + "muxAssetId": "3s802gPVfGl3BnwCUhOl99eMmpDtrsJag7iwbezQzaDA", + "muxPlaybackId": "g5xNuikt6ERhF01hSpaOXZfNVvez7ZGS4HAly98l5nRc" + }, + { + "streamDate": "2025-01-19T11:07:00.000Z", + "notes": "ripped from https://onlyfans.com/1496559949/projektbutt", + "sourceVideo": "content/projektmelody-chaturbate-2025-01-17.mp4", + "thumbnail": "content/projektmelody-chaturbate-2025-01-17-thumb.png", + "ipfsCid": null, + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2025-01-17.mp4", + "muxAssetId": "LdclLBCKptWKs00QubVoNmZB5HNaRiY2MxQOLLCU7CXk", + "muxPlaybackId": "V4r6Ud8CWVT97w8POMuSSPocignN01DOhpIuSpjqIJlA" + }, + { + "streamDate": "2025-08-25T08:29:00.000Z", + "notes": "Recorded using ffmpeg. Recorded via Chaturbate.\n\nIPFS CID bafybeiczqopzcv433rhbgbtlzg63ehji7kaqbl5rflr7wiaz7nv5dimjn4\n\nMagnet link magnet:?xt=urn:btih:049ec5a2d28a8e2ea9e9890a3f697f5536ed26fb&dn=projektmelody-chaturbate-2025-08-25.mp4&xl=16336940250&ws=https%3A%2F%2Ffutureporn-b2.b-cdn.net%2Fprojektmelody-chaturbate-2025-08-25.mp4", + "sourceVideo": "content/projektmelody-chaturbate-2025-08-25.mp4", + "thumbnail": "content/projektmelody-chaturbate-2025-08-25-thumb.png", + "ipfsCid": null, + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2025-08-25.mp4", + "muxAssetId": "iddjM02p1Kc7CgVaLGT9ZNAwQIyOz5jOefVslfk38JWXqQ", + "muxPlaybackId": "feFL024D00hwbNwH6lDUoOv147LsevyEF8QpEptzEusww" + }, + { + "streamDate": "2025-09-24T08:22:00.000Z", + "notes": "Recorded using ffmpeg. Recorded via Chaturbate. \n\nIPFS CID bafybeihgwrygemf5fwmn5oa62i6wlput7gsulyhlh7zrzmnl6ijtc73dc4\n\nMagnet link magnet:?xt=urn:btih:3d9f05580c30979b1b25aec58965f902f7e377f4&xt=urn:btmh:122051ac1f8e0676d01aca81b8bcfb379e8b1ed8ceb9880954c75d3b4adf742f5119&dn=projektmelody-chaturbate-2025-09-24.mp4&xl=14725296717", + "sourceVideo": "content/projektmelody-chaturbate-2025-09-24.mp4", + "thumbnail": "content/projektmelody-chaturbate-2025-09-24-thumb.png", + "ipfsCid": null, + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2025-09-24.mp4", + "muxAssetId": "NSkuduth8d5QIalfTReHwlPUHX5Rk2DDGRoiKQq2gsk", + "muxPlaybackId": "lvWi3F01yrwKJhl2r00dlewGqNEXlI2qDPLznyrkaddmI" + }, + { + "streamDate": "2020-08-29T07:03:16.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-20200828T230316Z.mp4", + "thumbnail": "content/iefuhg4a9vzybtfv2m88rzsv-vod-199-thumb.png", + "ipfsCid": "bafybeicigkh3htpafr6ycxyaznco74qb36gkox3gpv43djlvh37acghbhq", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-20200828T230316Z.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2025-04-15T10:11:00.000Z", + "notes": "IPFS CID bafybeifjsmysysz5p7h3btw4cxzd3xfnvgpc6znfq4qrvtm3zjh55g5pvi", + "sourceVideo": "content/projektmelody-chaturbate-2025-04-14.mp4", + "thumbnail": "content/projektmelody-chaturbate-2025-04-14-thumb.png", + "ipfsCid": null, + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2025-04-14.mp4", + "muxAssetId": "Du00QCO6mi300nDOdJ7gSIIdP02DFj3Tb6Ns8sH1tJ6kY8", + "muxPlaybackId": "AfLZEtmxhU00m3D3IsnQ4kM5yuoRmXECtDYCbJ93PCvQ" + }, + { + "streamDate": "2025-08-27T08:48:00.000Z", + "notes": "Recorded using ffmpeg. Recorded via Chaturbate.\n\nIPFS CID bafybeigcndizrzbz7bbwevgcgmmy3uz53wxe2fgc6l7fiod5y6ht4kvsqa\n\nMagnet link magnet:?xt=urn:btih:d72d3b98a4219f5041896e04c64391a4a31ebbf9&dn=projektmelody-chaturbate-2025-08-27.mp4&ws=https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2025-08-27.mp4\n\none interruption as Mel restarted her cube", + "sourceVideo": "content/projektmelody-chaturbate-2025-08-27.mp4", + "thumbnail": "content/projektmelody-chaturbate-2025-08-27-thumb.png", + "ipfsCid": null, + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2025-08-27.mp4", + "muxAssetId": "EBGcAk4fnT12QCPI7S402nhFkfU4kY8psUMgmLwHq54Q", + "muxPlaybackId": "hw502Y026kV02klFgicnidUa01JOrp4XmlvNOgq9YPqd1w00" + }, + { + "streamDate": "2024-09-26T09:34:00.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2024-09-25.mp4", + "thumbnail": "content/y6sn2ko3oldrau3dloc08cda_projektmelody-chaturbate-2024-09-25.png", + "ipfsCid": "bafybeibtjqf4en45qkcjkvkjcj2nav277dnamfg6zxhh4uo6z5um3hiy7a", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2024-09-25.mp4", + "muxAssetId": "VLVgCvYu2e9eRf1pE02GMSTw49xYxMZ5gMbFfOeQxJoo", + "muxPlaybackId": "01RsvqjqkkTp9ZsR02Yi62ZrKzdngWCwZCTSRvb5hrpb00" + }, + { + "streamDate": "2025-09-26T20:15:00.000Z", + "notes": "Recorded using ffmpeg. Recorded via Chaturbate. \n\nIPFS CID bafybeia4krprru4mzyh6jepnaol6erdtzs4cemdmma6thdqa5qt3qwrwj4\n\nMagnet link magnet:?xt=urn:btih:c5f66f482f923e52cd2e2a5b4074a5b2c29e27d0&xt=urn:btmh:12203e6b724cbc70b2b570ce701a8c0a5390b0df8dd4228efba369dd5f76e95c05bc&dn=projektmelody-chaturbate-2025-09-27.mp4&xl=11622536946", + "sourceVideo": "content/projektmelody-chaturbate-2025-09-27.mp4", + "thumbnail": "content/projektmelody-chaturbate-2025-09-27-thumb.png", + "ipfsCid": null, + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2025-09-27.mp4", + "muxAssetId": "Sq45uvX3HaYSvhqVJiFTgnDbgLA8bxFoM3DyRBtOiug", + "muxPlaybackId": "YU7wf4x6TSvtChwkTxRQeSMGiL38CcdIH6f006HzsqAA" + }, + { + "streamDate": "2025-01-24T11:56:00.000Z", + "notes": "IPFS CID bafybeihzm47kfvh5okw2q5zxymf3yl7edydw6d2lkmm3cndlcy5pvy3qky", + "sourceVideo": "content/projektmelody-chaturbate-2025-01-24.mp4", + "thumbnail": "content/projektmelody-chaturbate-2025-01-24-thumb.png", + "ipfsCid": null, + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2025-01-24.mp4", + "muxAssetId": "ensP2CUTpnLDbq7yPHZEQRqIx5E3YW701P8jLkGoCy44", + "muxPlaybackId": "8mVH02yJuuMY6Xv2biNC9eEm7yTYTbL9BhyeBurmulZY" + }, + { + "streamDate": "2025-08-28T01:58:00.000Z", + "notes": "Recorded using ffmpeg. Recorded via Fansly.\n\nIPFS CID bafybeiahvh2tteoqes2rxjlfae7fhbc7donyfxnx2gbff4ckpn5t2ungxq\n\nMagnet link magnet:?xt=urn:btih:9ccdf90fe4115da9764b62876c9ec35bb8d0c9e6&dn=projektmelody-fansly-2025-08-27.mp4&xl=9103454716&ws=https%3A%2F%2Ffutureporn-b2.b-cdn.net%2Fprojektmelody-fansly-2025-08-27.mp4", + "sourceVideo": "content/projektmelody-fansly-2025-08-27.mp4", + "thumbnail": "content/projektmelody-fansly-2025-08-27-thumb.png", + "ipfsCid": null, + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-fansly-2025-08-27.mp4", + "muxAssetId": "efXZHXK01v2GFBd8sYSRguylOw029PKKd36WHZwaC1j8A", + "muxPlaybackId": "TemcU4WFixaMke4M5pJc4Yz8Tu02D1K01EI01dse02i2UIY" + }, + { + "streamDate": "2025-10-05T08:45:00.000Z", + "notes": "Recorded using ffmpeg. Recorded via Chaturbate. \n\nIPFS CID bafybeifecacyudr6fp7egzcsw3tajrod7iv673mp22nxegunq2hhptmyym\n\nMagnet link magnet:?xt=urn:btih:058e8e355734a3f059bce22da8b5d4bcc5a63ff7&xt=urn:btmh:1220926ab049412b63263ba009fab8f980c3d5796109915d3f02b747cfd47c7e693e&dn=projektmelody-chaturbate-2025-10-05.mp4&xl=12853136108\n", + "sourceVideo": "content/projektmelody-chaturbate-2025-10-05.mp4", + "thumbnail": "content/projektmelody-chaturbate-2025-10-05-thumb.png", + "ipfsCid": null, + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2025-10-05.mp4", + "muxAssetId": "exoHuJEA1jL00YdW6XtrxhdjQunUJOllsG4tJ11UvmmM", + "muxPlaybackId": "R601dXaYq97gQgv01aYwD3IdzHS2VWwCo300dwwIJ9fyRY" + }, + { + "streamDate": "2024-09-28T03:20:00.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2024-09-27.mp4", + "thumbnail": "content/jperkfrqpiquxc49wnmpovd6_projektmelody-chaturbate-2024-09-27.png", + "ipfsCid": "bafybeica4po2s7mlak7mkguoc3m4tmnw42tpnfgkevtlwpm3s3mbxb3hmy", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2024-09-27.mp4", + "muxAssetId": "PhT3GoCkX6Jg00kimvxU01uWFidSRF3cSM02g00TAzR2qy00", + "muxPlaybackId": "NJ5P3QxwgFGxmu1ytEWKormQbpDn1WyFBc2WkMjRofs" + }, + { + "streamDate": "2025-01-26T10:00:00.000Z", + "notes": "IPFS CID bafybeibijcfdcy7hjdptyhuabmbme4uc5o6gqhre6tsyfc6wgmsqh467py", + "sourceVideo": "content/projektmelody-chaturbate-2025-01-26.mp4", + "thumbnail": "content/projektmelody-chaturbate-2025-01-26-thumb.png", + "ipfsCid": null, + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2025-01-26.mp4", + "muxAssetId": "019skSJz9I3Vrm5MZtWm2FvVmmXAVnvOVTPS6Ar1HSHU", + "muxPlaybackId": "JSx9Wb4I02OFpsyvVppAg768Erw2EYVydeo00RO02QSO2I" + }, + { + "streamDate": "2025-04-17T12:01:00.000Z", + "notes": "IPFS CID bafybeicbxw7cm7yzhmhz6ndv5kmeetnjepw7lhfbdqlpxmn3htjzxfizza", + "sourceVideo": "content/projektmelody-chaturbate-2025-04-17.mp4", + "thumbnail": "content/projektmelody-chaturbate-2025-04-17-thumb.png", + "ipfsCid": null, + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2025-04-17.mp4", + "muxAssetId": "Dl54Cl9ocy7028kPyWbThNzBQcnuuVkXyxM02Y201q5JlM", + "muxPlaybackId": "MUdHPab3auVUhHL023g1aT9V00mTsqBkMEkKqKSTBN2n4" + }, + { + "streamDate": "2021-05-22T06:59:03.000Z", + "notes": null, + "sourceVideo": "content/pmel-2021-05-22.mp4", + "thumbnail": "content/g343r4ewp8tjjkqs7ppgtg8a-vod-100-thumb.png", + "ipfsCid": "bafybeidsyqtr5etp4gm4jmlsxxmnkrqwu2mm3jfm3wp4ne6hkgxry4krxe", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/pmel-2021-05-22.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2020-02-08T08:21:48.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-20200207T232148Z.mp4", + "thumbnail": "content/yl5pfjdctp5msw70yn56kq5x-vod-185-thumb.png", + "ipfsCid": "bafybeieturzhepui5qkfhpnifbvrjzna3bisa66rmo54xmo3vyuebvovam", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-20200207T232148Z.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2023-04-17T17:08:00.000Z", + "notes": null, + "sourceVideo": "content/pmel2023-04-16.mp4", + "thumbnail": "content/clhmf6sht00017unz8ht9ch9m-vod-255-thumb.png", + "ipfsCid": "bafybeiclkyiomuru53rapmaekxyzyuiicc2ddtqx3el5pxaq2apqwdpnr4", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/pmel2023-04-16.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2023-07-09T17:00:00.000Z", + "notes": null, + "sourceVideo": "content/skyeanette-2023-07-09.mp4", + "thumbnail": null, + "ipfsCid": "", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/skyeanette-2023-07-09.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2023-05-08T13:37:00.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2023-05-07.mp4", + "thumbnail": "content/clhmo71nn00027unzhlbh9ura-vod-258-thumb.png", + "ipfsCid": "bafybeih25b5smmmaat3qkpt7yglii7o2gllaqa5vmdfayna2x6oos6uymi", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2023-05-07.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2025-01-30T11:07:00.000Z", + "notes": "IPFS CID bafybeidufrvtwj7z7mggewyri6765c7pntdxhesha7jwf5unkmispvosta", + "sourceVideo": "content/projektmelody-chaturbate-2025-01-30.mp4", + "thumbnail": "content/projektmelody-chaturbate-2025-01-30-thumb.png", + "ipfsCid": null, + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2025-01-30.mp4", + "muxAssetId": "dqyY02tyyyCpViHijuMK8QajXdMvHo9aRBjj2GIc007Ok", + "muxPlaybackId": "CLiloQsWiRttRno1ZvOt00e008qDb7sfUiFToiIjTMWkQ" + }, + { + "streamDate": "2025-04-18T04:30:00.000Z", + "notes": "this VOD is missing the first hour of the stream\n\nIPFS CID bafybeic7s3ep777evuyyfg73fd5bkpzxpbldlzgch3bdwn7vkk2lrtgipa", + "sourceVideo": "content/projektmelody-fansly-2025-04-17.mp4", + "thumbnail": "content/projektmelody-fansly-2025-04-17-thumb.png", + "ipfsCid": null, + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-fansly-2025-04-17.mp4", + "muxAssetId": "ffl414WpQAh72P8XOIOaSkXwTviimbjWcmprnrq1hlU", + "muxPlaybackId": "kLYNQNSb6Vos6FIBe01inVwtLr1i9UZwwotnp3fZsDJ00" + }, + { + "streamDate": "2021-09-20T03:47:34.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2021-09-19.mp4", + "thumbnail": "content/tn75tybv1id285x9h1w0qlyl-vod-118-thumb.png", + "ipfsCid": "bafybeiggkrk5byiafxszqz3gzptpas3pud5szueurmg3jqumb2vgslr53e", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2021-09-19.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2025-08-30T08:34:00.000Z", + "notes": "Recorded using ffmpeg. Recorded via Chaturbate. One temporary network interruption.\n\nIPFS CID bafybeifihed353ab3jn23eyq5kv3gawcajcswde76f5d7l3cwfxa6a3mju\n\nMagnet link magnet:?xt=urn:btih:01f8f670796d26f9f3f70659ed4358a289d6dfea&dn=projektmelody-chaturbate-2025-08-30.mp4", + "sourceVideo": "content/projektmelody-chaturbate-2025-08-30.mp4", + "thumbnail": "content/projektmelody-fansly-2025-08-30-thumb.png", + "ipfsCid": null, + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2025-08-30.mp4", + "muxAssetId": "Apxxa7RMhR8PHV54Y01pHEsLB1WYPZmrYEisLgX3NBoI", + "muxPlaybackId": "hLHGRJZHZcR5sRnxB3hrG402b2sgOAZJ3rVxL10100cA900" + }, + { + "streamDate": "2023-07-22T14:58:00.000Z", + "notes": null, + "sourceVideo": "content/vexruby-chaturbate-2023-07-22.mp4", + "thumbnail": null, + "ipfsCid": "bafybeigx5lnvwzcy4aygida5xpv3q5yjrsi7ylcurvfrhv5r7g5ejruesm", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/vexruby-chaturbate-2023-07-22.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2023-08-18T08:51:00.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2023-08-18.mp4", + "thumbnail": "content/cllg2jys900026xml6prn1ckq-vod-295-thumb.png", + "ipfsCid": "bafybeid5vnrjgh6raugyycv2lvd37yabtvme7tyffs7x4q2aoaoynxkeda", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2023-08-18.mp4", + "muxAssetId": "8k302xjxRBagxYgGg00019Urd0282hB600olllGwq1wHU3dI", + "muxPlaybackId": "xczRaQp9UgOBCaUZMD02g00vTfMJsSKEcffqZ602uF17y00" + }, + { + "streamDate": "2023-08-02T17:00:00.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2023-08-02.mp4", + "thumbnail": "content/2023-08-02.png", + "ipfsCid": "bafybeig3yueqq5gwqivam22qhqzumr4a5zrqtqbxs3z72a5r3kow6ay62e", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2023-08-02.mp4", + "muxAssetId": "uzIfMn43cuCvqcDopaGEsNtVDDLdDvstWIkv2fYADT00", + "muxPlaybackId": "01R5GR57Le7GfabZjCMlnFJQ02ZDrHfYDedv7HJDbHbqE" + }, + { + "streamDate": "2023-07-18T20:17:00.000Z", + "notes": null, + "sourceVideo": "content/athena_airis-chaturbate-2023-07-18.mp4", + "thumbnail": null, + "ipfsCid": "bafybeigybng7hm2pfs4nbrnpmlaycbxmh5zapk7fv5ysrgtnjhvdlwrxim", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/athena_airis-chaturbate-2023-07-18.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2023-07-22T00:35:00.000Z", + "notes": null, + "sourceVideo": "content/skyeanette-chaturbate-2023-07-21.mp4", + "thumbnail": null, + "ipfsCid": "bafybeiayrclc2bde7bg2l3aksexl55yzktkbqebb4qrdv63qsjkxqwwzkq", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/skyeanette-chaturbate-2023-07-21.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2020-02-10T03:14:25.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2020-02-09.mp4", + "thumbnail": "content/1704990549919-1586-vod-2-thumb.png", + "ipfsCid": "bafybeifzzi75tf66nmebl6bkq2lllv4d77xarwwhqvuoaib4revoegw5f4", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2020-02-09.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2025-09-04T08:21:00.000Z", + "notes": "Recorded using ffmpeg. Recorded via Chaturbate. One temporary network interruption.\n\nIPFS CID bafybeie723uk5gyfk6nldx7k2ut6hzq7z7nh232wwuz2timofzc55mngia\n\nMagnet link magnet:?xt=urn:btih:45e62c667d5c3d873cf957f735e3030f1897abe9&xt=urn:btmh:12201039b0aca45c725772e00b4732c739853a5b1cf376b2bad63e0fda96912fa12f&dn=projektmelody-chaturbate-2025-09-04.mp4&xl=4705880110", + "sourceVideo": "content/projektmelody-chaturbate-2025-09-04.mp4", + "thumbnail": "content/projektmelody-fansly-2025-09-04-thumb.png", + "ipfsCid": null, + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2025-09-04.mp4", + "muxAssetId": "2JHLnzSbwXiXOWBomM7FSS004Y01KHXB7OwDjlVlxwWek", + "muxPlaybackId": "MbzQ5qsIclRQDDaBM8b02VAgxYPA701AX402m11yG92M6Q" + }, + { + "streamDate": "2025-02-02T17:00:00.000Z", + "notes": "IPFS CID bafybeiaohahiscgg5qxhadfglji5hunqohw7rdvkzadvglalgv435couqy", + "sourceVideo": "content/projektmelody-chaturbate-2025-02-03.mp4", + "thumbnail": "content/projektmelody-chaturbate-2025-02-03-thumb.png", + "ipfsCid": null, + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2025-02-03.mp4", + "muxAssetId": "VtXDOiK1B1CYJT8Jfn2oGq9Vcnw1VhwYga201NBoOZyc", + "muxPlaybackId": "a6JEYTcJYTgo8ZarBgweI8FNzpz5fP0023mEXztNvtE00" + }, + { + "streamDate": "2023-12-16T16:41:00.000Z", + "notes": "Source resolution from Chaturbate was 720p", + "sourceVideo": "content/projektmelody-chaturbate-2023-12-15.mp4", + "thumbnail": "content/1707049118457-8387-vod-312-thumb.png", + "ipfsCid": "bafybeie4zqudp7iywgbieeuaj446abg4m6h5ukjyy2yxwqr2ifplqnfjni", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2023-12-15.mp4", + "muxAssetId": "pAgHZv02DvyxLayiFraHwOgAnt02F5AmHYgibbjALddXE", + "muxPlaybackId": "sf02BqHhXk4C1nu5avullrZig3e7hoVrzEC02j9KxuQAA" + }, + { + "streamDate": "2023-12-10T08:09:00.000Z", + "notes": "Source resolution from CB was 720p", + "sourceVideo": "content/projektmelody-chaturbate-2023-12-09.mp4", + "thumbnail": "content/1707049243904-3468-vod-311-thumb.png", + "ipfsCid": "bafybeiber5sekkvgpg3mc4y7tzwisid72myamoondnum6zez65fgb66jtu", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2023-12-09.mp4", + "muxAssetId": "02dVdql02sEeTPIoqOIE3l6xPAOY5m016E5dw01LIiHZCU00", + "muxPlaybackId": "7IicH4g2nIgGZn02nQuABU9jo4J01xbunE7dqLcKr13EE" + }, + { + "streamDate": "2025-05-12T08:12:00.000Z", + "notes": "IPFS CID bafybeibgegouij4mf7wa6afgaxr4roc5ywmiyt3dpkb5osj7yzuapfj4cy", + "sourceVideo": "content/2025-05-11-projektmelody-chaturbate.mp4", + "thumbnail": "content/2025-05-11-projektmelody-chaturbate-thumb.png", + "ipfsCid": null, + "videoSrcB2": "https://futureporn-b2.b-cdn.net/2025-05-11-projektmelody-chaturbate.mp4", + "muxAssetId": "Syl2QHv6BX7Pme5pah7EJ3fTNKhNuhs6YqHlmxbeYt8", + "muxPlaybackId": "t6p02LtZDvma2bwdpOlkQUEZkYCd6mwCzJJmLzlWrc028" + }, + { + "streamDate": "2023-08-27T05:19:00.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2023-08-26.mp4", + "thumbnail": "content/cllsr8qyc00046xmlgl0d8nim-vod-297-thumb.png", + "ipfsCid": "bafybeif4co3ygcvaxuy3s72lhre4pzolaqicq3z2ldcbyymfcccchr7tjm", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2023-08-26.mp4", + "muxAssetId": "xIZEaH402irB8d52P4b6MWlyOWoLSh1AhgrZ02VcGni01E", + "muxPlaybackId": "J1BujdFSA9FJlxkIi435V01tugvCLI01e00oq7SqD00pZgw" + }, + { + "streamDate": "2023-09-06T07:28:00.000Z", + "notes": null, + "sourceVideo": null, + "thumbnail": null, + "ipfsCid": null, + "videoSrcB2": null, + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2024-01-16T07:54:00.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2024-01-16.mp4", + "thumbnail": "content/1705379947896-2177-vod-317-thumb.png", + "ipfsCid": "bafybeieccdrzp23rjp45r2dsv25r7xvz6tdtmx2j23yqsltyucaiybch74", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2024-01-16.mp4", + "muxAssetId": "ZSVoyb02eDMlYxXpWhOQzk100WgalJnZwmK1tCFAPfD3A", + "muxPlaybackId": "mB74c4UsouZYW01jxmuMfIPd72i02m1IO7CuW3q00m02mu4" + }, + { + "streamDate": "2023-10-08T06:18:00.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2023-10-07.mp4", + "thumbnail": "content/hd2eklamvna63h3jjk5rfjzi-vod-303-thumb.png", + "ipfsCid": "bafybeifq4b32jdus3jsriarnlfpprvvzefw6gqnjilc52r6uwlbzy5pzma", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2023-10-07.mp4", + "muxAssetId": "UZLsg004cF8eFnQwQk1aDCooYsLAoTcv969IJBeeJ005Y", + "muxPlaybackId": "jkMPX5RDxblJkyywm7I4HTVzeSXNZnrkwttEBZIe97o" + }, + { + "streamDate": "2023-10-12T11:24:00.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2023-10-12.mp4", + "thumbnail": "content/pipu5vi37ervayxr32585v20-vod-304-thumb.png", + "ipfsCid": "bafybeigtd4dbadva2evwbik3lwttwggolzjhnreyic3d4wo447pdvfzqnm", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2023-10-12.mp4", + "muxAssetId": "JOLbrGOVvzxE6EFdBpaIAYUINdCb024o902xlKssDj9f8", + "muxPlaybackId": "oUsVRUAyQ531gp008XM4VA017NLQ7jt8xQ01TOu7bFM6jU" + }, + { + "streamDate": "2022-01-26T10:57:25.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-2022-01-26.mp4", + "thumbnail": "content/w87i7mcc79doe4jhip0lv0cf-vod-138-thumb.png", + "ipfsCid": "bafybeigppdhrhlucblzamkuucxyndnxbbxqvuv3lz3vaxwqjmj2i7jkeiu", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-2022-01-26.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2024-01-01T11:08:00.000Z", + "notes": "Chaturbate source was 720p", + "sourceVideo": "content/projektmelody-chaturbate-2024-01-01.mp4", + "thumbnail": "content/1704087383562-7150-vod-314-thumb.png", + "ipfsCid": "bafybeicxy7pzg7oipz5vbdsa74ffujmyhhzr4u2cwn7ayf5fdcv2fv5rj4", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2024-01-01.mp4", + "muxAssetId": "yqtGzKRvCw37eQc02CkuKvsY01gI4Wst8cf5QRFk76hrM", + "muxPlaybackId": "xsSMAx2SrRESugu3hYA1NTwWPAKhK02epjNyqBT1hwww" + }, + { + "streamDate": "2025-02-08T09:10:00.000Z", + "notes": "IPFS CID bafybeifmktdwgrlahj7aquufgvzreo62h7ce5mjb24kazoylntvbpiy654", + "sourceVideo": "content/projektmelody-chaturbate-2025-02-08.mp4", + "thumbnail": "content/projektmelody-chaturbate-2025-02-08-thumb.png", + "ipfsCid": null, + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2025-02-08.mp4", + "muxAssetId": "jsOzr9xlbWhYBxuNPNx1ljEad6BS029RR7FLGBiyM5EQ", + "muxPlaybackId": "k01m00W2R7LM02B00gcYpqOUlULEyv004yYVtMiV02pGcn5xo" + }, + { + "streamDate": "2025-05-15T03:12:00.000Z", + "notes": "\nPartial vod-- missing first hour\n\nIPFS CID bafybeifoz6e272znccbp4qzr6clmumj5u7mgzeywqlhtibckkqtk3qbjo4\n", + "sourceVideo": "content/2025-05-15-projektmelody-fansly.mp4", + "thumbnail": "content/2025-05-15-projektmelody-fansly-thumb.png", + "ipfsCid": null, + "videoSrcB2": "https://futureporn-b2.b-cdn.net/2025-05-15-projektmelody-fansly.mp4", + "muxAssetId": "BVvWDnpae5ShFq2dN7gL8x4diX01x5GJvaeL00cIo3aaw", + "muxPlaybackId": "HCOYFZErF1fUUa412agVM4eE5AS0002FOvf3xFM3ybfl00" + }, + { + "streamDate": "2025-10-09T08:40:00.000Z", + "notes": "Recorded using ffmpeg. Recorded via Chaturbate. \n\nIPFS CID bafybeie4qf225b73wiy2it5w6gc3desoftsmfku5zfofquib6l7b3qooai\n\nMagnet link magnet:?xt=urn:btih:45e62c667d5c3d873cf957f735e3030f1897abe9&xt=urn:btmh:12201039b0aca45c725772e00b4732c739853a5b1cf376b2bad63e0fda96912fa12f&dn=projektmelody-chaturbate-2025-09-04.mp4&xl=4705880110", + "sourceVideo": "content/projektmelody-chaturbate-2025-10-09.mp4", + "thumbnail": "content/projektmelody-chaturbate-2025-10-09-thumb.png", + "ipfsCid": null, + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2025-10-09.mp4", + "muxAssetId": "G2rIXEZOt02RNaO4wv9JYT1TRwfBspmaAXPaTyFWMeek", + "muxPlaybackId": "e8QyLFK9Rc1KT00L5Qd602W5vtuQiu6QIZf00MIPUiGUxI" + }, + { + "streamDate": "2025-02-12T10:50:00.000Z", + "notes": "IPFS CID bafybeiahu67y5im6gtd5vs3lzxzyqq4kapluuluw3jmzsman2iso3bretm", + "sourceVideo": "content/projektmelody-chaturbate-2025-02-12.mp4", + "thumbnail": "content/projektmelody-chaturbate-2025-02-12-thumb.png", + "ipfsCid": null, + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2025-02-12.mp4", + "muxAssetId": "2JoFFYVEjq1005iRc8YWqb01a00KBSOCCeZE400AohaNGGA", + "muxPlaybackId": "zh6n1IqM6idmiS500wwlUtKwFfW6YPzp3SiPKGIM7hi8" + }, + { + "streamDate": "2025-05-21T20:31:00.000Z", + "notes": "IPFS CID bafybeiebifjunkvclp6ubg6p4hmfo4cxb4jlxbf2bb4z4sav7uulcj7cgq\n\n\nMel had wifi issues during this stream, causing stream to go down several times. Mel abruptly ended her stream after her connection went down.\nvod provided by lilprincess", + "sourceVideo": "content/projektmelody-chaturbate-2025-05-21.mp4", + "thumbnail": "content/projektmelody-chaturbate-2025-05-21-thumb.png", + "ipfsCid": null, + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2025-05-21.mp4", + "muxAssetId": "8IDJkXMrvICB4zPnvubwZK02ODFQ67dHefeOMDSeMGd8", + "muxPlaybackId": "hlXR4rBToLKKYA6U01YHaOpDC54swp1vCLYIyQK2rbHU" + }, + { + "streamDate": "2020-12-05T06:18:42.000Z", + "notes": null, + "sourceVideo": "content/2020-12-04.mp4", + "thumbnail": "content/pj96f8he7gmld7rzt39r9zx7-vod-69-thumb.png", + "ipfsCid": "bafybeibf6jowdhbiwgzer426x67b5ubfvkzeiziotooa6rl2q3j7nv6pvi", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/2020-12-04.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2025-10-14T08:51:00.000Z", + "notes": "Recorded using ffmpeg. Recorded via Chaturbate. \n\nIPFS CID bafybeihhehzrhjczhtqaojjtw426utlfl5t7iqlf3zqgzs4s3iiyg643m4\n\nMagnet link magnet:?xt=urn:btih:344643a14dc58a7bf9d354f02882152563263cca&xt=urn:btmh:1220fe66cd989aa49242a2a99b60802fe2cdfeb1ad0aed4fac87ae86edd74019b013&dn=projektmelody-chaturbate-2025-10-13.mp4&xl=9328190683", + "sourceVideo": "content/projektmelody-chaturbate-2025-10-13.mp4", + "thumbnail": "content/projektmelody-chaturbate-2025-10-13-thumb.png", + "ipfsCid": null, + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2025-10-13.mp4", + "muxAssetId": "OAJf6atqss01mFZnt4goaHj01SCxA4u7wuRIUmJt8VT9g", + "muxPlaybackId": "lwuhgu7KQMH02iDlqXNWZ00tlhl2kfEWjCCNEbBgSE1200" + }, + { + "streamDate": "2024-03-27T17:05:00.000Z", + "notes": null, + "sourceVideo": "content/vexruby-chaturbate-2024-03-27.mp4", + "thumbnail": null, + "ipfsCid": null, + "videoSrcB2": "https://futureporn-b2.b-cdn.net/vexruby-chaturbate-2024-03-27.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2021-10-10T04:09:55.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2021-10-09.mp4", + "thumbnail": "content/k9batvpb71hhsn2txsioqstq-vod-121-thumb.png", + "ipfsCid": "bafybeidk7ltrlckcjjskgjxh2h7hynwxhdm2xw2jpk5cb6awhd37olu44q", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2021-10-09.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2022-02-17T08:00:32.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-2022-02-16.mp4", + "thumbnail": "content/i9p8euaga5plr0aw6465y3n5-vod-140-thumb.png", + "ipfsCid": "bafybeibcymhedd6zyaefh5bby6azqt4h7mtnoymspkwqxbc7p23qfwjahu", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-2022-02-16.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2023-09-19T08:07:00.000Z", + "notes": "2023-09-19T00:07:37.000Z", + "sourceVideo": "content/projektmelody-chaturbate-2023-09-19.mp4", + "thumbnail": "content/wfsf3deag6q3bkjms3m74pc9-vod-301-thumb.png", + "ipfsCid": "bafybeiaow65fybfa3w5lygraq3vc4maicpmtbjvra54graywj42yggeraq", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2023-09-19.mp4", + "muxAssetId": "024dnhEek1QLhFmaRk00TLCRZMI00R00OaO6qmsgMTJDjSE", + "muxPlaybackId": "tZmqgG1Fujbr3bVtX2dWmwjIWF5dttbLZszVnnlSBP8" + }, + { + "streamDate": "2000-01-01T09:00:00.000Z", + "notes": "tetet", + "sourceVideo": "content/c6798e70-614c-4f98-badd-8ef69122414c-strapi-user-nosave.mp4", + "thumbnail": null, + "ipfsCid": "", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/c6798e70-614c-4f98-badd-8ef69122414c-strapi-user-nosave.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2000-01-01T09:00:00.000Z", + "notes": "tetet 2", + "sourceVideo": "content/d41805bc-e434-4107-a8fb-7000553d03c8-strapi-user-nosave.mp4", + "thumbnail": null, + "ipfsCid": "", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/d41805bc-e434-4107-a8fb-7000553d03c8-strapi-user-nosave.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2000-01-01T09:00:00.000Z", + "notes": "3f3f3f3", + "sourceVideo": "content/9fb8e981-7e9a-46ca-a554-293b381a5399-strapi-user-nosave.mp4", + "thumbnail": null, + "ipfsCid": "", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/9fb8e981-7e9a-46ca-a554-293b381a5399-strapi-user-nosave.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2020-10-12T06:05:30.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-20201011T220530Z.mp4", + "thumbnail": "content/g6yh8q28843n82fkaomr70qp-vod-207-thumb.png", + "ipfsCid": "bafybeie4ilm7qirfk5fa56qm64zfr4cayzgjlpmiiijokubzasjq4d223q", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-20201011T220530Z.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2023-07-24T18:43:00.000Z", + "notes": "projektmelody b-day 2023 stream", + "sourceVideo": "content/projektmelody-chaturbate-2023-07-24.mp4", + "thumbnail": "content/2023-07-24.png", + "ipfsCid": "bafybeiemco3tv234v2lbes6pqstvdnseyz7kal6fxofstn6qry3k73wiw4", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2023-07-24.mp4", + "muxAssetId": "wk3lMd102AdrIvXOv00eY1yR5ZeRIsrJx92bO37txkzlg", + "muxPlaybackId": "ZZVu02VIrfbhmrmTEgSXdl7qR2bvEnfN3umE1c02YDJjY" + }, + { + "streamDate": "2023-07-19T17:02:00.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2023-07-18.mp4", + "thumbnail": "content/y0wg3f74buyzbrnbopoynu48-vod-286-thumb.png", + "ipfsCid": "bafybeidfnbvtiecjwwy4vevhbfqdmj544ocrujgimlh4irrqwbtbnnbx5e", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2023-07-18.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2021-03-13T07:53:59.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2021-03-12.mp4", + "thumbnail": "content/hfeefw7mc7oh4rfuke6lokan-vod-88-thumb.png", + "ipfsCid": "bafybeifq3sjvbxiudbh2dhjq5mrrs463lxfb73aptinlsa6glmbvnxwznm", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2021-03-12.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2023-09-15T07:17:00.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2023-09-14.mp4", + "thumbnail": "content/clmjzlm6700026xml9j9k632q-vod-300-thumb.png", + "ipfsCid": "bafybeiagwam6j3ejt2svimowcdjfejjodxiut7vcdop2psbuvrqhrwvnre", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2023-09-14.mp4", + "muxAssetId": "iMp011GoyCH6zze2GVMt7GH2skFBQPBmpW5U4fIJcuUE", + "muxPlaybackId": "OzX7Ru8IIfS302BpkGM3fxI4ZPnEt38DIdLunqtLSCN00" + }, + { + "streamDate": "2023-09-10T06:03:00.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2023-09-09.mp4", + "thumbnail": "content/2023-09-09.png", + "ipfsCid": "bafybeifwxmmmj4stshaozno7bn4egi5kni4awahjmph2vk6eke4ay6cutm", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2023-09-09.mp4", + "muxAssetId": "uPTLnYPHhchqB2t8P02qo0145ha2r00004C8QK3CxtsbJc00", + "muxPlaybackId": "SbVSxekprYVp9owHr8OjowRAlcIk7fuXcVNGZZr006XE" + }, + { + "streamDate": "2020-04-24T08:55:16.000Z", + "notes": null, + "sourceVideo": "content/pmel-chaturbate-2020-04-23.mp4", + "thumbnail": "content/rg3n2mjfilqvr0dqmvcx5nky-vod-26-thumb.png", + "ipfsCid": "bafybeihg3cjhbkfp6bliyhpeki73xs562rqhhnufnm5jio72esqwz2egpi", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/pmel-chaturbate-2020-04-23.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2022-01-10T08:32:49.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-2022-01-09.mp4", + "thumbnail": "content/aa2p70c9gwo7926h643z2x02-vod-104-thumb.png", + "ipfsCid": "bafybeibdlg4rq3elsk4xtnolzowsnmcclxodnsysyflztxyab35uj2whga", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-2022-01-09.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2020-09-12T02:02:31.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-20200911T180231Z.mp4", + "thumbnail": "content/rxv9ah5n3qzuptx9wo9k8xfv-vod-55-thumb.png", + "ipfsCid": "bafybeiawbkiq4h3brgxfja5i4lre3o23ruafbtpudcxfyvw6kc77euc4si", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-20200911T180231Z.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2020-05-29T03:57:30.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-20200528T195730Z.mp4", + "thumbnail": "content/nkgfxlj9km6sa05vp9kwkvxo-vod-35-thumb.png", + "ipfsCid": "bafybeiahwzppno5fp4mobpkijjiwwkjbeto2u7lksninhybwk5vgnbw2qa", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-20200528T195730Z.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2021-02-25T08:01:00.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2021-02-24.mp4", + "thumbnail": "content/m807mim1sdnvsdu74x63eewy-vod-86-thumb.png", + "ipfsCid": "bafybeibxbpsdglqxxwv6wjdrlut6pi6nppj7r6x66csoxtep4qssqn6wqu", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2021-02-24.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2020-02-19T06:17:28.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2020-02-18-h264.mp4", + "thumbnail": "content/afajawm18t4tvgfg4ruxss88-vod-8-thumb.png", + "ipfsCid": "bafybeibqzj2xikso3l5vfnvlukj3o5kmuscmmlmg7tbk6znlmab2dsrzim", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2020-02-18-h264.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2020-03-14T09:38:59.000Z", + "notes": null, + "sourceVideo": "content/pmel20200313.mp4", + "thumbnail": "content/nrs9eppjxqcj7kg9c6zy3gzr-vod-53-thumb.png", + "ipfsCid": "bafybeie6pjk42lxh372j6kiwoe3evb6mgwu3bhib37lq5pop6ysbtjmfle", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/pmel20200313.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2023-06-02T05:18:00.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2023-06-01.mp4", + "thumbnail": "content/clieuvn3300007ymn3c4a1mt7-vod-269-thumb.png", + "ipfsCid": "bafybeibgnowgkc7ic4v2nqqxhrmjk7hhzznywv53h3iex3fespsicmxmyq", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2023-06-01.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2020-02-22T11:13:38.000Z", + "notes": null, + "sourceVideo": "content/pmel-2020-02-21.mp4", + "thumbnail": "content/d26t2iqnju1jk9lmo5la683x-vod-10-thumb.png", + "ipfsCid": "bafybeigjndlwicu6iqv7pomni5a6qhl3oxeopzxugi4rqaqnlqvnjlhxny", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/pmel-2020-02-21.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2020-12-08T08:56:41.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2020-12-07.mp4", + "thumbnail": "content/oqkch7fyy681ext7rmmw4ta2-vod-70-thumb.png", + "ipfsCid": "bafybeidgwlvv75jvr7etr3jer3reiipcgjqzuw6rirxfsvr5lfw5wwdrua", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2020-12-07.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2023-01-25T09:19:39.000Z", + "notes": null, + "sourceVideo": "content/projektmelody+2023-01-25+01_21-projektmelody.mp4", + "thumbnail": "content/2023-01-25.png", + "ipfsCid": "bafybeiekafws2a6r5ojiybhv5r7dmkhmyuk4ukkcfrzq4uysoduxmj3sze", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody+2023-01-25+01_21-projektmelody.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2023-05-24T07:13:00.000Z", + "notes": null, + "sourceVideo": "content/pmel-2023-05-23.mp4", + "thumbnail": "content/kkav77se2bl3rt96yu6trmnn-vod-268-thumb.png", + "ipfsCid": "bafybeid2nvis7rnhfwggk73ndcz4xau3gxl2a6zcz5fxa26orolkzg2y4m", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/pmel-2023-05-23.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2023-06-05T05:28:00.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2023-06-04.mp4", + "thumbnail": "content/clii6h5np00017ymnhphb3dtc-vod-270-thumb.png", + "ipfsCid": "bafybeigcv5hwzowu5x3p7btuzwxpndtotxjh66fjxkkwmaqexe5xegb6qi", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2023-06-04.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2023-02-19T09:15:09.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-2023-02-19.mp4", + "thumbnail": "content/clhtwuii9000280qg4hym6qgg-vod-11-thumb.png", + "ipfsCid": "bafybeigiunmaetg3tjjgaepz5azb6lcpp2pzoiwdf52o4ux4gu3jpcr42i", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-2023-02-19.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2023-02-17T11:10:04.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-2023-02-17.mp4", + "thumbnail": "content/cljm143cw00067zpf6dp9fijx-vod-184-thumb.png", + "ipfsCid": "bafybeiadv3vym2rnxkhf66ygs5fr32gknhue4tyeyu5gfrbw6czpurzi4i", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-2023-02-17.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2023-11-22T05:24:00.000Z", + "notes": "Part 2 of 2, source resolution was 720p.", + "sourceVideo": "content/projektmelody-chaturbate-2023-11-21_part2.mp4", + "thumbnail": "content/1707192786214-3962-vod-309-thumb.png", + "ipfsCid": "bafybeifywda2c2sphdrr6mkjmjffq5qlzkblpwdoyth47mwqd2eiyrhv6u", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2023-11-21_part2.mp4", + "muxAssetId": "NqHpBpvlStLC01cydR6u9pzgHS6ndWFEpIAqkpcw9UeM", + "muxPlaybackId": "Ct9yXbllBdC5J9sJ8po007P9medO92FdSlyTauux3j900" + }, + { + "streamDate": "2020-05-10T05:59:16.000Z", + "notes": null, + "sourceVideo": "content/pmel-2020-05-09.mp4", + "thumbnail": "content/ysaccmcdt10f1y5ghubd5z4p-vod-29-thumb.png", + "ipfsCid": "bafybeig4b54dil42fz63v6rj72dltlm5dpzrphpj34lmn7grkquwh4izqa", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/pmel-2020-05-09.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2021-06-13T06:56:31.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-20210612T225631Z.mp4", + "thumbnail": "content/emqgeg06mtvh5mlohv317sxg-vod-103-thumb.png", + "ipfsCid": "bafybeidgcmxrxxlxzgdpoclfdkw4c7pybzchgbvvjjudbnn3svlimwbg7u", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-20210612T225631Z.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2021-06-06T06:02:00.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-20210605T220200Z.mp4", + "thumbnail": "content/clhtwxi43000380qg5qn6bfyn-vod-102-thumb.png", + "ipfsCid": "bafybeihab6mp7r6fmx36tavycp5rltt3sswmvf5cjp7lirxcvlk4mqnzh4", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-20210605T220200Z.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2022-08-04T07:32:24.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2022-08-03.mp4", + "thumbnail": "content/x5x7sl5ij7dql4nx9nygk4c1-vod-156-thumb.png", + "ipfsCid": "bafybeig5ysad2uf7u3u6tzd27cw56a2mbpav2r4dkfubub7oatup7w436e", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2022-08-03.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2022-01-13T09:03:21.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2022-01-13.mp4", + "thumbnail": "content/lmm9m6jebs00iwrszuqrtyav-vod-136-thumb.png", + "ipfsCid": "bafybeiep7edxvyjswtsfaqos6jrsdq5dzrytji2y47kazwpz6myyznleae", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2022-01-13.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2022-05-19T08:44:58.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2022-05-19.mp4", + "thumbnail": "content/urxv6bjd3flcoc78euft7rsi-vod-150-thumb.png", + "ipfsCid": "bafybeibsojoq3kiz6flb542lszshsmwzuuc2mxckymadpl5lwlrto5rehm", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2022-05-19.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2021-12-18T08:05:54.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2021-12-17.mp4", + "thumbnail": "content/projektmelody-2021-12-17.png", + "ipfsCid": "bafybeibheyhl37mdjbv3ygexgphcpcrhvtx3ahw6ulk7s3n7ld5ga4w7ga", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2021-12-17.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2021-12-16T08:04:14.000Z", + "notes": null, + "sourceVideo": "content/projektmelody+2021-12-15+23_05-projektmelody.mp4", + "thumbnail": "content/projektmelody-2021-12-15.png", + "ipfsCid": "bafybeif7ofnnqfwlr3fiomtb7fsn2stwxaufdmzma5tehs5osm42nu5654", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody+2021-12-15+23_05-projektmelody.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2021-12-07T05:10:31.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2021-12-06.mp4", + "thumbnail": "content/projektmelody-2021-12-06.png", + "ipfsCid": "bafybeidxsgv5qe7fwsfuybfixp432ifpiwssl36jwkkwigozpytnz4nbmy", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2021-12-06.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2021-06-07T04:55:39.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-20210606T205539Z.mp4", + "thumbnail": "content/h5va7vw1qvv7mzvq0ajunukv-vod-211-thumb.png", + "ipfsCid": "bafybeibgckbngpryekeddbjmrk5oe3l3hzafwpifgxmqwkn4ziewkcbow4", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-20210606T205539Z.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2021-07-05T02:50:39.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2021-07-04.mp4", + "thumbnail": "content/projektmelody-2021-07-04.png", + "ipfsCid": "bafybeiasgffxi3znl235axtprwyhtbrjmgvq4lzvgmqxzyz36sbvoii2qq", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2021-07-04.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2020-05-20T09:16:56.000Z", + "notes": null, + "sourceVideo": "content/pmldy_2020-05-20.mp4", + "thumbnail": "content/skrnznjz78t7i5o1sjfpb418-vod-173-thumb.png", + "ipfsCid": "bafybeigrcl7ijes55tv7pat6bnoeujm6daoi4n5exwx62rv36mmww3emai", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/pmldy_2020-05-20.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2022-05-15T07:02:18.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2022-05-14.mp4", + "thumbnail": "content/qavyryf4b6qcyjkgtqy3hb9j-vod-224-thumb.png", + "ipfsCid": "bafybeichtqjz7dmszdbgswlt2lti52fuamhkmeensk3if27glrac2nxaia", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2022-05-14.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2020-03-20T23:41:36.000Z", + "notes": null, + "sourceVideo": "content/pmelout.mp4", + "thumbnail": "content/cjnvat3vzx9ng8ekb5zl93ul-vod-198-thumb.png", + "ipfsCid": "bafybeibanfgyvhk56534z5ireuwhtkagsqruqxwl6c6m5pxk4plgdp4fj4", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/pmelout.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2022-06-19T07:07:00.000Z", + "notes": null, + "sourceVideo": "content/20220618.mp4", + "thumbnail": "content/cn4ywtq47sdaqlc7f9hnmbva-vod-161-thumb.png", + "ipfsCid": "bafybeifjwqemzdmdda6qptqcvsugxaxpn4ay7mok6k7vnlco2jal454rru", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/20220618.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2020-05-23T08:02:55.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2020-05-23.mp4", + "thumbnail": "content/clivjr3cv00007zpf76uy52zr-vod-44-thumb.png", + "ipfsCid": "bafybeiemxdirrah3lbcnq3xom2p34mkvbhkwodxjrzhmlq5le3gbnyhhoi", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2020-05-23.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2021-06-27T04:08:24.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2021-06-26.mp4", + "thumbnail": "content/nrpth38gfx3btle0ir1jv4is-vod-105-thumb.png", + "ipfsCid": null, + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2021-06-26.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2022-09-11T05:03:36.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2022-09-10.mp4", + "thumbnail": "content/myzo2lym1g50qubfokm95j13-vod-160-thumb.png", + "ipfsCid": "bafybeihgvv27a6oh5sxgbs27ojzxildwqfh5ultkmr6sfbdtddtsgtdypa", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2022-09-10.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2022-12-16T09:30:34.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2022-12-15.mp4", + "thumbnail": "content/clhtxd311000480qg3qct4bai-vod-171-thumb.png", + "ipfsCid": "bafybeib4qrkvmcns7mfbqj2wzblcguhlrb3gbvyzrfr2lpr4bv66k5q2rq", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2022-12-15.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2023-06-29T18:18:00.000Z", + "notes": null, + "sourceVideo": "content/el_xox-chaturbate-2023-06-29.mp4", + "thumbnail": "content/cljh6rudr00047zpfgp47a8vp-vod-274-thumb.png", + "ipfsCid": "", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/el_xox-chaturbate-2023-06-29.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2023-06-30T14:04:00.000Z", + "notes": null, + "sourceVideo": "content/el_xox-chaturbate-2023-06-29-2.mp4", + "thumbnail": "content/clji3obzo00057zpfgbvu3skp-vod-275-thumb.png", + "ipfsCid": "", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/el_xox-chaturbate-2023-06-29-2.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2022-09-03T04:06:16.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2022-09-02.mp4", + "thumbnail": "content/srpoue8qi0wbrsfsgnezh2kr-vod-227-thumb.png", + "ipfsCid": "bafybeibn3vm7lo3b6qalm6wzrfd7t4bvuzzr4ylabvlpf4o4mwt7glsmm4", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2022-09-02.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2021-04-24T07:01:52.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2021-04-23.mp4", + "thumbnail": "content/ns10ujy8qklt8jpfsjipk64o-vod-210-thumb.png", + "ipfsCid": "bafybeihu63ivnmzunfbcjahvn7qjbs7j2d5u7e56ujpkcd3ce6ypunhh3e", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2021-04-23.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2020-03-01T10:14:02.000Z", + "notes": null, + "sourceVideo": "content/pmel20200301.mp4", + "thumbnail": "content/u9e3x7hcblz4ynkeketxs5eg-vod-190-thumb.png", + "ipfsCid": "bafybeihejcsqwcbf7nvoyrjk4xwstbtercu7wkgg6wjvkshmej5ee7jcgy", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/pmel20200301.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2021-08-31T07:08:30.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2021-08-30.mp4", + "thumbnail": "content/projektmelody-2021-08-30.png", + "ipfsCid": "bafybeicz7ns3l7mekjxe7vgbhsdysgdgvqb46kg33azeynyxtgwvi46v34", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2021-08-30.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2023-01-06T05:58:29.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2022-01-05.mp4", + "thumbnail": "content/clhu1uieu000580qg8ns21h44-vod-175-thumb.png", + "ipfsCid": "bafybeiagi57772sulgsl2j5zwgvp4yitn25msmqfhjpmpy26krifocwdbi", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2022-01-05.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2023-03-25T05:13:29.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2023-03-24.mp4", + "thumbnail": "content/clhmeht5d00007unzfayd4vub-vod-252-thumb.png", + "ipfsCid": "bafybeigkpziavrmantm6nbctbppj56apujtmrdughjctvft55tcttbnrhq", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2023-03-24.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2023-04-15T09:07:00.000Z", + "notes": null, + "sourceVideo": "content/projektmelody_2023-04-14.mp4", + "thumbnail": "content/clhqjvepn00017ujvh7yc38yb-vod-254-thumb.png", + "ipfsCid": "bafybeifesct2j6hom6sr6wt74cofbywebd73i3cxeixwyj65r6eocymgpe", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody_2023-04-14.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2023-01-05T11:07:18.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2023-01-05.mp4", + "thumbnail": "content/2023-01-05.png", + "ipfsCid": null, + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2023-01-05.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2023-08-24T09:19:00.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2023-08-24.mp4", + "thumbnail": "content/2023-08-34.png", + "ipfsCid": "bafybeie2k4stvx3i5kkenoxmtbtlvv2dqrboyhmpcfub5ez33x4qclomau", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2023-08-24.mp4", + "muxAssetId": "DT4mT9SsDHcb8w5afk8aWU5ZnRX7WU7oauF5AlgSZmw", + "muxPlaybackId": "JLGzLNzJninrFw7JUKzPlFtD49DHFk3fDXlnurqszDc" + }, + { + "streamDate": "2023-03-24T05:13:04.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2023-03-23.mp4", + "thumbnail": "content/clhru5e3b00007vpe88bm40v1-vod-253-thumb.png", + "ipfsCid": "bafybeieou5db6yvd4k36sveqfegnyvrsno25rnz22gefdxvm5teuf2lcke", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2023-03-23.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2023-01-22T05:36:06.000Z", + "notes": null, + "sourceVideo": "content/pmel-2022-01-21.mp4", + "thumbnail": "content/2023-01-21.png", + "ipfsCid": "bafybeies6feikx5fnqoyvgukznvjqgjsfsmv4z33svgmqcbftombg45sq4", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/pmel-2022-01-21.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2023-02-13T12:07:00.000Z", + "notes": "This is the second half of the stream which was 1080p@60", + "sourceVideo": "content/pmel-2023-02-13.mp4", + "thumbnail": "content/2023-02-13.png", + "ipfsCid": "bafybeid4sl3nsiste4fp2zxx5gzhywwb2aswnamop2sp3bmg5s6dgtieti", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/pmel-2023-02-13.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2023-02-24T09:17:38.000Z", + "notes": null, + "sourceVideo": "content/projektmelody+2023-02-24+00_18-projektmelody.mp4", + "thumbnail": "content/2023-02-24.png", + "ipfsCid": "bafybeidexzucuf56rr7nxbfv4xi5zbtk6u5fqps64tg7l4p7fxlmay3gdy", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody+2023-02-24+00_18-projektmelody.mp4", + "muxAssetId": "4GXEPTuriy02ifinCnDhlhKKF4rVJFupzig6gaQUfmc4", + "muxPlaybackId": "LKEpMNjH8f8v6E2Pxm4aatCVvQ18AB8rP6AFB01a802KI" + }, + { + "streamDate": "2021-01-11T04:57:37.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2021-01-10.mp4", + "thumbnail": "content/m386sfx9j9udmxoj6r0x42s5-vod-240-thumb.png", + "ipfsCid": "bafybeia7jn6fhtphaag7dvq6emp7eq6pqpxjjrozybopdk2a4qxal7xv64", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2021-01-10.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2021-09-08T06:01:24.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2021-09-07.mp4", + "thumbnail": "content/cj78269dz7m5692cy3i5mzle-vod-234-thumb.png", + "ipfsCid": "bafybeiacbvfbxgo3e6aui6egsr5mq2azepss4ustgwuyogha246mlu5mjq", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2021-09-07.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2020-02-15T11:13:56.000Z", + "notes": null, + "sourceVideo": "content/projektmelody+2020-02-14+20_28-projektmelody.mp4", + "thumbnail": "content/qabj4011m6pfvucu7xi1cgeg-vod-7-thumb.png", + "ipfsCid": "bafybeigwddjxk4d5hjjnzahzbwv5alg3gv2lofqzr5cezjrzhwjbf56c2q", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody+2020-02-14+20_28-projektmelody.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2020-02-13T11:09:11.000Z", + "notes": null, + "sourceVideo": "content/projekt-melody-chaturbate-20200213.mp4", + "thumbnail": "content/ewmgovo1ikcbj2z4y6jr6yho-vod-6-thumb.png", + "ipfsCid": "bafybeib5h2bcn5hsmjrbokq76mqm3xhyelmmpgvdbqhw7lzcauj3zxulty", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projekt-melody-chaturbate-20200213.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2020-06-19T07:37:57.000Z", + "notes": null, + "sourceVideo": "content/projektmelody_2020-06-18_23-30-07.mkv", + "thumbnail": "content/vfc02b9xq96214vaqi7h19ix-vod-40-thumb.png", + "ipfsCid": "bafybeifffrtocxxs3fz4bmvhuo6tjsvyfmdkwdasfv6nvrllv4m6pz7lha", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody_2020-06-18_23-30-07.mkv", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2020-02-13T02:14:12.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-20200212.mp4", + "thumbnail": "content/g071qc51prghanor6axre2ry-vod-5-thumb.png", + "ipfsCid": "bafybeidlj6qwjzfbe4bgaam2awcb4ztoemndeimpxiivg3tme7wvsumh6i", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-20200212.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2020-02-12T10:11:48.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2020-02-11.mp4", + "thumbnail": "content/e8ah98csnc1t72izk4dsaxfv-vod-4-thumb.png", + "ipfsCid": "bafybeiczjucsseyz5vyei7wropqqdgrbwi563wxx5tkxyqxd22qqtpwjua", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2020-02-11.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2020-03-05T10:18:07.000Z", + "notes": null, + "sourceVideo": "content/pmel20200304.mp4", + "thumbnail": "content/kpp3ozlm5rul3rs1kj7uwp62-vod-15-thumb.png", + "ipfsCid": "bafybeiea2cmdlzeavouhgvg2wzwi2wtqyw6ahtyeonyfn5ka47tqlj6ql4", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/pmel20200304.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2020-03-04T06:06:17.000Z", + "notes": null, + "sourceVideo": "content/pmel20200303.mp4", + "thumbnail": "content/qh9m4g1x56gx8fwki0urgra9-vod-14-thumb.png", + "ipfsCid": "bafybeic7bdu7jwr53h3rxie6b776imp7zoxalumkflsvdpmcz3d252shfa", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/pmel20200303.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2023-01-20T09:37:06.000Z", + "notes": null, + "sourceVideo": "content/projektmelody+2023-01-20+01_10-projektmelody.mp4", + "thumbnail": "content/2023-01-20.png", + "ipfsCid": "bafybeia4257pwml2hnan2mwhunaluu2o2ufxfi647bjkj5ed5tigbxfcbm", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody+2023-01-20+01_10-projektmelody.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2023-02-09T09:25:47.000Z", + "notes": null, + "sourceVideo": "content/pmel-2023-02-09.mp4", + "thumbnail": "content/2023-02-09.png", + "ipfsCid": "bafybeiakbwzng43epwulnmkyorvuvg6ehjndfsdyw7gsiinfnfula2uz2e", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/pmel-2023-02-09.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2021-05-14T23:53:36.000Z", + "notes": null, + "sourceVideo": "content/projekt-melody-chaturbate-2021-05-14.mp4", + "thumbnail": "content/obk71b2xh7r099qb8y2f6ct4-vod-99-thumb.png", + "ipfsCid": "bafybeiacdxziclwrdf4koabndex473vhchffrx4rorzmtu7vfwlquf7k5a", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projekt-melody-chaturbate-2021-05-14.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2020-11-24T08:56:04.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-20201123T235604Z.mp4", + "thumbnail": "content/aed4oropu8r4k7hunnk6nznl-vod-67-thumb.png", + "ipfsCid": "bafybeiaera7u42nrmtw73kwj6bo5h524t2a7cv7ax25hi3q2ktjubbetrm", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-20201123T235604Z.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2023-04-29T09:12:00.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2023-04-28.mp4", + "thumbnail": "content/clhp22auv00017unl43of0pns-vod-257-thumb.png", + "ipfsCid": "bafybeihtuy4vmye3kvfxo3icgbzwjkv3bgziuquqjstfvp5bpeq2si4n74", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2023-04-28.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2020-03-26T08:14:56.000Z", + "notes": null, + "sourceVideo": "content/20200325.mp4", + "thumbnail": "content/jbwye1fmnyvbf659e3dbwt4u-vod-21-thumb.png", + "ipfsCid": "bafybeihkyxrqs77xllauqwxu74jfsc3gsajicjkmr2b2e4jc7pftpc5are", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/20200325.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2020-02-29T01:38:43.000Z", + "notes": null, + "sourceVideo": "content/pmel20200228.mp4", + "thumbnail": "content/iyj1zd83w9e2cp7c4xfuq48t-vod-24-thumb.png", + "ipfsCid": "bafybeihprap6r223qrre422uszepedmikl5ilpnpx2qgcmrq5nup3e3s2u", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/pmel20200228.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2022-05-14T03:19:42.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-2022-05-13.mp4", + "thumbnail": "content/ziu3auywn6nu8t57ypzfinh7-vod-115-thumb.png", + "ipfsCid": "bafybeig4hev3g35sbqiiluffeqhway7kmpmaprhtoh3iyepknfuhpbdenm", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-2022-05-13.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2020-04-26T07:05:42.000Z", + "notes": null, + "sourceVideo": "content/pmel-chaturbate-2020-04-25.mp4", + "thumbnail": "content/ks2odwd3vx53td4w5mpdfrra-vod-27-thumb.png", + "ipfsCid": "bafybeievzg6xerguxfeufchhxca2zjj4w4yypgynbxaeygmmujk6a74tum", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/pmel-chaturbate-2020-04-25.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2020-03-07T11:40:52.000Z", + "notes": null, + "sourceVideo": "content/pmel20200306.mp4", + "thumbnail": "content/kzcae1xlhgzcsdw8kf7cnrod-vod-16-thumb.png", + "ipfsCid": "bafybeifbzoiixv4qfii7u56avdx3b2uxx5fuekwngw7anddkoptnig7c3a", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/pmel20200306.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2020-03-22T08:11:12.000Z", + "notes": null, + "sourceVideo": "content/frick.mp4", + "thumbnail": "content/b1tts4spwq416v3us1c8cydr-vod-20-thumb.png", + "ipfsCid": "bafybeibalp6tucbwkgiu6eklkq4ifxcwu56n5o3xdiwhgunqgswp3x3gay", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/frick.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2020-03-18T03:55:46.000Z", + "notes": null, + "sourceVideo": "content/pmel20200317.mp4", + "thumbnail": "content/wvzl5llwmuf2fz13mt3stnht-vod-19-thumb.png", + "ipfsCid": "bafybeicgo5mrlfbcnbpqzhkk2pkc67fmq2hfhph4lstrcys2fy6rpjginu", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/pmel20200317.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2020-04-15T03:57:03.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-20200414.mp4", + "thumbnail": "content/mly3w61a1qumoqpvsfvmgi10-vod-25-thumb.png", + "ipfsCid": "bafybeigi6tlva7widakaoqbbau3xdvba7bt75cipao4k5ulehi6kdj6mka", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-20200414.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2020-03-16T04:22:40.000Z", + "notes": null, + "sourceVideo": "content/pmel20200315.mp4", + "thumbnail": "content/o9f2penz4mycgxmjl70udv4v-vod-18-thumb.png", + "ipfsCid": "bafybeigceik62tpvp2srniu7ljnqzcugkzvsz2uu745dvunlcmz7hoahyu", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/pmel20200315.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2020-04-27T06:54:50.000Z", + "notes": null, + "sourceVideo": "content/pmel-chaturbate-2020-04-26.mp4", + "thumbnail": "content/j5ycypsi4d429fxs38270h6a-vod-28-thumb.png", + "ipfsCid": "bafybeib4m6pwp6jtxrcsikktmdeug6dus32c7vrmboncurpzf5o2jdnqqa", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/pmel-chaturbate-2020-04-26.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2020-05-13T03:01:53.000Z", + "notes": null, + "sourceVideo": "content/pmel-chaturbate-2020-05-12.mp4", + "thumbnail": "content/h7dowydjmywmzfpmzauloj8q-vod-30-thumb.png", + "ipfsCid": "bafybeih3pqcdankhhfengw4es2fcnpactxpegkikz7szc3xkbx5wgak6xq", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/pmel-chaturbate-2020-05-12.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2020-02-17T10:05:40.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2020-02-16.mp4", + "thumbnail": "content/nb8sh2azjmeu8xupwmsq8axg-vod-32-thumb.png", + "ipfsCid": "bafybeiakdc6glw32zj5py24332ty5o77jgv4mfkboauqw3tg3wisvxrs6e", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2020-02-16.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2020-05-30T07:02:07.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-20200529T230207Z.mp4", + "thumbnail": "content/q1gcledrpvl0jjtssvvfrnzf-vod-36-thumb.png", + "ipfsCid": "bafybeiasbueh5dyk7nqo3qzu4kyvrhnf54oiys3rz66it6qx43bf6mimfa", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-20200529T230207Z.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2020-05-06T03:00:56.000Z", + "notes": null, + "sourceVideo": "content/pmel-2020-05-05.mp4", + "thumbnail": "content/sdvner1f94x4wtwil2r9g6v1-vod-34-thumb.png", + "ipfsCid": "bafybeibmcakf45uxoyz6tzwlnzayacli3la4qdktegxpg5dlvquilophta", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/pmel-2020-05-05.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2020-06-27T08:06:39.000Z", + "notes": null, + "sourceVideo": "content/projektmelody_2020-06-27_00-07-12.mkv", + "thumbnail": "content/q2atgujmyfaxf8efmtqen3wz-vod-31-thumb.png", + "ipfsCid": "bafybeidlqaobmf6a62x2n6mufniaiaybap22y2tujr4aqak2hsoimm254u", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody_2020-06-27_00-07-12.mkv", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2020-04-06T06:55:16.000Z", + "notes": null, + "sourceVideo": "content/20220405.mp4", + "thumbnail": "content/ylsyaz5e5u6zmw101skco8ju-vod-33-thumb.png", + "ipfsCid": "bafybeiajaapyt3vapnvywguy5pq3tofxba7qn76dsvp6bggqcolouoeaae", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/20220405.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2020-06-01T08:13:53.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-20200601T001353Z-source.mp4", + "thumbnail": "content/alv52d73ip8y38509s1x9e5a-vod-37-thumb.png", + "ipfsCid": "bafybeifiesqa7byedil4x4chjllk3man6zskchvxkpas6k6xid5ie4d2di", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-20200601T001353Z-source.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2020-02-27T10:10:55.000Z", + "notes": null, + "sourceVideo": "content/pmel20200226.mp4", + "thumbnail": "content/skok4k498cq2sknapw13chv3-vod-43-thumb.png", + "ipfsCid": "bafybeib2m5paynnzntjqiu37bx7t37qo6sii2bxs35mqiau4hxlqrfyeku", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/pmel20200226.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2020-07-15T08:25:49.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-20200715T002549Z.mp4", + "thumbnail": "content/y9ssmy952voxgytxz66txjdm-vod-45-thumb.png", + "ipfsCid": "bafybeih5avhskuneiyi6rmv6wgbrym5zuppbgzbrgeh67dt2uyejwhdcha", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-20200715T002549Z.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2020-06-06T08:02:11.000Z", + "notes": null, + "sourceVideo": "content/projektmelody_2020-06-05_23-55-45.mkv", + "thumbnail": "content/mt64bqxqp7ebh6hdhvaj3hyo-vod-38-thumb.png", + "ipfsCid": "bafybeiflu5ns2auqvqlpxqu2cqprmmn3gjgvxt72akd5kdbhnakyewcyhq", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody_2020-06-05_23-55-45.mkv", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2020-06-17T02:55:04.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-20200616T185504Z.mp4", + "thumbnail": "content/rr7f1yd9ba2idr0rjr3fpw0e-vod-39-thumb.png", + "ipfsCid": "bafybeieoy7fjd2x7pvf6jqu6pirrsleycxqto5rn4fgpdmqfzve2h56g3m", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-20200616T185504Z.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2020-07-30T04:03:40.000Z", + "notes": null, + "sourceVideo": "content/projektmelody_2020-07-29_19-57-47.mkv", + "thumbnail": "content/p5h5chdmw7vrhnmhbe40sr6m-vod-48-thumb.png", + "ipfsCid": "bafybeibvsokqiparm4l7x5ggaoyddd6wnep6zgtujsme2rjfhdrlg7b46q", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody_2020-07-29_19-57-47.mkv", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2020-08-01T08:00:00.000Z", + "notes": null, + "sourceVideo": "content/projektmelody_2020-08-01_00-21-24.mkv", + "thumbnail": "content/hj3gjwqkrgvx1soc9xukmdfp-vod-49-thumb.png", + "ipfsCid": "bafybeideblepxcn4n2fahjzogdczks2dwrrqc42ggwgq42x74gkllt36fa", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody_2020-08-01_00-21-24.mkv", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2020-08-20T05:00:11.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-20200819T210011Z.mp4", + "thumbnail": "content/k96849wqbzgwhl24zefngwdm-vod-52-thumb.png", + "ipfsCid": "bafybeiew7aifotubyyc4fhwnbtzcfnslmyzisnvvkf2rqvqyceswjizbe4", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-20200819T210011Z.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2020-11-27T07:03:19.000Z", + "notes": null, + "sourceVideo": "content/projektmelody_2020-11-26_22-03-22.mkv", + "thumbnail": "content/wkska7a1dlyqathnwj19ppke-vod-68-thumb.png", + "ipfsCid": "bafybeigg25lw3daqmi5jfrkvdqy2exnijcjhqk4v24epk3qvpg6bnwnevu", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody_2020-11-26_22-03-22.mkv", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2020-11-19T06:28:43.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-20201118T212843Z.mp4", + "thumbnail": "content/yfelqk3qye9s14farfxyqcqr-vod-66-thumb.png", + "ipfsCid": "bafybeiepmb7rt25g5y2lobrba2afkye264n4kxjn54xhvvod3qoqwynxay", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-20201118T212843Z.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2020-08-15T06:21:59.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2020-08-14.mp4", + "thumbnail": "content/k7p2k5k457p9v7gyogc85l7y-vod-51-thumb.png", + "ipfsCid": "bafybeiebnhw3qmiwcz7acpindes5ccerd37i7j2theu5z3h3ipijixflc4", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2020-08-14.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2020-08-06T03:52:40.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2020-08-05.mp4", + "thumbnail": "content/wzhyca737qpk5x6n6m7plohe-vod-50-thumb.png", + "ipfsCid": "bafybeieuseafqywes7slgys2r7exn6dgrrglk5qnbpk4lgoiy3npgaew4y", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2020-08-05.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2020-09-14T07:00:49.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-20200913T230049Z.mp4", + "thumbnail": "content/t19kn688n643ayjnuigx3h4f-vod-56-thumb.png", + "ipfsCid": "bafybeibeg2fbx344chofjquyfgmpdflg33m54puli23gv6izxhtxv6araq", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-20200913T230049Z.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2020-09-21T04:00:12.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-20200920T200012Z.mp4", + "thumbnail": "content/qermxrpbmcf16fxpbdyj29l3-vod-64-thumb.png", + "ipfsCid": "bafybeihlzbvgyyrmtc2dw2ibvympl5v2abtl7fnwbbhjopd3ckvbfjeyme", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-20200920T200012Z.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2020-07-11T07:59:34.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-20200710T235934Z.mp4", + "thumbnail": "content/og9dm1mbi1nrpd2fojkfg6m1-vod-54-thumb.png", + "ipfsCid": "bafybeihyzwcnhziqtdcnagbfyz2e4vavldoxmmp2oo7lkpm7vbkxeh5yyq", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-20200710T235934Z.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2020-08-24T06:59:21.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-20200823T225921Z.mp4", + "thumbnail": "content/wwshkwuw3ook46vxe2sfx186-vod-63-thumb.png", + "ipfsCid": "bafybeigdsxefrigiv3qvjz3utnammolu2xlvvudglav5b2so4yqlhvwn5q", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-20200823T225921Z.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2020-04-02T08:11:39.000Z", + "notes": null, + "sourceVideo": "content/rise-melware.mp4", + "thumbnail": "content/uk8byx5fkhwmeadlllxamgtn-vod-62-thumb.png", + "ipfsCid": "bafybeify7pynayufjn2seurcriibhngd6elfht65j2k75oej4spemye4um", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/rise-melware.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2020-10-07T06:59:13.000Z", + "notes": null, + "sourceVideo": "content/projektmelody_2020-10-06_22-55-47.mkv", + "thumbnail": "content/eokmeyxlzqh5kiwys9yi94uv-vod-60-thumb.png", + "ipfsCid": "bafybeigyk5hnfrybipzwshgfrtutv4sddi2xbyum4lyr6tofqsrnlnfsa4", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody_2020-10-06_22-55-47.mkv", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2020-09-19T06:55:13.000Z", + "notes": null, + "sourceVideo": "content/projektmelody_2020-09-18_22-56-23.mkv", + "thumbnail": "content/f27jwaiwnv4pb7ry2xtpln8x-vod-57-thumb.png", + "ipfsCid": "bafybeigugsgu2sr3vcovz6t23ggjlrxlgxmvzrp4ujqjcsprvxkrsyvh3q", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody_2020-09-18_22-56-23.mkv", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2020-10-03T07:48:02.000Z", + "notes": null, + "sourceVideo": "content/projektmelody_2020-10-02_23-38-51.mkv", + "thumbnail": "content/yorx5vkjnyg4r4rv7onk83ap-vod-59-thumb.png", + "ipfsCid": "bafybeibhvnylayjzn5zpt3yzeoqotgvwpqe6ltiky6bmauh6euj7kdwohq", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody_2020-10-02_23-38-51.mkv", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2021-01-16T10:01:22.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2021-01-16.mp4", + "thumbnail": "content/t6t9u5p1p0lr3pdmshtqv1t9-vod-77-thumb.png", + "ipfsCid": "bafybeiedq5tgjqqw2bx22cqlsomhvtq65uwhbbwl46wh3lbj4lyb563eja", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2021-01-16.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2022-02-03T06:48:11.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-2022-02-02.mp4", + "thumbnail": "content/z6r8nhj6xpatu5luq6v6uxdm-vod-139-thumb.png", + "ipfsCid": "bafybeidpvjlo2jq4focrhp2u5kzgjibju2t2istourc3wki7ebamnlutuu", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-2022-02-02.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2021-01-09T08:03:45.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2021-01-08.mp4", + "thumbnail": "content/njxgj30x4cxjvppsbkqs6msc-vod-75-thumb.png", + "ipfsCid": "bafybeidgud7sr7gx27thu7b5mxejvcjtao6dc7a6j6liz46xrg2ynv3lqe", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2021-01-08.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2021-01-13T08:03:22.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2021-01-12.mp4", + "thumbnail": "content/t1s0sqj1bafic1d89ce9fna8-vod-76-thumb.png", + "ipfsCid": "bafybeihppdqlf7ttjmp5xwnxc5uyh5eb2rtjudlmny5msmspv4dbzpj3be", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2021-01-12.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2020-11-01T07:03:57.000Z", + "notes": null, + "sourceVideo": "content/projektmelody_2020-10-31_22-52-13.mkv", + "thumbnail": "content/nx3glwh5dcdqk85utouylyib-vod-65-thumb.png", + "ipfsCid": "bafybeiajmdaraqvmxrxrjmw2tbmxtgmzo4dg5wu35roqxeooi2vmszw36y", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody_2020-10-31_22-52-13.mkv", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2020-04-09T08:06:24.000Z", + "notes": null, + "sourceVideo": "content/20200408.mp4", + "thumbnail": "content/kfwyx1c9y7jjb41x5qiii3oy-vod-71-thumb.png", + "ipfsCid": "bafybeiecfllwdwpxhoymmgnnqlbgwujjceusif3y7fw7nbghv3t5jbgvcu", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/20200408.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2020-10-19T02:59:38.000Z", + "notes": null, + "sourceVideo": "content/projektmelody_2020-10-18_18-58-37.mkv", + "thumbnail": null, + "ipfsCid": "bafybeiggv4b7xyq2napssrkkdyvrfrh4g4vhoyetxrjxwkrrggmizi3biq", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody_2020-10-18_18-58-37.mkv", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2020-12-29T08:20:13.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2020-12-28.mp4", + "thumbnail": "content/v0mdr0ssecm0ixeoq6gin0pj-vod-82-thumb.png", + "ipfsCid": "bafybeifldn5zk3zdlfrwz2fpkq7kph6igzjqriiabdrqybebpfkcv42a54", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2020-12-28.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2021-01-27T08:02:21.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2021-01-26.mp4", + "thumbnail": "content/vcc8zjsbociqn2uo0lnkuz6y-vod-79-thumb.png", + "ipfsCid": "bafybeidtqf4pv7ijwx3v7nm5thw4hh5lmxw6zfpo6tx4xb7uw44sehptd4", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2021-01-26.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2021-01-23T08:02:24.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2021-01-22.mp4", + "thumbnail": "content/tnu89f75a3fmctnm5kkx4bby-vod-78-thumb.png", + "ipfsCid": "bafybeibymyi252us6gjwvl56rtw2vlt6up3c4im5erzwsmi4zo7bdf4lyq", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2021-01-22.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2021-02-04T08:00:44.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2021-02-03.mp4", + "thumbnail": "content/u4f4bb7ncvq7tewfdz94rbhu-vod-80-thumb.png", + "ipfsCid": "bafybeigm2vshlbnsaqo4f3doie2mn3bgprwcrdwhrmn52iphoecbckkltu", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2021-02-03.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2021-02-18T09:01:18.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2021-02-18.mp4", + "thumbnail": "content/pxzjwoy1bbsyqd01dstho6hy-vod-84-thumb.png", + "ipfsCid": "bafybeicsnrgllmzwrkxp5w6wbwk2hiczexrla6aotgccsf43avle2mtnzq", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2021-02-18.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2021-03-23T06:05:15.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2021-03-22.mp4", + "thumbnail": "content/r5d7mn1oh86n6tkhlgth4kbw-vod-91-thumb.png", + "ipfsCid": "bafybeidbohxrp5435yjz4gpjhhxnpa5oeybzjvwmswx7yd2mcq2flo5xbu", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2021-03-22.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2021-12-31T08:17:45.000Z", + "notes": null, + "sourceVideo": "content/pm-2021-12-30-23-19.mp4", + "thumbnail": "content/k6cxs4z8gaajw8ihw7m7rui4-vod-134-thumb.png", + "ipfsCid": "bafybeiam646ep7wocx2m62pkexvhqhheuvl4ubqshlwiufpnb4qbkw5zbu", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/pm-2021-12-30-23-19.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2020-10-30T03:58:10.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-20201029T195810Z.mp4", + "thumbnail": "content/t0cbl3cms4dd8drtppakk9xy-vod-73-thumb.png", + "ipfsCid": "bafybeih4h67anwjayy7l3jsqr4zrey7f2qsoaeawmpkge4shdtax734xdy", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-20201029T195810Z.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2021-02-15T06:13:33.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2021-02-14.mp4", + "thumbnail": "content/tvw0pvwq49834dh4exeelc1r-vod-83-thumb.png", + "ipfsCid": "bafybeieb4dssva6ptl33hr24re2uyy7mf4qvp7idoaw5vwrnc4telxe3dq", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2021-02-14.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2021-03-21T05:54:09.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-20210320T215409Z.mp4", + "thumbnail": "content/fck546uzbyrh7s27ckng3tkn-vod-90-thumb.png", + "ipfsCid": "bafybeidtbda4x4ceof663iyzhzlecfbzxuvpvdzplfbuqah6sltefyrmmy", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-20210320T215409Z.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2021-03-14T05:58:44.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2021-03-13.mp4", + "thumbnail": "content/o7bgu5fz926ii3vxw7qz1ftv-vod-89-thumb.png", + "ipfsCid": "bafybeiddo5baz26gl52hnw2z35vvmk5lw5p7ax7xt5opek3z5hu4oa5hke", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2021-03-13.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2021-03-03T08:07:27.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2021-03-01.mp4", + "thumbnail": "content/r5pk1y3rhqfwyjefexz32b2h-vod-87-thumb.png", + "ipfsCid": "bafybeiehczaajwv3cl7useh4n5tn77u5bnvi4b7s53flbbsyb4zfe7cgty", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2021-03-01.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2021-02-20T09:59:31.000Z", + "notes": null, + "sourceVideo": null, + "thumbnail": null, + "ipfsCid": "bafybeifkwljrcmaw2cd6jbqqjsm2f4p4hazts6qb57l4wjsyzsohlcxwem", + "videoSrcB2": null, + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2021-02-25T09:00:00.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2021-02-25.mp4", + "thumbnail": "content/rqwloxrem1wshflr2lfnks5z-vod-93-thumb.png", + "ipfsCid": "bafybeicxq4xjmika6iqjnu6ln3iehl2cgjhud7u2bzu7mgajyxrqgem5ri", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2021-02-25.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2021-04-04T03:55:31.000Z", + "notes": null, + "sourceVideo": "content/projektmelody_2021-04-03_22_38.mp4", + "thumbnail": "content/ld884f065yux1ae5qxje93ls-vod-95-thumb.png", + "ipfsCid": "bafybeihwffjcx327zxsnzzczl2rlhi34lhge4dij3bufax5qdi5afsrxl4", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody_2021-04-03_22_38.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2021-02-11T08:26:55.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2021-02-10.mp4", + "thumbnail": "content/o16b5vqcn9k02iwqat135yqr-vod-92-thumb.png", + "ipfsCid": "bafybeid2fzpwnrqialm354ouxvuahs4yg7vnwgbbawkovv3ovrw24uah4q", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2021-02-10.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2021-04-03T09:26:21.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2021-04-03.mp4", + "thumbnail": "content/khj3fy6jrkd6ls2hwvmszx5y-vod-94-thumb.png", + "ipfsCid": "bafybeifdujfqp4ohbcvw7tyz6nhh5ih2vvf3xua2arz6nlpo2lixoj73sa", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2021-04-03.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2021-04-25T01:31:05.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-20210424T173105Z.mp4", + "thumbnail": "content/fojaqxp8l94yr9bev00thi6h-vod-97-thumb.png", + "ipfsCid": "bafybeie5ht3gffukelwq75u5lh547shl6jwtbagcukf7s354pyfbaknm4i", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-20210424T173105Z.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2021-05-26T06:04:21.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-20210525T220421Z.mp4", + "thumbnail": "content/syfy7kokdjpu54tu3ece9ww3-vod-101-thumb.png", + "ipfsCid": "bafybeiagwnwfa6tzrtyvppebvzo6two2g6656rbocpjfntnkib76m5ejju", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-20210525T220421Z.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2021-04-13T07:11:23.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2021-04-13.mp4", + "thumbnail": "content/p9kezw4xrz71b9nkum963osr-vod-96-thumb.png", + "ipfsCid": "bafybeibexjman4wlgkggf7b6dzoghn5uarkzicgpzkdzspets5x4hwnwki", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2021-04-13.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2021-05-02T00:59:01.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2021-05-01.mp4", + "thumbnail": "content/cuijh8rg084op4lzieci3ask-vod-98-thumb.png", + "ipfsCid": "bafybeid7edevrbukji6yorclaieqendfaikhowosp63wtt5aa3rt5zns2e", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2021-05-01.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2021-07-14T03:52:08.000Z", + "notes": null, + "sourceVideo": "content/projektmelody_chaturbate_2021-07-13.mp4", + "thumbnail": "content/s1s8720coa7gm8x8rf7tdqys-vod-108-thumb.png", + "ipfsCid": "bafybeiajgb2ftzc65qkinszi2ydmrqm3vzjlbgmrm3cgjiaes7fx7jk2hy", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody_chaturbate_2021-07-13.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2021-07-18T04:05:10.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2021-07-17.mp4", + "thumbnail": "content/ruvk6uuhk27gqqam6lbk5x69-vod-109-thumb.png", + "ipfsCid": "bafybeigei5ehdgvj3ej2pchtm5dnffqqt3ir6clsrawxwlvh5ygccds4vm", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2021-07-17.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2021-08-13T03:57:20.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2021-08-12.mp4", + "thumbnail": "content/rf0r7ghtuw7myvsjednkq4gz-vod-112-thumb.png", + "ipfsCid": "bafybeibpbm4fo4mkmcwx3ow4ah6z63vuscfu5eigbdzeint7uvk4zojlpm", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2021-08-12.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2021-08-18T07:16:50.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2021-08-17.mp4", + "thumbnail": "content/tip1va6u06nnur3ld1785g5x-vod-113-thumb.png", + "ipfsCid": "bafybeihgzn66rgflw6nrog2lhvlzi744w4am3icyxkgkqfhdyh2yerot7y", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2021-08-17.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2021-08-09T04:26:41.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2021-08-08.mp4", + "thumbnail": "content/iwro0y1ehojzbs5ut1ejaxnw-vod-111-thumb.png", + "ipfsCid": "bafybeie2pvgiwyemry4pkblxbeo5faingsatglgjkpsnu7rtl4v3ujn3h4", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2021-08-08.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2021-09-30T02:55:41.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2021-09-29.mp4", + "thumbnail": "content/l5zh2m4n5nup1ddnmoav00s4-vod-120-thumb.png", + "ipfsCid": "bafybeicsvh64vpcvbx3pxwx3cao7dx5aj5hvczgfh6gctu2xcsx7penzgu", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2021-09-29.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2021-09-10T07:01:37.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2021-09-09.mp4", + "thumbnail": "content/uk159cmwp4gxhfi7x7jh0i8j-vod-116-thumb.png", + "ipfsCid": "bafybeigy5vccyjsweg6mtluptpahkksybl2y3fg62eqiplwmmgwe65rdxi", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2021-09-09.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2021-08-22T04:13:36.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2021-08-21.mp4", + "thumbnail": "content/q9bifi1bg5oh9jafhcn6g33a-vod-114-thumb.png", + "ipfsCid": "bafybeicfxswewpi2zldeqarz5yhuwq33ormjxe2obx6ty4ckhypd776rga", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2021-08-21.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2021-09-22T05:56:01.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2021-09-21.mp4", + "thumbnail": "content/xnf9y4zvvyc9i9g3f7bv1589-vod-119-thumb.png", + "ipfsCid": "bafybeifpecuguv5ezgntfezzpu2s3vuj744puuuxfob467tob2w62qmntm", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2021-09-21.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2021-10-12T06:06:20.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2021-10-11.mp4", + "thumbnail": "content/dw23tw7xyqe7s2e835grocvt-vod-122-thumb.png", + "ipfsCid": "bafybeidm2k2x5pz6623a3pltxzhjghxj57sxdqzbyjq37hpuwshwjlhnr4", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2021-10-11.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2022-01-23T07:59:59.000Z", + "notes": null, + "sourceVideo": "content/2022-01-22.mp4", + "thumbnail": "content/lzq75mzo8qc0a1p033aebvq7-vod-137-thumb.png", + "ipfsCid": "bafybeifld37u4ujo4nvvfesqsjufqits63uuc5app6ieeqqmiiokzpxa24", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/2022-01-22.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2022-06-10T05:10:03.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2022-06-09.mp4", + "thumbnail": "content/b93dbecc5rdrex4do3c0p20i-vod-153-thumb.png", + "ipfsCid": "bafybeicd4uoiem2f6mavfqpcmgx55rp46ow4xtlwjz2cpjmi7anssk2ksy", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2022-06-09.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2021-11-12T09:08:21.000Z", + "notes": null, + "sourceVideo": "content/projektmelody+2021-11-12+00_07-projektmelody.mp4", + "thumbnail": "content/unye0z59r1dwx2zeh3jjbuql-vod-127-thumb.png", + "ipfsCid": "bafybeiay5gbvtseoldxc4hduflzx2tjjqhcry3dyylxa7q47pbobkvu27a", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody+2021-11-12+00_07-projektmelody.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2022-03-18T09:35:11.000Z", + "notes": null, + "sourceVideo": "content/projekt-melody-chaturbate-2022-03-18.mp4", + "thumbnail": "content/hfawpgk26qxjkd52x7vln457-vod-143-thumb.png", + "ipfsCid": "bafybeihwch2toazyzjospgck72xv7b5dcevrn4jaoj32yufdu7nbtiyuaq", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projekt-melody-chaturbate-2022-03-18.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2021-11-20T05:01:27.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-20211119T200127Z.mp4", + "thumbnail": "content/iudqjw49l0h3bxku10czlgzi-vod-128-thumb.png", + "ipfsCid": "bafybeiaqucacdfr7y3bofppw2dclnpt3qzzug4vppzaakso6abpouo72ai", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-20211119T200127Z.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2022-01-04T08:10:33.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2022-01-03.mp4", + "thumbnail": "content/ljjnm91enpg3u27jwbgox3vy-vod-135-thumb.png", + "ipfsCid": "bafybeibvpqwrsvus7f6drtaf6stig7a3dchms7vh2dkhlz5lthasizwg5m", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2022-01-03.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2021-07-08T03:04:50.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2021-07-07.mp4", + "thumbnail": "content/x9fdwfa199h2kv9bictfvlx9-vod-107-thumb.png", + "ipfsCid": "bafybeib2mhzvta6auos6okiyvy5skcqs6lc7j2q44tdrx5hn5uxnnj735u", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2021-07-07.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2022-09-08T07:13:00.000Z", + "notes": null, + "sourceVideo": "content/2022-09-07.mp4", + "thumbnail": "content/sjbhdf6k8k4nbpb3vh9g0jtv-vod-126-thumb.png", + "ipfsCid": "bafybeicxum5yocakavipt2zjda3cauk3pa3ibtbfnojj67nrkfexcdvagy", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/2022-09-07.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2021-10-24T04:18:46.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2021-10-23.mp4", + "thumbnail": "content/1707194175524-5286-vod-123-thumb.png", + "ipfsCid": "bafybeih6aohhgrjt2gljelc654wwa6uly5hsppxothhee5ttevtpywc654", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2021-10-23.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2022-05-07T06:59:23.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2022-05-06.mp4", + "thumbnail": "content/vzn0nhxi9e3qa7lk4nggwxyq-vod-148-thumb.png", + "ipfsCid": "bafybeibwj7uqd24sxeedrodqbevodqld6jylc3rvgdxk6fdjfbzjpl7vqm", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2022-05-06.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2022-04-23T07:14:35.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2022-04-22.mp4", + "thumbnail": "content/i2xplmi38fsiui9drlpg8ayq-vod-147-thumb.png", + "ipfsCid": "bafybeicsliazvgkntmsffci5f5om4x45axvabkkydvyni5prpjhkqn5ik4", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2022-04-22.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2022-04-17T07:09:42.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2022-04-16.mp4", + "thumbnail": "content/cggmv78ge73hqb04ivalyeyl-vod-146-thumb.png", + "ipfsCid": "bafybeigecy6k32xsm3u37b6677zckduzmh2fq5q57gailm3ta5dodxoqla", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2022-04-16.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2022-04-10T08:12:41.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-20220410.mp4", + "thumbnail": "content/dac8du9zhjyxteio6ogix2oo-vod-145-thumb.png", + "ipfsCid": "bafybeidqcqsjpz5mmlvlplyz4rfd572gdtk3jhlgdmooqdhvf3owim42wu", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-20220410.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2022-08-24T07:28:21.000Z", + "notes": null, + "sourceVideo": "content/2022-08-23.mp4", + "thumbnail": "content/ejxmk3d6hjzt3tftfmfxgrr1-vod-159-thumb.png", + "ipfsCid": "bafybeieuhyr5zmmtv5ofykxzbrg2wjoyl6mbrcwgaylg43jdiswt6tl73m", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/2022-08-23.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2022-02-19T05:01:16.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2022-02-18.mp4", + "thumbnail": "content/knxvbrqoml0bac9f58tvtt36-vod-141-thumb.png", + "ipfsCid": "bafybeifnvdeucxpeocymmyludhv3xmrxvfzwmnlz5w7bq234gj74v25cea", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2022-02-18.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2022-03-11T08:02:20.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2022-03-10.mp4", + "thumbnail": "content/clmgvbwex00016xml7kivaq7e-vod-142-thumb.png", + "ipfsCid": "bafybeibvw7rwroyxgnkeyi6hkii3yrblqezua2r3oqtonjb5pwk7v4vkwu", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2022-03-10.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2022-08-12T04:31:00.000Z", + "notes": null, + "sourceVideo": "content/pmel-chaturbate-2022-08-11.mp4", + "thumbnail": "content/zbny2ufha5kbkiqgfgrm286m-vod-158-thumb.png", + "ipfsCid": "bafybeifwvpjoawsqt5kjhiyopa6clwv4jvp6g6jjtrxab3t54uaui2u32e", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/pmel-chaturbate-2022-08-11.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2022-05-25T10:06:07.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2022-05-25.mp4", + "thumbnail": "content/nuniy9ddhotxiq23y0m4al82-vod-151-thumb.png", + "ipfsCid": "bafybeif2su72idmgqam3nbu5bqtagmpjr55mxp2ukivrpiav2rehfytxsm", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2022-05-25.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2022-08-06T07:15:33.000Z", + "notes": null, + "sourceVideo": "content/pmel-chaturbate-2022-08-05.mp4", + "thumbnail": "content/i8ff06k8buroc480ja17yypq-vod-157-thumb.png", + "ipfsCid": "bafybeiccscmqr4lzb5whg5hjq6sj2uuhxyzrlxdyg3g3zb6hvrythawpea", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/pmel-chaturbate-2022-08-05.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2022-06-23T07:46:31.000Z", + "notes": null, + "sourceVideo": "content/20220622.mp4", + "thumbnail": "content/s2uj12p21kdkhg2lk13hfg47-vod-154-thumb.png", + "ipfsCid": "bafybeidjq3psgyaikki7ductfiukcxgqmkilds33xwnguu347ucpysoprq", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/20220622.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2022-06-06T07:30:37.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2022-06-05.mp4", + "thumbnail": "content/hh5ij4um1zcsil3n10gkjr8o-vod-152-thumb.png", + "ipfsCid": "bafybeiea7elzrcojpykmyktg4vdg4pislm2h6cxxgim6db3kbs3xxlaw4a", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2022-06-05.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2022-07-19T11:48:05.000Z", + "notes": null, + "sourceVideo": "content/projektmelody+2022-07-19+03_48-projektmelody.mp4", + "thumbnail": "content/jqwaaf8gls8e66ob6ved1aa5-vod-155-thumb.png", + "ipfsCid": "bafybeidkskxj7cycpfephuqsxtsgtbynitbyh6cgmy4zvwmm3cbf5wf3km", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody+2022-07-19+03_48-projektmelody.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2020-07-05T08:02:06.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-cb-2020-07-04.mp4", + "thumbnail": "content/scxxdhj5mzpn26w9y9a5j2bb-vod-174-thumb.png", + "ipfsCid": "bafybeibtxscx5cks5hscfg2fbzykpmhenyevltpn6k2nyp5kpzn6zizrjm", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-cb-2020-07-04.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2022-10-15T08:31:27.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2022-10-15.mp4", + "thumbnail": "content/byqsigxel48hyiwcqoqc32nd-vod-167-thumb.png", + "ipfsCid": "bafybeigpca24o23f62mxo5o72qbdew2aco32niky5q2guscrxlrf27mqma", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2022-10-15.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2022-10-02T10:05:22.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2022-10-01.mp4", + "thumbnail": "content/a0styx89dtvspb8788gwxlrp-vod-164-thumb.png", + "ipfsCid": "bafybeieexc2qpgtzou4nunxbrruz7awy4o6okexvftjphfzd6fpzlx77z4", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2022-10-01.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2022-11-05T04:29:53.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2022-11-04.mp4", + "thumbnail": "content/byhd23maey6y3sisidu1gfcb-vod-169-thumb.png", + "ipfsCid": "bafybeigcpbisbyhk4lhsplui5xqpsbgpacycsobhm6zmvmw3ij36myuyxe", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2022-11-04.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2022-09-22T07:38:26.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2022-09-21.mp4", + "thumbnail": "content/y0ammumg1s75hd5vnpdn846t-vod-163-thumb.png", + "ipfsCid": "bafybeifeig7lqkolh4ic6s2s34v63zwql3mg4c3kvw6qrxjk3tyrvwwnba", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2022-09-21.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2022-09-14T07:26:31.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2022-09-13.mp4", + "thumbnail": "content/weoab54kn8cf8ieds7fsd52f-vod-162-thumb.png", + "ipfsCid": "bafybeiei47h2rg3ovvaaebfbmskzvqidm7eiwlist2f25jblkdrqg6pqla", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2022-09-13.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2022-10-21T07:21:15.000Z", + "notes": null, + "sourceVideo": "content/pmel-2022-10-20_encoded.mp4", + "thumbnail": "content/ohkhe1pnlfbrkuzrpym9guod-vod-168-thumb.png", + "ipfsCid": "bafybeigthg3sfvm72ailonjoq7r4tube474ijmgibqrhxdtdigifjool24", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/pmel-2022-10-20_encoded.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2020-04-01T08:13:26.000Z", + "notes": null, + "sourceVideo": "content/hentai-games.mp4", + "thumbnail": "content/wxau2yykecsodefl4tch57lb-vod-192-thumb.png", + "ipfsCid": "bafybeialrynbmirk6bqwy4gpeynxxiee6hfzotga4utednrcgasjpmzm2q", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/hentai-games.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2020-10-17T07:32:50.000Z", + "notes": null, + "sourceVideo": "content/projektmelody_2020-10-16_23-37-21.mkv", + "thumbnail": "content/qy58k4gglq6tk4sqw6l7b2na-vod-186-thumb.png", + "ipfsCid": "bafybeid7dppjic72s2klqvajbq63nc2wkslb3tsqpxdmecxs4ilqwzc4qm", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody_2020-10-16_23-37-21.mkv", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2020-05-03T06:01:33.000Z", + "notes": null, + "sourceVideo": "content/20200502.mp4", + "thumbnail": "content/vtbyphkm0od79rq92q52dzy5-vod-193-thumb.png", + "ipfsCid": "bafybeihp4kns5jpxombjcfymkcotqo4z6gaamtqieceiyq2ejpct6vkfxy", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/20200502.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2020-09-06T07:08:12.000Z", + "notes": null, + "sourceVideo": "content/2020-09-05_combined.mp4", + "thumbnail": "content/wrwqzrjqzdli0gcgicdc6jc5-vod-182-thumb.png", + "ipfsCid": "bafybeiakxbfx343aya43n5w7pnedkvjiffwa2dvf6meau5ct4qd7i66cre", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/2020-09-05_combined.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2020-03-28T09:42:21.000Z", + "notes": null, + "sourceVideo": "content/20200327.mp4", + "thumbnail": "content/lrvcedydywl53d33oufieixp-vod-191-thumb.png", + "ipfsCid": "bafybeicllik54s7xjfurn724rsq7f5gacm4uxeauzmq2dytvxwmp5djqnu", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/20200327.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2020-07-07T04:03:01.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-20200706T200301Z.mp4", + "thumbnail": "content/fyra94eercmmnzhbph1ltorn-vod-178-thumb.png", + "ipfsCid": "bafybeidv5jbqxtfcblyr7pibbdmzf3eoiarbo5c7tqirqrjzjzyl7was5y", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-20200706T200301Z.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2020-07-08T04:59:26.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2020-07-07.mp4", + "thumbnail": "content/hsfdguc1ztdlevat6bni2iam-vod-179-thumb.png", + "ipfsCid": "bafybeiclvtb654ace3cy6r4sfj36msqgrgy6wpmp6hwcczsahutqv2tm6a", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2020-07-07.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2020-03-11T06:00:51.000Z", + "notes": null, + "sourceVideo": "content/pmel20200310.mp4", + "thumbnail": "content/kwpc2bwbguf641piz3ofl09q-vod-197-thumb.png", + "ipfsCid": "bafybeicz3irnef5rquxpht75ncvym2twordnavelh43yjgubmjemy4alkq", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/pmel20200310.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2020-10-14T07:03:14.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-20201013T230314Z.mp4", + "thumbnail": "content/m9wzz06mr0s58klrerrwvoo2-vod-201-thumb.png", + "ipfsCid": "bafybeifnnpcf7olywknb7zb2obkpzk3q5nfrknkcynuri5ng2pohznjqty", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-20201013T230314Z.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2020-06-28T08:10:07.000Z", + "notes": null, + "sourceVideo": "content/projektmelody_2020-06-28_00-10-03.mkv", + "thumbnail": "content/n0hqc6chb8tfu9muah1al4yi-vod-195-thumb.png", + "ipfsCid": "bafybeiendtjqhjazyeovym6erix6zusmvklmie5sfvnj7m3y4mc7hintzi", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody_2020-06-28_00-10-03.mkv", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2020-02-26T06:31:41.000Z", + "notes": null, + "sourceVideo": "content/pmel-2020-02-25.mp4", + "thumbnail": "content/o5pd9b5uom6ag78694mb66i0-vod-196-thumb.png", + "ipfsCid": "bafybeidflielopp3tl3ig5co6nt2gddjsmdeukg2iixkkmb3ilsue4e454", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/pmel-2020-02-25.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2020-11-09T09:55:59.000Z", + "notes": null, + "sourceVideo": "content/projektmelody_2020-11-09_00-55-56.mkv", + "thumbnail": "content/t51xvtvtrtrcu79jc53a9ga2-vod-203-thumb.png", + "ipfsCid": "bafybeihpjeoy4ltqfeubli4ei6qd6yvdneyfu3gwusdvscvrwojrlqwnpu", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody_2020-11-09_00-55-56.mkv", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2024-04-07T20:34:00.000Z", + "notes": null, + "sourceVideo": "content/el_xox-chaturbate-2024-04-07.mp4", + "thumbnail": "content/1712478972786-3936-vod-338-thumb.png", + "ipfsCid": "bafybeifk5x2sabdxfnr2eb3lhkypo4ic7gjhtdgcuhsvamr3cj5au7v5sa", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/el_xox-chaturbate-2024-04-07.mp4", + "muxAssetId": "6q3SWHj9wUfgzMr02dO1t7Rpl02Tl001iLeI01Yz7o01tndY", + "muxPlaybackId": "mTxvcjZhkD9ACTxu01lwjNMYqf2SvMDX7uy01ffVKhx01I" + }, + { + "streamDate": "2020-09-25T07:25:58.000Z", + "notes": null, + "sourceVideo": "content/projektmelody_2020-09-24_23-24-51.mkv", + "thumbnail": "content/tmpfd5qdpuybu7fmo3bwy4xv-vod-200-thumb.png", + "ipfsCid": "bafybeif5dqfylhlnsyc42vqybe77aqmvfntnjhzjncmeo4li6zpvncrazq", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody_2020-09-24_23-24-51.mkv", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2020-06-11T02:58:26.000Z", + "notes": null, + "sourceVideo": "content/projektmelody_2020-06-10_18-56-35.mkv", + "thumbnail": "content/bs9wtmpbyz5tl7de2yrp1otn-vod-194-thumb.png", + "ipfsCid": "bafybeig6wi5nbi64bedu6lxkd7ddkgcnagblhds4wvcfux5crgfubv5avi", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody_2020-06-10_18-56-35.mkv", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2022-10-13T10:22:45.000Z", + "notes": null, + "sourceVideo": "content/projektmelody+2022-10-13+02_23-projektmelody.mp4", + "thumbnail": "content/a3njy7qpvzfs1cim3cvt223d-vod-166-thumb.png", + "ipfsCid": "bafybeig4gf23l6lxkau7zsseudbxy565mj4uj4o2iq6wiwrno4giplzb3a", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody+2022-10-13+02_23-projektmelody.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2021-04-18T08:30:03.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2021-04-18.mp4", + "thumbnail": "content/hn4kfxkb05ujbpg5nz88mo35-vod-209-thumb.png", + "ipfsCid": "bafybeiavpnuswfrmck5htwat5fu6lqufbixluprntpuxnjbjkpu7f3oqqa", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2021-04-18.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2020-12-15T06:46:27.000Z", + "notes": null, + "sourceVideo": "content/projektmelody_2020-12-14_21-44-24.mkv", + "thumbnail": "content/ibzy3qq07bjmnh79m8y7e65e-vod-204-thumb.png", + "ipfsCid": "bafybeiehcivilnimtw3e35t3wxx6uc7vyna4nrkq4xpc5kxeili5pg6fmi", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody_2020-12-14_21-44-24.mkv", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2020-12-25T08:02:13.000Z", + "notes": null, + "sourceVideo": "content/2020-12-24.mp4", + "thumbnail": "content/qfzqwgkj3kreut2udq1onk36-vod-205-thumb.png", + "ipfsCid": "bafybeieq63nwsgpfhjaz7hk776nlggdn3ixh6di54o62xsoqq5dghh3vni", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/2020-12-24.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2021-03-04T08:03:48.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2021-03-03.mp4", + "thumbnail": "content/nie3yt83emvkichy3rb6o8gq-vod-208-thumb.png", + "ipfsCid": "bafybeieucdqbstfu2fyzedjwwrelmjudzz7uxabqrms6nv346zavn4tsfe", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2021-03-03.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2023-02-01T10:38:32.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2023-02-01.mp4", + "thumbnail": "content/vjtk3zn23swlmlyn0bamxbo2-vod-248-thumb.png", + "ipfsCid": "bafybeidmfhvnulor6cw55gup2uc23biwblyetx22n4iyfetdtmrl2sid54", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2023-02-01.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2022-04-14T04:10:50.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2022-04-13.mp4", + "thumbnail": "content/npfidgfkg52cx13ws0385ndl-vod-223-thumb.png", + "ipfsCid": "bafybeifjhkdkjpmtvwd6atpzqoulveqsodn65lrkwc6w66e4pcq4p7tw6i", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2022-04-13.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2022-01-16T05:53:35.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-20220115T205335Z.mp4", + "thumbnail": "content/qntmvew90za184l3rqbxuncc-vod-220-thumb.png", + "ipfsCid": "bafybeidcjevhamw6wrdz6eb7dxgrg2ymyv3movyoncyd5wrhjdt2joi5qm", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-20220115T205335Z.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2021-07-28T07:04:15.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2021-07-27.mp4", + "thumbnail": "content/ywpnvlmc6kb2kl0ly77km1k0-vod-213-thumb.png", + "ipfsCid": "bafybeiao4lmyigdnfmmmvuzv32ougmc425qim2oihykbjxerz2k422z67y", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2021-07-27.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2021-02-06T07:57:21.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2021-02-05.mp4", + "thumbnail": "content/mmuk4i59vm2x6rigv7zokcky-vod-216-thumb.png", + "ipfsCid": "bafybeihc6ytfvoujzzajhsz4xtixyknzcbn5kmzsytl7ferrm4p7wo4jhi", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2021-02-05.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2021-11-17T08:07:06.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-20211116T230706Z.mp4", + "thumbnail": "content/n94poxjvx95ioehyqgmfrven-vod-218-thumb.png", + "ipfsCid": "bafybeigv7wklmqunoe5da6wjbkpmzolliavu6flwj4ujs5x23tbmvd56ae", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-20211116T230706Z.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2022-01-29T07:13:21.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2022-01-28.mp4", + "thumbnail": "content/qxv27rcdarqz0o51qfwck4zx-vod-221-thumb.png", + "ipfsCid": "bafybeieodfv7q32pcqtzfkidaixw7oegjlgwuxbz54aesxw67r6vdqmswy", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2022-01-28.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2021-10-05T06:20:50.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2021-10-04.mp4", + "thumbnail": "content/gyltkk8dnvcecgk24q1mhxjk-vod-217-thumb.png", + "ipfsCid": "bafybeidrgl27zzdj7aricbtxh6qraxaddvskqooywq5io4mpir4ljmztpq", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2021-10-04.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2021-06-16T06:57:44.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-20210615T225744Z.mp4", + "thumbnail": "content/lxi85nb3pp61b9vyuc5k4dzy-vod-212-thumb.png", + "ipfsCid": "bafybeie5fgnhoxu7ig3qq7e2ip6vxxls7gh3bqa3wyggnkt75xsuvr24ei", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-20210615T225744Z.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2021-12-23T08:58:43.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2021-12-22.mp4", + "thumbnail": "content/irsxlrg65p927g2a8cadnjnt-vod-219-thumb.png", + "ipfsCid": "bafybeifzfamlwzgujz2qetuyg6wggq6fmsjrfsycsjgy6a7rudihocot4i", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2021-12-22.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2022-11-23T08:04:43.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-20221122T230443Z.mp4", + "thumbnail": "content/ekr4gswdflw9v1hvxz625wfm-vod-232-thumb.png", + "ipfsCid": "bafybeie3c3s6rdmgxf3eatdxgcl6sv7xpd62fmyrg5qtkswbhu5gltmtjy", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-20221122T230443Z.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2022-11-12T09:13:40.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2022-11-12.mp4", + "thumbnail": "content/p11pszub5hpfz33syt1azqiw-vod-230-thumb.png", + "ipfsCid": "bafybeig25winyjhorpz3btf7kroynl5yupegfzzazzecrigehfg45gpbfq", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2022-11-12.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2022-10-28T07:20:05.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2022-10-27.mp4", + "thumbnail": "content/zbzg41e3erp8hczoqt1mmqd9-vod-229-thumb.png", + "ipfsCid": "bafybeid3vam3o43zpmyq65tej2yejehtoxfya36q4sxv5giblsatwj2mcu", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2022-10-27.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2022-05-27T02:31:28.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2022-05-26.mp4", + "thumbnail": "content/sfc0g1ia7jp7ifibix2ibtay-vod-225-thumb.png", + "ipfsCid": "bafybeicbvbal57yzze5yhxcyp4pyvzwrwpz76vjia6hvvma43wof72rpky", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2022-05-26.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2022-11-20T07:35:57.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2022-11-19.mp4", + "thumbnail": "content/fjp646xj8piiga2tsht9a7v3-vod-231-thumb.png", + "ipfsCid": "bafybeifeno4xllalokcaktkpopchw62ycpssqqwxnxeuvveucnjobpzh2i", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2022-11-19.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2022-02-14T06:17:23.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2022-02-13.mp4", + "thumbnail": "content/o3dghla60jzn4nvd9tt96c6v-vod-222-thumb.png", + "ipfsCid": "bafybeidxeg5jia44722ewvzw3estbe44twhad54vgsdjqldngum77gdjni", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2022-02-13.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2022-12-18T07:14:20.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2022-12-17.mp4", + "thumbnail": "content/bjn25xwjdb9m85ufa1trqftt-vod-244-thumb.png", + "ipfsCid": "bafybeiefxe2loh7k35tu2ekimlnlgncozdqpgle7vdveujtbbkrfdvm67u", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2022-12-17.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2021-02-08T08:04:03.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2021-02-07.mp4", + "thumbnail": "content/nqjr757nxezlzr0vztmy95so-vod-241-thumb.png", + "ipfsCid": "bafybeidblbgwk2pjvzxku63a23tv4rvrj76qxlwrmp3h4qpx5cuwjzbx64", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2021-02-07.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2022-11-18T10:03:45.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2022-11-18.mp4", + "thumbnail": "content/dr8meqjnwfop03nclxrgse35-vod-242-thumb.png", + "ipfsCid": "bafybeigeendmcjezcqtbtaa2eqzfbnt433wjncnqkz4hjmgrqs4mgkbxua", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2022-11-18.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2021-01-04T08:01:53.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2021-01-03.mp4", + "thumbnail": "content/thwtoq9sdjat3ru6338p5s41-vod-239-thumb.png", + "ipfsCid": "bafybeihsae6zqa3maljprazgb2xnyfmt2daodqctufjumk43n52err6wte", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2021-01-03.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2022-11-22T10:15:55.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2022-11-22.mp4", + "thumbnail": "content/hc85bpyteo70ykla6ooh1z6p-vod-243-thumb.png", + "ipfsCid": "bafybeiet5kgzmdlcjheexilp7t2v7mwa54v4o2sdmfktseymnuvowiycf4", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2022-11-22.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2022-02-08T08:27:14.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2022-02-07.mp4", + "thumbnail": "content/cms983k1nxx2q3y48pw7mnbx-vod-236-thumb.png", + "ipfsCid": "bafybeihqbmc2xqiz523q5leroevwym2a4eglqqhztwlzg7pv7fadtxbycm", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2022-02-07.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2020-11-18T10:59:20.000Z", + "notes": null, + "sourceVideo": "content/projektmelody_2020-11-18_01-58-42.mkv", + "thumbnail": "content/zfhm3gmf5zz2smxh6yeokxbg-vod-238-thumb.png", + "ipfsCid": "bafybeic7cv2o75ofddmvb6qah4j5lusiiah72sa7arqtxl5vgia76b7adi", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody_2020-11-18_01-58-42.mkv", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2020-02-22T01:25:47.000Z", + "notes": null, + "sourceVideo": "content/pmel-2020-02-21.mp4", + "thumbnail": "content/wktsjlafbntaxcl7dx58cf88-vod-13-thumb.png", + "ipfsCid": "bafybeidsmzbzshxgex5wka37jmiqbnc56oq6tni4gpizelecbx23wira74", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/pmel-2020-02-21.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2023-01-10T08:07:18.000Z", + "notes": null, + "sourceVideo": "content/pmel-2023-01-09.mp4", + "thumbnail": "content/lgjaficeoh26clemzur0rax0-vod-246-thumb.png", + "ipfsCid": "bafybeibmpishntx3kv6lckeewixuvrghzclmn47b4723akalhdpjmblhaa", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/pmel-2023-01-09.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2021-12-13T08:12:01.000Z", + "notes": null, + "sourceVideo": "content/pmel-2021-12-12.mp4", + "thumbnail": "content/jr7h9dbldw3adiniw8t4ef1d-vod-130-thumb.png", + "ipfsCid": "bafybeieisaplpdykjzah5g4gezizcjujovungma362n7z75y2jktrbk5pu", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/pmel-2021-12-12.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2020-10-24T02:55:31.000Z", + "notes": null, + "sourceVideo": "content/pmel-2020-10-23.mkv", + "thumbnail": "content/r2t560cbxx9z3sbacwvjse6x-vod-202-thumb.png", + "ipfsCid": "bafybeia2qwxtuavj6yvqmksu2ijt6rkenwlsst7yr745vqlqtkncyijcdu", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/pmel-2020-10-23.mkv", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2020-02-09T01:12:42.000Z", + "notes": null, + "sourceVideo": "content/pmel-2020-02-08.mp4", + "thumbnail": "content/n3fzt742j235dmtp00p7ycw5-vod-23-thumb.png", + "ipfsCid": "bafybeibueoqojhltiyry4bzbmhhiobgwcisvy6467aay6e3ew2liavhwpi", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/pmel-2020-02-08.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2022-09-24T07:38:18.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2022-09-23.mp4", + "thumbnail": "content/xyfa2ah8r48dytbic0lemxvo-vod-228-thumb.png", + "ipfsCid": "bafybeibepozbnnkxvuahsxfatdtzqje3dmqxweojywhzgvh3tvl3hk7cmu", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2022-09-23.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2023-07-10T20:27:00.000Z", + "notes": null, + "sourceVideo": "content/athena-airis-2023-07-10.mp4", + "thumbnail": null, + "ipfsCid": "", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/athena-airis-2023-07-10.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2023-07-16T17:07:00.000Z", + "notes": null, + "sourceVideo": null, + "thumbnail": null, + "ipfsCid": "", + "videoSrcB2": null, + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2023-07-17T18:05:00.000Z", + "notes": null, + "sourceVideo": "content/mirakink-chaturbate-2023-07-17.mp4", + "thumbnail": null, + "ipfsCid": "bafybeih6yexoxfizqjoi66zuo5cob544p52l4lge63ottfmtgycinkfwmy", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/mirakink-chaturbate-2023-07-17.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2023-07-20T20:37:00.000Z", + "notes": null, + "sourceVideo": "content/athena_airis-chaturbate-2023-07-20.mp4", + "thumbnail": null, + "ipfsCid": "bafybeicwzydx7mglleia6mhseutxnpwbt4etiibkoo6w3igb5v3mfggxni", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/athena_airis-chaturbate-2023-07-20.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2023-07-17T16:31:00.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2023-07-17.mp4", + "thumbnail": "content/clmk3wstk00036xmlfpz32j3w-vod-283-thumb.png", + "ipfsCid": "bafybeibeekdn62add62bmnoa27hqbktca4qlgqigle5h3nxo6vwscybfpa", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2023-07-17.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2023-08-10T02:59:00.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2023-08-09.mp4", + "thumbnail": "content/cll4v0yyo00016xmlgbl8dfj9-vod-294-thumb.png", + "ipfsCid": "bafybeicqgdypqxbzxla7elzvs7p7q6rbkga53rtlv7b2u4nqo324djaefy", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2023-08-09.mp4", + "muxAssetId": "X0102amwyDSRu9cwzFHwV00iqugiOxo9F9GCsbCC01XKMbI", + "muxPlaybackId": "L98UkHOyLItvFV00XwNeDjx00fN8HQd6AtFSNXa64qpdc" + }, + { + "streamDate": "2023-08-03T16:00:00.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2023-08-03.mp4", + "thumbnail": "content/clkw9ip2x00006xml076bgiqd-vod-293-thumb.png", + "ipfsCid": "bafybeieaxtdccfaa4bvt44dn5nobjufsf7vyhdssf7qilruasbuypkwjei", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2023-08-03.mp4", + "muxAssetId": "PcXHQ4A00w7Q2vK701adqbx5OCVdnix01st4c9R3efsi8U", + "muxPlaybackId": "LjCnvj9UMG7XKmbiCvXXcHMzaaF6sci1zuwOWKMypF00" + }, + { + "streamDate": "2023-04-05T07:43:09.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2023-04-04.mp4", + "thumbnail": "content/clhqmi8sg00027ujvdxrb0z52-vod-125-thumb.png", + "ipfsCid": "bafybeian4h4srddi7ji4zjedqerikqku3eeu3hxmsmwuzpgvqaa2m4ooom", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2023-04-04.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2023-07-22T17:01:00.000Z", + "notes": null, + "sourceVideo": "content/skyeanette-chaturbate-2023-07-22.mp4", + "thumbnail": null, + "ipfsCid": "bafybeib4yoikj5xzikyziep4y7x3j36phjxtzkjsmojgtprfibdgprxume", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/skyeanette-chaturbate-2023-07-22.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2023-06-15T07:02:21.685Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2023-05-14.mp4", + "thumbnail": "content/cliwmfub800017zpf90irfw6v-vod-271-thumb.png", + "ipfsCid": "bafybeiaz7i663odfwrg6b7p6dqke6at6hllwkf2dovh5y4ai37ld2z5ive", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2023-05-14.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2023-11-09T12:17:00.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2023-11-09_rev2.mp4", + "thumbnail": "content/1707049903041-7743-vod-305-thumb.png", + "ipfsCid": "bafybeigsgaexdox3gumrbrhbfze5yjbtzudouquffyb366a42ltmbyljfq", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2023-11-09_rev2.mp4", + "muxAssetId": "H00pc1Jdc00Dh42M01ZHor2Q86BCnUbnnc1001lOb2rWB01U", + "muxPlaybackId": "5db2WMJucTpCUvaAYmpUdVGqumR7yj4skW4ByA3i5900" + }, + { + "streamDate": "2023-11-13T10:47:00.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2023-11-13.mp4", + "thumbnail": "content/1707049757677-3618-vod-306-thumb.png", + "ipfsCid": "bafybeihbjxhlsm7sdbpst4khssgsaeccz7pljpkxlar6mb2ph7omgrx24a", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2023-11-13.mp4", + "muxAssetId": "VUt2fp102GILUlONImeVpIFBWXAKCKnlHJJyRUPcBgig", + "muxPlaybackId": "6oR02t016LGhkGo200kdbdX01p5i5yJ8s7xSzLpMv2lPtyo" + }, + { + "streamDate": "2024-01-21T12:42:00.000Z", + "notes": null, + "sourceVideo": "content/el_xox-chaturbate-2024-01-21.mp4", + "thumbnail": "content/1705874674495-3040-vod-318-thumb.png", + "ipfsCid": "bafybeiehgrxyrxh25ihhqybs3hltdc4b2hrksivk5n4n4rvpdgu6n4fvru", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/el_xox-chaturbate-2024-01-21.mp4", + "muxAssetId": "eGBAIlZtlf2rQ9J4hWJUCCTm5xgO3B99kbFAaEiEk5s", + "muxPlaybackId": "IpEI6A01swfYft4B02S5wGgBvZJPJEOM5CwdqkOpj00iAA" + }, + { + "streamDate": "2023-12-23T07:15:00.000Z", + "notes": "Source resolution on Chaturbate was 720p", + "sourceVideo": "content/projektmelody-chaturbate-2023-12-22.mp4", + "thumbnail": "content/1703295060935-1153-vod-313-thumb.png", + "ipfsCid": "bafybeicjobhzfnpi6etdpdo72cbsmb66ug3qcrjiujx7fyq7v4bqhmyuce", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2023-12-22.mp4", + "muxAssetId": "hWAY6mRvCjgQtN62rBCgV556XMEE6duWS2Hc02VkT5WM", + "muxPlaybackId": "MgN01zENcxcDsBjLLBfFWt9WpcgOJaB0273w9Zl5DG6mE" + }, + { + "streamDate": "2024-01-06T11:39:00.000Z", + "notes": "Source resolution on Chaturbate was 720p", + "sourceVideo": "content/projektmelody-chaturbate-2024-01-06.mp4", + "thumbnail": "content/1704522939399-3107-vod-315-thumb.png", + "ipfsCid": "bafybeiccudtiuuf4qkdovrb336lvvh6cdaaqsuorqsu52m2ppmgizalnta", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2024-01-06.mp4", + "muxAssetId": "9qY2EANATdf1i7lTQkE01Ynz011m9mIRjdxvA68Lh00uKI", + "muxPlaybackId": "oj01PuoiRtdHkQIx7QX33nYwQWgu01y4AEI7fbM9SDE5w" + }, + { + "streamDate": "2024-03-28T16:45:00.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2024-03-28.mp4", + "thumbnail": "content/1711600414015-1088-vod-334-thumb.png", + "ipfsCid": "bafybeia46t7hqeqgej2tkk3za3xzj2dz6x5nf75rvd6vsavkna6trxnijm", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2024-03-28.mp4", + "muxAssetId": "KmwSPDjkDBS3yBMkqBDBSZNuLr00o9ymNmCla9FPVuPU", + "muxPlaybackId": "ZQkWYZWB012yGc8nPhtButokrhi2Zp9aciv3FCl4LkUY" + }, + { + "streamDate": "2024-04-05T15:03:00.000Z", + "notes": "There is a playback issue with the start of this vod. Please skip past the 2 second mark.", + "sourceVideo": "content/projektmelody-chaturbate-2024-04-04_transcoded.mp4", + "thumbnail": "content/1712288640649-2764-vod-337-thumb.png", + "ipfsCid": "bafybeifhrh5cictequ3p6s2zhepznf3yt4heeuxdcfc24qfnsckjsxdqje", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2024-04-04_transcoded.mp4", + "muxAssetId": "pTIdYtyuTKkebQ1TIvN1fBocRxD4Bvo016NiOmJDLgew", + "muxPlaybackId": "k02MRYXLIySnak8uxBk9PJoRVPKmIb01isC6VAVtLvl3o" + }, + { + "streamDate": "2024-01-10T07:52:00.000Z", + "notes": "Source resolution from Chaturbate was 720p", + "sourceVideo": "content/projektmelody-chaturbate-2024-01-10.mp4", + "thumbnail": "content/1704866865600-9067-vod-316-thumb.png", + "ipfsCid": "bafybeigrwyug2rv5uhk5cjbsbx25y3ysui37jmlwydqmsnnvodrkpeaqri", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2024-01-10.mp4", + "muxAssetId": "Rf0001xW4qFyjNwFKivXvcWQ5UEkOpcR02vTrtOd00J7Kgc", + "muxPlaybackId": "aZ3npMYSfmUbVkriVvOnj37nT4KqhkAg2mVQr02021ygA" + }, + { + "streamDate": "2023-03-04T11:28:14.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2023-03-04.mp4", + "thumbnail": "content/clhtwhi0q000180qg8l348acr-vod-250-thumb.png", + "ipfsCid": "bafybeifuvodrdbbg5io4gujo4kztfmx2jrvqw6n6quiclraqmwbqbhhj7i", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2023-03-04.mp4", + "muxAssetId": "hiRb8u8z01wNLTFnrJfou02Rgl8pO233DE1lKG35vStYc", + "muxPlaybackId": "UwOw2UjV02WNGhBbdP02JjmM8Z4w2SWsMVtKeE9w100KmI" + }, + { + "streamDate": "2023-11-22T05:23:00.000Z", + "notes": "Part 1 of 2, source resolution was 1080p. Missing the first several minutes.", + "sourceVideo": "content/projektmelody-chaturbate-2023-11-21_part1.mp4", + "thumbnail": "content/1707049508153-5296-vod-308-thumb.png", + "ipfsCid": "bafybeihz56ectxuklgdc4ssyx5ute5rq5ron747ei2tha2csppgxqbgpzu", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2023-11-21_part1.mp4", + "muxAssetId": "01lveIcqCesilM9f9HRIWD014eLDguZvvqwkSI7IH02UT00", + "muxPlaybackId": "IuZSURhB01KHSlmzCwxJ4j00V2gY1LFy02daf02gzjAsQK00" + }, + { + "streamDate": "2023-11-18T08:56:00.000Z", + "notes": "vod provided by Fontana Tessitura ", + "sourceVideo": "content/projektmelody-chaturbate-2023-11-17.mp4", + "thumbnail": "content/1707049629330-3581-vod-307-thumb.png", + "ipfsCid": "bafybeigkoopsvj4qs7qjezwmvn6sgeuceuixn734a6fwvd736zpekogvlu", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2023-11-17.mp4", + "muxAssetId": "DN00v02hsXCxEWe7PhMAPXFbkLpehmrY3JT027ZEbEj4m8", + "muxPlaybackId": "hL01v1D00nDDSModY5ubeIc013Uasq1HB9nHdeH00WotQKA" + }, + { + "streamDate": "2023-01-14T03:21:13.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-20230113.mp4", + "thumbnail": "content/2023-01-13.png", + "ipfsCid": "bafybeiajgkhrpqw2qao2gbm7grdr3bpkzb4naybtvwtvzxzpe5hpxujfou", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-20230113.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2020-12-22T06:01:24.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2020-12-21.mp4", + "thumbnail": "content/csf741sgbjxm2uhrxgkfn8su-vod-81-thumb.png", + "ipfsCid": "bafybeigob4eggjxtafx7d54ijaxkyetml7eoauloqymlowdblgtcbomwki", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2020-12-21.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2022-12-14T09:01:45.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2022-12-14.mp4", + "thumbnail": "content/pbwpnuys8co33hcvogvwz8p8-vod-170-thumb.png", + "ipfsCid": "bafybeidqeepfyf7tvzzfkbwqsmtfibfershvbkfnkkcxgnbe376qovazcy", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2022-12-14.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2023-02-13T08:07:09.000Z", + "notes": "This is the first half of the stream which was streamed in 720p@30", + "sourceVideo": "content/pmel-2023-02-12.mp4", + "thumbnail": "content/2023-02-12.png", + "ipfsCid": "bafybeihmnn2apsril7cpv3wj4htsrkdvgugmnurun7mbm5yn7c4mh4qrhy", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/pmel-2023-02-12.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2022-10-05T07:15:33.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2022-10-04.mp4", + "thumbnail": "content/focvcvypk2mpiodgxhanc4f8-vod-165-thumb.png", + "ipfsCid": null, + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2022-10-04.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2023-05-13T14:49:00.000Z", + "notes": null, + "sourceVideo": "content/pmel-2023-05-12.mp4", + "thumbnail": "content/clhoxhx8100007unl154ncsz7-vod-263-thumb.png", + "ipfsCid": "bafybeibpu3ct4uarserjgvdpx3hykicdibbnhojwz6g7j26fatz5ecg7jq", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/pmel-2023-05-12.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2023-06-17T07:38:00.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2023-06-16.mp4", + "thumbnail": "content/clizjbmgs00027zpf5rv52kel-vod-272-thumb.png", + "ipfsCid": "bafybeicytmhvmnmhtjsoy3cj6putwzqmg2pxnqg4mjnmsj6hb7vyvkw47i", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2023-06-16.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2020-08-12T07:01:22.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-20200811T230122Z.mp4", + "thumbnail": "content/lw8iod1w4a8jj2q8hldvc5g0-vod-206-thumb.png", + "ipfsCid": "bafybeihjdmdmpl5yglkmspkryztnofcdxfnoxl6bvnnvxtocafvrlkyeae", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-20200811T230122Z.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2021-08-05T07:11:38.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2021-08-04.mp4", + "thumbnail": "content/gn8w1yzzinjkuxbn7go0qz9k-vod-110-thumb.png", + "ipfsCid": "bafybeich6hucnqgbaragnyeftua3c2mjuf725upfl5zcii7gsgtcdesmyi", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2021-08-04.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2024-02-03T08:20:00.000Z", + "notes": null, + "sourceVideo": "content/el_xox-chaturbate-2024-02-02.mp4", + "thumbnail": "content/1710396855738-7035-vod-319-thumb.png", + "ipfsCid": "bafybeid22bhhl5eua6mtaryr2d3mstnafal4pxe2eg7n6rjmbfdulcgfk4", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/el_xox-chaturbate-2024-02-02.mp4", + "muxAssetId": "YsT9DuiQi02EbmdRWG2GU33S00rP6hHA46h8eTVBluJ5g", + "muxPlaybackId": "WGivPRxAT1geQRiO485T5JTyNYqov6uj3aC5jMqb1028" + }, + { + "streamDate": "2024-02-04T09:56:00.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2024-02-04.mp4", + "thumbnail": "content/1707048841164-2384-vod-320-thumb.png", + "ipfsCid": "bafybeiaxufbxwwgfl75xvs7swetqk5ov2a6uz4ki4x5a5qyfamxljt6dhq", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2024-02-04.mp4", + "muxAssetId": "N84PS3m43ggo8stilIh01FaWJrC1JZXufVcXugHodNyE", + "muxPlaybackId": "gmG1EI800UVJI02rJ00aO6cjmt4ADDrZmHf8JgIfzCnbFw" + }, + { + "streamDate": "2023-12-04T08:16:00.000Z", + "notes": "Source resolution from Chaturbate was 720p", + "sourceVideo": "content/projektmelody-chaturbate-2023-12-03.mp4", + "thumbnail": "content/1707049381626-9477-vod-310-thumb.png", + "ipfsCid": "bafybeiejms45zzonfe7ndr3mp4vmrqrg3btgmuche3xkeq5b77uauuaxkm", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2023-12-03.mp4", + "muxAssetId": "HAMPLeywDL7nhkBpAQ3ciUxR3phFbfX5K017K1n1uNWk", + "muxPlaybackId": "2o1T4yI7deApS01HRdn00HvRpuaYRRl013Xk7JOmOijRZ00" + }, + { + "streamDate": "2023-03-03T11:04:05.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2023-03-03.mp4", + "thumbnail": "content/2023-03-03.png", + "ipfsCid": "bafybeicrsthjde33kbv256mwprcfflpuxn6uthvprjicrbmkaoo7m3xzje", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2023-03-03.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2024-03-09T17:56:00.000Z", + "notes": "720p source from Chaturbate\nThis is part 1 of 2 (part2 is different resolution)", + "sourceVideo": "content/projektmelody-chaturbate-2024-03-09-part1.mp4", + "thumbnail": "content/1709968346319-1756-vod-325-thumb.png", + "ipfsCid": "bafybeidt3e2hgp3v5ts7357k2xmk2xpbbabtp3rc6zrp44yklltevp77uy", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2024-03-09-part1.mp4", + "muxAssetId": "MEMOmcr2jBq3bxE8wy6TcvOauG8qcJSr5z5PT01u019EY", + "muxPlaybackId": "GqGtLcpXpL48VDO02ThFDWhKaZQunQ327Lv3VbZRqoiU" + }, + { + "streamDate": "2024-03-18T13:43:00.000Z", + "notes": "el_xox quick solo steam before her collab with projektmelody", + "sourceVideo": "content/el_xox-chaturbate-2024-03-17.mp4", + "thumbnail": "content/1710741786469-7039-vod-331-thumb.png", + "ipfsCid": "bafybeig4zkoxre57tammena3mkch5vlefjatig4tzw3t7vdbba3dllm3le", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/el_xox-chaturbate-2024-03-17.mp4", + "muxAssetId": "oeShsSBYssqXqZT3E02UuHgt6fOthVG3YZHPLxt00hZL8", + "muxPlaybackId": "vgar9UnlWHxlG02GwPzklFA007Ao00cU6aCVynR5AZo1zw" + }, + { + "streamDate": "2024-03-18T15:56:00.000Z", + "notes": "collab between projektmelody and el_xox\n\n1080p60 source on CB\n\nvod provided by Fontana Tessitura", + "sourceVideo": "content/projektmelody-chaturbate-2024-03-17.mp4", + "thumbnail": "content/1710762172418-3271-vod-330-thumb.png", + "ipfsCid": "bafybeidkswvoh5quhldsdmevqydqi4q4iekk6vsmqodwnbqnfpy3qhxrra", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2024-03-17.mp4", + "muxAssetId": "QJdYXWkU4NpI7EeMtS26bm019uZuQOxIAvnyd8DkpbWM", + "muxPlaybackId": "QexkKBst00xSGCnd2dDDegUMMrMGZLxVHmLQngV00aOwo" + }, + { + "streamDate": "2024-03-04T07:26:00.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2024-03-04.mp4", + "thumbnail": "content/1709539402953-4038-vod-323-thumb.png", + "ipfsCid": "bafybeifobvzoott6xqoamdjo5i3zhqmouupblitapkqgiilos42qvnvsyy", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2024-03-04.mp4", + "muxAssetId": "gOUT87oC97AhJNwp1v4Ma5PkeIdS8q7ZidlmoRZLwpE", + "muxPlaybackId": "y00uH01pd01S167wJGpkFpnnM8ZIhOyW8kIEzP02VsGnulw" + }, + { + "streamDate": "2024-02-14T12:53:00.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2024-02-13.mp4", + "thumbnail": "content/1707896671539-2113-vod-321-thumb.png", + "ipfsCid": "bafybeieh46glpmsgid5ccp47qasf2wscvil4lbbe5cd4nr4vtlyv7ytrwy", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2024-02-13.mp4", + "muxAssetId": "c8nfhkB1Grb3ihehto257a01MwPHZNaPi8WXlIMA9Luw", + "muxPlaybackId": "QLYCKs401JKgA02LEqvwboLR1ba02oSSyDUleX9Ftl2y6o" + }, + { + "streamDate": "2024-03-09T17:57:00.000Z", + "notes": "part 2 of 2\n1080p source from Chaturbate", + "sourceVideo": "content/projektmelody-chaturbate-2024-03-09-part2.mp4", + "thumbnail": "content/1709973784957-7294-vod-326-thumb.png", + "ipfsCid": "bafybeigsicixeytikrsdxr4qwgwqendyr6kcmktoklnx7rfazaewlgjw54", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2024-03-09-part2.mp4", + "muxAssetId": "njGEJISnswSjZ3lYvZ01amQGo00mr3eUSZ4mvHF7Ccfy4", + "muxPlaybackId": "FEwdSmiKstkoXWRA9Xfq01hiVVCg7Z8fsSqBkhuWJxJA" + }, + { + "streamDate": "2024-03-18T10:29:00.000Z", + "notes": "This was a test stream as Mel prepared tech for her el_xox collab later that night.", + "sourceVideo": "content/projektmelody-chaturbate-2024-03-17-test.mp4", + "thumbnail": "content/1710743537849-1102-vod-329-thumb.png", + "ipfsCid": "bafybeia55lpzbdwr6qp4lthoj6bvcalt3g6ehz5ot54tdlryqp3ck5u6gu", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2024-03-17-test.mp4", + "muxAssetId": "Eu6auHJJLicRellSJvwP8QyRxG1va0102GIAJZLLudxZM", + "muxPlaybackId": "01bT1hLFc8S4Wq1uUxih027Kfh69tZdS8gdUAost6Bywk" + }, + { + "streamDate": "2024-03-14T14:21:00.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2024-03-14.mp4", + "thumbnail": "content/1710387870609-738-vod-328-thumb.png", + "ipfsCid": "bafybeifphgh46qcarhxteiirwb5mbmkgr4crpjsdrhjmphzpyjgzv3kui4", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2024-03-14.mp4", + "muxAssetId": "zi02Z3FIkO6mg2eZh01vGX01xF5X00fzcnCencov4IJTom00", + "muxPlaybackId": "El8jIh9vta6dlAP6Rnwsp1CTC7jaSVT2ZOitSJt02UF4" + }, + { + "streamDate": "2024-02-22T08:47:00.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2024-02-22.mp4", + "thumbnail": "content/1708573318968-9171-vod-322-thumb.png", + "ipfsCid": "bafybeifvvio5vicuk2rspksmv6upxfdbet33ixjsya7d3ksre5urck6ykm", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2024-02-22.mp4", + "muxAssetId": "M01gDA7sbXebzzwKS8nblPK6pufhLMZI3p0200o6m7lHPw", + "muxPlaybackId": "mOOGfPc8B4dddwZQUq34RgtnT3q74KFgrlXjcRkGWcU" + }, + { + "streamDate": "2024-03-02T08:33:00.000Z", + "notes": null, + "sourceVideo": "content/el_xox-chaturbate-2024-03-01.mp4", + "thumbnail": "content/1710396969926-6699-vod-324-thumb.png", + "ipfsCid": "bafybeif2y25cd5e6aeoghku3mtd5hgsnud3afkmshti4lavor2bh7ww5ga", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/el_xox-chaturbate-2024-03-01.mp4", + "muxAssetId": "005Trs2mzQtfdTuKVgVTLSnQv6rNXOIne8Sm2YyGZCOI", + "muxPlaybackId": "x500cVvSbanSgYVFRrZEdkSMO02CiRTkLKuNqBPve4TmU" + }, + { + "streamDate": "2024-03-10T11:07:00.000Z", + "notes": null, + "sourceVideo": "content/el_xox-chaturbate-2024-03-10.mp4", + "thumbnail": "content/1710397118225-9316-vod-327-thumb.png", + "ipfsCid": "bafybeicxxpalxtygqxkku6qpsfggpzmwhvjgxrmxuty6az3cefv3ec3ya4", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/el_xox-chaturbate-2024-03-10.mp4", + "muxAssetId": "3Nokn7xGweXd25YMn9Xp86JKlnHxApU02yYuH023rSOMY", + "muxPlaybackId": "008BxEi86GVkokW1l01GdTXstb02KDACEUVp2029U2NaByg" + }, + { + "streamDate": "2024-03-23T15:32:00.000Z", + "notes": null, + "sourceVideo": "content/projektmelody-chaturbate-2024-03-22.mp4", + "thumbnail": "content/1711168630443-3251-vod-332-thumb.png", + "ipfsCid": "bafybeic5qidhpf7ommxglaa42xjcqzda43fhtgqixvrjnseyp7f5obtesm", + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2024-03-22.mp4", + "muxAssetId": "CzbDO7vc7ijVaCNu202Mdhpd6016i9scafL4VXdze18Ng", + "muxPlaybackId": "6Jp02UWmV5I6f00q9016CgOOLlDv1y4NdBWhgiRV9800HuM" + }, + { + "streamDate": "2024-03-24T15:51:00.000Z", + "notes": null, + "sourceVideo": null, + "thumbnail": null, + "ipfsCid": null, + "videoSrcB2": null, + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2024-03-28T15:16:00.000Z", + "notes": null, + "sourceVideo": "content/athena-airis-chaturbate-2024-03-27.mp4", + "thumbnail": null, + "ipfsCid": null, + "videoSrcB2": "https://futureporn-b2.b-cdn.net/athena-airis-chaturbate-2024-03-27.mp4", + "muxAssetId": null, + "muxPlaybackId": null + }, + { + "streamDate": "2025-05-30T09:29:00.000Z", + "notes": "IPFS CID bafybeicyf6fe4qy6ezz4yk52zoj24vq2xsher5ijmo23lmom2ewahrkab4", + "sourceVideo": "content/projektmelody-chaturbate-2025-05-30.mp4", + "thumbnail": "content/projektmelody-chaturbate-2025-05-30-thumb.png", + "ipfsCid": null, + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2025-05-30.mp4", + "muxAssetId": "mTgKfMp7ttqZGjNQsI011HZ6bqwac1uPbuW5dzaFwhm4", + "muxPlaybackId": "wIpjI7rsNRxzWUn55Hi6EkYzpKSzTARIktfiSZqIGjM" + }, + { + "streamDate": "2025-10-19T09:25:00.000Z", + "notes": "Recorded using ffmpeg. Recorded via Chaturbate. \n\nIPFS CID bafybeibobrcup7ikxlf4e45qwpfzfikvn6oqoqgsoi346fhmanndssume4\n\nMagnet link magnet:?xt=urn:btih:ec42b1de8076a2b2e45d20a766def46ac6adf863&dn=projektmelody-chaturbate-2025-10-19.mp4", + "sourceVideo": "content/projektmelody-chaturbate-2025-10-19.mp4", + "thumbnail": "content/projektmelody-chaturbate-2025-10-19-thumb.png", + "ipfsCid": null, + "videoSrcB2": "https://futureporn-b2.b-cdn.net/projektmelody-chaturbate-2025-10-19.mp4", + "muxAssetId": "02FF4N3wFx3EqgZpu8IOi801y7pUqHZDDyVfOR9yJVEF4", + "muxPlaybackId": "6xetfA524QRN02s74SqLn1Wmd9wESo91e00epY4FlTe02I" + } +] \ No newline at end of file diff --git a/services/pocketbase/utils/data_migrations/vtubers.json b/services/pocketbase/utils/data_migrations/vtubers.json new file mode 100644 index 00000000..3a5f0721 --- /dev/null +++ b/services/pocketbase/utils/data_migrations/vtubers.json @@ -0,0 +1,94 @@ +[ + { + "slug": "projektmelody", + "displayName": "ProjektMelody", + "chaturbate": "https://chaturbate.com/projektmelody", + "twitter": "https://twitter.com/projektmelody", + "patreon": "https://www.patreon.com/projektmelody", + "twitch": "https://twitch.tv/projektmelody", + "tiktok": "https://www.tiktok.com/@realprojektmelody", + "onlyfans": "https://onlyfans.com/projektbutt", + "youtube": "https://www.youtube.com/projektmelodyofficial", + "linktree": "https://linktr.ee/projektmelody", + "carrd": null, + "fansly": "https://fansly.com/r/scienceteam", + "pornhub": "https://www.pornhub.com/model/projekt-melody", + "discord": null, + "reddit": "https://www.reddit.com/r/projektmelody/", + "throne": "https://throne.com/realprojektmelody", + "instagram": null, + "facebook": null, + "merch": "https://melody.vshojo.com/", + "description": "Also known as, \"Daddy's little grandpa,\" ProjektMelody is the pioneering hentai cam model who embodies a unique blend of sweetness and perversion. She engages with her audience with remarkable patience and politeness, demonstrating her commitment to fostering an inclusive environment.\nOn her livestreams, ProjektMelody's demeanor can range from overtly sexual to adorably reserved and self-censored. Alongside her captivating presence, she actively promotes pro-social behavior, advocates for sexual education, and emphasizes the importance of kindness.", + "themeColor": "#5C23C0" + }, + { + "slug": "el_xox", + "displayName": "el_XoX", + "chaturbate": "https://chaturbate.com/el_xox/", + "twitter": "https://twitter.com/el_XoX34", + "patreon": null, + "twitch": "https://www.twitch.tv/el_xox", + "tiktok": null, + "onlyfans": null, + "youtube": null, + "linktree": null, + "carrd": "https://elxox.carrd.co/", + "fansly": null, + "pornhub": null, + "discord": null, + "reddit": null, + "throne": null, + "instagram": null, + "facebook": null, + "merch": "https://elxox34.com/pages/limited-merch", + "description": null, + "themeColor": "#353FFF" + }, + { + "slug": "vexruby", + "displayName": "Vexruby", + "chaturbate": "https://chaturbate.com/vexruby", + "twitter": "https://x.com/vexxxruby", + "patreon": "https://www.patreon.com/ViRoClub", + "twitch": null, + "tiktok": null, + "onlyfans": null, + "youtube": null, + "linktree": null, + "carrd": null, + "fansly": null, + "pornhub": null, + "discord": null, + "reddit": null, + "throne": null, + "instagram": null, + "facebook": null, + "merch": null, + "description": null, + "themeColor": "#f882f5" + }, + { + "slug": "athena_airis", + "displayName": "AIRIS ATHENA", + "chaturbate": "https://chaturbate.com/athena_airis/", + "twitter": "https://twitter.com/Athena_Airis", + "patreon": null, + "twitch": "https://www.twitch.tv/athena_airis", + "tiktok": "https://tiktok.com/@athena_airis", + "onlyfans": null, + "youtube": "https://www.youtube.com/channel/UClizqUqSuy26sO01qsPh5bw", + "linktree": "https://linktr.ee/athenaairis", + "carrd": null, + "fansly": "https://fansly.com/Athena-Airis", + "pornhub": null, + "discord": "https://discord.gg/eXPTgua", + "reddit": null, + "throne": null, + "instagram": "https://instagram.com/theathenaairis", + "facebook": null, + "merch": null, + "description": null, + "themeColor": "#dde1ec" + } +] \ No newline at end of file diff --git a/services/pocketbase/utils/deploy.js b/services/pocketbase/utils/deploy.js new file mode 100644 index 00000000..a94e3d98 --- /dev/null +++ b/services/pocketbase/utils/deploy.js @@ -0,0 +1,43 @@ +#!/usr/bin/env node + +import PocketBase from 'pocketbase'; +import { spawn } from 'node:child_process'; +import util from 'node:util'; +const spawnAsync = util.promisify(spawn); + +if (!process.env.POCKETBASE_PASSWORD) throw new Error('POCKETBASE_PASSWORD missing in env'); +if (!process.env.POCKETBASE_USERNAME) throw new Error('POCKETBASE_USERNAME missing in env'); +if (!process.env.APPURL) throw new Error('APPURL missing in env'); + +const pb = new PocketBase('http://localhost:8090'); + +await pb + .collection("_superusers") + .authWithPassword(process.env.POCKETBASE_USERNAME, process.env.POCKETBASE_PASSWORD); + +// change to the production APPURL +await pb.settings.update({ + meta: { + appName: 'Futureporn', + appUrl: 'https://futureporn.net', + }, +}); + +// upload the site +spawnAsync('rsync', [ + '-avz', + '-e', + 'ssh', + '.', + 'root@fp:/home/pb/pb' +]); + +// @see https://pocketbase.io/docs/api-settings/#update-settings + +// put it back to dev app url +await pb.settings.update({ + meta: { + appName: 'Futureporn', + appUrl: process.env.APPURL, + }, +}); \ No newline at end of file