diff --git a/ChangeLog b/ChangeLog index 421577e2..d8a63778 100644 --- a/ChangeLog +++ b/ChangeLog @@ -24663,3 +24663,12 @@ 'column out of range' errors when importing traffic logs. * Fixed a bug in rdlogmanager(1) that threw SQL errors when processing log GUIDs containing apostrophes. +2024-02-14 Fred Gleason + * Added a 'RDAIRPLAY.MESSAGE_WIDGET_URL' field to the database. + * Incremented the database version to 374. + * Added 'RDAirPlayConf::messageWidgetUrl()' and + 'RDAirPlayConf::setMessageWidgetUrl()' methods. + * Modified rdairplay(1) to make the Message Widget retain the loaded + URL across instances. + * Modified rdairplay(1) to make the Message Widget continually poll + and update loaded URLs using the 'file:' schema. diff --git a/docs/tables/rd_airplay.txt b/docs/tables/rd_airplay.txt index f0762c63..b30d4f9f 100644 --- a/docs/tables/rd_airplay.txt +++ b/docs/tables/rd_airplay.txt @@ -35,3 +35,4 @@ TITLE_TEMPLATE varchar(64) ARTIST_TEMPLATE varchar(64) OUTCUE_TEMPLATE varchar(64) DESCRIPTION_TEMPLATE varchar(64) +MESSAGE_WIDGET_URL text diff --git a/lib/dbversion.h b/lib/dbversion.h index e38c716b..fed7da8d 100644 --- a/lib/dbversion.h +++ b/lib/dbversion.h @@ -2,7 +2,7 @@ // // The Current Database Schema Version for Rivendell // -// (C) Copyright 2002-2023 Fred Gleason +// (C) Copyright 2002-2024 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 @@ -24,7 +24,7 @@ /* * Current Database Version */ -#define RD_VERSION_DATABASE 373 +#define RD_VERSION_DATABASE 374 #endif // DBVERSION_H diff --git a/lib/rdairplay_conf.cpp b/lib/rdairplay_conf.cpp index 281f0be9..656e8419 100644 --- a/lib/rdairplay_conf.cpp +++ b/lib/rdairplay_conf.cpp @@ -749,6 +749,24 @@ void RDAirPlayConf::setAuditionPreroll(int msecs) const } +QString RDAirPlayConf::messageWidgetUrl() const +{ + return RDGetSqlValue(air_tablename,"ID",air_id,"MESSAGE_WIDGET_URL"). + toString(); +} + + +void RDAirPlayConf::setMessageWidgetUrl(const QString url) +{ + if(url.trimmed().isEmpty()) { + SetRowNull("MESSAGE_WIDGET_URL"); + } + else { + SetRow("MESSAGE_WIDGET_URL",url); + } +} + + RDAirPlayConf::StartMode RDAirPlayConf::startMode(int lognum) const { RDAirPlayConf::StartMode ret=RDAirPlayConf::StartEmpty; @@ -1162,50 +1180,53 @@ void RDAirPlayConf::SetLogMode(const QString ¶m,int mach, RDAirPlayConf::OpMode mode) const { QString sql; - RDSqlQuery *q; sql=QString("update `LOG_MODES` set `")+param+QString::asprintf("`=%d ",mode)+ "where (`STATION_NAME`='"+RDEscapeString(air_station)+"')&&"+ QString::asprintf("(`MACHINE`=%d)",mach); - q=new RDSqlQuery(sql); - delete q; + RDSqlQuery::apply(sql); } void RDAirPlayConf::SetRow(const QString ¶m,int value) const { - RDSqlQuery *q; QString sql; sql=QString("update `")+air_tablename+"` set `"+ param+QString::asprintf("`=%d where ",value)+ "`STATION`='"+RDEscapeString(air_station)+"'"; - q=new RDSqlQuery(sql); - delete q; + RDSqlQuery::apply(sql); } void RDAirPlayConf::SetRow(const QString ¶m,unsigned value) const { - RDSqlQuery *q; QString sql; sql=QString("update `")+air_tablename+"` set `"+ param+QString::asprintf("`=%u where ",value)+ "`STATION`='"+RDEscapeString(air_station)+"'"; - q=new RDSqlQuery(sql); - delete q; + RDSqlQuery::apply(sql); } void RDAirPlayConf::SetRow(const QString ¶m,const QString &value) const { - RDSqlQuery *q; QString sql; sql=QString("update `")+air_tablename+"` set `"+ param+"`='"+RDEscapeString(value)+"' where "+ "`STATION`='"+RDEscapeString(air_station)+"'"; - q=new RDSqlQuery(sql); - delete q; + RDSqlQuery::apply(sql); } + + + void RDAirPlayConf::SetRowNull(const QString ¶m) const + { + QString sql; + + sql=QString("update `")+air_tablename+"` set `"+ + param+"`=NULL where "+ + "`STATION`='"+RDEscapeString(air_station)+"'"; + RDSqlQuery::apply(sql); + } diff --git a/lib/rdairplay_conf.h b/lib/rdairplay_conf.h index 8305f5f0..3c0ac3c3 100644 --- a/lib/rdairplay_conf.h +++ b/lib/rdairplay_conf.h @@ -143,6 +143,8 @@ class RDAirPlayConf void setShowCounters(bool state) const; int auditionPreroll() const; void setAuditionPreroll(int msecs) const; + QString messageWidgetUrl() const; + void setMessageWidgetUrl(const QString url); RDAirPlayConf::StartMode startMode(int lognum) const; void setStartMode(int lognum,RDAirPlayConf::StartMode mode) const; bool autoRestart(int lognum) const; @@ -176,6 +178,7 @@ class RDAirPlayConf void SetRow(const QString ¶m,int value) const; void SetRow(const QString ¶m,unsigned value) const; void SetRow(const QString ¶m,const QString &value) const; + void SetRowNull(const QString ¶m) const; QString air_station; unsigned air_id; QString air_tablename; diff --git a/rdairplay/messagewidget.cpp b/rdairplay/messagewidget.cpp index 1e2e5334..1fd06f2d 100644 --- a/rdairplay/messagewidget.cpp +++ b/rdairplay/messagewidget.cpp @@ -22,6 +22,7 @@ #include #include +#include #include #include "colors.h" @@ -63,6 +64,21 @@ MessageWidget::MessageWidget(QWidget *parent) filter->addFilter(QEvent::MouseMove); filter->addFilter(QEvent::Wheel); d_view->installEventFilter(filter); + + // + // Refresh Timer + // + d_refresh_timer=new QTimer(this); + d_refresh_timer->setSingleShot(true); + connect(d_refresh_timer,SIGNAL(timeout()),this,SLOT(refreshData())); + + // + // Load Current Page + // + QString url=rda->airplayConf()->messageWidgetUrl(); + if(!url.isEmpty()) { + setUrl(url); + } } @@ -77,6 +93,8 @@ void MessageWidget::setText(const QString &str,const QColor &col) d_label->setText(str); d_label->show(); d_view->hide(); + + d_refresh_timer->stop(); } @@ -85,6 +103,7 @@ bool MessageWidget::setUrl(const QString &str) QUrl url(str); if(!url.isValid()) { setText(tr("invalid URL")+": "+str.toUtf8().constData(),Qt::black); + d_refresh_timer->stop(); return false; } if((url.scheme().toLower()!="http")&& @@ -92,12 +111,22 @@ bool MessageWidget::setUrl(const QString &str) (url.scheme().toLower()!="file")) { setText(tr("unsupported URL scheme")+": "+str.toUtf8().constData(), Qt::black); + d_refresh_timer->stop(); return false; } d_view->load(url); d_view->show(); d_label->hide(); + d_url=str; + rda->airplayConf()->setMessageWidgetUrl(str); + if(url.scheme().toLower()=="file") { + d_refresh_timer->start(1000); + } + else { + d_refresh_timer->stop(); + } + return true; } @@ -107,6 +136,9 @@ void MessageWidget::clear() d_label->clear(); d_label->show(); d_view->hide(); + d_refresh_timer->stop(); + + rda->airplayConf()->setMessageWidgetUrl(QString()); } @@ -119,6 +151,13 @@ void MessageWidget::webLoadFinishedData(bool state) } +void MessageWidget::refreshData() +{ + d_view->load(d_url); + d_refresh_timer->start(1000); +} + + void MessageWidget::resizeEvent(QResizeEvent *e) { d_label->setGeometry(0,0,size().width(),size().height()); diff --git a/rdairplay/messagewidget.h b/rdairplay/messagewidget.h index 88a49ab6..f884bac4 100644 --- a/rdairplay/messagewidget.h +++ b/rdairplay/messagewidget.h @@ -22,6 +22,7 @@ #define MESSAGEWIDGET_H #include +#include #include #define MESSAGE_FONT_QUANTITY 8 @@ -38,6 +39,7 @@ class MessageWidget : public QWidget private slots: void webLoadFinishedData(bool state); + void refreshData(); protected: void resizeEvent(QResizeEvent *e); @@ -46,8 +48,10 @@ class MessageWidget : public QWidget QFont MessageFont(QString str) const; QLabel *d_label; QWebView *d_view; + QTimer *d_refresh_timer; QFont d_message_fonts[MESSAGE_FONT_QUANTITY]; QFontMetrics *d_message_metrics[MESSAGE_FONT_QUANTITY]; + QString d_url; }; #endif // MESSAGEWIDGET_H diff --git a/utils/rddbmgr/revertschema.cpp b/utils/rddbmgr/revertschema.cpp index 602b7561..c6051223 100644 --- a/utils/rddbmgr/revertschema.cpp +++ b/utils/rddbmgr/revertschema.cpp @@ -40,6 +40,16 @@ bool MainObject::RevertSchema(int cur_schema,int set_schema,QString *err_msg) // NEW SCHEMA REVERSIONS GO HERE... + // + // Revert 374 + // + if((cur_schema == 374) && (set_schema < cur_schema)) + { + DropColumn("RDAIRPLAY","MESSAGE_WIDGET_URL"); + + WriteSchemaVersion(--cur_schema); + } + // // Revert 373 // diff --git a/utils/rddbmgr/schemamap.cpp b/utils/rddbmgr/schemamap.cpp index 6fd61952..cab10f80 100644 --- a/utils/rddbmgr/schemamap.cpp +++ b/utils/rddbmgr/schemamap.cpp @@ -162,7 +162,7 @@ void MainObject::InitializeSchemaMap() { global_version_map["3.6"]=347; global_version_map["4.0"]=370; global_version_map["4.1"]=371; - global_version_map["4.2"]=373; + global_version_map["4.2"]=374; } diff --git a/utils/rddbmgr/updateschema.cpp b/utils/rddbmgr/updateschema.cpp index 3906d277..8e4950af 100644 --- a/utils/rddbmgr/updateschema.cpp +++ b/utils/rddbmgr/updateschema.cpp @@ -11450,6 +11450,16 @@ bool MainObject::UpdateSchema(int cur_schema,int set_schema,QString *err_msg) WriteSchemaVersion(++cur_schema); } + if((cur_schema<374)&&(set_schema>cur_schema)) { + sql=QString("alter table `RDAIRPLAY` ")+ + "add column `MESSAGE_WIDGET_URL` text after `AUDITION_PREROLL`"; + if(!RDSqlQuery::apply(sql,err_msg)) { + return false; + } + + WriteSchemaVersion(++cur_schema); + } + // NEW SCHEMA UPDATES GO HERE...