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

* Added an 'RSS_SCHEMAS' table to the database.
	* Incremented the database version to 319.
	* Added an 'RSS Schema' dropdown to the 'Edit Feed' dialog in
	rdadmin(1).
This commit is contained in:
Fred Gleason 2020-03-17 16:12:36 -04:00
parent 9eb6b5fae3
commit ff93b583f4
20 changed files with 465 additions and 144 deletions

View File

@ -19825,3 +19825,8 @@
'RDFeed::setChannelEditor()' methods.
* Added an 'Editor' control to the 'Channel' controls in the
'Edit Feed' dialog in rdadmin(1).
2020-03-16 Fred Gleason <fredg@paravelsystems.com>
* Added an 'RSS_SCHEMAS' table to the database.
* Incremented the database version to 319.
* Added an 'RSS Schema' dropdown to the 'Edit Feed' dialog in
rdadmin(1).

View File

@ -2,7 +2,7 @@
##
## docs/tables/automake.am for Rivendell
##
## (C) Copyright 2002-2018 Fred Gleason <fredg@salemradiolabs.com>
## (C) Copyright 2002-2020 Fred Gleason <fredg@salemradiolabs.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
@ -91,6 +91,7 @@ EXTRA_DIST = audio_cards.txt\
report_services.txt\
report_stations.txt\
reports.txt\
rss_schemas.txt\
rule_lines.txt\
service_clocks.txt\
service_perms.txt\

View File

@ -21,6 +21,7 @@ BASE_PREAMBLE varchar(191)
PURGE_URL varchar(191)
PURGE_USERNAME varchar(64)
PURGE_PASSWORD varchar(64)
RSS_SCHEMA int(10) unsigned From RSS_SCHEMAS.ID
HEADER_XML text
CHANNEL_XML text
ITEM_XML text

View File

@ -0,0 +1,11 @@
RSS_SCHEMAS Table Layout for Rivendell
The RSS_SCHEMAS table holds template data for various RSS schemas.
FIELD NAME TYPE REMARKS
---------------------------------------------------------------
ID int(10) unsigned Primary Key
NAME varchar(64)
HEADER_XML text From FEEDS.HEADER_XML
CHANNEL_XML text From FEEDS.CHANNEL_XML
ITEM_XML text From FEEDS.ITEM_XML

View File

@ -24,7 +24,7 @@
/*
* Current Database Version
*/
#define RD_VERSION_DATABASE 318
#define RD_VERSION_DATABASE 319
#endif // DBVERSION_H

View File

@ -359,6 +359,19 @@ void RDFeed::setPurgePassword(const QString &str) const
}
RDFeed::RssSchema RDFeed::rssSchema() const
{
return (RDFeed::RssSchema)RDGetSqlValue("FEEDS","KEY_NAME",feed_keyname,
"RSS_SCHEMA").toUInt();
}
void RDFeed::setRssSchema(RDFeed::RssSchema schema) const
{
SetRow("RSS_SCHEMA",(unsigned)schema);
}
QString RDFeed::headerXml() const
{
return RDGetSqlValue("FEEDS","KEY_NAME",feed_keyname,"HEADER_XML").
@ -991,36 +1004,45 @@ QString RDFeed::rssXml(QString *err_msg,bool *ok)
QString sql;
RDSqlQuery *q;
RDSqlQuery *q1;
RDFeed::RssSchema rss_schema=rssSchema();
QString schema_table="RSS_SCHEMAS";
if(ok!=NULL) {
*ok=false;
}
if(rss_schema==RDFeed::CustomSchema) {
schema_table="FEEDS";
}
sql=QString("select ")+
"CHANNEL_TITLE,"+ // 00
"CHANNEL_DESCRIPTION,"+ // 01
"CHANNEL_CATEGORY,"+ // 02
"CHANNEL_LINK,"+ // 03
"CHANNEL_COPYRIGHT,"+ // 04
"CHANNEL_EDITOR,"+ // 05
"CHANNEL_WEBMASTER,"+ // 06
"CHANNEL_LANGUAGE,"+ // 07
"LAST_BUILD_DATETIME,"+ // 08
"ORIGIN_DATETIME,"+ // 09
"HEADER_XML,"+ // 10
"CHANNEL_XML,"+ // 11
"ITEM_XML,"+ // 12
"BASE_URL,"+ // 13
"ID,"+ // 14
"UPLOAD_EXTENSION,"+ // 15
"CAST_ORDER,"+ // 16
"REDIRECT_PATH,"+ // 17
"BASE_PREAMBLE,"+ // 18
"AUDIENCE_METRICS,"+ // 19
"IS_SUPERFEED "+ // 20
"from FEEDS where "+
"KEY_NAME=\""+RDEscapeString(keyName())+"\"";
"FEEDS.CHANNEL_TITLE,"+ // 00
"FEEDS.CHANNEL_DESCRIPTION,"+ // 01
"FEEDS.CHANNEL_CATEGORY,"+ // 02
"FEEDS.CHANNEL_LINK,"+ // 03
"FEEDS.CHANNEL_COPYRIGHT,"+ // 04
"FEEDS.CHANNEL_EDITOR,"+ // 05
"FEEDS.CHANNEL_WEBMASTER,"+ // 06
"FEEDS.CHANNEL_LANGUAGE,"+ // 07
"FEEDS.LAST_BUILD_DATETIME,"+ // 08
"FEEDS.ORIGIN_DATETIME,"+ // 09
schema_table+".HEADER_XML,"+ // 10
schema_table+".CHANNEL_XML,"+ // 11
schema_table+".ITEM_XML,"+ // 12
"FEEDS.BASE_URL,"+ // 13
"FEEDS.ID,"+ // 14
"FEEDS.UPLOAD_EXTENSION,"+ // 15
"FEEDS.CAST_ORDER,"+ // 16
"FEEDS.REDIRECT_PATH,"+ // 17
"FEEDS.BASE_PREAMBLE,"+ // 18
"FEEDS.AUDIENCE_METRICS,"+ // 19
"FEEDS.IS_SUPERFEED "; // 20
if(rss_schema==RDFeed::CustomSchema) {
sql+="from FEEDS where ";
}
else {
sql+=QString("from FEEDS left join RSS_SCHEMAS ")+
"on FEEDS.RSS_SCHEMA=RSS_SCHEMAS.ID where ";
}
sql+="FEEDS.KEY_NAME=\""+RDEscapeString(keyName())+"\"";
q=new RDSqlQuery(sql);
if(!q->first()) {
*err_msg="no feed matches the supplied key name";
@ -1298,6 +1320,103 @@ QString RDFeed::errorString(RDFeed::Error err)
}
QString RDFeed::rssSchemaString(RDFeed::RssSchema schema)
{
QString ret="Unknown";
switch(schema) {
case RDFeed::CustomSchema:
ret="[custom schema]";
break;
case RDFeed::Rss202Schema:
ret="RSS 2.0.2";
break;
case RDFeed::LastSchema:
break;
}
return ret;
}
QString RDFeed::rssHeaderTemplate(RDFeed::RssSchema schema)
{
QString ret;
switch(schema) {
case RDFeed::Rss202Schema:
ret=QString("<?xml version=\"1.0\" encoding=\"UTF-8\"?>")+"\n"+
"<rss version=\"2.0\" xmlns:atom=\"http://www.w3.org/2005/Atom\">\n";
break;
case RDFeed::CustomSchema:
case RDFeed::LastSchema:
break;
}
return ret;
}
QString RDFeed::rssChannelTemplate(RDFeed::RssSchema schema)
{
QString ret;
switch(schema) {
case RDFeed::Rss202Schema:
ret=QString("<title>%TITLE%</title>\n")+
"<description>%DESCRIPTION%</description>\n"+
"<category>%CATEGORY%</category>\n"+
"<link>%LINK%</link>\n"+
"<language>%LANGUAGE%</language>\n"+
"<copyright>%COPYRIGHT%</copyright>\n"+
"<lastBuildDate>%BUILD_DATE%</lastBuildDate>\n"+
"<pubDate>%PUBLISH_DATE%</pubDate>\n"+
"<managingEditor>%EDITOR%</managingEditor>\n"+
"<webMaster>%WEBMASTER%</webMaster>\n"+
"<generator>%GENERATOR%</generator>\n"+
"<image>%IMAGE%</image>\n"+
"<atom:link href=\"%FEED_URL%\" rel=\"self\" type=\"application/rss+xml\" />\n";
break;
case RDFeed::CustomSchema:
case RDFeed::LastSchema:
break;
}
return ret;
}
QString RDFeed::rssItemTemplate(RDFeed::RssSchema schema)
{
QString ret;
switch(schema) {
case RDFeed::Rss202Schema:
ret=QString("<title>%ITEM_TITLE%</title>\n")+
"<link>%ITEM_LINK%</link>\n"+
"<guid isPermaLink=\"false\">%ITEM_GUID%</guid>\n"+
"<description>%ITEM_DESCRIPTION%</description>\n"+
"<author>%ITEM_AUTHOR%</author>\n"+
"<comments>%ITEM_COMMENTS%</comments>\n"+
"<source url=\"%ITEM_SOURCE_URL%\">%ITEM_SOURCE_TEXT%</source>\n"+
"<enclosure url=\"%ITEM_AUDIO_URL%\" length=\"%ITEM_AUDIO_LENGTH%\" type=\"audio/mpeg\" />\n"+
"<category>%ITEM_CATEGORY%</category>\n"+
"<pubDate>%ITEM_PUBLISH_DATE%</pubDate>\n";
break;
case RDFeed::CustomSchema:
case RDFeed::LastSchema:
break;
}
return ret;
}
unsigned RDFeed::CreateCast(QString *filename,int bytes,int msecs) const
{
QString sql;
@ -1391,7 +1510,7 @@ QString RDFeed::ResolveChannelWildcards(RDSqlQuery *chan_q)
QString RDFeed::ResolveItemWildcards(RDSqlQuery *item_q,RDSqlQuery *chan_q)
{
QString ret=" "+chan_q->value(11).toString();
QString ret=" "+chan_q->value(12).toString();
ret.replace("\n","\r\n ");
ret.replace("%ITEM_TITLE%",RDXmlEscape(item_q->value(0).toString()));

View File

@ -39,6 +39,7 @@ class RDFeed : public QObject
enum Error {ErrorOk=0,ErrorNoFile=1,ErrorCannotOpenFile=2,
ErrorUnsupportedType=3,ErrorUploadFailed=4,ErrorGeneral=5};
enum MediaLinkMode {LinkNone=0,LinkDirect=1,LinkCounted=2};
enum RssSchema {CustomSchema=0,Rss202Schema=1,LastSchema=2};
RDFeed(const QString &keyname,RDConfig *config,QObject *parent=0);
RDFeed(unsigned id,RDConfig *config,QObject *parent=0);
QString keyName() const;
@ -76,6 +77,8 @@ class RDFeed : public QObject
void setPurgeUsername(const QString &str) const;
QString purgePassword() const;
void setPurgePassword(const QString &str) const;
RssSchema rssSchema() const;
void setRssSchema(RssSchema schema) const;
QString headerXml() const;
void setHeaderXml(const QString &str);
QString channelXml() const;
@ -130,6 +133,10 @@ class RDFeed : public QObject
static unsigned create(const QString &keyname,bool enable_users,
QString *err_msg,const QString &exemplar="");
static QString errorString(RDFeed::Error err);
static QString rssSchemaString(RDFeed::RssSchema schema);
static QString rssHeaderTemplate(RssSchema schema);
static QString rssChannelTemplate(RssSchema schema);
static QString rssItemTemplate(RssSchema schema);
signals:
void postProgressChanged(int step);

View File

@ -39,6 +39,9 @@
EditFeed::EditFeed(const QString &feed,QWidget *parent)
: RDDialog(parent)
{
QString sql;
RDSqlQuery *q=NULL;
//
// Fix the Window Size
//
@ -63,7 +66,7 @@ EditFeed::EditFeed(const QString &feed,QWidget *parent)
feed_is_superfeed_box->insertItem(0,tr("No"));
feed_is_superfeed_box->insertItem(1,tr("Yes"));
connect(feed_is_superfeed_box,SIGNAL(activated(int)),
this,SLOT(isSuperfeedChangedData(int)));
this,SLOT(comboboxActivatedData(int)));
feed_is_superfeed_label=new QLabel(tr("Is Superfeed")+":",this);
feed_is_superfeed_label->setAlignment(Qt::AlignRight|Qt::AlignVCenter);
feed_is_superfeed_label->setFont(labelFont());
@ -183,7 +186,7 @@ EditFeed::EditFeed(const QString &feed,QWidget *parent)
feed_purge_username_edit=new QLineEdit(this);
feed_purge_username_edit->setMaxLength(64);
connect(feed_purge_username_edit,SIGNAL(textChanged(const QString &)),
this,SLOT(purgeUsernameChangedData(const QString &)));
this,SLOT(lineeditChangedData(const QString &)));
feed_purge_username_label=
new QLabel(feed_purge_username_edit,tr("Username:"),this);
feed_purge_username_label->setFont(labelFont());
@ -216,14 +219,14 @@ EditFeed::EditFeed(const QString &feed,QWidget *parent)
//
// Normalize Check Box
//
feed_normalize_box=new QCheckBox(this);
feed_normalize_box->setChecked(true);
feed_normalize_check=new QCheckBox(this);
feed_normalize_check->setChecked(true);
feed_normalize_check_label=
new QLabel(feed_normalize_box,tr("Normalize"),this);
new QLabel(feed_normalize_check,tr("Normalize"),this);
feed_normalize_check_label->setFont(labelFont());
feed_normalize_check_label->setAlignment(Qt::AlignLeft|Qt::AlignVCenter);
connect(feed_normalize_box,SIGNAL(toggled(bool)),
this,SLOT(normalizeCheckData(bool)));
connect(feed_normalize_check,SIGNAL(toggled(bool)),
this,SLOT(checkboxToggledData(bool)));
//
// Normalize Level
@ -339,6 +342,27 @@ EditFeed::EditFeed(const QString &feed,QWidget *parent)
feed_redirect_url_label->setFont(labelFont());
feed_redirect_url_label->setAlignment(Qt::AlignRight|Qt::AlignVCenter);
//
// RSS Schema
//
feed_rss_schema_box=new QComboBox(this);
sql=QString("select ")+
"ID,"+ // 00
"NAME "+ // 01
"from RSS_SCHEMAS order by NAME";
q=new RDSqlQuery(sql);
while(q->next()) {
feed_rss_schema_box->
insertItem(feed_rss_schema_box->count(),q->value(1).toString(),
q->value(0).toUInt());
}
delete q;
connect(feed_rss_schema_box,SIGNAL(activated(int)),
this,SLOT(comboboxActivatedData(int)));
feed_rss_schema_label=new QLabel(tr("RSS Schema")+":",this);
feed_rss_schema_label->setAlignment(Qt::AlignRight|Qt::AlignVCenter);
feed_rss_schema_label->setFont(labelFont());
//
// Header XML
//
@ -403,6 +427,13 @@ EditFeed::EditFeed(const QString &feed,QWidget *parent)
feed_purge_url_edit->setText(feed_feed->purgeUrl());
feed_purge_username_edit->setText(feed_feed->purgeUsername());
feed_purge_password_edit->setText(feed_feed->purgePassword());
RDFeed::RssSchema schema=feed_feed->rssSchema();
for(int i=0;i<feed_rss_schema_box->count();i++) {
if(feed_rss_schema_box->itemData(i).toInt()==schema) {
feed_rss_schema_box->setCurrentItem(i);
continue;
}
}
feed_header_xml_edit->setPlainText(feed_feed->headerXml());
feed_channel_xml_edit->setPlainText(feed_feed->channelXml());
feed_item_xml_edit->setPlainText(feed_feed->itemXml());
@ -417,21 +448,21 @@ EditFeed::EditFeed(const QString &feed,QWidget *parent)
feed_extension_edit->setText(feed_feed->uploadExtension());
feed_format_edit->setText(feed_settings.description());
if(feed_feed->normalizeLevel()>0) {
feed_normalize_box->setChecked(false);
feed_normalize_check->setChecked(false);
}
else {
feed_normalize_box->setChecked(true);
feed_normalize_check->setChecked(true);
feed_normalize_spin->setValue(feed_feed->normalizeLevel()/1000);
}
feed_castorder_box->setCurrentItem(feed_feed->castOrder());
feed_media_link_mode_box->setCurrentItem((int)feed_feed->mediaLinkMode());
feed_redirect_url_edit->setText(feed_feed->redirectPath());
feed_redirect_check->setChecked(!feed_redirect_url_edit->text().isEmpty());
normalizeCheckData(feed_normalize_box->isChecked());
isSuperfeedChangedData(0);
connect(feed_redirect_check,SIGNAL(toggled(bool)),
this,SLOT(redirectToggledData(bool)));
UpdateControlState();
}
@ -447,84 +478,22 @@ QSizePolicy EditFeed::sizePolicy() const
}
void EditFeed::isSuperfeedChangedData(int n)
void EditFeed::comboboxActivatedData(int n)
{
bool superfeed=feed_is_superfeed_box->currentIndex();
bool redirected=feed_redirect_check->isChecked();
UpdateControlState();
}
feed_is_superfeed_label->setDisabled(redirected);
feed_is_superfeed_box->setDisabled(redirected);
feed_is_superfeed_button->setDisabled(redirected||(!superfeed));
feed_audience_metrics_check->setDisabled(redirected);
feed_audience_metrics_label->setDisabled(redirected);
void EditFeed::checkboxToggledData(bool state)
{
UpdateControlState();
}
feed_channel_title_edit->setDisabled(redirected);
feed_channel_description_edit->setDisabled(redirected);
feed_channel_category_edit->setDisabled(redirected);
feed_channel_link_edit->setDisabled(redirected);
feed_channel_copyright_edit->setDisabled(redirected);
feed_channel_editor_label->setDisabled(redirected);
feed_channel_editor_edit->setDisabled(redirected);
feed_channel_webmaster_label->setDisabled(redirected);
feed_channel_webmaster_edit->setDisabled(redirected);
feed_channel_language_edit->setDisabled(redirected);
feed_channel_title_label->setDisabled(redirected);
feed_channel_category_label->setDisabled(redirected);
feed_channel_link_label->setDisabled(redirected);
feed_channel_copyright_label->setDisabled(redirected);
feed_channel_language_label->setDisabled(redirected);
feed_channel_description_label->setDisabled(redirected);
feed_redirect_url_label->setEnabled(redirected);
feed_redirect_url_edit->setEnabled(redirected);
feed_base_url_edit->setDisabled(redirected);
feed_purge_url_edit->setDisabled(redirected);
feed_purge_username_label->setDisabled(redirected);
feed_purge_username_edit->setDisabled(redirected);
feed_purge_password_label->setDisabled(redirected);
feed_purge_password_edit->setDisabled(redirected);
feed_max_shelf_life_spin->setDisabled(redirected||superfeed);
feed_autopost_box->setDisabled(redirected||superfeed);
feed_keep_metadata_box->setDisabled(redirected);
feed_keep_metadata_label->setDisabled(redirected);
feed_format_edit->setDisabled(redirected||superfeed);
feed_normalize_box->setDisabled(redirected||superfeed);
feed_extension_edit->setDisabled(redirected||superfeed);
feed_castorder_box->setDisabled(redirected);
feed_format_button->setDisabled(redirected||superfeed);
feed_base_url_label->setDisabled(redirected);
feed_base_preamble_label->setDisabled(redirected);
feed_purge_url_label->setDisabled(redirected);
feed_max_shelf_life_label->setDisabled(redirected||superfeed);
feed_max_shelf_life_unit_label->setDisabled(redirected||superfeed);
feed_autopost_label->setDisabled(redirected||superfeed);
feed_format_label->setDisabled(redirected||superfeed);
feed_normalize_check_label->setDisabled(redirected||superfeed);
feed_normalize_unit_label->setDisabled(redirected||superfeed);
feed_castorder_label->setDisabled(redirected);
feed_extension_label->setDisabled(redirected||superfeed);
feed_channel_section_groupbox->setDisabled(redirected);
feed_normalize_label->
setDisabled(redirected||superfeed||(!feed_normalize_box->isChecked()));
feed_normalize_spin->
setDisabled(redirected||superfeed||(!feed_normalize_box->isChecked()));
feed_normalize_unit_label->
setDisabled(redirected||superfeed||(!feed_normalize_box->isChecked()));
feed_media_link_mode_box->setDisabled(redirected||superfeed);
feed_media_link_mode_label->setDisabled(redirected||superfeed);
feed_header_xml_label->setDisabled(redirected);
feed_header_xml_edit->setDisabled(redirected);
feed_channel_xml_label->setDisabled(redirected);
feed_channel_xml_edit->setDisabled(redirected);
feed_item_xml_label->setDisabled(redirected|superfeed);
feed_item_xml_edit->setDisabled(redirected||superfeed);
void EditFeed::lineeditChangedData(const QString &str)
{
UpdateControlState();
}
@ -536,17 +505,6 @@ void EditFeed::selectSubfeedsData()
}
void EditFeed::purgeUsernameChangedData(const QString &username)
{
feed_purge_password_label->
setDisabled(username.isEmpty()||feed_purge_url_edit->text().isEmpty()||
feed_redirect_check->isChecked());
feed_purge_password_edit->
setDisabled(username.isEmpty()||feed_purge_url_edit->text().isEmpty()||
feed_redirect_check->isChecked());
}
void EditFeed::setFormatData()
{
RDExportSettingsDialog *dialog=
@ -557,13 +515,6 @@ void EditFeed::setFormatData()
}
void EditFeed::normalizeCheckData(bool state)
{
feed_normalize_label->setEnabled(state);
feed_normalize_spin->setEnabled(state);
feed_normalize_unit_label->setEnabled(state);
}
void EditFeed::redirectToggledData(bool state)
{
if(state) {
@ -577,7 +528,7 @@ void EditFeed::redirectToggledData(bool state)
return;
}
}
isSuperfeedChangedData(0);
UpdateControlState();
}
@ -624,6 +575,9 @@ void EditFeed::okData()
feed_feed->setPurgeUrl(feed_purge_url_edit->text());
feed_feed->setPurgeUsername(feed_purge_username_edit->text());
feed_feed->setPurgePassword(feed_purge_password_edit->text());
feed_feed->
setRssSchema((RDFeed::RssSchema)feed_rss_schema_box->
itemData(feed_rss_schema_box->currentIndex()).toUInt());
feed_feed->setHeaderXml(feed_header_xml_edit->text());
feed_feed->setChannelXml(feed_channel_xml_edit->text());
feed_feed->setItemXml(feed_item_xml_edit->text());
@ -638,7 +592,7 @@ void EditFeed::okData()
feed_feed->setUploadBitRate(feed_settings.bitRate());
feed_feed->setUploadQuality(feed_settings.quality());
feed_feed->setUploadExtension(feed_extension_edit->text());
if(feed_normalize_box->isChecked()) {
if(feed_normalize_check->isChecked()) {
feed_feed->setNormalizeLevel(feed_normalize_spin->value()*1000);
}
else {
@ -703,7 +657,7 @@ void EditFeed::resizeEvent(QResizeEvent *e)
feed_format_label->setGeometry(5,398,145,20);
feed_format_button->setGeometry(450,398,40,24);
feed_normalize_box->setGeometry(155,422,15,15);
feed_normalize_check->setGeometry(155,422,15,15);
feed_normalize_check_label->setGeometry(175,420,83,20);
feed_normalize_spin->setGeometry(295,418,40,20);
feed_normalize_label->setGeometry(245,418,45,20);
@ -737,15 +691,111 @@ void EditFeed::resizeEvent(QResizeEvent *e)
feed_redirect_url_edit->setGeometry(85,626,405,20);
feed_redirect_url_label->setGeometry(40,626,40,19);
feed_header_xml_edit->setGeometry(615,10,size().width()-625,76);
feed_header_xml_label->setGeometry(520,10,90,19);
feed_rss_schema_label->setGeometry(520,10,90,19);
feed_rss_schema_box->setGeometry(615,10,200,19);
feed_channel_xml_edit->setGeometry(615,88,size().width()-625,216);
feed_channel_xml_label->setGeometry(520,88,90,19);
feed_header_xml_label->setGeometry(520,32,90,19);
feed_header_xml_edit->setGeometry(615,32,size().width()-625,76);
feed_item_xml_edit->setGeometry(615,310,size().width()-625,240);
feed_item_xml_label->setGeometry(520,310,90,19);
feed_channel_xml_label->setGeometry(520,110,90,19);
feed_channel_xml_edit->setGeometry(615,110,size().width()-625,216);
feed_item_xml_label->setGeometry(520,332,90,19);
feed_item_xml_edit->setGeometry(615,332,size().width()-625,240);
feed_ok_button->setGeometry(size().width()-180,size().height()-60,80,50);
feed_cancel_button->setGeometry(size().width()-90,size().height()-60,80,50);
}
void EditFeed::UpdateControlState()
{
bool superfeed=feed_is_superfeed_box->currentIndex();
bool redirected=feed_redirect_check->isChecked();
bool custom_schema=
feed_rss_schema_box->itemData(feed_rss_schema_box->currentIndex()).toInt()==
RDFeed::CustomSchema;
feed_is_superfeed_label->setDisabled(redirected);
feed_is_superfeed_box->setDisabled(redirected);
feed_is_superfeed_button->setDisabled(redirected||(!superfeed));
feed_audience_metrics_check->setDisabled(redirected);
feed_audience_metrics_label->setDisabled(redirected);
feed_channel_title_edit->setDisabled(redirected);
feed_channel_description_edit->setDisabled(redirected);
feed_channel_category_edit->setDisabled(redirected);
feed_channel_link_edit->setDisabled(redirected);
feed_channel_copyright_edit->setDisabled(redirected);
feed_channel_editor_label->setDisabled(redirected);
feed_channel_editor_edit->setDisabled(redirected);
feed_channel_webmaster_label->setDisabled(redirected);
feed_channel_webmaster_edit->setDisabled(redirected);
feed_channel_language_edit->setDisabled(redirected);
feed_channel_title_label->setDisabled(redirected);
feed_channel_category_label->setDisabled(redirected);
feed_channel_link_label->setDisabled(redirected);
feed_channel_copyright_label->setDisabled(redirected);
feed_channel_language_label->setDisabled(redirected);
feed_channel_description_label->setDisabled(redirected);
feed_redirect_url_label->setEnabled(redirected);
feed_redirect_url_edit->setEnabled(redirected);
feed_base_url_edit->setDisabled(redirected);
feed_purge_url_edit->setDisabled(redirected);
feed_purge_username_label->setDisabled(redirected);
feed_purge_username_edit->setDisabled(redirected);
feed_purge_password_label->setDisabled(redirected);
feed_purge_password_edit->setDisabled(redirected);
feed_max_shelf_life_spin->setDisabled(redirected||superfeed);
feed_autopost_box->setDisabled(redirected||superfeed);
feed_keep_metadata_box->setDisabled(redirected);
feed_keep_metadata_label->setDisabled(redirected);
feed_format_edit->setDisabled(redirected||superfeed);
feed_normalize_check->setDisabled(redirected||superfeed);
feed_extension_edit->setDisabled(redirected||superfeed);
feed_castorder_box->setDisabled(redirected);
feed_format_button->setDisabled(redirected||superfeed);
feed_base_url_label->setDisabled(redirected);
feed_base_preamble_label->setDisabled(redirected);
feed_purge_url_label->setDisabled(redirected);
feed_max_shelf_life_label->setDisabled(redirected||superfeed);
feed_max_shelf_life_unit_label->setDisabled(redirected||superfeed);
feed_autopost_label->setDisabled(redirected||superfeed);
feed_format_label->setDisabled(redirected||superfeed);
feed_normalize_check_label->setDisabled(redirected||superfeed);
feed_normalize_unit_label->setDisabled(redirected||superfeed);
feed_castorder_label->setDisabled(redirected);
feed_extension_label->setDisabled(redirected||superfeed);
feed_channel_section_groupbox->setDisabled(redirected);
feed_normalize_label->
setDisabled(redirected||superfeed||(!feed_normalize_check->isChecked()));
feed_normalize_spin->
setDisabled(redirected||superfeed||(!feed_normalize_check->isChecked()));
feed_normalize_unit_label->
setDisabled(redirected||superfeed||(!feed_normalize_check->isChecked()));
feed_media_link_mode_box->setDisabled(redirected||superfeed);
feed_media_link_mode_label->setDisabled(redirected||superfeed);
feed_header_xml_label->setDisabled(redirected||(!custom_schema));
feed_header_xml_edit->setDisabled(redirected||(!custom_schema));
feed_channel_xml_label->setDisabled(redirected||(!custom_schema));
feed_channel_xml_edit->setDisabled(redirected||(!custom_schema));
feed_item_xml_label->setDisabled(redirected||superfeed||(!custom_schema));
feed_item_xml_edit->setDisabled(redirected||superfeed||(!custom_schema));
feed_purge_password_label->
setDisabled(feed_purge_username_edit->text().isEmpty()||
feed_purge_url_edit->text().isEmpty()||
feed_redirect_check->isChecked());
feed_purge_password_edit->
setDisabled(feed_purge_username_edit->text().isEmpty()||
feed_purge_url_edit->text().isEmpty()||
feed_redirect_check->isChecked());
}

View File

@ -44,11 +44,12 @@ class EditFeed : public RDDialog
QSizePolicy sizePolicy() const;
private slots:
void isSuperfeedChangedData(int n);
// void isSuperfeedChangedData(int n);
void comboboxActivatedData(int n);
void checkboxToggledData(bool state);
void lineeditChangedData(const QString &str);
void selectSubfeedsData();
void purgeUsernameChangedData(const QString &username);
void setFormatData();
void normalizeCheckData(bool state);
void redirectToggledData(bool state);
void okData();
void cancelData();
@ -57,6 +58,7 @@ class EditFeed : public RDDialog
void resizeEvent(QResizeEvent *e);
private:
void UpdateControlState();
RDFeed *feed_feed;
QLabel *feed_keyname_label;
QLineEdit *feed_keyname_edit;
@ -82,6 +84,8 @@ class EditFeed : public RDDialog
QLineEdit *feed_purge_username_edit;
QLabel *feed_purge_password_label;
QLineEdit *feed_purge_password_edit;
QLabel *feed_rss_schema_label;
QComboBox *feed_rss_schema_box;
QTextEdit *feed_header_xml_edit;
QTextEdit *feed_channel_xml_edit;
QTextEdit *feed_item_xml_edit;
@ -90,7 +94,7 @@ class EditFeed : public RDDialog
QCheckBox *feed_keep_metadata_box;
RDSettings feed_settings;
QLineEdit *feed_format_edit;
QCheckBox *feed_normalize_box;
QCheckBox *feed_normalize_check;
QLabel *feed_normalize_label;
QSpinBox *feed_normalize_spin;
QLineEdit *feed_extension_edit;

View File

@ -1669,6 +1669,10 @@ Feeds</source>
<source>Editor:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>RSS Schema</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>EditFeedPerms</name>

View File

@ -1552,6 +1552,10 @@ Feeds</source>
<source>Editor:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>RSS Schema</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>EditFeedPerms</name>

View File

@ -1672,6 +1672,10 @@ Feeds</source>
<source>Editor:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>RSS Schema</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>EditFeedPerms</name>

View File

@ -1224,6 +1224,10 @@ Feeds</source>
<source>Editor:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>RSS Schema</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>EditFeedPerms</name>

View File

@ -1514,6 +1514,10 @@ Feeds</source>
<source>Editor:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>RSS Schema</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>EditFeedPerms</name>

View File

@ -1514,6 +1514,10 @@ Feeds</source>
<source>Editor:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>RSS Schema</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>EditFeedPerms</name>

View File

@ -1524,6 +1524,10 @@ Feeds</source>
<source>Editor:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>RSS Schema</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>EditFeedPerms</name>

View File

@ -28,6 +28,21 @@
#define RDDBMGR_USAGE "[options]\n"
//
// RSS Templates
//
//
// RSS XML Templates (for the 'RSS_SCHEMAS' table)
//
#define RSS_2_0_2_NAME "RSS 2.0.2"
#define RSS_2_0_2_HEADER_XML "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<rss version=\"2.0\" xmlns:atom=\"http://www.w3.org/2005/Atom\">"
#define RSS_2_0_2_CHANNEL_XML "<title>%TITLE%</title>\n<description>%DESCRIPTION%</description>\n<category>%CATEGORY%</category>\n<link>%LINK%</link>\n<language>%LANGUAGE%</language>\n<copyright>%COPYRIGHT%</copyright>\n<lastBuildDate>%BUILD_DATE%</lastBuildDate>\n<pubDate>%PUBLISH_DATE%</pubDate>\n<managingEditor>%EDITOR%</managingEditor>\n<webMaster>%WEBMASTER%</webMaster>\n<generator>%GENERATOR%</generator>\n<image>%IMAGE%</image>\n<atom:link href=\"%FEED_URL%\" rel=\"self\" type=\"application/rss+xml\" />"
#define RSS_2_0_2_ITEM_XML "<title>%ITEM_TITLE%</title>\n<link>%ITEM_LINK%</link>\n<guid isPermaLink=\"false\">%ITEM_GUID%</guid>\n<description>%ITEM_DESCRIPTION%</description>\n<author>%ITEM_AUTHOR%</author>\n<comments>%ITEM_COMMENTS%</comments>\n<source url=\"%ITEM_SOURCE_URL%\">%ITEM_SOURCE_TEXT%</source>\n<enclosure url=\"%ITEM_AUDIO_URL%\" length=\"%ITEM_AUDIO_LENGTH%\" type=\"audio/mpeg\" />\n<category>%ITEM_CATEGORY%</category>\n<pubDate>%ITEM_PUBLISH_DATE%</pubDate>"
class MainObject : public QObject
{
public:

View File

@ -41,6 +41,40 @@ bool MainObject::RevertSchema(int cur_schema,int set_schema,QString *err_msg)
// NEW SCHEMA REVERSIONS GO HERE...
//
// Revert 319
//
if((cur_schema==319)&&(set_schema<cur_schema)) {
sql=QString("select ID,RSS_SCHEMA from FEEDS where RSS_SCHEMA!=0");
q=new RDSqlQuery(sql);
while(q->next()) {
sql=QString("select ")+
"HEADER_XML,"+ // 00
"CHANNEL_XML,"+ // 01
"ITEM_XML "+ // 02
"from RSS_SCHEMAS where "+
QString().sprintf("ID=%u",q->value(1).toUInt());
q1=new RDSqlQuery(sql);
if(q1->first()) {
QString("update FEEDS set ")+
"HEADER_XML=\""+RDEscapeString(q1->value(0).toString())+"\","+
"CHANNEL_XML=\""+RDEscapeString(q1->value(1).toString())+"\","+
"ITEM_XML=\""+RDEscapeString(q1->value(2).toString())+"\" "+
"where "+
QString().sprintf("ID=%u",q->value(0).toUInt());
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
}
delete q1;
}
delete q;
DropColumn("FEEDS","RSS_SCHEMA");
DropTable("RSS_SCHEMAS");
WriteSchemaVersion(--cur_schema);
}
//
// Revert 318
//

View File

@ -160,7 +160,7 @@ void MainObject::InitializeSchemaMap() {
global_version_map["3.1"]=310;
global_version_map["3.2"]=311;
global_version_map["3.3"]=314;
global_version_map["3.4"]=318;
global_version_map["3.4"]=319;
}

View File

@ -23,6 +23,7 @@
#include <rdcart.h>
#include <rddb.h>
#include <rdescape_string.h>
#include <rdfeed.h>
#include <rdpaths.h>
#include "rddbmgr.h"
@ -9965,6 +9966,51 @@ bool MainObject::UpdateSchema(int cur_schema,int set_schema,QString *err_msg)
WriteSchemaVersion(++cur_schema);
}
if((cur_schema<319)&&(set_schema>cur_schema)) {
sql=QString("create table RSS_SCHEMAS (")+
"ID int unsigned primary key,"+
"NAME varchar(64) unique not null,"+
"HEADER_XML text,"+
"CHANNEL_XML text,"+
"ITEM_XML text,"+
"index NAME_IDX(NAME))";
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
for(int i=0;i<RDFeed::LastSchema;i++) {
RDFeed::RssSchema schema=(RDFeed::RssSchema)i;
sql=QString("insert into RSS_SCHEMAS set ")+
QString().sprintf("ID=%u,",schema)+
"NAME=\""+RDEscapeString(RDFeed::rssSchemaString(schema))+"\"";
if(!RDFeed::rssHeaderTemplate(schema).isEmpty()) {
sql+=",HEADER_XML=\""+
RDEscapeString(RDFeed::rssHeaderTemplate(schema))+
"\"";
}
if(!RDFeed::rssChannelTemplate(schema).isEmpty()) {
sql+=",CHANNEL_XML=\""+
RDEscapeString(RDFeed::rssChannelTemplate(schema))+"\"";
}
if(!RDFeed::rssItemTemplate(schema).isEmpty()) {
sql+=",ITEM_XML=\""+
RDEscapeString(RDFeed::rssItemTemplate(schema))+
"\"";
}
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
}
sql=QString("alter table FEEDS add column ")+
"RSS_SCHEMA int unsigned not null default 0 after PURGE_PASSWORD";
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
WriteSchemaVersion(++cur_schema);
}
// NEW SCHEMA UPDATES GO HERE...