visual demo version
This commit is contained in:
parent
1ce7aea6b5
commit
f70fe3cdd1
14 changed files with 2126 additions and 43 deletions
122
CHALLENGE_2/sleepysound/lib/models/spotify_track.dart
Normal file
122
CHALLENGE_2/sleepysound/lib/models/spotify_track.dart
Normal file
|
@ -0,0 +1,122 @@
|
|||
import 'package:json_annotation/json_annotation.dart';
|
||||
|
||||
part 'spotify_track.g.dart';
|
||||
|
||||
@JsonSerializable()
|
||||
class SpotifyTrack {
|
||||
final String id;
|
||||
final String name;
|
||||
final List<SpotifyArtist> artists;
|
||||
final SpotifyAlbum album;
|
||||
@JsonKey(name: 'duration_ms')
|
||||
final int durationMs;
|
||||
@JsonKey(name: 'external_urls')
|
||||
final Map<String, String> externalUrls;
|
||||
@JsonKey(name: 'preview_url')
|
||||
final String? previewUrl;
|
||||
|
||||
SpotifyTrack({
|
||||
required this.id,
|
||||
required this.name,
|
||||
required this.artists,
|
||||
required this.album,
|
||||
required this.durationMs,
|
||||
required this.externalUrls,
|
||||
this.previewUrl,
|
||||
});
|
||||
|
||||
factory SpotifyTrack.fromJson(Map<String, dynamic> json) =>
|
||||
_$SpotifyTrackFromJson(json);
|
||||
|
||||
Map<String, dynamic> toJson() => _$SpotifyTrackToJson(this);
|
||||
|
||||
String get artistNames => artists.map((artist) => artist.name).join(', ');
|
||||
|
||||
String get duration {
|
||||
final minutes = (durationMs / 60000).floor();
|
||||
final seconds = ((durationMs % 60000) / 1000).floor();
|
||||
return '$minutes:${seconds.toString().padLeft(2, '0')}';
|
||||
}
|
||||
|
||||
String get imageUrl => album.images.isNotEmpty ? album.images.first.url : '';
|
||||
}
|
||||
|
||||
@JsonSerializable()
|
||||
class SpotifyArtist {
|
||||
final String id;
|
||||
final String name;
|
||||
|
||||
SpotifyArtist({
|
||||
required this.id,
|
||||
required this.name,
|
||||
});
|
||||
|
||||
factory SpotifyArtist.fromJson(Map<String, dynamic> json) =>
|
||||
_$SpotifyArtistFromJson(json);
|
||||
|
||||
Map<String, dynamic> toJson() => _$SpotifyArtistToJson(this);
|
||||
}
|
||||
|
||||
@JsonSerializable()
|
||||
class SpotifyAlbum {
|
||||
final String id;
|
||||
final String name;
|
||||
final List<SpotifyImage> images;
|
||||
|
||||
SpotifyAlbum({
|
||||
required this.id,
|
||||
required this.name,
|
||||
required this.images,
|
||||
});
|
||||
|
||||
factory SpotifyAlbum.fromJson(Map<String, dynamic> json) =>
|
||||
_$SpotifyAlbumFromJson(json);
|
||||
|
||||
Map<String, dynamic> toJson() => _$SpotifyAlbumToJson(this);
|
||||
}
|
||||
|
||||
@JsonSerializable()
|
||||
class SpotifyImage {
|
||||
final int height;
|
||||
final int width;
|
||||
final String url;
|
||||
|
||||
SpotifyImage({
|
||||
required this.height,
|
||||
required this.width,
|
||||
required this.url,
|
||||
});
|
||||
|
||||
factory SpotifyImage.fromJson(Map<String, dynamic> json) =>
|
||||
_$SpotifyImageFromJson(json);
|
||||
|
||||
Map<String, dynamic> toJson() => _$SpotifyImageToJson(this);
|
||||
}
|
||||
|
||||
@JsonSerializable()
|
||||
class SpotifySearchResponse {
|
||||
final SpotifyTracks tracks;
|
||||
|
||||
SpotifySearchResponse({required this.tracks});
|
||||
|
||||
factory SpotifySearchResponse.fromJson(Map<String, dynamic> json) =>
|
||||
_$SpotifySearchResponseFromJson(json);
|
||||
|
||||
Map<String, dynamic> toJson() => _$SpotifySearchResponseToJson(this);
|
||||
}
|
||||
|
||||
@JsonSerializable()
|
||||
class SpotifyTracks {
|
||||
final List<SpotifyTrack> items;
|
||||
final int total;
|
||||
|
||||
SpotifyTracks({
|
||||
required this.items,
|
||||
required this.total,
|
||||
});
|
||||
|
||||
factory SpotifyTracks.fromJson(Map<String, dynamic> json) =>
|
||||
_$SpotifyTracksFromJson(json);
|
||||
|
||||
Map<String, dynamic> toJson() => _$SpotifyTracksToJson(this);
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue