Repository navigation
Releases: antonbier/DreamHub
Release list
DreamHub 0.12.0
Added
- IPTV, Let the assistant look (AI Center for channels, step K1 of
docs/PLAN_AFTER_0.11.md): the Select bar has Let the assistant look…. For up to 60 ticked channels it shows whether each has a programme ✓ / ✗, which satellite channel's guide it could show (a guide twin, offered when the names are the same) and a picon from the public TV-logo collection for a channel without one, with the best suggestion already chosen. Looking saves nothing; Preview turns the choices into one plan and only Save keeps them — twins and picons are DreamHub's own notes (no bouquet, nothing on the box; the next Make a bouquet… uses the twins). The same plan is a catalog capability (iptv.channels.review), so an outside or the built-in assistant can propose it and it waits in AI Center → Proposals for a person. New routesPOST /netcast/reviewandPOST /netcast/review/plan. Mock-tested; real satellite lists and the online picon collection need a box check. - IPTV, Guide ✓ / ✗ per channel (step K2 of
docs/PLAN_AFTER_0.11.md): next to the channel count, Check programme marks the channels the list shows (up to 200) with a small ✓ / ✗ (or ? when not asked yet), tells how many have a programme and can show only those without one. A programme found in a guide file, through a remembered twin, on the box or — new — at an Xtream account counts; the account is asked per channel, 40 channels per check. Let the assistant look counts the account's programme too (it showed ✗ before). Reads only, saves nothing. New routePOST /netcast/guide/state. Mock-tested; a real account needs a box check. - IPTV, Watch here (eighth part of the rework in
docs/IPTV_REWORK.md): an internet channel plays in the browser when its stream needs no conversion — HLS, a video file or an audio stream. Watch here is in the channel sheet and in the ⋯ menu of a channel whose address is an http stream; DreamHub opens the stream for a moment to see what it serves, then passes it to the player under a one-time address, so the stream's own address and any login in it stay on the box. When the browser cannot play it (MPEG-TS, a protected stream, a list of channels, no answer, a format the browser does not know) the panel says why and offers Play on the TV. Nothing is converted; live TV is never converted in software. New:POST /api/v1/netcast/channel/watchand the ticketed relayGET /api/v1/netcast/watch/{ticket}/{n}; hls.js is bundled for HLS. Mock-tested only: real streams on a tablet and a phone are open. - IPTV, one page without tabs (seventh part of the rework in
docs/IPTV_REWORK.md): the Bouquets, Guide, Providers and Netcast tabs are gone. Bouquets are made with Make a bouquet… where the channels are, the guide files are in Sources & programme, sources are added with + Add source and set up in Manage sources, Netcast is a row in the source column. Old links keep working:/netcast,/iptv?tab=…,/channels?tab=iptv|netcastand a search result's?q=&source=open the page, and the sheet or dialog that took the tab's place. A file is now a source: + Add source → A list takes a file from the device (M3U, M3U8, also .gz, up to 8 MB); DreamHub keeps the list as a source of its own (no address, not read again), and Manage sources replaces it with a newer file; it can be starred, put in folders and made into a bouquet like any other source. Lists remembered by address before bouquets stayed linked are still compared and applied, now from the Sources & programme sheet, and only when there are any. The user guide chapter IPTV (en, de) and the Help example were rewritten. Mock-tested; a file as a source and the rest of the rework need a box check. - IPTV, the channel list (sixth part of the rework in
docs/IPTV_REWORK.md): an internet entry of a bouquet in Channels has Details… next to Play and opens the same channel sheet as the IPTV page (Play on the TV, Programme, Properties with the picon search, guide, streams of every source, Rename… / Use this one — each still a preview). Find channels has the filter IPTV · Radio · TV: IPTV lists the internet channels of the box's bouquets (each once, with the bouquets it is in); TV and Radio are the box's own lists as before. On the Logos tab the search for one channel's logo — online first — stands above the choice of a set. NewPOST /api/v1/netcast/channel/find(a bouquet entry → its source and channel) andGET /api/v1/channels/all?streams=1. Mock-tested; the lookup of Netcast entries wants a box check. - IPTV, browsing (fifth part of the rework in
docs/IPTV_REWORK.md): the switch above the list is now List · Tiles · Programme (Tiles the default, the choice kept on the device). Programme is the time grid for a folder, or for a source or group of up to about 200 channels; a larger one, "All" and a search say "Put the ones you watch in a folder: every folder shows its programme grid". Radio tiles show the station logo and the song its stream names (ICYStreamTitle, asked only for the tiles in view through the fetcher's host rules, kept 45 seconds, nothing written) instead of a programme line. The groups of a source are chips above its list (the navigation lists sources only). The same channel from several sources is listed once in "All", in a search and in folders, with "from 3 sources"; inside a source it is listed as that source has it. The A–Z strip shows every letter (greyed where the list has nothing), can be scrubbed with a finger or the pointer with a large letter showing, and stays away for fewer than 20 channels. Change order has By channel number (thetvg-chnoof the list, the channels without one after them in their order). The start page's internet favourites tile and a new Internet tab on the simple view's TV page use the same tiles and play on the TV with a tap. New routesPOST /netcast/radio/titlesandGET /netcast/channels/same. - IPTV, a bouquet made from a source or a group stays linked (the part of the fourth step that was moved here): the header of a source or group says "Bouquet “Films (TV)”: in line" or "3 new, 1 removed" with Bring in line… (the same comparison and preview as for a folder) and Forget the link (the bouquet stays). The link is saved by the plan that writes the bouquet; the table
iptv_folder_bouquetswas rebuilt for the new scopes (the database is copied first, every link is kept). New routesGET/DELETE /netcast/library/source-linkandPOST /netcast/library/source-link/compare. - IPTV, sources on the Channels page (fourth part of the rework in
docs/IPTV_REWORK.md): the navigation lists the sources under their own heading with a state dot and the channel count, Netcast as one row that unfolds into its sources, and a ⋯ menu per source (Refresh, Programme…, Settings…). Chips All · TV · Radio tell the sources apart. A source that failed shows a problem banner with its answer, Retry and Settings; Sources & programme (button with a problem badge) is a side sheet with a card for the sources that work, a programme check per source (how many channels have a programme, and the first without), the guide files with Refresh, and + Add guide file (the former Guide tab's block). + Add source asks "What do you have?": a list (address, or a file in a GitHub repository; optionally also in Netcast, a second preview), an account (Xtream), a device on the network, or something Netcast already knows. Manage sources (from a source's Settings…, the sheet or an empty page) lists every source as Live TV / Radio with Netcast unfolded, problems in red and hidden ones marked; a source's Settings are its name, address and login (kept, never shown), its place in the navigation (↑ ↓), whether it shows in the navigation, which profiles see it, and Remove source… (asks first and lists what goes; a Netcast source's address change and removal are plans on Netcast's file). New routeGET/PUT /netcast/source-settings; what is hidden or not for a profile is left out of the source list, refused on read and not searched (enforced in the backend like the adult filter); the new backup itemsourceskeeps order, hidden and audience. The first-run page opens the same Add source dialog. The old tabs still work until the rework ends. - IPTV, the channel sheet (first part of the rework in
docs/IPTV_REWORK.md): the detail panel of a channel has two tabs, Programme (as before) and Properties. Properties shows what the source says, the guide in use (with the way to change it), and one stream per source that has the same channel — the same channel is found in other sources by its guide id, else by its name without quality words ("HD"), accents and capitals; radio and television never join, and look-alikes ("News" and "News 2") stay apart. Each stream can be played on the TV or tested; "Not the same channel" takes a wrong match apart (a box setting, kept in the backup) and "Join them again" undoes it. The header says "from 3 sources". Hide this channel is there too. New routesPOST /api/v1/netcast/channel/{sources,split,test,play}. Changing the name, group or picon and "use this one" in a bouquet come with the bouquet panel. - IPTV, "Make a bouquet…" everywhere and folders that stay linked (second part of the rework in
docs/IPTV_REWORK.md): the bouquet panel of a folder opens from a selection (Select bar), a channel's ⋯ menu and a source or one of its groups too, and lists channels it left out with the reason. A bouquet made from a folder stays linked to it: the folder says "in line" or "2 new, 1 removed", Bring in line… shows what would change (a preview, nothing before you confirm) and Forget the link leaves the bouquet as it is; channels whose source is not open are reported as not checked, never as removed. **Ch...
DreamHub 0.11.0
The largest release so far: an IPTV hub, an MCP server, rules in Automations, data-only extensions and a built-in assistant. Database migrations (IPTV providers, favourites and folders from netcast_marks, rules, tokens, proposals, extension manifests) run at start; a copy of the database is made first. Nothing new changes the box by itself: MCP and the assistant only read or propose, a person applies; a rule's run stage is off until its envelope is confirmed and the global switch is on (off by default). The TV plugin is unchanged apart from its version.
Added
- IPTV hub (
docs/IPTV_PLAN.md): one menu entry IPTV (Media) with the tabs Channels, Bouquets, Guide, Providers and Netcast, replacing the page "Netcast" and ChannelHub's two tabs (old links redirect). One provider model — Playlist (by address or file, with device presets for Tvheadend and HDHomeRun), Xtream (live only; login checked once, never returned), Netcast — whose remembered playlists and Netcast favourites are migrated. The Channels screen works at the size of real lists: search first (/), tiles or list, a windowed list with an A–Z strip, now/next only for rows in view, "For you", favourites in folders (drag and drop or "Move to folder…"), hiding a channel or group, adult groups left out by the backend for a profile withoutiptv.adult. A channel's detail panel shows today and a week of guide (Netcast's guide files kept a day back and a week ahead; a match by hand is remembered per box); a folder has a guide grid and becomes a bouquet as a plan. The search palette and search page find channels of every provider. Box-checked on the One with the 0.11 development build (migration, a week of guide, playback); Xtream, Tvheadend and HDHomeRun only against mock servers. - MCP server (
docs/assistant/MCP_PLAN.md):/mcpover streamable HTTP with bearer tokens (no OAuth), made in AI Center → Connect. Tools come from one catalog of capabilities (read, event, plan); a tool can read or propose a plan, never apply it — proposals wait in the Inbox for a person (a proposal touching recordings needs the PIN). Resources (the user guide among them), prompt templates, a call log, rate and size limits. Not yet tried with a real MCP client. - Rules in Automations (
docs/assistant/RULES_PLAN.md): triggers from events, conditions, actions; nine templates, a guided When → Then → Review flow with the rule as a sentence and a dry run beside it, a history of runs. Stagesnotifyandpropose; the boundedrunstage needs its own envelope confirmation (caps, loop guard) and the global switch, off by default, with "pause all". An assistant may write a rule; a person confirms it once. - Data-only extensions (
docs/assistant/DECLARATIVE_EXTENSIONS_PLAN.md): a manifest (validated, stored on the box) with HTTP sources and polling, a webhook in, actions as plans, new widgets (schema 4), behind a host policy; made in AppsHub → Extensions with an editor and a preview, or through MCP. No foreign code runs. - AI Center (DiscoveryHub's tabs Recommendations, Assistant, Inbox, Connect): one provider (OpenAI-compatible with a base URL, or Claude) and an optional built-in assistant that answers with the same read and propose tools, under the one daily token budget.
- IPTV, make a bouquet from a folder on the folder's own page (
docs/IPTV_UX_REVIEW_2.md): "Make a bouquet…" opens a panel beside the favourites — the folder's channels ticked, the name checked against the bouquets that exist (case ignored, with or without the " (TV)" the box adds), TV or radio, a new or an existing bouquet, the preview with how long it is valid, and only then "Add channels". The Bouquets tab stays for lists from an address or a file. - IPTV, select several channels: a "Select" mode on every list ticks channels with a click (instead of playing them) and files them all in a folder, or a new one, in one go; the first star of a visit offers the folders in the same gesture; a folder warns when a channel is in it from more than one provider; a provider whose list could not be opened is said above the list with its answer and "Retry"; many Netcast sources are said once in the Providers tab; folder names are unique ignoring case; the open-list limit per profile is 8 (12 in all).
- AI Center and Automations, QA rounds (
docs/assistant/QA_PASS.md): the Assistant tells a rejected key, a spent quota and another provider error apart from an unreachable provider; a failed read shows a message with "Retry" instead of an empty list; the Inbox names each card's subject, shows yes/no as words and moves the focus to the result after Apply; a rule is shown with the UI's field names, numbers formatted for the language, its number, and a notice after saving; the run history and the dry run speak the person's language; a rule that only tells cannot be raised to "Run by itself"; "Save and test connection" says what it does. - Extensions editor: invalid JSON says where it breaks (line and column), the short id is checked while typing, a failed source says why in words, the new web address appears under its extension, a card without its secret says so, secrets are described as stored in plain text on the box, and fields in the light theme have a visible border.
Fixed
- Extensions editor: an error about the manifest as a whole (broken JSON) no longer starts with the internal path
$:(found on the box before the release). - IPTV, folder to bouquet (
docs/IPTV_UX_REVIEW_2.md): the preview of a bouquet plan no longer breaks the page when nothing was left out (the plan answeredskipped: null; it is[]now); a folder handed to the Bouquets tab arrives with every channel ticked, its name, a way back and a note for each favourite that was left out; the folder's list is read again by itself when a provider's list was no longer open, and an expired folder list offers "Read the folder again" instead of a dead end; lists made from folders no longer push a provider's list out of the profile's few open lists; the "No folder" section no longer opens a folder guide that always failed; after "Add channels" the page links to the channel list and back to the folder.
Changed
- AI settings (AI Center rework, U1): Settings has its own AI tab with three steps (Provider: OpenAI / Claude / own server; Access: only the chosen provider's fields, with a "Test connection" button; Budget and use: one daily token limit with today's use). One provider now serves Recommendations, name suggestions, package explanations and the Assistant (they all run through the same chat layer), and they all draw from the one daily token budget. Gone from the UI and the schema:
ai.provider,ai.dailyLimit(the old request limit; the token budget replaces it) andai.openai.model(the model isai.chat.model; an old OpenAI model is carried over once at start, keys and secrets stay where they were). New:GET /api/v1/ai/status,POST /api/v1/ai/test(settings permission; not reachable with assistant tokens).GET /api/v1/discovery/statusand the recommendations answer now report tokens, not requests.
DreamHub 0.9.6
[0.9.6] - 2026-10-24
Added
- Netcast channels into a bouquet (Dreambox One): in the "Netcast" tab a source's channels open as a list in the IPTV tab — Samsung TV Plus (all regions, with their groups), Pluto TV (names only: Netcast keeps no more of it), and playlist sources — to pick, test and add to a bouquet like any list. The entries are the plugin's own kind (
8193,netcastserver_<id>://), so Netcast keeps refreshing their addresses; with a twin from the guide matching they carry that channel's guide. Checked on the One: played, with and without a twin. Vavoo cannot be listed (it plays through a local proxy).
Fixed
- Box admin → Box settings was blank on a Dreambox: a menu with no settings (the One's "Fernbedienung") came as
null, the page read its length and stopped, and that menu was the one opened first. Empty menus are now an empty list, the page copes with an old backend'snull, and it opens on the first menu that has settings. The mock had no empty menu, which is why the browser run on it did not show this; it has one now. - Radio: the page logged "Cannot access before initialization" at load (the radio-text watcher read a value declared further down); on a phone the station names were cut to "Deutschl…" next to the buttons, they now wrap.
- Netcast tab: its introduction still said "a view only: nothing is changed here", although sources can be added, changed and removed since 0.9.5.
DreamHub 0.9.5
[0.9.5] - 2026-10-24
Added
- Changing Netcast's sources on a Dreambox One: add, change and remove now work against a real box. The DreamHub plugin has a new file route (
/dreamhub/files/write) that writes onlynetcastserver_*.json/netcastepg_*.jsonin/etc/enigma2(and the.dreamhub-backupcopy): valid JSON, at most 1 MiB, replaced atomically, refused unless the new setting "Edit Netcast sources" in DreamHub's settings on the TV is on (off by default), and only for a POST with DreamHub's request header and aHostthe box answers to. The directory listing now also works on a Dreambox (its media player's listing), so every source file shows, not just three well-known ones. - Netcast sources in the channel list (read only): a new "Netcast" tab shows the sources the Netcast plugin has set up on a Dreambox One — channel playlists and services, and guide sources — read from the plugin's own files. A login is never shown, only that a source has one; a box without Netcast says so. A source can be added, changed or removed as a plan (a copy of the old file is kept, the file is read back) — as soon as the box has a way to write the file, which it does not yet — and the guide-source check offers "Add to Netcast". A playlist source Netcast has already downloaded can be opened as a list in the IPTV tab ("Use as list…") to pick channels from it, give them a guide and put them in a bouquet. Also: a GitHub repository can now be used to pick a playlist in the IPTV tab. New:
GET /api/v1/channels/netcast/sources,POST /api/v1/channels/netcast/plan,POST /api/v1/channels/netcast/read. - Guide sources and a coverage check for internet channels: in the IPTV tab, a "Guide sources" section next to the guide picker. Pick an XMLTV file from a short suggested list, paste an address, or paste a public GitHub repository (or folder) to list its guide and playlist files, then "Check coverage" says how many of the chosen channels the file knows (by
tvg-id, then by name) and which it does not. DreamHub reads only the file's channel list, never the browser;.xzfiles are refused. Nothing is changed on the box. New:GET /api/v1/channels/iptv/guide-sources,POST /api/v1/channels/iptv/github,POST /api/v1/channels/iptv/guide-coverage. - Internet channels in the channel list: a bouquet entry that is a stream (a plain
4097address, or one of the Gemini Netcast plugin's entries) is marked "Internet" or "Netcast" with its source, and has a Play button that starts it on the TV. Having no tuner, it cannot be recorded: the guide offers no "Record" for it, and a timer for one is refused with an explanation (timer_no_tuner). Creating, moving, renaming and removing such entries works like any other. - Internet channels from an M3U list into a bouquet: a new "IPTV" tab in the channel list. It reads a playlist from an address or an uploaded file — the box fetches it, never the browser; addresses on the box itself are refused, redirects stay on http(s), the size is capped and gzip is unpacked — and put chosen channels into a new or an existing bouquet as plain
4097entries that any receiver plays. It is an ordinary plan: a preview, a backup of the channel list, the bouquet read back, the backup restored if a step fails. A stream address with a login (user:pass@,?password=,?token=) is never shown on screen, in a preview or in a log; the page only says "with login". (Once a channel is in a bouquet, the channel list's own API gives its reference to admins as it always did for such entries.) A channel whose address is in the bouquet already is left out. In the tab you give the address or choose a file, search and pick channels (by group, 150 at a time), choose a new or an existing bouquet and see the preview first. A list read from an address can be remembered (the address stays on the box and is never shown): "Compare again" reads it again and offers what differs from the bouquet — a channel whose address changed (ticked; it keeps its place and name), one the list no longer has and one it gained (neither ticked) — as an ordinary preview with a backup. What was added or moved in the bouquet by hand is left alone, and a new channel left unticked is offered again next time. A chosen channel can also get a programme guide: it carries the identity of a channel the box already has ("Das Erste" the guide of "Das Erste HD"), so the TV shows that programme for it. Names that match are filled in, similar ones are offered, anything else is found with a search over the box's channels that shows what each candidate is showing now; matches are remembered per box, and a changed address keeps the guide. The logos a list gives (tvg-logo) can be fetched from the list's own servers after you confirm (the preview names them; a logo you chose by hand is never replaced, and a logo follows a channel whose address changed). Test streams opens the chosen streams for a moment, on request and a few at a time, and says which answer, which want a login and which are gone. New:POST /api/v1/channels/iptv/read,/iptv/upload,/iptv/plan,GET /iptv/sources,POST /iptv/sources/{id}/compareand/plan,DELETE /iptv/sources/{id},POST /iptv/twins,GET /iptv/twins/search,POST /iptv/test(plan indocs/NETCAST_PLAN.md, N1). - Box settings in DeviceHub (read only, first package): a new tab shows the receiver's own setup menus — recording margins, timeshift, A/V, HDMI-CEC, the channel list, subtitles and the rest — with the box's own labels and the current values, a search across all sections, and the level each setting belongs to. A setting that can leave the TV black or lock DreamHub out, or that needs a GUI restart, is marked; a password or PIN is never shown. A "?" beside a setting explains what it does (DreamHub's own text for the common ones, the receiver's description otherwise); settings that explain themselves have none. On an OpenWebif receiver (VU+, checked on a Solo2 with VTi 15: 356 settings in 18 sections) from the box's own menus; on a Dreambox through the DreamHub plugin's new read-only route
/dreamhub/settings— its ten menus and, beyond them, every setting of the box and the Gemini plugins by key name (checked on a Dreambox One: 1,402 settings, read in about a second). It needs the updated plugin on the box; without it DreamHub says so. Nothing can be changed yet. New:GET /api/v1/boxsettings,/boxsettings/sections/{key},/boxsettings/search. - Reception in DeviceHub: Overview shows the signal quality (SNR) and strength (AGC) of the tuner showing the current channel, the bit error rate and, where the box gives a real one, the SNR in dB — read every 5 seconds while the page is open, handy when aligning a dish. New:
GET /api/v1/deviceinfo/signal. Checked on the VU+ Solo2 (VTi 15, which repeats the percentage where the dB value belongs, so none is shown there); a Dreambox's answer is not checked yet. - Other airings in the guide: a programme's dialog lists when it runs again ("Also on"), each opening in the same dialog to be recorded there — the box's own search for repeats of the same broadcast, so it finds the next Tagesschau but not the next episode of a series. New:
GET /api/v1/guide/similar. Checked on the Solo2; a Dreambox's answer is not checked yet.
Fixed
- Internet channels with a
%or:in their name could not be added to a bouquet: the box writes those two characters of a name escaped into the reference, and DreamHub's check after the change did not expect that, so it undid the change ("the channel list was restored from the backup"). Found on the first real run of the IPTV import against a Dreambox One. - Netcast entries looked like headings: DreamHub read the flags of a service reference (
256in Netcast's entries) as hex, where enigma2 writes them in decimal, so0x256contained the heading bit. Type and flags are now read in decimal.
DreamHub 0.9.4
Added
- VU+ and other OpenWebif receivers as Basic boxes (#56): add a receiver that offers the OpenWebif web interface under Settings → Boxes, like another Dreambox. Checked on a VU+ Solo2 with VTi 15.0.04 (OWIF 1.5.2): live TV, the TV guide, timers, channel lists, the remote, screenshots and recordings (also played on another box's screen through the hub) work; the answers were compared with the current OpenWebif source. DreamHub itself does not run on such a receiver (too little flash, no systemd): it runs on a Dreambox or a server. AutoTimer and SerienRecorder show up only where the box has them. See "Supported boxes" in the README.
- Tuner state on OpenWebif boxes: the timers view says what each tuner does ("Tuner A: live: Das Erste HD", "Tuner B: free") where the box tells; a Dreambox does not.
GET /api/v1/timersanswerstunerStates. - A recording can be played on an OpenWebif box's TV (zap to its reference, from the start) when it has no DreamHub plugin.
Fixed
- The screenshot of an OpenWebif box: it has no
/screenshot, so DreamHub falls back to/grab(and says so when the box has no grab tool). - The volume of an OpenWebif box is read from
/web/volwhengetcurrentcarries none. - A missing AutoTimer plugin on an OpenWebif box is no longer reported as installed (OpenWebif answers
/autotimerwith a "not found" stub and status 200). epgmultiwith a window that ends before it starts is refused before it reaches the box: a negative one crashed enigma2 on a VU+ Solo2.- The channel list of an OpenWebif box ("every channel", the daily snapshot) is read from its bouquets: the one query for every service by name took over 39 s on the Solo2 with a full satellite list, and the box dropped off the network soon after. The background refresh also waits a little between provider reads and gives up on a box that stops answering; a refresh someone waits for runs at full speed.
DreamHub 0.9.3
Added
- Recordings that stopped early are flagged (#44, phase 3): MediaHub's list says "Stopped early: 57 min of 2 h 4 min" when a recording is far shorter than the programme it was announced as (read from the
.eitnext to it; no ad detection needed). A recording you cut yourself, a programme under 10 minutes, a gap under 5 minutes and anything over 85 % are not flagged. On the reference box it finds, among others, a film recorded for 57 of 124 minutes and a recording of 2 seconds. - Radio text (#28): RadioHub shows the line a station sends about what it plays ("Proms London: Mahler's 9th …") under the station that plays — on the box or in the browser. WebControl doesn't expose it; DreamHub reads it out of the station's audio stream (RDS in the MPEG audio frames' ancillary data), listening in for a few seconds at a time.
GET /api/v1/radio/text?ref=. - A package change checks the hubs at once (#47): installing, upgrading or removing a package a hub names (the WebInterface, BouquetEditor, SerienRecorder and AutoTimer plugins,
ffmpeg,shellinabox,enigma2-journald, the overlay module) has the hubs' status looked at straight away — a hub that became (un)available shows up in the change log without waiting for someone to open the app. The "needed by a hub" list now carries the plugins' real package names, read off the box. - Cutting by hand (#27): every recording's details have "Cut by hand": name the parts to cut out (m:ss or h:mm:ss), look at each boundary in the browser player, preview, confirm. It is the ad cut's own flow (no re-encoding, the original goes to the trash), and needs no ad detection first — the recording's length is read from the file.
- Multi-box M8 — copy the channel list from another box: ChannelHub → Bouquets → "Copy from another box" (shown with two or more boxes). Pick the source box, see per bouquet whether it is created, brought in line or already the same, and which channels this box doesn't know; one confirm. Channels are matched by reference, then by name; bouquets of the same name and kind are made to look like the source's, others stay. Applying backs up the channel list first and checks every bouquet afterwards, like any bouquet edit. API:
POST /api/v1/channels/sync/plan(from, optionalbouquets).
Fixed
- The TV plugin's QR code really encodes the box's LAN address now. 0.9.2 said so, but the fix was never wired into the QR handler, so the code still pointed at
127.0.0.1, which no phone can open. The launcher also shows the address in words under the code (GET /api/v1/healthhas a newaddress). - TV plugin screens: the settings screen no longer cuts "Backend verlangt …" off, shows the port as
8765instead of08765, checks the range (1024–65535) and says what the port is for; the launcher and settings screens are larger, with readable coloured key hints. The "Backend requires a password" switch is gone — it never did anything. - A cut file (ad cut or by hand) gets the original's file permissions; DreamHub's strict umask had left it readable by root only.
Changed
- Cutting a recording needs no ad detection first (the length is read from the file); its change-log line says "parts" instead of "ad breaks".
- Multi-box M8 has only been tried against the two mock boxes — a real second box is still missing. It shows only with two or more boxes.
DreamHub 0.9.2
Security
- Wrong passwords and tokens are throttled: after 10 failed attempts within 5 minutes an address gets no further credential checks for 5 minutes (a login that is already open keeps working).
Fixed
- Package file modes: the 0.9.0 and 0.9.1
.debfiles were built on a machine with umask 0000 and carried 0777 directories and 0666 files, including/usr/bin/dreamhub(runs as root), the systemd unit and the TV plugin's Python files — writable by every local user.build-deb.shnow sets 0755/0644 itself and refuses a tree with group- or world-writable entries. To repair a box that has the old package:chmod 755 /usr/bin/dreamhub /usr/bin/dreamhub-dockerd-helper; chmod 644 /lib/systemd/system/dreamhub*.service /etc/avahi/services/dreamhub.service; chmod -R go-w /usr/lib/enigma2/python/Plugins/Extensions/DreamHub(or just install the next version). - "DreamHub is not reachable" when opening the box by a plain host name (
http://dm920:8765): the Host check refused every name without a dot except*.local. Names without a dot are accepted now (a foreign domain can never be one, so DNS-rebinding protection is unchanged). - The TV plugin's QR code pointed to
127.0.0.1: it now encodes the box's LAN address with the same port. - The toggle in the feed list now follows the reading direction (right-to-left languages).
- The mDNS advertisement goes back to port 8765 when the port override in
/etc/default/dreamhubis removed.
Changed
- The "not reachable" screen shows the technical reason (address, HTTP status and error code) in small type.
- Log lines: refused requests (421, 403) log at WARN with host, remote address, user agent and origin; every request line carries
hostandremote; the start-up line lists the host name and the box's addresses; the duplicatetimefield is gone (journald stamps every line).
DreamHub 0.9.1
Breaking
- DreamHub's port is now 8765 (was 8080). On a DM900/DM920 port 8080 is held by DreamOS's stream server (HLS output; systemd owns the socket), so DreamHub could not start there. Open
http://<box>:8765(the<box>.localname follows by itself); update bookmarks, the home-screen app, an HTTPS reverse proxy's target and any API client. Change it withDREAMHUB_LISTEN_ADDR=:<port>in/etc/default/dreamhubor in the TV plugin's settings.
Changed
- Installing the package never restarts enigma2 any more: when the TV plugin changed, the installation says it loads at the next enigma2 restart. (It used to restart enigma2 when nothing was recording — it cannot know whether someone is watching.)
- The TV plugin's Backend port setting really changes the port: after a confirmation it writes
/etc/default/dreamhuband the mDNS advertisement and restarts DreamHub. The port is no longer a second, separate setting inside enigma2. - The service reads the optional
/etc/default/dreamhub. The installation says so when the service did not start. - Started by hand on a box (where
/etc/enigma2exists), DreamHub uses the real box (live), not the demo data (mock) — unlessDREAMHUB_MODEsays otherwise. - UX review before testers: with one box there is no Settings → Boxes tab any more — General ends with an "Another box" card that leads to it, and the tab stays once a second box exists. The developer block under Access (token API,
box=<id>) is collapsed and, with one box, leaves outbox=. - A Basic box's deep link (
/b/<id>/apps) says "needs DreamHub on the box itself" with a link to Settings → Boxes instead of "That didn't work"; its Device page no longer shows DreamHub's own change log as if it were the box's. - "Needs attention" only counts real trouble: an integration that was never set up (TMDB, Plex, AI) and pages a Basic box doesn't have are not counted and not repeated per page. The film-database hint appears once, on the dashboard, with a link to the setting; a page that cannot work without a connector that isn't set up still says why.
- With two or more boxes every page says which box it is about (a small coloured line above the page), and the dashboard's strip of other boxes is labelled.
- Connecting a box to the DreamHub on it is worded for two machines: "this DreamHub" and "DreamHub on ", numbered steps, Get a code / Connect / Disconnect instead of "DreamHub" three times. On a box with one box only, the way to get a code is the "Another box" card in General.
- Names: Device is now Box admin (the page that administers the box), "this device" means the browser or "your phone or computer"; the Apps tabs are System software / Extensions / Apps, and the Extensions tab says where an extension is installed.
- Settings → Docker: Address for the Open links — an app's Open link goes to
http://<address>:<port>; the address is the one DreamHub was opened with unless set (behind an HTTPS reverse proxy the proxy's address is wrong, the apps' ports are on the box).
Fixed
- A taken port stops DreamHub before anything else starts, with a message saying what to do. It used to start the database and the background jobs first and log
sql: database is closedas they were torn down. - The apps' port check names port 8080 as the stream server's and keeps it reserved, next to 8765.
- A profile restricted to some boxes no longer receives, lists or opens the background jobs of the other boxes (not even as an admin).
- A box that restarted enigma2 could show as offline for up to two minutes: the poller's back-off now stops at one minute (was five).
- A box address with a login (
http://user:pw@host) keeps it: the login moves to the login fields instead of being dropped; fields filled in at the same time win. - Settings → Boxes: a second box at an address another box already has is refused (it would be polled twice and split its data), and so is a port beyond 65535; addresses are compared without the default port and in lower case.
- The guide's single-channel day view asked for exactly 24 hours, so on the day the clocks change one hour of programmes was missing; it now runs until the next morning's start.
POST /api/v1/boxesansweredcapabilities: nullwhere the list answers[].
DreamHub 0.9.0
Multi-box: DreamHub can steer several Dreamboxes. With one box nothing changes — the selector, the dashboard strip and the other new buttons only show with two or more. Box-checked on the reference box (plan "Box check", ARCHITECTURE.md); not tried because only one box exists: a second real box, and starting a recording's playback on another box's TV.
Fixed
- Updating DreamHub stopped the extensions (they are bound to its service) and left them stopped — the eWeLink plug went missing until a manual start. The package now starts the enabled extensions again after restarting DreamHub.
- Device on a box without DreamHub on it (Basic) asked for the administration (log level, crash logs) on a fresh page load before it knew the box's tier, and logged two 409s.
Changed
- Multi-box groundwork, M1 (
docs/MULTIDEVICE_PLAN.md; nothing to see, nothing new for a household with one box): DreamHub now keeps a registry of boxes, and every request is about one of them — the optionalbox=<id>query parameter, the first box when omitted, so existing clients, API tokens and extensions keep working unchanged. Per box: the web-control, SerienRecorder and AutoTimer connections, the connector and hub-status checks, the recording index, the channel snapshot and its backups, AdScan marks and logos, timer owners, the event poller (with back-off while a box does not answer) and the background jobs (a recording on one box no longer holds back another's queue). A plan is applied to the box it was made for. Files, services and packages of the machine DreamHub runs on are offered for that box only. - Multi-box groundwork, M2 (capabilities per box; still nothing to see with one box): what a box can do is now measured per box — plugins from that box's own checks, machine-level features (recordings in place, packages, services, logs, terminal, Docker, extensions) only for the box DreamHub runs on. The navigation answer carries that list (
box: id,full,capabilities); AppsHub is left out of the navigation of any other box, device checks such asjournalctlno longer count against a box that is another machine, and Device → Administration/Advanced tabs are hidden there. - Multi-box, M3 (the box selector — only visible with two or more boxes): Settings → Boxes (admins) adds a further box by address and the login of its web interface — a Test button names the device that answers and tells a wrong login from no answer — edits it, or removes it after a preview (DreamHub forgets everything it saved for that box; the box is untouched). A box shows in the top bar's selector (name plus colour, greyed with "offline" when it doesn't answer; if the selected one stops answering, the status line says so). The box is part of the address (
/b/<id>/guide, bookmarks and the app work); the last choice is remembered per device, and switching loads the page again so nothing of the previous box stays behind. The dashboard gets a slim strip with one line per other box (what it shows, standby, offline, recording ●) — a tap switches. Profiles get a "Boxes this profile may use" list (none ticked = all); a profile cannot reach a box it may not use through the API either (403 box_forbidden, and a request withoutboxmeans its first allowed box). New:GET /api/v1/boxes,GET /api/v1/boxes/overview,POST /api/v1/boxes[/test],PATCH /api/v1/boxes/{id},POST /api/v1/boxes/{id}/remove/plan. A box added this way is Basic (web interface only): see the plan for what that covers. - Multi-box, M3a (API for developers):
GET /api/v1/openapi.jsondescribes the REST API (OpenAPI 3) — theboxparameter defined once, the plan → apply pattern, and request/response shapes for the most useful calls; Settings → Access → API tokens links it with a curl example, and the user guide has a new section "API and tokens".GET /api/v1/boxesnow carries each box's capabilities. A test fails when a route is missing from the document (or the document names one that is gone) and checks that every operation either takesboxand refuses an unknown one, or is marked global. - Multi-box, M4 (test fixtures): every further box in mock mode (and in the demo) is now a second mock box — "wohnzimmer", two tuners, its own timers (no conflict with two tuners), recordings, favourites, guide and live channel — so a box switch visibly changes the content. Fixed: Device on a box without DreamHub on it (Basic) loaded the administration anyway and logged a 409.
- Multi-box, M5 (streams and notifications per box): live TV and recordings of another box already pass through DreamHub (the box's login never reaches the browser); the limit of two simultaneous live streams is now per box, so a second box can stream while the first is at its limit. Notifications name the box once there are several boxes — in the bell, in the live feed and in the push text ("Recording finished: Terra X · Wohnzimmer") — and a profile only gets events of the boxes it may use. The bell has an Only this box switch (per device) with two or more boxes. Fixed: the bell asked a box without DreamHub on it for app/package updates (409).
- Multi-box, M6 (pairing to the DreamHub on a box): a box that runs DreamHub itself can be paired. On that box, Settings → Boxes → "Pair this box with another DreamHub" shows a one-time eight-digit code (also on its TV, when device writes are on; valid ten minutes, once, ended by five wrong tries); in the hub, Settings → Boxes → Edit → "DreamHub on this box" takes the code. The result is an ordinary API token on the box (named "Hub: …", revocable under Settings → Access), kept by the hub. A version handshake (
GET /api/v1/peer/info, public) says which end is too old instead of failing oddly; a revoked token or a box that is off is shown as such. A paired box's own capabilities join its list inGET /api/v1/boxes. New:POST /api/v1/boxes/{id}/pair,DELETE …/pair,POST /api/v1/peer/code,GET /api/v1/peer/capabilities,POST /api/v1/peer/pair.StreamBaseis now per box: playing a Plex film on a paired box fetches it from the hub's address as seen from that box (found automatically, or set under Advanced); a Basic box still can't play films (no DreamHub player there). Pairing does not yet let the hub manage that box's recordings or system — that follows. - Multi-box, M9 (switching a box on): a box can get a power-on method under Settings → Boxes → Edit — Wake-on-LAN (its MAC address; the magic packet is broadcast on the local network) or an extension's action (e.g. the smart plug the box hangs on). A box that does not answer then shows a Switch on button, in the status line (selected box) and in the dashboard's strip (the others); only with two or more boxes, only for profiles with the remote that may use the box. Wake-on-LAN goes out at once; an extension's action is a plan first, showing the extension's own sentence, because a socket's action may toggle. After switching on, the poller of that box looks every ten seconds for three minutes instead of backing off, and the app refreshes until the box answers. New:
POST /api/v1/boxes/{id}/wake({"sent": true}or{"plan": …}),wake/wakeMethod/wakeMac/wakeExt/wakeActioninGET/PATCH /api/v1/boxes(the details for administrators only); migration 17. - Multi-box, M7 (a recording of one box on another box's screen): when a recording is open, Play on (only with two or more boxes) starts it in the movie player of another box that runs DreamHub — the box DreamHub is installed on, or a paired one — while it is on. DreamHub streams it from the box the recording is on (in place, or through that box's web interface — that box can be Basic), seeking works. The target fetches it without a login from an address that only works with a one-time ticket and only from that box's own address. New:
POST /api/v1/stream/recording/play-on?box=<source>(target,path,title; needs the remote and a target box the profile may use). - The database gets its multi-box migrations (multi-box, the profiles' box lists, pairing, the power-on method); before one runs, the old database is copied to
dreamhub.db.pre-migration-<version>next to it.
DreamHub 0.8.0
Added
- Logs for extensions: the Services list in Device → Administration now includes the Docker services and extensions (eWeLink), each with its Logs button; an extension's refusal text is part of DreamHub's own log line when an apply fails (it only said "unexpected status 502" before).
- Extensions can show things on the start page: a widget flagged
tileappears in a new Extensions tile, under the extension's name — each extension decides what (or nothing); with nothing flagged the tile is not shown (schema 3,docs/BUILDING_EXTENSIONS.md). Settings forms can show a sentence (info) and an address to open (link). - eWeLink extension 0.3.0: gets the device keys from the owner's own eWeLink developer application (log in once, paste the address you land on — no key hunting), and with that login shows the plug's power, today's and this month's consumption (the plug announces them on the LAN; the cloud history is only a fallback), on its card and on the start page. Needs DreamHub 0.8.0. Switching goes through the cloud when the plug refuses the LAN command (the S60TPF does, always); the plug's LAN values are scaled (hundredths).