Can ExifTool write just the time without date?

Started by kbellis, January 18, 2014, 01:50:24 PM

Previous topic - Next topic

Phil Harvey

Yes, but it isn't in the command you typed here:



- Phil
...where DIR is the name of a directory/folder containing the images.  On Mac/Linux/PowerShell, use single quotes (') instead of double quotes (") around arguments containing a dollar sign ($).

kbellis

Okay - yes, you're correct - I've tried it both ways; however, with or without the dot the problem has been seen:

Phil Harvey

Now that's a bummer.

I did a search in the forum for "Config file not found", and it was only ever a problem with the path specification.

Are you sure that ExifTool has read permissions for the config file on your system?  I can't see why it shouldn't.

Try entering this command:

type CONFIGFILENAME

where CONFIGFILENAME is the name of your config file.

If that works, then I can imagine no reason why this would give a "Config file not found" error:

exiftool -config CONFIGFILENAME -date -time test.jpg

- Phil
...where DIR is the name of a directory/folder containing the images.  On Mac/Linux/PowerShell, use single quotes (') instead of double quotes (") around arguments containing a dollar sign ($).

kbellis

Bummer or MYSTERY

Permissions:


Well... that at least the type command worked :)
#               the following environment variables:
#
#                   1. EXIFTOOL_HOME
#                   2. HOME
#                   3. HOMEDRIVE + HOMEPATH
#                   4. (the current directory)
#
#               Alternatively, the -config option of the exiftool application
#               may be used to load a specific configuration file (note that
#               it must be the first option on the command line):
#
#                   exiftool -config ExifTool_config ...
#
#               This sample file defines the following 16 new tags as well as a
#               number of Shortcut and Composite tags:
#
#                   1.  EXIF:NewEXIFTag
#                   2.  GPS:GPSPitch
#                   3.  GPS:GPSRoll
#                   4.  IPTC:NewIPTCTag
#                   5.  XMP-xmp:NewXMPxmpTag
#                   6.  XMP-exif:GPSPitch
#                   7.  XMP-exif:GPSRoll
#                   8.  XMP-xxx:NewXMPxxxTag1
#                   9.  XMP-xxx:NewXMPxxxTag2
#                  10.  XMP-xxx:NewXMPxxxTag3
#                  11.  XMP-xxx:NewXMPxxxStruct
#                  12.  PNG:NewPngTag1
#                  13.  PNG:NewPngTag2
#                  14.  PNG:NewPngTag3
#                  15.  MIE-Meta:NewMieTag1
#                  16.  MIE-Test:NewMieTag2
#
#               For detailed information on the definition of tag tables and
#               tag information hashes, see lib/Image/ExifTool/README.
#------------------------------------------------------------------------------

# Shortcut tags are used when extracting information to simplify
# commonly used commands.  They can be used to represent groups
# of tags, or to provide an alias for a tag name.
%Image::ExifTool::UserDefined::Shortcuts = (
    MyShortcut => ['exif:createdate','exposuretime','aperture'],
    MyAlias => 'FocalLengthIn35mmFormat',
);

# NOTE: All tag names used in the following tables are case sensitive.

# The %Image::ExifTool::UserDefined hash defines new tags to be added
# to existing tables.
%Image::ExifTool::UserDefined = (
    # All EXIF tags are added to the Main table, and WriteGroup is used to
    # specify where the tag is written (default is ExifIFD if not specified):
    'Image::ExifTool::Exif::Main' => {
        0xd000 => {
            Name => 'NewEXIFTag',
            Writable => 'int16u',
            WriteGroup => 'IFD0',
        },
        # add more user-defined EXIF tags here...
    },
    # the Geotag feature writes these additional GPS tags if available:
    'Image::ExifTool::GPS::Main' => {
        0xd000 => {
            Name => 'GPSPitch',
            Writable => 'rational64s',
        },
        0xd001 => {
            Name => 'GPSRoll',
            Writable => 'rational64s',
        },
    },
    # IPTC tags are added to a specific record type (ie. application record):
    # (Note: IPTC tag ID's are limited to the range 0-255)
    'Image::ExifTool::IPTC::ApplicationRecord' => {
        160 => {
            Name => 'NewIPTCTag',
            Format => 'string[0,16]',
        },
        # add more user-defined IPTC ApplicationRecord tags here...
    },
    # XMP tags may be added to existing namespaces:
    'Image::ExifTool::XMP::xmp' => {
        NewXMPxmpTag => { Groups => { 2 => 'Author' } },
        # add more user-defined XMP-xmp tags here...
    },
    # special Geotag tags for XMP-exif:
    'Image::ExifTool::XMP::exif' => {
        GPSPitch => { Writable => 'rational', Groups => { 2 => 'Location' } },
        GPSRoll  => { Writable => 'rational', Groups => { 2 => 'Location' } },
    },
    # new XMP namespaces (ie. xxx) must be added to the Main XMP table:
    'Image::ExifTool::XMP::Main' => {
        xxx => { # <-- must be the same as the NAMESPACE prefix
            SubDirectory => {
                TagTable => 'Image::ExifTool::UserDefined::xxx',
                # (see the definition of this table below)
            },
        },
        # add more user-defined XMP namespaces here...
    },
    # new PNG tags are added to the PNG::TextualData table:
    'Image::ExifTool::PNG::TextualData' => {
        NewPngTag1 => { },
        NewPngTag2 => { },
        NewPngTag3 => { },
    },
    # add a new MIE tag (NewMieTag1) and group (MIE-Test) to MIE-Meta
    # (Note: MIE group names must NOT end with a number)
    'Image::ExifTool::MIE::Meta' => {
        NewMieTag1 => {
            Writable => 'rational64u',
            Units => [ 'cm', 'in' ],
        },
        Test => {
            SubDirectory => {
                TagTable => 'Image::ExifTool::UserDefined::MIETest',
                DirName => 'MIE-Test',
            },
        },
    },
    # Composite tags are added to the Composite table:
    'Image::ExifTool::Composite' => {
        # Composite tags are unique:  The Require/Desire elements specify
        # tags that must/may exist, and the keys of these hashes are used as
        # indices in the @val array of the ValueConv expression to access
        # the numerical (-n) values of these tags.  All Require'd tags must
        # exist for the Composite tag to be evaluated.  If no Require'd tags
        # are specified, then at least one of the Desire'd tags must exist.
        # See the Composite table in Image::ExifTool::Exif for more examples,
        # and lib/Image/ExifTool/README for all of the details.
        BaseName => {
            Require => {
                0 => 'FileName',
            },
            # remove the extension from FileName
            ValueConv => '$val[0] =~ /(.*)\./ ? $1 : $val[0]',
        },
        # With many thanks to Phil Harvey
        # Sunday, January 19, 2014, 7:07 PM, VKB
        # breakup date and time
        # see thread: https://exiftool.org/forum/index.php/topic,5560.0.html
        #
        # return the date from a date/time string
        Date => {
                    Require => {
                        0 => 'DateTimeOriginal',
                    },
                    ValueConv => '$val =~ s/ .*//; $val',
                },
                # return the time from a date/time string
                Time => {
                    Require => {
                        0 => 'DateTimeOriginal',
                    },
                    ValueConv => '$val =~ s/.* //; $val',
        },
        #
        # It's all Phil from here
        # the next few examples demonstrate simplifications which may be
        # used if only one tag is Require'd or Desire'd:
        # 1) the Require lookup may be replaced with a simple tag name
        # 2) "$val" may be used to represent "$val[0]" in the expression
        FileExtension => {
            Require => 'FileName',
            ValueConv => '$val=~/\.([^.]*)$/; $1',
        },
        # override CircleOfConfusion tag to use D/1750 instead of D/1440
        CircleOfConfusion => {
            Require => 'ScaleFactor35efl',
            Groups => { 2 => 'Camera' },
            ValueConv => 'sqrt(24*24+36*36) / ($val * 1750)',
            # an optional PrintConv may be used to format the value
            PrintConv => 'sprintf("%.3f mm",$val)',
        },
        # generate a description for this file type
        FileTypeDescription => {
            Require => 'FileType',
            ValueConv => 'GetFileType($val,1) || $val',
        },
        # calculate physical image size based on resolution
        PhysicalImageSize => {
            Require => {
                0 => 'ImageWidth',
                1 => 'ImageHeight',
                2 => 'XResolution',
                3 => 'YResolution',
                4 => 'ResolutionUnit',
            },
            ValueConv => '$val[0]/$val[2] . " " . $val[1]/$val[3]',
            # (the @prt array contains print-formatted values)
            PrintConv => 'sprintf("%.1fx%.1f $prt[4]", split(" ",$val))',
        },
        # [advanced] select largest JPEG preview image
        BigImage => {
            Desire => {
                0 => 'JpgFromRaw',
                1 => 'PreviewImage',
                2 => 'OtherImage',
                # (DNG and A100 ARW may be have 2 PreviewImage's)
                3 => 'PreviewImage (1)',
            },
            # ValueConv may also be a code reference
            # Inputs: 0) reference to list of values, 1) ExifTool object
            ValueConv => sub {
                my $val = shift;
                my ($image, $bigImage, $len, $bigLen);
                foreach $image (@$val) {
                    next unless ref $image eq 'SCALAR';
                    # check for JPEG image (or "Binary data" if -b not used)
                    next unless $$image =~ /^(\xff\xd8\xff|Binary data (\d+))/;
                    $len = $2 || length $$image; # get image length
                    # save largest image
                    next if defined $bigLen and $bigLen >= $len;
                    $bigLen = $len;
                    $bigImage = $image;
                }
                return $bigImage;
            },
        },
    },
);

# This is a basic example of the definition for a new XMP namespace.
# This table is referenced through a SubDirectory tag definition
# in the %Image::ExifTool::UserDefined definition above.
# The namespace prefix for these tags is 'xxx', which corresponds to
# an ExifTool family 1 group name of 'XMP-xxx'.
%Image::ExifTool::UserDefined::xxx = (
    GROUPS        => { 0 => 'XMP', 1 => 'XMP-xxx', 2 => 'Image' },
    NAMESPACE     => { 'xxx' => 'http://ns.myname.com/xxx/1.0/' },
    WRITABLE      => 'string',
    # replace "NewXMPxxxTag1" with your own tag name (ie. "MyTag")
    NewXMPxxxTag1 => { Writable => 'lang-alt' },
    NewXMPxxxTag2 => { Groups => { 2 => 'Author' } },
    NewXMPxxxTag3 => { List => 'Bag' },
    # example structured XMP tag
    NewXMPxxxStruct => {
        # the "Struct" entry defines the structure fields
        Struct => {
            # optional namespace prefix and URI for structure fields
            # (required only if different than NAMESPACE above)
            NAMESPACE => { 'test' => 'http://x.y.z/test/' },
            # optional structure name (used for warning messages only)
            STRUCT_NAME => 'MyStruct',
            # optional rdf:type property for the structure
            TYPE => 'http://x.y.z/test/xystruct',
            # structure field definitions (very similar to tag definitions)
            X => { Writable => 'integer' },
            Y => { Writable => 'integer' },
            # a nested structure...
            Things => {
                List => 'Bag',
                Struct => {
                    NAMESPACE => { thing => 'http://x.y.z/thing/' },
                    What  => { },
                    Where => { },
                },
            },
        },
        List => 'Seq', # structures may also be elements of a list
    },
    # Each field in the structure has an automatically-generated
    # corresponding flattened tag with an ID that is the concatenation
    # of the original structure tag ID and the field name (after
    # capitalizing the first letter of the field name if necessary).
    # The Name and/or Description of these flattened tags may be changed
    # if desired, but all other tag properties are taken from the
    # structure field definition.  When this is done, the "Flat" flag
    # must also be set in the tag definition.  For example:
    NewXMPxxxStructX => { Name => 'SomeOtherName', Flat => 1 },
);

# Adding a new MIE group requires a few extra definitions
use Image::ExifTool::MIE;
%Image::ExifTool::UserDefined::MIETest = (
    %Image::ExifTool::MIE::tableDefaults,   # default MIE table entries
    GROUPS      => { 0 => 'MIE', 1 => 'MIE-Test', 2 => 'Document' },
    WRITE_GROUP => 'MIE-Test',
    NewMieTag2  => { },     # new user-defined tag in MIE-Test group
);

# A special 'Lenses' list can be defined to give priority to specific lenses
# in the logic to determine a lens model for the Composite:LensID tag
@Image::ExifTool::UserDefined::Lenses = (
    'Sigma AF 10-20mm F4-5.6 EX DC',
    'Tokina AF193-2 19-35mm f/3.5-4.5',
);

# Specify default ExifTool option values
# (see the Options function documentation for available options)
%Image::ExifTool::UserDefined::Options = (
    CoordFormat => '%.6f',  # change default GPS coordinate format
    Duplicates => 1,        # make -a default for the exiftool app
    GeoMaxHDOP => 4,        # ignore GPS fixes with HDOP > 4
);

#------------------------------------------------------------------------------
1;  #end

C:\ExifTool>

Phil Harvey

... and I take it the "exiftool" command still gave the "Config file not found" error?

What version of exiftool are you using, btw?  (type "exiftool -ver")

- Phil
...where DIR is the name of a directory/folder containing the images.  On Mac/Linux/PowerShell, use single quotes (') instead of double quotes (") around arguments containing a dollar sign ($).

kbellis


Phil Harvey

This is getting silly.

OK.  Try just parsing the config file with exiftool (no -config option):

exiftool CONFIGFILE

ExifTool should at least return some system information about the file.

If it can find the file like this, then it should be able to find it as part of the -config option.  If it can't then there is something deeper going on.

- Phil
...where DIR is the name of a directory/folder containing the images.  On Mac/Linux/PowerShell, use single quotes (') instead of double quotes (") around arguments containing a dollar sign ($).

kbellis

Good test - another clue .. though I'm not exactly sure what to make of it:
Microsoft Windows [Version 6.1.7601]
Copyright (c) 2009 Microsoft Corporation.  All rights reserved.

C:\ExifTool>exiftool .ExifTool_config
ExifTool Version Number         : 9.46
File Name                       : .ExifTool_config
Directory                       : .
File Size                       : 14 kB
File Modification Date/Time     : 2014:01:20 16:50:54-05:00
File Access Date/Time           : 2014:01:20 16:50:54-05:00
File Creation Date/Time         : 2014:01:20 16:50:54-05:00
File Permissions                : rw-rw-rw-
Error                           : Unknown file type
Base Name                       :
File Extension                  : ExifTool_config

C:\ExifTool>

kbellis

Phil,

Is it permissible to use the -config argument for anything other than .ExifTool_config; say for example:
exiftool -config date_time_config

I woke up thinking about ExifTool deciding the what I've been using was "unknown" and wondering, what if I just start from scratch?

Along the same line of starting fresh, I tried this:
echo "BaseName<tab>ShutterSpeed<tab>Aperture<tab>ISO" > %1\out.txt
C:\ExifTool\exiftool -config C:\ExifTool\Image-ExifTool-946\config_files\.ExifTool_config -T -r -n -basename -dateTimeOriginal -shutterspeedvalue -aperturevalue -ISO %1 >> %1\out.txt


That's the original factory default version without any of my hacks.

Eureka! It worked!!!

Okay, so the next thing then using TextPad was to shoehorn in the hack:

# With many thanks to Phil Harvey
# Tuesday, January 21, 2014, 6:16 AM, VKB
# breakup date and time
# see thread: https://exiftool.org/forum/index.php/topic,5560.0.html
#
# return the date from a date/time string
Date => {
    Require => {
                0 => 'DateTimeOriginal',
            },
    ValueConv => '$val =~ s/ .*//; $val',
        },
        # return the time from a date/time string
Time => {
    Require => {
                0 => 'DateTimeOriginal',
            },
    ValueConv => '$val =~ s/.* //; $val',
},
#       
        # It's all Phil from here


But not alter the calls in the bat just to see if that hack fetched things up - it didn't; it also ran perfectly.

Now to try using the revised bat with the calls to the two hacked arguments:
echo "BaseName<tab>Date<tab>Time<tab>ShutterSpeed<tab>Aperture<tab>ISO" > %1\out.txt
C:\ExifTool\exiftool -config C:\ExifTool\Image-ExifTool-946\config_files\.ExifTool_config -T -r -n -basename -date -time -shutterspeedvalue -aperturevalue -ISO %1 >> %1\out.txt


Oh, and look at that; it works great!

As for what in the heck was going on... man, I have no clue and truth be told I don't care to get into the necropsy; however, an explicit path beyond the home directory of exiftool may help in pinning down the reason for the issue.

Bottom line, thanks for being here and for the marvelous support on top of making this totally awesome tool!

Now onto the next custom tags!
Day_to_x
EV_base
EV_ISO
EV_to_y


But I'll save that for another thread ;)


Kind regards,

Kelly



Phil Harvey

Hi Kelly,

I'm glad you got it working, although we really still don't know what the problem was.  I thought the problem was likely due to file permissions, but the exiftool output shows that you do have read permissions for the file.

Anyway, it works now.  Good work.

- Phil
...where DIR is the name of a directory/folder containing the images.  On Mac/Linux/PowerShell, use single quotes (') instead of double quotes (") around arguments containing a dollar sign ($).

kbellis

QuoteAs for what in the heck was going on... man, I have no clue and truth be told I don't care...

I guess I lied  ::)

Still thinking about this, I tried another experiment with the working config copied to the home directory c:\ExifTool and then calling for it without thinking that I had to call for its complete path since it was in the same directory - Nope, didn't work. But adding the call for the full path - worked fine.

Go figyah.

And props to our youngest son for the suggestion on our way back to UMF yesterday  :)

Phil Harvey

Yes, you need to specify the path if the directory is different from the current working directory.  (The "pwd" command will print the current working directory.)

But this doesn't explain the problem because the path must also be specified for the "type" command we tried, unless you were running these commands from different working directories (which would sort of defeat the point of this test).

- Phil
...where DIR is the name of a directory/folder containing the images.  On Mac/Linux/PowerShell, use single quotes (') instead of double quotes (") around arguments containing a dollar sign ($).

kbellis

pwd is not recognized

Yes.. it's still a mystery, just ain't gnawing away as much ;)

Phil Harvey

Hmmm.  I thought that "pwd" worked in Windows too, but I guess not.  Googling this, just typing "cd" with no arguments should work.

- Phil
...where DIR is the name of a directory/folder containing the images.  On Mac/Linux/PowerShell, use single quotes (') instead of double quotes (") around arguments containing a dollar sign ($).

kbellis

Okay..

Microsoft Windows [Version 6.1.7601]
Copyright (c) 2009 Microsoft Corporation.  All rights reserved.

C:\ExifTool>pwd
'pwd' is not recognized as an internal or external command,
operable program or batch file.

C:\ExifTool>exiftool pwd
File not found: pwd

C:\ExifTool>cd
C:\ExifTool

C:\ExifTool>