Skip to content

Music and Video Feeds

wtv-411 edited this page May 27, 2023 · 2 revisions

Music News Feed

On the MSN TV 2 Music page, which is stored locally in the firmware, a feed is loaded on the upper left pane containing links to music news and music videos, likely pointing to MSN sites. This would be fetched by contacting the URL in the home::backendproxy service if it was added to the user's service list by the MSN TV servers. The original URL used for home::backendproxy is unknown. The MSN TV 2 would make a GET request to this service via AJAX with this query string: ?mid=MSNTV&ds=64&guid=&time=00:00&feature=radiohomepage.

The home::backendproxy service would reply with an XML document. Thankfully, the firmware stores an XSL stylesheet that documents how the XML is structured, so we know what this XML document is. It contains a list of news items grouped by type, including the link and necessary metadata.

An example of the XML response looks like this:

<?xml version="1.0"?>
<items>
  <itemgroup type="feed">
    <item>
      <url>http://www.google.com</url>
      <title>News Entry 1</title>
    </item>
    <item>
      <url>http://www.google.com</url>
      <title>News Entry 2</title>
    </item>
    <item>
      <url>http://www.google.com</url>
      <title>News Entry 3</title>
    </item>
    ...
  </itemgroup>
  <itemgroup type="MSNVideo">
    <item videoGuid="925dd1c7-07fa-4a77-b895-cc6d5b9725fd">
      <image url="http://somecdn.com/image.jpg"/>
      <headline>MSNVideo headline</headline>
      <Topic>topic</Topic>
      <Category>category</Category>
    </item>
    <item videoGuid="ffffffff-ffff-ffff-ffff-ffffffffffff">
      <image url="http://somecdn.com/image.jpg"/>
      <headline>MSNVideo headline 2</headline>
      <Topic>topic</Topic>
      <Category>category</Category>
    </item>
    ...
  </itemgroup>
</items>

itemgroup stores specific kinds of item nodes, organizing them by what type of news feed they represent. The only feed types the MSN TV music page recognizes are feed (Music news) and MSNVideo (music videos), although there is the possibility that there might have been more undocumented itemgroups sent by backendproxy.

items in the feed itemgroup contain url and title nodes. It's as simple as it gets.

items in the MSNVideo itemgroup contain a bit more information, however. These nodes have a videoGuid attribute containing a GUID for the music video on MSN Video. They also carry sub-nodes for an optional music video thumbnail (presumably from a CDN), the headline text, and IDs for the MSN Video topic and category the video belongs to. This information is then used by the Music page to create links to the MSN TV Video service for these videos, which will then appear to the end user. This is done by adding the item properties as query parameters to the URL in the home::videoplus service:

  • Example URL: http://msntv.msn.com/pages/MSNVideo/main.aspx?i={videoGuid}&p={Topic}_{Category}

Radio Station List

The Music home page will also make a GET request to an XML service on the home::radioplus service (original URL unknown, although it was possibly hosted on msntv.msn.com), using the query string ?page=musicHomeStations in the request. It will do this to pull a list of featured MSN Radio stations and display them as links to the end user (although it will work with any audio streaming URLs of your choosing).

The service will respond with an XML document containing a list of featured stations for the page to display. While the original XML response is currently lost, most of the necessary node structure was able to be approximated based on the JavaScript of the Music page:

<?xml version="1.0"?>
<response>
  <metadata isPlusUser="false" />
  <FeaturedStations>
    <station plus="False" name="'70s Soul &amp; R&amp;B" description="Description 1" url="http://www.somesite.com/stream.asx" />
    <station plus="False" name="Americana" description="Description 2" url="http://www.somesite.com/stream2.asx" />
    <station plus="False" name="Classic Rock" description="Description 3" url="http://www.somesite.com/stream3.asx" />
    <station plus="True" name="Hip-Hop Essentials" description="A paid station" url="http://paid.somesite.com/paidstream.asx" />
  </FeaturedStations>
</response>

The XML will contain a list of up to 4 stations, including the station's name, the description (which appears at the bottom of the Music page), the stream URL to tune in to, and a boolean value marking if the station is a "Plus" (MSN Radio Plus subscription) station. The MSN TV Music page can display up to 3 or 4 radio stations at once, and any extra stations specified in the XML will simply not appear on the Music page.

The XML will also contain a metadata node with an isPlusUser attribute, which is a boolean value that tells the MSN TV 2 if the MSN TV user currently logged in is subscribed to MSN Radio Plus. It is currently unknown how home::radioplus is able to fetch this information (or if it is relevant) as the Music page JavaScript does not send authentication details by itself. If a station's plus attribute is True and isPlusUser is not also set to true, then the station's links will be set to an upsell page at the home::radioplus service's URL when rendered on the Music page ([home::radioplus URL]?page=upsell).

Video home page

The Video feed on the offline MSN TV Video page is also retrieved from the home::backendproxy service using this query string: ?contentType=userPlaylist&mid=Apollo&ds=64&feature=videohomepage_msnv1&time=HH:MM. The time parameter is the time that the request to the service was sent, and is zero-padded.

The data this service would respond with is a JavaScript document defining several arrays storing different types of data for each MSN Video to be shown in the feed, which is a format shared with another JavaScript file used by the MSN TV Video service hosted on the Anduril servers:

var g_scGuids = new Array();
var g_scPGs = new Array();
var g_scPSs = new Array();
var g_scIDs = new Array();
var g_scVideoUrls = new Array();
var g_scHeadlines = new Array();
var g_scCaptions = new Array();
var g_scImageUrls = new Array();
var g_scSources = new Array();
var g_scRelatedLinkUrls = new Array();
var g_scRelatedLinkText = new Array();
g_scGuids[0] = "32b42302-3a55-4296-9803-87b507f67439";
g_scPGs[0] = "MSVEN1";
g_scPSs[0] = "70362";
g_scIDs[0] = "2206589172";
g_scVideoUrls[0] = "http://content3.catalog.video.msn.com/e2/ds/50156d8a-94d4-4750-b975-e01cbe23211a.mp4";
g_scHeadlines[0] = "Bathtime for Baby Pugs";
g_scCaptions[0] = "This mama Pug gives her newborn puppies a nice bath!";
g_scImageUrls[0] = "http://img1.catalog.video.msn.com/image.aspx?uuid=32b42302-3a55-4296-9803-87b507f67439&amp;w=136&amp;h=102";
g_scSources[0] = "Animal Planet";
g_scRelatedLinkUrls[0] = new Array();
g_scRelatedLinkText[0] = new Array();
g_scGuids[1] = "7cd7c1ad-ca39-4c21-90e3-35c7aff46759";
g_scPGs[1] = "MSVSPO";
g_scPSs[1] = "70362";
g_scIDs[1] = "5_cbk_120324_kentucky";
g_scVideoUrls[1] = "http://content5.catalog.video.msn.com/e2/ds/f78ed3ed-4a2a-48f4-a8a1-23bb551ffa51.mp4";
g_scHeadlines[1] = "Wildcats ready to run";
g_scCaptions[1] = "John Calipari talks about preparing his players for their matchup with Baylor.";
g_scImageUrls[1] = "http://img4.catalog.video.msn.com/image.aspx?uuid=7cd7c1ad-ca39-4c21-90e3-35c7aff46759&amp;w=136&amp;h=102";
g_scSources[1] = "Fox_College BK News";
g_scRelatedLinkUrls[1] = new Array();
g_scRelatedLinkText[1] = new Array();
g_scGuids[2] = "37f6e7cc-7f7e-4f79-828d-05bcacaad8b9";
g_scPGs[2] = "MSVEN1";
g_scPSs[2] = "70362";
g_scIDs[2] = "2213033802";
g_scVideoUrls[2] = "http://content5.catalog.video.msn.com/e2/ds/894bf5b4-8490-4397-927d-30b37be05147.mp4";
g_scHeadlines[2] = "Burmese Kittens Practice Climbing";
g_scCaptions[2] = "The Burmese kittens learn how to climb after mama shows them the ropes.";
g_scImageUrls[2] = "http://img5.catalog.video.msn.com/image.aspx?uuid=37f6e7cc-7f7e-4f79-828d-05bcacaad8b9&amp;w=136&amp;h=102";
g_scSources[2] = "Animal Planet";
g_scRelatedLinkUrls[2] = new Array();
g_scRelatedLinkText[2] = new Array();
g_scGuids[3] = "64a684ed-3d3d-a2f0-9ef7-877be9f701be";
g_scPGs[3] = "MSVIWW";
g_scPSs[3] = "70362";
g_scIDs[3] = "64a684ed-3d3d-a2f0-9ef7-877be9f701be";
g_scVideoUrls[3] = "http://content5.catalog.video.msn.com/e2/ds/df3f5570-6ff3-4444-9aa4-b5bb53936f1d.mp4";
g_scHeadlines[3] = "Exclusive: Survival Skills From 'The Hunger Games' Cast";
g_scCaptions[3] = "Jennifer Lawrence, Liam Hemsworth and the cast of \"The Hunger Games\" chat survival skills and more with Wonderwall's Briana Lane.";
g_scImageUrls[3] = "http://img1.catalog.video.msn.com/image.aspx?uuid=64a684ed-3d3d-a2f0-9ef7-877be9f701be&amp;w=136&amp;h=102";
g_scSources[3] = "Celebrity_News";
g_scRelatedLinkUrls[3] = new Array();
g_scRelatedLinkText[3] = new Array();

This data is then used to build a slideshow of video links that are then shown on the Video page.

Clone this wiki locally