;ò Œ Ac@sÄdkZdkZdkZdkZdkZdklZlZdkZdk Z dk l Z l Z l Z l Z lZlZlZlZdkZdklZdkZdkZdkTdklZlZlZdklZlZlZlZl Z dk!Z!dk!l"Z"l#Z#dk$Z$dk%Z%de_&d efd „ƒYZ'd e'fd „ƒYZ(e)Z*ydk$Z+e,Z*Wndk+Z+nXd e+i-fd„ƒYZ.e*p e/djoe+i0ƒndS(N(sloadsdump(sredsgreensblues turquoisesyellowspurplesboldstabulate(stoprint(s*(sProgs ProgExceptionsOption(sDatesTimesDateTimestodaysnowdt(sXMLTVsElements %Y%m%d%H%M %zsGrabcBsútZdZdZdZdZeZeZeZ hZ dZ hdd<dd<ddd?ƒe*e&d,d@e+dAƒƒe*e'dBdCe+dDƒƒg Z)dE„Z,dF„Z-dG„Z.dH„Z/dI„Z0dJdK„Z1dL„Z2edM„Z3edN„Z4dO„Z5dP„Z6RS(Qs$Base class for writing a tv_grabber.s,Chris Ottrey, ottrey at users dot sf dot netsChttp://sourceforge.net/tracker/?func=add&group_id=87433&atid=583152sbelnetsutf-8schannelsisprogramssinfoshtmlsbodystablestrstdsasinputshrefscolspanscolssnamesvaluecCsþy|i|ƒWnætj onÕtj o0tiitt dƒƒƒti dƒnšt j o}d|i tdƒf}tit dƒtt|ƒƒ|t|iƒfƒt|dƒ}tid|ƒ|iƒti dƒnXdS(NsIUser required program abort using Keyboard! No xmltv guide was recorded! is%s_%s.tbs %Y%m%d%H%M%SsYou have encountered a bug! %s The details have been saved in the file: %s Please use it to submit a bug report to: %s swsfile(sselfs_initsargvs SystemExitsKeyboardInterruptssyssstderrswritestoprints_sexits Exceptionsesnamesnowdtstbsmessageserrorsyellowsstrsbolds__bugreport_url__sopenstb_fs unittest2sprint_exc_plussclose(sselfsargvsestb_fstb((sI/mnt/gmirror/ports/textproc/py-tvgrab/work/pytvgrab-lib-0.5.1/lib/grab.pys__init__as5  cCsüt|iƒƒ|_|i ot|iƒ|_nti||ƒ|io|ii |i ƒnt i tdƒ|iidƒƒt i tdƒtdƒƒ|iƒ}t i tdƒt|dƒ|dfƒt i tdƒ|iƒdS(NsStarted at %ss%csFinished at %ssTime taken %02d:%02di<s\Statistics (DEPRECATING): channels=%(channels)d, programs=%(programs)d, information=%(info)d(sXMLTVsselfsgetDescriptionsxmltvs start_datestodays _url_date_fmtsProgs__init__sargvswritesoutputsmessagesinfos_s _time_startsstrftimesnowdtsgetElapsedTimes elapsed_timesints statistics(sselfsargvs elapsed_time((sI/mnt/gmirror/ports/textproc/py-tvgrab/work/pytvgrab-lib-0.5.1/lib/grab.pys_init~s  # +cCsRtdƒ}y4|d|i7}|dtdƒd|i7}WnnX|SdS(NsTV Grabs s; ssources - (s_sresultsselfs__region_name__s__source_url__(sselfsresult((sI/mnt/gmirror/ports/textproc/py-tvgrab/work/pytvgrab-lib-0.5.1/lib/grab.pysgetDescription’s #cCs ||_dS(N(sasselfsoutput(sselfsa((sI/mnt/gmirror/ports/textproc/py-tvgrab/work/pytvgrab-lib-0.5.1/lib/grab.pys setOutputžsicCs=yt|ƒ|_Wn#ttdƒt|ƒƒ‚nXdS(NsInvalid value for days: %s(sintsasselfsdayss ProgExceptions_srepr(sselfsa((sI/mnt/gmirror/ports/textproc/py-tvgrab/work/pytvgrab-lib-0.5.1/lib/grab.pyssetDays£scCs=yt|ƒ|_Wn#ttdƒt|ƒƒ‚nXdS(NsInvalid value for offset: %s(sintsasselfsoffsets ProgExceptions_srepr(sselfsa((sI/mnt/gmirror/ports/textproc/py-tvgrab/work/pytvgrab-lib-0.5.1/lib/grab.pys setOffset«scCstidt_dS(Ni(smessagesverbose(sself((sI/mnt/gmirror/ports/textproc/py-tvgrab/work/pytvgrab-lib-0.5.1/lib/grab.pys setVerbose³scCstiit_dS(N(smessages verbose_levelsQUIETsverbose(sself((sI/mnt/gmirror/ports/textproc/py-tvgrab/work/pytvgrab-lib-0.5.1/lib/grab.pyssetQuiet·scCs |t_dS(N(sasurlutilss cache_dir(sselfsa((sI/mnt/gmirror/ports/textproc/py-tvgrab/work/pytvgrab-lib-0.5.1/lib/grab.pys setCacheDir¼scCst|d|iƒ|_dS(Ns output_fmt(sDatesasselfs _url_date_fmts start_date(sselfsa((sI/mnt/gmirror/ports/textproc/py-tvgrab/work/pytvgrab-lib-0.5.1/lib/grab.pys setStartDateÁscCstiƒdS(N(soutputsnocolor(sself((sI/mnt/gmirror/ports/textproc/py-tvgrab/work/pytvgrab-lib-0.5.1/lib/grab.pysnoColorÅscCstiƒdS(N(soutputsnotitles(sself((sI/mnt/gmirror/ports/textproc/py-tvgrab/work/pytvgrab-lib-0.5.1/lib/grab.pysnoTitlesÉssosoutputsoutput to %s rather than stdouts s (default: %s)sstdoutsFILEsnsdayss get listing for the next %s dayssNsfsoffsets%skip %s days of listings (from today)sqsquiets5suppress progress messages normally written to stderrsvsverboses@increase progress messages written to stderr (NB. -vv for more!)sCscachedirsuse cache dir %ssNonesDIRsss startdates3use %s as the starting date (use DD/MM/YYYY format)s today's date)s STARTDATEsnocolorsdo not use colored output.sTsnotitlessdo not change xterm titles.cCs‘|ioƒdk}|i}||idƒ }|i|iidƒ }||jo4ti i t dƒ||ifƒti dƒqndS(sUCheck to see if tvgrab library installed is the correct "release series" as required.Ns.sÒ Incorrect tvgrab library is installed. You have version : %s You require version : %s It is available from: http://sourceforge.net/project/showfiles.php?group_id=87433&package_id=101497 i( sselfs__lib_version__s__init__s __version__s lib_versionsrfindsversgverssyssstderrswrites_sexit(sselfsvers lib_versionsgvers__init__((sI/mnt/gmirror/ports/textproc/py-tvgrab/work/pytvgrab-lib-0.5.1/lib/grab.pys check_libraryôs    #cCsQ|iƒd|_x7|ii|i|i|iƒD]}|i|ƒq6WdS(Ni( sselfs check_librarysfailuress start_datesrangesoffsetsdayssdsgrab_day(sselfsd((sI/mnt/gmirror/ports/textproc/py-tvgrab/work/pytvgrab-lib-0.5.1/lib/grab.pysmains   #cCs hd|<dt<}|SdS(Nsdatestrschannel(sdschannelsresult(sselfsdsresult((sI/mnt/gmirror/ports/textproc/py-tvgrab/work/pytvgrab-lib-0.5.1/lib/grab.pysget_source_paramsscCs7t}y|ii|ƒ}|i}WnnX|SdS(s0 This is the re2 method of programme extraction N(sNonesresultsselfs _pat_guidesextractsbufsguides programme(sselfsbufsresultsguide((sI/mnt/gmirror/ports/textproc/py-tvgrab/work/pytvgrab-lib-0.5.1/lib/grab.pysextract_programmess cCs–|ii|i||ƒt|ƒtjo |g}nxU|D]M}|i |7_ |i||_|ii |i |i|i d|i ƒqAWdS(s. This is the re2 method of updating the xmltv sinfoN(sselfsxmltvs addChannelschannelsschannelstypes programmesslists programmesstartsdates addProgramstitlesinfo(sselfsdateschannels programmess programme((sI/mnt/gmirror/ports/textproc/py-tvgrab/work/pytvgrab-lib-0.5.1/lib/grab.pys updateXmltv"s sreplacecCs|iot||i|ƒ}nx#|iD]}|id|ƒ}q-Wx+|iD] }|di|d|ƒ}qSW|SdS(sî Clear unwanted tags, attributes and whatever is defined as a compiled Regular Expression in re_clean and re_replace. Converts to unicode if page_charset is set, using unicode error policy defined by 'unicode_error'. s iiN( sselfs page_charsetsunicodescontentss unicode_errorsre_cleanscleanssubs re_replacesrepl(sselfscontentss unicode_errorsreplsclean((sI/mnt/gmirror/ports/textproc/py-tvgrab/work/pytvgrab-lib-0.5.1/lib/grab.pys clear_html.s   c CsšyAti}||d|id|id|id|iƒ}|SWnRt j oF}t i |ƒt itdƒƒ|i|iƒtidƒnXdS(s£Get HTML Struct for a given URL or dump struct and exit. Get the given URL, try to parse it, if fails dump the struct to a file and exit the program. sfilters parse_tagss parse_attrsskeep_empty_tagss Aborting...iÿÿÿÿN(surlutilss get_urlparsedsgupsurlsselfs clear_htmls parse_tagss parse_attrsskeep_empty_tagss html_structs ParseErrorsesmessages exceptionserrors_s dump_filescontentsssyssexit(sselfsurlses html_structsgup((sI/mnt/gmirror/ports/textproc/py-tvgrab/work/pytvgrab-lib-0.5.1/lib/grab.pysget_htmlstructLs     cCsP|o2ti|ƒ}d|_|it|ƒ|ƒntit dƒƒdS(sDump HTML structure to outfile.isHTML structure was empty!N( s html_structscopysverbosesselfs dump_filesstrsoutfilesmessageserrors_(sselfs html_structsoutfile((sI/mnt/gmirror/ports/textproc/py-tvgrab/work/pytvgrab-lib-0.5.1/lib/grab.pysdump_structurebs  cCsÐt|tƒp t|tƒot|dƒ}n| pt|tƒ oOdk}dk}|idpd}|i dd|ƒ}t|dƒ}n|i |ƒt itdƒ|i ƒ|iƒdS(sDump HTML to outfile.swNistvgrabs.htmls%s-s"HTML contents dumped to file '%s' (s isinstancesoutfilesstrsunicodesopensfilestempfilessyssargvsnamesmktempswritescontentssmessageswarnings_sclose(sselfscontentssoutfilestempfilessyssname((sI/mnt/gmirror/ports/textproc/py-tvgrab/work/pytvgrab-lib-0.5.1/lib/grab.pys dump_filems    cCs9y|i|ƒdSWnttfj o |SnXdS(sJ return an ID for xmltv based on the channel name or user chosen. sidN(sselfsget_chan_by_namesnamesKeyErrors TypeError(sselfsname((sI/mnt/gmirror/ports/textproc/py-tvgrab/work/pytvgrab-lib-0.5.1/lib/grab.pysget_id€s c CsQxJ|iiƒD]9}|i||ƒ}|id|}ti ||i ƒ}|oô|i |ƒ}|o.titdƒ|ƒ|i|||ƒqItitdƒ|ƒtitdƒƒ|id7_d|i|if}titdƒt|ƒƒtitdƒ|iƒt|d ƒ}|i|ƒ|iƒqqWdS( Ns programmessExtracted programmes: %ss&Failed to extract programmes for: %ss8The grabber needs to be updated to handle this testcase.is%s_fail_%02d.htmlsSaving testcase as %s.s/ Please use it to submit a bug report to: %ssw(sselfschannelsskeysschannelsget_source_paramssdsparamssurlsurlutilssget_urlcontentss clear_htmlsbufsextract_programmess programmessmessagesmoreinfos_s updateXmltvserrorsfailuressnamesfailure_testcasesreprs__bugreport_url__sopensfswritesclose( sselfsdsfsurlsparamss programmessbufschannelsfailure_testcase((sI/mnt/gmirror/ports/textproc/py-tvgrab/work/pytvgrab-lib-0.5.1/lib/grab.pysgrab_dayŒs& (7s__name__s __module__s__doc__s __author__s__bugreport_url__s __sf_mirror__sNones _url_date_fmts__lib_version__s__conf_version__schannelss page_charsets statisticssre_cleans re_replaces parse_tagss parse_attrsskeep_empty_tagss__init__s_initsgetDescriptionsoutputs setOutputsdaysssetDayssoffsets setOffsetsmessages verbose_levelsINFOsverboses setVerbosessetQuietsurlutilss cache_dirs setCacheDirs start_dates setStartDatesnoColorsnoTitlessProgsoptionssOptions_s check_librarysmainsget_source_paramssextract_programmess updateXmltvs clear_htmlsget_htmlstructsdump_structures dump_filesget_idsgrab_day(((sI/mnt/gmirror/ports/textproc/py-tvgrab/work/pytvgrab-lib-0.5.1/lib/grab.pysGrab8sv !                     sGrab_Cc BsÄtZdZd„Zd„Zd„Zeeed„Zd„Z d„Z d„Z d„Z d „Z d „Zd „Zd „Zd „Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zde_d„Zde_d„Zei gZ e i!de"e ede#dƒƒƒe i!de"e dde#d ƒd!ƒƒe i!d"e"ed#d$e#d%ƒd&ƒƒe i!d'e"ed(d)e#d*ƒd&ƒƒe i!d+e"ed,d-e#d.ƒƒƒe i!d/e"ed0d1e#d2ƒd3ƒƒe i!d4e"ed5d6e#d7ƒƒƒe i!d8e"ed9d:e#d;ƒƒƒe i!d<e"ed=d>e#d?ƒƒƒe i$e"ed@dAe#dBƒe#dCƒƒƒe i$e"eedDe#dEƒhdFei<e#dGƒƒƒRS(Hs1Base class for writing a configurable tv_grabber.cCsÁdtiitidƒ}tiitidƒ}tidjo#tiiti dd|ƒ}ntiitii |ƒ}|i |ƒt|_|iƒt|_ti||ƒdS(Ns%s.confisposixsHOMEs.xmltv(sosspathsbasenamessyssargvsfnamespnamesnamesjoinsenvironsfssepsselfsset_config_filesFalses ran_configs read_confs reloadingsGrabs__init__(sselfsargvsfspnamesfname((sI/mnt/gmirror/ports/textproc/py-tvgrab/work/pytvgrab-lib-0.5.1/lib/grab.pys__init__¬s#    cCs!ttdƒdtdƒ‚dS(sªReturns a list of tuples representing the channel: ( 'channel name', 'url', 'id' ) Where ID is optional, but must be returned if configured by user. sNot Implemented Yets: s?get_channels(). Each Grab_C grabber must implement this method.N(sNotImplementedErrors_(sself((sI/mnt/gmirror/ports/textproc/py-tvgrab/work/pytvgrab-lib-0.5.1/lib/grab.pys get_channelsºscCsLh|_tii|iƒo¡t|iƒ}t|ƒ|_d}t |iƒt jo|ii ddƒ}n||i jo:titdƒhdt|iƒ<ƒtidƒqHn‰tdƒt|iƒ}tiit|ƒƒtitiiƒƒ}|o ||_n|iƒ|i |idg}x;ˆiƒD]#\}}|i d||fƒq>Wnˆ}|di |ƒ7}ˆoYˆt dƒjot t dƒƒ}ntt dƒƒ}|tt dƒƒ|7}n|d7}n|d 7}tt|ƒƒiƒ}ˆ o|iƒ}n| oˆoˆSn|SdS( Ns s[s%s(%s)s, syessnos (default=%s)s]s (squestionsqs valid_answerss isinstancesdictsvas iteritemssanswersshortcutsappendsjoinsdefaults_sgreenscolored_defaultsredsbolds raw_inputstoprintsstripscase_sensitiveslower(svascolored_defaultsshortcutsqsanswer(sdefaultsquestionscase_sensitives valid_answers(sI/mnt/gmirror/ports/textproc/py-tvgrab/work/pytvgrab-lib-0.5.1/lib/grab.pysask_itás.    N( sask_its valid_answerssNonesanswers isinstancesdictslistskeyssvaluessvas iteritemssksv( sselfsquestions valid_answerssdefaultscase_sensitivesvasvsanswersask_itsk((squestions valid_answerssdefaultscase_sensitivesI/mnt/gmirror/ports/textproc/py-tvgrab/work/pytvgrab-lib-0.5.1/lib/grab.pysaskÞs"&   cCsqtii|iƒ}|otii|ƒ oti|ƒnt|idƒ}t |i |ƒ|i ƒdS(Nsw( sosspathsdirnamesselfs config_filesdirsisdirsmkdirsopensfsdumpsconfsclose(sselfsfsdir((sI/mnt/gmirror/ports/textproc/py-tvgrab/work/pytvgrab-lib-0.5.1/lib/grab.pys write_confs c CsÛ|iƒ}tiitidƒ}t i t dƒ|ƒ|i ƒ} | iƒt}x|| D]t}|i|ƒ}dt dƒt|ƒ}|t dƒjo%td|tt dƒƒfƒGHnÕ|t dƒjo%td|tt d ƒƒfƒGHnht dƒt d ƒ<t d ƒt d ƒ<t dƒt d ƒ<t dƒt d ƒ<}|dd jot d ƒ}n t dƒ}|i|||ƒ}|t dƒt dƒgjo d} nd } | |d