Releases: mackid1993/Clicker
Release list
Clicker 1.1.6
The library can be sorted, not just searched. A sort menu stands beside the search box on both library tabs. Films sort by name in either direction, by year in either direction, by what arrived most recently, and by length. Series sort by name, by unwatched episodes, by how many recordings they hold, and by which recorded something most recently.
The Recorded tab and the downloads screen sort too, through the same menu. Recordings open newest first and can be turned by name or by length; downloads open with whatever is moving on top and can be turned by name. The schedule stays chronological on purpose. Every screen keeps its own choice, remembered across launches.
Films without a year sort to the end of the year orders rather than the front, and the year under a film's poster now prefers the release year over the air date, so the label and the position always agree. Scrolling the TV grid also does slightly less work per frame.
Clicker 1.1.5
Artwork stops flickering in a large library — the Movies tab, this time. The two previous fixes were real, but both stopped at the TV grid. Movies still built every card on every frame, and the cache rule meant to protect what is on screen was aging each request separately, so it protected exactly one poster — the last one asked for — and evicted the rest of the screen, which was requested again at once. Past about three hundred movies that is a rolling wave of posters vanishing and returning. The Movies tab now builds only the rows on screen through the same code as the TV grid, and everything drawn in a frame ages as one, so nothing visible is ever evicted.
The diagnostic line the library writes to the log now covers the Movies tab too, and says which grid it is reporting on.
Clicker 1.1.4
Artwork stops flickering in a large library. Every series was being drawn
every frame, on screen or not, so a library of five hundred asked for five
hundred pictures sixty times a second and no cache could hold them. Only what
is visible is built now. Scrolling a large library is quicker for the same
reason: the count under each poster was also being worked out for rows nobody
could see.
Caches and logs can be moved. A third folder setting, beside downloads and
the live buffer, covering the guide cache, the library cache, the player log
and the crash log. The guide cache alone is around twenty-five megabytes a day,
and none of it has any reason to be on the system drive.
A server with no version reported no longer shows "vunknown".
The library page now writes a line to the log every so often saying how many
series it built against how many exist and how much artwork is in memory, so a
report of flickering artwork can be read rather than guessed at.
Clicker 1.1.3
Artwork stops flickering in a large library. Posters would appear, vanish
and come back on a screen nobody was scrolling. Two things caused it. Artwork
was fetched far larger than it is ever drawn, so far less of it fitted in
memory than should have. And when memory ran short, the rule for choosing what
to drop could pick the pictures currently on screen, which were then requested
again at once, pushing out others in turn. Cards are now fetched at the size
they are shown, and nothing on screen is discarded.
Clicker 1.1.2
A black rectangle no longer flashes over the picture. The buffer the video
is drawn into is created empty, and a new one is made at the start of a file
and again whenever the picture changes size partway through. It was being put
on screen before there was anything in it.
Continue Watching shows everything it should. Some part-watched recordings
were being left out of the list.
The closed caption button works on recordings. Captions carried inside the
video only become a track once decoding has actually reached some, which is
well after a file is opened. The button was asking for whichever track was
chosen at the start, and at the start there was none, so pressing it did
nothing. It now finds the caption track and selects it.
Clicker 1.1.1
Four fixes from a user report.
Recordings no longer play as colored hash. The picture and the interface
are drawn by two different things sharing one graphics context, and the
settings that say how image data is laid out in memory are shared with it.
Whichever drew last left its own settings behind, so video frames were read at
the wrong stride and came out as horizontal noise — from a decoder that had
just decoded them perfectly, which is why nothing anywhere reported a fault.
Live TV no longer stops every twenty seconds. At original quality the live
stream is written to a file on disk so that pause and rewind work, and playback
reads that file while it is still being written. It was being read as an
ordinary file, so every time playback caught up with the writer it found the
end of the file and stopped. It now follows the file the way tail -f does,
waiting for more instead of stopping. Tuning is also quicker, because the wait
before playback starts existed to work around the same thing.
Closed captions work. CEA-608 and CEA-708 captions ride inside the video
rather than in a track of their own, and the player was not being asked to
build a track from them, so the CC button had nothing to turn on. They are also
drawn the way a television draws them — white monospaced text in a solid black
band — rather than as outlined film subtitles, which disappear over a bright
sky.
The Record button is gone from recordings. It was shown on anything played
in a wide enough window, including recordings, where recording is either
meaningless or a way to schedule something nobody asked for. It belongs to live
television and is now only there.
Clicker 1.1.0
Clicker plays through mpv now, the picture stays on the graphics chip, memory
is down by two thirds, and the home screen stopped lying about what you were
watching.
mpv is the video player
Everything Clicker plays goes through mpv, built from source and shipped
beside the application. There is no setting for it and no second player to
fall back to.
The reason is edge cases. Broadcast television is full of them — timestamps
that jump at a segment boundary, damaged segments, containers assembled by
something unusual, streams that stop and start — and mpv has been having those
solved for twenty years. Nearly every playback report is one of them, and most
arrive attached to a recording that plays perfectly everywhere else.
The picture never leaves the graphics chip. Decoding, colour conversion
and drawing all happen on the integrated GPU, and frames make no round trip
through system memory on the way to the screen. Measured on a 1080p60
recording, video costs about eight percent of one processor core. The discrete
card is still never asked for.
A log file. The player has always reported what it was doing, but a
windowed build has no console, so every one of those lines went nowhere. They
now go to player.log beside the settings, and Settings has a button that
opens the folder — and mpv's own account of a file goes in there too. If
something stutters, send that file.
Stats. Ctrl+I shows what playback is actually doing: frames dropped, A/V
sync, how much is buffered, and what the renderer costs.
mpv and FFmpeg are both LGPL, both built from source with no GPL components,
and both ship as ordinary replaceable libraries. Settings names them under
About, and licenses/THIRD_PARTY.md has the full accounting.
Memory
Idle went from 645MB to 173MB, and startup from 726MB to the same figure.
Most of it was structural:
- The old player and everything under it is gone, along with its audio stack
and its own copy of FFmpeg's headers and import libraries. mpv brings one of
each. - Drawing moved to OpenGL. The previous graphics backend defaults to trading
memory for speed and commits large heaps up front; nothing here needs that
bargain. - Video frames are no longer copied into system memory and converted before
being drawn. At 1080p that was eight megabytes of allocation per frame,
sixty times a second. - A list of every recording the DVR did not record, cloned in full, held in
memory and written to the cache file, and read by nothing. - The server's raw object for every airing in the guide was kept resident to
serve an action that happens once in a while. A day of listings is 24MB of
JSON across thirteen thousand airings. It lives on disk now and the one
being scheduled is read back when it is needed.
Home screen
Continue Watching is in the right order. It was sorted on a field the
server also bumps for its own housekeeping, so a documentary nobody had got 4%
into outranked an episode somebody was a third of the way through. The API has
a last watched timestamp and this client was ignoring it.
The hero is a shuffle, and says so. It sits where continue-watching goes,
so showing something that was not what you last watched read as a broken
feature. It is now drawn from the whole library, labelled as a pick, and deals
a new card every time you arrive at the home screen, including coming back
from something you were watching. It carries the season and episode, year,
length, rating, genres, description, director and cast, and its artwork is
fetched at the size it is actually drawn.
Library and guide
- Shuffle an episode of any series, preferring ones you have not seen.
- Sources are named what Channels names them. A channel carries a device id,
not a source name, and the guide was showing the id. - The guide reaches a full day ahead instead of a few hours.
- Listings dated centuries in the future are ignored. Guide data occasionally
contains jokes.
Deleting
Every delete asks first, including removing a download and clearing all
finished downloads, which was the most destructive button on the screen and
had no confirmation at all. Deletes go to the DVR's Trash and always did, so a
mistake is recoverable from the server's own admin page.
Settings
- Folders. Downloads and the live buffer can each live wherever you want,
chosen from a folder picker. Neither is small and both defaulted to the
system drive. - Keyboard. Every shortcut can be rebound, cleared, or reset, and they can
all be turned off with one key that keeps working while they are off. The
whole list is on the settings page, generated from the same table the
handler reads. - Software decoding. Decoding uses the integrated graphics chip by
default. Turn this on if a driver produces a picture with artifacts. The
discrete card is never asked for either way.
Appearance
- Full screen fills the screen. A maximized window is confined to the area
above the taskbar, and going full screen from there stayed confined to it,
leaving a strip of desktop along the bottom. - A new icon: a 1980s remote, drawn at nine sizes and simplified as it gets
smaller so it still reads at 16 pixels. - Artwork has rounded corners everywhere. It was being drawn square inside
rounded borders. - The hero's gradient is a gradient rather than twenty-four flat bands.
- The library's search box matches the guide's.
- The window reopens where it was left, at the size it was, maximized if it
was maximized.
Clicker 1.0.0
Clicker is a native Windows client for Channels DVR: live TV with pause and rewind, recordings, a full guide, downloads for offline viewing, and closed captions. One Rust binary, no web view, no server side transcoding unless you ask for it.
Clicker is not affiliated with Fancy Bits, LLC and is an unofficial client to Channels DVR Server.
It runs on Windows 10 now
This is the headline. Earlier builds needed Windows 11, because the interface was drawn over Mica, a system material that only exists on Windows 11. Asking the compositor for it was the only thing that ever required a newer OS.
Clicker paints its own backdrop instead, so one build covers Windows 10 version 1809 and up, Windows 11 included. Same player, same guide, same everything.
New
The window remembers where it was. Close it maximized and it opens maximized. Close it small in the corner of the second monitor and it comes back there. If the monitor is gone when you next open it, the position is thrown away rather than opening the window somewhere you can't see it.
The guide reaches into tomorrow. It used to stop a few hours out. It now loads a full day of listings and lets you scroll to the end of them, with an hour of empty space past the last program so the end doesn't feel like a wall. The far edge stops where three quarters of channels still have listings, so you aren't scrolling through a screen of blank rows chasing one long infomercial block.
The home screen changes. It used to feature the same show every single launch, which for a half watched series means months. It now picks from the five most recent things you left unfinished.
Settings says what this is. There's a line in the About section stating that Clicker is unofficial and not connected to Fancy Bits, so anyone who finds it secondhand knows where to send bug reports.
Fixed
Artwork corners. Posters and thumbnails were drawn as squares inside rounded borders, with the corners of the picture poking out past the border. Everything is properly rounded now: the featured show, the home rows, library rows and posters, scheduled recordings, and downloads.
The library search box. It was a plain text field on one screen and a rounded pill on another. Both screens use the same control now, at the same width.
A white outline in the guide. Hovering a program drew a hard white box around it. It was meant to be the same faint hairline every other control uses, and now it is.
Guide scrolling. It would run well past the end of the listings, or stop half an hour short of them, depending on the day. It lands on the real end now.
Install
Download Clicker-Setup-1.0.0.exe below and run it. 64 bit Windows 10 version 1809 or newer. It installs for the current user, so there's no administrator prompt, and it doesn't touch anything outside its own folder.
The installer isn't code signed, so SmartScreen will most likely show a warning the first time. "More info" then "Run anyway" gets past it.
Notes
Video is decoded by FFmpeg, built from source under the LGPL with no GPL components. The libraries ship as separate DLLs next to the executable and can be swapped for your own build. License texts are in the install folder.
Clicker is source available under PolyForm Noncommercial 1.0.0. Read it, build it, change it, share it, for anything noncommercial.
RustDVR 0.0.2
RustDVR now comes in two editions, built from the same source on every run.
RustVCR: the Windows 10 edition
The one complaint about 0.0.1 was the floor: Windows 11 only. That requirement
turned out to be narrower than it sounds. The interface is drawn over Mica,
the system material behind File Explorer and Settings, and the window base is
fully transparent so the material shows through. Windows 10 has no Mica — a
transparent base there is a hole straight to the desktop. That was the whole
dependency. The fonts already fell back to the Windows 10 faces, and nothing
else cared.
So the Windows 10 edition is the identical application with one change: it
paints an opaque Fluent base where the material would have been — the same
solid Windows 11 itself falls back to when Mica is unavailable — and it stops
asking the compositor for things Windows 10 cannot draw. Same player, same
guide, same timeshift, same downloads. It ships as RustVCR, because it is
the recording technology of an earlier generation, for the operating system of
one.
Which installer to download
RustDVR-Setup-0.0.2.exe— Windows 11. Refuses Windows 10, where the
result would be a window with a hole where Mica should be.RustVCR-Setup-0.0.2.exe— Windows 10, version 1809 or later. Also
installs on Windows 11: needing nothing Windows 11 has is no reason to
refuse it, so anyone who prefers the opaque look — or wants to see how the
other half lives — is allowed.
The two are separate products with separate uninstall entries and can be
installed side by side. Settings and data are shared deliberately: it is the
same program, and a machine upgraded from one edition to the other keeps its
servers, its settings and its downloads.
Fixed
- The guide's hover outline, in RustVCR. The hairline that fades in under
the pointer was being computed in the wrong color space and came out several
times brighter than the one every other control wears. Over Mica that read
as a lit edge; over RustVCR's opaque base it read as a hard white outline.
RustVCR now uses the theme's own control hairline. RustDVR's rendering is
untouched — byte for byte the same as 0.0.1's, apart from the version
number.
Building
build.ps1 now produces both editions and both installers on every run; see
the README for the two-step build. Still pre-release: it has not been run
anywhere except the machines it was written on, and there will be rough edges.
RustDVR 0.0.1
First public build. Pre-release — it plays live TV and recordings, schedules, downloads and seeks, but it has only ever been run on the machine it was written on. Expect rough edges.
Not affiliated with Channels or Fancy Bits, LLC. RustDVR is an independent, unofficial client that speaks to a Channels DVR server over its public HTTP API. Please do not ask Fancy Bits to support it.
Install
Download RustDVR-Setup-0.0.1.exe and run it. Per-user install, no administrator prompt, nothing written outside the install folder and %LOCALAPPDATA%\RustDVR. Windows 11.
On first run, enter your DVR's address — a hostname or IP, with :port if yours is not on 8089.
What is in it
- Live TV with timeshift — pause, rewind, return to live. Original comes straight from the tuner with no server-side pipeline at all, and is buffered to disk locally so it can still be rewound. The buffer recycles rather than filling up; its size is a setting, and Off is one of the choices
- Guide with channel logos, collections, sources and search. Left click watches, right click records; a future programme records on left click
- Recordings, split into what already exists and what is scheduled
- Library for imported media, kept separate from what the tuner recorded
- Stream quality picked per session from the player, or globally in settings — the DVR transcodes, not the client
- Commercial skip from the DVR's comskip markers, marked on the scrub bar
- Closed captions, CEA-608/708, decoded out of the picture itself and drawn broadcast style
- Downloads with a screen of their own: two at a time with the rest queued, pause, resume, cancel, remove, and play with the network unplugged. A transfer survives a pause, a failure, a crash or a quit — the partial file is kept and picked up with a
Rangerequest rather than started again - Works offline — the library is cached to disk, so downloads keep their titles and artwork with no server to ask, and a banner offers what still plays
- Reconnects by itself after sleep, a network change or a DVR restart
- Optionally keeps running in the notification area when the window is closed, so a download nine tenths transferred survives it
- Multiple DVRs, full screen, an auto-hiding transport, keyboard control
What it cannot do
It will not appear in the DVR's client list by name. Channels identifies a streaming client by its IP address and nothing else — checked against a real server, which ignored the User-Agent and every one of client, client_name, device, device_name, name and player as query parameters. The device name set in Settings is sent in the User-Agent, where it reaches the DVR's logs and stops.
Tuning a channel takes several seconds. Most of that is the DVR locking a tuner — measured at 8.6 seconds on a cold tune, against 0.2 seconds when the session is already up — and no client can make that part faster.
Windows 11 only. Mica, the custom caption, the resize handles and the sparse-file live buffer are all Win32.
Licence
PolyForm Noncommercial 1.0.0. Read it, build it, run it, change it, fork it and share it, for any noncommercial purpose. You may not sell it or use it to make money.
That is source available, not open source in the OSI sense — the Open Source Definition forbids discriminating against any field of endeavour, and a noncommercial restriction is exactly that. Forks and patches are welcome; revenue is not.
Media playback uses FFmpeg n7.1.1 under the LGPL v2.1 or later, built from source with --disable-gpl --disable-nonfree and shipped as separate, unmodified DLLs beside the executable so they can be replaced with any compatible build. Licence texts are in the install folder, and LICENSE.md carries the exception LGPL-2.1 section 6 requires.