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; }