private static function parseRecord($item, $type) { $crawler = new Crawler($item); //Initialize our object based on the record type we were passed. switch ($type) { case 'anime': $media = new Anime(); break; case 'manga': $media = new Manga(); break; } //Separate all the details $details = explode("\n", trim($crawler->filter('div[class="detail"]')->text())); $subDetails = explode(' ', trim($details[1])); //Pull out all the common parts $media->setId((int) str_replace('#area', '', $crawler->filter('a')->attr('id'))); $media->setTitle($crawler->filter('a')->eq(1)->text()); //Convert thumbnail to full size image by stripping the "t" in the filename $media->setImageUrl(preg_replace('/r(.+?)\\/(.+?)\\?(.+?)$/', '$2', $crawler->filter('img')->attr('data-src'))); $media->setMembersCount((int) trim(str_replace(',', '', str_replace('members', '', $details[3])))); //Anime and manga have different details, so we grab an array of the list and then process based on the type switch ($type) { case 'anime': $media->setType($subDetails[0]); $media->setEpisodes(strstr($subDetails[1], '?') ? null : (int) trim(str_replace('eps', '', $subDetails[1]), '()')); $media->setMembersScore((double) $crawler->filter('td')->eq(2)->text()); break; case 'manga': $media->setVolumes(strstr($subDetails[1], '?') ? null : (int) trim(str_replace('vols', '', $subDetails[1]), '()')); $media->setMembersScore((double) $crawler->filter('td')->eq(2)->text()); break; } return $media; }
private static function parserecord($item, $type) { $crawler = new Crawler($item); //Get the type record. switch ($type) { case 'anime': $media = new Anime(); break; case 'manga': $media = new Manga(); break; } //Pull out all the common parts $media->setId((int) str_replace('sarea', '', $crawler->filter('a[class="hoverinfo_trigger"]')->attr('id'))); $media->setTitle($crawler->filter('strong')->text()); //Title Image //We need to do some string manipulation here so it doesn't return a tiny image $media->setImageUrl(preg_replace('/r(.+?)\\/(.+?)\\?(.+?)$/', '$2', $crawler->filter('img')->attr('data-src'))); $media->setType(trim($crawler->filterXPath('//td[3]')->text())); switch ($type) { case 'anime': //Custom parsing for anime $media->setEpisodes((int) trim($crawler->filterXPath('//td[4]')->text())); $start_date = trim($crawler->filterXPath('//td[6]')->text()); if ($start_date != '-') { $start_date = explode('-', trim($start_date)); if (strlen($start_date[2]) == 2 && strpos($start_date[2], '?') === false) { $start_date[2] = self::fixMalShortYear($start_date[2]); } //We must have a year. If we don't even have that, don't set a date. if (strpos($start_date[2], '?') === false) { // If we don't know the month, then we can only be accurate to a year. if (strpos($start_date[0], '?') !== false) { $media->setLiteralStartDate(null, DateTime::createFromFormat('Y', $start_date[2]), 'year'); } elseif (strpos($start_date[0], '?') === false && strpos($start_date[1], '?') !== false) { $media->setLiteralStartDate(null, DateTime::createFromFormat('Y m', "{$start_date['2']} {$start_date['0']}"), 'month'); } elseif (strpos($start_date[0], '?') === false && strpos($start_date[1], '?') === false && strpos($start_date[2], '?') === false) { $media->setLiteralStartDate("{$start_date['2']}-{$start_date['0']}-{$start_date['1']}", DateTime::createFromFormat('Y m d', "{$start_date['2']} {$start_date['0']} {$start_date['1']}"), 'day'); } } } $end_date = trim($crawler->filterXPath('//td[7]')->text()); if ($end_date != '-') { $end_date = explode('-', trim($end_date)); if (strlen($end_date[2]) == 2 && strpos($end_date[2], '?') === false) { $end_date[2] = self::fixMalShortYear($end_date[2]); } //We must have a year. If we don't even have that, don't set a date. if (strpos($end_date[2], '?') === false) { if (strpos($end_date[0], '?') !== false) { $media->setLiteralEndDate(null, DateTime::createFromFormat('Y', $end_date[2]), 'year'); } elseif (strpos($end_date[0], '?') === false && strpos($end_date[1], '?') !== false) { $media->setLiteralEndDate(null, DateTime::createFromFormat('Y m', "{$end_date['2']} {$end_date['0']}"), 'month'); } elseif (strpos($end_date[0], '?') === false && strpos($end_date[1], '?') === false && strpos($end_date[2], '?') === false) { $media->setLiteralEndDate("{$end_date['2']}-{$end_date['0']}-{$end_date['1']}", DateTime::createFromFormat('Y m d', "{$end_date['2']} {$end_date['0']} {$end_date['1']}"), 'day'); } } } $classification = trim($crawler->filterXPath('//td[9]')->text()); if ($classification != '-') { $media->setClassification($classification); } $media->setMembersScore((double) trim($crawler->filterXPath('//td[5]')->text())); $synopsis = $crawler->filterXPath('//td[2]/div[2]')->text(); if ($synopsis !== '') { $media->setSynopsis(str_replace('read more.', '', trim($synopsis))); } break; case 'manga': //Custom parsing for manga $media->setType(trim($crawler->filterXPath('//td[3]')->text())); $media->setChapters((int) trim($crawler->filterXPath('//td[5]')->text())); $media->setVolumes((int) trim($crawler->filterXPath('//td[4]')->text())); $media->setMembersScore((double) trim($crawler->filterXPath('//td[6]')->text())); $media->setSynopsis(str_replace('read more.', '', trim($crawler->filterXPath('//td[2]/div[2]')->text()))); break; } return $media; }