mirror of
https://github.com/mifi/lossless-cut.git
synced 2024-11-22 10:22:31 +01:00
add support for timestamp csv import
This commit is contained in:
parent
87555f3eb5
commit
a6b9a24527
@ -53,7 +53,7 @@ module.exports = ({ app, mainWindow, newVersion, isStoreBuild }) => {
|
|||||||
label: esc(t('Import project')),
|
label: esc(t('Import project')),
|
||||||
submenu: [
|
submenu: [
|
||||||
{
|
{
|
||||||
label: esc(t('Times in seconds (CSV)')),
|
label: esc(t('Times in seconds / Timestamps (CSV)')),
|
||||||
click() {
|
click() {
|
||||||
mainWindow.webContents.send('importEdlFile', 'csv');
|
mainWindow.webContents.send('importEdlFile', 'csv');
|
||||||
},
|
},
|
||||||
|
@ -26,7 +26,14 @@ export async function parseCsv(csvStr, processTime = (t) => t) {
|
|||||||
|
|
||||||
function parseTimeVal(str) {
|
function parseTimeVal(str) {
|
||||||
if (str === '') return undefined;
|
if (str === '') return undefined;
|
||||||
const parsed = parseFloat(str, 10);
|
let timestampMatch = str.match(/^(\d{1,2}):(\d{1,2}):(\d{1,2})(?:\.(\d{1,3}))?$/);
|
||||||
|
let parsed = undefined;
|
||||||
|
if (timestampMatch && timestampMatch.length === 5) {
|
||||||
|
let [, h, m, s, ms] = timestampMatch;
|
||||||
|
parsed = parseInt(h, 10) * 60 + parseInt(m, 10) * 60 + parseInt(s, 10) + parseInt(ms, 10) / 1000;
|
||||||
|
} else {
|
||||||
|
parsed = parseFloat(str, 10);
|
||||||
|
}
|
||||||
return processTime(parsed);
|
return processTime(parsed);
|
||||||
}
|
}
|
||||||
const mapped = rows
|
const mapped = rows
|
||||||
|
@ -4,7 +4,7 @@ import { fileURLToPath } from 'url';
|
|||||||
import { it, describe, expect } from 'vitest';
|
import { it, describe, expect } from 'vitest';
|
||||||
|
|
||||||
|
|
||||||
import { parseYouTube, formatYouTube, parseMplayerEdl, parseXmeml, parseFcpXml, parseCsv, getTimeFromFrameNum, formatCsvFrames, getFrameCountRaw, parsePbf, parseDvAnalyzerSummaryTxt } from './edlFormats';
|
import { parseYouTube, formatYouTube, parseMplayerEdl, parseXmeml, parseFcpXml, parseCsv, getTimeFromFrameNum, formatCsvFrames, formatCsvHuman, getFrameCountRaw, parsePbf, parseDvAnalyzerSummaryTxt } from './edlFormats';
|
||||||
|
|
||||||
// eslint-disable-next-line no-underscore-dangle
|
// eslint-disable-next-line no-underscore-dangle
|
||||||
const __dirname = dirname(fileURLToPath(import.meta.url));
|
const __dirname = dirname(fileURLToPath(import.meta.url));
|
||||||
@ -211,6 +211,26 @@ it('parses csv with frames', async () => {
|
|||||||
expect(formatted).toEqual(csvFramesStr);
|
expect(formatted).toEqual(csvFramesStr);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const csvTimestampStr = `\
|
||||||
|
00:01:54.612,00:03:09.053,A
|
||||||
|
00:05:00.448,00:07:56.194,B
|
||||||
|
00:09:27.075,00:11:44.264,C
|
||||||
|
`;
|
||||||
|
|
||||||
|
it('parses csv with timestamps', async () => {
|
||||||
|
const fps = 30;
|
||||||
|
const parsed = await parseCsv(csvTimestampStr);
|
||||||
|
|
||||||
|
expect(parsed).toEqual([
|
||||||
|
{ end: 189.053, name: 'A', start: 114.612},
|
||||||
|
{ end: 476.194, name: 'B', start: 300.448},
|
||||||
|
{ end: 704.264, name: 'C', start: 567.075},
|
||||||
|
]);
|
||||||
|
|
||||||
|
const formatted = await formatCsvHuman(parsed);
|
||||||
|
expect(formatted).toEqual(csvTimestampStr);
|
||||||
|
});
|
||||||
|
|
||||||
it('parses pbf', async () => {
|
it('parses pbf', async () => {
|
||||||
expect(parsePbf(await readFixture('test1.pbf', null))).toMatchSnapshot();
|
expect(parsePbf(await readFixture('test1.pbf', null))).toMatchSnapshot();
|
||||||
expect(parsePbf(await readFixture('test2.pbf', null))).toMatchSnapshot();
|
expect(parsePbf(await readFixture('test2.pbf', null))).toMatchSnapshot();
|
||||||
|
Loading…
Reference in New Issue
Block a user