public override LiveStream[] GetLiveStreams()
{
List <LiveStream> liveStreams = new List <LiveStream>();
lock (_liveStreamsLock)
{
try
{
// Get cards in reverse priority.
List <TvDatabase.Card> cards = Utility.GetAllCards();
cards.Sort(delegate(TvDatabase.Card c1, TvDatabase.Card c2) { return(-c1.Priority.CompareTo(c2.Priority)); });
// Get the list of live streams from TV Server
Dictionary <string, IUser> mpStreamUsers = new Dictionary <string, IUser>();
foreach (TvDatabase.Card card in cards)
{
IUser[] cardUsers = TvServerPlugin.TvController_GetUsersForCard(card.IdCard);
if (cardUsers != null)
{
foreach (IUser user in cardUsers)
{
if (user.Name.StartsWith(_argusLiveUserName))
{
IUser tve3User = user;
if (TvServerPlugin.TvController_IsTimeShifting(ref tve3User))
{
mpStreamUsers.Add(TvServerPlugin.TvController_GetStreamingUrl(tve3User), tve3User);
}
}
}
}
}
// Now loop our own list and check if all those streams are indeed still up.
List <string> keysToRemove = new List <string>();
foreach (LiveStream stream in _liveStreams.Values)
{
if (mpStreamUsers.ContainsKey(stream.RtspUrl))
{
liveStreams.Add(stream);
}
else
{
keysToRemove.Add(stream.RtspUrl);
}
}
// Remove streams that no longer exist.
foreach (string keyToRemove in keysToRemove)
{
_liveStreams.Remove(keyToRemove);
_liveStreamUsers.Remove(keyToRemove);
}
// Check if there are any live streams within MP that we don't know about.
// If so, stop those streams (they may be left-overs from client crashes).
foreach (string rtspUrl in mpStreamUsers.Keys)
{
if (!_liveStreams.ContainsKey(rtspUrl))
{
IUser tve3User = mpStreamUsers[rtspUrl];
TvServerPlugin.TvController_StopTimeShifting(ref tve3User, TvStoppedReason.KickedByAdmin);
}
}
}
catch (Exception ex)
{
Log(TraceEventType.Error, ex.Message);
}
}
return(liveStreams.ToArray());
}