Merge branch 'master' into ffmpeg-6

pull/1556/head
Mikael Finstad 3 years ago
commit 885bad3190
No known key found for this signature in database
GPG Key ID: 25AB36E3E81CBC26

@ -14,6 +14,8 @@ body:
required: true
- label: If you have an issue only with one particular file, [use this form instead](https://github.com/mifi/lossless-cut/issues/new?assignees=&labels=&template=file-issue.yml)
required: true
- label: Windows 7, 8 and 8.1 are [no longer supported](https://github.com/mifi/lossless-cut/discussions/1476) **I am not using Windows 8.1 or older**
required: true
- type: dropdown
id: operating-system
attributes:

@ -32,7 +32,7 @@ The main feature is lossless trimming and cutting of video and audio files, whic
- Remove unneeded tracks
- Replace or re-encode only some tracks
- Extract all tracks from a file (extract video, audio, subtitle, attachments and other tracks from one file into separate files)
- Batch view for fast multi-file workflow (note: no mass export yet)
- Fast multi-file workflow (note: no mass/batch export yet)
- Keyboard shortcut workflow
- Losslessly remux video/audio into a different container (file) format
- Take full-resolution snapshots from videos in JPEG/PNG format (low or high quality)

@ -81,6 +81,7 @@ If the output file name has special characters that get replaced by underscore (
- Preview of H265/HEVC files is completely black or corrupted? Go to settings and disable "Hardware HEVC decoding"
- Where did the `.exe`/`.zip` downloads go? I decided to stop distributing exe and instead just 7zip, due to the [problems that the exe download was causing and the large size of zips.](https://github.com/mifi/lossless-cut/issues/1072#issuecomment-1066026323)
- [APPX is not signed and **does not work**.](https://github.com/mifi/lossless-cut/issues/337) Please use [7z package](https://github.com/mifi/lossless-cut/releases/latest/download/LosslessCut-win-x64.7z) instead.
- If you receive a KERNEL32.dll error, it's probably because you're running Windows 7, 8 or 8.1 which are [no longer supported.](https://github.com/mifi/lossless-cut/discussions/1476)
# Known limitations

@ -87,6 +87,7 @@
"Codec": "Codec",
"Combination is invalid": "Combination is invalid",
"Combine overlapping segments": "Combine overlapping segments",
"Combine selected segments": "Combine selected segments",
"Common formats:": "Common formats:",
"Confirm": "Confirm",
"Confirm quit": "Confirm quit",
@ -94,6 +95,7 @@
"Convert to supported format": "Convert to supported format",
"Converting to supported format": "Converting to supported format",
"Copy": "Copy",
"Copy selected segments times to clipboard": "Copy selected segments times to clipboard",
"Copy to clipboard": "Copy to clipboard",
"Copy to YouTube description/comment:": "Copy to YouTube description/comment:",
"Could not open media due to error {{errorCode}}": "Could not open media due to error {{errorCode}}",
@ -411,6 +413,7 @@
"Please test the output file in your desired player/editor before you delete the source file.": "Please test the output file in your desired player/editor before you delete the source file.",
"Please test the output files in your desired player/editor before you delete the source files.": "Please test the output files in your desired player/editor before you delete the source files.",
"PotPlayer Bookmarks (.pbf)": "PotPlayer Bookmarks (.pbf)",
"Prefer strong colors": "Prefer strong colors",
"Preserve all MOV/MP4 metadata tags (e.g. EXIF, GPS position etc.) from source file? Note that some players have trouble playing back files where all metadata is preserved, like iTunes and other Apple software": "Preserve all MOV/MP4 metadata tags (e.g. EXIF, GPS position etc.) from source file? Note that some players have trouble playing back files where all metadata is preserved, like iTunes and other Apple software.",
"Preserve all MP4/MOV metadata?": "Preserve all MP4/MOV metadata",
"Preserve original metadata when merging? (slow)": "Preserve original metadata when merging (slow)",
@ -549,6 +552,7 @@
"Times in seconds (CSV)": "Times in seconds (CSV)",
"Timestamps (CSV)": "Timestamps (CSV)",
"Timestamps (TSV/TXT)": "Timestamps (TSV/TXT)",
"Title": "Title",
"Toggle advanced view": "Toggle advanced view",
"Toggle current segment selected": "Toggle current segment selected",
"Toggle Developer Tools": "Toggle Developer Tools",
@ -584,10 +588,10 @@
"Unprocessable streams were exported as separate files.": "Unprocessable streams were exported as separate files.",
"Unsupported file": "Unsupported file",
"Use this for all files until LosslessCut is restarted?": "Use this for all files until LosslessCut is restarted",
"User interface": "User interface",
"Using built-in ffmpeg": "Using built-in ffmpeg",
"Using external ffmpeg": "Using external ffmpeg",
"Variables": "Variables",
"Version": "Version",
"video": "video",
"Video FPS": "Video FPS",
"View": "View",
@ -613,7 +617,6 @@
"Working dir unset": "Working dir unset",
"Working directory": "Working directory",
"XML files": "XML files",
"You are running version {{version}}": "You are running version {{version}}",
"You can customize the file name of the output segment(s) using special variables._one": "You can customize the file name of the output using special variables.",
"You can customize the file name of the output segment(s) using special variables._other": "You can customize the file name of the output segments using special variables.",
"You do not have permission to access this file": "You do not have permission to access this file",

@ -361,7 +361,7 @@
"Custom FFmpeg directory (experimental)": "Cartella FFmpeg personalizzata (sperimentale)",
"Divide timeline into a number of equal length segments": "Dividi la timeline in un numero di segmenti di uguale lunghezza",
"Label selected segments": "Etichetta segmenti selezionati",
"Download {{version}}": "Download {{versione}}",
"Download {{version}}": "Download {{version}}",
"Don't cut the file, but instead export an unmodified original which has chapters generated from segments": "Non tagliare il file, ma esporta invece un originale non modificato che ha capitoli generati dai segmenti",
"Exit": "Esci",
"Enter value": "Inserisci valore",
@ -718,5 +718,10 @@
"Input has {{numStreamsTotal}} tracks": "La sorgente ha {{numStreamsTotal}} tracce",
"Keeping {{numStreamsToCopy}} tracks": "Mantieni {{numStreamsToCopy}} tracce",
"Export mode for {{segments}} segments": "Modalità esportazione {{segments}} segmenti",
"The media file referenced by the project file you tried to open does not exist in the same directory as the project file: {{mediaFileName}}": "Il file multimediale a cui fa riferimento il file progetto che hai tentato di aprire non esiste nella stessa cartella del file progetto: {{mediaFileName}}"
"The media file referenced by the project file you tried to open does not exist in the same directory as the project file: {{mediaFileName}}": "Il file multimediale a cui fa riferimento il file progetto che hai tentato di aprire non esiste nella stessa cartella del file progetto: {{mediaFileName}}",
"Title": "Titolo",
"Combine selected segments": "Combina i segmenti selezionati",
"Copy selected segments times to clipboard": "Copia i tempi dei segmenti selezionati negli Appunti",
"Prefer strong colors": "Preferisci i colori forti",
"User interface": "Interfaccia utente"
}

@ -382,7 +382,7 @@ module.exports = ({ app, mainWindow, newVersion, isStoreBuild }) => {
label: esc(t('Report an error')),
click() { mainWindow.webContents.send('openSendReportDialog'); },
},
...(process.platform !== 'darwin' ? [{ role: 'about' }] : []),
...(process.platform !== 'darwin' ? [{ role: 'about', label: esc(t('About LosslessCut')) }] : []),
],
},
];

@ -1546,6 +1546,11 @@ const App = memo(() => {
const toggleStreamsSelector = useCallback(() => setStreamsSelectorShown((v) => !v), []);
const handleShowStreamsSelectorClick = useCallback(() => {
setStreamsSelectorShown(true);
setExportConfirmVisible(false);
}, []);
const extractAllStreams = useCallback(async () => {
if (!filePath) return;
@ -2058,7 +2063,7 @@ const App = memo(() => {
html5ify: () => userHtml5ifyCurrentFile({ ignoreRememberedValue: true }),
askSetStartTimeOffset,
extractAllStreams,
showStreamsSelector: () => setStreamsSelectorShown(true),
showStreamsSelector: handleShowStreamsSelectorClick,
importEdlFile,
exportEdlFile: exportEdlFile2,
exportEdlYouTube,
@ -2099,7 +2104,7 @@ const App = memo(() => {
actionsWithCatch.forEach(([key, action]) => electron.ipcRenderer.on(key, action));
return () => actionsWithCatch.forEach(([key, action]) => electron.ipcRenderer.removeListener(key, action));
}, [alignSegmentTimesToKeyframes, apparentCutSegments, askSetStartTimeOffset, checkFileOpened, clearSegments, closeBatch, closeFileWithConfirm, combineOverlappingSegments, combineSelectedSegments, concatCurrentBatch, createFixedDurationSegments, createNumSegments, createRandomSegments, createSegmentsFromKeyframes, customOutDir, cutSegments, detectBlackScenes, detectSceneChanges, detectSilentScenes, detectedFps, extractAllStreams, fileFormat, filePath, fillSegmentsGaps, getFrameCount, invertAllSegments, loadCutSegments, loadMedia, openFilesDialog, openSendReportDialogWithState, reorderSegsByStartTime, selectedSegments, setWorking, shiftAllSegmentTimes, shuffleSegments, toggleKeyboardShortcuts, toggleLastCommands, toggleSettings, tryFixInvalidDuration, userHtml5ifyCurrentFile, userOpenFiles]);
}, [alignSegmentTimesToKeyframes, apparentCutSegments, askSetStartTimeOffset, checkFileOpened, clearSegments, closeBatch, closeFileWithConfirm, combineOverlappingSegments, combineSelectedSegments, concatCurrentBatch, createFixedDurationSegments, createNumSegments, createRandomSegments, createSegmentsFromKeyframes, customOutDir, cutSegments, detectBlackScenes, detectSceneChanges, detectSilentScenes, detectedFps, extractAllStreams, fileFormat, filePath, fillSegmentsGaps, getFrameCount, handleShowStreamsSelectorClick, invertAllSegments, loadCutSegments, loadMedia, openFilesDialog, openSendReportDialogWithState, reorderSegsByStartTime, selectedSegments, setWorking, shiftAllSegmentTimes, shuffleSegments, toggleKeyboardShortcuts, toggleLastCommands, toggleSettings, tryFixInvalidDuration, userHtml5ifyCurrentFile, userOpenFiles]);
const showAddStreamSourceDialog = useCallback(async () => {
try {
@ -2410,7 +2415,7 @@ const App = memo(() => {
)}
</Sheet>
<ExportConfirm filePath={filePath} areWeCutting={areWeCutting} nonFilteredSegmentsOrInverse={nonFilteredSegmentsOrInverse} selectedSegments={selectedSegmentsOrInverse} segmentsToExport={segmentsToExport} willMerge={willMerge} visible={exportConfirmVisible} onClosePress={closeExportConfirm} onExportConfirm={onExportConfirm} renderOutFmt={renderOutFmt} outputDir={outputDir} numStreamsTotal={numStreamsTotal} numStreamsToCopy={numStreamsToCopy} setStreamsSelectorShown={setStreamsSelectorShown} outFormat={fileFormat} setOutSegTemplate={setOutSegTemplate} outSegTemplate={outSegTemplateOrDefault} generateOutSegFileNames={generateOutSegFileNames} currentSegIndexSafe={currentSegIndexSafe} getOutSegError={getOutSegError} mainCopiedThumbnailStreams={mainCopiedThumbnailStreams} needSmartCut={needSmartCut} />
<ExportConfirm filePath={filePath} areWeCutting={areWeCutting} nonFilteredSegmentsOrInverse={nonFilteredSegmentsOrInverse} selectedSegments={selectedSegmentsOrInverse} segmentsToExport={segmentsToExport} willMerge={willMerge} visible={exportConfirmVisible} onClosePress={closeExportConfirm} onExportConfirm={onExportConfirm} renderOutFmt={renderOutFmt} outputDir={outputDir} numStreamsTotal={numStreamsTotal} numStreamsToCopy={numStreamsToCopy} onShowStreamsSelectorClick={handleShowStreamsSelectorClick} outFormat={fileFormat} setOutSegTemplate={setOutSegTemplate} outSegTemplate={outSegTemplateOrDefault} generateOutSegFileNames={generateOutSegFileNames} currentSegIndexSafe={currentSegIndexSafe} getOutSegError={getOutSegError} mainCopiedThumbnailStreams={mainCopiedThumbnailStreams} needSmartCut={needSmartCut} />
<LastCommandsSheet
visible={lastCommandsVisible}

@ -34,7 +34,7 @@ const HelpIcon = ({ onClick, style }) => <IoIosHelpCircle size={20} role="button
const ExportConfirm = memo(({
areWeCutting, selectedSegments, segmentsToExport, willMerge, visible, onClosePress, onExportConfirm,
outFormat, renderOutFmt, outputDir, numStreamsTotal, numStreamsToCopy, setStreamsSelectorShown, outSegTemplate,
outFormat, renderOutFmt, outputDir, numStreamsTotal, numStreamsToCopy, onShowStreamsSelectorClick, outSegTemplate,
setOutSegTemplate, generateOutSegFileNames, filePath, currentSegIndexSafe, getOutSegError, nonFilteredSegmentsOrInverse,
mainCopiedThumbnailStreams, needSmartCut,
}) => {
@ -168,7 +168,7 @@ const ExportConfirm = memo(({
)}
</td>
<td>
<HighlightedText style={{ cursor: 'pointer' }} onClick={() => setStreamsSelectorShown(true)}><Trans>Keeping {{ numStreamsToCopy }} tracks</Trans></HighlightedText>
<HighlightedText style={{ cursor: 'pointer' }} onClick={onShowStreamsSelectorClick}><Trans>Keeping {{ numStreamsToCopy }} tracks</Trans></HighlightedText>
</td>
<td>
{areWeCuttingProblematicStreams && <WarningSignIcon verticalAlign="middle" color="warning" marginLeft=".3em" />}

@ -286,7 +286,7 @@ const Settings = memo(({
<Row>
<KeyCell>{t('Show informational notifications')}</KeyCell>
<td>
<Switch checked={!hideNotifications} onCheckedChange={(v) => setHideNotifications(v ? 'all' : undefined)} />
<Switch checked={!hideNotifications} onCheckedChange={(v) => setHideNotifications(v ? undefined : 'all')} />
</td>
</Row>

Loading…
Cancel
Save