0

Framechannel replacement



As many already know, Framechannel is going out of business. There seems to be a dearth of free public MRSS feeds out there. At my non-profit college we had been using Framechannel to aggregate campus messages and content such as weather and news headlines. We're now looking for a replacement service. We can publish our own local content to our own server, but we're having trouble finding a good source of free news headlines and weather graphics. We can use plain text RSS feeds, but the display is very crude. I'm curious to know if others are in the same boat and what alternative solutions are being considered. Thanks. MK

20 comments

  • 0
    Avatar
    RokuLyndon



    For weather, I know there's a page that does weather stickers. These aren't as large and varied as what you would see with framechannel, but I believe they are free.

    http://www.wunderground.com/stickers/?query=zmw:94306.1.99999

    THere are other mrss services that aren't free like feedyourscreen.com.

  • 0
    Avatar
    Mkeen


    Hi RokuLyndon,

    Thanks for the link.  I don't see anything there that would be an MRSS feed.  It looks like their "stickers" are gif images.  Using Bright Author I know how to publish static images from my local PC to my local web server that the players retrieve content from.  Do you have an example of how I can modify the scripts to grab a gif from a remote server such as the wunderground.com server?

    I've been looking at commercial sites like feedyourscreen.com, signchannel.com, and feedsyndicate.com.  So far, the pricing is beyond our budget.  One would think that providers like Weather Channel and New York Times would be falling over themselves to get their logos popping up for free on college campus screens.

    M Keen
  • 0
    Avatar
    Mkeen


    For those following this thread, a possible open-source replacement for Framechannel is in development at http://www.framealbum.com/.  It is not immediately clear if content such as news and weather feeds will be part of the offering, but it's certain to be a valuable resource.

    I hope this is helpful.

    M Keen
  • 0
    Avatar
    Bsanderson


    We used the US Gov Weather service rss feed and have a php process that makes a weather image (using a city local background image and Imagemagic places the 3 day outlook on the  image).  We then pull this image from our own rss feed.  We did this since we to found all the pay for weather feeds were well over our budget.
  • 0
    Avatar
    Ben Slocum


    Bill,
    That's a GREAT solution!  Any chance you'd be willing to share the php code to make that happen?  I (and I'm sure others) would really appreciate it.
    Ben Slocum
  • 0
    Avatar
    Bsanderson



    the weather image is a 3 part process
    you will need

    1. php executable access
    2 imagemagick install on your web server to get this to work.  sorry I cannot help you with php or imagicmagick install issues.  
    3.  a image to use as background to have image magick past the weather text onto.

    this process output your supplied background image with text written over it. New image with 3 weather update on the image  

    print city mine upper left corner

    Palm Spring CA

    This after noon high 107 F low 76 F
    Clear
    _______________________________________
    Saturday  High 108  F  low 75F
    Clear
    _______________________________________
    Sunday High 109 F  low  78F

    It very basic but give me what I want.  I could make it more elabarte by adding more icon data but the text get the message across.

    Scripts
    1. the script that generates the image on your hosting web server get weather from weather.gov based on location you input
    2. the rss feed xml to call the image
    3. the php in the xml to call the image

    use are your own risk.  I cannot answer question about this code php code or imagemacik or how to get this to run on your web site  sorry ....
    just do not have the time.....

    part 1 script to pull weather data, parses the data and uses imagemagick to write the data over the background image you supply for the city.
    note you can change the text size color location font with in imagemagick if you check their call apis.

    <?php
    {

    $ver = phpversion();

    if ( $ver < 5 )
    {
    print "Php version is $ver, you must be running php Version 5 or greater\r\n";
    exit;
    }

    $ampm = date('G');

    $idx = ( $ampm <= 12 ) ? 0 : 1;


    $pvc = array(
    '/baseptownbeachweather.jpg',
    '/baseptownweatherporch960x540.jpg'
    );
    $psp = array(
    '/basepalmspringscityhallweather.jpg',
    '/basepalmspringsweatherhottub.jpg'
    );

    // Palm Springs (PSP)
    FormatWeather(
    -116.5,
    33.83333,
    $psp[$idx],
    '/palmspringsweather.png' );

    // P-Town (PVC)
    FormatWeather(
    -70.18690,
    42.05260,
    $pvc[$idx],
    '/provincetownweather.png' );


    }

    function
    FormatWeather( $_lon, $_lat, $_background, $_output )
    {

    $noaa = "http://forecast.weather.gov/MapClick.php?lat=${_lat}&lon=${_lon}&FcstType=xml";

    $xmlContents = file_get_contents($noaa);

    $xmlParser = xml_parser_create();

    xml_parser_set_option($xmlParser, XML_OPTION_TARGET_ENCODING, 'UTF-8');
    xml_parser_set_option($xmlParser, XML_OPTION_CASE_FOLDING, 0);
    xml_parser_set_option($xmlParser, XML_OPTION_SKIP_WHITE, 1);
    xml_parse_into_struct($xmlParser, trim($xmlContents), $xmlValues);
    xml_parser_free($xmlParser);
    if (!$xmlValues)
    exit;

    $xmlArray = array();
    $last_tag_ar =& $xmlArray;
    $xmlParents = array();
    $last_counter_in_tag = array(1=>0);
    foreach ($xmlValues as $data)
    {
    switch($data['type'])
    {
    case 'open':
    $last_counter_in_tag[$data['level']+1] = 0;
    $new_tag = array('name' => $data['tag']);
    if(isset($data['attributes']))
    $new_tag['attributes'] = $data['attributes'];
    if(isset($data['value']) && trim($data['value']))
    $new_tag['value'] = trim($data['value']);
    $last_tag_ar[$last_counter_in_tag[$data['level']]] = $new_tag;
    $xmlParents[$data['level']] =& $last_tag_ar;
    $last_tag_ar =& $last_tag_ar[$last_counter_in_tag[$data['level']]++];
    break;
    case 'complete':
    $new_tag = array('name' => $data['tag']);
    if(isset($data['attributes']))
    $new_tag['attributes'] = $data['attributes'];
    if(isset($data['value']) && trim($data['value']))
    $new_tag['value'] = trim($data['value']);

    $last_count = count($last_tag_ar)-1;
    $last_tag_ar[$last_counter_in_tag[$data['level']]++] = $new_tag;
    break;
    case 'close':
    $last_tag_ar =& $xmlParents[$data['level']];
    break;
    default:
    break;
    };
    }

    // print_r ( $xmlArray );

    // We only expect 1 forcast in this file
    $forcast = $xmlArray[0];

    $attr = $forcast['attributes'];
    $loc = strtok ($attr['location'], ',' );
    //print "\n\n\n$loc \n";

    $end = false;
    $row = 0;
    $today = array();
    $today['H'] = $today['L'] = ' ~~';
    $today['valid'] = '';

    foreach( $forcast AS $line => $ldata )
    {
    if ( is_array( $ldata ) && isset( $ldata['name']  ) && $ldata['name'] == 'period' )
    {
    $cnt = 0;
    //print_r ( $ldata );
    $period = Array();
    foreach( $ldata AS $name => $ndata ) // For Each element in the Period array
    {
    $key = $ndata['name'];
    if ( is_array( $ndata ) )
    {
    $period[$key] = $ndata['value'];
    if ( isset( $ndata['attributes'] ) )
    {
    foreach( $ndata['attributes'] AS $aname => $avalue )
    {
    $period[$aname] = $ndata['attributes'][$aname];
    }
    }
    }
    }

    //print_r ($period);


    $hilo = $period['hilo'];
    //print "$hilo - $ndata[value] ";
    $today[$hilo] = $period['temp'];
    $today[$hilo] = str_pad($today[$hilo], 3, " ", STR_PAD_LEFT);
    if ($hilo == 'L' )
    $end = true;

    if ( $today['valid'] == '' )
    $today['valid'] = $period['valid'];

    $today['weather'] = $period['weather'];

    $cnt++;


    //print "\n====================\nEnd of period end=$end\n";
    //print_r ( $today );
    //print "--------------------\n";
    if ( $end )
    {
    $allweek[$row++] = $today;

    // if ( isset( $today['H']) && isset( $today['L'] ) )
    // print "$today[valid] - $today[weather] - High] - Low: $today[L] \n";
    // else if ( isset( $today['H'] ) )
    // print "$today[valid] - $today[weather] - High] - Low: ~~ \n";
    // else if ( isset( $today['L'] ) )
    // print "$today[valid] - $today[weather] - High: ~~ - Low: $today[L] \n";

    $today = array();
    $today['H'] = $today['L'] = ' ~~';
    $today['valid'] = '';
    $end = 0;
    }

    }
    }

    //print_r( $allweek );

    $image = new Imagick();
    $draw  = new ImagickDraw();
    // $pixel = new ImagickPixel( "rgb(0,64,128)" );
    $pixel = new ImagickPixel( "SkyBlue" );

    $image->readImage( $_background );
    $image->scaleImage( 960, 540 );

    /* New image */
    //$image->newImage(960, 540, $pixel);

    $draw->setFont('Helvetica-Bold');
    // $draw->setFont('Luxi-Mono-Bold');
    $draw->setFontSize( 44 );
    $draw->setStrokeColor("Black");
    $draw->setStrokeWidth(1);
    // $draw->setFillColor( "rgb(64,129,192)" );
    $draw->setFillColor( "MediumSlateBlue" );
    $draw->setFillOpacity( 0.55 );

    $image->annotateImage($draw, 0, 40, 0, $loc );


    $draw->setFillColor( "White" );

    $draw->setFontSize( 22 );
    $draw->setFillOpacity( 1.0 );
    $image->annotateImage($draw, 595, 40, 0, "High" );
    $image->annotateImage($draw, 795, 40, 0, "Low" );
    $image->annotateImage($draw, 730, 50, 0, "F" );
    $image->annotateImage($draw, 930, 50, 0, "F" );

    for( $i = 0; $i < 3; $i++ )
    {
    $draw->setFontSize( 52 );
    $draw->setStrokeColor("Black");
    $draw->setStrokeWidth(1);
    $draw->setFillOpacity( 1.0 );
    $image->annotateImage($draw, 10, (165 + ( $i * 180)), 0, $allweek[$i]['weather'] );
    $draw->setFontSize( 66 );
    $draw->setFillOpacity( 0.40 );
    $image->annotateImage($draw, 10, (110 + ( $i * 180)), 0, $allweek[$i]['valid'] );

    $draw->setFontSize( 95 );
    $draw->setFillOpacity( 1.0 );
    //$draw->setFont('miscfixed');
    $image->annotateImage($draw, 570, (120 + ( $i * 180)), 0, $allweek[$i]['H'] );
    $image->annotateImage($draw, 775, (120 + ( $i * 180)), 0, $allweek[$i]['L'] );
    //$draw->setFont('Helvetica-Bold');

    }


    $draw->clear();
    $draw->setFillColor( "White" );
    $draw->setFillOpacity( 0.25 );
    $line1 = array( array( 'x' => 0, 'y' => 178 ), array( 'x' => 960, 'y' => 178 ),
    array( 'x' => 0, 'y' => 179 ), array( 'x' => 960, 'y' => 179 ),
    array( 'x' => 0, 'y' => 180 ), array( 'x' => 960, 'y' => 180 ),
    array( 'x' => 0, 'y' => 181 ), array( 'x' => 960, 'y' => 181 ),
    ) ;
    $draw->polyLine( $line1 );

    $line2 = array( array( 'x' => 0, 'y' => 358 ), array( 'x' => 960, 'y' => 358 ),
    array( 'x' => 0, 'y' => 359 ), array( 'x' => 960, 'y' => 359 ),
    array( 'x' => 0, 'y' => 360 ), array( 'x' => 960, 'y' => 360 ),
    array( 'x' => 0, 'y' => 361 ), array( 'x' => 960, 'y' => 361 ),
    ) ;
    $draw->polyLine( $line2 );
    $image->drawImage( $draw );

    $draw->clear();
    $draw->setFont('Helvetica-Bold');
    $draw->setFillColor( "White" );

    $draw->setFillOpacity( 0.75 );
    $draw->setFontSize( 12 );
    $image->annotateImage($draw, 800, 15, 0, date('D, M j Y H:i:s') );

    $image->setImageFormat('png');
    //      print "after format";

    $image->posterizeImage(22,FALSE);

    $image->stripImage();
    //      $image->setCompression(Imagick::COMPRESSION_JPEG);
    //      $image->setCompressionQuality(10);
    $image->writeImage( $_output );
    //      print "after write iamge";
    $image->clear();
    //      print "after clear";
    $image->destroy();
    //      print"after destroy";

    // $image->setImageFormat('jpg');
    // $image->setCompression(Imagick::COMPRESSION_JPEG);
    // $image->setCompressionQuality(50);

    // $image->writeImage("/palmspringsweather.jpg");

    }
    ?>

    part 2  xml that BS box call to get weather RSS

    <?xml version="1.0" encoding="UTF-8"?>
    <rss xmlns:media="http://search.yahoo.com/mrss/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
       <channel>
           <title>Weather for Palm Springs</title>
           <description>Palm Springs, CA. Weather</description>
           <link>http://xxx.yourdomainhere.com</link>
           <lastBuildDate>Mon, 31 Jan 2011 10:04:44 -0800</lastBuildDate>
           <pubDate>Mon, 31 Jan 2011 10:04:36 -0800</pubDate>
           <ttl>2</ttl>
           <generator>FeedForAll Mac v2.1 (2.1.0.1) unlicensed version; http://www.FeedForAll.com/">http://www.FeedForAll.com/</generator>
           <atom:link href="http://www.yourdomainhere.com/xyzweathersw.xml" rel="self" type="application/rss+xml"/>
           <item>
               <title>3-Day Forecast</title>
               <description>&lt;img src=&quot;http://www.yourdomainhere.com/xyzweathersw.php&quot;&gt;</description>
               <link>http://www.yourdomainhere.com/xyzwaethersw.php</link>
               <category>3-Day Forecast</category>
               <guid isPermaLink="false"><?php print date("U"); ?></guid>
               <pubDate>Mon, 31 Jan 2011 10:04:36 -0800</pubDate>
               <media:content url="http://www.yourdomainhere.com/xyzweatjersw.php" type="image/png" duration="30" height="540" width="960" />
           </item>

       </channel>
    </rss>
    <?php
     ?>


    part 3  php code within xml rss feed to pull image via rss BS call.  We did this since BS seem not to like calling the image directly. and we have logging process the monitors
    the rss call so we know when the BS box is not working I get a text on my mobile.  This code is not in the demo since you can add that yourself.  

    <?PHP

    $filename = 'palmspringsweather.png';


    Header ( "Content-Type: image/png" ) ;

    Header( "Cache-Control: max-age=900" );
    Header ( "Expires:  " .  gmdate("D, d M Y H:i:s",  mktime()+900 ) . " GMT");

    //Header( "Content-Disposition: filename=\"$filename\"") ;

    $fs =  filesize( $filename );
    Header( "Content-Length: $fs" );

    //        print "<HTML><BODY>Hello World".date("r") ;
    //        print "<BR>$filename " ;

    // print $fs;

    print file_get_contents( $filename );

    //   include '../../php/std_vars.c';
    //   include '../../php/checkin.c';  this write a notice to our database for this BS unit check in.  so i can monitor the boxes.  If you not using web update online and using BS network
    //this is not something you would need.

    /*
    $fh = fopen( "./test.log", "a+" );

    fwrite( $fh, "\n\nTest start --------------\n" . Date('r') . "\n" );

    fwrite ( $fh, "Last-Modified:  " . date ("r", filemtime($filename))  . "\n" );

    fwrite ( $fh, "=====>>>>> _REQUEST\n" );
    foreach ( $_REQUEST as $k => $v )
    fwrite( $fh, "[$k]=($v)\n" );

    fwrite ( $fh, "=====>>>>> _SERVER\n" );
    foreach ( $_SERVER as $k => $v )
    fwrite( $fh, "[$k]=($v)\n" );

    //fwrite ( $fh, "=====>>>>> _APACHE\n" );
    //$_APACHE = apache_request_headers ();
    //foreach ( $_APACHE as $k => $v )
    // fwrite( $fh, "[$k]=($v)\n" );

    fwrite ( $fh, "=====>>>>> GLOBALS\n" );
    foreach ( $GLOBALS as $k => $v )
     {
     fwrite( $fh, "[$k]=($v)\n" );
       if ( is_array( $v ) )
       {
       foreach ( $v as $k2 => $v2 )
         fwrite( $fh, "  => [$k2]=($v2)\n" );
       }
     }

    fclose( $fh );

    */

    ?>

  • 0
    Avatar
    Mkeen


    Bill,
    Thanks so much for sharing your code.  I'm going to give it a try.

    Michael Keen
    Southern Vermont College
  • 0
    Avatar
    StreamingMeeMee


    FrameAlbum, a soon-to-be open-source replacement for FrameChannel is open for pre-registration at http://www.framealbum.com.

    My first priority is supporting Flickr and Picasa feeds.  I do hope to add weather, news headlines, etc. as time (and content providers) permit.

    I don't have a Roku box myself so if someone is willing to be an early tester AND is capable of manipulating their DNS server (to redirect the hardwired framechannel.com URLs) PLEASE contact me!

    You can follow the progress, as well as join the development conversation, on my blog, http://www.streamingmeemee.com.
  • 0
    Avatar
    Mkeen


    Streamingmeemee,  I'm happy and anxious to help with the development of Framealbum on the Roku Brightsign platform.  I do have full DNS control, but I don't think it's necessary for Brightsign players because they are not hard-coded to point to a particular MRSS URL.  Brightsign players are normally programmed with BrightAuthor software which allows you to specify any URL for your MRSS feed.  BrightAuthor software can be downloaded for free at http://brightsign.zendesk.com/entries/314637-brightsign-downloads.

    Please note that Brightsign players are specialty units meant for the digital signage market.  They are quite different from consumer Roku boxes which are most often used to stream video content from Netflix, Amazon, Hulu, etc.  Framechannel was one of the channels available on consumer Roku boxes, but this forum does not address those boxes.  You might want to contact one of the moderators of this site (at the appropriate time) to see about having the FrameAlbum channel added to the channel lineup of consumer Roku boxes.  Meanwhile I think readers of this thread will be very anxious to help get FrameAlbum working with Brightsign units.

    Keep up the good work.

    Michael Keen
    Southern Vermont College
  • 0
    Avatar
    StreamingMeeMee


    Michael,

    Thanks for your reply.

    FrameAlbum does offer a custom MRSS feed URL as well as the standard FrameChannel response.  This feature is intended for those folks with photo frames but lack the DNS skills (or access to a DNS server) to redirect the hard-coded FrameChannel URLs to the FrameAlbum service.

    I do realize that Bightsign players are targeted at digital signage and that you may have specific requirements that are distinct from a consumer device.  The obvious thing that comes to mind is screen resolution.  My initial targets are 800x480 and 800x600 but the software can handle others.  Is there a resolution that is common among BS displays?

    In the meantime -- head on over to framealbum.com and pre-register.  I'll be opening up the service for testers as early as this weekend.  Flickr feeds will be supported out of the gate with Picasa not far behind.

    T.
  • 0
    Avatar
    Mkeen


    T.,

    I"m already pre-registered on your site.  Looking forward to playing with it.

    I'm guessing most Brightsign users would be looking for higher resolution than 600x800.  Brightsign players feature both VGA and HDMI outputs.  According to the web site, they support the following resolutions:

    1080p, 1080i, 720p, 576p, 480p, 1360x768, and 1024 x 768

    Hope this helps.

    Michael Keen
    Southern Vermont College
  • 0
    Avatar
    Scott Higdon



    In regards to the resolution, the images produced by Framechannel were somewhat small (800x480) but appeared very nice on the screen and were suitable for our use on commercial screens.

    Here are a few links:

    directly to the JPG
    http://images.framechannel.com/feeds/weather3day.php/weatherCode=22980/languageId=1/resolutionId=4/10868.jpg


    to the feed.

    http://rss.framechannel.com/user=marketplaceweather/pin=8603

    It appears framechannel is still updating the links - even though the site says it will stop on 15 July.

    Thanks,
    Scott

  • 0
    Avatar
    kirgy


    Theres a short tutorial on this website of how to very simply add a facebook album to stream to your frame. I done it with mine, it took a couple minutes. http://kirgy.co.uk/?p=302
  • 0
    Avatar
    Scott Higdon



    hello all, I have been scouring the web and found this site that appears to be a clear replacement for FrameChannel. I am still testing it, but wanted you all to know.

    http://lifegoround.com


    They allow media RSS feeds and walk you through the easy set up. They have about 75 choices for media feeds including news.

    Thanks
    Scott

  • 0
    Avatar
    truepusk


    I'm not sure if I'm missing something big or if lifegoround.com has scaled back their support since  higdonc made his/her original post.  I don't see 75 choices for media RSS, or the easy walk through.  Also, my public RSS feed link doesn't seem to work.  When I click the 'my rss feed' link I get the message 'We're sorry but that page could not be found.'  I'll try some other browsers just to make sure it isn't a browser issue.

    Had anyone  had luck with this website/service and the brightsign?  I haven't even started trying to use it with the brightsign since I don't see to have any working URLs to point it to.
  • 0
    Avatar
    truepusk


    Oh, and their email verifications are not going out, at least not in a timely manner.  I suspect they have part of their system down right now.
  • 0
    Avatar
    Scott Higdon


    Correct, they turned out to be a lot of hard work and frustration for me.

    I am hoping to figure out how to set up a media RSS feed where I can just upload pics to a folder on Flickr or Picasa and those images then are pulled into the display. Then I do not have to use brightauthor, add images, save, publish, FTP to web site, etc - rather, just drop them into a folder.

    Any pointers are appreciated.

    Thanks
    Scott
  • 0
    Avatar
    Alex Muñoz Basols

    Hello:

     

    Any updates about mrss for brighauthor?

    Best Regards

  • 0
    Avatar
    Alex
  • 0
    Avatar
    Alex Muñoz Basols

    Hello i forgot to mention mrss for td1012 best regards

Please sign in to leave a comment.