# Surprise Me - Architecture Diagrams ## System Architecture Overview ```mermaid graph TB User[User] --> Sidebar[Sidebar Navigation] Sidebar --> SurpriseMePage[Surprise Me Page] SurpriseMePage --> AlgorithmSelector[Algorithm Selector] SurpriseMePage --> RecommendationGrid[Recommendation Grid] SurpriseMePage --> RefreshButton[Refresh Button] AlgorithmSelector --> API[/api/videos/recommendations] RefreshButton --> API API --> RecService[Recommendation Service] RecService --> SmartMix[Smart Mix Algorithm] RecService --> WeightedRandom[Weighted Random] RecService --> ForgottenGems[Forgotten Gems] RecService --> SimilarFavorites[Similar to Favorites] RecService --> TimeBased[Time-Based] RecService --> PureRandom[Pure Random] RecService --> UnwatchedFirst[Unwatched First] SmartMix --> Database[(SQLite Database)] WeightedRandom --> Database ForgottenGems --> Database SimilarFavorites --> Database TimeBased --> Database PureRandom --> Database UnwatchedFirst --> Database Database --> MediaTable[media table] Database --> AccessTable[media_access table] Database --> BookmarksTable[bookmarks table] Database --> StarsTable[stars table] RecommendationGrid --> VideoCard[Video Cards] VideoCard --> VideoPlayer[Unified Video Player] VideoCard --> AccessTracking[Track Access API] AccessTracking --> Database ``` ## Data Flow Diagram ```mermaid sequenceDiagram participant User participant SurpriseMePage participant API participant RecService participant Database participant VideoPlayer User->>SurpriseMePage: Click "Surprise Me" in sidebar SurpriseMePage->>API: GET /api/videos/recommendations?algorithm=smart_mix API->>RecService: getRecommendations('smart_mix', 20) RecService->>Database: Query media table RecService->>Database: Query media_access table RecService->>Database: Query bookmarks & stars Database-->>RecService: Return matching videos RecService->>RecService: Apply algorithm logic RecService->>RecService: Score and rank videos RecService-->>API: Return top 20 videos API-->>SurpriseMePage: JSON response with videos SurpriseMePage->>User: Display 20 recommended videos User->>VideoCard: Click video to watch VideoCard->>VideoPlayer: Open player with video VideoCard->>API: POST /api/media-access/:id {type: "view"} API->>Database: INSERT into media_access Database-->>API: Success User->>VideoPlayer: Play video VideoPlayer->>API: POST /api/media-access/:id {type: "play"} API->>Database: INSERT into media_access ``` ## Database Schema Diagram ```mermaid erDiagram MEDIA ||--o{ MEDIA_ACCESS : tracks MEDIA ||--o{ BOOKMARKS : has MEDIA ||--o{ STARS : has MEDIA }o--|| LIBRARIES : belongs_to MEDIA { int id PK int library_id FK string path string type string title int size string thumbnail int bookmark_count int star_count float avg_rating datetime created_at } MEDIA_ACCESS { int id PK int media_id FK string access_type datetime created_at } BOOKMARKS { int id PK int media_id FK datetime created_at } STARS { int id PK int media_id FK int rating datetime created_at } LIBRARIES { int id PK string path } ``` ## Algorithm Decision Flow ```mermaid graph TD Start[User Opens Surprise Me] --> CheckAlgorithm{Algorithm Selected?} CheckAlgorithm -->|Default| SmartMix[Smart Mix Algorithm] CheckAlgorithm -->|User Selected| SelectedAlg[Selected Algorithm] SmartMix --> DistributeLoad[Distribute Load] DistributeLoad --> WR[30% Weighted Random] DistributeLoad --> FG[25% Forgotten Gems] DistributeLoad --> SF[20% Similar Favorites] DistributeLoad --> UF[15% Unwatched First] DistributeLoad --> TB[10% Time-Based] WR --> Combine[Combine & Shuffle] FG --> Combine SF --> Combine UF --> Combine TB --> Combine SelectedAlg --> SingleAlg[Run Single Algorithm] SingleAlg --> Combine Combine --> Dedupe[Remove Duplicates] Dedupe --> LimitResults[Limit to 20 videos] LimitResults --> Display[Display to User] ``` ## Weighted Random Scoring Flow ```mermaid graph LR Video[Video] --> BaseScore[Base Score: Random 0.5-1.0] BaseScore --> CheckAccess{Ever Accessed?} CheckAccess -->|Yes| CalcRecency[Calculate Days Since View] CheckAccess -->|No| MaxRecency[Recency Multiplier = 1.0] CalcRecency --> RecencyMult[Recency Multiplier:
min 1.0, days/90] RecencyMult --> ApplyRecency[Score × Recency] MaxRecency --> ApplyRecency ApplyRecency --> CheckRating{Has Rating?} CheckRating -->|Yes| RatingMult[Rating Multiplier:
1.0 + rating/10] CheckRating -->|No| NoRating[Rating Multiplier = 1.0] RatingMult --> ApplyRating[Score × Rating] NoRating --> ApplyRating ApplyRating --> CheckDiversity{From Underrepresented
Library?} CheckDiversity -->|Yes| DiversityBonus[Diversity Bonus:
Score × 1.2] CheckDiversity -->|No| NoDiversity[No Bonus] DiversityBonus --> FinalScore[Final Score] NoDiversity --> FinalScore FinalScore --> Rank[Rank Against Others] ``` ## UI Component Hierarchy ```mermaid graph TD App[App Layout] --> Sidebar[Sidebar] App --> MainArea[Main Content Area] Sidebar --> SurpriseMenuItem[🎲 Surprise Me Item] SurpriseMenuItem --> SurpriseMePage[Surprise Me Page] MainArea --> SurpriseMePage SurpriseMePage --> Header[Page Header] SurpriseMePage --> Controls[Control Panel] SurpriseMePage --> Grid[Recommendation Grid] Header --> Title[Title & Description] Header --> Stats[Statistics] Controls --> AlgoDropdown[Algorithm Dropdown] Controls --> RefreshBtn[Refresh Button] Controls --> LimitSelector[Limit Selector] Grid --> VirtualGrid[Virtualized Grid] VirtualGrid --> VideoCard1[Video Card 1] VirtualGrid --> VideoCard2[Video Card 2] VirtualGrid --> VideoCardN[Video Card N] VideoCard1 --> Thumbnail[Thumbnail] VideoCard1 --> Info[Video Info] VideoCard1 --> Badge[Recommendation Badge] VideoCard1 --> Actions[Actions] Actions --> PlayBtn[Play Button] Actions --> BookmarkBtn[Bookmark] Actions --> RatingStars[Star Rating] ``` ## State Management Flow ```mermaid stateDiagram-v2 [*] --> Initial Initial --> Loading: User clicks Surprise Me Loading --> Loaded: Recommendations received Loading --> Error: API Error Error --> Loading: User retries Loaded --> Refreshing: User clicks Refresh Loaded --> ChangingAlgorithm: User changes algorithm Refreshing --> Loaded: New recommendations received Refreshing --> Error: API Error ChangingAlgorithm --> Loading: Fetching with new algorithm Loaded --> PlayingVideo: User clicks video PlayingVideo --> Loaded: User closes player PlayingVideo --> TrackingAccess: Video opened TrackingAccess --> Loaded: Access tracked ``` ## Recommendation Algorithm Comparison ```mermaid graph LR subgraph "Algorithm Characteristics" WR[Weighted Random
Balanced & Fair] FG[Forgotten Gems
Personal History] SF[Similar Favorites
Folder-Based] TB[Time-Based
Temporal Patterns] PR[Pure Random
Complete Surprise] UF[Unwatched First
New Content] SM[Smart Mix
Best of All] end subgraph "User Goals" Variety[Want Variety] Rediscover[Rediscover Old] Similar[Similar to Favorites] New[Explore New] Surprise[Complete Surprise] end Variety --> WR Variety --> SM Rediscover --> FG Similar --> SF New --> UF New --> TB Surprise --> PR ``` ## Access Tracking Integration ```mermaid graph TB subgraph "User Actions" OpenPlayer[Open Video Player] StartPlayback[Start Playback] BookmarkVideo[Bookmark Video] RateVideo[Rate Video] end subgraph "Tracking System" TrackView[Track: view] TrackPlay[Track: play] TrackBookmark[Track: bookmark] TrackRate[Track: rate] end subgraph "Database" MediaAccessTable[media_access table] end subgraph "Recommendation Engine" UseInAlgorithms[Use in Future Recommendations] end OpenPlayer --> TrackView StartPlayback --> TrackPlay BookmarkVideo --> TrackBookmark RateVideo --> TrackRate TrackView --> MediaAccessTable TrackPlay --> MediaAccessTable TrackBookmark --> MediaAccessTable TrackRate --> MediaAccessTable MediaAccessTable --> UseInAlgorithms UseInAlgorithms --> RecencyPenalty[Apply Recency Penalty] UseInAlgorithms --> IdentifyFavorites[Identify Favorite Patterns] UseInAlgorithms --> FindUnwatched[Find Unwatched Videos] ``` ## Performance Optimization Strategy ```mermaid graph TB Request[Recommendation Request] --> CheckCache{Cache Hit?} CheckCache -->|Yes| ReturnCached[Return Cached Results] CheckCache -->|No| QueryDB[Query Database] QueryDB --> UseIndexes[Use Optimized Indexes] UseIndexes --> idx1[idx_media_access_created_at] UseIndexes --> idx2[idx_media_type_created_at] UseIndexes --> idx3[idx_media_bookmark_count] idx1 --> ExecuteQuery[Execute Query] idx2 --> ExecuteQuery idx3 --> ExecuteQuery ExecuteQuery --> LimitResults[LIMIT 20] LimitResults --> ScoreRank[Score & Rank] ScoreRank --> CacheResults[Cache for 5 minutes] CacheResults --> ReturnResults[Return Results] ReturnCached --> ReturnResults ``` --- ## Legend ### Diagram Types - **Architecture Overview**: High-level system components - **Data Flow**: Request/response sequences - **Database Schema**: Entity relationships - **Algorithm Flow**: Decision trees and logic - **Component Hierarchy**: UI structure - **State Management**: Application states - **Performance**: Optimization strategies ### Color Coding - **Blue**: User-facing components - **Green**: Backend services - **Yellow**: Database operations - **Purple**: Algorithm logic - **Orange**: Tracking/analytics --- **Related Documentation**: - [Complete Design Document](SURPRISE_ME_RECOMMENDATION_DESIGN.md) - [Quick Summary](SURPRISE_ME_SUMMARY.md) - [Main Docs Index](README.md)