Skip to content

[codex] Improve quick creation and rebrand studio#1

Draft
MofaceJojo wants to merge 30 commits into
mainfrom
codex/quick-create-and-morpheus-rebrand
Draft

[codex] Improve quick creation and rebrand studio#1
MofaceJojo wants to merge 30 commits into
mainfrom
codex/quick-create-and-morpheus-rebrand

Conversation

@MofaceJojo

Copy link
Copy Markdown
Owner

What changed

  • Move MoneyPrinterTurbo video and subtitle controls into Quick Create
  • Reorganize Quick Create into clearer grouped tabs and remove version information
  • Add stock media, subtitle, transition, and multi-output generation support
  • Rename the internal pixelle_video package and remaining Pixelle/Piexle branding to morpheus_video_studio / Morpheus Video Studio
  • Update API, Web UI, Docker, packaging, workflows, documentation, repository links, and launch scripts

Why

This consolidates the most-used creation controls into the main workflow, simplifies the Quick Create layout, and makes project branding consistent throughout the repository.

Impact

The Python import package is now morpheus_video_studio; external scripts importing pixelle_video must update their imports.

Validation

  • python -m compileall -q morpheus_video_studio api web
  • Core package and FastAPI imports verified
  • git diff --check
  • Full repository scan confirms no Pixelle/Piexle references remain
  • Streamlit Quick Create page launched and visually verified
  • pytest reports no test files in the repository

MofaceJojo and others added 14 commits June 4, 2026 19:29
- Fade concat now pads each clip's tail (frozen frame + silence) before
  crossfading, so transitions consume padding instead of narration:
  adjacent narrations no longer overlap and total duration stays equal
  to the sum of all segments (audio-driven duration is preserved)
- Frame duration probe failures now fall back to the known audio
  duration instead of hardcoding 1.0s
- OmniVoice TTS retries transient failures (connect errors, timeouts,
  5xx) with backoff; 4xx errors still fail fast
- ComfyUI TTS audio download uses an explicit generous timeout instead
  of httpx's 5s default
- Un-ignore tests/test_*.py so regression tests are tracked
- Add regression tests covering the audio-duration-driven chain and the
  retry behaviour

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SUxhmjs5aLcsjqWQCi6qXD
…apshot)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…-sfta4i' into codex/quick-create-and-morpheus-rebrand

# Conflicts:
#	morpheus_video_studio/services/tts_service.py
#	morpheus_video_studio/services/video.py
…nore rule

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
….py split

Shot pacing (fixes "frantic cuts" and "frozen frame"):
- StoryboardConfig gains shot_min/max_seconds, shot_max_count, and a
  hard max-hold cap; plan_visual_shots can exceed max_shots (ceiling 8)
  so long narrations never hold one still image too long
- Quick-create UI gains a pacing profile select (shorts fast / YouTube
  calm), defaulting to calm for 16:9 landscape
- Empty motion-effect selection now falls back to gentle motion;
  fully static frames require an explicit "none" choice
- create_video_from_images cycles stills when the plan needs more
  shots than images (a truncating zip desynced audio/video)

Delivery hardening:
- video_qa.py QA gate after concat: stream integrity, audio-driven
  duration drift, freezedetect (static picture), silencedetect
  (broken narration); warnings attached to VideoGenerationResult
- subtitle_export.py writes final.srt beside final.mp4 from real
  per-narration audio durations, for manual platform uploads

Refactor:
- split 1804-line services/video.py into a package: probe / motion /
  concat / segments / bgm mixins + VideoService facade; import
  surface unchanged

ComfyUI workflows:
- rewrite image_flux.json for installed flux1-schnell Q3 GGUF
  (core nodes only, 4 steps; verified end-to-end)
- archive image_qwen.json and video_wan2.1_fusionx.json (models not
  installed / exceed 17GB unified memory)
- retarget 国风古风 / 儿童绘本 / 日系二次元 presets to local models
  (nano_banana was a paid API, violating the zero-cost goal)

Hygiene:
- GitHub Actions CI running pytest with ffmpeg
- remove dead web/pages/1_🎬_Home.py (unreferenced since rebrand)
- roadmap: distribution stays manual by user decision; AiToEarn shelved

Tests: 50 passed (was 38 at takeover).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

(Note: CI workflow file committed separately due to OAuth workflow-scope limits.)
@MofaceJojo MofaceJojo force-pushed the codex/quick-create-and-morpheus-rebrand branch from 452d2cf to 859c1c4 Compare July 3, 2026 16:09
MofaceJojo and others added 15 commits July 4, 2026 00:59
- describe the software as it exists: three design goals (zero-cost,
  reliable output, manual publishing), workshop pages, real pipeline
- fix badges and clone URLs (repo is MofaceJojo/media-studio)
- drop prototype leftovers: upstream community QR codes, papers table,
  stale three-column UI walkthrough, dead Windows-package/tutorial links
- keep AIDC-AI prototype attribution and reference projects
- refresh update log with July 2026 work

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Design system generated with the ui-ux-pro-max skill (persisted to
design-system/morpheus-video-studio/MASTER.md): OLED dark studio —
violet primary #7C3AED, waveform-green accent #22C55E, midnight
background #0F172A, Inter typography.

- .streamlit/config.toml: native dark theme so built-in widgets match
- studio_shell.py: rewrite injected CSS on semantic design tokens;
  unified dark surfaces (was light panels on dark chrome), violet
  interaction states across buttons/tabs/radio/checkbox/slider/tags,
  distinct primary CTA, 44px touch targets, visible focus rings,
  sidebar active-page highlight, tabular numerals for metrics,
  prefers-reduced-motion support; legacy --studio-* aliases kept for
  page-level CSS
- History page: fallback video placeholder now uses theme tokens
  (was hardcoded light gray)

Verified in live preview across Studio / Video Workshop / Settings;
no console errors; 50 tests pass.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The repo launcher pointed at the outdated ~/Applications copy (June 2
code). Now targets /Volumes/MACDATA/morpheus-video-studio, keeps the
NO_PROXY / Playwright env vars, and when port 8501 is held by an old
streamlit instance of this app it shuts it down automatically instead
of failing with 'Port 8501 is not available'. Desktop copy synced.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
User found the OLED black+violet too harsh. Offered three calmer
directions via the ui-ux-pro-max palette database; user chose navy
professional light:

- off-white #F8FAFC background, white surfaces, slate text
- navy #1E3A5F primary (buttons, tags, sliders, focus rings)
- confirm-green #059669 accent (metric bars); mint #34D399 on navy
- deep-navy #16304D sidebar and hero kept dark as brand anchors,
  with explicit light text and green active-page indicator
- streamlit base theme flipped to light so BaseWeb widgets match
- MASTER.md updated with the chosen palette as the source of truth

Verified in live preview (Studio + Video Workshop, 1280px), no
console errors, 50 tests pass.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ures

OpenRouter reasoning models (gpt-oss, deepseek-r1, o-series) reject
requests that disable reasoning outright with 400 'Reasoning is
mandatory for this endpoint'. The OpenRouter default now sends
effort=low + exclude=true instead of effort=none: mandatory-reasoning
endpoints accept it, think-text stays out of the output, and models
without reasoning support ignore it.

Also add backoff retry (3 attempts) around chat.completions.create for
rate limits (429 — common on free-tier models), 5xx and connection
drops; other 4xx still fail fast. Applied to both text and structured
output paths.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The base topic prompt is tuned for viewpoint-sharing ('like chatting
with a friend', resonate→inspire), which made science/TCM/ranking/
medical topics drift into life-insight chatter. Recipes overlay a
vertical-specific structure with hard factual requirements:

- 科普知识: counter-intuitive hook, one hard fact per scene, myth
  debunk, actionable close; feelings-talk forbidden
- 中药百科: identity → 性味归经/efficacy (sourced classics + modern
  research) → usage → contraindications; mandatory 遵医嘱 disclaimer;
  no efficacy promises or dosages
- 排名盘点: suspense open, countdown N→1 with one hard fact per entry,
  champion twist + interaction close
- 医学健康: symptom → mechanism → normal-vs-see-a-doctor → advice;
  mandatory not-a-diagnosis disclaimer; no prescriptions, no panic
- general: unchanged default

Wired end-to-end: prompt injection point, generate_narrations_from_topic,
standard pipeline param, quick-create UI selector + draft path.

LLM hardening (surfaced by free-tier testing):
- strip leaked <think> blocks from message content
- treat HTTP-200-with-empty-choices (OpenRouter provider hiccup) as
  transient and retry

Tests: 61 passed.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The 'video' workflows generated batch_size independent stills (no
temporal linking) and stitched them at 6fps — a strobing slideshow,
another source of the reported frame-flicker. The installed
AnimateDiff-Evolved module (v3_sd15_mm.ckpt) was never wired in.

Rebuilt both workflows with ADE_AnimateDiffLoaderGen1 (autoselect beta
schedule): 16 frames @8fps (standard) / 12 frames @12 steps (fast).
Measured adjacent-frame difference dropped 62.0 → 5.8 (-91%) on the
same ghibli-style prompt — output is now a coherent motion clip.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Pending push: requires 'gh auth refresh -h github.com -s workflow' to grant
the workflow scope, then 'git push'.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
CI has fewer optional dependencies, so route count differs by
environment; assert only the essential health/tts/video routers.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
comfykit lives in the project venv / CI install, not in every local
interpreter; importorskip keeps the CI signal without false local reds.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
On CI a site-packages top-level 'api' module shadowed the repo's api/
package, so the smoke test loaded a bare FastAPI app with no routers.
Purge cached 'api' modules and rely on the repo-root sys.path entry.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- empty content with finish_reason=length now retries once with a 4x
  budget before failing, and the final error names instruct-type
  models to switch to
- narration generators raise max_tokens 2000→6000: reasoning tokens
  count against the budget on free reasoning models (tencent/hy3,
  nemotron), which truncated narration JSON mid-array

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…e page

Root cause: preset detection required base_url AND model to both match a
preset's defaults. A custom model on a known provider (any OpenRouter
:free model) failed the match, so returning to Settings fell back to
'Custom', dropped the saved model from the provider view, and refused to
reuse the saved API key — then the next save silently skipped the LLM
section while still showing an overall success message.

- presets: add find_preset_by_base_url(); provider detected by base_url
  alone keeps the saved custom model in the form
- saved API key applies whenever the provider is unchanged (or both
  saved & selected are Custom)
- settings page reloads config from disk on render, so external edits
  are shown instead of a stale boot-time snapshot being written back
- partial save now shows an explicit error naming the missing fields
  instead of a success toast

Also includes LLM hardening from this session: empty-content+length
retries once with 4x budget; narration generators 2000→6000 tokens
(reasoning tokens count against the budget on free reasoning models).

Verified via live UI drive: save → navigate away → return keeps preset,
custom model, and saved-key state. 61 tests pass.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants