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 ') //||'
示例#2
0
 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)
示例#3
0
 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
示例#4
0
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
示例#5
0
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
示例#6
0
    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
示例#7
0
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,
             )
示例#8
0
#!/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)