Skip to content

Commit

Permalink
Fixed broken things
Browse files Browse the repository at this point in the history
  • Loading branch information
anandnet committed Apr 15, 2024
1 parent c768419 commit dee90cc
Show file tree
Hide file tree
Showing 6 changed files with 130 additions and 80 deletions.
4 changes: 4 additions & 0 deletions lib/models/album.dart
Original file line number Diff line number Diff line change
Expand Up @@ -24,11 +24,13 @@ class Album {
required this.browseId,
required this.artists,
this.year,
this.description,
this.audioPlaylistId,
required this.thumbnailUrl});
final String browseId;
final String? audioPlaylistId;
final String title;
final String? description;
final List<Map<dynamic, dynamic>>? artists;
final String? year;
final String thumbnailUrl;
Expand All @@ -40,6 +42,7 @@ class Album {
artists:json["artists"]!=null? List<Map<dynamic, dynamic>>.from(json["artists"]):[{'name':''}],
year: json['year'],
audioPlaylistId: json['audioPlaylistId'],
description: json['description'] ?? json["type"] ?? "Album",
thumbnailUrl: Thumbnail(json["thumbnails"][0]["url"]).medium);

Map<String,dynamic> toJson()=>{
Expand All @@ -48,6 +51,7 @@ class Album {
'artists':artists,
'year':year,
'audioPlaylistId':audioPlaylistId,
'description':description,
'thumbnails':[{'url':thumbnailUrl}]
};
}
2 changes: 1 addition & 1 deletion lib/models/playlist.dart
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ class Playlist {
title: json["title"],
playlistId: json["playlistId"] ?? json["browseId"],
thumbnailUrl: Thumbnail(json["thumbnails"][0]["url"]).medium,
description: json["description"],
description: json["description"] ?? "Playlist",
songCount: json['itemCount'],
isPipedPlaylist: json["isPipedPlaylist"] ?? false,
isCloudPlaylist: json["isCloudPlaylist"] ?? true);
Expand Down
106 changes: 72 additions & 34 deletions lib/services/music_service.dart
Original file line number Diff line number Diff line change
Expand Up @@ -331,32 +331,55 @@ class MusicServices extends getx.GetxService {
data['browseId'] = browseId;
Map<String, dynamic> response = (await _sendRequest('browse', data)).data;
if (playlistId != null) {
Map<String, dynamic> header = nav(response, [
'contents',
"twoColumnBrowseResultsRenderer",
'tabs',
0,
"tabRenderer",
"content",
"sectionListRenderer",
"contents",
0,
"musicResponsiveHeaderRenderer"
]);

Map<String, dynamic> results = nav(response, [
"contents",
"twoColumnBrowseResultsRenderer",
"secondaryContents",
"sectionListRenderer",
"contents",
0,
"musicPlaylistShelfRenderer",
]);
Map<String, dynamic> header =
nav(response, ['header', "musicDetailHeaderRenderer"]) ??
nav(response, [
'contents',
"twoColumnBrowseResultsRenderer",
'tabs',
0,
"tabRenderer",
"content",
"sectionListRenderer",
"contents",
0,
"musicResponsiveHeaderRenderer"
]);

Map<String, dynamic> results = nav(
response,
[
'contents',
"singleColumnBrowseResultsRenderer",
"tabs",
0,
"tabRenderer",
"content",
'sectionListRenderer',
'contents',
0,
"musicPlaylistShelfRenderer"
],
) ??
nav(response, [
"contents",
"twoColumnBrowseResultsRenderer",
"secondaryContents",
"sectionListRenderer",
"contents",
0,
"musicPlaylistShelfRenderer",
]);
Map<String, dynamic> playlist = {'id': results['playlistId']};

playlist['title'] = nav(header, title_text);
playlist['thumbnails'] = nav(header, thumnail_cropped);
playlist['thumbnails'] = nav(header, thumnail_cropped) ??
nav(header, [
"thumbnail",
"musicThumbnailRenderer",
"thumbnail",
"thumbnails"
]);
playlist["description"] = nav(header, description);
int runCount = header['subtitle']['runs'].length;
if (runCount > 1) {
Expand Down Expand Up @@ -408,17 +431,32 @@ class MusicServices extends getx.GetxService {
//album content
final album = parseAlbumHeader(response);
dynamic results = nav(
response,
[
'contents',
"twoColumnBrowseResultsRenderer",
"secondaryContents",
'sectionListRenderer',
'contents',
0,
'musicShelfRenderer'
],
);
response,
[
'contents',
"twoColumnBrowseResultsRenderer",
"secondaryContents",
'sectionListRenderer',
'contents',
0,
'musicShelfRenderer'
],
) ??
nav(
response,
[
'contents',
"singleColumnBrowseResultsRenderer",
"tabs",
0,
"tabRenderer",
"content",
'sectionListRenderer',
'contents',
0,
'musicShelfRenderer'
],
);

album['tracks'] = parsePlaylistItems(results['contents'],
artistsM: album['artists'],
Expand Down
75 changes: 48 additions & 27 deletions lib/services/nav_parser.dart
Original file line number Diff line number Diff line change
Expand Up @@ -202,15 +202,23 @@ dynamic parseVideo(dynamic result) {
}

dynamic parseSingle(dynamic result) {
dynamic year;
try {
year = int.parse(nav(result, subtitle));
} catch (e) {
year = nav(result, ["subtitle", "runs", 2, "text"]);
}
return Album.fromJson({
'title': nav(result, title_text),
'artists': [
{'name': 'Single'}
],
'audioPlaylistId': nav(result, audio_watch_playlist_id),
'year': nav(result, subtitle),
'year': "${year ?? ""}",
'browseId': nav(result, ['title', 'runs', 0, ...navigation_browse_id]),
'thumbnails': nav(result, thumbnail_renderer)
'thumbnails': nav(result, thumbnail_renderer),
'description':
(nav(result, ["subtitle", "runs"])).map((run) => run['text']).join('')
});
}

Expand Down Expand Up @@ -256,7 +264,6 @@ Map<String, dynamic> parseSongRuns(List<dynamic> runs) {
parsed['artists'].add(item);
}
} else {
// note: YT uses non-breaking space \xa0 to separate number and magnitude
RegExp regExp = RegExp(r"^\d([^ ])* [^ ]*$");
if (regExp.hasMatch(text) && i > 0) {
parsed['views'] = text.split(' ')[0];
Expand All @@ -281,7 +288,9 @@ Album parseAlbum(Map<dynamic, dynamic> result, {bool reqAlbumObj = true}) {
'title': nav(result, title_text),
'browseId': nav(result, n_title + navigation_browse_id),
'thumbnails': nav(result, thumbnail_renderer),
'audioPlaylistId': nav(result, audio_watch_playlist_id)
'audioPlaylistId': nav(result, audio_watch_playlist_id),
'description':
(nav(result, ["subtitle", "runs"])).map((run) => run['text']).join('')
//'isExplicit': nav(result, subtitle_badge_label, noneIfAbsent: true) != null,
};
albumMap.addAll(artistInfo);
Expand Down Expand Up @@ -696,6 +705,11 @@ dynamic parseSearchResult(Map<String, dynamic> data,
} else if (resultType == 'album') {
searchResult['type'] = getItemText(data, 1);
searchResult['audioPlaylistId'] = nav(data, audio_watch_playlist_id);
try {
final list = data['flexColumns'][1]
['musicResponsiveListItemFlexColumnRenderer']['text']['runs'];
searchResult['description'] = list.map((run) => run['text']).join('');
} catch (e) {}
} else if (resultType.contains('playlist')) {
List<dynamic> flexItem = getFlexColumnItem(data, 1)['text']['runs'];
bool hasAuthor = (flexItem.length == defaultOffset + 3);
Expand Down Expand Up @@ -794,37 +808,44 @@ dynamic parseSearchResult(Map<String, dynamic> data,
//parse album Header
Map<String, dynamic> parseAlbumHeader(Map<String, dynamic> response) {
Map<String, dynamic> header = nav(response, [
'contents',
"twoColumnBrowseResultsRenderer",
'tabs',
0,
"tabRenderer",
"content",
"sectionListRenderer",
"contents",
0,
"musicResponsiveHeaderRenderer"
]);
'contents',
"twoColumnBrowseResultsRenderer",
'tabs',
0,
"tabRenderer",
"content",
"sectionListRenderer",
"contents",
0,
"musicResponsiveHeaderRenderer"
]) ??
nav(response, ["header", "musicDetailHeaderRenderer"]);
Map<String, dynamic> album = {
'title': nav(header, title_text),
'type': nav(header, subtitle),
'thumbnails': nav(header,
["thumbnail", "musicThumbnailRenderer", "thumbnail", "thumbnails"])
'thumbnails': nav(header, thumnail_cropped) ??
nav(header,
["thumbnail", "musicThumbnailRenderer", "thumbnail", "thumbnails"])
};

if (header.containsKey("description")) {
album["description"] = nav(header, [
"description",
"musicDescriptionShelfRenderer",
"description",
"runs",
0,
"text"
]);
}
album["description"] = nav(header, [
"description",
"musicDescriptionShelfRenderer",
"description",
"runs",
0,
"text"
]) ??
(nav(header, ["subtitle", "runs"]))
.map((item) => item.values.first)
.toList()
.join(" ");

Map<String, dynamic> albumInfo =
parseSongRuns(header['subtitle']['runs'].sublist(2));
try {
albumInfo.addAll(parseSongRuns(header["straplineTextOne"]['runs']));
} catch (e) {}
album.addAll(albumInfo);

if (header['secondSubtitle']['runs'].length > 1) {
Expand Down
4 changes: 1 addition & 3 deletions lib/ui/screens/PlaylistNAlbum/playlistnalbum_screen.dart
Original file line number Diff line number Diff line change
Expand Up @@ -579,9 +579,7 @@ class PlaylistNAlbumScreen extends StatelessWidget {
(!playListNAlbumScreenController.isAlbum &&
content.isCloudPlaylist))
? Text(
playListNAlbumScreenController.isAlbum
? content.artists[0]['name'] ?? ""
: content.description ?? "",
content.description,
style: Theme.of(context).textTheme.titleSmall,
)
: Obx(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ import '/services/piped_service.dart';
import '../../../utils/helper.dart';
import '/models/playlist.dart';
import '/models/album.dart';
import '/models/thumbnail.dart';
import '../../../models/media_Item_builder.dart';
import '../../../services/music_service.dart';
import '../Library/library_controller.dart';
Expand Down Expand Up @@ -142,22 +141,12 @@ class PlayListNAlbumScreenController extends GetxController {

if (isIdOnly) {
if (isAlbum) {
final album = Album(
browseId: id,
artists: List<Map<dynamic, dynamic>>.from(content['artists']),
thumbnailUrl: Thumbnail(content['thumbnails'][0]['url']).high,
title: content['title'],
audioPlaylistId: content['audioPlaylistId'],
year: content['year']);
content['browseId'] = id;
final album =Album.fromJson(content);
contentRenderer = album;
} else {
final playlist = Playlist(
title: content['title'],
playlistId: id,
thumbnailUrl: Thumbnail(content['thumbnails'][0]['url']).high,
description: content['description'],
isCloudPlaylist: true,
songCount: (content['trackCount']).toString());
content['playlistId'] = id;
final playlist = Playlist.fromJson(content);
contentRenderer = playlist;
}
}
Expand Down

1 comment on commit dee90cc

@anandnet
Copy link
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please sign in to comment.