diff --git a/ChangeLog b/ChangeLog index 08b07a73..aa38990f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -16162,3 +16162,6 @@ 2017-10-16 Fred Gleason * Fixed a bug in 'RDCut::autoSegue()' that caused an error when setting segues by level [Github issue #000182]. +2017-10-16 Fred Gleason + * Implemented '%k', '%K', '%q' and '%Q' metadata wildcards for + rdimport(1). diff --git a/docs/docbook/rdimport.xml b/docs/docbook/rdimport.xml index 9739fe5f..66da8e55 100644 --- a/docs/docbook/rdimport.xml +++ b/docs/docbook/rdimport.xml @@ -294,6 +294,22 @@ + + %k + + Time component of the cut start date/time, in + format HH:MM:SS + + + + + %K + + Time component of the cut end date/time, in + format HH:MM:SS + + + %l @@ -329,6 +345,29 @@ + + %q + + Date component of the cut start date/time, in + format YYYY-MM-DD + + + + + %Q + + Date component of the cut end date/time, in + format YYYY-MM-DD + + + + + %l + + Album + + + %r diff --git a/docs/metadata_wildcards.txt b/docs/metadata_wildcards.txt index 978417d6..2dd5246b 100644 --- a/docs/metadata_wildcards.txt +++ b/docs/metadata_wildcards.txt @@ -17,13 +17,13 @@ Now Next Field %h %H Event length (in milliseconds) %i %I Cut Description %j %J Cut Number - %k %K [Unassigned] + %k %K Start [%k]/end [%K] time for rdimport(1) [HH:MM:SS] %l %L Album %m %M Composer %n %N The Rivendell cart number %o %O Outcue %p %P Publisher - %q %Q [Unassigned] + %q %Q Start [%q]/end [%Q] date for rdimport(1) [YYYY-MM-DD] %r %R Conductor %s %S Song ID %t %T Title diff --git a/lib/rdwavedata.cpp b/lib/rdwavedata.cpp index c43fb9e8..8ba60a1c 100644 --- a/lib/rdwavedata.cpp +++ b/lib/rdwavedata.cpp @@ -806,6 +806,7 @@ QDate RDWaveData::startDate() const void RDWaveData::setStartDate(const QDate &date) { data_start_date=date; + data_datetime_set=true; } @@ -818,6 +819,13 @@ QTime RDWaveData::startTime() const void RDWaveData::setStartTime(const QTime &time) { data_start_time=time; + data_datetime_set=true; +} + + +QDateTime RDWaveData::startDateTime() const +{ + return QDateTime(data_start_date,data_start_time); } @@ -854,6 +862,7 @@ QDate RDWaveData::endDate() const void RDWaveData::setEndDate(const QDate &date) { data_end_date=date; + data_datetime_set=true; } @@ -866,6 +875,13 @@ QTime RDWaveData::endTime() const void RDWaveData::setEndTime(const QTime &time) { data_end_time=time; + data_datetime_set=true; +} + + +QDateTime RDWaveData::endDateTime() const +{ + return QDateTime(data_end_date,data_end_time); } @@ -929,6 +945,24 @@ void RDWaveData::setPlayGain(int lvl) } +bool RDWaveData::checkDateTimes() +{ + if(data_datetime_set) { + if(startDateTime()name(); found_cart=RunPattern(import_metadata_pattern,RDGetBasePart(filename), wavedata,&groupname); + if(!wavedata->checkDateTimes()) { + PrintLogDateTime(stderr); + fprintf(stderr, + " File \"%s\": End date/time cannot be prior to start date/time, ignoring...\n", + (const char *)filename.utf8()); + } if(groupname!=effective_group->name()) { delete effective_group; effective_group=new RDGroup(groupname); @@ -1652,6 +1658,8 @@ bool MainObject::RunPattern(const QString &pattern,const QString &filename, QString value; QChar delimiter; bool found_cartnum=false; + QTime time; + QDate date; // // Initialize Pattern Parser @@ -1672,85 +1680,117 @@ bool MainObject::RunPattern(const QString &pattern,const QString &filename, if(macro_active) { if((filename.at(i)==delimiter)||(i==filename.length())) { switch(field) { - case 'a': - wavedata->setArtist(value); - wavedata->setMetadataFound(true); - break; + case 'a': + wavedata->setArtist(value); + wavedata->setMetadataFound(true); + break; + + case 'b': + wavedata->setLabel(value); + wavedata->setMetadataFound(true); + break; - case 'b': - wavedata->setLabel(value); - wavedata->setMetadataFound(true); - break; + case 'c': + wavedata->setClient(value); + wavedata->setMetadataFound(true); + break; - case 'c': - wavedata->setClient(value); - wavedata->setMetadataFound(true); - break; + case 'e': + wavedata->setAgency(value); + wavedata->setMetadataFound(true); + break; - case 'e': - wavedata->setAgency(value); - wavedata->setMetadataFound(true); - break; + case 'g': + *groupname=value; + break; - case 'g': - *groupname=value; - break; + case 'i': + wavedata->setDescription(value); + wavedata->setMetadataFound(true); + break; - case 'i': - wavedata->setDescription(value); + case 'k': + time=QTime::fromString(value); + if(time.isValid()) { + wavedata->setStartTime(time); wavedata->setMetadataFound(true); - break; + } + break; - case 'l': - wavedata->setAlbum(value); + case 'K': + time=QTime::fromString(value); + if(time.isValid()) { + wavedata->setEndTime(time); wavedata->setMetadataFound(true); - break; + } + break; - case 'm': - wavedata->setComposer(value); - wavedata->setMetadataFound(true); - break; + case 'l': + wavedata->setAlbum(value); + wavedata->setMetadataFound(true); + break; - case 'n': - wavedata->setCutId(value); - wavedata->setMetadataFound(true); - found_cartnum=true; - break; + case 'm': + wavedata->setComposer(value); + wavedata->setMetadataFound(true); + break; - case 'o': - wavedata->setOutCue(value); - wavedata->setMetadataFound(true); - break; + case 'n': + wavedata->setCutId(value); + wavedata->setMetadataFound(true); + found_cartnum=true; + break; - case 'p': - wavedata->setPublisher(value); - wavedata->setMetadataFound(true); - break; + case 'o': + wavedata->setOutCue(value); + wavedata->setMetadataFound(true); + break; - case 'r': - wavedata->setConductor(value); - wavedata->setMetadataFound(true); - break; + case 'p': + wavedata->setPublisher(value); + wavedata->setMetadataFound(true); + break; - case 's': - wavedata->setTmciSongId(value); + case 'q': + date=QDate::fromString(value,Qt::ISODate); + if(date.isValid()) { + wavedata->setStartDate(date); wavedata->setMetadataFound(true); - break; + } + break; - case 't': - wavedata->setTitle(value); + case 'Q': + date=QDate::fromString(value,Qt::ISODate); + if(date.isValid()) { + wavedata->setEndDate(date); wavedata->setMetadataFound(true); - break; + } + break; - case 'u': - wavedata->setUserDefined(value); - wavedata->setMetadataFound(true); - break; + case 'r': + wavedata->setConductor(value); + wavedata->setMetadataFound(true); + break; - case 'y': - wavedata->setReleaseYear(value.toInt()); - wavedata->setMetadataFound(true); - break; + case 's': + wavedata->setTmciSongId(value); + wavedata->setMetadataFound(true); + break; + + case 't': + wavedata->setTitle(value); + wavedata->setMetadataFound(true); + break; + + case 'u': + wavedata->setUserDefined(value); + wavedata->setMetadataFound(true); + break; + + case 'y': + wavedata->setReleaseYear(value.toInt()); + wavedata->setMetadataFound(true); + break; } value=""; if((ptr>=pattern.length())||(i==filename.length())) { @@ -1792,6 +1832,7 @@ bool MainObject::RunPattern(const QString &pattern,const QString &filename, } } } + return found_cartnum; } @@ -1812,11 +1853,15 @@ bool MainObject::VerifyPattern(const QString &pattern) case 'e': case 'g': case 'i': + case 'k': + case 'K': case 'l': case 'm': case 'n': case 'o': case 'p': + case 'q': + case 'Q': case 'r': case 's': case 't':