# SimVision - tvOS VOD Streaming Application

A SwiftUI-based tvOS application for streaming Video On Demand content from XStream-compatible m3u playlists.

## Overview

SimVision is a tvOS app that:
- Authenticates via a custom web service
- Retrieves XStream server credentials
- Fetches and parses m3u playlists
- Displays VOD content in a tvOS-optimized interface
- Plays video streams using AVPlayer

## Project Status

All source files have been created (24 Swift files). The Xcode project needs to be created and configured.

## Setup Instructions

### 1. Create Xcode Project

1. Open Xcode
2. Select **File > New > Project**
3. Choose **tvOS > App**
4. Configure the project:
   - **Product Name**: simvision
   - **Organization Identifier**: com.yourdomain (replace with your identifier)
   - **Interface**: SwiftUI
   - **Language**: Swift
   - **Minimum Deployment**: tvOS 17.0 or later
5. Save the project in `/Users/michaelsimard/dev/tvos/simvision`

### 2. Add Source Files to Xcode

1. In Xcode, select the `simvision` folder in the Project Navigator
2. Right-click and select **Add Files to "simvision"...**
3. Navigate to the `simvision` directory containing the Swift files
4. Select all folders (App, Models, Views, Services, etc.)
5. Ensure **"Create groups"** is selected
6. Ensure **"Add to targets: simvision"** is checked
7. Click **Add**

### 3. Configure Project Settings

#### Required Capabilities

1. Select the project in the Project Navigator
2. Select the **simvision** target
3. Go to **Signing & Capabilities**
4. Click **+ Capability**
5. Add **Outgoing Connections (Client)** - required for network requests

#### Update Constants

Edit `simvision/Utilities/Constants.swift`:

```swift
enum API {
    static let authenticationBaseURL = "https://your-actual-web-service.com"
    static let authenticationEndpoint = "/api/auth"
    // ... rest of configuration
}
```

Replace `"https://your-actual-web-service.com"` with your actual web service URL.

### 4. Build and Run

1. Select **Product > Build** (⌘B) to compile
2. Select a tvOS Simulator from the scheme selector
3. Select **Product > Run** (⌘R) to launch the app

## Project Structure

```
simvision/
├── App/
│   ├── simvisionApp.swift           # App entry point
│   └── AppState.swift                # Global state coordinator
├── Models/
│   ├── Credentials.swift             # Authentication models
│   ├── VODItem.swift                 # VOD item model
│   ├── Playlist.swift                # Playlist container
│   └── APIResponse.swift             # API response models
├── Views/
│   ├── Authentication/
│   │   └── PasswordEntryView.swift   # Login screen
│   ├── Main/
│   │   ├── MainTabView.swift         # Root navigation
│   │   └── VODLibraryView.swift      # VOD grid
│   ├── Detail/
│   │   └── VODDetailView.swift       # Video details
│   ├── Player/
│   │   └── VideoPlayerView.swift     # Video player
│   └── Components/
│       ├── VODCardView.swift         # Thumbnail card
│       ├── LoadingView.swift         # Loading indicator
│       └── ErrorView.swift           # Error display
├── Services/
│   ├── NetworkService.swift          # HTTP client
│   ├── AuthenticationService.swift   # Authentication logic
│   ├── PlaylistService.swift         # Playlist fetching
│   └── StorageService.swift          # Secure storage
├── Parsers/
│   └── M3UParser.swift               # M3U playlist parser
├── ViewModels/
│   ├── AuthenticationViewModel.swift
│   ├── VODLibraryViewModel.swift
│   └── VideoPlayerViewModel.swift
└── Utilities/
    ├── Constants.swift                # App constants
    ├── Extensions.swift               # Swift extensions
    └── NetworkError.swift             # Error types
```

## Architecture

### Authentication Flow

1. User enters password in `PasswordEntryView`
2. `AuthenticationService` sends password to web service via header
3. Web service returns XStream credentials (server, port, username, password)
4. Credentials are stored securely in Keychain via `StorageService`
5. App navigates to `MainTabView`

### Playlist Flow

1. `PlaylistService` constructs XStream URL with credentials
2. Downloads m3u playlist from XStream server
3. `M3UParser` parses m3u format and extracts VOD items
4. `VODLibraryView` displays items in a grid
5. User selects item → `VODDetailView` → `VideoPlayerView`

### State Management

- `AppState`: Central ObservableObject managing authentication, credentials, and playlist
- Environment Object pattern distributes state to all views
- ViewModels handle view-specific logic

## Web Service API Requirements

Your authentication web service should implement:

**Endpoint**: `POST /api/auth`

**Request Headers**:
```
X-Password: user_entered_password
```

**Response** (200 OK):
```json
{
  "serverUrl": "example.com",
  "port": "8080",
  "username": "user123",
  "password": "pass456"
}
```

**Error Response** (401/403):
```json
{
  "error": "Authentication failed"
}
```

## XStream Integration

The app fetches playlists using the XStream API format:

```
http://server:port/get.php?username=X&password=Y&type=m3u_plus&output=ts
```

Expected m3u format:
```
#EXTM3U
#EXTINF:-1 tvg-id="123" tvg-name="Movie Name" tvg-logo="http://..." group-title="Movies",Movie Name
http://server:port/movie/username/password/12345.mp4
```

## Features

### Implemented

- ✅ Password-based authentication
- ✅ XStream credentials retrieval
- ✅ M3U playlist parsing (VOD)
- ✅ VOD library grid view
- ✅ Category filtering
- ✅ Video playback with AVPlayer
- ✅ Secure credential storage (Keychain)
- ✅ Error handling and display
- ✅ Loading states
- ✅ tvOS focus engine support

### Future Enhancements

- Live TV streams
- Electronic Program Guide (EPG)
- Favorites/watchlist
- Search functionality
- Continue watching
- Multiple profiles

## Troubleshooting

### Build Errors

1. **Missing imports**: Ensure all files are added to the target
2. **Deployment target**: Verify tvOS 17.0+ is selected
3. **Code signing**: Configure signing in project settings

### Runtime Issues

1. **Authentication fails**: Check web service URL in `Constants.swift`
2. **Playlist not loading**: Verify XStream server credentials
3. **Videos not playing**: Ensure URLs are valid and accessible

### Network Debugging

The app includes comprehensive error messages with recovery suggestions. Check:
- `NetworkError` enum for error types
- Console logs for detailed error information
- Network connectivity

## Testing

### Simulator Testing

1. Use the tvOS Simulator in Xcode
2. Navigate with mouse clicks or keyboard (arrow keys = D-pad)
3. Test focus states and navigation flow

### Device Testing

1. Connect Apple TV via Xcode
2. Select device as run destination
3. Test with Siri Remote for actual user experience

## Requirements

- **Xcode**: 15.0 or later
- **tvOS**: 17.0 or later
- **Swift**: 5.9 or later
- **Frameworks**: SwiftUI, AVKit, Combine, Foundation

## Security Notes

- User passwords are never stored, only transmitted once
- XStream credentials are stored in Keychain (encrypted)
- No logging of sensitive information
- HTTPS recommended for web service (update Constants.swift)

## License

Copyright © 2026. All rights reserved.
