2012-08-05 5 views
0

Y at-il bibliothèque disponible gratuitement pour PHP qui analyse un fichier .mobi pour obtenir le:PHP Library parser Mobi

  • Auteur
  • Titre
  • Editeur
  • Couverture

Editer:

Pour tout le monde qui pense que c'est un exact dupliquer de Does a PHP Library Exist to Work with PRC/MOBI Files, vous êtes évidemment trop paresseux pour lire les questions.

Ce demandeur veut savoir comment générer des fichiers .mobi en utilisant une bibliothèque PHP. Je veux savoir comment séparer, ou analyser, les fichiers .mobi déjà créés pour obtenir certaines informations. Par conséquent, la solution à cette question, phpMobi ne fonctionnera pas car il s'agit d'un script pour générer des fichiers .mobi à partir de HTML, pas pour analyser les fichiers .mobi.

+0

double possible (http://stackoverflow.com/questions/2242548/does-a-php-library-exist-to-work-with-prc-mobi-files) – ecatmur

+1

@ecatmur Pas vraiment. La solution à cette question était un script qui __generated__ .mobi des fichiers HTML. Je veux analyser les fichiers .mobi déjà créés. __Parse__, pas __créé__. __Parse__, pas __créé__. – citruspi

Répondre

5

Un exemple très très très boiteux, mais si vous êtes désespérés, vous pouvez essayer quelque chose comme ceci:

$data = file_get_contents("A Young Girl's Diary - Freud, Sigmund.mobi"); 

$chunk = mb_substr($data, mb_strpos($data, 'EXTH'), 512); 
$chunks = explode("\x00", $chunk); 
array_shift($chunks); 

$chunks = array_filter($chunks, function($str){return preg_match('#([A-Z])#', $str) && mb_strlen($str) > 2;}); 

$chunks = array_combine(array('author', 'publisher', 'title'), $chunks); 

print_r($chunks); 

Sortie:

Array 
(
    [author] => Freud, Sigmund 
    [publisher] => Webarto 
    [title] => A Young Girl's Diary 
) 

Fichier utilisé: http://freekindlebooks.org/Freud/752-h.mobi (métadonnées de l'éditeur édité avec Caliber)

L'analyse de fichiers n'est même pas facile à utiliser ou amusante à faire. Jetez un oeil à ceci: http://code.google.com/p/xee/source/browse/XeePhotoshopLoader.m?r=a70d7396356997114b548f4ab2cbd49badd7d285#107

Ce que vous devriez faire est de lire les octets par octets, mais comme il n'y a pas de documentation détaillée, je crains que cela ne soit pas facile.

P.S. Je n'ai pas essayé d'aller chercher la photo de couverture.

2

Avait le même problème, n'a pas trouvé de parseurs PHP, a dû écrire le mien (malheureusement, je ne peux pas divulguer mon code). Voici une bonne ressource sur la structure .mobi http://wiki.mobileread.com/wiki/MOBI

4

Si quelqu'un est toujours intéressé ici est un échantillon de la lecture des métadonnées mobi: [? Est-ce une bibliothèque PHP existent pour travailler avec RPC/fichiers .mobi]

class palmDOCHeader 
{ 
    public $Compression = 0; 
    public $TextLength = 0; 
    public $Records = 0; 
    public $RecordSize = 0; 
} 

class palmHeader 
{ 
    public $Records = array(); 
} 

class palmRecord 
{ 
    public $Offset = 0; 
    public $Attributes = 0; 
    public $Id = 0; 
} 

class mobiHeader 
{ 
    public $Length = 0; 
    public $Type = 0; 
    public $Encoding = 0; 
    public $Id = 0; 
    public $FileVersion = 0; 

} 

class exthHeader 
{ 
    public $Length = 0; 
    public $Records = array(); 
} 

class exthRecord 
{ 
    public $Type = 0; 
    public $Length = 0; 
    public $Data = ""; 
} 

class mobi { 
    protected $mobiHeader; 
    protected $exthHeader; 

    public function __construct($file){ 
     $handle = fopen($file, "r"); 
     if ($handle){ 
      fseek($handle, 60, SEEK_SET); 
      $content = fread($handle, 8); 
      if ($content != "BOOKMOBI"){ 
       echo "Invalid file format"; 
       fclose($handle); 
       return; 
      } 

      // Palm Database 
      echo "\nPalm database:\n"; 
      $palmHeader = new palmHeader(); 

      fseek($handle, 0, SEEK_SET); 
      $name = fread($handle, 32); 
      echo "Name: ".$name."\n"; 

      fseek($handle, 76, SEEK_SET); 
      $content = fread($handle, 2); 
      $records = hexdec(bin2hex($content)); 
      echo "Records: ".$records."\n"; 

      fseek($handle, 78, SEEK_SET); 
      for ($i=0; $i<$records; $i++){ 
       $record = new palmRecord(); 

       $content = fread($handle, 4); 
       $record->Offset = hexdec(bin2hex($content)); 

       $content = fread($handle, 1); 
       $record->Attributes = hexdec(bin2hex($content)); 

       $content = fread($handle, 3); 
       $record->Id = hexdec(bin2hex($content)); 

       array_push($palmHeader->Records, $record); 
       echo "Record ".$i." offset: ".$record->Offset." attributes: ".$record->Attributes." id : ".$record->Id."\n"; 
      } 

      // PalmDOC Header 
      $palmDOCHeader = new palmDOCHeader(); 
      fseek($handle, $palmHeader->Records[0]->Offset, SEEK_SET); 
      $content = fread($handle, 2); 
      $palmDOCHeader->Compression = hexdec(bin2hex($content)); 
      $content = fread($handle, 2); 
      $content = fread($handle, 4); 
      $palmDOCHeader->TextLength = hexdec(bin2hex($content)); 
      $content = fread($handle, 2); 
      $palmDOCHeader->Records = hexdec(bin2hex($content)); 
      $content = fread($handle, 2); 
      $palmDOCHeader->RecordSize = hexdec(bin2hex($content)); 
      $content = fread($handle, 4); 

      echo "\nPalmDOC Header:\n"; 
      echo "Compression:".$palmDOCHeader->Compression."\n"; 
      echo "TextLength:".$palmDOCHeader->TextLength."\n"; 
      echo "Records:".$palmDOCHeader->Records."\n"; 
      echo "RecordSize:".$palmDOCHeader->RecordSize."\n"; 

      // MOBI Header 
      $mobiStart = ftell($handle); 
      $content = fread($handle, 4); 
      if ($content == "MOBI"){ 
       $this->mobiHeader = new mobiHeader(); 
       echo "\nMOBI header:\n"; 
       $content = fread($handle, 4); 
       $this->mobiHeader->Length = hexdec(bin2hex($content)); 

       $content = fread($handle, 4); 
       $this->mobiHeader->Type = hexdec(bin2hex($content)); 

       $content = fread($handle, 4); 
       $this->mobiHeader->Encoding = hexdec(bin2hex($content)); 

       $content = fread($handle, 4); 
       $this->mobiHeader->Id = hexdec(bin2hex($content)); 

       echo "Header length: ".$this->mobiHeader->Length."\n"; 
       echo "Type: ".$this->mobiHeader->Type."\n"; 
       echo "Encoding: ".$this->mobiHeader->Encoding."\n"; 
       echo "Id: ".$this->mobiHeader->Id."\n"; 

       fseek($handle, $mobiStart+$this->mobiHeader->Length, SEEK_SET); 
       $content = fread($handle, 4); 
       if ($content == "EXTH"){ 
        $this->exthHeader = new exthHeader(); 
        echo "\nEXTH header:\n"; 

        $content = fread($handle, 4); 
        $this->exthHeader->Length = hexdec(bin2hex($content)); 

        $content = fread($handle, 4); 
        $records = hexdec(bin2hex($content)); 
        echo "Records: ".$records."\n"; 

        for ($i=0; $i<$records; $i++){ 
         $record = new exthRecord(); 

         $content = fread($handle, 4); 
         $record->Type = hexdec(bin2hex($content)); 

         $content = fread($handle, 4); 
         $record->Length = hexdec(bin2hex($content)); 

         $record->Data = fread($handle, $record->Length - 8); 

         array_push($this->exthHeader->Records, $record); 
         echo "Record ".$i." type: ".$record->Type." length: ".$record->Length."\n"; 
         echo " data: ".$record->Data."\n"; 
        } 
       } 
      } 

      fclose($handle); 
     } 
    } 

    protected function GetRecord($type) 
    { 
     foreach ($this->exthHeader->Records as $record){ 
      if ($record->Type == $type) 
       return $record; 
     } 
     return NULL; 
    } 

    protected function GetRecordData($type) 
    { 
     $record = $this->GetRecord($type); 
     if ($record) 
      return $record->Data; 
     return ""; 
    } 

    public function Title() 
    { 
     return $this->GetRecordData(503); 
    } 

    public function Author() 
    { 
     return $this->GetRecordData(100); 
    } 

    public function Isbn() 
    { 
     return $this->GetRecordData(104); 
    } 

    public function Subject() 
    { 
     return $this->GetRecordData(105); 
    } 

    public function Publisher() 
    { 
     return $this->GetRecordData(101); 
    } 
} 

$mobi = new mobi("test.mobi"); 
echo "\nTitle: ".$mobi->Title(); 
echo "\nAuthor: ".$mobi->Author(); 
echo "\nIsbn: ".$mobi->Isbn(); 
echo "\nSubject: ".$mobi->Subject(); 
echo "\nPublisher: ".$mobi->Publisher();