mirror of
https://github.com/ElvishArtisan/rivendell.git
synced 2025-04-09 14:33:28 +02:00
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:
parent
51fdae1ca6
commit
f033d3b4b0
10
ChangeLog
10
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 <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.
|
||||
|
@ -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>
|
||||
|
@ -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.
|
||||
|
@ -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\
|
||||
|
@ -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);
|
||||
|
@ -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
|
||||
|
@ -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","");
|
||||
|
@ -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;
|
||||
|
@ -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";
|
||||
}
|
||||
|
||||
|
@ -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];
|
||||
};
|
||||
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -31,7 +31,6 @@
|
||||
#include "rdlog.h"
|
||||
#include "rdlogplay.h"
|
||||
#include "rdmixer.h"
|
||||
#include "rdnownext.h"
|
||||
#include "rdsvc.h"
|
||||
#include "rdweb.h"
|
||||
|
||||
|
@ -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) {
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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
|
@ -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();
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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());
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user