Skip to content

Commit

Permalink
add button for optimize story audio
Browse files Browse the repository at this point in the history
  • Loading branch information
Franck ALARY committed Mar 2, 2024
1 parent 7bc3050 commit 4b8a58a
Show file tree
Hide file tree
Showing 11 changed files with 160 additions and 12 deletions.
26 changes: 26 additions & 0 deletions public/MainEvents/LocalStories.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import * as path from 'path'
import { getStoriesPath } from './Helpers/AppPaths.js'
import { deleteStories, readStories } from './Helpers/StoriesFiles.js'
import { generateDirNameStory } from './Processes/Helpers/Stories.js'
import runProcess from './Processes/RunProcess.js'

function mainEventLocalStoriesReader (mainWindow) {
ipcMain.on(
Expand Down Expand Up @@ -47,6 +48,31 @@ function mainEventLocalStoriesReader (mainWindow) {
}
)

const runOptimizeAudio = (stories) => {
if(!stories.length) {
mainWindow.webContents.send('stories-optimize-audio-task', '', '', 0, 0)
return ipcMain.emit('local-stories-get')
}

const story = stories.shift()
mainWindow.webContents.send('stories-optimize-audio-task', story.title, 'initialize', 0, 1)
mainWindow.webContents.send('stories-optimize-audio-waiting', stories)

runProcess(
path.join('Stories', 'StoriesOptimizeAudio.js'),
[story.path],
() => {},
(message, current, total) => {
mainWindow.webContents.send('stories-optimize-audio-task', story.title, message, current, total)
},
(error) => {
mainWindow.webContents.send('stories-optimize-audio-error', story.title, error)
},
() => runOptimizeAudio(stories)
)
}
ipcMain.on('stories-optimize-audio', async (event, stories) => runOptimizeAudio(stories))

ipcMain.on(
'local-stories-delete',
async (event, stories) => {
Expand Down
51 changes: 51 additions & 0 deletions public/MainEvents/Processes/Stories/StoriesOptimizeAudio.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
import * as fs from 'fs'
import * as path from 'path'

import { getProcessParams } from '../Helpers/ProcessParams.js'
import { rmFile } from '../../Helpers/Files.js'
import { convertAudios } from '../Import/Helpers/AudioFile.js'

function main (storyPath) {
process.stdout.write('*initialize*0*1*')

const storyAudioPath = path.join(storyPath, 'audios')

if (!fs.existsSync(storyPath) || !fs.existsSync(storyAudioPath)) {
process.stderr.write('story-not-found')
}

const
titleFile = path.join(storyPath, 'title.mp3'),
titleFileTmp = path.join(storyPath, 'title_tmp.mp3'),
files = fs.readdirSync(storyAudioPath, {encoding: 'utf8'}),
filesTmp = [...files.map((f, i) => {
const
srcFile = path.join(storyAudioPath, f),
dstFile = path.join(storyAudioPath, f.substring(0, f.length - 4) + '_tmp.mp3')
fs.renameSync(srcFile, dstFile)
return dstFile
}), titleFileTmp]

fs.renameSync(titleFile, titleFileTmp)

convertAudios(
[...filesTmp],
[...files.map((f) => path.join(storyAudioPath, f)), titleFile],
0,
filesTmp.length,
() => {
filesTmp.forEach((f) => rmFile(f))
process.stdout.write('success')
},
true
)
}

const _params_ = getProcessParams()

if (_params_.length === 0) {
process.stderr.write('no-file')
} else {
main(_params_[0])
}

7 changes: 7 additions & 0 deletions src/App/Components/Buttons/Icons/ButtonIconWave.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
import ButtonIconGeneric from './ButtonIconGeneric.js'

function ButtonIconWave(props) {
return <ButtonIconGeneric {...props} icon={'\uf83e'}/>
}

export default ButtonIconWave
13 changes: 12 additions & 1 deletion src/App/Components/Table/Table.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import ButtonIconTrash from '../Buttons/Icons/ButtonIconTrash.js'
import ButtonIconSquareCheck from '../Buttons/Icons/ButtonIconSquareCheck.js'
import ButtonIconDownload from '../Buttons/Icons/ButtonIconDownload.js'
import ButtonIconPen from '../Buttons/Icons/ButtonIconPen.js'
import ButtonIconWave from '../Buttons/Icons/ButtonIconWave.js'

import TableCell from './TableCell.js'
import TableGroup from './TableGroup.js'
Expand All @@ -22,6 +23,8 @@ function Table ({
onPlay,
onEdit,
onEditSelected,
onOptimizeAudio,
onOptimizeAudioSelected,
onDownload,
onDownloadSelected,
onDelete,
Expand All @@ -36,8 +39,14 @@ function Table ({
<h2 className={styles.headerTitleLeft}>{titleLeft}</h2>
{titleRight && <p className={styles.headerTitleRight}>{titleRight}</p>}
{
(onSelectAll || onDeleteSelected || onDownloadSelected || onEditSelected) &&
(onSelectAll || onDeleteSelected || onDownloadSelected || onEditSelected || onOptimizeAudioSelected) &&
<ul className={styles.headerIcons}>
{
onOptimizeAudioSelected && selectedData.length > 0 &&
<li><ButtonIconWave className={styles.headerIcon}
title={getLocale('telmios-optimize-audio')}
onClick={onOptimizeAudioSelected}/></li>
}
{
onEditSelected && selectedData.length > 0 &&
<li><ButtonIconPen className={styles.headerIcon}
Expand Down Expand Up @@ -77,6 +86,7 @@ function Table ({
onSelect={onSelect}
onSelectGroup={onSelectGroup}
onPlay={onPlay}
onOptimizeAudio={onOptimizeAudio}
onEdit={onEdit}
onDownload={onDownload}
onDelete={onDelete}/>
Expand All @@ -86,6 +96,7 @@ function Table ({
selected={Array.isArray(selectedData) && selectedData.includes(v)}
onSelect={onSelect}
onPlay={onPlay}
onOptimizeAudio={onOptimizeAudio}
onEdit={onEdit}
onDownload={onDownload}
onDelete={onDelete}/>
Expand Down
12 changes: 11 additions & 1 deletion src/App/Components/Table/TableCell.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,14 @@ import { useLocale } from '../Locale/LocaleHooks.js'
import { useCallback } from 'react'

import ButtonIconTrash from '../Buttons/Icons/ButtonIconTrash.js'
import ButtonIconWave from '../Buttons/Icons/ButtonIconWave.js'
import ButtonIconPen from '../Buttons/Icons/ButtonIconPen.js'
import ButtonIconPlay from '../Buttons/Icons/ButtonIconPlay.js'
import ButtonIconDownload from '../Buttons/Icons/ButtonIconDownload.js'

import styles from './Table.module.scss'

function TableCell ({data, selected, onSelect, onPlay, onEdit, onDownload, onDelete}) {
function TableCell ({data, selected, onSelect, onPlay, onOptimizeAudio, onEdit, onDownload, onDelete}) {
const
{getLocale} = useLocale(),
onCSelect = useCallback(
Expand All @@ -23,6 +24,14 @@ function TableCell ({data, selected, onSelect, onPlay, onEdit, onDownload, onDel
},
[onPlay, data]
),
onCOptimizeAudio = useCallback(
(e) => {
e.preventDefault()
e.stopPropagation()
typeof onOptimizeAudio === 'function' && onOptimizeAudio(data)
},
[onOptimizeAudio, data]
),
onCEdit = useCallback(
(e) => {
e.preventDefault()
Expand Down Expand Up @@ -56,6 +65,7 @@ function TableCell ({data, selected, onSelect, onPlay, onEdit, onDownload, onDel
(onPlay || onEdit || onDownload || onDelete) &&
<div className={styles.cellActionBar}>
{onPlay && <ButtonIconPlay title={getLocale('listen-title')} onClick={onCPlay} className={styles.cellActionButton}/>}
{onOptimizeAudio && <ButtonIconWave title={getLocale('telmios-optimize-audio')} onClick={onCOptimizeAudio} className={styles.cellActionButton}/>}
{onEdit && <ButtonIconPen title={getLocale('edit')} onClick={onCEdit} className={styles.cellActionButton}/>}
{onDownload && <ButtonIconDownload title={getLocale('download')} onClick={onCDownload} className={styles.cellActionButton}/>}
{onDelete && <ButtonIconTrash title={getLocale('delete')} onClick={onCDelete} className={styles.cellActionButton}/>}
Expand Down
3 changes: 2 additions & 1 deletion src/App/Components/Table/TableGroup.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ const isSelected = (selectedData, value) => {
return Array.isArray(selectedData) && selectedData.includes(value)
}

function TableGroup ({data, selectedData, onSelect, onSelectGroup, onPlay, onEdit, onDownload, onDelete}) {
function TableGroup ({data, selectedData, onSelect, onSelectGroup, onPlay, onEdit, onOptimizeAudio, onDownload, onDelete}) {
const
{getLocale} = useLocale(),
[displayCells, setDisplayCells] = useState(false),
Expand Down Expand Up @@ -56,6 +56,7 @@ function TableGroup ({data, selectedData, onSelect, onSelectGroup, onPlay, onEdi
selected={isSelected(selectedData, v)}
onSelect={onSelect}
onPlay={onPlay}
onOptimizeAudio={onOptimizeAudio}
onEdit={onEdit}
onDownload={onDownload}
onDelete={onDelete}/>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import ModalElectronTaskVisualizer from '../../../Components/Electron/Modal/ModalElectronTaskVisualizer.js'

function ModalStoriesOptimizeAudio ({stories, onClose}) {
return <ModalElectronTaskVisualizer taskName="stories-optimize-audio"
dataSent={[stories]}
onClose={onClose}/>
}

export default ModalStoriesOptimizeAudio
31 changes: 30 additions & 1 deletion src/App/Modules/Synchronize/Stories/StoriesLocalContent.js
Original file line number Diff line number Diff line change
@@ -1,15 +1,18 @@
import { useCallback, useMemo } from 'react'
import { useModal } from '../../../Components/Modal/ModalHooks.js'
import { useTelmiOS } from '../../../Components/TelmiOS/TelmiOSHooks.js'
import { useLocalStories } from '../../../Components/LocalStories/LocalStoriesHooks.js'

import StoriesTable from './StoriesTable.js'
import { useTelmiOS } from '../../../Components/TelmiOS/TelmiOSHooks.js'
import ModalStoriesOptimizeAudio from './ModalStoriesOptimizeAudio.js'

const {ipcRenderer} = window.require('electron')

function StoriesLocalContent ({setSelectedStories, selectedStories}) {
const
localStories = useLocalStories(),
{stories: telmiOSStories} = useTelmiOS(),
{addModal, rmModal} = useModal(),

stories = useMemo(
() => {
Expand All @@ -19,6 +22,30 @@ function StoriesLocalContent ({setSelectedStories, selectedStories}) {
[localStories, telmiOSStories]
),

onOptimizeAudio = useCallback(
(story) => {
addModal((key) => {
const modal = <ModalStoriesOptimizeAudio key={key}
stories={[story]}
onClose={() => rmModal(modal)}/>
return modal
})
},
[addModal, rmModal]
),

onOptimizeAudioSelected = useCallback(
() => {
addModal((key) => {
const modal = <ModalStoriesOptimizeAudio key={key}
stories={selectedStories}
onClose={() => rmModal(modal)}/>
return modal
})
},
[selectedStories, addModal, rmModal]
),

onEdit = useCallback(
(story) => ipcRenderer.send('local-stories-update', [story]),
[]
Expand All @@ -33,6 +60,8 @@ function StoriesLocalContent ({setSelectedStories, selectedStories}) {
)

return <StoriesTable stories={stories}
onOptimizeAudio={onOptimizeAudio}
onOptimizeAudioSelected={onOptimizeAudioSelected}
onEdit={onEdit}
onEditSelected={onEditSelected}
onDelete={onDelete}
Expand Down
18 changes: 10 additions & 8 deletions src/App/Modules/Synchronize/Stories/StoriesTable.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import ModalStoriesDeleteConfirm from './ModalStoriesDeleteConfirm.js'
import ModalStoriesFormUpdate from './ModalStoriesFormUpdate.js'
import { storiesClassification } from './StoriesClassification.js'

function StoriesTable ({stories, className, onEdit, onEditSelected, onDelete, selectedStories, setSelectedStories}) {
function StoriesTable ({stories, className, onEdit, onEditSelected, onDelete, onOptimizeAudio, onOptimizeAudioSelected, selectedStories, setSelectedStories}) {
const
{getLocale} = useLocale(),
{addModal, rmModal} = useModal(),
Expand Down Expand Up @@ -79,13 +79,13 @@ function StoriesTable ({stories, className, onEdit, onEditSelected, onDelete, se
() => {
addModal((key) => {
const modal = <ModalStoriesFormUpdate key={key}
stories={selectedStories}
onValidate={(stories) => {
onEditSelected(stories)
setIsLoadingStories(true)
setSelectedStories([])
}}
onClose={() => rmModal(modal)}/>
stories={selectedStories}
onValidate={(stories) => {
onEditSelected(stories)
setIsLoadingStories(true)
setSelectedStories([])
}}
onClose={() => rmModal(modal)}/>
return modal
})
},
Expand Down Expand Up @@ -138,6 +138,8 @@ function StoriesTable ({stories, className, onEdit, onEditSelected, onDelete, se
onSelectGroup={onSelectGroup}
onSelectAll={onSelectAll}
onPlay={onPlay}
onOptimizeAudio={onOptimizeAudio}
onOptimizeAudioSelected={onOptimizeAudioSelected}
onEdit={onEdit !== undefined ? callbackOnEdit : undefined}
onEditSelected={onEditSelected !== undefined ? callbackOnEditSelected : undefined}
onDelete={callbackOnDelete}
Expand Down
1 change: 1 addition & 0 deletions src/Locales/en.js
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@ const en = {
'telmios-not-found': 'Unable to found Telmi OS',
'telmios-update': 'Updating Telmi OS',
'telmios-eject': 'Eject Telmi OS',
'telmios-optimize-audio': 'Optimize audio files for Telmi OS',

'converting-images': 'Converting images',
'converting-audio': 'Converting audio files',
Expand Down
1 change: 1 addition & 0 deletions src/Locales/fr.js
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@ const fr = {
'telmios-not-found': 'Impossible de localiser Telmi OS',
'telmios-update': 'Mise à jour de Telmi OS',
'telmios-eject': 'Ejecter Telmi OS',
'telmios-optimize-audio': 'Optimiser les fichier audio pour Telmi OS',

'converting-images': 'Conversion des images',
'converting-audio': 'Conversion des fichiers audio',
Expand Down

0 comments on commit 4b8a58a

Please sign in to comment.