From 4f6c0eb2c9fc4cea1d4fa13b8c6ff81d4e2d82e5 Mon Sep 17 00:00:00 2001 From: Fred Gleason Date: Sun, 23 Feb 2020 17:24:48 -0500 Subject: [PATCH] 2020-02-23 Fred Gleason * Implemented superfeed in 'rdfeed.xml'. --- ChangeLog | 2 + docs/tables/Makefile.am | 2 +- docs/tables/feed_key_names.txt | 10 ----- docs/tables/superfeed_maps.txt | 12 ++++++ lib/rdcastsearch.cpp | 40 +++++++++++++----- lib/rdcastsearch.h | 6 +-- lib/rdfeed.cpp | 63 +++++++++++++++++++++++++--- lib/rdfeed.h | 1 + lib/rdpodcast.h | 4 +- rdadmin/edit_feed.cpp | 34 +++++++-------- rdadmin/edit_superfeed.cpp | 31 +++++++++++--- rdadmin/list_feeds.cpp | 10 +++-- rdadmin/rdadmin_cs.ts | 18 ++++++-- rdadmin/rdadmin_de.ts | 24 +++++------ rdadmin/rdadmin_es.ts | 18 ++++++-- rdadmin/rdadmin_fr.ts | 24 +++++------ rdadmin/rdadmin_nb.ts | 24 +++++------ rdadmin/rdadmin_nn.ts | 24 +++++------ rdadmin/rdadmin_pt_BR.ts | 24 +++++------ rdcastmanager/list_casts.cpp | 31 ++++++++++---- rdcastmanager/list_casts.h | 3 +- rdcastmanager/rdcastmanager.cpp | 27 ++++++++---- rdcastmanager/rdcastmanager_cs.ts | 8 ++++ rdcastmanager/rdcastmanager_de.ts | 8 ++++ rdcastmanager/rdcastmanager_es.ts | 8 ++++ rdcastmanager/rdcastmanager_fr.ts | 8 ++++ rdcastmanager/rdcastmanager_nb.ts | 8 ++++ rdcastmanager/rdcastmanager_nn.ts | 8 ++++ rdcastmanager/rdcastmanager_pt_BR.ts | 8 ++++ web/rdcastmanager/rdcastmanager.cpp | 2 +- 30 files changed, 345 insertions(+), 145 deletions(-) delete mode 100644 docs/tables/feed_key_names.txt diff --git a/ChangeLog b/ChangeLog index c8b222d6..fe12c613 100644 --- a/ChangeLog +++ b/ChangeLog @@ -19589,3 +19589,5 @@ 2020-02-21 Fred Gleason * Tweaked controls to be disabled for superfeeds in the 'Edit Feed' dialog in rdadmin(1). +2020-02-23 Fred Gleason + * Implemented superfeed in 'rdfeed.xml'. diff --git a/docs/tables/Makefile.am b/docs/tables/Makefile.am index 50ffc2a5..a569706b 100644 --- a/docs/tables/Makefile.am +++ b/docs/tables/Makefile.am @@ -52,7 +52,6 @@ EXTRA_DIST = audio_cards.txt\ extended_panels.txt\ feed_perms.txt\ feeds.txt\ - feeds_key_names.txt\ gpio_events.txt\ gpis.txt\ gpos.txt\ @@ -100,6 +99,7 @@ EXTRA_DIST = audio_cards.txt\ stack_lines.txt\ stack_sched_codes.txt\ stations.txt\ + superfeed_maps.txt\ switcher_nodes.txt\ system.txt\ triggers.txt\ diff --git a/docs/tables/feed_key_names.txt b/docs/tables/feed_key_names.txt deleted file mode 100644 index db98bdbe..00000000 --- a/docs/tables/feed_key_names.txt +++ /dev/null @@ -1,10 +0,0 @@ - FEED_KEY_NAMES Table Layout for Rivendell - -The FEED_KEY_NAMES table the mappings of actual RSS feeds with super -feeds. - -FIELD NAME TYPE REMARKS ---------------------------------------------------------------- -ID int(10) unsigned Primary key, auto increment -KEY_NAME varchar(8) -MEMBER_KEY_NAME varchar(8) diff --git a/docs/tables/superfeed_maps.txt b/docs/tables/superfeed_maps.txt index e69de29b..e3b74a89 100644 --- a/docs/tables/superfeed_maps.txt +++ b/docs/tables/superfeed_maps.txt @@ -0,0 +1,12 @@ + SUPERFEED_MAPS Table Layout for Rivendell + +The SUPERFEED_MAPS table contains the mappings of actual RSS feeds with super +feeds. + +FIELD NAME TYPE REMARKS +------------------------------------------------------------------ +ID int(10) unsigned Primary key, auto increment +FEED_ID int(10) unsigned From FEEDS.ID +MEMBER_FEED_ID int(10) unsigned From FEEDS.ID +KEY_NAME varchar(8) From FEEDS.KEY_NAME +MEMBER_KEY_NAME varchar(8) From FEEDS.KEY_NAME diff --git a/lib/rdcastsearch.cpp b/lib/rdcastsearch.cpp index 647c3aa6..24058f77 100644 --- a/lib/rdcastsearch.cpp +++ b/lib/rdcastsearch.cpp @@ -48,21 +48,39 @@ QString RDCastSearchString(const QString &filter,bool unexp_only, return ret; } -QString RDCastSearch(int feed_id,const QString &filter,bool unexp_only, - bool active_only) -{ - QString ret=QString().sprintf("where (FEED_ID=%d)",feed_id); - ret+=RDCastSearchString(filter,unexp_only,active_only); - return ret; -} - - -QString RDCastSearch(const QString &keyname,const QString &filter, +QString RDCastSearch(const QString &keyname,bool is_super,const QString &filter, bool unexp_only,bool active_only) { - QString ret=QString("where (KEY_NAME=\"")+ + QString sql; + RDSqlQuery *q; + QString ret=QString("where (.KEY_NAME=\"")+ RDEscapeString(keyname)+"\")"; + + if(is_super) { + ret="where "; + sql=QString("select ")+ + "MEMBER_FEED_ID "+ // 00 + "from SUPERFEED_MAPS where "+ + "KEY_NAME=\""+RDEscapeString(keyname)+"\""; + q=new RDSqlQuery(sql); + while(q->next()) { + ret+=QString().sprintf("PODCASTS.FEED_ID=%u || ",q->value(0).toUInt()); + } + delete q; + ret=ret.left(ret.length()-3); + } + else { + sql=QString("select ")+ + "ID "+ // 00 + "from FEEDS where "+ + "KEY_NAME=\""+RDEscapeString(keyname)+"\""; + q=new RDSqlQuery(sql); + if(q->first()) { + ret=QString().sprintf("where PODCASTS.FEED_ID=%u ",q->value(0).toUInt()); + } + delete q; + } ret+=RDCastSearchString(filter,unexp_only,active_only); return ret; diff --git a/lib/rdcastsearch.h b/lib/rdcastsearch.h index d6adcd2d..d59c14f6 100644 --- a/lib/rdcastsearch.h +++ b/lib/rdcastsearch.h @@ -2,7 +2,7 @@ // // SQL search clause for RDCastManager // -// (C) Copyright 2009,2016 Fred Gleason +// (C) Copyright 2009-2020 Fred Gleason // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License version 2 as @@ -21,9 +21,7 @@ #ifndef RDCASTSEARCH_H #define RDCASTSEARCH_H -QString RDCastSearch(int feed_id,const QString &filter,bool unexp_only, - bool active_only); -QString RDCastSearch(const QString &keyname,const QString &filter, +QString RDCastSearch(const QString &keyname,bool is_super,const QString &filter, bool unexp_only,bool active_only); diff --git a/lib/rdfeed.cpp b/lib/rdfeed.cpp index 0dd549d7..3b290563 100644 --- a/lib/rdfeed.cpp +++ b/lib/rdfeed.cpp @@ -129,6 +129,24 @@ void RDFeed::setIsSuperfeed(bool state) const } +QStringList RDFeed::isSubfeedOf() const +{ + QStringList ret; + + QString sql=QString("select ")+ + "KEY_NAME "+ // 00 + "from SUPERFEED_MAPS where "+ + "MEMBER_KEY_NAME=\""+RDEscapeString(keyName())+"\""; + RDSqlQuery *q=new RDSqlQuery(sql); + while(q->next()) { + ret.push_back(q->value(0).toString()); + } + delete q; + + return ret; +} + + bool RDFeed::audienceMetrics() const { return RDBool(RDGetSqlValue("FEEDS","KEY_NAME",feed_keyname, @@ -636,6 +654,19 @@ bool RDFeed::postXml(QString *err_msg) } curl_easy_cleanup(curl); + // + // Update Enclosing Superfeeds + // + QStringList superfeeds=isSubfeedOf(); + for(int i=0;ipostXml(&err_msg2)) { + *err_msg+="\n"+err_msg2; + } + delete feed; + } + return ret; } @@ -958,6 +989,22 @@ QString RDFeed::rssXml(QString *err_msg,bool *ok) // // Render Item XML // + QString where; + if(isSuperfeed()) { + sql=QString("select ")+ + "MEMBER_FEED_ID "+ + "from SUPERFEED_MAPS where "+ + QString().sprintf("FEED_ID=%d",q->value(13).toUInt()); + q1=new RDSqlQuery(sql); + while(q1->next()) { + where+=QString().sprintf("(FEED_ID=%u) || ",q1->value(0).toUInt()); + } + delete q1; + where=("("+where.left(where.length()-4)+") && "); + } + else { + where =QString().sprintf("(FEED_ID=%u)&&",q->value(13).toUInt()); + } sql=QString("select ")+ "ITEM_TITLE,"+ // 00 "ITEM_DESCRIPTION,"+ // 01 @@ -973,7 +1020,8 @@ QString RDFeed::rssXml(QString *err_msg,bool *ok) "EFFECTIVE_DATETIME,"+ // 11 "ID "+ // 12 "from PODCASTS where "+ - QString().sprintf("(FEED_ID=%d)&&",q->value(13).toUInt())+ + where+ + //QString().sprintf("(FEED_ID=%d)&&",q->value(13).toUInt())+ QString().sprintf("(STATUS=%d) ",RDPodcast::StatusActive)+ "order by ORIGIN_DATETIME"; if(q->value(15).toString()=="N") { @@ -1116,14 +1164,19 @@ unsigned RDFeed::create(const QString &keyname,bool enable_users, // Duplicate member feed references // if(q->value(0).toString()=="Y") { - sql=QString("select MEMBER_KEY_NAME ")+ - "from FEED_KEY_NAMES where "+ + sql=QString("select ")+ + "MEMBER_KEY_NAME,"+ // 00 + "FEED_ID,"+ // 01 + "MEMBER_FEED_ID "+ // 02 + "from SUPERFEED_MAPS where "+ "KEY_NAME=\""+RDEscapeString(exemplar)+"\""; q1=new RDSqlQuery(sql); while(q1->next()) { - sql=QString("insert into FEED_KEY_NAMES set ")+ + sql=QString("insert into SUPERFEED_MAPS set ")+ "KEY_NAME=\""+RDEscapeString(keyname)+"\","+ - "MEMBER_KEY_NAME=\""+RDEscapeString(q1->value(0).toString())+"\""; + "MEMBER_KEY_NAME=\""+RDEscapeString(q1->value(0).toString())+"\","+ + QString().sprintf("FEED_ID=%u,",q1->value(1).toUInt())+ + QString().sprintf("MEMBER_FEED_ID=%u",q1->value(2).toUInt()); RDSqlQuery::apply(sql); } delete q1; diff --git a/lib/rdfeed.h b/lib/rdfeed.h index 7f64f0e6..939810a1 100644 --- a/lib/rdfeed.h +++ b/lib/rdfeed.h @@ -46,6 +46,7 @@ class RDFeed : public QObject bool exists() const; bool isSuperfeed() const; void setIsSuperfeed(bool state) const; + QStringList isSubfeedOf() const; bool audienceMetrics() const; void setAudienceMetrics(bool state); QString channelTitle() const; diff --git a/lib/rdpodcast.h b/lib/rdpodcast.h index 33e89fe7..b1bcd670 100644 --- a/lib/rdpodcast.h +++ b/lib/rdpodcast.h @@ -2,7 +2,7 @@ // // Abstract a Rivendell Podcast Entry // -// (C) Copyright 2002-2007,2016-2017 Fred Gleason +// (C) Copyright 2002-2020 Fred Gleason // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License version 2 as @@ -66,8 +66,6 @@ class RDPodcast void setShelfLife(unsigned days) const; RDPodcast::Status status() const; void setStatus(RDPodcast::Status status); - //QString audioUploadCommand(const QString &srcfile) const; - //QString audioPurgeCommand() const; bool removeAudio(RDFeed *feed,QString *err_text,bool log_debug) const; static QString guid(const QString &url,const QString &filename, unsigned feed_id,unsigned cast_id); diff --git a/rdadmin/edit_feed.cpp b/rdadmin/edit_feed.cpp index 0c8b9324..5493a680 100644 --- a/rdadmin/edit_feed.cpp +++ b/rdadmin/edit_feed.cpp @@ -162,7 +162,7 @@ EditFeed::EditFeed(const QString &feed,QWidget *parent) feed_purge_url_edit=new QLineEdit(this); feed_purge_url_edit->setMaxLength(255); feed_purge_url_label= - new QLabel(feed_purge_url_edit,tr("Audio Upload URL:"),this); + new QLabel(feed_purge_url_edit,tr("Upload URL")+":",this); feed_purge_url_label->setFont(labelFont()); feed_purge_url_label->setAlignment(Qt::AlignRight|Qt::AlignVCenter); @@ -194,7 +194,7 @@ EditFeed::EditFeed(const QString &feed,QWidget *parent) // feed_format_edit=new QLineEdit(this); feed_format_edit->setReadOnly(true); - feed_format_label=new QLabel(feed_format_edit,tr("Upload Format:"),this); + feed_format_label=new QLabel(feed_format_edit,tr("Audio Format:"),this); feed_format_label->setFont(labelFont()); feed_format_label->setAlignment(Qt::AlignRight|Qt::AlignVCenter); feed_format_button=new QPushButton(this); @@ -232,7 +232,7 @@ EditFeed::EditFeed(const QString &feed,QWidget *parent) feed_base_url_edit=new QLineEdit(this); feed_base_url_edit->setMaxLength(255); feed_base_url_label= - new QLabel(feed_base_url_edit,tr("Audio Download URL:"),this); + new QLabel(feed_base_url_edit,tr("Download URL")+":",this); feed_base_url_label->setFont(labelFont()); feed_base_url_label->setAlignment(Qt::AlignRight|Qt::AlignVCenter); @@ -465,34 +465,34 @@ void EditFeed::isSuperfeedChangedData(int n) feed_redirect_url_label->setEnabled(redirected); feed_redirect_url_edit->setEnabled(redirected); - feed_base_url_edit->setDisabled(redirected||superfeed); - feed_purge_url_edit->setDisabled(redirected||superfeed); - feed_purge_username_label->setDisabled(redirected||superfeed); - feed_purge_username_edit->setDisabled(redirected||superfeed); - feed_purge_password_label->setDisabled(redirected||superfeed); - feed_purge_password_edit->setDisabled(redirected||superfeed); + 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||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||superfeed); + feed_castorder_box->setDisabled(redirected); feed_format_button->setDisabled(redirected||superfeed); - feed_base_url_label->setDisabled(redirected||superfeed); - feed_base_preamble_label->setDisabled(redirected||superfeed); - feed_purge_url_label->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_keep_metadata_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||superfeed); + feed_castorder_label->setDisabled(redirected); feed_extension_label->setDisabled(redirected||superfeed); - feed_channel_section_groupbox->setDisabled(redirected||superfeed); + feed_channel_section_groupbox->setDisabled(redirected); feed_normalize_label-> setDisabled(redirected||superfeed||(!feed_normalize_box->isChecked())); diff --git a/rdadmin/edit_superfeed.cpp b/rdadmin/edit_superfeed.cpp index 58c538cb..71a74bda 100644 --- a/rdadmin/edit_superfeed.cpp +++ b/rdadmin/edit_superfeed.cpp @@ -23,6 +23,8 @@ #include #include +#include + #include "edit_superfeed.h" EditSuperfeed::EditSuperfeed(RDFeed *feed,QWidget *parent) @@ -72,7 +74,9 @@ EditSuperfeed::EditSuperfeed(RDFeed *feed,QWidget *parent) // // Populate Fields // - sql=QString("select MEMBER_KEY_NAME from FEED_KEY_NAMES where ")+ + sql=QString("select ")+ + "MEMBER_KEY_NAME "+ // 00 + "from SUPERFEED_MAPS where "+ "KEY_NAME=\""+RDEscapeString(feed_feed->keyName())+"\""; q=new RDSqlQuery(sql); while(q->next()) { @@ -114,19 +118,34 @@ void EditSuperfeed::okData() RDSqlQuery *q; QString sql; + // + // Feed ID Map + // + QMap feed_ids; + sql=QString("select KEY_NAME,ID from FEEDS"); + q=new RDSqlQuery(sql); + while(q->next()) { + feed_ids[q->value(0).toString()]=q->value(1).toUInt(); + } + delete q; + // // Add New Groups // for(unsigned i=0;idestCount();i++) { - sql=QString("select MEMBER_KEY_NAME from FEED_KEY_NAMES where ")+ + sql=QString("select ")+ + "MEMBER_KEY_NAME " // 00 + "from SUPERFEED_MAPS where "+ "KEY_NAME=\""+RDEscapeString(feed_feed->keyName())+"\" && " "MEMBER_KEY_NAME=\""+RDEscapeString(feed_host_sel->destText(i))+"\""; q=new RDSqlQuery(sql); if(q->size()==0) { delete q; - sql=QString("insert into FEED_KEY_NAMES (KEY_NAME,MEMBER_KEY_NAME) ")+ - "values (\""+RDEscapeString(feed_feed->keyName())+ - "\",\""+RDEscapeString(feed_host_sel->destText(i))+"\")"; + sql=QString("insert into SUPERFEED_MAPS set ")+ + "KEY_NAME=\""+RDEscapeString(feed_feed->keyName())+"\","+ + "MEMBER_KEY_NAME=\""+RDEscapeString(feed_host_sel->destText(i))+"\","+ + QString().sprintf("FEED_ID=%u,",feed_ids.value(feed_feed->keyName()))+ + QString().sprintf("MEMBER_FEED_ID=%u",feed_ids.value(feed_host_sel->destText(i))); q=new RDSqlQuery(sql); } delete q; @@ -135,7 +154,7 @@ void EditSuperfeed::okData() // // Delete Old Groups // - sql=QString("delete from FEED_KEY_NAMES where ")+ + sql=QString("delete from SUPERFEED_MAPS where ")+ "KEY_NAME=\""+RDEscapeString(feed_feed->keyName())+"\""; for(unsigned i=0;idestCount();i++) { sql+=QString(" && MEMBER_KEY_NAME<>\"")+ diff --git a/rdadmin/list_feeds.cpp b/rdadmin/list_feeds.cpp index 4bb7f64a..420d824a 100644 --- a/rdadmin/list_feeds.cpp +++ b/rdadmin/list_feeds.cpp @@ -260,12 +260,14 @@ void ListFeeds::deleteData() // sql=QString("delete from FEED_PERMS where ")+ "KEY_NAME=\""+RDEscapeString(feedname)+"\""; - q=new RDSqlQuery(sql); - delete q; + RDSqlQuery::apply(sql); + sql=QString("delete from SUPERFEED_MAPS where ")+ + "KEY_NAME=\""+RDEscapeString(feedname)+"\" || "+ + "MEMBER_KEY_NAME=\""+RDEscapeString(feedname)+"\""; + RDSqlQuery::apply(sql); sql=QString("delete from FEEDS where ")+ "KEY_NAME=\""+RDEscapeString(feedname)+"\""; - q=new RDSqlQuery(sql); - delete q; + RDSqlQuery::apply(sql); RDDeleteFeedLog(feedname); item->setSelected(false); diff --git a/rdadmin/rdadmin_cs.ts b/rdadmin/rdadmin_cs.ts index 6e1007da..54c482a2 100644 --- a/rdadmin/rdadmin_cs.ts +++ b/rdadmin/rdadmin_cs.ts @@ -1473,7 +1473,7 @@ files, causing any whose files remain to be imported again. Audio Upload URL: - Adresa (URL) nahrání zvuku: + Adresa (URL) nahrání zvuku: Username: @@ -1485,7 +1485,7 @@ files, causing any whose files remain to be imported again. Upload Format: - Formát nahrání: + Formát nahrání: S&et @@ -1505,7 +1505,7 @@ files, causing any whose files remain to be imported again. Audio Download URL: - Adresa (URL) stažení zvuku: + Adresa (URL) stažení zvuku: Keep Expired Metadata @@ -1645,6 +1645,18 @@ Feeds Audio Upload URL has unsupported scheme! + + Audio Format: + + + + Upload URL + + + + Download URL + + EditFeedPerms diff --git a/rdadmin/rdadmin_de.ts b/rdadmin/rdadmin_de.ts index f91ef8f5..30383fcc 100644 --- a/rdadmin/rdadmin_de.ts +++ b/rdadmin/rdadmin_de.ts @@ -1375,10 +1375,6 @@ files, causing any whose files remain to be imported again. Description: Beschreibung: - - Audio Upload URL: - - Username: Benutzername: @@ -1387,10 +1383,6 @@ files, causing any whose files remain to be imported again. Password: Passwort: - - Upload Format: - - S&et @@ -1407,10 +1399,6 @@ files, causing any whose files remain to be imported again. dBFS - - Audio Download URL: - - Keep Expired Metadata @@ -1540,6 +1528,18 @@ Feeds Audio Upload URL has unsupported scheme! + + Audio Format: + + + + Upload URL + + + + Download URL + + EditFeedPerms diff --git a/rdadmin/rdadmin_es.ts b/rdadmin/rdadmin_es.ts index e3025d6b..413a44e4 100644 --- a/rdadmin/rdadmin_es.ts +++ b/rdadmin/rdadmin_es.ts @@ -1471,7 +1471,7 @@ files, causing any whose files remain to be imported again. Audio Upload URL: - URL subida audio: + URL subida audio: Username: @@ -1483,7 +1483,7 @@ files, causing any whose files remain to be imported again. Upload Format: - Formato de subida: + Formato de subida: S&et @@ -1503,7 +1503,7 @@ files, causing any whose files remain to be imported again. Audio Download URL: - URL descarga audio: + URL descarga audio: Keep Expired Metadata @@ -1648,6 +1648,18 @@ Feeds Audio Upload URL has unsupported scheme! + + Audio Format: + + + + Upload URL + + + + Download URL + + EditFeedPerms diff --git a/rdadmin/rdadmin_fr.ts b/rdadmin/rdadmin_fr.ts index dad558fa..df41914a 100644 --- a/rdadmin/rdadmin_fr.ts +++ b/rdadmin/rdadmin_fr.ts @@ -1047,10 +1047,6 @@ files, causing any whose files remain to be imported again. Description: - - Audio Upload URL: - - Username: @@ -1059,10 +1055,6 @@ files, causing any whose files remain to be imported again. Password: - - Upload Format: - - S&et @@ -1079,10 +1071,6 @@ files, causing any whose files remain to be imported again. dBFS - - Audio Download URL: - - Keep Expired Metadata @@ -1212,6 +1200,18 @@ Feeds Audio Upload URL has unsupported scheme! + + Audio Format: + + + + Upload URL + + + + Download URL + + EditFeedPerms diff --git a/rdadmin/rdadmin_nb.ts b/rdadmin/rdadmin_nb.ts index 3742e406..22d86785 100644 --- a/rdadmin/rdadmin_nb.ts +++ b/rdadmin/rdadmin_nb.ts @@ -1337,10 +1337,6 @@ files, causing any whose files remain to be imported again. Description: Skildring: - - Audio Upload URL: - - Username: Brukarnamn: @@ -1349,10 +1345,6 @@ files, causing any whose files remain to be imported again. Password: Passord: - - Upload Format: - - S&et @@ -1369,10 +1361,6 @@ files, causing any whose files remain to be imported again. dBFS - - Audio Download URL: - - Keep Expired Metadata @@ -1502,6 +1490,18 @@ Feeds Audio Upload URL has unsupported scheme! + + Audio Format: + + + + Upload URL + + + + Download URL + + EditFeedPerms diff --git a/rdadmin/rdadmin_nn.ts b/rdadmin/rdadmin_nn.ts index 3742e406..22d86785 100644 --- a/rdadmin/rdadmin_nn.ts +++ b/rdadmin/rdadmin_nn.ts @@ -1337,10 +1337,6 @@ files, causing any whose files remain to be imported again. Description: Skildring: - - Audio Upload URL: - - Username: Brukarnamn: @@ -1349,10 +1345,6 @@ files, causing any whose files remain to be imported again. Password: Passord: - - Upload Format: - - S&et @@ -1369,10 +1361,6 @@ files, causing any whose files remain to be imported again. dBFS - - Audio Download URL: - - Keep Expired Metadata @@ -1502,6 +1490,18 @@ Feeds Audio Upload URL has unsupported scheme! + + Audio Format: + + + + Upload URL + + + + Download URL + + EditFeedPerms diff --git a/rdadmin/rdadmin_pt_BR.ts b/rdadmin/rdadmin_pt_BR.ts index d990e730..7130132f 100644 --- a/rdadmin/rdadmin_pt_BR.ts +++ b/rdadmin/rdadmin_pt_BR.ts @@ -1347,10 +1347,6 @@ files, causing any whose files remain to be imported again. Description: Descrição: - - Audio Upload URL: - - Username: Usuário: @@ -1359,10 +1355,6 @@ files, causing any whose files remain to be imported again. Password: Senha: - - Upload Format: - - S&et @@ -1379,10 +1371,6 @@ files, causing any whose files remain to be imported again. dBFS - - Audio Download URL: - - Keep Expired Metadata @@ -1512,6 +1500,18 @@ Feeds Audio Upload URL has unsupported scheme! + + Audio Format: + + + + Upload URL + + + + Download URL + + EditFeedPerms diff --git a/rdcastmanager/list_casts.cpp b/rdcastmanager/list_casts.cpp index f8ce7e31..a55bf4fb 100644 --- a/rdcastmanager/list_casts.cpp +++ b/rdcastmanager/list_casts.cpp @@ -40,10 +40,11 @@ #include "../icons/greenball.xpm" #include "../icons/whiteball.xpm" -ListCasts::ListCasts(unsigned feed_id,QWidget *parent) +ListCasts::ListCasts(unsigned feed_id,bool is_super,QWidget *parent) : RDDialog(parent) { list_feed_id=feed_id; + list_is_superfeed=is_super; // // Fix the Window Size @@ -125,10 +126,14 @@ ListCasts::ListCasts(unsigned feed_id,QWidget *parent) list_casts_view->setColumnAlignment(4,Qt::AlignRight); list_casts_view->addColumn(tr("Description")); list_casts_view->setColumnAlignment(5,Qt::AlignLeft); + + list_casts_view->addColumn(tr("Feed")); + list_casts_view->setColumnAlignment(6,Qt::AlignLeft); + list_casts_view->addColumn(tr("Category")); - list_casts_view->setColumnAlignment(6,Qt::AlignCenter); - list_casts_view->addColumn(tr("Link")); list_casts_view->setColumnAlignment(7,Qt::AlignCenter); + list_casts_view->addColumn(tr("Link")); + list_casts_view->setColumnAlignment(8,Qt::AlignCenter); connect(list_casts_view, SIGNAL(doubleClicked(Q3ListViewItem *,const QPoint &,int)), this, @@ -427,7 +432,8 @@ void ListCasts::RefreshList() list_casts_view->clear(); sql=QString("select ID from PODCASTS ")+ - RDCastSearch(list_feed_id,list_filter_edit->text(), + RDCastSearch(list_feed->keyName(),list_is_superfeed, + list_filter_edit->text(), list_unexpired_check->isChecked(), list_active_check->isChecked())+ " order by ORIGIN_DATETIME"; @@ -446,9 +452,19 @@ void ListCasts::RefreshItem(RDListViewItem *item) QString sql; RDSqlQuery *q; - sql=QString().sprintf("select STATUS,ITEM_TITLE,ORIGIN_DATETIME,SHELF_LIFE,\ - AUDIO_TIME,ITEM_DESCRIPTION,ITEM_CATEGORY,ITEM_LINK \ - from PODCASTS where ID=%d",item->id()); + sql=QString("select ")+ + "PODCASTS.STATUS,"+ // 00 + "PODCASTS.ITEM_TITLE,"+ // 01 + "PODCASTS.ORIGIN_DATETIME,"+ // 02 + "PODCASTS.SHELF_LIFE,"+ // 03 + "PODCASTS.AUDIO_TIME,"+ // 04 + "PODCASTS.ITEM_DESCRIPTION,"+ // 05 + "FEEDS.KEY_NAME,"+ // 06 + "PODCASTS.ITEM_CATEGORY,"+ // 07 + "PODCASTS.ITEM_LINK "+ // 08 + "from PODCASTS left join FEEDS "+ + "on PODCASTS.FEED_ID=FEEDS.ID where "+ + QString().sprintf("PODCASTS.ID=%d",item->id()); q=new RDSqlQuery(sql); if(q->first()) { switch((RDPodcast::Status)q->value(0).toUInt()) { @@ -478,6 +494,7 @@ void ListCasts::RefreshItem(RDListViewItem *item) item->setText(5,q->value(5).toString()); item->setText(6,q->value(6).toString()); item->setText(7,q->value(7).toString()); + item->setText(8,q->value(8).toString()); } delete q; } diff --git a/rdcastmanager/list_casts.h b/rdcastmanager/list_casts.h index b6646c17..fc80c826 100644 --- a/rdcastmanager/list_casts.h +++ b/rdcastmanager/list_casts.h @@ -32,7 +32,7 @@ class ListCasts : public RDDialog { Q_OBJECT public: - ListCasts(unsigned feed_id,QWidget *parent=0); + ListCasts(unsigned feed_id,bool is_super,QWidget *parent=0); ~ListCasts(); QSize sizeHint() const; QSizePolicy sizePolicy() const; @@ -78,6 +78,7 @@ class ListCasts : public RDDialog QCheckBox *list_active_check; QProgressDialog *list_progress_dialog; RDFeed *list_feed; + bool list_is_superfeed; }; diff --git a/rdcastmanager/rdcastmanager.cpp b/rdcastmanager/rdcastmanager.cpp index ec39030f..cd90e212 100644 --- a/rdcastmanager/rdcastmanager.cpp +++ b/rdcastmanager/rdcastmanager.cpp @@ -2,7 +2,7 @@ // // A PodCast Management Utility for Rivendell. // -// (C) Copyright 2002-2019 Fred Gleason +// (C) Copyright 2002-2020 Fred Gleason // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License version 2 as @@ -110,15 +110,22 @@ MainWidget::MainWidget(RDConfig *c,QWidget *parent) SLOT(feedDoubleclickedData(Q3ListViewItem *,const QPoint &,int))); cast_feed_list->addColumn(""); cast_feed_list->setColumnAlignment(0,Qt::AlignCenter); + cast_feed_list->addColumn(tr("Key Name")); cast_feed_list->setColumnAlignment(1,Qt::AlignHCenter); + cast_feed_list->addColumn(tr("Feed Name")); cast_feed_list->setColumnAlignment(2,Qt::AlignLeft); - cast_feed_list->addColumn(tr("Description")); - cast_feed_list->setColumnAlignment(3,Qt::AlignLeft); - cast_feed_list->addColumn(tr("Casts")); + + cast_feed_list->addColumn(tr("Superfeed")); cast_feed_list->setColumnAlignment(3,Qt::AlignCenter); + cast_feed_list->addColumn(tr("Description")); + cast_feed_list->setColumnAlignment(4,Qt::AlignLeft); + + cast_feed_list->addColumn(tr("Casts")); + cast_feed_list->setColumnAlignment(5,Qt::AlignCenter); + // // Open Button // @@ -169,7 +176,7 @@ void MainWidget::openData() if(item==NULL) { return; } - ListCasts *casts=new ListCasts(item->id(),this); + ListCasts *casts=new ListCasts(item->id(),item->text(3)=="Y",this); casts->exec(); RefreshItem(item); delete casts; @@ -208,14 +215,15 @@ void MainWidget::RefreshItem(RDListViewItem *item) sql=QString("select ")+ "CHANNEL_TITLE,"+ // 00 - "CHANNEL_DESCRIPTION,"+ // 01 - "ID "+ // 02 + "IS_SUPERFEED,"+ // 01 + "CHANNEL_DESCRIPTION,"+ // 02 + "ID "+ // 03 "from FEEDS where "+ "KEY_NAME=\""+RDEscapeString(item->text(1))+"\""; q=new RDSqlQuery(sql); while(q->next()) { sql=QString().sprintf("select STATUS from PODCASTS where FEED_ID=%u", - q->value(2).toUInt()); + q->value(3).toUInt()); q1=new RDSqlQuery(sql); while(q1->next()) { total++; @@ -238,7 +246,8 @@ void MainWidget::RefreshItem(RDListViewItem *item) } item->setText(2,q->value(0).toString()); item->setText(3,q->value(1).toString()); - item->setText(4,QString().sprintf("%d / %d",active,total)); + item->setText(4,q->value(2).toString()); + item->setText(5,QString().sprintf("%d / %d",active,total)); } delete q; } diff --git a/rdcastmanager/rdcastmanager_cs.ts b/rdcastmanager/rdcastmanager_cs.ts index d710825a..95875165 100644 --- a/rdcastmanager/rdcastmanager_cs.ts +++ b/rdcastmanager/rdcastmanager_cs.ts @@ -297,6 +297,10 @@ Podcast trotzdem löschen? + + Feed + + MainWidget @@ -354,6 +358,10 @@ přívod Unknown command option + + Superfeed + + PickReportDates diff --git a/rdcastmanager/rdcastmanager_de.ts b/rdcastmanager/rdcastmanager_de.ts index c05eaa34..220bd133 100644 --- a/rdcastmanager/rdcastmanager_de.ts +++ b/rdcastmanager/rdcastmanager_de.ts @@ -286,6 +286,10 @@ Podcast trotzdem löschen? + + Feed + + MainWidget @@ -343,6 +347,10 @@ Feed Unknown command option + + Superfeed + + PickReportDates diff --git a/rdcastmanager/rdcastmanager_es.ts b/rdcastmanager/rdcastmanager_es.ts index 0ab32dd2..36f46f5e 100644 --- a/rdcastmanager/rdcastmanager_es.ts +++ b/rdcastmanager/rdcastmanager_es.ts @@ -237,6 +237,10 @@ Suscripción + + Feed + + MainWidget @@ -293,6 +297,10 @@ Feed Unknown command option + + Superfeed + + PickReportDates diff --git a/rdcastmanager/rdcastmanager_fr.ts b/rdcastmanager/rdcastmanager_fr.ts index b23790e6..d6fcd551 100644 --- a/rdcastmanager/rdcastmanager_fr.ts +++ b/rdcastmanager/rdcastmanager_fr.ts @@ -232,6 +232,10 @@ Car&t/Cut + + Feed + + MainWidget @@ -280,6 +284,10 @@ Feed Unknown command option + + Superfeed + + PickReportDates diff --git a/rdcastmanager/rdcastmanager_nb.ts b/rdcastmanager/rdcastmanager_nb.ts index cddedb61..32d4eb85 100644 --- a/rdcastmanager/rdcastmanager_nb.ts +++ b/rdcastmanager/rdcastmanager_nb.ts @@ -285,6 +285,10 @@ Vil du halda fram med å sletta podkasten? + + Feed + + MainWidget @@ -342,6 +346,10 @@ straum Unknown command option + + Superfeed + + PickReportDates diff --git a/rdcastmanager/rdcastmanager_nn.ts b/rdcastmanager/rdcastmanager_nn.ts index cddedb61..32d4eb85 100644 --- a/rdcastmanager/rdcastmanager_nn.ts +++ b/rdcastmanager/rdcastmanager_nn.ts @@ -285,6 +285,10 @@ Vil du halda fram med å sletta podkasten? + + Feed + + MainWidget @@ -342,6 +346,10 @@ straum Unknown command option + + Superfeed + + PickReportDates diff --git a/rdcastmanager/rdcastmanager_pt_BR.ts b/rdcastmanager/rdcastmanager_pt_BR.ts index ace48331..bd939ecc 100644 --- a/rdcastmanager/rdcastmanager_pt_BR.ts +++ b/rdcastmanager/rdcastmanager_pt_BR.ts @@ -251,6 +251,10 @@ Continuar deletando cast? + + Feed + + MainWidget @@ -308,6 +312,10 @@ Feed Unknown command option + + Superfeed + + PickReportDates diff --git a/web/rdcastmanager/rdcastmanager.cpp b/web/rdcastmanager/rdcastmanager.cpp index 1bf94df3..f05d60a2 100644 --- a/web/rdcastmanager/rdcastmanager.cpp +++ b/web/rdcastmanager/rdcastmanager.cpp @@ -560,7 +560,7 @@ void MainObject::ServeListCasts() "ITEM_CATEGORY,"+ // 05 "AUDIO_TIME "+ // 06 "from PODCASTS "+ - RDCastSearch(cast_feed_id,filter,unexp_only,active_only)+ + RDCastSearch(cast_key_name,false,filter,unexp_only,active_only)+ " order by ORIGIN_DATETIME desc"; q=new RDSqlQuery(sql); while(q->next()) {