MyGo 云音乐
用 Go 与 MyGo 写成的第三方网易云音乐桌面客户端。原生界面,没有 WebView;边下边播,无损与 Hi-Res,逐字歌词与「律动」,刘海播放器。
Translation pending
Generate adult-oriented fairy tales with AI, multi-voice audio, and export options
AI summary · README
MediaTypeScript · HTMLGitHub @PhazzieOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Loading the full README. The saved excerpt is shown below.
Generate spicy, adult-oriented fairy tales with AI-powered storytelling, multi-voice audio narration, and professional export optionsRead the full README ↗Generate spicy, adult-oriented fairy tales with AI-powered storytelling, multi-voice audio narration, and professional export options
[Character]: / [Character, voice: …]: / [Narrator]: tags the story generator already writes into every chapterELEVENLABS_VOICE_POOL once and every AI-generated character name spreads across it, or pin a known recurring character with an ELEVENLABS_VOICE_<CHARACTER_NAME> override — see Custom Voices belowELEVENLABS_API_KEY; without one, a deterministic silent narration of the same length in development and tests, so the feature is fully testable offline. A production deployment with no key answers AI_UNAVAILABLE instead — it never narrates silence and calls it a success.git clone https://github.com/Phazzie/FairytaleswithSpice.git
cd FairytaleswithSpice
# Install root dependencies
npm install
# Install frontend dependencies
cd story-generator && npm install && cd ..
Create a .env file in the root directory:
# Optional: AI Story Generation (uses mocks if not provided)
XAI_API_KEY=your_grok_api_key_here
# Optional: Audio Generation (uses mocks if not provided)
ELEVENLABS_API_KEY=your_elevenlabs_api_key_here
# Optional: post `logCritical(...)` alerts (system failures, security issues)
# to a webhook instead of console-only logging, when NODE_ENV=production —
# `logCritical` never dispatches beyond the console otherwise, so this has no
# effect in the development setup below. Accepts any endpoint that takes a
# Slack-incoming-webhook-shaped `{ text }` POST body, Slack included. A
# malformed URL is reported (and degrades `/api/health`) rather than silently
# failing every delivery — see the Health Check section.
CRITICAL_ALERT_WEBHOOK_URL=https://hooks.slack.com/services/your/webhook/url
# Development settings
NODE_ENV=development
# Optional: Story Lab cloud storage (signed-in profile + project library).
# Defaults to `postgres` (requires DATABASE_URL) since that has always been
# this store's only implementation; an unset DATABASE_URL degrades
# `/api/health` (503) rather than silently erroring on every profile/project
# request. `non_durable_memory` is a local/test convenience only, not a
# supported production fallback: it keeps the backend from hard-erroring
# without a database, but the Angular client already treats that mode as
# unavailable (a signed-in library that can't actually save or sync), so
# `/api/health` also reports it as degraded rather than healthy — see the
# Health Check section.
STORY_LAB_CLOUD_STORAGE=postgres
# Start frontend (Angular dev server)
cd story-generator && npm run dev
# API functions are automatically deployed to Vercel
# No local backend server needed - uses Vercel serverless functions
This project follows a unique methodology where every data boundary is explicitly defined:
// Example: Story Generation Seam
interface StoryGenerationSeam {
input: {
creature: CreatureType;
themes: ThemeType[];
userInput: string;
spicyLevel: SpicyLevel;
wordCount: WordCount;
};
output: {
storyId: string;
title: string;
content: string;
// ... complete contract definition
};
}
FairytaleswithSpice/
├── 📁 story-generator/ # Angular 20.3 Frontend
│ ├── src/app/
│ │ ├── contracts.ts # Frontend seam contracts
│ │ ├── app.ts # Main application component
│ │ ├── story.service.ts # API communication
│ │ └── debug-panel/ # Development tools
│ └── ...
├── 📁 api/ # Vercel Serverless Functions
│ ├── health.ts # Health check endpoint
│ ├── story/
│ │ ├── generate.ts # Story generation endpoint
│ │ └── continue.ts # Chapter continuation
│ ├── audio/
│ │ └── convert.ts # Audio conversion endpoint
│ └── lib/
│ ├── services/ # Core business logic
│ └── types/ # Shared type definitions
├── 📁 .github/workflows/ # Enterprise CI/CD Pipeline
└── 📁 tests/ # Integration test suites
The system automatically detects speaker patterns in generated stories:
[Vampire Lord]: "Come closer, my dear..."
[Fairy Princess]: "I'll never succumb to your darkness!"
[Narrator]: The tension in the moonlit chamber was palpable.
Each speaker gets a unique voice:
After generating a story, you can export in multiple formats:
Frontend (story-generator/)
npm run dev # Development server with hot reload
npm run build # Production build
npm run test # Run unit tests
npm run lint # Code quality checks
API Development (now integrated with frontend)
# Build and run locally (all-in-one Express server)
cd story-generator
npm run build
PORT=3000 node dist/story-generator/server/server.mjs
# Or use Docker for local development
docker compose up --build
# Test API endpoints
curl http://localhost:3000/api/health
curl -X POST http://localhost:3000/api/story/generate \
-H "Content-Type: application/json" \
-d '{"creature":"vampire","themes":["romance"],"spicyLevel":2,"wordCount":700}'
Integration Tests (tests/)
npm run test:integration # Full end-to-end tests
The application works fully without external APIs:
Mock Mode (default):
Production Mode (with API keys):
Access with Ctrl+Shift+D or click the debug button:
Deploy to Digital Ocean App Platform for scalable, cost-effective hosting:
.do/app.yaml configurationXAI_API_KEY=your_grok_key
ELEVENLABS_API_KEY=your_elevenlabs_key
Cost: Starting at $5/month (Basic plan) - much cheaper than Vercel for production!
📋 Complete Digital Ocean Deployment Guide
⚠️ Note: This app has been migrated to work better with Digital Ocean, but Vercel still works:
XAI_API_KEY=your_grok_key
ELEVENLABS_API_KEY=your_elevenlabs_key
# Local Docker development
docker compose up --build
# Production Docker deployment
docker build -t fairytales-with-spice .
docker run -p 8080:8080 \
-e XAI_API_KEY=your_key \
-e ELEVENLABS_API_KEY=your_key \
fairytales-with-spice
# Run all tests
npm test
# Frontend tests only
cd story-generator && npm test
# API tests only
cd api && npm test
# Integration tests
cd tests && npm run test:integration
git checkout -b feature/amazing-featureGET /api/health
Returns 200 with status: "healthy" normally, or 503 with status: "degraded"
when the rate-limit store, Story Lab job store, or Story Lab cloud storage
(signed-in profile/project library) is misconfigured. Falling back to the
in-memory/non-durable default is not itself degraded for the rate-limit store
or job store — those keep doing their actual job (per-instance rate limiting,
in-process job progress) either way, so only an unsupported mode value or an
unreachable postgres mode degrades them. Story Lab cloud storage is the one
exception: its default mode is postgres, not a non-durable fallback (see
Environment Setup above), and its non_durable_memory mode is also
degraded rather than healthy — unlike the other two stores' non-durable
defaults, this one means the signed-in profile/project library itself
doesn't work for its purpose (the Angular client's own CloudLibraryService
already treats that storage mode as unavailable). So this field is healthy
only in a reachable postgres mode.
services.criticalAlerting reports where logCritical(...) calls are actually
delivered right now: { mode: "console" } by default, or { mode: "webhook", configured: true } once CRITICAL_ALERT_WEBHOOK_URL is set and
NODE_ENV=production (see Environment Setup below) — logCritical never
dispatches beyond the console outside production, so this field reports
console there even with a valid URL configured, rather than claiming a
destination nothing will call yet. A syntactically invalid URL reports
{ mode: "webhook", configured: false } and does flip the overall
status to degraded (503) — unlike the two durable stores above, this is
the one case where an unset/console-only default is fine but a broken
explicit configuration is not.
POST /api/story/generate
Content-Type: application/json
{
"creature": "vampire",
"themes": ["romance", "mystery"],
"userInput": "Victorian London setting",
"spicyLevel": 3,
"wordCount": 900
}
POST /api/audio/convert
Content-Type: application/json
{
"storyId": "story_123",
"chapterId": "chapter_1",
"content": "<p>[Narrator]: The candles guttered.</p><p>[Lord Damien, voice: velvet-smoke]: \"Come closer.\"</p>",
"speed": 1.0,
"format": "wav"
}
voice is optional and, when sent, overrides every segment's resolved voice — see Custom Voices below for the per-character default. With no ELEVENLABS_API_KEY configured, the route answers a deterministic silent narration of the same length instead of calling ElevenLabs, so the feature works fully offline in development and tests. A production deployment (NODE_ENV/VERCEL_ENV = production) with no key instead answers every request with AI_UNAVAILABLE — the same fail-closed rule this repo applies to story and image generation — rather than silently narrating minutes of silence and reporting success.
content must estimate to 3 minutes of narration or less (about 450 words at the default speed) — the response is one inline data: URI, not a stream or a stored file, and a longer request is refused with INVALID_INPUT before any synthesis runs. The frontend's "Preview Narration" control sends the chapter's opening rather than the whole thing for this reason.
/api/image/generate is live and counted against the Story Lab's tracked Vercel function budget (see scripts/recovery/check-vercel-function-count.sh), alongside /api/audio/convert added for narration.
View complete API documentation
CreatureType in contracts.tsCharacter names are written by the AI fresh for every story, so pre-registering an env var per name isn't realistic — the setup most deployments actually want is ELEVENLABS_VOICE_POOL, a fixed set of real voice ids configured once:
ELEVENLABS_VOICE_POOL=your_voice_id_1,your_voice_id_2,your_voice_id_3
ELEVENLABS_VOICE_NARRATOR=your_voice_id
Each speaker's name is hashed to a stable slot in the pool, so the same character gets the same voice across every chapter and continuation of a story, and distinct characters spread across the pool rather than collapsing onto one voice.
For a known, recurring character you want pinned to a specific voice regardless of the pool, set a per-character override named after them:
ELEVENLABS_VOICE_LORD_DAMIEN=your_voice_id
AudioService resolves each speaker tag to a voice in this order: the caller's voice override, the per-character override, ELEVENLABS_VOICE_NARRATOR for the narrator specifically, ELEVENLABS_VOICE_POOL, then a flat ELEVENLABS_VOICE_DEFAULT fallback for anyone still unresolved. The deterministic id after that is a mock-mode-only fallback — it is never a real ElevenLabs voice, so with ELEVENLABS_API_KEY set, a speaker that reaches it instead fails the request with a configuration error naming the speaker. A production deployment needs at least one of ELEVENLABS_VOICE_DEFAULT or ELEVENLABS_VOICE_POOL set.
Extend the export service with additional format handlers following the existing seam contract pattern.
Story Generation Fails
Audio Not Working
Build Errors
npm ci to clean install dependenciesnpm cache clean --forceEnable verbose logging:
NODE_ENV=development
DEBUG=fairytales:*
This project is licensed under the MIT License - see the LICENSE file for details.
🚀 Digital Ocean Deployment Guide | 📖 Documentation | 🐳 Docker Setup
Made with ❤️ and a touch of spice