joombla Posted April 4, 2012 Report Share Posted April 4, 2012 Boas. Estou a fazer uma aplicação em VB.net para organizar músicas de karaoke (.mp3 + .cdg). Abre uma pasta com 1000 músicas e move-as para outra pasta com um ID. Ficando: 1.mp3, 1.cdg, 2.mp3, 2.cdg, ... (para depois, numa base de dados, ao pesquisar pela música aparecer o ID e abrir directamente no programa de KARAOKE) Mas, antes de alterar o nome para um ID, tenho que corrigir o título das músicas para gravar na base de dados o Cantor e o nome da Música, para mais tarde a localizar. Já meti a detectar as músicas de uma pasta e a mover para outra. O problema é que as músicas não têm todas o mesmo formato de nome. Exemplo: 56-Banda Eva - Arerê.mp3 56-Banda Eva - Arerê (1).cdg 240 - Timbaland, Keri Hilson & Nicole Scherzinger - Scream.cdg 240 - Timbaland, Keri Hilson & Nicole Scherzinger - Scream.mp3 U2 - I Still Haven't Found What I'm Looking For.cdg U2 - I Still Haven't Found What I'm Looking For (1).mp3 Algumas têm ID - ARTISTA - MUSICA - NUMERO outras não têm ID, outras não têm NUMERO, etc... Há uma maneira de brincar com a string do nome das mesmas, apagar o que vem antes do - e o que vem depois? Por exemplo: 56-Banda Eva - Arerê (1).cdg Detectar se a música tem {(1)}, se sim apagar. detectar de tem ID {56-} se sim apagar. E no resultado final ficar {Banda Eva - Arerê.cdg} Depois com esse resultado final já podia gravar o Cantor e o nome da música na base de dados, e então alterar o nome da música para o ID final. Bem, sei que é algo confuso, tentei explicar da melhor maneira. 😛 Link to comment Share on other sites More sharing options...
thoga31 Posted April 4, 2012 Report Share Posted April 4, 2012 É muito complicado controlar todas as situações possíveis. Podes criar um método de selecção e correcção automático para os casos mais comuns. Os restantes colocas à parte e crias um método em que o utilizador trata de corrigir manualmente. Sugestão: para um caso dito "normal", faz um Split da informação (nome do ficheiro) pelo caracter "-" e depois trata a informação que tens. Se é só número e foi o 1º, eliminas a informação. E por aí em diante. Neste caso tens de ser muito criativo para prever certas situações e padronizá-las, tratando as que estão conforme o previsto e dando as outras ao utilizador. Automatizar tudo é algo utópico - os nomes dos ficheiros podem aparecer de qualquer forma e feitio, é um pandemónio. Knowledge is free! Link to comment Share on other sites More sharing options...
joombla Posted April 4, 2012 Author Report Share Posted April 4, 2012 Pois, já tinha pensado em algo do género: Ao fim de cada selecção ele pergunta ao utilizador se o Artista / Música estão correctos. Se não estiverem para editar manualmente. Vou criar uma espécie de filtro onde os títulos dos ficheiros vão passar e são modificados. Género: Se começar com {integer-}.... Se acabar em {(integer).cdg)}... O resultado final é mostrado para confirmação dos que passarem pelos filtros. Os que não passarem não altero nada, ficam na pasta sem serem movidas as músicas. O problema aqui vai ser que vou perder o .mp3 do .cdg porque um deles pode ficar para trás (não passa pelo filtro), mas isso depois penso numa alternativa. Até agora consegui filtrar o (1) final, mas mesmo assim isto não está em condições. Dim teste as string = "56-Banda Eva - Arerê (1).cdg" If teste.EndsWith("(1).cdg") Then teste = teste.Replace("(1).cdg", String.Empty).Trim msgbox (teste) '56-Banda Eva - Arerê End If O problema aqui é que pode ser (1) ou (2).cdg Já tentei algo como: teste = teste.Replace("(*).cdg", String.Empty).Trim Mas o * não funciona porque pensa que faz parte da string. Então tentei: teste = teste.Replace("("+*+").cdg", String.Empty).Trim Mas também não dá. Já não pegava em vb há algum tempo e de alterar strings nunca percebi muito. Quem me pode ajudar em strings? Obrigado. Só preciso algo do género: teste.Replace("(*).cdg", String.Empty).Trim Link to comment Share on other sites More sharing options...
Andrepereira9 Posted April 4, 2012 Report Share Posted April 4, 2012 Boas Se o formato se mantiver conforme indicaste Banda Eva - Arerê.mp3 56-Banda Eva - Arerê.mp3Banda Eva - Arerê (1).cdg 56-Banda Eva - Arerê (1).cdg E se as repetidas variarem entre 1 e 2 tens aqui um exemplo que está a funcionar. Caso hajam mais numeros 3,4,5,... podes sempre utilizar um ciclo. O problema aqui é que pode ser (1) ou (2).cdg Dim inicial As String = "56 - Banda Eva - Arerê(1).cdg" Dim final As String Dim aux As Object = inicial.ToCharArray Dim num_tracos As Integer = 0 For Each item In aux If item = "-" Then num_tracos += 1 End If Next aux = inicial.Split("-") If num_tracos = 2 Then final = aux(1) & " - " & aux(2) Else final = aux(0) & " - " & aux(1) End If If final.EndsWith("(1).cdg") Then final = final.Replace("(1).cdg", String.Empty).Trim final &= inicial.Substring(inicial.Length - 4) ElseIf inicial.EndsWith("(2).cdg") Then final = final.Replace("(2).cdg", String.Empty).Trim final &= inicial.Substring(inicial.Length - 4) End If MsgBox(final) A informática chegou para resolver problemas que antes não existiam Quem ri por último é porque está conectado a 52 Kbs. Link to comment Share on other sites More sharing options...
joombla Posted April 4, 2012 Author Report Share Posted April 4, 2012 Estive a testar com uns títulos que fui tirando e parece funcionar. Ainda não meti isto no código que já tinha, logo começo a trabalhar e quando estiver pronto venho aqui deixar feedback. Obrigado por me terem ajudado, não conseguia fazer isto, pelo menos assim. 😛 Link to comment Share on other sites More sharing options...
ribeiro55 Posted April 4, 2012 Report Share Posted April 4, 2012 Para os padrões que apresentas, deixo-te mais uma sugestão: Dim inicial As String = "56 - Banda Eva - Arerê(yeye)(2).cdg" Dim final As String = String.Empty Dim ext As String = inicial.Substring(inicial.LastIndexOf(".")) inicial = inicial.Replace(ext, "") inicial = inicial.Replace(" - ", "-").Replace("- ", "-").Replace(" -", "-") inicial = inicial.Replace("(", "-(").Replace(")", ")-") For Each P As String In inicial.Split("-") If P.Trim = String.Empty Then Continue For If P Like "(*)" And IsNumeric(P.Replace("(", "").Replace(")", "")) Then Continue For If IsNumeric(P) Then Continue For If final = String.Empty Then final &= P.Trim Else final &= " - " & P.Trim Next final = final.Replace(" - (", "(").Replace(") - ", ")") final &= ext Assenta muito na normalização. Depois de normalizar, actua. Limpa o sebo a qualquer ID e (numero), mas deixa intactos "outros tipos de parentesis", como o yeye ali no meu exemplo. Sérgio Ribeiro "Great coders aren't born. They're compiled and released""Expert coders do not need a keyboard. They just throw magnets at the RAM chips" Link to comment Share on other sites More sharing options...
joombla Posted April 5, 2012 Author Report Share Posted April 5, 2012 Com o código do Andrepereira9 de 1000 ficheiros, consegui mover uns 500 correctamente. Outros ficaram com erros estranhos género: 123-artista.mp3 em vez de artista-faixa.mp3 Acho que é porque algumas músicas na faixa têm mais um -, algo do género: 15 - artista - nome-da-musica.mp3 Ou seja, o nome da faixa já tem o -. Amanhã testo esse novo método. O mais provável é ter de pedir para confirmar cada uma das músicas manualmente (mostrando algumas informações como o artista e a faixa e pedir para confirmar ou alterar), porque como são muitos ficheiros diferentes o programa não consegue ter um padrão para todos. Mas como disse, não testei o ultimo código ainda. Desde já obrigado pela ajuda, amanhã já digo algo. 😛 Link to comment Share on other sites More sharing options...
HQuintas Posted April 5, 2012 Report Share Posted April 5, 2012 Não consegues arranjar uma base de dados com nomes de artistas? Assim conseguias fazer uma comparação e extrair da string o nome do artista. Link to comment Share on other sites More sharing options...
joombla Posted April 5, 2012 Author Report Share Posted April 5, 2012 Não tenho nenhuma base de dados, mas também acho que não se justifica aqui. O objectivo era um programa simples que reparasse rapidamente as músicas. Ter de ir pesquisar cada uma delas a uma base de dados ia ser demorado e a base de dados podia nem ter todos os cantores e/ou músicas. Quanto ao código do ribeiro55 já implementei no programa e até agora parece funcionar. Ainda não testei com as 1000 músicas porque não tenho aqui a pasta, mas com os 10 exemplos que tenho aqui no computador não tive problemas. O código já é um bocado avançado para eu perceber e modificar, mas também não me parece que seja preciso. Vou criar o programa com 2 métodos: -um método automático que converte o título do mp3 e procura o respectivo cdg. Se não encontrar deixa os ficheiros na pasta sem os mover. -um método manual, que pergunta ao utilizador se as informações estão correctas e para ir buscar a localização do cdg. (para as músicas que não passarem no primeiro método) Bem, mais uma vez obrigado pelo código. Nunca estudei strings em visual basic e só sei as funções básicas. Penso que posso dar este tópico como resolvido. 😛 Editado: Programa acabado. Corrige o nome do cdg e do mp3, depois compara se o mp3 tem o cdg com o mesmo nome, se sim move para uma pasta e cria um ID, apontando também num txt. Com este método, de umas 1000 músicas ficam umas 20 para trás, o que não é nada mau. É só editar manualmente e inserir no txt. Link to comment Share on other sites More sharing options...
mateusb Posted April 8, 2012 Report Share Posted April 8, 2012 não sei como detectar se há id na string, mas sei como facilmente retirar o que você quer. visite http://visualbandeira.blogspot.com.br/2012/02/como-editar-um-texto-da-textbox-extra.html Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now