Links
Tags
Creators
Details
All versions
3.0.0.20
Beta
WM/3.0.0.202 months ago 974
Compatibility
Minecraft: Java Edition
1.21.11
1.21.1
1.20.1
1.19.2
1.18.2
Platforms
Fabric
Forge
NeoForge
Supported environments
Client-side
Required content
Changes
๐ฆ UPDATE 3.0.0.20 (BETA)
โก MediaAPI โ Playback engine (FFMediaPlayer)
- โ๏ธ Added:
AV_HWDEVICE_TYPE_AMF(AMD) andAV_HWDEVICE_TYPE_OHCODEC(OpenHarmony) to the hardware decoder candidates - โ๏ธ Changed:
VULKANrestored as a last-resort generic GPU decoder (kept last in the candidate list, after D3D11/D3D12 and the platform decoders);OPENCLstays excluded - โ๏ธ Fixed: AV1 software decode โ FFmpeg's native
av1decoder is hwaccel-only and emits zero frames without a GPU accelerator (video "ended" instantly); the software path now picks a real software decoder (libdav1d, elselibaom-av1), on both the initial open and the HWโSW fallback - โ๏ธ Fixed: decoders with a reorder window (libdav1d, native av1) lost the tail of the stream / produced nothing on repeat โ the video/audio decode loops now drain the decoder with a flush packet at a clean EOF, while an
abort()teardown still drops the stale backlog - โ๏ธ Changed: a video stream that drains without ever emitting a frame now reports
ERRORinstead ofENDEDโ dead-decoder failures are visible and no longer retried forever byrepeat() - โ๏ธ Added:
PacketQueue#endOfFile()โ distinguishes a clean end-of-stream from anabort()teardown so the decode threads know whether to drain or drop - โ๏ธ Removed:
FFMediaPlayer#pollVideoFrame()/pollAudioFrame()โ were public but internal-only (a second consumer was always a data race); inlined into the lifecycle consumption loop - โ๏ธ Changed: the resolved decoder is logged (
libdav1d/libaom-av1/ native) andDEBUGlogging was added across the lifecycle (start/stop/pause/seek/quality/speed/release);isHwAccel()documented
โก [NEW] PlatformsAPI โ Search
- โ๏ธ Added:
PlatformAPI.search(String)/search(String, int limit)โ asynchronous, client-side search across every registered platform; returns a livePlatformSearchimmediately and fills it off-thread (platforms probed concurrently, hits land in completion order, โคlimitper platform โ default 2), a newer search supersedes the previous one - โ๏ธ Added:
PlatformAPI.searchHistory()โ snapshot of recent queries (newest first, โค 10) - โ๏ธ Added:
PlatformSearchโ live handle (query(),results()immutable growing snapshot,history(),done()); a superseded handle simply stops growing - โ๏ธ Added:
PlatformResult(String platform, String title, URI thumbnail, URI url)record โ one raw, unresolved hit; the URL is resolved throughMRL/PlatformAPI.fetch(URI)only when the user picks it - โ๏ธ Added:
IPlatform#search(String query, int limit)default method (returns an empty list) โ source/binary compatible; overridden by YouTube, Twitch, Kick, Imgur - โ๏ธ Added: in-memory result cache โ identical
(limit, query)searches served from memory; bounded LRU (32 entries), whole-cache sweep everyplatforms.searchCacheCleanupminutes; only completed, non-empty searches are cached - โ๏ธ Added: config
platforms.searchCacheCleanup(minutes, default 15;0disables caching) - โ๏ธ Changed:
PlatformAPI#release()now cancels the active search and clears history + cache
โก PlatformsAPI โ Web platforms
- โ๏ธ Added:
YtDlpPlatformโ drives the bundled yt-dlp binary out-of-process and maps its JSON intoDataSources; enables SoundCloud, Facebook, Instagram and Newgrounds (single videos + playlists, video/muxed/audio-only variants, audio-only sources, subtitles incl. auto-captions, thumbnails, metadata, mature-content gate, per-format headers/UA, URL expiry); hardened subprocess handling (hermetic, 120s timeout, both pipes drained) - โ๏ธ Added:
YouTubePlatformโ re-adds YouTube (removed with no replacement in a prior beta), backed by yt-dlp; separates video vs playlist links, and on the bot-check/age gate retries with a freshly minted po_token via therustypipe-botguardbinary; implementssearch()through yt-dlpytsearchN:(--flat-playlist, playable videos only) - โ๏ธ Added: search support on Imgur (gallery search), Kick (channel search) and Twitch (inline GraphQL
searchFor, no persisted hash) - โ๏ธ Changed: merged the old
platform-extensionmodule into WaterMedia โ yt-dlp/botguard provisioning lives inlibs/binaries, the platform integration here - โ๏ธ Changed: platform JSON parsing migrated to the shared
JsonToolhelpers (BiliBili, Odysee, TikTok, Twitch) โ no behavior change
โก Packaging / licensing
- โ๏ธ Changed: native libraries rebuilt โ FFmpeg with AMD AMF, OpenHarmony codec support, x264/x265 encoders and Vulkan, and yt-dlp + rustypipe-botguard provisioning (
libs/binaries,libs/tools) - โ๏ธ Added:
META-INF/licenses/javacpp-LICENSE.txtโ bundles the JavaCPP / JavaCPP-Presets-FFmpeg JNI-bindings license (Apache 2.0); README points at the bundled license texts underMETA-INF/licenses/
โก GENERAL
- โจ Search videos by keyword across YouTube, Twitch, Kick and Imgur โ results stream in as you type, no need to paste a link
- โจ YouTube is back, and SoundCloud, Facebook, Instagram and Newgrounds now play too โ all through yt-dlp, with automatic bot-check bypass on YouTube
- ๐ ๏ธ Hardware video decoding now covers AMD GPUs (AMF) and OpenHarmony devices, with Vulkan used as a last-resort GPU decoder
- ๐ Fixed: AV1 videos that played for an instant and then "ended" (or showed nothing) when the GPU has no AV1 decoder โ they now decode in software
- ๐ Fixed: the last moment of some videos getting cut off, and looping/repeat freezing, on certain AV1 / threaded decoders
Supplementary resources
| File | Type | Size | |
|---|---|---|---|
| watermedia-3.0.0.20-sources.jar | Unknown | 1.71 MiB |
Projects on Modrinth are automatically available through a Maven repository for use with JVM build tools such as Gradle. To learn more about the Modrinth Maven API, click here.
Note: When available, you should use the creator's maven repo instead as it will have transitive dependency information that the Modrinth Maven API does not. You may also end up with duplicate dependencies if you use a mix of Modrinth and non-Modrinth Maven repositories for your dependencies, because the group identifier will be different when served through the Modrinth Maven API.
Maven coordinates:
Version ID:
build.gradle:
repositories {
exclusiveContent {
forRepository {
maven {
name = "Modrinth"
url = "https://api.modrinth.com/maven"
}
}
// forRepositories(fg.repository) // Uncomment when using ForgeGradle
filter {
includeGroup "maven.modrinth"
}
}
}
// Standard Gradle dependency
dependencies {
implementation "maven.modrinth:G922NeHS:YyVsXArD"
}
// Legacy Loom dependency
dependencies {
modImplementation "maven.modrinth:G922NeHS:YyVsXArD"
}


