Mori is a modern, privacy-first media downloader that saves photos, videos, and audio from 14 platforms. Built with a client-only architecture, all scraping runs on-device β no backend, no tracking, maximum privacy.
- Enhanced Filename Sanitization & Storage Permission Error Fix:
- URI & Hashtag Sanitization: Strips
#(hashtags),%,&, and special symbols from video/media titles. Hashtags in filenames were previously causing Android native URI parsers to fail withEACCES (Permission denied)andENOENT (No such file or directory). - Length & Unicode Optimization: Truncates sanitized titles to a maximum of 60 characters and strips non-standard Unicode symbols, preventing filesystem path overflow errors across Android versions.
- URI & Hashtag Sanitization: Strips
- Bilibili Short-Link & Season Resolution (bili.im / b23.tv): Overhauled Bilibili link resolution and stream extraction:
- Short Link & Redirect Handling: Robust manual parsing for non-standard HTML redirects on
bili.imandb23.tvshort URLs when CapacitorHttp response headers do not auto-resolve destination URLs. - Anime/Series Season Resolution: Resolves season-only URLs (
/play/sid) directly to active episode IDs (ep_id) using the Bilibili OGV episodes API (/intl/gateway/web/v2/ogv/play/episodes). - Upgraded Stream API: Switched to Bilibili OGV v2 API (
/intl/gateway/v2/ogv/playurl), delivering multi-resolution video streams (480p, 360p, 240p, 144p) and high-bitrate audio streams. - HTTPS & Referer Injection: Enforces HTTPS protocols on all DASH video/audio stream URLs (
bilivideo.com,bstarstatic.com,akamaized.net) and injects mandatoryReferer: https://www.bilibili.tv/headers, eliminating cleartext HTTP download errors and 403 Forbidden file corruptions.
- Short Link & Redirect Handling: Robust manual parsing for non-standard HTML redirects on
- Pixiv Ugoira Extraction & Download Engine: Overhauled Pixiv Ugoira (animated illustration) detection & download system:
- Server-Independent Detection: Bypasses login & R-18 restriction blocks using
meta-preload-dataHTML parsing andugoira_metaAPI validation. - Animated Media Preview: Live animated GIF preview for Ugoira artworks in the application viewer.
- Format Options: Export Ugoiras as MP4, GIF, or ZIP (full original frame archive).
- CapacitorHttp Blob Fallback Downloader: Integrated a fallback download engine using
CapacitorHttpwithresponseType: "blob"and domain-awareRefererrouting (ugoira.com&pximg.net), ensuring downloads succeed across strict CDN redirects and anti-hotlink rules.
- Server-Independent Detection: Bypasses login & R-18 restriction blocks using
- Dual YouTube Scraper System: Integrated dual-scraper selection menu when analyzing YouTube URLs:
- Server 1 (ytmp3.gg): Multi-resolution video downloads (1080p, 720p, 480p, 360p) + MP3 audio.
- Server 2 (ytmp3.mobi): Fast & stable single-quality MP4 / MP3 extraction.
- Dual TikTok Scraper System: Added server selection menu for TikTok downloads:
- Server 1 (TikTokIO): Multi Feature (HD Video, MP3 audio, and Photo Slideshow).
- Server 2 (SnapTik): Fast & Direct (HD / MP4 Video and Photo Slideshow).
- Dual Instagram Scraper System: Added server selection menu for Instagram downloads:
- Server 1 (Indown): HD Reels, Posts, Photos extraction.
- Server 2 (DownReels): Fast API-based Reels & media extraction.
- Dual Twitter/X Scraper System: Added server selection menu for Twitter/X downloads:
- Server 1 (Tweeload): Multi-resolution video downloads (HD/SD).
- Server 2 (TVD): Fast TwitterVideoDownloader direct video extraction.
- Dual Spotify Scraper System: Added server selection menu for Spotify track downloads:
- Server 1 (SpotiDown): Standard MP3 track extraction.
- Server 2 (SpotMate): Fast & Direct MP3 extraction (
spotmate.onlineintegration).
- TikTok Scraper Migrated (SnapTik β TikTokIO): Replaced the broken SnapTik-based scraper with a new implementation using
tiktokio.com/api/v1/tk/html. Direct POST request viaCapacitorHttp, regex-based HTML parsing (no DOM dependency), supports video (no watermark / HD) and MP3 downloads. - Douyin Photo Slideshow: Added support for Douyin photo posts (
aweme_type2). Multiple images display as a swipeable slideshow β same as TikTok photo experience. - Consolidated User-Agent: Removed scattered hardcoded UA strings across all scrapers β replaced with a single
CHROME_UAconstant fromutils.js. Only Douyin keeps its mobile Safari UA intentionally. - Bugfixes:
- Instagram URL cleaning: Now uses
getCleanUrl()before stripping query params β prevents failure when pasting text with embedded URLs. - Douyin thumbnail: Falls back to first photo URL when
item.video.coveris undefined (photo slideshows). - TikTok URL query params: Strips
?parameters before sending to TikTokIO API β was causing "Paste correct link" errors.
- Instagram URL cleaning: Now uses
- JavaScript (ES6+): Core application logic and scraping engine.
- HTML5 & CSS3: Custom design system without bloated frameworks.
- CapacitorJS: Native Android bridge for filesystem, clipboard, and biometrics.
- pdf-lib: Client-side PDF generation and bundling.
Mori/
βββ android/ # Capacitor Android native project
β βββ app/src/main/ # Android manifest, resources, assets
β βββ gradle/ # Gradle wrapper & build config
βββ assets/ # Screenshots & branding assets
βββ public/
β βββ css/
β β βββ style.css # Design system & all component styles
β βββ js/
β β βββ i18n.js # Multi-language translations (EN/ID/JA)
β β βββ pdf-lib.min.js # PDF generation library (vendor)
β β βββ player.js # Custom video player with touch controls
β β βββ scrapers.js # Platform scrapers (TikTok, IG, YT, etc.)
β β βββ script.js # App init, navigation, settings, history
β β βββ ui.js # Media slider, results, history renderer
β β βββ utils.js # Filesystem, cookie utils, helpers
β βββ index.html # Single-page entry point
βββ capacitor.config.json # Capacitor configuration
βββ package.json # Dependencies & scripts
βββ .gitignore
βββ LICENSE
βββ README.md
- Multi-Platform Support: High-quality downloads from TikTok (No Watermark), Instagram (Reels/Photos), YouTube, Twitter (X), Spotify, Pinterest, Apple Music, Facebook, Threads, Bandcamp, Pixiv (R-18/R-18G), Bilibili (DASH), Douyin (No WM), and RedNote (Xiaohongshu).
- Live Media Previews: View images, play videos, and listen to audio directly within the app before downloading.
- Standalone PDF Document Export: Convert image galleries from any platform into high-quality PDF files for offline viewing.
- Private History Manager: Downloaded files are managed internally with local playback support and offline badge detection.
- Share Intent Integration: Send links directly to Mori from other apps via the system Share menu.
- Auto Clipboard Paste: Automatically detects and pastes links from clipboard when you return to the app.
- Auto Update Check: Checks for new versions on startup via GitHub Releases and shows a popup modal when an update is available.
- Biometric Privacy Lock: Secure your history with native fingerprint/FaceID authentication.
- Export/Import Data: Full data portability β backup and restore your history, settings, and paths as a JSON file.
- Intelligent Error Handling: Real-time feedback for IP blocks or network issues via premium Toast notifications.
- Premium Minimalist UI: A distraction-free glassmorphism interface with smooth transitions, dark mode, and accent colors.
- Copy a link from a supported platform or Share it directly to Mori.
- Use the Paste button or let the auto-detection handle the link.
- Tap Analyze to verify the content.
- Preview the media (swipe through carousels if available).
- Choose your format and tap Download.
- Files are saved to your internal history for offline access.
Mori is built using Capacitor and Vanilla JS for high performance.
- On Android: Uses
CapacitorHttpto bypass CORS and download directly from the device IP. - On Web: Preview mode only β runs directly in the browser with limited functionality.
# 1. Sync Capacitor with Android
npx cap sync android
# 2. Build the debug APK
cd android && ./gradlew assembleDebug
# 3. The APK is output at:
# android/app/build/outputs/apk/debug/Mori v{VERSION}.apkFor a release APK, generate a signed keystore and run:
cd android && ./gradlew assembleReleaseDeveloped with β€οΈ by coflyn. GitHub: https://github.com/coflyn Instagram: @_coflyn
Mori is released under the MIT License. Feel free to use, modify, and distribute it.





