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')
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)
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, )