Skip to content

Data Flow and State Diagrams

1. Data Flow Diagrams (DFD)

1.1 Context Diagram (Level 0)

graph LR
    USER((User))
    SYSTEM[Video Converter<br/>System]
    PHOTOS[(macOS Photos)]
    STORAGE[(File Storage)]
    ICLOUD[(iCloud)]

    USER -->|Settings, Commands| SYSTEM
    SYSTEM -->|Status, Notifications| USER

    PHOTOS -->|Original Videos| SYSTEM
    SYSTEM -->|Converted Videos| STORAGE

    ICLOUD -->|Cloud Videos| PHOTOS

1.2 Level 1 DFD

graph TB
    subgraph ExternalEntities["External Entities"]
        USER((User))
        PHOTOS[(Photos Library)]
        FS[(File System)]
    end

    subgraph Processes["Processes"]
        P1["1.0<br/>Video Extraction"]
        P2["2.0<br/>Codec Analysis"]
        P3["3.0<br/>Video Conversion"]
        P4["4.0<br/>Metadata Processing"]
        P5["5.0<br/>Quality Validation"]
        P6["6.0<br/>Result Reporting"]
    end

    subgraph DataStores["Data Stores"]
        D1[(Config File)]
        D2[(Conversion Log)]
        D3[(Processing Queue)]
        D4[(Statistics DB)]
    end

    USER -->|Settings| D1
    D1 -->|Config Values| P1
    D1 -->|Encoding Options| P3

    PHOTOS -->|Video List| P1
    P1 -->|Extracted Videos| D3
    D3 -->|Pending Videos| P2

    P2 -->|H.264 Videos| P3
    P2 -->|Already HEVC| P6

    P3 -->|Converted Videos| P4
    P3 -->|Progress| P6

    P4 -->|Metadata Restored| P5

    P5 -->|Validation Complete| FS
    P5 -->|Validation Failed| P3

    P6 -->|Notifications| USER
    P6 -->|Logs| D2
    P6 -->|Statistics| D4

1.3 Level 2 DFD - Video Conversion Process Details

graph TB
    subgraph VideoConversion["3.0 Video Conversion"]
        P3_1["3.1<br/>Input Validation"]
        P3_2["3.2<br/>FFmpeg Command Build"]
        P3_3["3.3<br/>Encoding Execution"]
        P3_4["3.4<br/>Progress Monitoring"]
        P3_5["3.5<br/>Error Handling"]
    end

    INPUT[Input Video] --> P3_1
    CONFIG[Encoding Config] --> P3_2

    P3_1 -->|Valid Input| P3_2
    P3_1 -->|Invalid Input| ERROR[Error Queue]

    P3_2 -->|FFmpeg Command| P3_3
    P3_3 -->|Progress Data| P3_4
    P3_3 -->|Error| P3_5

    P3_4 -->|Progress| PROGRESS[Progress Display]
    P3_5 -->|Retry| P3_3
    P3_5 -->|Failure| ERROR

    P3_3 -->|Success| OUTPUT[Output Video]

2. Data Transformation Flow

2.1 Video File Conversion Path

flowchart LR
    subgraph PhotosLibrary["Photos Library"]
        ORIG["Original H.264<br/>video.mov<br/>1.5GB"]
    end

    subgraph TempDirectory["Temp Directory"]
        EXPORT["Exported Copy<br/>video_export.mov<br/>1.5GB"]
    end

    subgraph Processing["Processing"]
        DECODE["H.264 Decode<br/>Raw Frames"]
        ENCODE["H.265 Encode<br/>VideoToolbox"]
    end

    subgraph OutputDirectory["Output Directory"]
        HEVC["Converted H.265<br/>video_hevc.mp4<br/>~750MB"]
    end

    subgraph ProcessedDirectory["Processed Directory"]
        BACKUP["Original Backup<br/>video.mov"]
    end

    ORIG -->|osxphotos export| EXPORT
    EXPORT -->|FFmpeg input| DECODE
    DECODE -->|Frame data| ENCODE
    ENCODE -->|FFmpeg output| HEVC
    EXPORT -->|After successful conversion| BACKUP

2.2 Metadata Flow

flowchart TB
    subgraph SourceMetadata["Source Metadata"]
        M1["QuickTime Metadata"]
        M2["EXIF/XMP Tags"]
        M3["GPS Coordinates"]
        M4["Creation Date"]
        M5["Camera Info"]
    end

    subgraph Extraction["Extraction"]
        FFPROBE["FFprobe<br/>Basic Metadata"]
        EXIFTOOL_R["ExifTool<br/>Detailed Metadata"]
    end

    subgraph TransferMethods["Transfer Methods"]
        MAP_META["FFmpeg<br/>-map_metadata 0"]
        TAG_COPY["ExifTool<br/>-tagsFromFile"]
        TOUCH["touch -r<br/>Timestamps"]
    end

    subgraph TargetMetadata["Target Metadata"]
        T1["QuickTime Metadata"]
        T2["EXIF/XMP Tags"]
        T3["GPS Coordinates"]
        T4["File Timestamps"]
    end

    M1 --> FFPROBE
    M2 --> EXIFTOOL_R
    M3 --> EXIFTOOL_R
    M4 --> EXIFTOOL_R
    M5 --> EXIFTOOL_R

    FFPROBE --> MAP_META
    EXIFTOOL_R --> TAG_COPY
    M4 --> TOUCH

    MAP_META --> T1
    TAG_COPY --> T2
    TAG_COPY --> T3
    TOUCH --> T4

3. State Diagrams

3.1 Video Processing States

stateDiagram-v2
    [*] --> Discovered: Video discovered

    Discovered --> Queued: Conversion target confirmed
    Discovered --> Skipped: Already HEVC

    Queued --> Exporting: Export started
    Exporting --> Exported: Export complete
    Exporting --> ExportFailed: Export failed

    ExportFailed --> Queued: Retry
    ExportFailed --> Failed: Max retries exceeded

    Exported --> Converting: Conversion started
    Converting --> Converted: Conversion successful
    Converting --> ConvertFailed: Conversion failed

    ConvertFailed --> Converting: Retry
    ConvertFailed --> Failed: Max retries exceeded

    Converted --> Validating: Quality validation
    Validating --> Validated: Validation passed
    Validating --> ConvertFailed: Validation failed

    Validated --> Finalizing: Metadata restoration
    Finalizing --> Completed: Complete

    Completed --> [*]
    Skipped --> [*]
    Failed --> [*]

    note right of Converting
        Progress updates
        0% → 100%
    end note

    note right of Failed
        Move to failed folder
        Log error
    end note

3.2 System Operation States

stateDiagram-v2
    [*] --> Idle: System started

    Idle --> Triggered: Trigger occurred
    note right of Triggered
        - Schedule time reached
        - Folder change detected
        - Manual execution
    end note

    Triggered --> Initializing: Initialization started
    Initializing --> Scanning: Scan started

    Scanning --> Processing: Targets found
    Scanning --> Idle: No targets

    Processing --> BatchRunning: Batch execution

    state BatchRunning {
        [*] --> ExtractingBatch
        ExtractingBatch --> ConvertingBatch
        ConvertingBatch --> FinalizingBatch
        FinalizingBatch --> [*]
    }

    BatchRunning --> Reporting: Batch complete

    Reporting --> Notifying: Report generated
    Notifying --> Cleaning: Notification sent

    Cleaning --> Idle: Cleanup complete

    Idle --> Shutdown: Shutdown requested
    Processing --> Shutdown: Force shutdown
    Shutdown --> [*]

    note right of Idle
        ThrottleInterval wait
        (default 30 seconds)
    end note

3.3 FFmpeg Process States

stateDiagram-v2
    [*] --> Ready: Command prepared

    Ready --> Spawning: Process creation
    Spawning --> Running: Process started

    Running --> Running: Processing frames
    note right of Running
        - Progress updates
        - CPU/Memory monitoring
    end note

    Running --> Succeeded: exit code 0
    Running --> Failed: exit code != 0
    Running --> Timeout: Timeout exceeded
    Running --> Cancelled: User cancelled

    Failed --> Analyzing: Error analysis
    Analyzing --> Retryable: Retryable error
    Analyzing --> NonRetryable: Non-retryable error

    Retryable --> Ready: After retry wait

    Succeeded --> [*]
    NonRetryable --> [*]
    Timeout --> [*]
    Cancelled --> [*]

4. Processing Queue Management

4.1 Queue State Transitions

stateDiagram-v2
    direction LR

    state PendingQueue {
        [*] --> Waiting
        Waiting --> Ready: Resources available
    }

    state ProcessingQueue {
        Ready --> InProgress: Worker assigned
        InProgress --> Completing: Processing complete
    }

    state CompletedQueue {
        Completing --> Success
        Completing --> Failure
    }

    PendingQueue --> ProcessingQueue: dequeue
    ProcessingQueue --> CompletedQueue: finish
    CompletedQueue --> PendingQueue: retry (on failure)

4.2 Concurrent Processing Management

graph TB
    subgraph QueueManager["Queue Manager"]
        PENDING[("Pending Queue<br/>Max 1000")]
        ACTIVE[("Active Queue<br/>Max 2")]
        DONE[("Completed Queue")]
        FAILED[("Failed Queue")]
    end

    subgraph Workers["Workers"]
        W1["Worker 1<br/>Hardware"]
        W2["Worker 2<br/>Hardware"]
    end

    PENDING -->|dequeue| W1
    PENDING -->|dequeue| W2

    W1 -->|success| DONE
    W1 -->|failure| FAILED

    W2 -->|success| DONE
    W2 -->|failure| FAILED

    FAILED -->|retry < 3| PENDING

5. Error States and Recovery

5.1 Error Classification and Handling

stateDiagram-v2
    [*] --> Error: Error occurred

    Error --> Analyzing: Error analysis

    state Analyzing {
        [*] --> Classify
        Classify --> Transient: Transient error
        Classify --> Permanent: Permanent error
        Classify --> Unknown: Unknown error
    }

    Transient --> RetryWithBackoff: Retryable
    note right of Transient
        - Network timeout
        - Resource shortage
        - iCloud sync delay
    end note

    Permanent --> LogAndSkip: Skip
    note right of Permanent
        - Corrupted file
        - Unsupported format
        - Permission denied
    end note

    Unknown --> LogAndRetry: Log and retry
    LogAndRetry --> RetryWithBackoff

    RetryWithBackoff --> Wait: Wait
    Wait --> [*]: Reprocess

    LogAndSkip --> MoveToFailed
    MoveToFailed --> [*]

    note right of Wait
        Backoff strategy:
        attempt 1: 5 seconds
        attempt 2: 10 seconds
        attempt 3: 20 seconds
    end note

5.2 Recovery Workflow

flowchart TB
    START[Error Occurred] --> CHECK_TYPE{Error Type?}

    CHECK_TYPE -->|File not found| FILE_ERROR[FileNotFound]
    CHECK_TYPE -->|Permission denied| PERM_ERROR[PermissionDenied]
    CHECK_TYPE -->|Disk space| DISK_ERROR[DiskSpace]
    CHECK_TYPE -->|FFmpeg error| FFMPEG_ERROR[FFmpegError]
    CHECK_TYPE -->|iCloud| ICLOUD_ERROR[iCloudError]

    FILE_ERROR --> SKIP[Skip]
    PERM_ERROR --> REQUEST_PERM[Request Permission Guide]

    DISK_ERROR --> CLEANUP[Clean Temp Files]
    CLEANUP --> RETRY{Space Available?}
    RETRY -->|Yes| PROCESS[Reprocess]
    RETRY -->|No| NOTIFY_USER[Notify User]

    FFMPEG_ERROR --> ANALYZE_CODE{Exit Code}
    ANALYZE_CODE -->|1| RETRY_SIMPLE[Simple Retry]
    ANALYZE_CODE -->|137| KILLED[Out of Memory]
    ANALYZE_CODE -->|Other| LOG_ERROR[Log Error]

    KILLED --> REDUCE_QUALITY[Reduce Quality Setting]
    REDUCE_QUALITY --> PROCESS

    ICLOUD_ERROR --> WAIT_SYNC[Wait for Sync]
    WAIT_SYNC --> PROCESS

    RETRY_SIMPLE --> PROCESS
    LOG_ERROR --> SKIP

    SKIP --> MOVE_FAILED[Move to Failed Folder]
    NOTIFY_USER --> END[End]
    PROCESS --> END
    REQUEST_PERM --> END
    MOVE_FAILED --> END

6. Configuration Data Structure

6.1 Configuration Hierarchy

graph TB
    subgraph ConfigHierarchy["Configuration Hierarchy"]
        DEFAULT["defaults.json<br/>Default Settings"]
        USER["User Settings<br/>~/.config/video_converter/"]
        PROJECT["Project Settings<br/>./video_converter.json"]
        CLI["CLI Arguments<br/>Command Line Args"]
        ENV["Environment Variables"]
    end

    DEFAULT --> MERGED["Merged Settings"]
    USER --> MERGED
    PROJECT --> MERGED
    CLI --> MERGED
    ENV --> MERGED

    MERGED --> VALIDATED["Validated Settings"]
    VALIDATED --> APP["Application"]

Priority: CLI > ENV > PROJECT > USER > DEFAULT

6.2 Runtime State Storage

erDiagram
    CONVERSION_STATE {
        string session_id PK
        datetime started_at
        datetime updated_at
        string status
        int total_videos
        int completed
        int failed
        int skipped
    }

    VIDEO_STATE {
        string video_id PK
        string session_id FK
        string original_path
        string output_path
        string status
        int attempt_count
        string last_error
        float progress
    }

    CHECKPOINT {
        string checkpoint_id PK
        string session_id FK
        datetime created_at
        blob state_snapshot
    }

    CONVERSION_STATE ||--o{ VIDEO_STATE : contains
    CONVERSION_STATE ||--o{ CHECKPOINT : has

7. Logging Data Flow

7.1 Log Collection and Storage

flowchart LR
    subgraph LogSources["Log Sources"]
        APP_LOG["Application Logs"]
        FFMPEG_LOG["FFmpeg Output"]
        SYSTEM_LOG["System Events"]
    end

    subgraph LogProcessor["Log Processor"]
        FORMATTER["Log Formatter"]
        FILTER["Log Filter"]
        ROUTER["Log Router"]
    end

    subgraph Destinations["Destinations"]
        FILE[("Log Files<br/>~/Library/Logs/")]
        CONSOLE["Console Output"]
        NOTIF["Notification Center"]
    end

    APP_LOG --> FORMATTER
    FFMPEG_LOG --> FORMATTER
    SYSTEM_LOG --> FORMATTER

    FORMATTER --> FILTER
    FILTER --> ROUTER

    ROUTER -->|DEBUG+| FILE
    ROUTER -->|INFO+| CONSOLE
    ROUTER -->|ERROR+| NOTIF