58 LOG(VB_GENERAL, LOG_ERR,
"Cannot load screen 'streamview'");
79 auto *
menu =
new MythMenu(tr(
"Stream Actions"),
this,
"mainmenu");
80 menu->AddItemV(MusicCommon::tr(
"Fullscreen Visualizer"), QVariant::fromValue((
int)
MV_VISUALIZER));
81 menu->AddItem(tr(
"Add Stream"));
85 menu->AddItem(tr(
"Edit Stream"));
86 menu->AddItem(tr(
"Remove Stream"));
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 QStringList tokens = me->
Message().split(
" ", Qt::SkipEmptyParts);
218 if (tokens.isEmpty())
221 if (tokens[0] ==
"DOWNLOAD_FILE")
223 QStringList
args = me->ExtraDataList();
225 if (tokens[1] ==
"UPDATE")
228 else if (tokens[1] ==
"FINISHED")
230 const QString& url =
args[0];
231 int fileSize =
args[2].toInt();
232 int errorCode =
args[4].toInt();
235 if ((errorCode != 0) || (fileSize == 0))
236 LOG(VB_GENERAL, LOG_ERR, QString(
"StreamView: failed to download radio icon from '%1'").arg(url));
243 if (mdata && mdata->LogoUrl() == url)
272 QString status = QString(
"%1%").arg((
int)(100.0 / ((
double)maxSize / (
double)available)));
292 if ((dce ==
nullptr) || (dce->GetResult() < 0))
295 QString resultid = dce->
GetId();
296 QString resulttext = dce->GetResultText();
298 if (resultid ==
"mainmenu")
300 if (resulttext == tr(
"Add Stream"))
310 else if (resulttext == tr(
"Remove Stream"))
314 else if (resulttext == tr(
"Edit Stream"))
346 for (
int i = 0; i < actions.size() && !handled; i++)
348 const QString&
action = actions[i];
355 else if (
action ==
"DELETE")
359 else if (
action ==
"TOGGLELAST")
392 mainStack->AddScreen(screen);
407 ShowOkPopup(tr(
"Are you sure you want to delete this Stream?\n"
408 "Broadcaster: %1 - Channel: %2")
409 .arg(mdata->Broadcaster(), mdata->Channel()),
433 if (
nullptr == playlist)
438 bool foundActiveStream =
false;
444 QVariant::fromValue(mdata));
447 mdata->
toMap(metadataMap);
448 item->SetTextFromMap(metadataMap);
449 item->SetText(
"",
"imageloaded");
450 item->SetFontState(
"normal");
451 item->DisplayState(
"default",
"playstate");
459 item->SetFontState(
"running");
460 item->DisplayState(
"playing",
"playstate");
464 item->SetFontState(
"idle");
465 item->DisplayState(
"paused",
"playstate");
469 item->SetFontState(
"normal");
470 item->DisplayState(
"stopped",
"playstate");
477 foundActiveStream =
true;
491 LOG(VB_GENERAL, LOG_ERR,
"StreamView hasn't found any streams!");
507 if (!item->
GetText(
"imageloaded").isEmpty())
513 if (!mdata->LogoUrl().isEmpty())
514 item->
SetImage(mdata->getAlbumArtFile());
519 item->
SetText(
" ",
"imageloaded");
528 LOG(VB_GENERAL, LOG_ERR,
"StreamView asked to add a stream but it isn't a radio stream!");
532 QString url = mdata->
Url();
547 if (url == itemsdata->Url())
562 LOG(VB_GENERAL, LOG_ERR,
"StreamView asked to update a stream but it isn't a radio stream!");
586 if (
id == currentMetadata->
ID())
600 if (playedmdata && playedmdata->ID() == id)
603 playedmdata->setChannel(mdata->
Channel());
606 playedmdata->toMap(metadataMap);
619 if (mdata->
ID() == itemsdata->ID())
634 LOG(VB_GENERAL, LOG_ERR,
"StreamView asked to delete a stream but it isn't a radio stream!");
681 LOG(VB_GENERAL, LOG_ERR,
"Cannot load screen 'editstreampopup'");
729 bool doUpdate =
true;
799 LOG(VB_GENERAL, LOG_ERR,
"Cannot load screen 'searchstream'");
875 if (!mdata.LogoUrl().isEmpty() && mdata.LogoUrl() !=
"-")
877 if (item->
GetText(
"dummy") ==
" ")
898 query.
prepare(
"SELECT DISTINCT broadcaster FROM music_streams ORDER BY broadcaster;");
922 query.
prepare(
"SELECT DISTINCT genre FROM music_streams ORDER BY genre;");
948 query.
prepare(
"SELECT DISTINCT country FROM music_streams ORDER BY country;");
975 query.
prepare(
"SELECT DISTINCT language FROM music_streams ORDER BY language;");
1022 bool searchBroadcaster = (broadcaster != tr(
"<All Broadcasters>"));
1023 bool searchGenre = (genre != tr(
"<All Genres>"));
1024 bool searchLanguage = (language != tr(
"<All Languages>"));
1025 bool searchCountry = (country != tr(
"<All Countries>"));
1026 bool searchChannel = !channel.isEmpty();
1033 QString sql =
"SELECT broadcaster, channel, description, genre, url1, url2, url3, url4, url5, "
1034 "logourl, metaformat, country, language "
1035 "FROM music_streams ";
1036 bool doneWhere =
false;
1038 if (searchBroadcaster)
1040 sql +=
"WHERE broadcaster = :BROADCASTER ";
1048 sql +=
"WHERE genre = :GENRE ";
1053 sql +=
"AND genre = :GENRE ";
1061 sql +=
"WHERE language = :LANGUAGE ";
1066 sql +=
"AND language = :LANGUAGE ";
1074 sql +=
"WHERE country = :COUNTRY ";
1079 sql +=
"AND country = :COUNTRY ";
1087 sql +=
"WHERE channel LIKE " + QString(
"'%%1%'").arg(channel);
1092 sql +=
"AND channel LIKE " + QString(
"'%%1%' ").arg(channel);
1096 sql +=
"ORDER BY broadcaster, channel;";
1100 if (searchBroadcaster)
1101 query.
bindValue(
":BROADCASTER", broadcaster);
1118 if (query.
size() > 500)
1120 QString message = tr(
"Updating stream list. Please Wait ...");
1125 while (query.
next())
1142 QVariant::fromValue(mdata));
1144 mdata.
toMap(metadataMap);
1146 item->SetTextFromMap(metadataMap);
1148 item->SetText(
" ",
"dummy");
1151 if ((count % 500) == 0)
1153 qApp->processEvents();
1159 if (query.
size() > 500)
void removeStream(MusicMetadata *mdata)
void updateStream(MusicMetadata *mdata)
MusicMetadata * getMetadata(MusicMetadata::IdType an_id)
void addStream(MusicMetadata *mdata)
Events sent by the DecoderHandler and it's helper classes.
static const Type kBufferStatus
static const Type kOperationStart
void getBufferStatus(int *available, int *maxSize) const
static const Type kOperationStop
Event dispatched from MythUI modal dialogs to a listening class containing a result of some form.
static const Type kEventType
QSqlQuery wrapper that fetches a DB connection from the connection pool.
bool prepare(const QString &query)
QSqlQuery::prepare() is not thread safe in Qt <= 3.3.2.
QVariant value(int i) const
bool isActive(void) const
bool exec(void)
Wrap QSqlQuery::exec() so we can display SQL.
void bindValue(const QString &placeholder, const QVariant &val)
Add a single binding.
bool next(void)
Wrap QSqlQuery::next() so we can display the query results.
static MSqlQueryInfo InitCon(ConnectionReuse _reuse=kNormalConnection)
Only use this in combination with MSqlQuery constructor.
void updateTrackInfo(MusicMetadata *mdata)
void updateUIPlayedList(void)
MythMenu * createSubMenu(void)
bool keyPressEvent(QKeyEvent *e) override
Key event handler.
MythUIButtonList * m_playedTracksList
void customEvent(QEvent *event) override
AllStream * m_all_streams
static const Type kPlayedTracksChangedEvent
static const Type kTrackChangeEvent
MusicMetadata * getCurrentMetadata(void)
get the metadata for the current track in the playlist
void setPlayMode(PlayMode mode)
void stop(bool stopAll=false)
void loadStreamPlaylist(void)
QList< MusicMetadata * > & getPlayedTracksList(void)
bool isPlaying(void) const
bool setCurrentTrackPos(int pos)
Playlist * getCurrentPlaylist(void)
static void DBError(const QString &where, const MSqlQuery &query)
Basic menu dialog, message and a list of options.
This class is used as a container for messages.
const QString & Message() const
static const Type kMythEventMessage
MythScreenStack * GetMainStack()
bool TranslateKeyPress(const QString &Context, QKeyEvent *Event, QStringList &Actions, bool AllowJumps=true)
Get a list of actions for a keypress in the given context.
MythScreenStack * GetStack(const QString &Stackname)
virtual void AddScreen(MythScreenType *screen, bool allowFade=true)
Screen in which all other widgets are contained and rendered.
void LoadInBackground(const QString &message="")
virtual bool Create(void)
void OpenBusyPopup(const QString &message="")
void BuildFocusList(void)
MythUIType * GetFocusWidget(void) const
void CloseBusyPopup(void)
QString GetText(void) const
void SetText(const QString &text, bool moveCursor=true)
void Reset(void) override
Reset the widget to it's original state, should not reset changes made by the theme.
virtual void SetText(const QString &text)
virtual void SetVisible(bool visible)
static const Type kPlaying
static const Type kStopped
static const Type kBuffering
MusicMetadata * getSongAt(int pos) const
static void loadStreams(void)
static void streamVisible(MythUIButtonListItem *item)
QList< MusicMetadata > m_streams
void updateBroadcasters(void)
void updateCountries(void)
MythUITextEdit * m_channelEdit
MythUIButtonList * m_broadcasterList
MythUIButtonList * m_streamList
void Load(void) override
Load data which will ultimately be displayed on-screen or used to determine what appears on-screen (S...
MythUIText * m_matchesText
void doUpdateStreams(void)
EditStreamMetadata * m_parent
void updateLanguages(void)
MythUIButtonList * m_countryList
void streamClicked(MythUIButtonListItem *item)
MythUIButtonList * m_languageList
MythUIButtonList * m_genreList
void addStream(MusicMetadata *mdata)
static void streamItemVisible(MythUIButtonListItem *item)
bool Create(void) override
void streamItemClicked(MythUIButtonListItem *item)
MusicMetadata * m_lastStream
void customEvent(QEvent *event) override
MythUIText * m_bufferStatus
void updateStream(MusicMetadata *mdata)
void deleteStream(MusicMetadata *mdata)
MythUIProgressBar * m_bufferProgress
void doRemoveStream(bool ok)
void ShowMenu(void) override
StreamView(MythScreenStack *parent, MythScreenType *parentScreen)
void updateStreamList(void)
bool keyPressEvent(QKeyEvent *event) override
Key event handler.
MusicMetadata * m_currStream
MythUIButtonList * m_streamList
static bool LoadWindowFromXML(const QString &xmlfile, const QString &windowname, MythUIType *parent)
MythConfirmationDialog * ShowOkPopup(const QString &message, bool showCancel)
Non-blocking version of MythPopupBox::showOkPopup()
#define LOG(_MASK_, _LEVEL_, _QSTRING_)
MythMainWindow * GetMythMainWindow(void)
static MythThemedMenu * menu
QHash< QString, QString > InfoMap
static bool Assign(ContainerType *container, UIType *&item, const QString &name, bool *err=nullptr)