aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/github/daneren2005/dsub/service/CachedMusicService.java132
1 files changed, 89 insertions, 43 deletions
diff --git a/src/github/daneren2005/dsub/service/CachedMusicService.java b/src/github/daneren2005/dsub/service/CachedMusicService.java
index 8521d1d5..58de141f 100644
--- a/src/github/daneren2005/dsub/service/CachedMusicService.java
+++ b/src/github/daneren2005/dsub/service/CachedMusicService.java
@@ -795,7 +795,7 @@ public class CachedMusicService implements MusicService {
public void setRating(final Entry entry, final int rating, Context context, ProgressListener progressListener) throws Exception {
musicService.setRating(entry, rating, context, progressListener);
- new GenericSongUpdater(context, entry) {
+ new GenericEntryUpdater(context, entry) {
@Override
public void updateResult(Entry result) {
result.setRating(rating);
@@ -1229,74 +1229,120 @@ public class CachedMusicService implements MusicService {
}
}
}
- private abstract class GenericSongUpdater {
+ private abstract class GenericEntryUpdater {
Context context;
- Entry entry;
+ List<Entry> entries;
- public GenericSongUpdater(Context context, Entry entry) {
+ public GenericEntryUpdater(Context context, Entry entry) {
this.context = context;
- this.entry = entry;
+ this.entries = Arrays.asList(entry);
+ }
+ public GenericEntryUpdater(Context context, List<Entry> entries) {
+ this.context = context;
+ this.entries = entries;
}
- public boolean checkResult(Entry check) {
+ public boolean checkResult(Entry entry, Entry check) {
return entry.getId().equals(check.getId());
}
public abstract void updateResult(Entry result);
public void execute() {
String cacheName, parent;
- if(Util.isTagBrowsing(context, musicService.getInstance(context))) {
- // If starring album, needs to reference artist instead
- if(entry.isDirectory()) {
- cacheName = "artist";
- parent = entry.getArtistId();
+ boolean isTagBrowsing = Util.isTagBrowsing(context, musicService.getInstance(context));
+
+ // Run through each entry, trying to update the directory it is in
+ List<Entry> songs;
+ for(final Entry entry: entries) {
+ if(isTagBrowsing) {
+ // If starring album, needs to reference artist instead
+ if(entry.isDirectory()) {
+ if(entry.isAlbum()) {
+ cacheName = "artist";
+ parent = entry.getArtistId();
+ } else {
+ cacheName = "artists";
+ parent = null;
+ }
+ } else {
+ cacheName = "album";
+ parent = entry.getAlbumId();
+ }
} else {
- cacheName = "album";
- parent = entry.getAlbumId();
+ if(entry.isDirectory() && !entry.isAlbum()) {
+ cacheName = "indexes";
+ parent = null;
+ } else {
+ cacheName = "directory";
+ parent = entry.getParent();
+ }
}
- } else {
- cacheName = "directory";
- parent = entry.getParent();
- }
- new MusicDirectoryUpdater(context, cacheName, parent) {
- @Override
- public boolean checkResult(Entry check) {
- return GenericSongUpdater.this.checkResult(check);
+ // Parent is only null when it is an artist
+ if(parent == null) {
+ new IndexesUpdater(context, cacheName) {
+ @Override
+ public boolean checkResult(Artist check) {
+ return checkResult(entry, new Entry(check));
+ }
+
+ @Override
+ public void updateResult(List<Artist> objects, Artist result) {
+ updateResult(new Entry(result));
+ }
+ }.execute();
+ } else {
+ new MusicDirectoryUpdater(context, cacheName, parent) {
+ @Override
+ public boolean checkResult(Entry check) {
+ return checkResult(entry, check);
+ }
+
+ @Override
+ public void updateResult(List<Entry> objects, Entry result) {
+ updateResult(result);
+ }
+ }.execute();
}
- @Override
- public void updateResult(List<Entry> objects, Entry result) {
- GenericSongUpdater.this.updateResult(result);
+ if(entry instanceof PodcastEpisode) {
+ PodcastEpisode episode = (PodcastEpisode) entry;
+ new MusicDirectoryUpdater(context, cacheName, "p-" + entry.getId()) {
+ @Override
+ public boolean checkResult(Entry check) {
+ return checkResult(entry, check);
+ }
+
+ @Override
+ public void updateResult(List<Entry> objects, Entry result) {
+ updateResult(result);
+ }
+ }.execute();
+ } else if(!entry.isDirectory()) {
+ songs.add(entry);
}
- }.execute();
+ }
- if(entry instanceof PodcastEpisode) {
- PodcastEpisode episode = (PodcastEpisode) entry;
- new MusicDirectoryUpdater(context, cacheName, "p-" + entry.getId()) {
+ // Only run through playlists once and check each song against it
+ if(songs.size() > 0) {
+ new PlaylistDirectoryUpdater(context) {
@Override
public boolean checkResult(Entry check) {
- return GenericSongUpdater.this.checkResult(check);
+ for(Entry entry: songs) {
+ if(checkResult(entry, check)) {
+ return true;
+ }
+ }
+
+ return false;
}
@Override
- public void updateResult(List<Entry> objects, Entry result) {
- GenericSongUpdater.this.updateResult(result);
+ public void updateResult(Entry result) {
+ GenericEntryUpdater.this.updateResult(result);
}
}.execute();
}
-
- new PlaylistDirectoryUpdater(context) {
- @Override
- public boolean checkResult(Entry check) {
- return GenericSongUpdater.this.checkResult(check);
- }
-
- @Override
- public void updateResult(Entry result) {
- GenericSongUpdater.this.updateResult(result);
- }
- }.execute();
}
}
private abstract class IndexesUpdater extends SerializeUpdater<Artist> {