From 1a6c9018e10fdcb79fbbd33ffe0a47648e951fd9 Mon Sep 17 00:00:00 2001 From: Adrian Ulrich Date: Sun, 17 Feb 2019 15:26:21 +0100 Subject: [PATCH] keep track of absent album or artist tags and do not display covers for unknown albums. --- .../android/medialibrary/MediaLibrary.java | 2 ++ .../android/medialibrary/MediaScanner.java | 15 ++++++++++++--- .../ch/blinkenlights/android/vanilla/Song.java | 11 +++++++++++ 3 files changed, 25 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/ch/blinkenlights/android/medialibrary/MediaLibrary.java b/app/src/main/java/ch/blinkenlights/android/medialibrary/MediaLibrary.java index 2c961339..cdf9e857 100644 --- a/app/src/main/java/ch/blinkenlights/android/medialibrary/MediaLibrary.java +++ b/app/src/main/java/ch/blinkenlights/android/medialibrary/MediaLibrary.java @@ -61,6 +61,8 @@ public class MediaLibrary { public static final int ROLE_ALBUMARTIST = 2; public static final int SONG_FLAG_OUTDATED = (1 << 0); // entry in library should get rescanned. + public static final int SONG_FLAG_NO_ALBUM = (1 << 1); // file had no real album tag. + public static final int SONG_FLAG_NO_ARTIST = (1 << 2); // file had no real artist tag. public static final String PREFERENCES_FILE = "_prefs-v1.obj"; diff --git a/app/src/main/java/ch/blinkenlights/android/medialibrary/MediaScanner.java b/app/src/main/java/ch/blinkenlights/android/medialibrary/MediaScanner.java index e589fba0..3513fe50 100644 --- a/app/src/main/java/ch/blinkenlights/android/medialibrary/MediaScanner.java +++ b/app/src/main/java/ch/blinkenlights/android/medialibrary/MediaScanner.java @@ -509,18 +509,27 @@ public class MediaScanner implements Handler.Callback { if (mustInsert) { hasChanged = true; + // Clear old flags of this song: + songFlags &= ~MediaLibrary.SONG_FLAG_OUTDATED; // This file is not outdated anymore + songFlags &= ~MediaLibrary.SONG_FLAG_NO_ARTIST; // May find an artist now. + songFlags &= ~MediaLibrary.SONG_FLAG_NO_ALBUM; // May find an album now. + // Get tags which always must be set String title = tags.getFirst(MediaMetadataExtractor.TITLE); if (isUnset(title)) title = file.getName(); String album = tags.getFirst(MediaMetadataExtractor.ALBUM); - if (isUnset(album)) + if (isUnset(album)) { album = ""; + songFlags |= MediaLibrary.SONG_FLAG_NO_ALBUM; + } String artist = tags.getFirst(MediaMetadataExtractor.ARTIST); - if (isUnset(artist)) + if (isUnset(artist)) { artist = ""; + songFlags |= MediaLibrary.SONG_FLAG_NO_ARTIST; + } String discNumber = tags.getFirst(MediaMetadataExtractor.DISC_NUMBER); if (isUnset(discNumber)) @@ -546,7 +555,7 @@ public class MediaScanner implements Handler.Callback { v.put(MediaLibrary.SongColumns.PLAYCOUNT, playCount); v.put(MediaLibrary.SongColumns.SKIPCOUNT, skipCount); v.put(MediaLibrary.SongColumns.PATH, path); - v.put(MediaLibrary.SongColumns.FLAGS, (songFlags &~MediaLibrary.SONG_FLAG_OUTDATED)); + v.put(MediaLibrary.SongColumns.FLAGS, songFlags); mBackend.insert(MediaLibrary.TABLE_SONGS, null, v); v.clear(); diff --git a/app/src/main/java/ch/blinkenlights/android/vanilla/Song.java b/app/src/main/java/ch/blinkenlights/android/vanilla/Song.java index 2fb5884c..d3c718bd 100644 --- a/app/src/main/java/ch/blinkenlights/android/vanilla/Song.java +++ b/app/src/main/java/ch/blinkenlights/android/vanilla/Song.java @@ -1,5 +1,6 @@ /* * Copyright (C) 2010, 2011 Christopher Eby + * Copyright (C) 2019 Adrian Ulrich * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -63,6 +64,7 @@ public class Song implements Comparable { MediaLibrary.SongColumns.DURATION, MediaLibrary.SongColumns.SONG_NUMBER, MediaLibrary.SongColumns.DISC_NUMBER, + MediaLibrary.SongColumns.FLAGS, }; public static final String[] EMPTY_PLAYLIST_PROJECTION = { @@ -188,6 +190,15 @@ public class Song implements Comparable { duration = cursor.getLong(7); trackNumber = cursor.getInt(8); discNumber = cursor.getInt(9); + + // Read and interpret the media library flags of this entry. + // There is no 1:1 mapping, so we must check each flag on its own. + int libraryFlags = cursor.getInt(10); + if ((libraryFlags & MediaLibrary.SONG_FLAG_NO_ALBUM) != 0) { + // Note that we only set, never unset: the song may already + // have the flag set for other reasons. + flags |= FLAG_NO_COVER; + } } /**