def if_cond( me, cond): attrs = me.attrs orcond = cond.split( '||' ) lorcond = len( orcond)>1 if lorcond: yield '( //||' for l,orc in enumerate( orcond): if l: yield ') || (' for n,c in enumerate( orc.split( '&&')): if n: yield ' &&' mc = re_cond.match( c.strip() ) assert mc d = DictAttr( mc.groupdict()) for a in '',1,2,3: a = 'attr'+str(a) attr = d.get( a) if attr: dattr = d[a] = dd( attr) attrs[ attr] = dattr #'Object %(dattr)s = doc.get( "%(attr)s");' % locals() if d.attr: yield me.exist_attr( d.attr, d['not']) elif d.attr1: yield me.eq_attr2str( d.attr1, d.str, d.op1 == '!=') elif d.attr2: yield me.eq_attr2attr( d.attr2, d.attr3, d.op2 == '!=') if lorcond: yield ') //||'
def add( me): me.offset0 = '' name = me.name #name = name.replace(' - ', '--').replace(' ','_') name = name.replace('/','--') rec = DictAttr( name= name or 'cut', start= me.start, end= me.end, nopause= me.nopause) if None not in rec.values(): me.cuts.append( rec) me.newcut() elif not (me.start == me.end == None ): #name == '' and print( ' ?what is this', rec )#, '/infile=', me.infile)
def replace_types( me, **newtypes): '''uses newtypes (as valuedefs) instead. warn: to make optional( bool) into explicit 3-state textual, do not use optional( bool, aliaser( True:t1,False:t2,else:t3)).. needs optional( enum( t1:True,t2:False,t3:else)) ''' #assert not me.__dict__.get( '_methods_dict'), 'dont replace already used type, first inherit it' r = dictOrder() for w in me.methods_walk(): w = DictAttr( w.__dict__) w.decl = w.decl.clone_new_types( types= newtypes) r[ w.name] = w me._methods_dict = r
def get(url, info_includes, text_excludes, ienc="utf-8", ads=None): if ads is None: ads = {} n = 0 url0 = None for i in range(optz.pages): # p = pyquery.PyQuery( url= url % i , ienc= enc) url1 = url.format(npage=i) if url1 == url0: break url0 = url1 print(url1) try: p = pyquery.PyQuery(url=url1, opener=opener, ienc=ienc, save=optz.cache) except Exception as e: print(e) break # for a in p( 'ul.offline-list promo-products') + p( 'ul.offline-list promo-products') + : for ul in p.items("ul.offline-list"): for li in ul.items("li"): # print( li) n += 1 def totxt(items): if not items: return "" return (items[0].text() or "").replace("\xA0", " ").strip() if optz.debug: print([totxt(list(li.items("div.offline-list-" + a))) for a in "name info phones".split()]) continue ad = DictAttr( (a, (list(li.items("div.offline-list-" + a))[0].text() or "").replace("\xA0", " ").strip()) for a in "name info phones".split() ) ad.info = set(oprosti(ad.info)) ad.phones = set(oprosti(ad.phones)) name = oprosti(ad.name) if ignored(ad, name, info_includes, text_excludes): continue if merge1(ads, ad, name): continue print(n) return ads
def popylni_opis( opis0, ot_ime): log( bez_localz= 1) srezove = None opis = opis0 if isinstance( opis, dict) and len(opis)>1: opis = DictAttr( opis) srezove = dai_srezove( opis) if not srezove: srezove = opis0 opis = DictAttr() for k,kk in dict( ime= 'ime име', avtori= 'avtor автор').items(): if not ot_ime.get(k): continue kk = kk or k for ko in kk.split(): if opis.get(ko): break else: opis[ ko] = ot_ime[ k] etiketi = [] for k,v in dict( zagolemi= 'възрастни', dok= 'док').items(): if ot_ime.get( k): etiketi.append( v) if etiketi: opis[ 'етикети'] = ' '.join( etiketi ) opis[ 'издание' ] = 'радио' otkyde = ' '.join( x for x in [ ot_ime.get( 'rubrika') or optz.rubrika or '', ot_ime.data ] if x) if otkyde.isdigit(): otkyde = int( otkyde) if ot_ime.get( 'nomer'): tova = { 'част': ot_ime.nomer, cyr.otkyde: otkyde } if srezove: tova[ cyr.srezove] = srezove opis[ cyr.parcheta ] = { fime: tova } elif srezove: opis[ cyr.srezove ] = srezove opis[ cyr.otkyde ] = otkyde return opis, srezove
def __init__(me, *args, **kargs): from spravka import Spravka DictAttr.__init__(me, **kargs) # links need this when dereferencing, # also needed for inheritance by flattening style = Style(None) for v in args: # if iscollection(v): # style.update( get_views_from_args(v)) if isinstance(v, FldViewBase): style.inherit(Style(None, v)) # style[ v.view_context_name] = v elif isinstance(v, Style): style.inherit(v) # style.update( v.views) elif isinstance(v, me.__class__): me.inherit(v, ignore_style=style) elif issubclass(v, Spravka): me.inherit(v.description, ignore_style=style) ViewDef.__init__(me, *style.views.itervalues()) views = me.views # to be deleted from me for k in me.keys(): # flatten all field containers v = me[k] if isinstance(v, me.__class__): me.update(v.get_fields()) if not isinstance(v, FieldDef): del me[k] s = Style(None, *views.itervalues()) for field in me.itervalues(): assert isinstance(field, FieldDef), "neshto za zachistvane e ostanalo" field.inherit(s, lock=True, not_inheritable=True) me.dereference(me) # FIXME only the outermost container should do this
def cron( items, o ): ''' cron/crontab plain: # m h dom mon dow command cron.d/crontab direct: # m h dom mon dow (user) command ''' tyrsach = nalichni_imena( o) for x in sorted( items, key= lambda a: (a.today,a.time) ): h,m = x.time #print( '#', x.time, x.title) endtime = x.get( 'endtime') if endtime: eh,em = endtime eoffs = eh*60+ em soffs = h*60+ m if eoffs < soffs: eoffs += 24*60 sizemins = eoffs - soffs else: sizemins = '' t = datetime.datetime( x.today.year, x.today.month, x.today.day, h,m) dni = x.get('dni') if dni: #a,b,c-f r = set() for d in dni.split(','): dd = d.split('-') if len(dd)==2: r.update( range( int(dd[0]), int(dd[1])+1) ) else: r.add( int(d)) if t.weekday()+1 not in r: continue #skip channel = x.channel if not channel: if x.stream: channel = x.stream.split('://')[-1].replace('/','_') if channel in bnr_kanali: channel = bnr_kanali[ channel ].abbr fname = str( channel) fname_kanal = fname dati = '{t.year:04d}-{t.month:02d}{t.day:02d}-{t.hour:02d}{t.minute:02d}'.format( **locals()) if not o.cron_fname_notime: fname += dati fname_kanal_vreme = fname + dati if x.get('title'): fname += '+'+x.title if x.get('text'): DOT = '\u2022' #'•' tx = x.text.replace('Предаването', 'Пр.' ).replace('посветено', 'посв.' ).replace('годишнина', 'год.' ).replace('години', 'г.' ).replace( DOT,'-' ) fname += '+'+tx x.text = x.text.replace( DOT, '\n--') def sykr( x): x = re.sub( rec2dir.requo, '', x.strip() ).replace( '\u2013','-' #- ).replace( '\u0406','I' #І #).replace( '\u0425','X' cyrХ latX ? ).replace( 'x','х' ).replace(' ',' ' ).replace(' -','-' ).replace('- ','-' ##).replace(' ',' ' ).replace(' ','_' ).replace('__','_' #).replace('„','' #).replace('”','' ).replace('Документално_студио','Док.ст.' ).replace('Радиоколекция', 'Ркц' ).replace('Радиотеатър', 'Рт' ).replace('радиотеатър', 'Рт' ).replace('Радотеатър', 'Рт' ).replace('Време_за_приказка', 'ВзаП' ).replace('Ваканционна_програма', 'Вкц' ).replace('Избрано_от_', '' ).replace('фонда_на_редакция','' ).replace('фонда_на_', '' ).replace('_на_БНР','' ).replace('Запазена_марка','' ).replace('Запазна_марка','' ).replace('Семейно_радио', '' #Сем ).replace('Голямата_къща_на_смешните_хора', 'ГКСХ' ).replace('Салон_за_класифицирана_словесност', 'Салон_словесност' ).replace('Съвременна', 'Съвр.' ).replace('Драматургични', 'драм.' ).replace('драматургия', 'драм.' ).replace('Незабравими_български_спектакли_във_фонда', 'бълг.др.' ).replace('българска', 'бълг.' ).replace('български', 'бълг.' ) x = re.sub( rec2dir.rlatcyr( '([Дд])окументал(ен|н(а|о|и))'), r'\1ок.', x) x = re.sub( rec2dir.rezlf, rec2dir.zlf, x) x = re.sub( rec2dir.reakm, rec2dir.akomika, x) x = re.sub( rec2dir.rehs, rec2dir.hs, x) x = x.strip( rec2dir.rend+':') return x dosave = 10#True danni = DictAttr( rubrika = x.get('title') or '', data = '{t.year:04d}{t.month:02d}{t.day:02d}'.format( **locals()), opisanie = x.get('text') or '', ) danni.opisanie = '\n'.join( d.strip() for d in danni.opisanie.split('\n') if d.strip()) danni.rubrika_kysa = sykr( danni.rubrika) z = danni.razglobeno = rec2dir.razglobi_imena( imena= danni.opisanie.replace(' ','_'), rubrika= danni.rubrika or x.get('ime') or '', #rubrika_kysa = danni.rubrika_kysa, data = danni.data, dirname = None ) z = attr2item( z, default='') op = danni.opisanie.lower() opis = dictOrder() s = attr2item( opis) s.име = z.ime or '??' s.автор = z.avtori_plus s.откъде = [ danni.rubrika_kysa, danni.data ] s.издание = 'радио' s.етикети = [ z.zagolemi, z.dok, 'радиоколекция' in z.rubrika.lower() and 'стихове' not in op and 'прочит', 'стихове' in op and 'стихове', ] s.година = z.godina s['#част'] = z.nomer s['#продължителност'] = sizemins and sizemins*60 s.вид = [ k for k in 'разказ стихове'.split() if k in op] s.описание = (z.opisanie or '').replace('_', ' ') s['#автори_отделни'] = z.avtori if danni.opisanie != s.описание: s.ориг_описание = danni.opisanie s.ориг_рубрика = danni.rubrika #s.dirname = z.dirname if tyrsach and not z.bez_ime and z.ime: ime = z.ime if z.avtori_plus: ime += ' : '+z.avtori_plus s['#подобни'] = '\n# '.join( ['']+[str(t) for t in tyrsach( ime )]) for k,v in list( opis.items()): if isinstance( v, (tuple,list)): v = ' '.join( str(x) for x in v if x ) if not v: del opis[k] else: if isinstance( v,str) and v.isdigit(): v = int(v) opis[ k ] = v def filtr( fname ): return ''.join((fname ).replace( '._', '.' ).replace( '__', '_' ).replace( '+_', '+' ).replace( '_+', '+' ).replace( '"', '' ).replace( "'", '' ).replace( '(', '[' #sh ).replace( ')', ']' #sh ).replace( ':', '' #mplayer,make ).replace( ',', '' #mplayer #).replace( rI+'V'+p, '.4' #).replace( 'V'+p, '.5' #).replace( 3*rI+p,'.3' #).replace( 2*rI+p,'.2' #).replace( 1*rI+p,'.2' ##).replace( '\xA0',' ' ).split()) dirname = fname_kanal+'/'+fname_kanal_vreme makedirs( dirname) ldirname = z.get( 'dirname_cyr','').rsplit('--радио')[0] if ldirname in ('радио', danni.rubrika_kysa, danni.rubrika, danni.rubrika.replace(' ','_'), z.get('rubrika_') ): ldirname = '' if danni.rubrika_kysa: rubr = rec2dir.filt_er( danni.rubrika) if ldirname.startswith( rubr): ldirname = ldirname[ len( rubr):].lstrip('-') #print( '33333333333333333', ldirname, danni.rubrika, file= sys.stderr) ldirname = '+'.join( n for n in [ fname_kanal_vreme, danni.rubrika_kysa or x.get('ime'), ldirname[:60] ] if n ) for d in glob.glob( fname_kanal_vreme+'*'): try: os.remove( d) except: pass try: os.symlink( dirname, ldirname) except: pass fname = (z.dirname or fname_kanal)[:60] fname = filtr( sykr( fname)) fname = dirname + '/' + fname usability.Dumper.force_block = '>' usability.Dumper.shorten_width = 15 komentari = [ (k + ': ' +str(opis.pop(k))) for k in list( opis.keys()) if k[0]=='#' ] VIMtail = '# v' + 'im:ts=4:sw=4:expandtab:ft=yaml' #separated! r = usability.dump( opis) r += '\n'+'\n'.join( komentari) r += ''' срез: участници: редактор: превод: драматизация: адаптация: изпълнение: музика: зв.реж: зв.оп: зв.оформ: муз.оформ: запис: режисьор: съдържание: ''' + 0*''' #излишните полета може да се оставят празни или да се изтрият #срез: # 12:34.5 - 890.7 #или # 722 - # - 900.2 #или # име.на.парче1 # от-до # име.на.парче2 # от-до # ... ''' + VIMtail fopis0 = os.path.join( dirname, 'opis') fopis = fopis0 + '1' while os.path.exists( fopis): ro = open( fopis).read() if ro == r: break fopis += '1' else: with fopen( fopis) as f: f.write( r) #opis = link( opis1) if os.path.exists( fopis0): s = os.stat( fopis0) if s.st_nlink >1: os.remove( fopis0) else: f0 = fopis0 while os.path.exists( f0): f0 += '0' os.rename( fopis0, f0) os.link( fopis, fopis0) if o.cron_earlier_minutes: t -= datetime.timedelta( minutes= o.cron_earlier_minutes) if sizemins: if o.cron_later_percent: sizemins += (sizemins * o.cron_later_percent) // 100 if o.cron_earlier_minutes: sizemins += o.cron_earlier_minutes if o.cron_later_minutes: sizemins += o.cron_later_minutes print( t.minute, t.hour, t.day, t.month, '*', o.cron_user or '', o.cron, sizemins and '-m '+str(sizemins) or '', '--fname', fname, '--stream', x.stream, )
#!/usr/bin/env python3 # -*- coding: utf-8 -*- from svd_util.struct import DictAttr, attr2item from svd_util.lists import appendif, extendif, listif import re def realt( x): return '('+'|'.join( x)+')' izdateli = DictAttr( kynev = 'Кънев', pan = 'Пан', bnr = 'БНР', gega = 'ГегаНю', litia = 'Лития', rem = 'РЕМ', suprafon= 'Супрафон', balkanton= 'БалканТон', balkanton_kys = 'БТон', polysound= 'ПолиСаунд', orfei = 'Орфей', ckt = 'ЦентраленКукленТеатър', ckt_kys = 'ЦКТ', ) r_izdateli = dict( (v,k) for k,v in izdateli.items()) radio = 'радио' org_izdateli = { izdateli.balkanton, radio } _izdatel4opis = dict( (izdateli[k],izdateli[k].lower()) for k in 'balkanton pan litia bnr kynev polysound orfei'.split()) def izdatel4opis( i): return _izdatel4opis.get( i,i)