Video.fromMap constructor

Video.fromMap(
  1. Map<String, dynamic>? map
)

Implementation

factory Video.fromMap(Map<String, dynamic>? map) {
  List<Thumbnail>? thumbnails;
  if (map?.containsKey("richItemRenderer") ?? false) {
    //video channel
    var uploadDate = map?['richItemRenderer']['content']['videoRenderer']
        ?['publishedTimeText'];
    var lengthText =
        map?['richItemRenderer']['content']['videoRenderer']?['lengthText'];
    thumbnails = [];
    map?['richItemRenderer']['content']['videoRenderer']['thumbnail']
            ['thumbnails']
        .forEach((thumbnail) {
      thumbnails!.add(Thumbnail(
          url: thumbnail['url'],
          width: thumbnail['width'],
          height: thumbnail['height']));
    });
    var viewtext = map?['richItemRenderer']?['content']?['videoRenderer']
        ?['shortViewCountText']?['runs'];
    String? uploadDates;
    String? viewers;
    if (uploadDate != null) {
      uploadDates = uploadDate['simpleText'];
    } else {
      uploadDates = '';
    }
    if (viewtext != null) {
      viewers = viewtext[0]['text'] + viewtext[1]['text'];
    } else {
      viewers = map?['richItemRenderer']?['content']?['videoRenderer']
          ?['shortViewCountText']?['simpleText'];
    }
    return Video(
      videoId: map?['richItemRenderer']['content']['videoRenderer']
              ?['videoId'] ??
          '',
      duration: lengthText?['simpleText'] ?? '',
      title: map?['richItemRenderer']['content']['videoRenderer']?['title']
              ?['runs']?[0]?['text'] ??
          '',
      channelName: '',
      thumbnails: thumbnails,
      views: viewers ?? '',
      uploadDate: uploadDates ?? '',
    );
  } else if (map?.containsKey("videoRenderer") ?? false) {
    //Trending and search videos
    var uploadDate = map?['videoRenderer']?['publishedTimeText'];
    var lengthText = map?['videoRenderer']?['lengthText'];
    var simpleText =
        map?['videoRenderer']?['shortViewCountText']?['simpleText'];
    thumbnails = [];
    map?['videoRenderer']['thumbnail']['thumbnails'].forEach((thumbnail) {
      thumbnails!.add(Thumbnail(
          url: thumbnail['url'],
          width: thumbnail['width'],
          height: thumbnail['height']));
    });
    String? uploadDates;
    if (uploadDate != null) {
      uploadDates = uploadDate?['simpleText'];
    } else {
      uploadDates = '';
    }
    return Video(
        videoId: map?['videoRenderer']?['videoId'] ?? '',
        duration:
            (lengthText == null) ? 'LIVE' : lengthText?['simpleText'] ?? '',
        title: map?['videoRenderer']?['title']?['runs']?[0]?['text'] ?? '',
        channelName:
            map?['videoRenderer']['longBylineText']['runs'][0]['text'] ?? '',
        thumbnails: thumbnails,
        views: (lengthText == null)
            ? "Views ${map!['videoRenderer']['viewCountText']['runs'][0]['text']}"
            : simpleText,
        uploadDate: uploadDates ?? '');
  } else if (map?.containsKey("compactVideoRenderer") ?? false) {
    //Related videos
    var uploadDate = map?['compactVideoRenderer']['publishedTimeText'];
    thumbnails = [];
    map?['compactVideoRenderer']['thumbnail']['thumbnails']
        .forEach((thumbnail) {
      thumbnails!.add(Thumbnail(
          url: thumbnail['url'],
          width: thumbnail['width'],
          height: thumbnail['height']));
    });
    var lengthText = map?['compactVideoRenderer']?['lengthText'];
    var viewtext =
        map?['compactVideoRenderer']?['shortViewCountText']?['runs'];
    String? viewers;
    String? uploadDates;
    if (uploadDate != null) {
      uploadDates = uploadDate?['simpleText'];
    } else {
      uploadDates = '';
    }
    if (viewtext != null) {
      viewers = viewtext?[0]['text'] + viewtext?[1]['text'];
    } else {
      viewers =
          map?['compactVideoRenderer']?['shortViewCountText']?['simpleText'];
    }
    return Video(
      videoId: map?['compactVideoRenderer']['videoId'] ?? '',
      title: map?['compactVideoRenderer']?['title']?['simpleText'] ?? '',
      duration:
          (lengthText == null) ? 'LIVE' : lengthText?['simpleText'] ?? '',
      thumbnails: thumbnails,
      channelName: map?['compactVideoRenderer']?['shortBylineText']?['runs']
              ?[0]?['text'] ??
          '',
      views: viewers ?? '',
      uploadDate: uploadDates ?? '',
    );
  } else if (map?.containsKey("gridVideoRenderer") ?? false) {
    String? simpleText =
        map?['gridVideoRenderer']['shortViewCountText']?['simpleText'];
    thumbnails = [];
    map?['gridVideoRenderer']['thumbnail']['thumbnails'].forEach((thumbnail) {
      thumbnails!.add(Thumbnail(
          url: thumbnail['url'],
          width: thumbnail['width'],
          height: thumbnail['height']));
    });
    return Video(
        videoId: map?['gridVideoRenderer']['videoId'],
        title: map?['gridVideoRenderer']['title']['runs'][0]['text'],
        duration: map?['gridVideoRenderer']['thumbnailOverlays'][0]
            ['thumbnailOverlayTimeStatusRenderer']['text']['simpleText'],
        thumbnails: thumbnails,
        views: (simpleText != null) ? simpleText : "???");
  } else if (map?.containsKey("playlistVideoRenderer") ?? false) {
    var uploadDate = map?['playlistVideoRenderer']?['publishedTimeText'];
    thumbnails = [];
    map?['playlistVideoRenderer']['thumbnail']['thumbnails']
        .forEach((thumbnail) {
      thumbnails!.add(Thumbnail(
          url: thumbnail['url'],
          width: thumbnail['width'],
          height: thumbnail['height']));
    });
    String? uploadDates;
    if (uploadDate != null) {
      uploadDates = uploadDate;
    } else {
      uploadDates = '';
    }
    return Video(
        videoId: map?['playlistVideoRenderer']['videoId'],
        title: map?['playlistVideoRenderer']['title']['runs'][0]['text'],
        duration: map?['playlistVideoRenderer']['thumbnailOverlays'][0]
            ['thumbnailOverlayTimeStatusRenderer']['text']['simpleText'],
        thumbnails: thumbnails,
        views: map?['playlistVideoRenderer']['title']['accessibility']
            ['accessibilityData']['label'],
        uploadDate: uploadDates);
  }
  return Video();
}