package io.hefuyi.listener.respository;
import android.content.Context;
import java.io.File;
import java.util.List;
import io.hefuyi.listener.R;
import io.hefuyi.listener.api.KuGouApiService;
import io.hefuyi.listener.api.LastFmApiService;
import io.hefuyi.listener.api.model.ArtistInfo;
import io.hefuyi.listener.api.model.KuGouRawLyric;
import io.hefuyi.listener.api.model.KuGouSearchLyricResult;
import io.hefuyi.listener.dataloader.AlbumLoader;
import io.hefuyi.listener.dataloader.AlbumSongLoader;
import io.hefuyi.listener.dataloader.ArtistAlbumLoader;
import io.hefuyi.listener.dataloader.ArtistLoader;
import io.hefuyi.listener.dataloader.ArtistSongLoader;
import io.hefuyi.listener.dataloader.FolderLoader;
import io.hefuyi.listener.dataloader.LastAddedLoader;
import io.hefuyi.listener.dataloader.PlaylistLoader;
import io.hefuyi.listener.dataloader.PlaylistSongLoader;
import io.hefuyi.listener.dataloader.QueueLoader;
import io.hefuyi.listener.dataloader.SongLoader;
import io.hefuyi.listener.dataloader.TopTracksLoader;
import io.hefuyi.listener.mvp.model.Album;
import io.hefuyi.listener.mvp.model.Artist;
import io.hefuyi.listener.mvp.model.FolderInfo;
import io.hefuyi.listener.mvp.model.Playlist;
import io.hefuyi.listener.mvp.model.Song;
import io.hefuyi.listener.respository.interfaces.Repository;
import io.hefuyi.listener.util.LyricUtil;
import retrofit2.Retrofit;
import rx.Observable;
import rx.functions.Func1;
import rx.schedulers.Schedulers;
/**
* Created by hefuyi on 2016/11/3.
*/
public class RepositoryImpl implements Repository {
private KuGouApiService mKuGouApiService;
private LastFmApiService mLastFmApiService;
private Context mContext;
public RepositoryImpl(Context context, Retrofit kugou, Retrofit lastfm) {
mContext = context;
mKuGouApiService = kugou.create(KuGouApiService.class);
mLastFmApiService = lastfm.create(LastFmApiService.class);
}
@Override
public Observable<ArtistInfo> getArtistInfo(String artist) {
return mLastFmApiService.getArtistInfo(artist);
}
@Override
public Observable<File> downloadLrcFile(final String title, final String artist, final long duration) {
return mKuGouApiService.searchLyric(title, String.valueOf(duration))
.subscribeOn(Schedulers.io())
.flatMap(new Func1<KuGouSearchLyricResult, Observable<KuGouRawLyric>>() {
@Override
public Observable<KuGouRawLyric> call(KuGouSearchLyricResult kuGouSearchLyricResult) {
if (kuGouSearchLyricResult.status == 200
&& kuGouSearchLyricResult.candidates != null
&& kuGouSearchLyricResult.candidates.size() != 0) {
KuGouSearchLyricResult.Candidates candidates = kuGouSearchLyricResult.candidates.get(0);
return mKuGouApiService.getRawLyric(candidates.id, candidates.accesskey);
} else {
return Observable.just(null);
}
}
})
.map(new Func1<KuGouRawLyric, File>() {
@Override
public File call(KuGouRawLyric kuGouRawLyric) {
if (kuGouRawLyric == null) {
return null;
}
String rawLyric = LyricUtil.decryptBASE64(kuGouRawLyric.content);
return LyricUtil.writeLrcToLoc(title, artist, rawLyric);
}
});
}
@Override
public Observable<List<Album>> getAllAlbums() {
return AlbumLoader.getAllAlbums(mContext);
}
@Override
public Observable<Album> getAlbum(long id) {
return AlbumLoader.getAlbum(mContext, id);
}
@Override
public Observable<List<Album>> getAlbums(String paramString) {
return AlbumLoader.getAlbums(mContext, paramString);
}
@Override
public Observable<List<Song>> getSongsForAlbum(long albumID) {
return AlbumSongLoader.getSongsForAlbum(mContext, albumID);
}
@Override
public Observable<List<Album>> getAlbumsForArtist(long artistID) {
return ArtistAlbumLoader.getAlbumsForArtist(mContext, artistID);
}
@Override
public Observable<List<Artist>> getAllArtists() {
return ArtistLoader.getAllArtists(mContext);
}
@Override
public Observable<Artist> getArtist(long artistID) {
return ArtistLoader.getArtist(mContext, artistID);
}
@Override
public Observable<List<Artist>> getArtists(String paramString) {
return ArtistLoader.getArtists(mContext, paramString);
}
@Override
public Observable<List<Song>> getSongsForArtist(long artistID) {
return ArtistSongLoader.getSongsForArtist(mContext, artistID);
}
@Override
public Observable<List<Song>> getRecentlyAddedSongs() {
return LastAddedLoader.getLastAddedSongs(mContext);
}
@Override
public Observable<List<Album>> getRecentlyAddedAlbums() {
return LastAddedLoader.getLastAddedAlbums(mContext);
}
@Override
public Observable<List<Artist>> getRecentlyAddedArtists() {
return LastAddedLoader.getLastAddedArtist(mContext);
}
@Override
public Observable<List<Song>> getRecentlyPlayedSongs() {
return TopTracksLoader.getTopRecentSongs(mContext);
}
@Override
public Observable<List<Album>> getRecentlyPlayedAlbums() {
return AlbumLoader.getRecentlyPlayedAlbums(mContext);
}
@Override
public Observable<List<Artist>> getRecentlyPlayedArtist() {
return ArtistLoader.getRecentlyPlayedArtist(mContext);
}
@Override
public Observable<List<Playlist>> getPlaylists(boolean defaultIncluded) {
return PlaylistLoader.getPlaylists(mContext, defaultIncluded);
}
@Override
public Observable<List<Song>> getSongsInPlaylist(long playlistID) {
return PlaylistSongLoader.getSongsInPlaylist(mContext, playlistID);
}
@Override
public Observable<List<Song>> getQueueSongs() {
return QueueLoader.getQueueSongs(mContext);
}
@Override
public Observable<List<Song>> getFavourateSongs() {
return SongLoader.getFavoriteSong(mContext);
}
@Override
public Observable<List<Album>> getFavourateAlbums() {
return AlbumLoader.getFavourateAlbums(mContext);
}
@Override
public Observable<List<Artist>> getFavourateArtist() {
return ArtistLoader.getFavouriteArtists(mContext);
}
@Override
public Observable<List<Song>> getAllSongs() {
return SongLoader.getAllSongs(mContext);
}
@Override
public Observable<List<Song>> searchSongs(String searchString) {
return SongLoader.searchSongs(mContext, searchString);
}
@Override
public Observable<List<Song>> getTopPlaySongs() {
return TopTracksLoader.getTopPlaySongs(mContext);
}
@Override
public Observable<List<FolderInfo>> getFoldersWithSong() {
return FolderLoader.getFoldersWithSong(mContext);
}
@Override
public Observable<List<Song>> getSongsInFolder(String path) {
return SongLoader.getSongListInFolder(mContext, path);
}
@Override
public Observable<List<Object>> getSearchResult(String queryString) {
Observable<Song> songList = SongLoader.searchSongs(mContext, queryString)
.flatMap(new Func1<List<Song>, Observable<Song>>() {
@Override
public Observable<Song> call(List<Song> songs) {
return Observable.from(songs);
}
});
Observable<Album> albumList = AlbumLoader.getAlbums(mContext, queryString)
.flatMap(new Func1<List<Album>, Observable<Album>>() {
@Override
public Observable<Album> call(List<Album> albums) {
return Observable.from(albums);
}
});
Observable<Artist> artistList = ArtistLoader.getArtists(mContext, queryString)
.flatMap(new Func1<List<Artist>, Observable<Artist>>() {
@Override
public Observable<Artist> call(List<Artist> artistList) {
return Observable.from(artistList);
}
});
Observable<String> songHeader = Observable.just(mContext.getString(R.string.songs));
Observable<String> albumHeader = Observable.just(mContext.getString(R.string.albums));
Observable<String> artistHeader = Observable.just(mContext.getString(R.string.artists));
return Observable.merge(songHeader, songList, albumHeader, albumList, artistHeader, artistList).toList();
}
}