Página 1 de 1
MediaMonkey, SQLite, HeidiSQL
Enviado: 28 Jul 2020 20:28
por JoséQuintas
Player de música... MediaMonkey
Que tal acessar a base dele?
Interessante a brincadeira.
Agora é descobrir como usar isso no Harbour, ou no ADO, quem sabe.
Nota: O artista do álbum é pra diferenciar das músicas do meu filho kkkk
MediaMonkey, SQLite, HeidiSQL
Enviado: 28 Jul 2020 21:02
por JoséQuintas
O Harbour já tem SQLLite embutido, funciona sem nada adicional.
Só se quiser usar ADO, aí é do de sempre, instalar o ODBC
http://www.ch-werner.de/sqliteodbc/
MediaMonkey, SQLite, HeidiSQL
Enviado: 28 Jul 2020 22:42
por JoséQuintas
Fica fácil imaginar como o MediaMonkey escolhe músicas.
E daria pra usar no aplicativo igual.
MediaMonkey, SQLite, HeidiSQL
Enviado: 28 Jul 2020 22:44
por JoséQuintas
No lugar deste.
Ao invés de encher de filtros, permitir que o usuário adicione filtros se precisar.
Ficaria menos poluído de opções, ao mesmo tempo que poderia dar mais opções.
É pra se pensar....
MediaMonkey, SQLite, HeidiSQL
Enviado: 30 Jul 2020 05:32
por JoséQuintas
Uia.....
ADO é ADO....
Dizemos pra ele qual é o ODBC e pronto.
Código: Selecionar todos
PROCEDURE PTESSQLITE
LOCAL oTBrowse
LOCAL cnSQL := ADOClass():New( SQLiteConnection( "D:\TOOLS\MediaMonkey\MM.DB" ) )
WITH OBJECT cnSQL
:cSQL := "SELECT ID, SongTitle, FileLength, SongLength, Rating, Bitrate, Encoder FROM Songs"
:Execute()
oTBrowse := { ;
{ "ID", { || Str( :Number( "ID" ), 10 ) } }, ;
{ "SongTitle", { || :String( "SongTitle", 50 ) } }, ;
{ "FileLength", { || Str( :Number( "FileLength" ), 16 ) } }, ;
{ "SongLenth", { || Str( :Number( "SongLength" ), 16 ) } }, ;
{ "Bitrate", { || Str( :Number( "Bitrate" ), 16 ) } }, ;
{ "Encoder", { || :String( "Encoder", 20 ) } } }
BrowseADO( cnSQL, oTBrowse, "SONGTITLE" )
:CloseRecordset()
ENDWITH
RETURN
Acessando a biblioteca do MediaMonkey, em formato SQLite3.
MediaMonkey, SQLite, HeidiSQL
Enviado: 30 Jul 2020 06:07
por JoséQuintas
Código: Selecionar todos
PROCEDURE PTESSQLITE
LOCAL oTBrowse
LOCAL cnSQL := ADOClass():New( SQLiteConnection( "D:\TOOLS\MediaMonkey\MM.DB" ) )
WITH OBJECT cnSQL
:cSQL := "SELECT Songs.ID, SongTitle, FileLength, SongLength, Rating, Bitrate, Encoder," + ;
" IDAlbum, Artists.Artist, Albums.Album" + ;
" FROM Songs" + ;
" INNER JOIN Albums ON Albums.ID = Songs.IDAlbum" + ;
" INNER JOIN ArtistsSongs ON ArtistsSongs.IDSong = Songs.ID" + ;
" INNER JOIN Artists ON Artists.ID = ArtistsSongs.IDArtist" + ;
" WHERE Artists.Artist = 'iron maiden'" + ;
" ORDER BY Artists.Artist, SongTitle"
:Execute()
oTBrowse := { ;
{ "ID", { || Str( :Number( "ID" ), 10 ) } }, ;
{ "Artist", { || :String( "Artist", 50 ) } }, ;
{ "SongTitle", { || :String( "SongTitle", 50 ) } }, ;
{ "FileLength", { || Str( :Number( "FileLength" ), 16 ) } }, ;
{ "SongLenth", { || Str( :Number( "SongLength" ), 16 ) } }, ;
{ "Bitrate", { || Str( :Number( "Bitrate" ), 16 ) } }, ;
{ "Encoder", { || :String( "Encoder", 20 ) } } }
BrowseADO( cnSQL, oTBrowse, "SONGTITLE" )
:CloseRecordset()
ENDWITH
RETURN
-2147467259 no such collation sequence: IUNICODE (1)
Full SQL:
SELECT Songs.ID, SongTitle, FileLength, SongLength, Rating, Bitrate, Encoder, IDAlbum, Artists.Artist, Albums.Album FROM Songs INNER JOIN Albums ON Albums.ID = Songs.IDAlbum INNER JOIN ArtistsSongs ON ArtistsSongs.IDSong = Songs.ID INNER JOIN Artists ON Artists.ID = ArtistsSongs.IDArtist WHERE Artists.Artist = 'iron maiden' ORDER BY Artists.Artist, SongTitle;
Do fórum do MediaMonkey:
We use custom Collation in our DB due the limits of SQLite and if you are able to import data from linked Tables than you should be safe. but searches and edits back can need Collation and will throw an errors.
Por causa de limitações do SQLite, o MediaMonkey usa página de caracteres CUSTOMIZADA.
https://www.mediamonkey.com/forum/viewtopic.php?t=93400
MediaMonkey, SQLite, HeidiSQL
Enviado: 30 Jul 2020 06:11
por JoséQuintas
Só comentário sobre o comando:
Songs contém as músicas e IDAlbum
Albums contém o nome dos álbums
ArtistsSongs contém IDSongs e IDArtista
Artists contém o nome dos artistas
Então, pra pegar a música, o nome do disco, e o nome do artista, precisa dos 4
MediaMonkey, SQLite, HeidiSQL
Enviado: 30 Jul 2020 06:24
por JoséQuintas
Sem o ORDER BY funciona.
Código: Selecionar todos
PROCEDURE PTESSQLITE
LOCAL oTBrowse
LOCAL cnSQL := ADOClass():New( SQLiteConnection( "D:\TOOLS\MediaMonkey\MM.DB" ) )
WITH OBJECT cnSQL
:cSQL := "SELECT Songs.ID, SongTitle, FileLength, SongLength, Rating, Bitrate, Encoder," + ;
" IDAlbum, Artists.Artist, Albums.Album" + ;
" FROM Songs" + ;
" INNER JOIN Albums ON Albums.ID = Songs.IDAlbum" + ;
" INNER JOIN ArtistsSongs ON ArtistsSongs.IDSong = Songs.ID" + ;
" INNER JOIN Artists ON Artists.ID = ArtistsSongs.IDArtist" + ;
" WHERE Artists.Artist LIKE '%iron maiden%'"
:Execute()
oTBrowse := { ;
{ "ID", { || Str( :Number( "ID" ), 10 ) } }, ;
{ "Artist", { || :String( "Artist", 20 ) } }, ;
{ "Album", { || :String( "Album", 20 ) } }, ;
{ "SongTitle", { || :String( "SongTitle", 50 ) } }, ;
{ "FileLength", { || Str( :Number( "FileLength" ), 16 ) } }, ;
{ "SongLenth", { || Str( :Number( "SongLength" ), 16 ) } }, ;
{ "Bitrate", { || Str( :Number( "Bitrate" ), 16 ) } }, ;
{ "Encoder", { || :String( "Encoder", 20 ) } } }
BrowseADO( cnSQL, oTBrowse, "SONGTITLE" )
:CloseRecordset()
ENDWITH
RETURN

Suposição:
codepage customizada, precisa conhecer a codepage pra poder colocar em ordem.
Não gostei da palavra "limitação", e muito menos do banco SQLite acabar não sendo padrão.
Mas de qualquer forma é interessante....
MediaMonkey, SQLite, HeidiSQL
Enviado: 30 Jul 2020 06:29
por JoséQuintas
Lembrei da diferença entre MySQL e SQL Server....
No SQLite é igual MySQL: aceitou LIMIT 10
Código: Selecionar todos
:cSQL := "SELECT Songs.ID, SongTitle, FileLength, SongLength, Rating, Bitrate, Encoder," + ;
" IDAlbum, Artists.Artist, Albums.Album" + ;
" FROM Songs" + ;
" INNER JOIN Albums ON Albums.ID = Songs.IDAlbum" + ;
" INNER JOIN ArtistsSongs ON ArtistsSongs.IDSong = Songs.ID" + ;
" INNER JOIN Artists ON Artists.ID = ArtistsSongs.IDArtist" + ;
" WHERE Artists.Artist LIKE '%iron maiden%'" + ;
" LIMIT 10"
Não testei outros comandos, mas.... o aplicativo poderia funcionar em SQLite ou MySQL apenas trocando a string de conexão, pelo menos para esses comandos básicos.
MediaMonkey, SQLite, HeidiSQL
Enviado: 30 Jul 2020 06:41
por JoséQuintas
A única coisa que mudou para o MySQL foi a string de conexão.
Código: Selecionar todos
FUNCTION SQLiteConnection( cFileName )
LOCAL oConexao := win_OleCreateObject( "ADODB.Connection" )
oConexao:ConnectionString := iif( win_OsIs10(), "Provider=MSDASQL;", "" ) + ;
"Driver={SQLite3 ODBC Driver};Database=" + cFileName + ";"
oConexao:CursorLocation := AD_USE_CLIENT
oConexao:CommandTimeOut := 20
RETURN oConexao
Atenção ao SQLITE3 no nome, porque se usar SQLITE diz que a base está corrompida !!!!
Talvez no SQLite anterior não houvesse opção de codepage/collation.