2020-02-03 Fred Gleason <fredg@paravelsystems.com>

* 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.
This commit is contained in:
Fred Gleason 2020-02-03 18:17:24 -05:00
parent 51fdae1ca6
commit f033d3b4b0
24 changed files with 264 additions and 200 deletions

View File

@ -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 <fredg@paravelsystems.com>
* Added a 'MusicBrainz' CD metadata lookup method in 'RDMbLookup'.
@ -19495,3 +19495,11 @@
2020-02-03 Fred Gleason <fredg@paravelsystems.com>
* 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 <fredg@paravelsystems.com>
* 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.

View File

@ -37,7 +37,9 @@
<row><entry><userinput>%t</userinput></entry><entry><userinput>%T</userinput></entry><entry>Title</entry></row>
<row><entry><userinput>%u</userinput></entry><entry><userinput>%U</userinput></entry><entry>User Definied</entry></row>
<row><entry><userinput>%v</userinput></entry><entry><userinput>%V</userinput></entry><entry>Event length (seconds, rounded down)</entry></row>
<row><entry><userinput>%w</userinput></entry><entry><userinput>%W</userinput></entry><entry>[Unassigned]</entry></row>
<row><entry><userinput>%wi</userinput></entry><entry><userinput>%WI</userinput></entry><entry>International Standard Recording Code</entry></row>
<row><entry><userinput>%wm</userinput></entry><entry><userinput>%Wm</userinput></entry><entry>MusicBrainz Recording ID</entry></row>
<row><entry><userinput>%wr</userinput></entry><entry><userinput>%Wr</userinput></entry><entry>MusicBrainz Release ID</entry></row>
<row><entry><userinput>%x</userinput></entry><entry><userinput>%X</userinput></entry><entry>Log line ID (numeric)</entry></row>
<row><entry><userinput>%y</userinput></entry><entry><userinput>%Y</userinput></entry><entry>Release Year</entry></row>
<row><entry><userinput>%z</userinput></entry><entry><userinput>%Z</userinput></entry><entry>Log line number (numeric)</entry></row>

View File

@ -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.

View File

@ -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\

View File

@ -2,7 +2,7 @@
//
// Abstract a Rivendell Cart.
//
// (C) Copyright 2002-2019 Fred Gleason <fredg@paravelsystems.com>
// (C) Copyright 2002-2020 Fred Gleason <fredg@paravelsystems.com>
//
// 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<RDWaveData> *data,const QString &xml)
data->back().setIsci(GetXmlValue("isci",f0[i]).toString());
cartdata.setMetadataFound(true);
}
if(f0[i].contains("<recordingMbId>")) {
data->back().setRecordingMbId(GetXmlValue("recordingMbId",f0[i]).
toString());
cartdata.setMetadataFound(true);
}
if(f0[i].contains("<releaseMbId>")) {
data->back().setReleaseMbId(GetXmlValue("releaseMbId",
f0[i]).toString());
cartdata.setMetadataFound(true);
}
if(f0[i].contains("<length>")) {
data->back().setLength(GetXmlValue("length",f0[i]).toInt());
cartdata.setMetadataFound(true);

View File

@ -2,7 +2,7 @@
//
// Abstract a Rivendell Cart
//
// (C) Copyright 2002-2016 Fred Gleason <fredg@paravelsystems.com>
// (C) Copyright 2002-2020 Fred Gleason <fredg@paravelsystems.com>
//
// 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

View File

@ -2,7 +2,7 @@
//
// Abstract a Rivendell Cut.
//
// (C) Copyright 2002-2016 Fred Gleason <fredg@paravelsystems.com>
// (C) Copyright 2002-2020 Fred Gleason <fredg@paravelsystems.com>
//
// 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","");

View File

@ -2,7 +2,7 @@
//
// Abstract a Rivendell Cut
//
// (C) Copyright 2002-2004,2016 Fred Gleason <fredg@paravelsystems.com>
// (C) Copyright 2002-2020 Fred Gleason <fredg@paravelsystems.com>
//
// 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;

View File

@ -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<CDROM_LEADOUT;i++) {
disc_track_title[i]="";
disc_track_extended[i]="";
disc_track_artist[i]="";
disc_track_isrc[i]="";
disc_track_offset[i]=0;
disc_track_recording_mb_id[i]="";
}
}
@ -85,6 +87,18 @@ void RDDiscRecord::setDiscId(unsigned id)
}
QString RDDiscRecord::discMbId() const
{
return disc_disc_mb_id;
}
void RDDiscRecord::setDiscMbId(const QString &mbid)
{
disc_disc_mb_id=mbid;
}
QString RDDiscRecord::mcn() const
{
return disc_mcn;
@ -97,15 +111,15 @@ void RDDiscRecord::setMcn(const QString &mcn)
}
QString RDDiscRecord::discMbId() const
QString RDDiscRecord::trackRecordingMbId(int track) const
{
return disc_disc_mb_id;
return disc_track_recording_mb_id[track];
}
void RDDiscRecord::setDiscMbId(const QString &str)
void RDDiscRecord::setTrackRecordingMbId(int track,const QString &str)
{
disc_disc_mb_id=str;
disc_track_recording_mb_id[track]=str;
}
@ -321,18 +335,6 @@ void RDDiscRecord::setTrackArtist(int track,QString artist)
}
QString RDDiscRecord::trackMbId(int track) const
{
return disc_track_mbid[track];
}
void RDDiscRecord::setTrackMbId(int track,const QString &str)
{
disc_track_mbid[track]=str;
}
bool RDDiscRecord::hasIsrcs() const
{
for(int i=0;i<tracks();i++) {
@ -385,7 +387,7 @@ QString RDDiscRecord::dump()
ret+="trackOffset"+num+QString().sprintf("%u",trackOffset(i))+"\n";
ret+="trackTitle"+num+trackTitle(i)+"\n";
ret+="trackExtended"+num+trackExtended(i)+"\n";
ret+="trackMbId"+num+trackMbId(i)+"\n";
ret+="trackRecordingMbId"+num+trackRecordingMbId(i)+"\n";
ret+="isrc"+num+isrc(i)+"\n";
}

View File

@ -44,11 +44,11 @@ class RDDiscRecord
unsigned discLength() const;
void setDiscLength(unsigned len);
unsigned discId() const;
QString discMbId() const;
void setDiscMbId(const QString &mbid);
void setDiscId(unsigned id);
QString mcn() const;
void setMcn(const QString &mcn);
QString discMbId() const;
void setDiscMbId(const QString &str);
QString discReleaseMbId() const;
void setDiscReleaseMbId(const QString &mbid);
QString mbSubmissionUrl() const;
@ -79,8 +79,8 @@ class RDDiscRecord
void setTrackExtended(int track,QString text);
QString trackArtist(int track) const;
void setTrackArtist(int track,QString artist);
QString trackMbId(int track) const;
void setTrackMbId(int track,const QString &str);
QString trackRecordingMbId(int track) const;
void setTrackRecordingMbId(int track,const QString &str);
bool hasIsrcs() const;
QString isrc(int track) const;
void setIsrc(int track,QString isrc);
@ -89,8 +89,8 @@ class RDDiscRecord
private:
int disc_tracks;
unsigned disc_disc_id;
QString disc_mcn;
QString disc_disc_mb_id;
QString disc_mcn;
QString disc_disc_release_mb_id;
QString disc_mb_submission_url;
unsigned disc_disc_length;
@ -106,9 +106,9 @@ class RDDiscRecord
QString disc_track_title[CDROM_LEADOUT];
QString disc_track_extended[CDROM_LEADOUT];
QString disc_track_artist[CDROM_LEADOUT];
QString disc_track_mbid[CDROM_LEADOUT];
QString disc_track_isrc[CDROM_LEADOUT];
unsigned disc_track_offset[CDROM_LEADOUT];
QString disc_track_recording_mb_id[CDROM_LEADOUT];
};

View File

@ -2,7 +2,7 @@
//
// A container class for a Rivendell Log Line.
//
// (C) Copyright 2002-2019 Fred Gleason <fredg@paravelsystems.com>
// (C) Copyright 2002-2020 Fred Gleason <fredg@paravelsystems.com>
//
// 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<QString> dts;
QString ret=str;
while((ptr=ret.find(code,ptr))>=0) {
for(int i=ptr+3;i<ret.length();i++) {
if(ret.at(i)==')') {
dts.push_back(ret.mid(ptr+3,i-ptr-3));
ptr+=(i-ptr-3);
break;
}
}
}
if(dt.isValid()&&(!dt.time().isNull())) {
for(unsigned i=0;i<dts.size();i++) {
ret.replace(code+dts[i]+")",dt.toString(dts[i]));
}
}
else {
for(unsigned i=0;i<dts.size();i++) {
ret.replace(code+dts[i]+")","");
}
}
return ret;
}
QString RDLogLine::resolveWildcards(unsigned cartnum,const QString &pattern)
{
RDLogLine logline;

View File

@ -2,7 +2,7 @@
//
// A container class for a Rivendell Log Line.
//
// (C) Copyright 2002-2016 Fred Gleason <fredg@paravelsystems.com>
// (C) Copyright 2002-2020 Fred Gleason <fredg@paravelsystems.com>
//
// 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;

View File

@ -31,7 +31,6 @@
#include "rdlog.h"
#include "rdlogplay.h"
#include "rdmixer.h"
#include "rdnownext.h"
#include "rdsvc.h"
#include "rdweb.h"

View File

@ -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) {

View File

@ -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 <fredg@paravelsystems.com>
//
// 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 <vector>
#include <qdatetime.h>
#include <rdnownext.h>
#include <rdweb.h>
void RDResolveNowNextDateTime(QString *str,const QString &code,
const QDateTime &dt)
{
int ptr=0;
std::vector<QString> dts;
while((ptr=str->find(code,ptr))>=0) {
for(int i=ptr+3;i<str->length();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;i<dts.size();i++) {
str->replace(code+dts[i]+")",dt.toString(dts[i]));
}
}
else {
for(unsigned i=0;i<dts.size();i++) {
str->replace(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;
}

View File

@ -1,29 +0,0 @@
// rdnownext.h
//
// Rivendell Metadata Wildcards Implementation
//
// (C) Copyright 2008-2019 Fred Gleason <fredg@paravelsystems.com>
//
// 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 <rdlog_line.h>
QString RDResolveNowNext(const QString &pattern,RDLogLine *ll,int line);
#endif // RDNOWNEXT_H

View File

@ -2,7 +2,7 @@
//
// Cart slot label widget for RDCartSlot
//
// (C) Copyright 2012-2019 Fred Gleason <fredg@paravelsystems.com>
// (C) Copyright 2012-2020 Fred Gleason <fredg@paravelsystems.com>
//
// 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();

View File

@ -2,7 +2,7 @@
//
// A Container Class for Audio Meta Data.
//
// (C) Copyright 2002-2019 Fred Gleason <fredg@paravelsystems.com>
// (C) Copyright 2002-2020 Fred Gleason <fredg@paravelsystems.com>
//
// 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;

View File

@ -2,7 +2,7 @@
//
// A Container Class for Audio Meta Data.
//
// (C) Copyright 2002-2019 Fred Gleason <fredg@paravelsystems.com>
// (C) Copyright 2002-2020 Fred Gleason <fredg@paravelsystems.com>
//
// 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;

View File

@ -21,7 +21,6 @@
#include <qpainter.h>
#include <rdconf.h>
#include <rdnownext.h>
#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);

View File

@ -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;
}

View File

@ -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());

View File

@ -2,7 +2,7 @@
//
// Revert Rivendell DB schema
//
// (C) Copyright 2018-2019 Fred Gleason <fredg@paravelsystems.com>
// (C) Copyright 2018-2020 Fred Gleason <fredg@paravelsystems.com>
//
// 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_schema<cur_schema)) {
DropColumn("CUTS","RELEASE_MBID");
DropColumn("CUTS","TRACK_MBID");
DropColumn("CUTS","RECORDING_MBID");
WriteSchemaVersion(--cur_schema);
}

View File

@ -9879,13 +9879,13 @@ bool MainObject::UpdateSchema(int cur_schema,int set_schema,QString *err_msg)
if((cur_schema<313)&&(set_schema>cur_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;
}