import 'dart:core'; import 'dart:io'; import 'package:dio/dio.dart'; import 'package:funkblubber/funkentity.dart'; import 'package:funkblubber/console.dart' as console; Future download({ required final FunkObject object, final String path = '.', }) async { switch (object.kind) { case FunkEntity.album: await _downloadAlbum(object, path); return; case FunkEntity.artist: await _downloadArtist(object, path); return; default: return; } } Future _downloadArtist( final FunkObject object, final String path, ) async { Response response = await Dio().get( 'https://${object.domain}/api/v1/artists/${object.id}/?' 'refresh=false', ); final String pathAppend = response.data['name']; await Directory('$path/$pathAppend').create(); response = await Dio().get( 'https://${object.domain}/api/v1/albums/?' 'artist=${object.id}&ordering=creation_date&' 'page=1&page_size=16&scope=all', ); for (final albumResponse in response.data['results']) { _downloadAlbum( FunkObject( domain: object.domain, id: albumResponse['id'].toString(), kind: FunkEntity.album, ), '$path/$pathAppend', ); } } Future _downloadAlbum( final FunkObject object, final String path, ) async { final response = await Dio().get( 'https://${object.domain}/api/v1/tracks/?' 'album=${object.id}&ordering=creation_date&' 'page=1&page_size=16&scope=all', ); final String pathAppend = response.data['results'][0]['album']['title']; await Directory('$path/$pathAppend').create(); for (final songResponse in response.data['results']) { final String songTitle = songResponse['title']; final String ext = songResponse['uploads'][0]['extension']; _downloadSongObject( FunkObject( domain: object.domain, id: songResponse['listen_url'], kind: FunkEntity.song, ), '$path/$pathAppend/$songTitle.$ext', ); } } Future _downloadSongObject( final FunkObject object, final String path, ) async { final Response response = await Dio().get( 'https://${object.domain}${object.id}', options: Options( responseType: ResponseType.bytes, followRedirects: false, ), ); final File file = File(path); final accessFile = file.openSync(mode: FileMode.write); accessFile.writeFromSync(response.data); await accessFile.close(); }