SolidExtras will still be used for the Qt5 version for the time being.
This refactoring makes it trivial to rip out SolidExtras once the jump
to Qt6-only will be made.
Stop spamming the DBus with positionChanged signals if playback is
progressing at the nominal playback rate. This brings the
implementation in line with the MPRIS2 player spec. The previous
implementation was causing android battery drain issues with KDEConnect
constantly updating the position (and player details) on the notification
widget.
This implementation will still send the current playback position every
10 seconds to ensure that clients that don't implement the standard
properly or did not receive previous messages, will still get regularly
updated.
This also fixes correct signaling of playback rate changes over DBus.
Make seek times adjustable. Expose seek time under Playback Settings.
Set min time allowed in seconds to 1 and max time in seconds to 300.
FEATURE: 468686
Up to now, RadioButton and CheckButton were added to Menus explicitly
because MenuItem would not use the correct delegate (i.e. CheckButton
instead of RadioButton for a selection group). Since this has been
fixed in qqc2-desktop-style, we can use the proper component again.
If an empty URL was entered (i.e. only whitespace) then that would be
accepted and added to the database as temporary entry to be loaded and
checked later. However, sqlite will convert this to a NULL entry. This
would lead to Kasts not being able to retrieve that feed from the DB,
and hence not being able to create a proper object. This would then
lead to a nullptr dereference down the line.
Note that this is a corner case: other invalid URLs are spotted
correctly and do not cause the application to crash.
BUG: 467394
Before the introduction of streaming, the "status" would be removed when
an episode was downloaded or marked as played, which made sense. With
the introduction of streaming it makes sense to also remove the "new"
status when (streaming) playback starts. At that point in time the
episode should indeed no longer considered to be "new".
Using WAL mode avoids having to lock the database for certain
transactions. Therefore, deadlocks between read/writes from different
threads should not happen anymore. These were rare, but happened
sometimes on slower hardware or slow storage devices.
BUG: 465110
Flatpaks have a problem with FolderDialog from labs: it never returns a
path. Therefore Kasts was - up to now - using FileDialog from QtQuick1.
However, this was causing problems on Android and Windows. Now we only
use QtQuick1 FileDialog for flatpak and FolderDialog everywhere else.
CCBUG: 458331
libVLC has a hardcoded maximum number of redirects. Several podcasts
need more than this number. Therefore we resolve the final url through
QNetworkReply and send the final url to the audio player.
Otherwise it'll become a so-called automagic dependency with no control
over including support for it or not, other than having it installed on
the system or not.
For LIBVLC CMAKE_DISABLE_FIND_PACKAGE can be used, but for
pkg_check_modules no such things exits and we need an explicit option.
New scalable header bar design which should scale nicely with height
and width changes by collapsing several elements (putting them into
popups and overflow menus). The height scaling of the header is
similar to Elisa, where it will use the regular background color when
fully collapsed.
Titles are clickable and will open the relevant pages. Images are also
clickable and that will open a fullscreen view.
This new design also exposes volume controls both for desktop and mobile
layout.
BUG: 457846
CCBUG: 458331
AudioManager was reporting no connectivity in case the networkstatus was
reported as being "Unknown". We might as well attempt to stream in that
case. If there is no connectivity, it will fail anyway with another
useful error message.
KMediaSession is an audio player library that has an API which is close
to QMediaPlayer and which allows to use --- and dynamically switch
between --- different audio backends. At this moment there is
implementation for libVLC, gstreamer and QtMultimedia. Only QtMultimedia
is a hard dependency in order to at least have one functional backend on
all platforms; all other dependencies are optional.
KMediaSession has out-of-the-box, built-in MPRIS2 support, sleep inhibit,
and basic metadata support.
BUG: 462358
Closes#35
This disables the subscribe button once a feed has been added, i.e. when
the button has been clicked.
Additionally, when clicking on an already subscribed feed on the
discover page will now open the full details including the episode list.
BUG: 458560
This implements support for streaming episodes rather than downloading them
first.
This introduces a new setting: prioritizeStreaming. If it's set to false
(default) then a streaming play button is only added to the EntryPage. If
it is set to true, then the streaming play button will also appear on the
Entry delegates instead of the download button.
There is a separate setting to decide if streaming is also allowed on
metered connections.
FEATURE: 438864
This attempts to fix the issue described here: https://invent.kde.org/plasma-mobile/kasts/-/issues/20
There seemed to be a loop that occurs when setting an img width which causes the view to re-render which causes the window to grow which goes back to setting an img width causing an loop that keeps growing the img width and eventually crashing.
There are a few ways to fix this but I believe not setting a width on an img without a width both fixes it and behaves as expected (see context section). I'm not sure if this is a solution Kasts wants to go with but at the very least it adds more details to the issue.
## Reproducing
The gist of that issue is that a crash occurs when you visit https://feed.zugfunk-podcast.de/podcastrss.xml, episode 53 and this is reproducible.
I was able to get to the bottom of why that particular podcast episode crashes and can be reproduced with the following content
```html
<table style=\"width:30rem;\"><tbody><tr><td style=\"width:14rem;\">Some Text On Left </td><td><img src=\"https://invent.kde.org/plasma-mobile/kasts/-/raw/master/icons/128-apps-kasts.png\"></td></tr></tbody></table>
```
*(can repro by setting this string as a QStringLiteral in Entry.cpp, line 64 when the content is first set and then clicking on any episode)
## Context
The problem seems to be with `<img`s that don't have a width set. In those cases the code tries to set the image to the width of the component. The problem with this seems to be that this assumes that these images are on their own horizontal line and that they should take the whole width. So to repro (see content I used to repro above as an example):
* put an image tag next to some element that takes some width (like a table where there's a left column with some text and a right column in the right)
* img tag without a width
What ends up happening is that the `img width` gets updated to the size of the component width but because there's another element to the left of it, it will mean that the resulting view is bigger than the component width which causes `onWidthChanged`(`EntryPage.qml::88`) to be triggered and the `adjustedContent` function to be called again where this whole process happens again (img width is updated to component width -> rendered but it's larger than width -> causing onWidthChanged -> adjustedContent runs again -> rinse/repeat).
There are other ways to try to solve this but the three I looked at are:
1. After `adjustedContent` is run, it should update the actual `m_content` so that the following runs can work off the last text update (this will mean that the problematic `else` wouldn't be run constantly).
* You can do this by setting the content at the end of the function (`setContent(ret);`)
2. Checking for some reasonable width limit (if width > 10000 then width = 10000)
3. Not resizing an image without a width because we're not sure about the intention of the author
* in this case these were small icons for social media that shouldn't be scaled up
* I think we shouldn't scale any images because of the same reason but the PR is conservative and just stops it in the case of a img without a width
For the PR I went with # 3 because the others led to the icons being scaled but it messed up the look of the page.
Closes#20
This commit adds a bunch of API extensions (public and private) to the
entry, enclosure, etc classes to allow runtime updates of internal data.
Additionally, the feed update routine has been adapted to find updates
in entries, enclosures, etc and pass them on to the relevant objects.
All of this functionality is put behind a new toggle exposed in the
settings (default is on). This is useful since a full update takes
quite a bit longer on underpowered hardware, so users should be able to
switch off this potentially non-essential overhead.
BUG: 446158
This contains the following changes:
- Use separate db connections for feed updates (required for
multithreading.
- Add ThreadWeaver dependency.
- Port update job from KJob to ThreadWeaver::Job
- This should also solve the bug where the update process would hang
on the "processEvents" call, which was intended to keep the UI
responsive during updates.
BUG: 452585