feat: podcast demo mode with ALWRITY_ENABLED_FEATURES support

- Add ALWRITY_ENABLED_FEATURES env var for feature gating
- Podcast-only mode: skip LLM bootstrap, scheduler, persona services
- Enhance video generation prompt with scene context, analysis, narration
- Add voice cloning support via custom_voice_id in WaveSpeed
- Add text-to-speech for research results (browser speechSynthesis)
- Fix render queue to sync images from script phase
- Add WaveSpeed LLM pricing (gpt-oss-120b)
- Fix podcast bible generation error handling
- Refactor RouterManager for feature-based router loading
This commit is contained in:
ajaysi
2026-04-03 06:59:59 +05:30
parent c52b1eabc9
commit 63bb937796
58 changed files with 3568 additions and 1597 deletions

View File

@@ -5,6 +5,7 @@ import { useSubscription } from "../../contexts/SubscriptionContext";
import { podcastApi } from "../../services/podcastApi";
import { fetchMediaBlobUrl, clearMediaCache } from "../../utils/fetchMediaBlobUrl";
import { getLatestBrandAvatar } from "../../api/brandAssets";
import { VoiceSelector } from "../shared/VoiceSelector";
// Imported Components
import { CreateHeader } from "./CreateStep/CreateHeader";
@@ -43,6 +44,7 @@ export const CreateModal: React.FC<CreateModalProps> = ({ onCreate, open, defaul
const [enhancingTopic, setEnhancingTopic] = useState(false);
const [enhanceTopicProgressIndex, setEnhanceTopicProgressIndex] = useState(0);
const [knobs, setKnobs] = useState<Knobs>({ ...defaultKnobs });
const [selectedVoiceId, setSelectedVoiceId] = useState<string>("Wise_Woman");
const [placeholderIndex, setPlaceholderIndex] = useState(0);
const [avatarTab, setAvatarTab] = useState(0);
const [loadingBrandAvatar, setLoadingBrandAvatar] = useState(false);
@@ -318,11 +320,17 @@ export const CreateModal: React.FC<CreateModalProps> = ({ onCreate, open, defaul
}
}
// Include selected voice in knobs
const finalKnobs = {
...knobs,
voice_id: selectedVoiceId,
};
onCreate({
ideaOrUrl: finalUrl || finalIdea,
speakers,
duration,
knobs,
knobs: finalKnobs,
budgetCap,
files: { voiceFile, avatarFile },
avatarUrl: finalAvatarUrl,
@@ -342,6 +350,7 @@ export const CreateModal: React.FC<CreateModalProps> = ({ onCreate, open, defaul
setEnhancingTopic(false);
setEnhanceTopicProgressIndex(0);
setKnobs({ ...defaultKnobs });
setSelectedVoiceId("Wise_Woman");
setPlaceholderIndex(0);
};
@@ -565,6 +574,12 @@ export const CreateModal: React.FC<CreateModalProps> = ({ onCreate, open, defaul
setCameraSelfieOpen={setCameraSelfieOpen}
/>
<VoiceSelector
value={selectedVoiceId}
onChange={setSelectedVoiceId}
showVoiceClone={true}
/>
<CreateActions
reset={reset}
submit={submit}