Class: Arquivo::C118dir
- Inherits:
-
Enumerator
- Object
- Enumerator
- Arquivo::C118dir
- Defined in:
- lib/arquivo/dir.rb,
lib/arquivo/noise.rb
Overview
permite processar e arquivar pasta com documentos c118
Instance Attribute Summary collapse
-
#contem ⇒ Symbol
readonly
Conteudo da pasta.
-
#dados ⇒ Hash
readonly
Dados oficiais para classificacao de faturas e recibos.
-
#item ⇒ String
readonly
Documento c118.
-
#items ⇒ Enumerator
readonly
Items dentro duma pasta.
-
#local ⇒ String
readonly
Local da pasta.
-
#noiseprof ⇒ String
readonly
Perfil do maior silencio inicial de todos segmentos audio.
-
#nome ⇒ String
readonly
Nome ficheiro de arquivo.
-
#opcoes ⇒ Hash
readonly
Parametrizar JPG, MINUTA.
processamento collapse
-
#next_item ⇒ String
Proximo item dentro da pasta.
-
#processa_file(ext) ⇒ Object
processa ficheiro JPG, PDF ou AUDIO.
-
#processa_fim(num) ⇒ Object
cria ficheiros finais para arquivo.
-
#processa_items ⇒ Object
processa items duma pasta.
-
#processa_pasta ⇒ Object
processa conteudo duma pasta.
dados folhas-calculo c118 collapse
-
#obtem_dados ⇒ Hash
Dados oficiais para classificacao de faturas e recibos.
perfil silencio collapse
-
#cmd_silencio(seg, thr) ⇒ String
Comando para cortar silencio inicial sum segmento.
-
#cria_noiseprof(seg) ⇒ String
Perfil sonoro do silencio inicial dum segmento.
-
#duracao(audio) ⇒ Float
Duracao ficheiro audio em segundos.
-
#duracao_silencio(seg) ⇒ Float
Duracao silencio em segundos.
-
#maximo_silencio(lsg, thr) ⇒ Array<String, Float>
Segmento com maior duracao silencio inicial.
-
#noisy?(sin, thr) ⇒ Boolean
Segmento audio tem som ou silencio no inicio.
-
#obtem_noiseprof ⇒ String
Perfil do maior silencio inicial de todos segmentos audio.
-
#obtem_segmentos ⇒ Array
Lista segmentos audio com duracoes e file silencio.
Instance Method Summary collapse
-
#initialize(dir, opt) ⇒ C118dir
constructor
Pasta de documentos c118.
-
#obtem_conteudo(fls) ⇒ Symbol
Agrupa conteudo duma pasta segundo tipos de documentos validos.
Constructor Details
#initialize(dir, opt) ⇒ C118dir
Returns pasta de documentos c118.
41 42 43 44 45 46 47 48 49 |
# File 'lib/arquivo/noise.rb', line 41 def initialize(dir, opt) c = Dir.glob(File.join(dir, '*')) @local = dir @items = c.each @nome = File.basename(dir, File.extname(dir)) + '-' + Date.today.strftime('%Y%m%d') @opcoes = opt @contem = obtem_conteudo(c) end |
Instance Attribute Details
#contem ⇒ Symbol (readonly)
Returns conteudo da pasta.
23 24 25 |
# File 'lib/arquivo/noise.rb', line 23 def contem @contem end |
#dados ⇒ Hash (readonly)
Returns dados oficiais para classificacao de faturas e recibos.
28 29 30 |
# File 'lib/arquivo/noise.rb', line 28 def dados @dados end |
#item ⇒ String (readonly)
Returns documento c118.
26 27 28 |
# File 'lib/arquivo/noise.rb', line 26 def item @item end |
#items ⇒ Enumerator (readonly)
Returns items dentro duma pasta.
17 18 19 |
# File 'lib/arquivo/noise.rb', line 17 def items @items end |
#local ⇒ String (readonly)
Returns local da pasta.
15 16 17 |
# File 'lib/arquivo/noise.rb', line 15 def local @local end |
#noiseprof ⇒ String (readonly)
Returns perfil do maior silencio inicial de todos segmentos audio.
30 31 32 |
# File 'lib/arquivo/noise.rb', line 30 def noiseprof @noiseprof end |
#nome ⇒ String (readonly)
Returns nome ficheiro de arquivo.
19 20 21 |
# File 'lib/arquivo/noise.rb', line 19 def nome @nome end |
#opcoes ⇒ Hash (readonly)
Returns parametrizar JPG, MINUTA.
21 22 23 |
# File 'lib/arquivo/noise.rb', line 21 def opcoes @opcoes end |
Instance Method Details
#cmd_silencio(seg, thr) ⇒ String
Returns comando para cortar silencio inicial sum segmento.
101 102 103 |
# File 'lib/arquivo/noise.rb', line 101 def cmd_silencio(seg, thr) ";sox #{seg[0]} #{seg[2]} silence 1 #{opcoes[:sound]}t #{thr}% #{O2}" end |
#cria_noiseprof(seg) ⇒ String
Returns perfil sonoro do silencio inicial dum segmento.
113 114 115 116 117 118 119 120 121 122 |
# File 'lib/arquivo/noise.rb', line 113 def cria_noiseprof(seg) return unless seg[1] > opcoes[:sound] o = "tmp/noiseprof-#{File.basename(seg[0], File.extname(seg[0]))}" # obter noiseprof do silencio no inicio system "sox #{seg[0]} -n trim 0 #{seg[1]} noiseprof #{o} #{O2}" # so noiseprof validos sao devolvidos @noiseprof = File.size?(o).positive? ? o : nil end |
#duracao(audio) ⇒ Float
Returns duracao ficheiro audio em segundos.
132 133 134 |
# File 'lib/arquivo/noise.rb', line 132 def duracao(audio) `soxi -V0 -D #{audio} #{O1}`.to_f end |
#duracao_silencio(seg) ⇒ Float
Returns duracao silencio em segundos.
107 108 109 |
# File 'lib/arquivo/noise.rb', line 107 def duracao_silencio(seg) (seg[1] - duracao(seg[2])).round(2, half: :down) end |
#maximo_silencio(lsg, thr) ⇒ Array<String, Float>
Returns segmento com maior duracao silencio inicial.
93 94 95 96 |
# File 'lib/arquivo/noise.rb', line 93 def maximo_silencio(lsg, thr) system lsg.inject('') { |s, e| s + cmd_silencio(e, thr) }[1..-1] lsg.map { |e| [e[0], duracao_silencio(e)] }.max_by { |_, s| s } end |
#next_item ⇒ String
Returns proximo item dentro da pasta.
66 67 68 69 70 |
# File 'lib/arquivo/dir.rb', line 66 def next_item @item = items.next rescue StopIteration @item = nil end |
#noisy?(sin, thr) ⇒ Boolean
Returns segmento audio tem som ou silencio no inicio.
86 87 88 |
# File 'lib/arquivo/noise.rb', line 86 def noisy?(sin, thr) thr < opcoes[:threshold] && sin <= opcoes[:sound] end |
#obtem_conteudo(fls) ⇒ Symbol
Agrupa conteudo duma pasta segundo tipos de documentos validos
61 62 63 64 65 66 |
# File 'lib/arquivo/noise.rb', line 61 def obtem_conteudo(fls) t = fls.group_by { |f| File.ftype(f)[0] + File.basename(f)[0, 2] }.keys return unless t.size == 1 && DT.include?(t[0].to_sym) t[0].to_sym end |
#obtem_dados ⇒ Hash
Returns dados oficiais para classificacao de faturas e recibos.
74 75 76 77 78 79 80 81 82 83 84 85 86 |
# File 'lib/arquivo/dir.rb', line 74 def obtem_dados @dados = {} # somente faturas e recibos necessitam reclassificacao return unless i[fft frc].include?(contem) # folha c118-contas s = '1PbiMrtTtqGztZMhe3AiJbDS6NQE9o3hXebnQEFdt954' @dados = C118sheets.new.folhas .get_spreadsheet_values(s, contem.to_s + '!A2:E') .values.group_by { |k| k[0][/\w+/] } rescue StandardError @dados = {} end |
#obtem_noiseprof ⇒ String
Returns perfil do maior silencio inicial de todos segmentos audio.
70 71 72 73 74 75 76 77 78 79 80 81 |
# File 'lib/arquivo/noise.rb', line 70 def obtem_noiseprof return unless contem == :fsg l = obtem_segmentos return unless l.size.positive? t = -1 m = ['', 0] m = maximo_silencio(l, t += 1) while noisy?(m[1], t) cria_noiseprof(m) end |
#obtem_segmentos ⇒ Array
Returns lista segmentos audio com duracoes e file silencio.
125 126 127 128 |
# File 'lib/arquivo/noise.rb', line 125 def obtem_segmentos AT.map { |e| Dir.glob(File.join(local, 'sg*' + e)) }.flatten .map { |s| [s, duracao(s), "tmp/thr-#{File.basename(s)}"] } end |
#processa_file(ext) ⇒ Object
processa ficheiro JPG, PDF ou AUDIO
44 45 46 47 48 49 50 51 52 53 |
# File 'lib/arquivo/dir.rb', line 44 def processa_file(ext) opt = opcoes case ext when '.jpg' then C118jpg.new(item, opt).processa_jpg(dados) when '.pdf' then C118pdf.new(item, opt).processa_pdf(dados) when *AT then C118mp3.new(item, opt).processa_mp3(noiseprof) else puts "erro: #{ext} nao posso processar este tipo de dicheiro" end end |
#processa_fim(num) ⇒ Object
cria ficheiros finais para arquivo
26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
# File 'lib/arquivo/dir.rb', line 26 def processa_fim(num) return unless num.positive? cmd = if contem == :fsg "rm -f #{nome}.*;sox tmp/zip/* #{nome}.mp3" else "rm -f #{nome}.*;pdftk tmp/stamped* cat output #{nome}.pdf" end system cmd + ";cd tmp/zip;tar cf ../../#{nome}.tar *" \ ";cd ../..;gzip --best #{nome}.tar" \ ';rm -rf tmp' puts "#{nome} (#{num})" end |
#processa_items ⇒ Object
processa items duma pasta
10 11 12 13 14 15 16 17 18 19 20 21 |
# File 'lib/arquivo/dir.rb', line 10 def processa_items n = 0 while next_item if File.ftype(item) == 'directory' C118dir.new(item, opcoes).processa_pasta else processa_file(File.extname(item).downcase) n += 1 end end processa_fim(n) end |
#processa_pasta ⇒ Object
processa conteudo duma pasta
56 57 58 59 60 61 62 63 |
# File 'lib/arquivo/dir.rb', line 56 def processa_pasta if contem system 'mkdir -p tmp/zip' obtem_dados obtem_noiseprof end processa_items end |