Roku Developer Program

Join our online forum to talk to Roku developers and fellow channel creators. Ask questions, share tips with the community, and find helpful resources.
cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 
el_wubo
Visitor

Re: My Media - Your Music and Video on the Roku DVP

Wow. There has been a lot of great discussion recently. It's cool to see this much interest in the future of the channel.

My quick thoughts:

  • Web based configuration / private channel installation - Yes, I agree with virtually everything you suggested and I think this is a good way forward for the channel. It's a ways out but I am thinking and working in this direction.

  • Remote Streams / My Streams - Partially implemented (mp3 sources only). This feature becomes useful for me when I can paste in internet radio station's playlist files and youtube video links. Both are possible but require some work.

  • Refresh - Looks like renojim is tackling this already. There's an engineering tradeoff between keeping the channel responsive and keeping the currently open folder synchronized to-the-second. I think we should err on the side of responsiveness.

  • Serverless Operation - To the best of my knowledge this is technically impossible unless Roku makes it so. We simply do not have low level enough access to the network hardware to implement windows file-sharing.

  • Windows Filesystem Integration (instead of link pasting) - I'll focus on making the server handle different types remote streams and the web interface method of submitting them to the server. Someone else the necessary knowledge and motivation can work on the plugin to make Windows File Explorer submit streams to the server. I'll welcome the contribution.


I've started a google spreadsheet and a form for making feature suggestions. This is to help me and the other developers keep our heads around what's been suggested. Even if I've listed your feature above please fill out the form so that you can rank your feature and let us know why you think it will be broadly useful.
0 Kudos
gadgit
Visitor

Re: My Media - Your Music and Video on the Roku DVP

I worked through a script the past week or so to run through a directory containing .avi files and convert them to a file type appropriate for playing on the roku. I seem to have finally worked through all the kinks, but YMMV with this script. I found that using the "Normal" preset gave me the best results, as some of the other presets passed through a couple of audio streams which at times seemed cause video to play, but not the audio. Hope this helps someone. i plan on updating it a bit, but in it's most essential form, this was created on Ubuntu, so some things may need tweaking depending upon your system...Otherwise, you should only need HandBrakeCLI installed.

#!/bin/bash

FILES="*.avi"
BIN=/usr/bin/HandBrakeCLI

for f in $FILES
do
OUTFILE=`basename $f avi`mp4
echo "INPUT: $f"
echo "OUTPUT: $OUTFILE"
$BIN -i "$f" -o "$OUTFILE" --preset="Normal"
done


Caveat:
Your filenames can NOT contain any spaces, as this throws basename off, I am going to fix this at some point, but my files don't normally have spaces

Edit: Wanted to thank all the devs for their hard work on this project, as it has been a breeze to set up
0 Kudos
renojim
Community Streaming Expert

Re: My Media - Your Music and Video on the Roku DVP

I'm certainly no expert on HandBrake, but I do have a little experience. I don't think the "--preset=Normal" is strictly necessary since it will be used if no other preset is specified. I would add two additional parameters:
-O (or --optimize): "Optimize mp4 files for HTTP streaming", I believe it puts the meta-data at the beginning of the file; I don't know if it's absolutely necessary, but I think it's a good thing to use; and,
-r 29.97: sets the frame rate to 29.97 fps; this one is very important. Since I've been using this I haven't had the buffering issue an hour into the video.

-JT
Roku Community Streaming Expert

Help others find this answer and click "Accept as Solution."
If you appreciate my answer, maybe give me a Kudo.

I am not a Roku employee.
0 Kudos
dellsweig
Visitor

Re: My Media - Your Music and Video on the Roku DVP

"renojim" wrote:
el.wubo started work on it before he left for vacation. You can find it here. I don't think it would be something I'd use, so I'd be interested in hearing/seeing what sort of links you're thinking of adding. Maybe I'm missing something.

Usage note: Once you've installed the localClient version, go to http://localhost:8001/ and click on "Personal Links" to add a link. You'll see a new "Server Playlist" on the main channel screen. Keep in mind this is a very early preview version.
-JT


Greetings

I loaded up this test build last night.

As a stream source I am using the Sirus/XM streamer program to stream my XM channels. I currently stream these to my Roku Soundbridge.

I added a stream url (same one used for the soundbridge). The stream url displays on the MyStreams folder. When I click on the stream - nothing plays.\

I tried two different formats for the stream but nothing plays. Here is the output from the my_media_Log file:

DEBUG:root:serving request for ..\client\images/music_square.jpg
DEBUG:root:guessing mimetype of image/jpeg for ..\client\images/music_square.jpg. filesize is 34661
DEBUG:root:serving request for ..\client\images/photos_square.jpg
DEBUG:root:Scaling the image to (720, 480)
DEBUG:root:guessing mimetype of image/jpeg for ..\client\images/photos_square.jpg. filesize is 34547
DEBUG:root:Scaling the image to (720, 480)
DEBUG:root:serving request for ..\client\images/videos_square.jpg
DEBUG:root:guessing mimetype of image/jpeg for ..\client\images/videos_square.jpg. filesize is 38850
DEBUG:root:Scaling the image to (720, 480)
DEBUG:root:got arguments: <Storage {'song': [u'http://192.168.1.98:51710/xm?channel=57&format=m3u']}>
DEBUG:root:got arguments: <Storage {'song': [u'http://192.168.1.98:51710/xm?channel=57&format=asx']}>

Not too much useful information in there except that the UI may be putting the character "u" in front of the "http"

Here is the content of the dynamic.m3u file = note the "u" is not in there



http://192.168.1.98:51710/xm?channel=57&format=asx

Let me know what you want me to try

Dan
Going where the wind don't blow so strange
0 Kudos
el_wubo
Visitor

Re: My Media - Your Music and Video on the Roku DVP

"dellsweig" wrote:

Let me know what you want me to try

Dan


It looks like this feature isn't quite ready for how you had intended to use it. If you give it a direct link to a remote mp3 file it should play it. You're giving it a link to a remote playlist. Right now the remote-url feature doesn't know how to handle anything but mp3's (and just assumes everything it's given is an mp3.)

This isn't the long term solution but you can download the http://192.168.1.98:51710/xm?channel=57&format=m3u url and open the resulting playlist file in a text editor to find the embedded mp3 file(s) link. Then you can paste that url into the web interface and everything should work.

BTW, the u'blah' format just means that the word 'blah' is being represented internally as unicode. This is a handy thing to know when we're debugging special character problems.
0 Kudos
dellsweig
Visitor

Re: My Media - Your Music and Video on the Roku DVP

"el.wubo" wrote:
"dellsweig" wrote:

Let me know what you want me to try

Dan


It looks like this feature isn't quite ready for how you had intended to use it. If you give it a direct link to a remote mp3 file it should play it. You're giving it a link to a remote playlist. Right now the remote-url feature doesn't know how to handle anything but mp3's (and just assumes everything it's given is an mp3.)

This isn't the long term solution but you can download the http://192.168.1.98:51710/xm?channel=57&format=m3u url and open the resulting playlist file in a text editor to find the embedded mp3 file(s) link. Then you can paste that url into the web interface and everything should work.

BTW, the u'blah' format just means that the word 'blah' is being represented internally as unicode. This is a handy thing to know when we're debugging special character problems.



Thanks - I will try to parse out the mp3 when I get home..

I see use for this when using some of the various streaming servers out there. I will use this for the XM/Sirus streamer and for some TVersity feeds I have been playing with. There have also been some live streaming events I might be interested in as well as grabbing the NASA streams on launch days.

I am always available to test anything youre working on!!!!


Dan


edit: Not sure how to get the "playlist" as it appears to be constructed inside the server - no idea where it "saves" it
Going where the wind don't blow so strange
0 Kudos
dellsweig
Visitor

Re: My Media - Your Music and Video on the Roku DVP

"dellsweig" wrote:
"el.wubo" wrote:
"dellsweig" wrote:

Let me know what you want me to try

Dan


It looks like this feature isn't quite ready for how you had intended to use it. If you give it a direct link to a remote mp3 file it should play it. You're giving it a link to a remote playlist. Right now the remote-url feature doesn't know how to handle anything but mp3's (and just assumes everything it's given is an mp3.)

This isn't the long term solution but you can download the http://192.168.1.98:51710/xm?channel=57&format=m3u url and open the resulting playlist file in a text editor to find the embedded mp3 file(s) link. Then you can paste that url into the web interface and everything should work.

BTW, the u'blah' format just means that the word 'blah' is being represented internally as unicode. This is a handy thing to know when we're debugging special character problems.



Thanks - I will try to parse out the mp3 when I get home..

I see use for this when using some of the various streaming servers out there. I will use this for the XM/Sirus streamer and for some TVersity feeds I have been playing with. There have also been some live streaming events I might be interested in as well as grabbing the NASA streams on launch days.

I am always available to test anything youre working on!!!!


Dan


edit: Not sure how to get the "playlist" as it appears to be constructed inside the server - no idea where it "saves" it



I tried opening the link contained in the container - both the asx version and the m3u version. I am unable to open the link in my browser - various errors but this stream plays fine on my Roku Soundbridge and I had it playing on the Roku at one time playing with the sample client audioplayer code....
Going where the wind don't blow so strange
0 Kudos
umbighouse
Visitor

Re: My Media - Your Music and Video on the Roku DVP

I can't tell you how much BETTER I like the Play All/Shuffle All options in My Music. Awesome.
So I guess new graphics are needed for these 2 items, as well as Server Playlist? I'll get started on that...


A question about the server playlist- when I click on it on the Roku/TV screen, I get a server not available error. On the web interface, I get the following output:
(do I need to config something else?)


<type 'exceptions.IOError'> at /remotes
(2, 'No such file or directory')
Python C:\roku_media_player\server\rss_server.py in pl2songs, line 522
Web GET http://192.168.1.220:8001/remotes
Traceback (innermost first)

* C:\roku_media_player\server\rss_server.py in pl2songs
515. lastBuildDate=datetime.datetime.now(),
516. items = items,
517. theme = key)
518.
519. return doc
520.
521. def pl2songs(pl):
522. filein = open(pl) ...
523. lines = [ ln.rstrip() for ln in filein if ln[0] != '#' ]
524. filein.close()
525. return lines
526.
527. def getpl(name, key, path, config):
528. "create a media feed document from an m3u playlist"
â–¶ Local vars
Variable Value
pl
'dynamic.m3u'
* C:\roku_media_player\server\rss_server.py in remotepl2doc
550.
551. return doc
552.
553. def remotepl2doc(name):
554. "convert a playlist with remote urls into a document. music only for now"
555. items = []
556. config = parse_config(config_file)
557. for song in pl2songs(name): ...
558. items.append(RSSImageItem(
559. title=song,
560. link=song,
561. enclosure = Enclosure(
562. url=song,
563. type="audio/mpeg",
â–¶ Local vars
Variable Value
config
<ConfigParser.ConfigParser instance at 0x02D35238>
items
[]
name
'dynamic.m3u'
* C:\roku_media_player\server\rss_server.py in GET
799.
800. return "<b>done</b>";
801.
802. class DynamicPlaylistDoc:
803. def GET(self):
804. "the user created dynamic playlist in rss form"
805. web.header("Content-Type", "application/rss+xml")
806. return remotepl2doc(DYNAMIC_PLAYLIST).to_xml() ...
807.
808. urls = (
809. '/feed', 'RssHandler',
810. '/media', 'MediaHandler',
811. '/m3u', 'M3UHandler',
812. '/', 'IndexHandler',
â–¶ Local vars
Variable Value
self
<rss_server.DynamicPlaylistDoc instance at 0x02D355F8>
* C:\roku_media_player\server\web\application.py in handle_class
379. def handle_class(cls):
380. meth = web.ctx.method
381. if meth == 'HEAD' and not hasattr(cls, meth):
382. meth = 'GET'
383. if not hasattr(cls, meth):
384. raise web.nomethod(cls)
385. tocall = getattr(cls(), meth)
386. return tocall(*args) ...
387.
388. def is_class(o): return isinstance(o, (types.ClassType, type))
389.
390. if f is None:
391. raise web.notfound()
392. elif isinstance(f, application):
â–¶ Local vars
Variable Value
args
[]
cls
<class rss_server.DynamicPlaylistDoc at 0x02BE1930>
meth
u'GET'
tocall
<bound method DynamicPlaylistDoc.GET of <rss_server.DynamicPlaylistDoc instance at 0x02D355F8>>
* C:\roku_media_player\server\web\application.py in _delegate
404. elif '.' in f:
405. x = f.split('.')
406. mod, cls = '.'.join(x[:-1]), x[-1]
407. mod = __import__(mod, globals(), locals(), [""])
408. cls = getattr(mod, cls)
409. else:
410. cls = fvars[f]
411. return handle_class(cls) ...
412. elif hasattr(f, '__call__'):
413. return f()
414. else:
415. return web.notfound()
416.
417. def _match(self, mapping, value):
â–¶ Local vars
Variable Value
args
[]
cls
<class rss_server.DynamicPlaylistDoc at 0x02BE1930>
f
u'DynamicPlaylistDoc'
fvars
{'ALBUM_FID': 'TALB', 'ARTIST_FID': 'TPE1', 'ARTIST_FIDS': ['TPE1', 'TPE2', 'TPE3', 'TPE4', 'TCOM'], 'BAND_FID': 'TPE2', 'BPM_FID': 'TBPM', 'CDID_FID': 'MCDI', 'CDID_FRAME_RX': <_sre.SRE_Pattern object at 0x02B31B60>, 'COMMENT_FID': 'COMM', 'COMMENT_FRAME_RX': <_sre.SRE_Pattern object at 0x02B31AC0>, 'COMPOSER_FID': 'TCOM', 'CONDUCTOR_FID': 'TPE3', 'CONTENT_TITLE_FID': 'TIT1', 'Category': <class PyRSS2Gen.Category at 0x02B971B0>, 'Cloud': <class PyRSS2Gen.Cloud at 0x02B971E0>, 'CommentFrame': <class eyeD3.frames.CommentFrame at 0x02B45C60>, 'ConfigParser': <module 'ConfigParser' from 'c:\python26\lib\ConfigParser.pyc'>, 'DATE_FIDS': ['TDRL', 'TDOR', 'TDRC', 'TYER', 'TDAT'], 'DEFAULT_ENCODING': '\x00', 'DEFAULT_ID3_MAJOR_VERSION': 2, 'DEFAULT_ID3_MINOR_VERSION': 4, 'DEFAULT_LANG': 'eng', 'DISCNUM_FID': 'TPOS', 'DYNAMIC_PLAYLIST': 'dynamic.m3u', 'DateElement': <class PyRSS2Gen.DateElement at 0x02B97180>, 'DateFrame': <class eyeD3.frames.DateFrame at 0x02B45B40>, 'DynamicPlaylist': <class rss_server.DynamicPlaylist at 0x02BE1900>, 'DynamicPlaylistDoc': <class rss_server.DynamicPlaylistDoc at 0x02BE1930>, 'Enclosure': <class PyRSS2Gen.Enclosure at 0x02B972A0>, 'ExtendedTagHeader': <class eyeD3.tag.ExtendedTagHeader at 0x02B87060>, 'FULL_DIM': (720, 480), 'FULL_HD_DIM': (1280, 720), 'FULL_SD_DIM': (720, 480), 'FileHandler': <class eyeD3.utils.FileHandler at 0x02B457E0>, 'FileWalker': <class eyeD3.utils.FileWalker at 0x02B45810>, 'Frame': <class eyeD3.frames.Frame at 0x02B45A80>, 'FrameException': <class 'eyeD3.frames.FrameException'>, 'FrameHeader': <class eyeD3.frames.FrameHeader at 0x02B45A50>, 'FrameSet': <class 'eyeD3.frames.FrameSet'>, 'GB_BYTES': 1073741824, 'GB_UNIT': 'GB', 'GENRE_FID': 'TCON', 'Genre': <class eyeD3.tag.Genre at 0x02B87120>, 'GenreException': <class 'eyeD3.tag.GenreException'>, 'GenreMap': <class 'eyeD3.tag.GenreMap'>, 'Guid': <class PyRSS2Gen.Guid at 0x02B97240>, 'ID3_ANY_VERSION': 48, 'ID3_CURRENT_VERSION': 0, 'ID3_DEFAULT_VERSION': 36, 'ID3_V1': 16, 'ID3_V1_0': 17, 'ID3_V1_1': 18, 'ID3_V1_COMMENT_DESC': 'ID3 v1 Comment', 'ID3_V2': 32, 'ID3_V2_2': 33, 'ID3_V2_3': 34, 'ID3_V2_4': 36, 'IMAGE_FID': 'APIC', 'IMAGE_FRAME_RX': <_sre.SRE_Pattern object at 0x02B31BB0>, 'Image': <class PyRSS2Gen.Image at 0x02B97210>, 'ImageFrame': <class eyeD3.frames.ImageFrame at 0x02B45CC0>, 'IndexHandler': <class rss_server.IndexHandler at 0x02BE18A0>, 'IntElement': <class PyRSS2Gen.IntElement at 0x02B97150>, 'InvalidAudioFormatException': <class 'eyeD3.tag.InvalidAudioFormatException'>, 'KB_BYTES': 1024, 'KB_UNIT': 'KB', 'KNOWN_BAD_FRAMES': ['\x00\x00MP', '\x00MP3', ' MP3', 'MP3e', '\x00MP', ' MP', 'MP3', 'COM ', 'TCP ', 'CM1 '], 'LATIN1_ENCODING': '\x00', 'LOCAL_ENCODING': 'cp1252', 'LYRICS_FID': 'USLT', 'LYRICS_FRAME_RX': <_sre.SRE_Pattern object at 0x02B31B10>, 'LinkedFile': <class eyeD3.tag.LinkedFile at 0x02B87240>, 'LyricsFrame': <class eyeD3.frames.LyricsFrame at 0x02B45C90>, 'M3UHandler': <class rss_server.M3UHandler at 0x02BE1870>, 'MB_BYTES': 1048576, 'MB_UNIT': 'MB', 'MediaHandler': <class rss_server.MediaHandler at 0x02BE1810>, 'Memoize': <class common.Memoize at 0x02B87A80>, 'Mp3AudioFile': <class eyeD3.tag.Mp3AudioFile at 0x02B871E0>, 'MusicCDIdFrame': <class eyeD3.frames.MusicCDIdFrame at 0x02B45E10>, 'NULL_FRAME_FLAGS': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 'OBJECT_FID': 'GEOB', 'OBJECT_FRAME_RX': <_sre.SRE_Pattern object at 0x02B31C00>, 'OBSOLETE_DATE_FID': 'TDAT', 'OBSOLETE_ORIG_RELEASE_FID': 'TORY', 'OBSOLETE_RECORDING_DATE_FID': 'TRDA', 'OBSOLETE_TIME_FID': 'TIME', 'OBSOLETE_YEAR_FID': 'TYER', 'ObjectFrame': <class eyeD3.frames.ObjectFrame at 0x02B45D20>, 'PLAYCOUNT_FID': 'PCNT', 'PLAYCOUNT_FRAME_RX': <_sre.SRE_Pattern object at 0x02B31C50>, 'PUBLISHER_FID': 'TPUB', 'PlayCountFrame': <class eyeD3.frames.PlayCountFrame at 0x02B45D50>, 'PublishMixin': <class rss_server.PublishMixin at 0x02BE1780>, 'REMIXER_FID': 'TPE4', 'RSS2': <class PyRSS2Gen.RSS2 at 0x02B97360>, 'RSSDoc': <class rss_server.RSSDoc at 0x02BE17E0>, 'RSSImageItem': <class rss_server.RSSImageItem at 0x02BE17B0>, 'RSSItem': <class PyRSS2Gen.RSSItem at 0x02B97390>, 'ReadmeTextileHandler': <class rss_server.ReadmeTextileHandler at 0x02BE18D0>, 'RssHandler': <class rss_server.RssHandler at 0x02BE1840>, 'SF_APPEND': 262144, 'SF_ARCHIVED': 65536, 'SF_IMMUTABLE': 131072, 'SF_NOUNLINK': 1048576, 'SF_SNAPSHOT': 2097152, 'STRICT_ID3': 0, 'ST_ATIME': 7, 'ST_CTIME': 9, 'ST_DEV': 2, 'ST_GID': 5, 'ST_INO': 1, 'ST_MODE': 0, 'ST_MTIME': 8, 'ST_NLINK': 3, 'ST_SIZE': 6, 'ST_UID': 4, 'SUBTITLE_FID': 'TIT3', 'S_ENFMT': 1024, 'S_IEXEC': 64, 'S_IFBLK': 24576, 'S_IFCHR': 8192, 'S_IFDIR': 16384, 'S_IFIFO': 4096, 'S_IFLNK': 40960, 'S_IFMT': <function S_IFMT at 0x004D8EF0>, 'S_IFREG': 32768, 'S_IFSOCK': 49152, 'S_IMODE': <function S_IMODE at 0x004D8EB0>, 'S_IREAD': 256, 'S_IRGRP': 32, 'S_IROTH': 4, 'S_IRUSR': 256, 'S_IRWXG': 56, 'S_IRWXO': 7, 'S_IRWXU': 448, 'S_ISBLK': <function S_ISBLK at 0x004D8FB0>, 'S_ISCHR': <function S_ISCHR at 0x004D8F70>, 'S_ISDIR': <function S_ISDIR at 0x004D8F30>, 'S_ISFIFO': <function S_ISFIFO at 0x004FF070>, 'S_ISGID': 1024, 'S_ISLNK': <function S_ISLNK at 0x004FF0B0>, 'S_ISREG': <function S_ISREG at 0x004FF030>, 'S_ISSOCK': <function S_ISSOCK at 0x004FF0F0>, 'S_ISUID': 2048, 'S_ISVTX': 512, 'S_IWGRP': 16, 'S_IWOTH': 2, 'S_IWRITE': 128, 'S_IWUSR': 128, 'S_IXGRP': 8, 'S_IXOTH': 1, 'S_IXUSR': 64, 'SkipDays': <class PyRSS2Gen.SkipDays at 0x02B97330>, 'SkipHours': <class PyRSS2Gen.SkipHours at 0x02B97300>, 'Source': <class PyRSS2Gen.Source at 0x02B972D0>, 'StringIO': <class StringIO.StringIO at 0x02AD0AE0>, 'TAGS2_2_TO_TAGS_2_3_AND_4': {'BUF': 'RBUF', 'CM1': 'CM1 ', 'CNT': 'PCNT', 'COM': 'COMM', 'CRA': 'AENC', 'EQU': 'EQUA', 'ETC': 'ETCO', 'GEO': 'GEOB', 'IPL': 'IPLS', 'LNK': 'LINK', 'MCI': 'MCDI', 'MLL': 'MLLT', 'PIC': 'APIC', 'POP': 'POPM', 'REV': 'RVRB', 'RVA': 'RVAD', 'SLT': 'SYLT', 'STC': 'SYTC', 'TAL': 'TALB', 'TBP': 'TBPM', 'TCM': 'TCOM', 'TCO': 'TCON', 'TCP': 'TCP ', 'TCR': 'TCOP', 'TDA': 'TDAT', 'TDY': 'TDLY', 'TEN': 'TENC', 'TFT': 'TFLT', 'TIM': 'TIME', 'TKE': 'TKEY', 'TLA': 'TLAN', 'TLE': 'TLEN', 'TMT': 'TMED', 'TOA': 'TOPE', 'TOF': 'TOFN', 'TOL': 'TOLY', 'TOR': 'TORY', 'TOT': 'TOAL', 'TP1': 'TPE1', 'TP2': 'TPE2', 'TP3': 'TPE3', 'TP4': 'TPE4', 'TPA': 'TPOS', 'TPB': 'TPUB', 'TRC': 'TSRC', 'TRD': 'TRDA', 'TRK': 'TRCK', 'TSI': 'TSIZ', 'TSS': 'TSSE', 'TT1': 'TIT1', 'TT2': 'TIT2', 'TT3': 'TIT3', 'TXT': 'TEXT', 'TXX': 'TXXX', 'TYE': 'TYER', 'UFI': 'UFID', 'ULT': 'USLT', 'WAF': 'WOAF', 'WAR': 'WOAR', 'WAS': 'WOAS', 'WCM': 'WCOM', 'WCP': 'WCOP', 'WPB': 'WPUB', 'WXX': 'WXXX'}, 'TEXT_FRAME_RX': <_sre.SRE_Pattern object at 0x02B07A20>, 'THB_DIM': (223, 200), 'THB_HD_DIM': (300, 300), 'THB_SD_DIM': (223, 200), 'TITLE_FID': 'TIT2', 'TITLE_FIDS': ['TIT2', 'TIT3', 'TIT1'], 'TRACE': 0, 'TRACE_MSG': <function TRACE_MSG at 0x02B426B0>, 'TRACKNUM_FID': 'TRCK', 'Tag': <class eyeD3.tag.Tag at 0x02B87090>, 'TagException': <class 'eyeD3.tag.TagException'>, 'TagFile': <class eyeD3.tag.TagFile at 0x02B871B0>, 'TagHeader': <class eyeD3.tag.TagHeader at 0x02B87030>, 'TextFrame': <class eyeD3.frames.TextFrame at 0x02B45AE0>, 'TextInput': <class PyRSS2Gen.TextInput at 0x02B97270>, 'UF_APPEND': 4, 'UF_IMMUTABLE': 2, 'UF_NODUMP': 1, 'UF_NOUNLINK': 16, 'UF_OPAQUE': 8, 'UNIQUE_FILE_ID_FID': 'UFID', 'UNIQUE_FILE_ID_FRAME_RX': <_sre.SRE_Pattern object at 0x02B31CA0>, 'URLFrame': <class eyeD3.frames.URLFrame at 0x02B45BD0>, 'URL_ARTIST_FID': 'WOAR', 'URL_AUDIOFILE_FID': 'WOAF', 'URL_AUDIOSRC_FID': 'WOAS', 'URL_COMMERCIAL_FID': 'WCOM', 'URL_COPYRIGHT_FID': 'WCOP', 'URL_FIDS': ['WCOM', 'WCOP', 'WOAF', 'WOAR', 'WOAS', 'WORS', 'WPAY', 'WPUB'], 'URL_FRAME_RX': <_sre.SRE_Pattern object at 0x02B07AA0>, 'URL_INET_RADIO_FID': 'WORS', 'URL_PAYMENT_FID': 'WPAY', 'URL_PUBLISHER_FID': 'WPUB', 'USERTEXT_FID': 'TXXX', 'USERTEXT_FRAME_RX': <_sre.SRE_Pattern object at 0x02B31A20>, 'USERURL_FID': 'WXXX', 'USERURL_FRAME_RX': <_sre.SRE_Pattern object at 0x02B31A70>, 'UTF_16BE_ENCODING': '\x02', 'UTF_16_ENCODING': '\x01', 'UTF_8_ENCODING': '\x03', 'UniqueFileIDFrame': <class eyeD3.frames.UniqueFileIDFrame at 0x02B45DB0>, 'UnknownFrame': <class eyeD3.frames.UnknownFrame at 0x02B45DE0>, 'UserTextFrame': <class eyeD3.frames.UserTextFrame at 0x02B45BA0>, 'UserURLFrame': <class eyeD3.frames.UserURLFrame at 0x02B45C30>, 'WriteXmlMixin': <class PyRSS2Gen.WriteXmlMixin at 0x02B97120>, '__builtins__': {'ArithmeticError': <type 'exceptions.ArithmeticError'>, 'AssertionError': <type 'exceptions.AssertionError'>, 'AttributeError': <type 'exceptions.AttributeError'>, 'BaseException': <type 'exceptions.BaseException'>, 'BufferError': <type 'exceptions.BufferError'>, 'BytesWarning': <type 'exceptions.BytesWarning'>, 'DeprecationWarning': <type 'exceptions.DeprecationWarning'>, 'EOFError': <type 'exceptions.EOFError'>, 'Ellipsis': Ellipsis, 'EnvironmentError': <type 'exceptions.EnvironmentError'>, 'Exception': <type 'exceptions.Exception'>, 'False': False, 'FloatingPointError': <type 'exceptions.FloatingPointError'>, 'FutureWarning': <type 'exceptions.FutureWarning'>, 'GeneratorExit': <type 'exceptions.GeneratorExit'>, 'IOError': <type 'exceptions.IOError'>, 'ImportError': <type 'exceptions.ImportError'>, 'ImportWarning': <type 'exceptions.ImportWarning'>, 'IndentationError': <type 'exceptions.IndentationError'>, 'IndexError': <type 'exceptions.IndexError'>, 'KeyError': <type 'exceptions.KeyError'>, 'KeyboardInterrupt': <type 'exceptions.KeyboardInterrupt'>, 'LookupError': <type 'exceptions.LookupError'>, 'MemoryError': <type 'exceptions.MemoryError'>, 'NameError': <type 'exceptions.NameError'>, 'None': None, 'NotImplemented': NotImplemented, 'NotImplementedError': <type 'exceptions.NotImplementedError'>, 'OSError': <type 'exceptions.OSError'>, 'OverflowError': <type 'exceptions.OverflowError'>, 'PendingDeprecationWarning': <type 'exceptions.PendingDeprecationWarning'>, 'ReferenceError': <type 'exceptions.ReferenceError'>, 'RuntimeError': <type 'exceptions.RuntimeError'>, 'RuntimeWarning': <type 'exceptions.RuntimeWarning'>, 'StandardError': <type 'exceptions.StandardError'>, 'StopIteration': <type 'exceptions.StopIteration'>, 'SyntaxError': <type 'exceptions.SyntaxError'>, 'SyntaxWarning': <type 'exceptions.SyntaxWarning'>, 'SystemError': <type 'exceptions.SystemError'>, 'SystemExit': <type 'exceptions.SystemExit'>, 'TabError': <type 'exceptions.TabError'>, 'True': True, 'TypeError': <type 'exceptions.TypeError'>, 'UnboundLocalError': <type 'exceptions.UnboundLocalError'>, 'UnicodeDecodeError': <type 'exceptions.UnicodeDecodeError'>, 'UnicodeEncodeError': <type 'exceptions.UnicodeEncodeError'>, 'UnicodeError': <type 'exceptions.UnicodeError'>, 'UnicodeTranslateError': <type 'exceptions.UnicodeTranslateError'>, 'UnicodeWarning': <type 'exceptions.UnicodeWarning'>, 'UserWarning': <type 'exceptions.UserWarning'>, 'ValueError': <type 'exceptions.ValueError'>, 'Warning': <type 'exceptions.Warning'>, 'WindowsError': <type 'exceptions.WindowsError'>, 'ZeroDivisionError': <type 'exceptions.ZeroDivisionError'>, '__debug__': True, '__doc__': "Built-in functions, exceptions, and other objects.\n\nNoteworthy: None is the `nil' object; Ellipsis represents `...' in slices.", '__import__': <built-in function __import__>, '__name__': '__builtin__', '__package__': None, 'abs': <built-in function abs>, 'all': <built-in function all>, 'any': <built-in function any>, 'apply': <built-in function apply>, 'basestring': <type 'basestring'>, 'bin': <built-in function bin>, 'bool': <type 'bool'>, 'buffer': <type 'buffer'>, 'bytearray': <type 'bytearray'>, 'bytes': <type 'str'>, 'callable': <built-in function callable>, 'chr': <built-in function chr>, 'classmethod': <type 'classmethod'>, 'cmp': <built-in function cmp>, 'coerce': <built-in function coerce>, 'compile': <built-in function compile>, 'complex': <type 'complex'>, 'copyright': Copyright (c) 2001-2008 Python Software Foundation. All Rights Reserved. Copyright (c) 2000 BeOpen.com. All Rights Reserved. Copyright (c) 1995-2001 Corporation for National Research Initiatives. All Rights Reserved. Copyright (c) 1991-1995 Stichting Mathematisch Centrum, Amsterdam. All Rights Reserved., 'credits': Thanks to CWI, CNRI, BeOpen.com, Zope Corporation and a cast of thousands for supporting Python development. See www.python.org for more information., 'delattr': <built-in function delattr>, 'dict': <type 'dict'>, 'dir': <built-in function dir>, 'divmod': <built-in function divmod>, 'enumerate': <type 'enumerate'>, 'eval': <built-in function eval>, 'execfile': <built-in function execfile>, 'exit': Use exit() or Ctrl-Z plus Return to exit, 'file': <type 'file'>, 'filter': <built-in function filter>, 'float': <type 'float'>, 'format': <built-in function format>, 'frozenset': <type 'frozenset'>, 'getattr': <built-in function getattr>, 'globals': <built-in function globals>, 'hasattr': <built-in function hasattr>, 'hash': <built-in function hash>, 'help': Type help() for interactive help, or help(object) for help about object., 'hex': <built-in function hex>, 'id': <built-in function id>, 'input': <built-in function input>, 'int': <type 'int'>, 'intern': <built-in function intern>, 'isinstance': <built-in function isinstance>, 'issubclass': <built-in function issubclass>, 'iter': <built-in function iter>, 'len': <built-in function len>, 'license': Type license() to see the full license text, 'list': <type 'list'>, 'locals': <built-in function locals>, 'long': <type 'long'>, 'map': <built-in function map>, 'max': <built-in function max>, 'min': <built-in function min>, 'next': <built-in function next>, 'object': <type 'object'>, 'oct': <built-in function oct>, 'open': <built-in function open>, 'ord': <built-in function ord>, 'pow': <built-in function pow>, 'print': <built-in function print>, 'property': <type 'property'>, 'quit': Use quit() or Ctrl-Z plus Return to exit, 'range': <built-in function range>, 'raw_input': <built-in function raw_input>, 'reduce': <built-in function reduce>, 'reload': <built-in function reload>, 'repr': <built-in function repr>, 'reversed': <type 'reversed'>, 'round': <built-in function round>, 'set': <type 'set'>, 'setattr': <built-in function setattr>, 'slice': <type 'slice'>, 'sorted': <built-in function sorted>, 'staticmethod': <type 'staticmethod'>, 'str': <type 'str'>, 'sum': <built-in function sum>, 'super': <type 'super'>, 'tuple': <type 'tuple'>, 'type': <type 'type'>, 'unichr': <built-in function unichr>, 'unicode': <type 'unicode'>, 'vars': <built-in function vars>, 'xrange': <type 'xrange'>, 'zip': <built-in function zip>}, '__doc__': None, '__file__': 'C:\\roku_media_player\\server\\rss_server.pyc', '__name__': 'rss_server', '__package__': None, 'app': <web.application.application instance at 0x02BE2468>, 'bin2bytes': <function bin2bytes at 0x02B42930>, 'bin2dec': <function bin2dec at 0x02B42970>, 'bin2synchsafe': <function bin2synchsafe at 0x02B42A70>, 'binascii': <module 'binascii' (built-in)>, 'binfuncs': <module 'eyeD3.binfuncs' from 'C:\roku_media_player\server\eyeD3\binfuncs.pyc'>, 'bytes2bin': <function bytes2bin at 0x02B42530>, 'bytes2dec': <function bytes2dec at 0x02B429B0>, 'bytes2str': <function bytes2str at 0x02B42AB0>, 'call_protected': <function call_protected at 0x02BD3BB0>, 'cleanNulls': <function cleanNulls at 0x02B42AF0>, 'client_dir': <function client_dir at 0x02B90CB0>, 'config_file': 'config.ini', 'constantToVersions': <function constantToVersions at 0x02B42670>, 'createFrame': <function createFrame at 0x02B72530>, 'datetime': <module 'datetime' (built-in)>, 'dec2bin': <function dec2bin at 0x02B429F0>, 'dec2bytes': <function dec2bytes at 0x02B42A30>, 'deunsyncData': <function deunsyncData at 0x02B42DB0>, 'dir2item': <function dir2item at 0x02BD3C30>, 'doc2m3u': <function doc2m3u at 0x02BD3E30>, 'dump_data_to_file': <function dump_data_to_file at 0x02B725B0>, 'encodeUnicode': <function encodeUnicode at 0x02B725F0>, 'encode_multipart_formdata': <function encode_multipart_formdata at 0x02B90970>, 'ext2mime': <function ext2mime at 0x02B909F0>, 'eyeD3': <module 'eyeD3' from 'C:\roku_media_player\server\eyeD3\__init__.pyc'>, 'eyeD3Maintainer': 'Travis Shirk <travis@pobox.com>', 'eyeD3Version': '0.6.17', 'file2item': <function file2item at 0x02BD3BF0>, 'file2key': <function file2key at 0x02B90DB0>, 'first_letter': <function first_letter at 0x02B90BB0>, 'format_size': <function format_size at 0x02B428B0>, 'format_time_delta': <function format_time_delta at 0x02B428F0>, 'format_track_time': <function format_track_time at 0x02B42730>, 'frameDesc': {'AENC': 'Audio encryption', 'APIC': 'Attached picture', 'ASPI': 'Audio seek point index', 'COMM': 'Comments', 'COMR': 'Commercial frame', 'ENCR': 'Encryption method registration', 'EQU2': 'Equalisation (2)', 'ETCO': 'Event timing codes', 'GEOB': 'General encapsulated object', 'GRID': 'Group identification registration', 'LINK': 'Linked information', 'MCDI': 'Music CD identifier', 'MLLT': 'MPEG location lookup table', 'OWNE': 'Ownership frame', 'PCNT': 'Play counter', 'POPM': 'Popularimeter', 'POSS': 'Position synchronisation frame', 'PRIV': 'Private frame', 'RBUF': 'Recommended buffer size', 'RVA2': 'Relative volume adjustment (2)', 'RVRB': 'Reverb', 'SEEK': 'Seek frame', 'SIGN': 'Signature frame', 'SYLT': 'Synchronised lyric/text', 'SYTC': 'Synchronised tempo codes', 'TALB': 'Album/Movie/Show title', 'TBPM': 'BPM (beats per minute)', 'TCOM': 'Composer', 'TCON': 'Content type', 'TCOP': 'Copyright message', 'TDEN': 'Encoding time', 'TDLY': 'Playlist delay', 'TDOR': 'Original release time', 'TDRC': 'Recording time', 'TDRL': 'Release time', 'TDTG': 'Tagging time', 'TENC': 'Encoded by', 'TEXT': 'Lyricist/Text writer', 'TFLT': 'File type', 'TIPL': 'Involved people list', 'TIT1': 'Content group description', 'TIT2': 'Title/songname/content description', 'TIT3': 'Subtitle/Description refinement', 'TKEY': 'Initial key', 'TLAN': 'Language(s)', 'TLEN': 'Length', 'TMCL': 'Musician credits list', 'TMED': 'Media type', 'TMOO': 'Mood', 'TOAL': 'Original album/movie/show title', 'TOFN': 'Original filename', 'TOLY': 'Original lyricist(s)/text writer(s)', 'TOPE': 'Original artist(s)/performer(s)', 'TOWN': 'File owner/licensee', 'TPE1': 'Lead performer(s)/Soloist(s)', 'TPE2': 'Band/orchestra/accompaniment', 'TPE3': 'Conductor/performer refinement', 'TPE4': 'Interpreted, remixed, or otherwise modified by', 'TPOS': 'Part of a set', 'TPRO': 'Produced notice', 'TPUB': 'Publisher', 'TRCK': 'Track number/Position in set', 'TRSN': 'Internet radio station name', 'TRSO': 'Internet radio station owner', 'TSOA': 'Album sort order', 'TSOP': 'Performer sort order', 'TSOT': 'Title sort order', 'TSRC': 'ISRC (international standard recording code)', 'TSSE': 'Software/Hardware and settings used for encoding', 'TSST': 'Set subtitle', 'TXXX': 'User defined text information frame', 'UFID': 'Unique file identifier', 'USER': 'Terms of use', 'USLT': 'Unsynchronised lyric/text transcription', 'WCOM': 'Commercial information', 'WCOP': 'Copyright/Legal information', 'WOAF': 'Official audio file webpage', 'WOAR': 'Official artist/performer webpage', 'WOAS': 'Official audio source webpage', 'WORS': 'Official Internet radio station homepage', 'WPAY': 'Payment', 'WPUB': 'Publishers official webpage', 'WXXX': 'User defined URL link frame'}, 'frames': <module 'eyeD3.frames' from 'C:\roku_media_player\server\eyeD3\frames.pyc'>, 'genres': ['Blues', 'Classic Rock', 'Country', 'Dance', 'Disco', 'Funk', 'Grunge', 'Hip-Hop', 'Jazz', 'Metal', 'New Age', 'Oldies', 'Other', 'Pop', 'R&B', 'Rap', 'Reggae', 'Rock', 'Techno', 'Industrial', 'Alternative', 'Ska', 'Death Metal', 'Pranks', 'Soundtrack', 'Euro-Techno', 'Ambient', 'Trip-Hop', 'Vocal', 'Jazz+Funk', 'Fusion', 'Trance', 'Classical', 'Instrumental', 'Acid', 'House', 'Game', 'Sound Clip', 'Gospel', 'Noise', 'AlternRock', 'Bass', 'Soul', 'Punk', 'Space', 'Meditative', 'Instrumental Pop', 'Instrumental Rock', 'Ethnic', 'Gothic', 'Darkwave', 'Techno-Industrial', 'Electronic', 'Pop-Folk', 'Eurodance', 'Dream', 'Southern Rock', 'Comedy', 'Cult', 'Gangsta Rap', 'Top 40', 'Christian Rap', 'Pop / Funk', 'Jungle', 'Native American', 'Cabaret', 'New Wave', 'Psychedelic', 'Rave', 'Showtunes', 'Trailer', 'Lo-Fi', 'Tribal', 'Acid Punk', 'Acid Jazz', 'Polka', 'Retro', 'Musical', 'Rock & Roll', 'Hard Rock', 'Folk', 'Folk-Rock', 'National Folk', 'Swing', 'Fast Fusion', 'Bebob', 'Latin', 'Revival', 'Celtic', 'Bluegrass', 'Avantgarde', 'Gothic Rock', 'Progressive Rock', 'Psychedelic Rock', 'Symphonic Rock', 'Slow Rock', 'Big Band', 'Chorus', 'Easy Listening', 'Acoustic', 'Humour', 'Speech', 'Chanson', 'Opera', 'Chamber Music', 'Sonata', 'Symphony', 'Booty Bass', 'Primus', 'Porn Groove', 'Satire', 'Slow Jam', 'Club', 'Tango', 'Samba', 'Folklore', 'Ballad', 'Power Ballad', 'Rhythmic Soul', 'Freestyle', 'Duet', 'Punk Rock', 'Drum Solo', 'A Cappella', 'Euro-House', 'Dance Hall', 'Goa', 'Drum & Bass', 'Club-House', 'Hardcore', 'Terror', 'Indie', 'BritPop', 'Negerpunk', 'Polsk Punk', 'Beat', 'Christian Gangsta Rap', 'Heavy Metal', 'Black Metal', 'Crossover', 'Contemporary Christian', 'Christian Rock', 'Merengue', 'Salsa', 'Thrash Metal', 'Anime', 'JPop', 'Synthpop', 'Rock/Pop', 'Unknown', 'Unknown', 'Unknown', 'Unknown', 'Unknown', 'Unknown', 'Unknown', 'Unknown', 'Unknown', 'Unknown', 'Unknown', 'Unknown', 'Unknown', 'Unknown', 'Unknown', 'Unknown', 'Unknown', 'Unknown', 'Unknown', 'Unknown', 'Unknown', 'Unknown', 'Unknown', 'Unknown', 'Unknown', 'Unknown', 'Unknown', 'Unknown', 'Unknown', 'Unknown', 'Unknown', 'Unknown', 'Unknown', 'Unknown', 'Unknown', 'Unknown', 'Unknown', 'Unknown', 'Unknown', 'Unknown', 'Unknown', 'Unknown', 'Unknown', 'Unknown', 'Unknown', 'Unknown', 'Unknown', 'Unknown', 'Unknown', 'Unknown', 'Unknown', 'Unknown', 'Unknown', 'Unknown', 'Unknown', 'Unknown', 'Unknown', 'Unknown', 'Unknown', 'Unknown', 'Unknown', 'Unknown', 'Unknown', 'Unknown', 'Unknown', 'Unknown', 'Unknown', 'Unknown', 'Unknown', 'Unknown', 'Unknown', 'Unknown', 'Unknown', 'Unknown', 'Unknown', 'Unknown', 'Unknown', 'Unknown', 'Unknown', 'Unknown', 'Unknown', 'Unknown', 'Unknown', 'Unknown', 'Unknown', 'Unknown', 'Unknown', 'Unknown', 'Unknown', 'Unknown', 'Unknown', 'Unknown', 'Unknown', 'Unknown', 'Unknown', 'Unknown', 'Unknown', 'Unknown', 'Unknown', 'Unknown', 'Unknown', 'Unknown', 'Unknown', 'Unknown', 'Unknown', 'Unknown', 'Unknown'], 'get_content_type': <function get_content_type at 0x02B909B0>, 'getart': <function getart at 0x02BD3C70>, 'getdoc': <function getdoc at 0x02BD3D30>, 'getimg': <function getimg at 0x02B90E30>, 'getpl': <function getpl at 0x02BD3DB0>, 'httplib': <module 'httplib' from 'c:\python26\lib\httplib.pyc'>, 'id3EncodingToString': <function id3EncodingToString at 0x02B42B30>, 'imghdr': <module 'imghdr' from 'c:\python26\lib\imghdr.pyc'>, 'isMp3File': <function isMp3File at 0x02B81AB0>, 'is_letter': <function is_letter at 0x02B90B30>, 'is_music': <function is_music at 0x02B90D70>, 'is_number': <function is_number at 0x02B90B70>, 'is_photo': <function is_photo at 0x02B90D30>, 'is_video': <function is_video at 0x02B90CF0>, 'item_sorter': <function item_sorter at 0x02BD3CB0>, 'key_to_path': <function key_to_path at 0x02B90DF0>, 'locale': <module 'locale' from 'c:\python26\lib\locale.pyc'>, 'log_file': 'my_media_log.txt', 'logging': <module 'logging' from 'c:\python26\lib\logging\__init__.pyc'>, 'main_menu_feed': <function main_menu_feed at 0x02BD3930>, 'map2_2FrameId': <function map2_2FrameId at 0x02B72570>, 'math': <module 'math' (built-in)>, 'mimetypes': <module 'mimetypes' from 'c:\python26\lib\mimetypes.pyc'>, 'mp3': <module 'eyeD3.mp3' from 'C:\roku_media_player\server\eyeD3\mp3.pyc'>, 'music_dir': <function music_dir at 0x02B90BF0>, 'obsoleteFrames': {'EQUA': 'Equalisation', 'IPLS': 'Involved people list', 'RVAD': 'Relative volume adjustment', 'TDAT': 'Date', 'TORY': 'Original release year', 'TRDA': 'Recording dates', 'TYER': 'Year'}, 'os': <module 'os' from 'c:\python26\lib\os.pyc'>, 'parse_config': <function parse_config at 0x02B90830>, 'partition_by_firstletter': <function partition_by_firstletter at 0x02BD3CF0>, 'photo_dir': <function photo_dir at 0x02B90C70>, 'pl2songs': <function pl2songs at 0x02BD3D70>, 'post_multipart': <function post_multipart at 0x02B90930>, 'prefix': 'eyeD3 trace> ', 'range_handler': <function range_handler at 0x02BD3E70>, 're': <module 're' from 'c:\python26\lib\re.pyc'>, 'relpath26': <function relpath26 at 0x02B908B0>, 'remotepl2doc': <function remotepl2doc at 0x02BD3DF0>, 'scaleimg': <function scaleimg at 0x02B90E70>, 'server_base': <function server_base at 0x02B907F0>, 'shutil': <module 'shutil' from 'c:\python26\lib\shutil.pyc'>, 'splitUnicode': <function splitUnicode at 0x02B42DF0>, 'stat': <module 'stat' from 'c:\python26\lib\stat.pyc'>, 'str2tuple': <function str2tuple at 0x02B90EF0>, 'strictID3': <function strictID3 at 0x02B426F0>, 'string': <module 'string' from 'c:\python26\lib\string.pyc'>, 'stringify_num': <function stringify_num at 0x02B90F30>, 'sys': <module 'sys' (built-in)>, 'tag': <module 'eyeD3.tag' from 'C:\roku_media_player\server\eyeD3\tag.pyc'>, 'tagToUserTune': <function tagToUserTune at 0x02B89870>, 'tempfile': <module 'tempfile' from 'c:\python26\lib\tempfile.pyc'>, 'terminate': <function terminate at 0x02B908F0>, 'time': <module 'time' (built-in)>, 'timeStampFormats': ['%Y', '%Y-%m', '%Y-%m-%d', '%Y-%m-%dT%H', '%Y-%m-%dT%H:%M', '%Y-%m-%dT%H:%M:%S'], 'to_unicode': <function to_unicode at 0x02B90AB0>, 'to_utf8': <function to_utf8 at 0x02B90AF0>, 'tuple2str': <function tuple2str at 0x02B90EB0>, 'types': <module 'types' from 'c:\python26\lib\types.pyc'>, 'unsyncData': <function unsyncData at 0x02B42B70>, 'urllib': <module 'urllib' from 'c:\python26\lib\urllib.pyc'>, 'urls': ('/feed', 'RssHandler', '/media', 'MediaHandler', '/m3u', 'M3UHandler', '/', 'IndexHandler', '/readme', 'ReadmeTextileHandler', '/dynplay', 'DynamicPlaylist', '/remotes', 'DynamicPlaylistDoc'), 'utils': <module 'eyeD3.utils' from 'C:\roku_media_player\server\eyeD3\utils.pyc'>, 'versionToString': <function versionToString at 0x02B42630>, 'versionsToConstant': <function versionsToConstant at 0x02B425F0>, 'video_dir': <function video_dir at 0x02B90C30>, 'web': <module 'web' from 'C:\roku_media_player\server\web\__init__.pyc'>, 'write_config': <function write_config at 0x02B90870>, 'zlib': <module 'zlib' (built-in)>}
handle_class
<function handle_class at 0x02D03CF0>
is_class
<function is_class at 0x02D03E70>
self
<web.application.application instance at 0x02B94918>
* C:\roku_media_player\server\web\application.py in handle
225.
226. def browser(self):
227. import browser
228. return browser.AppBrowser(self)
229.
230. def handle(self):
231. fn, args = self._match(self.mapping, web.ctx.path)
232. return self._delegate(fn, self.fvars, args) ...
233.
234. def handle_with_processors(self):
235. def process(processors):
236. try:
237. if processors:
238. p, processors = processors[0], processors[1:]
â–¶ Local vars
Variable Value
args
[]
fn
u'DynamicPlaylistDoc'
self
<web.application.application instance at 0x02B94918>
* C:\roku_media_player\server\web\application.py in process
234. def handle_with_processors(self):
235. def process(processors):
236. try:
237. if processors:
238. p, processors = processors[0], processors[1:]
239. return p(lambda: process(processors))
240. else:
241. return self.handle() ...
242. except web.HTTPError:
243. raise
244. except (KeyboardInterrupt, SystemExit):
245. raise
246. except:
247. print >> web.debug, traceback.format_exc()
â–¶ Local vars
Variable Value
process
<function process at 0x02D1CD70>
processors
[]
self
<web.application.application instance at 0x02B94918>

Response so far
HEADERS
Variable Value
Content-Type
'application/rss+xml'
BODY

Request information
INPUT

No data.
COOKIES

No data.
META
Variable Value
app_stack
[<web.application.application instance at 0x02B94918>]
fullpath
u'/remotes'
headers
[('Content-Type', 'application/rss+xml')]
home
u'http://192.168.1.220:8001'
homedomain
u'http://192.168.1.220:8001'
homepath
u''
host
u'192.168.1.220:8001'
ip
u'192.168.1.220'
method
u'GET'
output
u''
path
u'/remotes'
protocol
u'http'
query
u''
realhome
u'http://192.168.1.220:8001'
status
'200 OK'
ENVIRONMENT
Variable Value
ACTUAL_SERVER_PROTOCOL
'HTTP/1.1'
HTTP_ACCEPT
'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'
HTTP_ACCEPT_CHARSET
'windows-1252,utf-8;q=0.7,*;q=0.7'
HTTP_ACCEPT_ENCODING
'gzip,deflate'
HTTP_ACCEPT_LANGUAGE
'en-us,en;q=0.5'
HTTP_CONNECTION
'keep-alive'
HTTP_HOST
'192.168.1.220:8001'
HTTP_KEEP_ALIVE
'300'
HTTP_REFERER
'http://192.168.1.220:8001/feed'
HTTP_USER_AGENT
'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.8) Gecko/20100202 Firefox/3.5.8 GTB6'
PATH_INFO
'/remotes'
QUERY_STRING
''
REMOTE_ADDR
'192.168.1.220'
REMOTE_PORT
'55049'
REQUEST_METHOD
'GET'
SCRIPT_NAME
''
SERVER_NAME
'localhost'
SERVER_PORT
'8001'
SERVER_PROTOCOL
'HTTP/1.1'
SERVER_SOFTWARE
'CherryPy/3.1.2 WSGI Server'
wsgi.errors
<open file '<stderr>', mode 'w' at 0x004D30C0>
wsgi.input
<web.wsgiserver.SizeCheckWrapper object at 0x02C82F30>
wsgi.multiprocess
False
wsgi.multithread
True
wsgi.run_once
False
wsgi.url_scheme
'http'
wsgi.version
(1, 0)

You're seeing this error because you have web.config.debug set to True. Set that to False if you don't to see this.
0 Kudos
el_wubo
Visitor

Re: My Media - Your Music and Video on the Roku DVP

"umbighouse" wrote:
I can't tell you how much BETTER I like the Play All/Shuffle All options in My Music. Awesome.
So I guess new graphics are needed for these 2 items, as well as Server Playlist? I'll get started on that...


Yup! We need your artistic touch. Thank you, as always!

"umbighouse" wrote:

A question about the server playlist- when I click on it on the Roku/TV screen, I get a server not available error. On the web interface, I get the following output:
(do I need to config something else?)


Oops. I didn't handle that error very gracefully. The problem is that you haven't created your remote playlist. Go to http://localhost:8001 and click on "Personal Links" to do that.

Speaking of Server Playlist / Personal Links / My Streams.... I can't figure out what to call this feature. Of what I've heard of so far I like "My Streams" the best. Any other suggestions or comments?
0 Kudos
umbighouse
Visitor

Re: My Media - Your Music and Video on the Roku DVP

My Streams would work well keeping with the naming convention, length, etc. I just sent you new icons but if we use My Streams I can redo that one.
0 Kudos