Example #1
0
    def zapis( klas, az, d =None, naistina =False ):
        d = d or az.danni()

        dd = dictOrder()
        def slozhi( k):
            v = getattr( d, k)
            if isinstance( v, str) and v.isdigit(): v = int(v)
            if v or v==0: dd[ az.stoinosti[k] ] = v

        slozhi( 'ime')
        slozhi( 'imena')

        for (obhvat, e_simvol), stoinosti in sorted( d.etiketi.items(), key= lambda kv: (kv[0][0],not kv[0][1]) ):
            if not stoinosti: continue
            if obhvat:
                r = dd.setdefault( az.stoinosti[ obhvat], dictOrder() )
            else: r = dd
            if e_simvol:
                r[ az.stoinosti.simvoli ] = ' '.join( sorted( stoinosti))
            else:
                for k,vv in stoinosti:
                    if k[0]=='_': continue      #_vytr
                    if not isinstance( vv, (tuple, list)): vv = [vv]
                    #vv = [ v.strip() if isinstance( v, str) else v for v in vv ]
                    vv = [ int(v) if isinstance( v, str) and v.strip().isdigit() else v
                            for v in vv ]
                    if len(vv)==1: vv = vv[0]
                    r[ k] = vv

        kv4prev = [ az.stoinosti.ime, az.stoinosti.simvoli ] + [ az.stoinosti.get( k,k) for k in az.Prevod._vytr_svoistva]
        def prev( p):
            r = [ (az.stoinosti.ime, p.ime) ]
            if p.etiketi:
                r += [ ( az.stoinosti.simvoli, ' '.join( sorted( p.etiketi))) ]
            r += [ #(az.stoinosti[k],v)
                    (k,v)
                    for k,v in sorted( p.items())
                    if k[0]!='_' and v and k not in kv4prev ]
            return ( p.fname, len(r) > 1 and dictOrder( r) or p.ime)
        def prevodi2zapis( pr):
            return dictOrder( prev(p) for p in pr)

        if d.prevodi:
            dd[ az.stoinosti.prevodi] = prevodi2zapis( d.prevodi)
        if d.grupi:
            gg = [ dict( (k,v) for k,v in {
                     az.stoinosti.grupa: g.kyso,
                     az.stoinosti.ime:   g.dop and klas.PFX_GRUPA_DOP + g.dop or g.ime != g.kyso and g.ime or '',
                     az.stoinosti.prevodi: prevodi2zapis( g.elementi)
                    }.items() if v )
                    for g in d.grupi ]
            dd[ az.stoinosti.grupi] = gg

        r = dump( dd)
        VIMtail = '# v' + 'im:ts=4:sw=4:expandtab:ft=yaml' #separated!
        if d.komentari:
            r += '\n'+'\n'.join( d.komentari)
            if d.komentari[-1].lstrip('# ').startswith('vim:'): VIMtail= None
        if VIMtail: r += '\n'+VIMtail
        return az._zapis( r, az.redove, naistina= naistina, ext= '.yaml')
Example #2
0
def zapis2dir2srez2opis( fime, opis, optz):
    log()

    # разглоби име
    ot_ime = razglobi_ime( fime )    #predavane, ime, avtor, chast, vreme
    #print( '\n'.join( ': %s: %r' % kv for kv in ot_ime.items()) )

    # направи дириме
    #dirime = cyr2lat( sglobi( ot_ime.ime, ot_ime.avtor, ot_ime.chast, 'radio') )
    dir_ot_ime = ot_ime.get( 'dirname')
    dirime = dir_ot_ime or ot_ime.f

    # направи дир/ дир/0/
    mkdir( dirime)

    fopis = dirime+'/opis'

    #входящ опис
    nov_opis, srezove = popylni_opis( opis, ot_ime )

    '''
        c: 12 - 34
        c:
           1a:
               13 - 45
           2d: 55 - 65
    '''

    star_opis = dai_opis( fopis) or {}
    stari_srezove = ()
    if star_opis:
        parcheta = star_opis.get( cyr.parcheta)
        if parcheta:
            if fime in parcheta:
                stari_srezove = parcheta[ fime].get( cyr.srezove)
        else:
            stari_srezove = star_opis.get( cyr.srezove)

        #if stari_srezove: print( 6666666, stari_srezove, srezove)

    if exists( fime):
        # ако срезове != стари срезове или звуковия файл е по-нов от дир/опис: режи, и парчетата към дир/
        if 1: # stari_srezove != srezove or newer( fime, fopis):
            ime = isinstance( opis, dict) and dai_ime( opis)
            #if not dir_ot_ime: ime = '-'.join( [ot_ime.f, ot_ime.data, ime or ''])
            izvadi( fime, srezove, dirime, nomer= ot_ime.get('nomer'), ime= ime, opfx= not dir_ot_ime and fime)
    else:
        print( '!!!! липсва', fime)

    if optz.parcheta:
        nov_opis = { cyr.parcheta: { fime: nov_opis }}

    # направи + попълни дир/опис - стария има предимство за всичко освен в срезовете
    print( 333333333, usability.dump( nov_opis))
    smesi_opisi( nov_opis, star_opis)
    #print( 444444444, usability.dump( nov_opis))

    if optz.zapis or optz.opis:
        r = usability.dump( nov_opis)
        VIMtail = '# v' + 'im:ts=4:sw=4:expandtab:ft=yaml' #separated!
        if VIMtail: r += '\n'+VIMtail
        save_if_different( fopis, r)

    # премести файл.* в дир/0/
    premesti_v_0( fime, dirime)
Example #3
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,
             )