|
Packit |
01d647 |
// ***************************************************************** -*- C++ -*-
|
|
Packit |
01d647 |
/*
|
|
Packit |
01d647 |
* Copyright (C) 2009 Brad Schick <schickb@gmail.com>
|
|
Packit |
01d647 |
*
|
|
Packit |
01d647 |
* This file is part of the organize tool.
|
|
Packit |
01d647 |
*
|
|
Packit |
01d647 |
* This program is free software; you can redistribute it and/or
|
|
Packit |
01d647 |
* modify it under the terms of the GNU General Public License
|
|
Packit |
01d647 |
* as published by the Free Software Foundation; either version 2
|
|
Packit |
01d647 |
* of the License, or (at your option) any later version.
|
|
Packit |
01d647 |
*
|
|
Packit |
01d647 |
* This program is distributed in the hope that it will be useful,
|
|
Packit |
01d647 |
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit |
01d647 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
Packit |
01d647 |
* GNU General Public License for more details.
|
|
Packit |
01d647 |
*
|
|
Packit |
01d647 |
* You should have received a copy of the GNU General Public License
|
|
Packit |
01d647 |
* along with this program; if not, write to the Free Software
|
|
Packit |
01d647 |
* Foundation, Inc., 51 Franklin Street, 5th Floor, Boston, MA 02110-1301 USA.
|
|
Packit |
01d647 |
*/
|
|
Packit |
01d647 |
/*
|
|
Packit |
01d647 |
File: helpers.cpp
|
|
Packit |
01d647 |
Author(s): Brad Schick (brad) <schickb@gmail.com>
|
|
Packit |
01d647 |
History: 19-Jan-09, brad: created
|
|
Packit |
01d647 |
*/
|
|
Packit |
01d647 |
// *****************************************************************************
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
#include <boost/algorithm/string.hpp>
|
|
Packit |
01d647 |
#include <boost/regex.hpp>
|
|
Packit |
01d647 |
#include <boost/format.hpp>
|
|
Packit |
01d647 |
#include <boost/lexical_cast.hpp>
|
|
Packit |
01d647 |
#include <exiv2/image.hpp>
|
|
Packit |
01d647 |
#include <exiv2/easyaccess.hpp>
|
|
Packit |
01d647 |
#include <exiv2/exif.hpp>
|
|
Packit |
01d647 |
#include <exiv2/iptc.hpp>
|
|
Packit |
01d647 |
#include <exiv2/tags.hpp>
|
|
Packit |
01d647 |
//#include <exiv2/xmp.hpp>
|
|
Packit |
01d647 |
#include <cassert>
|
|
Packit |
01d647 |
#include <sstream>
|
|
Packit |
01d647 |
#include <ctime>
|
|
Packit |
01d647 |
#include "helpers.hpp"
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
#define BOOST_FILESYSTEM_NO_DEPRECATED
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
namespace fs = boost::filesystem;
|
|
Packit |
01d647 |
typedef Exiv2::ExifData::const_iterator (*EasyAccessFct)(const Exiv2::ExifData& ed);
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
std::string scrub(const std::string &dirty, bool strip_space = false)
|
|
Packit |
01d647 |
{
|
|
Packit |
01d647 |
std::string scrub = boost::trim_copy(dirty);
|
|
Packit |
01d647 |
if(strip_space) {
|
|
Packit |
01d647 |
boost::regex space("\\s");
|
|
Packit |
01d647 |
scrub = boost::regex_replace(scrub, space, "");
|
|
Packit |
01d647 |
}
|
|
Packit |
01d647 |
boost::regex dash("[:/\\\\|<>]");
|
|
Packit |
01d647 |
boost::regex under("[\"'\\[\\]\\{\\}#=%\\$\\?,\\+\\*]");
|
|
Packit |
01d647 |
scrub = boost::regex_replace(scrub, dash, "-");
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
return boost::regex_replace(scrub, under, "_");
|
|
Packit |
01d647 |
}
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
bool exif_data(const Exiv2::Image *image, const char *key, Exiv2::ExifData::const_iterator &md)
|
|
Packit |
01d647 |
{
|
|
Packit |
01d647 |
assert(image && key);
|
|
Packit |
01d647 |
bool ok = false;
|
|
Packit |
01d647 |
try {
|
|
Packit |
01d647 |
const Exiv2::ExifData &exifData = image->exifData();
|
|
Packit |
01d647 |
Exiv2::ExifKey exifKey(key);
|
|
Packit |
01d647 |
md = exifData.findKey(exifKey);
|
|
Packit |
01d647 |
if(md != exifData.end() && md->typeId() != Exiv2::undefined)
|
|
Packit |
01d647 |
ok = true;
|
|
Packit |
01d647 |
}
|
|
Packit |
01d647 |
catch(const Exiv2::AnyError&) {
|
|
Packit |
01d647 |
}
|
|
Packit |
01d647 |
return ok;
|
|
Packit |
01d647 |
}
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
bool exif_data_easy(const Exiv2::Image *image, EasyAccessFct easy, Exiv2::ExifData::const_iterator &md)
|
|
Packit |
01d647 |
{
|
|
Packit |
01d647 |
assert(image && easy);
|
|
Packit |
01d647 |
bool ok = false;
|
|
Packit |
01d647 |
try {
|
|
Packit |
01d647 |
const Exiv2::ExifData &exifData = image->exifData();
|
|
Packit |
01d647 |
md = easy(exifData);
|
|
Packit |
01d647 |
if(md != exifData.end() && md->typeId() != Exiv2::undefined)
|
|
Packit |
01d647 |
ok = true;
|
|
Packit |
01d647 |
}
|
|
Packit |
01d647 |
catch(const Exiv2::AnyError&) {
|
|
Packit |
01d647 |
}
|
|
Packit |
01d647 |
return ok;
|
|
Packit |
01d647 |
}
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
bool iptc_data(const Exiv2::Image *image, const char *key, Exiv2::IptcData::const_iterator &md)
|
|
Packit |
01d647 |
{
|
|
Packit |
01d647 |
bool ok = false;
|
|
Packit |
01d647 |
assert(image && key);
|
|
Packit |
01d647 |
try {
|
|
Packit |
01d647 |
const Exiv2::IptcData &iptcData = image->iptcData();
|
|
Packit |
01d647 |
Exiv2::IptcKey iptcKey(key);
|
|
Packit |
01d647 |
md = iptcData.findKey(iptcKey);
|
|
Packit |
01d647 |
if(md != iptcData.end() && md->typeId() != Exiv2::undefined)
|
|
Packit |
01d647 |
ok = true;
|
|
Packit |
01d647 |
}
|
|
Packit |
01d647 |
catch(const Exiv2::AnyError&) {
|
|
Packit |
01d647 |
}
|
|
Packit |
01d647 |
return ok;
|
|
Packit |
01d647 |
}
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
std::string exif_date(const Exiv2::Image *image, const fs::path &)
|
|
Packit |
01d647 |
{
|
|
Packit |
01d647 |
Exiv2::ExifData::const_iterator md;
|
|
Packit |
01d647 |
bool done = exif_data(image, "Exif.Photo.DateTimeDigitized", md);
|
|
Packit |
01d647 |
if(!done)
|
|
Packit |
01d647 |
done = exif_data(image, "Exif.Photo.DateTimeOriginal", md);
|
|
Packit |
01d647 |
if(!done)
|
|
Packit |
01d647 |
return "";
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
std::string date = scrub(md->print().substr(0,10));
|
|
Packit |
01d647 |
// Some files have zeros for dates, just fail in that case
|
|
Packit |
01d647 |
if(boost::lexical_cast<int>(date.substr(0,4))==0)
|
|
Packit |
01d647 |
return "";
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
return date;
|
|
Packit |
01d647 |
}
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
std::string exif_year(const Exiv2::Image *image, const fs::path &path)
|
|
Packit |
01d647 |
{
|
|
Packit |
01d647 |
std::string date = exif_date(image, path);
|
|
Packit |
01d647 |
if(date.length())
|
|
Packit |
01d647 |
return date.substr(0,4);
|
|
Packit |
01d647 |
else
|
|
Packit |
01d647 |
return date;
|
|
Packit |
01d647 |
}
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
std::string exif_month(const Exiv2::Image *image, const fs::path &path)
|
|
Packit |
01d647 |
{
|
|
Packit |
01d647 |
std::string date = exif_date(image, path);
|
|
Packit |
01d647 |
if(date.length())
|
|
Packit |
01d647 |
return date.substr(5,2);
|
|
Packit |
01d647 |
else
|
|
Packit |
01d647 |
return date;
|
|
Packit |
01d647 |
}
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
std::string exif_day(const Exiv2::Image *image, const fs::path &path)
|
|
Packit |
01d647 |
{
|
|
Packit |
01d647 |
std::string date = exif_date(image, path);
|
|
Packit |
01d647 |
if(date.length())
|
|
Packit |
01d647 |
return date.substr(8,2);
|
|
Packit |
01d647 |
else
|
|
Packit |
01d647 |
return date;
|
|
Packit |
01d647 |
}
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
bool iptc_get_date(const Exiv2::Image *image, Exiv2::DateValue::Date &date)
|
|
Packit |
01d647 |
{
|
|
Packit |
01d647 |
Exiv2::IptcData::const_iterator md;
|
|
Packit |
01d647 |
bool done = iptc_data(image, "Iptc.Application2.DigitizationDate", md);
|
|
Packit |
01d647 |
if(!done)
|
|
Packit |
01d647 |
done = iptc_data(image, "Iptc.Application2.DateCreated", md);
|
|
Packit |
01d647 |
if(!done)
|
|
Packit |
01d647 |
return false;
|
|
Packit |
01d647 |
date = ((Exiv2::DateValue*)md->getValue().get())->getDate();
|
|
Packit |
01d647 |
return date.year > 0;
|
|
Packit |
01d647 |
}
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
std::string iptc_date(const Exiv2::Image *image, const fs::path &)
|
|
Packit |
01d647 |
{
|
|
Packit |
01d647 |
Exiv2::DateValue::Date date;
|
|
Packit |
01d647 |
if(iptc_get_date(image, date))
|
|
Packit |
01d647 |
return str(boost::format("%4d-%02d-%02d") % date.year % date.month % date.day);
|
|
Packit |
01d647 |
else
|
|
Packit |
01d647 |
return "";
|
|
Packit |
01d647 |
}
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
std::string iptc_year(const Exiv2::Image *image, const fs::path &)
|
|
Packit |
01d647 |
{
|
|
Packit |
01d647 |
Exiv2::DateValue::Date date;
|
|
Packit |
01d647 |
if(iptc_get_date(image, date))
|
|
Packit |
01d647 |
return str(boost::format("%4d") % date.year);
|
|
Packit |
01d647 |
else
|
|
Packit |
01d647 |
return "";
|
|
Packit |
01d647 |
}
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
std::string iptc_month(const Exiv2::Image *image, const fs::path &)
|
|
Packit |
01d647 |
{
|
|
Packit |
01d647 |
Exiv2::DateValue::Date date;
|
|
Packit |
01d647 |
if(iptc_get_date(image, date))
|
|
Packit |
01d647 |
return str(boost::format("%02d") % date.month);
|
|
Packit |
01d647 |
else
|
|
Packit |
01d647 |
return "";
|
|
Packit |
01d647 |
}
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
std::string iptc_day(const Exiv2::Image *image, const fs::path &)
|
|
Packit |
01d647 |
{
|
|
Packit |
01d647 |
Exiv2::DateValue::Date date;
|
|
Packit |
01d647 |
if(iptc_get_date(image, date))
|
|
Packit |
01d647 |
return str(boost::format("%02d") % date.day);
|
|
Packit |
01d647 |
else
|
|
Packit |
01d647 |
return "";
|
|
Packit |
01d647 |
}
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
bool file_get_tm(const fs::path &path, std::tm &tm)
|
|
Packit |
01d647 |
{
|
|
Packit |
01d647 |
std::time_t timer = fs::last_write_time(path);
|
|
Packit |
01d647 |
if(time > 0) {
|
|
Packit |
01d647 |
tm = *localtime(&timer;;
|
|
Packit |
01d647 |
return true;
|
|
Packit |
01d647 |
}
|
|
Packit |
01d647 |
else {
|
|
Packit |
01d647 |
return false;
|
|
Packit |
01d647 |
}
|
|
Packit |
01d647 |
}
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
std::string file_date(const Exiv2::Image *, const fs::path &path)
|
|
Packit |
01d647 |
{
|
|
Packit |
01d647 |
std::tm tm;
|
|
Packit |
01d647 |
if(file_get_tm(path, tm))
|
|
Packit |
01d647 |
return str(boost::format("%4d-%02d-%02d") % (tm.tm_year + 1900) % (tm.tm_mon + 1) % tm.tm_mday);
|
|
Packit |
01d647 |
else
|
|
Packit |
01d647 |
return "";
|
|
Packit |
01d647 |
}
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
std::string file_year(const Exiv2::Image *, const fs::path &path)
|
|
Packit |
01d647 |
{
|
|
Packit |
01d647 |
std::tm tm;
|
|
Packit |
01d647 |
if(file_get_tm(path, tm))
|
|
Packit |
01d647 |
return str(boost::format("%4d") % (tm.tm_year + 1900));
|
|
Packit |
01d647 |
else
|
|
Packit |
01d647 |
return "";
|
|
Packit |
01d647 |
}
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
std::string file_month(const Exiv2::Image *, const fs::path &path)
|
|
Packit |
01d647 |
{
|
|
Packit |
01d647 |
std::tm tm;
|
|
Packit |
01d647 |
if(file_get_tm(path, tm))
|
|
Packit |
01d647 |
return str(boost::format("%02d") % (tm.tm_mon + 1));
|
|
Packit |
01d647 |
else
|
|
Packit |
01d647 |
return "";
|
|
Packit |
01d647 |
}
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
std::string file_day(const Exiv2::Image *, const fs::path &path)
|
|
Packit |
01d647 |
{
|
|
Packit |
01d647 |
std::tm tm;
|
|
Packit |
01d647 |
if(file_get_tm(path, tm))
|
|
Packit |
01d647 |
return str(boost::format("%02d") % tm.tm_mday);
|
|
Packit |
01d647 |
else
|
|
Packit |
01d647 |
return "";
|
|
Packit |
01d647 |
}
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
/*
|
|
Packit |
01d647 |
std::string xmp_date(const Exiv2::Image *image, const fs::path &)
|
|
Packit |
01d647 |
{
|
|
Packit |
01d647 |
return "";
|
|
Packit |
01d647 |
}
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
std::string xmp_year(const Exiv2::Image *image, const fs::path &)
|
|
Packit |
01d647 |
{
|
|
Packit |
01d647 |
return "";
|
|
Packit |
01d647 |
}
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
std::string xmp_month(const Exiv2::Image *image, const fs::path &)
|
|
Packit |
01d647 |
{
|
|
Packit |
01d647 |
return "";
|
|
Packit |
01d647 |
}
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
std::string xmp_day(const Exiv2::Image *image, const fs::path &)
|
|
Packit |
01d647 |
{
|
|
Packit |
01d647 |
return "";
|
|
Packit |
01d647 |
}*/
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
std::string exif_time(const Exiv2::Image *image, const fs::path &)
|
|
Packit |
01d647 |
{
|
|
Packit |
01d647 |
Exiv2::ExifData::const_iterator md;
|
|
Packit |
01d647 |
bool done = exif_data(image, "Exif.Photo.DateTimeDigitized", md);
|
|
Packit |
01d647 |
if(!done)
|
|
Packit |
01d647 |
done = exif_data(image, "Exif.Photo.DateTimeOriginal", md);
|
|
Packit |
01d647 |
if(!done)
|
|
Packit |
01d647 |
return "";
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
std::string datetime = md->print();
|
|
Packit |
01d647 |
// Some files have zeros for dates, just fail in that case
|
|
Packit |
01d647 |
if(boost::lexical_cast<int>(datetime.substr(0,4)) == 0)
|
|
Packit |
01d647 |
return "";
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
return scrub(datetime.substr(11));
|
|
Packit |
01d647 |
}
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
std::string exif_hour(const Exiv2::Image *image, const fs::path &path)
|
|
Packit |
01d647 |
{
|
|
Packit |
01d647 |
std::string time = exif_time(image, path);
|
|
Packit |
01d647 |
if(time.length())
|
|
Packit |
01d647 |
return time.substr(0,2);
|
|
Packit |
01d647 |
else
|
|
Packit |
01d647 |
return time;
|
|
Packit |
01d647 |
}
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
std::string exif_minute(const Exiv2::Image *image, const fs::path &path)
|
|
Packit |
01d647 |
{
|
|
Packit |
01d647 |
std::string time = exif_time(image, path);
|
|
Packit |
01d647 |
if(time.length())
|
|
Packit |
01d647 |
return time.substr(3,2);
|
|
Packit |
01d647 |
else
|
|
Packit |
01d647 |
return time;
|
|
Packit |
01d647 |
}
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
std::string exif_second(const Exiv2::Image *image, const fs::path &path)
|
|
Packit |
01d647 |
{
|
|
Packit |
01d647 |
std::string time = exif_time(image, path);
|
|
Packit |
01d647 |
if(time.length())
|
|
Packit |
01d647 |
return time.substr(6,2);
|
|
Packit |
01d647 |
else
|
|
Packit |
01d647 |
return time;
|
|
Packit |
01d647 |
}
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
bool iptc_get_time(const Exiv2::Image *image, Exiv2::TimeValue::Time &time)
|
|
Packit |
01d647 |
{
|
|
Packit |
01d647 |
Exiv2::IptcData::const_iterator md;
|
|
Packit |
01d647 |
bool done = iptc_data(image, "Iptc.Application2.DigitizationTime", md);
|
|
Packit |
01d647 |
if(!done)
|
|
Packit |
01d647 |
done = iptc_data(image, "Iptc.Application2.TimeCreated", md);
|
|
Packit |
01d647 |
if(!done)
|
|
Packit |
01d647 |
return false;
|
|
Packit |
01d647 |
time = ((Exiv2::TimeValue*)md->getValue().get())->getTime();
|
|
Packit |
01d647 |
// Zero is a valid time, so this one is hard to check.
|
|
Packit |
01d647 |
return true;
|
|
Packit |
01d647 |
}
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
std::string iptc_time(const Exiv2::Image *image, const fs::path &)
|
|
Packit |
01d647 |
{
|
|
Packit |
01d647 |
Exiv2::TimeValue::Time time;
|
|
Packit |
01d647 |
if(iptc_get_time(image, time))
|
|
Packit |
01d647 |
return str(boost::format("%02d-%02d-%02d") % time.hour % time.minute % time.second);
|
|
Packit |
01d647 |
else
|
|
Packit |
01d647 |
return "";
|
|
Packit |
01d647 |
}
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
std::string iptc_hour(const Exiv2::Image *image, const fs::path &)
|
|
Packit |
01d647 |
{
|
|
Packit |
01d647 |
Exiv2::TimeValue::Time time;
|
|
Packit |
01d647 |
if(iptc_get_time(image, time))
|
|
Packit |
01d647 |
return str(boost::format("%02d") % time.hour);
|
|
Packit |
01d647 |
else
|
|
Packit |
01d647 |
return "";
|
|
Packit |
01d647 |
}
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
std::string iptc_minute(const Exiv2::Image *image, const fs::path &)
|
|
Packit |
01d647 |
{
|
|
Packit |
01d647 |
Exiv2::TimeValue::Time time;
|
|
Packit |
01d647 |
if(iptc_get_time(image, time))
|
|
Packit |
01d647 |
return str(boost::format("%02d") % time.minute);
|
|
Packit |
01d647 |
else
|
|
Packit |
01d647 |
return "";
|
|
Packit |
01d647 |
}
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
std::string iptc_second(const Exiv2::Image *image, const fs::path &)
|
|
Packit |
01d647 |
{
|
|
Packit |
01d647 |
Exiv2::TimeValue::Time time;
|
|
Packit |
01d647 |
if(iptc_get_time(image, time))
|
|
Packit |
01d647 |
return str(boost::format("%02d") % time.second);
|
|
Packit |
01d647 |
else
|
|
Packit |
01d647 |
return "";
|
|
Packit |
01d647 |
}
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
std::string file_time(const Exiv2::Image *, const fs::path &path)
|
|
Packit |
01d647 |
{
|
|
Packit |
01d647 |
std::tm tm;
|
|
Packit |
01d647 |
if(file_get_tm(path, tm))
|
|
Packit |
01d647 |
return str(boost::format("%02d-%02d-%02d") % tm.tm_hour % tm.tm_min % tm.tm_sec);
|
|
Packit |
01d647 |
else
|
|
Packit |
01d647 |
return "";
|
|
Packit |
01d647 |
}
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
std::string file_hour(const Exiv2::Image *, const fs::path &path)
|
|
Packit |
01d647 |
{
|
|
Packit |
01d647 |
std::tm tm;
|
|
Packit |
01d647 |
if(file_get_tm(path, tm))
|
|
Packit |
01d647 |
return str(boost::format("%02d") % tm.tm_hour);
|
|
Packit |
01d647 |
else
|
|
Packit |
01d647 |
return "";
|
|
Packit |
01d647 |
}
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
std::string file_minute(const Exiv2::Image *, const fs::path &path)
|
|
Packit |
01d647 |
{
|
|
Packit |
01d647 |
std::tm tm;
|
|
Packit |
01d647 |
if(file_get_tm(path, tm))
|
|
Packit |
01d647 |
return str(boost::format("%02d") % tm.tm_min);
|
|
Packit |
01d647 |
else
|
|
Packit |
01d647 |
return "";
|
|
Packit |
01d647 |
}
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
std::string file_second(const Exiv2::Image *, const fs::path &path)
|
|
Packit |
01d647 |
{
|
|
Packit |
01d647 |
std::tm tm;
|
|
Packit |
01d647 |
if(file_get_tm(path, tm))
|
|
Packit |
01d647 |
return str(boost::format("%02d") % tm.tm_sec);
|
|
Packit |
01d647 |
else
|
|
Packit |
01d647 |
return "";
|
|
Packit |
01d647 |
}
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
/*std::string xmp_time(const Exiv2::Image *image, const fs::path &)
|
|
Packit |
01d647 |
{
|
|
Packit |
01d647 |
return "";
|
|
Packit |
01d647 |
}
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
std::string xmp_hour(const Exiv2::Image *image, const fs::path &)
|
|
Packit |
01d647 |
{
|
|
Packit |
01d647 |
return "";
|
|
Packit |
01d647 |
}
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
std::string xmp_minute(const Exiv2::Image *image, const fs::path &)
|
|
Packit |
01d647 |
{
|
|
Packit |
01d647 |
return "";
|
|
Packit |
01d647 |
}
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
std::string xmp_second(const Exiv2::Image *image, const fs::path &)
|
|
Packit |
01d647 |
{
|
|
Packit |
01d647 |
return "";
|
|
Packit |
01d647 |
}*/
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
std::string exif_dimension(const Exiv2::Image *image, const fs::path &path)
|
|
Packit |
01d647 |
{
|
|
Packit |
01d647 |
return exif_width(image, path) + "-" + exif_height(image, path);
|
|
Packit |
01d647 |
}
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
std::string exif_width(const Exiv2::Image *image, const fs::path &)
|
|
Packit |
01d647 |
{
|
|
Packit |
01d647 |
Exiv2::ExifData::const_iterator md;
|
|
Packit |
01d647 |
bool done = exif_data(image, "Exif.Photo.PixelXDimension", md);
|
|
Packit |
01d647 |
if(!done)
|
|
Packit |
01d647 |
return "";
|
|
Packit |
01d647 |
return scrub(md->print());
|
|
Packit |
01d647 |
}
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
std::string exif_height(const Exiv2::Image *image, const fs::path &)
|
|
Packit |
01d647 |
{
|
|
Packit |
01d647 |
Exiv2::ExifData::const_iterator md;
|
|
Packit |
01d647 |
bool done = exif_data(image, "Exif.Photo.PixelYDimension", md);
|
|
Packit |
01d647 |
if(!done)
|
|
Packit |
01d647 |
return "";
|
|
Packit |
01d647 |
return scrub(md->print());
|
|
Packit |
01d647 |
}
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
std::string file_dimension(const Exiv2::Image *image, const fs::path &path)
|
|
Packit |
01d647 |
{
|
|
Packit |
01d647 |
if(image)
|
|
Packit |
01d647 |
return file_width(image, path) + "-" + file_height(image, path);
|
|
Packit |
01d647 |
else
|
|
Packit |
01d647 |
return "";
|
|
Packit |
01d647 |
}
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
std::string file_width(const Exiv2::Image *image, const fs::path &)
|
|
Packit |
01d647 |
{
|
|
Packit |
01d647 |
if(image)
|
|
Packit |
01d647 |
return str(boost::format("%02d") % image->pixelWidth());
|
|
Packit |
01d647 |
else
|
|
Packit |
01d647 |
return "";
|
|
Packit |
01d647 |
}
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
std::string file_height(const Exiv2::Image *image, const fs::path &)
|
|
Packit |
01d647 |
{
|
|
Packit |
01d647 |
if(image)
|
|
Packit |
01d647 |
return str(boost::format("%02d") % image->pixelHeight());
|
|
Packit |
01d647 |
else
|
|
Packit |
01d647 |
return "";
|
|
Packit |
01d647 |
}
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
/*
|
|
Packit |
01d647 |
std::string xmp_dimension(const Exiv2::Image *image, const fs::path &)
|
|
Packit |
01d647 |
{
|
|
Packit |
01d647 |
return ""
|
|
Packit |
01d647 |
}
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
std::string xmp_width(const Exiv2::Image *image, const fs::path &)
|
|
Packit |
01d647 |
{
|
|
Packit |
01d647 |
return "";
|
|
Packit |
01d647 |
}
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
std::string xmp_height(const Exiv2::Image *image, const fs::path &)
|
|
Packit |
01d647 |
{
|
|
Packit |
01d647 |
return "";
|
|
Packit |
01d647 |
}*/
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
std::string exif_model(const Exiv2::Image *image, const fs::path &)
|
|
Packit |
01d647 |
{
|
|
Packit |
01d647 |
Exiv2::ExifData::const_iterator md;
|
|
Packit |
01d647 |
bool done = exif_data(image, "Exif.Image.Model", md);
|
|
Packit |
01d647 |
if(!done)
|
|
Packit |
01d647 |
return "";
|
|
Packit |
01d647 |
return scrub(md->print());
|
|
Packit |
01d647 |
}
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
std::string exif_make(const Exiv2::Image *image, const fs::path &)
|
|
Packit |
01d647 |
{
|
|
Packit |
01d647 |
Exiv2::ExifData::const_iterator md;
|
|
Packit |
01d647 |
bool done = exif_data(image, "Exif.Image.Make", md);
|
|
Packit |
01d647 |
if(!done)
|
|
Packit |
01d647 |
return "";
|
|
Packit |
01d647 |
return scrub(md->print());
|
|
Packit |
01d647 |
}
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
/*std::string xmp_model(const Exiv2::Image *image, const fs::path &)
|
|
Packit |
01d647 |
{
|
|
Packit |
01d647 |
return "";
|
|
Packit |
01d647 |
}*/
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
std::string exif_speed(const Exiv2::Image *image, const fs::path &)
|
|
Packit |
01d647 |
{
|
|
Packit |
01d647 |
Exiv2::ExifData::const_iterator md;
|
|
Packit |
01d647 |
bool done = exif_data(image, "Exif.Photo.ShutterSpeedValue", md);
|
|
Packit |
01d647 |
if(!done)
|
|
Packit |
01d647 |
done = exif_data(image, "Exif.Photo.ExposureTime", md);
|
|
Packit |
01d647 |
if(!done)
|
|
Packit |
01d647 |
return "";
|
|
Packit |
01d647 |
return scrub(md->print());
|
|
Packit |
01d647 |
}
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
/*std::string xmp_speed(const Exiv2::Image *image, const fs::path &)
|
|
Packit |
01d647 |
{
|
|
Packit |
01d647 |
return "";
|
|
Packit |
01d647 |
}*/
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
std::string exif_aperture(const Exiv2::Image *image, const fs::path &)
|
|
Packit |
01d647 |
{
|
|
Packit |
01d647 |
Exiv2::ExifData::const_iterator md;
|
|
Packit |
01d647 |
bool done = exif_data(image, "Exif.Photo.ApertureValue", md);
|
|
Packit |
01d647 |
if(!done)
|
|
Packit |
01d647 |
done = exif_data(image, "Exif.Photo.FNumber", md);
|
|
Packit |
01d647 |
if(!done)
|
|
Packit |
01d647 |
return "";
|
|
Packit |
01d647 |
return scrub(md->print());
|
|
Packit |
01d647 |
}
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
/*std::string xmp_aperture(const Exiv2::Image *image, const fs::path &)
|
|
Packit |
01d647 |
{
|
|
Packit |
01d647 |
return "";
|
|
Packit |
01d647 |
}*/
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
std::string exif_focal(const Exiv2::Image *image, const fs::path &)
|
|
Packit |
01d647 |
{
|
|
Packit |
01d647 |
Exiv2::ExifData::const_iterator md;
|
|
Packit |
01d647 |
bool done = exif_data(image, "Exif.Photo.FocalLength", md);
|
|
Packit |
01d647 |
if(!done)
|
|
Packit |
01d647 |
return "";
|
|
Packit |
01d647 |
return scrub(md->print());
|
|
Packit |
01d647 |
}
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
/*std::string xmp_focal(const Exiv2::Image *image, const fs::path &)
|
|
Packit |
01d647 |
{
|
|
Packit |
01d647 |
return "";
|
|
Packit |
01d647 |
}*/
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
std::string exif_distance(const Exiv2::Image *image, const fs::path &)
|
|
Packit |
01d647 |
{
|
|
Packit |
01d647 |
Exiv2::ExifData::const_iterator md;
|
|
Packit |
01d647 |
bool done = exif_data(image, "Exif.Photo.SubjectDistance", md);
|
|
Packit |
01d647 |
if(!done)
|
|
Packit |
01d647 |
return "";
|
|
Packit |
01d647 |
return scrub(md->print());
|
|
Packit |
01d647 |
}
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
/*std::string xmp_distance(const Exiv2::Image *image, const fs::path &)
|
|
Packit |
01d647 |
{
|
|
Packit |
01d647 |
return "";
|
|
Packit |
01d647 |
}*/
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
std::string exif_meter(const Exiv2::Image *image, const fs::path &)
|
|
Packit |
01d647 |
{
|
|
Packit |
01d647 |
Exiv2::ExifData::const_iterator md;
|
|
Packit |
01d647 |
bool done = exif_data(image, "Exif.Photo.MeteringMode", md);
|
|
Packit |
01d647 |
if(!done)
|
|
Packit |
01d647 |
return "";
|
|
Packit |
01d647 |
return scrub(md->print());
|
|
Packit |
01d647 |
}
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
std::string exif_macro(const Exiv2::Image *image, const fs::path &)
|
|
Packit |
01d647 |
{
|
|
Packit |
01d647 |
Exiv2::ExifData::const_iterator md;
|
|
Packit |
01d647 |
bool done = exif_data_easy(image, Exiv2::macroMode, md);
|
|
Packit |
01d647 |
if(!done)
|
|
Packit |
01d647 |
return "";
|
|
Packit |
01d647 |
return scrub(md->print());
|
|
Packit |
01d647 |
}
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
std::string exif_orientation(const Exiv2::Image *image, const fs::path &)
|
|
Packit |
01d647 |
{
|
|
Packit |
01d647 |
Exiv2::ExifData::const_iterator md;
|
|
Packit |
01d647 |
bool done = exif_data_easy(image, Exiv2::orientation, md);
|
|
Packit |
01d647 |
if(!done)
|
|
Packit |
01d647 |
return "";
|
|
Packit |
01d647 |
return scrub(md->print(), true);
|
|
Packit |
01d647 |
}
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
std::string exif_lens(const Exiv2::Image *image, const fs::path &)
|
|
Packit |
01d647 |
{
|
|
Packit |
01d647 |
Exiv2::ExifData::const_iterator md;
|
|
Packit |
01d647 |
bool done = exif_data_easy(image, Exiv2::lensName, md);
|
|
Packit |
01d647 |
if(!done)
|
|
Packit |
01d647 |
return "";
|
|
Packit |
01d647 |
return scrub(md->print());
|
|
Packit |
01d647 |
}
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
std::string exif_iso(const Exiv2::Image *image, const fs::path &)
|
|
Packit |
01d647 |
{
|
|
Packit |
01d647 |
Exiv2::ExifData::const_iterator md;
|
|
Packit |
01d647 |
bool done = exif_data_easy(image, Exiv2::isoSpeed, md);
|
|
Packit |
01d647 |
if(!done)
|
|
Packit |
01d647 |
return "";
|
|
Packit |
01d647 |
return scrub(md->print());
|
|
Packit |
01d647 |
}
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
/*std::string xmp_meter(const Exiv2::Image *image, const fs::path &)
|
|
Packit |
01d647 |
{
|
|
Packit |
01d647 |
return "";
|
|
Packit |
01d647 |
}*/
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
std::string exif_keyword(const Exiv2::Image *image, const fs::path &)
|
|
Packit |
01d647 |
{
|
|
Packit |
01d647 |
Exiv2::ExifData::const_iterator md;
|
|
Packit |
01d647 |
bool done = exif_data(image, "Exif.Photo.UserComment", md);
|
|
Packit |
01d647 |
if(!done)
|
|
Packit |
01d647 |
return "";
|
|
Packit |
01d647 |
return scrub(md->print());
|
|
Packit |
01d647 |
}
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
std::string iptc_keyword(const Exiv2::Image *image, const fs::path &)
|
|
Packit |
01d647 |
{
|
|
Packit |
01d647 |
Exiv2::IptcData::const_iterator md;
|
|
Packit |
01d647 |
bool done = iptc_data(image, "Iptc.Application2.Keywords", md);
|
|
Packit |
01d647 |
if(!done)
|
|
Packit |
01d647 |
return "";
|
|
Packit |
01d647 |
return scrub(md->print());
|
|
Packit |
01d647 |
}
|
|
Packit |
01d647 |
|
|
Packit |
01d647 |
/*std::string xmp_keyword(const Exiv2::Image *image, const fs::path &)
|
|
Packit |
01d647 |
{
|
|
Packit |
01d647 |
return "";
|
|
Packit |
01d647 |
}*/
|
|
Packit |
01d647 |
|