# attajak/vlc-android architecture

> Architecture diagram of the GitHub repository attajak/vlc-android, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-11-09). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/attajak/vlc-android
- Repository: https://github.com/attajak/vlc-android

## Overview

VLC for Android is a media player and library browser, with phone and TV interfaces. The principal workflow is selecting media, managing it in a playlist, and playing it through the playback service and LibVLC; media-library indexing and browsing support discovery. The tree and README also show remote access, metadata scraping, subtitles, and casting-related settings. Several paths are documented or visible only in the tree, so their unverified connections are dashed; the map does not imply inspection of unsampled implementation details.

Main entry points: [`medialibrary/src/org/videolan/medialibrary/interfaces/Medialibrary.java`](https://github.com/attajak/vlc-android/blob/master/medialibrary/src/org/videolan/medialibrary/interfaces/Medialibrary.java) (Media library), [`application/vlc-android/src/org/videolan/vlc/PlaybackService.kt`](https://github.com/attajak/vlc-android/blob/master/application/vlc-android/src/org/videolan/vlc/PlaybackService.kt) (Playback service), [`application/vlc-android/src/org/videolan/vlc/gui`](https://github.com/attajak/vlc-android/tree/master/application/vlc-android/src/org/videolan/vlc/gui) (Phone interface), [`application/vlc-android/src/org/videolan/vlc/media/PlaylistManager.kt`](https://github.com/attajak/vlc-android/blob/master/application/vlc-android/src/org/videolan/vlc/media/PlaylistManager.kt) (Playlist manager)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_discovery["Media discovery"]
  node_storagebrowser["Storage browser"]
  node_storageprovider["Storage provider<br/>[StorageProvider.kt]"]
  node_medialibrary[("Media library<br/>[Medialibrary.java]")]
  node_mediaitems["Media items<br/>[MediaWrapper.java]"]
  node_indexing["Media indexing"]
end

subgraph group_playback["Playback"]
  node_playlist["Playlist manager<br/>[PlaylistManager.kt]"]
  node_playbackservice["Playback service<br/>[PlaybackService.kt]"]
  node_player["Player controller"]
  node_vlcinstance["LibVLC instance<br/>[VLCInstance.kt]"]
end

subgraph group_interfaces["User interfaces"]
  node_phoneui["Phone interface"]
  node_tvui["TV interface"]
  node_video["Video playback UI"]
  node_remoteui["Remote access UI"]
  node_castsettings["Casting preferences"]
end

subgraph group_services["Integrations and state"]
  node_remoteservice["Remote service"]
  node_remoteserver["Remote server"]
  node_moviepedia["Metadata scraping<br/>[MediaScraper.kt]"]
  node_movieapi["Movie metadata API"]
  node_subtitles["Subtitle service"]
  node_mediadb[("App media database<br/>[MediaDatabase.kt]")]
  node_settings[("App settings<br/>[Settings.kt]")]
  node_device["Device capabilities<br/>[AndroidDevices.kt]"]
end

node_user(("Viewer"))

node_user -.->|"selects media"| node_phoneui
node_user -.->|"browses media"| node_tvui
node_phoneui -.->|"opens browser"| node_storagebrowser
node_storagebrowser -->|"reads catalog"| node_medialibrary
node_storagebrowser -.->|"uses provider"| node_storageprovider
node_storageprovider -->|"queries library"| node_medialibrary
node_medialibrary -->|"returns media"| node_mediaitems
node_indexing -.->|"updates catalog"| node_medialibrary
node_phoneui -.->|"queues media"| node_playlist
node_tvui -.->|"starts playback"| node_playlist
node_playbackservice -->|"delegates playback"| node_playlist
node_playlist -.->|"controls player"| node_player
node_player -.->|"uses engine"| node_vlcinstance
node_vlcinstance -->|"sets engine instance"| node_medialibrary
node_playbackservice -->|"uses media catalog"| node_medialibrary
node_playbackservice -->|"launches video UI"| node_video
node_remoteui -.->|"configures access"| node_remoteservice
node_remoteservice -->|"starts server"| node_remoteserver
node_moviepedia -.->|"requests metadata"| node_movieapi
node_subtitles -.->|"stores preferences"| node_mediadb
node_phoneui -.->|"reads preferences"| node_settings
node_playbackservice -->|"reads playback settings"| node_settings
node_playbackservice -->|"checks device"| node_device
node_castsettings -.->|"configures access"| node_settings

click node_phoneui "https://github.com/attajak/vlc-android/tree/master/application/vlc-android/src/org/videolan/vlc/gui"
click node_tvui "https://github.com/attajak/vlc-android/tree/master/application/television/src/main/java/org/videolan/television/ui"
click node_storagebrowser "https://github.com/attajak/vlc-android/blob/master/application/vlc-android/src/org/videolan/vlc/gui/browser/MLStorageBrowserFragment.kt"
click node_storageprovider "https://github.com/attajak/vlc-android/blob/master/application/vlc-android/src/org/videolan/vlc/providers/StorageProvider.kt"
click node_medialibrary "https://github.com/attajak/vlc-android/blob/master/medialibrary/src/org/videolan/medialibrary/interfaces/Medialibrary.java"
click node_mediaitems "https://github.com/attajak/vlc-android/blob/master/medialibrary/src/org/videolan/medialibrary/interfaces/media/MediaWrapper.java"
click node_indexing "https://github.com/attajak/vlc-android/blob/master/application/vlc-android/src/org/videolan/vlc/MediaParsingService.kt"
click node_playlist "https://github.com/attajak/vlc-android/blob/master/application/vlc-android/src/org/videolan/vlc/media/PlaylistManager.kt"
click node_playbackservice "https://github.com/attajak/vlc-android/blob/master/application/vlc-android/src/org/videolan/vlc/PlaybackService.kt"
click node_player "https://github.com/attajak/vlc-android/blob/master/application/vlc-android/src/org/videolan/vlc/media/PlayerController.kt"
click node_vlcinstance "https://github.com/attajak/vlc-android/blob/master/application/resources/src/main/java/org/videolan/resources/VLCInstance.kt"
click node_video "https://github.com/attajak/vlc-android/blob/master/application/vlc-android/src/org/videolan/vlc/gui/video/VideoPlayerActivity.kt"
click node_remoteui "https://github.com/attajak/vlc-android/tree/master/application/remote-access-server/src/main/java/org/videolan/vlc/remoteaccessserver/gui/remoteaccess"
click node_remoteservice "https://github.com/attajak/vlc-android/blob/master/application/remote-access-server/src/main/java/org/videolan/vlc/remoteaccessserver/RemoteAccessService.kt"
click node_remoteserver "https://github.com/attajak/vlc-android/blob/master/application/remote-access-server/src/main/java/org/videolan/vlc/remoteaccessserver/RemoteAccessServer.kt"
click node_moviepedia "https://github.com/attajak/vlc-android/blob/master/application/moviepedia/src/main/java/org/videolan/moviepedia/MediaScraper.kt"
click node_movieapi "https://github.com/attajak/vlc-android/blob/master/application/moviepedia/src/main/java/org/videolan/moviepedia/MoviepediaApiService.kt"
click node_subtitles "https://github.com/attajak/vlc-android/blob/master/application/resources/src/main/java/org/videolan/resources/opensubtitles/OpenSubtitleService.kt"
click node_mediadb "https://github.com/attajak/vlc-android/blob/master/application/mediadb/src/main/java/org/videolan/vlc/database/MediaDatabase.kt"
click node_settings "https://github.com/attajak/vlc-android/blob/master/application/tools/src/main/java/org/videolan/tools/Settings.kt"
click node_device "https://github.com/attajak/vlc-android/blob/master/application/resources/src/main/java/org/videolan/resources/AndroidDevices.kt"
click node_castsettings "https://github.com/attajak/vlc-android/blob/master/application/television/src/main/java/org/videolan/television/ui/preferences/PreferencesRemoteAccess.kt"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_storagebrowser,node_storageprovider,node_medialibrary,node_mediaitems,node_indexing,node_user toneBlue
class node_playlist,node_playbackservice,node_player,node_vlcinstance toneAmber
class node_phoneui,node_tvui,node_video,node_remoteui,node_castsettings toneMint
class node_remoteservice,node_remoteserver,node_moviepedia,node_movieapi,node_subtitles,node_mediadb,node_settings,node_device toneRose
```

## Components

### Media discovery

- [Storage browser](https://github.com/attajak/vlc-android/blob/master/application/vlc-android/src/org/videolan/vlc/gui/browser/MLStorageBrowserFragment.kt): `application/vlc-android/src/org/videolan/vlc/gui/browser/MLStorageBrowserFragment.kt`
- [Storage provider](https://github.com/attajak/vlc-android/blob/master/application/vlc-android/src/org/videolan/vlc/providers/StorageProvider.kt): `application/vlc-android/src/org/videolan/vlc/providers/StorageProvider.kt`
- [Media library](https://github.com/attajak/vlc-android/blob/master/medialibrary/src/org/videolan/medialibrary/interfaces/Medialibrary.java): `medialibrary/src/org/videolan/medialibrary/interfaces/Medialibrary.java`
- [Media items](https://github.com/attajak/vlc-android/blob/master/medialibrary/src/org/videolan/medialibrary/interfaces/media/MediaWrapper.java): `medialibrary/src/org/videolan/medialibrary/interfaces/media/MediaWrapper.java`
- [Media indexing](https://github.com/attajak/vlc-android/blob/master/application/vlc-android/src/org/videolan/vlc/MediaParsingService.kt): `application/vlc-android/src/org/videolan/vlc/MediaParsingService.kt`

### Playback

- [Playlist manager](https://github.com/attajak/vlc-android/blob/master/application/vlc-android/src/org/videolan/vlc/media/PlaylistManager.kt): `application/vlc-android/src/org/videolan/vlc/media/PlaylistManager.kt`
- [Playback service](https://github.com/attajak/vlc-android/blob/master/application/vlc-android/src/org/videolan/vlc/PlaybackService.kt): `application/vlc-android/src/org/videolan/vlc/PlaybackService.kt`
- [Player controller](https://github.com/attajak/vlc-android/blob/master/application/vlc-android/src/org/videolan/vlc/media/PlayerController.kt): `application/vlc-android/src/org/videolan/vlc/media/PlayerController.kt`
- [LibVLC instance](https://github.com/attajak/vlc-android/blob/master/application/resources/src/main/java/org/videolan/resources/VLCInstance.kt): `application/resources/src/main/java/org/videolan/resources/VLCInstance.kt`

### User interfaces

- [Phone interface](https://github.com/attajak/vlc-android/tree/master/application/vlc-android/src/org/videolan/vlc/gui): `application/vlc-android/src/org/videolan/vlc/gui`
- [TV interface](https://github.com/attajak/vlc-android/tree/master/application/television/src/main/java/org/videolan/television/ui): `application/television/src/main/java/org/videolan/television/ui`
- [Video playback UI](https://github.com/attajak/vlc-android/blob/master/application/vlc-android/src/org/videolan/vlc/gui/video/VideoPlayerActivity.kt): `application/vlc-android/src/org/videolan/vlc/gui/video/VideoPlayerActivity.kt`
- [Remote access UI](https://github.com/attajak/vlc-android/tree/master/application/remote-access-server/src/main/java/org/videolan/vlc/remoteaccessserver/gui/remoteaccess): `application/remote-access-server/src/main/java/org/videolan/vlc/remoteaccessserver/gui/remoteaccess`
- [Casting preferences](https://github.com/attajak/vlc-android/blob/master/application/television/src/main/java/org/videolan/television/ui/preferences/PreferencesRemoteAccess.kt): `application/television/src/main/java/org/videolan/television/ui/preferences/PreferencesRemoteAccess.kt`

### Integrations and state

- [Remote service](https://github.com/attajak/vlc-android/blob/master/application/remote-access-server/src/main/java/org/videolan/vlc/remoteaccessserver/RemoteAccessService.kt): `application/remote-access-server/src/main/java/org/videolan/vlc/remoteaccessserver/RemoteAccessService.kt`
- [Remote server](https://github.com/attajak/vlc-android/blob/master/application/remote-access-server/src/main/java/org/videolan/vlc/remoteaccessserver/RemoteAccessServer.kt): `application/remote-access-server/src/main/java/org/videolan/vlc/remoteaccessserver/RemoteAccessServer.kt`
- [Metadata scraping](https://github.com/attajak/vlc-android/blob/master/application/moviepedia/src/main/java/org/videolan/moviepedia/MediaScraper.kt): `application/moviepedia/src/main/java/org/videolan/moviepedia/MediaScraper.kt`
- [Movie metadata API](https://github.com/attajak/vlc-android/blob/master/application/moviepedia/src/main/java/org/videolan/moviepedia/MoviepediaApiService.kt): `application/moviepedia/src/main/java/org/videolan/moviepedia/MoviepediaApiService.kt`
- [Subtitle service](https://github.com/attajak/vlc-android/blob/master/application/resources/src/main/java/org/videolan/resources/opensubtitles/OpenSubtitleService.kt): `application/resources/src/main/java/org/videolan/resources/opensubtitles/OpenSubtitleService.kt`
- [App media database](https://github.com/attajak/vlc-android/blob/master/application/mediadb/src/main/java/org/videolan/vlc/database/MediaDatabase.kt): `application/mediadb/src/main/java/org/videolan/vlc/database/MediaDatabase.kt`
- [App settings](https://github.com/attajak/vlc-android/blob/master/application/tools/src/main/java/org/videolan/tools/Settings.kt): `application/tools/src/main/java/org/videolan/tools/Settings.kt`
- [Device capabilities](https://github.com/attajak/vlc-android/blob/master/application/resources/src/main/java/org/videolan/resources/AndroidDevices.kt): `application/resources/src/main/java/org/videolan/resources/AndroidDevices.kt`

### Other components

- **Viewer**

## Connections

- Viewer → Phone interface: selects media
- Viewer → TV interface: browses media
- Phone interface → Storage browser: opens browser (evidence: `application/vlc-android/src/org/videolan/vlc/gui/browser/MLStorageBrowserFragment.kt`)
- Storage browser → Media library: reads catalog (evidence: `application/vlc-android/src/org/videolan/vlc/gui/browser/MLStorageBrowserFragment.kt`)
- Storage browser → Storage provider: uses provider
- Storage provider → Media library: queries library (evidence: `application/vlc-android/src/org/videolan/vlc/providers/StorageProvider.kt`)
- Media library → Media items: returns media (evidence: `medialibrary/src/org/videolan/medialibrary/interfaces/Medialibrary.java`)
- Media indexing → Media library: updates catalog
- Phone interface → Playlist manager: queues media (evidence: `application/vlc-android/src/org/videolan/vlc/media/PlaylistManager.kt`)
- TV interface → Playlist manager: starts playback
- Playback service → Playlist manager: delegates playback (evidence: `application/vlc-android/src/org/videolan/vlc/PlaybackService.kt`)
- Playlist manager → Player controller: controls player (evidence: `application/vlc-android/src/org/videolan/vlc/media/PlaylistManager.kt`)
- Player controller → LibVLC instance: uses engine (evidence: `application/vlc-android/src/org/videolan/vlc/media/PlayerController.kt`)
- LibVLC instance → Media library: sets engine instance (evidence: `application/resources/src/main/java/org/videolan/resources/VLCInstance.kt`)
- Playback service → Media library: uses media catalog (evidence: `application/vlc-android/src/org/videolan/vlc/PlaybackService.kt`)
- Playback service → Video playback UI: launches video UI (evidence: `application/vlc-android/src/org/videolan/vlc/PlaybackService.kt`)
- Remote access UI → Remote service: configures access
- Remote service → Remote server: starts server (evidence: `application/remote-access-server/src/main/java/org/videolan/vlc/remoteaccessserver/RemoteAccessService.kt`)
- Metadata scraping → Movie metadata API: requests metadata
- Subtitle service → App media database: stores preferences
- Phone interface → App settings: reads preferences (evidence: `application/vlc-android/src/org/videolan/vlc/gui/helpers/hf/StoragePermissionsDelegate.kt`)
- Playback service → App settings: reads playback settings (evidence: `application/vlc-android/src/org/videolan/vlc/PlaybackService.kt`)
- Playback service → Device capabilities: checks device (evidence: `application/vlc-android/src/org/videolan/vlc/PlaybackService.kt`)
- Casting preferences → App settings: configures access
