Esempio n. 1
0
    def danni( az):
        dd = dictOrder()
        d = attr2item( dd)

        d.ime   = az.ime    #''
        d.imena = az.imena  #{ lang:''}

        #общ речник с обхват:стойност
        dt = {}
        for k,v in az.etiketi.items():
            dt[k] = { '': v}
        for k,v in az.etiketi_papka.items():
            dt.setdefault( k, {})[ 'papka'] = v
        for k,v in az.etiketi_element.items():
            dt.setdefault( k, {})[ 'element'] = v

        #разделяне по обхвати: за-всички, един,друг,..
        detiketi = {}
        for k,vv in dt.items():
            vvv = list( vv.values())
            if len(vv)>1 and all( vvv[0]== vi for vi in vvv[1:]):
                detiketi.setdefault( '',{})[k] = vvv[0]
                continue
            for obhvat,v in vv.items():
                detiketi.setdefault( obhvat,{})[k] = v

        #разделяне по вид стойност - bool или не
        d.etiketi = {}
        for obhvat, et in detiketi.items():
            d.etiketi[ (obhvat, True) ] = e1 = [] #[ k ]
            d.etiketi[ (obhvat, False)] = e2 = [] #[ (k,v) ]
            for k,v in sorted( et.items()):
                if k in az.izvyn_etiketi: continue
                if v is True: e1.append( k )
                else: e2.append( (k,v) )
                #elif not isinstance( v, str): e2.append( (k,v) )
                #else: e2.append( (k,v.splitlines()))

        d.prevodi = ()  #[ (file,prev,org) ] извън групи
        d.grupi = []    #[ { дългоиме или дългоиме,късоиме или късоиме,допиме , [ (file,prev,org) ] } ]
        if az.prevodi:
            pr = [ p for p in az.prevodi.values() if not p.grupa ]
            sort_prevodi = az.options.sort_prevodi or az.etiketi.sort_prevodi
            if sort_prevodi: pr = sorted( pr, key= lambda p: p.fname)
            d.prevodi = pr

            gr = az.grupi
            if sort_prevodi: gr = sorted( gr, key= lambda g:g.ime)
            d.grupi = gr

        d.komentari = az.komentari  #['']
        return d
Esempio n. 2
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,
             )