catori 0.2.5

Sign up to get free protection for your applications and to get access to all the features.
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>