fix artist fragment and implement basic audio playback
This commit is contained in:
parent
e876a57d01
commit
6711c6202c
6 changed files with 55 additions and 20 deletions
|
|
@ -18,6 +18,7 @@ public class ArtistImage {
|
||||||
}
|
}
|
||||||
|
|
||||||
public String toIdString() {
|
public String toIdString() {
|
||||||
|
if (artistName == null) return "";
|
||||||
StringBuilder id = new StringBuilder(artistName);
|
StringBuilder id = new StringBuilder(artistName);
|
||||||
for (AlbumCover albumCover: albumCovers) {
|
for (AlbumCover albumCover: albumCovers) {
|
||||||
id.append(albumCover.getYear()).append(albumCover.getFilePath());
|
id.append(albumCover.getYear()).append(albumCover.getFilePath());
|
||||||
|
|
|
||||||
|
|
@ -14,14 +14,24 @@ import java.util.List;
|
||||||
public class Artist implements Parcelable {
|
public class Artist implements Parcelable {
|
||||||
public static final String UNKNOWN_ARTIST_DISPLAY_NAME = "Unknown Artist";
|
public static final String UNKNOWN_ARTIST_DISPLAY_NAME = "Unknown Artist";
|
||||||
|
|
||||||
public final List<Album> albums;
|
public List<Album> albums;
|
||||||
|
public List<String> genres;
|
||||||
|
|
||||||
public String id;
|
public String id;
|
||||||
|
public String name;
|
||||||
|
public long duration;
|
||||||
|
public int albumCount;
|
||||||
|
public int songCount;
|
||||||
|
|
||||||
public Artist(BaseItemDto itemDto) {
|
public Artist(BaseItemDto itemDto) {
|
||||||
this.id = itemDto.getId();
|
this.id = itemDto.getId();
|
||||||
|
this.name = itemDto.getName();
|
||||||
|
this.duration = itemDto.getRunTimeTicks() / 10000;
|
||||||
|
this.albumCount = itemDto.getAlbumCount() != null ? itemDto.getAlbumCount() : 0;
|
||||||
|
this.songCount = itemDto.getSongCount() != null ? itemDto.getSongCount() : 0;
|
||||||
|
|
||||||
this.albums = new ArrayList<>();
|
this.albums = new ArrayList<>();
|
||||||
|
this.genres = itemDto.getGenres();
|
||||||
}
|
}
|
||||||
|
|
||||||
public Artist() {
|
public Artist() {
|
||||||
|
|
@ -29,14 +39,10 @@ public class Artist implements Parcelable {
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getId() {
|
public String getId() {
|
||||||
return id != null ? id : "";
|
return id;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getName() {
|
public String getName() {
|
||||||
String name = safeGetFirstAlbum().getArtistName();
|
|
||||||
if (MusicUtil.isArtistNameUnknown(name)) {
|
|
||||||
return UNKNOWN_ARTIST_DISPLAY_NAME;
|
|
||||||
}
|
|
||||||
return name;
|
return name;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -60,24 +66,18 @@ public class Artist implements Parcelable {
|
||||||
return songs;
|
return songs;
|
||||||
}
|
}
|
||||||
|
|
||||||
@NonNull
|
|
||||||
public Album safeGetFirstAlbum() {
|
|
||||||
return albums.isEmpty() ? new Album() : albums.get(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean equals(Object o) {
|
public boolean equals(Object o) {
|
||||||
if (this == o) return true;
|
if (this == o) return true;
|
||||||
if (o == null || getClass() != o.getClass()) return false;
|
if (o == null || getClass() != o.getClass()) return false;
|
||||||
|
|
||||||
Artist artist = (Artist) o;
|
Artist artist = (Artist) o;
|
||||||
|
return id.equals(artist.getId());
|
||||||
return albums != null ? albums.equals(artist.albums) : artist.albums == null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int hashCode() {
|
public int hashCode() {
|
||||||
return albums != null ? albums.hashCode() : 0;
|
return id.hashCode();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
||||||
|
|
@ -25,7 +25,7 @@ public class Song implements Parcelable {
|
||||||
this.title = itemDto.getName();
|
this.title = itemDto.getName();
|
||||||
this.trackNumber = itemDto.getIndexNumber();
|
this.trackNumber = itemDto.getIndexNumber();
|
||||||
this.year = itemDto.getProductionYear();
|
this.year = itemDto.getProductionYear();
|
||||||
this.duration = itemDto.getRunTimeTicks();
|
this.duration = itemDto.getRunTimeTicks() / 10000;
|
||||||
this.data = "";
|
this.data = "";
|
||||||
this.dateModified = 2;
|
this.dateModified = 2;
|
||||||
this.albumId = itemDto.getAlbumId();
|
this.albumId = itemDto.getAlbumId();
|
||||||
|
|
|
||||||
|
|
@ -115,7 +115,14 @@ public class ArtistDetailActivity extends AbsSlidingMusicPanelActivity implement
|
||||||
QueryUtil.getArtist(getIntent().getExtras().getString(EXTRA_ARTIST_ID), new MediaCallback() {
|
QueryUtil.getArtist(getIntent().getExtras().getString(EXTRA_ARTIST_ID), new MediaCallback() {
|
||||||
@Override
|
@Override
|
||||||
public void onLoadMedia(List<?> media) {
|
public void onLoadMedia(List<?> media) {
|
||||||
setArtist((Artist) media.get(0));
|
Artist artist = (Artist) media.get(0);
|
||||||
|
QueryUtil.getAlbums(artist.id, new MediaCallback() {
|
||||||
|
@Override
|
||||||
|
public void onLoadMedia(List<?> media) {
|
||||||
|
artist.albums = (List<Album>) media;
|
||||||
|
setArtist(artist);
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -18,6 +18,7 @@ import android.text.TextUtils;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import android.widget.Toast;
|
import android.widget.Toast;
|
||||||
|
|
||||||
|
import com.kabouzeid.gramophone.App;
|
||||||
import com.kabouzeid.gramophone.R;
|
import com.kabouzeid.gramophone.R;
|
||||||
import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
|
import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
|
||||||
import com.kabouzeid.gramophone.loader.PlaylistLoader;
|
import com.kabouzeid.gramophone.loader.PlaylistLoader;
|
||||||
|
|
@ -28,6 +29,8 @@ import com.kabouzeid.gramophone.model.Genre;
|
||||||
import com.kabouzeid.gramophone.model.Playlist;
|
import com.kabouzeid.gramophone.model.Playlist;
|
||||||
import com.kabouzeid.gramophone.model.Song;
|
import com.kabouzeid.gramophone.model.Song;
|
||||||
|
|
||||||
|
import org.jellyfin.apiclient.interaction.ApiClient;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
@ -38,7 +41,7 @@ import java.util.Locale;
|
||||||
*/
|
*/
|
||||||
public class MusicUtil {
|
public class MusicUtil {
|
||||||
public static Uri getSongFileUri(Song song) {
|
public static Uri getSongFileUri(Song song) {
|
||||||
return Uri.parse(song.data);
|
return Uri.parse(App.getApiClient().getApiUrl() + "/Audio/" + song.id + "/stream?static=true");
|
||||||
}
|
}
|
||||||
|
|
||||||
@NonNull
|
@NonNull
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,7 @@ import com.kabouzeid.gramophone.model.Song;
|
||||||
|
|
||||||
import org.jellyfin.apiclient.interaction.Response;
|
import org.jellyfin.apiclient.interaction.Response;
|
||||||
import org.jellyfin.apiclient.model.dto.BaseItemDto;
|
import org.jellyfin.apiclient.model.dto.BaseItemDto;
|
||||||
|
import org.jellyfin.apiclient.model.querying.ArtistsQuery;
|
||||||
import org.jellyfin.apiclient.model.querying.ItemQuery;
|
import org.jellyfin.apiclient.model.querying.ItemQuery;
|
||||||
import org.jellyfin.apiclient.model.querying.ItemsResult;
|
import org.jellyfin.apiclient.model.querying.ItemsResult;
|
||||||
|
|
||||||
|
|
@ -55,6 +56,30 @@ public class QueryUtil {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void getAlbums(String id, MediaCallback callback) {
|
||||||
|
ItemQuery query = new ItemQuery();
|
||||||
|
query.setIncludeItemTypes(new String[]{"MusicAlbum"});
|
||||||
|
query.setUserId(App.getApiClient().getCurrentUserId());
|
||||||
|
query.setArtistIds(new String[]{id});
|
||||||
|
query.setRecursive(true);
|
||||||
|
App.getApiClient().GetItemsAsync(query, new Response<ItemsResult>() {
|
||||||
|
@Override
|
||||||
|
public void onResponse(ItemsResult result) {
|
||||||
|
List<Album> albums = new ArrayList<>();
|
||||||
|
for (BaseItemDto itemDto : result.getItems()) {
|
||||||
|
albums.add(new Album(itemDto));
|
||||||
|
}
|
||||||
|
|
||||||
|
callback.onLoadMedia(albums);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onError(Exception exception) {
|
||||||
|
exception.printStackTrace();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
public static void getSongs(String album, MediaCallback callback) {
|
public static void getSongs(String album, MediaCallback callback) {
|
||||||
ItemQuery query = new ItemQuery();
|
ItemQuery query = new ItemQuery();
|
||||||
query.setIncludeItemTypes(new String[]{"Audio"});
|
query.setIncludeItemTypes(new String[]{"Audio"});
|
||||||
|
|
@ -80,12 +105,11 @@ public class QueryUtil {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void getArtists(MediaCallback callback) {
|
public static void getArtists(MediaCallback callback) {
|
||||||
ItemQuery query = new ItemQuery();
|
ArtistsQuery query = new ArtistsQuery();
|
||||||
query.setIncludeItemTypes(new String[]{"MusicArtist"});
|
|
||||||
query.setUserId(App.getApiClient().getCurrentUserId());
|
query.setUserId(App.getApiClient().getCurrentUserId());
|
||||||
query.setLimit(10);
|
query.setLimit(10);
|
||||||
query.setRecursive(true);
|
query.setRecursive(true);
|
||||||
App.getApiClient().GetItemsAsync(query, new Response<ItemsResult>() {
|
App.getApiClient().GetAlbumArtistsAsync(query, new Response<ItemsResult>() {
|
||||||
@Override
|
@Override
|
||||||
public void onResponse(ItemsResult result) {
|
public void onResponse(ItemsResult result) {
|
||||||
List<Artist> artists = new ArrayList<>();
|
List<Artist> artists = new ArrayList<>();
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue