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.
- data/VERSION +1 -0
- data/bin/catori +9 -0
- data/changelog.txt +3 -0
- data/construir +3 -0
- data/crear_vista.sql +8 -0
- data/ext/audiofile/MANIFEST +8 -0
- data/ext/audiofile/README +11 -0
- data/ext/audiofile/audiofile.c +833 -0
- data/ext/audiofile/audiofile.rd +265 -0
- data/ext/audiofile/depend +0 -0
- data/ext/audiofile/extconf.rb +8 -0
- data/ext/audiofile/fail.rb +22 -0
- data/ext/audiofile/mkmf.log +34 -0
- data/ext/audiofile/test.rb +229 -0
- data/ext/flac/extconf.rb +5 -0
- data/ext/flac/flac.c +75 -0
- data/ext/flac/mkmf.log +12 -0
- data/ext/flac/test.rb +3 -0
- data/ext/mahoro-0.1/INSTALL +9 -0
- data/ext/mahoro-0.1/extconf.rb +7 -0
- data/ext/mahoro-0.1/mahoro.c +187 -0
- data/ext/mahoro-0.1/mkmf.log +24 -0
- data/ext/mahoro-0.1/test.rb +41 -0
- data/ext/mpc/extconf.rb +5 -0
- data/ext/mpc/id3tag.c +245 -0
- data/ext/mpc/id3tag.h +5 -0
- data/ext/mpc/mkmf.log +12 -0
- data/ext/mpc/mpc.c +56 -0
- data/ext/mpc/mpp.h +194 -0
- data/ext/mpc/mppdec.h +1171 -0
- data/ext/mpc/test.rb +3 -0
- data/ext/rmac/extconf.rb +7 -0
- data/ext/rmac/mkmf.log +22 -0
- data/ext/rmac/rmac.cpp +162 -0
- data/ext/vorbisfile/ChangeLog +11 -0
- data/ext/vorbisfile/README +33 -0
- data/ext/vorbisfile/configure +2 -0
- data/ext/vorbisfile/extconf.rb +9 -0
- data/ext/vorbisfile/mkmf.log +68 -0
- data/ext/vorbisfile/test.rb +78 -0
- data/ext/vorbisfile/vorbisfile.c +482 -0
- data/instalar.txt +19 -0
- data/install.rb +11 -0
- data/lib/audioinfo.rb +321 -0
- data/lib/catori.rb +131 -0
- data/lib/catori/Catalogador.rb +71 -0
- data/lib/catori/Db.rb +81 -0
- data/lib/catori/Gui.rb +52 -0
- data/lib/catori/Installer.rb +16 -0
- data/lib/catori/Query.rb +82 -0
- data/lib/catori/XML.rb +42 -0
- data/lib/catori/catori_gui.glade +340 -0
- data/lib/catori/catori_gui.glade.bak +340 -0
- data/lib/catori/catori_gui.gladep +8 -0
- data/lib/catori/catori_gui.gladep.bak +8 -0
- data/lib/catori/taglib.rb +227 -0
- data/lib/pixmaps/album.png +0 -0
- data/lib/pixmaps/artist.png +0 -0
- data/lib/pixmaps/cdr.png +0 -0
- data/lib/pixmaps/song.png +0 -0
- data/lib/taglib.rb +230 -0
- data/sql/catori_mysql.sql +68 -0
- data/sql/catori_pg.sql +65 -0
- data/tests/saw.ape +0 -0
- data/tests/saw.flac +0 -0
- data/tests/saw.mp3 +0 -0
- data/tests/saw.mpc +0 -0
- data/tests/saw.ogg +0 -0
- data/tests/saw.wav +0 -0
- data/tests/test_audioinfo.rb +43 -0
- 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
|
+
|
data/lib/catori/Db.rb
ADDED
@@ -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
|
data/lib/catori/Gui.rb
ADDED
@@ -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
|
data/lib/catori/Query.rb
ADDED
@@ -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
|
data/lib/catori/XML.rb
ADDED
@@ -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>
|