registerXPathNamespace('o', "http://www.idpf.org/2007/opf"); if(($cover = $package->xpath('//o:reference[@type="cover"]/@href')[0]) && (file_exists($dir . '/' . $cover))) { $meta['cover'] = $cover; } return self::parse($package->metadata->children('dc', true),$meta); } else { return false; } } /** * @brief parse Calibre metadata.opf into OPDS $meta array * * @param SimpleXMLElement $data SimpleXMLElement object containing DC/OPF metadata * @param arrayref &$meta * @return bool true if metadata is valid */ static function parse($data,&$meta) { foreach ($data as $key => $value) { switch ($key) { case 'title': $meta['title'] = strip_tags($value); break; case 'creator': if(!($author = json_decode($meta['author'],true))) { $author = array(); } $fileAs = $value->attributes('opf',true)->{'file-as'}; $author[(string) $fileAs] = strip_tags($value); $meta['author'] = json_encode($author); break; case 'description': $meta['description'] = strip_tags($value); break; case 'publisher': $meta['publisher'] = strip_tags($value); break; case 'identifier': if('ISBN' == $value->attributes('opf',true)->scheme) { $meta['isbn'] = strip_tags($value); } break; case 'subject': if(!($subject = json_decode($meta['subjects'],true))) { $subject = array(); } array_push($subject,strip_tags($value)); $meta['subjects'] = json_encode($subject); break; case 'date': $meta['date'] = strip_tags($value); break; case 'language': $meta['language'] = strip_tags($value); break; } } return Meta::isValid($meta); } }