chore(dev24): update tracking and ui palette

This commit is contained in:
Stu Leak 2026-01-06 16:50:12 -05:00
parent 784d6cba52
commit 3ba3deab8b
5 changed files with 197 additions and 26 deletions

39
BUGS.md
View File

@ -2,7 +2,7 @@
Track all bugs, issues, and behavioral problems here. Update this file whenever you discover or fix a bug.
**Last Updated**: 2026-01-05 16:05 UTC
**Last Updated**: 2026-01-06 19:35 UTC
---
@ -59,7 +59,22 @@ Track all bugs, issues, and behavioral problems here. Update this file whenever
## 🟠 High Priority Bugs (Major Issues)
None currently open.
### BUG-010: Upscale jobs show no progress during FFmpeg conversions
- **Status**: ✅ FIXED (2026-01-06, needs verification)
- **Reporter**: Jake (2026-01-06)
- **Module**: Upscale / Queue
- **Description**: Upscale jobs that rely on FFmpeg conversions stay at 0.0% progress even while running; status updates do not advance until completion.
- **Steps to Reproduce**:
1. Run Upscale job that uses FFmpeg conversion
2. Observe queue progress
3. Expected: Progress updates during conversion
4. Actual: Progress remains 0.0% until completion
- **Impact**: High - No feedback during long-running jobs
- **Root Cause**: FFmpeg progress parsing relied on stderr time updates; piped output used CR-only updates.
- **Files to Check**:
- `main.go:executeUpscaleJob` (progress pipe parsing)
- **Fixed By**: Codex
- **Verified**: No
---
@ -75,6 +90,26 @@ None currently open.
---
## 🧭 Feature Requests (Planned)
### FEAT-003: Enhancement module blur control
- **Status**: 🧭 PLANNED
- **Reporter**: Jake (2026-01-06)
- **Module**: Enhancement
- **Description**: Enhancement panel should include a blur control in addition to sharpen/denoise.
- **Impact**: Medium - expected control in enhancement workflow
- **Notes**: Add to enhancement UI alongside existing sliders.
### FEAT-004: Upscale output quality should use Bitrate Mode controls
- **Status**: 🧭 PLANNED
- **Reporter**: Jake (2026-01-06)
- **Module**: Upscale
- **Description**: Replace Upscale "Output Quality" with the Bitrate Mode controls used in Convert Advanced.
- **Impact**: Medium - consistent workflow across modules
- **Notes**: Reuse Convert bitrate UI pattern once state manager is stable.
---
## ✅ Recently Fixed (Last 7 Days)
### BUG-001: Quality Preset showing in CBR/VBR modes (should only show in CRF)

View File

@ -2,13 +2,13 @@
This file tracks what each agent is currently working on to prevent conflicts and coordinate changes.
**Last Updated**: 2026-01-04 21:10 UTC
**Last Updated**: 2026-01-06 19:05 UTC
---
## 🔴 Current Blockers
- **Build Status**: ✅ PASSING
- **Build Status**: ❌ FAILING (main.go syntax errors introduced by unified player changes)
- **Critical Bug**: BUG-005 - CRF quality settings not showing when CRF mode selected (see BUGS.md)
---
@ -59,7 +59,7 @@ This file tracks what each agent is currently working on to prevent conflicts an
---
### 🤖 opencode
**Status**: 🎯 PRIORITY HANDOFF - Fix critical bug + widget deduplication
**Status**: 🧩 IN PROGRESS - Unified player integration + CRF fixes
**🔥 IMMEDIATE TASKS** (from Claude):
1. **FIX BUG-005** (CRITICAL): CRF quality settings not showing
@ -116,6 +116,20 @@ This file tracks what each agent is currently working on to prevent conflicts an
---
### 🤖 Codex (UI focus)
**Status**: 🧱 ACTIVE - UI palette separation + state manager scaffolding
**Working On Now** (2026-01-06):
- ✅ Added `internal/state/convert_manager.go` (state manager scaffolding for Convert)
- ✅ Updated codec palette separation to make format/audio/video colors more distinct
**Next for Codex**:
1. Wire `ConvertManager` into convert UI (quality + bitrate mode visibility)
2. Validate CRF visibility paths once build passes
3. Review any cross-category color clashes in dropdown lists
---
## 📝 Shared Files - Coordinate Before Modifying!
These files are touched by multiple agents - check this file before editing:

View File

@ -28,11 +28,16 @@ This roadmap is intentionally lightweight. It captures the next few high-priorit
- **Enhancement module foundation** - DEPENDS ON PLAYER
- Unified Filters + Upscale workflow
- Content-type aware processing (general/anime/film)
- Add blur control alongside sharpen/denoise
- AI model management system (extensible for future models)
- Multi-pass processing pipeline
- Before/after preview system
- Real-time enhancement feedback
- **Upscale workflow parity**
- Replace Upscale output quality with Convert-style Bitrate Mode controls
- Ensure FFmpeg-based upscale jobs report progress in queue
## Next (dev25+)
- **Enhancement module completion** - DEPENDS ON PLAYER

View File

@ -0,0 +1,117 @@
package state
import (
"strings"
"sync"
)
// ConvertManager centralizes convert UI state and change notifications.
// It is intentionally UI-agnostic; widgets should subscribe via callbacks.
type ConvertManager struct {
mu sync.RWMutex
quality string
bitrateMode string
manualQualityOption string
onQualityChange []func(string)
onBitrateModeChange []func(string)
}
func NewConvertManager(quality, bitrateMode, manualQualityOption string) *ConvertManager {
if strings.TrimSpace(manualQualityOption) == "" {
manualQualityOption = "Manual (CRF)"
}
return &ConvertManager{
quality: quality,
bitrateMode: bitrateMode,
manualQualityOption: manualQualityOption,
}
}
func (m *ConvertManager) Quality() string {
m.mu.RLock()
defer m.mu.RUnlock()
return m.quality
}
func (m *ConvertManager) BitrateMode() string {
m.mu.RLock()
defer m.mu.RUnlock()
return m.bitrateMode
}
func (m *ConvertManager) ManualQualityOption() string {
m.mu.RLock()
defer m.mu.RUnlock()
return m.manualQualityOption
}
func (m *ConvertManager) SetQuality(val string) bool {
m.mu.Lock()
if m.quality == val {
m.mu.Unlock()
return false
}
m.quality = val
callbacks := append([]func(string){}, m.onQualityChange...)
m.mu.Unlock()
for _, cb := range callbacks {
cb(val)
}
return true
}
func (m *ConvertManager) SetBitrateMode(val string) bool {
m.mu.Lock()
if m.bitrateMode == val {
m.mu.Unlock()
return false
}
m.bitrateMode = val
callbacks := append([]func(string){}, m.onBitrateModeChange...)
m.mu.Unlock()
for _, cb := range callbacks {
cb(val)
}
return true
}
func (m *ConvertManager) OnQualityChange(fn func(string)) {
if fn == nil {
return
}
m.mu.Lock()
m.onQualityChange = append(m.onQualityChange, fn)
m.mu.Unlock()
}
func (m *ConvertManager) OnBitrateModeChange(fn func(string)) {
if fn == nil {
return
}
m.mu.Lock()
m.onBitrateModeChange = append(m.onBitrateModeChange, fn)
m.mu.Unlock()
}
func (m *ConvertManager) IsManualQuality() bool {
m.mu.RLock()
defer m.mu.RUnlock()
return m.quality == m.manualQualityOption
}
func NormalizeBitrateMode(mode string) string {
switch {
case strings.HasPrefix(mode, "CRF"):
return "CRF"
case strings.HasPrefix(mode, "CBR"):
return "CBR"
case strings.HasPrefix(mode, "VBR"):
return "VBR"
case strings.HasPrefix(mode, "Target Size"):
return "Target Size"
default:
return mode
}
}

View File

@ -12,43 +12,43 @@ import (
// Container / Format Colors (File Wrapper)
var (
ColorMKV = utils.MustHex("#0EA5E9") // Blue-Sky - Flexible container
ColorMKV = utils.MustHex("#2563EB") // Deep Blue - Flexible container
ColorRemux = utils.MustHex("#9CA3AF") // Neutral Grey - Lossless remux
ColorMP4 = utils.MustHex("#2563EB") // Deep Blue - Consumer-friendly
ColorMOV = utils.MustHex("#7C3AED") // Violet - Pro / Apple lineage
ColorAVI = utils.MustHex("#6B7280") // Grey - Legacy container
ColorWEBM = utils.MustHex("#10B981") // Emerald - Web-native
ColorTS = utils.MustHex("#F59E0B") // Amber - Broadcast / transport streams
ColorM2TS = utils.MustHex("#F97316") // Orange - Broadcast / transport streams
ColorMP4 = utils.MustHex("#1D4ED8") // Navy Blue - Consumer-friendly
ColorMOV = utils.MustHex("#6366F1") // Indigo - Pro / Apple lineage
ColorAVI = utils.MustHex("#64748B") // Slate - Legacy container
ColorWEBM = utils.MustHex("#059669") // Emerald - Web-native
ColorTS = utils.MustHex("#D97706") // Amber - Broadcast / transport streams
ColorM2TS = utils.MustHex("#EA580C") // Orange - Broadcast / transport streams
)
// Video Codec Colors (Compression Method)
// Modern / Efficient Codecs
var (
ColorAV1 = utils.MustHex("#22C55E") // Green - Modern, efficient
ColorHEVC = utils.MustHex("#A855F7") // Purple - Modern, efficient
ColorH265 = utils.MustHex("#A855F7") // Purple - Same as HEVC
ColorVP9 = utils.MustHex("#14B8A6") // Teal - Modern, efficient
ColorHEVC = utils.MustHex("#0D9488") // Teal - Modern, efficient
ColorH265 = utils.MustHex("#0D9488") // Teal - Same as HEVC
ColorVP9 = utils.MustHex("#06B6D4") // Cyan - Modern, efficient
)
// Established / Legacy Video Codecs
var (
ColorH264 = utils.MustHex("#3B82F6") // Blue - Compatibility
ColorAVC = utils.MustHex("#3B82F6") // Blue - Same as H.264
ColorMPEG2 = utils.MustHex("#EAB308") // Yellow-Amber - Legacy / broadcast
ColorDivX = utils.MustHex("#F97316") // Orange - Legacy
ColorXviD = utils.MustHex("#F97316") // Orange - Legacy
ColorMPEG4 = utils.MustHex("#F97316") // Orange - Legacy
ColorH264 = utils.MustHex("#38BDF8") // Sky - Compatibility
ColorAVC = utils.MustHex("#38BDF8") // Sky - Same as H.264
ColorMPEG2 = utils.MustHex("#FBBF24") // Amber - Legacy / broadcast
ColorDivX = utils.MustHex("#FB7185") // Rose - Legacy
ColorXviD = utils.MustHex("#FB7185") // Rose - Legacy
ColorMPEG4 = utils.MustHex("#FB7185") // Rose - Legacy
)
// Audio Codec Colors (Secondary but Distinct)
var (
ColorOpus = utils.MustHex("#EC4899") // Magenta - Modern audio
ColorAAC = utils.MustHex("#F59E0B") // Amber - Common audio
ColorFLAC = utils.MustHex("#8B5CF6") // Violet - Lossless audio
ColorOpus = utils.MustHex("#DB2777") // Magenta - Modern audio
ColorAAC = utils.MustHex("#FB7185") // Rose - Common audio
ColorFLAC = utils.MustHex("#C084FC") // Violet - Lossless audio
ColorMP3 = utils.MustHex("#EF4444") // Red - Legacy audio
ColorAC3 = utils.MustHex("#22C55E") // Green - Surround audio
ColorVorbis = utils.MustHex("#06B6D4") // Cyan - Open codec
ColorAC3 = utils.MustHex("#F59E0B") // Amber - Surround audio
ColorVorbis = utils.MustHex("#F97316") // Orange - Open codec
)
// Pixel Format / Colour Data (Technical Metadata)