Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Loading playlist improvements #7127

Open
wants to merge 9 commits into
base: master
Choose a base branch
from
15 changes: 10 additions & 5 deletions src/playlist/playlist.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -173,6 +173,12 @@ Playlist::Playlist(PlaylistBackend* backend, TaskManager* task_manager,

settings.endGroup();

settings.beginGroup(kSettingsGroup);

grey_unfound_ = settings.value("greyoutdeleted", false).toBool();

settings.endGroup();

qLog(Debug) << "k_max_scrobble_point"
<< (max_play_count_point_nsecs_ / kNsecPerSec);
}
Expand Down Expand Up @@ -1223,6 +1229,9 @@ void Playlist::UpdateItems(const SongList& songs) {
} else {
new_item = PlaylistItemPtr(new SongPlaylistItem(song));
}
if (grey_unfound_ && !song.is_valid()) {
new_item->SetForegroundColor(kInvalidSongPriority, kInvalidSongColor);
}
items_[i] = new_item;
emit dataChanged(index(i, 0), index(i, ColumnCount - 1));
// Also update undo actions
Expand Down Expand Up @@ -1626,11 +1635,7 @@ void Playlist::ItemsLoaded(QFuture<PlaylistItemList> future) {

emit RestoreFinished();

QSettings s;
s.beginGroup(kSettingsGroup);

// should we gray out deleted songs asynchronously on startup?
if (s.value("greyoutdeleted", false).toBool()) {
if (grey_unfound_) {
QtConcurrent::run(this, &Playlist::InvalidateDeletedSongs);
}
}
Expand Down
2 changes: 2 additions & 0 deletions src/playlist/playlist.h
Original file line number Diff line number Diff line change
Expand Up @@ -471,6 +471,8 @@ class Playlist : public QAbstractListModel {

// Cancel async restore if songs are already replaced
bool cancel_restore_;

bool grey_unfound_;
};

// QDataStream& operator <<(QDataStream&, const Playlist*);
Expand Down
5 changes: 1 addition & 4 deletions src/playlistparsers/asxiniparser.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -40,10 +40,7 @@ SongList AsxIniParser::Load(QIODevice* device, const QString& playlist_path,
QString value = line.mid(equals + 1);

if (key.startsWith("ref")) {
Song song = LoadSong(value, 0, dir);
if (song.is_valid()) {
ret << song;
}
ret << LoadSong(value, 0, dir);
}
}

Expand Down
17 changes: 9 additions & 8 deletions src/playlistparsers/asxparser.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -71,10 +71,7 @@ SongList ASXParser::Load(QIODevice* device, const QString& playlist_path,
}

while (!reader.atEnd() && Utilities::ParseUntilElement(&reader, "entry")) {
Song song = ParseTrack(&reader, dir);
if (song.is_valid()) {
ret << song;
}
ret << ParseTrack(&reader, dir);
}
return ret;
}
Expand Down Expand Up @@ -111,10 +108,14 @@ Song ASXParser::ParseTrack(QXmlStreamReader* reader, const QDir& dir) const {
return_song:
Song song = LoadSong(ref, 0, dir);

// Override metadata with what was in the playlist
song.set_title(title);
song.set_artist(artist);
song.set_album(album);
// Override metadata with what was in the playlist if the song is not in the
// library.
if (!song.is_library_song()) {
song.set_title(title);
song.set_artist(artist);
song.set_album(album);
}

return song;
}

Expand Down
30 changes: 25 additions & 5 deletions src/playlistparsers/cueparser.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -227,8 +227,30 @@ SongList CueParser::Load(QIODevice* device, const QString& playlist_path,
// finalize parsing songs
for (int i = 0; i < entries.length(); i++) {
CueEntry entry = entries.at(i);
Song song;

Song song = LoadSong(entry.file, IndexToMarker(entry.index), dir);
// override song metadata with metadata from the multi-file cue if the song
// isn't found in the library
if (files == 1) {
song = LoadSong(entry.file, IndexToMarker(entry.index), dir);
} else {
song = LoadSong(entry.file, 0, dir);

if (!song.is_library_song()) {
song.set_title(entry.title);
song.set_artist(entry.PrettyArtist());
song.set_album(entry.album);
song.set_albumartist(entry.album_artist);
song.set_genre(entry.genre);
song.set_year(entry.date.toInt());
song.set_composer(entry.PrettyComposer());
song.set_disc(entry.disc.toInt());
}

ret << song;

continue;
}

// cue song has mtime equal to qMax(media_file_mtime, cue_sheet_mtime)
if (cue_mtime.isValid()) {
Expand All @@ -239,10 +261,8 @@ SongList CueParser::Load(QIODevice* device, const QString& playlist_path,
// overwrite the stuff, we may have read from the file or library, using
// the current .cue metadata

// set track number only in single-file mode
if (files == 1) {
song.set_track(i + 1);
}
// set track number
song.set_track(i + 1);

// the last TRACK for every FILE gets it's 'end' marker from the media
// file's
Expand Down
21 changes: 13 additions & 8 deletions src/playlistparsers/m3uparser.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -59,15 +59,20 @@ SongList M3UParser::Load(QIODevice* device, const QString& playlist_path,
}
} else if (!line.isEmpty()) {
Song song = LoadSong(line, 0, dir);
if (!current_metadata.title.isEmpty()) {
song.set_title(current_metadata.title);
}
if (!current_metadata.artist.isEmpty()) {
song.set_artist(current_metadata.artist);
}
if (current_metadata.length > 0) {
song.set_length_nanosec(current_metadata.length);

// Override metadata from playlist if the song is not in the library.
if (!song.is_library_song()) {
if (!current_metadata.title.isEmpty()) {
song.set_title(current_metadata.title);
}
if (!current_metadata.artist.isEmpty()) {
song.set_artist(current_metadata.artist);
}
if (current_metadata.length > 0) {
song.set_length_nanosec(current_metadata.length);
}
}

ret << song;

current_metadata = Metadata();
Expand Down
16 changes: 9 additions & 7 deletions src/playlistparsers/plsparser.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -43,19 +43,21 @@ SongList PLSParser::Load(QIODevice* device, const QString& playlist_path,
if (key.startsWith("file")) {
Song song = LoadSong(value, 0, dir);

// Use the title and length we've already loaded if any
if (!songs[n].title().isEmpty()) song.set_title(songs[n].title());
if (songs[n].length_nanosec() != -1)
song.set_length_nanosec(songs[n].length_nanosec());
// Use the title and length we've already loaded if any and only if the
// song is not in the library.
if (!song.is_library_song()) {
if (!songs[n].title().isEmpty()) song.set_title(songs[n].title());
if (songs[n].length_nanosec() != -1)
song.set_length_nanosec(songs[n].length_nanosec());
}

songs[n] = song;
} else if (key.startsWith("title")) {
songs[n].set_title(value);
if (!songs[n].is_library_song()) songs[n].set_title(value);
} else if (key.startsWith("length")) {
qint64 seconds = value.toLongLong();
if (seconds > 0) {
if ((seconds > 0) && !songs[n].is_library_song())
songs[n].set_length_nanosec(seconds * kNsecPerSec);
}
}
}

Expand Down
5 changes: 1 addition & 4 deletions src/playlistparsers/wplparser.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -55,10 +55,7 @@ void WplParser::ParseSeq(const QDir& dir, QXmlStreamReader* reader,
if (name == "media") {
QStringRef src = reader->attributes().value("src");
if (!src.isEmpty()) {
Song song = LoadSong(src.toString(), 0, dir);
if (song.is_valid()) {
songs->append(song);
}
songs->append(LoadSong(src.toString(), 0, dir));
}
} else {
Utilities::ConsumeCurrentElement(reader);
Expand Down
18 changes: 11 additions & 7 deletions src/playlistparsers/xspfparser.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -102,13 +102,17 @@ Song XSPFParser::ParseTrack(QXmlStreamReader* reader, const QDir& dir) const {
return_song:
Song song = LoadSong(location, 0, dir);

// Override metadata with what was in the playlist
song.set_title(title);
song.set_artist(artist);
song.set_album(album);
song.set_art_manual(art);
song.set_length_nanosec(nanosec);
song.set_track(track_num);
// If the song is not in the library, fill metadata with what was in the
// playlist.
if (!song.is_library_song()) {
song.set_title(title);
song.set_artist(artist);
song.set_album(album);
song.set_art_manual(art);
song.set_length_nanosec(nanosec);
song.set_track(track_num);
}

return song;
}

Expand Down