3.0.0
Curse Maven Snippet
What's new
📦 RELEASE 3.0.0
IMPORTANT: FULL REWRITE! MODS MADE FOR 2.x WON'T WORK UNTIL THEY RELEASE A COMPATIBILITY UPDATE
VLC is gone and no longer required: we now use FFmpeg (included in the companion mod WATERMeDIA: Binaries) as the engine, plus our own Java decoders for pictures.
API
- ⚙️ The VLC players (
BasePlayer,VideoPlayer,MusicPlayer) are replaced byMRLandMediaPlayerfrom the newPlayerAPIPlayerAPI.mrl(uri)resolves a link in the background into sources, qualities and metadataPlayerAPI.player(mrl, video, audio)plays pictures, animations, videos, music and live streams with the same controlsMediaPlayer.onStatusstacksStatusListeners that get the player plus its previous and current status; they're dropped once playback stops, ends or failsMediaPlayer.Status.allowstells whether one status can move straight to another
- ⚙️ Players draw and play through engines picked by the mod:
GLEngine(OpenGL),VKEngine(Vulkan),ALEngine(OpenAL),JSEngine(Java Sound), plusAWTEngineandJFXEnginefor desktop apps without OpenGLMediaPlayer#texture()returns along: an OpenGL texture or a Vulkan image viewpreRenderis gone:GLEngineuploads frames through the mod's render thread executorPlayerAPI.jfxEnginethrows anIllegalStateExceptionwhen JavaFX 13+ is missing;PixelFormat.GBRAis gone, nothing ever produced itPixelFormatsizes each frame plane withplaneWidth,planeHeight,texelBytesandframeBytesVKContext.deviceInfo()describes the lent device (features, extensions and queues) so FFmpeg decodes video on it; when it only enables the video and external memory extensions, a twin device on the same GPU decodes and the engine imports its framesCodecsAPI.vulkanDecode()tells whether the natives support Vulkan decoding- libplacebo converts the decoded frames when the lent device also enables
hostQueryReset,runtimeDescriptorArray,shaderStorageImageArrayNonUniformIndexingandmaintenance4and has a second queue in its render family; the twin device enables them on its own
- ⚙️ Engines and players are created only through
PlayerAPI(player,serverPlayer,glEngine,vkEngine,alEngine,jsEngine,awtEngine,jfxEngine,headlessEngine); constructors are internal- Dedicated servers can only create
ServerMediaPlayer - Players drive their engines' frame uploads and controls; engines only expose state
- Dedicated servers can only create
- ⚙️
ImageAPI,ImageCache,ImageFetchandImageRendererare gone: pictures play throughMediaPlayer- The built-in loading, black and VLC failure pictures are gone
- ⚙️ Added
CodecsAPIto decode pictures and encode media. It's experimental: it may change or break in any update, so don't use it in your mods yetCodecsAPI.decodetakes abyte[], aByteBufferor anInputStream, andsniffaByteBufferor anInputStreamCodecsAPI.encoderwrites video frames and sound samples into aContainer;Container,VideoCodecandAudioCodeclist what each format carriesImageReader.addFilterappliesReaderFilters such asDownscaleFilterto every decoded frame- Readers honour a requested BGRA, RGBA or GRAY layout, reported by
ImageData.format();repeatcounts total plays (0 loops forever) next()past the last frame throwsNoSuchElementExceptionand a closed reader throwsIllegalStateException;delay()gives the latest frame's delay andmetadata()returns frozen snapshots- Valid but unsupported features (lossless or CMYK JPEG, unknown PNG critical chunks, unknown PAM tuples) throw
UnsupportedFormatExceptioninstead of passing as broken files - Picture metadata uses shared keys (
METAKEY_ICC_PROFILE,METAKEY_EXIF,METAKEY_XMP,METAKEY_ORIENTATION,METAKEY_LOOP_COUNT) with plain Java values
- ⚙️
NetworkAPI.UploadStatus(moved out ofNetworkServer) gainscancel()anduri(), thewater://remote/<id>address of the upload - ⚙️ Platforms replace URL patches (
AbstractPatch,NetworkAPI.patch): implementPlatformand add it withPlatformAPI.register - ⚙️
RenderAPIandCacheAPIare gone;MathAPIis nowMathUtil, and easings moved toMathEaseswith more curves - ⚙️
WaterMedia.logger(id)replacesLogTool - ⚙️ Added
ServerMediaPlayer, a server clock that keeps client players in step: send itssnapshot()with your own packets and feed it toMediaPlayer.sync() - ⚙️ Added
PlatformAPI.searchfor keyword searches across platforms; it returns a live result list andsearching(query)tells when every platform answered- A newer query cancels the one in flight, typing is debounced, and
search(query, true)skips the cache platforms.searchLimitcaps the results per platform, and each platform gets 5 seconds so a slow one never stalls the restPlatformAPI.searchHistory()keeps recent queries, newest first
- A newer query cancels the one in flight, typing is debounced, and
- ⚙️ Added
SFXEngine.SpatialAudiofor positional audio, with an adapter for Sound Physics Remastered effects- Spatial
ALEngines play through sinks:addSink(Mix)adds another positional source playing theLEFT,RIGHTorMONOmix of the same decode, in step with the rest;MediaPlayer.sinks()andaddSinkreach them from the player
- Spatial
- ⚙️
MediaPlayer.audioTracks()lists every audio a player can play,audioTrack(track)switches to one while playing, andaudioLanguage("es-MX")sets the language to prefer - ⚙️ Added
NetRequestandHttpHeadersfor web requestsNetRequestkeeps the mod's User-Agent and Referer, returns error response bodies instead of failing, accepts any JSON content type and gives up on bodies that trickle in too slowlyquery(URI),httpsOnly(),maxBytes,deadlineanddownload(Path, sha256)cover query strings, HTTPS-only requests, size and time limits and checksum-verified downloads
- ⚙️ Apps embedding WATERMeDIA start it once with
WaterMedia.start(...);loading(),step()andsteps()feed a loading screen andloaded()tells when it's ready- It loads once per process and never unloads; a failing module stops the start, but a failing FFmpeg or file server only turns that feature off
- Platforms can be registered and used anytime, even before WATERMeDIA starts
- ⚙️ Public methods use record-style names (no
getprefix); engines are sealed and built-in classes are final - ⚙️ Only
org.watermediaand thecodecs,network,platform,playerandutilpackages oforg.watermedia.apiare public API- Engines, players and
MediaPlayer.PlayerStatelive inorg.watermedia.api.player; codecs, picture filters and FFmpeg state inorg.watermedia.api.codecs - Codec readers and writers, player internals, built-in platforms,
org.watermedia.bootstrapandorg.watermedia.toolsare internal
- Engines, players and
- ⚙️ Added developer guides in English and Mexican Spanish
FEATURES
- ✨ Videos and music play with FFmpeg 9.0.2, bundled in WATERMeDIA: Binaries for Windows (x64), Linux (x64, ARM64) and macOS (Intel, Apple Silicon)
- Odd-sized videos get clean edges and straight rows, and webcam captures no longer turn black on OpenGL
- ✨ Hardware video decoding on NVIDIA, AMD, Intel and macOS, falling back to software when the GPU struggles
- Videos still stutter? Turn it off in the settings
- ✨ On Vulkan, H.264, H.265 and AV1 videos decode and draw right on the GPU, never touching RAM (requires mod support)
- Mods only need to enable a few Vulkan extensions, no GPU queues required
- libplacebo converts the frames on the GPU too, mapping HDR to regular screens and unlocking 4:2:2, 4:4:4 and 12-bit videos on cards that support them
- ✨ 10, 12 and 16-bit videos are converted on the GPU
- ✨ HDR videos look natural on regular screens with OpenGL and Vulkan, and every video keeps its real colors, from old SD clips to wide-color videos and phone or webcam recordings
- ✨ Vulkan rendering next to OpenGL, ready for Minecraft 26.x (requires mod support)
- ✨ Live streams (HLS and DASH) and IPTV playlists, which open as a channel list
- ✨ Videos with a separate audio track play in sync, unlocking higher qualities on platforms like YouTube
- Dubbed videos play their original language, or the one your mod prefers, and you can switch languages while watching (requires mod support)
- ✨ Pick the quality, change the speed, seek precisely, loop, and lower the resolution of distant screens to save VRAM (requires mod support)
- Seeking or pressing play on a finished video restarts it from that spot, and still pictures can get a display time
- ✨ Positional audio that fades with distance, with Sound Physics Remastered effects (requires mod support)
- Stereo screens can play each side from its own edge, and extra speakers can play a screen's sound anywhere without loading it twice
- ✨ Synchronized playback: everyone on a server watches the same moment, following one server clock (requires mod support)
- ✨ WATERMeDIA now loads on dedicated servers, where WATERMeDIA: Binaries is optional
- An optional file server shares uploaded media with players through
water://remote/links - It's off by default and only accepts local connections; remote access needs an address and a custom password
- Long downloads on slow connections finish; only stalled requests get cut
- It handles back-to-back requests and crowds of players, and answers "busy" instead of dropping the connection when it's full
- An optional file server shares uploaded media with players through
- ✨ New platforms: Imgur, Medal, Bluesky, BiliBili, TikTok, Odysee (videos, music and livestreams), Newgrounds (movies, music and art), Sendvid, VidLii and D.Tube
- YouTube is back, along with SoundCloud, Facebook and Instagram, through yt-dlp (requires WATERMeDIA: Binaries)
- BiliBili plays up to 1080p (8K with VIP) when you add your session cookie in the settings; without it, up to 480p
- Rewrote Twitch and Kick (live, VODs and clips), Streamable, Twitter (X), Lightshot, PornHub, Google Drive, Dropbox and MediaFire
- Media shows its title, author, duration and thumbnail when the platform has them
- Profile, folder and other unplayable links say so instead of failing with a confusing error
- With mature content off, age-restricted videos and adult posts are blocked cleanly instead of failing
- One broken picture no longer breaks a whole album
b23.tvand TikTok short links, and regular TikTok links, open again
- ✨ Search videos by keyword on YouTube, Twitch, Kick and Imgur (requires mod support)
- Twitch and Kick only show channels that are live right now
- ✨ Our own pure-Java picture decoders: PNG, APNG, JPEG, GIF, WebP (animated too), SVG and Netpbm
- Animations use far less CPU and VRAM, and many can play at once without stuttering the game
- Animations shown smaller are shrunk while decoding, so big pictures no longer spike memory
- Broken or malicious pictures fail safely instead of crashing the game or eating its memory
- Phone photos (JPEG and WebP) follow their EXIF orientation instead of showing sideways
- Quirky files decode fine: APNGs with a preview frame, GIFs with stray bytes, WebPs with trailing bytes, lossy WebPs with filtered transparency, SVGs with alternative versions and pictures with broken metadata
- GIFs with zero or tiny frame delays play at browser speed
- ✨ Record videos with sound to MP4, MOV, MKV, WebM and Ogg, and save pictures and animations as PNG, APNG and GIF without FFmpeg (experimental, requires mod support)
- ✨ Small videos are cached on disk like pictures, so they load faster next time
- ✨ Opening the jar launches a full media player with search, IPTV channels and settings, rendering with Vulkan (OpenGL as fallback) and OpenAL sound
- Its engine, UI scale (
Autoorx1.0tox3.0), CRT effect and click sound are saved inconfig/app.properties; an OpenGL fallback never overwrites the saved engine - Launching it from a terminal no longer spams Java and FFmpeg warnings
- Its engine, UI scale (
CHANGES
- 🛠️ Requires Java 17 to 25 and supports Minecraft 1.18.2, 1.19.2, 1.20.1, 1.21.1, 1.21.11, 26.1.2 and 26.2 on Forge, NeoForge and Fabric
- Dropped Minecraft 1.16.5 and 1.21.5; unsupported game or loader versions show a version mismatch instead of loading
- 🛠️ Minecraft clients require WATERMeDIA: Binaries, and both mods must be on 3.0
- 🛠️ Settings moved to
config/watermedia.toml;custom_vlc_path.txtand custom loading GIFs are no longer used- FFmpeg can be turned off or swapped for your own compatible build
- 🛠️ Mature content is blocked by default; you can allow it in the settings
- 🛠️ Relicensed under the Defensive Public Source (Non-Commercial) License v1.0.1
- FFmpeg ships under the LGPLv3
- 🛠️ Cleaner, safer logs: a repeating problem such as a broken frame is logged once instead of flooding the log, and tokens, passwords and login data are hidden while links stay readable
- 🛠️ TLauncher stays unsupported: the game stops at startup when it's detected, now also through its skin mod, files, Java options and launcher process
- Leftovers from an old TLauncher install only leave a warning in the log
- 🛠️ HTTPS media checks certificates on every playlist and segment, and login data never follows redirects to other sites
- Web links can only redirect to web links, and online playlists can't point to local files
- Private HTTPS servers need a certificate Java trusts
- 🛠️ Dropped BMP and TIFF pictures and OneDrive links
- 🛠️ Source code and issue reports moved to github.com/SrRapero720/watermedia
- 🛠️ Video and app shaders ship as plain GLSL files in
assets/watermedia/shaders, alongside the app's other assets
BUG FIXES
- 🐛 No more missing videos, crashes or "VLC not found" errors from absent, broken, sandboxed or incompatible VLC installs
- 🐛 Fixed rendering glitches with Sodium and similar mods while videos or pictures play
- 🐛 Twitter (X) links ending in
/video/1or/photo/1, Streamable embeds,www.kick.comandmediafire.comlinks work again

