Book.fromAnna constructor

Book.fromAnna(
  1. Bs4Element soupElement
)

Implementation

factory Book.fromAnna(Bs4Element soupElement) {
  bool hasIssue(BeautifulSoup soup) {
    return soup
        .findAll(
          'div',
          class_: 'text-xs lg:text-sm',
        )
        .isNotEmpty;
  }

  String getAuthor(BeautifulSoup soup) {
    return soup
        .find(
          'div',
          class_:
              'max-lg:line-clamp-[2] lg:truncate leading-[1.2] lg:leading-[1.35] max-lg:text-sm italic',
        )!
        .string;
  }

  String getTitle(BeautifulSoup soup) {
    return soup.h3!.string;
  }

  String getImageUrl(BeautifulSoup soup) {
    return soup.img!.attributes['src']!;
  }

  String getMd5(BeautifulSoup soup) {
    return soup.a!.attributes['href']!.split('/')[2];
  }

  List<String> getSplitMetadata(BeautifulSoup soup) {
    return soup
        .find(
          'div',
          class_:
              'line-clamp-[2] leading-[1.2] text-[10px] lg:text-xs text-gray-500',
        )!
        .string
        .split(',');
  }

  String getSize(List<String> splitMetadata) {
    return splitMetadata[3].trim();
  }

  String capitalize(String s) => s[0].toUpperCase() + s.substring(1);

  String getGenre(List<String> splitMetadata) {
    return capitalize(splitMetadata[4]
        .replaceAll('(', '')
        .replaceAll(')', '')
        .split(' ')
        .last);
  }

  String getUncommentedHtml(Bs4Element soupElement) {
    return soupElement.outerHtml.replaceAll('<!--', '').replaceAll('-->', '');
  }

  Format getFormat(List<String> splitMetadata) {
    return Format.fromString(splitMetadata[1].trim().replaceAll('.', ''));
  }

  final soup = BeautifulSoup(getUncommentedHtml(soupElement));

  if (hasIssue(soup)) {
    throw Exception('Issue with book');
  }

  final splitMetadata = getSplitMetadata(soup);

  return Book(
    title: getTitle(soup),
    imgUrl: getImageUrl(soup),
    md5: getMd5(soup),
    size: getSize(splitMetadata),
    genre: getGenre(splitMetadata),
    format: getFormat(splitMetadata),
    author: getAuthor(soup),
  );
}