When unmounting a device, the ConnectedDevice object is destroyed. The
FileSystemDevice destructor waits on its worker thread. If a scan is in
progress, this will block until completion.
There is an existing Stop method in the LibraryWatcher class that is intended to
stop long running operations. To fix, or at least significantly shorten this
hang, we'll call this before waiting for the thread to exit. Also add a
stop_requested check in the cover art scan.
In addition, add a call to Stop in the Library destructor, which has a similar
usage.
Currently, the failure to connect to an MTP device results in the UI displaying
an open device that appears empty. This change introduces a method
ConnectedDevice::ConnectAsync() that is expected to handle any connecting tasks
that could block asynchronously. Upon completion, this emits a ConnectFinished
signal that indicates success or failure. The row in the UI is only updated
after the successful response is received. Upon failure, DeviceManager will
clean up and the row in UI is left in the pre-connect state.
Currently, only the MtpDevice utilizes this mechanism. All other devices use a
default implementation that immediately reports success.
In 1.37.2, gvfs switched to URIs that remain consistent across USB device
re-enumerations. This removed the usb bus and device numbers from the URI. In
the case that these values aren't found in the URI, try to parse Unix device
name property and pass results as query params on the URL. Pay attention to
these params in MtpConnection.
See gvfs commits 3a7bb06b and efc76d0c for reference.
* Qt5::Test is not required in the global QT_LIBRARIES definition
* Qt5::DBus had already been optional, drop bogus pkgconfig search
This partially reverts commit 4321ecf7d2.
* Find X11 only once, in root CMakeLists.txt
Since we have HAVE_X11, use HAVE_X11 in cmake.
GError messages contain non-ascii characters. This normally just produces some garbage when we use the default QString contructor that assumes ASCII for logging. However, when a message includes the right double quote, UTF-8 sequence 0xE2 0x80 0x9D, the final byte is OSC. VT100 expects a command sequence to follow and stops echoing output until it sees ST or BEL character, which may never come. Thus, the console output is halted.
This change uses QString::fromLocal8Bit instead of depending on the default constructor. About half of the sites in the codebase had already been converted.
One side effect is that log messages are quoted. There are additional options to control this, but those were only introduced in Qt 5.4.
GPodLoader and MtpLoader Error signals were connected to Error signals in their repective device classes, but the actual signal definition in ConnectedDevice was removed in a refactor several years ago. This change adds LoaderError slots to these device classes and reports the error in the manner of the refactored code.
* Display podcast episode information.
Add an EpisodeInfoWidget with title, author, duration, date, and description fields. Include this in the PodcastInfoDialog. If exactly one episode is selected, then show both the podcast and episode widgets and display the episode's URL. Otherwise, hide the episode widget and follow the existing behavior. Note that the desription field for the EpisodeInfoWidget uses the QLabel and does not currently download embedded images.
Add an always_show_hours option to the PrettyTime methods to include hours in formatting even if the field is zero. This is less ambiguious in some cases where duration is displayed.
* Apply patch from automated formatter test.
* Allow ignoring prefixes when sorting playlist
This introduces new configuration options which allow you to ignore
prefixes while sorting the playlist on album, artist and titles.
Prefixes are configurable, default are "a" and "the".
* Change QStringLiteral to QString for compatbility with Qt 4.8
This introduces new configuration options which allow you to ignore
prefixes while sorting the playlist on album, artist and titles.
Prefixes are configurable, default are "a" and "the".
- Disabling playlist row glow by default
- Track slider popup visible by default, add hide()
to ensure not visible by default (no more repaints)
- Set kTrackSliderUpdateTimeMs to 500. IMO 40 is too low
This should partially fix issue #1079
When switching between tracks with different sample rates, the probe queue blocks before the pipeline can emit EOS.
This prevents the track change from proceeding without manual intervention. This appears to be because the queue
element doesn't handle the rate change correctly (either due to buffer length, or cap negotiation).
The queue2 element however does handle this without blocking indefinitely.
Current VGM format implementation in GStreamer (gstgme) only supports Sega Geneses (Mega Drive) and Sega Master System emulation.
GStreamer also cannot handle the VGZ format (a shorthand for vgm.gz, a gzipped archive that contains a song) which means
that users will currently have to extract the contents of their VGZ files to individual vgm files.
Let's the user see the error message what failed instead of Clementine crashing.
Also don't do gst_object_unref unless bin is set.
This fixes GStreamer-CRITICAL gst_object_unref: assertion 'object != NULL' failed
* Add option to verify subsonic server certificate.
Defaults to true, as it is safer to have a server certificate verified,
even more so, if the server is used over an insecure WAN link.
During subsonic configuration the checkbox can be deactivated, so that
no certificate verification will occur when talking to a subsonic
server, allowing for self-signed certificates.
With the proliferation of let's encrypt certificates there's probably
less need for this option but it has been requested and hard-coding
verify-off is IMHO bad security practice.
If a valid certificate has been installed, the configuration file can be
modified manually and after a restart Clementine will perform a proper
server certificate verification.
The patch might need some UI polishing and asks for string translations
but is operational so far.
* Satisfy CLang format checker.
* Use QSettings' default value support.
* Consistently use QSettings' default value method.
Qt's QUrl parser does no longer accept pure numeric hostnames without
trying to make a dotted IPv4 address of them.
Thus current method of storing subsonic's numeric ids in the host part
of a QUrl ("subsonic://<id>") does no longer work.
Instead a query is constructed omitting the host-part entirely and using
"subsonic://?id=<id>" to store and retrieve subsonic titles.
`column_widths_` is managed elsewhere. Resetting it on model change
makes tab-switching slow, and---if a vertical scroll bar becomes visible
or hidden---can be triggered in unexpected situations, leading to
visible column information loss.
Signed-off-by: Antonio Russo <antonio.e.russo@gmail.com>
Any access, read or write, via QSettings requires locking
`Clementine.conf`. On some devices, this can be slow. Moreover, it also
increases power use and wear on devices such as SSDs.
To improve the situation, defer QSettings updates until program close
for window resize, current playlist tab, and playlist geometry, i.e.
`PlaylistView::SaveGeometry`.
Also, limit `PlaylistView::LoadGeometry` to once per program run.
Signed-off-by: Antonio Russo <antonio.e.russo@gmail.com>
There's no difference between close() and hide() if WA_DeleteOnClose is not set, so if we're going to hide the window we might as well accept the event.
Ignoring the event may interrupt shutdowns since it signals that the application doesn't want to close the window, at least this happens on Plasma 5.11 when Clementine is not minimized to tray.
The previous fix introduces a regression on some platforms
which did not generate a leaveEvent with the TrackSliderPopup
was displayed. Logic is introduced to identify bonafide mouse
motion out of the TrackSliderSlider.
There was an issue where the song items were only being shown
from a fresh start up but not when the playlist was created. This fixes
that issue and refactors the AddPlaylist code
This allows power users who keep 100s of playlists to easily
find a playlist either by directory name, playlist name or by
searching for a song artist/title a playlist might contain
* Replace Nokia sidebar widget with QTabWidget
The old sidebar widget was written by Nokia 10 years ago
and was a hand made hardcoded mess of widgets trying to
emulate a QTabWidget.
This commit completely replaces it with a widget of the
same name (FancyTabWidget) but is a much simpler subclass
of the standard QTabWidget allowing for a 50% code reduction.
There is still some manual draw code copied over to get the
exact same look of the previous widget but this is not strictly
necessary and can be later refactored with simpler drawControl
code based on styling preferences.
Benefits:
- 50% code reduction
- Easier to understand standard QTabWidget mechanics
- Built-in support for re-arranging and closing tabs
* Save and restore sidebar tab order
Allow the user to rearrange the tab order by dragging
tabs to a new location. Tab order is saved on exit and restored
on start
* Fix some code formatting issues
When the playlist doubleclick behavior is set to add songs to the queue,
the playback of the queue also starts if no song is currently
playing. To play the queue from the current playlist, we must set the
active playlist to the current one before starting the playback.
Fixes#5714.
When the network connection changes while playing an HTTP stream, I always get the "Server does not support seeking." error from GStreamer.
It seems like GStreamer tries to seek on reconnect, which fails, an propagates the error to Clementine which in turn ceases playback with
the error message handed through from GStreamer, even though there is now a perfectly fine network connection again.
As a workaround, try to reload the stream when this error occurs.
fixes#5116
https://en.wikipedia.org/wiki/Hip_hop Though inconsistent, this never uses "HipHop". While that could be perceived as the name of the equalizer, "Hip Hop" is at least consistent with the other EQs.
* Closes#5567: Contextual album/artist search in library search, global search, and playlists.
* Change artist/album search to 'search for this' in globalsearch
* Change artist/album search to 'search for this' in library
* Applying patch from @Fat-Zer to allow search incl year
* Re-adding missing schema definition
The outmost QWidget had vsizetype="Fixed", changed that to "Preferred" made the
preview window take up a small amount of resize. This made it possible to resize
the window a little at least.
* bring in playlist updates for potential fix
* define signal to handle organise playlist bugs
* work in progress
* fix wrong signal/slot
* next push forward on handling new song creation
* Reorganize signals/slots; still need to figure out why not all signals are being handled
* Get playlists to work when they're in memory
* more changes to playlist updates
* revert unnecessary changes and finalize fix
* Continuation of "Seek instead of navigation with arrow keys" #5550, now allows up arrow key to not restart the song over when the library is in focus. Works as usuhal when playlist is in focus (song gets started over).
* Update playlistview.cpp
Added in the part that is responsible for seeking properly.
This fixes a bug when clementine uses an icon from the system, even though it exists in it the *data* folder.
For example: the icons at the top of *playlistlistview.ui*, and at the top of *fileview.ui*
* Fix delete functionality. Skips to next song if deleted song is also currently playing.
* Added in a bool to determine if the song being deleted is meant to be deleted from the disk or just from the playlist. Took advantage of the unused variable located in removeRows to distinguish between the two options. No longer adds delete from disk to the undo stack, and deleting from the playlist goes to undo stack as it should.
* Added in a bool to determine if the song being deleted is meant to be deleted from the disk or just from the playlist. Took advantage of the unused variable located in removeRows to distinguish between the two options. No longer adds delete from disk to the undo stack, and deleting from the playlist goes to undo stack as it should.
* Update mainwindow.cpp
* Formatting Changes
* Update playlist.cpp
Simplified condition statement.
* Added in a missed boolean for RemoveSelected
* Update playlistview.cpp
* Changing ClearSearchResults order.
If search_ is null, there is no point in clearing it.
* Update to fix 12 (Crash when searching under Internet tab with Spotify)
* Formatting Fixes
* Fix 'RGB parameters out of range' with psychedelic colors
* Fix 'edit-find' icon name
* BlockAnalyzer::drawBackground(): do not attempt to paint on a null background
* Use qBound()
* nocover icon was previously loaded and used with the default size
(24x24), causing the list item without a cover in the QListWidget to be
shorter in height with respect to the others. Now the icon is
initialized to 120x120, which is the default size of the list elements.
* Added some padding between "Fetch Missing Cover" and "Export
Covers" buttons.