Go to the documentation of this file.
7 #include <QDomDocument>
58 LOG(VB_GENERAL, LOG_ERR,
"Cannot load screen 'streamview'");
79 auto *
menu =
new MythMenu(tr(
"Stream Actions"),
this,
"mainmenu");
80 menu->AddItem(tr(
"Add Stream"));
84 menu->AddItem(tr(
"Edit Stream"));
85 menu->AddItem(tr(
"Remove Stream"));
88 menu->AddItemV(MusicCommon::tr(
"Fullscreen Visualizer"), QVariant::fromValue((
int)
MV_VISUALIZER));
89 menu->AddItemV(MusicCommon::tr(
"Lyrics"), QVariant::fromValue((
int)
MV_LYRICS));
97 if (menuPopup->Create())
118 QVariant::fromValue(mdata), 0);
121 mdata->
toMap(metadataMap);
122 item->SetTextFromMap(metadataMap);
123 item->SetFontState(
"normal");
124 item->DisplayState(
"default",
"playstate");
213 auto *me =
dynamic_cast<MythEvent *
>(event);
216 #if QT_VERSION < QT_VERSION_CHECK(5,14,0)
217 QStringList tokens = me->
Message().split(
" ", QString::SkipEmptyParts);
219 QStringList tokens = me->Message().split(
" ", Qt::SkipEmptyParts);
222 if (tokens.isEmpty())
225 if (tokens[0] ==
"DOWNLOAD_FILE")
227 QStringList
args = me->ExtraDataList();
229 if (tokens[1] ==
"UPDATE")
232 else if (tokens[1] ==
"FINISHED")
234 QString url =
args[0];
235 int fileSize =
args[2].toInt();
236 int errorCode =
args[4].toInt();
239 if ((errorCode != 0) || (fileSize == 0))
240 LOG(VB_GENERAL, LOG_ERR, QString(
"StreamView: failed to download radio icon from '%1'").arg(url));
247 if (mdata && mdata->LogoUrl() == url)
276 QString status = QString(
"%1%").arg((
int)(100.0 / ((
double)maxSize / (
double)available)));
296 if ((dce ==
nullptr) || (dce->GetResult() < 0))
299 QString resultid = dce->
GetId();
300 QString resulttext = dce->GetResultText();
302 if (resultid ==
"mainmenu")
304 if (resulttext == tr(
"Add Stream"))
314 else if (resulttext == tr(
"Remove Stream"))
318 else if (resulttext == tr(
"Edit Stream"))
344 for (
int i = 0; i < actions.size() && !handled; i++)
346 QString
action = actions[i];
353 else if (
action ==
"DELETE")
357 else if (
action ==
"TOGGLELAST")
388 mainStack->AddScreen(screen);
403 ShowOkPopup(tr(
"Are you sure you want to delete this Stream?\n"
404 "Broadcaster: %1 - Channel: %2")
405 .arg(mdata->Broadcaster(), mdata->Channel()),
433 bool foundActiveStream =
false;
439 QVariant::fromValue(mdata));
442 mdata->
toMap(metadataMap);
443 item->SetTextFromMap(metadataMap);
444 item->SetText(
"",
"imageloaded");
445 item->SetFontState(
"normal");
446 item->DisplayState(
"default",
"playstate");
454 item->SetFontState(
"running");
455 item->DisplayState(
"playing",
"playstate");
459 item->SetFontState(
"idle");
460 item->DisplayState(
"paused",
"playstate");
464 item->SetFontState(
"normal");
465 item->DisplayState(
"stopped",
"playstate");
472 foundActiveStream =
true;
486 LOG(VB_GENERAL, LOG_ERR,
"StreamView hasn't found any streams!");
502 if (!item->
GetText(
"imageloaded").isEmpty())
508 if (!mdata->LogoUrl().isEmpty())
509 item->
SetImage(mdata->getAlbumArtFile());
514 item->
SetText(
" ",
"imageloaded");
523 LOG(VB_GENERAL, LOG_ERR,
"StreamView asked to add a stream but it isn't a radio stream!");
527 QString url = mdata->
Url();
542 if (url == itemsdata->Url())
557 LOG(VB_GENERAL, LOG_ERR,
"StreamView asked to update a stream but it isn't a radio stream!");
581 if (
id == currentMetadata->
ID())
595 if (playedmdata && playedmdata->ID() == id)
598 playedmdata->setChannel(mdata->
Channel());
601 playedmdata->toMap(metadataMap);
614 if (mdata->
ID() == itemsdata->ID())
629 LOG(VB_GENERAL, LOG_ERR,
"StreamView asked to delete a stream but it isn't a radio stream!");
676 LOG(VB_GENERAL, LOG_ERR,
"Cannot load screen 'editstreampopup'");
722 bool doUpdate =
true;
792 LOG(VB_GENERAL, LOG_ERR,
"Cannot load screen 'searchstream'");
868 if (!mdata.LogoUrl().isEmpty() && mdata.LogoUrl() !=
"-")
870 if (item->
GetText(
"dummy") ==
" ")
891 query.
prepare(
"SELECT DISTINCT broadcaster FROM music_streams ORDER BY broadcaster;");
915 query.
prepare(
"SELECT DISTINCT genre FROM music_streams ORDER BY genre;");
941 query.
prepare(
"SELECT DISTINCT country FROM music_streams ORDER BY country;");
968 query.
prepare(
"SELECT DISTINCT language FROM music_streams ORDER BY language;");
1015 bool searchBroadcaster = (broadcaster != tr(
"<All Broadcasters>"));
1016 bool searchGenre = (genre != tr(
"<All Genres>"));
1017 bool searchLanguage = (language != tr(
"<All Languages>"));
1018 bool searchCountry = (country != tr(
"<All Countries>"));
1019 bool searchChannel = !channel.isEmpty();
1026 QString sql =
"SELECT broadcaster, channel, description, genre, url1, url2, url3, url4, url5, "
1027 "logourl, metaformat, country, language "
1028 "FROM music_streams ";
1029 bool doneWhere =
false;
1031 if (searchBroadcaster)
1033 sql +=
"WHERE broadcaster = :BROADCASTER ";
1041 sql +=
"WHERE genre = :GENRE ";
1045 sql +=
"AND genre = :GENRE ";
1052 sql +=
"WHERE language = :LANGUAGE ";
1056 sql +=
"AND language = :LANGUAGE ";
1063 sql +=
"WHERE country = :COUNTRY ";
1067 sql +=
"AND country = :COUNTRY ";
1074 sql +=
"WHERE channel LIKE " + QString(
"'%%1%'").arg(channel);
1078 sql +=
"AND channel LIKE " + QString(
"'%%1%' ").arg(channel);
1081 sql +=
"ORDER BY broadcaster, channel;";
1085 if (searchBroadcaster)
1086 query.
bindValue(
":BROADCASTER", broadcaster);
1103 if (query.
size() > 500)
1105 QString message = tr(
"Updating stream list. Please Wait ...");
1110 while (query.
next())
1127 QVariant::fromValue(mdata));
1129 mdata.
toMap(metadataMap);
1131 item->SetTextFromMap(metadataMap);
1133 item->SetText(
" ",
"dummy");
1136 if ((count % 500) == 0)
1138 qApp->processEvents();
1144 if (query.
size() > 500)
void streamItemClicked(MythUIButtonListItem *item)
bool isActive(void) const
void LoadInBackground(const QString &message="")
bool next(void)
Wrap QSqlQuery::next() so we can display the query results.
QSqlQuery wrapper that fetches a DB connection from the connection pool.
MythScreenStack * GetMainStack()
void updateStreamList(void)
MythUIText * m_bufferStatus
MusicMetadata * getSongAt(int pos) const
void updateStream(MusicMetadata *mdata)
bool setCurrentTrackPos(int pos)
static const Type kMythEventMessage
void addStream(MusicMetadata *mdata)
void Reset(void) override
Reset the widget to it's original state, should not reset changes made by the theme.
bool Create(void) override
void loadStreamPlaylist(void)
bool keyPressEvent(QKeyEvent *e) override
Key event handler.
void ShowMenu(void) override
void doUpdateStreams(void)
MythUIButtonList * m_genreList
MusicMetadata * getMetadata(MusicMetadata::IdType an_id)
MythMenu * createSubMenu(void)
This class is used as a container for messages.
void updateLanguages(void)
QVariant value(int i) const
virtual bool Create(void)
bool exec(void)
Wrap QSqlQuery::exec() so we can display SQL.
void doRemoveStream(bool ok)
bool isPlaying(void) const
void OpenBusyPopup(const QString &message="")
#define LOG(_MASK_, _LEVEL_, _QSTRING_)
Screen in which all other widgets are contained and rendered.
MythUIProgressBar * m_bufferProgress
QString GetText(void) const
Playlist * getCurrentPlaylist(void)
void streamClicked(MythUIButtonListItem *item)
void updateStream(MusicMetadata *mdata)
void setPlayMode(PlayMode mode)
void updateCountries(void)
const QString & Message() const
MythUIType * GetFocusWidget(void) const
QHash< QString, QString > InfoMap
static const Type kPlayedTracksChangedEvent
MusicMetadata * getCurrentMetadata(void)
get the metadata for the current track in the playlist
MythUIButtonList * m_countryList
void SetText(const QString &text, bool moveCursor=true)
static const Type kStopped
Events sent by the DecoderHandler and it's helper classes.
MythUIButtonList * m_streamList
void getBufferStatus(int *available, int *maxSize) const
bool TranslateKeyPress(const QString &Context, QKeyEvent *Event, QStringList &Actions, bool AllowJumps=true)
Get a list of actions for a keypress in the given context.
MusicMetadata * m_currStream
static const Type kTrackChangeEvent
Basic menu dialog, message and a list of options.
static MythThemedMenu * menu
static MSqlQueryInfo InitCon(ConnectionReuse _reuse=kNormalConnection)
Only use this in combination with MSqlQuery constructor.
static const Type kOperationStart
static void DBError(const QString &where, const MSqlQuery &query)
MythUITextEdit * m_channelEdit
AllStream * m_all_streams
MythUIButtonList * m_broadcasterList
void BuildFocusList(void)
MusicMetadata * m_lastStream
void deleteStream(MusicMetadata *mdata)
static void streamItemVisible(MythUIButtonListItem *item)
void addStream(MusicMetadata *mdata)
MythUIButtonList * m_streamList
void removeStream(MusicMetadata *mdata)
void updateUIPlayedList(void)
MythUIText * m_matchesText
static const Type kOperationStop
static bool Assign(ContainerType *container, UIType *&item, const QString &name, bool *err=nullptr)
static const Type kPlaying
void updateBroadcasters(void)
void updateTrackInfo(MusicMetadata *mdata)
QList< MusicMetadata * > & getPlayedTracksList(void)
MythUIButtonList * m_languageList
static bool LoadWindowFromXML(const QString &xmlfile, const QString &windowname, MythUIType *parent)
EditStreamMetadata * m_parent
void bindValue(const QString &placeholder, const QVariant &val)
Add a single binding.
Event dispatched from MythUI modal dialogs to a listening class containing a result of some form.
bool keyPressEvent(QKeyEvent *event) override
Key event handler.
static const Type kBufferStatus
virtual void SetText(const QString &text)
virtual void SetVisible(bool visible)
static const Type kEventType
MythMainWindow * GetMythMainWindow(void)
void Load(void) override
Load data which will ultimately be displayed on-screen or used to determine what appears on-screen (S...
MythUIButtonList * m_playedTracksList
static void streamVisible(MythUIButtonListItem *item)
MythScreenStack * GetStack(const QString &Stackname)
static void loadStreams(void)
QList< MusicMetadata > m_streams
void stop(bool stopAll=false)
static const Type kBuffering
StreamView(MythScreenStack *parent, MythScreenType *parentScreen)
virtual void AddScreen(MythScreenType *screen, bool allowFade=true)
MythConfirmationDialog * ShowOkPopup(const QString &message, bool showCancel)
Non-blocking version of MythPopupBox::showOkPopup()
void customEvent(QEvent *event) override
void customEvent(QEvent *event) override
void CloseBusyPopup(void)
bool prepare(const QString &query)
QSqlQuery::prepare() is not thread safe in Qt <= 3.3.2.