ExifTool Forum

ExifTool => Bug Reports / Feature Requests => Topic started by: kingvhit on August 13, 2020, 11:00:29 AM

Title: Wrong decode when print the table structure
Post by: kingvhit on August 13, 2020, 11:00:29 AM
Hi,

I have ran bellow command to get the tagId and table based structure of metadata set. All of this working well, but some tag has an ID like this is return wrong character after ran.

My commands.
exiftool -T -G -H -x ExifTool:all -x Composite:all -x MakerNotes:all -api largefilesupport=1 -sort -json VID_20200813_210243.mp4 > data.json

Json data

[{
  "SourceFile": "VID_20200813_210243.mp4",
  "QuickTime:GPSCoordinates": {
    "id": "?xyz",
    "table": "QuickTime::UserData",
    "val": "16 deg 4' 3.00\" N, 108 deg 12' 42.48\" E"
  },
}]


The correct point of `id` must be `\xa9xyz`, but it return "?xyz", tried to add UTF8 as charset not works.

Thank you!
Title: Re: Wrong decode when print the table structure
Post by: Phil Harvey on August 13, 2020, 03:52:21 PM
The tag ID is binary (ie. it can't be converted to UTF-8).  Try adding the -b option to your command.

- Phil
Title: Re: Wrong decode when print the table structure
Post by: kingvhit on August 14, 2020, 12:35:36 PM
Hi thank you, I got the value of this, but may I got some other issue

I tried bellow command to get all of the available Tag on ExifTool.
See

exiftool -listx -s -f -csv > all.xml


That will return the data of QuickTime table

<table name='QuickTime::UserData' g0='QuickTime' g1='UserData' g2='Video'>
<tag id='\xa9xyz' name='GPSCoordinates' type='string' writable='true' g2='Location'/>
</table>


Then, I save all of the tag on my local DB and modify to make something, but the above command that I got from base64 like this

  "QuickTime:GPSCoordinates": {
    "id": "base64:qXh5eg==",
    "table": "QuickTime::UserData",
    "val": "16 deg 4' 3.00\" N, 108 deg 12' 42.48\" E"
  },


Convert base64 I got only `xyz` so I can't identify this tag on my local DB because the ID is not same, and so many other tags has same `xyz` value, so I can't use `like` operator to compare this.

Do you have any idea for this, thank you!
Title: Re: Wrong decode when print the table structure
Post by: kingvhit on August 14, 2020, 12:44:31 PM
Depend on duplicate tag in the same tableName, I can't use the `tagName` for identify a tag.

(https://2.pik.vn/202074ddc620-fc18-41e4-96af-1c4dd922fcfa.png)

Title: Re: Wrong decode when print the table structure
Post by: dae65 on August 14, 2020, 02:11:47 PM
This Perl script will use the API to print a table from groups and IDs to values using tab as a column separator:

use v5.10;
use Image::ExifTool 12.04;
my $et = new Image::ExifTool;
my $groups = shift;
binmode STDOUT, ':utf8';
for ( @ARGV ) {
  if ( $et->ExtractInfo ( $_ ) ) {
    foreach my $group ( split /,/, $groups ) {
      my $by_name = $et->GetInfo ( { Group1 => $group } ) or next;
      say STDOUT join "\t", $group, $et->GetTagID ($_), $by_name->{$_} for keys %$by_name;
    }
  }
}


Save it to some script.pl file, and either make it executable or run it with Perl:
$ perl script.pl ItemList,UserData file.mp4
The second argument is a comma-separated list of family 1 groups.

If you really need to output it as json, make sure JSON::XS (https://metacpan.org/pod/JSON::XS) is installed first, and let me know.
Title: Re: Wrong decode when print the table structure
Post by: Phil Harvey on August 14, 2020, 05:32:21 PM
QuoteThat will return the data of QuickTime table

    "id": "base64:qXh5eg==",


Convert base64 I got only `xyz`

You're converting it wrong.  This is what I get:

% echo qXh5eg== > t1
% cat t1
qXh5eg==
% base64 -D t1 > t2
% hexdump t2
    0000: a9 78 79 7a                                     [.xyz]


Also, the -csv option has no effect on the -listx output.

- Phil
Title: Re: Wrong decode when print the table structure
Post by: kingvhit on August 15, 2020, 02:11:33 PM
Quote from: dae65 on August 14, 2020, 02:11:47 PM
This Perl script will use the API to print a table from groups and IDs to values using tab as a column separator:

use v5.10;
use Image::ExifTool 12.04;
my $et = new Image::ExifTool;
my $groups = shift;
binmode STDOUT, ':utf8';
for ( @ARGV ) {
  if ( $et->ExtractInfo ( $_ ) ) {
    foreach my $group ( split /,/, $groups ) {
      my $by_name = $et->GetInfo ( { Group1 => $group } ) or next;
      say STDOUT join "\t", $group, $et->GetTagID ($_), $by_name->{$_} for keys %$by_name;
    }
  }
}


Save it to some script.pl file, and either make it executable or run it with Perl:
$ perl script.pl ItemList,UserData file.mp4
The second argument is a comma-separated list of family 1 groups.

If you really need to output it as json, make sure JSON::XS (https://metacpan.org/pod/JSON::XS) is installed first, and let me know.

Awesome, I got the value as expected by string `@xyz`, thank a lot. Thought that I don't have a file to test on the other tag id, but that seem like works.

@Phil Harvey: Thank for you correct point!!