From 66a206d1775d8c45fc7e44f5648dc9e91e61d442 Mon Sep 17 00:00:00 2001
From: sebastiii <sebastiii@team-mediaportal.com>
Date: Sun, 27 Dec 2015 14:05:23 +0100
Subject: [PATCH] TVE3 Patch @regeszter

---
 .../SetupTv/62_upgrade_mysql_database.sql          |   2 +-
 TvEngine3/TVLibrary/TvPlugin/TvPlugin/TVHome.cs    | 179 +++++++++++----------
 .../TVLibrary/TvPlugin/TvPlugin/TvRecorded.cs      |  99 ++++++++++--
 .../MediaPortal.Base/language/strings_en.xml       |  21 ++-
 4 files changed, 198 insertions(+), 103 deletions(-)

diff --git a/TvEngine3/TVLibrary/SetupTv/62_upgrade_mysql_database.sql b/TvEngine3/TVLibrary/SetupTv/62_upgrade_mysql_database.sql
index 048aa95..c33ff54 100644
--- a/TvEngine3/TVLibrary/SetupTv/62_upgrade_mysql_database.sql
+++ b/TvEngine3/TVLibrary/SetupTv/62_upgrade_mysql_database.sql
@@ -1,5 +1,5 @@
 USE %TvLibrary%;
 
-ALTER TABLE mptvdb.channelgroup ADD COLUMN pinCode VARCHAR(5) NULL  AFTER sortOrder ;
+ALTER TABLE channelgroup ADD COLUMN pinCode VARCHAR(5) NULL  AFTER sortOrder ;
 
 UPDATE version SET versionNumber=62 WHERE idVersion=1;
\ No newline at end of file
diff --git a/TvEngine3/TVLibrary/TvPlugin/TvPlugin/TVHome.cs b/TvEngine3/TVLibrary/TvPlugin/TvPlugin/TVHome.cs
index 7883e0c..5176eca 100644
--- a/TvEngine3/TVLibrary/TvPlugin/TvPlugin/TVHome.cs
+++ b/TvEngine3/TVLibrary/TvPlugin/TvPlugin/TVHome.cs
@@ -134,6 +134,7 @@ namespace TvPlugin
     private static bool _isAnyCardRecording = false;
     protected static TvServer _server;
     public static bool firstNotLoaded = true;
+    internal static bool _allowProtectedItem;
 
     private static ManualResetEvent _waitForBlackScreen = null;
     private static ManualResetEvent _waitForVideoReceived = null;
@@ -427,16 +428,11 @@ namespace TvPlugin
 
       IList<ChannelGroup> groups = ChannelGroup.ListAll();
 
-      List<int> disallowedGroups = new List<int>();
-
-      foreach (ChannelGroup group in groups)
-      {
-        if (hidePinProtectedChannelsGroup && !string.IsNullOrEmpty(group.PinCode)
-          || !string.IsNullOrEmpty(group.PinCode) && TVHome.Navigator.CurrentGroup.IdGroup != group.IdGroup)
-        {
-          disallowedGroups.Add(group.IdGroup);
-        }
-      }
+      var disallowedGroups = (from @group in groups
+                              where
+                                hidePinProtectedChannelsGroup && !string.IsNullOrEmpty(@group.PinCode) ||
+                                !string.IsNullOrEmpty(@group.PinCode) && TVHome.Navigator.CurrentGroup.IdGroup != @group.IdGroup
+                              select @group.IdGroup).ToList();
 
       List<Channel> channels = Channel.ListAll().ToList();
       IList<GroupMap> allgroupMaps = GroupMap.ListAll();
@@ -1705,6 +1701,7 @@ namespace TvPlugin
         {
           return true;
         }
+        _allowProtectedItem = true;
       }
       Navigator.SetCurrentGroup(dlg.SelectedLabelText);
       GUIPropertyManager.SetProperty("#TV.Guide.Group", dlg.SelectedLabelText);
@@ -2234,7 +2231,7 @@ namespace TvPlugin
 
     private void UpdateGUIonPlaybackStateChange(bool playbackStarted)
     {
-      if (btnTvOnOff.Selected != playbackStarted)
+      if (btnTvOnOff != null && btnTvOnOff.Selected != playbackStarted)
       {
         btnTvOnOff.Selected = playbackStarted;
       }
@@ -2242,14 +2239,14 @@ namespace TvPlugin
       UpdateProgressPercentageBar();
 
       bool hasTeletext = (!Connected || Card.HasTeletext) && (playbackStarted);
-      btnTeletext.IsVisible = hasTeletext;
+      if (btnTeletext != null) btnTeletext.IsVisible = hasTeletext;
     }
 
     private void UpdateGUIonPlaybackStateChange()
     {
       bool isTimeShiftingTV = (Connected && Card.IsTimeShifting && g_Player.IsTV);
 
-      if (btnTvOnOff.Selected != isTimeShiftingTV)
+      if (btnTvOnOff != null && btnTvOnOff.Selected != isTimeShiftingTV)
       {
         btnTvOnOff.Selected = isTimeShiftingTV;
       }
@@ -2257,7 +2254,7 @@ namespace TvPlugin
       UpdateProgressPercentageBar();
 
       bool hasTeletext = (!Connected || Card.HasTeletext) && (isTimeShiftingTV);
-      btnTeletext.IsVisible = hasTeletext;
+      if (btnTeletext != null) btnTeletext.IsVisible = hasTeletext;
     }
 
     private void UpdateCurrentChannel()
@@ -2291,41 +2288,56 @@ namespace TvPlugin
       }
 
       dlg.Reset();
-      dlg.SetHeading(200052); // Active Recordings      
+      dlg.SetHeading(200052); // Active Recordings
 
-      List<int> disallowedChannels = ListDisallowedChannelsById();
-      IList<Recording> activeRecordings = Recording.ListAllActive();
+      var disallowedChannels = ListDisallowedChannelsById();
+      var activeRecordings = Recording.ListAllActive();
       if (activeRecordings != null && activeRecordings.Count > 0)
       {
-        foreach (Recording activeRecording in activeRecordings)
+        int addedItems = 0;
+        foreach (var activeRecording in activeRecordings)
         {
-          if (!ignoreActiveRecordings.Contains(activeRecording) && !disallowedChannels.Contains(activeRecording.IdChannel))
+          if (ignoreActiveRecordings.Contains(activeRecording) || disallowedChannels.Contains(activeRecording.IdChannel))
           {
-            GUIListItem item = new GUIListItem();
-            string channelName = activeRecording.ReferencedChannel().DisplayName;
-            string programTitle = activeRecording.Title.Trim(); // default is current EPG info
-
-            item.Label = channelName;
-            item.Label2 = programTitle;
+            continue;
+          }
+          GUIListItem item = new GUIListItem();
+          string channelName = activeRecording.ReferencedChannel().DisplayName;
+          string programTitle = activeRecording.Title.Trim(); // default is current EPG info
 
-            string strLogo = Utils.GetCoverArt(Thumbs.TVChannel, channelName);
-            if (string.IsNullOrEmpty(strLogo))
-            {
-              strLogo = "defaultVideoBig.png";
-            }
+          item.Label = channelName;
+          item.Label2 = programTitle;
 
-            item.IconImage = strLogo;
-            item.IconImageBig = strLogo;
-            item.PinImage = "";
-            dlg.Add(item);
+          string strLogo = Utils.GetCoverArt(Thumbs.TVChannel, channelName);
+          if (string.IsNullOrEmpty(strLogo))
+          {
+            strLogo = "defaultVideoBig.png";
           }
+
+          item.IconImage = strLogo;
+          item.IconImageBig = strLogo;
+          item.PinImage = "";
+          dlg.Add(item);
+          addedItems++;
         }
 
-        dlg.SelectedLabel = activeRecordings.Count;
+        if (addedItems > 0)
+        {
+          dlg.SelectedLabel = activeRecordings.Count;
+        }
 
         dlg.DoModal(this.GetID);
-        if (dlg.SelectedLabel < 0)
+        activeRecordings = activeRecordings.Where(stream => !disallowedChannels.Contains(stream.IdChannel)).ToList();
+        if (activeRecordings.Count == 0)
         {
+          GUIDialogOK pDlgOK = (GUIDialogOK)GUIWindowManager.GetWindow((int)Window.WINDOW_DIALOG_OK);
+          if (pDlgOK != null)
+          {
+            pDlgOK.SetHeading(200052); //my tv
+            pDlgOK.SetLine(1, GUILocalizeStrings.Get(200053)); // No Active recordings
+            pDlgOK.SetLine(2, "");
+            pDlgOK.DoModal(this.GetID);
+          }
           return;
         }
 
@@ -2341,16 +2353,15 @@ namespace TvPlugin
           return;
         }
         bool deleted = TVUtil.StopRecAndSchedWithPrompt(parentSchedule, selectedRecording.IdChannel);
-        
         if (deleted && !ignoreActiveRecordings.Contains(selectedRecording))
         {
           ignoreActiveRecordings.Add(selectedRecording);
 
-        /*  if (DebugSettings.EnableRecordingFromTimeshift)
-          {
-            Log.Debug("MergeTSbufferToRecordedFile: {0}", selectedRecording.FileName);
-            RemoteControl.Instance.MergeTSbufferToRecordedFile(selectedRecording.FileName);
-          } regeszter */
+          /*  if (DebugSettings.EnableRecordingFromTimeshift)
+            {
+              Log.Debug("MergeTSbufferToRecordedFile: {0}", selectedRecording.FileName);
+              RemoteControl.Instance.MergeTSbufferToRecordedFile(selectedRecording.FileName);
+            } regeszter */
         }
         OnActiveRecordings(ignoreActiveRecordings); //keep on showing the list until --> 1) user leaves menu, 2) no more active recordings
       }
@@ -2387,10 +2398,7 @@ namespace TvPlugin
         {
           return true;
         }
-        else
-        {
-          return false;
-        }
+        return false;
       }
     }
 
@@ -2410,6 +2418,10 @@ namespace TvPlugin
       int count = 0;
       TvServer server = new TvServer();
       List<IUser> _users = new List<IUser>();
+
+      // Display only protected stream if we are in a protected group
+      List<int> disallowedChannels = TVHome.ListDisallowedChannelsById();
+
       foreach (Card card in cards)
       {
         if (card.Enabled == false)
@@ -2421,58 +2433,54 @@ namespace TvPlugin
           continue;
         }
         IUser[] users = RemoteControl.Instance.GetUsersForCard(card.IdCard);
-
         if (users == null)
         {
           return;
         }
-        for (int i = 0; i < users.Length; ++i)
+        foreach (var t in users.ToList())
         {
-          IUser user = users[i];
+          var user = t;
           Log.Debug("rtsp url: {0}, {1}", user, RemoteControl.Instance.GetStreamingUrl(user));
-          
           if (card.IdCard != user.CardId)
           {
             continue;
           }
-          bool isRecording;
-          bool isTimeShifting;
           VirtualCard tvcard = new VirtualCard(user, RemoteControl.HostName);
-          isRecording = tvcard.IsRecording;
-          isTimeShifting = tvcard.IsTimeShifting;
-          if (isTimeShifting || (isRecording && !isTimeShifting))
+          var isRecording = tvcard.IsRecording;
+          var isTimeShifting = tvcard.IsTimeShifting;
+          if (isTimeShifting || (isRecording))
           {
             int idChannel = tvcard.IdChannel;
             user = tvcard.User;
             Channel ch = Channel.Retrieve(idChannel);
-            channels.Add(ch);
-            GUIListItem item = new GUIListItem();
-            item.Label = ch.DisplayName;
-            item.Label2 = user.Name;
-            string strLogo = Utils.GetCoverArt(Thumbs.TVChannel, ch.DisplayName);
-            if (string.IsNullOrEmpty(strLogo))
-            {
-              strLogo = "defaultVideoBig.png";
-            }
-            item.IconImage = strLogo;
-            if (isRecording)
-            {
-              item.PinImage = Thumbs.TvRecordingIcon;
-            }
-            else
-            {
-              item.PinImage = "";
-            }
-            dlg.Add(item);
-            _users.Add(user);
-            if (Card != null && Card.IdChannel == idChannel)
+            if (!disallowedChannels.Contains(ch.IdChannel))
             {
-              selected = count;
+              channels.Add(ch);
+              GUIListItem item = new GUIListItem();
+              item.Label = ch.DisplayName;
+              item.Label2 = user.Name;
+              string strLogo = Utils.GetCoverArt(Thumbs.TVChannel, ch.DisplayName);
+              if (string.IsNullOrEmpty(strLogo))
+              {
+                strLogo = "defaultVideoBig.png";
+              }
+              item.IconImage = strLogo;
+              item.PinImage = isRecording ? Thumbs.TvRecordingIcon : "";
+              dlg.Add(item);
+              _users.Add(user);
+              if (Card != null && Card.IdChannel == idChannel)
+              {
+                selected = count;
+              }
+              count++;
             }
-            count++;
           }
         }
       }
+
+      // Display only protected stream if we are in a protected group
+      channels = channels.Where(stream => !disallowedChannels.Contains(stream.IdChannel)).ToList();
+
       if (channels.Count == 0)
       {
         GUIDialogOK pDlgOK = (GUIDialogOK)GUIWindowManager.GetWindow((int)Window.WINDOW_DIALOG_OK);
@@ -2489,23 +2497,26 @@ namespace TvPlugin
       dlg.DoModal(this.GetID);
       if (dlg.SelectedLabel < 0)
       {
- 
         return;
       }
 
       string selectedUrl = RemoteControl.Instance.GetStreamingUrl(_users[dlg.SelectedLabel]);
       VirtualCard vCard = new VirtualCard(_users[dlg.SelectedLabel], RemoteControl.HostName);
       Channel channel = Navigator.GetChannel(vCard.IdChannel);
+
+      // Disable Placeshift feature (not working)
+      //ViewChannel(channel);
+
       User myUser = new User();
 
-      /// Connect to the virtual user and play
+      // Connect to the virtual user and play
       if (_users[dlg.SelectedLabel].Name.Contains("Placeshift Virtual User") || _users[dlg.SelectedLabel].Name == "aMPdroid")
       {
         if (inPlaceShift)
         {
           vPlaceshiftCard.StopTimeShifting();
         }
-        else if (Card.IsTimeShifting)
+        else if (Card != null && Card.IsTimeShifting)
         {
           Card.StopTimeShifting();
         }
@@ -2530,7 +2541,7 @@ namespace TvPlugin
         Navigator.setChannel(channel);
         UpdateCurrentChannel();
 
-        Log.Debug("placeshift selected active rtspUrl: {0} for channel: {1}, user: {2}, vCard.Id: {3}, TimeshiftPosition: {4}", 
+        Log.Debug("placeshift selected active rtspUrl: {0} for channel: {1}, user: {2}, vCard.Id: {3}, TimeshiftPosition: {4}",
           selectedUrl, channel.DisplayName, _users[dlg.SelectedLabel].Name, vCard.Id, TimeshiftPosition);
 
         // Setup vPlaceshiftCard for stoptimeshift
@@ -2546,7 +2557,7 @@ namespace TvPlugin
           {
             vPlaceshiftCard.StopTimeShifting();
           }
-          else if (Card.IsTimeShifting)
+          else if (Card != null && Card.IsTimeShifting)
           {
             Card.StopTimeShifting();
           }
@@ -2562,7 +2573,7 @@ namespace TvPlugin
         }
         else
         {
-         ViewChannel(channel);
+          ViewChannel(channel);
         }
       }
     }
diff --git a/TvEngine3/TVLibrary/TvPlugin/TvPlugin/TvRecorded.cs b/TvEngine3/TVLibrary/TvPlugin/TvPlugin/TvRecorded.cs
index f28551a..35bc37e 100644
--- a/TvEngine3/TVLibrary/TvPlugin/TvPlugin/TvRecorded.cs
+++ b/TvEngine3/TVLibrary/TvPlugin/TvPlugin/TvRecorded.cs
@@ -81,12 +81,14 @@ namespace TvPlugin
     private bool _resetSMSsearch = false;
     private bool _oldStateSMSsearch;
     private DateTime _resetSMSsearchDelay;
+    private bool _showAllRecording;
 
     [SkinControl(6)]
     protected GUIButtonControl btnCleanup = null;
     [SkinControl(7)]
     protected GUIButtonControl btnCompress = null;
-    
+    [SkinControl(8)]
+    protected GUIButtonControl btnRecordedDisAllowed = null;
 
     #endregion
 
@@ -269,6 +271,14 @@ namespace TvPlugin
       g_Player.PlayBackStarted -= new g_Player.StartedHandler(OnPlayRecordingBackStarted);
       g_Player.PlayBackChanged -= new g_Player.ChangedHandler(OnPlayRecordingBackChanged);*/
 
+      // Reset disallowed recorded items only we didn't start or stop the video.
+      if (newWindowId != (int)Window.WINDOW_FULLSCREEN_VIDEO)
+      {
+        _showAllRecording = false;
+        TVHome._allowProtectedItem = false;
+        TVHome.LoadSettings(true);
+      }
+
       _iSelectedItem = GetSelectedItemNo();
       SaveSettings();
       base.OnPageDestroy(newWindowId);
@@ -345,6 +355,11 @@ namespace TvPlugin
       {
         OnCleanup();
       }
+
+      if (control == btnRecordedDisAllowed)
+      {
+        OnRecordedDisAllowed();
+      }
     }
 
     protected override void OnInfo(int iItem)
@@ -684,19 +699,11 @@ namespace TvPlugin
         Log.Debug("LoadDirectory() - finished loading '" + radiogroupIDs.Count() + "' radiogroupIDs after '{0}' ms.", watch.ElapsedMilliseconds);
 
         //List<Recording> recordings = (from r in Recording.ListAll()where !(from rad in radiogroups select rad.IdChannel).Contains(r.IdChannel)select r).ToList();
-        List<Recording> allRecordings = Recording.ListAll().Where(rec => radiogroupIDs.All(id => rec.IdChannel != id)).ToList();
+        var allRecordings = Recording.ListAll().Where(rec => radiogroupIDs.All(id => rec.IdChannel != id)).ToList();
         Log.Debug("LoadDirectory() - finished loading '" + allRecordings.Count + "' recordings after '{0}' ms.", watch.ElapsedMilliseconds);
 
-        List<Recording> recordings = new List<Recording>();
-
         // skip recording if it was recorded from a disallowed (PIN protected) channel
-        foreach (Recording rec in allRecordings)
-        {
-          if (!disallowedChannels.Contains(rec.IdChannel))
-          {
-            recordings.Add(rec);
-          }
-        }
+        var recordings = !_showAllRecording ? allRecordings.Where(rec => !disallowedChannels.Contains(rec.IdChannel)).ToList() : allRecordings;
 
         // load the active channels only once to save multiple requests later when retrieving related channel
         List<Channel> channels = Channel.ListAll().ToList();
@@ -793,8 +800,8 @@ namespace TvPlugin
             Utils.SetDefaultIcons(item);
             item.ThumbnailImage = item.IconImageBig;
             facadeLayout.Add(item);
-            
-            if (string.IsNullOrEmpty(item.Label)) 	
+
+            if (string.IsNullOrEmpty(item.Label))
             {
               item.Label = GUILocalizeStrings.Get(2014); //unknown
             }
@@ -805,7 +812,7 @@ namespace TvPlugin
           #region Showing a folders content
 
           // add parent item
-          var item = new GUIListItem("..") {IsFolder = true};
+          var item = new GUIListItem("..") { IsFolder = true };
           Utils.SetDefaultIcons(item);
           facadeLayout.Add(item);
 
@@ -866,7 +873,7 @@ namespace TvPlugin
       Log.Debug("LoadDirectory() - finished sorting facade after '{0}' ms.", watch.ElapsedMilliseconds);
 
       UpdateProperties();
-      UpdateThumbnails(); 
+      UpdateThumbnails();
     }
 
     public static string GetRecordingDisplayName(Recording rec)
@@ -1414,6 +1421,68 @@ namespace TvPlugin
       GUIControl.SelectItemControl(GetID, facadeLayout.GetID, _iSelectedItem);
     }
 
+    private void OnRecordedDisAllowed()
+    {
+      // Disallowed recording are present, ask user if we need to show them
+      var disallowedChannels = TVHome.ListDisallowedChannelsById();
+
+      // lookup radio channel ID in radio group map (smallest table that could identify a radio channel) to remove radiochannels from recording list
+      IEnumerable<int> radiogroupIDs = RadioGroupMap.ListAll().Select(radiogroup => radiogroup.IdChannel).ToList();
+
+      var allRecordings = Recording.ListAll().Where(rec => radiogroupIDs.All(id => rec.IdChannel != id)).ToList();
+      var recordingsDisallowed = allRecordings.Where(rec => disallowedChannels.Contains(rec.IdChannel)).ToList();
+      if (recordingsDisallowed.Count > 0)
+      {
+        bool hideItems = false;
+        var dlgYesNo = (GUIDialogYesNo)GUIWindowManager.GetWindow((int)Window.WINDOW_DIALOG_YES_NO);
+        if (null == dlgYesNo)
+        {
+          return;
+        }
+        dlgYesNo.SetHeading(1657); // Unhide/hide protected recording
+        if (TVHome._allowProtectedItem)
+        {
+          dlgYesNo.SetLine(1, 1659); // Do you want to hide them?
+          hideItems = true;
+        }
+        else
+        {
+          dlgYesNo.SetLine(1, 1658); // Do you want to show them?
+        }
+        dlgYesNo.DoModal(GetID);
+
+        if (dlgYesNo.IsConfirmed)
+        {
+          if (!hideItems)
+          {
+            string userCode = string.Empty;
+            string fileMenuPinCode;
+            using (Settings xmlreader = new MPSettings())
+            {
+              fileMenuPinCode = Utils.DecryptPassword(xmlreader.GetValueAsString("filemenu", "pincode", string.Empty));
+            }
+
+            if (!string.IsNullOrEmpty(fileMenuPinCode))
+            {
+              GetUserPasswordString(ref userCode);
+              if (userCode != fileMenuPinCode)
+              {
+                return;
+              }
+              _showAllRecording = true;
+              TVHome._allowProtectedItem = true;
+            }
+          }
+          else
+          {
+            _showAllRecording = false;
+            TVHome._allowProtectedItem = false;
+          }
+        }
+        LoadDirectory();
+      }
+    }
+
     private void DeleteWatchedRecordings(string currentTitle)
     {
       RemoteControl.Instance.DeleteWatchedRecordings(currentTitle);
diff --git a/mediaportal/MediaPortal.Base/language/strings_en.xml b/mediaportal/MediaPortal.Base/language/strings_en.xml
index 0129c1d..4becb89 100644
--- a/mediaportal/MediaPortal.Base/language/strings_en.xml
+++ b/mediaportal/MediaPortal.Base/language/strings_en.xml
@@ -1119,7 +1119,7 @@
     <String id="1508">Channel not mapped to any card</String>
     <String id="1509">No tuning details for the channel</String>
     <String id="1510">Connection to TV service lost</String>
-    <String id="1511">No active streams</String>
+    <String id="1511">No active streams or protected</String>
     <String id="1512">Tune previous ch.?</String>
     <String id="1513">Timeshifting stopped due to a scheduled\rrecording</String>
     <String id="1514">Timeshifting stopped by an\radministrator</String>
@@ -1142,6 +1142,9 @@
     <String id="1654">Wind Speed Units</String>
     <String id="1655">Refresh Interval</String>
     <String id="1656">mins</String>    
+    <String id="1657">Unhide/hide protected recording</String> 
+    <String id="1658">Do you want to show them?</String>
+    <String id="1659">Do you want to hide them?</String>
     <String id="1900">Outdated Skin</String>
     <String id="1901">Your currently selected skin ({0}) is outdated. This could cause problems while using MediaPortal. For this reason MediaPortal has temporarily switched to the default skin. If however you would like to try using the outdated skin, press the 'Ignore and try' button, but remember: Do NOT file a bug report using this skin!
 (to dismiss this warning either wait until it closes automatically or press Back/ESC on you remote)</String>
@@ -2097,7 +2100,7 @@
     <String id="200050">This will delete your recordings from hard drive</String>
     <String id="200051">Delete this episode?</String>
     <String id="200052">Active recordings</String>
-    <String id="200053">No active recordings</String>
+    <String id="200053">No active recordings or protected</String>
     <String id="200054">Could not delete TV recording.</String>
     <String id="200055">Live TV viewing might be disrupted.</String>
     <String id="200059">Audio Dual Mono Mode</String>
@@ -2383,11 +2386,23 @@
 	<String id="350018">NoPlugin</String>
 	<String id="350019">Label settings...</String>
 	<String id="350020">Press Info/F9 for all supported plugins...</String>
-	<String id="350021">Weather</String>
+	<String id="350021">World Weather Lite</String>
 	<String id="350022">MusicInfo Handler</String>
 	<String id="350023">Settings</String>
 	<String id="350024">Guide</String>
 	<String id="350025">Red Bull TV</String>
 	<String id="350026">YouTube</String>
+	<String id="350027">Worldnews</String>
+	<String id="350028">FritzBox</String>
+	<String id="350029">Radiotime</String>
+	<String id="350030">MvCentral</String>
+	<String id="350031">MultiShortcut</String>
+	<String id="350032">World Weather</String>
+	<String id="350033">Elapsed</String>
+	<String id="350034">Ends in</String>
+	<String id="350035">MultiShortcut2</String>
+    <String id="350036">MultiShortcut3</String>
+    <String id="350037">MovingPictures</String>
+    <String id="350038">HTPCinfo</String>
    </Section>
 </Language>
-- 
2.6.3.windows.1

