Ignore:
Timestamp:
10/26/10 10:48:08 (8 years ago)
Author:
grum
Message:

Fix many bugs
bug:1894, bug:1898, bug:1911, bug:1863, bug:1955, bug:1956, bug:1925

File:
1 edited

Legend:

Unmodified
Added
Removed
  • extensions/AMetaData/JpegMetaData/Readers/IptcReader.class.php

    r6949 r7399  
    217217      /* for each entries, convert value to human readable tag value 
    218218       * 
    219        * build a special 'keywords' tag made as an array from all iptc 'keywords' (0x0219) tags found 
     219       * repeatable values are stored in arrays 
     220       * 
     221       * for Subject Reference tags (0x020C), made derived tags (0x020Cnn) 
    220222       */ 
    221       $keywordsTag=null; 
     223      $repeatableTags=array(); 
    222224      foreach($this->entries as $key => $tag) 
    223225      { 
    224226        $this->setTagProperties($tag); 
    225         if($tag->getId()==0x0219) 
    226         { 
    227           if(is_null($keywordsTag)) 
    228           { 
    229             $keywordsTag=new Tag( 
    230               0x0219, 
    231               array($tag->getValue()), 
    232               $tag->getName(), 
    233               array($tag->getLabel()), 
    234               "", 
    235               $tag->isKnown(), 
    236               $tag->isImplemented(), 
    237               $tag->isTranslatable(), 
    238               $tag->getSchema() 
    239             ); 
    240           } 
    241           else 
    242           { 
    243             $keywordsTag->setValue(array_merge($keywordsTag->getValue(), array($tag->getValue()))); 
    244             $keywordsTag->setLabel(array_merge($keywordsTag->getLabel(), array($tag->getLabel()))); 
    245           } 
    246         } 
    247       } 
    248       if(!is_null($keywordsTag)) 
     227 
     228        $list=array(); 
     229 
     230        if($tag->getId()==0x020C) 
     231        { 
     232          $tmpValues=explode(':', $tag->getValue()); 
     233          $tmpLabels=explode(':', $tag->getLabel()); 
     234 
     235          $list=array( 
     236            array( 
     237              'id' => 0x020C, 
     238              'value' => $tag->getValue(), 
     239              'label' => $tag->getLabel(), 
     240            ), 
     241            array( 
     242              'id' => 0x020C00, 
     243              'value' => isset($tmpValues[0])?$tmpValues[0]:'', 
     244              'label' => isset($tmpLabels[0])?$tmpLabels[0]:'', 
     245            ), 
     246            array( 
     247              'id' => 0x020C01, 
     248              'value' => isset($tmpValues[1])?$tmpValues[1]:'', 
     249              'label' => isset($tmpLabels[1])?$tmpLabels[1]:'', 
     250            ), 
     251            array( 
     252              'id' => 0x020C02, 
     253              'value' => isset($tmpValues[2])?$tmpValues[2]:'', 
     254              'label' => isset($tmpLabels[2])?$tmpLabels[2]:'', 
     255            ), 
     256            array( 
     257              'id' => 0x020C03, 
     258              'value' => isset($tmpValues[3])?$tmpValues[3]:'', 
     259              'label' => isset($tmpLabels[3])?$tmpLabels[3]:'', 
     260            ), 
     261            array( 
     262              'id' => 0x020C04, 
     263              'value' => isset($tmpValues[4])?$tmpValues[4]:'', 
     264              'label' => isset($tmpLabels[4])?$tmpLabels[4]:'', 
     265            ) 
     266          ); 
     267        } 
     268        else 
     269        { 
     270          $list=array( 
     271            array( 
     272              'id' => $tag->getId(), 
     273              'value' => $tag->getValue(), 
     274              'label' => $tag->getLabel(), 
     275            ) 
     276          ); 
     277        } 
     278 
     279 
     280        foreach($list as $tagItem) 
     281        { 
     282          $tagDef=$this->tagDef->getTagById($tagItem['id']); 
     283 
     284          if($tagDef['repeatable']) 
     285          { 
     286            if(!array_key_exists($tagItem['id'], $repeatableTags)) 
     287            { 
     288              $repeatableTags[$tagItem['id']]=new Tag( 
     289                $tagItem['id'], 
     290                array($tagItem['value']), 
     291                $tagDef['tagName'], 
     292                array($tagItem['label']), 
     293                "", 
     294                $tag->isKnown(), 
     295                $tagDef['implemented'], 
     296                $tagDef['translatable'], 
     297                $tag->getSchema() 
     298              ); 
     299            } 
     300            else 
     301            { 
     302              $repeatableTags[$tagItem['id']]->setValue(array_merge($repeatableTags[$tagItem['id']]->getValue(), array($tagItem['value']))); 
     303              $repeatableTags[$tagItem['id']]->setLabel(array_merge($repeatableTags[$tagItem['id']]->getLabel(), array($tagItem['label']))); 
     304            } 
     305          } 
     306          unset($tagDef); 
     307        } 
     308        unset($tagId); 
     309      } 
     310      foreach($repeatableTags as $key => $tag) 
    249311      { 
    250312        /* 
    251313         * IPTC 'keywords' is stored like XMP 'xmp.dc:subject' (as a 'seq') 
    252314         */ 
    253         $keywordsTag->setValue( 
     315        $repeatableTags[$key]->setValue( 
    254316          array( 
    255317            'type' => 'seq', 
    256             'values' => $keywordsTag->getValue() 
     318            'values' => $repeatableTags[$key]->getValue() 
    257319          ) 
    258320        ); 
    259321 
    260         $keywordsTag->setLabel( 
     322        $repeatableTags[$key]->setLabel( 
    261323          array( 
    262324            'type' => 'seq', 
    263             'values' => $keywordsTag->getLabel() 
     325            'values' => $repeatableTags[$key]->getLabel() 
    264326          ) 
    265327        ); 
    266         $this->entries[]=$keywordsTag; 
    267         unset($keywordsTag); 
    268       } 
     328        $this->entries[]=$repeatableTags[$key]; 
     329        unset($repeatableTags[$key]); 
     330      } 
     331      unset($repeatableTags); 
    269332    } 
    270333 
     
    330393        case 0x0205: // 2:05  - Title 
    331394        case 0x0207: // 2:07  - Edit Status 
     395        case 0x020C: // 2:12 - Subject Reference 
    332396        case 0x020F: // 2:15  - Category 
    333397        case 0x0214: // 2:20  - Supplemental Category 
     
    359423        case 0x0114: // 1:20  - File Format 
    360424          $tag=$this->tagDef->getTagById(0x0114); 
    361           $returned=$tag['tagValues.special'][ConvertData::toUShort($values, BYTE_ORDER_BIG_ENDIAN)]; 
     425          $tmpValue=ConvertData::toUShort($values, BYTE_ORDER_BIG_ENDIAN); 
     426          if(array_key_exists($tmpValue, $tag['tagValues.special'])) 
     427          { 
     428            $returned=$tag['tagValues.special'][$tmpValue]; 
     429          } 
     430          else 
     431          { 
     432            $returned='Unknown file format : '.ConvertData::toHexDump($tmpValue, ByteType::USHORT); 
     433          } 
    362434          unset($tag); 
    363435          break; 
Note: See TracChangeset for help on using the changeset viewer.