• R/O
  • SSH
  • HTTPS

id3v2editorplus: コミット


コミットメタ情報

リビジョン42 (tree)
日時2019-10-13 08:01:39
作者derekwildstar

ログメッセージ

Roxette - How Do You Do.mp3

Informações USLT atualizadas

USLT (en).uslt

Atualizado

USLT (pt-br).uslt

Atualizado

UClassesAjudantes.pas

Comentários removidos

UClassesETipos.pas

Importação e Exportação SYLT implementadas

UDAMOPrincipal.pas

Início da importação e exportação SYLT
Contém erros propositais

変更サマリ

差分

--- trunk/V2/src/UClassesAjudantes.pas (revision 41)
+++ trunk/V2/src/UClassesAjudantes.pas (revision 42)
@@ -514,51 +514,6 @@
514514 // enquanto que no arquivo a ordem é big endian (ordem de leitura)
515515 Result := Result + Char(Byte2 shl 8 or Byte1);
516516 until ((Byte1 + Byte2) = 0) or (Position = Size);
517-
518-// repeat
519-// // AIndiceInicial aponta para o primeiro caractere do BOM, logo, é
520-// // necessário incrementar em dois a variável para que ela aponte para o
521-// // primeiro caractere da string
522-// Inc(AIndiceInicial,2);
523-//
524-// i := AIndiceInicial;
525-//
526-// // O loop varre o array de dois em dois e só para quando encontra 2 zeros
527-// // consecutivos, que é o terminador unicode. O loop também termina, claro,
528-// // quando não existem mais dados a serem lidos
529-// while (ABytes[i] + ABytes[Succ(i)] <> 0) and (i < Length(ABytes)) do
530-// Inc(i,2);
531-//
532-// // No fim do loop anterior, i estará apontando para o primeiro zero do par
533-// // de zeros que termina a string UNICODE. De AIndiceInicial até i -
534-// // AIndiceInicial está o texto do que eu chamo de verso.
535-// Verso.Texto := TEncoding.Unicode.GetString(ABytes,AIndiceInicial,i - AIndiceInicial);
536-//
537-// // Como dito anteriormente, i está apontando para o terminador UNICODE,
538-// // logo, i + 2 apontará para o primeiro dos 4 Bytes que representam o tempo
539-// Inc(i,2);
540-//
541-// // Obtendo o tempo a partir da posição indicada em i
542-// Verso.Tempo := SwapEndian32(PDWORD(@ABytes[i])^);
543-//
544-// // Adiciona o verso ao conteúdo
545-// FConteudo.Add(Verso);
546-//
547-// // Ao incrementar i em 4, nos posicionamos exatamente no final do item SYLT
548-// // e consequentemente no início do próximo
549-// Inc(i,4);
550-//
551-// // Configura AIndiceInical como sendo i, para que o loop possa retornar ao
552-// // início usando o mesmo algorítmo
553-// AIndiceInicial := i;
554-// until i > High(ABytes);
555-
556-
557-
558-
559-
560-
561-
562517 end;
563518
564519 end.
--- trunk/V2/src/UClassesETipos.pas (revision 41)
+++ trunk/V2/src/UClassesETipos.pas (revision 42)
@@ -141,6 +141,18 @@
141141 procedure Limpar;
142142 procedure Proxima(AUltima: Boolean = False);
143143 function ExcluirAtual: Boolean;
144+ // As funções de exportação e importação de texto foram criadas e testadas
145+ // com sucesso, no entanto elas não estão sendo usadas pelo programa porque
146+ // ele exporta e importa usando a tela de edição de SYLT, a qual meramente
147+ // salva ou carrega o conteúdo do TValueListEditor. A tela de edição de SYLT
148+ // permite que se altere o texto SYLT sem salvá-lo, dando esta opção ao
149+ // usuário. Se eu usasse as funções de importação e exportação aqui
150+ // definidas a exportação não refletiria o que está escrito no
151+ // TValueListEditor e a importação não carregaria este componente mas
152+ // modificaria diretamente o ID3v2, o que não é adequado para o modo de
153+ // funcionamento que eu planejei
154+ function ExportarTexto(AArquivo: TFileName): Boolean;
155+ function ImportarTexto(AArquivo: TFileName; ANovoSYLT: Boolean): Boolean;
144156 procedure Salvar(AArquivo: TFileName);
145157 // Adiciona um TSYLTItem completo a partir de um arquivo de letra
146158 // sincronizada (.sylt). Quando ANovoSYLT = true haverá a inclusão de uma
@@ -868,6 +880,28 @@
868880 end;
869881 end;
870882
883+function TSYLT.ExportarTexto(AArquivo: TFileName): Boolean;
884+begin
885+ Result := False;
886+
887+ if (FIndice = -1) or (AArquivo = '') then
888+ Exit;
889+
890+ with TFileStream.Create(AArquivo,fmCreate or fmShareDenyWrite) do
891+ try
892+ var Texto: String := '';
893+
894+ for var Verso: TSYLTVerso in Items[FIndice].Versos do
895+ Texto := Texto + Verso.Tempo.ToString + '=' + Verso.Texto + ^M^J;
896+
897+ Write(PWideChar(Trim(Texto))^, (Length(Trim(Texto)) + 1) * 2);
898+
899+ Result := True;
900+ finally
901+ Free;
902+ end;
903+end;
904+
871905 procedure TSYLT.FinalizarThread;
872906 begin
873907 if Assigned(FSYLTThread) then
@@ -887,6 +921,47 @@
887921 Result := Items[FIndice];
888922 end;
889923
924+function TSYLT.ImportarTexto(AArquivo: TFileName; ANovoSYLT: Boolean): Boolean;
925+var
926+ SYLT: TSYLTItem;
927+begin
928+ with TFileStream.Create(AArquivo,fmOpenRead or fmShareDenyWrite) do
929+ try
930+ if ANovoSYLT or (FIndice = -1) then
931+ SYLT := Add
932+ else
933+ begin
934+ SYLT := Items[FIndice];
935+ SYLT.Versos.Clear;
936+ end;
937+
938+ with TStringList.Create do
939+ try
940+ Text := TextoUnicode;
941+
942+ var Verso: TSYLTVerso;
943+
944+ for var i: Word := 0 to Pred(Count) do
945+ begin
946+ Verso.Tempo := Names[i].ToInteger;
947+ Verso.Texto := ValueFromIndex[i];
948+ SYLT.Versos.Add(Verso);
949+ end;
950+ finally
951+ Free;
952+ end;
953+
954+ if ANovoSYLT then
955+ Proxima(True)
956+ else
957+ ExibirLetra(FIndice);
958+
959+ Result := True;
960+ finally
961+ Free;
962+ end;
963+end;
964+
890965 procedure TSYLT.IniciarThread;
891966 begin
892967 if (Count > 0) and (FIndice > -1) and (Items[FIndice].Versos.Count > 0) then
--- trunk/V2/src/UDAMOPrincipal.pas (revision 41)
+++ trunk/V2/src/UDAMOPrincipal.pas (revision 42)
@@ -65,6 +65,8 @@
6565 ACTNEditarSYLT: TAction;
6666 ACTNImportarTextoSYLT: TAction;
6767 ACTNExportarTextoSYLT: TAction;
68+ SADITXT: TSaveDialog;
69+ OPDITXT: TOpenDialog;
6870 procedure TIMELetreiroTimer(Sender: TObject);
6971 procedure DataModuleCreate(Sender: TObject);
7072 procedure DataModuleDestroy(Sender: TObject);
@@ -107,6 +109,8 @@
107109 procedure ACTNImportarPNGAPICExecute(Sender: TObject);
108110 procedure ACTNExportarPNGAPICExecute(Sender: TObject);
109111 procedure ACTNEditarSYLTExecute(Sender: TObject);
112+ procedure ACTNExportarTextoSYLTExecute(Sender: TObject);
113+ procedure ACTNImportarTextoSYLTExecute(Sender: TObject);
110114 private
111115 { Private declarations }
112116 FID3v1Tag: TID3v1Tag;
@@ -160,6 +164,8 @@
160164 procedure SalvarSYLT;
161165 procedure SubstituirSYLT;
162166 procedure EditarSYLT;
167+ procedure ImportarTextoSYLT;
168+ procedure ExportarTextoSYLT;
163169 public
164170 { Public declarations }
165171 procedure DefinirStatusDeModificado(AContexto: TContexto);
@@ -697,6 +703,14 @@
697703 Application.MessageBox('Imagem atual exportada com sucesso!','Exportação concluída',MB_ICONINFORMATION);
698704 end;
699705
706+procedure TDAMOPrincipal.ExportarTextoSYLT;
707+begin
708+// Não utilize o código comentado, ele exporta diretamente de FSYLT, o que
709+// tornaria a tela de edição inútil
710+// if SADITXT.Execute and FSYLT.ExportarTexto(SADITXT.FileName) then
711+// Application.MessageBox('Texto da letra atual exportado com sucesso!','Exportação concluída',MB_ICONINFORMATION);
712+end;
713+
700714 procedure TDAMOPrincipal.ExportarTextoUSLT;
701715 begin
702716 if SADIHTML.Execute and FUSLT.ExportarTexto(SADIHTML.FileName) then
@@ -712,6 +726,19 @@
712726 end;
713727 end;
714728
729+procedure TDAMOPrincipal.ImportarTextoSYLT;
730+begin
731+ coloque os botoes de importação e exportação de sylt na tela principal e habilite o uso das funções normalmente
732+ na tela de edição, crie os botoes carregar e salvar, este sim, carregando e salvando, para e do TValueListEditor
733+// Não utilize o código comentado, ele importa diretamente para FSYLT, o que
734+// tornaria a tela de edição inútil
735+// if OPDITXT.Execute and FSYLT.ImportarTexto(OPDITXT.FileName,(FSYLT.Count = 0) or (Application.MessageBox('Deseja adicionar uma nova letra? Se você responder "não", apenas o texto da letra atual será substituído','Nova letra?',MB_ICONQUESTION or MB_YESNO) = IDYES)) then
736+// begin
737+// Application.MessageBox('Texto da letra importado com sucesso!','Importação concluída',MB_ICONINFORMATION);
738+// DefinirStatusDeModificado(cId3v2);
739+// end;
740+end;
741+
715742 procedure TDAMOPrincipal.ImportarTextoUSLT;
716743 begin
717744 if OPDIHTML.Execute and FUSLT.ImportarTexto(OPDIHTML.FileName,(FUSLT.Count = 0) or (Application.MessageBox('Deseja adicionar uma nova letra? Se você responder "não", apenas o texto da letra atual será substituído','Nova letra?',MB_ICONQUESTION or MB_YESNO) = IDYES)) then
@@ -824,6 +851,11 @@
824851 ExportarImagemAPIC;
825852 end;
826853
854+procedure TDAMOPrincipal.ACTNExportarTextoSYLTExecute(Sender: TObject);
855+begin
856+ ExportarTextoSYLT;
857+end;
858+
827859 procedure TDAMOPrincipal.ACTNExportarTextoUSLTExecute(Sender: TObject);
828860 begin
829861 ExportarTextoUSLT;
@@ -839,6 +871,11 @@
839871 ImportarImagemAPIC;
840872 end;
841873
874+procedure TDAMOPrincipal.ACTNImportarTextoSYLTExecute(Sender: TObject);
875+begin
876+ ImportarTextoSYLT;
877+end;
878+
842879 procedure TDAMOPrincipal.ACTNImportarTextoUSLTExecute(Sender: TObject);
843880 begin
844881 ImportarTextoUSLT;
旧リポジトリブラウザで表示