diff --git a/audio-service/metadata.json b/audio-service/metadata.json index 57c1af3..5e312de 100644 --- a/audio-service/metadata.json +++ b/audio-service/metadata.json @@ -76,18 +76,10 @@ "volume": 1 }, { - "filename": "C:\\Users\\mickl\\Desktop\\cliptrim-ui\\ClipTrimApp\\audio-service\\recordings\\audio_capture_20260226_184043.wav", - "name": "Clip 20260226_184043", + "filename": "C:\\Users\\mickl\\Desktop\\cliptrim-ui\\ClipTrimApp\\audio-service\\recordings\\audio_capture_20260228_092721.wav", + "name": "Clip 20260228_092721", "playbackType": "playStop", "volume": 1 - }, - { - "endTime": 14.772566995768694, - "filename": "C:\\Users\\mickl\\Desktop\\cliptrim-ui\\ClipTrimApp\\audio-service\\recordings\\audio_capture_20260226_194441.wav", - "name": "Test", - "playbackType": "playStop", - "startTime": 9.8548571932299, - "volume": 0.6 } ] }, @@ -110,6 +102,12 @@ "playbackType": "playOverlap", "startTime": 26.14685314685314, "volume": 0.64 + }, + { + "filename": "C:\\Users\\mickl\\Desktop\\cliptrim-ui\\ClipTrimApp\\audio-service\\recordings\\audio_capture_20260228_085116.wav", + "name": "pp", + "playbackType": "playStop", + "volume": 1 } ] } diff --git a/audio-service/src/__pycache__/audio_io.cpython-313.pyc b/audio-service/src/__pycache__/audio_io.cpython-313.pyc index e130d9b..d1014b4 100644 Binary files a/audio-service/src/__pycache__/audio_io.cpython-313.pyc and b/audio-service/src/__pycache__/audio_io.cpython-313.pyc differ diff --git a/audio-service/src/audio_io.py b/audio-service/src/audio_io.py index 2f8865b..7dd6f24 100644 --- a/audio-service/src/audio_io.py +++ b/audio-service/src/audio_io.py @@ -121,7 +121,7 @@ class AudioIO: } meta.add_clip_to_collection("Uncategorized", clip_metadata ) - + self.socket.emit('new_clip', clip_metadata) return clip_metadata diff --git a/electron-ui/src/main/main.ts b/electron-ui/src/main/main.ts index 743fc30..c4ff4e1 100644 --- a/electron-ui/src/main/main.ts +++ b/electron-ui/src/main/main.ts @@ -18,6 +18,8 @@ import { resolveHtmlPath } from './util'; import registerFileIpcHandlers from '../ipc/audio/main'; import PythonSubprocessManager from './service'; +const pythonManager = new PythonSubprocessManager('src/main.py'); + class AppUpdater { constructor() { log.transports.file.level = 'info'; @@ -124,6 +126,7 @@ const createWindow = async () => { app.on('window-all-closed', () => { // Respect the OSX convention of having the application in memory even // after all windows have been closed + pythonManager.stop(); if (process.platform !== 'darwin') { app.quit(); } @@ -132,8 +135,7 @@ app.on('window-all-closed', () => { app .whenReady() .then(() => { - const pythonManager = new PythonSubprocessManager('src/main.py'); - pythonManager.start(); + // pythonManager.start(); createWindow(); app.on('activate', () => { // On macOS it's common to re-create a window in the app when the diff --git a/electron-ui/src/redux/main.ts b/electron-ui/src/redux/main.ts index eaa92bc..7e12d4e 100644 --- a/electron-ui/src/redux/main.ts +++ b/electron-ui/src/redux/main.ts @@ -67,32 +67,11 @@ const metadataSlice = createSlice({ targetState.clips.push(clip); } }, - addNewClips(state, action) { - const { collections } = action.payload; - Object.keys(collections).forEach((collection) => { - const collectionState = state.collections.find( - (col) => col.name === collection, - ); - if (!collectionState) { - state.collections.push({ - name: collection, - id: Date.now(), - clips: [], - }); - } - const existingFilenames = new Set( - state.collections - .find((col) => col.name === collection) - ?.clips.map((clip) => clip.filename) || [], - ); - const newClips = collections[collection].filter( - (clip: ClipMetadata) => !existingFilenames.has(clip.filename), - ); - // const collectionState = state.collections.find( - // (col) => col.name === collection, - // ); - if (collectionState) { - collectionState.clips.push(...newClips); + addNewClip(state, action) { + const { clip } = action.payload; + state.collections.forEach((collection) => { + if (collection.name === 'Uncategorized') { + collection.clips.push(clip); } }); }, @@ -113,6 +92,6 @@ export type RootState = ReturnType; // Inferred type: {posts: PostsState, comments: CommentsState, users: UsersState} export type AppDispatch = AppStore['dispatch']; -export const { setCollections, addNewClips, addCollection } = +export const { setCollections, addNewClip, addCollection } = metadataSlice.actions; export default metadataSlice.reducer; diff --git a/electron-ui/src/renderer/App.tsx b/electron-ui/src/renderer/App.tsx index 2106d9d..504c5d7 100644 --- a/electron-ui/src/renderer/App.tsx +++ b/electron-ui/src/renderer/App.tsx @@ -7,6 +7,7 @@ import { ThemeProvider, createTheme } from '@mui/material/styles'; import DialogTitle from '@mui/material/DialogTitle'; import DialogContent from '@mui/material/DialogContent'; import DialogActions from '@mui/material/DialogActions'; +import io from 'socket.io-client'; // import 'tailwindcss/tailwind.css'; import './App.css'; import ClipList from './components/ClipList'; @@ -14,7 +15,7 @@ import { useAppDispatch, useAppSelector } from './hooks'; import { store } from '../redux/main'; import { useNavigate } from 'react-router-dom'; import SettingsPage from './Settings'; -import apiFetch from './api'; +import { apiFetch, getBaseUrl } from './api'; function MainPage() { const dispatch = useAppDispatch(); @@ -27,20 +28,46 @@ function MainPage() { const [newCollectionOpen, setNewCollectionOpen] = useState(false); const [newCollectionName, setNewCollectionName] = useState(''); const navigate = useNavigate(); + const [socket, setSocket] = useState(null); + + useEffect(() => {}, []); useEffect(() => { - const fetchMetadata = async () => { - try { - const response = await apiFetch('meta'); - const data = await response.json(); - dispatch({ type: 'metadata/setAllData', payload: data }); - } catch (error) { - console.error('Error fetching metadata:', error); - } + const initializeSocket = async () => { + const baseUrl = await getBaseUrl(); + const newSocket = io(baseUrl); + setSocket(newSocket); + newSocket.on('connect', () => { + console.log('Connected to WebSocket server'); + }); + newSocket.on('full_data', (data: any) => { + console.log('Received full_data from server:', data); + dispatch({ + type: 'metadata/setAllData', + payload: { collections: data }, + }); + }); + newSocket.on('new_clip', (data: any) => { + console.log('Received new_clips from server:', data); + dispatch({ + type: 'metadata/addNewClip', + payload: { clip: data }, + }); + }); }; - fetchMetadata(); - const intervalId = setInterval(fetchMetadata, 5000); - return () => clearInterval(intervalId); + initializeSocket(); + // const fetchMetadata = async () => { + // try { + // const response = await apiFetch('meta'); + // const data = await response.json(); + // dispatch({ type: 'metadata/setAllData', payload: data }); + // } catch (error) { + // console.error('Error fetching metadata:', error); + // } + // }; + // fetchMetadata(); + // const intervalId = setInterval(fetchMetadata, 5000); + // return () => clearInterval(intervalId); }, [dispatch]); useEffect(() => { diff --git a/electron-ui/src/renderer/Settings.tsx b/electron-ui/src/renderer/Settings.tsx index 748f60b..716c58b 100644 --- a/electron-ui/src/renderer/Settings.tsx +++ b/electron-ui/src/renderer/Settings.tsx @@ -5,7 +5,7 @@ import './App.css'; import TextField from '@mui/material/TextField'; import Select from '@mui/material/Select'; import MenuItem from '@mui/material/MenuItem'; -import apiFetch from './api'; +import { apiFetch } from './api'; type AudioDevice = { index: number; diff --git a/electron-ui/src/renderer/api.ts b/electron-ui/src/renderer/api.ts index 3b87142..a059327 100644 --- a/electron-ui/src/renderer/api.ts +++ b/electron-ui/src/renderer/api.ts @@ -1,4 +1,4 @@ -const getBaseUrl = async () => { +export const getBaseUrl = async () => { const port = await window.audio.getPort(); if (port.error || !port.port) { return `http://localhost:5010`; @@ -7,7 +7,7 @@ const getBaseUrl = async () => { return `http://localhost:${port.port}`; }; -export default async function apiFetch(endpoint: string, options = {}) { +export async function apiFetch(endpoint: string, options = {}) { const url = `${await getBaseUrl()}/${endpoint}`; return fetch(url, options); } diff --git a/electron-ui/src/renderer/components/ClipList.tsx b/electron-ui/src/renderer/components/ClipList.tsx index 80f1f0d..7e450fd 100644 --- a/electron-ui/src/renderer/components/ClipList.tsx +++ b/electron-ui/src/renderer/components/ClipList.tsx @@ -15,7 +15,7 @@ import { restrictToVerticalAxis } from '@dnd-kit/modifiers'; import AudioTrimmer from './AudioTrimer'; import { ClipMetadata } from '../../redux/types'; import { useAppDispatch, useAppSelector } from '../hooks'; -import apiFetch from '../api'; +import { apiFetch } from '../api'; export interface ClipListProps { collection: string; diff --git a/stream_deck_plugin/ClipTrimDotNet/Client/ClipTrimClient.cs b/stream_deck_plugin/ClipTrimDotNet/Client/ClipTrimClient.cs index 0859460..49c2984 100644 --- a/stream_deck_plugin/ClipTrimDotNet/Client/ClipTrimClient.cs +++ b/stream_deck_plugin/ClipTrimDotNet/Client/ClipTrimClient.cs @@ -53,6 +53,8 @@ namespace ClipTrimDotNet.Client var response = ctx.GetValue>(0); Logger.Instance.LogMessage(TracingLevel.INFO, $"full_data event {JsonConvert.SerializeObject(response)}"); Collections = response!; + Player.TickAll(); + PageNavigator.TickAll(); //Logger.Instance.LogMessage(TracingLevel.INFO, $"Collections {JsonConvert.SerializeObject(Collections)}"); } catch (Exception ex) @@ -71,6 +73,8 @@ namespace ClipTrimDotNet.Client if (index != -1) { Collections[index] = response; + Player.TickAll(); + PageNavigator.TickAll(); } } catch diff --git a/stream_deck_plugin/ClipTrimDotNet/ClipTrimDotNet.csproj b/stream_deck_plugin/ClipTrimDotNet/ClipTrimDotNet.csproj index 04c2057..e788b33 100644 --- a/stream_deck_plugin/ClipTrimDotNet/ClipTrimDotNet.csproj +++ b/stream_deck_plugin/ClipTrimDotNet/ClipTrimDotNet.csproj @@ -20,6 +20,20 @@ bin\Release\ClipTrimDotNet.sdPlugin\ + + + + + + + + + + + + + + @@ -54,34 +68,43 @@ PreserveNewest - - PreserveNewest - - + PreserveNewest - + PreserveNewest - + PreserveNewest - + PreserveNewest - + PreserveNewest - + PreserveNewest - + PreserveNewest - + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + PreserveNewest diff --git a/stream_deck_plugin/ClipTrimDotNet/Images/app_icon.png b/stream_deck_plugin/ClipTrimDotNet/Images/app_icon.png new file mode 100644 index 0000000..2ba9a15 Binary files /dev/null and b/stream_deck_plugin/ClipTrimDotNet/Images/app_icon.png differ diff --git a/stream_deck_plugin/ClipTrimDotNet/Images/app_icon.psd b/stream_deck_plugin/ClipTrimDotNet/Images/app_icon.psd new file mode 100644 index 0000000..425f9eb Binary files /dev/null and b/stream_deck_plugin/ClipTrimDotNet/Images/app_icon.psd differ diff --git a/stream_deck_plugin/ClipTrimDotNet/Images/back.png b/stream_deck_plugin/ClipTrimDotNet/Images/back.png new file mode 100644 index 0000000..8d6cae4 Binary files /dev/null and b/stream_deck_plugin/ClipTrimDotNet/Images/back.png differ diff --git a/stream_deck_plugin/ClipTrimDotNet/Images/back.psd b/stream_deck_plugin/ClipTrimDotNet/Images/back.psd new file mode 100644 index 0000000..2dfd3f3 Binary files /dev/null and b/stream_deck_plugin/ClipTrimDotNet/Images/back.psd differ diff --git a/stream_deck_plugin/ClipTrimDotNet/Images/categoryIcon.png b/stream_deck_plugin/ClipTrimDotNet/Images/categoryIcon.png deleted file mode 100644 index c864463..0000000 Binary files a/stream_deck_plugin/ClipTrimDotNet/Images/categoryIcon.png and /dev/null differ diff --git a/stream_deck_plugin/ClipTrimDotNet/Images/categoryIcon@2x.png b/stream_deck_plugin/ClipTrimDotNet/Images/categoryIcon@2x.png deleted file mode 100644 index 88f7532..0000000 Binary files a/stream_deck_plugin/ClipTrimDotNet/Images/categoryIcon@2x.png and /dev/null differ diff --git a/stream_deck_plugin/ClipTrimDotNet/Images/category_icon.png b/stream_deck_plugin/ClipTrimDotNet/Images/category_icon.png new file mode 100644 index 0000000..560cc86 Binary files /dev/null and b/stream_deck_plugin/ClipTrimDotNet/Images/category_icon.png differ diff --git a/stream_deck_plugin/ClipTrimDotNet/Images/collection.png b/stream_deck_plugin/ClipTrimDotNet/Images/collection.png new file mode 100644 index 0000000..8387adb Binary files /dev/null and b/stream_deck_plugin/ClipTrimDotNet/Images/collection.png differ diff --git a/stream_deck_plugin/ClipTrimDotNet/Images/collection.psd b/stream_deck_plugin/ClipTrimDotNet/Images/collection.psd new file mode 100644 index 0000000..69ff624 Binary files /dev/null and b/stream_deck_plugin/ClipTrimDotNet/Images/collection.psd differ diff --git a/stream_deck_plugin/ClipTrimDotNet/Images/collection_icon.png b/stream_deck_plugin/ClipTrimDotNet/Images/collection_icon.png new file mode 100644 index 0000000..cf90e9c Binary files /dev/null and b/stream_deck_plugin/ClipTrimDotNet/Images/collection_icon.png differ diff --git a/stream_deck_plugin/ClipTrimDotNet/Images/collection_icon.psd b/stream_deck_plugin/ClipTrimDotNet/Images/collection_icon.psd new file mode 100644 index 0000000..c07beb0 Binary files /dev/null and b/stream_deck_plugin/ClipTrimDotNet/Images/collection_icon.psd differ diff --git a/stream_deck_plugin/ClipTrimDotNet/Images/icon.png b/stream_deck_plugin/ClipTrimDotNet/Images/icon.png deleted file mode 100644 index 282cc46..0000000 Binary files a/stream_deck_plugin/ClipTrimDotNet/Images/icon.png and /dev/null differ diff --git a/stream_deck_plugin/ClipTrimDotNet/Images/icon@2x.png b/stream_deck_plugin/ClipTrimDotNet/Images/icon@2x.png deleted file mode 100644 index 580d504..0000000 Binary files a/stream_deck_plugin/ClipTrimDotNet/Images/icon@2x.png and /dev/null differ diff --git a/stream_deck_plugin/ClipTrimDotNet/Images/off_save.png b/stream_deck_plugin/ClipTrimDotNet/Images/off_save.png deleted file mode 100644 index 1667313..0000000 Binary files a/stream_deck_plugin/ClipTrimDotNet/Images/off_save.png and /dev/null differ diff --git a/stream_deck_plugin/ClipTrimDotNet/Images/page_nav.png b/stream_deck_plugin/ClipTrimDotNet/Images/page_nav.png new file mode 100644 index 0000000..f60de75 Binary files /dev/null and b/stream_deck_plugin/ClipTrimDotNet/Images/page_nav.png differ diff --git a/stream_deck_plugin/ClipTrimDotNet/Images/page_nav.psd b/stream_deck_plugin/ClipTrimDotNet/Images/page_nav.psd new file mode 100644 index 0000000..5bbc264 Binary files /dev/null and b/stream_deck_plugin/ClipTrimDotNet/Images/page_nav.psd differ diff --git a/stream_deck_plugin/ClipTrimDotNet/Images/page_nav_icon.png b/stream_deck_plugin/ClipTrimDotNet/Images/page_nav_icon.png new file mode 100644 index 0000000..0e69816 Binary files /dev/null and b/stream_deck_plugin/ClipTrimDotNet/Images/page_nav_icon.png differ diff --git a/stream_deck_plugin/ClipTrimDotNet/Images/page_nav_icon.psd b/stream_deck_plugin/ClipTrimDotNet/Images/page_nav_icon.psd new file mode 100644 index 0000000..7f8c567 Binary files /dev/null and b/stream_deck_plugin/ClipTrimDotNet/Images/page_nav_icon.psd differ diff --git a/stream_deck_plugin/ClipTrimDotNet/Images/player.png b/stream_deck_plugin/ClipTrimDotNet/Images/player.png new file mode 100644 index 0000000..82dc0df Binary files /dev/null and b/stream_deck_plugin/ClipTrimDotNet/Images/player.png differ diff --git a/stream_deck_plugin/ClipTrimDotNet/Images/player.psd b/stream_deck_plugin/ClipTrimDotNet/Images/player.psd new file mode 100644 index 0000000..b30eb41 Binary files /dev/null and b/stream_deck_plugin/ClipTrimDotNet/Images/player.psd differ diff --git a/stream_deck_plugin/ClipTrimDotNet/Images/player_icon.png b/stream_deck_plugin/ClipTrimDotNet/Images/player_icon.png new file mode 100644 index 0000000..e8531fc Binary files /dev/null and b/stream_deck_plugin/ClipTrimDotNet/Images/player_icon.png differ diff --git a/stream_deck_plugin/ClipTrimDotNet/Images/player_icon.psd b/stream_deck_plugin/ClipTrimDotNet/Images/player_icon.psd new file mode 100644 index 0000000..5d956e2 Binary files /dev/null and b/stream_deck_plugin/ClipTrimDotNet/Images/player_icon.psd differ diff --git a/stream_deck_plugin/ClipTrimDotNet/Images/pluginAction.png b/stream_deck_plugin/ClipTrimDotNet/Images/pluginAction.png deleted file mode 100644 index 6f9dea4..0000000 Binary files a/stream_deck_plugin/ClipTrimDotNet/Images/pluginAction.png and /dev/null differ diff --git a/stream_deck_plugin/ClipTrimDotNet/Images/pluginAction@2x.png b/stream_deck_plugin/ClipTrimDotNet/Images/pluginAction@2x.png deleted file mode 100644 index 8f9d3d6..0000000 Binary files a/stream_deck_plugin/ClipTrimDotNet/Images/pluginAction@2x.png and /dev/null differ diff --git a/stream_deck_plugin/ClipTrimDotNet/Images/pluginIcon.png b/stream_deck_plugin/ClipTrimDotNet/Images/pluginIcon.png deleted file mode 100644 index c864463..0000000 Binary files a/stream_deck_plugin/ClipTrimDotNet/Images/pluginIcon.png and /dev/null differ diff --git a/stream_deck_plugin/ClipTrimDotNet/Images/pluginIcon@2x.png b/stream_deck_plugin/ClipTrimDotNet/Images/pluginIcon@2x.png deleted file mode 100644 index e98ca7c..0000000 Binary files a/stream_deck_plugin/ClipTrimDotNet/Images/pluginIcon@2x.png and /dev/null differ diff --git a/stream_deck_plugin/ClipTrimDotNet/Images/record.png b/stream_deck_plugin/ClipTrimDotNet/Images/record.png new file mode 100644 index 0000000..b0e13d4 Binary files /dev/null and b/stream_deck_plugin/ClipTrimDotNet/Images/record.png differ diff --git a/stream_deck_plugin/ClipTrimDotNet/Images/record.psd b/stream_deck_plugin/ClipTrimDotNet/Images/record.psd new file mode 100644 index 0000000..162756b Binary files /dev/null and b/stream_deck_plugin/ClipTrimDotNet/Images/record.psd differ diff --git a/stream_deck_plugin/ClipTrimDotNet/Images/record_icon.png b/stream_deck_plugin/ClipTrimDotNet/Images/record_icon.png new file mode 100644 index 0000000..a9b86df Binary files /dev/null and b/stream_deck_plugin/ClipTrimDotNet/Images/record_icon.png differ diff --git a/stream_deck_plugin/ClipTrimDotNet/Images/record_icon.psd b/stream_deck_plugin/ClipTrimDotNet/Images/record_icon.psd new file mode 100644 index 0000000..b2b0b5c Binary files /dev/null and b/stream_deck_plugin/ClipTrimDotNet/Images/record_icon.psd differ diff --git a/stream_deck_plugin/ClipTrimDotNet/Keys/ProfileSwitcher.cs b/stream_deck_plugin/ClipTrimDotNet/Keys/ProfileSwitcher.cs index cb3ac19..479ae2e 100644 --- a/stream_deck_plugin/ClipTrimDotNet/Keys/ProfileSwitcher.cs +++ b/stream_deck_plugin/ClipTrimDotNet/Keys/ProfileSwitcher.cs @@ -60,7 +60,7 @@ namespace ClipTrimDotNet.Keys private async void SetTitle() { - await Connection.SetTitleAsync(settings.ProfileName + " B"); + await Connection.SetTitleAsync(settings.ProfileName); } private async void Connection_OnSendToPlugin(object? sender, SDEventReceivedEventArgs e) diff --git a/stream_deck_plugin/ClipTrimDotNet/manifest.json b/stream_deck_plugin/ClipTrimDotNet/manifest.json index 5185179..ff3b350 100644 --- a/stream_deck_plugin/ClipTrimDotNet/manifest.json +++ b/stream_deck_plugin/ClipTrimDotNet/manifest.json @@ -2,11 +2,11 @@ "Actions": [ { - "Icon": "Images/icon", + "Icon": "Images/player_icon", "Name": "Player", "States": [ { - "Image": "Images/pluginAction", + "Image": "Images/player", "TitleAlignment": "middle", "FontSize": 11 } @@ -17,26 +17,26 @@ "PropertyInspectorPath": "PropertyInspector/file_player.html" }, { - "Icon": "Images/icon", - "Name": "Profile Switcher", + "Icon": "Images/collection_icon", + "Name": "Collection Selector", "States": [ { - "Image": "Images/pluginAction", + "Image": "Images/collection", "TitleAlignment": "middle", "FontSize": 11 } ], "SupportedInMultiActions": false, - "Tooltip": "Selects which sub folder to use and opens effect profile", + "Tooltip": "Selects which collection to use", "UUID": "com.michal-courson.cliptrim.profile-switcher", "PropertyInspectorPath": "PropertyInspector/profile_swticher.html" }, { - "Icon": "Images/icon", + "Icon": "Images/page_nav_icon", "Name": "Page Navigator", "States": [ { - "Image": "Images/pluginAction", + "Image": "Images/page_nav", "TitleAlignment": "middle", "FontSize": 16 } @@ -47,11 +47,11 @@ "PropertyInspectorPath": "PropertyInspector/file_player.html" }, { - "Icon": "Images/icon", + "Icon": "Images/record_icon", "Name": "Save Clip", "States": [ { - "Image": "Images/pluginAction", + "Image": "Images/record", "TitleAlignment": "middle", "FontSize": 16 } @@ -65,11 +65,11 @@ "Author": "Michal Courson", "Name": "ClipTrimDotNet", "Description": "Pairs with cliptrim for easy voice recording and trimming", - "Icon": "Images/pluginIcon", + "Icon": "Images/app_icon", "Version": "0.1.0.0", "CodePath": "ClipTrimDotNet.exe", - "Category": "ClipTrimDotNet", - "CategoryIcon": "Images/categoryIcon", + "Category": "ClipTrim", + "CategoryIcon": "Images/category_icon", "UUID": "com.michal-courson.cliptrim", "OS": [ {