FormsCentral zou een heel goed programma kunnen zijn, maar ...

Helaas ontbreken er belangrijke items in het systeem. Zo is er geen capta of een andere vorm voor het veilig verzenden van een formulier aanwezig. De e-mail die je na het invullen van een formulier ontvangt heeft een Adobe-stijl, met onderaan reclame. Dat wil ik niet!! Ik wil een neutrale e-mail die ik ook aan mijn klanten kan sturen. Nu kan dat niet.
Verder is het niet mogelijk om de verzendknop te stijlen.
Er zijn nog meer gebreken, maar dit zijn voor mij (en ik weet ook zeker voor anderen) de belangrijkste.
Het is nét niet af. Ik hoop dat Adobe begrijpt dat het een betaalde service is en dat wij als klant dan ook waar voor ons geld krijgen. Met een klein beetje meer extra inzet van Adobe kan FormsCentral een uitstekend systeem zijn.

Hi;
Bedankt voor uw feedback, de faciliteiten die vermeld zijn eerder gevraagd en worden genoteerd. Wij waarderen de feedback.
Thanks,
josh
PS - Ik gebruik Google Translate

Similar Messages

  • Dus ik zou een vervangende Iphone krijgen op het moment dat UPS mijn Iphone komt halen, niet gebeurt, Iphone 4S nu naar de reperatie centrum, en de beloftes die zijn gemaakt zijn niet nagekomen. Wat nu?

    Pffff
    Mij werd belooft dat ik een Nieuw toestel terplekke toegestuurd zou krijgen en dat ik zelf de andere Iphone 4s zou moeten retouren,
    nu komt UPS aan mijn deur en vraagt om mijn Iphone 4s..
    Geen vervangend toestel..
    Well done Apple, well done..

    Ik kan nu niet bellen, en Apple heeft geen e-mail adress..
    Ik heb de E-mail van een van de medewerkers, maar die reageert niet ..

  • Adobe suite 3 cs

    Mijne heren,
    Ik wend me tot jullie om te trachten een probleem op te lossen met Adobe PDF professional.
    Ik ben onlangs van XP overgestapt naar Windows 8.1 op een nieuwe PC.
    IK heb de suite cs3 gedeactiveerd en op mijn nieuwe PC weer geïnstalleerd.. Ik kan het eigenlijk niet meer missen.
    Alles gaat goed behalve PDF. Hier krijg ik een melding dat ik iets uit Vista moet downloaden te.
    “het adobe pdf dll op windows Vista-ROM is nodig.”
    Daar ik geen Vista heb gehad maar XP heb ik de cd-rom niet.
    Is er op een andere wijze aan dit bestandje te komen en op een goede wijze te installeren?
    Ik zou er heel erg mee geholpen zijn en heb goede ervaringen met Adobe.
    Daarom vertrouw ik er op dat er een oplossing mogelijk is.
    Alvast bedankt voor de geboden service.
     Groeten van Gerard Nibbelke

    This forum is only to discuss how the forums operate, not products
    If you go to the Forums Index http://forums.adobe.com/index.jspa
    You will be able to select a forum for the Adobe product(s) you use
    When you find the correct forum for Adobe Acrobat, there is no such thing as "Windows XP 8.1" on a new PC... but there IS a Windows 8.1

  • Interne voeding

    Hallo
    laptop kleinkind te hard dicht geslagen en barsten in scherm.Dan heb ik zelf willen kijken, legde laptop aan en kreeg een flikkerend beeld gedurende enkele seconden en dan sloeg pc uit.Dit gebeurde met batterijvoeding.
    Nu dacht ik dat batterij leeg was en met het aansluiten van de  lader gebeurde er helemaal niets! Geen enkel led brande en zwart scherm. Ook niet met op de aan/uitschakelaar te drukken.
    daarom denk ik dat de inwendige voeding ook  defekt is.Deze laptop is al 2x terug binnengebracht bij verkoper voor defekte interne voeding maar toen was er garantie, maar deze moet nu wel enkele maanden vervallen zijn.
    Zou dit opnieuw hetzelfde probleem kunnen zijn,of weet iemand meer?
    En waar zit die interne voding en is dit gemakkelijk zelf te herstellen.
    Dank

    Hier terug pandora60391
    Hier een aanpassing bericht:
    Ik heb een andere voeding geprobeerd  die maar 0,5V minder aangeeft als output, maar pc starte terug met  aan/uit knop. een paar  keer geprobeerd kabeltje eruit en terug in en het is opnieuw hetzelfde : pc slaat niet aan Eigenaardig genoeg meet ik opdeze adapter maar ongeveer 10V en niet stabiel.Als ik deze adapter probeer op zijn originele  laptop lukt het wel, dus eerst batterij verwijderd.Maar met de originele adapter van pc die niet werkt en deze geeft exact juiste spanning aan met V meter gemeten op het stekkertje lukt het nooit, wel moet ik erbij aan toevoegen dat ik het connectertje zelf heb moeten terug solderen omdat drade losgekomen waren. 

  • De proefversie van lightroom 5

    ik heb de proefversie van lightroom 5 geinstalleerd, mijn pc werkt met vista,
    ik heb een paar foto's kunnen toevoegen maar er is geen mogelijkheid mijn foto's te kunnen bewerken,

    De minimum systeem vereisten voor LR 5 zijn:
    http://www.adobe.com/be_en/products/photoshop-lightroom/tech-specs.html.
    Dus geen Windows Vista.
    Frans

  • Is er iemand die Nederlands spreekt. Heb een probleem met Creative Cloud Set up.

    Ik krijg onderstaand foutmelding en kan daardoor niet updaten.
    Het zou fijn zijn als ik in het Nederlands respons krijg.
    Zit inmiddels met mijn handen in het haar ...

    Hello (Een experiment in de Nederlandse taal met behulp van Google)
    In dit geval heb ik een heel nieuwe proefversie van uw programma ('s) in kwestie zou downloaden en te wijzigen / ze in een "echte" versie later, maar omdat je zei, dat je' re-installed "al, dus het word een beetje ingewikkeld. Het zou noodzakelijk dat je moet "Adobe Creative Suite Cleaner Tool" te gebruiken.
    Hier een advies voor dat (De volgorde is afhankelijk van uw individuele behoeften. Lees al mijn voorstellen eerst, zodat je beter kunt kiezen voor de eerste stap
    1. Misschien heb je te activeren / deactiveren, dus neem er eens een kijkje:
    http://helpx.adobe.com/x-productkb/policy-pricing/activation-deactivation-products.html
    2. Soms weten we in de tussentijd, de "opm.db bestand" is de boosdoener. In dit geval moet u deze verwijderen.
    3. Heeft u al proberen "Het verwijderen en opnieuw installeren"? Wees voorzichtig met (de) aso installeren. door het (de) installeren door uw eigen middelen. Zo veel als ik spijt van krijgen en zo vreemd als het lijkt Ik ben bang dat het een uitdaging voor Adobe's Creative Cloud Cleaner Tool. Soms - om welke redenen - CC niet "wil" om te werken. In dit geval moet je helemaal CC verwijderen en opnieuw installeren door hulp van Adobe Creative Cloud Cleaner Tool. (A probeert te verwijderen uit de eigen middelen is niet genoeg!)
    Ik citeer: Adobe Creative Suite Cleaner Tool helpt op te lossen problemen met de installatie van Adobe Creative Cloud en Adobe Creative Suite (CS3-CS6) applicaties. De tool verwijdert installatie records voor prerelease installaties van Creative Cloud of Creative Suite-toepassingen. Het heeft geen invloed op bestaande installaties van eerdere versies van Creative Cloud of Creative Suite-toepassingen.
    Gebruik: De CC Cleaner Tool gebruiken om installatieproblemen op te lossen | CC, CS3-CS6 en volg de voorgeschreven volgorde van de bewerkingen
    4. Indien nodig en voor verdere vragen klik door Contact opnemen met de klantenservice en als "open" kunt u gebruik maken van de chat, had ik de beste ervaringen. Ik citeer uit Adobe's werknemer Preran: De chat-knop wordt zodra er een agent beschikbaar om te helpen geactiveerd.
    Hans-Günter

  • Het leven is als een reis

    Het leven is als een reis en op deze reis komen we langs ruwe plekken op de weg, alsmede wegblokkades en snelheidscontroles, maar we dont weer terug als we ze zien voor ons, in plaats houden we aan de gang, omdat de belangrijkste reden dat we begonnen op de reis was om een bestemming te bereiken. De ruwe patches, wegblokkades en snelheidscontroles vertegenwoordigen onze ontmoedigingen, mislukkingen, vrienden die ons verlaten, familie die hebben verzuimd ons en de meeste van alle vrienden die hebben geprobeerd om ons te kalmeren wanneer we zo gehaast is in de dingen en die hebben geprobeerd te duwen ons in de juiste richting wanneer ze hebben gezien dat we verliezen. Laat ons niet laten leven myseries, teleurstellingen, mislukkingen en aanmoedigingen om ons richting te veranderen en geven maar laat ze moedigen ons aan om blijven gaan, omdat we weten dat onze beloning is goed voor ons en natuurlijk zouden we willen allemaal gelukkig zijn, maar laat eerst de prijs betalen...
    [blackjack online|http://www.spel-casino.eu/blackjack/]

    You can look at one of these
    *FoxLingo: https://addons.mozilla.org/firefox/addon/foxlingo-translator-dictionary/
    *ImTranslator: https://addons.mozilla.org/firefox/addon/imtranslator/
    See also the Google Translate site.
    * [http://translate.google.com/translate_t?hl=nl&langpair=auto|nl#auto|nl|]

  • Na flash update van 12-06-2012 werkt de flash player niet meer in firefox, iemand een oplossing?

    Na flash update van 12-06-2012 werkt de flash player niet meer in firefox, bij het googlen merk ik dat dit een veel voorkomend probleem is vandaag, maar nog geen oplossing gevonden. Kan iemand mij helpen?

    Hi guys - for me this helped.
    If Flash player is working in IE, then:
    Close Firefox - open Internet Explorer - got to the Adobe Flash Player Site:
    http://get.adobe.com/de/flashplayer/
    In IE you can see there is the 64-bit version - (in Firefox there was just the 32-bit version) - got to: (others)
    http://get.adobe.com/de/flashplayer/otherversions/
    choose your system and version
    download it via internet explorer and install the adobe flash player
    restart firefox and it should work.
    helped me after wasting one day of my life to find a solution, alle sites work just fine now.
    hope this helps.

  • Idvd reageert niet meer wanneer ik een film wil laden

    Ik gebruik iLife 11 en heb idvd al een keer verwijderd en opnieuw geinstalleerd maar het probleem blijft. Ik moet forceer stop doen om idvd (reageert niet) te stoppen.
    Hoe kan ik dit oplossen?

    Hej
    I use iDVD iLife 11 and have already been removed and reinstalled but the problem remains. I need to do to stop forcing iDVD (not responding) to stop.
    How can I fix this?
    Ja det kan bero på så många olika saker. Panik stopp - är sällan en god ide eftersom det ger små fel på din hård disk som kan växa till stora fel och eventuell hård disk krasch.
    Jag skulle görs följande
    • Kasta iDVD preferens file
    • Reparera "Permissions" (Disk Util tool)
    • Reparera Hård disken (Disk Util tool - but now You first must start Your Mac from DVD or external hard disk)
    Nästa steg är att leta upp Event's och Project's som havererat - ta bort dem
    BTW - the common language here is English - so that we who tries to help will understand and even more so that others with same problem might benefit on Your Question
    med vänliga hälsningar Bengt W

  • Manually switching through JTabbedpane Tabbes using a Button.

    Hi,
    im a beginner in Java. Searched most websites about Java. But still i found no solution, the answer is probably simple. What i made:
    import java.awt.*;
    import javax.swing.*;
    import java.awt.image.*;
    class TabbedPaneExample
    extends JFrame
    private JTabbedPane tabbedPane;
    private JPanel panel1;
    private JPanel panel2;
    private JPanel panel3;
    private JPanel panel4;
    private JTextArea langetekst;
    private JScrollPane scrollpane;
    private JButton j1,j2,j3,j4,j5,j6,j7;
    private Image jpg;
    private final static String newline = "\n";
    public TabbedPaneExample()
    setTitle( "Airflow - Een Nemo Project" );
    setSize( 1024, 768 );
    setBackground( Color.gray );
    JPanel topPanel = new JPanel();
    topPanel.setLayout( new BorderLayout() );
    getContentPane().add( topPanel );
    // Het maken/toevoegen van de Tabpagina's
    createPage1();
    createPage2();
    createPage3();
    createPage4();
    // Tabpaneel
    tabbedPane = new JTabbedPane();
    tabbedPane.addTab( "Algemene Informatie", panel1 );
    tabbedPane.addTab( "Werking Stofzuiger", panel2 );
    tabbedPane.addTab( "Werking Ventilator", panel3 );
    tabbedPane.addTab( "Over het Project", panel4 );
    topPanel.add( tabbedPane, BorderLayout.CENTER );
    // Configuratie tabblad 1
    public void createPage1()
    panel1 = new JPanel();
    panel1.setLayout( null ); // Layout Kiezen
    // Knoppen
    j1= new JButton ( " Volgende " );
    panel1.add( j1 );
    j1.setBounds( 650, 600, 200, 20);
    // Tekst
    JLabel label1 = new JLabel( "Welkom bij de Airflow!!!");
    label1.setBounds( 10, 15, 600, 20 );
    panel1.add( label1 );
    JLabel label2 = new JLabel( "<html>Een vliegtuig vliegt! Tegenwoordig lijkt het normaal? Toch is het niet zo eenvoudig als het lijkt. <br> De vleugel is het belangrijkste component van een vliegtuig. Want zonder de vleugels zou een vliegtuig <br> de lucht niet inkomen. Vroeger zijn er daarom ook veel experimenten geweest met vleugels hoe men kan <br> vliegen. De eerste die echt met een gemotoriseerde vliegtuig de lucht in gingen waren de gebroeders <br> Wright. Zweefvliegtuigen was al eerder gelukt, ook daar hadden de vleugels een grote invloed. Bij <br> een vliegtuig heeft de vleugel vooral invloed op de luchtstroming/snelheid. Vleugels hebben niet voor <br> een vliegtuig heeft de vleugel vooral invloed op de luchtstroming/snelheid. Vleugels hebben niet voor <br> niets een bepaalde vorm. Als de vleugel niet de juiste vorm heeft dan komt het niet van de grond. <br> Hoe beter de vorm van de vleugel, hoe sneller het vliegtuig kan. De luchtstroom langs de vleugel is<br> heel belangrijk. Aan de hand van de instructies kom je alles te weten over de vleugel. En wat het nu <br> precies doet.</html>" );
    label2.setBounds( 10, 60, 600, 200 );
    panel1.add( label2 );
    // jpg
    JLabel label99 = new JLabel( " © Team 44/ Nemo" );
    label99.setBounds( 850, 650, 150, 20 );
    panel1.add( label99 );
    // Configuratie tabblad 2
    public void createPage2()
    panel2 = new JPanel();
    panel2.setLayout( null ); // Layout Kiezen
    j2= new JButton ( " Volgende" );
    panel2.add( j2 );
    j2.setBounds( 650, 600, 200, 20);
    j6= new JButton ( " Reset " );
    panel2.add( j6 );
    j6.setBounds( 850, 600, 100, 20);
    JLabel label1 = new JLabel( " De werking van de Stofzuiger:" );
    label1.setBounds( 10, 15, 600, 20 );
    panel2.add( label1 );
    JLabel label2 = new JLabel( "<html> In het echt wordt er natuurlijk niet gebruik gemaakt van de stofzuiger.<br> Hier wordt gebruikt gemaakt van de zuigkracht van de stofzuiger.<br><br> Ga nu aan de zwendel draaien en kijk wat er met de vleugel gebeurt.....<br><br> ......je kunt zien dat de vleugel is naar beneden gaan kantelen. <br>Dit komt doordat de luchtstroming op een bepaalde manier <br> langs de vleugels gaat. Dit komt dus door de vorm van de vleugels.<br> Om dit uitleggen kunnen we het best naar het plaatje hieronder kijken. </html>" );
    label2.setBounds( 10, 60, 600, 160 );
    panel2.add( label2 );
    // jpg grafiek 1
    JLabel label3 = new JLabel( "<html> Op de grafiek is te zien hoe de luchtstroom langs de vleugel <br> gaat in een rechte stand. Als dus de vleugel naar beneden gaat kantelen<br> gaat de luchtstroom er dus op de volgende manier langs:</html>" );
    label3.setBounds( 10, 300, 600, 160 );
    panel2.add( label3 );
    // jpg grafiek 2
    JLabel label4 = new JLabel( "<html> Op de grafiek is te zien hoe de luchtstroom er nu langs loopt.<br> De vleugel is meer naar onder gekanteld. Boven de vleugel<br> gaat de luchstroom een stuk gemakkelijker langs de vleugel<br> dan onder de vleugel. Je kunt de bocht erlangs zien gaan, als dit <br> gebeurt dan daalt het vliegtuig(boven is meer ruimte om druk uit<br> te oefenen naar beneden). </html>" );
    label4.setBounds( 610, 10, 600, 140 );
    panel2.add( label4 );
    JLabel label5 = new JLabel( "<html> De hoek van de vleugel:</html>" );
    label5.setBounds( 610, 250, 600, 140 );
    panel2.add( label5 );
    JLabel label99 = new JLabel( " © Team 44/ Nemo" );
    label99.setBounds( 850, 650, 150, 20 );
    panel2.add( label99 );
    // Configuratie tabblad 3
    public void createPage3()
    panel3 = new JPanel();
    panel3.setLayout( null ); // Layout Kiezen
    j3= new JButton ( " Over het Project " );
    panel3.add( j3 );
    j3.setBounds( 650, 600, 200, 20);
    j5= new JButton ( " Reset " );
    panel3.add( j5 );
    j5.setBounds( 850, 600, 100, 20);
    JLabel label1 = new JLabel( " De werking van de Ventilator:" );
    label1.setBounds( 10, 15, 600, 20 );
    panel3.add( label1 );
    JLabel label2 = new JLabel( "<html>De Ventilator heeft de omgekeerde functie van de stofzuiger. Deze blaast<br> juist langs de vleugel terwijl de stofzuiger een<br> zuigkracht levert. Als we hieronder de normale stand zien: </html>" );
    label2.setBounds( 10, 60, 600, 200 );
    panel3.add( label2 );
    //jpg grafiek 3
    JLabel label3 = new JLabel( "<html>Doe nu de ventilator aan en draai aan de zwendel!...<br><br>... De vleugel is omhoog gekanteld, als je dan vervolgens de luchtstroom erlangs<br> wilt zien:</html>" );
    label3.setBounds( 10, 15, 600, 450 );
    panel3.add( label3 );
    // jpg grafiek 4
    JLabel label4 = new JLabel( "<html>Op de grafiek is te zien dat onder de vleugel de luchtstroon<br> er makkelijker langs gaat. Dit betekent dat er aan de<br> onderkant van de vleugel een opwaartse kracht plaatsvind, hierdoor<br> stijgt het vliegtuig!</html>" );
    label4.setBounds( 610, 10, 600, 140 );
    panel3.add( label4 );
    JLabel label5 = new JLabel( "<html> De hoek van de vleugel:</html>" );
    label5.setBounds( 610, 250, 600, 140 );
    panel3.add( label5 );
    JLabel label99 = new JLabel( " © Team 44/ Nemo" );
    label99.setBounds( 850, 650, 150, 20 );
    panel3.add( label99 );
    public void createPage4()
    panel4 = new JPanel();
    panel4.setLayout( null ); // Layout Kiezen
    // Knoppen
    j4= new JButton ( " Reset " );
    panel4.add( j4 );
    j4.setBounds( 850, 600, 100, 20);
    // Over Project Nemo
    JLabel label1 = new JLabel( " Over Project Nemo:" );
    label1.setBounds( 10, 15, 600, 20 );
    panel4.add( label1 );
    JLabel label2 = new JLabel( "<html>Project Nemo is een project voor de studenten van de Hogeschool van Amsterdam aan de<br> opleiding E-technology en Technische Informatica. Het is een project voor leerjaar 1.<br> De bedoeling is een Exhibit te maken voor Nemo die leerzaam is voor kinderen tussen de <br> 10-12 jaar. Voor onze opleiding (E-Technology) is het ook nog belangrijk echte hardware<br> en software erin te hebben. " );
    label2.setBounds( 10, 60, 600, 100 );
    panel4.add( label2 );
    // Over Ons
    JLabel label3 = new JLabel( " Over Ons:" );
    label3.setBounds( 10, 185, 600, 20 );
    panel4.add( label3 );
    JLabel label4 = new JLabel( "<html>Wij zijn Sander,Nick,Patrick,Vincent en Vera. Wij vormen samen team44. Wij doen de<br> opleiding E-technology. We zijn in de 2e week in contact gekomen met Nemo. Vervolgens <br> hebben wij de Exhibit Airflow bedacht. Behalve het project zijn we natuurlijk ook nog <br> bezig met school. De Colleges zelf zijn ook uiterst belangrijk voor de Tentamens. <br> Behalve de Exhibit, krijgen we ook nog aan het eind van het project technotoetsen. <br> Deze toetsen gaan over alle onderdelen van Project Nemo. </html>" );
    label4.setBounds( 10, 230, 600, 120 );
    panel4.add( label4 );
    // Andere kant Eisen Nemo
    JLabel label5 = new JLabel( " Eisen Nemo: " );
    label5.setBounds( 530, 375, 600, 20 );
    panel4.add( label5 );
    JLabel label6 = new JLabel( "<html> - Leerzaam voor kinderen( Voor de doelgroep,Interactief).<br> - Het kind is in beweging.<br> - De Exhibit moet hufterproof zijn.<br> - Veilig. </html>" );
    label6.setBounds( 530, 420, 600, 80 );
    panel4.add( label6 );
    // Eisen Hva
    JLabel label7 = new JLabel( " Eisen Hogeschool van Amsterdam: " );
    label7.setBounds( 530, 525, 600, 20 );
    panel4.add( label7 );
    JLabel label8 = new JLabel( "<html>- Techno Software<br> - Techno Hardware <br> - Proces </html>" );
    label8.setBounds( 530, 570, 600, 60 );
    panel4.add( label8 );
    // Copyright
    JLabel label99 = new JLabel( " © Team 44/ Nemo" );
    label99.setBounds( 850, 650, 150, 20 );
    panel4.add( label99 );
    // Gebruikelijke Paginamethode om het zichtbaar te maken.
    public static void main( String args[] )
    // Create an instance of the test application
    TabbedPaneExample mainFrame = new TabbedPaneExample();
    mainFrame.setVisible( true );
    // My Language is Dutch by the way :).
    My question: I have got 4 tabs. On (almost) each page i have a Reset and a Other button.
    What i want is: when i click on the "Other Button" it switches to the next tab.
    And when i press the "reset" Button it goes back to tab1.
    Thx, for your time
    Patrick

    [tl;dr|http://www.urbandictionary.com/define.php?term=tl%3Bdr] -- try posting a SSCCE. Also, Swing questions should be posted in the Swing forum.

  • Euro font in pdf file

    wanneer ik een pdf file open in adobe reader op de pc met window xp pro sp3 dan komt het euro teken niet goed over, maar
    ziet er uit als een vierkantje??
    moet ik iets in mijn compueter aanpassen??
    of maakt men het pdf bestandje niet goed op??
    wat zou de oorzaak kunnen zijn??

    I've attempted to answer your question in your other thread.
    http://forums.adobe.com/message/1891320#1891320

  • Updates adobe flash player

    Hallo,
    sinds 3 maanden ontvang ik geen automatische updates van Adobe flash player.
    Verscheidene keren heb ik het programma verwijdert en weer terug geinstalleerd maar zonder resultaat.
    Meerdere malen per dag krijg ik een melding van Microsoft dat Adobe Flash player Service 11.6 r602 nietmeer werkt en is gesloten,er zou een probleem zijn opgetreden waardoor de toepassing niet goed meer werkt. Ik zou een melding krijgen als er een oplossing beschikbaar was....en na zoveel maanden is er blijkbaar nog geen opossing waardoor ik mij steeds erger.
    Ik hoop dat U mij de oplossing kunt geven.
    mgv Rosa Wils

    You need to perform a clean install: http://forums.adobe.com/thread/928315

  • Hoe zit het met de betalingen bij paypal?

    Beste heer/mevrouw,
    ik heb een probleem met het bedrijf pay pal.
    het is namelijk zo dat zij mij een brief hebben gestuurd met daar in een verschuldigt bedrag van 33,99 euro.
    ik vond dit raar en ben hun gaan bellen maar als ik hun bel krijg ik ze niet de pakken en via hun site kan ik ook niets goed.
    ik ben er achter gekomen met hety doorzoeken van google of er meer van deze problemen zijn en die zijn er wel degelijk.
    het is namelijk zo dat als zij het bedrag van de gekochte app niet van de rekening kunnen afschrijven dat ze na 2 dagen er 15 euro kosten bij rekenen (zonder dit te laten weten aan mij). het word nog leuker wand als ze het na 5 dagen er nog niet af hebben kunnen halen rekenen ze weer is extra 15 euro zo kom ik dus op die 33,99 euro. wat ik verder ook las is dat: omdat dit een buitenlands bedrijf is kunnen ze dit zomaar doen maar volgens de nederlandse wet mag dit niet. zonder de desbetreffende persoon dit te laten weten,
    mijn vraag is nu van wat moet ik hier mee aan moet.
    ik kan ze niet bereiken en een rekening nummer waarnaar ik het zou moeten over maken is ook niet bekend.
    ik vind dit een nare situatie vooral omdat dit gaat om een lullige 3,99.
    ik hoop dat ik hier snel een duidelijk antwoord op kan krijgen en een goede oplossing, wand ik ben niet vanplan om 30 euro te gaan betalen.
    MVG, Jeroen Theijs

    In Firefox all browser windows and tabs use the same cookies that will identify you to the server.<br />
    If you open a different account then existing cookies are send to the server and the server sees that you already signed on (authenticated).
    You can look at one of these extensions if you want to sign on with different identities at the same time:
    * Multifox: http://br.mozdev.org/multifox/
    * CookiePie: http://www.nektra.com/oss/firefox/extensions/cookiepie/

  • SMA omvormer software.

    Ik stuurde SMA benulux het volgende bericht:
    Ik ben sinds oktober 2012 de gelukkige eigenaar van 15 zonnepanelen en een Sunny Boy 3600TL-21 van SMA. Een storende kwestie is het totaal niet ondersteunen van Mac OSX door SMA voor het uitlezen van de Sunny Boy gegevens, evenals een eventueel bijwerken van de firmware.
    Een gemiste kans voor een bedrijf dat zich profileert als high tech met de blik op de toekomst.
    Hoe ingewikkeld kan het zijn om naast een Windhoos programma ook een Mac OSX programma te ontwikkelen. Iemand dwingen een Windhooscomputer te kopen of erger nog de Mac computer te vervuilen met Windhoosprogrammatuur is een regelrechte belediging. Daag uzelf toch eens uit! Als u wacht to de concurrent u uitdaagt is het te laat. Het is ondanks alles een snelle markt: dat moet u toch weten.
    Tot mijn verbazing kreeg ik het volgende antwoord retour:
    We begrijpen u frustratie hierin. Echter, het ligt toch iets anders dan dat u schetst. Het probleem zit erin dat Apple geld vraagt als er software op hun systeem zal draaien. Dit zijn nogal zeer hoge bedragen. Als we dit zouden doen, zou dit programma niet meer gratis zijn, maar betalend en daar zit u als klant ook niet op te wachten.
    Ik weet wel dat ze in Duitsland Apple proberen te overtuigen om dit toch te laten zonder kosten. Tot die tijd dat daar een beslissing in is genomen, zal er dus nog geen versie voor Apple op de markt komen.
    Klopt dit? houdt Apple met haar prijsbeleid dit soort ontwikkelingen tegen, en daarmee de gebruikerservaring van hun eigen producten? ik ging ervan uit dat iedereen een App kon ontwikkelen en die zelfs gratis via de store kon aanbieden. Teleurstellend als dit klopt. Overigens ben ik toch niet afhankelijk van SMA? Iedereen zou toch -mits ze voldoende inzage hebben- een programma kunnen ontwikkelen?
    Graag jullie visie/ervaringen!

    The package formats are not the same between these both release of Solaris. You can still trying to extract the files and then install it in your Solaris 10 machine but this is highly unrecommended and of course unsupported. And I'm not sure that it will work.

  • [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

Maybe you are looking for

  • HT201250 Time Machine Error

    Just bought a new 1 TB external hard drive specifically for a Mac and time machine error: unable to complete backup. An error occurred while copying files to the backup volume. messages keeps appearing.  Tried to restart and that didn't help.  Please

  • How do I migrate settings in Illustrator after updating from CC to CC 2014?

    I have just updated from CC to CC 2014 and was not given the option to migrate settings for Illustrator as I was for Photoshop. How can I do this?

  • Inter Communication between portlets getting error ed out

    Hi , I am trying to create inter communication with 2 portlets . I created 2 portlets and created a global parameter(params1) which i used in both the portlets. My requirement is that i need to enter a value in first portlet and by clicking a button

  • Deployment Error ( ClassNotFoundException )

    Hi Experts, I am trying to develop some Interactive adobe forms in my system. I designed the applicationa and deployed it. But ! I am getting the following error. java.lang.ClassNotFoundException: suresh.wdp.InternalTravelRequestCom - Loader Info - C

  • ITunes Library Locked warning

    Help! Itunes was working just fine on my PC a week ago, and yesterday I tried to open it on my desktop (and from every other itunes icon I could find) and I got this warning: "The iTunes Library.itl file is locked, on a locked disk, or you do not hav