catori 0.2.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. data/VERSION +1 -0
  2. data/bin/catori +9 -0
  3. data/changelog.txt +3 -0
  4. data/construir +3 -0
  5. data/crear_vista.sql +8 -0
  6. data/ext/audiofile/MANIFEST +8 -0
  7. data/ext/audiofile/README +11 -0
  8. data/ext/audiofile/audiofile.c +833 -0
  9. data/ext/audiofile/audiofile.rd +265 -0
  10. data/ext/audiofile/depend +0 -0
  11. data/ext/audiofile/extconf.rb +8 -0
  12. data/ext/audiofile/fail.rb +22 -0
  13. data/ext/audiofile/mkmf.log +34 -0
  14. data/ext/audiofile/test.rb +229 -0
  15. data/ext/flac/extconf.rb +5 -0
  16. data/ext/flac/flac.c +75 -0
  17. data/ext/flac/mkmf.log +12 -0
  18. data/ext/flac/test.rb +3 -0
  19. data/ext/mahoro-0.1/INSTALL +9 -0
  20. data/ext/mahoro-0.1/extconf.rb +7 -0
  21. data/ext/mahoro-0.1/mahoro.c +187 -0
  22. data/ext/mahoro-0.1/mkmf.log +24 -0
  23. data/ext/mahoro-0.1/test.rb +41 -0
  24. data/ext/mpc/extconf.rb +5 -0
  25. data/ext/mpc/id3tag.c +245 -0
  26. data/ext/mpc/id3tag.h +5 -0
  27. data/ext/mpc/mkmf.log +12 -0
  28. data/ext/mpc/mpc.c +56 -0
  29. data/ext/mpc/mpp.h +194 -0
  30. data/ext/mpc/mppdec.h +1171 -0
  31. data/ext/mpc/test.rb +3 -0
  32. data/ext/rmac/extconf.rb +7 -0
  33. data/ext/rmac/mkmf.log +22 -0
  34. data/ext/rmac/rmac.cpp +162 -0
  35. data/ext/vorbisfile/ChangeLog +11 -0
  36. data/ext/vorbisfile/README +33 -0
  37. data/ext/vorbisfile/configure +2 -0
  38. data/ext/vorbisfile/extconf.rb +9 -0
  39. data/ext/vorbisfile/mkmf.log +68 -0
  40. data/ext/vorbisfile/test.rb +78 -0
  41. data/ext/vorbisfile/vorbisfile.c +482 -0
  42. data/instalar.txt +19 -0
  43. data/install.rb +11 -0
  44. data/lib/audioinfo.rb +321 -0
  45. data/lib/catori.rb +131 -0
  46. data/lib/catori/Catalogador.rb +71 -0
  47. data/lib/catori/Db.rb +81 -0
  48. data/lib/catori/Gui.rb +52 -0
  49. data/lib/catori/Installer.rb +16 -0
  50. data/lib/catori/Query.rb +82 -0
  51. data/lib/catori/XML.rb +42 -0
  52. data/lib/catori/catori_gui.glade +340 -0
  53. data/lib/catori/catori_gui.glade.bak +340 -0
  54. data/lib/catori/catori_gui.gladep +8 -0
  55. data/lib/catori/catori_gui.gladep.bak +8 -0
  56. data/lib/catori/taglib.rb +227 -0
  57. data/lib/pixmaps/album.png +0 -0
  58. data/lib/pixmaps/artist.png +0 -0
  59. data/lib/pixmaps/cdr.png +0 -0
  60. data/lib/pixmaps/song.png +0 -0
  61. data/lib/taglib.rb +230 -0
  62. data/sql/catori_mysql.sql +68 -0
  63. data/sql/catori_pg.sql +65 -0
  64. data/tests/saw.ape +0 -0
  65. data/tests/saw.flac +0 -0
  66. data/tests/saw.mp3 +0 -0
  67. data/tests/saw.mpc +0 -0
  68. data/tests/saw.ogg +0 -0
  69. data/tests/saw.wav +0 -0
  70. data/tests/test_audioinfo.rb +43 -0
  71. metadata +217 -0
@@ -0,0 +1,71 @@
1
+ require 'digest/sha1'
2
+ require 'progressbar'
3
+ module Catori
4
+ class Catalogador
5
+ attr_accessor :fp,:dev,:disco,:db
6
+ def initialize(disco,pretend, dev="/mnt/dvd")
7
+ @dev=dev
8
+ @disco=disco
9
+ @pretend=pretend
10
+ @db = Catori::Db::conectar
11
+ end
12
+ def deletePrevious
13
+ @db.do("DELETE FROM cd where cd_id=?",@disco)
14
+ end
15
+ def llenarDisco(disco)
16
+ if(@db.select_one("select COUNT(*) from cd WHERE cd_id=?",disco).to_s=="0")
17
+ #puts "Agregar cd #{disco}"
18
+ sql="INSERT INTO cd (cd_id) VALUES (?)"
19
+ @db.execute(sql,disco)
20
+ end
21
+ end
22
+ def rastrea
23
+ llenarDisco(disco) unless @pretend
24
+ oDir=Dir[@dev+"/**/*"];
25
+ pbar = ProgressBar.new("#{@disco}", oDir.size) unless @pretend
26
+ oDir.each do |sFile|
27
+ begin
28
+ pbar.inc unless @pretend
29
+ sPath=sFile.gsub(@dev,"")
30
+ if oInfo=AudioInfo::infoFile(sFile)
31
+ if oInfo.title.nil?
32
+ puts "Error!"+sFile
33
+ exit
34
+ end
35
+ if (!@pretend)
36
+ Catori::Db.llenarArtista(oInfo)
37
+ Catori::Db.llenarAlbum(oInfo)
38
+ Catori::Db.llenarCancion(oInfo)
39
+ llenarArchivo(oInfo)
40
+ else
41
+ p oInfo
42
+ end
43
+ else
44
+ #puts sPath+" No es musica"
45
+ end
46
+ rescue StandardError => exp
47
+ puts "Error running script: " + exp.message
48
+
49
+ puts sFile
50
+ p oInfo
51
+ p exp.backtrace
52
+ exit
53
+ end # end begin
54
+ end # end do
55
+ pbar.finish unless @pretend
56
+ end
57
+ def llenarArchivo(oInfo)
58
+ sPath=oInfo.sFile.gsub(@dev,'')
59
+ sPathId=sPath.crearSha();
60
+ sAlbum=oInfo.album.crearSha
61
+ sArtist=oInfo.artist.crearSha
62
+ sSong=oInfo.title.crearSha
63
+ if (@db.select_one("SELECT COUNT(*) from file WHERE cd_id=? AND file_id=?",@disco,sPathId).to_s=="0")
64
+ sql="INSERT INTO file (artist_id,album_id,song_id,cd_id,file_id,file_name, sample_rate, bps, time, bits_per_sample, channels,size) VALUES (?,?,?,?,?,?,?,?,?,?,?,?)"
65
+ #puts "Archivo #{sPath}: "+oInfo.tracknumber.to_s+" - "+oInfo.title
66
+ @db.execute(sql,sArtist,sAlbum,sSong,@disco,sPathId,sPath, oInfo.sample_rate, oInfo.bps,oInfo.time, oInfo.bits_per_sample,oInfo.channels, oInfo.size)
67
+ end
68
+ end
69
+ end
70
+ end
71
+
@@ -0,0 +1,81 @@
1
+ require 'catori'
2
+ require 'dbi'
3
+ class String
4
+ def crearSha()
5
+ Digest::SHA1.hexdigest(self.downcase.gsub(/\W/,""))[0,32]
6
+ end
7
+ end
8
+ module Catori
9
+ class Db
10
+ private_class_method :new
11
+ @@db=nil
12
+ def self.conectar
13
+ if @@db.nil?
14
+ data=self.data_conexion
15
+ @@db=DBI.connect('DBI:Mysql:'+data['database'], data['user'], data['password'])
16
+ end
17
+ @@db
18
+ end
19
+ def self.data_conexion
20
+ if(File.exists?(Catori::CONFIG_FILE))
21
+ data={}
22
+ File.open( Catori::CONFIG_FILE ) { |yf| data=YAML::load( yf ) }
23
+ else
24
+ raise "Install the application using catori --install"
25
+ end
26
+ data
27
+ end
28
+ def self.llenarCancion(oInfo)
29
+ sSong=oInfo.title
30
+ if(@@db.select_one("select COUNT(*) from song WHERE song_id=?",sSong.crearSha).to_s=="0")
31
+ #puts "Agregar cancion #{sSong}"
32
+ sql="INSERT INTO song (song_id,song_name) VALUES (?,?)"
33
+ @@db.execute(sql,sSong.crearSha,sSong)
34
+ end
35
+ sAlbum=oInfo.album
36
+ sArtist=oInfo.artist
37
+ if(@@db.select_one("select COUNT(*) from album_song WHERE artist_id=? AND album_id=? and song_id=?",sArtist.crearSha,sAlbum.crearSha,sSong.crearSha).to_s=="0")
38
+ #puts "Agregar cancion en album #{sSong}"
39
+ sql="INSERT INTO album_song (artist_id,album_id,song_id,as_track) VALUES (?,?,?,?)"
40
+ @@db.execute(sql, sArtist.crearSha, sAlbum.crearSha, sSong.crearSha, oInfo.tracknumber)
41
+ elsif(@@db.select_one("SELECT COUNT(*) from album_song WHERE as_track!=? and artist_id=? and album_id=? and song_id=?",oInfo.tracknumber, sArtist.crearSha, sAlbum.crearSha, sSong.crearSha))
42
+ sql="UPDATE album_song SET as_track=? WHERE artist_id=? and album_id=? and song_id=?"
43
+ @@db.execute(sql,oInfo.tracknumber,sArtist.crearSha, sAlbum.crearSha, sSong.crearSha)
44
+ end
45
+ end
46
+ def self.llenarArtista(oInfo)
47
+ sArtist=oInfo.artist
48
+ if(@@db.select_one("select COUNT(*) from artist WHERE artist_id=?",sArtist.crearSha).to_s=="0")
49
+ #puts "Agregar artista #{sArtist}"
50
+ sql="INSERT INTO artist (artist_id,artist_name) VALUES (?,?)"
51
+ @@db.execute(sql,sArtist.crearSha,sArtist)
52
+ end
53
+ end
54
+ def self.llenarAlbum(oInfo)
55
+ sAlbum=oInfo.album
56
+ sFecha=oInfo.year
57
+ sArtist=oInfo.artist
58
+ if(@@db.select_one("select COUNT(*) from album WHERE artist_id=? AND album_id=?",sArtist.crearSha,sAlbum.crearSha).to_s=="0")
59
+ #puts "Agregar album #{sAlbum}"
60
+ sql="INSERT INTO album (artist_id,album_id,album_name,album_year) VALUES (?,?,?,?)"
61
+ @@db.execute(sql,sArtist.crearSha,sAlbum.crearSha,sAlbum,sFecha)
62
+ end
63
+ end
64
+ def self.actualizarAlbumFecha(oInfo)
65
+ sAlbum=oInfo.album
66
+ sFecha=oInfo.year
67
+ sArtist=oInfo.artist
68
+ sql="UPDATE album SET album_year=? WHERE artist_id=? and album_id=?"
69
+ @@db.execute(sql,sFecha,sArtist.crearSha,sAlbum.crearSha)
70
+ end
71
+ def self.actualizarArchivo(oInfo)
72
+ sPathId=oInfo.sFile.crearSha();
73
+ sAlbum=oInfo.album.crearSha
74
+ sArtist=oInfo.artist.crearSha
75
+ sSong=oInfo.title.crearSha
76
+ raise "Error con el id de archivo" if (@@db.select_one("SELECT COUNT(*) from file WHERE cd_id=? AND file_id=?",oInfo.cd,sPathId).to_s=="0")
77
+ sql="UPDATE file SET artist_id=?,album_id=?,song_id=? WHERE cd_id=? AND file_id=?"
78
+ @@db.execute(sql,sArtist,sAlbum,sSong,oInfo.cd,sPathId)
79
+ end
80
+ end
81
+ end
@@ -0,0 +1,52 @@
1
+ require 'libglade2'
2
+ require 'yaml'
3
+
4
+ module Catori # {{{
5
+ class Gui # {{{
6
+ def initialize (hQuery)# {{{
7
+ Gtk.init
8
+
9
+ @wTree = GladeXML.new(Catori::LIB_DIR+'/catori/catori_gui.glade') {|handler|
10
+ method(handler)
11
+ }
12
+ widget=@wTree.get_widget('tvSearch')
13
+ ren0=Gtk::CellRendererPixbuf.new
14
+ ren1=Gtk::CellRendererText.new
15
+ col0=Gtk::TreeViewColumn.new("", ren0, :pixbuf=>4)
16
+ widget.append_column(col0)
17
+ col1=Gtk::TreeViewColumn.new("", ren1, :text=>0)
18
+ widget.append_column(col1)
19
+ col2=Gtk::TreeViewColumn.new("Track", ren1, :text=>1)
20
+ widget.append_column(col2)
21
+ col3=Gtk::TreeViewColumn.new("Song", ren1, :text=>2)
22
+ widget.append_column(col3)
23
+ col4=Gtk::TreeViewColumn.new("File", ren1, :text=>3)
24
+ widget.append_column(col4)
25
+ #dibujitos!
26
+ @pix={}
27
+ @pix['album']=Gdk::Pixbuf.new(Catori::LIB_DIR+'/pixmaps/album.png',16,16)
28
+ @pix['artist']=Gdk::Pixbuf.new(Catori::LIB_DIR+'/pixmaps/artist.png',16,16)
29
+ @pix['cd']=Gdk::Pixbuf.new(Catori::LIB_DIR+'/pixmaps/cdr.png',16,16)
30
+ @pix['song']=Gdk::Pixbuf.new(Catori::LIB_DIR+'/pixmaps/song.png',16,16)
31
+
32
+ end
33
+ def start
34
+ Gtk.main
35
+ end
36
+ def destroy
37
+ Gtk.main_quit
38
+ exit
39
+ end
40
+ def on_bSearch_clicked
41
+ hQuery={}
42
+ %w{artist album title cd file}.each {|tag|
43
+ p 'tb'+tag
44
+ val=@wTree.get_widget('tb'+tag).text
45
+ hQuery[tag]=val if val!=""
46
+ }
47
+ return if hQuery.size==0
48
+ query=Query.new(hQuery)
49
+ query.gtk(@wTree.get_widget('tvSearch'),@pix)
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,16 @@
1
+ require 'catori'
2
+ module Catori
3
+ class Installer
4
+ def self.install(db,user,pw)
5
+ require 'ftools'
6
+ File.mkpath Catori::CONFIG_DIR
7
+ data={"user"=>user,"database"=>db,"password"=>pw}
8
+ File.open(Catori::CONFIG_FILE,"w") {|f|
9
+ YAML.dump(data,f) }
10
+ sql=File.expand_path(File.dirname(__FILE__)+"../../../sql/catori_mysql.sql")
11
+ s=`mysql -f -u #{user} --password=#{pw} #{db} < #{sql}`
12
+ puts s
13
+ puts "Catori installed"
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,82 @@
1
+ require 'catori'
2
+ module Catori
3
+ class Query
4
+ def initialize(hQuery)
5
+ @hQuery=hQuery
6
+ @db = Catori::Db.conectar
7
+
8
+ aCond=Array.new
9
+ aCond.push("(artist_name like '%"+@hQuery['artist'].to_s+"%')") if !@hQuery['artist'].nil?
10
+ aCond.push("(album_name like '%"+@hQuery['album'].to_s+"%')") if !@hQuery['album'].nil?
11
+ aCond.push("(song_name like '%"+@hQuery['title'].to_s+"%')") if !@hQuery['title'].nil?
12
+ aCond.push("(cd_id ='"+@hQuery['cd'].to_s+"')") if !@hQuery['cd'].nil?
13
+ aCond.push("(file_name like '%"+@hQuery['file'].to_s+"%')") if !@hQuery['file'].nil?
14
+ sCond=aCond.join(" AND ")
15
+ @sQuery="SELECT * from edicion WHERE "+sCond+" ORDER by cd_id, artist_name, album_name, as_track,song_name,file_name"
16
+ end
17
+ def plain
18
+ sSupport= AudioInfo::SUPPORT.join('|')
19
+ out=[]
20
+ @db.select_all(@sQuery) {|row|
21
+ row['file_name']=~/\.(#{sSupport})$/i
22
+ sType=$1
23
+ out << sprintf("CD:%s , Artist: %s,Album: %s, Song:[%02d] %s, Type: %s",row['cd_id'],row['artist_name'], row['album_name'],row['as_track'],row['song_name'],sType)
24
+ }
25
+ out.join("\n")
26
+
27
+ end
28
+ def xml
29
+ require "rexml/document"
30
+ doc=REXML::Document.new
31
+ root=doc.add_element('catori')
32
+ @db.select_all(@sQuery) {|row|
33
+ file=root.add_element('file', {'cd'=>row['cd_id'], 'path'=>row['file_name'],'id'=>row['file_id']})
34
+ file.add_element('artist').text=row['artist_name']
35
+ file.add_element('album').text=row['album_name']
36
+ file.add_element('tracknumber').text=row['as_track'].to_s
37
+ file.add_element('title').text=row['song_name']
38
+ file.add_element('year').text=row['album_year'].to_s
39
+ }
40
+ s=""
41
+ doc.write(s,1,0)
42
+ s
43
+ end
44
+ def gtk(widget,pix)
45
+ ts=Gtk::TreeStore.new(String,String,String,String,Gdk::Pixbuf)
46
+ widget.model=ts
47
+ widget.headers_visible=true
48
+ cd=nil
49
+ artist=nil
50
+ album=nil
51
+ cdi=nil
52
+ artisti=nil
53
+ albumi=nil
54
+ @db.select_all(@sQuery) {|row|
55
+ if row['cd_id']!=cd
56
+ cdi=ts.append(nil)
57
+ artisti=nil
58
+ albumi=nil
59
+ artist=nil
60
+ album=nil
61
+ end
62
+ cd=row['cd_id']
63
+ cdi[0]=cd
64
+ cdi[4]=pix['cd']
65
+ artisti=ts.append(cdi) if row['artist_name']!=artist
66
+ artist=row['artist_name']
67
+ artisti[0]=artist
68
+ artisti[4]=pix['artist']
69
+ albumi=ts.append(artisti) if row['album_name']!=album
70
+ album=row['album_name']
71
+ albumi[0]=album+"("+row['album_year'].to_s+")"
72
+ albumi[4]=pix['album']
73
+ titlei=ts.append(albumi)
74
+ titlei[1]=row['as_track'].to_s
75
+ titlei[2]=row['song_name']
76
+ titlei[3]=row['file_name']
77
+ titlei[4]=pix['song']
78
+ # p row
79
+ }
80
+ end
81
+ end
82
+ end
@@ -0,0 +1,42 @@
1
+ require "rexml/document"
2
+ require "catori"
3
+ module Catori
4
+ class XML
5
+ def initialize(sFile)
6
+ file = File.new(sFile)
7
+ @db = Catori::Db.conectar
8
+ @root = REXML::Document.new(file).root
9
+ @archivos=[]
10
+ end
11
+ def rastrea
12
+ @root.elements.each("file") {|f|
13
+ cd=f.attributes['cd']
14
+ file_id=f.attributes['id']
15
+ file_name=@db.select_one("select file_name from file WHERE file_id=? and cd_id=?",file_id,cd).to_s
16
+ oInfo=AudioInfo::Virtual.new(cd,file_name)
17
+ f.elements.each("*") {|e|
18
+ oInfo.send(e.name+"=",e.text) if !e.text.nil?
19
+ }
20
+
21
+ @archivos.push(oInfo)
22
+ }
23
+ end
24
+ def actualizar
25
+ albums=[]
26
+ i=0
27
+ @archivos.each{|oInfo|
28
+ Catori::Db.llenarArtista(oInfo)
29
+ Catori::Db.llenarAlbum(oInfo)
30
+ Catori::Db.llenarCancion(oInfo)
31
+ id_album=oInfo.album.crearSha+oInfo.artist.crearSha
32
+ if !oInfo.year.nil? and !albums.include?(id_album)
33
+ Catori::Db.actualizarAlbumFecha(oInfo)
34
+ albums.push(id_album)
35
+ end
36
+ Catori::Db.actualizarArchivo(oInfo)
37
+ i+=1
38
+ }
39
+ i
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,340 @@
1
+ <?xml version="1.0" standalone="no"?> <!--*- mode: xml -*-->
2
+ <!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade-2.0.dtd">
3
+
4
+ <glade-interface>
5
+
6
+ <widget class="GtkWindow" id="window1">
7
+ <property name="visible">True</property>
8
+ <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
9
+ <property name="title" translatable="yes">Catori</property>
10
+ <property name="type">GTK_WINDOW_TOPLEVEL</property>
11
+ <property name="window_position">GTK_WIN_POS_NONE</property>
12
+ <property name="modal">False</property>
13
+ <property name="resizable">True</property>
14
+ <property name="destroy_with_parent">False</property>
15
+ <property name="decorated">True</property>
16
+ <property name="skip_taskbar_hint">False</property>
17
+ <property name="skip_pager_hint">False</property>
18
+ <property name="type_hint">GDK_WINDOW_TYPE_HINT_NORMAL</property>
19
+ <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
20
+ <property name="focus_on_map">True</property>
21
+ <property name="urgency_hint">False</property>
22
+
23
+ <child>
24
+ <widget class="GtkVBox" id="vbox2">
25
+ <property name="visible">True</property>
26
+ <property name="homogeneous">False</property>
27
+ <property name="spacing">0</property>
28
+
29
+ <child>
30
+ <widget class="GtkTable" id="table1">
31
+ <property name="visible">True</property>
32
+ <property name="n_rows">5</property>
33
+ <property name="n_columns">2</property>
34
+ <property name="homogeneous">False</property>
35
+ <property name="row_spacing">0</property>
36
+ <property name="column_spacing">0</property>
37
+
38
+ <child>
39
+ <widget class="GtkLabel" id="label5">
40
+ <property name="visible">True</property>
41
+ <property name="label" translatable="yes">Artista</property>
42
+ <property name="use_underline">False</property>
43
+ <property name="use_markup">False</property>
44
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
45
+ <property name="wrap">False</property>
46
+ <property name="selectable">False</property>
47
+ <property name="xalign">0</property>
48
+ <property name="yalign">0.5</property>
49
+ <property name="xpad">0</property>
50
+ <property name="ypad">0</property>
51
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
52
+ <property name="width_chars">-1</property>
53
+ <property name="single_line_mode">False</property>
54
+ <property name="angle">0</property>
55
+ </widget>
56
+ <packing>
57
+ <property name="left_attach">0</property>
58
+ <property name="right_attach">1</property>
59
+ <property name="top_attach">0</property>
60
+ <property name="bottom_attach">1</property>
61
+ <property name="x_options">fill</property>
62
+ <property name="y_options"></property>
63
+ </packing>
64
+ </child>
65
+
66
+ <child>
67
+ <widget class="GtkLabel" id="label6">
68
+ <property name="visible">True</property>
69
+ <property name="label" translatable="yes">Album</property>
70
+ <property name="use_underline">False</property>
71
+ <property name="use_markup">False</property>
72
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
73
+ <property name="wrap">False</property>
74
+ <property name="selectable">False</property>
75
+ <property name="xalign">0</property>
76
+ <property name="yalign">0.5</property>
77
+ <property name="xpad">0</property>
78
+ <property name="ypad">0</property>
79
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
80
+ <property name="width_chars">-1</property>
81
+ <property name="single_line_mode">False</property>
82
+ <property name="angle">0</property>
83
+ </widget>
84
+ <packing>
85
+ <property name="left_attach">0</property>
86
+ <property name="right_attach">1</property>
87
+ <property name="top_attach">1</property>
88
+ <property name="bottom_attach">2</property>
89
+ <property name="x_options">fill</property>
90
+ <property name="y_options"></property>
91
+ </packing>
92
+ </child>
93
+
94
+ <child>
95
+ <widget class="GtkLabel" id="label7">
96
+ <property name="visible">True</property>
97
+ <property name="label" translatable="yes">Tema</property>
98
+ <property name="use_underline">False</property>
99
+ <property name="use_markup">False</property>
100
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
101
+ <property name="wrap">False</property>
102
+ <property name="selectable">False</property>
103
+ <property name="xalign">0</property>
104
+ <property name="yalign">0.5</property>
105
+ <property name="xpad">0</property>
106
+ <property name="ypad">0</property>
107
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
108
+ <property name="width_chars">-1</property>
109
+ <property name="single_line_mode">False</property>
110
+ <property name="angle">0</property>
111
+ </widget>
112
+ <packing>
113
+ <property name="left_attach">0</property>
114
+ <property name="right_attach">1</property>
115
+ <property name="top_attach">2</property>
116
+ <property name="bottom_attach">3</property>
117
+ <property name="x_options">fill</property>
118
+ <property name="y_options"></property>
119
+ </packing>
120
+ </child>
121
+
122
+ <child>
123
+ <widget class="GtkLabel" id="label8">
124
+ <property name="visible">True</property>
125
+ <property name="label" translatable="yes">Archivo</property>
126
+ <property name="use_underline">False</property>
127
+ <property name="use_markup">False</property>
128
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
129
+ <property name="wrap">False</property>
130
+ <property name="selectable">False</property>
131
+ <property name="xalign">0</property>
132
+ <property name="yalign">0.5</property>
133
+ <property name="xpad">0</property>
134
+ <property name="ypad">0</property>
135
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
136
+ <property name="width_chars">-1</property>
137
+ <property name="single_line_mode">False</property>
138
+ <property name="angle">0</property>
139
+ </widget>
140
+ <packing>
141
+ <property name="left_attach">0</property>
142
+ <property name="right_attach">1</property>
143
+ <property name="top_attach">3</property>
144
+ <property name="bottom_attach">4</property>
145
+ <property name="x_options">fill</property>
146
+ <property name="y_options"></property>
147
+ </packing>
148
+ </child>
149
+
150
+ <child>
151
+ <widget class="GtkLabel" id="label9">
152
+ <property name="visible">True</property>
153
+ <property name="label" translatable="yes">Medio</property>
154
+ <property name="use_underline">False</property>
155
+ <property name="use_markup">False</property>
156
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
157
+ <property name="wrap">False</property>
158
+ <property name="selectable">False</property>
159
+ <property name="xalign">0</property>
160
+ <property name="yalign">0.5</property>
161
+ <property name="xpad">0</property>
162
+ <property name="ypad">0</property>
163
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
164
+ <property name="width_chars">-1</property>
165
+ <property name="single_line_mode">False</property>
166
+ <property name="angle">0</property>
167
+ </widget>
168
+ <packing>
169
+ <property name="left_attach">0</property>
170
+ <property name="right_attach">1</property>
171
+ <property name="top_attach">4</property>
172
+ <property name="bottom_attach">5</property>
173
+ <property name="x_options">fill</property>
174
+ <property name="y_options"></property>
175
+ </packing>
176
+ </child>
177
+
178
+ <child>
179
+ <widget class="GtkEntry" id="tbartist">
180
+ <property name="visible">True</property>
181
+ <property name="can_focus">True</property>
182
+ <property name="editable">True</property>
183
+ <property name="visibility">True</property>
184
+ <property name="max_length">0</property>
185
+ <property name="text" translatable="yes"></property>
186
+ <property name="has_frame">True</property>
187
+ <property name="invisible_char">*</property>
188
+ <property name="activates_default">False</property>
189
+ </widget>
190
+ <packing>
191
+ <property name="left_attach">1</property>
192
+ <property name="right_attach">2</property>
193
+ <property name="top_attach">0</property>
194
+ <property name="bottom_attach">1</property>
195
+ <property name="y_options"></property>
196
+ </packing>
197
+ </child>
198
+
199
+ <child>
200
+ <widget class="GtkEntry" id="tbalbum">
201
+ <property name="visible">True</property>
202
+ <property name="can_focus">True</property>
203
+ <property name="editable">True</property>
204
+ <property name="visibility">True</property>
205
+ <property name="max_length">0</property>
206
+ <property name="text" translatable="yes"></property>
207
+ <property name="has_frame">True</property>
208
+ <property name="invisible_char">*</property>
209
+ <property name="activates_default">False</property>
210
+ </widget>
211
+ <packing>
212
+ <property name="left_attach">1</property>
213
+ <property name="right_attach">2</property>
214
+ <property name="top_attach">1</property>
215
+ <property name="bottom_attach">2</property>
216
+ <property name="y_options"></property>
217
+ </packing>
218
+ </child>
219
+
220
+ <child>
221
+ <widget class="GtkEntry" id="tbtitle">
222
+ <property name="visible">True</property>
223
+ <property name="can_focus">True</property>
224
+ <property name="editable">True</property>
225
+ <property name="visibility">True</property>
226
+ <property name="max_length">0</property>
227
+ <property name="text" translatable="yes"></property>
228
+ <property name="has_frame">True</property>
229
+ <property name="invisible_char">*</property>
230
+ <property name="activates_default">False</property>
231
+ </widget>
232
+ <packing>
233
+ <property name="left_attach">1</property>
234
+ <property name="right_attach">2</property>
235
+ <property name="top_attach">2</property>
236
+ <property name="bottom_attach">3</property>
237
+ <property name="y_options"></property>
238
+ </packing>
239
+ </child>
240
+
241
+ <child>
242
+ <widget class="GtkEntry" id="tbfile">
243
+ <property name="visible">True</property>
244
+ <property name="can_focus">True</property>
245
+ <property name="editable">True</property>
246
+ <property name="visibility">True</property>
247
+ <property name="max_length">0</property>
248
+ <property name="text" translatable="yes"></property>
249
+ <property name="has_frame">True</property>
250
+ <property name="invisible_char">*</property>
251
+ <property name="activates_default">False</property>
252
+ </widget>
253
+ <packing>
254
+ <property name="left_attach">1</property>
255
+ <property name="right_attach">2</property>
256
+ <property name="top_attach">3</property>
257
+ <property name="bottom_attach">4</property>
258
+ <property name="y_options"></property>
259
+ </packing>
260
+ </child>
261
+
262
+ <child>
263
+ <widget class="GtkEntry" id="tbcd">
264
+ <property name="visible">True</property>
265
+ <property name="can_focus">True</property>
266
+ <property name="editable">True</property>
267
+ <property name="visibility">True</property>
268
+ <property name="max_length">0</property>
269
+ <property name="text" translatable="yes"></property>
270
+ <property name="has_frame">True</property>
271
+ <property name="invisible_char">*</property>
272
+ <property name="activates_default">False</property>
273
+ </widget>
274
+ <packing>
275
+ <property name="left_attach">1</property>
276
+ <property name="right_attach">2</property>
277
+ <property name="top_attach">4</property>
278
+ <property name="bottom_attach">5</property>
279
+ <property name="y_options"></property>
280
+ </packing>
281
+ </child>
282
+ </widget>
283
+ <packing>
284
+ <property name="padding">0</property>
285
+ <property name="expand">False</property>
286
+ <property name="fill">True</property>
287
+ </packing>
288
+ </child>
289
+
290
+ <child>
291
+ <widget class="GtkButton" id="bSearch">
292
+ <property name="visible">True</property>
293
+ <property name="can_focus">True</property>
294
+ <property name="label" translatable="yes">Search</property>
295
+ <property name="use_underline">True</property>
296
+ <property name="relief">GTK_RELIEF_NORMAL</property>
297
+ <property name="focus_on_click">True</property>
298
+ <signal name="clicked" handler="on_bSearch_clicked" last_modification_time="Mon, 07 Apr 2008 05:16:35 GMT"/>
299
+ </widget>
300
+ <packing>
301
+ <property name="padding">0</property>
302
+ <property name="expand">False</property>
303
+ <property name="fill">False</property>
304
+ </packing>
305
+ </child>
306
+
307
+ <child>
308
+ <widget class="GtkScrolledWindow" id="scrolledwindow1">
309
+ <property name="visible">True</property>
310
+ <property name="can_focus">True</property>
311
+ <property name="hscrollbar_policy">GTK_POLICY_ALWAYS</property>
312
+ <property name="vscrollbar_policy">GTK_POLICY_ALWAYS</property>
313
+ <property name="shadow_type">GTK_SHADOW_IN</property>
314
+ <property name="window_placement">GTK_CORNER_TOP_LEFT</property>
315
+
316
+ <child>
317
+ <widget class="GtkTreeView" id="tvSearch">
318
+ <property name="visible">True</property>
319
+ <property name="can_focus">True</property>
320
+ <property name="headers_visible">False</property>
321
+ <property name="rules_hint">False</property>
322
+ <property name="reorderable">False</property>
323
+ <property name="enable_search">True</property>
324
+ <property name="fixed_height_mode">False</property>
325
+ <property name="hover_selection">False</property>
326
+ <property name="hover_expand">False</property>
327
+ </widget>
328
+ </child>
329
+ </widget>
330
+ <packing>
331
+ <property name="padding">0</property>
332
+ <property name="expand">True</property>
333
+ <property name="fill">True</property>
334
+ </packing>
335
+ </child>
336
+ </widget>
337
+ </child>
338
+ </widget>
339
+
340
+ </glade-interface>