This page documents the noLegal build of Fast Media Sorter - a personal,
sideload-only edition. It is built on top of the VR edition and adds features that cannot be
distributed through Google Play or the Meta Horizon Store because of redistribution licenses,
store policies, patent constraints, or heavy on-device runtimes.
The main site links to this edition. This page describes its extra capabilities and installation; a direct APK link appears when a build has been published.
Underneath, it is the same complete shell for an Android device as the main app: device shell,
media player, live streams, app launching, a replacement for stock apps, a companion on the watch,
device monitoring and a full file manager.
Sideload Download
The noLegal build is sideload-only. Install a published APK manually. This edition is linked from the main site but is not distributed through app stores.
Android warns about an APK it has not seen before.
Why the warning appears - and what to
tap.
GPLv3 Compliance Notice: This sideload build links copyleft components (such as NewPipe Extractor) licensed under GPL-3.0-or-later. In accordance with GPLv3 §6, the Corresponding Source code for the combined work (including both the application's source code and the extractor's source code) is available at our
GitHub Repository and the
NewPipe Extractor Repository.
How noLegal Relates to the Other Builds
Fast Media Sorter ships in layered builds. Each layer is a superset of the one
before it: noLegal = VR + sideload-only capabilities, and VR itself already contains
everything in the Standard build.
Standard
Mobile · TV · Car · published to Google Play
The full media-sorting core: local / SMB / SFTP / FTP / cloud browsing, the player and
slideshow, EPUB reader, OCR translation, batch file operations, Wear OS companion.
A separate free watch face for Wear OS 6 and newer is on Google Play: on the watch, open Play and search for FastMediaSorter, or use the FastMediaSorter Watch Face page.
⊂
VR Edition
Meta Quest / XR · sideload
Everything in Standard, plus the immersive VR player surface, 3D / 180° / 360° playback,
spatial HUD, controller and head-tracking input, and the VR-specific browse experience.
⊂
noLegal
Sideload-only · not on any store
Everything in the VR edition, plus the capabilities below - kept out of every published
flavor because their dependencies, permissions, or runtime weight are incompatible with
store distribution.
noLegal-only Capabilities
Each capability below is implemented and isolated to the noLegal source set.
For every one, the "Why not in stores" note states the concrete blocker.
1 Universal Media Extractor (yt-dlp + Chaquopy)
Downloads media from 1800+ sites (YouTube, Instagram, TikTok, Facebook, Threads, X and more)
through the yt-dlp Python library running on-device via Chaquopy. Auth cookies saved through a
WebView login are forwarded to yt-dlp automatically, so re-authentication is not needed.
- Instagram single posts, full carousels, Reels and Stories (with auth cookies).
- TikTok watermark-free video via an explicit format filter, with fallback to best available.
- Facebook public videos with auth cookies.
- Carousels / playlists expand into a batch where every element re-enters the extraction chain.
- First in the extraction chain; falls through to NewPipe and a WebView extractor when not applicable.
- ABI:
arm64-v8a and x86_64 only (Python 3.12 wheel availability).
Why not in stores: Chaquopy ships under a non-commercial /
open-source community license; the yt-dlp dependency mutagen is GPL-2.0; the bundle
adds ~12-16 MB per ABI slice and is incompatible with the Google Play 16 KB page-size requirement
on Android 15.
2 Native Site Extractors (ArtStation, DeviantArt, Vimeo, Dailymotion, Telegram)
Pure-Kotlin extractors that resolve direct media URLs without rendering a browser, usually in
under a second. They sit ahead of yt-dlp for their own platforms; yt-dlp stays the fallback.
- ArtStation: internal projects JSON API to resolve the original image or video clip.
- DeviantArt: parses the page initial-state JSON, with an oEmbed fallback on parse failure.
- Vimeo: reads the player config JSON to pick the highest-resolution progressive MP4 or HLS.
- Dailymotion: extracts a time-limited HLS stream and downloads immediately (tokens expire fast).
- Telegram public posts: parses the public embed page for photo and video attachments; a single
attachment downloads directly, an album returns a batch. Private / invite links are rejected.
- No new dependencies - Kotlin plus the JSON library already in the APK.
Why not in stores: part of the unpublished noLegal extraction
surface; bundled with the yt-dlp chain that already blocks store distribution.
3 APK Install from Browse
Tap any .apk file in Browse to get an "Install" action that launches the system
package installer - the user always sees and confirms the standard install dialog.
- Checks the install-packages permission and routes to system Settings when it is missing.
- Reports install success, cancellation or failure via a toast.
- Installs directly from Google Drive / Dropbox / OneDrive: the file is fetched silently into
the cache under its real name, then the system installer opens.
- Browse marks APK tiles with a compact VR badge when the package declares Quest / VR support.
Why not in stores: the REQUEST_INSTALL_PACKAGES
permission triggers Google Play high-risk review and is rejected for general file-manager use
without an MDM / enterprise context.
4 YouTube & YouTube Music Extraction Recovery
Reliable YouTube and YouTube Music share downloads: NewPipe and yt-dlp work together so format
mismatches no longer break the share.
- When yt-dlp hits a YouTube format error (PoToken / JS challenge) the cascade falls through to
the NewPipe (Innertube) strategy.
- YouTube is a known auth resource - the account picker appears and stored session cookies apply.
- URL canonicalization rewrites
music.youtube.com and shorts links to the
regular watch form that resolvers accept reliably.
- Audio-only format selection for YouTube Music; range-chunked transfer for Shorts and long videos.
Why not in stores: built on the same yt-dlp / NewPipe extraction
stack that is excluded from published builds.
5 Offline PaddleOCR (PP-OCRv5 + Paddle-Lite)
A deep-learning offline OCR engine selectable from Settings alongside Tesseract. It handles
real-world photos - perspective skew, shadows, glare, noisy backgrounds - substantially better than
Tesseract, fully on-device with no network calls during inference.
- Pipeline: text detection → textline orientation classification → text recognition (PP-OCRv5 mobile).
- Native runtime is Paddle-Lite, 16 KB-page aligned for Android 15; ABI
arm64-v8a only.
- Models download lazily on first use over HTTPS and are SHA-256 validated before activation;
a failed download or hash mismatch falls back to Tesseract for that call.
- Compile-time isolation: all PaddleOCR code lives in the noLegal source set; published APKs
contain zero Paddle-Lite bytes.
Why not in stores: ~20+ MB of arm64 native libraries and heavy
predictor warm-up are incompatible with the size and runtime budget of the published flavors.
6 Embedded Office Document Viewer (read-only)
Opens Office documents inside the player as a read-only preview instead of always handing off to
an external app.
- Supports Word (
.docx / .odt), spreadsheets (.xlsx /
.ods), presentations (.pptx / .odp) and RTF.
- In-tree, dependency-free engine: OOXML / ODF containers are unzipped and parsed into normalized
HTML rendered in a locked-down WebView; RTF uses a control-word stripper.
- Parity with the PDF / EPUB surface: fullscreen, print, translate, OCR, swipe / keyboard
navigation and touch zones. Editing is intentionally unavailable.
- Legacy binary
.doc / .xls / .ppt are out of scope; an
explicit fallback dialog (open elsewhere / share / cancel) appears when a file can't be rendered.
- Compile-time isolation: the engine ships only in the noLegal source set.
Why not in stores: kept inside the unpublished noLegal surface to
keep published builds free of the embedded viewer seam.
More on the Main Site