diff --git a/ChangeLog b/ChangeLog index f7ca4669..5d057a27 100644 --- a/ChangeLog +++ b/ChangeLog @@ -19455,7 +19455,7 @@ dialog in rdadmin(1). * Added a 'Dummy' CD metadata lookup source in the 'RDDummyLookup' class. - * Added a 'CUTS.TRACK_MBID' field to the database. + * Added a 'CUTS.RECORDING_MBID' field to the database. * Added a 'CUTS.RELEASE_MBID' field to the database. 2020-02-01 Fred Gleason * Added a 'MusicBrainz' CD metadata lookup method in 'RDMbLookup'. @@ -19495,3 +19495,11 @@ 2020-02-03 Fred Gleason * Fixed a bug in rdadmin(1) that caused the 'STATIONS.BROWSER_PATH' field to not be propgated to new host instances. +2020-02-03 Fred Gleason + * Consolidated the Metadata Wildcard definitions in the + 'RDResolveNowNext()' function into the 'RDLogLine::resolveWildcards()' + method. + * Added 'recordMbId' and 'releaseMbId' fields to the cut XML data + schema. + * Added '%wm' ['MusicBrainz Recording ID'] and '%wr' + ['MusicBrainz Release ID'] metadata wildcards. diff --git a/docs/opsguide/metadata_wildcards.xml b/docs/opsguide/metadata_wildcards.xml index 29663026..ac5538c9 100644 --- a/docs/opsguide/metadata_wildcards.xml +++ b/docs/opsguide/metadata_wildcards.xml @@ -37,7 +37,9 @@ %t%TTitle %u%UUser Definied %v%VEvent length (seconds, rounded down) - %w%W[Unassigned] + %wi%WIInternational Standard Recording Code + %wm%WmMusicBrainz Recording ID + %wr%WrMusicBrainz Release ID %x%XLog line ID (numeric) %y%YRelease Year %z%ZLog line number (numeric) diff --git a/docs/tables/cuts.txt b/docs/tables/cuts.txt index ff6bd828..a11a3e28 100644 --- a/docs/tables/cuts.txt +++ b/docs/tables/cuts.txt @@ -13,7 +13,7 @@ DESCRIPTION varchar(64) Indexed OUTCUE varchar(64) Indexed ISRC varchar(12) International Standard Recording Code ISCI varchar(32) ISCI Code -TRACK_MBID varchar(40) MusicBrainz Track ID +RECORDING_MBID varchar(40) MusicBrainz Recording ID RELEASE_MBID varchar(40) MusicBrainz Parent Release ID SHA1_HASH varchar(40) LENGTH int(10) unsigned Overall length in ms. diff --git a/lib/Makefile.am b/lib/Makefile.am index fcfb4cf4..8c80deaa 100644 --- a/lib/Makefile.am +++ b/lib/Makefile.am @@ -179,7 +179,6 @@ dist_librd_la_SOURCES = dbversion.h\ rdmp4.cpp rdmp4.h\ rdmulticaster.cpp rdmulticaster.h\ rdnotification.cpp rdnotification.h\ - rdnownext.cpp rdnownext.h\ rdoneshot.cpp rdoneshot.h\ rdpam.cpp rdpam.h\ rdpanel_button.cpp rdpanel_button.h\ diff --git a/lib/rdcart.cpp b/lib/rdcart.cpp index 43d21be8..766e7bba 100644 --- a/lib/rdcart.cpp +++ b/lib/rdcart.cpp @@ -2,7 +2,7 @@ // // Abstract a Rivendell Cart. // -// (C) Copyright 2002-2019 Fred Gleason +// (C) Copyright 2002-2020 Fred Gleason // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License version 2 as @@ -1448,7 +1448,10 @@ QString RDCart::xmlSql(bool include_cuts) "CUTS.HOOK_START_POINT,"+ // 70 "CUTS.HOOK_END_POINT,"+ // 71 "CUTS.TALK_START_POINT,"+ // 72 - "CUTS.TALK_END_POINT "+ // 73 + "CUTS.TALK_END_POINT,"+ // 73 + "CUTS.RECORDING_MBID,"+ // 74 + "CUTS.RELEASE_MBID "+ // 75 + "from CART left join CUTS "+ "on CART.NUMBER=CUTS.CART_NUMBER "; } @@ -1979,6 +1982,16 @@ unsigned RDCart::readXml(std::vector *data,const QString &xml) data->back().setIsci(GetXmlValue("isci",f0[i]).toString()); cartdata.setMetadataFound(true); } + if(f0[i].contains("")) { + data->back().setRecordingMbId(GetXmlValue("recordingMbId",f0[i]). + toString()); + cartdata.setMetadataFound(true); + } + if(f0[i].contains("")) { + data->back().setReleaseMbId(GetXmlValue("releaseMbId", + f0[i]).toString()); + cartdata.setMetadataFound(true); + } if(f0[i].contains("")) { data->back().setLength(GetXmlValue("length",f0[i]).toInt()); cartdata.setMetadataFound(true); diff --git a/lib/rdcart.h b/lib/rdcart.h index 470a1c07..721fd12a 100644 --- a/lib/rdcart.h +++ b/lib/rdcart.h @@ -2,7 +2,7 @@ // // Abstract a Rivendell Cart // -// (C) Copyright 2002-2016 Fred Gleason +// (C) Copyright 2002-2020 Fred Gleason // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License version 2 as diff --git a/lib/rdcut.cpp b/lib/rdcut.cpp index f57e596f..1940d84a 100644 --- a/lib/rdcut.cpp +++ b/lib/rdcut.cpp @@ -2,7 +2,7 @@ // // Abstract a Rivendell Cut. // -// (C) Copyright 2002-2016 Fred Gleason +// (C) Copyright 2002-2020 Fred Gleason // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License version 2 as @@ -239,15 +239,15 @@ QString RDCut::isci() const } -QString RDCut::trackMbId() const +QString RDCut::recordingMbId() const { - return RDGetSqlValue("CUTS","CUT_NAME",cut_name,"TRACK_MBID").toString(); + return RDGetSqlValue("CUTS","CUT_NAME",cut_name,"RECORDING_MBID").toString(); } -void RDCut::setTrackMbId(const QString &mbid) +void RDCut::setRecordingMbId(const QString &mbid) { - SetRow("TRACK_MBID",mbid); + SetRow("RECORDING_MBID",mbid); } @@ -905,7 +905,12 @@ bool RDCut::copyTo(RDStation *station,RDUser *user, "HOOK_START_POINT,"+ // 15 "HOOK_END_POINT,"+ // 16 "TALK_START_POINT,"+ // 17 - "TALK_END_POINT "+ // 18 + "TALK_END_POINT,"+ // 18 + "ISRC,"+ // 19 + "ISCI,"+ // 20 + "RECORDING_MBID,"+ // 21 + "RELEASE_MBID "+ // 22 + "from CUTS where "+ "CUT_NAME=\""+RDEscapeString(cut_name)+"\""; q=new RDSqlQuery(sql); @@ -932,7 +937,11 @@ bool RDCut::copyTo(RDStation *station,RDUser *user, QString().sprintf("HOOK_START_POINT=%d,",q->value(15).toInt())+ QString().sprintf("HOOK_END_POINT=%d,",q->value(16).toInt())+ QString().sprintf("TALK_START_POINT=%d,",q->value(17).toInt())+ - QString().sprintf("TALK_END_POINT=%d ",q->value(18).toInt())+ + QString().sprintf("TALK_END_POINT=%d,",q->value(18).toInt())+ + "ISRC=\""+RDEscapeString(q->value(19).toString())+"\","+ + "ISCI=\""+RDEscapeString(q->value(20).toString())+"\","+ + "RECORDING_MBID=\""+RDEscapeString(q->value(21).toString())+"\","+ + "RELEASE_MBID=\""+RDEscapeString(q->value(22).toString())+"\" "+ "where CUT_NAME=\""+RDEscapeString(cutname)+"\""; } delete q; @@ -995,7 +1004,10 @@ void RDCut::getMetadata(RDWaveData *data) const "HOOK_START_POINT,"+ // 16 "HOOK_END_POINT,"+ // 17 "FADEUP_POINT,"+ // 18 - "FADEDOWN_POINT "+ // 19 + "FADEDOWN_POINT,"+ // 19 + "RECORDING_MBID,"+ // 20 + "RELEASE_MBID "+ // 21 + "from CUTS where CUT_NAME=\""+cut_name+"\""; q=new RDSqlQuery(sql); if(q->first()) { @@ -1023,6 +1035,8 @@ void RDCut::getMetadata(RDWaveData *data) const data->setHookEndPos(q->value(17).toInt()); data->setFadeUpPos(q->value(18).toInt()); data->setFadeDownPos(q->value(19).toInt()); + data->setRecordingMbId(q->value(20).toString()); + data->setReleaseMbId(q->value(21).toString()); data->setMetadataFound(true); } delete q; @@ -1058,6 +1072,13 @@ void RDCut::setMetadata(RDWaveData *data) const if(!data->isci().isEmpty()) { sql+=QString("ISCI=\"")+RDEscapeString(data->isci())+"\","; } + if(!data->recordingMbId().isEmpty()) { + sql+=QString("RECORDING_MBID=\"")+ + RDEscapeString(data->recordingMbId())+"\","; + } + if(!data->releaseMbId().isEmpty()) { + sql+=QString("RELEASE_MBID=\"")+RDEscapeString(data->releaseMbId())+"\","; + } if(data->startPos()>=0) { sql+=QString().sprintf("START_POINT=%d,",data->startPos()); } @@ -1483,6 +1504,8 @@ QString RDCut::xml(RDSqlQuery *q,bool absolute,RDSettings *settings) xml+=" "+RDXmlField("outcue",q->value(34).toString()); xml+=" "+RDXmlField("isrc",q->value(35).toString()); xml+=" "+RDXmlField("isci",q->value(36).toString()); + xml+=" "+RDXmlField("recordingMbId",q->value(74).toString()); + xml+=" "+RDXmlField("releaseMbId",q->value(75).toString()); xml+=" "+RDXmlField("length",q->value(37).toUInt()); if(q->value(38).isNull()) { xml+=" "+RDXmlField("originDatetime",""); diff --git a/lib/rdcut.h b/lib/rdcut.h index 8a5da69b..ad0f9cbc 100644 --- a/lib/rdcut.h +++ b/lib/rdcut.h @@ -2,7 +2,7 @@ // // Abstract a Rivendell Cut // -// (C) Copyright 2002-2004,2016 Fred Gleason +// (C) Copyright 2002-2020 Fred Gleason // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License version 2 as @@ -59,8 +59,8 @@ class RDCut void setIsrc(const QString &isrc) const; QString isci() const; void setIsci(const QString &isci) const; - QString trackMbId() const; - void setTrackMbId(const QString &mbid); + QString recordingMbId() const; + void setRecordingMbId(const QString &mbid); QString releaseMbId() const; void setReleaseMbId(const QString &mbid); QString sha1Hash() const; diff --git a/lib/rddiscrecord.cpp b/lib/rddiscrecord.cpp index 1eb9e755..dee10ab0 100644 --- a/lib/rddiscrecord.cpp +++ b/lib/rddiscrecord.cpp @@ -39,12 +39,14 @@ void RDDiscRecord::clear() disc_disc_genre=""; disc_disc_extended=""; disc_disc_playorder=""; + disc_disc_release_mb_id=""; for(int i=0;i +// (C) Copyright 2002-2020 Fred Gleason // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License version 2 as @@ -118,6 +118,8 @@ void RDLogLine::clear() log_publisher=""; log_composer=""; log_isrc=""; + log_recording_mbid=""; + log_release_mbid=""; log_album=""; log_year=QDate(); log_isci=""; @@ -825,6 +827,30 @@ void RDLogLine::setIsrc(const QString &string) } +QString RDLogLine::recordingMbId() const +{ + return log_recording_mbid; +} + + +void RDLogLine::setRecordingMbId(const QString &mbid) +{ + log_recording_mbid=mbid; +} + + +QString RDLogLine::releaseMbId() const +{ + return log_release_mbid; +} + + +void RDLogLine::setReleaseMbId(const QString &mbid) +{ + log_release_mbid=mbid; +} + + QString RDLogLine::isci() const { return log_isci; @@ -1555,23 +1581,44 @@ void RDLogLine::setStartSource(RDLogLine::StartSource src) } -QString RDLogLine::resolveWildcards(QString pattern) +QString RDLogLine::resolveWildcards(QString pattern,int log_id) { - pattern.replace("%n",QString().sprintf("%06u",cartNumber())); - pattern.replace("%h",QString().sprintf("%d",effectiveLength())); - pattern.replace("%g",groupName()); - pattern.replace("%t",title()); + // MAINTAINERS'S NOTE: These mappings must be kept in sync with those + // in 'apis/PyPAD/api/PyPAD.py'! + pattern.replace("%a",artist()); - pattern.replace("%l",album()); - pattern.replace("%y",year().toString("yyyy")); pattern.replace("%b",label()); + pattern.replace("%c",client()); + pattern=RDLogLine::resolveNowNextDateTime(pattern,"%d(",startDatetime()); + pattern.replace("%e",agency()); + // %f [unassigned] + pattern.replace("%g",groupName()); + pattern.replace("%h",QString().sprintf("%d",effectiveLength())); + pattern.replace("%i",description()); + pattern.replace("%j",QString().sprintf("%03d",cutNumber())); + // %k rdimport(1) parameter + pattern.replace("%l",album()); + pattern.replace("%m",composer()); + pattern.replace("%n",QString().sprintf("%06u",cartNumber())); + pattern.replace("%o",outcue()); + pattern.replace("%p",publisher()); + // %q rdimport(1) parameter pattern.replace("%r",conductor()); pattern.replace("%s",songId()); - pattern.replace("%c",client()); - pattern.replace("%e",agency()); - pattern.replace("%m",composer()); - pattern.replace("%p",publisher()); + pattern.replace("%t",title()); pattern.replace("%u",userDefined()); + pattern.replace("%v",QString().sprintf("%d",effectiveLength()/1000)); + pattern.replace("%wi",isrc()); + pattern.replace("%wm",recordingMbId()); + pattern.replace("%wr",releaseMbId()); + if(log_id<0) { + pattern.replace("%x",QString().sprintf("%d",id())); + } + else { + pattern.replace("%x",QString().sprintf("%d",log_id)); + } + pattern.replace("%y",QString().sprintf("%d",year().year())); + // %z Log Line Number return pattern; } @@ -1618,7 +1665,9 @@ RDLogLine::State RDLogLine::setEvent(int mach,RDLogLine::TransType next_type, "OUTCUE,"+ // 10 "ISRC,"+ // 11 "ISCI,"+ // 12 - "DESCRIPTION "+ // 13 + "DESCRIPTION,"+ // 13 + "RECORDING_MBID,"+ // 14 + "RELEASE_MBID "+ // 15 "from CUTS where CUT_NAME=\""+RDEscapeString(log_cut_name)+"\""; q=new RDSqlQuery(sql); if(!q->first()) { @@ -1748,6 +1797,8 @@ RDLogLine::State RDLogLine::setEvent(int mach,RDLogLine::TransType next_type, log_isrc=q->value(11).toString(); log_isci=q->value(12).toString(); log_description=q->value(13).toString(); + log_recording_mbid=q->value(14).toString(); + log_release_mbid=q->value(15).toString(); log_segue_gain_cut=q->value(5).toInt(); delete q; delete cart; @@ -1817,7 +1868,6 @@ void RDLogLine::loadCart(int cartnum,RDLogLine::TransType next_type,int mach, "CART.ARTIST,"+ // 03 "CART.ALBUM,"+ // 04 "CART.YEAR,"+ // 05 - // "CART.ISRC,"+ // 06 "CART.LABEL,"+ // 06 "CART.CLIENT,"+ // 07 "CART.AGENCY,"+ // 08 @@ -1999,6 +2049,12 @@ QString RDLogLine::xml(int line) const ret+=" "+RDXmlField("markerComment",markerComment()); ret+=" "+RDXmlField("markerLabel",markerLabel()); + ret+=" "+RDXmlField("description",description()); + ret+=" "+RDXmlField("isrc",isrc()); + ret+=" "+RDXmlField("isci",isci()); + ret+=" "+RDXmlField("recordingMbId",recordingMbId()); + ret+=" "+RDXmlField("releaseMbId",releaseMbId()); + ret+=" "+RDXmlField("originUser",originUser()); ret+=" "+RDXmlField("originDateTime",originDateTime()); ret+=" "+RDXmlField("startPoint",startPoint(RDLogLine::CartPointer), @@ -2059,6 +2115,37 @@ QString RDLogLine::xml(int line) const } +QString RDLogLine::resolveNowNextDateTime(const QString &str, + const QString &code, + const QDateTime &dt) +{ + int ptr=0; + std::vector dts; + QString ret=str; + + while((ptr=ret.find(code,ptr))>=0) { + for(int i=ptr+3;i +// (C) Copyright 2002-2020 Fred Gleason // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License version 2 as @@ -142,6 +142,10 @@ class RDLogLine void setIsrc(const QString &string); QString isci() const; void setIsci(const QString &string); + QString recordingMbId() const; + void setRecordingMbId(const QString &mbid); + QString releaseMbId() const; + void setReleaseMbId(const QString &mbid); QString label() const; void setLabel(const QString &label); QString conductor() const; @@ -251,7 +255,7 @@ class RDLogLine void setLinkEmbedded(bool state); RDLogLine::StartSource startSource() const; void setStartSource(RDLogLine::StartSource src); - QString resolveWildcards(QString pattern); + QString resolveWildcards(QString pattern,int log_id=-1); RDLogLine::State setEvent(int mach,RDLogLine::TransType next_type, bool timescale,int len=-1); void loadCart(int cartnum,RDLogLine::TransType next_type,int mach, @@ -259,6 +263,8 @@ class RDLogLine int len=-1); void refreshPointers(); QString xml(int line) const; + static QString resolveNowNextDateTime(const QString &str,const QString &code, + const QDateTime &dt); static QString resolveWildcards(unsigned cartnum,const QString &pattern); static QString startSourceText(RDLogLine::StartSource src); static QString transText(RDLogLine::TransType trans); @@ -306,6 +312,8 @@ class RDLogLine QString log_publisher; QString log_composer; QString log_isrc; + QString log_recording_mbid; + QString log_release_mbid; QString log_isci; QDate log_year; QString log_label; diff --git a/lib/rdlogplay.cpp b/lib/rdlogplay.cpp index 3010a270..24065edb 100644 --- a/lib/rdlogplay.cpp +++ b/lib/rdlogplay.cpp @@ -31,7 +31,6 @@ #include "rdlog.h" #include "rdlogplay.h" #include "rdmixer.h" -#include "rdnownext.h" #include "rdsvc.h" #include "rdweb.h" diff --git a/lib/rdmblookup.cpp b/lib/rdmblookup.cpp index f6aaa31b..251c3263 100644 --- a/lib/rdmblookup.cpp +++ b/lib/rdmblookup.cpp @@ -302,7 +302,7 @@ RDDiscLookup::Result RDMbLookup::ProcessRelease(MusicBrainz5::CRelease *release) discRecord()-> setTrackTitle(k,QString::fromUtf8(recording->Title().c_str())); discRecord()-> - setTrackMbId(k,QString::fromUtf8(recording->ID().c_str())); + setTrackRecordingMbId(k,QString::fromUtf8(recording->ID().c_str())); MusicBrainz5::CISRCList *isrcs=recording->ISRCList(); if(isrcs) { if(isrcs->NumItems()>0) { diff --git a/lib/rdnownext.cpp b/lib/rdnownext.cpp deleted file mode 100644 index bb8616cf..00000000 --- a/lib/rdnownext.cpp +++ /dev/null @@ -1,84 +0,0 @@ -// rdnownext.cpp -// -// Rivendell Metadata Wildcards Implementation -// -// MAINTAINERS'S NOTE: These mappings must be kept in sync with those -// in 'apis/PyPAD/api/PyPAD.py'! -// -// (C) Copyright 2008-2019 Fred Gleason -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License version 2 as -// published by the Free Software Foundation. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public -// License along with this program; if not, write to the Free Software -// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -// - -#include - -#include - -#include -#include - -void RDResolveNowNextDateTime(QString *str,const QString &code, - const QDateTime &dt) -{ - int ptr=0; - std::vector dts; - - while((ptr=str->find(code,ptr))>=0) { - for(int i=ptr+3;ilength();i++) { - if(str->at(i)==')') { - dts.push_back(str->mid(ptr+3,i-ptr-3)); - ptr+=(i-ptr-3); - break; - } - } - } - if(dt.isValid()&&(!dt.time().isNull())) { - for(unsigned i=0;ireplace(code+dts[i]+")",dt.toString(dts[i])); - } - } - else { - for(unsigned i=0;ireplace(code+dts[i]+")",""); - } - } -} - - -QString RDResolveNowNext(const QString &pattern,RDLogLine *ll,int line) -{ - QString ret=pattern; - - ret.replace("%n",QString().sprintf("%06u",ll->cartNumber())); - ret.replace("%h",QString().sprintf("%d",ll->effectiveLength())); - ret.replace("%g",ll->groupName()); - ret.replace("%t",ll->title()); - ret.replace("%a",ll->artist()); - ret.replace("%l",ll->album()); - ret.replace("%r",ll->conductor()); - ret.replace("%s",ll->songId()); - ret.replace("%y",ll->year().toString("yyyy")); - ret.replace("%b",ll->label()); - ret.replace("%c",ll->client()); - ret.replace("%e",ll->agency()); - ret.replace("%m",ll->composer()); - ret.replace("%p",ll->publisher()); - ret.replace("%u",ll->userDefined()); - ret.replace("%o",ll->outcue()); - ret.replace("%i",ll->description()); - RDResolveNowNextDateTime(&ret,"%d(",ll->startDatetime()); - - return ret; -} - diff --git a/lib/rdnownext.h b/lib/rdnownext.h deleted file mode 100644 index 616f651e..00000000 --- a/lib/rdnownext.h +++ /dev/null @@ -1,29 +0,0 @@ -// rdnownext.h -// -// Rivendell Metadata Wildcards Implementation -// -// (C) Copyright 2008-2019 Fred Gleason -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License version 2 as -// published by the Free Software Foundation. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public -// License along with this program; if not, write to the Free Software -// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -// - -#ifndef RDNOWNEXT_H -#define RDNOWNEXT_H - -#include - -QString RDResolveNowNext(const QString &pattern,RDLogLine *ll,int line); - - -#endif // RDNOWNEXT_H diff --git a/lib/rdslotbox.cpp b/lib/rdslotbox.cpp index 92d5a3a0..17ba9767 100644 --- a/lib/rdslotbox.cpp +++ b/lib/rdslotbox.cpp @@ -2,7 +2,7 @@ // // Cart slot label widget for RDCartSlot // -// (C) Copyright 2012-2019 Fred Gleason +// (C) Copyright 2012-2020 Fred Gleason // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License version 2 as @@ -19,7 +19,6 @@ // #include "rdconf.h" -#include "rdnownext.h" #include "rdslotbox.h" #include "../icons/play.xpm" @@ -321,9 +320,14 @@ void RDSlotBox::setCart(RDLogLine *logline) } if(line_logline->originUser().isEmpty()|| (!line_logline->originDateTime().isValid())) { + /* line_title_label-> setText(RDResolveNowNext(line_airplay_conf->titleTemplate(), logline,log_id+1)); + */ + line_title_label-> + setText(logline->resolveWildcards(line_airplay_conf-> + titleTemplate())); } else { line_title_label->setText(line_logline->title()+" -- "+ @@ -332,11 +336,12 @@ void RDSlotBox::setCart(RDLogLine *logline) toString("M/d hh:mm")); } line_description_label-> - setText(RDResolveNowNext(line_airplay_conf->descriptionTemplate(), - logline,log_id+1)); + setText(logline-> + resolveWildcards(line_airplay_conf->descriptionTemplate(), + log_id+1)); line_artist_label-> - setText(RDResolveNowNext(line_airplay_conf->artistTemplate(), - logline,log_id+1)); + setText(logline->resolveWildcards(line_airplay_conf-> + artistTemplate(),log_id+1)); line_up_label-> setText(RDGetTimeLength(line_logline->playPosition(),true,true)); line_down_label-> @@ -348,8 +353,8 @@ void RDSlotBox::setCart(RDLogLine *logline) line_cut_label-> setText(QString().sprintf("%03u",logline->cutNumber())); line_outcue_label-> - setText(RDResolveNowNext(line_airplay_conf->outcueTemplate(), - logline,log_id+1)); + setText(logline->resolveWildcards(line_airplay_conf-> + outcueTemplate(),log_id+1)); line_position_bar->show(); line_up_label->show(); line_down_label->show(); diff --git a/lib/rdwavedata.cpp b/lib/rdwavedata.cpp index fd9ba1cd..436cae50 100644 --- a/lib/rdwavedata.cpp +++ b/lib/rdwavedata.cpp @@ -2,7 +2,7 @@ // // A Container Class for Audio Meta Data. // -// (C) Copyright 2002-2019 Fred Gleason +// (C) Copyright 2002-2020 Fred Gleason // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU Library General Public License @@ -413,6 +413,30 @@ void RDWaveData::setIsci(const QString &str) } +QString RDWaveData::recordingMbId() const +{ + return data_recording_mbid; +} + + +void RDWaveData::setRecordingMbId(const QString &mbid) +{ + data_recording_mbid=mbid; +} + + +QString RDWaveData::releaseMbId() const +{ + return data_release_mbid; +} + + +void RDWaveData::setReleaseMbId(const QString &mbid) +{ + data_release_mbid=mbid; +} + + QString RDWaveData::mcn() const { return data_mcn; @@ -1172,6 +1196,8 @@ QString RDWaveData::dump() const } ret+="isrc: "+isrc()+"\n"; ret+="isci: "+isci()+"\n"; + ret+="recordingMbId: "+recordingMbId()+"\n"; + ret+="releaseMbId: "+releaseMbId()+"\n"; ret+=QString().sprintf("length: %d\n",length()); ret+="originator: "+originator()+"\n"; ret+="originationDate: "+originationDate().toString("yyyy-MM-dd")+"\n"; @@ -1279,6 +1305,8 @@ void RDWaveData::clear() data_originator_reference=""; data_isrc=""; data_isci=""; + data_recording_mbid=""; + data_release_mbid=""; data_mcn=""; data_out_cue=""; data_release_year=0; diff --git a/lib/rdwavedata.h b/lib/rdwavedata.h index b992a132..9701673b 100644 --- a/lib/rdwavedata.h +++ b/lib/rdwavedata.h @@ -2,7 +2,7 @@ // // A Container Class for Audio Meta Data. // -// (C) Copyright 2002-2019 Fred Gleason +// (C) Copyright 2002-2020 Fred Gleason // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU Library General Public License @@ -99,6 +99,10 @@ class RDWaveData void setIsrc(const QString &str); QString isci() const; void setIsci(const QString &str); + QString recordingMbId() const; + void setRecordingMbId(const QString &mbid); + QString releaseMbId() const; + void setReleaseMbId(const QString &mbid); QString mcn() const; void setMcn(const QString &str); QString outCue() const; @@ -233,6 +237,8 @@ class RDWaveData QString data_coding_history; QString data_isrc; QString data_isci; + QString data_recording_mbid; + QString data_release_mbid; QString data_mcn; QString data_out_cue; EndType data_end_type; diff --git a/rdairplay/loglinebox.cpp b/rdairplay/loglinebox.cpp index 952c71b7..92f1c287 100644 --- a/rdairplay/loglinebox.cpp +++ b/rdairplay/loglinebox.cpp @@ -21,7 +21,6 @@ #include #include -#include #include "colors.h" #include "globals.h" @@ -523,7 +522,7 @@ void LogLineBox::setEvent(int line,RDLogLine::TransType next_type, line_logline->originUser().isEmpty()|| (!line_logline->originDateTime().isValid())) { line_title_label-> - setText(RDResolveNowNext(line_title_template,line_logline,line)); + setText(line_logline->resolveWildcards(line_title_template)); } else { line_title_label->setText(line_logline->title()+" -- "+ @@ -532,10 +531,9 @@ void LogLineBox::setEvent(int line,RDLogLine::TransType next_type, toString("M/d hh:mm")); } line_description_label-> - setText(RDResolveNowNext(line_description_template,line_logline, - line)); + setText(line_logline->resolveWildcards(line_description_template)); line_artist_label-> - setText(RDResolveNowNext(line_artist_template,line_logline,line)); + setText(line_logline->resolveWildcards(line_artist_template)); line_up_label-> setText(RDGetTimeLength(line_logline->playPosition(),true,true)); line_down_label-> @@ -546,8 +544,8 @@ void LogLineBox::setEvent(int line,RDLogLine::TransType next_type, if(logline->cutNumber()>=0) { line_cut_label-> setText(QString().sprintf("%03u",logline->cutNumber())); - line_outcue_label-> - setText(RDResolveNowNext(line_outcue_template,line_logline,line)); + line_outcue_label-> + setText(line_logline->resolveWildcards(line_outcue_template)); } else { setBackgroundColor(QColor(LOGLINEBOX_MISSING_COLOR)); @@ -662,15 +660,14 @@ void LogLineBox::setEvent(int line,RDLogLine::TransType next_type, line_length_label-> setText(RDGetTimeLength(line_logline->effectiveLength(), false,false)); - line_title_label-> - setText(RDResolveNowNext(line_title_template,line_logline,line)); + setText(line_logline->resolveWildcards(line_title_template)); line_description_label-> - setText(RDResolveNowNext(line_description_template,line_logline,line)); + setText(line_logline->resolveWildcards(line_description_template)); line_artist_label-> - setText(RDResolveNowNext(line_artist_template,line_logline,line)); + setText(line_logline->resolveWildcards(line_artist_template)); line_outcue_label-> - setText(RDResolveNowNext(line_outcue_template,line_logline,line)); + setText(line_logline->resolveWildcards(line_outcue_template)); delete cart; delete cut; setMode(line_mode); diff --git a/rdlibrary/audio_cart.cpp b/rdlibrary/audio_cart.cpp index 22a7ef5d..43921b5a 100644 --- a/rdlibrary/audio_cart.cpp +++ b/rdlibrary/audio_cart.cpp @@ -567,7 +567,7 @@ void AudioCart::ripCutData() rdcart_controls->label_edit->setText(label); RDCut *cut=new RDCut(cutname); cut->setIsrc(rec->isrc(track)); - cut->setTrackMbId(rec->trackMbId(track)); + cut->setRecordingMbId(rec->trackRecordingMbId(track)); cut->setReleaseMbId(rec->discReleaseMbId()); delete cut; } diff --git a/rdlibrary/disk_ripper.cpp b/rdlibrary/disk_ripper.cpp index a1fb72ca..76bdd620 100644 --- a/rdlibrary/disk_ripper.cpp +++ b/rdlibrary/disk_ripper.cpp @@ -1068,7 +1068,7 @@ void DiskRipper::RipTrack(int track,int end_track,QString cutname,QString title) cart->setMetadata(rip_wave_datas[track-1]); cut->setDescription(rip_wave_datas[track-1]->title()); cut->setIsrc(rip_disc_record.isrc(rip_track_number-1)); - cut->setTrackMbId(rip_disc_record.trackMbId(rip_track_number-1)); + cut->setRecordingMbId(rip_disc_record.trackRecordingMbId(rip_track_number-1)); cut->setReleaseMbId(rip_disc_record.discReleaseMbId()); cart->clearPending(); SendNotification(RDNotification::AddAction,cart->number()); diff --git a/utils/rddbmgr/revertschema.cpp b/utils/rddbmgr/revertschema.cpp index 1bf5e0df..d89d6002 100644 --- a/utils/rddbmgr/revertschema.cpp +++ b/utils/rddbmgr/revertschema.cpp @@ -2,7 +2,7 @@ // // Revert Rivendell DB schema // -// (C) Copyright 2018-2019 Fred Gleason +// (C) Copyright 2018-2020 Fred Gleason // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License version 2 as @@ -54,7 +54,7 @@ bool MainObject::RevertSchema(int cur_schema,int set_schema,QString *err_msg) // if((cur_schema==313)&&(set_schemacur_schema)) { sql=QString("alter table CUTS add column ")+ - "TRACK_MBID varchar(40) after ISCI"; + "RECORDING_MBID varchar(40) after ISCI"; if(!RDSqlQuery::apply(sql,err_msg)) { return false; } sql=QString("alter table CUTS add column ")+ - "RELEASE_MBID varchar(40) after TRACK_MBID"; + "RELEASE_MBID varchar(40) after RECORDING_MBID"; if(!RDSqlQuery::apply(sql,err_msg)) { return false; }