diff --git a/lib/funkblubber.dart b/lib/funkblubber.dart index 180091b..4a416b9 100644 --- a/lib/funkblubber.dart +++ b/lib/funkblubber.dart @@ -19,6 +19,10 @@ Future download({ success = await _downloadArtist(object, path); break; + case FunkEntity.track: + success = await _downloadTrack(object, path); + break; + default: console.info(' nothing...'); break; @@ -100,11 +104,11 @@ Future _downloadAlbum( for (final songResponse in response.data['results']) { final String songTitle = songResponse['title']; final String ext = songResponse['uploads'][0]['extension']; - final result = _downloadSongObject( + final result = _downloadTrackObject( FunkObject( domain: object.domain, id: songResponse['listen_url'], - kind: FunkEntity.song, + kind: FunkEntity.track, ), '$path/$pathAppend/$songTitle.$ext', ); @@ -116,7 +120,27 @@ Future _downloadAlbum( return successes.every((final success) => success); } -Future _downloadSongObject( +Future _downloadTrack( + final FunkObject object, + final String path, +) async { + final response = await Dio().get( + 'https://${object.domain}/api/v1/tracks/${object.id}/?refresh=false', + ); + + final String songTitle = response.data['title']; + final String ext = response.data['uploads'][0]['extension']; + return _downloadTrackObject( + FunkObject( + domain: object.domain, + id: response.data['uploads'][0]['listen_url'], + kind: FunkEntity.track, + ), + '$path/$songTitle.$ext', + ); +} + +Future _downloadTrackObject( final FunkObject object, final String path, ) async { diff --git a/lib/funkentity.dart b/lib/funkentity.dart index 610f374..b015fbf 100644 --- a/lib/funkentity.dart +++ b/lib/funkentity.dart @@ -1,7 +1,5 @@ enum FunkEntity { - error, - - song, + track, album, artist, profile, diff --git a/lib/parser.dart b/lib/parser.dart deleted file mode 100644 index 427d257..0000000 --- a/lib/parser.dart +++ /dev/null @@ -1,51 +0,0 @@ -import 'package:funkblubber/funkentity.dart'; -import 'package:funkblubber/console.dart' as console; - -FunkObject extract(final List args) { - FunkObject result = FunkObject( - kind: FunkEntity.error, - id: '', - domain: '', - ); - - if (args.isEmpty) { - console.error('no arguments provided'); - return result; - } - - try { - final Uri uri = Uri.parse(args[0]); - - final segments = uri.pathSegments; - for (int i = 0; i < segments.length; ++i) { - switch (segments[i]) { - case 'artists': - result = FunkObject( - kind: FunkEntity.artist, - id: segments[i + 1], - domain: uri.host, - ); - ++i; - break; - - case 'albums': - result = FunkObject( - kind: FunkEntity.album, - id: segments[i + 1], - domain: uri.host, - ); - ++i; - break; - } - } - } catch (e) { - console.error(e.toString()); - result = FunkObject( - kind: FunkEntity.error, - id: '', - domain: '', - ); - } - - return result; -} diff --git a/lib/parsing/parser.dart b/lib/parsing/parser.dart index 766dd18..9dd860e 100644 --- a/lib/parsing/parser.dart +++ b/lib/parsing/parser.dart @@ -70,6 +70,17 @@ ParseResult extract(final List args) { result = stageResult.result; break; + case ParsingStage.track: + final stageResult = _onEntityStage( + arg, + result, + currentStage, + FunkEntity.track, + ); + currentStage = stageResult.stage; + result = stageResult.result; + break; + case ParsingStage.domain: final stageResult = _onDomainStage(arg, result, currentStage); currentStage = stageResult.stage; @@ -102,6 +113,8 @@ usage: funkblubber [[-OPTIONS|URL]...] [-A|--artist ID] Provide with artist ID to download their albums. + [-t|--track ID] Provide with track ID to download a single track entity. + [-p|--path PATH] Provide to explicitly define download directory. Assumed '.'. @@ -219,6 +232,10 @@ StageResult _onNothingStage( case '--album': currentStage = ParsingStage.album; break; + case '-t': + case '--track': + currentStage = ParsingStage.track; + break; case '-u': case '--upload': currentStage = ParsingStage.upload; @@ -256,6 +273,19 @@ StageResult _onNothingStage( ++i; break; + case 'tracks': + result = ParseResult( + action: Action.download, + success: true, + object: FunkObject( + kind: FunkEntity.track, + id: segments[i + 1], + domain: uri.host, + ), + ); + ++i; + break; + case 'albums': result = ParseResult( action: Action.download, diff --git a/lib/parsing/parsing_stage.dart b/lib/parsing/parsing_stage.dart index 217f7d9..725ba7d 100644 --- a/lib/parsing/parsing_stage.dart +++ b/lib/parsing/parsing_stage.dart @@ -2,7 +2,7 @@ enum ParsingStage { nothing, album, artist, - song, + track, path, upload, domain,