funkblubber/lib/funkblubber.dart

103 lines
2.6 KiB
Dart
Raw Normal View History

2023-01-26 22:35:58 +01:00
import 'dart:core';
import 'dart:io';
2023-01-26 22:35:58 +01:00
import 'package:dio/dio.dart';
import 'package:funkblubber/funkentity.dart';
import 'package:funkblubber/console.dart' as console;
Future<void> download({
required final FunkObject object,
2023-02-01 22:00:23 +01:00
required final String path,
}) async {
2023-01-31 08:37:32 +01:00
console.info('Downloading');
2023-01-26 22:35:58 +01:00
switch (object.kind) {
case FunkEntity.album:
await _downloadAlbum(object, path);
2023-01-26 22:35:58 +01:00
return;
case FunkEntity.artist:
await _downloadArtist(object, path);
return;
2023-01-26 22:35:58 +01:00
default:
2023-01-31 08:37:32 +01:00
console.info(' nothing...');
2023-01-26 22:35:58 +01:00
return;
}
}
Future<void> _downloadArtist(
final FunkObject object,
final String path,
) async {
2023-01-29 23:55:35 +01:00
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();
2023-01-31 08:37:32 +01:00
console.info('Artist: $pathAppend');
2023-01-29 23:55:35 +01:00
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,
),
2023-01-29 23:55:35 +01:00
'$path/$pathAppend',
);
}
}
Future<void> _downloadAlbum(
final FunkObject object,
final String path,
) async {
2023-01-26 22:35:58 +01:00
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'];
2023-01-29 23:55:35 +01:00
await Directory('$path/$pathAppend').create();
2023-01-31 08:37:32 +01:00
console.info('Album: $pathAppend');
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<void> _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,
),
);
2023-01-31 08:37:32 +01:00
console.info('- $path');
final File file = File(path);
final accessFile = file.openSync(mode: FileMode.write);
accessFile.writeFromSync(response.data);
await accessFile.close();
2023-01-26 22:35:58 +01:00
}