Improve Cue Sheet parser: Calculate duration of each track + make sure each track# isn't used multiple times + refactored error codes into an enum.
This commit is contained in:
parent
3e7c2d59e8
commit
49dd3f0446
@ -239,6 +239,95 @@
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>CueImportDialog</name>
|
||||
<message>
|
||||
<source>Import Cue Sheet</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>The following Cue Sheet will be split and imported into LameXP.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Loading Cue Sheet file, please be patient...</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>An unknown error has occured!</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>The file could not be opened for reading!</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>The file does not look like a valid Cue Sheet disc image file!</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Could not find a supported audio track in the Cue Sheet!</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Failed to load the Cue Sheet file:</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Cue Sheet Error</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>CueSheetImport</name>
|
||||
<message>
|
||||
<source>Import Cue Sheet</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source> Output Directory </source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Browse...</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Discard</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>CueSheetModel</name>
|
||||
<message>
|
||||
<source>No.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>File / Track</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Index</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>File %1</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Track %1</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Unknown Artist</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Unknown Title</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>DecoderRegistry</name>
|
||||
<message>
|
||||
@ -1376,6 +1465,18 @@
|
||||
<source>The LameXP shell integration has been re-enabled.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Import Cue Sheet</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Open Cue Sheet</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Cue Sheet File</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>MetaInfo</name>
|
||||
|
@ -239,6 +239,95 @@
|
||||
<translation>Version</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>CueImportDialog</name>
|
||||
<message>
|
||||
<source>Import Cue Sheet</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>The following Cue Sheet will be split and imported into LameXP.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Loading Cue Sheet file, please be patient...</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>An unknown error has occured!</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>The file could not be opened for reading!</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>The file does not look like a valid Cue Sheet disc image file!</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Could not find a supported audio track in the Cue Sheet!</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Failed to load the Cue Sheet file:</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Cue Sheet Error</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>CueSheetImport</name>
|
||||
<message>
|
||||
<source>Import Cue Sheet</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source> Output Directory </source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Browse...</source>
|
||||
<translation type="unfinished">Durchsuchen...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Discard</source>
|
||||
<translation type="unfinished">Schließen</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>CueSheetModel</name>
|
||||
<message>
|
||||
<source>No.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>File / Track</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Index</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>File %1</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Track %1</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Unknown Artist</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Unknown Title</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>DecoderRegistry</name>
|
||||
<message>
|
||||
@ -1377,6 +1466,18 @@
|
||||
<source>Don't Show Again</source>
|
||||
<translation>Nicht mehr anzeigen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Import Cue Sheet</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Open Cue Sheet</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Cue Sheet File</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>MetaInfo</name>
|
||||
|
@ -239,6 +239,95 @@
|
||||
<translation>Versión</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>CueImportDialog</name>
|
||||
<message>
|
||||
<source>Import Cue Sheet</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>The following Cue Sheet will be split and imported into LameXP.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Loading Cue Sheet file, please be patient...</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>An unknown error has occured!</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>The file could not be opened for reading!</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>The file does not look like a valid Cue Sheet disc image file!</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Could not find a supported audio track in the Cue Sheet!</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Failed to load the Cue Sheet file:</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Cue Sheet Error</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>CueSheetImport</name>
|
||||
<message>
|
||||
<source>Import Cue Sheet</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source> Output Directory </source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Browse...</source>
|
||||
<translation type="unfinished">Navegar...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Discard</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>CueSheetModel</name>
|
||||
<message>
|
||||
<source>No.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>File / Track</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Index</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>File %1</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Track %1</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Unknown Artist</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Unknown Title</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>DecoderRegistry</name>
|
||||
<message>
|
||||
@ -1376,6 +1465,18 @@
|
||||
<source>Don't Show Again</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Import Cue Sheet</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Open Cue Sheet</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Cue Sheet File</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>MetaInfo</name>
|
||||
|
@ -243,6 +243,95 @@
|
||||
<translation>Version</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>CueImportDialog</name>
|
||||
<message>
|
||||
<source>Import Cue Sheet</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>The following Cue Sheet will be split and imported into LameXP.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Loading Cue Sheet file, please be patient...</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>An unknown error has occured!</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>The file could not be opened for reading!</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>The file does not look like a valid Cue Sheet disc image file!</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Could not find a supported audio track in the Cue Sheet!</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Failed to load the Cue Sheet file:</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Cue Sheet Error</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>CueSheetImport</name>
|
||||
<message>
|
||||
<source>Import Cue Sheet</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source> Output Directory </source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Browse...</source>
|
||||
<translation type="unfinished">Explorer...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Discard</source>
|
||||
<translation type="unfinished">Abandonner</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>CueSheetModel</name>
|
||||
<message>
|
||||
<source>No.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>File / Track</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Index</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>File %1</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Track %1</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Unknown Artist</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Unknown Title</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>DecoderRegistry</name>
|
||||
<message>
|
||||
@ -1386,6 +1475,18 @@ Ouvrir le dossier récursivement...</translation>
|
||||
<source>Don't Show Again</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Import Cue Sheet</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Open Cue Sheet</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Cue Sheet File</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>MetaInfo</name>
|
||||
|
@ -239,6 +239,95 @@
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>CueImportDialog</name>
|
||||
<message>
|
||||
<source>Import Cue Sheet</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>The following Cue Sheet will be split and imported into LameXP.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Loading Cue Sheet file, please be patient...</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>An unknown error has occured!</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>The file could not be opened for reading!</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>The file does not look like a valid Cue Sheet disc image file!</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Could not find a supported audio track in the Cue Sheet!</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Failed to load the Cue Sheet file:</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Cue Sheet Error</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>CueSheetImport</name>
|
||||
<message>
|
||||
<source>Import Cue Sheet</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source> Output Directory </source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Browse...</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Discard</source>
|
||||
<translation type="unfinished">Annulla</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>CueSheetModel</name>
|
||||
<message>
|
||||
<source>No.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>File / Track</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Index</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>File %1</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Track %1</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Unknown Artist</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Unknown Title</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>DecoderRegistry</name>
|
||||
<message>
|
||||
@ -1377,6 +1466,18 @@
|
||||
<source>Don't Show Again</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Import Cue Sheet</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Open Cue Sheet</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Cue Sheet File</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>MetaInfo</name>
|
||||
|
@ -239,6 +239,95 @@
|
||||
<translation type="unfinished">버전</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>CueImportDialog</name>
|
||||
<message>
|
||||
<source>Import Cue Sheet</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>The following Cue Sheet will be split and imported into LameXP.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Loading Cue Sheet file, please be patient...</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>An unknown error has occured!</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>The file could not be opened for reading!</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>The file does not look like a valid Cue Sheet disc image file!</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Could not find a supported audio track in the Cue Sheet!</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Failed to load the Cue Sheet file:</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Cue Sheet Error</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>CueSheetImport</name>
|
||||
<message>
|
||||
<source>Import Cue Sheet</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source> Output Directory </source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Browse...</source>
|
||||
<translation type="unfinished">찾아보기...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Discard</source>
|
||||
<translation type="unfinished">닫기</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>CueSheetModel</name>
|
||||
<message>
|
||||
<source>No.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>File / Track</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Index</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>File %1</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Track %1</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Unknown Artist</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Unknown Title</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>DecoderRegistry</name>
|
||||
<message>
|
||||
@ -1376,6 +1465,18 @@
|
||||
<source>Don't Show Again</source>
|
||||
<translation type="unfinished">다시 표시하지 않음</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Import Cue Sheet</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Open Cue Sheet</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Cue Sheet File</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>MetaInfo</name>
|
||||
|
@ -239,6 +239,95 @@
|
||||
<translation>Версия</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>CueImportDialog</name>
|
||||
<message>
|
||||
<source>Import Cue Sheet</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>The following Cue Sheet will be split and imported into LameXP.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Loading Cue Sheet file, please be patient...</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>An unknown error has occured!</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>The file could not be opened for reading!</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>The file does not look like a valid Cue Sheet disc image file!</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Could not find a supported audio track in the Cue Sheet!</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Failed to load the Cue Sheet file:</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Cue Sheet Error</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>CueSheetImport</name>
|
||||
<message>
|
||||
<source>Import Cue Sheet</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source> Output Directory </source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Browse...</source>
|
||||
<translation type="unfinished">Выбрать...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Discard</source>
|
||||
<translation type="unfinished">Отменить</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>CueSheetModel</name>
|
||||
<message>
|
||||
<source>No.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>File / Track</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Index</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>File %1</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Track %1</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Unknown Artist</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Unknown Title</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>DecoderRegistry</name>
|
||||
<message>
|
||||
@ -1378,6 +1467,18 @@
|
||||
<source>Don't Show Again</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Import Cue Sheet</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Open Cue Sheet</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Cue Sheet File</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>MetaInfo</name>
|
||||
|
@ -239,6 +239,95 @@
|
||||
<translation type="unfinished">Версія</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>CueImportDialog</name>
|
||||
<message>
|
||||
<source>Import Cue Sheet</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>The following Cue Sheet will be split and imported into LameXP.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Loading Cue Sheet file, please be patient...</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>An unknown error has occured!</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>The file could not be opened for reading!</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>The file does not look like a valid Cue Sheet disc image file!</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Could not find a supported audio track in the Cue Sheet!</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Failed to load the Cue Sheet file:</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Cue Sheet Error</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>CueSheetImport</name>
|
||||
<message>
|
||||
<source>Import Cue Sheet</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source> Output Directory </source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Browse...</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Discard</source>
|
||||
<translation type="unfinished">Відмінити</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>CueSheetModel</name>
|
||||
<message>
|
||||
<source>No.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>File / Track</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Index</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>File %1</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Track %1</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Unknown Artist</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Unknown Title</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>DecoderRegistry</name>
|
||||
<message>
|
||||
@ -1376,6 +1465,18 @@
|
||||
<source>Don't Show Again</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Import Cue Sheet</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Open Cue Sheet</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Cue Sheet File</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>MetaInfo</name>
|
||||
|
@ -219,6 +219,9 @@
|
||||
<iconset resource="../res/Icons.qrc">
|
||||
<normaloff>:/icons/folder_explore.png</normaloff>:/icons/folder_explore.png</iconset>
|
||||
</property>
|
||||
<property name="autoDefault">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
@ -272,9 +275,6 @@
|
||||
<height>16</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="autoDefault">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
@ -312,8 +312,10 @@
|
||||
</layout>
|
||||
</widget>
|
||||
<tabstops>
|
||||
<tabstop>abortButton</tabstop>
|
||||
<tabstop>imprtButton</tabstop>
|
||||
<tabstop>abortButton</tabstop>
|
||||
<tabstop>editOutputDir</tabstop>
|
||||
<tabstop>browseButton</tabstop>
|
||||
<tabstop>treeView</tabstop>
|
||||
</tabstops>
|
||||
<resources>
|
||||
@ -347,6 +349,8 @@
|
||||
<include location="../res/Images.qrc"/>
|
||||
<include location="../res/Images.qrc"/>
|
||||
<include location="../res/Images.qrc"/>
|
||||
<include location="../res/Images.qrc"/>
|
||||
<include location="../res/Images.qrc"/>
|
||||
</resources>
|
||||
<connections>
|
||||
<connection>
|
||||
@ -356,8 +360,8 @@
|
||||
<slot>close()</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel">
|
||||
<x>609</x>
|
||||
<y>408</y>
|
||||
<x>688</x>
|
||||
<y>451</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel">
|
||||
<x>310</x>
|
||||
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -30,7 +30,7 @@
|
||||
#define VER_LAMEXP_MINOR_LO 2
|
||||
#define VER_LAMEXP_TYPE Alpha
|
||||
#define VER_LAMEXP_PATCH 14
|
||||
#define VER_LAMEXP_BUILD 509
|
||||
#define VER_LAMEXP_BUILD 513
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
// Tools versions
|
||||
|
@ -63,7 +63,7 @@ CueImportDialog::CueImportDialog(QWidget *parent)
|
||||
|
||||
//Enable up/down button
|
||||
connect(imprtButton, SIGNAL(clicked()), this, SLOT(importButtonClicked()));
|
||||
connect(browseButton, SIGNAL(clicked()), this, SLOT(importButtonClicked()));
|
||||
connect(browseButton, SIGNAL(clicked()), this, SLOT(browseButtonClicked()));
|
||||
|
||||
//Translate
|
||||
labelHeaderText->setText(QString("<b>%1</b><br>%2").arg(tr("Import Cue Sheet"), tr("The following Cue Sheet will be split and imported into LameXP.")));
|
||||
@ -92,38 +92,66 @@ int CueImportDialog::exec(const QString &cueFile)
|
||||
{
|
||||
WorkingBanner *progress = new WorkingBanner(dynamic_cast<QWidget*>(parent()));
|
||||
progress->show(tr("Loading Cue Sheet file, please be patient..."));
|
||||
int iResult = m_model->loadCueSheet(cueFile, QApplication::instance());
|
||||
progress->close();
|
||||
LAMEXP_DELETE(progress);
|
||||
|
||||
if(iResult)
|
||||
QFileInfo cueFileInfo(cueFile);
|
||||
m_outputDir = QFileInfo(cueFile).canonicalPath();
|
||||
|
||||
if(!cueFileInfo.exists() || !cueFileInfo.isFile() || m_outputDir.isEmpty())
|
||||
{
|
||||
QString text = QString("<nobr>%1</nobr><br><nobr>%2</nobr><br><br><nobr>%3</nobr>").arg(tr("Failed to load the Cue Sheet file:"), QDir::toNativeSeparators(cueFile), tr("The specified file could not be found!")).replace("-", "−");
|
||||
QMessageBox::warning(progress, tr("Cue Sheet Error"), text);
|
||||
progress->close();
|
||||
LAMEXP_DELETE(progress);
|
||||
return CueSheetModel::ErrorIOFailure;
|
||||
}
|
||||
|
||||
int iResult = m_model->loadCueSheet(cueFile, QApplication::instance());
|
||||
if(iResult != CueSheetModel::ErrorSuccess)
|
||||
{
|
||||
QString errorMsg = tr("An unknown error has occured!");
|
||||
|
||||
switch(iResult)
|
||||
{
|
||||
case 1:
|
||||
errorMsg = tr("The file could not be opened for reading!");
|
||||
case CueSheetModel::ErrorIOFailure:
|
||||
errorMsg = tr("The file could not be opened for reading. Make sure you have the required rights!");
|
||||
break;
|
||||
case 2:
|
||||
errorMsg = tr("The file does not look like a valid Cue Sheet disc image file!");
|
||||
case CueSheetModel::ErrorBadFile:
|
||||
errorMsg = tr("The provided file does not look like a valid Cue Sheet disc image file!");
|
||||
break;
|
||||
case 3:
|
||||
errorMsg = tr("Could not find a supported audio track in the Cue Sheet!");
|
||||
case CueSheetModel::ErrorUnsupported:
|
||||
errorMsg = QString("%1<br>%2").arg(tr("Could not find any supported audio track in the Cue Sheet image!"), tr("Note that LameXP can not handle \"binary\" Cue Sheet images."));
|
||||
break;
|
||||
case CueSheetModel::ErrorInconsistent:
|
||||
errorMsg = tr("The selected Cue Sheet file contains inconsistent information. Take care!");
|
||||
break;
|
||||
}
|
||||
|
||||
QString text = QString("<nobr>%1</nobr><br><nobr>%2</nobr><br><br><nobr>%3</nobr>").arg(tr("Failed to load the Cue Sheet file:"), cueFile, errorMsg).replace("-", "−");
|
||||
QMessageBox::warning(dynamic_cast<QWidget*>(parent()), tr("Cue Sheet Error"), text);
|
||||
QString text = QString("<nobr>%1</nobr><br><nobr>%2</nobr><br><br><nobr>%3</nobr>").arg(tr("Failed to load the Cue Sheet file:"), QDir::toNativeSeparators(cueFile), errorMsg).replace("-", "−");
|
||||
QMessageBox::warning(progress, tr("Cue Sheet Error"), text);
|
||||
progress->close();
|
||||
LAMEXP_DELETE(progress);
|
||||
return iResult;
|
||||
}
|
||||
|
||||
|
||||
progress->close();
|
||||
LAMEXP_DELETE(progress);
|
||||
return QDialog::exec();
|
||||
}
|
||||
|
||||
void CueImportDialog::modelChanged(void)
|
||||
{
|
||||
treeView->expandAll();
|
||||
editOutputDir->setText(QDir::toNativeSeparators(m_outputDir));
|
||||
}
|
||||
|
||||
void CueImportDialog::browseButtonClicked(void)
|
||||
{
|
||||
QString newOutDir = QFileDialog::getExistingDirectory(this, tr("Choose Output Directory"));
|
||||
if(!newOutDir.isEmpty())
|
||||
{
|
||||
m_outputDir = newOutDir;
|
||||
modelChanged();
|
||||
}
|
||||
}
|
||||
|
||||
void CueImportDialog::importButtonClicked(void)
|
||||
|
@ -42,9 +42,11 @@ protected:
|
||||
void CueImportDialog::showEvent(QShowEvent *event);
|
||||
|
||||
private slots:
|
||||
void browseButtonClicked(void);
|
||||
void importButtonClicked(void);
|
||||
void modelChanged(void);
|
||||
|
||||
private:
|
||||
CueSheetModel *m_model;
|
||||
QString m_outputDir;
|
||||
};
|
||||
|
@ -24,9 +24,9 @@
|
||||
#include "Genres.h"
|
||||
|
||||
#include <QApplication>
|
||||
#include <QMessageBox>
|
||||
#include <QInputDialog>
|
||||
#include <QDir>
|
||||
#include <QFileInfo>
|
||||
#include <QFont>
|
||||
|
||||
#include <float.h>
|
||||
#include <limits>
|
||||
@ -39,6 +39,7 @@ class CueSheetItem
|
||||
{
|
||||
public:
|
||||
virtual const char* type(void) = 0;
|
||||
virtual bool isValid(void) { return false; }
|
||||
};
|
||||
|
||||
class CueSheetTrack : public CueSheetItem
|
||||
@ -50,20 +51,24 @@ public:
|
||||
m_trackNo(trackNo)
|
||||
{
|
||||
m_startIndex = std::numeric_limits<double>::quiet_NaN();
|
||||
m_duration = std::numeric_limits<double>::infinity();
|
||||
}
|
||||
int trackNo(void) { return m_trackNo; }
|
||||
double startIndex(void) { return m_startIndex; }
|
||||
double duration(void) { return m_duration; }
|
||||
QString title(void) { return m_title; }
|
||||
QString performer(void) { return m_performer; }
|
||||
CueSheetFile *parent(void) { return m_parent; }
|
||||
void setStartIndex(double startIndex) { m_startIndex = startIndex; }
|
||||
void setTitle(const QString &title) { m_title = title; }
|
||||
void setPerformer(const QString &performer) { m_performer = performer; }
|
||||
bool isValid(void) { return !(_isnan(m_startIndex) || (m_trackNo < 0)); }
|
||||
void setDuration(double duration) { m_duration = duration; }
|
||||
void setTitle(const QString &title, bool update = false) { if(!update || (m_title.isEmpty() && !title.isEmpty())) m_title = title; }
|
||||
void setPerformer(const QString &performer, bool update = false) { if(!update || (m_performer.isEmpty() && !performer.isEmpty())) m_performer = performer; }
|
||||
virtual bool isValid(void) { return !(_isnan(m_startIndex) || (m_trackNo < 0)); }
|
||||
virtual const char* type(void) { return "CueSheetTrack"; }
|
||||
private:
|
||||
int m_trackNo;
|
||||
double m_startIndex;
|
||||
double m_duration;
|
||||
QString m_title;
|
||||
QString m_performer;
|
||||
CueSheetFile *m_parent;
|
||||
@ -79,6 +84,7 @@ public:
|
||||
void clearTracks(void) { while(!m_tracks.isEmpty()) delete m_tracks.takeLast(); }
|
||||
CueSheetTrack *track(int index) { return m_tracks.at(index); }
|
||||
int trackCount(void) { return m_tracks.count(); }
|
||||
virtual bool isValid(void) { return m_tracks.count() > 0; }
|
||||
virtual const char* type(void) { return "CueSheetFile"; }
|
||||
private:
|
||||
const QString m_fileName;
|
||||
@ -134,7 +140,7 @@ QModelIndex CueSheetModel::index(int row, int column, const QModelIndex &parent)
|
||||
|
||||
int CueSheetModel::columnCount(const QModelIndex &parent) const
|
||||
{
|
||||
return 3;
|
||||
return 4;
|
||||
}
|
||||
|
||||
int CueSheetModel::rowCount(const QModelIndex &parent) const
|
||||
@ -182,6 +188,9 @@ QVariant CueSheetModel::headerData (int section, Qt::Orientation orientation, in
|
||||
case 2:
|
||||
return tr("Index");
|
||||
break;
|
||||
case 3:
|
||||
return tr("Duration");
|
||||
break;
|
||||
default:
|
||||
return QVariant();
|
||||
break;
|
||||
@ -207,7 +216,7 @@ QVariant CueSheetModel::data(const QModelIndex &index, int role) const
|
||||
return tr("File %1").arg(QString().sprintf("%02d", index.row() + 1)).append(" ");
|
||||
break;
|
||||
case 1:
|
||||
return QString("[%1]").arg(QFileInfo(filePtr->fileName()).fileName());
|
||||
return QFileInfo(filePtr->fileName()).fileName();
|
||||
break;
|
||||
default:
|
||||
return QVariant();
|
||||
@ -242,12 +251,48 @@ QVariant CueSheetModel::data(const QModelIndex &index, int role) const
|
||||
case 2:
|
||||
return indexToString(trackPtr->startIndex());
|
||||
break;
|
||||
case 3:
|
||||
return indexToString(trackPtr->duration());
|
||||
break;
|
||||
default:
|
||||
return QVariant();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if(role == Qt::FontRole)
|
||||
{
|
||||
QFont font("Monospace");
|
||||
font.setStyleHint(QFont::TypeWriter);
|
||||
if((index.column() == 1))
|
||||
{
|
||||
CueSheetItem *item = reinterpret_cast<CueSheetItem*>(index.internalPointer());
|
||||
font.setBold(dynamic_cast<CueSheetFile*>(item) != NULL);
|
||||
}
|
||||
return font;
|
||||
}
|
||||
else if(role == Qt::ForegroundRole)
|
||||
{
|
||||
if((index.column() == 1))
|
||||
{
|
||||
CueSheetItem *item = reinterpret_cast<CueSheetItem*>(index.internalPointer());
|
||||
if(CueSheetFile *filePtr = dynamic_cast<CueSheetFile*>(item))
|
||||
{
|
||||
return QFileInfo(filePtr->fileName()).exists() ? QColor("mediumblue") : QColor("darkred");
|
||||
}
|
||||
}
|
||||
else if((index.column() == 3))
|
||||
{
|
||||
CueSheetItem *item = reinterpret_cast<CueSheetItem*>(index.internalPointer());
|
||||
if(CueSheetTrack *trackPtr = dynamic_cast<CueSheetTrack*>(item))
|
||||
{
|
||||
if(trackPtr->duration() == std::numeric_limits<double>::infinity())
|
||||
{
|
||||
return QColor("dimgrey");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return QVariant();
|
||||
}
|
||||
@ -268,19 +313,19 @@ int CueSheetModel::loadCueSheet(const QString &cueFileName, QCoreApplication *ap
|
||||
QFile cueFile(cueFileName);
|
||||
if(!cueFile.open(QIODevice::ReadOnly))
|
||||
{
|
||||
return 1;
|
||||
return ErrorIOFailure;
|
||||
}
|
||||
|
||||
clearData();
|
||||
|
||||
beginResetModel();
|
||||
int iResult = parseCueFile(cueFile, application);
|
||||
int iResult = parseCueFile(cueFile, QDir(QFileInfo(cueFile).canonicalPath()), application);
|
||||
endResetModel();
|
||||
|
||||
return iResult;
|
||||
}
|
||||
|
||||
int CueSheetModel::parseCueFile(QFile &cueFile, QCoreApplication *application)
|
||||
int CueSheetModel::parseCueFile(QFile &cueFile, const QDir &baseDir, QCoreApplication *application)
|
||||
{
|
||||
cueFile.seek(0);
|
||||
qDebug("\n[Cue Sheet Import]");
|
||||
@ -319,7 +364,7 @@ int CueSheetModel::parseCueFile(QFile &cueFile, QCoreApplication *application)
|
||||
if(application)
|
||||
{
|
||||
application->processEvents();
|
||||
Sleep(25);
|
||||
Sleep(10);
|
||||
}
|
||||
|
||||
QByteArray lineData = cueFile.readLine();
|
||||
@ -341,14 +386,8 @@ int CueSheetModel::parseCueFile(QFile &cueFile, QCoreApplication *application)
|
||||
{
|
||||
if(currentTrack->isValid())
|
||||
{
|
||||
if(currentTrack->title().isEmpty() && !albumTitle.isEmpty())
|
||||
{
|
||||
currentTrack->setTitle(albumTitle);
|
||||
}
|
||||
if(currentTrack->performer().isEmpty() && !albumPerformer.isEmpty())
|
||||
{
|
||||
currentTrack->setPerformer(albumPerformer);
|
||||
}
|
||||
currentTrack->setTitle(albumTitle, true);
|
||||
currentTrack->setPerformer(albumPerformer, true);
|
||||
currentFile->addTrack(currentTrack);
|
||||
currentTrack = NULL;
|
||||
}
|
||||
@ -357,7 +396,7 @@ int CueSheetModel::parseCueFile(QFile &cueFile, QCoreApplication *application)
|
||||
LAMEXP_DELETE(currentTrack);
|
||||
}
|
||||
}
|
||||
if(currentFile->trackCount() > 0)
|
||||
if(currentFile->isValid())
|
||||
{
|
||||
m_files.append(currentFile);
|
||||
currentFile = NULL;
|
||||
@ -373,7 +412,8 @@ int CueSheetModel::parseCueFile(QFile &cueFile, QCoreApplication *application)
|
||||
}
|
||||
if(!rxFile.cap(2).compare("WAVE", Qt::CaseInsensitive) || !rxFile.cap(2).compare("MP3", Qt::CaseInsensitive) || !rxFile.cap(2).compare("AIFF", Qt::CaseInsensitive))
|
||||
{
|
||||
currentFile = new CueSheetFile(rxFile.cap(1));
|
||||
currentFile = new CueSheetFile(baseDir.absoluteFilePath(rxFile.cap(1)));
|
||||
qDebug("File path: <%s>", currentFile->fileName().toUtf8().constData());
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -396,14 +436,8 @@ int CueSheetModel::parseCueFile(QFile &cueFile, QCoreApplication *application)
|
||||
{
|
||||
if(currentTrack->isValid())
|
||||
{
|
||||
if(currentTrack->title().isEmpty() && !albumTitle.isEmpty())
|
||||
{
|
||||
currentTrack->setTitle(albumTitle);
|
||||
}
|
||||
if(currentTrack->performer().isEmpty() && !albumPerformer.isEmpty())
|
||||
{
|
||||
currentTrack->setPerformer(albumPerformer);
|
||||
}
|
||||
currentTrack->setTitle(albumTitle, true);
|
||||
currentTrack->setPerformer(albumPerformer, true);
|
||||
currentFile->addTrack(currentTrack);
|
||||
currentTrack = NULL;
|
||||
}
|
||||
@ -476,21 +510,15 @@ int CueSheetModel::parseCueFile(QFile &cueFile, QCoreApplication *application)
|
||||
}
|
||||
}
|
||||
|
||||
//Finally append the very last track/file
|
||||
//Append the very last track/file that is still pending
|
||||
if(currentFile)
|
||||
{
|
||||
if(currentTrack)
|
||||
{
|
||||
if(currentTrack->isValid())
|
||||
{
|
||||
if(currentTrack->title().isEmpty() && !albumTitle.isEmpty())
|
||||
{
|
||||
currentTrack->setTitle(albumTitle);
|
||||
}
|
||||
if(currentTrack->performer().isEmpty() && !albumPerformer.isEmpty())
|
||||
{
|
||||
currentTrack->setPerformer(albumPerformer);
|
||||
}
|
||||
currentTrack->setTitle(albumTitle, true);
|
||||
currentTrack->setPerformer(albumPerformer, true);
|
||||
currentFile->addTrack(currentTrack);
|
||||
currentTrack = NULL;
|
||||
}
|
||||
@ -499,7 +527,7 @@ int CueSheetModel::parseCueFile(QFile &cueFile, QCoreApplication *application)
|
||||
LAMEXP_DELETE(currentTrack);
|
||||
}
|
||||
}
|
||||
if(currentFile->trackCount() > 0)
|
||||
if(currentFile->isValid())
|
||||
{
|
||||
m_files.append(currentFile);
|
||||
currentFile = NULL;
|
||||
@ -510,7 +538,72 @@ int CueSheetModel::parseCueFile(QFile &cueFile, QCoreApplication *application)
|
||||
}
|
||||
}
|
||||
|
||||
return (m_files.count() > 0) ? 0 : (bUnsupportedTrack ? 3 : 2);
|
||||
//Finally calculate duration of each track
|
||||
int nFiles = m_files.count();
|
||||
for(int i = 0; i < nFiles; i++)
|
||||
{
|
||||
if(application)
|
||||
{
|
||||
application->processEvents();
|
||||
Sleep(10);
|
||||
}
|
||||
|
||||
CueSheetFile *currentFile = m_files.at(i);
|
||||
int nTracks = currentFile->trackCount();
|
||||
if(nTracks > 1)
|
||||
{
|
||||
for(int j = 1; j < nTracks; j++)
|
||||
{
|
||||
CueSheetTrack *currentTrack = currentFile->track(j);
|
||||
CueSheetTrack *previousTrack = currentFile->track(j-1);
|
||||
double duration = currentTrack->startIndex() - previousTrack->startIndex();
|
||||
previousTrack->setDuration(max(0.0, duration));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//Sanity check of track numbers
|
||||
if(nFiles > 0)
|
||||
{
|
||||
bool trackNo[100];
|
||||
for(int i = 0; i < 100; i++)
|
||||
{
|
||||
trackNo[i] = false;
|
||||
}
|
||||
for(int i = 0; i < nFiles; i++)
|
||||
{
|
||||
if(application)
|
||||
{
|
||||
application->processEvents();
|
||||
Sleep(10);
|
||||
}
|
||||
CueSheetFile *currentFile = m_files.at(i);
|
||||
int nTracks = currentFile->trackCount();
|
||||
if(nTracks > 1)
|
||||
{
|
||||
for(int j = 1; j < nTracks; j++)
|
||||
{
|
||||
int currentTrackNo = currentFile->track(j)->trackNo();
|
||||
if(currentTrackNo > 99)
|
||||
{
|
||||
qWarning("Track #%02d is invalid (maximum is 99), Cue Sheet is inconsistent!", currentTrackNo);
|
||||
return ErrorInconsistent;
|
||||
}
|
||||
if(trackNo[currentTrackNo])
|
||||
{
|
||||
qWarning("Track #%02d exists multiple times, Cue Sheet is inconsistent!", currentTrackNo);
|
||||
return ErrorInconsistent;
|
||||
}
|
||||
trackNo[currentTrackNo] = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
return ErrorSuccess;
|
||||
}
|
||||
else
|
||||
{
|
||||
return bUnsupportedTrack ? ErrorUnsupported : ErrorBadFile;
|
||||
}
|
||||
}
|
||||
|
||||
double CueSheetModel::parseTimeIndex(const QString &index)
|
||||
@ -538,10 +631,21 @@ double CueSheetModel::parseTimeIndex(const QString &index)
|
||||
|
||||
QString CueSheetModel::indexToString(const double index) const
|
||||
{
|
||||
int temp = static_cast<int>(index * 100.0);
|
||||
if(index == std::numeric_limits<double>::quiet_NaN())
|
||||
{
|
||||
return QString("<-NaN!->");
|
||||
}
|
||||
else if(index == std::numeric_limits<double>::infinity() || index < 0.0)
|
||||
{
|
||||
return QString("??:??.??");
|
||||
}
|
||||
else
|
||||
{
|
||||
int temp = static_cast<int>(index * 100.0);
|
||||
|
||||
int msec = temp % 100;
|
||||
int secs = temp / 100;
|
||||
int msec = temp % 100;
|
||||
int secs = temp / 100;
|
||||
|
||||
return QString().sprintf("%02d:%02d.%02d", (secs / 60), (secs % 60), msec);
|
||||
return QString().sprintf("%02d:%02d.%02d", min(99, secs / 60), min(99, secs % 60), min(99, msec));
|
||||
}
|
||||
}
|
||||
|
@ -27,6 +27,7 @@
|
||||
|
||||
class CueSheetFile;
|
||||
class QApplication;
|
||||
class QDir;
|
||||
|
||||
class CueSheetModel : public QAbstractItemModel
|
||||
{
|
||||
@ -36,6 +37,17 @@ public:
|
||||
CueSheetModel();
|
||||
~CueSheetModel(void);
|
||||
|
||||
//Error codes
|
||||
enum ErrorCode
|
||||
{
|
||||
ErrorSuccess = 0,
|
||||
ErrorIOFailure = 1,
|
||||
ErrorBadFile = 2,
|
||||
ErrorUnsupported = 3,
|
||||
ErrorInconsistent = 4,
|
||||
ErrorUnknown = 9
|
||||
};
|
||||
|
||||
//Model functions
|
||||
QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const;
|
||||
int columnCount(const QModelIndex &parent = QModelIndex()) const;
|
||||
@ -49,7 +61,7 @@ public:
|
||||
int loadCueSheet(const QString &cueFile, QCoreApplication *application = NULL);
|
||||
|
||||
private:
|
||||
int parseCueFile(QFile &cueFile, QCoreApplication *application);
|
||||
int parseCueFile(QFile &cueFile, const QDir &baseDir, QCoreApplication *application);
|
||||
double parseTimeIndex(const QString &index);
|
||||
QString indexToString(const double index) const;
|
||||
QList<CueSheetFile*> m_files;
|
||||
|
Loading…
Reference in New Issue
Block a user