From d8636ebb2c58585ef4f774d089accc6dbe9b304b Mon Sep 17 00:00:00 2001 From: Fred Gleason Date: Wed, 13 Jul 2016 10:11:08 -0400 Subject: [PATCH] 2016-07-13 Fred Gleason * Implemented storage of RDXML data structures within a 'rdxl' user defined information frame in ID3 tags 'lib/rdwavefile.cpp' and 'lib/rdaudio_convert.cpp'. --- ChangeLog | 5 +++ lib/rdaudioconvert.cpp | 16 +++++++ lib/rdcart.cpp | 18 +++++++- lib/rdcut.cpp | 76 +++++++++++++++++++------------- lib/rdwavefile.cpp | 99 +++++++++++++++++++++++------------------- web/rdxport/import.cpp | 3 ++ 6 files changed, 141 insertions(+), 76 deletions(-) diff --git a/ChangeLog b/ChangeLog index fdd87787..5bd976d6 100644 --- a/ChangeLog +++ b/ChangeLog @@ -15287,3 +15287,8 @@ 2016-07-12 Fred Gleason * Added support for reading conductor field values (TPE3) from ID3 tags in 'lib/rdwavefile.cpp'. +2016-07-13 Fred Gleason + * Implemented storage of RDXML data structures within a 'rdxl' + user defined information frame in ID3 tags 'lib/rdwavefile.cpp' and + 'lib/rdaudio_convert.cpp'. + diff --git a/lib/rdaudioconvert.cpp b/lib/rdaudioconvert.cpp index 632a3a3b..89476374 100644 --- a/lib/rdaudioconvert.cpp +++ b/lib/rdaudioconvert.cpp @@ -51,6 +51,7 @@ #include #include #include +#include #include #define STAGE2_XFER_SIZE 2048 @@ -1918,6 +1919,11 @@ void RDAudioConvert::ApplyId3Tag(const QString &filename,RDWaveData *wavedata) frame->GetField(ID3FN_TEXT)->Set(wavedata->publisher()); tag->AddNewFrame(frame); } + if(!wavedata->conductor().isEmpty()) { + frame=new ID3_Frame(ID3FID_CONDUCTOR); + frame->GetField(ID3FN_TEXT)->Set(wavedata->conductor()); + tag->AddNewFrame(frame); + } if(!wavedata->isrc().isEmpty()) { frame=new ID3_Frame(ID3FID_ISRC); frame->GetField(ID3FN_TEXT)->Set(wavedata->isrc()); @@ -1929,6 +1935,16 @@ void RDAudioConvert::ApplyId3Tag(const QString &filename,RDWaveData *wavedata) Set(QString().sprintf("%d",wavedata->releaseYear())); tag->AddNewFrame(frame); } + RDCart *cart=new RDCart(wavedata->cartNumber()); + if(cart->exists()) { + QString xml=cart->xml(true,conv_settings,wavedata->cutNumber()); + frame=new ID3_Frame(ID3FID_USERTEXT); + frame->GetField(ID3FN_DESCRIPTION)->Set("rdxl"); + frame->GetField(ID3FN_TEXTENC)->Set(ID3TE_NONE); + frame->GetField(ID3FN_TEXT)->Set(xml); + tag->AddNewFrame(frame); + delete cart; + } tag->Update(); delete tag; } diff --git a/lib/rdcart.cpp b/lib/rdcart.cpp index 07f53c97..57fbe123 100644 --- a/lib/rdcart.cpp +++ b/lib/rdcart.cpp @@ -861,11 +861,25 @@ void RDCart::getMetadata(RDWaveData *data) const QString sql; RDSqlQuery *q; - sql=QString("select TITLE,ARTIST,ALBUM,YEAR,LABEL,CLIENT,")+ - "AGENCY,PUBLISHER,COMPOSER,USER_DEFINED,CONDUCTOR,SONG_ID,BPM,USAGE_CODE"+ + sql=QString("select ")+ + "TITLE,"+ // 00 + "ARTIST,"+ // 01 + "ALBUM,"+ // 02 + "YEAR,"+ // 03 + "LABEL,"+ // 04 + "CLIENT,"+ // 05 + "AGENCY,"+ // 06 + "PUBLISHER,"+ // 07 + "COMPOSER,"+ // 08 + "USER_DEFINED,"+ // 09 + "CONDUCTOR,"+ // 10 + "SONG_ID,"+ // 11 + "BPM,"+ // 12 + "USAGE_CODE "+ // 13 QString().sprintf(" from CART where NUMBER=%u",cart_number); q=new RDSqlQuery(sql); if(q->first()) { + data->setCartNumber(cart_number); data->setTitle(q->value(0).toString()); data->setArtist(q->value(1).toString()); data->setAlbum(q->value(2).toString()); diff --git a/lib/rdcut.cpp b/lib/rdcut.cpp index 2b5abc73..794c679f 100644 --- a/lib/rdcut.cpp +++ b/lib/rdcut.cpp @@ -927,38 +927,54 @@ void RDCut::getMetadata(RDWaveData *data) const QString sql; RDSqlQuery *q; - sql=QString().sprintf("select DESCRIPTION,OUTCUE,ISRC,ISCI,ORIGIN_DATETIME,\ - START_DATETIME,END_DATETIME,START_DAYPART,END_DAYPART,\ - SEGUE_START_POINT,\ - SEGUE_END_POINT,TALK_START_POINT,TALK_END_POINT,\ - START_POINT,END_POINT,HOOK_START_POINT,\ - HOOK_END_POINT,FADEUP_POINT,FADEDOWN_POINT \ - from CUTS where CUT_NAME=\"%s\"", - (const char *)cut_name); + sql=QString("select ")+ + "CUT_NAME,"+ // 00 + "DESCRIPTION,"+ // 01 + "OUTCUE,"+ // 02 + "ISRC,"+ // 03 + "ISCI,"+ // 04 + "ORIGIN_DATETIME,"+ // 05 + "START_DATETIME,"+ // 06 + "END_DATETIME,"+ // 07 + "START_DAYPART,"+ // 08 + "END_DAYPART,"+ // 09 + "SEGUE_START_POINT,"+ // 10 + "SEGUE_END_POINT,"+ // 11 + "TALK_START_POINT,"+ // 12 + "TALK_END_POINT,"+ // 13 + "START_POINT,"+ // 14 + "END_POINT,"+ // 15 + "HOOK_START_POINT,"+ // 16 + "HOOK_END_POINT,"+ // 17 + "FADEUP_POINT,"+ // 18 + "FADEDOWN_POINT "+ // 19 + "from CUTS where CUT_NAME=\""+cut_name+"\""; q=new RDSqlQuery(sql); if(q->first()) { - data->setDescription(q->value(0).toString()); - data->setOutCue(q->value(1).toString()); - data->setIsrc(q->value(2).toString()); - data->setIsci(q->value(3).toString()); - data->setOriginationDate(q->value(4).toDate()); - data->setOriginationTime(q->value(4).toTime()); - data->setStartDate(q->value(5).toDate()); - data->setStartTime(q->value(5).toTime()); - data->setEndDate(q->value(6).toDate()); - data->setEndTime(q->value(6).toTime()); - data->setDaypartStartTime(q->value(7).toTime()); - data->setDaypartEndTime(q->value(8).toTime()); - data->setSegueStartPos(q->value(9).toInt()); - data->setSegueEndPos(q->value(10).toInt()); - data->setIntroStartPos(q->value(11).toInt()); - data->setIntroEndPos(q->value(12).toInt()); - data->setStartPos(q->value(13).toInt()); - data->setEndPos(q->value(14).toInt()); - data->setHookStartPos(q->value(15).toInt()); - data->setHookEndPos(q->value(16).toInt()); - data->setFadeUpPos(q->value(17).toInt()); - data->setFadeDownPos(q->value(18).toInt()); + data->setCutName(q->value(0).toString()); + data->setCutNumber(RDCut::cutNumber(q->value(0).toString())); + data->setDescription(q->value(1).toString()); + data->setOutCue(q->value(2).toString()); + data->setIsrc(q->value(3).toString()); + data->setIsci(q->value(4).toString()); + data->setOriginationDate(q->value(5).toDate()); + data->setOriginationTime(q->value(5).toTime()); + data->setStartDate(q->value(6).toDate()); + data->setStartTime(q->value(6).toTime()); + data->setEndDate(q->value(7).toDate()); + data->setEndTime(q->value(7).toTime()); + data->setDaypartStartTime(q->value(8).toTime()); + data->setDaypartEndTime(q->value(9).toTime()); + data->setSegueStartPos(q->value(10).toInt()); + data->setSegueEndPos(q->value(11).toInt()); + data->setIntroStartPos(q->value(12).toInt()); + data->setIntroEndPos(q->value(13).toInt()); + data->setStartPos(q->value(14).toInt()); + data->setEndPos(q->value(15).toInt()); + data->setHookStartPos(q->value(16).toInt()); + data->setHookEndPos(q->value(17).toInt()); + data->setFadeUpPos(q->value(18).toInt()); + data->setFadeDownPos(q->value(19).toInt()); data->setMetadataFound(true); } delete q; diff --git a/lib/rdwavefile.cpp b/lib/rdwavefile.cpp index 8bf4b132..4a903d7a 100644 --- a/lib/rdwavefile.cpp +++ b/lib/rdwavefile.cpp @@ -3348,51 +3348,62 @@ void RDWaveFile::ReadId3Metadata() } ID3_Frame *frame=NULL; ID3_Tag id3_tag(QCString().sprintf("%s",(const char *)wave_file.name().utf8())); - if((frame=id3_tag.Find(ID3FID_TITLE))!=NULL) { - wave_data->setTitle(ID3_GetString(frame,ID3FN_TEXT)); - wave_data->setMetadataFound(true); + if((frame=id3_tag.Find(ID3FID_USERTEXT,ID3FN_DESCRIPTION,"rdxl"))!=NULL) { + rdxl_contents=ID3_GetString(frame,ID3FN_TEXT); + if(wave_data!=NULL) { + std::vector wavedatas; + if(RDCart::readXml(&wavedatas,rdxl_contents)>1) { + *wave_data=wavedatas[1]; + } + } } - if((frame=id3_tag.Find(ID3FID_BPM))!=NULL) { - wave_data-> - setBeatsPerMinute(QString(ID3_GetString(frame,ID3FN_TEXT)).toInt()); - wave_data->setMetadataFound(true); - } - if((frame=id3_tag.Find(ID3FID_ALBUM))!=NULL) { - wave_data->setAlbum(ID3_GetString(frame,ID3FN_TEXT)); - wave_data->setMetadataFound(true); - } - if((frame=id3_tag.Find(ID3FID_COMPOSER))!=NULL) { - wave_data->setComposer(ID3_GetString(frame,ID3FN_TEXT)); - wave_data->setMetadataFound(true); - } - if((frame=id3_tag.Find(ID3FID_COPYRIGHT))!=NULL) { - wave_data->setCopyrightNotice(ID3_GetString(frame,ID3FN_TEXT)); - wave_data->setMetadataFound(true); - } - if((frame=id3_tag.Find(ID3FID_ORIGARTIST))!=NULL) { - wave_data->setArtist(ID3_GetString(frame,ID3FN_TEXT)); - wave_data->setMetadataFound(true); - } - if((frame=id3_tag.Find(ID3FID_LEADARTIST))!=NULL) { - wave_data->setArtist(ID3_GetString(frame,ID3FN_TEXT)); - wave_data->setMetadataFound(true); - } - if((frame=id3_tag.Find(ID3FID_CONDUCTOR))!=NULL) { - wave_data->setConductor(ID3_GetString(frame,ID3FN_TEXT)); - wave_data->setMetadataFound(true); - } - if((frame=id3_tag.Find(ID3FID_PUBLISHER))!=NULL) { - wave_data->setPublisher(ID3_GetString(frame,ID3FN_TEXT)); - wave_data->setMetadataFound(true); - } - if((frame=id3_tag.Find(ID3FID_ISRC))!=NULL) { - wave_data->setIsrc(ID3_GetString(frame,ID3FN_TEXT)); - wave_data->setMetadataFound(true); - } - if((frame=id3_tag.Find(ID3FID_YEAR))!=NULL) { - wave_data-> - setReleaseYear(QString(ID3_GetString(frame,ID3FN_TEXT)).toInt()); - wave_data->setMetadataFound(true); + else { + if((frame=id3_tag.Find(ID3FID_TITLE))!=NULL) { + wave_data->setTitle(ID3_GetString(frame,ID3FN_TEXT)); + wave_data->setMetadataFound(true); + } + if((frame=id3_tag.Find(ID3FID_BPM))!=NULL) { + wave_data-> + setBeatsPerMinute(QString(ID3_GetString(frame,ID3FN_TEXT)).toInt()); + wave_data->setMetadataFound(true); + } + if((frame=id3_tag.Find(ID3FID_ALBUM))!=NULL) { + wave_data->setAlbum(ID3_GetString(frame,ID3FN_TEXT)); + wave_data->setMetadataFound(true); + } + if((frame=id3_tag.Find(ID3FID_COMPOSER))!=NULL) { + wave_data->setComposer(ID3_GetString(frame,ID3FN_TEXT)); + wave_data->setMetadataFound(true); + } + if((frame=id3_tag.Find(ID3FID_COPYRIGHT))!=NULL) { + wave_data->setCopyrightNotice(ID3_GetString(frame,ID3FN_TEXT)); + wave_data->setMetadataFound(true); + } + if((frame=id3_tag.Find(ID3FID_ORIGARTIST))!=NULL) { + wave_data->setArtist(ID3_GetString(frame,ID3FN_TEXT)); + wave_data->setMetadataFound(true); + } + if((frame=id3_tag.Find(ID3FID_LEADARTIST))!=NULL) { + wave_data->setArtist(ID3_GetString(frame,ID3FN_TEXT)); + wave_data->setMetadataFound(true); + } + if((frame=id3_tag.Find(ID3FID_CONDUCTOR))!=NULL) { + wave_data->setConductor(ID3_GetString(frame,ID3FN_TEXT)); + wave_data->setMetadataFound(true); + } + if((frame=id3_tag.Find(ID3FID_PUBLISHER))!=NULL) { + wave_data->setPublisher(ID3_GetString(frame,ID3FN_TEXT)); + wave_data->setMetadataFound(true); + } + if((frame=id3_tag.Find(ID3FID_ISRC))!=NULL) { + wave_data->setIsrc(ID3_GetString(frame,ID3FN_TEXT)); + wave_data->setMetadataFound(true); + } + if((frame=id3_tag.Find(ID3FID_YEAR))!=NULL) { + wave_data-> + setReleaseYear(QString(ID3_GetString(frame,ID3FN_TEXT)).toInt()); + wave_data->setMetadataFound(true); + } } } diff --git a/web/rdxport/import.cpp b/web/rdxport/import.cpp index c1a5d873..94db1ab6 100644 --- a/web/rdxport/import.cpp +++ b/web/rdxport/import.cpp @@ -132,6 +132,9 @@ void Xport::Import() if(use_metadata>0) { cart->setMetadata(conv->sourceWaveData()); cut->setMetadata(conv->sourceWaveData()); + syslog(LOG_NOTICE,"SOURCE: title: %s startDateTime: %s %s", + (const char *)conv->sourceWaveData()->title(), + (const char *)conv->sourceWaveData()->startDate().toString("yyyy-MM-dd"),(const char *)conv->sourceWaveData()->startTime().toString("hh:mm:ss")); } if(autotrim_level!=0) { cut->autoTrim(RDCut::AudioBoth,100*autotrim_level);