Channel Logos

I'm thinking of signing up for the service, moving from quite any elegant Windows Media Center setup at home. Can someone confirm whether the EPG shows the channel logos or not? I've seen screenshots with and without.
Thanks!

Not im afraid,no logo's.

Similar Messages

  • Add 'channel' logo to every frame

    Hi,
    is there a way to add a tranparent background image to every frame of my movie, as if it was a channel logo ?
    I could build a transparent image of the right resolution with the logo on the bottom right. But how do I add it ? Ideas ?
    Erik

    I have QTPro... How would you do that?
    1) Create logo in graphic application like Photoshop with transparent background
    2) Export as "Transparent Image" (e.g., with alpha-channel as in a PNG file)
    3) Open your edited movie in QT Pro
    4) Open the "logo" file using the "Open File" QT Pro option
    5) Press Command-A to select the "single frame" logo
    6) Press Command-C to store the logo in memory
    7) Activate the edited movie player (i.e., mouse click on it)
    8) Use the "Add to Selection & Scale" option to add the logo in memory to the edited movie and match the length of the added track to the length of your edited movie
    9) Select the "logo" track in the upper half of the properties window and the "Visual Settings" tab in the lower half of the window
    10) Set the "Tansparency" pop-up to "Straight Alpha" (Since the logo was the last track added it should be visible, but if it isn't, adjust "Layer" to a "lower" number to place it over your edited movie)
    11) I usually reset playhead to beginning of the movie, press Command-B to deselect in/out points and save the file as a "Standalone" MOV file.
    And that's all there is to it...

  • How to get the channel logos in the guide?

    Ive been to other peoples houses who have fios tv and each of them have the channel logos in the guide, But i dont and ive checked my system information it says the stb is online and its running release 1.6.0 can anyone help?

    Same issue with me.  I don't have about 50% of the channel logos in the guide.  I have a QIP6416 DVR with IMG 1.6.0 (build 06.89) in VHO8 suburban Philadelphia.

  • Adding a channel logo/watermark - really pixelated??

    Hi,
    I've been trying to add out logo to the bottom corner of our video and everything i try doesn't come out really sharp its all pixaleted, i've tried .psd .png whats the best way to do this?? and get a nice sharp picture/logo
    Thanks

    You just repeated what you first wrote.
    Please read this, and provide more information:
    http://forums.adobe.com/thread/961741?tstart=0

  • Guide and channel logos msising

    Moved to x1

    Thanks for trying but it doesn't really help.
    The new system sucks. CHANGE IT BACK!!!! 

  • V1.9 Channel Guide - Questions & Concerns

    In speaking with customer support this morning, it would appear that my only recourse for letting Verizon know that I don’t like the new Channel Guide is to make a post on the forums and this looks more appropriate that the tech forums after looking around a bit.
    Cable Television issues:
    To start, there was absolutely nothing wrong with the old channel guide and I can’t figure out what the new guide does better aside from possibly displaying a few more channels per page…at the cost of incorporating a GIANT active dvr UI (user interface), an awful color scheme and a PiP window in the channel guide that seems to have had its size reduced to about ¼ of the previous one.
    Does anyone know if there’s a way to change the display back to the old style or at least something close to it? I only had 15 minutes to play around with it this morning before work, but the rest of the new display styles are even worse than the standard one and I was hoping there was another options section that I didn’t notice as far as the overall display goes.
    DVR issues:
    For those of you who use the verizon DVR services, that display has also changed and I can only assume that it’s geared towards displaying commercials while we use the dvr functions b/c there’s no other reason for it to take up so much room on the screen at the moment.
    The previous dvr display used to consist of a small horizontal bar across the bottom of the screen that displayed the basic channel info (channel #, name of the show, run time etc etc), showed you the speed at which it was rewinding or fast forwarding and the point in the show that you were currently watching. With the update, the DVR window is MASSIVE and it has to be taking up close to 1/3 of the screen when you hit the FF, RW or play button. However, even with the new giant dvr display, there’s nothing being utilized in the actual display and I have a feeling it’s going to be used for corporate commercials or simply advertising verizon on-demand programming.
    The new channel guide is clearly slower than the old one and the dvr seems sluggish too. As I said earlier, I just didn’t see anything that warranted the huge makeover and I have trouble understanding how this new version of the channel guide could’ve possibly been beta tested by anyone and wound up in this state.
    I love the verizon internet speed and I’ve come to find that their customer service is excellent, but this change was possibly enough to make me drop the full package I currently utilize and simply maintain the internet going forward for the sake of accessing websites like hulu & netflix for my television needs.

    The only thing that’s changed about my opinion of the new channel guide after having a chance to really play around with it after work yesterday is that it’s even worse than I had initially thought.
    While I think the color scheme is really ugly and a poor choice, at least it wasn’t handled as badly as the new layouts. I mean, really….there’s so much empty & wasted space that it’s hard to understand how this could’ve been beta tested or handled by professionals unless there really are going to be a lot of additional advertisements eventually crammed into the channel guide layout while we’re looking through the guide or dvr.
    The search bar at the bottom of the screen, which now causes dvr function & channel info displays to take up over 1/3 of the screen, contains NOTHING except for the basic channel info, the time and an indicator that you should hit the ‘B’ button to open the search function. It could’ve easily been reduced by at least 50% considering how little information it actually displays…yet someone thought it would be better if it obscured a lot of screen space.
    It wouldn’t be so bad, but on top of taking up a lot of screen space, this new search bar shows up all over the guide layouts. As it brings almost nothing to the table and presents the information as poorly as possible, I can only assume that Verizon REALLY wants people to start using the search function b/c there’s absolutely no reason for it to take up so much space.
    There are some new channel guide options for different layouts and while I hate just about everything related to v1.9, I will say this; the ‘Channel Guide’ listing is almost useful in that it can be used as a secondary guide option to view a particular channels lineup for the day. Unfortunately, someone decided that it needed to have giant channel logos, so that section takes up about 25% of the layout for that guide. While it’s a nice layout for the intended purpose, outside of the stupid channel logos hogging up so much room, I’m not really sure why this was needed vs the previous method of simply pressing the button that scrolls to the right for a particular channel once you’re in the guide.
     The layout that’s most similar to the old guide, Full Listing, has an absurd amount of empty space that’s being sacrificed for the aforementioned giant search bar at the bottom of the guide, a window carved out for channel logos that’s about 2x-3x too big for the actual logos being used and another empty space below the logo window where 2 channel numbers are displayed. Here we have yet another baffling instance of awful layout implementation for no apparent reason. Aside from eventually forcing us to watch more advertisements, I can’t even begin to imagine how this passed some kind of final approval  b/c there’s no reason to have so much empty space when redesigning any kind of layout.
    The other glaring mistake in the Full listing layout is that the display indicator that shows you where you’re at in a particular channel block and/or show is at the top of the screen. Which, if you think about it, was a poor decision since the channel guide always stays in the middle of the channel block you’re viewing and the new bar doesn’t seem to lineup properly with the shows based on watching some tv last night. The old layout let you know exactly where you were with the show you’re watching whereas the new is displayed in such a way that it’s become more of a ‘close guestimate’ since it will never overlap with the actual show you’re watching as it’s now anchored to the top of the guide.
    Here’s a free one, the channel you have highlighted in the channel guide should have the time display bar right above it so that you don’t need to look in two places at once to see where shows start/end and where you’re actually at in relation to the programming.  
    To be fair, I didn’t notice any sluggishness last night as everything seemed to be moving very smoothly and I’m using hardware that’s at least 3-4 years old. Maybe they patched something or maybe the earlier sluggishness was just a temporary inconvenience. However, I still haven’t found anything that comes even remotely close to warranting the implementation of a new program guide aside from the proposed theory of eventually forcing us to view advertisements via the vast amounts of empty space that were purposely chosen for the current layout.

  • Identify the logo in  a video

    I have a doubt regarding identifying the frame containing the logo (TV channel logo).I will be happy if you give information regarding the same.Thanks in advance.

    On ther left side of the Timeline, set the target to Video Track 2.
    -DH

  • VHO8 - Channel Icon Missing for 17/517

    Can someone pass this on to the VHO8 staff -
    The channel logo for our local MY Network station, MyPHL17 is missing from the IMG. This is on BOTH the SD and HD channel locations (17/517)
    This happened when our area was upgraded to IMG 1.7. From what I can tell, this is the ONLY missing logo.
    Thanks for the assistance!

    Dear friend,
    I have solved the problem by copying the file com.apple.macbookpro17-wi08.icns under /System/Library/CoreServices/CoreTypes.bundle/Contents/Library/MachineTypes.bund le/Contents/Resources/ from my new MBP into the same folder in the MP. Apple is good but "quodammodo bonus dormitat Homerus"...
    Best regards,
    Macarion.

  • New Black BT Vision box - what is missing, a discu...

    Maybe it's just me but here is a list of things which are currently missing or wrong with the new BT Vision box (black edition with new interface and OS). Thought it might be useful to keep a list of these going which people can add to.
    would also appreciate it if anyone can help with any of these issues in case i've missed something
    Red button doesn't work - believe this is  'coming soon'. you can still access the channels by going to 301 or 302
    Teletext doesn't work - the button pops up a message saying it's not available, coming soon?
    There is no way to set recordings to over run? - this used to be very handy on old box, particularly with live shows. is this being brought back?
    No signal strength tester - you used to be able to check digital signal reception strength and quality from the settings menu, not any more
    Pressing 'play' when viewing a recording doesn't flash up the progress bar - any other good way to do this, used to be handy. Fix: pressing "select" does the trick
    no HD Freeview - the box isn't capable, wondering whether they might upgrade us to YouView later on for this?
    No options to set resolution - used to be able to define 720p or 1080i for instance, not any more
    Sky Sports small white box - a small logo in the bottom right area, not sure what this is or why it's now there?
    Subtitles on iPlayer missing
    Some reported picture quality issues - both on SCART and HDMI
    On the plus side:
    Bigger capacity on the hard disc
    Faster inteface and movement between sections
    Nice new design and sharp interface resolution
    Channel logos / graphics now in the information bar menu
    When in the TV Guide there's still a small box showing you what you are watching on the current channel
    Music playlist
    Bookmarks
    Reinstatement of the 30s jump and better fast-forward / rewind (30s jump doesn't work on Sky Sports)
    Ability to jump to specific point in recordings (you need to start it first, then stop and go back into it to have option)
    Ability to reenter a recording at a time offset
    Icon to show which recordings have been watched
    HD iPlayer
    Recently viewed in iPlayer
    Ability to resume a programme on iPlayer
    Ability to resume on demand
    Disk usage on Recordings page
    Auto switching format for HDMI and SCARTOne-press toggling of Subtitles and Audio
    Previous channel facility
    'Play all' feature for On Demand series
    anything else people want to add?

    Subtitles on iPlayer
    Life | 1967 Plus Radio | 1000 Classical Hits | Kafka's World
    Someone Solved Your Question?
    Please let other members know by clicking on ’Mark as Accepted Solution’
    Helpful Post?
    If a post has been helpful, say thanks by clicking the ratings star.

  • [SOLVED] tv_grab_nl_py works with python 2.6.5, fails on 3.1.2

    Hi All,
    I have updated my mediacenter. Now tv_grab_nl_py does not work anymore:
    [cedric@tv ~]$ tv_grab_nl_py --output ~/listings.xml --fast
    File "/usr/bin/tv_grab_nl_py", line 341
    print 'tv_grab_nl_py: A grabber that grabs tvguide data from tvgids.nl\n'
    ^
    SyntaxError: invalid syntax
    [cedric@tv ~]$
    the version of python on the mediacenter (running arch linux):
    [cedric@tv ~]$ python
    Python 3.1.2 (r312:79147, Oct 4 2010, 12:35:40)
    [GCC 4.5.1] on linux2
    Type "help", "copyright", "credits" or "license" for more information.
    >>>
    I have copied the file to my laptop, there it looks like it's working:
    ./tv_grab_nl_py --output ~/listings.xml --fast
    Config file /home/cedric/.xmltv/tv_grab_nl_py.conf not found.
    Re-run me with the --configure flag.
    cedric@laptop:~$
    the version of python on my laptop (running arch linux):
    cedric@laptop:~$ python
    Python 2.6.5 (r265:79063, Apr 1 2010, 05:22:20)
    [GCC 4.4.3 20100316 (prerelease)] on linux2
    Type "help", "copyright", "credits" or "license" for more information.
    >>>
    the script I'm trying to run:
    [cedric@tv ~]$ cat tv_grab_nl_py
    #!/usr/bin/env python
    # $LastChangedDate: 2009-11-14 10:06:41 +0100 (Sat, 14 Nov 2009) $
    # $Rev: 104 $
    # $Author: pauldebruin $
    SYNOPSIS
    tv_grab_nl_py is a python script that trawls tvgids.nl for TV
    programming information and outputs it in XMLTV-formatted output (see
    http://membled.com/work/apps/xmltv). Users of MythTV
    (http://www.mythtv.org) will appreciate the output generated by this
    grabber, because it fills the category fields, i.e. colors in the EPG,
    and has logos for most channels automagically available. Check the
    website below for screenshots. The newest version of this script can be
    found here:
    http://code.google.com/p/tvgrabnlpy/
    USAGE
    Check the web site above and/or run script with --help and start from there
    HISTORY
    tv_grab_nl_py used to be called tv_grab_nl_pdb, first released on
    2003/07/09. The name change was necessary because more and more people
    are actively contributing to this script and I always disliked using my
    initials (I was just too lazy to change it). At the same time I switched
    from using CVS to SVN and as a result the version numbering scheme has
    changed. The lastest official release of tv_grab_nl_pdb is 0.48. The
    first official release of tv_grab_nl_py is 6.
    QUESTIONS
    Questions (and patches) are welcome at: paul at pwdebruin dot net.
    IMPORTANT NOTES
    If you were using tv_grab_nl from the XMLTV bundle then enable the
    compat flag or use the --compat command-line option. Otherwise, the
    xmltvid's are wrong and you will not see any new data in MythTV.
    CONTRIBUTORS
    Main author: Paul de Bruin (paul at pwdebruin dot net)
    Michel van der Laan made available his extensive collection of
    high-quality logos that is used by this script.
    Michael Heus has taken the effort to further enhance this script so that
    it now also includes:
    - Credit info: directors, actors, presenters and writers
    - removal of programs that are actually just groupings/broadcasters
    (e.g. "KETNET", "Wild Friday", "Z@pp")
    - Star-rating for programs tipped by tvgids.nl
    - Black&White, Stereo and URL info
    - Better detection of Movies
    - and much, much more...
    Several other people have provided feedback and patches (these are the
    people I could find in my email archive, if you are missing from this
    list let me know):
    Huub Bouma, Roy van der Kuil, Remco Rotteveel, Mark Wormgoor, Dennis van
    Onselen, Hugo van der Kooij, Han Holl, Ian Mcdonald, Udo van den Heuvel.
    # Modules we need
    import re, urllib2, getopt, sys
    import time, random
    import htmlentitydefs, os, os.path, pickle
    from string import replace, split, strip
    from threading import Thread
    from xml.sax import saxutils
    # Extra check for the datetime module
    try:
    import datetime
    except:
    sys.stderr.write('This script needs the datetime module that was introduced in Python version 2.3.\n')
    sys.stderr.write('You are running:\n')
    sys.stderr.write('%s\n' % sys.version)
    sys.exit(1)
    # XXX: fix to prevent crashes in Snow Leopard [Robert Klep]
    if sys.platform == 'darwin' and sys.version_info[:3] == (2, 6, 1):
    try:
    urllib2.urlopen('http://localhost.localdomain')
    except:
    pass
    # do extra debug stuff
    debug = 1
    try:
    import redirect
    except:
    debug = 0
    pass
    # globals
    # compile only one time
    r_entity = re.compile(r'&(#x[0-9A-Fa-f]+|#[0-9]+|[A-Za-z]+);')
    tvgids = 'http://www.tvgids.nl/'
    uitgebreid_zoeken = tvgids + 'zoeken/'
    # how many seconds to wait before we timeout on a
    # url fetch, 10 seconds seems reasonable
    global_timeout = 10
    # Wait a random number of seconds between each page fetch.
    # We want to be nice and not hammer tvgids.nl (these are the
    # friendly people that provide our data...).
    # Also, it appears tvgids.nl throttles its output.
    # So there, there is not point in lowering these numbers, if you
    # are in a hurry, use the (default) fast mode.
    nice_time = [1, 2]
    # Maximum length in minutes of gaps/overlaps between programs to correct
    max_overlap = 10
    # Strategy to use for correcting overlapping prgramming:
    # 'average' = use average of stop and start of next program
    # 'stop' = keep stop time of current program and adjust start time of next program accordingly
    # 'start' = keep start time of next program and adjust stop of current program accordingly
    # 'none' = do not use any strategy and see what happens
    overlap_strategy = 'average'
    # Experimental strategy for clumping overlapping programming, all programs that overlap more
    # than max_overlap minutes, but less than the length of the shortest program are clumped
    # together. Highly experimental and disabled for now.
    do_clump = False
    # Create a category translation dictionary
    # Look in mythtv/themes/blue/ui.xml for all category names
    # The keys are the categories used by tvgids.nl (lowercase please)
    cattrans = { 'amusement' : 'Talk',
    'animatie' : 'Animated',
    'comedy' : 'Comedy',
    'documentaire' : 'Documentary',
    'educatief' : 'Educational',
    'erotiek' : 'Adult',
    'film' : 'Film',
    'muziek' : 'Art/Music',
    'informatief' : 'Educational',
    'jeugd' : 'Children',
    'kunst/cultuur' : 'Arts/Culture',
    'misdaad' : 'Crime/Mystery',
    'muziek' : 'Music',
    'natuur' : 'Science/Nature',
    'nieuws/actualiteiten' : 'News',
    'overige' : 'Unknown',
    'religieus' : 'Religion',
    'serie/soap' : 'Drama',
    'sport' : 'Sports',
    'theater' : 'Arts/Culture',
    'wetenschap' : 'Science/Nature'}
    # Create a role translation dictionary for the xmltv credits part
    # The keys are the roles used by tvgids.nl (lowercase please)
    roletrans = {'regie' : 'director',
    'acteurs' : 'actor',
    'presentatie' : 'presenter',
    'scenario' : 'writer'}
    # We have two sources of logos, the first provides the nice ones, but is not
    # complete. We use the tvgids logos to fill the missing bits.
    logo_provider = [ 'http://visualisation.tudelft.nl/~paul/logos/gif/64x64/',
    'http://static.tvgids.nl/gfx/zenders/' ]
    logo_names = {
    1 : [0, 'ned1'],
    2 : [0, 'ned2'],
    3 : [0, 'ned3'],
    4 : [0, 'rtl4'],
    5 : [0, 'een'],
    6 : [0, 'canvas_color'],
    7 : [0, 'bbc1'],
    8 : [0, 'bbc2'],
    9 : [0,'ard'],
    10 : [0,'zdf'],
    11 : [1, 'rtl'],
    12 : [0, 'wdr'],
    13 : [1, 'ndr'],
    14 : [1, 'srsudwest'],
    15 : [1, 'rtbf1'],
    16 : [1, 'rtbf2'],
    17 : [0, 'tv5'],
    18 : [0, 'ngc'],
    19 : [1, 'eurosport'],
    20 : [1, 'tcm'],
    21 : [1, 'cartoonnetwork'],
    24 : [0, 'canal+red'],
    25 : [0, 'mtv-color'],
    26 : [0, 'cnn'],
    27 : [0, 'rai'],
    28 : [1, 'sat1'],
    29 : [0, 'discover-spacey'],
    31 : [0, 'rtl5'],
    32 : [1, 'trt'],
    34 : [0, 'veronica'],
    35 : [0, 'tmf'],
    36 : [0, 'sbs6'],
    37 : [0, 'net5'],
    38 : [1, 'arte'],
    39 : [0, 'canal+blue'],
    40 : [0, 'at5'],
    46 : [0, 'rtl7'],
    49 : [1, 'vtm'],
    50 : [1, '3sat'],
    58 : [1, 'pro7'],
    59 : [1, 'kanaal2'],
    60 : [1, 'vt4'],
    65 : [0, 'animal-planet'],
    73 : [1, 'mezzo'],
    86 : [0, 'bbc-world'],
    87 : [1, 'tve'],
    89 : [1, 'nick'],
    90 : [1, 'bvn'],
    91 : [0, 'comedy_central'],
    92 : [0, 'rtl8'],
    99 : [1, 'sport1_1'],
    100 : [0, 'rtvu'],
    101 : [0, 'tvwest'],
    102 : [0, 'tvrijnmond'],
    103 : [1, 'tvnoordholland'],
    104 : [1, 'bbcprime'],
    105 : [1, 'spiceplatinum'],
    107 : [0, 'canal+yellow'],
    108 : [0, 'tvnoord'],
    109 : [0, 'omropfryslan'],
    114 : [0, 'omroepbrabant']}
    # A selection of user agents we will impersonate, in an attempt to be less
    # conspicuous to the tvgids.nl police.
    user_agents = [ 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)',
    'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.9) Gecko/20071025 Firefox/2.0.0.9',
    'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)',
    'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.7) Gecko/20060909 Firefox/1.5.0.7',
    'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)',
    'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.9) Gecko/20071105 Firefox/2.0.0.9',
    'Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en-US; rv:1.8.1.9) Gecko/20071025 Firefox/2.0.0.9',
    'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.8) Gecko/20071022 Ubuntu/7.10 (gutsy) Firefox/2.0.0.8'
    # Work in progress, the idea is to cache program categories and
    # descriptions to eliminate a lot of page fetches from tvgids.nl
    # for programs that do not have interesting/changing descriptions
    class ProgramCache:
    A cache to hold program name and category info.
    TVgids stores the detail for each program on a separate URL with an
    (apparently unique) ID. This cache stores the fetched info with the ID.
    New fetches will use the cached info instead of doing an (expensive)
    page fetch.
    def __init__(self, filename=None):
    Create a new ProgramCache object, optionally from file
    # where we store our info
    self.filename = filename
    if filename == None:
    self.pdict = {}
    else:
    if os.path.isfile(filename):
    self.load(filename)
    else:
    self.pdict = {}
    def load(self, filename):
    Loads a pickled cache dict from file
    try:
    self.pdict = pickle.load(open(filename,'r'))
    except:
    sys.stderr.write('Error loading cache file: %s (possibly corrupt)' % filename)
    sys.exit(2)
    def dump(self, filename):
    Dumps a pickled cache, and makes sure it is valid
    if os.access(filename, os.F_OK):
    try:
    os.remove(filename)
    except:
    sys.stderr.write('Cannot remove %s, check permissions' % filename)
    pickle.dump(self.pdict, open(filename+'.tmp', 'w'))
    os.rename(filename+'.tmp', filename)
    def query(self, program_id):
    Updates/gets/whatever.
    try:
    return self.pdict[program_id]
    except:
    return None
    def add(self, program):
    Adds a program
    self.pdict[program['ID']] = program
    def clear(self):
    Clears the cache (i.e. empties it)
    self.pdict = {}
    def clean(self):
    Removes all cached programming before today.
    Also removes erroneously cached programming.
    now = time.localtime()
    dnow = datetime.datetime(now[0],now[1],now[2])
    for key in self.pdict.keys():
    try:
    if self.pdict[key]['stop-time'] < dnow or self.pdict[key]['name'].lower() == 'onbekend':
    del self.pdict[key]
    except:
    pass
    def usage():
    print 'tv_grab_nl_py: A grabber that grabs tvguide data from tvgids.nl\n'
    print 'and stores it in XMLTV-combatible format.\n'
    print 'Usage:'
    print '--help, -h = print this info'
    print '--configure = create configfile (overwrites existing file)'
    print '--config-file = name of the configuration file (default = ~/.xmltv/tv_grab_py.conf'
    print '--capabilities = xmltv required option'
    print '--desc-length = maximum allowed length of programme descriptions in bytes.'
    print '--description = prints a short description of the grabber'
    print '--output = file where to put the output'
    print '--days = # number of days to grab'
    print '--preferredmethod = returns the preferred method to be called'
    print '--fast = do not grab descriptions of programming'
    print '--slow = grab descriptions of programming'
    print '--quiet = suppress all output'
    print '--compat = append tvgids.nl to the xmltv id (use this if you were using tv_grab_nl)'
    print '--logos 0/1 = insert urls to channel icons (mythfilldatabase will then use these)'
    print '--nocattrans = do not translate the grabbed genres into MythTV-genres'
    print '--cache = cache descriptions and use the file to store'
    print '--clean_cache = clean the cache file before fetching'
    print '--clear_cache = empties the cache file before fetching data'
    print '--slowdays = grab slowdays initial days and the rest in fast mode'
    print '--max_overlap = maximum length of overlap between programming to correct [minutes]'
    print '--overlap_strategy = what strategy to use to correct overlaps (check top of source code)'
    def filter_line_identity(m, defs=htmlentitydefs.entitydefs):
    # callback: translate one entity to its ISO Latin value
    k = m.group(1)
    if k.startswith("#") and k[1:] in xrange(256):
    return chr(int(k[1:]))
    try:
    return defs[k]
    except KeyError:
    return m.group(0) # use as is
    def filter_line(s):
    Removes unwanted stuff in strings (adapted from tv_grab_be)
    # do the latin1 stuff
    s = r_entity.sub(filter_line_identity, s)
    s = replace(s,'&nbsp;',' ')
    # Ik vermoed dat de volgende drie regels overbodig zijn, maar ze doen
    # niet veel kwaad -- Han Holl
    s = replace(s,'\r',' ')
    x = re.compile('(<.*?>)') # Udo
    s = x.sub('', s) #Udo
    s = replace(s, '~Q', "'")
    s = replace(s, '~R', "'")
    # Hmm, not sure if I understand this. Without it, mythfilldatabase barfs
    # on program names like "Steinbrecher &..."
    # We most create valid XML -- Han Holl
    s = saxutils.escape(s)
    return s
    def calc_timezone(t):
    Takes a time from tvgids.nl and formats it with all the required
    timezone conversions.
    in: '20050429075000'
    out:'20050429075000 (CET|CEST)'
    Until I have figured out how to correctly do timezoning in python this method
    will bork if you are not in a zone that has the same DST rules as 'Europe/Amsterdam'.
    year = int(t[0:4])
    month = int(t[4:6])
    day = int(t[6:8])
    hour = int(t[8:10])
    minute = int(t[10:12])
    #td = {'CET': '+0100', 'CEST': '+0200'}
    #td = {'CET': '+0100', 'CEST': '+0200', 'W. Europe Standard Time' : '+0100', 'West-Europa (standaardtijd)' : '+0100'}
    td = {0 : '+0100', 1 : '+0200'}
    pt = time.mktime((year,month,day,hour,minute,0,0,0,-1))
    timezone=''
    try:
    #timezone = time.tzname[(time.localtime(pt))[-1]]
    timezone = (time.localtime(pt))[-1]
    except:
    sys.stderr.write('Cannot convert time to timezone')
    return t+' %s' % td[timezone]
    def format_timezone(td):
    Given a datetime object, returns a string in XMLTV format
    tstr = td.strftime('%Y%m%d%H%M00')
    return calc_timezone(tstr)
    def get_page_internal(url, quiet=0):
    Retrieves the url and returns a string with the contents.
    Optionally, returns None if processing takes longer than
    the specified number of timeout seconds.
    txtdata = None
    txtheaders = {'Keep-Alive' : '300',
    'User-Agent' : user_agents[random.randint(0, len(user_agents)-1)] }
    try:
    #fp = urllib2.urlopen(url)
    rurl = urllib2.Request(url, txtdata, txtheaders)
    fp = urllib2.urlopen(rurl)
    lines = fp.readlines()
    page = "".join(lines)
    return page
    except:
    if not quiet:
    sys.stderr.write('Cannot open url: %s\n' % url)
    return None
    class FetchURL(Thread):
    A simple thread to fetch a url with a timeout
    def __init__ (self, url, quiet=0):
    Thread.__init__(self)
    self.quiet = quiet
    self.url = url
    self.result = None
    def run(self):
    self.result = get_page_internal(self.url, self.quiet)
    def get_page(url, quiet=0):
    Wrapper around get_page_internal to catch the
    timeout exception
    try:
    fu = FetchURL(url, quiet)
    fu.start()
    fu.join(global_timeout)
    return fu.result
    except:
    if not quiet:
    sys.stderr.write('get_page timed out on (>%s s): %s\n' % (global_timeout, url))
    return None
    def get_channels(file, quiet=0):
    Get a list of all available channels and store these
    in a file.
    # store channels in a dict
    channels = {}
    # tvgids stores several instances of channels, we want to
    # find all the possibile channels
    channel_get = re.compile('<optgroup label=.*?>(.*?)</optgroup>', re.DOTALL)
    # this is how we will find a (number, channel) instance
    channel_re = re.compile('<option value="([0-9]+)" >(.*?)</option>', re.DOTALL)
    # this is where we will try to find our channel list
    total = get_page(uitgebreid_zoeken, quiet)
    if total == None:
    return
    # get a list of match objects of all the <select blah station>
    stations = channel_get.finditer(total)
    # and create a dict of number, channel_name pairs
    # we do this this way because several instances of the
    # channel list are stored in the url and not all of the
    # instances have all the channels, this way we get them all.
    for station in stations:
    m = channel_re.finditer(station.group(0))
    for p in m:
    try:
    a = int(p.group(1))
    b = filter_line(p.group(2))
    channels[a] = b
    except:
    sys.stderr.write('Oops, [%s,%s] does not look like a valid channel, skipping it...\n' % (p.group(1),p.group(2)))
    # sort on channel number (arbitrary but who cares)
    keys = channels.keys()
    keys.sort()
    # and create a file with the channels
    f = open(file,'w')
    for k in keys:
    f.write("%s %s\n" % (k, channels[k]))
    f.close()
    def get_channel_all_days(channel, days, quiet=0):
    Get all available days of programming for channel number
    The output is a list of programming in order where each row
    contains a dictionary with program information.
    now = datetime.datetime.now()
    programs = []
    # Tvgids shows programs per channel per day, so we loop over the number of days
    # we are required to grab
    for offset in range(0, days):
    channel_url = 'http://www.tvgids.nl/zoeken/?d=%i&z=%s' % (offset, channel)
    # For historic purposes, the old style url that gave us a full week in advance:
    # channel_url = 'http://www.tvgids.nl/zoeken/?trefwoord=Titel+of+trefwoord&interval=0&timeslot='+\
    # '&station=%s&periode=%i&genre=&order=0' % (channel,days-1)
    # Sniff, we miss you...
    if offset > 0:
    time.sleep(random.randint(nice_time[0], nice_time[1]))
    # get the raw programming for the day
    total = get_page(channel_url, quiet)
    if total == None:
    return programs
    # Setup a number of regexps
    # checktitle will match the title row in H2 tags of the daily overview page, e.g.
    # <h2>zondag 19 oktober 2008</h2>
    checktitle = re.compile('<h2>(.*?)</h2>',re.DOTALL)
    # getrow will locate each row with program details
    getrow = re.compile('<a href="/programma/(.*?)</a>',re.DOTALL)
    # parserow matches the required program info, with groups:
    # 1 = program ID
    # 2 = broadcast times
    # 3 = program name
    parserow = re.compile('(.*?)/.*<span class="time">(.*?)</span>.*<span class="title">(.*?)</span>', re.DOTALL)
    # normal begin and end times
    times = re.compile('([0-9]+:[0-9]+) - ([0-9]+:[0-9]+)?')
    # Get the day of month listed on the page as well as the expected date we are grabbing and compare these.
    # If these do not match, we skip parsing the programs on the page and issue a warning.
    #dayno = int(checkday.search(total).group(1))
    title = checktitle.search(total)
    if title:
    title = title.group(1)
    dayno = title.split()[1]
    else:
    sys.stderr.write('\nOops, there was a problem with page %s. Skipping it...\n' % (channel_url))
    continue
    expected = now + datetime.timedelta(days=offset)
    if (not dayno.isdigit() or int(dayno) != expected.day):
    sys.stderr.write('\nOops, did not expect page %s to list programs for "%s", skipping it...\n' % (channel_url,title))
    continue
    # and find relevant programming info
    allrows = getrow.finditer(total)
    for r in allrows:
    detail = parserow.search(r.group(1))
    if detail != None:
    # default times
    start_time = None
    stop_time = None
    # parse for begin and end times
    t = times.search(detail.group(2))
    if t != None:
    start_time = t.group(1)
    stop_time = t.group(2)
    program_url = 'http://www.tvgids.nl/programma/' + detail.group(1) + '/'
    program_name = detail.group(3)
    # store time, name and detail url in a dictionary
    tdict = {}
    tdict['start'] = start_time
    tdict['stop'] = stop_time
    tdict['name'] = program_name
    if tdict['name'] == '':
    tdict['name'] = 'onbekend'
    tdict['url'] = program_url
    tdict['ID'] = detail.group(1)
    tdict['offset'] = offset
    #Add star rating if tipped by tvgids.nl
    tdict['star-rating'] = '';
    if r.group(1).find('Tip') != -1:
    tdict['star-rating'] = '4/5'
    # and append the program to the list of programs
    programs.append(tdict)
    # done
    return programs
    def make_daytime(time_string, offset=0, cutoff='00:00', stoptime=False):
    Given a string '11:35' and an offset from today,
    return a datetime object. The cuttoff specifies the point where the
    new day starts.
    Examples:
    In [2]:make_daytime('11:34',0)
    Out[2]:datetime.datetime(2006, 8, 3, 11, 34)
    In [3]:make_daytime('11:34',1)
    Out[3]:datetime.datetime(2006, 8, 4, 11, 34)
    In [7]:make_daytime('11:34',0,'12:00')
    Out[7]:datetime.datetime(2006, 8, 4, 11, 34)
    In [4]:make_daytime('11:34',0,'11:34',False)
    Out[4]:datetime.datetime(2006, 8, 3, 11, 34)
    In [5]:make_daytime('11:34',0,'11:34',True)
    Out[5]:datetime.datetime(2006, 8, 4, 11, 34)
    h,m = [int(x) for x in time_string.split(':')];
    hm = int(time_string.replace(':',''))
    chm = int(cutoff.replace(':',''))
    # check for the cutoff, if the time is before the cutoff then
    # add a day
    extra_day = 0
    if (hm < chm) or (stoptime==True and hm == chm):
    extra_day = 1
    # and create a datetime object, DST is handled at a later point
    pt = time.localtime()
    dt = datetime.datetime(pt[0],pt[1],pt[2],h,m)
    dt = dt + datetime.timedelta(offset+extra_day)
    return dt
    def correct_times(programs, quiet=0):
    Parse a list of programs as generated by get_channel_all_days() and
    convert begin and end times to xmltv compatible times in datetime objects.
    if programs == []:
    return programs
    # the start time of programming for this day, times *before* this time are
    # assumed to be on the next day
    day_start_time = '06:00'
    # initialise using the start time of the first program on this day
    if programs[0]['start'] != None:
    day_start_time = programs[0]['start']
    for program in programs:
    if program['start'] == program['stop']:
    program['stop'] = None
    # convert the times
    if program['start'] != None:
    program['start-time'] = make_daytime(program['start'], program['offset'], day_start_time)
    else:
    program['start-time'] = None
    if program['stop'] != None:
    program['stop-time'] = make_daytime(program['stop'], program['offset'], day_start_time, stoptime=True)
    # extra correction, needed because the stop time of a program may be on the next day, after the
    # day cutoff. For example:
    # 06:00 - 23:40 Long Program
    # 23:40 - 00:10 Lala
    # 00:10 - 08:00 Wawa
    # This puts the end date of Wawa on the current, instead of the next day. There is no way to detect
    # this with a single cutoff in make_daytime. Therefore, check if there is a day difference between
    # start and stop dates and correct if necessary.
    if program['start-time'] != None:
    # make two dates
    start = program['start-time']
    stop = program['stop-time']
    single_day = datetime.timedelta(1)
    startdate = datetime.datetime(start.year,start.month,start.day)
    stopdate = datetime.datetime(stop.year,stop.month,stop.day)
    if startdate - stopdate == single_day:
    program['stop-time'] = program['stop-time'] + single_day
    else:
    program['stop-time'] = None
    def parse_programs(programs, offset=0, quiet=0):
    Parse a list of programs as generated by get_channel_all_days() and
    convert begin and end times to xmltv compatible times.
    # good programs
    good_programs = []
    # calculate absolute start and stop times
    correct_times(programs, quiet)
    # next, correct for missing end time and copy over all good programming to the
    # good_programs list
    for i in range(len(programs)):
    # Try to correct missing end time by taking start time from next program on schedule
    if (programs[i]['stop-time'] == None and i < len(programs)-1):
    if not quiet:
    sys.stderr.write('Oops, "%s" has no end time. Trying to fix...\n' % programs[i]['name'])
    programs[i]['stop-time'] = programs[i+1]['start-time']
    # The common case: start and end times are present and are not
    # equal to each other (yes, this can happen)
    if programs[i]['start-time'] != None and \
    programs[i]['stop-time'] != None and \
    programs[i]['start-time'] != programs[i]['stop-time']:
    good_programs.append(programs[i])
    # Han Holl: try to exclude programs that stop before they begin
    for i in range(len(good_programs)-1,-1,-1):
    if good_programs[i]['stop-time'] <= good_programs[i]['start-time']:
    if not quiet:
    sys.stderr.write('Deleting invalid stop/start time: %s\n' % good_programs[i]['name'])
    del good_programs[i]
    # Try to exclude programs that only identify a group or broadcaster and have overlapping start/end times with
    # the actual programs
    for i in range(len(good_programs)-2,-1,-1):
    if good_programs[i]['start-time'] <= good_programs[i+1]['start-time'] and \
    good_programs[i]['stop-time'] >= good_programs[i+1]['stop-time']:
    if not quiet:
    sys.stderr.write('Deleting grouping/broadcaster: %s\n' % good_programs[i]['name'])
    del good_programs[i]
    for i in range(len(good_programs)-1):
    # PdB: Fix tvgids start-before-end x minute interval overlap. An overlap (positive or
    # negative) is halved and each half is assigned to the adjacent programmes. The maximum
    # overlap length between programming is set by the global variable 'max_overlap' and is
    # default 10 minutes. Examples:
    # Positive overlap (= overlap in programming):
    # 10:55 - 12:00 Lala
    # 11:55 - 12:20 Wawa
    # is transformed in:
    # 10:55 - 11.57 Lala
    # 11:57 - 12:20 Wawa
    # Negative overlap (= gap in programming):
    # 10:55 - 11:50 Lala
    # 12:00 - 12:20 Wawa
    # is transformed in:
    # 10:55 - 11.55 Lala
    # 11:55 - 12:20 Wawa
    stop = good_programs[i]['stop-time']
    start = good_programs[i+1]['start-time']
    dt = stop-start
    avg = start + dt / 2
    overlap = 24*60*60*dt.days + dt.seconds
    # check for the size of the overlap
    if 0 < abs(overlap) <= max_overlap*60:
    if not quiet:
    if overlap > 0:
    sys.stderr.write('"%s" and "%s" overlap %s minutes. Adjusting times.\n' % \
    (good_programs[i]['name'],good_programs[i+1]['name'],overlap / 60))
    else:
    sys.stderr.write('"%s" and "%s" have gap of %s minutes. Adjusting times.\n' % \
    (good_programs[i]['name'],good_programs[i+1]['name'],abs(overlap) / 60))
    # stop-time of previous program wins
    if overlap_strategy == 'stop':
    good_programs[i+1]['start-time'] = good_programs[i]['stop-time']
    # start-time of next program wins
    elif overlap_strategy == 'start':
    good_programs[i]['stop-time'] = good_programs[i+1]['start-time']
    # average the difference
    elif overlap_strategy == 'average':
    good_programs[i]['stop-time'] = avg
    good_programs[i+1]['start-time'] = avg
    # leave as is
    else:
    pass
    # Experimental strategy to make sure programming does not disappear. All programs that overlap more
    # than the maximum overlap length, but less than the shortest length of the two programs are
    # clumped.
    if do_clump:
    for i in range(len(good_programs)-1):
    stop = good_programs[i]['stop-time']
    start = good_programs[i+1]['start-time']
    dt = stop-start
    overlap = 24*60*60*dt.days + dt.seconds
    length0 = good_programs[i]['stop-time'] - good_programs[i]['start-time']
    length1 = good_programs[i+1]['stop-time'] - good_programs[i+1]['start-time']
    l0 = length0.days*24*60*60 + length0.seconds
    l1 = length1.days*24*60*60 + length0.seconds
    if abs(overlap) >= max_overlap*60 <= min(l0,l1)*60 and \
    not good_programs[i].has_key('clumpidx') and \
    not good_programs[i+1].has_key('clumpidx'):
    good_programs[i]['clumpidx'] = '0/2'
    good_programs[i+1]['clumpidx'] = '1/2'
    good_programs[i]['stop-time'] = good_programs[i+1]['stop-time']
    good_programs[i+1]['start-time'] = good_programs[i]['start-time']
    # done, nothing to see here, please move on
    return good_programs
    def get_descriptions(programs, program_cache=None, nocattrans=0, quiet=0, slowdays=0):
    Given a list of programs, from get_channel, retrieve program information
    # This regexp tries to find details such as Genre, Acteurs, Jaar van Premiere etc.
    detail = re.compile('<li>.*?<strong>(.*?):</strong>.*?<br />(.*?)</li>', re.DOTALL)
    # These regexps find the description area, the program type and descriptive text
    description = re.compile('<div class="description">.*?<div class="text"(.*?)<div class="clearer"></div>',re.DOTALL)
    descrtype = re.compile('<div class="type">(.*?)</div>',re.DOTALL)
    descrline = re.compile('<p>(.*?)</p>',re.DOTALL)
    # randomize detail requests
    nprograms = len(programs)
    fetch_order = range(0,nprograms)
    random.shuffle(fetch_order)
    counter = 0
    for i in fetch_order:
    counter += 1
    if programs[i]['offset'] >= slowdays:
    continue
    if not quiet:
    sys.stderr.write('\n(%3.0f%%) %s: %s ' % (100*float(counter)/float(nprograms), i, programs[i]['name']))
    # check the cache for this program's ID
    cached_program = program_cache.query(programs[i]['ID'])
    if (cached_program != None):
    if not quiet:
    sys.stderr.write(' [cached]')
    # copy the cached information, except the start/end times, rating and clumping,
    # these may have changed.
    tstart = programs[i]['start-time']
    tstop = programs[i]['stop-time']
    rating = programs[i]['star-rating']
    try:
    clump = programs[i]['clumpidx']
    except:
    clump = False
    programs[i] = cached_program
    programs[i]['start-time'] = tstart
    programs[i]['stop-time'] = tstop
    programs[i]['star-rating'] = rating
    if clump:
    programs[i]['clumpidx'] = clump
    continue
    else:
    # be nice to tvgids.nl
    time.sleep(random.randint(nice_time[0], nice_time[1]))
    # get the details page, and get all the detail nodes
    descriptions = ()
    details = ()
    try:
    if not quiet:
    sys.stderr.write(' [normal fetch]')
    total = get_page(programs[i]['url'])
    details = detail.finditer(total)
    descrspan = description.search(total);
    descriptions = descrline.finditer(descrspan.group(1))
    except:
    # if we cannot find the description page,
    # go to next in the loop
    if not quiet:
    sys.stderr.write(' [fetch failed or timed out]')
    continue
    # define containers
    programs[i]['credits'] = {}
    programs[i]['video'] = {}
    # now parse the details
    line_nr = 1;
    # First, we try to find the program type in the description section.
    # Note that this is not the same as the generic genres (these are searched later on), but a more descriptive one like "Culinair programma"
    # If present, we store this as first part of the regular description:
    programs[i]['detail1'] = descrtype.search(descrspan.group(1)).group(1).capitalize()
    if programs[i]['detail1'] != '':
    line_nr = line_nr + 1
    # Secondly, we add one or more lines of the program description that are present.
    for descript in descriptions:
    d_str = 'detail' + str(line_nr)
    programs[i][d_str] = descript.group(1)
    # Remove sponsored link from description if present.
    sponsor_pos = programs[i][d_str].rfind('<i>Gesponsorde link:</i>')
    if sponsor_pos > 0:
    programs[i][d_str] = programs[i][d_str][0:sponsor_pos]
    programs[i][d_str] = filter_line(programs[i][d_str]).strip()
    line_nr = line_nr + 1
    # Finally, we check out all program details. These are generically denoted as:
    # <li><strong>(TYPE):</strong><br />(CONTENT)</li>
    # Some examples:
    # <li><strong>Genre:</strong><br />16 oktober 2008</li>
    # <li><strong>Genre:</strong><br />Amusement</li>
    for d in details:
    type = d.group(1).strip().lower()
    content_asis = d.group(2).strip()
    content = filter_line(content_asis).strip()
    if content == '':
    continue
    elif type == 'genre':
    # Fix detection of movies based on description as tvgids.nl sometimes
    # categorises a movie as e.g. "Komedie", "Misdaadkomedie", "Detectivefilm".
    genre = content;
    if (programs[i]['detail1'].lower().find('film') != -1 \
    or programs[i]['detail1'].lower().find('komedie') != -1)\
    and programs[i]['detail1'].lower().find('tekenfilm') == -1 \
    and programs[i]['detail1'].lower().find('animatiekomedie') == -1 \
    and programs[i]['detail1'].lower().find('filmpje') == -1:
    genre = 'film'
    if nocattrans:
    programs[i]['genre'] = genre.title()
    else:
    try:
    programs[i]['genre'] = cattrans[genre.lower()]
    except:
    programs[i]['genre'] = ''
    # Parse persons and their roles for credit info
    elif roletrans.has_key(type):
    programs[i]['credits'][roletrans[type]] = []
    persons = content_asis.split(',');
    for name in persons:
    if name.find(':') != -1:
    name = name.split(':')[1]
    if name.find('-') != -1:
    name = name.split('-')[0]
    if name.find('e.a') != -1:
    name = name.split('e.a')[0]
    programs[i]['credits'][roletrans[type]].append(filter_line(name.strip()))
    elif type == 'bijzonderheden':
    if content.find('Breedbeeld') != -1:
    programs[i]['video']['breedbeeld'] = 1
    if content.find('Zwart') != -1:
    programs[i]['video']['blackwhite'] = 1
    if content.find('Teletekst') != -1:
    programs[i]['teletekst'] = 1
    if content.find('Stereo') != -1:
    programs[i]['stereo'] = 1
    elif type == 'url':
    programs[i]['infourl'] = content
    else:
    # In unmatched cases, we still add the parsed type and content to the program details.
    # Some of these will lead to xmltv output during the xmlefy_programs step
    programs[i][type] = content
    # do not cache programming that is unknown at the time
    # of fetching.
    if programs[i]['name'].lower() != 'onbekend':
    program_cache.add(programs[i])
    if not quiet:
    sys.stderr.write('\ndone...\n\n')
    # done
    def title_split(program):
    Some channels have the annoying habit of adding the subtitle to the title of a program.
    This function attempts to fix this, by splitting the name at a ': '.
    if (program.has_key('titel aflevering') and program['titel aflevering'] != '') \
    or (program.has_key('genre') and program['genre'].lower() in ['movies','film']):
    return
    colonpos = program['name'].rfind(': ')
    if colonpos > 0:
    program['titel aflevering'] = program['name'][colonpos+1:len(program['name'])].strip()
    program['name'] = program['name'][0:colonpos].strip()
    def xmlefy_programs(programs, channel, desc_len, compat=0, nocattrans=0):
    Given a list of programming (from get_channels())
    returns a string with the xml equivalent
    output = []
    for program in programs:
    clumpidx = ''
    try:
    if program.has_key('clumpidx'):
    clumpidx = 'clumpidx="'+program['clumpidx']+'"'
    except:
    print program
    output.append(' <programme start="%s" stop="%s" channel="%s%s" %s> \n' % \
    (format_timezone(program['start-time']), format_timezone(program['stop-time']),\
    channel, compat and '.tvgids.nl' or '', clumpidx))
    output.append(' <title lang="nl">%s</title>\n' % filter_line(program['name']))
    if program.has_key('titel aflevering') and program['titel aflevering'] != '':
    output.append(' <sub-title lang="nl">%s</sub-title>\n' % filter_line(program['titel aflevering']))
    desc = []
    for detail_row in ['detail1','detail2','detail3']:
    if program.has_key(detail_row) and not re.search('[Gg]een detailgegevens be(?:kend|schikbaar)', program[detail_row]):
    desc.append('%s ' % program[detail_row])
    if desc != []:
    # join and remove newlines from descriptions
    desc_line = "".join(desc).strip()
    desc_line.replace('\n', ' ')
    if len(desc_line) > desc_len:
    spacepos = desc_line[0:desc_len-3].rfind(' ')
    desc_line = desc_line[0:spacepos] + '...'
    output.append(' <desc lang="nl">%s</desc>\n' % desc_line)
    # Process credits section if present.
    # This will generate director/actor/presenter info.
    if program.has_key('credits') and program['credits'] != {}:
    output.append(' <credits>\n')
    for role in program['credits']:
    for name in program['credits'][role]:
    if name != '':
    output.append(' <%s>%s</%s>\n' % (role, name, role))
    output.append(' </credits>\n')
    if program.has_key('jaar van premiere') and program['jaar van premiere'] != '':
    output.append(' <date>%s</date>\n' % program['jaar van premiere'])
    if program.has_key('genre') and program['genre'] != '':
    output.append(' <category')
    if nocattrans:
    output.append(' lang="nl"')
    output.append ('>%s</category>\n' % program['genre'])
    if program.has_key('infourl') and program['infourl'] != '':
    output.append(' <url>%s</url>\n' % program['infourl'])
    if program.has_key('aflevering') and program['aflevering'] != '':
    output.append(' <episode-num system="onscreen">%s</episode-num>\n' % filter_line(program['aflevering']))
    # Process video section if present
    if program.has_key('video') and program['video'] != {}:
    output.append(' <video>\n');
    if program['video'].has_key('breedbeeld'):
    output.append(' <aspect>16:9</aspect>\n')
    if program['video'].has_key('blackwhite'):
    output.append(' <colour>no</colour>\n')
    output.append(' </video>\n')
    if program.has_key('stereo'):
    output.append(' <audio><stereo>stereo</stereo></audio>\n')
    if program.has_key('teletekst'):
    output.append(' <subtitles type="teletext" />\n')
    # Set star-rating if applicable
    if program['star-rating'] != '':
    output.append(' <star-rating><value>%s</value></star-rating>\n' % program['star-rating'])
    output.append(' </programme>\n')
    return "".join(output)
    def main():
    # Parse command line options
    try:
    opts, args = getopt.getopt(sys.argv[1:], "h", ["help", "output=", "capabilities",
    "preferredmethod", "days=",
    "configure", "fast", "slow",
    "cache=", "clean_cache",
    "slowdays=","compat",
    "desc-length=","description",
    "nocattrans","config-file=",
    "max_overlap=", "overlap_strategy=",
    "clear_cache", "quiet","logos="])
    except getopt.GetoptError:
    usage()
    sys.exit(2)
    # DEFAULT OPTIONS - Edit if you know what you are doing
    # where the output goes
    output = None
    output_file = None
    # the total number of days to fetch
    days = 6
    # Fetch data in fast mode, i.e. do NOT grab all the detail information,
    # fast means fast, because as it then does not have to fetch a web page for each program
    # Default: fast=0
    fast = 0
    # number of days to fetch in slow mode. For example: --days 5 --slowdays 2, will
    # fetch the first two days in slow mode (with all the details) and the remaining three
    # days in fast mode.
    slowdays = 6
    # no output
    quiet = 0
    # insert url of channel logo into the xml data, this will be picked up by mythfilldatabase
    logos = 1
    # enable this option if you were using tv_grab_nl, it adjusts the generated
    # xmltvid's so that everything works.
    compat = 0
    # enable this option if you do not want the tvgids categories being translated into
    # MythTV-categories (genres)
    nocattrans = 0
    # Maximum number of characters to use for program description.
    # Different values may work better in different versions of MythTV.
    desc_len = 475
    # default configuration file locations
    hpath = ''
    if os.environ.has_key('HOME'):
    hpath = os.environ['HOME']
    # extra test for windows users
    elif os.environ.has_key('HOMEPATH'):
    hpath = os.environ['HOMEPATH']
    # hpath = ''
    xmltv_dir = hpath+'/.xmltv'
    program_cache_file = xmltv_dir+'/program_cache'
    config_file = xmltv_dir+'/tv_grab_nl_py.conf'
    # cache the detail information.
    program_cache = None
    clean_cache = 1
    clear_cache = 0
    # seed the random generator
    random.seed(time.time())
    for o, a in opts:
    if o in ("-h", "--help"):
    usage()
    sys.exit(1)
    if o == "--quiet":
    quiet = 1;
    if o == "--description":
    print "The Netherlands (tv_grab_nl_py $Rev: 104 $)"
    sys.exit(0)
    if o == "--capabilities":
    print "baseline"
    print "cache"
    print "manualconfig"
    print "preferredmethod"
    sys.exit(0)
    if o == '--preferredmethod':
    print 'allatonce'
    sys.exit(0)
    if o == '--desc-length':
    # Use the requested length for programme descriptions.
    desc_len = int(a)
    if not quiet:
    sys.stderr.write('Using description length: %d\n' % desc_len)
    for o, a in opts:
    if o == "--config-file":
    # use the provided name for configuration
    config_file = a
    if not quiet:
    sys.stderr.write('Using config file: %s\n' % config_file)
    for o, a in opts:
    if o == "--configure":
    # check for the ~.xmltv dir
    if not os.path.exists(xmltv_dir):
    if not quiet:
    sys.stderr.write('You do not have the ~/.xmltv directory,')
    sys.stderr.write('I am going to make a shiny new one for you...')
    os.mkdir(xmltv_dir)
    if not quiet:
    sys.stderr.write('Creating config file: %s\n' % config_file)
    get_channels(config_file)
    sys.exit(0)
    if o == "--days":
    # limit days to maximum supported by tvgids.nl
    days = min(int(a),6)
    if o == "--compat":
    compat = 1
    if o == "--nocattrans":
    nocattrans = 1
    if o == "--fast":
    fast = 1
    if o == "--output":
    output_file = a
    try:
    output = open(output_file,'w')
    # and redirect output
    if debug:
    debug_file = open('/tmp/kaas.xml','w')
    blah = redirect.Tee(output, debug_file)
    sys.stdout = blah
    else:
    sys.stdout = output
    except:
    if not quiet:
    sys.stderr.write('Cannot write to outputfile: %s\n' % output_file)
    sys.exit(2)
    if o == "--slowdays":
    # limit slowdays to maximum supported by tvgids.nl
    slowdays = min(int(a),6)
    # slowdays implies fast == 0
    fast = 0
    if o == "--logos":
    logos = int(a)
    if o == "--clean_cache":
    clean_cache = 1
    if o == "--clear_cache":
    clear_cache = 1
    if o == "--cache":
    program_cache_file = a
    if o == "--max_overlap":
    max_overlap = int(a)
    if o == "--overlap_strategy":
    overlap_strategy = a
    # get configfile if available
    try:
    f = open(config_file,'r')
    except:
    sys.stderr.write('Config file %s not found.\n' % config_file)
    sys.stderr.write('Re-run me with the --configure flag.\n')
    sys.exit(1)
    #check for cache
    program_cache = ProgramCache(program_cache_file)
    if clean_cache != 0:
    program_cache.clean()
    if clear_cache != 0:
    program_cache.clear()
    # Go!
    channels = {}
    # Read the channel stuff
    for blah in f.readlines():
    blah = blah.lstrip()
    blah = blah.replace('\n','')
    if blah:
    if blah[0] != '#':
    channel = blah.split()
    channels[channel[0]] = " ".join(channel[1:])
    # channels are now in channels dict keyed on channel id
    # print header stuff
    print '<?xml version="1.0" encoding="ISO-8859-1"?>'
    print '<!DOCTYPE tv SYSTEM "xmltv.dtd">'
    print '<tv generator-info-name="tv_grab_nl_py $Rev: 104 $">'
    # first do the channel info
    for key in channels.keys():
    print ' <channel id="%s%s">' % (key, compat and '.tvgids.nl' or '')
    print ' <display-name lang="nl">%s</display-name>' % channels[key]
    if (logos):
    ikey = int(key)
    if logo_names.has_key(ikey):
    full_logo_url = logo_provider[logo_names[ikey][0]]+logo_names[ikey][1]+'.gif'
    print ' <icon src="%s" />' % full_logo_url
    print ' </channel>'
    num_chans = len(channels.keys())
    channel_cnt = 0
    if program_cache != None:
    program_cache.clean()
    fluffy = channels.keys()
    nfluffy = len(fluffy)
    for id in fluffy:
    channel_cnt += 1
    if not quiet:
    sys.stderr.write('\n\nNow fetching %s(xmltvid=%s%s) (channel %s of %s)\n' % \
    (channels[id], id, (compat and '.tvgids.nl' or ''), channel_cnt, nfluffy))
    info = get_channel_all_days(id, days, quiet)
    blah = parse_programs(info, None, quiet)
    # fetch descriptions
    if not fast:
    get_descriptions(blah, program_cache, nocattrans, quiet, slowdays)
    # Split titles with colon in it
    # Note: this only takes place if all days retrieved are also grabbed with details (slowdays=days)
    # otherwise this function might change some titles after a few grabs and thus may result in
    # loss of programmed recordings for these programs.
    if slowdays == days:
    for program in blah:
    title_split(program)
    print xmlefy_programs(blah, id, desc_len, compat, nocattrans)
    # save the cache after each channel fetch
    if program_cache != None:
    program_cache.dump(program_cache_file)
    # be nice to tvgids.nl
    time.sleep(random.randint(nice_time[0], nice_time[1]))
    if program_cache != None:
    program_cache.dump(program_cache_file)
    # print footer stuff
    print "</tv>"
    # close the outputfile if necessary
    if output != None:
    output.close()
    # and return success
    sys.exit(0)
    # allow this to be a module
    if __name__ == '__main__':
    main()
    # vim:tw=0:et:sw=4
    [cedric@tv ~]$
    Best regards,
    Cedric
    Last edited by cdwijs (2010-11-04 18:44:51)

    Running the script by python2 solves it for me:
    su - mythtv -c "nice -n 19 python2 /usr/bin/tv_grab_nl_py --output ~/listings.xml"
    Best regards,
    Cedric

  • Still rendered in FCP 6 looks worse than preview???

    I'm importing a still from Photoshop (CS1) into FCP 6. It's a PICT file w/ alpha channel (logo). When I slap the logo on top of my video it looks clean and sharp. But, when I render the clip, it comes out looking rasterized and I loose my smooth edges. My PICT file is 720x480 and I'm importing to a DV/NTSC 4:3 sequence. I've tried both a square pixel aspect and a D1/DV NTSC .9 ratio in Phsp but the end results are the same- crappy.
    How do I maintain my clean, crisp logo in FCP?
    ~reicko

    It isn't FCP that is messing up your logo, its the DV codec. Hence the reason people spend all the money on 4:2:2 Uncompressed 10-bit equipment.
    That being said, there are some things you can do. First, make sure you are looking at a video monitor that is atched to your deck. What you see on your computer screen is not how the actual video will appear. So it might not be as bad as what you see on your computer screen. If it still bothers you then you might add a slight gaussian blur to "blend" it better into the video.
    Message was edited by: Shawn Birmingham

  • Monetizing OS X and other Apple software tutorials on Youtube?

    Hello community!
    I have a howto video of OS X Lion up on Youtube that has reached almost 60,000 views and I plan to do lots more, because there often seem to be things that somebody hasn't done a video on and I simply like making howtos. Also, I'm a student, so any few extra bucks would be welcome.
    Back on topic though, is it possible to monetize videos on Youtube that I have used OS X in to demonstrate how things are done?
    I'm aware I must not allow the impression it's an official Apple video or endorsed by Apple, so beyond that, am I good to go?
    And does this apply to all software Apple provides? I'd love sparing the forum asking this everytime I decide to record something new that might not be the base OS X install, but instead maybe an iPhoto tutorial or whathaveyou.
    I tried searching the internet and the forums here, but to no avail.
    Thanks a lot in advance folks!

    This is my feeling, too, however I really don't want a bad Youtube account standing so I need something that I can show Youtube in the event the legality of my monetization gets questioned either by them or a 3rd party. (could be a troll, you know stuff like that is happening)
    Thanks for the quick reply so far though, it's nice to know my feeling doesn't seem to be too off with what others estimate to be good to go.
    And about "not using Apple logos or other copyrighted materials":
    This is borderline impossible, as what I'm recording is basically going to show the Apple logo sooner or later (Menu Bar for example) and being a Youtube partner I'd love making a custom preview image for the video which would of course need to depict what I'm showing (e.g. OS X's logo) for obvious reasons.
    Would that be okay?
    I know I cannot use the logos as channel logo or anything, at least not the official ones. (Nobody could stop me from snapping a pic of a real apple and slapping that on my channel icon )
    Again, thanks so far.

  • 20" Widescreen display has weird lines after any movement of the cursor

    there are groups of blue and red elongated dots (sets of 8) staggered horizontally on the screen, a few persistent and some that seem temporary but occur after any activity on the monitor (e.g. drag a folder or screen)
    Some go away after a reboot, but reappear with new activity. Can anyone help?

    I looked for you I would first go to System Preferences. Click on DIsplay you will see numbers under Resolutions go all they way to the bottom it should say 1680 X 1050 Hi light that on the 20inch Apple Cinema Displays. Next to where Display was is Color click that you flow the expert instructions
    You will see only Cinema Display when done it will auto name it Cinema Display Calibrated
    Check your DVI cable & GPU as could be loose
    Instructions
    To fix a stuck pixel
    Increase your display resolution setting to the maximum supported by your screen. Launch the JScreenFix applet (below) and position the window over the stuck pixel. After 5 minutes move the window and observe the results. If the pixel remains stuck, repeat. From extensive testing, most stuck pixels are repaired in less than 20 minutes. If a stuck pixel remains after running JScreenFix for 20 minutes it probably can not be fixed by JScreenFix. You might like to try a pixel massage. Sometimes stuck pixels return after a period of time, JScreenFix deluxe can automatically repair reoccurring stuck pixels when you are not using your computer.
    To reduce screen burn-in
    Disable your screen saver. Launch the JScreenFix applet (below) and enter fullscreen mode. This is achieved by pressing F11 in most browsers, if this fails you will need to consult the documentation for your Internet browser. It is important that JScreenFix fills the screen fully or you may suffer additional unequal burn-in. Leave the applet running for about an hour and observe the results. If you notice an improvement, continue running JScreenFix until the burn-in is more acceptable.
    Please note that completely removing screen burn-in is impossible but it will fade with time. The only way to equalise a screen image is to burn-in the parts of the screen that have had less use. JScreenFix deluxe is a preventative measure that monitors screen usage and equalises the screen when you are not using your computer.
    Click on the link to launch It made my Apple Display look better
    http://www.jscreenfix.com/applet.php?width=1680&height=1050
    Screen burn, image retention and recalibrating pixels
    Static, non-moving images left on-screen for extended periods of time can leave a "shadow” on , lcd displays (this is true of models from all manufacturers)
    You are normally told to avoid extended display of static images. Games consoles can also have a negative effect on panels.
    PixelProtector™ will recalibrate pixels uniformly and remove any residual effects that may have occurred.
    TV channels that have a static logo permanently on screen have a real negative effect on lcd TV’s and displays. Pixels begin to memorise these images, upon switching channels you will still see the logo in the form of a shadow. After several minutes it will disappear (If not you have burn in). If 99% of the shadow has disappeared you will not notice the 1% that remains. It is the continual build up of the 1%’s that is called residual effect. Not just restricted to TV channel logos. It’s build up over months and even years will lessen the picture quality of you TV. The issues with screen burn and residual effects are far more complex however we have tried to simplify its cause and effect for obvious reasons.
    PixelProtector™ can remove burn in and residual effects. It uses a wash tools that switch pixels on and off at a very fast rate (this is not in any way harmful). Included is a white wash for lesser burn in and image fix. In other words it recalibrates the pixels uniformly by removing any memory they may have.
    There are different types and levels of burn in. The most severe of which occurs in the first 200 hrs of the panel's life when pixels are at there most excitable. In this time frame pixels can permanently memorise static images that have been left on screen for prolonged periods.
    We have many customers who have removed screen burn from their panels by using the removal tool regularly, as per the instructions in the DVD.
    In many cases it can be removed after just one session.
    If the burn in is not removed first time, it will have been significantly reduced. Don’t forget it is easier to prevent burn in then it is to remove it!
    Dead Pixels
    Dead Pixels occur when the individual cells burn out or do not energise correctly, PixelProtector™ DVD Edition can help diagnose and in some cases re-energise dead pixels to help you get the very best out of your screen.
    Many manufactures believe that 3 drop outs are acceptable. We believe even 1 drop out is unacceptable.
    With plasma TV’s a dead pixel will appear black with LCD it may have only lost one wavelength and is only visible when certain colours are on screen. When you buy a new panel it is worth investing in a copy of PixelProtector DVD as some panel may have a drop out from the factory. Your best opportunity to have the panel replaced is when it is new.
    User Friendly
    PixelProtector™ has been developed with home users in mind. During its development stage one of the main obstacles we had to over come was insuring every one could use it (not just engineers and techno buffs). We tested the DVD on many groups of people whose feedback was invaluable in making PixelProtector™ the best product in the market.
    We back up our product with full on-line support and help for all our customers.
    PixelProtector™ provides a real user friendly solution to making sure your TV is performing to its full potential and that you are getting the best out of your equipment. It easy to use all you need is a DVD player! So click here https://www.pixelprotector.com/screen-cleaner.php
    One of the biggest problems with monitors is most people never calibrate them and just use themstraight out of the box, a lot of people don’t even use their drivers disks. If a disk came with yourmonitor, even if it claims to be plug-and-play, use the hardware setup and install it, it gives you allthe correct refresh rates and color depths and screen resolutions possible. This allows getting themost out of the monitor while preventing damage. Also the hardware setup may create an ICCmonitor profile that Windows or the Mac OS can use with its Color Management System, ICM for Windows and ColorSync for Mac. While generally better than nothing, keep in mind it is a generic ICC profile, it can only assume average ambient conditions that are not likely to be yours
    Common issues with LCD screens include:
    Trailing or blocking effect on screen (pixilation)
    Pixel drop out
    Unnatural image blacks are dark grey
    How PixelProtector™ can help resolve these issues:
    Trailing can bee seen on some panels when bit rate levels are high.
    High bit rate levels are normally reached when watching fast action scenes in movies or programs, the image starts to trail or lag and even blocking in some cases.
    PixelProtector™ will help to minimize or even eliminate trailing buy calibrating your panel correctly and insuring you have the right settings and connection in place.
    Pixel drop outs are one of the most frustrating of issues for anyone who has an LCD. When a screen suffers from pixel drop it can be fixed in some occasions. If the whole pixel is dead then nothing can be done to fix this. If one wave length has gone in the pixel i.e. blue. This can in some cases this can be fixed by recalibrating pixel color production using PixelProtector™.
    We have a 4 in 10 chance of fixing the problem.
    The DVD will highlight if the whole pixel is dead or if one wave length has gone.
    One of the biggest issues LCD’s have is producing pure black. LCD panels produce a pure white light and then subtract the colors that are not required. So to produce black is difficult, making sure that you first calibrate its black and white setting is essential to minimize this issue and get the best from your panel PixelProtector™ includes specific tests and adjustment screens for this purpose.
    I know Apple has help me in the past by telling me to make a 100% White pure white screen saver overnight.
    I hope I was of help.

  • How do I turn off  all those visual effects when I play music?

    I dont really want or need those special effects when I play music.(All that panning in or mirroring of the album artwork, sometimes it even switches sides!) I would even prefer to see the Artwork of the music being played, but perhaps just smaller and static on the moniter screen... All this beautifull technology is just wasted on me! How can I deactivate this feature?

    Sorry to say you can't disable it.
    The swinging artwork gets tedious after a few minutes - more relaxing to turn the TV off!
    I generally set the album artwork screensaver to kick in after a few minutes - it's a more relaxed screensaver than the currently playing album effect, but some more options during playback would not go amiss, particularly an iTunes like visualiser.
    I think on balance that's better than only having a static image option as there are risks of screen burn especially for plasma owners with static images (my LG LCD TV even gets image retention issues with satellite channel logos!)
    AC

  • Our podcast shows black thumbnails on iPod Podcasts screen

    Our podcast shows black thumbnails on iPod Podcasts screen, im not talking about the channels logo here, that works fine.
    It's when you have subscribed to the feed and the podcasts are downloaded to your Apple mobile device and you view your podcasts on screen, down the left it has little video thumbnails of the episodes.
    In my case apart from one episode they all show a black video thumbnail and I want to show our logo or ideally a frame from that episode say 5 seconds in would do.
    Thanks for any help.
    Podcast URL: http://www.beddysblog.com/podcast/supercarspin/supercarspin.xml

    I don't know exactly how the iPod works in this context: in iTunes, when subscribing, the image you see for each episode is either the first chapter image of an 'enhanced' podcast or an image which has been embedded in the file. I don't know what it does with movie files - possibly the first frame. You could subscribe in iTunes on your PC and see what shows there.
    In any event, you should be able to embed an image of your choice in each file (you would then need to re-upload it). The method is described here:
    http://homepage.mac.com/rfwilmut/notes/faq.html#coverart

Maybe you are looking for

  • Bring to the PR the price from Info-Record

    Hello experts, If I am working with info-records that are created automatically when doing the PO with the price of last PO, I would like to bring this price to the PR when doing for the same material and vendor. Is it possible? I only get the price

  • Chinese Characters not displaying properly

    I pasted Chinese text into a Rolling title but not all of the characters display.  Some (not many) of them display as an x inside of a square.  All I can think is that some of the characters are not being recognized. If it matters, the text is simpli

  • How can I buy the whosehere gifts

    there is a gifts in whoseher I can't buy it, it show me this message " Please contact iTunes support to copmlete this transaction " when I'm trying to buy the gifts So, could you help me to get red of this problem my account recharged with iTunes car

  • Integrate Oracle EBS R12 with third party Fax

    Hi, We are trying to integrate Oracle EBS R12 with third party Fax. Can anyone share any documents stating the high level solution approach for this kind of integrations? Please send me any docs on --> [email protected] Thanks Suman

  • Outlook express and blackberry

    Hi - I am new to blackberry and I am sure you have all figured this out but I need some help. I use outlook for my calendar but only that. I use outlook express for my email and addresses.  I currently have my outlook calendar, memo, tasks, etc all s