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}) %>
+
+
+
+
+
+
+
+
+
+
+
+
+ <% if (auth) { %>
+
+
+ <% } else { %>
+
+ <% } %>
+
+
+
+
+
+
+
+
+
+
+ <%- slots.body || slot%>
+
+
+
+
+
+
+
+
+
+
+
+
\ 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
+
+
+
+ Show <%= auth.get('name') %> on the patrons page
+
+
+
+
+
+
+
\ 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'}" <% } %>>
+
+
+
+ preload="none" <% } %>>
+ <% if (data.vod?.get('videoSrcB2')) { %>
+
+ <% } else { %>
+ Your browser does not support the video tag.
+ <% } %>
+
+
+
+
+ <% if (data?.user?.get('patron')) { %>
+
+
+
+
+ <% } %>
+
+
+
+
+
+
+ <% if (data?.user?.get('patron')) { %>
+ CDN1 player
+ <% } else { %>
+ CDN1 player (patrons only)
+ <% } %>
+ CDN2 player
+
+
+
+
+
+
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}`;
+ %>
+
+
+ ]]>
+
+ <%= 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) { %>
+
+
+
+
+ Stream Date
+ VTubers
+
+
+
+ <% for (const vod of data.vods) { %>
+
+
+
+ <%= 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) { %>
+
+ <% } %>
+
\ 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?.displayName || data.vtuber?.get?.('displayName') || 'Unknown VTuber' %>
+
+
+
+
+
+
+ VODs
+
+ <%
+ const vods = data.vtuber.get('expand')?.vods || [];
+ if (vods.length > 0) {
+ %>
+
+ <% for (const vod of vods) { %>
+
+ <% } %>
+
+ <% } 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 += `
+
+
+
+
+
+ ${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 += `
+ -
+
+
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 00000000..04e664e9
Binary files /dev/null and b/services/pocketbase/pb_public/favicon.ico differ
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