MyGo 云音乐
Go와 MyGo로 만든 서드파티 네이버 클라우드 뮤직 데스크톱 클라이언트
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
Generate spicy, adult-oriented fairy tales with AI-powered storytelling, multi-voice audio narration, and professional export optionsREADME 전문 보기 ↗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